changeset 110533:b799d38f522a

Merge changes from emacs-23 branch
author Chong Yidong <cyd@stupidchicken.com>
date Thu, 23 Sep 2010 15:00:31 -0400
parents 2cac83f5f8bc (current diff) 7060c3b16693 (diff)
children 826d60163924
files doc/lispintro/ChangeLog etc/ChangeLog etc/NEWS.23 lisp/ChangeLog lisp/calculator.el lisp/calendar/appt.el lisp/calendar/solar.el lisp/cedet/ChangeLog lisp/cedet/cedet-cscope.el lisp/cedet/cedet-global.el lisp/cedet/cedet-idutils.el lisp/cedet/cedet.el lisp/cedet/ede.el lisp/cedet/ede/dired.el lisp/cedet/ede/project-am.el lisp/cedet/semantic.el lisp/cedet/semantic/bovine/c.el lisp/cedet/semantic/ia.el lisp/cedet/semantic/idle.el lisp/cedet/semantic/util-modes.el lisp/cedet/srecode.el lisp/cedet/srecode/mode.el lisp/emacs-lisp/eieio.el lisp/emacs-lisp/float-sup.el lisp/gnus/ChangeLog lisp/gnus/message.el lisp/isearch.el lisp/newcomment.el lisp/url/ChangeLog lisp/url/url-cache.el src/ChangeLog src/gtkutil.c src/syntax.c
diffstat 113 files changed, 6051 insertions(+), 3231 deletions(-) [+]
line wrap: on
line diff
--- a/doc/lispintro/ChangeLog	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -1,3 +1,9 @@
+2010-09-21  Glenn Morris  <rgm@gnu.org>
+
+	* cons-1.eps, cons-2.eps, cons-2a.eps, cons-3.eps, cons-4.eps:
+	* cons-5.eps, lambda-1.eps, lambda-2.eps, lambda-3.eps:
+	Add first line EPSF magic comment.  (Bug#7064)
+
 2010-06-23  Glenn Morris  <rgm@gnu.org>
 
 	* emacs-lisp-intro.texi: Untabify.
--- a/doc/lispintro/cons-1.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/cons-1.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 35 711 289 757
 %%Title: cons-cell-diagram1
 %%CreationDate: Wed Mar  8 14:26:58 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/cons-2.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/cons-2.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 15 712 321 775
 %%Title: cons-cell-diagram2
 %%CreationDate: Wed Mar  8 14:26:39 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/cons-2a.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/cons-2a.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 15 702 300 767
 %%Title: cons-cell-diagram2a
 %%CreationDate: Tue Mar 14 15:09:30 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/cons-3.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/cons-3.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: -1 691 324 757
 %%Title: cons-cell-diagram3
 %%CreationDate: Wed Mar  8 14:25:41 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/cons-4.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/cons-4.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 6 681 355 758
 %%Title: cons-cell-diagram4
 %%CreationDate: Wed Mar  8 14:25:06 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/cons-5.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/cons-5.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 15 680 305 764
 %%Title: cons-cell-diagram5
 %%CreationDate: Wed Mar  8 14:27:28 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/lambda-1.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/lambda-1.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 33 710 173 759
 %%Title: lambda-diagram1
 %%CreationDate: Wed Mar  8 14:31:53 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/lambda-2.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/lambda-2.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 33 730 240 777
 %%Title: lambda-diagram2
 %%CreationDate: Wed Mar  8 14:33:09 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/doc/lispintro/lambda-3.eps	Thu Sep 23 13:10:21 2010 -0400
+++ b/doc/lispintro/lambda-3.eps	Thu Sep 23 15:00:31 2010 -0400
@@ -1,14 +1,11 @@
-%!
+%!PS-Adobe-3.0 EPSF-3.0
 %%BoundingBox: 33 728 211 777
 %%Title: lambda-diagram3
 %%CreationDate: Wed Mar  8 14:33:49 1995
 %%Creator: Tgif-2.16-p4 by William Chia-Wei Cheng (william@cs.UCLA.edu)
-%
-%	Due to bugs in Transcript, the 'PS-Adobe-' stuff is omitted from line 1
-%
 
-% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
-%   Free Software Foundation, Inc.
+% Copyright (C) 1995, 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+%   2008, 2009, 2010  Free Software Foundation, Inc.
 %
 % This file is part of GNU Emacs.
 %
--- a/etc/ChangeLog	Thu Sep 23 13:10:21 2010 -0400
+++ b/etc/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -1,3 +1,7 @@
+2010-09-21  Eric Ludlam  <zappo@gnu.org>
+
+	* srecode/java.srt: Make NAME be a prompt.
+
 2010-09-13  Michael Albinus  <michael.albinus@gmx.de>
 
 	* NEWS: Some Tramp methods are discontinued.
--- a/etc/NEWS.23	Thu Sep 23 13:10:21 2010 -0400
+++ b/etc/NEWS.23	Thu Sep 23 15:00:31 2010 -0400
@@ -40,6 +40,8 @@
 
 * Lisp changes in Emacs 23.3
 
+** `e' and `pi' are now called `float-e' and `float-pi'.
+  The old names are obsolete.
 ** The use of unintern without an obarray arg is declared obsolete.
 
 ** New function byte-to-string, like char-to-string but for bytes.
--- a/etc/srecode/java.srt	Thu Sep 23 13:10:21 2010 -0400
+++ b/etc/srecode/java.srt	Thu Sep 23 15:00:31 2010 -0400
@@ -83,7 +83,7 @@
 template include :blank
 "An include statement."
 ----
-import {{NAME}};
+import {{?NAME}};
 ----
 
 context misc
--- a/lisp/ChangeLog	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -1,3 +1,74 @@
+2010-09-23  Glenn Morris  <rgm@gnu.org>
+
+	* isearch.el (isearch-lazy-highlight-cleanup)
+	(isearch-lazy-highlight-initial-delay)
+	(isearch-lazy-highlight-interval)
+	(isearch-lazy-highlight-max-at-a-time, isearch-lazy-highlight-face):
+	* net/net-utils.el (ipconfig-program-options):
+	Move aliases to options before the associated definitions.
+
+2010-09-23  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* newcomment.el (comment-normalize-vars): Better test validity of
+	comment-end-skip.
+
+2010-09-19  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/float-sup.el (float-pi): New name for `pi'.
+	(float-e): New name for `e'.
+	(degrees-to-radians, radians-to-degrees):
+	* calendar/solar.el (solar-longitude):
+	* calculator.el (calculator-registers, calculator-funcall):
+	* textmodes/artist.el (artist-spray-random-points):
+	* play/bubbles.el (bubbles--initialize-images): Use new names.
+
+2010-09-19  Eric M. Ludlam  <zappo@gnu.org>
+
+	Update to CEDET 1.0's version of EIEIO.
+
+	* emacs-lisp/eieio.el (eieio-specialized-key-to-generic-key):
+	New function.
+	(eieio-defmethod, eieio-generic-form, eieio-generic-call): Use it.
+	(eieio-default-eval-maybe): Eval val instead of unquoting only.
+	(class-precedence-list): If class is nil, return nil.
+	(eieio-generic-call): If class of first input arg is nil, don't
+	look up static methods, and do check for primary methods.
+	(initialize-instance): See if the default needs to be evaluated
+	during the constructor.
+	(eieio-perform-slot-validation-for-default): Don't do the check
+	for values that will eventually be evaluated.
+	(eieio-eval-default-p): New function.
+	(eieio-default-eval-maybe): Use it.
+
+2010-07-03  Jan Moringen  <jan.moringen@uni-bielefeld.de>
+
+	* emacs-lisp/eieio.el (eieio-defclass): Allow :c3
+	method-invocation-order.
+	(eieio-c3-candidate, eieio-c3-merge-lists): New functions.
+	(eieio-class-precedence-dfs): Compute class precedence list using
+	dfs algorithm.
+	(eieio-class-precedence-bfs): Compute class precedence list using
+	bfs algorithm.
+	(eieio-class-precedence-c3): Compute class precedence list using
+	c3 algorithm.
+	(class-precedence-list): New function.
+	(eieiomt-method-list, eieiomt-sym-optimize): Use it.
+	(inconsistent-class-hierarchy): New error symbol.
+	(call-next-method): Stow the replacement argument list for future
+	call-next-method invocations.
+
+2010-09-23  Glenn Morris  <rgm@gnu.org>
+
+	* calendar/appt.el (appt-check): If not displaying the diary,
+	use (diary 1) to only get the entries we need.
+	(appt-make-list): Sort diary-list-entries, if we cannot guarantee
+	that it is in day order.  (Bug#7019)
+
+	* calendar/appt.el (appt-check): Rather than showing the diary,
+	just turn off invisible display, and only if needed.
+
+	* calendar/diary-lib.el (diary-list-entries): Doc fix.  (Bug#7019)
+
 2010-09-23  Glenn Morris  <rgm@gnu.org>
 
 	* emacs-lisp/bytecomp.el (byte-compile-file-form-defvar):
@@ -2465,8 +2536,6 @@
 
 	* help-fns.el (find-lisp-object-file-name): Doc fix (bug#6494).
 
-	* cedet/semantic/db-file.el (object-write): Fix typo in docstring.
-
 	* time.el (display-time-day-and-date): Remove spurious * in docstring.
 	(display-time-world-buffer-name, display-time-world-mode-map):
 	Fix typos in docstrings.
@@ -3654,12 +3723,6 @@
 
 	* international/mule.el (make-translation-table-from-vector): Doc fix.
 
-2010-06-03  Eric Ludlam  <zappo@gnu.org>
-
-	* cedet/semantic/lex-spp.el
-	(semantic-lex-spp-table-write-slot-value): Instead of erroring on
-	invalid values during save, just save a nil (Bug#6324).
-
 2010-06-03  Glenn Morris  <rgm@gnu.org>
 
 	* desktop.el (desktop-clear-preserve-buffers):
@@ -3768,11 +3831,6 @@
 	* vc-bzr.el (vc-bzr-revision-completion-table): Apply
 	`file-directory-p' to the filename part rather than to the whole text.
 
-2010-05-31  Jonathan Marchand  <jonathlela@gmail.com>  (tiny change)
-
-	* cedet/ede/cpp-root.el (ede-set-project-variables): Fix feature name
-	(bug#6231).
-
 2010-05-31  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* man.el (Man-completion-table): Let the user type "-k " (bug#6319).
@@ -4923,67 +4981,6 @@
 	(filter-buffer-substring-functions): New variable.
 	(filter-buffer-substring): Use it.  Remove unused arg `noprops'.
 
-	Use a mode-line spec rather than a static string in Semantic.
-	* cedet/semantic/util-modes.el:
-	(semantic-minor-modes-format): New var to replace...
-	(semantic-minor-modes-status): Remove.
-	(semantic-mode-line-update): Construct a mode-line spec rather than
-	a static string so that mouse buttons can be used on individual minor
-	modes and so that semantic-mode-line-update only needs to be called
-	when global settings are changed.
-	(semantic-add-minor-mode, semantic-toggle-minor-mode-globally):
-	Call semantic-mode-line-update.
-	(semantic-toggle-minor-mode-globally): Don't assume mode is on
-	minor-mode-alist, check semantic-minor-mode-alist as well.
-	(semantic-stickyfunc-mode, semantic-show-parser-state-auto-marker)
-	(semantic-show-parser-state-marker, semantic-show-parser-state-mode)
-	(semantic-show-unmatched-syntax-mode, semantic-highlight-edits-mode):
-	* cedet/semantic/mru-bookmark.el (semantic-mru-bookmark-mode):
-	* cedet/semantic/idle.el (semantic-idle-scheduler-mode)
-	(define-semantic-idle-service, semantic-idle-summary-mode):
-	* cedet/semantic/decorate/mode.el (semantic-decoration-mode):
-	Don't call semantic-mode-line-update any more.
-
-2010-05-02  Stefan Monnier  <monnier@iro.umontreal.ca>
-
-	Use define-minor-mode in CEDET where applicable.
-
-	* cedet/srecode/mode.el (srecode-minor-mode,global-srecode-minor-mode):
-	Use define-minor-mode.
-
-	* cedet/semantic/util-modes.el (semantic-add-minor-mode):
-	Remove unused arg `keymap' and code redundant with define-minor-mode.
-	(semantic-toggle-minor-mode-globally): Only handle arg -1 and 1.
-	(semantic-stickyfunc-mode, global-semantic-show-unmatched-syntax-mode)
-	(semantic-highlight-func-mode, global-semantic-show-parser-state-mode)
-	(global-semantic-highlight-edits-mode, semantic-highlight-edits-mode)
-	(semantic-show-unmatched-syntax-mode, semantic-show-parser-state-mode)
-	(global-semantic-stickyfunc-mode, global-semantic-highlight-func-mode):
-	Use define-minor-mode.
-	(semantic-stickyfunc-mode-setup, semantic-highlight-edits-mode-setup)
-	(semantic-show-unmatched-syntax-mode-setup)
-	(semantic-show-parser-state-mode-setup)
-	(semantic-highlight-func-mode-setup): Inline into sole caller.
-
-	* cedet/semantic/mru-bookmark.el (global-semantic-mru-bookmark-mode)
-	(semantic-mru-bookmark-mode): Use define-minor-mode.
-	(semantic-mru-bookmark-mode-setup): Inline into sole caller.
-
-	* cedet/semantic/idle.el (define-semantic-idle-service):
-	Use define-minor-mode and inline setup function into its sole caller.
-	(semantic-idle-scheduler-mode-setup)
-	(semantic-idle-summary-mode-setup): Inline into sole caller.
-	(global-semantic-idle-scheduler-mode, semantic-idle-scheduler-mode):
-	Use define-minor-mode.
-
-	* cedet/semantic/decorate/mode.el (global-semantic-decoration-mode)
-	(semantic-decoration-mode): Use define-minor-mode.
-	(semantic-decoration-mode-setup): Inline into sole caller.
-
-	* cedet/ede/dired.el (ede-dired-minor-mode): Initialize in declaration.
-	(ede-dired-minor-mode): Use define-minor-mode and derived-mode-p.
-	(ede-dired-add-to-target): Use dolist.
-
 2010-05-01  Toru TSUNEYOSHI  <t_tuneyosi@hotmail.com>
             Michael Albinus  <michael.albinus@gmx.de>
 
@@ -5026,11 +5023,6 @@
 	* minibuffer.el (tags-completion-at-point-function): New function.
 	(completion-at-point-functions): Use it.
 
-	* cedet/semantic.el (semantic-completion-at-point-function):
-	New function.
-	(semantic-mode): Use semantic-completion-at-point-function for
-	completion-at-point-functions instead.
-
 	* progmodes/etags.el (complete-tag): Revert last change.
 
 2010-04-29  Alan Mackenzie  <acm@muc.de>
@@ -5057,12 +5049,6 @@
 
 	* progmodes/etags.el (complete-tag): Move to minibuffer.el.
 
-	* cedet/semantic.el (semantic-mode): When enabled, add
-	semantic-ia-complete-symbol to completion-at-point-functions.
-
-	* cedet/semantic/ia.el (semantic-ia-complete-symbol): Return nil
-	if Semantic is not active.
-
 2010-04-28  Michael Albinus  <michael.albinus@gmx.de>
 
 	* net/tramp.el (tramp-remote-selinux-p): New defun.
@@ -5348,11 +5334,6 @@
 	(vc-bzr-shelve-apply-and-keep, vc-bzr-shelve-snapshot):
 	Don't use *vc-bzr-shelve*.
 
-2010-04-19  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/ede/pmake.el (ede-proj-makefile-insert-variables):
-	Don't destroy list before using it.
-
 2010-04-19  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	Fix the version number for added files.
@@ -5895,12 +5876,6 @@
 	* emacs-lisp/authors.el (authors-fixed-entries): Add entry for Eli
 	Zaretskii.
 
-2010-04-02  Juanma Barranquero  <lekktu@gmail.com>
-
-	* cedet/semantic/imenu.el (semantic-imenu-bucketize-type-members)
-	(semantic-create-imenu-directory-index): Fix typos in docstrings.
-	(semantic-imenu-goto-function): Reflow docstring.
-
 2010-04-02  Juri Linkov  <juri@jurta.org>
 
 	* ehelp.el (electric-help-orig-major-mode):
@@ -6115,8 +6090,6 @@
 	* faces.el (set-face-attribute): Fix typo in docstring.
 	(face-valid-attribute-values): Reflow docstring.
 
-	* cedet/srecode/table.el (srecode-template-table): Fix docstring typo.
-
 2010-03-24  Glenn Morris  <rgm@gnu.org>
 
 	* textmodes/flyspell.el (sgml-lexical-context): Autoload it (Bug#5752).
@@ -6189,11 +6162,6 @@
 	(tramp-open-connection-setup-interactive-shell): Remove workaround
 	for OpenSolaris bug, it is not needed anymore.
 
-2010-03-24  Eric M. Ludlam  <zappo@gnu.org>
-
-	* cedet/semantic/imenu.el: New file, from the CEDET repository
-	(Bug#5412).
-
 2010-03-24  Glenn Morris  <rgm@gnu.org>
 
 	* emacs-lisp/cl-macs.el (defsubst*): Add autoload cookie.  (Bug#4427)
@@ -6220,11 +6188,6 @@
 
 	* log-edit.el (log-edit-before-checkin-process): Doc fix.
 
-	* cedet/semantic/bovine/c.el (semantic-c-describe-environment):
-	Consistently check ede-object is bound throughout.
-
-	* cedet/ede/project-am.el (ede-shell-run-something): Declare.
-
 2010-03-23  Sam Steingold  <sds@gnu.org>
 
 	Fix bug#5620: recalculate all markers on compilation buffer
@@ -6661,11 +6624,6 @@
 	(vc-git-show-log-entry): Use prog1.
 	(vc-git-after-dir-status-stage): Remove unused var `remaining'.
 
-2010-03-06  Glenn Morris  <rgm@gnu.org>
-
-	* cedet/semantic/grammar.el (semantic-grammar-header-template):
-	Update template copyright to GPLv3+.
-
 2010-03-05  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* man.el (Man-files-regexp): Tighten up the regexp (bug#5686).
@@ -6732,9 +6690,6 @@
 
 	* textmodes/reftex-toc.el (reftex-toc-promote-prepare):
 	* emacs-lisp/elint.el (elint-add-required-env):
-	* cedet/semantic/db-find.el
-	(semanticdb-find-translate-path-brutish-default):
-	* cedet/ede/make.el (ede-make-check-version):
 	* calendar/icalendar.el (icalendar--add-diary-entry):
 	* calc/calcalg2.el (math-tracing-integral):
 	* files.el (recover-session-finish): Use with-current-buffer
@@ -6899,12 +6854,6 @@
 
 	* doc-view.el (doc-view): Add to data custom group.
 
-	* cedet/data-debug.el (data-debug): Move to extensions group.
-
-	* cedet/ede.el (ede):
-	* cedet/srecode.el (srecode):
-	* cedet/semantic.el (semantic): Put in tools and extensions group.
-
 	* nxml/nxml-mode.el (nxml-faces): Remove from font-lock-faces group.
 
 	* textmodes/flyspell.el (flyspell-word): Obey the offset specified
@@ -6941,10 +6890,6 @@
 
 	* outline.el (outline-head-from-level):
 	* simple.el (with-wrapper-hook):
-	* cedet/ede.el (ede-run-target, project-delete-target)
-	(project-dist-files, ede-name, ede-documentation, ede-parent-project)
-	(ede-adebug-project, ede-adebug-project-parent)
-	(ede-adebug-project-root):
 	* emacs-lisp/elint.el (elint-extra-errors, elint-current-buffer)
 	(elint-defun, elint-buffer-env, elint-top-form-logged)
 	(elint-unbound-variable):
@@ -7393,70 +7338,10 @@
 
 2010-01-18  Juanma Barranquero  <lekktu@gmail.com>
 
-	* cedet/ede/locate.el (ede-locate-file-in-project)
-	(ede-locate-file-in-project-impl): Fix typos in docstrings.
-	(ede-enable-locate-on-project): Fix typos in error messages.
-
-	* cedet/semantic/util-modes.el (semantic-unmatched-syntax-face)
-	(semantic-stickyfunc-old-hlf, semantic-stickyfunc-header-line-format)
-	(semantic-stickyfunc-sticky-classes, semantic-highlight-func-mode-setup)
-	(semantic-stickyfunc-fetch-stickyline): Fix typos in docstrings.
-	(semantic-stickyfunc-popup-menu, semantic-highlight-func-popup-menu):
-	Fix typos in menu help.
-
 	* emacs-lisp/chart.el (chart-file-count, chart-rmail-from):
 	Fix typos in chart titles.
 
 	* whitespace.el (whitespace-style, global-whitespace-newline-mode):
-	* cedet/semantic.el (semantic-require-version, semantic--buffer-cache)
-	(semantic-unmatched-syntax-cache-check, semantic-unmatched-syntax-hook)
-	(semantic--before-fetch-tags-hook, semantic-new-buffer-fcn-was-run)
-	(semantic--umatched-syntax-needs-refresh-p, semantic-elapsed-time)
-	(semantic-parse-stream, semantic-parse-region)
-	(semantic-parse-region-default, semantic--set-buffer-cache)
-	(semantic-minimum-working-buffer-size, semantic-refresh-tags-safe)
-	(semantic-bovinate-toplevel, semantic-load-system-cache-loaded)
-	(semantic-default-submodes):
-	* cedet/semantic/db-ebrowse.el (semanticdb-table-ebrowse)
-	(semanticdb-create-ebrowse-database)
-	(semanticdb-find-tags-for-completion-method)
-	(semanticdb-find-tags-by-class-method)
-	(semanticdb-deep-find-tags-by-name-method)
-	(semanticdb-deep-find-tags-for-completion-method):
-	* cedet/semantic/db-el.el (semanticdb-elisp-mapatom-collector)
-	(semanticdb-find-tags-by-name-method, emacs-lisp-mode)
-	(semanticdb-find-tags-for-completion-method)
-	(semanticdb-find-tags-by-class-method)
-	(semanticdb-deep-find-tags-for-completion-method):
-	* cedet/semantic/db-find.el (semanticdb-find-translate-path)
-	(semanticdb-find-need-cache-update-p, semanticdb-find-result-with-nil-p)
-	(semanticdb-find-scanned-include-tags, semanticdb-find-tags-collector)
-	(semanticdb-find-tags-by-name-method)
-	(semanticdb-find-tags-by-name-regexp-method)
-	(semanticdb-find-tags-for-completion-method)
-	(semanticdb-find-tags-by-class-method)
-	(semanticdb-find-tags-external-children-of-type-method)
-	(semanticdb-find-tags-subclasses-of-type-method)
-	(semanticdb-deep-find-tags-by-name-method)
-	(semanticdb-deep-find-tags-by-name-regexp-method)
-	(semanticdb-deep-find-tags-for-completion-method):
-	* cedet/semantic/db-global.el (semanticdb-enable-gnu-global-hook)
-	(semanticdb-enable-gnu-global-in-buffer)
-	(semanticdb-find-tags-for-completion-method)
-	(semanticdb-deep-find-tags-by-name-method)
-	(semanticdb-deep-find-tags-for-completion-method):
-	* cedet/semantic/db-javascript.el (semanticdb-javascript-tags)
-	(javascript-mode, semanticdb-find-translate-path)
-	(semanticdb-find-tags-for-completion-method)
-	(semanticdb-find-tags-by-class-method)
-	(semanticdb-deep-find-tags-by-name-method)
-	(semanticdb-deep-find-tags-for-completion-method)
-	(semanticdb-find-tags-external-children-of-type-method):
-	* cedet/semantic/idle.el (semantic-idle-work-core-handler)
-	(define-semantic-idle-service, semantic-idle-summary-useful-context-p)
-	(global-semantic-idle-scheduler-mode):
-	* cedet/srecode/dictionary.el (srecode-field-value)
-	(srecode-dictionary-add-section-dictionary):
 	* emacs-lisp/eieio.el (eieio-error-unsupported-class-tags)
 	(eieio-generic-form, eieio-help-mode-augmentation-maybee, eieio-browse)
 	(describe-class, eieio-describe-generic, describe-generic):
@@ -7508,13 +7393,8 @@
 
 	* calc/calc.el (calc-command-flags): Give it an initial value.
 
-2010-01-17  Glenn Morris  <rgm@gnu.org>
-
-	* cedet/semantic/idle.el (semantic-idle-work-for-one-buffer): Doc fix.
-
 2010-01-17  Juanma Barranquero  <lekktu@gmail.com>
 
-	* cedet/semantic.el (semantic-mode):
 	* files.el (minibuffer-with-setup-hook):
 	* textmodes/artist.el (artist-mt, artist-key-undraw-continously)
 	(artist-key-draw-continously, artist-key-do-continously-continously)
@@ -7546,17 +7426,6 @@
 
 2010-01-16  Mario Lang  <mlang@delysid.org>
 
-	* cedet/ede/cpp-root.el (ede-cpp-root-project):
-	* cedet/ede/files.el (ede-expand-filename):
-	* cedet/ede/simple.el (ede-simple-project):
-	* cedet/semantic/complete.el (semantic-complete-read-tag-engine)
-	(semantic-complete-inline-tag-engine):
-	* cedet/semantic/db-el.el (semanticdb-equivalent-mode):
-	* cedet/semantic/db-global.el (semanticdb-equivalent-mode):
-	* cedet/semantic/db-javascript.el (semanticdb-equivalent-mode):
-	* cedet/semantic/db.el (semanticdb-equivalent-mode):
-	* cedet/semantic/decorate/include.el (semantic-decoration-unknown-include-describe):
-	* cedet/semantic/idle.el (semantic-idle-work-for-one-buffer):
 	* emacs-lisp/chart.el (chart-translate-namezone):
 	* textmodes/artist.el (artist-compute-popup-menu-table):
 	Remove duplicated words in doc-strings.
@@ -7585,13 +7454,6 @@
 	* find-cmd.el (find-constituents):
 	* vc-arch.el (vc-arch-root):
 	* window.el (window-body-height, pop-up-frames):
-	* cedet/semantic/edit.el (semantic-reparse-needed-change-hook)
-	(semantic-no-reparse-needed-change-hook):
-	* cedet/srecode/insert.el (srecode-resolve-argument-list)
-	(srecode-template-inserter-blank, srecode-template-inserter-variable)
-	(srecode-template-inserter-ask, srecode-template-inserter-width)
-	(srecode-template-inserter-section-start)
-	(srecode-template-inserter-section-end, srecode-insert-method):
 	* emacs-lisp/eieio-base.el (eieio-singleton, slot-missing):
 	* progmodes/ada-stmt.el (ada-if):
 	* progmodes/gdb-ui.el (gdb-jsonify-buffer):
@@ -7662,36 +7524,6 @@
 	* mail/emacsbug.el (report-emacs-bug-pretest-address): Set
 	it to bug-gnu-emacs rather than emacs-pretest-bug.
 
-2010-01-12  Juanma Barranquero  <lekktu@gmail.com>
-
-	* cedet/data-debug.el (data-debug): Fix customization group reference.
-
-2010-01-12  Juanma Barranquero  <lekktu@gmail.com>
-
-	* cedet/semantic/analyze.el (semantic-analyze-push-error)
-	(semantic-analyze-context, semantic-analyze-context-assignment)
-	(semantic-analyze-find-tag-sequence, semantic-analyze-find-tag):
-	* cedet/semantic/java.el (java-mode, semantic-tag-include-filename)
-	(semantic-java-doc-keywords-map):
-	* cedet/semantic/bovine/c.el (c-mode, semantic-c-member-of-autocast)
-	(semantic-lex-c-nested-namespace-ignore-second, semantic-parse-region)
-	(semantic-c-parse-lexical-token, semantic-c-debug-mode-init-pch)
-	(semantic-c-classname, semantic-format-tag-uml-prototype)
-	(semantic-c-dereference-namespace, semantic-analyze-type-constants):
-	* cedet/semantic/bovine/el.el (semantic-elisp-form-to-doc-string)
-	(semantic-emacs-lisp-obsoleted-doc, semantic-up-context)
-	(semantic-get-local-variables, semantic-end-of-command)
-	(semantic-beginning-of-command, semantic-ctxt-current-class-list)
-	(lisp-mode):
-	* cedet/semantic/bovine/make.el (makefile-mode):
-	* cedet/semantic/wisent/python.el (wisent-python-string-re)
-	(wisent-python-implicit-line-joining-p, wisent-python-forward-string)
-	(wisent-python-lex-beginning-of-line, wisent-python-lex-end-of-line)
-	(semantic-lex, semantic-get-local-variables, python-mode):
-	* cedet/semantic/wisent/python-wy.el (wisent-python-wy--keyword-table):
-	* cedet/srecode/extract.el (srecode-extract-state-set)
-	(srecode-extract-method): Fix typos in docstrings.
-
 2010-01-11  Sam Steingold  <sds@gnu.org>
 
 	* imenu.el (imenu-default-create-index-function): Detect infinite
@@ -7750,17 +7582,9 @@
 
 2010-01-10  Chong Yidong  <cyd@stupidchicken.com>
 
-	* cedet/semantic.el (semantic-new-buffer-setup-functions):
-	Add python parser.
-
 	* Makefile.in (ELCFILES): Add wisent/python-wy.el and
 	wisent/python.el.
 
-2010-01-10  Richard Kim  <emacs18@gmail.com>
-
-	* cedet/semantic/wisent/python-wy.el:
-	* cedet/semantic/wisent/python.el: New files.
-
 2010-01-09  Chong Yidong  <cyd@stupidchicken.com>
 
 	* man.el (Man-goto-section): Signal error if the section is not
@@ -7944,9 +7768,6 @@
 
 	* mpc.el (mpc-playlist-delete): Fix typo in error messages.
 
-	* cedet/semantic/db-typecache.el (semanticdb-typecache-find-default):
-	Fix typo in docstring.
-
 	* net/imap-hash.el (imap-hash-make): Doc fix.
 	(imap-hash-test): Fix typo in error message; reflow docstring.
 	(imap-hash-p, imap-hash-get, imap-hash-put, imap-hash-make-message)
@@ -8175,14 +7996,6 @@
 	`Info-display-images-node', and not put the `invisible' property
 	in this case.
 
-2009-12-14  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/semantic/mru-bookmark.el (global-semantic-mru-bookmark-mode)
-	(semantic-mru-bookmark-mode): Doc fixes.
-
-	* cedet/semantic/db.el (semanticdb-cache-get): Use error instead
-	of assert.
-
 2009-12-13  Glenn Morris  <rgm@gnu.org>
 
 	* mail/emacsbug.el (message-sort-headers): Define for compiler.
@@ -8600,9 +8413,6 @@
 	* bindings.el (complete-symbol): Call semantic-ia-complete-symbol
 	if possible.
 
-	* cedet/semantic/ia.el (semantic-ia-complete-symbol):
-	Make argument optional.
-
 	* shell.el (shell): Require ansi-color (Bug#5113).
 
 	* ansi-color.el (ansi-color-for-comint-mode): Default to t.
@@ -8630,24 +8440,6 @@
 	(Info-mode-menu): Add `Info-virtual-index' to the menu.
 	(Info-mode): Add `Info-virtual-index' to the docstring.
 
-2009-12-05  Eric Ludlam  <zappo@gnu.org>
-
-	* cedet/semantic/bovine/c.el (semantic-c-describe-environment):
-	Describe project macro symbols.
-
-	* cedet/semantic/complete.el (semantic-complete-do-completion):
-	Don't call semantic-collector-current-exact-match.
-
-	* cedet/ede.el (ede-apply-preprocessor-map): Accept lists of
-	ede-objects as targets.
-
-	* cedet/ede/pmake.el (ede-proj-makefile-insert-variables): Output
-	a target's object list even if compiler vars are already in the
-	Makefile.
-
-	* cedet/ede/emacs.el (ede-preprocessor-map): Add config.h to the
-	list of headers producing necessary macros.
-
 2009-12-05  Roland Winkler  <Roland.Winkler@physik.uni-erlangen.de>
 
 	* textmodes/bibtex.el (bibtex-map-entries): Use marker to keep
@@ -9530,9 +9322,6 @@
 	* bookmark.el (bookmark-bmenu-hide-filenames): Remove assignment to
 	deleted variable bookmark-bmenu-bookmark-column.
 
-	* cedet/semantic/idle.el (global-semantic-idle-scheduler-mode):
-	Move after definition of global-semantic-idle-tag-highlight-mode.
-
 2009-11-24  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* bookmark.el (bookmark-bmenu-search): Clear echo area when exiting.
@@ -9597,56 +9386,6 @@
 	* dired-x.el (dired-guess-shell-alist-default):
 	Support xz format.  (Bug#4953)
 
-2009-11-22  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/srecode/map.el (srecode-get-maps):
-	* cedet/semantic/wisent/wisent.el (wisent-parse-toggle-verbose-flag):
-	* cedet/semantic/wisent/comp.el (wisent-toggle-verbose-flag):
-	* cedet/semantic/decorate/mode.el (semantic-decoration-mode)
-	(semantic-toggle-decoration-style):
-	* cedet/semantic/decorate/include.el
-	(semantic-decoration-include-describe)
-	(semantic-decoration-unknown-include-describe)
-	(semantic-decoration-unparsed-include-describe)
-	(semantic-decoration-all-include-summary):
-	* cedet/semantic/bovine/c.el (semantic-c-debug-mode-init):
-	* cedet/semantic/analyze/complete.el
-	(semantic-analyze-possible-completions):
-	* cedet/semantic/util-modes.el (semantic-highlight-edits-mode)
-	(semantic-show-unmatched-syntax-mode)
-	(semantic-show-parser-state-mode, semantic-stickyfunc-mode)
-	(semantic-highlight-func-mode):
-	* cedet/semantic/util.el (semantic-describe-buffer):
-	* cedet/semantic/symref.el (semantic-symref-find-references-by-name)
-	(semantic-symref-find-tags-by-name)
-	(semantic-symref-find-tags-by-regexp)
-	(semantic-symref-find-tags-by-completion)
-	(semantic-symref-find-file-references-by-name)
-	(semantic-symref-find-text):
-	* cedet/semantic/senator.el (senator-copy-tag, senator-kill-tag)
-	(senator-yank-tag):
-	* cedet/semantic/scope.el (semantic-calculate-scope):
-	* cedet/semantic/mru-bookmark.el (semantic-mru-bookmark-mode):
-	* cedet/semantic/idle.el (semantic-idle-scheduler-mode)
-	(define-semantic-idle-service):
-	* cedet/semantic/complete.el (semantic-complete-analyze-inline)
-	(semantic-complete-analyze-inline-idle):
-	* cedet/semantic/analyze.el (semantic-analyze-current-context):
-	* cedet/mode-local.el (describe-mode-local-bindings)
-	(describe-mode-local-bindings-in-mode):
-	* cedet/ede/make.el (ede-make-check-version):
-	* cedet/ede/locate.el (ede-enable-locate-on-project):
-	* cedet/cedet-idutils.el (cedet-idutils-expand-filename)
-	(cedet-idutils-version-check):
-	* cedet/cedet-global.el (cedet-gnu-global-expand-filename)
-	(cedet-gnu-global-version-check):
-	* cedet/cedet-cscope.el (cedet-cscope-expand-filename)
-	(cedet-cscope-version-check): Use called-interactively-p instead
-	of interactive-p.
-
-	* cedet/semantic/ia.el (semantic-ia-completion-format-tag-function):
-	Use semantic-format-tag-prototype.
-
 2009-11-22  Michael Kifer  <kifer@cs.stonybrook.edu>
 
 	* emulation/viper-cmd.el: Use viper-last-command-char instead of
@@ -9673,12 +9412,6 @@
 	* progmodes/subword.el (subword-mode-map): Fix subword-mode-map
 	generation from word-movement command names.
 
-2009-11-21  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/semantic/complete.el (semantic-complete-read-tag-engine)
-	(semantic-complete-jump-local, semantic-complete-jump):
-	Improve prompt string.
-
 2009-11-21  Jan Djärv  <jan.h.d@swipnet.se>
 
 	* cus-start.el (all): Add native condition for font-use-system-font.
@@ -9765,13 +9498,6 @@
 	(bookmark-bmenu-search): New command.
 	(bookmark-bmenu-mode-map): Bind it.
 
-2009-11-20  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/semantic/complete.el (semantic-complete-inline-map): Doc fix.
-
-	* cedet/semantic/idle.el (define-semantic-idle-service)
-	(semantic-idle-summary-mode, semantic-idle-completions): Doc fix.
-
 2009-11-20  Tassilo Horn  <tassilo@member.fsf.org>
 
 	* progmodes/cc-cmds.el: declare-functioned forward-subword and
@@ -9818,17 +9544,6 @@
 
 	* Makefile.in (ELCFILES): Regenerate.
 
-2009-11-20  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/cedet.el (cedet-menu-map): Re-order menu items.
-
-	* cedet/semantic.el: Enable idle-mode menu items only if
-	global-semantic-idle-scheduler-mode is enabled.
-	(semantic-default-submodes): Doc fix.
-
-	* cedet/semantic/idle.el (global-semantic-idle-scheduler-mode):
-	When turning off, disable other idle modes.
-
 2009-11-20  Jay Belanger  <jay.p.belanger@gmail.com>
 
 	* calc/calc.el (calc-set-mode-line):
@@ -10135,13 +9850,6 @@
 	* strokes.el (strokes-update-window-configuration): Make strokes
 	buffer current before erasing (Bug#4906).
 
-	* cedet/semantic/idle.el (semantic-idle-summary-mode)
-	(semantic-idle-summary-mode): Define using define-minor-mode
-	instead of define-semantic-idle-service.
-	(semantic-idle-summary-mode): New function.
-	(semantic-idle-summary-mode-setup): Use pre-command-hook to ensure
-	that mouse motion does not reset the echo area.
-
 2009-11-15  Juri Linkov  <juri@jurta.org>
 
 	* simple.el (set-mark-default-inactive): Add :type, :group
@@ -10510,9 +10218,6 @@
 
 2009-11-08  Chong Yidong  <cyd@stupidchicken.com>
 
-	* cedet/semantic/ctxt.el (semantic-get-local-variables): Disable
-	the progress reporter entirely.
-
 	* emulation/cua-base.el: Add CUA property to some CC mode commands
 	(Bug#4100).
 
@@ -10795,79 +10500,6 @@
 
 	* emacs-lisp/autoload.el (generated-autoload-feature): Remove.
 	(autoload-rubric): Don't use any more.
-	* cedet/semantic/fw.el (semantic/loaddefs):
-	* cedet/srecode.el (srecode/loaddefs):
-	* cedet/ede.el (ede/loaddefs): Load rather than require.
-	* cedet/ede/cpp-root.el:
-	* cedet/ede/emacs.el:
-	* cedet/ede/files.el:
-	* cedet/ede/linux.el:
-	* cedet/ede/locate.el:
-	* cedet/ede/make.el:
-	* cedet/ede/shell.el:
-	* cedet/ede/speedbar.el:
-	* cedet/ede/system.el:
-	* cedet/ede/util.el:
-	* cedet/semantic/analyze.el:
-	* cedet/semantic/bovine.el:
-	* cedet/semantic/complete.el:
-	* cedet/semantic/ctxt.el:
-	* cedet/semantic/db-file.el:
-	* cedet/semantic/db-find.el:
-	* cedet/semantic/db-global.el:
-	* cedet/semantic/db-mode.el:
-	* cedet/semantic/db-typecache.el:
-	* cedet/semantic/db.el:
-	* cedet/semantic/debug.el:
-	* cedet/semantic/dep.el:
-	* cedet/semantic/doc.el:
-	* cedet/semantic/edit.el:
-	* cedet/semantic/find.el:
-	* cedet/semantic/format.el:
-	* cedet/semantic/html.el:
-	* cedet/semantic/ia-sb.el:
-	* cedet/semantic/ia.el:
-	* cedet/semantic/idle.el:
-	* cedet/semantic/lex-spp.el:
-	* cedet/semantic/lex.el:
-	* cedet/semantic/mru-bookmark.el:
-	* cedet/semantic/scope.el:
-	* cedet/semantic/senator.el:
-	* cedet/semantic/sort.el:
-	* cedet/semantic/symref.el:
-	* cedet/semantic/tag-file.el:
-	* cedet/semantic/tag-ls.el:
-	* cedet/semantic/tag-write.el:
-	* cedet/semantic/tag.el:
-	* cedet/semantic/util-modes.el:
-	* cedet/semantic/analyze/complete.el:
-	* cedet/semantic/analyze/refs.el:
-	* cedet/semantic/bovine/c.el:
-	* cedet/semantic/bovine/gcc.el:
-	* cedet/semantic/bovine/make.el:
-	* cedet/semantic/bovine/scm.el:
-	* cedet/semantic/decorate/include.el:
-	* cedet/semantic/decorate/mode.el:
-	* cedet/semantic/symref/cscope.el:
-	* cedet/semantic/symref/global.el:
-	* cedet/semantic/symref/grep.el:
-	* cedet/semantic/symref/idutils.el:
-	* cedet/semantic/symref/list.el:
-	* cedet/semantic/wisent/java-tags.el:
-	* cedet/semantic/wisent/javascript.el:
-	* cedet/srecode/compile.el:
-	* cedet/srecode/cpp.el:
-	* cedet/srecode/document.el:
-	* cedet/srecode/el.el:
-	* cedet/srecode/expandproto.el:
-	* cedet/srecode/getset.el:
-	* cedet/srecode/insert.el:
-	* cedet/srecode/java.el:
-	* cedet/srecode/map.el:
-	* cedet/srecode/mode.el:
-	* cedet/srecode/template.el:
-	* cedet/srecode/texi.el: Remove the file-local setting of
-	generated-autoload-feature.
 
 	* emacs-lisp/byte-run.el (define-obsolete-variable-alias): Use dolist,
 	and only put a prop if it is non-nil.
@@ -10884,8 +10516,6 @@
 
 2009-11-03  Glenn Morris  <rgm@gnu.org>
 
-	* cedet/mode-local.el (with-mode-local): Doc fix.
-
 	* emacs-lisp/bytecomp.el (byte-compile-file-form-defvar)
 	(byte-compile-file-form-define-abbrev-table)
 	(byte-compile-file-form-custom-declare-variable)
@@ -11007,12 +10637,6 @@
 	* menu-bar.el (menu-bar-tools-menu): Add Semantic and EDE menu
 	items.
 
-	* cedet/cedet.el (cedet-menu-map): Remove Semantic and EDE menu
-	items.
-
-	* cedet/ede.el (ede-minor-mode):
-	* cedet/semantic.el (semantic-mode): Toggle menu separators.
-
 2009-10-31  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* textmodes/two-column.el (2C-split):
@@ -11166,89 +10790,12 @@
 	(byte-compile-variable-ref, byte-compile-setq-default):
 	Respect `constants' member of byte-compile-warnings.
 
-	* cedet/semantic/tag.el (semantic--tag-link-list-to-buffer):
-	Use mapc rather than mapcar because the return value is never used.
-
-	* cedet/srecode/template.el, cedet/semantic/wisent/javascript.el:
-	* cedet/semantic/wisent/java-tags.el, cedet/semantic/texi.el:
-	* cedet/semantic/html.el:
-	Suppress harmless warnings about setting up semantic-imenu (not
-	part of Emacs) variables.
-
 2009-10-30  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* vc-bzr.el (vc-bzr-revision-keywords): New var.
 	(vc-bzr-revision-completion-table): Use it to fix completion of "s:"
 	to "submit:".
 
-	* cedet/srecode/srt-mode.el (semantic-analyze-possible-completions):
-	* cedet/semantic/symref/list.el (semantic-symref-rb-toggle-expand-tag):
-	* cedet/semantic/symref/grep.el (semantic-symref-perform-search):
-	* cedet/semantic/bovine/gcc.el (semantic-gcc-query):
-	* cedet/semantic/bovine/c.el (semantic-c-parse-lexical-token):
-	* cedet/semantic/analyze/debug.el (semantic-analyzer-debug-add-buttons)
-	(semantic-analyzer-debug-global-symbol)
-	(semantic-analyzer-debug-missing-innertype)
-	(semantic-analyzer-debug-insert-include-summary):
-	* cedet/semantic/util.el (semantic-file-tag-table):
-	(semantic-describe-buffer-var-helper, semantic-something-to-tag-table)
-	(semantic-recursive-find-nonterminal-by-name):
-	* cedet/semantic/tag-ls.el (semantic-tag-calculate-parent-default):
-	* cedet/semantic/tag-file.el (semantic-prototype-file):
-	* cedet/semantic/symref.el (semantic-symref-parse-tool-output):
-	* cedet/semantic/sb.el (semantic-sb-fetch-tag-table):
-	* cedet/semantic/lex-spp.el (semantic-lex-spp-lex-text-string):
-	* cedet/semantic/idle.el (semantic-idle-work-for-one-buffer):
-	(semantic-idle-summary-maybe-highlight):
-	* cedet/semantic/ia-sb.el (semantic-ia-speedbar)
-	(semantic-ia-sb-tag-info):
-	* cedet/semantic/grammar.el (semantic-analyze-possible-completions):
-	* cedet/semantic/find.el (semantic-brute-find-tag-by-position):
-	* cedet/semantic/ede-grammar.el (project-compile-target):
-	(ede-proj-makefile-insert-variables):
-	* cedet/semantic/debug.el (semantic-debug-set-parser-location):
-	(semantic-debug-set-source-location, semantic-debug-interface-layout)
-	(semantic-debug-mode, semantic-debug):
-	* cedet/semantic/db.el (semanticdb-needs-refresh-p):
-	* cedet/semantic/db-typecache.el (semanticdb-typecache-refresh-for-buffer):
-	* cedet/semantic/db-javascript.el (semanticdb-equivalent-mode):
-	* cedet/semantic/db-find.el (semanticdb-find-log-new-search)
-	(semanticdb-find-translate-path-includes--internal)
-	(semanticdb-reset-log, semanticdb-find-log-activity):
-	* cedet/semantic/db-file.el (object-write):
-	* cedet/semantic/db-el.el (semanticdb-equivalent-mode):
-	* cedet/semantic/db-ebrowse.el (semanticdb-ebrowse-C-file-p)
-	(semanticdb-create-ebrowse-database):
-	* cedet/semantic/db-debug.el (semanticdb-table-sanity-check):
-	* cedet/semantic/complete.el (semantic-displayor-focus-request)
-	(semantic-collector-calculate-completions-raw)
-	(semantic-complete-read-tag-analyzer):
-	* cedet/semantic/analyze.el (semantic-analyze-pulse):
-	* cedet/ede/util.el (ede-update-version-in-source):
-	* cedet/ede/proj.el (project-delete-target):
-	* cedet/ede/proj-elisp.el (ede-update-version-in-source)
-	(ede-proj-flush-autoconf):
-	* cedet/ede/pconf.el (ede-proj-configure-synchronize)
-	(ede-proj-configure-synchronize):
-	* cedet/ede/locate.el (ede-locate-file-in-project-impl):
-	* cedet/ede/linux.el (ede-linux-version):
-	* cedet/ede/emacs.el (ede-emacs-version):
-	* cedet/ede/dired.el (ede-dired-add-to-target):
-	* cedet/ede.el (ede-buffer-header-file, ede-find-target)
-	(ede-buffer-documentation-files, ede-project-buffers, ede-set)
-	(ede-target-buffers, ede-buffers, ede-make-project-local-variable):
-	* cedet/cedet-idutils.el (cedet-idutils-fnid-call):
-	(cedet-idutils-lid-call, cedet-idutils-expand-filename)
-	(cedet-idutils-version-check):
-	* cedet/cedet-global.el (cedet-gnu-global-call):
-	(cedet-gnu-global-expand-filename, cedet-gnu-global-root)
-	(cedet-gnu-global-version-check, cedet-gnu-global-scan-hits):
-	* cedet/cedet-cscope.el (cedet-cscope-call)
-	(cedet-cscope-expand-filename, cedet-cscope-version-check):
-	Use with-current-buffer.
-	* cedet/ede.el (ede-make-project-local-variable)
-	(ede-set-project-variables, ede-set): Use dolist.
-
 2009-10-30  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	* textmodes/ispell.el (ispell-skip-region-alist):
@@ -11292,16 +10839,6 @@
 	(calc-embedded-finish-command, calc-embedded-stack-change):
 	* calc/calc-aent.el (calcAlg-enter): Use with-current-buffer.
 
-	* cedet/mode-local.el (make-obsolete-overload): Add `when' argument.
-	(overload-docstring-extension): Use that info.
-	* cedet/semantic/fw.el (semantic-alias-obsolete): Pass the `when' info.
-	* cedet/semantic/idle.el (semantic-eldoc-current-symbol-info):
-	* cedet/semantic/tag-ls.el (semantic-nonterminal-protection)
-	(semantic-nonterminal-abstract, semantic-nonterminal-leaf)
-	(semantic-nonterminal-full-name): Add the new `when' info.
-	* cedet/semantic/decorate/mode.el (semantic/decorate): Require CL for
-	`assert'.
-
 	* pcomplete.el (pcomplete-comint-setup): If there's a choice, replace
 	shell-dynamic-complete-filename in preference to
 	comint-dynamic-complete-filename.
@@ -11442,36 +10979,6 @@
 	* bookmark.el (bookmark-bmenu-list): Don't use switch-to-buffer if
 	we're inside a dedicated or minibuffer window.
 
-2009-10-25  Stefan Monnier  <monnier@iro.umontreal.ca>
-
-	* cedet/semantic/fw.el (semantic-alias-obsolete)
-	(semantic-varalias-obsolete): Make the `when' arg mandatory.
-	(define-mode-overload-implementation):
-	* cedet/semantic/decorate/mode.el (semantic-decorate-pending-decoration-hooks):
-	* cedet/semantic/wisent.el (wisent-lex-make-token-table):
-	* cedet/semantic/util.el (semantic-file-token-stream)
-	(semantic-something-to-stream):
-	* cedet/semantic/tag.el (semantic-tag-make-assoc-list)
-	(semantic-expand-nonterminal):
-	* cedet/semantic/tag-file.el (semantic-find-nonterminal)
-	(semantic-find-dependency, semantic-find-nonterminal)
-	(semantic-find-dependency):
-	* cedet/semantic/lex.el (semantic-flex-start, semantic-flex-end)
-	(semantic-flex-text, semantic-flex-make-keyword-table)
-	(semantic-flex-keyword-p, semantic-flex-keyword-put)
-	(semantic-flex-keyword-get, semantic-flex-map-keywords)
-	(semantic-flex-keywords, semantic-flex-buffer, semantic-flex-list):
-	* cedet/semantic/java.el (semantic-java-prototype-nonterminal):
-	* cedet/semantic/idle.el (semantic-before-idle-scheduler-reparse-hooks)
-	(semantic-after-idle-scheduler-reparse-hooks):
-	* cedet/semantic/edit.el (semantic-edits-incremental-reparse-failed-hooks):
-	* cedet/semantic/db-mode.el (semanticdb-mode-hooks):
-	* cedet/semantic.el (semantic-toplevel-bovine-table)
-	(semantic-toplevel-bovine-cache)
-	(semantic-before-toplevel-bovination-hook, semantic-init-hooks)
-	(semantic-init-mode-hooks, semantic-init-db-hooks)
-	(semantic-bovination-working-type): Provide the `when' arg.
-
 2009-10-24  Karl Fogel  <kfogel@red-bean.com>
 
 	* bookmark.el: Update documentation, especially documentation
@@ -11500,15 +11007,6 @@
 	* files.el (delete-directory): Delete symlinks to directories with
 	delete-file (Bug#4739).
 
-2009-10-24  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/semantic/util.el (semantic-recursive-find-nonterminal-by-name):
-	* cedet/semantic/tag.el (semantic-token-type-parent): Add WHEN
-	argument to make-obsolete.
-
-	* cedet/semantic/fw.el (semantic-alias-obsolete)
-	(semantic-varalias-obsolete): Add optional WHEN argument.
-
 2009-10-24  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	* vc.el (vc-backend-for-registration): Rename from
@@ -11710,16 +11208,6 @@
 
 	* help-fns.el: Don't require help-mode (to avoid bootstrap issues).
 
-2009-10-21  Eric Ludlam  <zappo@gnu.org>
-
-	* cedet/semantic/bovine/c.el (semantic-c-debug-mode-init)
-	(semantic-c-debug-mode-init-pch): New functions.
-	(semantic-c-debug-mode-init-last-mode): New var.
-	(semantic-c-parse-lexical-token): Use them.
-
-	* cedet/semantic/lex-spp.el (semantic-lex-spp-anlyzer-do-replace):
-	When extracting the argument list, limit only by point-max.
-
 2009-10-21  Michael Albinus  <michael.albinus@gmx.de>
 
 	* net/tramp-smb.el (tramp-smb-get-stat-capability): New defun.
@@ -11834,81 +11322,6 @@
 	(tar-header-block-tokenize): Decode the username and groupname.
 	(tar-chown-entry, tar-chgrp-entry): Encode the names (bug#4730).
 
-2009-10-17  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/srecode/srt.el:
-	* cedet/srecode/compile.el:
-	* cedet/semantic/mru-bookmark.el:
-	* cedet/semantic/debug.el:
-	* cedet/semantic/complete.el:
-	* cedet/semantic/analyze.el: Require CL when compiling.
-
-2009-10-17  Eric Ludlam  <zappo@gnu.org>
-
-	* cedet/semantic/scope.el
-	(semantic-analyze-scoped-inherited-tag-map): Wrap calculation of
-	tmpscope so that the regular scope will continue to work.
-
-	* cedet/semantic/idle.el (semantic-idle-tag-highlight):
-	Use semantic-idle-summary-highlight-face as the highlighting.
-
-	* emacs-lisp/eieio-base.el (eieio-persistent-save): If buffer
-	contains multibyte characters, choose first applicable coding
-	system automatically.
-
-	* cedet/ede/project-am.el (project-run-target): New method.
-	(project-run-target): New method.
-
-	* cedet/ede.el (ede-target): Add run target menu item.
-	(ede-project, ede-minor-keymap): Add ede-run-target binding.
-	(ede-run-target): New function.
-	(ede-target::project-run-target): New method.
-
-	* cedet/ede/proj.el (project-run-target): New method.
-
-	* cedet/ede/proj-shared.el (ede-gcc-libtool-shared-compiler)
-	(ede-g++-libtool-shared-compiler): Remove SHELL.  Remove COMMANDS.
-	Add :rules.
-	(ede-proj-target-makefile-shared-object): Only libtool compilers
-	now available.  Add linkers for libtool.
-	(ede-cc-linker-libtool, ede-g++-linker-libtool): New.
-	(ede-proj-makefile-target-name): Always use .la extension.
-
-	* cedet/ede/proj-prog.el (project-run-target): New method.
-
-	* cedet/ede/proj-obj.el (ede-cc-linker): Rename from ede-gcc-linker.
-	(ede-g++-linker): Change Change link lines.
-
-	* cedet/ede/pmake.el (ede-pmake-insert-variable-shared):
-	When searching for old variables, go to the end of the buffer and
-	search backward from there.
-	(ede-proj-makefile-automake-insert-subdirs)
-	(ede-proj-makefile-automake-insert-extradist): New methods.
-	(ede-proj-makefile-create): Use them.
-
-	* cedet/ede/pconf.el (ede-proj-configure-test-required-file):
-	Force FILE to expand to the current target.  Use file-exists-p to
-	check that it exists.
-
-	* cedet/ede/linux.el (ede-linux-version): Don't call "head".
-	(ede-linux-load): Wrap dir in file-name-as-directory.
-	Set :version slot.
-
-	* cedet/ede/files.el (ede-get-locator-object): When enabling
-	locate, do so on "top".
-
-	* cedet/ede/emacs.el (ede-emacs-file-existing): Wrap "dir" in
-	file-name-as-directory during compare.
-	(ede-emacs-version): Return Emacs/XEmacs differentiator.
-	Get version number from different places.  Don't call egrep.
-	(ede-emacs-load): Set :version slot.  Call file-name-as-directory
-	to set the directory.
-
-	* cedet/ede/shell.el: New file.
-
-	* cedet/inversion.el (inversion-decoders): Allow for stray . in
-	alpha/beta variants.
-
 2009-10-17  Stefan Monnier  <monnier@iro.umontreal.ca>
 
 	* international/mule-cmds.el (select-safe-coding-system): If the file
@@ -11916,9 +11329,6 @@
 
 2009-10-17  Glenn Morris  <rgm@gnu.org>
 
-	* cedet/semantic/grammar.el (semantic-grammar--lex-delim-spec):
-	All errors should have messages.
-
 	* foldout.el (foldout-mouse-swallow-events):
 	* gs.el (gs-load-image): Replace obsolete forms of sit-for, sleep-for.
 
@@ -12217,16 +11627,6 @@
 	* calendar/calendar.el (calendar-split-width-threshold): New option.
 	(calendar-basic-setup): Use calendar-split-width-threshold.
 
-2009-10-10  Sascha Wilde  <wilde@sha-bang.de>
-
-	* cedet/ede/proj-shared.el (ede-proj-makefile-target-name):
-	Use .la for Automake.
-
-2009-10-09  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/ede/pconf.el (ede-proj-configure-synchronize):
-	Use "autoreconf -i".  Suggested by Andreas Schwab.
-
 2009-10-09  Juanma Barranquero  <lekktu@gmail.com>
 
 	* international/mule-cmds.el (ucs-names): Exclude new "Enclosed
@@ -12255,13 +11655,6 @@
 	(bookmark-jump-other-window): Just invoke bookmark-jump with new
 	argument now, so the two function's behaviors will match.  (Bug#3645)
 
-2009-10-08  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/ede/proj.el (project-make-dist, project-compile-project):
-	Fix filename test.
-	(ede-proj-dist-makefile): Use expand-file-name instead of concat
-	to expand file names.
-
 2009-10-08  Michael Albinus  <michael.albinus@gmx.de>
 
 	* net/tramp.el (tramp-file-name-real-user, tramp-file-name-domain)
@@ -12273,15 +11666,6 @@
 	(tramp-smb-handle-expand-file-name): Implement "~" expansion.
 	(tramp-smb-maybe-open-connection): Flush the cache only if necessary.
 
-2009-10-08  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/ede/proj-obj.el (ede-gcc-linker): New var.
-	(ede-proj-target-makefile-objectcode): Use it.
-
-	* cedet/ede/source.el (ede-want-any-source-files-p)
-	(ede-want-any-auxiliary-files-p, ede-want-any-files-p):
-	Return search result.  This error was introduced while merging.
-
 2009-10-07  Juanma Barranquero  <lekktu@gmail.com>
 
 	* makefile.w32-in (WINS_UPDATES): Fix typo in previous change.
@@ -12556,26 +11940,6 @@
 	(Info-bookmark-jump): Document with a doc string, not just a comment.
 	(Bug#4203)
 
-2009-10-04  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/semantic.el (semantic-new-buffer-setup-functions): New option.
-	(semantic-new-buffer-fcn): Call parser setup functions here.
-	(semantic-mode): Don't call parser setup functions here, it's done
-	in semantic-new-buffer-fcn now.
-	(semantic-mode): Parse all existing buffers when enabled.
-
-	* cedet/srecode/compile.el (srecode-compile-file):
-	Call semantic-new-buffer-fcn if the buffer has not been parsed.
-
-2009-10-04  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/ede/pmake.el (ede-pmake-insert-variable-once): Delete.
-
-	* cedet/ede/proj-comp.el: Don't require ede/pmake at toplevel.
-	(proj-comp-insert-variable-once): New macro, renamed from
-	ede-pmake-insert-variable-once in ede/pmake.edl.
-	(ede-proj-makefile-insert-variables): Use it.
-
 2009-10-04  Michael Albinus  <michael.albinus@gmx.de>
 
 	* files.el (copy-directory): New defun.
@@ -12584,35 +11948,12 @@
 
 2009-10-04  Juanma Barranquero  <lekktu@gmail.com>
 
-	* cedet/ede/makefile-edit.el (makefile-beginning-of-command)
-	(makefile-end-of-command):
-	* cedet/srecode/srt-mode.el (semantic-beginning-of-context)
-	(semantic-end-of-context): Fix previous change.  Doc fixes.
-
-2009-10-04  Juanma Barranquero  <lekktu@gmail.com>
-
 	* files-x.el (modify-dir-local-variable)
-	(copy-dir-locals-to-file-locals-prop-line):
-	* cedet/ede/makefile-edit.el (makefile-beginning-of-command)
-	(makefile-end-of-command):
-	* cedet/semantic/lex.el (semantic-lex-token):
-	* cedet/semantic/analyze/fcn.el
-	(semantic-analyze-dereference-metatype-1):
-	* cedet/semantic/bovine/c.el (semantic-lex-cpp-define)
-	(semantic-lex-cpp-undef):
-	* cedet/semantic/wisent/wisent.el (wisent-skip-block):
-	* cedet/srecode/srt-mode.el (semantic-beginning-of-context)
-	(semantic-end-of-context): Fix typos in docstrings.
+	(copy-dir-locals-to-file-locals-prop-line): Fix typos in
+	docstrings.
 
 	* recentf.el (recentf-unload-function): New function.
 
-2009-10-04  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/ede.el (ede-project-placeholder-cache-file):
-	* cedet/semantic/db-file.el (semanticdb-default-save-directory):
-	* cedet/srecode/map.el (srecode-map-save-file):
-	Use locate-user-emacs-file.  Suggested by Juanma Barranquero.
-
 2009-10-04  Glenn Morris  <rgm@gnu.org>
 
 	* window.el (window-full-height-p): Add doc string.
@@ -12621,51 +11962,6 @@
 
 	* window.el (window-full-height-p): New function.  (Bug#4543)
 
-2009-10-03  Chong Yidong  <cyd@stupidchicken.com>
-
-	* cedet/srecode/insert.el: Require srecode/args.
-
-	* cedet/srecode/args.el: Require srecode/dictionary instead of
-	srecode/insert.
-
-	* cedet/srecode/srt-mode.el (srecode-template-mode): Doc fix.
-
-	* files.el (auto-mode-alist): Add .srt and Project.ede.
-
-	* cedet/semantic.el (semantic-mode):
-	Handle srecode-template-mode-hook as well.
-	(semantic-mode): Use js-mode-hook for Javascript hook.
-
-	* cedet/srecode/template.el: Remove hook variable.
-
-	* cedet/ede/proj-comp.el: Require ede/pmake when compiling.
-
-	* cedet/ede.el (ede-target-forms-menu): Don't enable if no
-	projects exist.
-	(ede-project-placeholder-cache-file): Default to a file in
-	user-emacs-directory.
-
-	* cedet/srecode/map.el (srecode-map-base-template-dir): Look for
-	templates in data-directory.
-	(srecode-map-save-file): Default to a file in user-emacs-directory.
-
-	* cedet/ede/srecode.el (ede-srecode-setup): Use default templates
-	directory.
-
-2009-09-30  Eric Ludlam  <zappo@gnu.org>
-
-	* cedet/semantic/util-modes.el (semantic-highlight-func-mode):
-	Doc fix.
-
-	* cedet/ede/proj-comp.el (ede-proj-makefile-insert-variables):
-	Only insert each variable once.
-
-	* cedet/ede/pmake.el (ede-pmake-insert-variable-once): New macro.
-	(ede-pmake-insert-variable-shared): Use it.
-
-	* cedet/ede/cpp-root.el (ede-preprocessor-map): Do not deref table
-	for lexical table iff table is nil.
-
 2009-10-03  Dan Nicolaescu  <dann@ics.uci.edu>
 
 	* vc.el: Remove commented out code.
@@ -12685,9 +11981,6 @@
 	the frame is wide.
 	(calendar-generate-window): Test for shrinkability rather than width.
 
-	* cedet/semantic/db-find.el (data-debug-insert-tag-list): Comment out
-	declaration, currently false.
-
 	* mail/rmail.el (rmail-generate-viewer-buffer): Be more careful about
 	reusing existing buffers, in case we happen to visit two files with the
 	same basename.  (Bug#4593)
@@ -12957,142 +12250,10 @@
 	* emacs-lisp/eieio.el (defclass, eieio-defclass-autoload)
 	(eieio-copy-parents-into-subclass, make-instance, class-children)
 	(eieio-generic-form):
-	* cedet/cedet-files.el (cedet-directory-name-to-file-name):
-	* cedet/cedet-idutils.el (cedet-idutils-search)
-	(cedet-idutils-expand-filename, cedet-idutils-support-for-directory)
-	(cedet-idutils-version-check):
-	* cedet/cedet.el (cedet-version):
-	* cedet/data-debug.el (data-debug-insert-overlay-button)
-	(data-debug-insert-overlay-list-button)
-	(data-debug-insert-buffer-button)
-	(data-debug-insert-buffer-list-button)
-	(data-debug-insert-process-button, data-debug-insert-ring-button)
-	(data-debug-insert-widget, data-debug-insert-stuff-list-button)
-	(data-debug-insert-stuff-vector-button)
-	(data-debug-insert-symbol-button, data-debug-insert-string)
-	(data-debug-insert-number, data-debug-insert-lambda-expression)
-	(data-debug-insert-nil, data-debug-insert-simple-thing)
-	(data-debug-insert-custom, data-debug-edebug-expr):
-	* cedet/ede.el (ede-auto-add-method, ede-project-class-files)
-	(global-ede-mode-map, ede-new, ede-debug-target)
-	(ede-customize-current-target, ede-buffers, ede-map-buffers, ede-set):
-	* cedet/semantic.el (semantic-minimum-working-buffer-size)
-	(semantic-fetch-tags, semantic-submode-list)
-	(semantic-default-submodes):
-	* cedet/ede/source.el (ede-source-match):
-	* cedet/ede/project-am.el (project-am-type-alist, project-add-file)
-	(project-am-package-info):
-	* cedet/ede/proj.el (ede-proj-target, project-new-target):
-	* cedet/ede/proj-elisp.el (ede-proj-tweak-autoconf):
-	* cedet/ede/proj-comp.el (ede-current-build-list):
-	* cedet/ede/makefile-edit.el (makefile-move-to-macro):
-	* cedet/ede/files.el (ede-toplevel-project-or-nil):
-	* cedet/ede/cpp-root.el (initialize-instance):
-	* cedet/ede/autoconf-edit.el (autoconf-find-last-macro)
-	(autoconf-parameter-strip, autoconf-insert-new-macro):
-	* cedet/semantic/wisent.el (wisent-lex-eoi):
-	* cedet/semantic/util-modes.el (global-semantic-show-parser-state-mode)
-	(semantic-show-parser-state-mode):
-	* cedet/semantic/texi.el (semantic-texi-environment-regexp):
-	* cedet/semantic/tag.el (semantic-tag-new-variable)
-	(semantic-tag-class, semantic-tag-new-variable, semantic-tag-copy)
-	(semantic--tag-deep-copy-attributes, semantic--tag-deep-copy-value)
-	(semantic--tag-deep-copy-tag-list)
-	(semantic-tag-components-with-overlays-default):
-	* cedet/semantic/symref.el (semantic-symref-find-text):
-	* cedet/semantic/senator.el (senator-yank-tag)
-	(senator-transpose-tags-up):
-	* cedet/semantic/scope.el (semantic-analyze-scoped-tags-default)
-	(semantic-analyze-scoped-inherited-tags, semantic-scope-find):
-	* cedet/semantic/sb.el (semantic-sb-autoexpand-length):
-	* cedet/semantic/lex.el (semantic-lex-comment-regex)
-	(semantic-lex-maximum-depth, define-lex, semantic-lex-token)
-	(semantic-lex-unterminated-syntax-protection, define-lex-analyzer):
-	* cedet/semantic/lex-spp.el
-	(semantic-lex-spp-dynamic-macro-symbol-obarray-stack)
-	(semantic-lex-spp-symbol, semantic-lex-spp-one-token-to-txt):
-	* cedet/semantic/idle.el
-	(semantic-idle-summary-current-symbol-info-brutish)
-	(semantic-idle-summary-current-symbol-info-default):
-	* cedet/semantic/grammar.el (semantic-grammar-recreate-package)
-	(semantic--grammar-macro-compl-dict):
-	* cedet/semantic/grammar-wy.el (semantic-grammar-wy--parse-table):
-	* cedet/semantic/format.el (semantic-format-tag-custom-list)
-	(semantic-format-tag-canonical-name-default):
-	* cedet/semantic/find.el (semantic-find-tag-by-overlay-in-region)
-	(semantic-find-tags-for-completion)
-	(semantic-find-tags-by-scope-protection-default)
-	(semantic-deep-find-tags-for-completion):
-	* cedet/semantic/edit.el
-	(semantic-edits-incremental-reparse-failed-hook)
-	(semantic-edits-verbose-flag, semantic-edits-assert-valid-region)
-	(semantic-edits-splice-remove, semantic-edits-splice-replace):
-	* cedet/semantic/doc.el (semantic-documentation-comment-preceeding-tag):
-	* cedet/semantic/dep.el (semantic-dependency-include-path):
-	* cedet/semantic/db.el (semanticdb-default-find-index-class)
-	(semanticdb-match-any-mode, semanticdb-with-match-any-mode)
-	(semanticdb-project-roots):
-	* cedet/semantic/db-find.el (semanticdb-implied-include-tags)
-	(semanticdb-find-adebug-insert-scanned-tag-cons)
-	(semanticdb-find-log-buffer-name, semanticdb-find-result-mapc)
-	(semanticdb-brute-deep-find-tags-for-completion):
-	* cedet/semantic/db-ebrowse.el (semanticdb-ebrowse-add-tree-to-table):
-	* cedet/semantic/ctxt.el (semantic-beginning-of-context-default)
-	(semantic-end-of-context-default)
-	(semantic-ctxt-current-function-default)
-	(semantic-ctxt-scoped-types-default):
-	* cedet/semantic/complete.el (semantic-complete-read-tag-engine)
-	(semantic-complete-inline-tag-engine)
-	(semantic-complete-inline-custom-type)
-	(semantic-complete-read-tag-analyzer):
-	* cedet/semantic/chart.el (semantic-chart-tags-by-class)
-	(semantic-chart-database-size):
-	* cedet/semantic/analyze.el (semantic-analyze-current-symbol)
-	(semantic-analyze-current-context):
-	* cedet/semantic/symref/list.el (semantic-symref)
-	(semantic-symref-hide-buffer, semantic-symref-symbol):
-	* cedet/semantic/symref/grep.el (semantic-symref-grep-use-template):
-	* cedet/semantic/symref/filter.el (semantic-symref-hits-in-region):
-	* cedet/semantic/bovine/el.el (semantic-elisp-form-to-doc-string):
-	* cedet/semantic/bovine/c.el (semantic-lex-c-preprocessor-symbol-map)
-	(semantic-c-parse-token-hack-depth, semantic-c--template-name-1)
-	(semantic-c-dereference-template):
-	* cedet/semantic/analyze/refs.el (semantic--analyze-refs-full-lookup)
-	(semantic--analyze-refs-full-lookup-with-parents)
-	(semantic--analyze-refs-full-lookup-simple):
-	* cedet/semantic/analyze/complete.el
-	(semantic-analyze-possible-completions):
-	* cedet/srecode/table.el (srecode-mode-table-new):
-	* cedet/srecode/srt.el (srecode-read-variable-name):
-	* cedet/srecode/srt-mode.el (srecode-macro-help, srecode-in-macro-p):
-	* cedet/srecode/semantic.el (srecode-semantic-handle-:tag)
-	(srecode-semantic-handle-:tagtype, srecode-semantic-insert-tag):
-	* cedet/srecode/map.el (srecode-current-map):
-	* cedet/srecode/insert.el (srecode-insert)
-	(srecode-insert-variable-secondname-handler, srecode-insert-method)
-	(srecode-template-inserter-point-override)
-	(srecode-insert-include-lookup):
-	* cedet/srecode/getset.el (srecode-auto-choose-class):
-	* cedet/srecode/extract.el (srecode-inserter-extract):
-	* cedet/srecode/document.el
-	(srecode-document-autocomment-return-last-alist)
-	(srecode-document-autocomment-param-type-alist)
-	(srecode-document-insert-function-comment)
-	(srecode-document-insert-variable-one-line-comment)
-	(srecode-document-function-name-comment):
-	* cedet/srecode/dictionary.el (srecode-create-dictionary)
-	(srecode-compound-toString):
-	* cedet/srecode/compile.el (srecode-flush-active-templates):
-	* cedet/srecode/args.el (srecode-semantic-handle-:blank):
-	Doc/message fixes.
 
 	* vc-cvs.el (vc-cvs-parse-entry): Be more careful with the
 	match-data.  (Bug#4555).
 
-	* cedet/semantic/bovine/gcc.el
-	(semantic-c-reset-preprocessor-symbol-map): Fix declaration.
-	(semantic-gcc-get-include-paths, semantic-gcc-setup-data): Doc fixes.
-
 	* emacs-lisp/check-declare.el (check-declare-scan): Read the declaration
 	rather than parsing it as a regexp.  This relaxes the layout
 	requirements and makes errors easier to detect.
@@ -13107,41 +12268,8 @@
 	* term/w32-win.el (setup-default-fontset, set-fontset-font):
 	Remove unused declarations.
 
-2009-10-01  Juanma Barranquero  <lekktu@gmail.com>
-
-	* cedet/semantic/wisent/javat-wy.el
-	(wisent-java-tags-wy--keyword-table): Use \000 instead of literal ^@.
-
-2009-09-30  Juanma Barranquero  <lekktu@gmail.com>
-
-	* cedet/srecode/expandproto.el: Fix provide statement.
-
-2009-09-30  Eric Ludlam  <zappo@gnu.org>
-
-	* emacs-lisp/eieio.el (boolean-p): Delete.
-
-2009-09-30  Sascha Wilde  <wilde@sha-bang.de>
-
-	* cedet/ede/srecode.el: Fix provide statement.
-
 2009-09-30  Glenn Morris  <rgm@gnu.org>
 
-	* cedet/ede/proj.el (ede-proj-target-makefile-miscelaneous):
-	* cedet/ede/proj-aux.el (ede-aux-source):
-	* cedet/ede/proj-misc.el (ede-proj-target-makefile-miscelaneous)
-	(ede-misc-source):
-	* cedet/semantic/mru-bookmark.el (semantic-mrub-completing-read)
-	(semantic-mrub-switch-tags): Fix doc typos.
-
-	* cedet/semantic/db-global.el (data-debug-new-buffer)
-	(data-debug-insert-thing): Remove unneeded declarations (one broken).
-	(semanticdb-enable-gnu-global-databases): Fix prompt typo.
-
-	* cedet/semantic/analyze/fcn.el (semantic-scope-find): Fix declaration.
-
-	* cedet/semantic/bovine/gcc.el (semantic-gcc-setup): Replace runtime
-	use of CL function `remove-if-not'.
-
 	* emacs-lisp/authors.el (authors-ignored-files): Add "js2-mode.el".
 
 	* emacs-lisp/elint.el (elint-init-form): Report declarations where the
@@ -13179,16 +12307,6 @@
 
 2009-09-29  Glenn Morris  <rgm@gnu.org>
 
-	* cedet/semantic/symref/idutils.el:
-	* cedet/semantic/symref/list.el: Relicense under GPLv3+.
-
-	* cedet/ede/srecode.el (srecode-resolve-arguments): Fix declaration.
-
-	* cedet/semantic/complete.el (semantic-displayor-focus-abstract-child-p):
-	* cedet/semantic/tag-file.el (semanticdb-table-child-p):
-	* cedet/srecode/compile.el (srecode-template-inserter-newline-child-p):
-	Mark declarations not understood by check-declare.
-
 	* emacs-lisp/check-declare.el (check-declare-locate): Remove pointless
 	file-name-nondirectory call preventing location of cedet files.
 	(check-declare-verify): Use literal search rather than re-search.
@@ -13226,15 +12344,6 @@
 
 	* Makefile.in (ELCFILES): Add CEDET files.
 
-2009-09-28  Eric Ludlam  <zappo@gnu.org>
-
-	CEDET (development tools) package merged.
-
-	* cedet/*.el:
-	* cedet/ede/*.el:
-	* cedet/semantic/*.el:
-	* cedet/srecode/*.el: New files.
-
 2009-09-28  Michael Albinus  <michael.albinus@gmx.de>
 
 	* Makefile.in (ELCFILES): Add net/tramp-imap.elc.
@@ -13248,26 +12357,6 @@
 
 	* net/tramp-imap.el: New package.
 
-2009-09-28  Eric Ludlam  <zappo@gnu.org>
-
-	* emacs-lisp/chart.el:
-	* emacs-lisp/eieio-base.el:
-	* emacs-lisp/eieio-comp.el:
-	* emacs-lisp/eieio-custom.el:
-	* emacs-lisp/eieio-datadebug.el:
-	* emacs-lisp/eieio-opt.el:
-	* emacs-lisp/eieio-speedbar.el:
-	* emacs-lisp/eieio.el: New files.
-
-	* cedet/cedet-cscope.el:
-	* cedet/cedet-files.el:
-	* cedet/cedet-global.el:
-	* cedet/cedet-idutils.el:
-	* cedet/data-debug.el:
-	* cedet/inversion.el:
-	* cedet/mode-local.el:
-	* cedet/pulse.el: New files.
-
 2009-09-27  Vinicius Jose Latorre  <viniciusjl@ig.com.br>
 
 	* whitespace.el (whitespace-trailing-regexp)
--- a/lisp/calculator.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/calculator.el	Thu Sep 23 15:00:31 2010 -0400
@@ -369,7 +369,8 @@
 Used for repeating operations in calculator-repR/L.")
 
 (defvar calculator-registers ; use user-bindings first
-  (append calculator-user-registers (list (cons ?e e) (cons ?p pi)))
+  (append calculator-user-registers
+          (list (cons ?e float-e) (cons ?p float-pi)))
   "The association list of calculator register values.")
 
 (defvar calculator-saved-global-map nil
@@ -1300,7 +1301,7 @@
                       (calculator-funcall __f__ x y))))
           (fset 'D (function
                     (lambda (x)
-                      (if calculator-deg (/ (* x 180) pi) x))))
+                      (if calculator-deg (/ (* x 180) float-pi) x))))
           (unwind-protect (eval f)
             (if Fbound (fset 'F Fsave) (fmakunbound 'F))
             (if Dbound (fset 'D Dsave) (fmakunbound 'D)))))
--- a/lisp/calendar/appt.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/calendar/appt.el	Thu Sep 23 15:00:31 2010 -0400
@@ -334,30 +334,42 @@
         (if (or force                      ; eg initialize, diary save
                 (null appt-prev-comp-time) ; first check
                 (< cur-comp-time appt-prev-comp-time)) ; new day
-            (condition-case nil
-                (if appt-display-diary
-                    (let ((diary-hook
-                           (if (assoc 'appt-make-list diary-hook)
-                               diary-hook
-                             (cons 'appt-make-list diary-hook))))
-                      (diary))
-                  (let* ((diary-display-function 'appt-make-list)
-                         (d-buff (find-buffer-visiting diary-file))
-                         (selective
-                          (if d-buff    ; diary buffer exists
-                              (with-current-buffer d-buff
-                                diary-selective-display))))
-                    ;; FIXME why not using diary-list-entries with
-                    ;; non-nil LIST-ONLY?
-                    (diary)
-                    ;; If the diary buffer existed before this command,
-                    ;; restore its display state.  Otherwise, kill it.
-                    (if d-buff
-                        ;; Displays the diary buffer.
-                        (or selective (diary-show-all-entries))
-                      (and (setq d-buff (find-buffer-visiting diary-file))
-                           (kill-buffer d-buff)))))
-              (error nil)))
+            (ignore-errors
+              (if appt-display-diary
+                  (let ((diary-hook
+                         (if (assoc 'appt-make-list diary-hook)
+                             diary-hook
+                           (cons 'appt-make-list diary-hook))))
+                    (diary))
+                (let* ((diary-display-function 'appt-make-list)
+                       (d-buff (find-buffer-visiting diary-file))
+                       (selective
+                        (if d-buff    ; diary buffer exists
+                            (with-current-buffer d-buff
+                              diary-selective-display)))
+                       d-buff2)
+                  ;; Not displaying the diary, so we can ignore
+                  ;; diary-number-of-entries.  Since appt.el only
+                  ;; works on a daily basis, no need for more entries.
+                  ;; FIXME why not using diary-list-entries with
+                  ;; non-nil LIST-ONLY?
+                  (diary 1)
+                  ;; If the diary buffer existed before this command,
+                  ;; restore its display state.  Otherwise, kill it.
+                  (and (setq d-buff2 (find-buffer-visiting diary-file))
+                       (if d-buff
+                           (or selective
+                               (with-current-buffer d-buff2
+                                 (if diary-selective-display
+                                     ;; diary-show-all-entries displays
+                                     ;; the diary buffer.
+                                     (diary-unhide-everything))))
+                         ;; FIXME does not kill any included diary files.
+                         ;; The real issue is that (diary) should not
+                         ;; have the side effect of visiting all the
+                         ;; diary files.  It is not really appt.el's job to
+                         ;; clean up this mess...
+                         (kill-buffer d-buff2)))))))
         (setq appt-prev-comp-time cur-comp-time
               appt-mode-string nil
               appt-display-count nil)
@@ -573,6 +585,17 @@
               (let ((entry-list diary-entries-list)
                     (new-time-string "")
                     time-string)
+                ;; Below, we assume diary-entries-list was in date
+                ;; order.  It is, unless something on
+                ;; diary-list-entries-hook has changed it, eg
+                ;; diary-include-other-files (bug#7019).  It must be
+                ;; in date order if number = 1.
+                (and diary-list-entries-hook
+                     appt-display-diary
+                     (not (eq diary-number-of-entries 1))
+                     (not (memq (car (last diary-list-entries-hook))
+                                '(diary-sort-entries sort-diary-entries)))
+                     (setq entry-list (sort entry-list 'diary-entry-compare)))
                 ;; Skip diary entries for dates before today.
                 (while (and entry-list
                             (calendar-date-compare
--- a/lisp/calendar/diary-lib.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/calendar/diary-lib.el	Thu Sep 23 15:00:31 2010 -0400
@@ -711,14 +711,26 @@
 for NUMBER days starting with date DATE.  The other entries are hidden
 using overlays.  If NUMBER is less than 1, this function does nothing.
 
-Returns a list of all relevant diary entries found, if any, in order by date.
+Returns a list of all relevant diary entries found.
 The list entries have the form ((MONTH DAY YEAR) STRING SPECIFIER) where
 \(MONTH DAY YEAR) is the date of the entry, STRING is the entry text, and
 SPECIFIER is the applicability.  If the variable `diary-list-include-blanks'
 is non-nil, this list includes a dummy diary entry consisting of the empty
 string for a date with no diary entries.
 
-After the list is prepared, the following hooks are run:
+If entries are being produced for multiple dates (i.e., NUMBER > 1),
+then this function normally returns the entries from any given
+diary file in date order.  The entries for any given day are in
+the order in which they were found in the file, not necessarily
+in time-of-day order.  Note that any functions present on the
+hooks (see below) may add entries, or change the order.  For
+example, `diary-include-other-diary-files' adds entries from any
+include files that it finds to the end of the original list.  The
+entries from each file will be in date order, but the overall
+list will not be.  If you want the entire list to be in time order,
+add `diary-sort-entries' to the end of `diary-list-entries-hook'.
+
+After the initial list is prepared, the following hooks are run:
 
   `diary-nongregorian-listing-hook' can cull dates from the diary
       and each included file, for example to process Islamic diary
--- a/lisp/calendar/solar.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/calendar/solar.el	Thu Sep 23 15:00:31 2010 -0400
@@ -753,12 +753,12 @@
                                     (sin (mod
                                           (+ (cadr x)
                                              (* (nth 2 x) U))
-                                          (* 2 pi)))))
+                                          (* 2 float-pi)))))
                                solar-data-list)))))
          (aberration
           (* 0.0000001 (- (* 17 (cos (+ 3.10 (* 62830.14 U)))) 973)))
-         (A1 (mod (+ 2.18 (* U (+ -3375.70 (* 0.36 U)))) (* 2 pi)))
-         (A2 (mod (+ 3.51 (* U (+ 125666.39 (* 0.10 U)))) (* 2 pi)))
+         (A1 (mod (+ 2.18 (* U (+ -3375.70 (* 0.36 U)))) (* 2 float-pi)))
+         (A2 (mod (+ 3.51 (* U (+ 125666.39 (* 0.10 U)))) (* 2 float-pi)))
          (nutation (* -0.0000001 (+ (* 834 (sin A1)) (* 64 (sin A2))))))
     (mod (radians-to-degrees (+ longitude aberration nutation)) 360.0)))
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -0,0 +1,1436 @@
+2010-09-21  Eric Ludlam  <zappo@gnu.org>
+
+	Synch SRecode to CEDET 1.0.
+
+	* pulse.el (pulse-momentary-highlight-overlay): If pulse-flag is
+	'never, disable all pulsing.
+
+	* cedet.el (cedet-version):
+	* srecode.el (srecode-version): Bump version to 1.0.
+
+	* srecode/texi.el (srecode-texi-insert-tag-as-doc): New function.
+	(semantic-insert-foreign-tag): Use it.
+
+	* srecode/mode.el (srecode-bind-insert): Call
+	srecode-load-tables-for-mode.
+	(srecode-minor-mode-templates-menu): Do not list templates that
+	are not in the current project.
+	(srecode-menu-bar): Add binding for srecode-macro-help.
+
+	* srecode/table.el (srecode-template-table): Add :project slot.
+	(srecode-dump): Dump it.
+
+	* srecode/map.el (srecode-map-update-map): Make map loading more
+	robust.
+
+	* srecode/insert.el (srecode-insert-fcn): Merge template
+	dictionary before resolving arguments.
+	(srecode-insert-method-helper): Add error checking to make sure
+	that we only have dictionaries.
+	(srecode-insert-method): Check template nesting depth when using
+	point inserter override.
+	(srecode-insert-method): Install override with depth limit.
+
+	* srecode/getset.el (srecode-insert-getset): Force tag table
+	update.  Don't query the class if it is empty.
+
+	* srecode/find.el (srecode-template-get-table)
+	(srecode-template-get-table-for-binding)
+	(srecode-all-template-hash): Skip if not in current project.
+	(srecode-template-table-in-project-p): New method.
+
+	* srecode/fields.el (srecode-fields-exit-confirmation): New option.
+	(srecode-field-exit-ask): Use it.
+
+	* srecode/dictionary.el (srecode-dictionary-add-template-table):
+	Do not add variables in tables not for the current project.
+	(srecode-compound-toString): Handle cases where the default value
+	is another compound value.
+	(srecode-dictionary-lookup-name): New optional argument
+	NON-RECURSIVE, which inhibits visiting dictionary parents.
+	(srecode-dictionary-add-section-dictionary)
+	(srecode-dictionary-merge): New optional argument FORCE adds
+	values even if an identically named entry exists.
+	(srecode-dictionary-add-entries): New method.
+	(srecode-create-dictionaries-from-tags): New function.
+
+	* srecode/cpp.el (srecode-cpp): New defgroup.
+	(srecode-cpp-namespaces): New option.
+	(srecode-semantic-handle-:using-namespaces)
+	(srecode-cpp-apply-templates): New functions.
+	(srecode-semantic-apply-tag-to-dict): Handle template parameters
+	by calling `srecode-cpp-apply-templates'.
+
+	* srecode/compile.el (srecode-compile-templates): Fix directory
+	compare of built-in templates.  Give built-ins lower piority.
+	Support special variable "project".
+	(srecode-compile-template-table): Set :project slot of new tables.
+	(srecode-compile-one-template-tag): Use
+	srecode-create-dictionaries-from-tags.
+
+2010-09-21  Eric Ludlam  <zappo@gnu.org>
+
+	Synch EDE to CEDET 1.0.
+
+	* cedet-idutils.el (cedet-idutils-make-command): New option.
+	(cedet-idutils-mkid-call):
+	(cedet-idutils-create/update-database): New functions.
+
+	* cedet-cscope.el (cedet-cscope-create):
+	(cedet-cscope-create/update-database): New functions.
+	(cedet-cscope-support-for-directory): Make interactive.
+
+	* cedet-global.el (cedet-global-gtags-command): New option.
+	(cedet-gnu-global-gtags-call)
+	(cedet-gnu-global-create/update-database): New functions.
+
+	* ede.el (ede-save-cache): Fix recentf-exclude expression.
+	(ede-make-dist): Always use toplevel project.
+	(ede-buffer-object): If we fail to find an object in the current
+	project, loop upward looking for a match.  If no target is found,
+	use most local project.
+	(ede-buffer-belongs-to-target-p)
+	(ede-buffer-belongs-to-project-p): New functions.
+	(ede-initialize-state-current-buffer): New function.
+	(ede-target-forms-menu, ede-project-buffers): Use them.
+	(ede-minor-mode, ede-reset-all-buffers): Use it.
+	(project-interactive-select-target, project-add-file): Don't use
+	ede-project-force-load.
+	(ede-buffer-object): New arg PROJSYM.
+	(ede-minor-mode): Remove ede-directory-project-p test.
+	(ede-initialize-state-current-buffer): Don't test for
+	ede-directory-project-p if there is a matching open project.
+	(ede-customize-forms-menu): Prevent error if there is no project.
+	(ede-load-project-file): Set ede-constructing to the thing being
+	constructed, instead of t.
+	(ede-project-force-load): Deleted.
+
+	* ede/base.el:
+	* ede/auto.el:
+	* ede/custom.el: New files.
+
+	* ede/autoconf-edit.el (autoconf-find-last-macro)
+	(autoconf-parameters-for-macro): Parse multiline parameters of
+	macros.  Optionally ignore case and at bol for macro.
+	(autoconf-parameter-strip): Use greedy match for newlines.
+	(autoconf-new-automake-string): Deleted.
+	(autoconf-new-program): Use SRecode to fill an empty file.
+
+	* ede/cpp-root.el (ede-create-lots-of-projects-under-dir): New
+	function.
+
+	* ede/files.el (ede-flush-project-hash): New command.
+	(ede-convert-path): Add optional PROJECT arg.
+	(ede-directory-project-p): Obey ".ede-ignore".
+	(ede-expand-filename-local)
+	(ede-expand-filename-impl-via-subproj): New methods.
+	(ede-expand-filename-impl): Use them.
+	(ede-project-root, ede-project-root-directory): Move to
+	ede/auto.el.
+
+	* ede/locate.el (ede-locate-flush-hash):
+	(ede-locate-create/update-root-database): New methods.
+	(initialize-instance): Use ede-locate-flush-hash.
+
+	* ede/pmake.el (ede-proj-makefile-insert-variables): If this is
+	the top project and not a metasubproject, set TOP to CURDIR.
+	(ede-proj-makefile-insert-variables): Output a target's object
+	list whether or not the vars are already in the Makefile.
+	(ede-pmake-insert-variable-once): New macro.
+
+	* ede/project-am.el (project-am-with-makefile-current): Add
+	recentf-exclude.
+	(project-am-load-makefile): Obey an optional suggested name.
+	(project-am-expand-subdirlist): New function.
+	(project-am-makefile::project-rescan): Use it.  Combine SUBDIRS
+	and DIST_SUBDIRS.
+	(project-am-meta-type-alist): A list to scan better Makefile.am
+	(project-am-scan-for-targets): Scan also over
+	project-am-meta-type-alist.
+	(ede-system-include-path): Simple implementation.
+	(ede-find-target): Deleted.  EDE core takes care of this.
+	(ede-buffer-mine): Create the searched filename as relative.
+	(project-am-load): Simplify, using autoconf-edit.
+	(project-am-extract-package-info): Fix separators.
+
+	* ede/proj.el (project-run-target): New method.
+	(project-make-dist, project-compile-project): Use
+	ede-proj-automake-p to determine which kind of compile to use.
+	(project-rescan): Call ede-load-project-file.
+	(ede-buffer-mine): Add more file names that belong to the project.
+	(ede-proj-compilers): Improve error message.
+
+	* ede/proj-obj.el (ede-ld-linker): Use the LDDEPS variable.
+	(ede-source-c++): Add more C++ extensions.
+	(ede-proj-target-makefile-objectcode): Quote initforms.  Support
+	lex and yacc.
+
+	* ede/proj-prog.el (ede-proj-makefile-insert-rules): Removed.
+	(ede-proj-makefile-insert-variables): New, add LDDEPS.
+	(ede-proj-makefile-insert-automake-post-variables): Add LDADD
+	variable.  Use ldlibs-local slot.  Add a -l to ldlibs strings.
+	(ede-proj-target-makefile-program): Swap order of two slots so
+	they show up in the same order as in the command line.
+	(ede-proj-target-makefile-program): Add ldlibs-local slot.
+
+	* ede/proj-shared.el (ede-g++-libtool-shared-compiler): Fix
+	inference rule to use cpp files.
+	(ede-proj-target-makefile-shared-object): Quote initforms.
+
+	* ede/proj-misc.el (ede-proj-target-makefile-miscelaneous):
+	* ede/proj-info.el (ede-proj-target-makefile-info):
+	* ede/proj-aux.el (ede-proj-target-aux):
+	* ede/proj-archive.el (ede-proj-target-makefile-archive):
+	* ede/proj-elisp.el (ede-proj-target-elisp)
+	(ede-proj-target-elisp-autoloads): Quote initforms.
+
+	* ede/srecode.el (ede-srecode-setup): Load autoconf templates.
+
+	* ede/shell.el (ede-shell-buffer): Fix buffer name.
+
+	* ede/pconf.el (ede-proj-configure-synchronize): If user events
+	occur while waiting for the compile process to finish, pull them
+	in and discard those events.
+
+2010-09-19  Eric Ludlam  <zappo@gnu.org>
+
+	Synch Semantic to CEDET 1.0.
+
+	* semantic.el (semantic-version): Update to 2.0.
+	(semantic-mode-map): Add "," and "m" bindings.
+	(navigate-menu): Update.
+
+	* semantic/symref.el (semantic-symref-calculate-rootdir):
+	New function.
+	(semantic-symref-detect-symref-tool): Use it.
+
+	* semantic/symref/grep.el (semantic-symref-grep-shell): New var.
+	(semantic-symref-perform-search): Use it.  Calculate root dir with
+	semantic-symref-calculate-rootdir.
+	(semantic-symref-derive-find-filepatterns): Improve error message.
+
+	* semantic/symref/list.el
+	(semantic-symref-results-mode-map): New bindings.
+	(semantic-symref-auto-expand-results): New option.
+	(semantic-symref-results-dump): Obey auto-expand.
+	(semantic-symref-list-expand-all, semantic-symref-regexp)
+	(semantic-symref-list-contract-all)
+	(semantic-symref-list-map-open-hits)
+	(semantic-symref-list-update-open-hits)
+	(semantic-symref-list-create-macro-on-open-hit)
+	(semantic-symref-list-call-macro-on-open-hits): New functions.
+	(semantic-symref-list-menu-entries)
+	(semantic-symref-list-menu): New vars.
+	(semantic-symref-list-map-open-hits): Move cursor to beginning of
+	match before calling the mapped function.
+
+	* semantic/doc.el
+	(semantic-documentation-comment-preceeding-tag): Do nothing if the
+	mode doesn't provide comment-start-skip.
+
+	* semantic/scope.el
+	(semantic-analyze-scope-nested-tags-default): Strip duplicates.
+	(semantic-analyze-scoped-inherited-tag-map): Take the tag we are
+	looking for as part of the scoped tags list.
+
+	* semantic/html.el (semantic-default-html-setup): Add
+	senator-step-at-tag-classes.
+
+	* semantic/decorate/include.el
+	(semantic-decoration-on-unknown-includes): Change light bgcolor.
+	(semantic-decoration-on-includes-highlight-default): Check that
+	the include tag has a postion.
+
+	* semantic/complete.el (semantic-collector-local-members):
+	(semantic-complete-read-tag-local-members)
+	(semantic-complete-jump-local-members): New class and functions.
+	(semantic-complete-self-insert): Save excursion before completing.
+
+	* semantic/analyze/complete.el
+	(semantic-analyze-possible-completions-default): If no completions
+	are found, return the raw by-name-only completion list.  Add FLAGS
+	arguments.  Add support for 'no-tc (type constraint) and
+	'no-unique, or no stripping duplicates.
+	(semantic-analyze-possible-completions-default): Add FLAGS arg.
+
+	* semantic/util-modes.el
+	(semantic-stickyfunc-show-only-functions-p): New option.
+	(semantic-stickyfunc-fetch-stickyline): Don't show stickytext for
+	the very first line in a buffer.
+
+	* semantic/util.el (semantic-hack-search)
+	(semantic-recursive-find-nonterminal-by-name)
+	(semantic-current-tag-interactive): Deleted.
+	(semantic-describe-buffer): Fix expand-nonterminal.  Add
+	lex-syntax-mods, type relation separator char, and command
+	separation char.
+	(semantic-sanity-check): Only message if called interactively.
+
+	* semantic/tag.el (semantic-tag-deep-copy-one-tag): Copy the
+	:filename property and the tag position.
+
+	* semantic/lex-spp.el (semantic-lex-spp-lex-text-string):
+	Add recursion limit.
+
+	* semantic/imenu.el (semantic-imenu-bucketize-type-members):
+	Make this buffer local, not the obsoleted variable.
+
+	* semantic/idle.el: Add breadcrumbs support.
+	(semantic-idle-summary-current-symbol-info-default)
+	(semantic-idle-tag-highlight)
+	(semantic-idle-completion-list-default): Use
+	semanticdb-without-unloaded-file-searches for speed, and to
+	conform to the controls that specify if the idle timer is supposed
+	to be parsing unparsed includes.
+	(semantic-idle-symbol-highlight-face)
+	(semantic-idle-symbol-maybe-highlight): Rename from *-summary-*.
+	Callers changed.
+	(semantic-idle-work-parse-neighboring-files-flag): Default to nil.
+	(semantic-idle-work-update-headers-flag): New var.
+	(semantic-idle-work-for-one-buffer): Use it.
+	(semantic-idle-local-symbol-highlight): Rename from
+	semantic-idle-tag-highlight.
+	(semantic-idle-truncate-long-summaries): New option.
+
+	* semantic/ia.el (semantic-ia-cache)
+	(semantic-ia-get-completions): Deleted.  Callers changed.
+	(semantic-ia-show-variants): New command.
+	(semantic-ia-show-doc): If doc is empty, don't make a temp buffer.
+	(semantic-ia-show-summary): If there isn't anything to show, say so.
+
+	* semantic/grammar.el (semantic-grammar-create-package):
+	Save the buffer even in batch mode.
+
+	* semantic/fw.el
+	(semanticdb-without-unloaded-file-searches): New macro.
+
+	* semantic/dep.el (semantic-dependency-find-file-on-path):
+	Fix case dereferencing ede-object when it is a list.
+
+	* semantic/db-typecache.el (semanticdb-expand-nested-tag)
+	(semanticdb-typecache-faux-namespace): New functions.
+	(semanticdb-typecache-file-tags)
+	(semanticdb-typecache-merge-streams): Use them.
+	(semanticdb-typecache-file-tags): When deriving tags from a file,
+	give the mode a chance to monkey with the tag copy.
+	(semanticdb-typecache-find-default): Wrap find in save-excursion.
+	(semanticdb-typecache-find-by-name-helper): Merge found names down.
+
+	* semantic/db-global.el
+	(semanticdb-enable-gnu-global-in-buffer): Don't show messages if
+	GNU Global is not available and we don't want to throw an error.
+
+	* semantic/db-find.el (semanticdb-find-result-nth-in-buffer):
+	When trying to normalize the tag to a buffer, don't error if
+	set-buffer method doesn't exist.
+
+	* semantic/db-file.el (semanticdb-save-db): Simplify msg.
+
+	* semantic/db.el (semanticdb-refresh-table): If forcing a
+	refresh on a file not in a buffer, use semantic-find-file-noselect
+	and delete the buffer after use.
+	(semanticdb-current-database-list): When calculating root via
+	hooks, force it through true-filename and skip the list of
+	possible roots.
+
+	* semantic/ctxt.el (semantic-ctxt-imported-packages): New.
+
+	* semantic/analyze/debug.el
+	(semantic-analyzer-debug-insert-tag): Reset standard output to
+	current buffer.
+	(semantic-analyzer-debug-global-symbol)
+	(semantic-analyzer-debug-missing-innertype): Change "prefix" to
+	"symbol" in messages.
+
+	* semantic/analyze/refs.el: (semantic-analyze-refs-impl)
+	(semantic-analyze-refs-proto): When calculating value, make sure
+	the found tag is 'similar' to the originating tag.
+	(semantic--analyze-refs-find-tags-with-parent): Attempt to
+	identify matches via imported symbols of parents.
+	(semantic--analyze-refs-full-lookup-with-parents): Do a deep
+	search during the brute search.
+
+	* semantic/analyze.el
+	(semantic-analyze-find-tag-sequence-default): Be robust to
+	calculated scopes being nil.
+
+	* semantic/bovine/c.el (semantic-c-describe-environment): Add
+	project macro symbol array.
+	(semantic-c-parse-lexical-token): Add recursion limit.
+	(semantic-ctxt-imported-packages, semanticdb-expand-nested-tag):
+	New overrides.
+	(semantic-expand-c-tag-namelist): Split a full type from a typedef
+	out to its own tag.
+	(semantic-expand-c-tag-namelist): Do not split out a typedef'd
+	inline type if it is an anonymous type.
+	(semantic-c-reconstitute-token): Use the optional initializers as
+	a clue that some function is probably a constructor.  When
+	defining the type of these constructors, split the parent name,
+	and use only the class part, if applicable.
+
+	* semantic/bovine/c-by.el:
+	* semantic/wisent/python-wy.el: Regenerate.
+
+2010-07-20  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic/db-file.el (object-write): Fix typo in docstring.
+
+2010-06-03  Eric Ludlam  <zappo@gnu.org>
+
+	* semantic/lex-spp.el
+	(semantic-lex-spp-table-write-slot-value): Instead of erroring on
+	invalid values during save, just save a nil (Bug#6324).
+
+2010-05-31  Jonathan Marchand  <jonathlela@gmail.com>  (tiny change)
+
+	* ede/cpp-root.el (ede-set-project-variables): Fix feature name
+	(bug#6231).
+
+2010-05-02  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	Use a mode-line spec rather than a static string in Semantic.
+	* semantic/util-modes.el:
+	(semantic-minor-modes-format): New var to replace...
+	(semantic-minor-modes-status): Remove.
+	(semantic-mode-line-update): Construct a mode-line spec rather than
+	a static string so that mouse buttons can be used on individual minor
+	modes and so that semantic-mode-line-update only needs to be called
+	when global settings are changed.
+	(semantic-add-minor-mode, semantic-toggle-minor-mode-globally):
+	Call semantic-mode-line-update.
+	(semantic-toggle-minor-mode-globally): Don't assume mode is on
+	minor-mode-alist, check semantic-minor-mode-alist as well.
+	(semantic-stickyfunc-mode, semantic-show-parser-state-auto-marker)
+	(semantic-show-parser-state-marker, semantic-show-parser-state-mode)
+	(semantic-show-unmatched-syntax-mode, semantic-highlight-edits-mode):
+	* semantic/mru-bookmark.el (semantic-mru-bookmark-mode):
+	* semantic/idle.el (semantic-idle-scheduler-mode)
+	(define-semantic-idle-service, semantic-idle-summary-mode):
+	* semantic/decorate/mode.el (semantic-decoration-mode):
+	Don't call semantic-mode-line-update any more.
+
+2010-05-02  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	Use define-minor-mode in CEDET where applicable.
+
+	* srecode/mode.el (srecode-minor-mode,global-srecode-minor-mode):
+	Use define-minor-mode.
+
+	* semantic/util-modes.el (semantic-add-minor-mode):
+	Remove unused arg `keymap' and code redundant with define-minor-mode.
+	(semantic-toggle-minor-mode-globally): Only handle arg -1 and 1.
+	(semantic-stickyfunc-mode, global-semantic-show-unmatched-syntax-mode)
+	(semantic-highlight-func-mode, global-semantic-show-parser-state-mode)
+	(global-semantic-highlight-edits-mode, semantic-highlight-edits-mode)
+	(semantic-show-unmatched-syntax-mode, semantic-show-parser-state-mode)
+	(global-semantic-stickyfunc-mode, global-semantic-highlight-func-mode):
+	Use define-minor-mode.
+	(semantic-stickyfunc-mode-setup, semantic-highlight-edits-mode-setup)
+	(semantic-show-unmatched-syntax-mode-setup)
+	(semantic-show-parser-state-mode-setup)
+	(semantic-highlight-func-mode-setup): Inline into sole caller.
+
+	* semantic/mru-bookmark.el (global-semantic-mru-bookmark-mode)
+	(semantic-mru-bookmark-mode): Use define-minor-mode.
+	(semantic-mru-bookmark-mode-setup): Inline into sole caller.
+
+	* semantic/idle.el (define-semantic-idle-service):
+	Use define-minor-mode and inline setup function into its sole caller.
+	(semantic-idle-scheduler-mode-setup)
+	(semantic-idle-summary-mode-setup): Inline into sole caller.
+	(global-semantic-idle-scheduler-mode, semantic-idle-scheduler-mode):
+	Use define-minor-mode.
+
+	* semantic/decorate/mode.el (global-semantic-decoration-mode)
+	(semantic-decoration-mode): Use define-minor-mode.
+	(semantic-decoration-mode-setup): Inline into sole caller.
+
+	* ede/dired.el (ede-dired-minor-mode): Initialize in declaration.
+	(ede-dired-minor-mode): Use define-minor-mode and derived-mode-p.
+	(ede-dired-add-to-target): Use dolist.
+
+2010-04-18  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede/pmake.el (ede-proj-makefile-insert-variables):
+	Don't destroy list before using it.
+
+2010-04-29  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic.el (semantic-completion-at-point-function):
+	New function.
+	(semantic-mode): Use semantic-completion-at-point-function for
+	completion-at-point-functions instead.
+
+2010-04-28  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic.el (semantic-mode): When enabled, add
+	semantic-ia-complete-symbol to completion-at-point-functions.
+
+	* semantic/ia.el (semantic-ia-complete-symbol): Return nil
+	if Semantic is not active.
+
+2010-04-19  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede/pmake.el (ede-proj-makefile-insert-variables):
+	Don't destroy list before using it.
+
+2010-04-02  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic/imenu.el (semantic-imenu-bucketize-type-members)
+	(semantic-create-imenu-directory-index): Fix typos in docstrings.
+	(semantic-imenu-goto-function): Reflow docstring.
+
+2010-03-24  Juanma Barranquero  <lekktu@gmail.com>
+
+	* srecode/table.el (srecode-template-table): Fix docstring typo.
+
+2010-03-24  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/bovine/c.el (semantic-c-describe-environment):
+	Consistently check ede-object is bound throughout.
+
+	* ede/project-am.el (ede-shell-run-something): Declare.
+
+2010-03-13  Eric M. Ludlam  <zappo@gnu.org>
+
+	* semantic/imenu.el: New file, from the CEDET repository
+	(Bug#5412).
+
+2010-03-06  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/grammar.el (semantic-grammar-header-template):
+	Update template copyright to GPLv3+.
+
+2010-02-28  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/db-find.el
+	(semanticdb-find-translate-path-brutish-default):
+	* ede/make.el (ede-make-check-version): Use
+	with-current-buffer instead of save-excursion.
+
+2010-02-16  Chong Yidong  <cyd@stupidchicken.com>
+
+	* data-debug.el (data-debug): Move to extensions group.
+
+	* ede.el (ede):
+	* srecode.el (srecode):
+	* semantic.el (semantic): Put in tools and extensions group.
+
+2010-02-14  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ede.el (ede-run-target, project-delete-target)
+	(project-dist-files, ede-name, ede-documentation, ede-parent-project)
+	(ede-adebug-project, ede-adebug-project-parent)
+	(ede-adebug-project-root): Fix typos in docstrings.
+
+2010-01-18  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ede/locate.el (ede-locate-file-in-project)
+	(ede-locate-file-in-project-impl): Fix typos in docstrings.
+	(ede-enable-locate-on-project): Fix typos in error messages.
+
+	* semantic/util-modes.el (semantic-unmatched-syntax-face)
+	(semantic-stickyfunc-old-hlf, semantic-stickyfunc-header-line-format)
+	(semantic-stickyfunc-sticky-classes, semantic-highlight-func-mode-setup)
+	(semantic-stickyfunc-fetch-stickyline): Fix typos in docstrings.
+	(semantic-stickyfunc-popup-menu, semantic-highlight-func-popup-menu):
+	Fix typos in menu help.
+
+	* semantic.el (semantic-require-version, semantic--buffer-cache)
+	(semantic-unmatched-syntax-cache-check, semantic-unmatched-syntax-hook)
+	(semantic--before-fetch-tags-hook, semantic-new-buffer-fcn-was-run)
+	(semantic--umatched-syntax-needs-refresh-p, semantic-elapsed-time)
+	(semantic-parse-stream, semantic-parse-region)
+	(semantic-parse-region-default, semantic--set-buffer-cache)
+	(semantic-minimum-working-buffer-size, semantic-refresh-tags-safe)
+	(semantic-bovinate-toplevel, semantic-load-system-cache-loaded)
+	(semantic-default-submodes):
+	* semantic/db-ebrowse.el (semanticdb-table-ebrowse)
+	(semanticdb-create-ebrowse-database)
+	(semanticdb-find-tags-for-completion-method)
+	(semanticdb-find-tags-by-class-method)
+	(semanticdb-deep-find-tags-by-name-method)
+	(semanticdb-deep-find-tags-for-completion-method):
+	* semantic/db-el.el (semanticdb-elisp-mapatom-collector)
+	(semanticdb-find-tags-by-name-method, emacs-lisp-mode)
+	(semanticdb-find-tags-for-completion-method)
+	(semanticdb-find-tags-by-class-method)
+	(semanticdb-deep-find-tags-for-completion-method):
+	* semantic/db-find.el (semanticdb-find-translate-path)
+	(semanticdb-find-need-cache-update-p, semanticdb-find-result-with-nil-p)
+	(semanticdb-find-scanned-include-tags, semanticdb-find-tags-collector)
+	(semanticdb-find-tags-by-name-method)
+	(semanticdb-find-tags-by-name-regexp-method)
+	(semanticdb-find-tags-for-completion-method)
+	(semanticdb-find-tags-by-class-method)
+	(semanticdb-find-tags-external-children-of-type-method)
+	(semanticdb-find-tags-subclasses-of-type-method)
+	(semanticdb-deep-find-tags-by-name-method)
+	(semanticdb-deep-find-tags-by-name-regexp-method)
+	(semanticdb-deep-find-tags-for-completion-method):
+	* semantic/db-global.el (semanticdb-enable-gnu-global-hook)
+	(semanticdb-enable-gnu-global-in-buffer)
+	(semanticdb-find-tags-for-completion-method)
+	(semanticdb-deep-find-tags-by-name-method)
+	(semanticdb-deep-find-tags-for-completion-method):
+	* semantic/db-javascript.el (semanticdb-javascript-tags)
+	(javascript-mode, semanticdb-find-translate-path)
+	(semanticdb-find-tags-for-completion-method)
+	(semanticdb-find-tags-by-class-method)
+	(semanticdb-deep-find-tags-by-name-method)
+	(semanticdb-deep-find-tags-for-completion-method)
+	(semanticdb-find-tags-external-children-of-type-method):
+	* semantic/idle.el (semantic-idle-work-core-handler)
+	(define-semantic-idle-service, semantic-idle-summary-useful-context-p)
+	(global-semantic-idle-scheduler-mode):
+	* srecode/dictionary.el (srecode-field-value)
+	(srecode-dictionary-add-section-dictionary):
+	Fix typos in docstrings.
+
+2010-01-17  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/idle.el (semantic-idle-work-for-one-buffer): Doc fix.
+
+2010-01-17  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic.el (semantic-mode): Fix typos in docstrings.
+
+2010-01-16  Mario Lang  <mlang@delysid.org>
+
+	* ede/cpp-root.el (ede-cpp-root-project):
+	* ede/files.el (ede-expand-filename):
+	* ede/simple.el (ede-simple-project):
+	* semantic/complete.el (semantic-complete-read-tag-engine)
+	(semantic-complete-inline-tag-engine):
+	* semantic/db-el.el (semanticdb-equivalent-mode):
+	* semantic/db-global.el (semanticdb-equivalent-mode):
+	* semantic/db-javascript.el (semanticdb-equivalent-mode):
+	* semantic/db.el (semanticdb-equivalent-mode):
+	* semantic/decorate/include.el (semantic-decoration-unknown-include-describe):
+	* semantic/idle.el (semantic-idle-work-for-one-buffer):
+	Remove duplicated words in doc-strings.
+
+2010-01-14  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic/edit.el (semantic-reparse-needed-change-hook)
+	(semantic-no-reparse-needed-change-hook):
+	* srecode/insert.el (srecode-resolve-argument-list)
+	(srecode-template-inserter-blank, srecode-template-inserter-variable)
+	(srecode-template-inserter-ask, srecode-template-inserter-width)
+	(srecode-template-inserter-section-start)
+	(srecode-template-inserter-section-end, srecode-insert-method):
+
+2010-01-12  Juanma Barranquero  <lekktu@gmail.com>
+
+	* data-debug.el (data-debug): Fix customization group reference.
+
+2010-01-12  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic/analyze.el (semantic-analyze-push-error)
+	(semantic-analyze-context, semantic-analyze-context-assignment)
+	(semantic-analyze-find-tag-sequence, semantic-analyze-find-tag):
+	* semantic/java.el (java-mode, semantic-tag-include-filename)
+	(semantic-java-doc-keywords-map):
+	* semantic/bovine/c.el (c-mode, semantic-c-member-of-autocast)
+	(semantic-lex-c-nested-namespace-ignore-second, semantic-parse-region)
+	(semantic-c-parse-lexical-token, semantic-c-debug-mode-init-pch)
+	(semantic-c-classname, semantic-format-tag-uml-prototype)
+	(semantic-c-dereference-namespace, semantic-analyze-type-constants):
+	* semantic/bovine/el.el (semantic-elisp-form-to-doc-string)
+	(semantic-emacs-lisp-obsoleted-doc, semantic-up-context)
+	(semantic-get-local-variables, semantic-end-of-command)
+	(semantic-beginning-of-command, semantic-ctxt-current-class-list)
+	(lisp-mode):
+	* semantic/bovine/make.el (makefile-mode):
+	* semantic/wisent/python.el (wisent-python-string-re)
+	(wisent-python-implicit-line-joining-p, wisent-python-forward-string)
+	(wisent-python-lex-beginning-of-line, wisent-python-lex-end-of-line)
+	(semantic-lex, semantic-get-local-variables, python-mode):
+	* semantic/wisent/python-wy.el (wisent-python-wy--keyword-table):
+	* srecode/extract.el (srecode-extract-state-set)
+	(srecode-extract-method): Fix typos in docstrings.
+
+2010-01-10  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic.el (semantic-new-buffer-setup-functions):
+	Add python parser.
+
+2010-01-10  Richard Kim  <emacs18@gmail.com>
+
+	* semantic/wisent/python-wy.el:
+	* semantic/wisent/python.el: New files.
+
+2010-01-02  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic/db-typecache.el (semanticdb-typecache-find-default):
+	Fix typo in docstring.
+
+2009-12-14  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/mru-bookmark.el (global-semantic-mru-bookmark-mode)
+	(semantic-mru-bookmark-mode): Doc fixes.
+
+	* semantic/db.el (semanticdb-cache-get): Use error instead
+	of assert.
+
+2009-12-05  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/ia.el (semantic-ia-complete-symbol):
+	Make argument optional.
+
+2009-12-05  Eric Ludlam  <zappo@gnu.org>
+
+	* semantic/bovine/c.el (semantic-c-describe-environment):
+	Describe project macro symbols.
+
+	* semantic/complete.el (semantic-complete-do-completion):
+	Don't call semantic-collector-current-exact-match.
+
+	* ede.el (ede-apply-preprocessor-map): Accept lists of
+	ede-objects as targets.
+
+	* ede/pmake.el (ede-proj-makefile-insert-variables): Output
+	a target's object list even if compiler vars are already in the
+	Makefile.
+
+	* ede/emacs.el (ede-preprocessor-map): Add config.h to the
+	list of headers producing necessary macros.
+
+2009-11-24  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/idle.el (global-semantic-idle-scheduler-mode):
+	Move after definition of global-semantic-idle-tag-highlight-mode.
+
+2009-11-22  Chong Yidong  <cyd@stupidchicken.com>
+
+	* srecode/map.el (srecode-get-maps):
+	* semantic/wisent/wisent.el (wisent-parse-toggle-verbose-flag):
+	* semantic/wisent/comp.el (wisent-toggle-verbose-flag):
+	* semantic/decorate/mode.el (semantic-decoration-mode)
+	(semantic-toggle-decoration-style):
+	* semantic/decorate/include.el
+	(semantic-decoration-include-describe)
+	(semantic-decoration-unknown-include-describe)
+	(semantic-decoration-unparsed-include-describe)
+	(semantic-decoration-all-include-summary):
+	* semantic/bovine/c.el (semantic-c-debug-mode-init):
+	* semantic/analyze/complete.el
+	(semantic-analyze-possible-completions):
+	* semantic/util-modes.el (semantic-highlight-edits-mode)
+	(semantic-show-unmatched-syntax-mode)
+	(semantic-show-parser-state-mode, semantic-stickyfunc-mode)
+	(semantic-highlight-func-mode):
+	* semantic/util.el (semantic-describe-buffer):
+	* semantic/symref.el (semantic-symref-find-references-by-name)
+	(semantic-symref-find-tags-by-name)
+	(semantic-symref-find-tags-by-regexp)
+	(semantic-symref-find-tags-by-completion)
+	(semantic-symref-find-file-references-by-name)
+	(semantic-symref-find-text):
+	* semantic/senator.el (senator-copy-tag, senator-kill-tag)
+	(senator-yank-tag):
+	* semantic/scope.el (semantic-calculate-scope):
+	* semantic/mru-bookmark.el (semantic-mru-bookmark-mode):
+	* semantic/idle.el (semantic-idle-scheduler-mode)
+	(define-semantic-idle-service):
+	* semantic/complete.el (semantic-complete-analyze-inline)
+	(semantic-complete-analyze-inline-idle):
+	* semantic/analyze.el (semantic-analyze-current-context):
+	* mode-local.el (describe-mode-local-bindings)
+	(describe-mode-local-bindings-in-mode):
+	* ede/make.el (ede-make-check-version):
+	* ede/locate.el (ede-enable-locate-on-project):
+	* cedet-idutils.el (cedet-idutils-expand-filename)
+	(cedet-idutils-version-check):
+	* cedet-global.el (cedet-gnu-global-expand-filename)
+	(cedet-gnu-global-version-check):
+	* cedet-cscope.el (cedet-cscope-expand-filename)
+	(cedet-cscope-version-check): Use called-interactively-p instead
+	of interactive-p.
+
+	* semantic/ia.el (semantic-ia-completion-format-tag-function):
+	Use semantic-format-tag-prototype.
+
+2009-11-21  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/complete.el (semantic-complete-read-tag-engine)
+	(semantic-complete-jump-local, semantic-complete-jump):
+	Improve prompt string.
+
+2009-11-20  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/complete.el (semantic-complete-inline-map): Doc fix.
+
+	* semantic/idle.el (define-semantic-idle-service)
+	(semantic-idle-summary-mode, semantic-idle-completions): Doc fix.
+
+2009-11-20  Chong Yidong  <cyd@stupidchicken.com>
+
+	* cedet.el (cedet-menu-map): Re-order menu items.
+
+	* semantic.el: Enable idle-mode menu items only if
+	global-semantic-idle-scheduler-mode is enabled.
+	(semantic-default-submodes): Doc fix.
+
+	* semantic/idle.el (global-semantic-idle-scheduler-mode):
+	When turning off, disable other idle modes.
+
+2009-11-15  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/idle.el (semantic-idle-summary-mode)
+	(semantic-idle-summary-mode): Define using define-minor-mode
+	instead of define-semantic-idle-service.
+	(semantic-idle-summary-mode): New function.
+	(semantic-idle-summary-mode-setup): Use pre-command-hook to ensure
+	that mouse motion does not reset the echo area.
+
+2009-11-08  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/ctxt.el (semantic-get-local-variables): Disable
+	the progress reporter entirely.
+
+2009-11-03  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* semantic/fw.el (semantic/loaddefs):
+	* srecode.el (srecode/loaddefs):
+	* ede.el (ede/loaddefs): Load rather than require.
+	* ede/cpp-root.el:
+	* ede/emacs.el:
+	* ede/files.el:
+	* ede/linux.el:
+	* ede/locate.el:
+	* ede/make.el:
+	* ede/shell.el:
+	* ede/speedbar.el:
+	* ede/system.el:
+	* ede/util.el:
+	* semantic/analyze.el:
+	* semantic/bovine.el:
+	* semantic/complete.el:
+	* semantic/ctxt.el:
+	* semantic/db-file.el:
+	* semantic/db-find.el:
+	* semantic/db-global.el:
+	* semantic/db-mode.el:
+	* semantic/db-typecache.el:
+	* semantic/db.el:
+	* semantic/debug.el:
+	* semantic/dep.el:
+	* semantic/doc.el:
+	* semantic/edit.el:
+	* semantic/find.el:
+	* semantic/format.el:
+	* semantic/html.el:
+	* semantic/ia-sb.el:
+	* semantic/ia.el:
+	* semantic/idle.el:
+	* semantic/lex-spp.el:
+	* semantic/lex.el:
+	* semantic/mru-bookmark.el:
+	* semantic/scope.el:
+	* semantic/senator.el:
+	* semantic/sort.el:
+	* semantic/symref.el:
+	* semantic/tag-file.el:
+	* semantic/tag-ls.el:
+	* semantic/tag-write.el:
+	* semantic/tag.el:
+	* semantic/util-modes.el:
+	* semantic/analyze/complete.el:
+	* semantic/analyze/refs.el:
+	* semantic/bovine/c.el:
+	* semantic/bovine/gcc.el:
+	* semantic/bovine/make.el:
+	* semantic/bovine/scm.el:
+	* semantic/decorate/include.el:
+	* semantic/decorate/mode.el:
+	* semantic/symref/cscope.el:
+	* semantic/symref/global.el:
+	* semantic/symref/grep.el:
+	* semantic/symref/idutils.el:
+	* semantic/symref/list.el:
+	* semantic/wisent/java-tags.el:
+	* semantic/wisent/javascript.el:
+	* srecode/compile.el:
+	* srecode/cpp.el:
+	* srecode/document.el:
+	* srecode/el.el:
+	* srecode/expandproto.el:
+	* srecode/getset.el:
+	* srecode/insert.el:
+	* srecode/java.el:
+	* srecode/map.el:
+	* srecode/mode.el:
+	* srecode/template.el:
+	* srecode/texi.el: Remove the file-local setting of
+	generated-autoload-feature.
+
+2009-11-03  Glenn Morris  <rgm@gnu.org>
+
+	* mode-local.el (with-mode-local): Doc fix.
+
+2009-10-31  Chong Yidong  <cyd@stupidchicken.com>
+
+	* cedet.el (cedet-menu-map): Remove Semantic and EDE menu
+	items.
+
+	* ede.el (ede-minor-mode):
+	* semantic.el (semantic-mode): Toggle menu separators.
+
+2009-10-31  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/tag.el (semantic--tag-link-list-to-buffer):
+	Use mapc rather than mapcar because the return value is never used.
+
+	* srecode/template.el, semantic/wisent/javascript.el:
+	* semantic/wisent/java-tags.el, semantic/texi.el:
+	* semantic/html.el:
+	Suppress harmless warnings about setting up semantic-imenu (not
+	part of Emacs) variables.
+
+2009-10-30  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* srecode/srt-mode.el (semantic-analyze-possible-completions):
+	* semantic/symref/list.el (semantic-symref-rb-toggle-expand-tag):
+	* semantic/symref/grep.el (semantic-symref-perform-search):
+	* semantic/bovine/gcc.el (semantic-gcc-query):
+	* semantic/bovine/c.el (semantic-c-parse-lexical-token):
+	* semantic/analyze/debug.el (semantic-analyzer-debug-add-buttons)
+	(semantic-analyzer-debug-global-symbol)
+	(semantic-analyzer-debug-missing-innertype)
+	(semantic-analyzer-debug-insert-include-summary):
+	* semantic/util.el (semantic-file-tag-table):
+	(semantic-describe-buffer-var-helper, semantic-something-to-tag-table)
+	(semantic-recursive-find-nonterminal-by-name):
+	* semantic/tag-ls.el (semantic-tag-calculate-parent-default):
+	* semantic/tag-file.el (semantic-prototype-file):
+	* semantic/symref.el (semantic-symref-parse-tool-output):
+	* semantic/sb.el (semantic-sb-fetch-tag-table):
+	* semantic/lex-spp.el (semantic-lex-spp-lex-text-string):
+	* semantic/idle.el (semantic-idle-work-for-one-buffer):
+	(semantic-idle-summary-maybe-highlight):
+	* semantic/ia-sb.el (semantic-ia-speedbar)
+	(semantic-ia-sb-tag-info):
+	* semantic/grammar.el (semantic-analyze-possible-completions):
+	* semantic/find.el (semantic-brute-find-tag-by-position):
+	* semantic/ede-grammar.el (project-compile-target):
+	(ede-proj-makefile-insert-variables):
+	* semantic/debug.el (semantic-debug-set-parser-location):
+	(semantic-debug-set-source-location, semantic-debug-interface-layout)
+	(semantic-debug-mode, semantic-debug):
+	* semantic/db.el (semanticdb-needs-refresh-p):
+	* semantic/db-typecache.el (semanticdb-typecache-refresh-for-buffer):
+	* semantic/db-javascript.el (semanticdb-equivalent-mode):
+	* semantic/db-find.el (semanticdb-find-log-new-search)
+	(semanticdb-find-translate-path-includes--internal)
+	(semanticdb-reset-log, semanticdb-find-log-activity):
+	* semantic/db-file.el (object-write):
+	* semantic/db-el.el (semanticdb-equivalent-mode):
+	* semantic/db-ebrowse.el (semanticdb-ebrowse-C-file-p)
+	(semanticdb-create-ebrowse-database):
+	* semantic/db-debug.el (semanticdb-table-sanity-check):
+	* semantic/complete.el (semantic-displayor-focus-request)
+	(semantic-collector-calculate-completions-raw)
+	(semantic-complete-read-tag-analyzer):
+	* semantic/analyze.el (semantic-analyze-pulse):
+	* ede/util.el (ede-update-version-in-source):
+	* ede/proj.el (project-delete-target):
+	* ede/proj-elisp.el (ede-update-version-in-source)
+	(ede-proj-flush-autoconf):
+	* ede/pconf.el (ede-proj-configure-synchronize)
+	(ede-proj-configure-synchronize):
+	* ede/locate.el (ede-locate-file-in-project-impl):
+	* ede/linux.el (ede-linux-version):
+	* ede/emacs.el (ede-emacs-version):
+	* ede/dired.el (ede-dired-add-to-target):
+	* ede.el (ede-buffer-header-file, ede-find-target)
+	(ede-buffer-documentation-files, ede-project-buffers, ede-set)
+	(ede-target-buffers, ede-buffers, ede-make-project-local-variable):
+	* cedet-idutils.el (cedet-idutils-fnid-call):
+	(cedet-idutils-lid-call, cedet-idutils-expand-filename)
+	(cedet-idutils-version-check):
+	* cedet-global.el (cedet-gnu-global-call):
+	(cedet-gnu-global-expand-filename, cedet-gnu-global-root)
+	(cedet-gnu-global-version-check, cedet-gnu-global-scan-hits):
+	* cedet-cscope.el (cedet-cscope-call)
+	(cedet-cscope-expand-filename, cedet-cscope-version-check):
+	Use with-current-buffer.
+	* ede.el (ede-make-project-local-variable)
+	(ede-set-project-variables, ede-set): Use dolist.
+
+2009-10-28  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* mode-local.el (make-obsolete-overload): Add `when' argument.
+	(overload-docstring-extension): Use that info.
+	* semantic/fw.el (semantic-alias-obsolete): Pass the `when' info.
+	* semantic/idle.el (semantic-eldoc-current-symbol-info):
+	* semantic/tag-ls.el (semantic-nonterminal-protection)
+	(semantic-nonterminal-abstract, semantic-nonterminal-leaf)
+	(semantic-nonterminal-full-name): Add the new `when' info.
+	* semantic/decorate/mode.el (semantic/decorate): Require CL for
+	`assert'.
+
+2009-10-25  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* semantic/fw.el (semantic-alias-obsolete)
+	(semantic-varalias-obsolete): Make the `when' arg mandatory.
+	(define-mode-overload-implementation):
+	* semantic/decorate/mode.el (semantic-decorate-pending-decoration-hooks):
+	* semantic/wisent.el (wisent-lex-make-token-table):
+	* semantic/util.el (semantic-file-token-stream)
+	(semantic-something-to-stream):
+	* semantic/tag.el (semantic-tag-make-assoc-list)
+	(semantic-expand-nonterminal):
+	* semantic/tag-file.el (semantic-find-nonterminal)
+	(semantic-find-dependency, semantic-find-nonterminal)
+	(semantic-find-dependency):
+	* semantic/lex.el (semantic-flex-start, semantic-flex-end)
+	(semantic-flex-text, semantic-flex-make-keyword-table)
+	(semantic-flex-keyword-p, semantic-flex-keyword-put)
+	(semantic-flex-keyword-get, semantic-flex-map-keywords)
+	(semantic-flex-keywords, semantic-flex-buffer, semantic-flex-list):
+	* semantic/java.el (semantic-java-prototype-nonterminal):
+	* semantic/idle.el (semantic-before-idle-scheduler-reparse-hooks)
+	(semantic-after-idle-scheduler-reparse-hooks):
+	* semantic/edit.el (semantic-edits-incremental-reparse-failed-hooks):
+	* semantic/db-mode.el (semanticdb-mode-hooks):
+	* semantic.el (semantic-toplevel-bovine-table)
+	(semantic-toplevel-bovine-cache)
+	(semantic-before-toplevel-bovination-hook, semantic-init-hooks)
+	(semantic-init-mode-hooks, semantic-init-db-hooks)
+	(semantic-bovination-working-type): Provide the `when' arg.
+
+2009-10-24  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic/util.el (semantic-recursive-find-nonterminal-by-name):
+	* semantic/tag.el (semantic-token-type-parent): Add WHEN
+	argument to make-obsolete.
+
+	* semantic/fw.el (semantic-alias-obsolete)
+	(semantic-varalias-obsolete): Add optional WHEN argument.
+
+2009-10-21  Eric Ludlam  <zappo@gnu.org>
+
+	* semantic/bovine/c.el (semantic-c-debug-mode-init)
+	(semantic-c-debug-mode-init-pch): New functions.
+	(semantic-c-debug-mode-init-last-mode): New var.
+	(semantic-c-parse-lexical-token): Use them.
+
+	* semantic/lex-spp.el (semantic-lex-spp-anlyzer-do-replace):
+	When extracting the argument list, limit only by point-max.
+
+2009-10-17  Chong Yidong  <cyd@stupidchicken.com>
+
+	* srecode/srt.el:
+	* srecode/compile.el:
+	* semantic/mru-bookmark.el:
+	* semantic/debug.el:
+	* semantic/complete.el:
+	* semantic/analyze.el: Require CL when compiling.
+
+2009-10-17  Eric Ludlam  <zappo@gnu.org>
+
+	* semantic/scope.el
+	(semantic-analyze-scoped-inherited-tag-map): Wrap calculation of
+	tmpscope so that the regular scope will continue to work.
+
+	* semantic/idle.el (semantic-idle-tag-highlight):
+	Use semantic-idle-summary-highlight-face as the highlighting.
+
+	* emacs-lisp/eieio-base.el (eieio-persistent-save): If buffer
+	contains multibyte characters, choose first applicable coding
+	system automatically.
+
+	* ede/project-am.el (project-run-target): New method.
+	(project-run-target): New method.
+
+	* ede.el (ede-target): Add run target menu item.
+	(ede-project, ede-minor-keymap): Add ede-run-target binding.
+	(ede-run-target): New function.
+	(ede-target::project-run-target): New method.
+
+	* ede/proj.el (project-run-target): New method.
+
+	* ede/proj-shared.el (ede-gcc-libtool-shared-compiler)
+	(ede-g++-libtool-shared-compiler): Remove SHELL.  Remove COMMANDS.
+	Add :rules.
+	(ede-proj-target-makefile-shared-object): Only libtool compilers
+	now available.  Add linkers for libtool.
+	(ede-cc-linker-libtool, ede-g++-linker-libtool): New.
+	(ede-proj-makefile-target-name): Always use .la extension.
+
+	* ede/proj-prog.el (project-run-target): New method.
+
+	* ede/proj-obj.el (ede-cc-linker): Rename from ede-gcc-linker.
+	(ede-g++-linker): Change Change link lines.
+
+	* ede/pmake.el (ede-pmake-insert-variable-shared):
+	When searching for old variables, go to the end of the buffer and
+	search backward from there.
+	(ede-proj-makefile-automake-insert-subdirs)
+	(ede-proj-makefile-automake-insert-extradist): New methods.
+	(ede-proj-makefile-create): Use them.
+
+	* ede/pconf.el (ede-proj-configure-test-required-file):
+	Force FILE to expand to the current target.  Use file-exists-p to
+	check that it exists.
+
+	* ede/linux.el (ede-linux-version): Don't call "head".
+	(ede-linux-load): Wrap dir in file-name-as-directory.
+	Set :version slot.
+
+	* ede/files.el (ede-get-locator-object): When enabling
+	locate, do so on "top".
+
+	* ede/emacs.el (ede-emacs-file-existing): Wrap "dir" in
+	file-name-as-directory during compare.
+	(ede-emacs-version): Return Emacs/XEmacs differentiator.
+	Get version number from different places.  Don't call egrep.
+	(ede-emacs-load): Set :version slot.  Call file-name-as-directory
+	to set the directory.
+
+	* ede/shell.el: New file.
+
+	* inversion.el (inversion-decoders): Allow for stray . in
+	alpha/beta variants.
+
+2009-10-17  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/grammar.el (semantic-grammar--lex-delim-spec):
+	All errors should have messages.
+
+2009-10-10  Sascha Wilde  <wilde@sha-bang.de>
+
+	* ede/proj-shared.el (ede-proj-makefile-target-name):
+	Use .la for Automake.
+
+2009-10-09  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede/pconf.el (ede-proj-configure-synchronize):
+	Use "autoreconf -i".  Suggested by Andreas Schwab.
+
+2009-10-08  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede/proj.el (project-make-dist, project-compile-project):
+	Fix filename test.
+	(ede-proj-dist-makefile): Use expand-file-name instead of concat
+	to expand file names.
+
+2009-10-08  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede/proj-obj.el (ede-gcc-linker): New var.
+	(ede-proj-target-makefile-objectcode): Use it.
+
+	* ede/source.el (ede-want-any-source-files-p)
+	(ede-want-any-auxiliary-files-p, ede-want-any-files-p):
+	Return search result.  This error was introduced while merging.
+
+2009-10-04  Chong Yidong  <cyd@stupidchicken.com>
+
+	* semantic.el (semantic-new-buffer-setup-functions): New option.
+	(semantic-new-buffer-fcn): Call parser setup functions here.
+	(semantic-mode): Don't call parser setup functions here, it's done
+	in semantic-new-buffer-fcn now.
+	(semantic-mode): Parse all existing buffers when enabled.
+
+	* srecode/compile.el (srecode-compile-file):
+	Call semantic-new-buffer-fcn if the buffer has not been parsed.
+
+2009-10-04  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede/pmake.el (ede-pmake-insert-variable-once): Delete.
+
+	* ede/proj-comp.el: Don't require ede/pmake at toplevel.
+	(proj-comp-insert-variable-once): New macro, renamed from
+	ede-pmake-insert-variable-once in ede/pmake.edl.
+	(ede-proj-makefile-insert-variables): Use it.
+
+2009-10-04  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ede/makefile-edit.el (makefile-beginning-of-command)
+	(makefile-end-of-command):
+	* srecode/srt-mode.el (semantic-beginning-of-context)
+	(semantic-end-of-context): Fix previous change.  Doc fixes.
+
+2009-10-04  Juanma Barranquero  <lekktu@gmail.com>
+
+	* ede/makefile-edit.el (makefile-beginning-of-command)
+	(makefile-end-of-command):
+	* semantic/lex.el (semantic-lex-token):
+	* semantic/analyze/fcn.el
+	(semantic-analyze-dereference-metatype-1):
+	* semantic/bovine/c.el (semantic-lex-cpp-define)
+	(semantic-lex-cpp-undef):
+	* semantic/wisent/wisent.el (wisent-skip-block):
+	* srecode/srt-mode.el (semantic-beginning-of-context)
+	(semantic-end-of-context): Fix typos in docstrings.
+
+2009-10-04  Chong Yidong  <cyd@stupidchicken.com>
+
+	* ede.el (ede-project-placeholder-cache-file):
+	* semantic/db-file.el (semanticdb-default-save-directory):
+	* srecode/map.el (srecode-map-save-file):
+	Use locate-user-emacs-file.  Suggested by Juanma Barranquero.
+
+2009-10-03  Chong Yidong  <cyd@stupidchicken.com>
+
+	* srecode/insert.el: Require srecode/args.
+
+	* srecode/args.el: Require srecode/dictionary instead of
+	srecode/insert.
+
+	* srecode/srt-mode.el (srecode-template-mode): Doc fix.
+
+	* files.el (auto-mode-alist): Add .srt and Project.ede.
+
+	* semantic.el (semantic-mode):
+	Handle srecode-template-mode-hook as well.
+	(semantic-mode): Use js-mode-hook for Javascript hook.
+
+	* srecode/template.el: Remove hook variable.
+
+	* ede/proj-comp.el: Require ede/pmake when compiling.
+
+	* ede.el (ede-target-forms-menu): Don't enable if no
+	projects exist.
+	(ede-project-placeholder-cache-file): Default to a file in
+	user-emacs-directory.
+
+	* srecode/map.el (srecode-map-base-template-dir): Look for
+	templates in data-directory.
+	(srecode-map-save-file): Default to a file in user-emacs-directory.
+
+	* ede/srecode.el (ede-srecode-setup): Use default templates
+	directory.
+
+2009-09-30  Eric Ludlam  <zappo@gnu.org>
+
+	* semantic/util-modes.el (semantic-highlight-func-mode):
+	Doc fix.
+
+	* ede/proj-comp.el (ede-proj-makefile-insert-variables):
+	Only insert each variable once.
+
+	* ede/pmake.el (ede-pmake-insert-variable-once): New macro.
+	(ede-pmake-insert-variable-shared): Use it.
+
+	* ede/cpp-root.el (ede-preprocessor-map): Do not deref table
+	for lexical table iff table is nil.
+
+2009-10-01  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/bovine/gcc.el
+	(semantic-c-reset-preprocessor-symbol-map): Fix declaration.
+	(semantic-gcc-get-include-paths, semantic-gcc-setup-data): Doc fixes.
+
+2009-10-03  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/db-find.el (data-debug-insert-tag-list): Comment out
+	declaration, currently false.
+
+2009-10-01  Glenn Morris  <rgm@gnu.org>
+
+	* cedet-files.el (cedet-directory-name-to-file-name):
+	* cedet-idutils.el (cedet-idutils-search)
+	(cedet-idutils-expand-filename, cedet-idutils-support-for-directory)
+	(cedet-idutils-version-check):
+	* cedet.el (cedet-version):
+	* data-debug.el (data-debug-insert-overlay-button)
+	(data-debug-insert-overlay-list-button)
+	(data-debug-insert-buffer-button)
+	(data-debug-insert-buffer-list-button)
+	(data-debug-insert-process-button, data-debug-insert-ring-button)
+	(data-debug-insert-widget, data-debug-insert-stuff-list-button)
+	(data-debug-insert-stuff-vector-button)
+	(data-debug-insert-symbol-button, data-debug-insert-string)
+	(data-debug-insert-number, data-debug-insert-lambda-expression)
+	(data-debug-insert-nil, data-debug-insert-simple-thing)
+	(data-debug-insert-custom, data-debug-edebug-expr):
+	* ede.el (ede-auto-add-method, ede-project-class-files)
+	(global-ede-mode-map, ede-new, ede-debug-target)
+	(ede-customize-current-target, ede-buffers, ede-map-buffers, ede-set):
+	* semantic.el (semantic-minimum-working-buffer-size)
+	(semantic-fetch-tags, semantic-submode-list)
+	(semantic-default-submodes):
+	* ede/source.el (ede-source-match):
+	* ede/project-am.el (project-am-type-alist, project-add-file)
+	(project-am-package-info):
+	* ede/proj.el (ede-proj-target, project-new-target):
+	* ede/proj-elisp.el (ede-proj-tweak-autoconf):
+	* ede/proj-comp.el (ede-current-build-list):
+	* ede/makefile-edit.el (makefile-move-to-macro):
+	* ede/files.el (ede-toplevel-project-or-nil):
+	* ede/cpp-root.el (initialize-instance):
+	* ede/autoconf-edit.el (autoconf-find-last-macro)
+	(autoconf-parameter-strip, autoconf-insert-new-macro):
+	* semantic/wisent.el (wisent-lex-eoi):
+	* semantic/util-modes.el (global-semantic-show-parser-state-mode)
+	(semantic-show-parser-state-mode):
+	* semantic/texi.el (semantic-texi-environment-regexp):
+	* semantic/tag.el (semantic-tag-new-variable)
+	(semantic-tag-class, semantic-tag-new-variable, semantic-tag-copy)
+	(semantic--tag-deep-copy-attributes, semantic--tag-deep-copy-value)
+	(semantic--tag-deep-copy-tag-list)
+	(semantic-tag-components-with-overlays-default):
+	* semantic/symref.el (semantic-symref-find-text):
+	* semantic/senator.el (senator-yank-tag)
+	(senator-transpose-tags-up):
+	* semantic/scope.el (semantic-analyze-scoped-tags-default)
+	(semantic-analyze-scoped-inherited-tags, semantic-scope-find):
+	* semantic/sb.el (semantic-sb-autoexpand-length):
+	* semantic/lex.el (semantic-lex-comment-regex)
+	(semantic-lex-maximum-depth, define-lex, semantic-lex-token)
+	(semantic-lex-unterminated-syntax-protection, define-lex-analyzer):
+	* semantic/lex-spp.el
+	(semantic-lex-spp-dynamic-macro-symbol-obarray-stack)
+	(semantic-lex-spp-symbol, semantic-lex-spp-one-token-to-txt):
+	* semantic/idle.el
+	(semantic-idle-summary-current-symbol-info-brutish)
+	(semantic-idle-summary-current-symbol-info-default):
+	* semantic/grammar.el (semantic-grammar-recreate-package)
+	(semantic--grammar-macro-compl-dict):
+	* semantic/grammar-wy.el (semantic-grammar-wy--parse-table):
+	* semantic/format.el (semantic-format-tag-custom-list)
+	(semantic-format-tag-canonical-name-default):
+	* semantic/find.el (semantic-find-tag-by-overlay-in-region)
+	(semantic-find-tags-for-completion)
+	(semantic-find-tags-by-scope-protection-default)
+	(semantic-deep-find-tags-for-completion):
+	* semantic/edit.el
+	(semantic-edits-incremental-reparse-failed-hook)
+	(semantic-edits-verbose-flag, semantic-edits-assert-valid-region)
+	(semantic-edits-splice-remove, semantic-edits-splice-replace):
+	* semantic/doc.el (semantic-documentation-comment-preceeding-tag):
+	* semantic/dep.el (semantic-dependency-include-path):
+	* semantic/db.el (semanticdb-default-find-index-class)
+	(semanticdb-match-any-mode, semanticdb-with-match-any-mode)
+	(semanticdb-project-roots):
+	* semantic/db-find.el (semanticdb-implied-include-tags)
+	(semanticdb-find-adebug-insert-scanned-tag-cons)
+	(semanticdb-find-log-buffer-name, semanticdb-find-result-mapc)
+	(semanticdb-brute-deep-find-tags-for-completion):
+	* semantic/db-ebrowse.el (semanticdb-ebrowse-add-tree-to-table):
+	* semantic/ctxt.el (semantic-beginning-of-context-default)
+	(semantic-end-of-context-default)
+	(semantic-ctxt-current-function-default)
+	(semantic-ctxt-scoped-types-default):
+	* semantic/complete.el (semantic-complete-read-tag-engine)
+	(semantic-complete-inline-tag-engine)
+	(semantic-complete-inline-custom-type)
+	(semantic-complete-read-tag-analyzer):
+	* semantic/chart.el (semantic-chart-tags-by-class)
+	(semantic-chart-database-size):
+	* semantic/analyze.el (semantic-analyze-current-symbol)
+	(semantic-analyze-current-context):
+	* semantic/symref/list.el (semantic-symref)
+	(semantic-symref-hide-buffer, semantic-symref-symbol):
+	* semantic/symref/grep.el (semantic-symref-grep-use-template):
+	* semantic/symref/filter.el (semantic-symref-hits-in-region):
+	* semantic/bovine/el.el (semantic-elisp-form-to-doc-string):
+	* semantic/bovine/c.el (semantic-lex-c-preprocessor-symbol-map)
+	(semantic-c-parse-token-hack-depth, semantic-c--template-name-1)
+	(semantic-c-dereference-template):
+	* semantic/analyze/refs.el (semantic--analyze-refs-full-lookup)
+	(semantic--analyze-refs-full-lookup-with-parents)
+	(semantic--analyze-refs-full-lookup-simple):
+	* semantic/analyze/complete.el
+	(semantic-analyze-possible-completions):
+	* srecode/table.el (srecode-mode-table-new):
+	* srecode/srt.el (srecode-read-variable-name):
+	* srecode/srt-mode.el (srecode-macro-help, srecode-in-macro-p):
+	* srecode/semantic.el (srecode-semantic-handle-:tag)
+	(srecode-semantic-handle-:tagtype, srecode-semantic-insert-tag):
+	* srecode/map.el (srecode-current-map):
+	* srecode/insert.el (srecode-insert)
+	(srecode-insert-variable-secondname-handler, srecode-insert-method)
+	(srecode-template-inserter-point-override)
+	(srecode-insert-include-lookup):
+	* srecode/getset.el (srecode-auto-choose-class):
+	* srecode/extract.el (srecode-inserter-extract):
+	* srecode/document.el
+	(srecode-document-autocomment-return-last-alist)
+	(srecode-document-autocomment-param-type-alist)
+	(srecode-document-insert-function-comment)
+	(srecode-document-insert-variable-one-line-comment)
+	(srecode-document-function-name-comment):
+	* srecode/dictionary.el (srecode-create-dictionary)
+	(srecode-compound-toString):
+	* srecode/compile.el (srecode-flush-active-templates):
+	* srecode/args.el (srecode-semantic-handle-:blank):
+	Doc/message fixes.
+
+2009-10-01  Juanma Barranquero  <lekktu@gmail.com>
+
+	* semantic/wisent/javat-wy.el
+	(wisent-java-tags-wy--keyword-table): Use \000 instead of literal ^@.
+
+2009-09-30  Juanma Barranquero  <lekktu@gmail.com>
+
+	* srecode/expandproto.el: Fix provide statement.
+
+2009-09-30  Eric Ludlam  <zappo@gnu.org>
+
+	* emacs-lisp/eieio.el (boolean-p): Delete.
+
+2009-09-30  Sascha Wilde  <wilde@sha-bang.de>
+
+	* ede/srecode.el: Fix provide statement.
+
+2009-09-30  Glenn Morris  <rgm@gnu.org>
+
+	* ede/proj.el (ede-proj-target-makefile-miscelaneous):
+	* ede/proj-aux.el (ede-aux-source):
+	* ede/proj-misc.el (ede-proj-target-makefile-miscelaneous)
+	(ede-misc-source):
+	* semantic/mru-bookmark.el (semantic-mrub-completing-read)
+	(semantic-mrub-switch-tags): Fix doc typos.
+
+	* semantic/db-global.el (data-debug-new-buffer)
+	(data-debug-insert-thing): Remove unneeded declarations (one broken).
+	(semanticdb-enable-gnu-global-databases): Fix prompt typo.
+
+	* semantic/analyze/fcn.el (semantic-scope-find): Fix declaration.
+
+	* semantic/bovine/gcc.el (semantic-gcc-setup): Replace runtime
+	use of CL function `remove-if-not'.
+
+2009-09-29  Glenn Morris  <rgm@gnu.org>
+
+	* semantic/symref/idutils.el:
+	* semantic/symref/list.el: Relicense under GPLv3+.
+
+	* ede/srecode.el (srecode-resolve-arguments): Fix declaration.
+
+	* semantic/complete.el (semantic-displayor-focus-abstract-child-p):
+	* semantic/tag-file.el (semanticdb-table-child-p):
+	* srecode/compile.el (srecode-template-inserter-newline-child-p):
+	Mark declarations not understood by check-declare.
+
+2009-09-28  Eric Ludlam  <zappo@gnu.org>
+
+	CEDET (development tools) package merged.
+
+	* *.el:
+	* ede/*.el:
+	* semantic/*.el:
+	* srecode/*.el: New files.
+
+2009-09-28  Eric Ludlam  <zappo@gnu.org>
+
+	* emacs-lisp/chart.el:
+	* emacs-lisp/eieio-base.el:
+	* emacs-lisp/eieio-comp.el:
+	* emacs-lisp/eieio-custom.el:
+	* emacs-lisp/eieio-datadebug.el:
+	* emacs-lisp/eieio-opt.el:
+	* emacs-lisp/eieio-speedbar.el:
+	* emacs-lisp/eieio.el: New files.
+
+	* cedet-cscope.el:
+	* cedet-files.el:
+	* cedet-global.el:
+	* cedet-idutils.el:
+	* data-debug.el:
+	* inversion.el:
+	* mode-local.el:
+	* pulse.el: New files.
--- a/lisp/cedet/cedet-cscope.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/cedet-cscope.el	Thu Sep 23 15:00:31 2010 -0400
@@ -73,6 +73,12 @@
 	)
     (cedet-cscope-call (list "-d" "-L" idx searchtext))))
 
+(defun cedet-cscope-create (flags)
+  "Create a CScope database at the current directory.
+FLAGS are additional flags to pass to cscope beyond the
+options -cR."
+  (cedet-cscope-call (append (list "-cR") flags)))
+
 (defun cedet-cscope-call (flags)
   "Call CScope with the list of FLAGS."
   (let ((b (get-buffer-create "*CEDET CScope*"))
@@ -113,13 +119,19 @@
 If DIR is not supplied, use the current default directory.
 This works by running cscope on a bogus symbol, and looking for
 the error code."
+  (interactive "DDirectory: ")
   (save-excursion
     (let ((default-directory (or dir default-directory)))
       (set-buffer (cedet-cscope-call (list "-d" "-L" "-7" "moose")))
       (goto-char (point-min))
-      (if (looking-at "[^ \n]*cscope: ")
-	  nil
-	t))))
+      (let ((ans (looking-at "[^ \n]*cscope: ")))
+	(if (called-interactively-p 'interactive)
+	    (if ans
+		(message "No support for CScope in %s" default-directory)
+	      (message "CScope is supported in %s" default-directory))
+	  (if ans
+	      nil
+	    t))))))
 
 (defun cedet-cscope-version-check (&optional noerror)
   "Check the version of the installed CScope command.
@@ -151,6 +163,14 @@
 	    (message "CScope %s  - Good enough for CEDET." rev))
 	  t)))))
 
+(defun cedet-cscope-create/update-database (&optional dir)
+  "Create a CScope database in DIR.
+CScope will automatically choose incremental rebuild if
+there is already a database in DIR."
+  (interactive "DDirectory: ")
+  (let ((default-directory dir))
+    (cedet-cscope-create nil)))
+
 (provide 'cedet-cscope)
 
 ;; arch-tag: 9973f1ad-f13b-4399-bc67-7f488478d78d
--- a/lisp/cedet/cedet-global.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/cedet-global.el	Thu Sep 23 15:00:31 2010 -0400
@@ -34,6 +34,12 @@
   :type 'string
   :group 'cedet)
 
+(defcustom cedet-global-gtags-command "gtags"
+  "Command name for the GNU Global gtags executable.
+GTAGS is used to create the tags table queried by the 'global' command."
+  :type 'string
+  :group 'cedet)
+
 ;;; Code:
 (defun cedet-gnu-global-search (searchtext texttype type scope)
   "Perform a search with GNU Global, return the created buffer.
@@ -76,6 +82,19 @@
 	   flags)
     b))
 
+(defun cedet-gnu-global-gtags-call (flags)
+  "Create GNU Global TAGS using gtags with FLAGS."
+  (let ((b (get-buffer-create "*CEDET Global gtags*"))
+	(cd default-directory)
+	)
+    (with-current-buffer b
+      (setq default-directory cd)
+      (erase-buffer))
+    (apply 'call-process cedet-global-gtags-command
+	   nil b nil
+	   flags)
+    b))
+
 (defun cedet-gnu-global-expand-filename (filename)
   "Expand the FILENAME with GNU Global.
 Return a fully qualified filename."
@@ -153,6 +172,18 @@
       ;; Return the results
       (nreverse hits))))
 
+(defun cedet-gnu-global-create/update-database (&optional dir)
+  "Create a GNU Global database in DIR.
+If a database already exists, then just update it."
+  (interactive "DDirectory: ")
+  (let ((root (cedet-gnu-global-root dir)))
+    (if root (setq dir root))
+    (let ((default-directory dir))
+      (cedet-gnu-global-gtags-call
+       (when root
+	 '("-i");; Incremental update flag.
+	 )))))
+
 (provide 'cedet-global)
 
 ;; arch-tag: 0d0d3ac2-91ef-4820-bb2b-1d59ccf38392
--- a/lisp/cedet/cedet-idutils.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/cedet-idutils.el	Thu Sep 23 15:00:31 2010 -0400
@@ -44,6 +44,11 @@
   :type 'string
   :group 'cedet)
 
+(defcustom cedet-idutils-make-command "mkid"
+  "Command name for the ID Utils executable for creating token databases."
+  :type 'string
+  :group 'cedet)
+
 (defun cedet-idutils-search (searchtext texttype type scope)
   "Perform a search with ID Utils, return the created buffer.
 SEARCHTEXT is text to find.
@@ -105,6 +110,20 @@
 	   flags)
     b))
 
+(defun cedet-idutils-mkid-call (flags)
+  "Call ID Utils mkid with the list of FLAGS.
+Return the created buffer with with program output."
+  (let ((b (get-buffer-create "*CEDET mkid*"))
+	(cd default-directory)
+	)
+    (with-current-buffer b
+      (setq default-directory cd)
+      (erase-buffer))
+    (apply 'call-process cedet-idutils-make-command
+	   nil b nil
+	   flags)
+    b))
+
 ;;; UTIL CALLS
 ;;
 (defun cedet-idutils-expand-filename (filename)
@@ -172,6 +191,12 @@
 	    (message "ID Utils %s  - Good enough for CEDET." rev))
 	  t)))))
 
+(defun cedet-idutils-create/update-database (&optional dir)
+  "Create an IDUtils database in DIR.
+IDUtils must start from scratch when updating a database."
+  (interactive "DDirectory: ")
+  (let ((default-directory dir))
+    (cedet-idutils-mkid-call nil)))
 
 (provide 'cedet-idutils)
 
--- a/lisp/cedet/cedet.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/cedet.el	Thu Sep 23 15:00:31 2010 -0400
@@ -36,19 +36,19 @@
 
 (declare-function inversion-find-version "inversion")
 
-(defconst cedet-version "1.0pre7"
+(defconst cedet-version "1.0"
   "Current version of CEDET.")
 
 (defconst cedet-packages
   `(
     ;;PACKAGE   MIN-VERSION
     (cedet         ,cedet-version)
-    (eieio         "1.2")
-    (semantic      "2.0pre7")
-    (srecode       "1.0pre7")
-    (ede           "1.0pre7")
-    (speedbar      "1.0.3"))
-  "Table of CEDET packages to install.")
+    (eieio         "1.3")
+    (semantic      "2.0")
+    (srecode       "1.0")
+    (ede           "1.0")
+    (speedbar      "1.0"))
+  "Table of CEDET packages installed.")
 
 (defvar cedet-menu-map ;(make-sparse-keymap "CEDET menu")
   (let ((map (make-sparse-keymap "CEDET menu")))
--- a/lisp/cedet/ede.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede.el	Thu Sep 23 15:00:31 2010 -0400
@@ -44,24 +44,24 @@
 (require 'eieio)
 (require 'eieio-speedbar)
 (require 'ede/source)
+(require 'ede/base)
+(require 'ede/auto)
+
 (load "ede/loaddefs" nil 'nomessage)
 
+(declare-function ede-commit-project "ede/custom")
 (declare-function ede-convert-path "ede/files")
 (declare-function ede-directory-get-open-project "ede/files")
 (declare-function ede-directory-get-toplevel-open-project "ede/files")
 (declare-function ede-directory-project-p "ede/files")
 (declare-function ede-find-subproject-for-directory "ede/files")
 (declare-function ede-project-directory-remove-hash "ede/files")
-(declare-function ede-project-root "ede/files")
-(declare-function ede-project-root-directory "ede/files")
 (declare-function ede-toplevel "ede/files")
 (declare-function ede-toplevel-project "ede/files")
 (declare-function ede-up-directory "ede/files")
-(declare-function data-debug-new-buffer "data-debug")
-(declare-function data-debug-insert-object-slots "eieio-datadebug")
 (declare-function semantic-lex-make-spp-table "semantic/lex-spp")
 
-(defconst ede-version "1.0pre7"
+(defconst ede-version "1.0"
   "Current version of the Emacs EDE.")
 
 ;;; Code:
@@ -95,314 +95,6 @@
   :group 'ede
   :type 'sexp) ; make this be a list of options some day
 
-
-;;; Top level classes for projects and targets
-
-(defclass ede-project-autoload ()
-  ((name :initarg :name
-	 :documentation "Name of this project type")
-   (file :initarg :file
-	 :documentation "The lisp file belonging to this class.")
-   (proj-file :initarg :proj-file
-	      :documentation "Name of a project file of this type.")
-   (proj-root :initarg :proj-root
-	      :type function
-	      :documentation "A function symbol to call for the project root.
-This function takes no arguments, and returns the current directories
-root, if available.  Leave blank to use the EDE directory walking
-routine instead.")
-   (initializers :initarg :initializers
-		 :initform nil
-		 :documentation
-		 "Initializers passed to the project object.
-These are used so there can be multiple types of projects
-associated with a single object class, based on the initilizeres used.")
-   (load-type :initarg :load-type
-	      :documentation "Fn symbol used to load this project file.")
-   (class-sym :initarg :class-sym
-	      :documentation "Symbol representing the project class to use.")
-   (new-p :initarg :new-p
-	  :initform t
-	  :documentation
-	  "Non-nil if this is an option when a user creates a project.")
-   )
-  "Class representing minimal knowledge set to run preliminary EDE functions.
-When more advanced functionality is needed from a project type, that projects
-type is required and the load function used.")
-
-(defvar ede-project-class-files
-  (list
-   (ede-project-autoload "edeproject-makefile"
-			 :name "Make" :file 'ede/proj
-			 :proj-file "Project.ede"
-			 :load-type 'ede-proj-load
-			 :class-sym 'ede-proj-project)
-   (ede-project-autoload "edeproject-automake"
-			 :name "Automake" :file 'ede/proj
-			 :proj-file "Project.ede"
-			 :initializers '(:makefile-type Makefile.am)
-			 :load-type 'ede-proj-load
-			 :class-sym 'ede-proj-project)
-   (ede-project-autoload "automake"
-			 :name "automake" :file 'ede/project-am
-			 :proj-file "Makefile.am"
-			 :load-type 'project-am-load
-			 :class-sym 'project-am-makefile
-			 :new-p nil)
-   (ede-project-autoload "cpp-root"
-			 :name "CPP ROOT" :file 'ede/cpp-root
-			 :proj-file 'ede-cpp-root-project-file-for-dir
-			 :proj-root 'ede-cpp-root-project-root
-			 :load-type 'ede-cpp-root-load
-			 :class-sym 'ede-cpp-root
-			 :new-p nil)
-   (ede-project-autoload "emacs"
-			 :name "EMACS ROOT" :file 'ede/emacs
-			 :proj-file "src/emacs.c"
-			 :proj-root 'ede-emacs-project-root
-			 :load-type 'ede-emacs-load
-			 :class-sym 'ede-emacs-project
-			 :new-p nil)
-   (ede-project-autoload "linux"
-			 :name "LINUX ROOT" :file 'ede/linux
-			 :proj-file "scripts/ver_linux"
-			 :proj-root 'ede-linux-project-root
-			 :load-type 'ede-linux-load
-			 :class-sym 'ede-linux-project
-			 :new-p nil)
-   (ede-project-autoload "simple-overlay"
-			 :name "Simple" :file 'ede/simple
-			 :proj-file 'ede-simple-projectfile-for-dir
-			 :load-type 'ede-simple-load
-			 :class-sym 'ede-simple-project))
-  "List of vectors defining how to determine what type of projects exist.")
-
-;;; Generic project information manager objects
-
-(defclass ede-target (eieio-speedbar-directory-button)
-  ((buttonface :initform speedbar-file-face) ;override for superclass
-   (name :initarg :name
-	 :type string
-	 :custom string
-	 :label "Name"
-	 :group (default name)
-	 :documentation "Name of this target.")
-   ;; @todo - I think this should be "dir", and not "path".
-   (path :initarg :path
-	 :type string
-	 ;:custom string
-	 ;:label "Path to target"
-	 ;:group (default name)
-	 :documentation "The path to the sources of this target.
-Relative to the path of the project it belongs to.")
-   (source :initarg :source
-	   :initform nil
-	   ;; I'd prefer a list of strings.
-	   :type list
-	   :custom (repeat (string :tag "File"))
-	   :label "Source Files"
-	   :group (default source)
-	   :documentation "Source files in this target.")
-   (versionsource :initarg :versionsource
-		  :initform nil
-		  :type list
-		  :custom (repeat (string :tag "File"))
-		  :label "Source Files with Version String"
-		  :group (source)
-		  :documentation
-		  "Source files with a version string in them.
-These files are checked for a version string whenever the EDE version
-of the master project is changed.  When strings are found, the version
-previously there is updated.")
-   ;; Class level slots
-   ;;
-;   (takes-compile-command :allocation :class
-;			  :initarg :takes-compile-command
-;			  :type boolean
-;			  :initform nil
-;			  :documentation
-;     "Non-nil if this target requires a user approved command.")
-   (sourcetype :allocation :class
-	       :type list ;; list of symbols
-	       :documentation
-	       "A list of `ede-sourcecode' objects this class will handle.
-This is used to match target objects with the compilers they can use, and
-which files this object is interested in."
-	       :accessor ede-object-sourcecode)
-   (keybindings :allocation :class
-		:initform (("D" . ede-debug-target))
-		:documentation
-"Keybindings specialized to this type of target."
-		:accessor ede-object-keybindings)
-   (menu :allocation :class
-	 :initform ( [ "Debug target" ede-debug-target
-		       (and ede-object
-			    (obj-of-class-p ede-object ede-target)) ]
-		     )
-		     [ "Run target" ede-run-target
-		       (and ede-object
-			    (obj-of-class-p ede-object ede-target)) ]
-	 :documentation "Menu specialized to this type of target."
-	 :accessor ede-object-menu)
-   )
-  "A top level target to build.")
-
-(defclass ede-project-placeholder (eieio-speedbar-directory-button)
-  ((name :initarg :name
-	 :initform "Untitled"
-	 :type string
-	 :custom string
-	 :label "Name"
-	 :group (default name)
-	 :documentation "The name used when generating distribution files.")
-   (version :initarg :version
-	    :initform "1.0"
-	    :type string
-	    :custom string
-	    :label "Version"
-	    :group (default name)
-	    :documentation "The version number used when distributing files.")
-   (directory :type string
-	      :initarg :directory
-	      :documentation "Directory this project is associated with.")
-   (dirinode :documentation "The inode id for :directory.")
-   (file :type string
-	 :initarg :file
-	 :documentation "File name where this project is stored.")
-   (rootproject ; :initarg - no initarg, don't save this slot!
-    :initform nil
-    :type (or null ede-project-placeholder-child)
-    :documentation "Pointer to our root project.")
-   )
-  "Placeholder object for projects not loaded into memory.
-Projects placeholders will be stored in a user specific location
-and querying them will cause the actual project to get loaded.")
-
-(defclass ede-project (ede-project-placeholder)
-  ((subproj :initform nil
-	    :type list
-	    :documentation "Sub projects controlled by this project.
-For Automake based projects, each directory is treated as a project.")
-   (targets :initarg :targets
-	    :type list
-	    :custom (repeat (object :objectcreatefcn ede-new-target-custom))
-	    :label "Local Targets"
-	    :group (targets)
-	    :documentation "List of top level targets in this project.")
-   (locate-obj :type (or null ede-locate-base-child)
-	       :documentation
-	       "A locate object to use as a backup to `ede-expand-filename'.")
-   (tool-cache :initarg :tool-cache
-	       :type list
-	       :custom (repeat object)
-	       :label "Tool: "
-	       :group tools
-	       :documentation "List of tool cache configurations in this project.
-This allows any tool to create, manage, and persist project-specific settings.")
-   (mailinglist :initarg :mailinglist
-		:initform ""
-		:type string
-		:custom string
-		:label "Mailing List Address"
-		:group name
-		:documentation
-		"An email address where users might send email for help.")
-   (web-site-url :initarg :web-site-url
-		 :initform ""
-		 :type string
-		 :custom string
-		 :label "Web Site URL"
-		 :group name
-		 :documentation "URL to this projects web site.
-This is a URL to be sent to a web site for documentation.")
-   (web-site-directory :initarg :web-site-directory
-		       :initform ""
-		       :custom string
-		       :label "Web Page Directory"
-		       :group name
-		       :documentation
-		       "A directory where web pages can be found by Emacs.
-For remote locations use a path compatible with ange-ftp or EFS.
-You can also use TRAMP for use with rcp & scp.")
-   (web-site-file :initarg :web-site-file
-		  :initform ""
-		  :custom string
-		  :label "Web Page File"
-		  :group name
-		  :documentation
-		  "A file which contains the home page for this project.
-This file can be relative to slot `web-site-directory'.
-This can be a local file, use ange-ftp, EFS, or TRAMP.")
-   (ftp-site :initarg :ftp-site
-	     :initform ""
-	     :type string
-	     :custom string
-	     :label "FTP site"
-	     :group name
-	     :documentation
-	     "FTP site where this project's distribution can be found.
-This FTP site should be in Emacs form, as needed by `ange-ftp', but can
-also be of a form used by TRAMP for use with scp, or rcp.")
-   (ftp-upload-site :initarg :ftp-upload-site
-		    :initform ""
-		    :type string
-		    :custom string
-		    :label "FTP Upload site"
-		    :group name
-		    :documentation
-		    "FTP Site to upload new distributions to.
-This FTP site should be in Emacs form as needed by `ange-ftp'.
-If this slot is nil, then use `ftp-site' instead.")
-   (configurations :initarg :configurations
-		   :initform ("debug" "release")
-		   :type list
-		   :custom (repeat string)
-		   :label "Configuration Options"
-		   :group (settings)
-		   :documentation "List of available configuration types.
-Individual target/project types can form associations between a configuration,
-and target specific elements such as build variables.")
-   (configuration-default :initarg :configuration-default
-			  :initform "debug"
-			  :custom string
-			  :label "Current Configuration"
-			  :group (settings)
-			  :documentation "The default configuration.")
-   (local-variables :initarg :local-variables
-		    :initform nil
-		    :custom (repeat (cons (sexp :tag "Variable")
-					  (sexp :tag "Value")))
-		    :label "Project Local Variables"
-		    :group (settings)
-		    :documentation "Project local variables")
-   (keybindings :allocation :class
-		:initform (("D" . ede-debug-target)
-			   ("R" . ede-run-target))
-		:documentation "Keybindings specialized to this type of target."
-		:accessor ede-object-keybindings)
-   (menu :allocation :class
-	 :initform
-	 (
-	  [ "Update Version" ede-update-version ede-object ]
-	  [ "Version Control Status" ede-vc-project-directory ede-object ]
-	  [ "Edit Project Homepage" ede-edit-web-page
-	    (and ede-object (oref (ede-toplevel) web-site-file)) ]
-	  [ "Browse Project URL" ede-web-browse-home
-	    (and ede-object
-		 (not (string= "" (oref (ede-toplevel) web-site-url)))) ]
-	  "--"
-	  [ "Rescan Project Files" ede-rescan-toplevel t ]
-	  [ "Edit Projectfile" ede-edit-file-target
-	    (and ede-object
-		 (or (listp ede-object)
-		     (not (obj-of-class-p ede-object ede-project)))) ]
-	  )
-	 :documentation "Menu specialized to this type of target."
-	 :accessor ede-object-menu)
-   )
-  "Top level EDE project specification.
-All specific project types must derive from this project."
-  :method-invocation-order :depth-first)
 
 ;;; Management variables
 
@@ -431,109 +123,13 @@
 If `ede-object' is nil, then commands will operate on this object.")
 
 (defvar ede-constructing nil
-  "Non nil when constructing a project hierarchy.")
+  "Non nil when constructing a project hierarchy.
+If the project is being constructed from an autoload, then the
+value is the autoload object being used.")
 
 (defvar ede-deep-rescan nil
   "Non nil means scan down a tree, otherwise rescans are top level only.
 Do not set this to non-nil globally.  It is used internally.")
-
-;;; The EDE persistent cache.
-;;
-(defcustom ede-project-placeholder-cache-file
-  (locate-user-emacs-file "ede-projects.el" ".projects.ede")
-  "File containing the list of projects EDE has viewed."
-  :group 'ede
-  :type 'file)
-
-(defvar ede-project-cache-files nil
-  "List of project files EDE has seen before.")
-
-(defun ede-save-cache ()
-  "Save a cache of EDE objects that Emacs has seen before."
-  (interactive)
-  (let ((p ede-projects)
-	(c ede-project-cache-files)
-	(recentf-exclude '(ignore))
-	)
-    (condition-case nil
-	(progn
-	  (set-buffer (find-file-noselect ede-project-placeholder-cache-file t))
-	  (erase-buffer)
-	  (insert ";; EDE project cache file.
-;; This contains a list of projects you have visited.\n(")
-	  (while p
-	    (when (and (car p) (ede-project-p p))
-	      (let ((f (oref (car p) file)))
-		(when (file-exists-p f)
-		  (insert "\n  \"" f "\""))))
-	    (setq p (cdr p)))
-	  (while c
-	    (insert "\n \"" (car c) "\"")
-	    (setq c (cdr c)))
-	  (insert "\n)\n")
-	  (condition-case nil
-	      (save-buffer 0)
-	    (error
-	     (message "File %s could not be saved."
-		      ede-project-placeholder-cache-file)))
-	  (kill-buffer (current-buffer))
-	  )
-      (error
-       (message "File %s could not be read."
-	       	ede-project-placeholder-cache-file))
-
-      )))
-
-(defun ede-load-cache ()
-  "Load the cache of EDE projects."
-  (save-excursion
-    (let ((cachebuffer nil))
-      (condition-case nil
-	  (progn
-	    (setq cachebuffer
-		  (find-file-noselect ede-project-placeholder-cache-file t))
-	    (set-buffer cachebuffer)
-	    (goto-char (point-min))
-	    (let ((c (read (current-buffer)))
-		  (new nil)
-		  (p ede-projects))
-	      ;; Remove loaded projects from the cache.
-	      (while p
-		(setq c (delete (oref (car p) file) c))
-		(setq p (cdr p)))
-	      ;; Remove projects that aren't on the filesystem
-	      ;; anymore.
-	      (while c
-		(when (file-exists-p (car c))
-		  (setq new (cons (car c) new)))
-		(setq c (cdr c)))
-	      ;; Save it
-	      (setq ede-project-cache-files (nreverse new))))
-	(error nil))
-      (when cachebuffer (kill-buffer cachebuffer))
-      )))
-
-;;; Important macros for doing commands.
-;;
-(defmacro ede-with-projectfile (obj &rest forms)
-  "For the project in which OBJ resides, execute FORMS."
-  (list 'save-window-excursion
-	(list 'let* (list
-		     (list 'pf
-			   (list 'if (list 'obj-of-class-p
-					   obj 'ede-target)
-				 ;; @todo -I think I can change
-				 ;; this to not need ede-load-project-file
-				 ;; but I'm not sure how to test well.
-				 (list 'ede-load-project-file
-				       (list 'oref obj 'path))
-				 obj))
-		     '(dbka (get-file-buffer (oref pf file))))
-	      '(if (not dbka) (find-file (oref pf file))
-		 (switch-to-buffer dbka))
-	      (cons 'progn forms)
-	      '(if (not dbka) (kill-buffer (current-buffer))))))
-(put 'ede-with-projectfile 'lisp-indent-function 1)
 
 
 ;;; Prompting
@@ -611,6 +207,18 @@
 	      :enable ede-object
 	      :visible global-ede-mode))
 
+(defun ede-buffer-belongs-to-target-p ()
+  "Return non-nil if this buffer belongs to at least one target."
+  (let ((obj ede-object))
+    (if (consp obj)
+	(setq obj (car obj)))
+    (and obj (obj-of-class-p obj ede-target))))
+
+(defun ede-buffer-belongs-to-project-p ()
+  "Return non-nil if this buffer belongs to at least one target."
+  (if (or (null ede-object) (consp ede-object)) nil
+    (obj-of-class-p ede-object ede-project)))
+
 (defun ede-menu-obj-of-class-p (class)
   "Return non-nil if some member of `ede-object' is a child of CLASS."
   (if (listp ede-object)
@@ -672,9 +280,7 @@
 	   (and (ede-current-project)
 		(oref (ede-current-project) targets)) ]
 	 [ "Remove File" ede-remove-file
-	   (and ede-object
-		(or (listp ede-object)
-		    (not (obj-of-class-p ede-object ede-project)))) ]
+	   (ede-buffer-belongs-to-project-p) ]
 	 "-")
        (if (not obj)
 	   nil
@@ -718,7 +324,7 @@
     (let* ((obj (ede-current-project))
 	   targ)
       (when obj
-	(setq targ (when (slot-boundp obj 'targets)
+	(setq targ (when (and obj (slot-boundp obj 'targets))
 		     (oref obj targets)))
 	;; Make custom menus for everything here.
 	(append (list
@@ -804,31 +410,49 @@
 	     (eq major-mode 'vc-dired-mode))
 	 (ede-dired-minor-mode (if ede-minor-mode 1 -1)))
 	(ede-minor-mode
-	 (if (and (not ede-constructing)
-		  (ede-directory-project-p default-directory t))
-	     (let* ((ROOT nil)
-		    (proj (ede-directory-get-open-project default-directory
-							  'ROOT)))
-	       (when (not proj)
-		 ;; @todo - this could be wasteful.
-		 (setq proj (ede-load-project-file default-directory 'ROOT)))
-	       (setq ede-object-project proj)
-	       (setq ede-object-root-project
-		     (or ROOT (ede-project-root proj)))
-	       (setq ede-object (ede-buffer-object))
-	       (if (and (not ede-object) ede-object-project)
-		   (ede-auto-add-to-target))
-	       (ede-apply-target-options))
+	 (if (not ede-constructing)
+	     (ede-initialize-state-current-buffer)
 	   ;; If we fail to have a project here, turn it back off.
 	   (ede-minor-mode -1)))))
 
+(defun ede-initialize-state-current-buffer ()
+  "Initialize the current buffer's state for EDE.
+Sets buffer local variables for EDE."
+  (let* ((ROOT nil)
+	 (proj (ede-directory-get-open-project default-directory
+					       'ROOT)))
+    (when (or proj ROOT
+	      (ede-directory-project-p default-directory t))
+
+      (when (not proj)
+	;; @todo - this could be wasteful.
+	(setq proj (ede-load-project-file default-directory 'ROOT)))
+
+      (setq ede-object (ede-buffer-object (current-buffer)
+					  'ede-object-project))
+
+      (setq ede-object-root-project
+	    (or ROOT (ede-project-root ede-object-project)))
+
+      (if (and (not ede-object) ede-object-project)
+	  (ede-auto-add-to-target))
+
+      (ede-apply-target-options))))
+
 (defun ede-reset-all-buffers (onoff)
   "Reset all the buffers due to change in EDE.
 ONOFF indicates enabling or disabling the mode."
   (let ((b (buffer-list)))
     (while b
       (when (buffer-file-name (car b))
-	(ede-buffer-object (car b))
+	(with-current-buffer (car b)
+	  ;; Reset all state variables
+	  (setq ede-object nil
+		ede-object-project nil
+		ede-object-root-project nil)
+	  ;; Now re-initialize this buffer.
+	  (ede-initialize-state-current-buffer)
+	  )
 	)
       (setq b (cdr b)))))
 
@@ -967,6 +591,7 @@
 			     r)
 			   )
 			  nil t)))
+  (require 'ede/custom)
   ;; Make sure we have a valid directory
   (when (not (file-exists-p default-directory))
     (error "Cannot create project in non-existent directory %s" default-directory))
@@ -1014,20 +639,6 @@
   "Add into PROJ-A, the subproject PROJ-B."
   (oset proj-a subproj (cons proj-b (oref proj-a subproj))))
 
-(defmethod ede-subproject-relative-path ((proj ede-project) &optional parent-in)
-  "Get a path name for PROJ which is relative to the parent project.
-If PARENT is specified, then be relative to the PARENT project.
-Specifying PARENT is useful for sub-sub projects relative to the root project."
-  (let* ((parent (or parent-in (ede-parent-project proj)))
-	 (dir (file-name-directory (oref proj file))))
-    (if (and parent (not (eq parent proj)))
-	(file-relative-name dir (file-name-directory (oref parent file)))
-      "")))
-
-(defmethod ede-subproject-p ((proj ede-project))
-  "Return non-nil if PROJ is a sub project."
-  (ede-parent-project proj))
-
 (defun ede-invoke-method (sym &rest args)
   "Invoke method SYM on the current buffer's project object.
 ARGS are additional arguments to pass to method sym."
@@ -1162,175 +773,9 @@
 (defun ede-make-dist ()
   "Create a distribution from the current project."
   (interactive)
-  (let ((ede-object (ede-current-project)))
+  (let ((ede-object (ede-toplevel)))
     (ede-invoke-method 'project-make-dist)))
 
-;;; Customization
-;;
-;; Routines for customizing projects and targets.
-
-(defvar eieio-ede-old-variables nil
-  "The old variables for a project.")
-
-(defalias 'customize-project 'ede-customize-project)
-(defun ede-customize-project (&optional group)
-  "Edit fields of the current project through EIEIO & Custom.
-Optional GROUP specifies the subgroup of slots to customize."
-  (interactive "P")
-  (require 'eieio-custom)
-  (let* ((ov (oref (ede-current-project) local-variables))
-	 (cp (ede-current-project))
-	 (group (if group (eieio-read-customization-group cp))))
-    (eieio-customize-object cp group)
-    (make-local-variable 'eieio-ede-old-variables)
-    (setq eieio-ede-old-variables ov)))
-
-(defalias 'customize-target 'ede-customize-current-target)
-(defun ede-customize-current-target(&optional group)
-  "Edit fields of the current target through EIEIO & Custom.
-Optional argument OBJ is the target object to customize.
-Optional argument GROUP is the slot group to display."
-  (interactive "P")
-  (require 'eieio-custom)
-  (if (not (obj-of-class-p ede-object ede-target))
-      (error "Current file is not part of a target"))
-  (let ((group (if group (eieio-read-customization-group ede-object))))
-    (ede-customize-target ede-object group)))
-
-(defun ede-customize-target (obj group)
-  "Edit fields of the current target through EIEIO & Custom.
-Optional argument OBJ is the target object to customize.
-Optional argument GROUP is the slot group to display."
-  (require 'eieio-custom)
-  (if (and obj (not (obj-of-class-p obj ede-target)))
-      (error "No logical target to customize"))
-  (eieio-customize-object obj (or group 'default)))
-;;; Target Sorting
-;;
-;; Target order can be important, but custom doesn't support a way
-;; to resort items in a list.  This function by David Engster allows
-;; targets to be re-arranged.
-
-(defvar ede-project-sort-targets-order nil
-  "Variable for tracking target order in `ede-project-sort-targets'.")
-
-(defun ede-project-sort-targets ()
-  "Create a custom-like buffer for sorting targets of current project."
-  (interactive)
-  (let ((proj (ede-current-project))
-        (count 1)
-        current order)
-    (switch-to-buffer (get-buffer-create "*EDE sort targets*"))
-    (erase-buffer)
-    (setq ede-object-project proj)
-    (widget-create 'push-button
-                   :notify (lambda (&rest ignore)
-                             (let ((targets (oref ede-object-project targets))
-                                   cur newtargets)
-                               (while (setq cur (pop ede-project-sort-targets-order))
-                                 (setq newtargets (append newtargets
-                                                          (list (nth cur targets)))))
-                               (oset ede-object-project targets newtargets))
-                             (ede-commit-project ede-object-project)
-                             (kill-buffer))
-                   " Accept ")
-    (widget-insert "   ")
-    (widget-create 'push-button
-                   :notify (lambda (&rest ignore)
-                               (kill-buffer))
-                   " Cancel ")
-    (widget-insert "\n\n")
-    (setq ede-project-sort-targets-order nil)
-    (mapc (lambda (x)
-            (add-to-ordered-list
-             'ede-project-sort-targets-order
-             x x))
-          (number-sequence 0 (1- (length (oref proj targets)))))
-    (ede-project-sort-targets-list)
-    (use-local-map widget-keymap)
-    (widget-setup)
-    (goto-char (point-min))))
-
-(defun ede-project-sort-targets-list ()
-  "Sort the target list while using `ede-project-sort-targets'."
-  (save-excursion
-    (let ((count 0)
-          (targets (oref ede-object-project targets))
-          (inhibit-read-only t)
-          (inhibit-modification-hooks t))
-      (goto-char (point-min))
-      (forward-line 2)
-      (delete-region (point) (point-max))
-      (while (< count (length targets))
-        (if (> count 0)
-            (widget-create 'push-button
-                           :notify `(lambda (&rest ignore)
-                                      (let ((cur ede-project-sort-targets-order))
-                                        (add-to-ordered-list
-                                         'ede-project-sort-targets-order
-                                         (nth ,count cur)
-                                         (1- ,count))
-                                        (add-to-ordered-list
-                                         'ede-project-sort-targets-order
-                                         (nth (1- ,count) cur) ,count))
-                                      (ede-project-sort-targets-list))
-                           " Up ")
-          (widget-insert "      "))
-        (if (< count (1- (length targets)))
-            (widget-create 'push-button
-                           :notify `(lambda (&rest ignore)
-                                      (let ((cur ede-project-sort-targets-order))
-                                        (add-to-ordered-list
-                                         'ede-project-sort-targets-order
-                                         (nth ,count cur) (1+ ,count))
-                                        (add-to-ordered-list
-                                         'ede-project-sort-targets-order
-                                         (nth (1+ ,count) cur) ,count))
-                                      (ede-project-sort-targets-list))
-                           " Down ")
-          (widget-insert "        "))
-        (widget-insert (concat " " (number-to-string (1+ count)) ".:   "
-                               (oref (nth (nth count ede-project-sort-targets-order)
-                                          targets) name) "\n"))
-        (setq count (1+ count))))))
-
-;;; Customization hooks
-;;
-;; These hooks are used when finishing up a customization.
-(defmethod eieio-done-customizing ((proj ede-project))
-  "Call this when a user finishes customizing PROJ."
-  (let ((ov eieio-ede-old-variables)
-	(nv (oref proj local-variables)))
-    (setq eieio-ede-old-variables nil)
-    (while ov
-      (if (not (assoc (car (car ov)) nv))
-	  (save-excursion
-	    (mapc (lambda (b)
-		    (set-buffer b)
-		    (kill-local-variable (car (car ov))))
-		  (ede-project-buffers proj))))
-      (setq ov (cdr ov)))
-    (mapc (lambda (b) (ede-set-project-variables proj b))
-	  (ede-project-buffers proj))))
-
-(defmethod eieio-done-customizing ((target ede-target))
-  "Call this when a user finishes customizing TARGET."
-  nil)
-
-(defmethod ede-commit-project ((proj ede-project))
-  "Commit any change to PROJ to its file."
-  nil
-  )
-
-
-;;; EDE project placeholder methods
-;;
-(defmethod ede-project-force-load ((this ede-project-placeholder))
-  "Make sure the placeholder THIS is replaced with the real thing.
-Return the new object created in its place."
-  this
-  )
-
 
 ;;; EDE project target baseline methods.
 ;;
@@ -1343,9 +788,9 @@
 ;;  methods based on those below.
 
 (defmethod project-interactive-select-target ((this ede-project-placeholder) prompt)
-  ; checkdoc-params: (prompt)
+					; checkdoc-params: (prompt)
   "Make sure placeholder THIS is replaced with the real thing, and pass through."
-  (project-interactive-select-target (ede-project-force-load this) prompt))
+  (project-interactive-select-target this prompt))
 
 (defmethod project-interactive-select-target ((this ede-project) prompt)
   "Interactively query for a target that exists in project THIS.
@@ -1354,9 +799,9 @@
     (cdr (assoc (completing-read prompt ob nil t) ob))))
 
 (defmethod project-add-file ((this ede-project-placeholder) file)
-  ; checkdoc-params: (file)
+					; checkdoc-params: (file)
   "Make sure placeholder THIS is replaced with the real thing, and pass through."
-  (project-add-file (ede-project-force-load this) file))
+  (project-add-file this file))
 
 (defmethod project-add-file ((ot ede-target) file)
   "Add the current buffer into project project target OT.
@@ -1413,132 +858,6 @@
 (defmethod project-rescan ((this ede-project))
   "Rescan the EDE proj project THIS."
   (error "Rescanning a project is not supported by %s" (object-name this)))
-
-;;; Default methods for EDE classes
-;;
-;; These are methods which you might want to override, but there is
-;; no need to in most situations because they are either a) simple, or
-;; b) cosmetic.
-
-(defmethod ede-name ((this ede-target))
-  "Return the name of THIS target."
-  (oref this name))
-
-(defmethod ede-target-name ((this ede-target))
-  "Return the name of THIS target, suitable for make or debug style commands."
-  (oref this name))
-
-(defmethod ede-name ((this ede-project))
-  "Return a short-name for THIS project file.
-Do this by extracting the lowest directory name."
-  (oref this name))
-
-(defmethod ede-description ((this ede-project))
-  "Return a description suitable for the minibuffer about THIS."
-  (format "Project %s: %d subprojects, %d targets."
-	  (ede-name this) (length (oref this subproj))
-	  (length (oref this targets))))
-
-(defmethod ede-description ((this ede-target))
-  "Return a description suitable for the minibuffer about THIS."
-  (format "Target %s: with %d source files."
-	  (ede-name this) (length (oref this source))))
-
-(defmethod ede-want-file-p ((this ede-target) file)
-  "Return non-nil if THIS target wants FILE."
-  ;; By default, all targets reference the source object, and let it decide.
-  (let ((src (ede-target-sourcecode this)))
-    (while (and src (not (ede-want-file-p (car src) file)))
-      (setq src (cdr src)))
-    src))
-
-(defmethod ede-want-file-source-p ((this ede-target) file)
-  "Return non-nil if THIS target wants FILE."
-  ;; By default, all targets reference the source object, and let it decide.
-  (let ((src (ede-target-sourcecode this)))
-    (while (and src (not (ede-want-file-source-p (car src) file)))
-      (setq src (cdr src)))
-    src))
-
-(defun ede-header-file ()
-  "Return the header file for the current buffer.
-Not all buffers need headers, so return nil if no applicable."
-  (if ede-object
-      (ede-buffer-header-file ede-object (current-buffer))
-    nil))
-
-(defmethod ede-buffer-header-file ((this ede-project) buffer)
-  "Return nil, projects don't have header files."
-  nil)
-
-(defmethod ede-buffer-header-file ((this ede-target) buffer)
-  "There are no default header files in EDE.
-Do a quick check to see if there is a Header tag in this buffer."
-  (with-current-buffer buffer
-    (if (re-search-forward "::Header:: \\([a-zA-Z0-9.]+\\)" nil t)
-	(buffer-substring-no-properties (match-beginning 1)
-					(match-end 1))
-      (let ((src (ede-target-sourcecode this))
-	    (found nil))
-	(while (and src (not found))
-	  (setq found (ede-buffer-header-file (car src) (buffer-file-name))
-		src (cdr src)))
-	found))))
-
-(defun ede-documentation-files ()
-  "Return the documentation files for the current buffer.
-Not all buffers need documentations, so return nil if no applicable.
-Some projects may have multiple documentation files, so return a list."
-  (if ede-object
-      (ede-buffer-documentation-files ede-object (current-buffer))
-    nil))
-
-(defmethod ede-buffer-documentation-files ((this ede-project) buffer)
-  "Return all documentation in project THIS based on BUFFER."
-  ;; Find the info node.
-  (ede-documentation this))
-
-(defmethod ede-buffer-documentation-files ((this ede-target) buffer)
-  "Check for some documentation files for THIS.
-Also do a quick check to see if there is a Documentation tag in this BUFFER."
-  (with-current-buffer buffer
-    (if (re-search-forward "::Documentation:: \\([a-zA-Z0-9.]+\\)" nil t)
-	(buffer-substring-no-properties (match-beginning 1)
-					(match-end 1))
-      ;; Check the master project
-      (let ((cp (ede-toplevel)))
-	(ede-buffer-documentation-files cp (current-buffer))))))
-
-(defmethod ede-documentation ((this ede-project))
-  "Return a list of files that provide documentation.
-Documentation is not for object THIS, but is provided by THIS for other
-files in the project."
-  (let ((targ (oref this targets))
-	(proj (oref this subproj))
-	(found nil))
-    (while targ
-      (setq found (append (ede-documentation (car targ)) found)
-	    targ (cdr targ)))
-    (while proj
-      (setq found (append (ede-documentation (car proj)) found)
-	    proj (cdr proj)))
-    found))
-
-(defmethod ede-documentation ((this ede-target))
-  "Return a list of files that provide documentation.
-Documentation is not for object THIS, but is provided by THIS for other
-files in the project."
-  nil)
-
-(defun ede-html-documentation-files ()
-  "Return a list of HTML documentation files associated with this project."
-  (ede-html-documentation (ede-toplevel))
-  )
-
-(defmethod ede-html-documentation ((this ede-project))
-  "Return a list of HTML files provided by project THIS."
-
-  )
 
 (defun ede-ecb-project-paths ()
   "Return a list of all paths for all active EDE projects.
@@ -1550,24 +869,8 @@
 		    d)
 	    p (cdr p)))
     d))
-
-;;; EDE project-autoload methods
-;;
-(defmethod ede-dir-to-projectfile ((this ede-project-autoload) dir)
-  "Return a full file name of project THIS found in DIR.
-Return nil if the project file does not exist."
-  (let* ((d (file-name-as-directory dir))
-	 (root (ede-project-root-directory this d))
-	 (pf (oref this proj-file))
-	 (f (cond ((stringp pf)
-		   (expand-file-name pf (or root d)))
-		  ((and (symbolp pf) (fboundp pf))
-		   (funcall pf (or root d)))))
-	 )
-    (when (and f (file-exists-p f))
-      f)))
 
-;;; EDE basic functions
+;;; PROJECT LOADING/TRACKING
 ;;
 (defun ede-add-project-to-global-list (proj)
   "Add the project PROJ to the master list of projects.
@@ -1603,7 +906,7 @@
 	(if p (ede-load-project-file p)
 	  nil)
 	;; recomment as we go
-	;nil
+	;;nil
 	))
      ;; Do nothing if we are buiding an EDE project already
      (ede-constructing
@@ -1612,7 +915,7 @@
      (t
       (setq toppath (ede-toplevel-project path))
       ;; We found the top-most directory.  Check to see if we already
-      ;; have an object defining it's project.
+      ;; have an object defining its project.
       (setq pfc (ede-directory-project-p toppath t))
 
       ;; See if it's been loaded before
@@ -1620,7 +923,7 @@
 			    ede-projects))
       (if (not o)
 	  ;; If not, get it now.
-	  (let ((ede-constructing t))
+	  (let ((ede-constructing pfc))
 	    (setq o (funcall (oref pfc load-type) toppath))
 	    (when (not o)
 	      (error "Project type error: :load-type failed to create a project"))
@@ -1649,9 +952,14 @@
 		(delete (oref found file) ede-project-cache-files)))
 	found)))))
 
+;;; PROJECT ASSOCIATIONS
+;;
+;; Moving between relative projects.  Associating between buffers and
+;; projects.
+
 (defun ede-parent-project (&optional obj)
   "Return the project belonging to the parent directory.
-Returns nil if there is no previous directory.
+Return nil if there is no previous directory.
 Optional argument OBJ is an object to find the parent of."
   (let* ((proj (or obj ede-object-project)) ;; Current project.
 	 (root (if obj (ede-project-root obj)
@@ -1701,17 +1009,38 @@
     ;; Return what we found.
     ans))
 
-(defun ede-buffer-object (&optional buffer)
+(defun ede-buffer-object (&optional buffer projsym)
   "Return the target object for BUFFER.
-This function clears cached values and recalculates."
+This function clears cached values and recalculates.
+Optional PROJSYM is a symbol, which will be set to the project
+that contains the target that becomes buffer's object."
   (save-excursion
     (if (not buffer) (setq buffer (current-buffer)))
     (set-buffer buffer)
     (setq ede-object nil)
-    (let ((po (ede-current-project)))
-      (if po (setq ede-object (ede-find-target po buffer))))
-    (if (= (length ede-object) 1)
-	(setq ede-object (car ede-object)))
+    (let* ((localpo (ede-current-project))
+	   (po localpo)
+	   (top (ede-toplevel po)))
+      (if po (setq ede-object (ede-find-target po buffer)))
+      ;; If we get nothing, go with the backup plan of slowly
+      ;; looping upward
+      (while (and (not ede-object) (not (eq po top)))
+	(setq po (ede-parent-project po))
+	(if po (setq ede-object (ede-find-target po buffer))))
+      ;; Filter down to 1 project if there are dups.
+      (if (= (length ede-object) 1)
+	  (setq ede-object (car ede-object)))
+      ;; Track the project, if needed.
+      (when (and projsym (symbolp projsym))
+	(if ede-object
+	    ;; If we found a target, then PO is the
+	    ;; project to use.
+	    (set projsym po)
+	  ;; If there is no ede-object, then the projsym
+	  ;; is whichever part of the project is most local.
+	  (set projsym localpo))
+	))
+    ;; Return our findings.
     ede-object))
 
 (defmethod ede-target-in-project-p ((proj ede-project) target)
@@ -1738,14 +1067,6 @@
 	    projs (cdr projs)))
     ans))
 
-(defun ede-maybe-checkout (&optional buffer)
-  "Check BUFFER out of VC if necessary."
-  (save-excursion
-    (if buffer (set-buffer buffer))
-    (if (and buffer-read-only vc-mode
-	     (y-or-n-p "Checkout Makefile.am from VC? "))
-	(vc-toggle-read-only))))
-
 (defmethod ede-find-target ((proj ede-project) buffer)
   "Fetch the target in PROJ belonging to BUFFER or nil."
   (with-current-buffer buffer
@@ -1786,7 +1107,7 @@
 	(pl nil))
     (while bl
       (with-current-buffer (car bl)
-	(if (and ede-object (eq (ede-current-project) project))
+	(if (ede-buffer-belongs-to-project-p)
 	    (setq pl (cons (car bl) pl))))
       (setq bl (cdr bl)))
     pl))
@@ -1857,6 +1178,16 @@
 Return the first non-nil value returned by PROC."
   (eval (cons 'or (ede-map-targets this proc))))
 
+;;; VC Handling
+;;
+(defun ede-maybe-checkout (&optional buffer)
+  "Check BUFFER out of VC if necessary."
+  (save-excursion
+    (if buffer (set-buffer buffer))
+    (if (and buffer-read-only vc-mode
+	     (y-or-n-p "Checkout Makefile.am from VC? "))
+	(vc-toggle-read-only))))
+
 
 ;;; Some language specific methods.
 ;;
@@ -1913,7 +1244,7 @@
   (with-current-buffer buffer
     (dolist (v (oref project local-variables))
       (make-local-variable (car v))
-      ;; set it's value here?
+      ;; set its value here?
       (set (car v) (cdr v)))))
 
 (defun ede-set (variable value &optional proj)
@@ -1936,60 +1267,6 @@
   "Commit change to local variables in PROJ."
   nil)
 
-
-;;; Accessors for more complex types where oref is inappropriate.
-;;
-(defmethod ede-target-sourcecode ((this ede-target))
-  "Return the sourcecode objects which THIS permits."
-  (let ((sc (oref this sourcetype))
-	(rs nil))
-    (while (and (listp sc) sc)
-      (setq rs (cons (symbol-value (car sc)) rs)
-	    sc (cdr sc)))
-    rs))
-
-
-;;; Debugging.
-
-(defun ede-adebug-project ()
-  "Run adebug against the current EDE project.
-Display the results as a debug list."
-  (interactive)
-  (require 'data-debug)
-  (when (ede-current-project)
-    (data-debug-new-buffer "*Analyzer ADEBUG*")
-    (data-debug-insert-object-slots (ede-current-project) "")
-    ))
-
-(defun ede-adebug-project-parent ()
-  "Run adebug against the current EDE parent project.
-Display the results as a debug list."
-  (interactive)
-  (require 'data-debug)
-  (when (ede-parent-project)
-    (data-debug-new-buffer "*Analyzer ADEBUG*")
-    (data-debug-insert-object-slots (ede-parent-project) "")
-    ))
-
-(defun ede-adebug-project-root ()
-  "Run adebug against the current EDE parent project.
-Display the results as a debug list."
-  (interactive)
-  (require 'data-debug)
-  (when (ede-toplevel)
-    (data-debug-new-buffer "*Analyzer ADEBUG*")
-    (data-debug-insert-object-slots (ede-toplevel) "")
-    ))
-
-;;; Hooks & Autoloads
-;;
-;;  These let us watch various activities, and respond appropriately.
-
-;; (add-hook 'edebug-setup-hook
-;; 	  (lambda ()
-;; 	    (def-edebug-spec ede-with-projectfile
-;; 	      (form def-body))))
-
 (provide 'ede)
 
 ;; Include this last because it depends on ede.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/ede/auto.el	Thu Sep 23 15:00:31 2010 -0400
@@ -0,0 +1,128 @@
+;;; ede/auto.el --- Autoload features for EDE
+
+;; Copyright (C) 2010  Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <zappo@gnu.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; EDE Autoloads are a way to refer to different project types without
+;; loading those projects into Emacs.
+;;
+;; These routines are used to detect a project in a filesystem before
+;; handing over control to the usual EDE project system.
+
+;;; Code:
+
+(require 'eieio)
+
+(defclass ede-project-autoload ()
+  ((name :initarg :name
+	 :documentation "Name of this project type")
+   (file :initarg :file
+	 :documentation "The lisp file belonging to this class.")
+   (proj-file :initarg :proj-file
+	      :documentation "Name of a project file of this type.")
+   (proj-root :initarg :proj-root
+	      :type function
+	      :documentation "A function symbol to call for the project root.
+This function takes no arguments, and returns the current directories
+root, if available.  Leave blank to use the EDE directory walking
+routine instead.")
+   (initializers :initarg :initializers
+		 :initform nil
+		 :documentation
+		 "Initializers passed to the project object.
+These are used so there can be multiple types of projects
+associated with a single object class, based on the initilizeres used.")
+   (load-type :initarg :load-type
+	      :documentation "Fn symbol used to load this project file.")
+   (class-sym :initarg :class-sym
+	      :documentation "Symbol representing the project class to use.")
+   (new-p :initarg :new-p
+	  :initform t
+	  :documentation
+	  "Non-nil if this is an option when a user creates a project.")
+   )
+  "Class representing minimal knowledge set to run preliminary EDE functions.
+When more advanced functionality is needed from a project type, that projects
+type is required and the load function used.")
+
+(defvar ede-project-class-files
+  (list
+   (ede-project-autoload "edeproject-makefile"
+			 :name "Make" :file 'ede/proj
+			 :proj-file "Project.ede"
+			 :load-type 'ede-proj-load
+			 :class-sym 'ede-proj-project)
+   (ede-project-autoload "edeproject-automake"
+			 :name "Automake" :file 'ede/proj
+			 :proj-file "Project.ede"
+			 :initializers '(:makefile-type Makefile.am)
+			 :load-type 'ede-proj-load
+			 :class-sym 'ede-proj-project)
+   (ede-project-autoload "automake"
+			 :name "automake" :file 'ede/project-am
+			 :proj-file "Makefile.am"
+			 :load-type 'project-am-load
+			 :class-sym 'project-am-makefile
+			 :new-p nil))
+  "List of vectors defining how to determine what type of projects exist.")
+
+;;; EDE project-autoload methods
+;;
+(defmethod ede-project-root ((this ede-project-autoload))
+  "If a project knows its root, return it here.
+Allows for one-project-object-for-a-tree type systems."
+  nil)
+
+(defmethod ede-project-root-directory ((this ede-project-autoload)
+				       &optional file)
+  "If a project knows its root, return it here.
+Allows for one-project-object-for-a-tree type systems.
+Optional FILE is the file to test.  If there is no FILE, use
+the current buffer."
+  (when (not file)
+    (setq file default-directory))
+  (when (slot-boundp this :proj-root)
+    (let ((rootfcn (oref this proj-root)))
+      (when rootfcn
+	(condition-case nil
+	    (funcall rootfcn file)
+	  (error
+	   (funcall rootfcn)))
+	))))
+
+(defmethod ede-dir-to-projectfile ((this ede-project-autoload) dir)
+  "Return a full file name of project THIS found in DIR.
+Return nil if the project file does not exist."
+  (let* ((d (file-name-as-directory dir))
+	 (root (ede-project-root-directory this d))
+	 (pf (oref this proj-file))
+	 (f (cond ((stringp pf)
+		   (expand-file-name pf (or root d)))
+		  ((and (symbolp pf) (fboundp pf))
+		   (funcall pf (or root d)))))
+	 )
+    (when (and f (file-exists-p f))
+      f)))
+
+
+(provide 'ede/auto)
+
+;;; ede/auto.el ends here
--- a/lisp/cedet/ede/autoconf-edit.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/autoconf-edit.el	Thu Sep 23 15:00:31 2010 -0400
@@ -27,20 +27,8 @@
 
 ;;; Code:
 (require 'autoconf)
-
-(defvar autoconf-new-automake-string
-  "dnl Process this file with autoconf to produce a configure script
-
-AC_INIT(%s)
-AM_INIT_AUTOMAKE([%s], 0)
-AM_CONFIG_HEADER(config.h)
-
-dnl End the configure script.
-AC_OUTPUT(Makefile, [date > stamp-h] )\n"
-  "This string is used to initialize a new configure.in.
-The default is designed to be used with automake.
-The first %s will be filled with the test file.
-The second %s will be filled with the program name.")
+(declare-function ede-srecode-setup "ede/srecode")
+(declare-function ede-srecode-insert "ede/srecode")
 
 (defun autoconf-new-program (rootdir program testfile)
   "Initialize a new configure.in in ROOTDIR for PROGRAM using TESTFILE.
@@ -49,6 +37,7 @@
 TESTFILE is the file used with AC_INIT.
 configure the initial configure script using `autoconf-new-automake-string'"
   (interactive "DRoot Dir: \nsProgram: \nsTest File: ")
+  (require 'ede/srecode)
   (if (bufferp rootdir)
       (set-buffer rootdir)
     (let ((cf1 (expand-file-name "configure.in" rootdir))
@@ -62,7 +51,12 @@
       (find-file cf2)))
   ;; Note, we only ask about overwrite if a string/path is specified.
   (erase-buffer)
-  (insert (format autoconf-new-automake-string testfile program)))
+  (ede-srecode-setup)
+  (ede-srecode-insert
+   "file:ede-empty"
+   "TEST_FILE" testfile
+   "PROGRAM" program)
+  )
 
 (defvar autoconf-preferred-macro-order
   '("AC_INIT"
@@ -151,42 +145,44 @@
     (beginning-of-line)
     (looking-at (concat "\\(A[CM]_" macro "\\|" macro "\\)"))))
 
-(defun autoconf-find-last-macro (macro)
+(defun autoconf-find-last-macro (macro &optional ignore-bol)
   "Move to the last occurrence of MACRO in FILE, and return that point.
 The last macro is usually the one in which we would like to insert more
 items such as CHECK_HEADERS."
-  (let ((op (point)))
+  (let ((op (point)) (atbol (if ignore-bol "" "^")))
     (goto-char (point-max))
-    (if (re-search-backward (concat "^" (regexp-quote macro) "\\s-*\\((\\|$\\)") nil t)
+    (if (re-search-backward (concat atbol (regexp-quote macro) "\\s-*\\((\\|$\\)") nil t)
 	(progn
-	  (beginning-of-line)
+	  (unless ignore-bol (beginning-of-line))
 	  (point))
       (goto-char op)
       nil)))
 
 (defun autoconf-parameter-strip (param)
   "Strip the parameter PARAM  of whitespace and miscellaneous characters."
-  (when (string-match "^\\s-*\\[?\\s-*" param)
+  ;; force greedy match for \n.
+  (when (string-match "\\`\n*\\s-*\\[?\\s-*" param)
     (setq param (substring param (match-end 0))))
-  (when (string-match "\\s-*\\]?\\s-*$" param)
+  (when (string-match "\\s-*\\]?\\s-*\\'" param)
     (setq param (substring param 0  (match-beginning 0))))
   param)
 
-(defun autoconf-parameters-for-macro (macro)
+(defun autoconf-parameters-for-macro (macro &optional ignore-bol ignore-case)
   "Retrieve the parameters to MACRO.
 Returns a list of the arguments passed into MACRO as strings."
-  (save-excursion
-    (when (autoconf-find-last-macro macro)
-      (forward-sexp 1)
-      (mapcar
-       #'autoconf-parameter-strip
-       (when (looking-at "(")
-	 (let* ((start (+ (point) 1))
-		(end (save-excursion
-		       (forward-sexp 1)
-		       (- (point) 1)))
-		(ans (buffer-substring-no-properties start end)))
-	   (split-string ans "," t)))))))
+  (let ((case-fold-search ignore-case))
+    (save-excursion
+      (when (autoconf-find-last-macro macro ignore-bol)
+	(forward-sexp 1)
+	(mapcar
+	 #'autoconf-parameter-strip
+	 (when (looking-at "(")
+	   (let* ((start (+ (point) 1))
+		  (end (save-excursion
+			 (forward-sexp 1)
+			 (- (point) 1)))
+		  (ans (buffer-substring-no-properties start end)))
+	     (split-string ans "," t))))))))
 
 (defun autoconf-position-for-macro (macro)
   "Position the cursor where a new MACRO could be inserted.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/ede/base.el	Thu Sep 23 15:00:31 2010 -0400
@@ -0,0 +1,636 @@
+;;; ede/base.el --- Baseclasses for EDE.
+
+;; Copyright (C) 2010  Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <zappo@gnu.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Baseclasses for EDE.
+;;
+;; Contains all the base structures needed by EDE.
+
+;;; Code:
+(require 'eieio)
+(require 'eieio-speedbar)
+(require 'ede/auto)
+
+;; Defined in ede.el:
+(defvar ede-projects)
+(defvar ede-object)
+(defvar ede-object-root-project)
+
+(declare-function data-debug-new-buffer "data-debug")
+(declare-function data-debug-insert-object-slots "eieio-datadebug")
+(declare-function ede-parent-project "ede" (&optional obj))
+(declare-function ede-current-project "ede" (&optional dir))
+
+;;; TARGET
+;;
+;; The TARGET is an entity in a project that knows about files
+;; and features of those files.
+
+(defclass ede-target (eieio-speedbar-directory-button)
+  ((buttonface :initform speedbar-file-face) ;override for superclass
+   (name :initarg :name
+	 :type string
+	 :custom string
+	 :label "Name"
+	 :group (default name)
+	 :documentation "Name of this target.")
+   ;; @todo - I think this should be "dir", and not "path".
+   (path :initarg :path
+	 :type string
+	 ;:custom string
+	 ;:label "Path to target"
+	 ;:group (default name)
+	 :documentation "The path to the sources of this target.
+Relative to the path of the project it belongs to.")
+   (source :initarg :source
+	   :initform nil
+	   ;; I'd prefer a list of strings.
+	   :type list
+	   :custom (repeat (string :tag "File"))
+	   :label "Source Files"
+	   :group (default source)
+	   :documentation "Source files in this target.")
+   (versionsource :initarg :versionsource
+		  :initform nil
+		  :type list
+		  :custom (repeat (string :tag "File"))
+		  :label "Source Files with Version String"
+		  :group (source)
+		  :documentation
+		  "Source files with a version string in them.
+These files are checked for a version string whenever the EDE version
+of the master project is changed.  When strings are found, the version
+previously there is updated.")
+   ;; Class level slots
+   ;;
+   (sourcetype :allocation :class
+	       :type list ;; list of symbols
+	       :documentation
+	       "A list of `ede-sourcecode' objects this class will handle.
+This is used to match target objects with the compilers they can use, and
+which files this object is interested in."
+	       :accessor ede-object-sourcecode)
+   (keybindings :allocation :class
+		:initform (("D" . ede-debug-target))
+		:documentation
+"Keybindings specialized to this type of target."
+		:accessor ede-object-keybindings)
+   (menu :allocation :class
+	 :initform ( [ "Debug target" ede-debug-target
+		       (ede-buffer-belongs-to-target-p) ]
+		     [ "Run target" ede-run-target
+		       (ede-buffer-belongs-to-target-p) ]
+		     )
+	 :documentation "Menu specialized to this type of target."
+	 :accessor ede-object-menu)
+   )
+  "A target is a structure that describes a file set that produces something.
+Targets, as with 'Make', is an entity that will manage a file set
+and knows how to compile or otherwise transform those files into some
+other desired outcome.")
+
+;;; PROJECT/PLACEHOLDER
+;;
+;; Project placeholders are minimum parts of a project used
+;; by the project cache.  The project cache can refer to these placeholders,
+;; and swap them out with the real-deal when that project is loaded.
+;;
+(defclass ede-project-placeholder (eieio-speedbar-directory-button)
+  ((name :initarg :name
+	 :initform "Untitled"
+	 :type string
+	 :custom string
+	 :label "Name"
+	 :group (default name)
+	 :documentation "The name used when generating distribution files.")
+   (version :initarg :version
+	    :initform "1.0"
+	    :type string
+	    :custom string
+	    :label "Version"
+	    :group (default name)
+	    :documentation "The version number used when distributing files.")
+   (directory :type string
+	      :initarg :directory
+	      :documentation "Directory this project is associated with.")
+   (dirinode :documentation "The inode id for :directory.")
+   (file :type string
+	 :initarg :file
+	 :documentation "File name where this project is stored.")
+   (rootproject ; :initarg - no initarg, don't save this slot!
+    :initform nil
+    :type (or null ede-project-placeholder-child)
+    :documentation "Pointer to our root project.")
+   )
+  "Placeholder object for projects not loaded into memory.
+Projects placeholders will be stored in a user specific location
+and querying them will cause the actual project to get loaded.")
+
+;;; PROJECT
+;;
+;; An EDE project controls a set of TARGETS, and can also contain
+;; multiple SUBPROJECTS.
+;;
+;; The project defines a set of features that need to be built from
+;; files, in addition as to controlling what to do with the file set,
+;; such as creating distributions, compilation, and web sites.
+;;
+;; Projects can also affect how EDE works, by changing what appears in
+;; the EDE menu, or how some keys are bound.
+;;
+(defclass ede-project (ede-project-placeholder)
+  ((subproj :initform nil
+	    :type list
+	    :documentation "Sub projects controlled by this project.
+For Automake based projects, each directory is treated as a project.")
+   (targets :initarg :targets
+	    :type list
+	    :custom (repeat (object :objectcreatefcn ede-new-target-custom))
+	    :label "Local Targets"
+	    :group (targets)
+	    :documentation "List of top level targets in this project.")
+   (locate-obj :type (or null ede-locate-base-child)
+	       :documentation
+	       "A locate object to use as a backup to `ede-expand-filename'.")
+   (tool-cache :initarg :tool-cache
+	       :type list
+	       :custom (repeat object)
+	       :label "Tool: "
+	       :group tools
+	       :documentation "List of tool cache configurations in this project.
+This allows any tool to create, manage, and persist project-specific settings.")
+   (mailinglist :initarg :mailinglist
+		:initform ""
+		:type string
+		:custom string
+		:label "Mailing List Address"
+		:group name
+		:documentation
+		"An email address where users might send email for help.")
+   (web-site-url :initarg :web-site-url
+		 :initform ""
+		 :type string
+		 :custom string
+		 :label "Web Site URL"
+		 :group name
+		 :documentation "URL to this projects web site.
+This is a URL to be sent to a web site for documentation.")
+   (web-site-directory :initarg :web-site-directory
+		       :initform ""
+		       :custom string
+		       :label "Web Page Directory"
+		       :group name
+		       :documentation
+		       "A directory where web pages can be found by Emacs.
+For remote locations use a path compatible with ange-ftp or EFS.
+You can also use TRAMP for use with rcp & scp.")
+   (web-site-file :initarg :web-site-file
+		  :initform ""
+		  :custom string
+		  :label "Web Page File"
+		  :group name
+		  :documentation
+		  "A file which contains the home page for this project.
+This file can be relative to slot `web-site-directory'.
+This can be a local file, use ange-ftp, EFS, or TRAMP.")
+   (ftp-site :initarg :ftp-site
+	     :initform ""
+	     :type string
+	     :custom string
+	     :label "FTP site"
+	     :group name
+	     :documentation
+	     "FTP site where this project's distribution can be found.
+This FTP site should be in Emacs form, as needed by `ange-ftp', but can
+also be of a form used by TRAMP for use with scp, or rcp.")
+   (ftp-upload-site :initarg :ftp-upload-site
+		    :initform ""
+		    :type string
+		    :custom string
+		    :label "FTP Upload site"
+		    :group name
+		    :documentation
+		    "FTP Site to upload new distributions to.
+This FTP site should be in Emacs form as needed by `ange-ftp'.
+If this slot is nil, then use `ftp-site' instead.")
+   (configurations :initarg :configurations
+		   :initform ("debug" "release")
+		   :type list
+		   :custom (repeat string)
+		   :label "Configuration Options"
+		   :group (settings)
+		   :documentation "List of available configuration types.
+Individual target/project types can form associations between a configuration,
+and target specific elements such as build variables.")
+   (configuration-default :initarg :configuration-default
+			  :initform "debug"
+			  :custom string
+			  :label "Current Configuration"
+			  :group (settings)
+			  :documentation "The default configuration.")
+   (local-variables :initarg :local-variables
+		    :initform nil
+		    :custom (repeat (cons (sexp :tag "Variable")
+					  (sexp :tag "Value")))
+		    :label "Project Local Variables"
+		    :group (settings)
+		    :documentation "Project local variables")
+   (keybindings :allocation :class
+		:initform (("D" . ede-debug-target)
+			   ("R" . ede-run-target))
+		:documentation "Keybindings specialized to this type of target."
+		:accessor ede-object-keybindings)
+   (menu :allocation :class
+	 :initform
+	 (
+	  [ "Update Version" ede-update-version ede-object ]
+	  [ "Version Control Status" ede-vc-project-directory ede-object ]
+	  [ "Edit Project Homepage" ede-edit-web-page
+	    (and ede-object (oref (ede-toplevel) web-site-file)) ]
+	  [ "Browse Project URL" ede-web-browse-home
+	    (and ede-object
+		 (not (string= "" (oref (ede-toplevel) web-site-url)))) ]
+	  "--"
+	  [ "Rescan Project Files" ede-rescan-toplevel t ]
+	  [ "Edit Projectfile" ede-edit-file-target
+	    (ede-buffer-belongs-to-project-p) ]
+	  )
+	 :documentation "Menu specialized to this type of target."
+	 :accessor ede-object-menu)
+   )
+  "Top level EDE project specification.
+All specific project types must derive from this project."
+  :method-invocation-order :depth-first)
+
+;;; Important macros for doing commands.
+;;
+(defmacro ede-with-projectfile (obj &rest forms)
+  "For the project in which OBJ resides, execute FORMS."
+  (list 'save-window-excursion
+	(list 'let* (list
+		     (list 'pf
+			   (list 'if (list 'obj-of-class-p
+					   obj 'ede-target)
+				 ;; @todo -I think I can change
+				 ;; this to not need ede-load-project-file
+				 ;; but I'm not sure how to test well.
+				 (list 'ede-load-project-file
+				       (list 'oref obj 'path))
+				 obj))
+		     '(dbka (get-file-buffer (oref pf file))))
+	      '(if (not dbka) (find-file (oref pf file))
+		 (switch-to-buffer dbka))
+	      (cons 'progn forms)
+	      '(if (not dbka) (kill-buffer (current-buffer))))))
+(put 'ede-with-projectfile 'lisp-indent-function 1)
+
+;;; The EDE persistent cache.
+;;
+;; The cache is a way to mark where all known projects live without
+;; loading those projects into memory, or scanning for them each time
+;; emacs starts.
+;;
+(defcustom ede-project-placeholder-cache-file
+  (locate-user-emacs-file "ede-projects.el" ".projects.ede")
+  "File containing the list of projects EDE has viewed."
+  :group 'ede
+  :type 'file)
+
+(defvar ede-project-cache-files nil
+  "List of project files EDE has seen before.")
+
+(defun ede-save-cache ()
+  "Save a cache of EDE objects that Emacs has seen before."
+  (interactive)
+  (let ((p ede-projects)
+	(c ede-project-cache-files)
+	(recentf-exclude '( (lambda (f) t) ))
+	)
+    (condition-case nil
+	(progn
+	  (set-buffer (find-file-noselect ede-project-placeholder-cache-file t))
+	  (erase-buffer)
+	  (insert ";; EDE project cache file.
+;; This contains a list of projects you have visited.\n(")
+	  (while p
+	    (when (and (car p) (ede-project-p p))
+	      (let ((f (oref (car p) file)))
+		(when (file-exists-p f)
+		  (insert "\n  \"" f "\""))))
+	    (setq p (cdr p)))
+	  (while c
+	    (insert "\n \"" (car c) "\"")
+	    (setq c (cdr c)))
+	  (insert "\n)\n")
+	  (condition-case nil
+	      (save-buffer 0)
+	    (error
+	     (message "File %s could not be saved."
+		      ede-project-placeholder-cache-file)))
+	  (kill-buffer (current-buffer))
+	  )
+      (error
+       (message "File %s could not be read."
+	       	ede-project-placeholder-cache-file))
+
+      )))
+
+(defun ede-load-cache ()
+  "Load the cache of EDE projects."
+  (save-excursion
+    (let ((cachebuffer nil))
+      (condition-case nil
+	  (progn
+	    (setq cachebuffer
+		  (find-file-noselect ede-project-placeholder-cache-file t))
+	    (set-buffer cachebuffer)
+	    (goto-char (point-min))
+	    (let ((c (read (current-buffer)))
+		  (new nil)
+		  (p ede-projects))
+	      ;; Remove loaded projects from the cache.
+	      (while p
+		(setq c (delete (oref (car p) file) c))
+		(setq p (cdr p)))
+	      ;; Remove projects that aren't on the filesystem
+	      ;; anymore.
+	      (while c
+		(when (file-exists-p (car c))
+		  (setq new (cons (car c) new)))
+		(setq c (cdr c)))
+	      ;; Save it
+	      (setq ede-project-cache-files (nreverse new))))
+	(error nil))
+      (when cachebuffer (kill-buffer cachebuffer))
+      )))
+
+;;; Get the cache usable.
+
+;; @TODO - Remove this cache setup, or use this for something helpful.
+;;(add-hook 'kill-emacs-hook 'ede-save-cache)
+;;(when (not noninteractive)
+;;  ;; No need to load the EDE cache if we aren't interactive.
+;;  ;; This occurs during batch byte-compiling of other tools.
+;;  (ede-load-cache))
+
+
+;;; METHODS
+;;
+;; The methods in ede-base handle project related behavior, and DO NOT
+;; related to EDE mode commands directory, such as keybindings.
+;;
+;; Mode related methods are in ede.el.  These methods are related
+;; project specific activities not directly tied to a keybinding.
+(defmethod ede-subproject-relative-path ((proj ede-project) &optional parent-in)
+  "Get a path name for PROJ which is relative to the parent project.
+If PARENT is specified, then be relative to the PARENT project.
+Specifying PARENT is useful for sub-sub projects relative to the root project."
+  (let* ((parent (or parent-in (ede-parent-project proj)))
+	 (dir (file-name-directory (oref proj file))))
+    (if (and parent (not (eq parent proj)))
+	(file-relative-name dir (file-name-directory (oref parent file)))
+      "")))
+
+(defmethod ede-subproject-p ((proj ede-project))
+  "Return non-nil if PROJ is a sub project."
+  ;; @TODO - Use this in more places, and also pay attention to
+  ;; metasubproject in ede-proj.el
+  (ede-parent-project proj))
+
+
+;;; Default descriptive methods for EDE classes
+;;
+;; These are methods which you might want to override, but there is
+;; no need to in most situations because they are either a) simple, or
+;; b) cosmetic.
+
+(defmethod ede-name ((this ede-target))
+  "Return the name of THIS target."
+  (oref this name))
+
+(defmethod ede-target-name ((this ede-target))
+  "Return the name of THIS target, suitable for make or debug style commands."
+  (oref this name))
+
+(defmethod ede-name ((this ede-project))
+  "Return a short-name for THIS project file.
+Do this by extracting the lowest directory name."
+  (oref this name))
+
+(defmethod ede-description ((this ede-project))
+  "Return a description suitable for the minibuffer about THIS."
+  (format "Project %s: %d subprojects, %d targets."
+	  (ede-name this) (length (oref this subproj))
+	  (length (oref this targets))))
+
+(defmethod ede-description ((this ede-target))
+  "Return a description suitable for the minibuffer about THIS."
+  (format "Target %s: with %d source files."
+	  (ede-name this) (length (oref this source))))
+
+;;; HEADERS/DOC
+;;
+;; Targets and projects are often associated with other files, such as
+;; header files, documentation files and the like.  Have strong
+;; associations can make useful user commands to quickly navigate
+;; between the files base on their assocaitions.
+;;
+(defun ede-header-file ()
+  "Return the header file for the current buffer.
+Not all buffers need headers, so return nil if no applicable."
+  (if ede-object
+      (ede-buffer-header-file ede-object (current-buffer))
+    nil))
+
+(defmethod ede-buffer-header-file ((this ede-project) buffer)
+  "Return nil, projects don't have header files."
+  nil)
+
+(defmethod ede-buffer-header-file ((this ede-target) buffer)
+  "There are no default header files in EDE.
+Do a quick check to see if there is a Header tag in this buffer."
+  (with-current-buffer buffer
+    (if (re-search-forward "::Header:: \\([a-zA-Z0-9.]+\\)" nil t)
+	(buffer-substring-no-properties (match-beginning 1)
+					(match-end 1))
+      (let ((src (ede-target-sourcecode this))
+	    (found nil))
+	(while (and src (not found))
+	  (setq found (ede-buffer-header-file (car src) (buffer-file-name))
+		src (cdr src)))
+	found))))
+
+(defun ede-documentation-files ()
+  "Return the documentation files for the current buffer.
+Not all buffers need documentations, so return nil if no applicable.
+Some projects may have multiple documentation files, so return a list."
+  (if ede-object
+      (ede-buffer-documentation-files ede-object (current-buffer))
+    nil))
+
+(defmethod ede-buffer-documentation-files ((this ede-project) buffer)
+  "Return all documentation in project THIS based on BUFFER."
+  ;; Find the info node.
+  (ede-documentation this))
+
+(defmethod ede-buffer-documentation-files ((this ede-target) buffer)
+  "Check for some documentation files for THIS.
+Also do a quick check to see if there is a Documentation tag in this BUFFER."
+  (with-current-buffer buffer
+    (if (re-search-forward "::Documentation:: \\([a-zA-Z0-9.]+\\)" nil t)
+	(buffer-substring-no-properties (match-beginning 1)
+					(match-end 1))
+      ;; Check the master project
+      (let ((cp (ede-toplevel)))
+	(ede-buffer-documentation-files cp (current-buffer))))))
+
+(defmethod ede-documentation ((this ede-project))
+  "Return a list of files that provide documentation.
+Documentation is not for object THIS, but is provided by THIS for other
+files in the project."
+  (let ((targ (oref this targets))
+	(proj (oref this subproj))
+	(found nil))
+    (while targ
+      (setq found (append (ede-documentation (car targ)) found)
+	    targ (cdr targ)))
+    (while proj
+      (setq found (append (ede-documentation (car proj)) found)
+	    proj (cdr proj)))
+    found))
+
+(defmethod ede-documentation ((this ede-target))
+  "Return a list of files that provide documentation.
+Documentation is not for object THIS, but is provided by THIS for other
+files in the project."
+  nil)
+
+(defun ede-html-documentation-files ()
+  "Return a list of HTML documentation files associated with this project."
+  (ede-html-documentation (ede-toplevel))
+  )
+
+(defmethod ede-html-documentation ((this ede-project))
+  "Return a list of HTML files provided by project THIS."
+
+  )
+
+;;; Default "WANT" methods.
+;;
+;; These methods are used to determine if a target "wants", or could
+;; somehow handle a file, or some source type.
+;;
+(defmethod ede-want-file-p ((this ede-target) file)
+  "Return non-nil if THIS target wants FILE."
+  ;; By default, all targets reference the source object, and let it decide.
+  (let ((src (ede-target-sourcecode this)))
+    (while (and src (not (ede-want-file-p (car src) file)))
+      (setq src (cdr src)))
+    src))
+
+(defmethod ede-want-file-source-p ((this ede-target) file)
+  "Return non-nil if THIS target wants FILE."
+  ;; By default, all targets reference the source object, and let it decide.
+  (let ((src (ede-target-sourcecode this)))
+    (while (and src (not (ede-want-file-source-p (car src) file)))
+      (setq src (cdr src)))
+    src))
+
+(defmethod ede-target-sourcecode ((this ede-target))
+  "Return the sourcecode objects which THIS permits."
+  (let ((sc (oref this sourcetype))
+	(rs nil))
+    (while (and (listp sc) sc)
+      (setq rs (cons (symbol-value (car sc)) rs)
+	    sc (cdr sc)))
+    rs))
+
+
+;;; Debugging.
+;;
+(defun ede-adebug-project ()
+  "Run adebug against the current EDE project.
+Display the results as a debug list."
+  (interactive)
+  (require 'data-debug)
+  (when (ede-current-project)
+    (data-debug-new-buffer "*Analyzer ADEBUG*")
+    (data-debug-insert-object-slots (ede-current-project) "")
+    ))
+
+(defun ede-adebug-project-parent ()
+  "Run adebug against the current EDE parent project.
+Display the results as a debug list."
+  (interactive)
+  (require 'data-debug)
+  (when (ede-parent-project)
+    (data-debug-new-buffer "*Analyzer ADEBUG*")
+    (data-debug-insert-object-slots (ede-parent-project) "")
+    ))
+
+(defun ede-adebug-project-root ()
+  "Run adebug against the current EDE parent project.
+Display the results as a debug list."
+  (interactive)
+  (require 'data-debug)
+  (when (ede-toplevel)
+    (data-debug-new-buffer "*Analyzer ADEBUG*")
+    (data-debug-insert-object-slots (ede-toplevel) "")
+    ))
+
+
+
+;;; TOPLEVEL PROJECT
+;;
+;; The toplevel project is a way to identify the EDE structure that belongs
+;; to the top of a project.
+
+(defun ede-toplevel (&optional subproj)
+  "Return the ede project which is the root of the current project.
+Optional argument SUBPROJ indicates a subproject to start from
+instead of the current project."
+  (or ede-object-root-project
+      (let* ((cp (or subproj (ede-current-project))))
+	(or (and cp (ede-project-root cp))
+	    (progn
+	      (while (ede-parent-project cp)
+		(setq cp (ede-parent-project cp)))
+	      cp)))))
+
+
+;;; Hooks & Autoloads
+;;
+;;  These let us watch various activities, and respond appropriately.
+
+;; (add-hook 'edebug-setup-hook
+;; 	  (lambda ()
+;; 	    (def-edebug-spec ede-with-projectfile
+;; 	      (form def-body))))
+
+(provide 'ede/base)
+
+;; Local variables:
+;; generated-autoload-file: "loaddefs.el"
+;; generated-autoload-load-name: "ede/base"
+;; End:
+
+;;; ede/base.el ends here
--- a/lisp/cedet/ede/cpp-root.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/cpp-root.el	Thu Sep 23 15:00:31 2010 -0400
@@ -237,6 +237,18 @@
   ;; Snoop through our master list.
   (ede-cpp-root-file-existing dir))
 
+;;;###autoload
+(add-to-list 'ede-project-class-files
+	     (ede-project-autoload "cpp-root"
+	      :name "CPP ROOT"
+	      :file 'ede-cpp-root
+	      :proj-file 'ede-cpp-root-project-file-for-dir
+	      :proj-root 'ede-cpp-root-project-root
+	      :load-type 'ede-cpp-root-load
+	      :class-sym 'ede-cpp-root
+	      :new-p nil)
+	     t)
+
 ;;; CLASSES
 ;;
 ;; EDE sets up projects with two kinds of objects.
@@ -504,6 +516,21 @@
   "Get the pre-processor map for project THIS."
   (ede-preprocessor-map  (ede-target-parent this)))
 
+;;; Quick Hack
+(defun ede-create-lots-of-projects-under-dir (dir projfile &rest attributes)
+  "Create a bunch of projects under directory DIR.
+PROJFILE is a file name sans directory that indicates a subdirectory
+is a project directory.
+Generic ATTRIBUTES, such as :include-path can be added.
+Note: This needs some work."
+  (let ((files (directory-files dir t)))
+    (dolist (F files)
+      (if (file-exists-p (expand-file-name projfile F))
+	  `(ede-cpp-root-project (file-name-nondirectory F)
+				 :name (file-name-nondirectory F)
+				 :file (expand-file-name projfile F)
+				 attributes)))))
+
 (provide 'ede/cpp-root)
 
 ;; Local variables:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/ede/custom.el	Thu Sep 23 15:00:31 2010 -0400
@@ -0,0 +1,215 @@
+;;; ede.el --- customization of EDE projects.
+
+;; Copyright (C) 2010  Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <zappo@gnu.org>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Customization commands/hooks for EDE.
+;;
+;; EIEIO supports customizing objects, and EDE uses this to allow
+;; users to change basic settings in their projects.
+;;
+
+;;; Code:
+;;; Customization
+;;
+;; Routines for customizing projects and targets.
+
+(require 'ede)
+(eval-when-compile (require 'eieio-custom))
+
+(defvar eieio-ede-old-variables nil
+  "The old variables for a project.")
+
+;;; Customization Commands
+;;
+;; These commands initialize custoization of EDE control objects.
+
+;;;###autoload
+(defun ede-customize-project ()
+  "Edit fields of the current project through EIEIO & Custom."
+  (interactive)
+  (require 'eieio-custom)
+  (let* ((ov (oref (ede-current-project) local-variables))
+	 (cp (ede-current-project)))
+    (ede-customize cp)
+    (make-local-variable 'eieio-ede-old-variables)
+    (setq eieio-ede-old-variables ov)))
+
+;;;###autoload
+(defalias 'customize-project 'ede-customize-project)
+
+;;;###autoload
+(defun ede-customize-current-target()
+  "Edit fields of the current target through EIEIO & Custom."
+  (interactive)
+  (require 'eieio-custom)
+  (if (not (obj-of-class-p ede-object ede-target))
+      (error "Current file is not part of a target"))
+  (ede-customize-target ede-object))
+
+;;;###autoload
+(defalias 'customize-target 'ede-customize-current-target)
+
+(defun ede-customize-target (obj)
+  "Edit fields of the current target through EIEIO & Custom.
+OBJ is the target object to customize."
+  (require 'eieio-custom)
+  (if (and obj (not (obj-of-class-p obj ede-target)))
+      (error "No logical target to customize"))
+  (ede-customize obj))
+
+(defmethod ede-customize ((proj ede-project))
+  "Customize the EDE project PROJ."
+  (eieio-customize-object proj 'default))
+
+(defmethod ede-customize ((target ede-target))
+  "Customize the EDE TARGET."
+  (eieio-customize-object target 'default))
+
+;;; Target Sorting
+;;
+;; Target order can be important, but custom doesn't support a way
+;; to resort items in a list.  This function by David Engster allows
+;; targets to be re-arranged.
+
+(defvar ede-project-sort-targets-order nil
+  "Variable for tracking target order in `ede-project-sort-targets'.")
+
+;;;###autoload
+(defun ede-project-sort-targets ()
+  "Create a custom-like buffer for sorting targets of current project."
+  (interactive)
+  (let ((proj (ede-current-project))
+        (count 1)
+        current order)
+    (switch-to-buffer (get-buffer-create "*EDE sort targets*"))
+    (erase-buffer)
+    (setq ede-object-project proj)
+    (widget-create 'push-button
+                   :notify (lambda (&rest ignore)
+                             (let ((targets (oref ede-object-project targets))
+                                   cur newtargets)
+                               (while (setq cur (pop ede-project-sort-targets-order))
+                                 (setq newtargets (append newtargets
+                                                          (list (nth cur targets)))))
+                               (oset ede-object-project targets newtargets))
+                             (ede-commit-project ede-object-project)
+                             (kill-buffer))
+                   " Accept ")
+    (widget-insert "   ")
+    (widget-create 'push-button
+                   :notify (lambda (&rest ignore)
+			     (kill-buffer))
+                   " Cancel ")
+    (widget-insert "\n\n")
+    (setq ede-project-sort-targets-order nil)
+    (mapc (lambda (x)
+            (add-to-ordered-list
+             'ede-project-sort-targets-order
+             x x))
+          (number-sequence 0 (1- (length (oref proj targets)))))
+    (ede-project-sort-targets-list)
+    (use-local-map widget-keymap)
+    (widget-setup)
+    (goto-char (point-min))))
+
+(defun ede-project-sort-targets-list ()
+  "Sort the target list while using `ede-project-sort-targets'."
+  (save-excursion
+    (let ((count 0)
+          (targets (oref ede-object-project targets))
+          (inhibit-read-only t)
+          (inhibit-modification-hooks t))
+      (goto-char (point-min))
+      (forward-line 2)
+      (delete-region (point) (point-max))
+      (while (< count (length targets))
+        (if (> count 0)
+            (widget-create 'push-button
+                           :notify `(lambda (&rest ignore)
+                                      (let ((cur ede-project-sort-targets-order))
+                                        (add-to-ordered-list
+                                         'ede-project-sort-targets-order
+                                         (nth ,count cur)
+                                         (1- ,count))
+                                        (add-to-ordered-list
+                                         'ede-project-sort-targets-order
+                                         (nth (1- ,count) cur) ,count))
+                                      (ede-project-sort-targets-list))
+                           " Up ")
+          (widget-insert "      "))
+        (if (< count (1- (length targets)))
+            (widget-create 'push-button
+                           :notify `(lambda (&rest ignore)
+                                      (let ((cur ede-project-sort-targets-order))
+                                        (add-to-ordered-list
+                                         'ede-project-sort-targets-order
+                                         (nth ,count cur) (1+ ,count))
+                                        (add-to-ordered-list
+                                         'ede-project-sort-targets-order
+                                         (nth (1+ ,count) cur) ,count))
+                                      (ede-project-sort-targets-list))
+                           " Down ")
+          (widget-insert "        "))
+        (widget-insert (concat " " (number-to-string (1+ count)) ".:   "
+                               (oref (nth (nth count ede-project-sort-targets-order)
+                                          targets) name) "\n"))
+        (setq count (1+ count))))))
+
+;;; Customization hooks
+;;
+;; These hooks are used when finishing up a customization.
+(defmethod eieio-done-customizing ((proj ede-project))
+  "Call this when a user finishes customizing PROJ."
+  (let ((ov eieio-ede-old-variables)
+	(nv (oref proj local-variables)))
+    (setq eieio-ede-old-variables nil)
+    (while ov
+      (if (not (assoc (car (car ov)) nv))
+	  (save-excursion
+	    (mapc (lambda (b)
+		    (set-buffer b)
+		    (kill-local-variable (car (car ov))))
+		  (ede-project-buffers proj))))
+      (setq ov (cdr ov)))
+    (mapc (lambda (b) (ede-set-project-variables proj b))
+	  (ede-project-buffers proj))))
+
+;; These two methods should be implemented by subclasses of
+;; project and targets in order to account for user specified
+;; changes.
+(defmethod eieio-done-customizing ((target ede-target))
+  "Call this when a user finishes customizing TARGET."
+  nil)
+
+(defmethod ede-commit-project ((proj ede-project))
+  "Commit any change to PROJ to its file."
+  nil
+  )
+
+(provide 'ede/custom)
+
+;; Local variables:
+;; generated-autoload-file: "loaddefs.el"
+;; generated-autoload-load-name: "ede/custom"
+;; End:
+
+;;; ede/custom.el ends here
--- a/lisp/cedet/ede/dired.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/dired.el	Thu Sep 23 15:00:31 2010 -0400
@@ -76,11 +76,11 @@
 				     "Add files to Target: "))))
   (dolist (file (dired-get-marked-files t))
     (project-add-file target file)
-    ;; Find the buffer for this files, and set it's ede-object
+    ;; Find the buffer for this files, and set its ede-object
     (if (get-file-buffer file)
-        (with-current-buffer (get-file-buffer file)
-          (setq ede-object nil)
-          (setq ede-object (ede-buffer-object (current-buffer)))))))
+	(with-current-buffer (get-file-buffer file)
+	  (setq ede-object nil)
+	  (setq ede-object (ede-buffer-object (current-buffer)))))))
 
 (provide 'ede/dired)
 
--- a/lisp/cedet/ede/emacs.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/emacs.el	Thu Sep 23 15:00:31 2010 -0400
@@ -133,6 +133,18 @@
       )
   )
 
+;;;###autoload
+(add-to-list 'ede-project-class-files
+	     (ede-project-autoload "emacs"
+	      :name "EMACS ROOT"
+	      :file 'ede-emacs
+	      :proj-file "src/emacs.c"
+	      :proj-root 'ede-emacs-project-root
+	      :load-type 'ede-emacs-load
+	      :class-sym 'ede-emacs-project
+	      :new-p nil)
+	     t)
+
 (defclass ede-emacs-target-c (ede-target)
   ()
   "EDE Emacs Project target for C code.
@@ -150,7 +162,7 @@
 
 (defmethod initialize-instance ((this ede-emacs-project)
 				&rest fields)
-  "Make sure the :file is fully expanded."
+  "Make sure the targets slot is bound."
   (call-next-method)
   (unless (slot-boundp this 'targets)
     (oset this :targets nil)))
--- a/lisp/cedet/ede/files.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/files.el	Thu Sep 23 15:00:31 2010 -0400
@@ -38,6 +38,7 @@
 (declare-function ede-locate-file-in-hash "ede/locate")
 (declare-function ede-locate-add-file-to-hash "ede/locate")
 (declare-function ede-locate-file-in-project "ede/locate")
+(declare-function ede-locate-flush-hash "ede/locate")
 
 (defvar ede--disable-inode nil
   "Set to 't' to simulate systems w/out inode support.")
@@ -57,44 +58,29 @@
 	     (ede-project-root-directory (ede-current-project))))
     (find-file fname)))
 
+(defun ede-flush-project-hash ()
+  "Flush the file locate hash for the current project."
+  (interactive)
+  (require 'ede/locate)
+  (let* ((loc (ede-get-locator-object (ede-current-project))))
+    (ede-locate-flush-hash loc)))
+
 ;;; Placeholders for ROOT directory scanning on base objects
 ;;
 (defmethod ede-project-root ((this ede-project-placeholder))
-  "If a project knows it's root, return it here.
+  "If a project knows its root, return it here.
 Allows for one-project-object-for-a-tree type systems."
   (oref this rootproject))
 
 (defmethod ede-project-root-directory ((this ede-project-placeholder)
 				       &optional file)
-  "If a project knows it's root, return it here.
+  "If a project knows its root, return it here.
 Allows for one-project-object-for-a-tree type systems.
 Optional FILE is the file to test.  It is ignored in preference
 of the anchor file for the project."
   (file-name-directory (expand-file-name (oref this file))))
 
 
-(defmethod ede-project-root ((this ede-project-autoload))
-  "If a project knows it's root, return it here.
-Allows for one-project-object-for-a-tree type systems."
-  nil)
-
-(defmethod ede-project-root-directory ((this ede-project-autoload)
-				       &optional file)
-  "If a project knows it's root, return it here.
-Allows for one-project-object-for-a-tree type systems.
-Optional FILE is the file to test.  If there is no FILE, use
-the current buffer."
-  (when (not file)
-    (setq file default-directory))
-  (when (slot-boundp this :proj-root)
-    (let ((rootfcn (oref this proj-root)))
-      (when rootfcn
-	(condition-case nil
-	    (funcall rootfcn file)
-	  (error
-	   (funcall rootfcn)))
-	))))
-
 (defmethod ede--project-inode ((proj ede-project-placeholder))
   "Get the inode of the directory project PROJ is in."
   (if (slot-boundp proj 'dirinode)
@@ -262,27 +248,30 @@
 (defun ede-directory-project-p (dir &optional force)
   "Return a project description object if DIR has a project.
 Optional argument FORCE means to ignore a hash-hit of 'nomatch.
-This depends on an up to date `ede-project-class-files' variable."
-  (let* ((dirtest (expand-file-name dir))
-	 (match (ede-directory-project-from-hash dirtest)))
-    (cond
-     ((and (eq match 'nomatch) (not force))
-      nil)
-     ((and match (not (eq match 'nomatch)))
-      match)
-     (t
-      (let ((types ede-project-class-files)
-	    (ret nil))
-	;; Loop over all types, loading in the first type that we find.
-	(while (and types (not ret))
-	  (if (ede-dir-to-projectfile (car types) dirtest)
-	      (progn
-		;; We found one!  Require it now since we will need it.
-		(require (oref (car types) file))
-		(setq ret (car types))))
-	  (setq types (cdr types)))
-	(ede-directory-project-add-description-to-hash dirtest (or ret 'nomatch))
-	ret)))))
+This depends on an up to date `ede-project-class-files' variable.
+Any directory that contains the file .ede-ignore will allways
+return nil."
+  (when (not (file-exists-p (expand-file-name ".ede-ignore" dir)))
+    (let* ((dirtest (expand-file-name dir))
+	   (match (ede-directory-project-from-hash dirtest)))
+      (cond
+       ((and (eq match 'nomatch) (not force))
+	nil)
+       ((and match (not (eq match 'nomatch)))
+	match)
+       (t
+	(let ((types ede-project-class-files)
+	      (ret nil))
+	  ;; Loop over all types, loading in the first type that we find.
+	  (while (and types (not ret))
+	    (if (ede-dir-to-projectfile (car types) dirtest)
+		(progn
+		  ;; We found one!  Require it now since we will need it.
+		  (require (oref (car types) file))
+		  (setq ret (car types))))
+	    (setq types (cdr types)))
+	  (ede-directory-project-add-description-to-hash dirtest (or ret 'nomatch))
+	  ret))))))
 
 ;;; TOPLEVEL
 ;;
@@ -324,7 +313,7 @@
 	  ;; If PROJ didn't know, or there is no PROJ, then
 
 	  ;; Loop up to the topmost project, and then load that single
-	  ;; project, and it's sub projects.  When we are done, identify the
+	  ;; project, and its sub projects.  When we are done, identify the
 	  ;; sub-project object belonging to file.
 	  (while (and (not ans) newpath proj)
 	    (setq toppath newpath
@@ -338,24 +327,6 @@
 	    )
 	  (or ans toppath))))))
 
-;;; TOPLEVEL PROJECT
-;;
-;; The toplevel project is a way to identify the EDE structure that belongs
-;; to the top of a project.
-
-(defun ede-toplevel (&optional subproj)
-  "Return the ede project which is the root of the current project.
-Optional argument SUBPROJ indicates a subproject to start from
-instead of the current project."
-  (or ede-object-root-project
-      (let* ((cp (or subproj (ede-current-project)))
-	     )
-	(or (and cp (ede-project-root cp))
-	    (progn
-	      (while (ede-parent-project cp)
-		(setq cp (ede-parent-project cp)))
-	      cp)))))
-
 ;;; DIRECTORY CONVERSION STUFF
 ;;
 (defmethod ede-convert-path ((this ede-project) path)
@@ -372,11 +343,13 @@
 	    (substring fptf (match-end 0))
 	  (error "Cannot convert relativize path %s" fp))))))
 
-(defmethod ede-convert-path ((this ede-target) path)
+(defmethod ede-convert-path ((this ede-target) path &optional project)
   "Convert path in a standard way for a given project.
 Default to making it project relative.
-Argument THIS is the project to convert PATH to."
-  (let ((proj (ede-target-parent this)))
+Argument THIS is the project to convert PATH to.
+Optional PROJECT is the project that THIS belongs to.  Associating
+a target to a project is expensive, so using this can speed things up."
+  (let ((proj (or project (ede-target-parent this))))
     (if proj
 	(let ((p (ede-convert-path proj path))
 	      (lp (or (oref this path) "")))
@@ -406,7 +379,8 @@
 by this project.
 Optional argument FORCE forces the default filename to be provided even if it
 doesn't exist.
-If FORCE equals 'newfile, then the cache is ignored."
+If FORCE equals 'newfile, then the cache is ignored and a new file in THIS
+is returned."
   (require 'ede/locate)
   (let* ((loc (ede-get-locator-object this))
 	 (ha (ede-locate-file-in-hash loc filename))
@@ -467,17 +441,8 @@
 	(proj (oref this subproj))
 	(found nil))
     ;; find it Locally.
-    (setq found
-	  (cond ((file-exists-p (expand-file-name filename path))
-		 (expand-file-name filename path))
-		((file-exists-p (expand-file-name  (concat "include/" filename) path))
-		 (expand-file-name (concat "include/" filename) path))
-		(t
-		 (while (and (not found) proj)
-		   (setq found (when (car proj)
-				 (ede-expand-filename (car proj) filename))
-			 proj (cdr proj)))
-		 found)))
+    (setq found (or (ede-expand-filename-local this filename)
+		    (ede-expand-filename-impl-via-subproj this filename)))
     ;; Use an external locate tool.
     (when (not found)
       (require 'ede/locate)
@@ -485,6 +450,30 @@
     ;; Return it
     found))
 
+(defmethod ede-expand-filename-local ((this ede-project) filename)
+  "Expand filename locally to project THIS with filesystem tests."
+  (let ((path (ede-project-root-directory this)))
+    (cond ((file-exists-p (expand-file-name filename path))
+	   (expand-file-name filename path))
+	  ((file-exists-p (expand-file-name  (concat "include/" filename) path))
+	   (expand-file-name (concat "include/" filename) path)))))
+
+(defmethod ede-expand-filename-impl-via-subproj ((this ede-project) filename)
+  "Return a fully qualified file name based on project THIS.
+FILENAME should be just a filename which occurs in a directory controlled
+by this project."
+  (let ((proj (list (ede-toplevel this)))
+	(found nil))
+    ;; find it Locally.
+    (while (and (not found) proj)
+      (let ((thisproj (car proj)))
+	(setq proj (append (cdr proj) (oref thisproj subproj)))
+	(setq found (when thisproj
+		      (ede-expand-filename-local thisproj filename)))
+	))
+    ;; Return it
+    found))
+
 (defmethod ede-expand-filename ((this ede-target) filename &optional force)
   "Return a fully qualified file name based on target THIS.
 FILENAME should be a filename which occurs in a directory in which THIS works.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/cedet/ede/generic.el	Thu Sep 23 15:00:31 2010 -0400
@@ -0,0 +1,442 @@
+;;; ede/generic.el --- Base Support for generic build systems
+
+;; Copyright (C) 2010 Free Software Foundation, Inc.
+
+;; Author: Eric M. Ludlam <eric@siege-engine.com>
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is free software: you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; There are a lot of build systems out there, and EDE can't support
+;; them all fully.  The ede-generic.el system is the base for
+;; supporting alternate build systems in a simple way, automatically.
+;;
+;; The structure is for the ede-generic baseclass, which is augmented
+;; by simple sub-classes that can be created by users on an as needed
+;; basis.  The generic system will have targets for many language
+;; types, and create the targets on an as needed basis.  All
+;; sub-project types will recycle the same generic target types.
+;;
+;; The generic target types will only be implemented for languages
+;; where having EDE support actually matters, with a single MISC to
+;; represent anything else.
+;;
+;; TOO MANY PROJECTS DETECTED:
+;;
+;; If enabling ede-generic support starts identifying too many
+;; projects, drop a file called `.ede-ignore' into any directory where
+;; you do not want a project to be.
+;;
+;; Customization:
+;;
+;; Since these projects are all so increadibly generic, a user will
+;; need to configure some aspects of the project by hand.  In order to
+;; enable this without configuring the project objects directly (which
+;; are auto-generated) a special ede-generic-confg object is defined to
+;; hold the basics.  Generic projects will identify and use these
+;; config files.
+;;
+;; Adding support for new projects:
+;;
+;; To add support to EDE Generic for new project types is very quick.
+;; See the end of this file for examples such as CMake and SCons.
+;;
+;; Support consists of one class for your project, specifying the file
+;; name used by the project system you want to support.  It also
+;; should implement th method `ede-generic-setup-configuration' to
+;; prepopulate the configurable portion of the generic project with
+;; build details.
+;;
+;; Lastly, call `ede-generic-new-autoloader' to setup your project so
+;; EDE can use it.
+;;
+;; Adding support for new types of source code:
+;;
+;; Sources of different types are supported with a simple class which
+;; subclasses `ede-generic-target'.  The slots `shortname' and
+;; `extension' should be given new initial values.
+;;
+;; Optionally, any target method used by EDE can then be overriden.
+;; The ede-generic-target-c-cpp has some example methods setting up
+;; the pre-processor map and system include path.
+;;
+;; NOTE: It is not necessary to modify ede-generic.el to add any of
+;; the above described support features.
+
+(require 'eieio-opt)
+(require 'ede)
+(require 'semantic/db)
+
+;;; Code:
+;;
+;; Start with the configuration system
+(defclass ede-generic-config (eieio-persistent)
+  ((extension :initform ".ede")
+   (file-header-line :initform ";; EDE Generic Project Configuration")
+   (project :initform nil
+	    :documentation
+	    "The project this config is bound to.")
+   ;; Generic customizations
+   (build-command :initarg :build-command
+		  :initform "make -k"
+		  :type string
+		  :custom string
+		  :group (default build)
+		  :documentation
+		  "Command used for building this project.")
+   (debug-command :initarg :debug-command
+		  :initform "gdb "
+		  :type string
+		  :custom string
+		  :group (default build)
+		  :documentation
+		  "Command used for debugging this project.")
+   ;; C target customixations
+   (c-include-path :initarg :c-include-path
+		   :initform nil
+		   :type list
+		   :custom (repeat (string :tag "Path"))
+		   :group c
+		   :documentation
+		   "The include path used by C/C++ projects.")
+   (c-preprocessor-table :initarg :c-preprocessor-table
+			 :initform nil
+			 :type list
+			 :custom (repeat (cons (string :tag "Macro")
+					       (string :tag "Value")))
+			 :group c
+			 :documentation
+			 "Preprocessor Symbols for this project.")
+   (c-preprocessor-files :initarg :c-preprocessor-files
+			 :initform nil
+			 :type list
+			 :custom (repeat (string :tag "Include File")))
+   )
+  "User Configuration object for a generic project.")
+
+(defun ede-generic-load (dir &optional rootproj)
+  "Return a Generic Project object if there is a match.
+Return nil if there isn't one.
+Argument DIR is the directory it is created for.
+ROOTPROJ is nil, since there is only one project."
+  ;; Doesn't already exist, so lets make one.
+  (let* ((alobj ede-constructing)
+	 (this nil))
+    (when (not alobj) (error "Cannot load generic project without the autoload instance"))
+
+    (setq this
+	  (funcall (oref alobj class-sym)
+		   (symbol-name (oref alobj class-sym))
+		   :name (file-name-nondirectory
+			  (directory-file-name dir))
+		   :version "1.0"
+		   :directory (file-name-as-directory dir)
+		   :file (expand-file-name (oref alobj :proj-file)) ))
+    (ede-add-project-to-global-list this)
+    ))
+
+;;; Base Classes for the system
+(defclass ede-generic-target (ede-target)
+  ((shortname :initform ""
+	     :type string
+	     :allocation :class
+	     :documentation
+	     "Something prepended to the target name.")
+  (extension :initform ""
+	      :type string
+	      :allocation :class
+	      :documentation
+	      "Regular expression representing the extension used for this target.
+subclasses of this base target will override the default value.")
+  )
+  "Baseclass for all targets belonging to the generic ede system."
+  :abstract t)
+
+(defclass ede-generic-project (ede-project)
+  ((buildfile :initform ""
+	      :type string
+	      :allocation :class
+	      :documentation "The file name that identifies a project of this type.
+The class allocated value is replace by different sub classes.")
+   (config :initform nil
+	   :type (or null ede-generic-config)
+	   :documentation
+	   "The configuration object for this project.")
+   )
+  "The baseclass for all generic EDE project types."
+  :abstract t)
+
+(defmethod initialize-instance ((this ede-generic-project)
+				&rest fields)
+  "Make sure the targets slot is bound."
+  (call-next-method)
+  (unless (slot-boundp this 'targets)
+    (oset this :targets nil))
+  )
+
+(defmethod ede-generic-get-configuration ((proj ede-generic-project))
+  "Return the configuration for the project PROJ."
+  (let ((config (oref proj config)))
+    (when (not config)
+      (let ((fname (expand-file-name "EDEConfig.el"
+				     (oref proj :directory))))
+	(if (file-exists-p fname)
+	    ;; Load in the configuration
+	    (setq config (eieio-persistent-read fname))
+	  ;; Create a new one.
+	  (setq config (ede-generic-config
+			"Configuration"
+			:file fname))
+	  ;; Set initial values based on project.
+	  (ede-generic-setup-configuration proj config))
+	;; Link things together.
+	(oset proj config config)
+	(oset config project proj)))
+    config))
+
+(defmethod ede-generic-setup-configuration ((proj ede-generic-project) config)
+  "Default configuration setup method."
+  nil)
+
+(defmethod ede-commit-project ((proj ede-generic-project))
+  "Commit any change to PROJ to its file."
+  (let ((config (ede-generic-get-configuration proj)))
+    (ede-commit config)))
+
+;;; A list of different targets
+(defclass ede-generic-target-c-cpp (ede-generic-target)
+  ((shortname :initform "C/C++")
+   (extension :initform "\\([ch]\\(pp\\|xx\\|\\+\\+\\)?\\|cc\\|hh\\|CC?\\)"))
+  "EDE Generic Project target for C and C++ code.
+All directories need at least one target.")
+
+(defclass ede-generic-target-el (ede-generic-target)
+  ((shortname :initform "ELisp")
+   (extension :initform "el"))
+  "EDE Generic Project target for Emacs Lisp code.
+All directories need at least one target.")
+
+(defclass ede-generic-target-fortran (ede-generic-target)
+  ((shortname :initform "Fortran")
+   (extension :initform "[fF]9[05]\\|[fF]\\|for"))
+  "EDE Generic Project target for Fortran code.
+All directories need at least one target.")
+
+(defclass ede-generic-target-texi (ede-generic-target)
+  ((shortname :initform "Texinfo")
+   (extension :initform "texi"))
+  "EDE Generic Project target for texinfo code.
+All directories need at least one target.")
+
+;; MISC must always be last since it will always match the file.
+(defclass ede-generic-target-misc (ede-generic-target)
+  ((shortname :initform "Misc")
+   (extension :initform ""))
+  "EDE Generic Project target for Misc files.
+All directories need at least one target.")
+
+;;; Automatic target aquisition.
+(defun ede-generic-find-matching-target (class dir targets)
+  "Find a target that is a CLASS and is in DIR in the list of TARGETS."
+  (let ((match nil))
+    (dolist (T targets)
+      (when (and (object-of-class-p T class)
+		 (string= (oref T :path) dir))
+	(setq match T)
+      ))
+    match))
+
+(defmethod ede-find-target ((proj ede-generic-project) buffer)
+  "Find an EDE target in PROJ for BUFFER.
+If one doesn't exist, create a new one for this directory."
+  (let* ((ext (file-name-extension (buffer-file-name buffer)))
+	 (classes (eieio-build-class-alist 'ede-generic-target t))
+	 (cls nil)
+	 (targets (oref proj targets))
+	 (dir default-directory)
+	 (ans nil)
+	 )
+    ;; Pick a matching class type.
+    (when ext
+      (dolist (C classes)
+	(let* ((classsym (intern (car C)))
+	       (extreg (oref classsym extension)))
+	  (when (and (not (string= extreg ""))
+		     (string-match (concat "^" extreg "$") ext))
+	    (setq cls classsym)))))
+    (when (not cls) (setq cls 'ede-generic-target-misc))
+    ;; find a pre-existing matching target
+    (setq ans (ede-generic-find-matching-target cls dir targets))
+    ;; Create a new instance if there wasn't one
+    (when (not ans)
+      (setq ans (make-instance
+		 cls
+		 :name (oref cls shortname)
+		 :path dir
+		 :source nil))
+      (object-add-to-list proj :targets ans)
+      )
+    ans))
+
+;;; C/C++ support
+(defmethod ede-preprocessor-map ((this ede-generic-target-c-cpp))
+  "Get the pre-processor map for some generic C code."
+  (let* ((proj (ede-target-parent this))
+	 (root (ede-project-root proj))
+	 (config (ede-generic-get-configuration proj))
+	 filemap
+	 )
+    ;; Preprocessor files
+    (dolist (G (oref config :c-preprocessor-files))
+      (let ((table (semanticdb-file-table-object
+		    (ede-expand-filename root G))))
+	(when table
+	  (when (semanticdb-needs-refresh-p table)
+	    (semanticdb-refresh-table table))
+	  (setq filemap (append filemap (oref table lexical-table)))
+	  )))
+    ;; The core table
+    (setq filemap (append filemap (oref config :c-preprocessor-table)))
+
+    filemap
+    ))
+
+(defmethod ede-system-include-path ((this ede-generic-target-c-cpp))
+  "Get the system include path used by project THIS."
+  (let* ((proj (ede-target-parent this))
+	(config (ede-generic-get-configuration proj)))
+    (oref config c-include-path)))
+
+;;; Customization
+;;
+(defmethod ede-customize ((proj ede-generic-project))
+  "Customize the EDE project PROJ."
+  (let ((config (ede-generic-get-configuration proj)))
+    (eieio-customize-object config)))
+
+(defmethod ede-customize ((target ede-generic-target))
+  "Customize the EDE TARGET."
+  ;; Nothing unique for the targets, use the project.
+  (ede-customize-project))
+
+(defmethod eieio-done-customizing ((config ede-generic-config))
+  "Called when EIEIO is done customizing the configuration object.
+We need to go back through the old buffers, and update them with
+the new configuration."
+  (ede-commit config)
+  ;; Loop over all the open buffers, and re-apply.
+  (ede-map-targets
+   (oref config project)
+   (lambda (target)
+     (ede-map-target-buffers
+      target
+      (lambda (b)
+	(with-current-buffer b
+	  (ede-apply-target-options)))))))
+
+(defmethod ede-commit ((config ede-generic-config))
+  "Commit all changes to the configuration to disk."
+  (eieio-persistent-save config))
+
+;;; Creating Derived Projects:
+;;
+;; Derived projects need an autoloader so that EDE can find the
+;; different projects on disk.
+(defun ede-generic-new-autoloader (internal-name external-name
+						 projectfile class)
+  "Add a new EDE Autoload instance for identifying a generic project.
+INTERNAL-NAME is a long name that identifies thsi project type.
+EXTERNAL-NAME is a shorter human readable name to describe the project.
+PROJECTFILE is a file name that identifies a project of this type to EDE, such as
+a Makefile, or SConstruct file.
+CLASS is the EIEIO class that is used to track this project.  It should subclass
+the class `ede-generic-project' project."
+  (add-to-list 'ede-project-class-files
+	       (ede-project-autoload internal-name
+				     :name external-name
+				     :file 'ede-generic
+				     :proj-file projectfile
+				     :load-type 'ede-generic-load
+				     :class-sym class
+				     :new-p nil)
+	       ;; Generics must go at the end, since more specific types
+	       ;; can create Makefiles also.
+	       t))
+
+;;;###autoload
+(defun ede-enable-generic-projects ()
+  "Enable generic project loaders."
+  (interactive)
+  (ede-generic-new-autoloader "edeproject-makefile" "Make"
+			      "Makefile" 'ede-generic-makefile-project)
+  (ede-generic-new-autoloader "edeproject-scons" "SCons"
+			      "SConstruct" 'ede-generic-scons-project)
+  (ede-generic-new-autoloader "edeproject-cmake" "CMake"
+			      "CMakeLists" 'ede-generic-cmake-project)
+  )
+
+
+;;; SPECIFIC TYPES OF GENERIC BUILDS
+;;
+
+;;; MAKEFILE
+
+(defclass ede-generic-makefile-project (ede-generic-project)
+  ((buildfile :initform "Makefile")
+   )
+  "Generic Project for makefiles.")
+
+(defmethod ede-generic-setup-configuration ((proj ede-generic-makefile-project) config)
+  "Setup a configuration for Make."
+  (oset config build-command "make -k")
+  (oset config debug-command "gdb ")
+  )
+
+
+;;; SCONS
+(defclass ede-generic-scons-project (ede-generic-project)
+  ((buildfile :initform "SConstruct")
+   )
+  "Generic Project for scons.")
+
+(defmethod ede-generic-setup-configuration ((proj ede-generic-scons-project) config)
+  "Setup a configuration for SCONS."
+  (oset config build-command "scons")
+  (oset config debug-command "gdb ")
+  )
+
+
+;;; CMAKE
+(defclass ede-generic-cmake-project (ede-generic-project)
+  ((buildfile :initform "CMakeLists")
+   )
+  "Generic Project for cmake.")
+
+(defmethod ede-generic-setup-configuration ((proj ede-generic-cmake-project) config)
+  "Setup a configuration for CMake."
+  (oset config build-command "cmake")
+  (oset config debug-command "gdb ")
+  )
+
+(provide 'ede/generic)
+
+;; Local variables:
+;; generated-autoload-file: "loaddefs.el"
+;; generated-autoload-load-name: "ede/generic"
+;; End:
+
+;;; ede/generic.el ends here
--- a/lisp/cedet/ede/linux.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/linux.el	Thu Sep 23 15:00:31 2010 -0400
@@ -112,6 +112,18 @@
       )
   )
 
+;;;###autoload
+(add-to-list 'ede-project-class-files
+	     (ede-project-autoload "linux"
+	      :name "LINUX ROOT"
+	      :file 'ede-linux
+	      :proj-file "scripts/ver_linux"
+	      :proj-root 'ede-linux-project-root
+	      :load-type 'ede-linux-load
+	      :class-sym 'ede-linux-project
+	      :new-p nil)
+	     t)
+
 (defclass ede-linux-target-c (ede-target)
   ()
   "EDE Linux Project target for C code.
@@ -124,7 +136,7 @@
 
 (defmethod initialize-instance ((this ede-linux-project)
 				&rest fields)
-  "Make sure the :file is fully expanded."
+  "Make sure the targets slot is bound."
   (call-next-method)
   (unless (slot-boundp this 'targets)
     (oset this :targets nil)))
--- a/lisp/cedet/ede/locate.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/locate.el	Thu Sep 23 15:00:31 2010 -0400
@@ -121,7 +121,7 @@
   ;; Basic setup.
   (call-next-method)
   ;; Make sure we have a hash table.
-  (oset loc hash (make-hash-table :test 'equal))
+  (ede-locate-flush-hash loc)
   )
 
 (defmethod ede-locate-ok-in-project :static ((loc ede-locate-base)
@@ -129,6 +129,10 @@
   "Is it ok to use this project type under ROOT."
   t)
 
+(defmethod ede-locate-flush-hash ((loc ede-locate-base))
+  "For LOC, flush hashtable and start from scratch."
+  (oset loc hash (make-hash-table :test 'equal)))
+
 (defmethod ede-locate-file-in-hash ((loc ede-locate-base)
 				    filestring)
   "For LOC, is the file FILESTRING in our hashtable?"
@@ -160,6 +164,13 @@
   nil
   )
 
+(defmethod ede-locate-create/update-root-database :STATIC
+  ((loc ede-locate-base) root)
+  "Create or update the database for the current project.
+You cannot create projects for the baseclass."
+  (error "Cannot create/update a database of type %S"
+	 (object-name loc)))
+
 ;;; LOCATE
 ;;
 ;; Using the standard unix "locate" command.
@@ -242,6 +253,11 @@
   (let ((default-directory (oref loc root)))
     (cedet-gnu-global-expand-filename filesubstring)))
 
+(defmethod ede-locate-create/update-root-database :STATIC
+  ((loc ede-locate-global) root)
+  "Create or update the GNU Global database for the current project."
+  (cedet-gnu-global-create/update-database root))
+
 ;;; IDUTILS
 ;;
 (defclass ede-locate-idutils (ede-locate-base)
@@ -280,6 +296,11 @@
   (let ((default-directory (oref loc root)))
     (cedet-idutils-expand-filename filesubstring)))
 
+(defmethod ede-locate-create/update-root-database :STATIC
+  ((loc ede-locate-idutils) root)
+  "Create or update the GNU Global database for the current project."
+  (cedet-idutils-create/update-database root))
+
 ;;; CSCOPE
 ;;
 (defclass ede-locate-cscope (ede-locate-base)
@@ -315,6 +336,11 @@
   (let ((default-directory (oref loc root)))
     (cedet-cscope-expand-filename filesubstring)))
 
+(defmethod ede-locate-create/update-root-database :STATIC
+  ((loc ede-locate-cscope) root)
+  "Create or update the GNU Global database for the current project."
+  (cedet-cscope-create/update-database root))
+
 (provide 'ede/locate)
 
 ;; Local variables:
--- a/lisp/cedet/ede/pconf.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/pconf.el	Thu Sep 23 15:00:31 2010 -0400
@@ -126,7 +126,11 @@
 
 	  (while compilation-in-progress
 	    (accept-process-output)
-	    (sit-for 1))
+	    ;; If sit for indicates that input is waiting, then
+	    ;; read and discard whatever it is that is going on.
+	    (when (not (sit-for 1))
+	      (read-event nil nil .1)
+	      ))
 
 	  (with-current-buffer "*compilation*"
 	    (goto-char (point-max))
--- a/lisp/cedet/ede/pmake.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/pmake.el	Thu Sep 23 15:00:31 2010 -0400
@@ -262,6 +262,18 @@
      (goto-char (point-max))))
 (put 'ede-pmake-insert-variable-shared 'lisp-indent-function 1)
 
+(defmacro ede-pmake-insert-variable-once (varname &rest body)
+  "Add VARNAME into the current Makefile if it doesn't exist.
+Execute BODY in a location where a value can be placed."
+  `(let ((addcr t) (v ,varname))
+     (unless (re-search-backward (concat "^" v "\\s-*=") nil t)
+       (insert v "=")
+       ,@body
+       (if addcr (insert "\n"))
+       (goto-char (point-max)))
+     ))
+(put 'ede-pmake-insert-variable-once 'lisp-indent-function 1)
+
 ;;; SOURCE VARIABLE NAME CONSTRUCTION
 
 (defsubst ede-pmake-varname (obj)
@@ -369,10 +381,14 @@
 	  conf-table))
   (let* ((top "")
 	 (tmp this))
+    ;; Use relative paths for subdirs.
     (while (ede-parent-project tmp)
       (setq tmp (ede-parent-project tmp)
 	    top (concat "../" top)))
-    (insert "\ntop=" top))
+    ;; If this is the top, then use CURDIR.
+    (if (and (not (oref this metasubproject)) (string= top ""))
+	(insert "\ntop=\"$(CURDIR)\"/")
+      (insert "\ntop=" top)))
   (insert "\nede_FILES=" (file-name-nondirectory (oref this file)) " "
 	  (file-name-nondirectory (ede-proj-dist-makefile this)) "\n"))
 
@@ -425,14 +441,13 @@
 	(link (ede-proj-linkers this))
 	(name (ede-proj-makefile-target-name this))
 	(src (oref this source)))
+    (ede-proj-makefile-insert-object-variables (car comp) name src)
     (dolist (obj comp)
       (ede-compiler-only-once obj
 			      (ede-proj-makefile-insert-variables obj)))
-    (ede-proj-makefile-insert-object-variables (car comp) name src)
-    (while link
-      (ede-linker-only-once (car link)
-	(ede-proj-makefile-insert-variables (car link)))
-      (setq link (cdr link)))))
+    (dolist (linker link)
+      (ede-linker-only-once linker
+			    (ede-proj-makefile-insert-variables linker)))))
 
 (defmethod ede-proj-makefile-insert-automake-pre-variables
   ((this ede-proj-target))
--- a/lisp/cedet/ede/proj-archive.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-archive.el	Thu Sep 23 15:00:31 2010 -0400
@@ -29,7 +29,7 @@
 
 (defclass ede-proj-target-makefile-archive
   (ede-proj-target-makefile-objectcode)
-  ((availablelinkers :initform (ede-archive-linker)))
+  ((availablelinkers :initform '(ede-archive-linker)))
   "This target generates an object code archive.")
 
 (defvar ede-archive-linker
--- a/lisp/cedet/ede/proj-aux.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-aux.el	Thu Sep 23 15:00:31 2010 -0400
@@ -29,7 +29,7 @@
 
 ;;; Code:
 (defclass ede-proj-target-aux (ede-proj-target)
-  ((sourcetype :initform (ede-aux-source)))
+  ((sourcetype :initform '(ede-aux-source)))
   "This target consists of aux files such as READMEs and COPYING.")
 
 (defvar ede-aux-source
--- a/lisp/cedet/ede/proj-elisp.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-elisp.el	Thu Sep 23 15:00:31 2010 -0400
@@ -36,8 +36,8 @@
   ((menu :initform nil)
    (keybindings :initform nil)
    (phony :initform t)
-   (sourcetype :initform (ede-source-emacs))
-   (availablecompilers :initform (ede-emacs-compiler ede-xemacs-compiler))
+   (sourcetype :initform '(ede-source-emacs))
+   (availablecompilers :initform '(ede-emacs-compiler ede-xemacs-compiler))
    (aux-packages :initarg :aux-packages
 		 :initform nil
 		 :type list
@@ -259,7 +259,7 @@
 ;; Autoload generators
 ;;
 (defclass ede-proj-target-elisp-autoloads (ede-proj-target-elisp)
-  ((availablecompilers :initform (ede-emacs-cedet-autogen-compiler))
+  ((availablecompilers :initform '(ede-emacs-cedet-autogen-compiler))
    (aux-packages :initform ("cedet-autogen"))
    (phony :initform t)
    (autoload-file :initarg :autoload-file
--- a/lisp/cedet/ede/proj-info.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-info.el	Thu Sep 23 15:00:31 2010 -0400
@@ -31,9 +31,9 @@
 (defclass ede-proj-target-makefile-info (ede-proj-target-makefile)
   ((menu :initform nil)
    (keybindings :initform nil)
-   (availablecompilers :initform (ede-makeinfo-compiler
-				  ede-texi2html-compiler))
-   (sourcetype :initform (ede-makeinfo-source))
+   (availablecompilers :initform '(ede-makeinfo-compiler
+				   ede-texi2html-compiler))
+   (sourcetype :initform '(ede-makeinfo-source))
    (mainmenu :initarg :mainmenu
 	     :initform ""
 	     :type string
--- a/lisp/cedet/ede/proj-misc.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-misc.el	Thu Sep 23 15:00:31 2010 -0400
@@ -35,8 +35,8 @@
 
 ;; FIXME this isn't how you spell "miscellaneous". :(
 (defclass ede-proj-target-makefile-miscelaneous (ede-proj-target-makefile)
-  ((sourcetype :initform (ede-misc-source))
-   (availablecompilers :initform (ede-misc-compile))
+  ((sourcetype :initform '(ede-misc-source))
+   (availablecompilers :initform '(ede-misc-compile))
    (submakefile :initarg :submakefile
 		:initform ""
 		:type string
--- a/lisp/cedet/ede/proj-obj.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-obj.el	Thu Sep 23 15:00:31 2010 -0400
@@ -39,28 +39,32 @@
    (configuration-variables :initform ("debug" . (("CFLAGS" . "-g")
 						  ("LDFLAGS" . "-g"))))
    ;; @TODO - add an include path.
-   (availablecompilers :initform (ede-gcc-compiler
-				  ede-g++-compiler
-				  ede-gfortran-compiler
-				  ede-gfortran-module-compiler
-				  ;; More C and C++ compilers, plus
-				  ;; fortran or pascal can be added here
-				  ))
-   (availablelinkers :initform (ede-g++-linker
-				ede-cc-linker
-				ede-gfortran-linker
-				ede-ld-linker
-				;; Add more linker thingies here.
-				))
-   (sourcetype :initform (ede-source-c
-			  ede-source-c++
-			  ede-source-f77
-			  ede-source-f90
-			  ;; ede-source-other
-			  ;; This object should take everything that
-			  ;; gets compiled into objects like fortran
-			  ;; and pascal.
-			  ))
+   (availablecompilers :initform '(ede-gcc-compiler
+				   ede-g++-compiler
+				   ede-gfortran-compiler
+				   ede-gfortran-module-compiler
+				   ede-lex-compiler
+				   ede-yacc-compiler
+				   ;; More C and C++ compilers, plus
+				   ;; fortran or pascal can be added here
+				   ))
+   (availablelinkers :initform '(ede-g++-linker
+				 ede-cc-linker
+				 ede-ld-linker
+				 ede-gfortran-linker
+				 ;; Add more linker thingies here.
+				 ))
+   (sourcetype :initform '(ede-source-c
+			   ede-source-c++
+			   ede-source-f77
+			   ede-source-f90
+			   ede-source-lex
+			   ede-source-yacc
+			   ;; ede-source-other
+			   ;; This object should take everything that
+			   ;; gets compiled into objects like fortran
+			   ;; and pascal.
+			   ))
    )
   "Abstract class for Makefile based object code generating targets.
 Belonging to this group assumes you could make a .o from an element source
@@ -115,15 +119,15 @@
    :name "cc"
    :sourcetype '(ede-source-c)
    :variables  '(("C_LINK" . "$(CC) $(CFLAGS) $(LDFLAGS) -L."))
-   :commands '("$(C_LINK) -o $@ $^")
+   :commands '("$(C_LINK) -o $@ $^ $(LDDEPS)")
    :objectextention "")
   "Linker for C sourcecode.")
 
 (defvar ede-source-c++
   (ede-sourcecode "ede-source-c++"
 		  :name "C++"
-		  :sourcepattern "\\.\\(cpp\\|cc\\|cxx\\)$"
-		  :auxsourcepattern "\\.\\(hpp\\|hh?\\|hxx\\)$"
+		  :sourcepattern "\\.\\(c\\(pp?\\|c\\|xx\\|++\\)\\|C\\\(PP\\)?\\)$"
+		  :auxsourcepattern "\\.\\(hpp?\\|hh?\\|hxx\\|H\\)$"
 		  :garbagepattern '("*.o" "*.obj" ".deps/*.P" ".lo"))
   "C++ source code definition.")
 
@@ -158,11 +162,43 @@
    ;; Only use this linker when c++ exists.
    :sourcetype '(ede-source-c++)
    :variables  '(("CXX_LINK" . "$(CXX) $(CFLAGS) $(LDFLAGS) -L."))
-   :commands '("$(CXX_LINK) -o $@ $^")
+   :commands '("$(CXX_LINK) -o $@ $^ $(LDDEPS)")
    :autoconf '("AC_PROG_CXX")
    :objectextention "")
   "Linker needed for c++ programs.")
 
+;;; LEX
+(defvar ede-source-lex
+  (ede-sourcecode "ede-source-lex"
+		  :name "lex"
+		  :sourcepattern "\\.l\\(l\\|pp\\|++\\)")
+  "Lex source code definition.
+No garbage pattern since it creates C or C++ code.")
+
+(defvar ede-lex-compiler
+  (ede-object-compiler
+   "ede-lex-compiler"
+   ;; Can we support regular makefiles too??
+   :autoconf '("AC_PROG_LEX")
+   :sourcetype '(ede-source-lex))
+  "Compiler used for Lexical source.")
+
+;;; YACC
+(defvar ede-source-yacc
+  (ede-sourcecode "ede-source-yacc"
+		  :name "yacc"
+		  :sourcepattern "\\.y\\(y\\|pp\\|++\\)")
+  "Yacc source code definition.
+No garbage pattern since it creates C or C++ code.")
+
+(defvar ede-yacc-compiler
+  (ede-object-compiler
+   "ede-yacc-compiler"
+   ;; Can we support regular makefiles too??
+   :autoconf '("AC_PROG_YACC")
+   :sourcetype '(ede-source-yacc))
+  "Compiler used for yacc/bison grammar files source.")
+
 ;;; Fortran Compiler/Linker
 ;;
 ;; Contributed by David Engster
@@ -233,7 +269,7 @@
    :name "ld"
    :variables  '(("LD" . "ld")
 		 ("LD_LINK" . "$(LD) $(LDFLAGS) -L."))
-   :commands '("$(LD_LINK) -o $@ $^")
+   :commands '("$(LD_LINK) -o $@ $^ $(LDDEPS)")
    :objectextention "")
   "Linker needed for c++ programs.")
 
--- a/lisp/cedet/ede/proj-prog.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-prog.el	Thu Sep 23 15:00:31 2010 -0400
@@ -34,14 +34,14 @@
 ;;; Code:
 (defclass ede-proj-target-makefile-program
   (ede-proj-target-makefile-objectcode)
-  ((ldlibs :initarg :ldlibs
-	   :initform nil
-	   :type list
-	   :custom (repeat (string :tag "Library"))
-	   :documentation
-	   "Libraries, such as \"m\" or \"Xt\" which this program depends on.
-The linker flag \"-l\" is automatically prepended.  Do not include a \"lib\"
-prefix, or a \".so\" suffix.
+  ((ldlibs-local :initarg :ldlibs-local
+		 :initform nil
+		 :type list
+		 :custom (repeat (string :tag "Local Library"))
+		 :documentation
+	   "Libraries that are part of this project.
+The full path to these libraries should be specified, such as:
+../lib/libMylib.la  or ../ar/myArchive.a
 
 Note: Currently only used for Automake projects."
 	   )
@@ -51,10 +51,21 @@
 	    :custom (repeat (string :tag "Link Flag"))
 	    :documentation
 	    "Additional flags to add when linking this target.
-Use ldlibs to add addition libraries.  Use this to specify specific
-options to the linker.
+Use this to specify specific options to the linker.
+A Common use may be to add -L to specify in-project locations of libraries
+specified with ldlibs.")
+   (ldlibs :initarg :ldlibs
+	   :initform nil
+	   :type list
+	   :custom (repeat (string :tag "Library"))
+	   :documentation
+	   "Libraries, such as \"m\" or \"Xt\" which this program depends on.
+The linker flag \"-l\" is automatically prepended.  Do not include a \"lib\"
+prefix, or a \".so\" suffix.
+Use the 'ldflags' slot to specify where in-project libraries might be.
 
-Note: Not currently used.  This bug needs to be fixed.")
+Note: Currently only used for Automake projects."
+	   )
    )
    "This target is an executable program.")
 
@@ -70,27 +81,24 @@
   "Insert bin_PROGRAMS variables needed by target THIS."
   (ede-pmake-insert-variable-shared
       (concat (ede-name this) "_LDADD")
-    (mapc (lambda (c) (insert " -l" c)) (oref this ldlibs)))
-  ;; For other targets THIS depends on
-  ;;
-  ;; NOTE: FIX THIS
-  ;;
-  ;;(ede-pmake-insert-variable-shared
-  ;;    (concat (ede-name this) "_DEPENDENCIES")
-  ;;  (mapcar (lambda (d) (insert d)) (oref this FOOOOOOOO)))
+    (mapc (lambda (l) (insert " " l)) (oref this ldlibs-local))
+    (mapc (lambda (c) (insert " " c)) (oref this ldflags))
+    (when (oref this ldlibs)
+      (mapc (lambda (d) (insert " -l" d)) (oref this ldlibs)))
+    )
   (call-next-method))
 
-(defmethod ede-proj-makefile-insert-rules ((this ede-proj-target-makefile-program))
-  "Insert rules needed by THIS target."
-  (let ((ede-proj-compiler-object-linkflags
-	 (mapconcat 'identity (oref this ldflags) " ")))
+(defmethod ede-proj-makefile-insert-variables ((this ede-proj-target-makefile-program))
+  "Insert variables needed by the compiler THIS."
+  (call-next-method)
+  (let ((lf (mapconcat 'identity (oref this ldflags) " ")))
     (with-slots (ldlibs) this
       (if ldlibs
-	  (setq ede-proj-compiler-object-linkflags
-		(concat ede-proj-compiler-object-linkflags
-			" -l"
-			(mapconcat 'identity ldlibs " -l")))))
-    (call-next-method)))
+	  (setq lf
+		(concat lf " -l" (mapconcat 'identity ldlibs " -l")))))
+    ;; LDFLAGS as needed.
+    (when (and lf (not (string= "" lf)))
+      (ede-pmake-insert-variable-once "LDDEPS" (insert lf)))))
 
 (defmethod project-debug-target ((obj ede-proj-target-makefile-program))
   "Debug a program target OBJ."
--- a/lisp/cedet/ede/proj-shared.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj-shared.el	Thu Sep 23 15:00:31 2010 -0400
@@ -34,15 +34,15 @@
 ;;; Code:
 (defclass ede-proj-target-makefile-shared-object
   (ede-proj-target-makefile-program)
-  ((availablecompilers :initform (ede-gcc-libtool-shared-compiler
-				  ;;ede-gcc-shared-compiler
-				  ede-g++-libtool-shared-compiler
-				  ;;ede-g++-shared-compiler
-				  ))
-   (availablelinkers :initform (ede-cc-linker-libtool
-				ede-g++-linker-libtool
-				;; Add more linker thingies here.
-				))
+  ((availablecompilers :initform '(ede-gcc-libtool-shared-compiler
+				   ;;ede-gcc-shared-compiler
+				   ede-g++-libtool-shared-compiler
+				   ;;ede-g++-shared-compiler
+				   ))
+   (availablelinkers :initform '(ede-cc-linker-libtool
+				 ede-g++-linker-libtool
+				 ;; Add more linker thingies here.
+				 ))
    (ldflags :custom (repeat (string :tag "Libtool flag"))
 	    :documentation
 	    "Additional flags to add when linking this shared library.
@@ -124,7 +124,7 @@
 	 :rules (list (ede-makefile-rule
 		       "c++-inference-rule-libtool"
 		       :target "%.o"
-		       :dependencies "%.c"
+		       :dependencies "%.cpp"
 		       :rules '("@echo '$(LTCOMPILE) -o $@ $<'; \\"
 				"$(LTCOMPILE) -o $@ $<"
 				)
--- a/lisp/cedet/ede/proj.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/proj.el	Thu Sep 23 15:00:31 2010 -0400
@@ -29,7 +29,6 @@
 ;; rebuild.  The targets provided in ede-proj can be augmented with
 ;; additional target types inherited directly from `ede-proj-target'.
 
-;; (eval-and-compile '(require 'ede))
 (require 'ede/proj-comp)
 (require 'ede/make)
 
@@ -336,7 +335,9 @@
     (or (string= (file-name-nondirectory (oref this file)) f)
 	(string= (ede-proj-dist-makefile this) f)
 	(string-match "Makefile\\(\\.\\(in\\|am\\)\\)?$" f)
-	(string-match "config\\(ure\\.in\\|\\.stutus\\)?$" f)
+	(string-match "config\\(ure\\.\\(in\\|ac\\)\\|\\.status\\)?$" f)
+	(string-match "config.h\\(\\.in\\)?" f)
+	(member f '("AUTHORS" "NEWS" "COPYING" "INSTALL" "README"))
 	)))
 
 (defmethod ede-buffer-mine ((this ede-proj-target) buffer)
@@ -398,11 +399,11 @@
 	     :source nil)))
 
 (defmethod project-delete-target ((this ede-proj-target))
-  "Delete the current target THIS from it's parent project."
+  "Delete the current target THIS from its parent project."
   (let ((p (ede-current-project))
 	(ts (oref this source)))
     ;; Loop across all sources.  If it exists in a buffer,
-    ;; clear it's object.
+    ;; clear its object.
     (while ts
       (let* ((default-directory (oref this path))
 	     (b (get-file-buffer (car ts))))
@@ -413,7 +414,7 @@
 		    (setq ede-object nil)
 		    (ede-apply-object-keymap))))))
       (setq ts (cdr ts)))
-    ;; Remove THIS from it's parent.
+    ;; Remove THIS from its parent.
     ;; The two vectors should be pointer equivalent.
     (oset p targets (delq this (oref p targets)))
     (ede-proj-save (ede-current-project))))
@@ -447,15 +448,13 @@
 
 (defmethod project-make-dist ((this ede-proj-project))
   "Build a distribution for the project based on THIS target."
-  ;; I'm a lazy bum, so I'll make a makefile for doing this sort
-  ;; of thing, and rely only on that small section of code.
   (let ((pm (ede-proj-dist-makefile this))
 	(df (project-dist-files this)))
     (if (and (file-exists-p (car df))
 	     (not (y-or-n-p "Dist file already exists.  Rebuild? ")))
 	(error "Try `ede-update-version' before making a distribution"))
     (ede-proj-setup-buildenvironment this)
-    (if (string= (file-name-nondirectory pm) "Makefile.am")
+    (if (ede-proj-automake-p this)
 	(setq pm (expand-file-name "Makefile"
 				   (file-name-directory pm))))
     (compile (concat ede-make-command " -f " pm " dist"))))
@@ -473,7 +472,7 @@
   (let ((pm (ede-proj-dist-makefile proj))
 	(default-directory (file-name-directory (oref proj file))))
     (ede-proj-setup-buildenvironment proj)
-    (if (string= (file-name-nondirectory pm) "Makefile.am")
+    (if (ede-proj-automake-p proj)
 	(setq pm (expand-file-name "Makefile"
 				   (file-name-directory pm))))
     (compile (concat ede-make-command" -f " pm " all"))))
@@ -539,7 +538,15 @@
 	    (if (ede-want-any-source-files-p (symbol-value (car st)) sources)
 		(let ((c (ede-proj-find-compiler avail (car st))))
 		  (if c (setq comp (cons c comp)))))
-	    (setq st (cdr st)))))
+	    (setq st (cdr st)))
+	  ;; Provide a good error msg.
+	  (unless comp
+	    (error "Could not find compiler match for source code extension \"%s\".
+You may need to add support for this type of file."
+		   (if sources
+		       (file-name-extension (car sources))
+		     "")))
+	  ))
       ;; Return the disovered compilers
       comp)))
 
@@ -664,18 +671,9 @@
   (let ((root (or (ede-project-root this) this))
 	)
     (setq ede-projects (delq root ede-projects))
-    (ede-proj-load (ede-project-root-directory root))
+    (ede-load-project-file (ede-project-root-directory root))
     ))
 
-(defmethod project-rescan ((this ede-proj-target) readstream)
-  "Rescan target THIS from the read list READSTREAM."
-  (setq readstream (cdr (cdr readstream))) ;; constructor/name
-  (while readstream
-    (let ((tag (car readstream))
-	  (val (car (cdr readstream))))
-      (eieio-oset this tag val))
-    (setq readstream (cdr (cdr readstream)))))
-
 (provide 'ede/proj)
 
 ;; arch-tag: eb8a40f8-0d2c-41c4-b273-af04101d1cdf
--- a/lisp/cedet/ede/project-am.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/project-am.el	Thu Sep 23 15:00:31 2010 -0400
@@ -30,27 +30,19 @@
 ;; fashion.
 ;;
 ;; project-am uses the structure defined in all good GNU projects with
-;; the Automake file as it's base template, and then maintains that
+;; the Automake file as its base template, and then maintains that
 ;; information during edits, automatically updating the automake file
 ;; where appropriate.
 
-
-;; (eval-and-compile
-;;   ;; Compatibility for makefile mode.
-;;   (condition-case nil
-;;       (require 'makefile "make-mode")
-;;     (error (require 'make-mode "make-mode")))
-
-;;   ;; Requiring the .el files prevents incomplete builds.
-;;   (require 'eieio "eieio.el")
-;;   (require 'ede "ede.el"))
-
 (require 'make-mode)
 (require 'ede)
 (require 'ede/make)
 (require 'ede/makefile-edit)
+(require 'semantic/find) ;; for semantic-find-tags-by-...
+(require 'ede/autoconf-edit)
 
 (declare-function autoconf-parameters-for-macro "ede/autoconf-edit")
+(declare-function ede-shell-run-something "ede/shell")
 (eval-when-compile (require 'compile))
 
 ;;; Code:
@@ -104,7 +96,7 @@
     ;; ("ltlibcustom" project-am-lib ".*?_LTLIBRARIES" t)
     )
   "Alist of type names and the type of object to create for them.
-Each entry is of th form:
+Each entry is of the form:
   (EMACSNAME CLASS AUTOMAKEVAR INDIRECT)
 where EMACSNAME is a name for Emacs to use.
 CLASS is the EDE target class to represent the target.
@@ -113,6 +105,23 @@
 INDIRECT is optional.  If it is non-nil, then the variable in
 question lists other variables that need to be looked up.")
 
+
+(defconst project-am-meta-type-alist
+  '((project-am-program "_PROGRAMS$" t)
+    (project-am-lib "_\\(LIBS\\|LIBRARIES\\|LTLIBRARIES\\)$" t)
+
+    ;; direct primary target use a dummy object (man target)
+    ;; update to: * 3.3 Uniform  in automake-1.11 info node.
+    (project-am-man "_\\(DATA\\|HEADERS\\|PYTHON\\|JAVA\\|SCRIPTS\\|MANS\\|TEXINFOS\\)$" nil)
+    )
+  "Alist of meta-target type, each entry has form:
+     (CLASS REGEXPVAR INDIRECT)
+where CLASS is the EDE target class for target.
+REGEXPVAR is the regexp used in `semantic-find-tags-by-name-regexp'.
+INDIRECT is optional. If it is non-nil, then the variable in it have
+other meta-variable based on this name.")
+
+
 (defclass project-am-target (ede-target)
   nil
   "Base target class for everything in project-am.")
@@ -291,16 +300,6 @@
       ;; Rescan the object in this makefile.
       (project-rescan ede-object))))
 
-;(defun project-am-rescan-toplevel ()
-;  "Rescan all projects in which the current buffer resides."
-;  (interactive)
-;  (let* ((tlof (project-am-find-topmost-level default-directory))
-;	 (tlo (project-am-load tlof))
-;	 (ede-deep-rescan t))  ; scan deep in this case.
-;    ;; tlo is the top level object for whatever file we are in
-;    ;; or nil.  If we have an object, call the rescan method.
-;    (if tlo (project-am-rescan tlo))))
-
 ;;
 ;; NOTE TO SELF
 ;;
@@ -406,6 +405,7 @@
 
 (defmethod project-run-target ((obj project-am-objectcode))
   "Run the current project target in comint buffer."
+  (require 'ede/shell)
   (let ((tb (get-buffer-create " *padt*"))
 	(dd (oref obj path))
 	(cmd nil))
@@ -429,45 +429,17 @@
 
 ;;; Project loading and saving
 ;;
-(defun project-am-load (project &optional rootproj)
-  "Read an automakefile PROJECT into our data structure.
-Make sure that the tree down to our makefile is complete so that there
-is cohesion in the project.  Return the project file (or sub-project).
+(defun project-am-load (directory &optional rootproj)
+  "Read an automakefile DIRECTORY into our data structure.
 If a given set of projects has already been loaded, then do nothing
 but return the project for the directory given.
 Optional ROOTPROJ is the root EDE project."
-  ;; @TODO - rationalize this to the newer EDE way of doing things.
-  (setq project (expand-file-name project))
-  (let* ((ede-constructing t)
-	 (fn (project-am-find-topmost-level (file-name-as-directory project)))
-	 (amo nil)
-	 (trimmed (if (string-match (regexp-quote fn)
-				    project)
-		      (replace-match "" t t project)
-		    ""))
-	 (subdir nil))
-    (setq amo (object-assoc (expand-file-name "Makefile.am" fn)
-			    'file ede-projects))
-    (if amo
-	(error "Synchronous error in ede/project-am objects")
-      (let ((project-am-constructing t))
-	(setq amo (project-am-load-makefile fn))))
-    (if (not amo)
-	nil
-      ;; Now scan down from amo, and find the current directory
-      ;; from the PROJECT file.
-      (while (< 0 (length trimmed))
-	(if (string-match "\\([a-zA-Z0-9.-]+\\)/" trimmed)
-	    (setq subdir (match-string 0 trimmed)
-		  trimmed (replace-match "" t t trimmed))
-	  (error "Error scanning down path for project"))
-	(setq amo (project-am-subtree
-		   amo
-		   (expand-file-name "Makefile.am"
-				     (expand-file-name subdir fn)))
-	      fn (expand-file-name subdir fn)))
-      amo)
-    ))
+  (let* ((ede-constructiong t)
+	 (amo (object-assoc (expand-file-name "Makefile.am" directory)
+			    'file ede-projects)))
+    (when (not amo)
+      (setq amo (project-am-load-makefile directory)))
+    amo))
 
 (defun project-am-find-topmost-level (dir)
   "Find the topmost automakefile starting with DIR."
@@ -488,17 +460,19 @@
 	  (fb nil)
 	  (kb (get-file-buffer fn)))
      (if (not (file-exists-p fn))
-	nil
-      (save-excursion
-	(if kb (setq fb kb)
-	  ;; We need to find-file this thing, but don't use
-	  ;; any semantic features.
-	  (let ((semantic-init-hook nil))
-	    (setq fb (find-file-noselect fn)))
-	  )
-	(set-buffer fb)
-	(prog1 ,@forms
-	  (if (not kb) (kill-buffer (current-buffer))))))))
+	 nil
+       (save-excursion
+	 (if kb (setq fb kb)
+	   ;; We need to find-file this thing, but don't use
+	   ;; any semantic features.
+	   (let ((semantic-init-hook nil)
+		 (recentf-exclude '( (lambda (f) t) ))
+		 )
+	     (setq fb (find-file-noselect fn)))
+	   )
+	 (set-buffer fb)
+	 (prog1 ,@forms
+	   (if (not kb) (kill-buffer (current-buffer))))))))
 (put 'project-am-with-makefile-current 'lisp-indent-function 1)
 
 (add-hook 'edebug-setup-hook
@@ -507,14 +481,18 @@
 	      (form def-body))))
 
 
-(defun project-am-load-makefile (path)
+(defun project-am-load-makefile (path &optional suggestedname)
   "Convert PATH into a project Makefile, and return its project object.
-It does not check for existing project objects.  Use `project-am-load'."
+It does not check for existing project objects.  Use `project-am-load'.
+Optional argument SUGGESTEDNAME will be the project name.
+This is used when subprojects are made in named subdirectories."
   (project-am-with-makefile-current path
     (if (and ede-object (project-am-makefile-p ede-object))
 	ede-object
       (let* ((pi (project-am-package-info path))
-	     (pn (or (nth 0 pi) (project-am-last-dir fn)))
+	     (sfn (when suggestedname
+		    (project-am-last-dir suggestedname)))
+	     (pn (or sfn (nth 0 pi) (project-am-last-dir fn)))
 	     (ver (or (nth 1 pi) "0.0"))
 	     (bug (nth 2 pi))
 	     (cof (nth 3 pi))
@@ -532,21 +510,6 @@
 	ampf))))
 
 ;;; Methods:
-(defmethod ede-find-target ((amf project-am-makefile) buffer)
-  "Fetch the target belonging to BUFFER."
-  (or (call-next-method)
-      (let ((targ (oref amf targets))
-	    (sobj (oref amf subproj))
-	    (obj nil))
-	(while (and targ (not obj))
-	  (if (ede-buffer-mine (car targ) buffer)
-	      (setq obj (car targ)))
-	  (setq targ (cdr targ)))
-	(while (and sobj (not obj))
-	  (setq obj (project-am-buffer-object (car sobj) buffer)
-		sobj (cdr sobj)))
-	obj)))
-
 (defmethod project-targets-for-file ((proj project-am-makefile))
   "Return a list of targets the project PROJ."
   (oref proj targets))
@@ -556,44 +519,110 @@
 CURRPROJ is the current project being scanned.
 DIR is the directory to apply to new targets."
   (let* ((otargets (oref currproj targets))
+	 ;; `ntargets' results in complete targets list
+	 ;; not only the new targets by diffing.
 	 (ntargets nil)
 	 (tmp nil)
 	 )
-      (mapc
-       ;; Map all the different types
-       (lambda (typecar)
-	 (let ((macro (nth 2 typecar))
-	       (class (nth 1 typecar))
-	       (indirect (nth 3 typecar))
-	       ;(name (car typecar))
-	       )
-	   (if indirect
-	       ;; Map all the found objects
-	       (mapc (lambda (lstcar)
-		       (setq tmp (object-assoc lstcar 'name otargets))
-		       (when (not tmp)
-			 (setq tmp (apply class lstcar :name lstcar
-					  :path dir nil)))
-		       (project-rescan tmp)
-		       (setq ntargets (cons tmp ntargets)))
-		     (makefile-macro-file-list macro))
-	     ;; Non-indirect will have a target whos sources
-	     ;; are actual files, not names of other targets.
-	     (let ((files (makefile-macro-file-list macro)))
-	       (when files
-		 (setq tmp (object-assoc macro 'name otargets))
-		 (when (not tmp)
-		   (setq tmp (apply class macro :name macro
+
+    (mapc
+     ;; Map all the different types
+     (lambda (typecar)
+       (let ((macro (nth 2 typecar))
+	     (class (nth 1 typecar))
+	     (indirect (nth 3 typecar))
+	     )
+	 (if indirect
+	     ;; Map all the found objects
+	     (mapc (lambda (lstcar)
+		     (setq tmp (object-assoc lstcar 'name otargets))
+		     (when (not tmp)
+		       (setq tmp (apply class lstcar :name lstcar
+					:path dir nil)))
+		     (project-rescan tmp)
+		     (setq ntargets (cons tmp ntargets)))
+		   (makefile-macro-file-list macro))
+	   ;; Non-indirect will have a target whos sources
+	   ;; are actual files, not names of other targets.
+	   (let ((files (makefile-macro-file-list macro)))
+	     (when files
+	       (setq tmp (object-assoc macro 'name otargets))
+	       (when (not tmp)
+		 (setq tmp (apply class macro :name macro
+				  :path dir nil)))
+	       (project-rescan tmp)
+	       (setq ntargets (cons tmp ntargets))
+	       ))
+	   )
+	 ))
+     project-am-type-alist)
+
+    ;; At now check variables for meta-target regexp
+    ;; We have to check ntargets to avoid useless rescan.
+    ;; Also we have check otargets to prevent duplication.
+    (mapc
+     (lambda (typecar)
+       (let ((class (nth 0 typecar))
+	     (metaregex (nth 1 typecar))
+	     (indirect (nth 2 typecar)))
+	 (if indirect
+	     ;; Map all the found objects
+	     (mapc
+	      (lambda (lstcar)
+		(unless (object-assoc lstcar 'name ntargets)
+		  (or
+		   (setq tmp (object-assoc lstcar 'name otargets))
+		   (setq tmp (apply class lstcar :name lstcar
 				    :path dir nil)))
-		 (project-rescan tmp)
-		 (setq ntargets (cons tmp ntargets))
-		 ))
-	     )
-	   ))
-       project-am-type-alist)
-      ntargets))
+		  (project-rescan tmp)
+		  (setq ntargets (cons tmp ntargets))))
+	      ;; build a target list to map over
+	      (let (atargets)
+		(dolist (TAG
+			 (semantic-find-tags-by-name-regexp
+			  metaregex (semantic-find-tags-by-class
+				     'variable (semantic-fetch-tags))))
+		  ;; default-value have to be a list
+		  (when (cadr (assoc ':default-value TAG))
+		    (setq atargets
+			  (append
+			   (nreverse (cadr (assoc ':default-value TAG)))
+			   atargets))))
+		(nreverse atargets)))
 
-(defmethod project-rescan ((this project-am-makefile))
+	   ;; else not indirect, TODO: FIX various direct meta type in a sane way.
+	   (dolist (T (semantic-find-tags-by-name-regexp
+		       metaregex (semantic-find-tags-by-class
+				  'variable (semantic-fetch-tags))))
+	     (unless (setq tmp (object-assoc (car T) 'name ntargets))
+	       (or (setq tmp (object-assoc (car T) 'name otargets))
+		   ;; we are really new
+		   (setq tmp (apply class (car T) :name (car T)
+				    :path dir nil)))
+	       (project-rescan tmp)
+	       (setq ntargets (cons tmp ntargets))))
+	   )))
+     project-am-meta-type-alist)
+    ntargets))
+
+(defun project-am-expand-subdirlist (place subdirs)
+  "Store in PLACE the SUBDIRS expanded from variables.
+Strip out duplicates, and recurse on variables."
+  (mapc (lambda (sp)
+	  (let ((var (makefile-extract-varname-from-text sp)))
+	    (if var
+		;; If it is a variable, expand that variable, and keep going.
+		(project-am-expand-subdirlist
+		 place (makefile-macro-file-list var))
+	      ;; Else, add SP in if it isn't a dup.
+	      (if (member sp (symbol-value place))
+		  nil ; don't do it twice.
+		(set place (cons sp (symbol-value place))) ;; add
+		))))
+	subdirs)
+  )
+
+(defmethod project-rescan ((this project-am-makefile) &optional suggestedname)
   "Rescan the makefile for all targets and sub targets."
   (project-am-with-makefile-current (file-name-directory (oref this file))
     ;;(message "Scanning %s..." (oref this file))
@@ -603,10 +632,10 @@
 	   (bug (nth 2 pi))
 	   (cof (nth 3 pi))
 	   (osubproj (oref this subproj))
-	   (csubproj (or
-		      ;; If DIST_SUBDIRS doesn't exist, then go for the
-		      ;; static list of SUBDIRS.  The DIST version should
-		      ;; contain SUBDIRS plus extra stuff.
+	   ;; 1/30/10 - We need to append these two lists together,
+	   ;; then strip out duplicates.  Expanding this list (via
+	   ;; references to other variables should also strip out dups
+	   (csubproj (append
 		      (makefile-macro-file-list "DIST_SUBDIRS")
 		      (makefile-macro-file-list "SUBDIRS")))
 	   (csubprojexpanded nil)
@@ -617,79 +646,57 @@
 	   (tmp nil)
 	   (ntargets (project-am-scan-for-targets this dir))
 	   )
-
-      (and pn (string= (directory-file-name
-			(oref this directory))
-		       (directory-file-name
-			(project-am-find-topmost-level
-			 (oref this directory))))
-	   (oset this name pn)
-	   (and pv (oset this version pv))
-	   (and bug (oset this mailinglist bug))
-	   (oset this configureoutputfiles cof))
-
-;      ;; LISP is different.  Here there is only one kind of lisp (that I know of
-;      ;; anyway) so it doesn't get mapped when it is found.
-;      (if (makefile-move-to-macro "lisp_LISP")
-; 	  (let ((tmp (project-am-lisp "lisp"
-; 				      :name "lisp"
-; 				      :path dir)))
-; 	    (project-rescan tmp)
-; 	    (setq ntargets (cons tmp ntargets))))
-;
+      (if suggestedname
+	  (oset this name (project-am-last-dir suggestedname))
+	;; Else, setup toplevel project info.
+	(and pn (string= (directory-file-name
+			  (oref this directory))
+			 (directory-file-name
+			  (project-am-find-topmost-level
+			   (oref this directory))))
+	     (oset this name pn)
+	     (and pv (oset this version pv))
+	     (and bug (oset this mailinglist bug))
+	     (oset this configureoutputfiles cof)))
       ;; Now that we have this new list, chuck the old targets
       ;; and replace it with the new list of targets I just created.
       (oset this targets (nreverse ntargets))
       ;; We still have a list of targets.  For all buffers, make sure
       ;; their object still exists!
-
       ;; FIGURE THIS OUT
-
-      (mapc (lambda (sp)
- 	      (let ((var (makefile-extract-varname-from-text sp))
- 		    )
- 		(if (not var)
- 		    (setq csubprojexpanded (cons sp csubprojexpanded))
- 		  ;; If it is a variable, expand that variable, and keep going.
- 		  (let ((varexp (makefile-macro-file-list var)))
- 		    (dolist (V varexp)
- 		      (setq csubprojexpanded (cons V csubprojexpanded)))))
- 		))
- 	    csubproj)
-
+      (project-am-expand-subdirlist 'csubprojexpanded csubproj)
       ;; Ok, now lets look at all our sub-projects.
       (mapc (lambda (sp)
- 	      (let* ((subdir (file-name-as-directory
- 			      (expand-file-name
- 			       sp (file-name-directory (oref this :file)))))
- 		     (submake (expand-file-name
- 			       "Makefile.am"
- 			       subdir)))
- 		(if (string= submake (oref this :file))
- 		    nil	;; don't recurse.. please!
-
- 		  ;; For each project id found, see if we need to recycle,
- 		  ;; and if we do not, then make a new one.  Check the deep
- 		  ;; rescan value for behavior patterns.
- 		  (setq tmp (object-assoc
- 			     submake
- 			     'file osubproj))
- 		  (if (not tmp)
- 		      (setq tmp
- 			    (condition-case nil
- 				;; In case of problem, ignore it.
- 				(project-am-load-makefile subdir)
- 			      (error nil)))
- 		    ;; If we have tmp, then rescan it only if deep mode.
- 		    (if ede-deep-rescan
- 			(project-rescan tmp)))
- 		  ;; Tac tmp onto our list of things to keep, but only
- 		  ;; if tmp was found.
- 		  (when tmp
- 		    ;;(message "Adding %S" (object-print tmp))
- 		    (setq nsubproj (cons tmp nsubproj)))))
- 	      )
- 	    (nreverse csubprojexpanded))
+	      (let* ((subdir (file-name-as-directory
+			      (expand-file-name
+			       sp (file-name-directory (oref this :file)))))
+		     (submake (expand-file-name
+			       "Makefile.am"
+			       subdir)))
+		(if (string= submake (oref this :file))
+		    nil	;; don't recurse.. please!
+		  ;; For each project id found, see if we need to recycle,
+		  ;; and if we do not, then make a new one.  Check the deep
+		  ;; rescan value for behavior patterns.
+		  (setq tmp (object-assoc
+			     submake
+			     'file osubproj))
+		  (if (not tmp)
+		      (setq tmp
+			    (condition-case nil
+				;; In case of problem, ignore it.
+				(project-am-load-makefile subdir subdir)
+			      (error nil)))
+		    ;; If we have tmp, then rescan it only if deep mode.
+		    (if ede-deep-rescan
+			(project-rescan tmp subdir)))
+		  ;; Tac tmp onto our list of things to keep, but only
+		  ;; if tmp was found.
+		  (when tmp
+		    ;;(message "Adding %S" (object-print tmp))
+		    (setq nsubproj (cons tmp nsubproj)))))
+	      )
+	    (nreverse csubprojexpanded))
       (oset this subproj nsubproj)
       ;; All elements should be updated now.
       )))
@@ -698,12 +705,16 @@
 (defmethod project-rescan ((this project-am-program))
   "Rescan object THIS."
   (oset this :source (makefile-macro-file-list (project-am-macro this)))
+  (unless (oref this :source)
+    (oset this :source (list (concat (oref this :name) ".c"))))
   (oset this :ldadd (makefile-macro-file-list
 		     (concat (oref this :name) "_LDADD"))))
 
 (defmethod project-rescan ((this project-am-lib))
   "Rescan object THIS."
-  (oset this :source (makefile-macro-file-list (project-am-macro this))))
+  (oset this :source (makefile-macro-file-list (project-am-macro this)))
+  (unless (oref this :source)
+    (oset this :source (list (concat (file-name-sans-extension (oref this :name)) ".c")))))
 
 (defmethod project-rescan ((this project-am-texinfo))
   "Rescan object THIS."
@@ -728,19 +739,6 @@
 (defmethod project-rescan ((this project-am-extra-dist))
   "Rescan object THIS."
   (oset this :source (makefile-macro-file-list "EXTRA_DIST")))
-  ;; NOTE: The below calls 'file' then checks that it is some sort of
-  ;; text file.  The  file command may not be available on all platforms
-  ;; and some files may not exist yet.  (ie - auto-generated)
-
-  ;;(mapc
-  ;; (lambda (f)
-  ;;   ;; prevent garbage to be parsed, could we use :aux ?
-  ;;   (if (and (not (member f (oref this :source)))
-  ;;	      (string-match-p "ASCII\\|text"
-  ;;			      (shell-command-to-string
-  ;;			       (concat "file " f))))
-  ;;	 (oset this :source (cons f (oref this :source)))))
-  ;; (makefile-macro-file-list "EXTRA_DIST")))
 
 (defmethod project-am-macro ((this project-am-objectcode))
   "Return the default macro to 'edit' for this object type."
@@ -810,22 +808,24 @@
 
 (defmethod ede-buffer-mine ((this project-am-objectcode) buffer)
   "Return t if object THIS lays claim to the file in BUFFER."
-  (member (file-name-nondirectory (buffer-file-name buffer))
+  (member (file-relative-name (buffer-file-name buffer) (oref this :path))
 	  (oref this :source)))
 
 (defmethod ede-buffer-mine ((this project-am-texinfo) buffer)
   "Return t if object THIS lays claim to the file in BUFFER."
-  (let ((bfn (buffer-file-name buffer)))
-    (or (string= (oref this :name)  (file-name-nondirectory bfn))
-	(member (file-name-nondirectory bfn) (oref this :include)))))
+  (let ((bfn (file-relative-name (buffer-file-name buffer)
+				 (oref this :path))))
+    (or (string= (oref this :name)  bfn)
+	(member bfn (oref this :include)))))
 
 (defmethod ede-buffer-mine ((this project-am-man) buffer)
   "Return t if object THIS lays claim to the file in BUFFER."
-  (string= (oref this :name) (buffer-file-name buffer)))
+  (string= (oref this :name)
+	   (file-relative-name (buffer-file-name buffer) (oref this :path))))
 
 (defmethod ede-buffer-mine ((this project-am-lisp) buffer)
   "Return t if object THIS lays claim to the file in BUFFER."
-  (member (file-name-nondirectory (buffer-file-name buffer))
+  (member (file-relative-name (buffer-file-name buffer) (oref this :path))
 	  (oref this :source)))
 
 (defmethod project-am-subtree ((ampf project-am-makefile) subdir)
@@ -956,7 +956,6 @@
     (cond
      ;; Try configure.in or configure.ac
      (conf-in
-      (require 'ede/autoconf-edit)
       (project-am-with-config-current conf-in
 	(let ((aci (autoconf-parameters-for-macro "AC_INIT"))
 	      (aia (autoconf-parameters-for-macro "AM_INIT_AUTOMAKE"))
@@ -982,7 +981,7 @@
 				(t acf))))
 	    (if (> (length outfiles) 1)
 		(setq configfiles outfiles)
-	      (setq configfiles (split-string (car outfiles) " " t)))
+	      (setq configfiles (split-string (car outfiles) "\\s-" t)))
 	    )
 	  ))
       )
@@ -1007,6 +1006,18 @@
     (when top (setq dir (oref top :directory)))
     (project-am-extract-package-info dir)))
 
+;; for simple per project include path extension
+(defmethod ede-system-include-path ((this project-am-makefile))
+  "Return `project-am-localvars-include-path', usually local variable
+per file or in .dir-locals.el or similar."
+  (bound-and-true-p project-am-localvars-include-path))
+
+(defmethod ede-system-include-path ((this project-am-target))
+  "Return `project-am-localvars-include-path', usually local variable
+per file or in .dir-locals.el or similar."
+  (bound-and-true-p project-am-localvars-include-path))
+
+
 (provide 'ede/project-am)
 
 ;; arch-tag: 528db935-f186-4240-b647-e305c5b784a2
--- a/lisp/cedet/ede/shell.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/shell.el	Thu Sep 23 15:00:31 2010 -0400
@@ -70,7 +70,7 @@
 (defmethod ede-shell-buffer ((target ede-target))
   "Get the buffer for running shell commands for TARGET."
   (let ((name (ede-name target)))
-    (get-buffer-create (format "*EDE Shell %s" name))))
+    (get-buffer-create (format "*EDE Shell %s*" name))))
 
 (provide 'ede/shell)
 
--- a/lisp/cedet/ede/simple.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/simple.el	Thu Sep 23 15:00:31 2010 -0400
@@ -21,6 +21,10 @@
 
 ;;; Commentary:
 ;;
+;; NOTE: EDE Simple Projects are considered obsolete.  Use generic
+;; projects instead.  They have much better automatic support and
+;; simpler configuration.
+;;
 ;; A vast majority of projects use non-EDE project techniques, such
 ;; as hand written Makefiles, or other IDE's.
 ;;
@@ -41,6 +45,14 @@
 
 ;;; Code:
 
+(add-to-list 'ede-project-class-files
+	     (ede-project-autoload "simple-overlay"
+	      :name "Simple" :file 'ede-simple
+	      :proj-file 'ede-simple-projectfile-for-dir
+	      :load-type 'ede-simple-load
+	      :class-sym 'ede-simple-project)
+	     t)
+
 (defcustom ede-simple-save-directory "~/.ede"
   "*Directory where simple EDE project overlays are saved."
  :group 'ede
--- a/lisp/cedet/ede/speedbar.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/speedbar.el	Thu Sep 23 15:00:31 2010 -0400
@@ -108,7 +108,7 @@
 ;;; Some special commands useful in EDE
 ;;
 (defun ede-speedbar-remove-file-from-target ()
-  "Remove the file at point from it's target."
+  "Remove the file at point from its target."
   (interactive)
   (if (stringp (speedbar-line-token))
       (progn
--- a/lisp/cedet/ede/srecode.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/ede/srecode.el	Thu Sep 23 15:00:31 2010 -0400
@@ -43,7 +43,9 @@
   (srecode-map-update-map t)
   ;; We don't call this unless we need it.  Load in the templates.
   (srecode-load-tables-for-mode 'makefile-mode)
-  (srecode-load-tables-for-mode 'makefile-mode 'ede))
+  (srecode-load-tables-for-mode 'makefile-mode 'ede)
+  (srecode-load-tables-for-mode 'autoconf-mode)
+  (srecode-load-tables-for-mode 'autoconf-mode 'ede))
 
 (defmacro ede-srecode-insert-with-dictionary (template &rest forms)
   "Insert TEMPLATE after executing FORMS with a dictionary.
--- a/lisp/cedet/pulse.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/pulse.el	Thu Sep 23 15:00:31 2010 -0400
@@ -3,6 +3,7 @@
 ;;; Copyright (C) 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Author: Eric M. Ludlam <eric@siege-engine.com>
+;; Version: 1.0
 
 ;; This file is part of GNU Emacs.
 
@@ -57,10 +58,14 @@
     (error nil)))
 
 (defcustom pulse-flag (pulse-available-p)
-  "*Non-nil means to pulse the overlay face for momentary highlighting.
-Pulsing involves a bright highlight that slowly shifts to the background
-color.  Non-nil just means to highlight with an unchanging color for a short
-time.
+  "Whether to use pulsing for momentary highlighting.
+Pulsing involves a bright highlight that slowly shifts to the
+background color.
+
+If the value is nil, highlight with an unchanging color until a
+key is pressed.
+If the value is `never', do no coloring at all.
+Any other value means to the default pulsing behavior.
 
 If `pulse-flag' is non-nil, but `pulse-available-p' is nil, then
 this flag is ignored."
@@ -178,22 +183,23 @@
 Optional argument FACE specifies the fact to do the highlighting."
   (overlay-put o 'original-face (overlay-get o 'face))
   (add-to-list 'pulse-momentary-overlay o)
-  (if (or (not pulse-flag) (not (pulse-available-p)))
-      ;; Provide a face... clear on next command
-      (progn
-	(overlay-put o 'face (or face 'pulse-highlight-start-face))
-	(add-hook 'pre-command-hook
-		  'pulse-momentary-unhighlight)
-	)
-    ;; pulse it.
-    (unwind-protect
+  (if (eq pulse-flag 'never)
+      nil
+    (if (or (not pulse-flag) (not (pulse-available-p)))
+	;; Provide a face... clear on next command
 	(progn
-	  (overlay-put o 'face 'pulse-highlight-face)
-	  ;; The pulse function puts FACE onto 'pulse-highlight-face.
-	  ;; Thus above we put our face on the overlay, but pulse
-	  ;; with a reference face needed for the color.
-	  (pulse face))
-      (pulse-momentary-unhighlight))))
+	  (overlay-put o 'face (or face 'pulse-highlight-start-face))
+	  (add-hook 'pre-command-hook
+		    'pulse-momentary-unhighlight))
+      ;; pulse it.
+      (unwind-protect
+	  (progn
+	    (overlay-put o 'face 'pulse-highlight-face)
+	    ;; The pulse function puts FACE onto 'pulse-highlight-face.
+	    ;; Thus above we put our face on the overlay, but pulse
+	    ;; with a reference face needed for the color.
+	    (pulse face))
+	(pulse-momentary-unhighlight)))))
 
 (defun pulse-momentary-unhighlight ()
   "Unhighlight a line recently highlighted."
--- a/lisp/cedet/semantic.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic.el	Thu Sep 23 15:00:31 2010 -0400
@@ -5,7 +5,7 @@
 
 ;; Author: Eric M. Ludlam <zappo@gnu.org>
 ;; Keywords: syntax tools
-;; Version: 2.0pre7
+;; Version: 2.0
 
 ;; This file is part of GNU Emacs.
 
@@ -39,7 +39,7 @@
 (require 'semantic/tag)
 (require 'semantic/lex)
 
-(defvar semantic-version "2.0pre7"
+(defvar semantic-version "2.0"
   "Current version of Semantic.")
 
 (declare-function inversion-test "inversion")
@@ -876,6 +876,7 @@
     ;; (define-key km "i"    'senator-isearch-toggle-semantic-mode)
     (define-key map "\C-c,j" 'semantic-complete-jump-local)
     (define-key map "\C-c,J" 'semantic-complete-jump)
+    (define-key map "\C-c,m" 'semantic-complete-jump-local-members)
     (define-key map "\C-c,g" 'semantic-symref-symbol)
     (define-key map "\C-c,G" 'semantic-symref)
     (define-key map "\C-c,p" 'senator-previous-tag)
@@ -886,6 +887,7 @@
     (define-key map "\C-c,\M-w" 'senator-copy-tag)
     (define-key map "\C-c,\C-y" 'senator-yank-tag)
     (define-key map "\C-c,r" 'senator-copy-tag-to-register)
+    (define-key map "\C-c,," 'semantic-force-refresh)
     (define-key map [?\C-c ?, up] 'senator-transpose-tags-up)
     (define-key map [?\C-c ?, down] 'senator-transpose-tags-down)
     (define-key map "\C-c,l" 'semantic-analyze-possible-completions)
@@ -951,6 +953,9 @@
   (define-key navigate-menu [semantic-complete-jump]
     '(menu-item "Find Tag Globally..." semantic-complete-jump
 		:help "Read a tag name and find it in the current project"))
+  (define-key navigate-menu [semantic-complete-jump-local-members]
+    '(menu-item "Find Local Members ..." semantic-complete-jump-local-members
+		:help "Read a tag name and find a local member with that name"))
   (define-key navigate-menu [semantic-complete-jump-local]
     '(menu-item "Find Tag in This Buffer..." semantic-complete-jump-local
 		:help "Read a tag name and find it in this buffer"))
--- a/lisp/cedet/semantic/analyze.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/analyze.el	Thu Sep 23 15:00:31 2010 -0400
@@ -253,7 +253,7 @@
 	(tag nil)			; tag return list
 	(tagtype nil)			; tag types return list
 	(fname nil)
-	(miniscope (clone scope))
+	(miniscope (when scope (clone scope)))
 	)
     ;; First order check.  Is this wholely contained in the typecache?
     (setq tmp (semanticdb-typecache-find sequence))
@@ -297,11 +297,12 @@
 	      ;; and we can use it directly.
 	      (cond ((semantic-tag-of-class-p tmp 'type)
 		     ;; update the miniscope when we need to analyze types directly.
-		     (let ((rawscope
-			    (apply 'append
-				   (mapcar 'semantic-tag-type-members
-					   tagtype))))
-		       (oset miniscope fullscope rawscope))
+		     (when miniscope
+		       (let ((rawscope
+			      (apply 'append
+				     (mapcar 'semantic-tag-type-members
+					     tagtype))))
+			 (oset miniscope fullscope rawscope)))
 		     ;; Now analayze the type to remove metatypes.
 		     (or (semantic-analyze-type tmp miniscope)
 			 tmp))
@@ -351,7 +352,7 @@
 additional tags which are in SCOPE and do not need prefixing to
 find.
 
-This is a wrapper on top of semanticdb, semanticdb-typecache,
+This is a wrapper on top of semanticdb, semanticdb typecache,
 semantic-scope, and semantic search functions.  Almost all
 searches use the same arguments."
   (let ((namelst (if (consp name) name ;; test if pre-split.
--- a/lisp/cedet/semantic/analyze/complete.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/analyze/complete.el	Thu Sep 23 15:00:31 2010 -0400
@@ -63,11 +63,15 @@
 ;;; MAIN completion calculator
 ;;
 ;;;###autoload
-(define-overloadable-function semantic-analyze-possible-completions (context)
+(define-overloadable-function semantic-analyze-possible-completions (context &rest flags)
   "Return a list of semantic tags which are possible completions.
 CONTEXT is either a position (such as point), or a precalculated
 context.  Passing in a context is useful if the caller also needs
 to access parts of the analysis.
+The remaining FLAGS arguments are passed to the mode specific completion engine.
+Bad flags should be ignored by modes that don't use them.
+See `semantic-analyze-possible-completions-default' for details on the default FLAGS.
+
 Completions run through the following filters:
   * Elements currently in scope
   * Constants currently in scope
@@ -98,9 +102,13 @@
 	 (get-buffer-window "*Possible Completions*")))
       ans)))
 
-(defun semantic-analyze-possible-completions-default (context)
+(defun semantic-analyze-possible-completions-default (context &optional flags)
   "Default method for producing smart completions.
-Argument CONTEXT is an object specifying the locally derived context."
+Argument CONTEXT is an object specifying the locally derived context.
+The optional argument FLAGS changes which return options are returned.
+FLAGS can be any number of:
+  'no-tc     - do not apply data-type constraint.
+  'no-unique - do not apply unique by name filtering."
   (let* ((a context)
 	 (desired-type (semantic-analyze-type-constraint a))
 	 (desired-class (oref a prefixclass))
@@ -109,8 +117,13 @@
 	 (completetext nil)
 	 (completetexttype nil)
 	 (scope (oref a scope))
-	 (localvar (oref scope localvar))
-	 (c nil))
+	 (localvar (when scope (oref scope localvar)))
+	 (origc nil)
+	 (c nil)
+	 (any nil)
+	 (do-typeconstraint (not (memq 'no-tc flags)))
+	 (do-unique (not (memq 'no-unique flags)))
+	 )
 
     ;; Calculate what our prefix string is so that we can
     ;; find all our matching text.
@@ -160,33 +173,36 @@
 	       ;; Argument list and local variables
 	       (semantic-find-tags-for-completion completetext localvar)
 	       ;; The current scope
-	       (semantic-find-tags-for-completion completetext (oref scope fullscope))
+	       (semantic-find-tags-for-completion completetext (when scope (oref scope fullscope)))
 	       ;; The world
 	       (semantic-analyze-find-tags-by-prefix completetext))
 	    )
       )
 
-    (let ((origc c)
+    (let ((loopc c)
 	  (dtname (semantic-tag-name desired-type)))
 
+      ;; Save off our first batch of completions
+      (setq origc c)
+
       ;; Reset c.
       (setq c nil)
 
       ;; Loop over all the found matches, and catagorize them
       ;; as being possible features.
-      (while origc
+      (while (and loopc do-typeconstraint)
 
 	(cond
 	 ;; Strip operators
-	 ((semantic-tag-get-attribute (car origc) :operator-flag)
+	 ((semantic-tag-get-attribute (car loopc) :operator-flag)
 	  nil
 	  )
 
 	 ;; If we are completing from within some prefix,
 	 ;; then we want to exclude constructors and destructors
 	 ((and completetexttype
-	       (or (semantic-tag-get-attribute (car origc) :constructor-flag)
-		   (semantic-tag-get-attribute (car origc) :destructor-flag)))
+	       (or (semantic-tag-get-attribute (car loopc) :constructor-flag)
+		   (semantic-tag-get-attribute (car loopc) :destructor-flag)))
 	  nil
 	  )
 
@@ -197,17 +213,17 @@
 	   ;; Ok, we now have a completion list based on the text we found
 	   ;; we want to complete on.  Now filter that stream against the
 	   ;; type we want to search for.
-	   ((string= dtname (semantic-analyze-type-to-name (semantic-tag-type (car origc))))
-	    (setq c (cons (car origc) c))
+	   ((string= dtname (semantic-analyze-type-to-name (semantic-tag-type (car loopc))))
+	    (setq c (cons (car loopc) c))
 	    )
 
 	   ;; Now anything that is a compound type which could contain
 	   ;; additional things which are of the desired type
-	   ((semantic-tag-type (car origc))
-	    (let ((att (semantic-analyze-tag-type (car origc) scope))
+	   ((semantic-tag-type (car loopc))
+	    (let ((att (semantic-analyze-tag-type (car loopc) scope))
 		)
 	      (if (and att (semantic-tag-type-members att))
-		  (setq c (cons (car origc) c))))
+		  (setq c (cons (car loopc) c))))
 	    )
 
 	   ) ; cond
@@ -215,11 +231,11 @@
 
 	 ;; No desired type, no other restrictions.  Just add.
 	 (t
-	  (setq c (cons (car origc) c)))
+	  (setq c (cons (car loopc) c)))
 
 	 ); cond
 
-	(setq origc (cdr origc)))
+	(setq loopc (cdr loopc)))
 
       (when desired-type
 	;; Some types, like the enum in C, have special constant values that
@@ -241,15 +257,16 @@
     (when desired-class
       (setq c (semantic-analyze-tags-of-class-list c desired-class)))
 
-    ;; Pull out trash.
-    ;; NOTE TO SELF: Is this too slow?
-    ;; OTHER NOTE: Do we not want to strip duplicates by name and
-    ;; only by position?  When are duplicate by name but not by tag
-    ;; useful?
-    (setq c (semantic-unique-tag-table-by-name c))
+    (if do-unique
+	(if c
+	    ;; Pull out trash.
+	    ;; NOTE TO SELF: Is this too slow?
+	    (setq c (semantic-unique-tag-table-by-name c))
+	  (setq c (semantic-unique-tag-table-by-name origc)))
+      (when (not c)
+	(setq c origc)))
 
     ;; All done!
-
     c))
 
 (provide 'semantic/analyze/complete)
--- a/lisp/cedet/semantic/analyze/debug.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/analyze/debug.el	Thu Sep 23 15:00:31 2010 -0400
@@ -54,6 +54,8 @@
 
     ))
 
+;; @TODO - If this happens, but the last found type is
+;; a datatype, then the below is wrong
 (defun semantic-analyzer-debug-found-prefix (ctxt)
   "Debug the prefix found by the analyzer output CTXT."
   (let* ((pf (oref ctxt prefix))
@@ -97,7 +99,7 @@
 	)
     (with-output-to-temp-buffer (help-buffer)
       (with-current-buffer standard-output
-	(princ "Unable to find prefix ")
+	(princ "Unable to find symbol ")
 	(princ prefix)
 	(princ ".\n\n")
 
@@ -217,7 +219,7 @@
     (when (not dt) (error "Missing Innertype debugger is confused"))
     (with-output-to-temp-buffer (help-buffer)
       (with-current-buffer standard-output
-	(princ "Cannot find prefix \"")
+	(princ "Cannot find symbol \"")
 	(princ prefixitem)
 	(princ "\" in datatype:
   ")
@@ -550,24 +552,25 @@
   (let ((str (semantic-format-tag-prototype tag parent)))
     (if (and (semantic-tag-with-position-p tag)
 	     (semantic-tag-file-name tag))
-	(insert-button str
-		       'mouse-face 'custom-button-pressed-face
-		       'tag tag
-		       'action
-		       `(lambda (button)
-			  (let ((buff nil)
-				(pnt nil))
-			    (save-excursion
-			      (semantic-go-to-tag
-			       (button-get button 'tag))
-			      (setq buff (current-buffer))
-			      (setq pnt (point)))
-			    (if (get-buffer-window buff)
-				(select-window (get-buffer-window buff))
-			      (pop-to-buffer buff t))
-			    (goto-char pnt)
-			    (pulse-line-hook-function)))
-		       )
+	(with-current-buffer standard-output
+	  (insert-button str
+			 'mouse-face 'custom-button-pressed-face
+			 'tag tag
+			 'action
+			 `(lambda (button)
+			    (let ((buff nil)
+				  (pnt nil))
+			      (save-excursion
+				(semantic-go-to-tag
+				 (button-get button 'tag))
+				(setq buff (current-buffer))
+				(setq pnt (point)))
+			      (if (get-buffer-window buff)
+				  (select-window (get-buffer-window buff))
+				(pop-to-buffer buff t))
+			      (goto-char pnt)
+			      (pulse-line-hook-function)))
+			 ))
       (princ "\"")
       (princ str)
       (princ "\""))
--- a/lisp/cedet/semantic/analyze/refs.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/analyze/refs.el	Thu Sep 23 15:00:31 2010 -0400
@@ -104,6 +104,7 @@
   "Return the implementations derived in the reference analyzer REFS.
 Optional argument IN-BUFFER indicates that the returned tag should be in an active buffer."
   (let ((allhits (oref refs rawsearchdata))
+	(tag (oref refs :tag))
 	(impl nil)
 	)
     (semanticdb-find-result-mapc
@@ -113,7 +114,8 @@
 	      (aT (cdr ans))
 	      (aDB (car ans))
 	      )
-	 (when (not (semantic-tag-prototype-p aT))
+	 (when (and (not (semantic-tag-prototype-p aT))
+		    (semantic-tag-similar-p tag aT :prototype-flag :parent))
 	   (when in-buffer (save-excursion (semantic-go-to-tag aT aDB)))
 	   (push aT impl))))
      allhits)
@@ -123,6 +125,7 @@
   "Return the prototypes derived in the reference analyzer REFS.
 Optional argument IN-BUFFER indicates that the returned tag should be in an active buffer."
   (let ((allhits (oref refs rawsearchdata))
+	(tag (oref refs :tag))
 	(proto nil))
     (semanticdb-find-result-mapc
      (lambda (T DB)
@@ -131,7 +134,8 @@
 	      (aT (cdr ans))
 	      (aDB (car ans))
 	      )
-	 (when (semantic-tag-prototype-p aT)
+	 (when (and (semantic-tag-prototype-p aT)
+		    (semantic-tag-similar-p tag aT :prototype-flag :parent))
 	   (when in-buffer (save-excursion (semantic-go-to-tag aT aDB)))
 	   (push aT proto))))
      allhits)
@@ -142,8 +146,8 @@
 (defun semantic--analyze-refs-full-lookup (tag scope)
   "Perform a full lookup for all occurrences of TAG in the current project.
 TAG should be the tag currently under point.
-PARENT is the list of tags that are parents to TAG by
-containment, as opposed to reference."
+SCOPE is the scope the cursor is in.  From this a list of parents is
+derived.  If SCOPE does not have parents, then only a simple lookup is done."
   (if (not (oref scope parents))
       ;; If this tag has some named parent, but is not
       (semantic--analyze-refs-full-lookup-simple tag)
@@ -177,20 +181,36 @@
     ans))
 
 (defun semantic--analyze-refs-find-tags-with-parent (find-results parents)
-  "Find in FIND-RESULTS all tags with PARNTS.
+  "Find in FIND-RESULTS all tags with PARENTS.
 NAME is the name of the tag needing finding.
 PARENTS is a list of names."
-  (let ((ans nil))
+  (let ((ans nil) (usingnames nil))
+    ;; Loop over the find-results passed in.
     (semanticdb-find-result-mapc
      (lambda (tag db)
        (let* ((p (semantic-tag-named-parent tag))
-	      (ps (when (stringp p)
-		    (semantic-analyze-split-name p))))
+	      (ps (when (stringp p) (semantic-analyze-split-name p))))
 	 (when (stringp ps) (setq ps (list ps)))
-	 (when (and ps (equal ps parents))
-	   ;; We could optimize this, but it seems unlikely.
-	   (push (list db tag) ans))
-	 ))
+	 (when ps
+	   ;; If there is a perfect match, then use it.
+	   (if (equal ps parents)
+	       (push (list db tag) ans))
+	   ;; No match, find something from our list of using names.
+	   ;; Do we need to split UN?
+	   (save-excursion
+	     (semantic-go-to-tag tag db)
+	     (setq usingnames nil)
+	     (let ((imports (semantic-ctxt-imported-packages)))
+	       ;; Derive the names from all the using statements.
+	       (mapc (lambda (T)
+		       (setq usingnames
+			     (cons (semantic-format-tag-name-from-anything T) usingnames)))
+		     imports))
+	     (dolist (UN usingnames)
+	       (when (equal (cons UN ps) parents)
+		 (push (list db tag) ans)
+		 (setq usingnames (cdr usingnames))))
+	     ))))
      find-results)
     ans))
 
@@ -206,7 +226,7 @@
 	 ;; Find all hits for the first parent name.
 	 (brute (semanticdb-find-tags-collector
 		 (lambda (table tags)
-		   (semanticdb-find-tags-by-name-method table name tags)
+		   (semanticdb-deep-find-tags-by-name-method table name tags)
 		   )
 		 nil nil t))
 	 ;; Prime the answer.
@@ -214,6 +234,7 @@
 	 )
     ;; First parent is already search to initialize "brute".
     (setq plist (cdr plist))
+
     ;; Go through the list of parents, and try to find matches.
     ;; As we cycle through plist, for each level look for NAME,
     ;; and compare the named-parent, and also dive into the next item of
@@ -253,7 +274,8 @@
 		 (lambda (table tags)
 		   (semanticdb-find-tags-by-name-method table name tags)
 		   )
-		 nil nil t))
+		 nil ;; This may need to be the entire project??
+		 nil t))
 	 )
 
 	(when (and (not brute) (not noerror))
--- a/lisp/cedet/semantic/bovine/c.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/bovine/c.el	Thu Sep 23 15:00:31 2010 -0400
@@ -39,6 +39,7 @@
 (declare-function semantic-brute-find-tag-by-attribute "semantic/find")
 (declare-function semanticdb-minor-mode-p "semantic/db-mode")
 (declare-function semanticdb-needs-refresh-p "semantic/db")
+(declare-function semanticdb-typecache-faux-namespace "semantic/db-typecache")
 (declare-function c-forward-conditional "cc-cmds")
 (declare-function ede-system-include-path "ede")
 
@@ -158,7 +159,7 @@
 Each entry is a cons cell like this:
   ( \"KEYWORD\" . \"REPLACEMENT\" )
 Where KEYWORD is the macro that gets replaced in the lexical phase,
-and REPLACEMENT is a string that is inserted in it's place.  Empty string
+and REPLACEMENT is a string that is inserted in its place.  Empty string
 implies that the lexical analyzer will discard KEYWORD when it is encountered.
 
 Alternately, it can be of the form:
@@ -295,6 +296,7 @@
       (cond
        ((looking-at "^\\s-*#\\s-*if")
 	;; We found a nested if.  Skip it.
+	;; @TODO - can we use the new c-scan-conditionals
 	(c-forward-conditional 1))
        ((looking-at "^\\s-*#\\s-*elif")
 	;; We need to let the preprocessor analize this one.
@@ -348,7 +350,6 @@
 	  ;; (message "%s %s yes" ift sym)
 	  (beginning-of-line)
 	  (setq pt (point))
-	  ;;(c-forward-conditional 1)
 	  ;; This skips only a section of a conditional.  Once that section
 	  ;; is opened, encountering any new #else or related conditional
 	  ;; should be skipped.
@@ -356,8 +357,8 @@
 	  (setq semantic-lex-end-point (point))
 	  (semantic-push-parser-warning (format "Skip #%s %s" ift sym)
 					pt (point))
-;;	  (semantic-lex-push-token
-;;	   (semantic-lex-token 'c-preprocessor-skip pt (point)))
+	  ;;	  (semantic-lex-push-token
+	  ;;	   (semantic-lex-token 'c-preprocessor-skip pt (point)))
 	  nil)
       ;; Else, don't ignore it, but do handle the internals.
       ;;(message "%s %s no" ift sym)
@@ -703,58 +704,60 @@
 	 (symtext (semantic-lex-token-text lexicaltoken))
 	 (macros (get-text-property 0 'macros symtext))
 	 )
-    (with-current-buffer buf
-      (erase-buffer)
-      (when (not (eq major-mode mode))
-	(save-match-data
+    (if (> semantic-c-parse-token-hack-depth 5)
+	nil
+      (with-current-buffer buf
+	(erase-buffer)
+	(when (not (eq major-mode mode))
+	  (save-match-data
 
-	  ;; Protect against user hooks throwing errors.
-	  (condition-case nil
-	      (funcall mode)
-	    (error
-	     (if (y-or-n-p
-		  (format "There was an error initializing %s in buffer \"%s\".  Debug your hooks? "
-			  mode (buffer-name)))
-		 (semantic-c-debug-mode-init mode)
-	       (message "Macro parsing state may be broken...")
-	       (sit-for 1))))
-	  ) ; save match data
+	    ;; Protect against user hooks throwing errors.
+	    (condition-case nil
+		(funcall mode)
+	      (error
+	       (if (y-or-n-p
+		    (format "There was an error initializing %s in buffer \"%s\".  Debug your hooks? "
+			    mode (buffer-name)))
+		   (semantic-c-debug-mode-init mode)
+		 (message "Macro parsing state may be broken...")
+		 (sit-for 1))))
+	    )				; save match data
 
-	;; Hack in mode-local
-	(activate-mode-local-bindings)
-	;; CHEATER!  The following 3 lines are from
-	;; `semantic-new-buffer-fcn', but we don't want to turn
-	;; on all the other annoying modes for this little task.
-	(setq semantic-new-buffer-fcn-was-run t)
-	(semantic-lex-init)
-	(semantic-clear-toplevel-cache)
-	(remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
-		     t)
-	)
-      ;; Get the macro symbol table right.
-      (setq semantic-lex-spp-dynamic-macro-symbol-obarray spp-syms)
-      ;; (message "%S" macros)
-      (dolist (sym macros)
-	(semantic-lex-spp-symbol-set (car sym) (cdr sym)))
+	  ;; Hack in mode-local
+	  (activate-mode-local-bindings)
+	  ;; CHEATER!  The following 3 lines are from
+	  ;; `semantic-new-buffer-fcn', but we don't want to turn
+	  ;; on all the other annoying modes for this little task.
+	  (setq semantic-new-buffer-fcn-was-run t)
+	  (semantic-lex-init)
+	  (semantic-clear-toplevel-cache)
+	  (remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
+		       t)
+	  )
+	;; Get the macro symbol table right.
+	(setq semantic-lex-spp-dynamic-macro-symbol-obarray spp-syms)
+	;; (message "%S" macros)
+	(dolist (sym macros)
+	  (semantic-lex-spp-symbol-set (car sym) (cdr sym)))
 
-      (insert symtext)
+	(insert symtext)
 
-      (setq stream
-	    (semantic-parse-region-default
-	     (point-min) (point-max) nonterminal depth returnonerror))
+	(setq stream
+	      (semantic-parse-region-default
+	       (point-min) (point-max) nonterminal depth returnonerror))
 
-      ;; Clean up macro symbols
-      (dolist (sym macros)
-	(semantic-lex-spp-symbol-remove (car sym)))
+	;; Clean up macro symbols
+	(dolist (sym macros)
+	  (semantic-lex-spp-symbol-remove (car sym)))
 
-      ;; Convert the text of the stream.
-      (dolist (tag stream)
-	;; Only do two levels here 'cause I'm lazy.
-	(semantic--tag-set-overlay tag (list start end))
-	(dolist (stag (semantic-tag-components-with-overlays tag))
-	  (semantic--tag-set-overlay stag (list start end))
-	  ))
-      )
+	;; Convert the text of the stream.
+	(dolist (tag stream)
+	  ;; Only do two levels here 'cause I'm lazy.
+	  (semantic--tag-set-overlay tag (list start end))
+	  (dolist (stag (semantic-tag-components-with-overlays tag))
+	    (semantic--tag-set-overlay stag (list start end))
+	    ))
+	))
     stream))
 
 (defvar semantic-c-debug-mode-init-last-mode nil
@@ -920,8 +923,34 @@
 	 ;; of type "typedef".
 	 ;; Each elt of NAME is ( STARS NAME )
 	 (let ((vl nil)
-	       (names (semantic-tag-name tag)))
+	       (names (semantic-tag-name tag))
+	       (super (semantic-tag-get-attribute tag :superclasses))
+	       (addlast nil))
+
+	   (when (and (semantic-tag-of-type-p tag "typedef")
+		      (semantic-tag-of-class-p super 'type)
+		      (semantic-tag-type-members super))
+	     ;; This is a typedef of a real type.  Extract
+	     ;; the super class, and stick it into the tags list.
+	     (setq addlast super)
+
+	     ;; Clone super and remove the members IFF super has a name.
+	     ;; Note: anonymous struct/enums that are typedef'd shouldn't
+	     ;; exist in the top level type list, so they will appear only
+	     ;; in the :typedef slot of the typedef.
+	     (setq super (semantic-tag-clone super))
+	     (if (not (string= (semantic-tag-name super) ""))
+		 (semantic-tag-put-attribute super :members nil)
+	       (setq addlast nil))
+
+	     ;; Add in props to the full superclass.
+	     (when addlast
+	       (semantic--tag-copy-properties tag addlast)
+	       (semantic--tag-set-overlay addlast (semantic-tag-overlay tag)))
+	     )
+
 	   (while names
+
 	     (setq vl (cons (semantic-tag-new-type
 			     (nth 1 (car names)) ; name
 			     "typedef"
@@ -938,16 +967,18 @@
 			     ;; is expanded out as.  Just the
 			     ;; name shows up as a parent of this
 			     ;; typedef.
-			     :typedef
-			     (semantic-tag-get-attribute tag :superclasses)
+			     :typedef super
 			     ;;(semantic-tag-type-superclasses tag)
 			     :documentation
 			     (semantic-tag-docstring tag))
 			    vl))
 	     (semantic--tag-copy-properties tag (car vl))
-	     (semantic--tag-set-overlay (car vl)
-					(semantic-tag-overlay tag))
+	     (semantic--tag-set-overlay (car vl) (semantic-tag-overlay tag))
 	     (setq names (cdr names)))
+
+	   ;; Add typedef superclass last.
+	   (when addlast (setq vl (cons addlast vl)))
+
 	   vl))
 	((and (listp (car tag))
 	      (semantic-tag-of-class-p (car tag) 'variable))
@@ -999,6 +1030,7 @@
 					(car tokenpart)))
 			  (and (stringp (car (nth 2 tokenpart)))
 			       (string= (car (nth 2 tokenpart)) (car tokenpart)))
+			  (nth 10 tokenpart) ; initializers
 			  )
 		      (not (car (nth 3 tokenpart)))))
 		(fcnpointer (string-match "^\\*" (car tokenpart)))
@@ -1029,7 +1061,10 @@
 			 (semantic-tag-new-type
 			  ;; name
 			  (or (car semantic-c-classname)
-			      (car (nth 2 tokenpart)))
+			      (let ((split (semantic-analyze-split-name-c-mode
+					    (car (nth 2 tokenpart)))))
+				(if (stringp split) split
+				  (car (last split)))))
 			  ;; type
 			  (or (cdr semantic-c-classname)
 			      "class")
@@ -1580,6 +1615,48 @@
     tagreturn
     ))
 
+(define-mode-local-override semantic-ctxt-imported-packages c++-mode (&optional point)
+  "Return the list of using tag types in scope of POINT."
+  (when point (goto-char (point)))
+  (let ((tagsaroundpoint (semantic-find-tag-by-overlay))
+	(namereturn nil)
+	(tmp nil)
+	)
+    ;; Collect using statements from the top level.
+    (setq tmp (semantic-find-tags-by-class 'using (current-buffer)))
+    (dolist (T tmp) (setq namereturn (cons (semantic-tag-type T) namereturn)))
+    ;; Move through the tags around point looking for more using statements
+    (while (cdr tagsaroundpoint)  ; don't search the last one
+      (setq tmp (semantic-find-tags-by-class 'using (semantic-tag-components (car tagsaroundpoint))))
+      (dolist (T tmp) (setq namereturn (cons (semantic-tag-type T) namereturn)))
+      (setq tagsaroundpoint (cdr tagsaroundpoint))
+      )
+    namereturn))
+
+(define-mode-local-override semanticdb-expand-nested-tag c++-mode (tag)
+  "Expand TAG if it has a fully qualified name.
+For types with a :parent, create faux namespaces to put TAG into."
+  (let ((p (semantic-tag-get-attribute tag :parent)))
+    (if (and p (semantic-tag-of-class-p tag 'type))
+	;; Expand the tag
+	(let ((s (semantic-analyze-split-name p))
+	      (newtag (semantic-tag-copy tag nil t)))
+	  ;; Erase the qualified name.
+	  (semantic-tag-put-attribute newtag :parent nil)
+	  ;; Fixup the namespace name
+	  (setq s (if (stringp s) (list s) (nreverse s)))
+	  ;; Loop over all the parents, creating the nested
+	  ;; namespace.
+	  (require 'semantic/db-typecache)
+	  (dolist (namespace s)
+	    (setq newtag (semanticdb-typecache-faux-namespace
+			  namespace (list newtag)))
+	    )
+	  ;; Return the last created namespace.
+	  newtag)
+      ;; Else, return tag unmodified.
+      tag)))
+
 (define-mode-local-override semantic-get-local-variables c++-mode ()
   "Do what `semantic-get-local-variables' does, plus add `this' if needed."
   (let* ((origvar (semantic-get-local-variables-default))
@@ -1759,7 +1836,9 @@
 	  (princ "\n")
 	  ))
 
-      (when (arrayp semantic-lex-spp-project-macro-symbol-obarray)
+      (when (and (boundp 'ede-object)
+		 ede-object
+		 (arrayp semantic-lex-spp-project-macro-symbol-obarray))
 	(princ "\n  Project symbol map:\n")
 	(when (and (boundp 'ede-object) ede-object)
 	  (princ "      Your project symbol map is derived from the EDE object:\n      ")
--- a/lisp/cedet/semantic/complete.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/complete.el	Thu Sep 23 15:00:31 2010 -0400
@@ -1206,6 +1206,27 @@
   (require 'semantic/db-find)
   (semanticdb-brute-deep-find-tags-for-completion prefix (oref obj path)))
 
+;;; Current Datatype member search.
+(defclass semantic-collector-local-members (semantic-collector-project-abstract)
+  ((scope :initform nil
+	  :type (or null semantic-scope-cache)
+	  :documentation
+	  "The scope the local members are being completed from."))
+  "Completion engine for tags in a project.")
+
+(defmethod semantic-collector-calculate-completions-raw
+  ((obj semantic-collector-local-members) prefix completionlist)
+  "Calculate the completions for prefix from completionlist."
+  (let* ((scope (or (oref obj scope)
+		    (oset obj scope (semantic-calculate-scope))))
+	 (localstuff (oref scope scope)))
+    (list
+     (cons
+      (oref scope :table)
+      (semantic-find-tags-for-completion prefix localstuff)))))
+    ;(semanticdb-brute-deep-find-tags-for-completion prefix (oref obj path))))
+
+;;; Smart completion collector
 (defclass semantic-collector-analyze-completions (semantic-collector-abstract)
   ((context :initarg :context
 	    :type semantic-analyze-context
@@ -1800,6 +1821,28 @@
    history)
   )
 
+(defun semantic-complete-read-tag-local-members (prompt &optional
+							default-tag
+							initial-input
+							history)
+  "Ask for a tag by name from the local type members.
+Available tags are from the the current scope.
+Completion options are presented in a traditional way, with highlighting
+to resolve same-name collisions.
+PROMPT is a string to prompt with.
+DEFAULT-TAG is a semantic tag or string to use as the default value.
+If INITIAL-INPUT is non-nil, insert it in the minibuffer initially.
+HISTORY is a symbol representing a variable to store the history in."
+  (semantic-complete-read-tag-engine
+   (semantic-collector-local-members prompt :buffer (current-buffer))
+   (semantic-displayor-traditional-with-focus-highlight "simple")
+   ;;(semantic-displayor-tooltip "simple")
+   prompt
+   default-tag
+   initial-input
+   history)
+  )
+
 (defun semantic-complete-read-tag-project (prompt &optional
 						  default-tag
 						  initial-input
@@ -1979,7 +2022,7 @@
 
 ;;;###autoload
 (defun semantic-complete-jump-local ()
-  "Jump to a semantic symbol."
+  "Jump to a local semantic symbol."
   (interactive)
   (let ((tag (semantic-complete-read-tag-buffer-deep "Jump to symbol: ")))
     (when (semantic-tag-p tag)
@@ -2005,6 +2048,23 @@
 	       (semantic-tag-name  tag)))))
 
 ;;;###autoload
+(defun semantic-complete-jump-local-members ()
+  "Jump to a semantic symbol."
+  (interactive)
+  (let* ((tag (semantic-complete-read-tag-local-members "Jump to symbol: ")))
+    (when (semantic-tag-p tag)
+      (let ((start (condition-case nil (semantic-tag-start tag)
+		     (error nil))))
+	(unless start
+	  (error "Tag %s has no location" (semantic-format-tag-prototype tag)))
+	(push-mark)
+	(goto-char start)
+	(semantic-momentary-highlight-tag tag)
+	(message "%S: %s "
+		 (semantic-tag-class tag)
+		 (semantic-tag-name  tag))))))
+
+;;;###autoload
 (defun semantic-complete-analyze-and-replace ()
   "Perform prompt completion to do in buffer completion.
 `semantic-analyze-possible-completions' is used to determine the
@@ -2075,15 +2135,17 @@
 
   ;; Prepare for doing completion, but exit quickly if there is keyboard
   ;; input.
-  (when (and (not (semantic-exit-on-input 'csi
-		    (semantic-fetch-tags)
-		    (semantic-throw-on-input 'csi)
-		    nil))
-	     (= arg 1)
-	     (not (semantic-exit-on-input 'csi
-		    (semantic-analyze-current-context)
-		    (semantic-throw-on-input 'csi)
-		    nil)))
+  (when (save-window-excursion
+	  (save-excursion
+	    (and (not (semantic-exit-on-input 'csi
+			(semantic-fetch-tags)
+			(semantic-throw-on-input 'csi)
+			nil))
+		 (= arg 1)
+		 (not (semantic-exit-on-input 'csi
+			(semantic-analyze-current-context)
+			(semantic-throw-on-input 'csi)
+			nil)))))
     (condition-case nil
 	(semantic-complete-analyze-inline)
       ;; Ignore errors.  Seems likely that we'll get some once in a while.
--- a/lisp/cedet/semantic/ctxt.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/ctxt.el	Thu Sep 23 15:00:31 2010 -0400
@@ -599,12 +599,18 @@
   "Return a list of scoped types by name for the current context at POINT.
 This is very different for various languages, and does nothing unless
 overridden."
-  (if point (goto-char point))
-  (let ((case-fold-search semantic-case-fold))
-    ;; We need to look at TYPES within the bounds of locally parse arguments.
-    ;; C needs to find using statements and the like too.  Bleh.
-    nil
-    ))
+  nil)
+
+(define-overloadable-function semantic-ctxt-imported-packages (&optional point)
+  "Return a list of package tags or names which are being imported at POINT.
+The return value is a list of strings which are package names
+that are implied in code.  Thus a C++ symbol:
+  foo::bar();
+where there is a statement such as:
+  using baz;
+means that the first symbol might be:
+  baz::foo::bar();"
+  nil)
 
 (provide 'semantic/ctxt)
 
--- a/lisp/cedet/semantic/db-file.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/db-file.el	Thu Sep 23 15:00:31 2010 -0400
@@ -245,7 +245,7 @@
 	   ;; @todo - It should ask if we are not called from a hook.
 	   ;;         How?
 	   (if (or supress-questions
-		   (y-or-n-p (format "Skip Error: %S ?" (car (cdr foo)))))
+		   (y-or-n-p (format "Skip Error: %s ?" (car (cdr foo)))))
 	       (message "Save Error: %S: %s" (car (cdr foo))
 			objname)
 	     (error "%S" (car (cdr foo))))))))
--- a/lisp/cedet/semantic/db-find.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/db-find.el	Thu Sep 23 15:00:31 2010 -0400
@@ -202,7 +202,7 @@
   (when (oref idx type-cache)
     (semantic-reset (oref idx type-cache)))
   ;; Clear the scope.  Scope doesn't have the data it needs to track
-  ;; it's own reset.
+  ;; its own reset.
   (semantic-scope-reset-cache)
   )
 
@@ -262,13 +262,13 @@
   "Translate PATH into a list of semantic tables.
 Path translation involves identifying the PATH input argument
 in one of the following ways:
-  nil - Take the current buffer, and use it's include list
+  nil - Take the current buffer, and use its include list
   buffer - Use that buffer's include list.
   filename - Use that file's include list.  If the file is not
       in a buffer, see of there is a semanticdb table for it.  If
       not, read that file into a buffer.
   tag - Get that tag's buffer of file file.  See above.
-  table - Search that table, and it's include list.
+  table - Search that table, and its include list.
   find result - Search the results of a previous find.
 
 In addition, once the base path is found, there is the possibility of
@@ -1006,9 +1006,14 @@
 	  (when norm
 	    ;; The normalized tags can now be found based on that
 	    ;; tags table.
-	    (semanticdb-set-buffer (car norm))
-	    ;; Now reset ans
-	    (setq ans (cdr norm))
+	    (condition-case foo
+		(progn
+		  (semanticdb-set-buffer (car norm))
+		  ;; Now reset ans
+		  (setq ans (cdr norm)))
+	      ;; Don't error for this case, but don't store
+	      ;; the thing either.
+	      (no-method-definition nil))
 	    ))
       )
     ;; Return the tag.
@@ -1019,10 +1024,10 @@
 FCN takes two arguments.  The first is a TAG, and the
 second is a DB from whence TAG originated.
 Returns result."
-  (mapc (lambda (sublst)
-	  (mapc (lambda (tag)
-		  (funcall fcn tag (car sublst)))
-		(cdr sublst)))
+  (mapc (lambda (sublst-icky)
+	  (mapc (lambda (tag-icky)
+		  (funcall fcn tag-icky (car sublst-icky)))
+		(cdr sublst-icky)))
 	result)
   result)
 
--- a/lisp/cedet/semantic/db-global.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/db-global.el	Thu Sep 23 15:00:31 2010 -0400
@@ -93,7 +93,7 @@
 	       '(omniscience))
        )
     (if dont-err-if-not-available
-	(message "No Global support in %s" default-directory)
+	nil; (message "No Global support in %s" default-directory)
       (error "No Global support in %s" default-directory))
     ))
 
--- a/lisp/cedet/semantic/db-typecache.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/db-typecache.el	Thu Sep 23 15:00:31 2010 -0400
@@ -217,6 +217,14 @@
    (semanticdb-full-filename table)
    tags))
 
+(defun semanticdb-typecache-faux-namespace (name members)
+  "Create a new namespace tag with NAME and a set of MEMBERS.
+The new tag will be a faux tag, used as a placeholder in a typecache."
+  (let ((tag (semantic-tag-new-type name "namespace" members nil)))
+    ;; Make sure we mark this as a fake tag.
+    (semantic-tag-set-faux tag)
+    tag))
+
 (defun semanticdb-typecache-merge-streams (cache1 cache2)
   "Merge into CACHE1 and CACHE2 together.  The Caches will be merged in place."
   (if (or (and (not cache1) (not cache2))
@@ -256,23 +264,22 @@
 	    (setq ans (cons next ans))
 	  ;; ELSE - We have a NAME match.
 	  (setq type (semantic-tag-type next))
-	  (if (semantic-tag-of-type-p prev type) ; Are they the same datatype
+	  (if (or (semantic-tag-of-type-p prev type) ; Are they the same datatype
+		  (semantic-tag-faux-p prev)
+		  (semantic-tag-faux-p next) ; or either a faux tag?
+		  )
 	      ;; Same Class, we can do a merge.
 	      (cond
 	       ((and (semantic-tag-of-class-p next 'type)
 		     (string= type "namespace"))
 		;; Namespaces - merge the children together.
 		(setcar ans
-			(semantic-tag-new-type
+			(semanticdb-typecache-faux-namespace
 			 (semantic-tag-name prev) ; - they are the same
-			 "namespace"	; - we know this as fact
 			 (semanticdb-typecache-merge-streams
 			  (semanticdb-typecache-safe-tag-members prev)
 			  (semanticdb-typecache-safe-tag-members next))
-			 nil		; - no attributes
 			 ))
-		;; Make sure we mark this as a fake tag.
-		(semantic-tag-set-faux (car ans))
 		)
 	       ((semantic-tag-prototype-p next)
 		;; NEXT is a prototype... so keep previous.
@@ -299,6 +306,12 @@
 ;;; Refresh / Query API
 ;;
 ;; Queries that can be made for the typecache.
+(define-overloadable-function semanticdb-expand-nested-tag (tag)
+  "Expand TAG from fully qualified names.
+If TAG has fully qualified names, expand it to a series of nested
+namespaces instead."
+  tag)
+
 (defmethod semanticdb-typecache-file-tags ((table semanticdb-abstract-table))
   "No tags available from non-file based tables."
   nil)
@@ -313,10 +326,13 @@
 
     ;; Make sure our file-tags list is up to date.
     (when (not (oref cache filestream))
-      (let ((tags  (semantic-find-tags-by-class 'type table)))
+      (let ((tags  (semantic-find-tags-by-class 'type table))
+	    (exptags nil))
 	(when tags
 	  (setq tags (semanticdb-typecache-safe-tag-list tags table))
-	  (oset cache filestream (semanticdb-typecache-merge-streams tags nil)))))
+	  (dolist (T tags)
+	    (push (semanticdb-expand-nested-tag T) exptags))
+	  (oset cache filestream (semanticdb-typecache-merge-streams exptags nil)))))
 
     ;; Return our cache.
     (oref cache filestream)
@@ -372,6 +388,7 @@
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 ;;; Search Routines
+;;
 ;;;###autoload
 (define-overloadable-function semanticdb-typecache-find (type &optional path find-file-match)
   "Search the typecache for TYPE in PATH.
@@ -386,16 +403,20 @@
 PATH is the search path, which should be one table object.
 If FIND-FILE-MATCH is non-nil, then force the file belonging to the
 found tag to be loaded."
-  (semanticdb-typecache-find-method (or path semanticdb-current-table)
-				    type find-file-match))
+  (if (not (and (featurep 'semanticdb) semanticdb-current-database))
+      nil ;; No DB, no search
+    (save-excursion
+      (semanticdb-typecache-find-method (or path semanticdb-current-table)
+					type find-file-match))))
 
 (defun semanticdb-typecache-find-by-name-helper (name table)
   "Find the tag with NAME in TABLE, which is from a typecache.
 If more than one tag has NAME in TABLE, we will prefer the tag that
 is of class 'type."
   (let* ((names (semantic-find-tags-by-name name table))
-	 (types (semantic-find-tags-by-class 'type names)))
-    (or (car-safe types) (car-safe names))))
+	 (nmerge (semanticdb-typecache-merge-streams names nil))
+	 (types (semantic-find-tags-by-class 'type nmerge)))
+    (or (car-safe types) (car-safe nmerge))))
 
 (defmethod semanticdb-typecache-find-method ((table semanticdb-abstract-table)
 					     type find-file-match)
--- a/lisp/cedet/semantic/db.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/db.el	Thu Sep 23 15:00:31 2010 -0400
@@ -542,10 +542,25 @@
 is not in a buffer.  Avoid using FORCE for most uses, as an old cache
 may be sufficient for the general case.  Forced updates can be slow.
 This will call `semantic-fetch-tags' if that file is in memory."
-  (when (or (semanticdb-in-buffer-p obj) force)
+  (cond
+   ;;
+   ;; Already in a buffer, just do it.
+   ((semanticdb-in-buffer-p obj)
+    (semanticdb-set-buffer obj)
+    (semantic-fetch-tags))
+   ;;
+   ;; Not in a buffer.  Forcing a load.
+   (force
+    ;; Patch from Iain Nicol. --
+    ;; @TODO: I wonder if there is a way to recycle
+    ;;        semanticdb-create-table-for-file-not-in-buffer
     (save-excursion
-      (semanticdb-set-buffer obj)
-      (semantic-fetch-tags))))
+      (let ((buff (semantic-find-file-noselect
+		   (semanticdb-full-filename obj))))
+	(set-buffer buff)
+	(semantic-fetch-tags)
+	;; Kill off the buffer if it didn't exist when we were called.
+	(kill-buffer buff))))))
 
 (defmethod semanticdb-needs-refresh-p ((obj semanticdb-table))
   "Return non-nil of OBJ's tag list is out of date.
@@ -808,12 +823,14 @@
     (setq root (run-hook-with-args-until-success
 		'semanticdb-project-root-functions
 		dir))
-    ;; Find roots based on strings
-    (while (and roots (not root))
-      (let ((r (file-truename (car roots))))
-	(if (string-match (concat "^" (regexp-quote r)) dir)
-	    (setq root r)))
-      (setq roots (cdr roots)))
+    (if root
+	(setq root (file-truename root))
+      ;; Else, Find roots based on strings
+      (while roots
+	(let ((r (file-truename (car roots))))
+	  (if (string-match (concat "^" (regexp-quote r)) dir)
+	      (setq root r)))
+	(setq roots (cdr roots))))
 
     ;; If no roots are found, use this directory.
     (unless root (setq root dir))
--- a/lisp/cedet/semantic/decorate.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/decorate.el	Thu Sep 23 15:00:31 2010 -0400
@@ -45,7 +45,7 @@
     ))
 
 (defun semantic-unhighlight-tag (tag)
-  "Unhighlight TAG, restoring it's previous face."
+  "Unhighlight TAG, restoring its previous face."
   (let ((o (semantic-tag-overlay tag)))
     (semantic-overlay-put o 'face (car (semantic-overlay-get o 'old-face)))
     (semantic-overlay-put o 'old-face (cdr (semantic-overlay-get o 'old-face)))
--- a/lisp/cedet/semantic/decorate/include.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/decorate/include.el	Thu Sep 23 15:00:31 2010 -0400
@@ -118,7 +118,7 @@
   '((((class color) (background dark))
      (:background "#900000"))
     (((class color) (background light))
-     (:background "#ff5050")))
+     (:background "#fff0f0")))
   "*Face used to show includes that cannot be found.
 Used by the decoration style: `semantic-decoration-on-unknown-includes'."
   :group 'semantic-faces)
@@ -302,16 +302,19 @@
 	)
       ))
 
-    (let ((ol (semantic-decorate-tag tag
-				     (semantic-tag-start tag)
-				     (semantic-tag-end tag)
-				     face))
-	  )
-      (semantic-overlay-put ol 'mouse-face 'highlight)
-      (semantic-overlay-put ol 'keymap map)
-      (semantic-overlay-put ol 'help-echo
-			    "Header File : mouse-3 - Context menu")
-      )))
+    ;; @TODO - if not a tag w/ a position, we need to get one.  How?
+
+    (when (semantic-tag-with-position-p tag)
+      (let ((ol (semantic-decorate-tag tag
+				       (semantic-tag-start tag)
+				       (semantic-tag-end tag)
+				       face))
+	    )
+	(semantic-overlay-put ol 'mouse-face 'highlight)
+	(semantic-overlay-put ol 'keymap map)
+	(semantic-overlay-put ol 'help-echo
+			      "Header File : mouse-3 - Context menu")
+	))))
 
 ;;; Regular Include Functions
 ;;
--- a/lisp/cedet/semantic/dep.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/dep.el	Thu Sep 23 15:00:31 2010 -0400
@@ -208,7 +208,8 @@
 	       mode 'semantic-dependency-system-include-path))
 	(edesys (when (and (featurep 'ede) ede-minor-mode
 			   ede-object)
-		  (ede-system-include-path ede-object)))
+		  (ede-system-include-path
+		   (if (listp ede-object) (car ede-object) ede-object))))
 	(locp (mode-local-value
 	       mode 'semantic-dependency-include-path))
 	(found nil))
--- a/lisp/cedet/semantic/doc.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/doc.el	Thu Sep 23 15:00:31 2010 -0400
@@ -78,7 +78,8 @@
 	   (start (if starttag
 		      (semantic-tag-end starttag)
 		    (point-min))))
-      (when (re-search-backward comment-start-skip start t)
+      (when (and comment-start-skip
+		 (re-search-backward comment-start-skip start t))
 	;; We found a comment that doesn't belong to the body
 	;; of a function.
 	(semantic-doc-snarf-comment-for-tag nosnarf)))
--- a/lisp/cedet/semantic/fw.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/fw.el	Thu Sep 23 15:00:31 2010 -0400
@@ -310,6 +310,17 @@
 	(find-file-noselect file nowarn rawfile wildcards)))
     ))
 
+;;; Database restriction settings
+;;
+(defmacro semanticdb-without-unloaded-file-searches (forms)
+  "Execute FORMS with `unloaded' removed from the current throttle."
+  `(let ((semanticdb-find-default-throttle
+	  (if (featurep 'semanticdb-find)
+	      (remq 'unloaded semanticdb-find-default-throttle)
+	    nil)))
+     ,forms))
+(put 'semanticdb-without-unloaded-file-searches 'lisp-indent-function 1)
+
 
 ;; ;;; Editor goodies ;-)
 ;; ;;
--- a/lisp/cedet/semantic/grammar.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/grammar.el	Thu Sep 23 15:00:31 2010 -0400
@@ -928,6 +928,12 @@
         ;; If running interactively, eval declarations and epilogue
         ;; code, then pop to the buffer visiting the generated file.
         (eval-region (point) (point-max))
+	;; Loop over the defvars and eval them explicitly to force
+	;; them to be evaluated and ready to use.
+        (goto-char (point-min))
+	(while (re-search-forward "(defvar " nil t)
+	  (eval-defun nil))
+	;; Move cursor to a logical spot in the generated code.
         (goto-char (point-min))
         (pop-to-buffer (current-buffer))
         ;; The generated code has been evaluated and updated into
--- a/lisp/cedet/semantic/html.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/html.el	Thu Sep 23 15:00:31 2010 -0400
@@ -243,6 +243,7 @@
 	semantic-imenu-bucketize-file nil
 	semantic-imenu-bucketize-type-members nil
 	senator-step-at-start-end-tag-classes '(section)
+	senator-step-at-tag-classes '(section)
 	semantic-stickyfunc-sticky-classes '(section)
 	)
   (semantic-install-function-overrides
--- a/lisp/cedet/semantic/ia.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/ia.el	Thu Sep 23 15:00:31 2010 -0400
@@ -40,7 +40,8 @@
 (require 'pulse)
 (eval-when-compile
   (require 'semantic/analyze)
-  (require 'semantic/analyze/refs))
+  (require 'semantic/analyze/refs)
+  (require 'semantic/find))
 
 (declare-function imenu--mouse-menu "imenu")
 
@@ -57,14 +58,6 @@
   :group 'semantic
   :type semantic-format-tag-custom-list)
 
-(defvar semantic-ia-cache nil
-  "Cache of the last completion request.
-Of the form ( POINT . COMPLETIONS ) where POINT is a location in the
-buffer where the completion was requested.  COMPLETONS is the list
-of semantic tag names that provide logical completions from that
-location.")
-(make-variable-buffer-local 'semantic-ia-cache)
-
 ;;; COMPLETION HELPER
 ;;
 ;; This overload function handles inserting a tag
@@ -86,23 +79,16 @@
 	   (insert "("))
 	  (t nil))))
 
-(declare-function semantic-analyze-possible-completions
-		  "semantic/analyze/complete")
+(defalias 'semantic-ia-get-completions 'semantic-ia-get-completions-deprecated
+  "`Semantic-ia-get-completions' is obsolete.
+Use `semantic-analyze-possible-completions' instead.")
 
-(defun semantic-ia-get-completions (context point)
-  "Fetch the completion of CONTEXT at POINT.
-Supports caching."
-  ;; Cache the current set of symbols so that we can get at
-  ;; them quickly the second time someone presses the
-  ;; complete button.
-  (let ((symbols
-	 (if (and semantic-ia-cache
-		  (= point (car semantic-ia-cache)))
-	     (cdr semantic-ia-cache)
-	   (semantic-analyze-possible-completions context))))
-    ;; Set the cache
-    (setq semantic-ia-cache (cons point symbols))
-    symbols))
+(defun semantic-ia-get-completions-deprecated (context point)
+  "A function to help transition away from `semantic-ia-get-completions'.
+Return completions based on CONTEXT at POINT.
+You should not use this, nor the aliased version.
+Use `semantic-analyze-possible-completions' instead."
+  (semantic-analyze-possible-completions context))
 
 ;;;###autoload
 (defun semantic-ia-complete-symbol (&optional pos)
@@ -119,7 +105,7 @@
     ;;
     ;; The second step derives completions from that context.
     (let* ((a (semantic-analyze-current-context pos))
-	   (syms (semantic-ia-get-completions a pos))
+	   (syms (semantic-analyze-possible-completions a))
 	   (pre (car (reverse (oref a prefix)))))
       ;; If PRE was actually an already completed symbol, it doesn't
       ;; come in as a string, but as a tag instead.
@@ -173,7 +159,7 @@
   "Pop up a tooltip for completion at POINT."
   (interactive "d")
   (let* ((a (semantic-analyze-current-context point))
-	 (syms (semantic-ia-get-completions a point))
+	 (syms (semantic-analyze-possible-completions a))
          (x (mod (- (current-column) (window-hscroll))
                  (window-width)))
          (y (save-excursion
@@ -212,8 +198,48 @@
 	       ;; tag associated with the current context.
 	       (semantic-analyze-interesting-tag ctxt)))
 	)
-    (when pf
-      (message "%s" (semantic-format-tag-summarize pf nil t)))))
+    (if pf
+	(message "%s" (semantic-format-tag-summarize pf nil t))
+      (message "No summary info availalble"))))
+
+;;; Variants
+;;
+;; Show all variants for the symbol under point.
+
+;;;###autoload
+(defun semantic-ia-show-variants (point)
+  "Display a list of all variants for the symbol under POINT."
+  (interactive "P")
+  (let* ((ctxt (semantic-analyze-current-context point))
+	 (comp nil))
+
+    ;; We really want to look at the function if we are on an
+    ;; argument.  Are there some additional rules we care about for
+    ;; changing the CTXT we look at?
+    (when (semantic-analyze-context-functionarg-p ctxt)
+      (goto-char (cdr (oref ctxt bounds)))
+      (setq ctxt (semantic-analyze-current-context (point))))
+
+    ;; Get the "completion list", but remove ALL filters to get the master list
+    ;; of all the possible things.
+    (setq comp (semantic-analyze-possible-completions ctxt 'no-unique 'no-tc))
+
+    ;; Special case for a single type.  List the constructors?
+    (when (and (= (length comp) 1) (semantic-tag-of-class-p (car comp) 'type))
+      (setq comp (semantic-find-tags-by-name (semantic-tag-name (car comp))
+					     (semantic-tag-type-members (car comp)))))
+
+    ;; Display the results.
+    (cond ((= (length comp) 0)
+	   (message "No Variants found."))
+	  ((= (length comp) 1)
+	   (message "%s" (semantic-format-tag-summarize (car comp) nil t)))
+	  (t
+	   (with-output-to-temp-buffer "*Symbol Variants*"
+	     (semantic-analyze-princ-sequence comp "" (current-buffer)))
+	   (shrink-window-if-larger-than-buffer
+	    (get-buffer-window "*Symbol Variants*")))
+	  )))
 
 ;;; FAST Jump
 ;;
@@ -354,18 +380,21 @@
       ;; The default tries to find a comment in front of the tag
       ;; and then strings off comment prefixes.
       (let ((doc (semantic-documentation-for-tag (car pf))))
-	(with-output-to-temp-buffer "*TAG DOCUMENTATION*"
-	  (princ "Tag: ")
-	  (princ (semantic-format-tag-prototype (car pf)))
-	  (princ "\n")
-	  (princ "\n")
-	  (princ "Snarfed Documentation: ")
-	  (princ "\n")
-	  (princ "\n")
-	  (if doc
-	      (princ doc)
-	    (princ "  Documentation unavailable."))
-	  )))
+	(if (or (null doc) (string= doc ""))
+	    (message "Doc unavailable for: %s"
+		     (semantic-format-tag-prototype (car pf)))
+	  (with-output-to-temp-buffer "*TAG DOCUMENTATION*"
+	    (princ "Tag: ")
+	    (princ (semantic-format-tag-prototype (car pf)))
+	    (princ "\n")
+	    (princ "\n")
+	    (princ "Snarfed Documentation: ")
+	    (princ "\n")
+	    (princ "\n")
+	    (if doc
+		(princ doc)
+	      (princ "  Documentation unavailable."))
+	    ))))
      (t
       (message "Unknown tag.")))
     ))
--- a/lisp/cedet/semantic/idle.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/idle.el	Thu Sep 23 15:00:31 2010 -0400
@@ -49,6 +49,7 @@
 (defvar eldoc-last-message)
 (declare-function eldoc-message "eldoc")
 (declare-function semantic-analyze-interesting-tag "semantic/analyze")
+(declare-function semantic-analyze-unsplit-name "semantic/analyze/fcn")
 (declare-function semantic-complete-analyze-inline-idle "semantic/complete")
 (declare-function semanticdb-deep-find-tags-by-name "semantic/db-find")
 (declare-function semanticdb-save-all-db-idle "semantic/db")
@@ -294,12 +295,18 @@
 ;;
 ;; Unlike the shorter timer, the WORK timer will kick of tasks that
 ;; may take a long time to complete.
-(defcustom semantic-idle-work-parse-neighboring-files-flag t
+(defcustom semantic-idle-work-parse-neighboring-files-flag nil
   "*Non-nil means to parse files in the same dir as the current buffer.
 Disable to prevent lots of excessive parsing in idle time."
   :group 'semantic
   :type 'boolean)
 
+(defcustom semantic-idle-work-update-headers-flag nil
+  "*Non-nil means to parse through header files in idle time.
+Disable to prevent idle time parsing of many files.  If completion
+is called that work will be done then instead."
+  :group 'semantic
+  :type 'boolean)
 
 (defun semantic-idle-work-for-one-buffer (buffer)
   "Do long-processing work for BUFFER.
@@ -312,6 +319,9 @@
 	    (semantic-idle-scheduler-refresh-tags)
 	    t)
 
+	  ;; Option to disable this work.
+	  semantic-idle-work-update-headers-flag
+
 	  ;; Force all our include files to get read in so we
 	  ;; are ready to provide good smart completion and idle
 	  ;; summary information
@@ -603,6 +613,11 @@
 ;;; SUMMARY MODE
 ;;
 ;; A mode similar to eldoc using semantic
+(defcustom semantic-idle-truncate-long-summaries t
+  "Truncate summaries that are too long to fit in the minibuffer.
+This can prevent minibuffer resizing in idle time."
+  :group 'semantic
+  :type 'boolean)
 
 (defcustom semantic-idle-summary-function
   'semantic-format-tag-summarize-with-file
@@ -654,21 +669,16 @@
   "Return a string message describing the current context.
 This function will disable loading of previously unloaded files
 by semanticdb as a time-saving measure."
-  (let (
-	(semanticdb-find-default-throttle
-	 (if (featurep 'semantic/db-find)
-	     (remq 'unloaded semanticdb-find-default-throttle)
-	   nil))
-	)
-    (save-excursion
-      ;; use whicever has success first.
-      (or
-       (semantic-idle-summary-current-symbol-keyword)
+  (semanticdb-without-unloaded-file-searches
+      (save-excursion
+	;; use whichever has success first.
+	(or
+	 (semantic-idle-summary-current-symbol-keyword)
 
-       (semantic-idle-summary-current-symbol-info-context)
+	 (semantic-idle-summary-current-symbol-info-context)
 
-       (semantic-idle-summary-current-symbol-info-brutish)
-       ))))
+	 (semantic-idle-summary-current-symbol-info-brutish)
+	 ))))
 
 (defvar semantic-idle-summary-out-of-context-faces
   '(
@@ -732,6 +742,14 @@
           (let ((w (1- (window-width (minibuffer-window)))))
             (if (> (length str) w)
                 (setq str (substring str 0 w)))))
+	;; I borrowed some bits from eldoc to shorten the
+	;; message.
+	(when semantic-idle-truncate-long-summaries
+	  (let ((ea-width (1- (window-width (minibuffer-window))))
+		(strlen (length str)))
+	    (when (> strlen ea-width)
+	      (setq str (substring str 0 ea-width)))))
+	;; Display it
         (eldoc-message str))))
 
 (define-minor-mode semantic-idle-summary-mode
@@ -791,12 +809,12 @@
 ;; of all uses of the symbol that is under the cursor.
 ;;
 ;; This is to mimic the Eclipse tool of a similar nature.
-(defvar semantic-idle-summary-highlight-face 'region
-  "Face used for the summary highlight.")
+(defvar semantic-idle-symbol-highlight-face 'region
+  "Face used for highlighting local symbols.")
 
-(defun semantic-idle-summary-maybe-highlight (tag)
-  "Perhaps add highlighting onto TAG.
-TAG was found as the thing under point.  If it happens to be
+(defun semantic-idle-symbol-maybe-highlight (tag)
+  "Perhaps add highlighting to the symbol represented by TAG.
+TAG was found as the symbol under point.  If it happens to be
 visible, then highlight it."
   (require 'pulse)
   (let* ((region (when (and (semantic-tag-p tag)
@@ -817,12 +835,12 @@
 		    (point) (get-buffer-window (current-buffer) 'visible))
 	       (if (< (semantic-overlay-end region) (point-at-eol))
 		   (pulse-momentary-highlight-overlay
-		    region semantic-idle-summary-highlight-face)
+		    region semantic-idle-symbol-highlight-face)
 		 ;; Not the same
 		 (pulse-momentary-highlight-region
 		  (semantic-overlay-start region)
 		  (point-at-eol)
-		  semantic-idle-summary-highlight-face)))
+		  semantic-idle-symbol-highlight-face)))
 	     ))
 	  ((vectorp region)
 	   (let ((start (aref region 0))
@@ -842,17 +860,19 @@
 		   (pulse-momentary-highlight-region
 		    start (if (<= end (point-at-eol)) end
 			    (point-at-eol))
-		    semantic-idle-summary-highlight-face)))
+		    semantic-idle-symbol-highlight-face)))
 	       ))))
     nil))
 
-(define-semantic-idle-service semantic-idle-tag-highlight
-  "Highlight the tag, and references of the symbol under point.
+(define-semantic-idle-service semantic-idle-local-symbol-highlight
+  "Highlight the tag and symbol references of the symbol under point.
 Call `semantic-analyze-current-context' to find the reference tag.
 Call `semantic-symref-hits-in-region' to identify local references."
   (require 'pulse)
   (when (semantic-idle-summary-useful-context-p)
-    (let* ((ctxt (semantic-analyze-current-context))
+    (let* ((ctxt
+	    (semanticdb-without-unloaded-file-searches
+		(semantic-analyze-current-context)))
 	   (Hbounds (when ctxt (oref ctxt bounds)))
 	   (target (when ctxt (car (reverse (oref ctxt prefix)))))
 	   (tag (semantic-current-tag))
@@ -862,7 +882,7 @@
       (when ctxt
 	;; Highlight the original tag?  Protect against problems.
 	(condition-case nil
-	    (semantic-idle-summary-maybe-highlight target)
+	    (semantic-idle-symbol-maybe-highlight target)
 	  (error nil))
 	;; Identify all hits in this current tag.
 	(when (semantic-tag-p target)
@@ -871,7 +891,7 @@
 	   target (lambda (start end prefix)
 		    (when (/= start (car Hbounds))
 		      (pulse-momentary-highlight-region
-		       start end semantic-idle-summary-highlight-face))
+		       start end semantic-idle-symbol-highlight-face))
 		    (semantic-throw-on-input 'symref-highlight)
 		    )
 	   (semantic-tag-start tag)
@@ -891,7 +911,7 @@
   ;; When turning off, disable other idle modes.
   (when (null global-semantic-idle-scheduler-mode)
     (global-semantic-idle-summary-mode -1)
-    (global-semantic-idle-tag-highlight-mode -1)
+    (global-semantic-idle-local-symbol-highlight-mode -1)
     (global-semantic-idle-completions-mode -1))
   (semantic-toggle-minor-mode-globally
    'semantic-idle-scheduler-mode
@@ -903,25 +923,23 @@
 ;; This mode uses tooltips to display a (hopefully) short list of possible
 ;; completions available for the text under point.  It provides
 ;; NO provision for actually filling in the values from those completions.
+(defun semantic-idle-completions-end-of-symbol-p ()
+  "Return non-nil if the cursor is at the END of a symbol.
+If the cursor is in the middle of a symbol, then we shouldn't be
+doing fancy completions."
+  (not (looking-at "\\w\\|\\s_")))
 
 (defun semantic-idle-completion-list-default ()
   "Calculate and display a list of completions."
-  (when (semantic-idle-summary-useful-context-p)
+  (when (and (semantic-idle-summary-useful-context-p)
+	     (semantic-idle-completions-end-of-symbol-p))
     ;; This mode can be fragile.  Ignore problems.
     ;; If something doesn't do what you expect, run
     ;; the below command by hand instead.
     (condition-case nil
-	(let (
-	      ;; Don't go loading in oodles of header libraries in
-	      ;; IDLE time.
-	      (semanticdb-find-default-throttle
-	       (if (featurep 'semantic/db-find)
-		   (remq 'unloaded semanticdb-find-default-throttle)
-		 nil))
-	      )
-	  ;; Use idle version.
-	  (require 'semantic/complete)
-	  (semantic-complete-analyze-inline-idle)
+	(semanticdb-without-unloaded-file-searches
+	    ;; Use idle version.
+	    (semantic-complete-analyze-inline-idle)
 	  )
       (error nil))
     ))
@@ -949,6 +967,347 @@
   ;; Add the ability to override sometime.
   (semantic-idle-completion-list-default))
 
+
+;;; Breadcrumbs for tag under point
+;;
+;; Service that displays a breadcrumbs indication of the tag under
+;; point and its parents in the header or mode line.
+;;
+
+(defcustom semantic-idle-breadcrumbs-display-function
+  #'semantic-idle-breadcrumbs--display-in-header-line
+  "Function to display the tag under point in idle time.
+This function should take a list of Semantic tags as its only
+argument. The tags are sorted according to their nesting order,
+starting with the outermost tag. The function should call
+`semantic-idle-breadcrumbs-format-tag-list-function' to convert
+the tag list into a string."
+  :group 'semantic
+  :type  '(choice
+	   (const    :tag "Display in header line"
+		     semantic-idle-breadcrumbs--display-in-header-line)
+	   (const    :tag "Display in mode line"
+		     semantic-idle-breadcrumbs--display-in-mode-line)
+	   (function :tag "Other function")))
+
+(defcustom semantic-idle-breadcrumbs-format-tag-list-function
+  #'semantic-idle-breadcrumbs--format-linear
+  "Function to format the list of tags containing point.
+This function should take a list of Semantic tags and an optional
+maximum length of the produced string as its arguments. The
+maximum length is a hint and can be ignored. When the maximum
+length is omitted, an unconstrained string should be
+produced. The tags are sorted according to their nesting order,
+starting with the outermost tag. Single tags should be formatted
+using `semantic-idle-breadcrumbs-format-tag-function' unless
+special formatting is required."
+  :group 'semantic
+  :type  '(choice
+	   (const    :tag "Format tags as list, innermost last"
+		     semantic-idle-breadcrumbs--format-linear)
+	   (const    :tag "Innermost tag with details, followed by remaining tags"
+		     semantic-idle-breadcrumbs--format-innermost-first)
+	   (function :tag "Other function")))
+
+(defcustom semantic-idle-breadcrumbs-format-tag-function
+  #'semantic-format-tag-abbreviate
+  "Function to call to format information about tags.
+This function should take a single argument, a Semantic tag, and
+return a string to display.
+Some useful functions are found in `semantic-format-tag-functions'."
+   :group 'semantic
+   :type  semantic-format-tag-custom-list)
+
+(defcustom semantic-idle-breadcrumbs-separator 'mode-specific
+  "Specify how to separate tags in the breadcrumbs string.
+An arbitrary string or a mode-specific scope nesting
+string (like, for example, \"::\" in C++, or \".\" in Java) can
+be used."
+  :group 'semantic
+  :type  '(choice
+	   (const  :tag "Use mode specific separator"
+		   mode-specific)
+	   (string :tag "Specify separator string")))
+
+(defcustom semantic-idle-breadcrumbs-header-line-prefix
+  semantic-stickyfunc-indent-string ;; TODO not optimal
+  "String used to indent the breadcrumbs string.
+Customize this string to match the space used by scrollbars and
+fringe."
+  :group 'semantic
+  :type  'string)
+
+(defvar semantic-idle-breadcrumbs-popup-menu nil
+  "Menu used when a tag displayed by `semantic-idle-breadcrumbs-mode' is clicked.")
+
+(defun semantic-idle-breadcrumbs--popup-menu (event)
+  "Popup a menu that displays things to do to the clicked tag.
+Argument EVENT describes the event that caused this function to
+be called."
+  (interactive "e")
+  (let ((old-window (selected-window))
+	(window     (semantic-event-window event)))
+    (select-window window t)
+    (semantic-popup-menu semantic-idle-breadcrumbs-popup-menu)
+    (select-window old-window)))
+
+(defmacro semantic-idle-breadcrumbs--tag-function (function)
+  "Return lambda expression calling FUNCTION when called from a popup."
+  `(lambda (event)
+     (interactive "e")
+     (let* ((old-window (selected-window))
+	    (window     (semantic-event-window event))
+	    (column     (car (nth 6 (nth 1 event)))) ;; TODO semantic-event-column?
+	    (tag        (progn
+			  (select-window window t)
+			  (plist-get
+			   (text-properties-at column header-line-format)
+			   'tag))))
+       (,function tag)
+       (select-window old-window)))
+  )
+
+;; TODO does this work for mode-line case?
+(defvar semantic-idle-breadcrumbs-popup-map
+  (let ((map (make-sparse-keymap)))
+    ;; mouse-1 goes to clicked tag
+    (define-key map
+      [ header-line mouse-1 ]
+      (semantic-idle-breadcrumbs--tag-function
+       semantic-go-to-tag))
+    ;; mouse-3 pops up a context menu
+    (define-key map
+      [ header-line mouse-3 ]
+      'semantic-idle-breadcrumbs--popup-menu)
+    map)
+  "Keymap for semantic idle breadcrumbs minor mode.")
+
+(easy-menu-define
+  semantic-idle-breadcrumbs-popup-menu
+  semantic-idle-breadcrumbs-popup-map
+  "Semantic Breadcrumbs Mode Menu"
+  (list
+   "Breadcrumb Tag"
+   (semantic-menu-item
+    (vector
+     "Go to Tag"
+     (semantic-idle-breadcrumbs--tag-function
+      semantic-go-to-tag)
+     :active t
+     :help  "Jump to this tag"))
+   ;; TODO these entries need minor changes (optional tag argument) in
+   ;; senator-copy-tag etc
+  ;;  (semantic-menu-item
+  ;;   (vector
+  ;;    "Copy Tag"
+  ;;    (semantic-idle-breadcrumbs--tag-function
+  ;;     senator-copy-tag)
+  ;;    :active t
+  ;;    :help   "Copy this tag"))
+  ;;   (semantic-menu-item
+  ;;    (vector
+  ;;     "Kill Tag"
+  ;;     (semantic-idle-breadcrumbs--tag-function
+  ;;      senator-kill-tag)
+  ;;     :active t
+  ;;     :help   "Kill tag text to the kill ring, and copy the tag to
+  ;; the tag ring"))
+  ;;   (semantic-menu-item
+  ;;    (vector
+  ;;     "Copy Tag to Register"
+  ;;     (semantic-idle-breadcrumbs--tag-function
+  ;;      senator-copy-tag-to-register)
+  ;;     :active t
+  ;;     :help   "Copy this tag"))
+  ;;   (semantic-menu-item
+  ;;    (vector
+  ;;     "Narrow to Tag"
+  ;;     (semantic-idle-breadcrumbs--tag-function
+  ;;      senator-narrow-to-defun)
+  ;;     :active t
+  ;;     :help   "Narrow to the bounds of the current tag"))
+  ;;   (semantic-menu-item
+  ;;    (vector
+  ;;     "Fold Tag"
+  ;;     (semantic-idle-breadcrumbs--tag-function
+  ;;      senator-fold-tag-toggle)
+  ;;     :active   t
+  ;;     :style    'toggle
+  ;;     :selected '(let ((tag (semantic-current-tag)))
+  ;; 		   (and tag (semantic-tag-folded-p tag)))
+  ;;     :help     "Fold the current tag to one line"))
+    "---"
+    (semantic-menu-item
+     (vector
+      "About this Header Line"
+      (lambda ()
+	(interactive)
+	(describe-function 'semantic-idle-breadcrumbs-mode))
+      :active t
+      :help   "Display help about this header line."))
+    )
+  )
+
+(define-semantic-idle-service semantic-idle-breadcrumbs
+  "Display breadcrumbs for the tag under point and its parents."
+  (let* ((scope    (semantic-calculate-scope))
+	 (tag-list (if scope
+		       ;; If there is a scope, extract the tag and its
+		       ;; parents.
+		       (append (oref scope parents)
+			       (when (oref scope tag)
+				 (list (oref scope tag))))
+		     ;; Fall back to tags by overlay
+		     (semantic-find-tag-by-overlay))))
+    ;; Display the tags.
+    (funcall semantic-idle-breadcrumbs-display-function tag-list)))
+
+(defun semantic-idle-breadcrumbs--display-in-header-line (tag-list)
+  "Display the tags in TAG-LIST in the header line of their buffer."
+  (let ((width (- (nth 2 (window-edges))
+		  (nth 0 (window-edges)))))
+    ;; Format TAG-LIST and put the formatted string into the header
+    ;; line.
+    (setq header-line-format
+	  (concat
+	   semantic-idle-breadcrumbs-header-line-prefix
+	   (if tag-list
+	       (semantic-idle-breadcrumbs--format-tag-list
+		tag-list
+		(- width
+		   (length semantic-idle-breadcrumbs-header-line-prefix)))
+	     (propertize
+	      "<not on tags>"
+	      'face
+	      'font-lock-comment-face)))))
+
+  ;; Update the header line.
+  (force-mode-line-update))
+
+(defun semantic-idle-breadcrumbs--display-in-mode-line (tag-list)
+  "Display the tags in TAG-LIST in the mode line of their buffer.
+TODO THIS FUNCTION DOES NOT WORK YET."
+
+  (error "This function does not work yet")
+
+  (let ((width (- (nth 2 (window-edges))
+		  (nth 0 (window-edges)))))
+    (setq mode-line-format
+	  (semantic-idle-breadcrumbs--format-tag-list tag-list width)))
+
+  (force-mode-line-update))
+
+(defun semantic-idle-breadcrumbs--format-tag-list (tag-list max-length)
+  "Format TAG-LIST using configured functions respecting MAX-LENGTH.
+If the initial formatting result is longer than MAX-LENGTH, it is
+shortened at the beginning."
+  ;; Format TAG-LIST using the configured formatting function.
+  (let* ((complete-format (funcall
+			   semantic-idle-breadcrumbs-format-tag-list-function
+			   tag-list max-length))
+	 ;; Determine length of complete format.
+	 (complete-length (length complete-format)))
+    ;; Shorten string if necessary.
+    (if (<= complete-length max-length)
+	complete-format
+      (concat "... "
+	      (substring
+	       complete-format
+	       (- complete-length (- max-length 4))))))
+  )
+
+(defun semantic-idle-breadcrumbs--format-linear
+  (tag-list &optional max-length)
+  "Format TAG-LIST as a linear list, starting with the outermost tag.
+MAX-LENGTH is not used."
+  (require 'semantic/analyze/fcn)
+  (let* ((format-pieces   (mapcar
+			   #'semantic-idle-breadcrumbs--format-tag
+			   tag-list))
+	 ;; Format tag list, putting configured separators between the
+	 ;; tags.
+	 (complete-format (cond
+			   ;; Mode specific separator.
+			   ((eq semantic-idle-breadcrumbs-separator
+				'mode-specific)
+			    (semantic-analyze-unsplit-name format-pieces))
+
+			   ;; Custom separator.
+			   ((stringp semantic-idle-breadcrumbs-separator)
+			    (mapconcat
+			     #'identity
+			     format-pieces
+			     semantic-idle-breadcrumbs-separator)))))
+    complete-format)
+  )
+
+(defun semantic-idle-breadcrumbs--format-innermost-first
+  (tag-list &optional max-length)
+  "Format TAG-LIST placing the innermost tag first, separated from its parents.
+If MAX-LENGTH is non-nil, the innermost tag is shortened."
+  (let* (;; Separate and format remaining tags. Calculate length of
+	 ;; resulting string.
+	 (rest-tags       (butlast tag-list))
+	 (rest-format     (if rest-tags
+			      (concat
+			       " | "
+			       (semantic-idle-breadcrumbs--format-linear
+				rest-tags))
+			    ""))
+	 (rest-length     (length rest-format))
+	 ;; Format innermost tag and calculate length of resulting
+	 ;; string.
+	 (inner-format    (semantic-idle-breadcrumbs--format-tag
+			   (car (last tag-list))
+			   #'semantic-format-tag-prototype))
+	 (inner-length    (length inner-format))
+	 ;; Calculate complete length and shorten string for innermost
+	 ;; tag if MAX-LENGTH is non-nil and the complete string is
+	 ;; too long.
+	 (complete-length (+ inner-length rest-length))
+	 (inner-short     (if (and max-length
+				   (<= complete-length max-length))
+			      inner-format
+			    (concat (substring
+				     inner-format
+				     0
+				     (- inner-length
+					(- complete-length max-length)
+					4))
+				    " ..."))))
+    ;; Concat both parts.
+    (concat inner-short rest-format))
+  )
+
+(defun semantic-idle-breadcrumbs--format-tag (tag &optional format-function)
+  "Format TAG using the configured function or FORMAT-FUNCTION.
+This function also adds text properties for help-echo, mouse
+highlighting and a keymap."
+  (let ((formatted (funcall
+		    (or format-function
+			semantic-idle-breadcrumbs-format-tag-function)
+		    tag nil t)))
+    (add-text-properties
+     0 (length formatted)
+     (list
+      'tag
+      tag
+      'help-echo
+      (format
+       "Tag %s
+Type: %s
+mouse-1: jump to tag
+mouse-3: popup context menu"
+       (semantic-tag-name tag)
+       (semantic-tag-class tag))
+      'mouse-face
+      'highlight
+      'keymap
+      semantic-idle-breadcrumbs-popup-map)
+     formatted)
+    formatted))
+
+
 (provide 'semantic/idle)
 
 ;; Local variables:
--- a/lisp/cedet/semantic/imenu.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/imenu.el	Thu Sep 23 15:00:31 2010 -0400
@@ -99,7 +99,7 @@
 Overriden to nil if `semantic-imenu-bucketize-file' is nil."
   :group 'semantic-imenu
   :type 'boolean)
-(make-variable-buffer-local 'semantic-imenu-bucketize-type-parts)
+(make-variable-buffer-local 'semantic-imenu-bucketize-type-members)
 (semantic-varalias-obsolete 'semantic-imenu-bucketize-type-parts
                             'semantic-imenu-bucketize-type-members "23.2")
 
--- a/lisp/cedet/semantic/lex-spp.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/lex-spp.el	Thu Sep 23 15:00:31 2010 -0400
@@ -864,42 +864,45 @@
 			   semantic-lex-spp-expanded-macro-stack
 			   ))
 	 )
-    (with-current-buffer buf
-      (erase-buffer)
-      ;; Below is a painful hack to make sure everything is setup correctly.
-      (when (not (eq major-mode mode))
-	(save-match-data
+    (if (> semantic-lex-spp-hack-depth 5)
+	nil
+      (with-current-buffer buf
+	(erase-buffer)
+	;; Below is a painful hack to make sure everything is setup correctly.
+	(when (not (eq major-mode mode))
+	  (save-match-data
 
-	  ;; Protect against user-hooks that throw errors.
-	  (condition-case nil
-	      (funcall mode)
-	    (error nil))
+	    ;; Protect against user-hooks that throw errors.
+	    (condition-case nil
+		(funcall mode)
+	      (error nil))
+
+	    ;; Hack in mode-local
+	    (activate-mode-local-bindings)
 
-	  ;; Hack in mode-local
-	  (activate-mode-local-bindings)
-	  ;; CHEATER!  The following 3 lines are from
-	  ;; `semantic-new-buffer-fcn', but we don't want to turn
-	  ;; on all the other annoying modes for this little task.
-	  (setq semantic-new-buffer-fcn-was-run t)
-	  (semantic-lex-init)
-	  (semantic-clear-toplevel-cache)
-	  (remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
-		       t)
-	  ))
+	    ;; CHEATER!  The following 3 lines are from
+	    ;; `semantic-new-buffer-fcn', but we don't want to turn
+	    ;; on all the other annoying modes for this little task.
+	    (setq semantic-new-buffer-fcn-was-run t)
+	    (semantic-lex-init)
+	    (semantic-clear-toplevel-cache)
+	    (remove-hook 'semantic-lex-reset-hooks 'semantic-lex-spp-reset-hook
+			 t)
+	    ))
 
-      ;; Second Cheat: copy key variables regarding macro state from the
-      ;; the originating buffer we are parsing.  We need to do this every time
-      ;; since the state changes.
-      (dolist (V important-vars)
-	(set V (semantic-buffer-local-value V origbuff)))
-      (insert text)
-      (goto-char (point-min))
+	;; Second Cheat: copy key variables regarding macro state from the
+	;; the originating buffer we are parsing.  We need to do this every time
+	;; since the state changes.
+	(dolist (V important-vars)
+	  (set V (semantic-buffer-local-value V origbuff)))
+	(insert text)
+	(goto-char (point-min))
 
-      (setq fresh-toks (semantic-lex-spp-stream-for-macro (point-max))))
+	(setq fresh-toks (semantic-lex-spp-stream-for-macro (point-max))))
 
-    (dolist (tok fresh-toks)
-      (when (memq (semantic-lex-token-class tok) '(symbol semantic-list))
-	(setq toks (cons tok toks))))
+      (dolist (tok fresh-toks)
+	(when (memq (semantic-lex-token-class tok) '(symbol semantic-list))
+	  (setq toks (cons tok toks)))))
 
     (nreverse toks)))
 
--- a/lisp/cedet/semantic/scope.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/scope.el	Thu Sep 23 15:00:31 2010 -0400
@@ -67,7 +67,7 @@
 	       :documentation
 	       "The list of types currently in scope.
 For C++, this would contain anonymous namespaces known, and
-anything labled by a `using' statement.")
+anything labeled by a `using' statement.")
    (parents :initform nil
 	    :documentation
 	    "List of parents in scope w/in the body of this function.
@@ -239,8 +239,11 @@
 	   )
       ;; In case of arg lists or some-such, throw out non-types.
       (while (and stack (not (semantic-tag-of-class-p pparent 'type)))
-	(setq stack (cdr stack)
-	            pparent (car (cdr stack))))
+	(setq stack (cdr stack) pparent (car (cdr stack))))
+
+      ;; Remove duplicates
+      (while (member pparent scopetypes)
+	(setq stack (cdr stack) pparent (car (cdr stack))))
 
       ;; Step 1:
       ;;    Analyze the stack of tags we are nested in as parents.
@@ -611,7 +614,7 @@
 	  ;; to do any of the stuff related to variables and what-not.
 	  (setq tmpscope (semantic-scope-cache "mini"))
 	  (let* ( ;; Step 1:
-		 (scopetypes (semantic-analyze-scoped-types (point)))
+		 (scopetypes (cons type (semantic-analyze-scoped-types (point))))
 		 (parents (semantic-analyze-scope-nested-tags (point) scopetypes))
 		 ;;(parentinherited (semantic-analyze-scope-lineage-tags parents scopetypes))
 		 (lscope nil)
--- a/lisp/cedet/semantic/sort.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/sort.el	Thu Sep 23 15:00:31 2010 -0400
@@ -463,7 +463,7 @@
   )
 
 (defun semantic-tag-external-member-parent-default (tag)
-  "Return the name of TAGs parent only if TAG is not defined in it's parent."
+  "Return the name of TAGs parent only if TAG is not defined in its parent."
   ;; Use only the extra spec because a type has a parent which
   ;; means something completely different.
   (let ((tp (semantic-tag-get-attribute tag :parent)))
@@ -473,7 +473,7 @@
 (define-overloadable-function semantic-tag-external-member-p (parent tag)
   "Return non-nil if PARENT is the parent of TAG.
 TAG is an external member of PARENT when it is somehow tagged
-as having PARENT as it's parent.
+as having PARENT as its parent.
 PARENT and TAG must both be semantic tags.
 
 The default behavior, if not overridden with
--- a/lisp/cedet/semantic/symref.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/symref.el	Thu Sep 23 15:00:31 2010 -0400
@@ -71,6 +71,7 @@
 (declare-function data-debug-insert-object-slots "eieio-datadebug")
 (declare-function ede-toplevel "ede/files")
 (declare-function ede-project-root-directory "ede/files")
+(declare-function ede-up-directory "ede/files")
 
 ;;; Code:
 (defvar semantic-symref-tool 'detect
@@ -98,16 +99,27 @@
 
 If no tools are supported, then 'grep is assumed.")
 
+(defun semantic-symref-calculate-rootdir ()
+  "Calculate the root directory for a symref search.
+Start with and EDE project, or use the default directory."
+  (let* ((rootproj (when (and (featurep 'ede) ede-minor-mode)
+		     (ede-toplevel)))
+	 (rootdirbase (if rootproj
+			  (ede-project-root-directory rootproj)
+			default-directory)))
+    (if (and rootproj (condition-case nil
+			  ;; Hack for subprojects.
+			  (oref rootproj :metasubproject)
+			(error nil)))
+	(ede-up-directory rootdirbase)
+      rootdirbase)))
+
 (defun semantic-symref-detect-symref-tool ()
   "Detect the symref tool to use for the current buffer."
   (if (not (eq semantic-symref-tool 'detect))
       semantic-symref-tool
     ;; We are to perform a detection for the right tool to use.
-    (let* ((rootproj (when (and (featurep 'ede) ede-minor-mode)
-		       (ede-toplevel)))
-	   (rootdir (if rootproj
-			(ede-project-root-directory rootproj)
-		      default-directory))
+    (let* ((rootdir (semantic-symref-calculate-rootdir))
 	   (tools semantic-symref-tool-alist))
       (while (and tools (eq semantic-symref-tool 'detect))
 	(when (funcall (car (car tools)) rootdir)
--- a/lisp/cedet/semantic/symref/grep.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/symref/grep.el	Thu Sep 23 15:00:31 2010 -0400
@@ -30,10 +30,6 @@
 (require 'semantic/symref)
 (require 'grep)
 
-(defvar ede-minor-mode)
-(declare-function ede-toplevel "ede/files")
-(declare-function ede-project-root-directory "ede/files")
-
 ;;; Code:
 
 ;;; GREP
@@ -86,7 +82,7 @@
 			      " -o ")
 		   " \\)"))
 	  (t
-	   (error "Configuration for `semantic-symref-tool-grep' needed for %s" major-mode))
+	   (error "Customize `semantic-symref-filepattern-alist' for %s" major-mode))
 	  )))
 
 (defvar semantic-symref-grep-expand-keywords
@@ -119,6 +115,12 @@
     ;;(message "New command: %s" cmd)
     cmd))
 
+(defcustom semantic-symref-grep-shell "sh"
+  "The shell command to use for executing find/grep.
+This shell should support pipe redirect syntax."
+  :group 'semantic
+  :type 'string)
+
 (defmethod semantic-symref-perform-search ((tool semantic-symref-tool-grep))
   "Perform a search with Grep."
   ;; Grep doesn't support some types of searches.
@@ -129,19 +131,7 @@
   ;; Find the root of the project, and do a find-grep...
   (let* (;; Find the file patterns to use.
 	 (pat (cdr (assoc major-mode semantic-symref-filepattern-alist)))
-	 (rootdir (cond
-		   ;; Project root via EDE.
-		   ((eq (oref tool :searchscope) 'project)
-		    (let ((rootproj (when (and (featurep 'ede) ede-minor-mode)
-				      (ede-toplevel))))
-		      (if rootproj
-			  (ede-project-root-directory rootproj)
-			default-directory)))
-		   ;; Calculate the target files as just in
-		   ;; this directory... cause I'm lazy.
-		   ((eq (oref tool :searchscope) 'target)
-		    default-directory)
-		   ))
+	 (rootdir (semantic-symref-calculate-rootdir))
 	 (filepattern (semantic-symref-derive-find-filepatterns))
 	 ;; Grep based flags.
 	 (grepflags (cond ((eq (oref tool :resulttype) 'file)
@@ -168,10 +158,10 @@
 	  (let ((cmd (concat "find " default-directory " -type f " filepattern " -print0 "
 			     "| xargs -0 grep -H " grepflags "-e " greppat)))
 	    ;;(message "Old command: %s" cmd)
-	    (call-process "sh" nil b nil "-c" cmd)
+	    (call-process semantic-symref-grep-shell nil b nil "-c" cmd)
 	    )
 	(let ((cmd (semantic-symref-grep-use-template rootdir filepattern grepflags greppat)))
-	  (call-process "sh" nil b nil "-c" cmd))
+	  (call-process semantic-symref-grep-shell nil b nil "-c" cmd))
 	))
     (setq ans (semantic-symref-parse-tool-output tool b))
     ;; Return the answer
--- a/lisp/cedet/semantic/symref/list.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/symref/list.el	Thu Sep 23 15:00:31 2010 -0400
@@ -33,6 +33,7 @@
 
 (require 'semantic/symref)
 (require 'semantic/complete)
+(require 'semantic/senator)
 (require 'pulse)
 
 ;;; Code:
@@ -42,9 +43,9 @@
   "Find references to the current tag.
 This command uses the currently configured references tool within the
 current project to find references to the current tag.  The
-references are the organized by file and the name of the function
+references are organized by file and the name of the function
 they are used in.
-Display the references in`semantic-symref-results-mode'."
+Display the references in `semantic-symref-results-mode'."
   (interactive)
   (semantic-fetch-tags)
   (let ((ct (semantic-current-tag))
@@ -65,6 +66,24 @@
   "Find references to the symbol SYM.
 This command uses the currently configured references tool within the
 current project to find references to the input SYM.  The
+references are organized by file and the name of the function
+they are used in.
+Display the references in `semantic-symref-results-mode'."
+  (interactive (list (semantic-tag-name (semantic-complete-read-tag-buffer-deep
+					 "Symrefs for: "))))
+  (semantic-fetch-tags)
+  (let ((res nil)
+	)
+    ;; Gather results and tags
+    (message "Gathering References...")
+    (setq res (semantic-symref-find-references-by-name sym))
+    (semantic-symref-produce-list-on-results res sym)))
+
+;;;###autoload
+(defun semantic-symref-regexp (sym)
+  "Find references to the a symbol regexp SYM.
+This command uses the currently configured references tool within the
+current project to find references to the input SYM.  The
 references are the organized by file and the name of the function
 they are used in.
 Display the references in`semantic-symref-results-mode'."
@@ -75,7 +94,7 @@
 	)
     ;; Gather results and tags
     (message "Gathering References...")
-    (setq res (semantic-symref-find-references-by-name sym))
+    (setq res (semantic-symref-find-text sym))
     (semantic-symref-produce-list-on-results res sym)))
 
 
@@ -110,11 +129,59 @@
     (define-key km "n" 'semantic-symref-list-next-line)
     (define-key km "p" 'semantic-symref-list-prev-line)
     (define-key km "q" 'semantic-symref-hide-buffer)
+    (define-key km "\C-c\C-e" 'semantic-symref-list-expand-all)
+    (define-key km "\C-c\C-r" 'semantic-symref-list-contract-all)
+    (define-key km "R" 'semantic-symref-list-rename-open-hits)
+    (define-key km "(" 'semantic-symref-list-create-macro-on-open-hit)
+    (define-key km "E" 'semantic-symref-list-call-macro-on-open-hits)
     km)
   "Keymap used in `semantic-symref-results-mode'.")
 
+(defvar semantic-symref-list-menu-entries
+  (list
+   "Symref"
+   (semantic-menu-item
+    ["Toggle Line Open"
+     semantic-symref-list-toggle-showing
+     :active t
+     :help "Toggle the current line open or closed."
+     ])
+   (semantic-menu-item
+    ["Expand All Entries"
+     semantic-symref-list-expand-all
+     :active t
+     :help "Expand every expandable entry."
+     ])
+   (semantic-menu-item
+    ["Contract All Entries"
+     semantic-symref-list-contract-all
+     :active t
+     :help "Close every expandable entry."
+     ])
+   (semantic-menu-item
+    ["Rename Symbol in Open hits"
+     semantic-symref-list-rename-open-hits
+     :active t
+     :help "Rename the searched for symbol in all hits that are currently open."
+     ])
+   )
+  "Menu entries for the Semantic Symref list mode.")
+
+(defvar semantic-symref-list-menu nil
+  "Menu keymap build from `semantic-symref-results-mode'.")
+
+(easy-menu-define semantic-symref-list-menu
+  semantic-symref-results-mode-map
+  "Symref Mode Menu"
+  semantic-symref-list-menu-entries)
+
+(defcustom semantic-symref-auto-expand-results nil
+  "Non-nil to expand symref results on buffer creation."
+  :group 'semantic-symref
+  :type 'boolean)
+
 (defcustom semantic-symref-results-mode-hook nil
-  "*Hook run when `semantic-symref-results-mode' starts."
+  "Hook run when `semantic-symref-results-mode' starts."
   :group 'semantic-symref
   :type 'hook)
 
@@ -189,6 +256,10 @@
 
       ))
 
+  ;; Auto expand
+  (when semantic-symref-auto-expand-results
+    (semantic-symref-list-expand-all))
+
   ;; Clean up the mess
   (toggle-read-only 1)
   (set-buffer-modified-p nil)
@@ -305,7 +376,8 @@
 	 (win (selected-window))
 	 )
     (switch-to-buffer-other-window buff)
-    (with-no-warnings (goto-line line))
+    (goto-char (point-min))
+    (forward-line (1- line))
     (pulse-momentary-highlight-one-line (point))
     (when (eq last-command-event ?\s) (select-window win))
     )
@@ -323,6 +395,158 @@
   (forward-line -1)
   (back-to-indentation))
 
+(defun semantic-symref-list-expand-all ()
+  "Expand all the nodes in the current buffer."
+  (interactive)
+  (let ((start (make-marker)))
+    (move-marker start (point))
+    (goto-char (point-min))
+    (while (re-search-forward "\\[[+]\\]" nil t)
+      (semantic-symref-list-toggle-showing))
+    ;; Restore position
+    (goto-char start)))
+
+(defun semantic-symref-list-contract-all ()
+  "Expand all the nodes in the current buffer."
+  (interactive)
+  (let ((start (make-marker)))
+    (move-marker start (point))
+    (goto-char (point-min))
+    (while (re-search-forward "\\[[-]\\]" nil t)
+      (semantic-symref-list-toggle-showing))
+    ;; Restore position
+    (goto-char start)))
+
+;;; UTILS
+;;
+;; List mode utils for understadning the current line
+
+(defun semantic-symref-list-on-hit-p ()
+  "Return the line number if the cursor is on a buffer line with a hit.
+Hits are the line of code from the buffer, not the tag summar or file lines."
+  (save-excursion
+    (end-of-line)
+    (let* ((ol (car (semantic-overlays-at (1- (point)))))) ;; trust this for now
+      (when ol (semantic-overlay-get ol 'line)))))
+
+
+;;; Keyboard Macros on a Hit
+;;
+;; Record a macro on a hit, and store in a special way for execution later.
+(defun semantic-symref-list-create-macro-on-open-hit ()
+  "Record a keyboard macro at the location of the hit in the current list.
+Under point should be one hit for the active keyword.  Move
+cursor to the beginning of that symbol, then record a macro as if
+`kmacro-start-macro' was pressed.  Use `kmacro-end-macro',
+{kmacro-end-macro} to end the macro, and return to the symbol found list."
+  (interactive)
+  (let* ((oldsym (oref (oref semantic-symref-current-results
+			    :created-by)
+		      :searchfor))
+	 (ol (save-excursion
+	       (end-of-line)
+	       (car (semantic-overlays-at (1- (point))))))
+	 (tag (when ol (semantic-overlay-get ol 'tag)))
+	 (line (when ol (semantic-overlay-get ol 'line))))
+    (when (not line)
+      (error "Cannot create macro on a non-hit line"))
+    ;; Go there, and do something useful.
+    (switch-to-buffer-other-window (semantic-tag-buffer tag))
+    (goto-char (point-min))
+    (forward-line (1- line))
+    (when (not (re-search-forward (regexp-quote oldsym) (point-at-eol) t))
+      (error "Cannot find hit.  Cannot record macro"))
+    (goto-char (match-beginning 0))
+    ;; Cursor is now in the right location.  Start recording a macro.
+    (kmacro-start-macro nil)
+    ;; Notify the user
+    (message "Complete with C-x ).  Use E in the symref buffer to call this macro.")))
+
+(defun semantic-symref-list-call-macro-on-open-hits ()
+  "Call the most recently created keyboard macro on each hit.
+Cursor is placed at the beginning of the symbol found, even if
+there is more than one symbol on the current line.  The
+previously recorded macro is then executed."
+  (interactive)
+  (save-window-excursion
+    (let ((count (semantic-symref-list-map-open-hits
+		  (lambda ()
+		    (switch-to-buffer (current-buffer))
+		    (kmacro-call-macro nil)))))
+      (semantic-symref-list-update-open-hits)
+      (message "Executed Macro %d times." count))))
+
+;;; REFACTORING EDITS
+;;
+;; Utilities and features for refactoring across a list of hits.
+;;
+(defun semantic-symref-list-rename-open-hits (newname)
+  "Rename the discovered symbol references to NEWNAME.
+Only renames the locations that are open in the symref list.
+Closed items will be skipped."
+  (interactive
+   (list (read-string "Rename to: "
+		      (oref (oref semantic-symref-current-results
+				  :created-by)
+			    :searchfor))))
+  (let ((count (semantic-symref-list-map-open-hits
+		(lambda () (replace-match newname nil t)))))
+    (semantic-symref-list-update-open-hits)
+    (message "Renamed %d occurances." count)))
+
+;;; REFACTORING UTILITIES
+;;
+;; Refactoring tools want to operate on only the "good" stuff the
+;; user selected.
+(defun semantic-symref-list-map-open-hits (function)
+  "For every open hit in the symref buffer, perform FUNCTION.
+The `match-data' will be set to a successful hit of the searched for symbol.
+Return the number of occurances FUNCTION was operated upon."
+
+  ;; First Pass in this function - a straight rename.
+  ;; Second Pass - Allow context specification based on
+  ;;               class members. (Not Done)
+
+  (let ((oldsym (oref (oref semantic-symref-current-results
+			    :created-by)
+		      :searchfor))
+	(count 0))
+    (save-excursion
+      (goto-char (point-min))
+      (while (not (eobp))
+	;; Is this line a "hit" line?
+	(let* ((ol (car (semantic-overlays-at (1- (point))))) ;; trust this for now
+	       (tag (when ol (semantic-overlay-get ol 'tag)))
+	       (line (when ol (semantic-overlay-get ol 'line))))
+	  (when line
+	    ;; The "line" means we have an open hit.
+	    (with-current-buffer (semantic-tag-buffer tag)
+	      (goto-char (point-min))
+	      (forward-line (1- line))
+	      (beginning-of-line)
+	      (while (re-search-forward (regexp-quote oldsym) (point-at-eol) t)
+		(setq count (1+ count))
+		(save-excursion ;; Leave cursor after the matched name.
+		  (goto-char (match-beginning 0)) ;; Go to beginning of that sym
+		  (funcall function))))))
+	;; Go to the next line
+	(forward-line 1)
+	(end-of-line)))
+    count))
+
+(defun semantic-symref-list-update-open-hits ()
+  "Update the text for all the open hits in the symref list."
+  (save-excursion
+    (goto-char (point-min))
+    (while (re-search-forward "\\[-\\]" nil t)
+      (end-of-line)
+      (let* ((ol (car (semantic-overlays-at (1- (point))))) ;; trust this for now
+	     (tag (when ol (semantic-overlay-get ol 'tag))))
+	;; If there is a tag, then close/open it.
+	(when tag
+	  (semantic-symref-list-toggle-showing)
+	  (semantic-symref-list-toggle-showing))))))
+
 (provide 'semantic/symref/list)
 
 ;; Local variables:
--- a/lisp/cedet/semantic/tag.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/tag.el	Thu Sep 23 15:00:31 2010 -0400
@@ -687,18 +687,24 @@
 ;;
 (defun semantic-tag-deep-copy-one-tag (tag &optional filter)
   "Make a deep copy of TAG, applying FILTER to each child-tag.
-Properties and overlay info are not copied.
-FILTER takes TAG as an argument, and should returns a semantic-tag.
+No properties are copied except for :filename.
+Overlay will be a vector.
+FILTER takes TAG as an argument, and should return a `semantic-tag'.
 It is safe for FILTER to modify the input tag and return it."
   (when (not filter) (setq filter 'identity))
   (when (not (semantic-tag-p tag))
     (signal 'wrong-type-argument (list tag 'semantic-tag-p)))
-  (funcall filter (list (semantic-tag-name tag)
-                        (semantic-tag-class tag)
-                        (semantic--tag-deep-copy-attributes
-			 (semantic-tag-attributes tag) filter)
-                        nil
-                        nil)))
+  (let ((ol (semantic-tag-overlay tag))
+	(fn (semantic-tag-file-name tag)))
+    (funcall filter (list (semantic-tag-name tag)
+			  (semantic-tag-class tag)
+			  (semantic--tag-deep-copy-attributes
+			   (semantic-tag-attributes tag) filter)
+			  ;; Only copy the filename property
+			  (when fn (list :filename fn))
+			  ;; Only setup a vector if we had an overlay.
+			  (when ol (vector (semantic-tag-start tag)
+					   (semantic-tag-end tag)))))))
 
 (defun semantic--tag-deep-copy-attributes (attrs &optional filter)
   "Make a deep copy of ATTRS, applying FILTER to each child-tag.
@@ -877,7 +883,7 @@
   "Return the parent of the function that TAG describes.
 That is the value of the `:parent' attribute.
 A function has a parent if it is a method of a class, and if the
-function does not appear in body of it's parent class."
+function does not appear in body of its parent class."
   (semantic-tag-named-parent tag))
 
 (defsubst semantic-tag-function-destructor-p (tag)
--- a/lisp/cedet/semantic/texi.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/texi.el	Thu Sep 23 15:00:31 2010 -0400
@@ -591,12 +591,16 @@
 ;;     ;; Test for doc string
 ;;     (unless docstring
 ;;       (error "Could not find documentation for %s" (semantic-tag-name tag)))
+;;
+;;     (require 'srecode)
+;;     (require 'srecode-texi)
+;;
 ;;     ;; If we have a string, do the replacement.
 ;;     (delete-region (semantic-tag-start tag)
 ;; 		   (semantic-tag-end tag))
 ;;     ;; Use useful functions from the docaument library.
-;;     (require 'document)
-;;     (document-insert-texinfo doctag (semantic-tag-buffer doctag))
+;;    (srecode-texi-insert-tag-as-doc doctag)
+;;    ;(semantic-insert-foreign-tag doctag)
 ;;     ))
 
 ;; (defun semantic-texi-update-doc-from-source (&optional tag)
--- a/lisp/cedet/semantic/util-modes.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/util-modes.el	Thu Sep 23 15:00:31 2010 -0400
@@ -743,6 +743,13 @@
   "List of tag classes which stickyfunc will display in the header line.")
 (make-variable-buffer-local 'semantic-stickyfunc-sticky-classes)
 
+(defcustom semantic-stickyfunc-show-only-functions-p nil
+  "Non-nil means don't show lines that aren't part of a tag.
+If this is nil, then comments or other text between tags that is
+1 line above the top of the current window will be shown."
+  :group 'semantic
+  :type 'boolean)
+
 (defun semantic-stickyfunc-tag-to-stick ()
   "Return the tag to stick at the current point."
   (let ((tags (nreverse (semantic-find-tag-by-overlay (point)))))
@@ -759,45 +766,51 @@
   "Make the function at the top of the current window sticky.
 Capture its function declaration, and place it in the header line.
 If there is no function, disable the header line."
-  (let ((str
-	 (save-excursion
-	   (goto-char (window-start (selected-window)))
-	   (forward-line -1)
-	   (end-of-line)
-	   ;; Capture this function
-	   (let* ((tag (semantic-stickyfunc-tag-to-stick)))
-	     ;; TAG is nil if there was nothing of the appropriate type there.
-	     (if (not tag)
-		 ;; Set it to be the text under the header line
-		 (buffer-substring (point-at-bol) (point-at-eol))
-	       ;; Get it
-	       (goto-char (semantic-tag-start tag))
-               ;; Klaus Berndl <klaus.berndl@sdm.de>:
-               ;; goto the tag name; this is especially needed for languages
-               ;; like c++ where a often used style is like:
-               ;;     void
-               ;;     ClassX::methodM(arg1...)
-               ;;     {
-               ;;       ...
-               ;;     }
-               ;; Without going to the tag-name we would get"void" in the
-               ;; header line which is IMHO not really useful
-               (search-forward (semantic-tag-name tag) nil t)
-	       (buffer-substring (point-at-bol) (point-at-eol))
-	       ))))
-	(start 0))
-    (while (string-match "%" str start)
-      (setq str (replace-match "%%" t t str 0)
-	    start (1+ (match-end 0)))
-      )
-    ;; In 21.4 (or 22.1) the heder doesn't expand tabs.  Hmmmm.
-    ;; We should replace them here.
-    ;;
-    ;; This hack assumes that tabs are kept smartly at tab boundaries
-    ;; instead of in a tab boundary where it might only represent 4 spaces.
-    (while (string-match "\t" str start)
-      (setq str (replace-match "        " t t str 0)))
-    str))
+  (save-excursion
+    (goto-char (window-start (selected-window)))
+    (let* ((noshow (bobp))
+	   (str
+	    (progn
+	      (forward-line -1)
+	      (end-of-line)
+	      ;; Capture this function
+	      (let* ((tag (semantic-stickyfunc-tag-to-stick)))
+		;; TAG is nil if there was nothing of the appropriate type there.
+		(if (not tag)
+		    ;; Set it to be the text under the header line
+		    (if noshow
+			""
+		      (if semantic-stickyfunc-show-only-functions-p ""
+			(buffer-substring (point-at-bol) (point-at-eol))
+			))
+		  ;; Go get the first line of this tag.
+		  (goto-char (semantic-tag-start tag))
+		  ;; Klaus Berndl <klaus.berndl@sdm.de>:
+		  ;; goto the tag name; this is especially needed for languages
+		  ;; like c++ where a often used style is like:
+		  ;;     void
+		  ;;     ClassX::methodM(arg1...)
+		  ;;     {
+		  ;;       ...
+		  ;;     }
+		  ;; Without going to the tag-name we would get"void" in the
+		  ;; header line which is IMHO not really useful
+		  (search-forward (semantic-tag-name tag) nil t)
+		  (buffer-substring (point-at-bol) (point-at-eol))
+		  ))))
+	   (start 0))
+      (while (string-match "%" str start)
+	(setq str (replace-match "%%" t t str 0)
+	      start (1+ (match-end 0)))
+	)
+      ;; In 21.4 (or 22.1) the header doesn't expand tabs.  Hmmmm.
+      ;; We should replace them here.
+      ;;
+      ;; This hack assumes that tabs are kept smartly at tab boundaries
+      ;; instead of in a tab boundary where it might only represent 4 spaces.
+      (while (string-match "\t" str start)
+	(setq str (replace-match "        " t t str 0)))
+      str)))
 
 (defun semantic-stickyfunc-menu (event)
   "Popup a menu that can help a user understand stickyfunc-mode.
--- a/lisp/cedet/semantic/util.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/util.el	Thu Sep 23 15:00:31 2010 -0400
@@ -132,44 +132,6 @@
 (semantic-alias-obsolete 'semantic-something-to-stream
 			 'semantic-something-to-tag-table "23.2")
 
-;;; Recursive searching through dependency trees
-;;
-;; This will depend on the general searching APIS defined above.
-;; but will add full recursion through the dependencies list per
-;; stream.
-(defun semantic-recursive-find-nonterminal-by-name (name buffer)
-  "Recursively find the first occurrence of NAME.
-Start search with BUFFER.  Recurse through all dependencies till found.
-The return item is of the form (BUFFER TOKEN) where BUFFER is the buffer
-in which TOKEN (the token found to match NAME) was found.
-
-THIS ISN'T USED IN SEMANTIC.  DELETE ME SOON."
-  (with-current-buffer buffer
-    (let* ((stream (semantic-fetch-tags))
-	   (includelist (or (semantic-find-tags-by-class 'include stream)
-			    "empty.silly.thing"))
-	   (found (semantic-find-first-tag-by-name name stream))
-	   (unfound nil))
-      (while (and (not found) includelist)
-	(let ((fn (semantic-dependency-tag-file (car includelist))))
-	  (if (and fn (not (member fn unfound)))
-	      (with-current-buffer (save-match-data
-                                     (find-file-noselect fn))
-		(message "Scanning %s" (buffer-file-name))
-		(setq stream (semantic-fetch-tags))
-		(setq found (semantic-find-first-tag-by-name name stream))
-		(if found
-		    (setq found (cons (current-buffer) (list found)))
-		  (setq includelist
-			(append includelist
-				(semantic-find-tags-by-class
-				 'include stream))))
-		(setq unfound (cons fn unfound)))))
-	(setq includelist (cdr includelist)))
-      found)))
-(make-obsolete 'semantic-recursive-find-nonterminal-by-name
-	       "Do not use this function." "23.2")
-
 ;;; Completion APIs
 ;;
 ;; These functions provide minibuffer reading/completion for lists of
@@ -315,11 +277,12 @@
 	(princ "Buffer specific configuration items:\n")
 	(let ((vars '(major-mode
 		      semantic-case-fold
-		      semantic-expand-nonterminal
+		      semantic-tag-expand-function
 		      semantic-parser-name
 		      semantic-parse-tree-state
 		      semantic-lex-analyzer
 		      semantic-lex-reset-hooks
+		      semantic-lex-syntax-modifications
 		      )))
 	  (dolist (V vars)
 	    (semantic-describe-buffer-var-helper V buff)))
@@ -334,7 +297,8 @@
 		      semantic-after-toplevel-cache-change-hook
 		      semantic-before-toplevel-cache-flush-hook
 		      semantic-dump-parse
-
+		      semantic-type-relation-separator-character
+		      semantic-command-separation-character
 		      )))
 	  (dolist (V vars)
 	    (semantic-describe-buffer-var-helper V buff)))
@@ -344,34 +308,6 @@
 	)))
   )
 
-(defun semantic-current-tag-interactive (p)
-  "Display the current token.
-Argument P is the point to search from in the current buffer."
-  (interactive "d")
-  (require 'semantic/find)
-  (let ((tok (semantic-brute-find-innermost-tag-by-position
-	      p (current-buffer))))
-    (message (mapconcat 'semantic-abbreviate-nonterminal tok ","))
-    (car tok))
-  )
-
-(defun semantic-hack-search ()
-  "Display info about something under the cursor using generic methods."
-  (interactive)
-  (require 'semantic/find)
-  (let ((strm (cdr (semantic-fetch-tags)))
-	(res nil))
-    (setq res (semantic-brute-find-tag-by-position (point) strm))
-    (if res
-	(progn
-	  (pop-to-buffer "*SEMANTIC HACK RESULTS*")
-	  (require 'pp)
-	  (erase-buffer)
-	  (insert (pp-to-string res) "\n")
-	  (goto-char (point-min))
-	  (shrink-window-if-larger-than-buffer))
-      (message "nil"))))
-
 (defun semantic-assert-valid-token (tok)
   "Assert that TOK is a valid token."
   (if (semantic-tag-p tok)
@@ -415,7 +351,8 @@
 			      'unmatched)))
 	    (setq o (cons (car over) o)))
 	  (setq over (cdr over)))
-	(message "Remaining overlays: %S" o)))
+	(when (called-interactively-p 'any)
+	  (message "Remaining overlays: %S" o))))
   over)
 
 ;;; Interactive commands (from Senator).
--- a/lisp/cedet/semantic/wisent/python-wy.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/semantic/wisent/python-wy.el	Thu Sep 23 15:00:31 2010 -0400
@@ -35,6 +35,7 @@
 (defconst wisent-python-wy--keyword-table
   (semantic-lex-make-keyword-table
    '(("and" . AND)
+     ("as" . AS)
      ("assert" . ASSERT)
      ("break" . BREAK)
      ("class" . CLASS)
@@ -72,6 +73,7 @@
      ("pass" summary "Statement that does nothing")
      ("or" summary "Binary logical 'or' operator")
      ("not" summary "Unary boolean negation operator")
+     ("lambda" summary "Create anonymous function")
      ("is" summary "Binary operator that tests for object equality")
      ("in" summary "Part of 'for' statement ")
      ("import" summary "Load specified modules")
@@ -86,10 +88,11 @@
      ("elif" summary "Shorthand for 'else if' following an 'if' statement")
      ("del" summary "Delete specified objects, i.e., undo what assignment did")
      ("def" summary "Define a new function")
-     ("continue" summary "Skip to the next interation of enclosing 'for' or 'while' loop")
+     ("continue" summary "Skip to the next iteration of enclosing 'for' or 'while' loop")
      ("class" summary "Define a new class")
      ("break" summary "Terminate 'for' or 'while' loop")
      ("assert" summary "Raise AssertionError exception if <expr> is false")
+     ("as" summary "EXPR as NAME makes value of EXPR available as variable NAME")
      ("and" summary "Logical AND binary operator ... ")))
   "Table of language keywords.")
 
@@ -172,7 +175,7 @@
     (eval-when-compile
       (require 'semantic/wisent/comp))
     (wisent-compile-grammar
-     '((BACKSLASH NEWLINE INDENT DEDENT INDENT_BLOCK PAREN_BLOCK BRACE_BLOCK BRACK_BLOCK LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK LTLTEQ GTGTEQ EXPEQ DIVDIVEQ DIVDIV LTLT GTGT EXPONENT EQ GE LE PLUSEQ MINUSEQ MULTEQ DIVEQ MODEQ AMPEQ OREQ HATEQ LTGT NE HAT LT GT AMP MULT DIV MOD PLUS MINUS PERIOD TILDE BAR COLON SEMICOLON COMMA ASSIGN BACKQUOTE STRING_LITERAL NUMBER_LITERAL NAME AND ASSERT BREAK CLASS CONTINUE DEF DEL ELIF ELSE EXCEPT EXEC FINALLY FOR FROM GLOBAL IF IMPORT IN IS LAMBDA NOT OR PASS PRINT RAISE RETURN TRY WHILE YIELD)
+     '((BACKSLASH NEWLINE INDENT DEDENT INDENT_BLOCK PAREN_BLOCK BRACE_BLOCK BRACK_BLOCK LPAREN RPAREN LBRACE RBRACE LBRACK RBRACK LTLTEQ GTGTEQ EXPEQ DIVDIVEQ DIVDIV LTLT GTGT EXPONENT EQ GE LE PLUSEQ MINUSEQ MULTEQ DIVEQ MODEQ AMPEQ OREQ HATEQ LTGT NE HAT LT GT AMP MULT DIV MOD PLUS MINUS PERIOD TILDE BAR COLON SEMICOLON COMMA ASSIGN BACKQUOTE STRING_LITERAL NUMBER_LITERAL NAME AND AS ASSERT BREAK CLASS CONTINUE DEF DEL ELIF ELSE EXCEPT EXEC FINALLY FOR FROM GLOBAL IF IMPORT IN IS LAMBDA NOT OR PASS PRINT RAISE RETURN TRY WHILE YIELD)
        nil
        (goal
 	((NEWLINE))
@@ -280,6 +283,9 @@
 	((testlist)
 	 nil))
        (yield_stmt
+	((YIELD)
+	 (wisent-raw-tag
+	  (semantic-tag-new-code $1 nil)))
 	((YIELD testlist)
 	 (wisent-raw-tag
 	  (semantic-tag-new-code $1 nil))))
@@ -320,14 +326,14 @@
 	((import_as_name_list COMMA import_as_name)
 	 nil))
        (import_as_name
-	((NAME name_name_opt)
+	((NAME as_name_opt)
 	 nil))
        (dotted_as_name
-	((dotted_name name_name_opt)))
-       (name_name_opt
+	((dotted_name as_name_opt)))
+       (as_name_opt
 	(nil)
-	((NAME NAME)
-	 nil))
+	((AS NAME)
+	 (identity $2)))
        (dotted_name
 	((NAME))
 	((dotted_name PERIOD NAME)
--- a/lisp/cedet/srecode.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode.el	Thu Sep 23 15:00:31 2010 -0400
@@ -41,7 +41,7 @@
 (require 'mode-local)
 (load "srecode/loaddefs" nil 'nomessage)
 
-(defvar srecode-version "1.0pre7"
+(defvar srecode-version "1.0"
   "Current version of the Semantic Recoder.")
 
 ;;; Code:
--- a/lisp/cedet/srecode/compile.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/compile.el	Thu Sep 23 15:00:31 2010 -0400
@@ -35,19 +35,17 @@
 (require 'semantic)
 (require 'eieio)
 (require 'eieio-base)
-(require 'srecode)
 (require 'srecode/table)
+(require 'srecode/dictionary)
 
 (declare-function srecode-template-inserter-newline-child-p "srecode/insert"
 		  t t)
-(declare-function srecode-create-section-dictionary "srecode/dictionary")
-(declare-function srecode-dictionary-compound-variable "srecode/dictionary")
 
 ;;; Code:
 
 ;;; Template Class
 ;;
-;; Templatets describe a patter of text that can be inserted into a
+;; Templates describe a pattern of text that can be inserted into a
 ;; buffer.
 ;;
 (defclass srecode-template (eieio-named)
@@ -213,6 +211,7 @@
 	(mode nil)
 	(application nil)
 	(priority nil)
+	(project nil)
 	(vars nil)
 	)
 
@@ -256,6 +255,8 @@
 		     (setq application (read firstvalue)))
 		    ((string= name "priority")
 		     (setq priority (read firstvalue)))
+		    ((string= name "project")
+		     (setq project firstvalue))
 		    (t
 		     ;; Assign this into some table of variables.
 		     (setq vars (cons (cons name firstvalue) vars))
@@ -297,12 +298,19 @@
     ;; Calculate priority
     ;;
     (if (not priority)
-	(let ((d (file-name-directory (buffer-file-name)))
-	      (sd (file-name-directory (locate-library "srecode")))
-	      (defaultdelta (if (eq mode 'default) 20 0)))
-	  (if (string= d sd)
-	      (setq priority (+ 80 defaultdelta))
-	    (setq priority (+ 30 defaultdelta)))
+	(let ((d (expand-file-name (file-name-directory (buffer-file-name))))
+	      (sd (expand-file-name (file-name-directory (locate-library "srecode"))))
+	      (defaultdelta (if (eq mode 'default) 0 10)))
+	  ;; @TODO :   WHEN INTEGRATING INTO EMACS
+	  ;;   The location of Emacs default templates needs to be specified
+	  ;;   here to also have a lower priority.
+	  (if (string-match (concat "^" sd) d)
+	      (setq priority (+ 30 defaultdelta))
+	    ;; If the user created template is for a project, then
+	    ;; don't add as much as if it is unique to just some user.
+	    (if (stringp project)
+		(setq priority (+ 50 defaultdelta))
+	      (setq priority (+ 80 defaultdelta))))
 	  (message "Templates %s has estimated priority of %d"
 		   (file-name-nondirectory (buffer-file-name))
 		   priority))
@@ -311,56 +319,56 @@
 	       priority))
 
     ;; Save it up!
-    (srecode-compile-template-table table mode priority application vars)
+    (srecode-compile-template-table table mode priority application project vars)
     )
 )
 
-(defun srecode-compile-one-template-tag (tag STATE)
-  "Compile a template tag TAG into an srecode template class.
-STATE is the current compile state as an object `srecode-compile-state'."
-  (require 'srecode/dictionary)
-  (let* ((context (oref STATE context))
-	 (codeout  (srecode-compile-split-code
-		    tag (semantic-tag-get-attribute tag :code)
-		    STATE))
-	 (code (cdr codeout))
-	 (args (semantic-tag-function-arguments tag))
-	 (binding (semantic-tag-get-attribute tag :binding))
-	 (rawdicts (semantic-tag-get-attribute tag :dictionaries))
-	 (sdicts (srecode-create-section-dictionary rawdicts STATE))
-	 (addargs nil)
-	 )
-;    (message "Compiled %s to %d codes with %d args and %d prompts."
-;	     (semantic-tag-name tag)
-;	     (length code)
-;	     (length args)
-;	     (length prompts))
-    (while args
-      (setq addargs (cons (intern (car args)) addargs))
-      (when (eq (car addargs) :blank)
-	;; If we have a wrap, then put wrap inserters on both
-	;; ends of the code.
-	(setq code (append
-		    (list (srecode-compile-inserter "BLANK"
-						    "\r"
-						    STATE
-						    :secondname nil
-						    :where 'begin))
-		    code
-		    (list (srecode-compile-inserter "BLANK"
-						    "\r"
-						    STATE
-						    :secondname nil
-						    :where 'end))
-			  )))
-      (setq args (cdr args)))
+(defun srecode-compile-one-template-tag (tag state)
+  "Compile a template tag TAG into a srecode template object.
+STATE is the current compile state as an object of class
+`srecode-compile-state'."
+  (let* ((context   (oref state context))
+	 (code      (cdr (srecode-compile-split-code
+			  tag (semantic-tag-get-attribute tag :code)
+			  state)))
+	 (args      (semantic-tag-function-arguments tag))
+	 (binding   (semantic-tag-get-attribute tag :binding))
+	 (dict-tags (semantic-tag-get-attribute tag :dictionaries))
+	 (root-dict (when dict-tags
+		      (srecode-create-dictionaries-from-tags
+		       dict-tags state)))
+	 (addargs))
+    ;; Examine arguments.
+    (dolist (arg args)
+      (let ((symbol (intern arg)))
+	(push symbol addargs)
+
+	;; If we have a wrap, then put wrap inserters on both ends of
+	;; the code.
+	(when (eq symbol :blank)
+	  (setq code (append
+		      (list (srecode-compile-inserter
+			     "BLANK"
+			     "\r"
+			     state
+			     :secondname nil
+			     :where 'begin))
+		      code
+		      (list (srecode-compile-inserter
+			     "BLANK"
+			     "\r"
+			     state
+			     :secondname nil
+			     :where 'end)))))))
+
+    ;; Construct and return the template object.
     (srecode-template (semantic-tag-name tag)
-		      :context context
-		      :args (nreverse addargs)
-		      :dictionary sdicts
-		      :binding binding
-		      :code code)
-    ))
+		      :context    context
+		      :args       (nreverse addargs)
+		      :dictionary root-dict
+		      :binding    binding
+		      :code       code))
+  )
 
 (defun srecode-compile-do-hard-newline-p (comp)
   "Examine COMP to decide if the upcoming newline should be hard.
@@ -514,12 +522,13 @@
       (if (not new) (error "SRECODE: Unknown macro code %S" key))
       new)))
 
-(defun srecode-compile-template-table (templates mode priority application vars)
+(defun srecode-compile-template-table (templates mode priority application project vars)
   "Compile a list of TEMPLATES into an semantic recode table.
 The table being compiled is for MODE, or the string \"default\".
 PRIORITY is a numerical value that indicates this tables location
 in an ordered search.
 APPLICATION is the name of the application these templates belong to.
+PROJECT is a directory name which these templates scope to.
 A list of defined variables VARS provides a variable table."
   (let ((namehash (make-hash-table :test 'equal
 				   :size (length templates)))
@@ -549,6 +558,9 @@
 
 	(setq lp (cdr lp))))
 
+    (when (stringp project)
+      (setq project (expand-file-name project)))
+
     (let* ((table (srecode-mode-table-new mode (buffer-file-name)
 		   :templates (nreverse templates)
 		   :namehash namehash
@@ -556,7 +568,8 @@
 		   :variables vars
 		   :major-mode mode
 		   :priority priority
-		   :application application))
+		   :application application
+		   :project project))
 	   (tmpl (oref table templates)))
       ;; Loop over all the templates, and xref.
       (while tmpl
--- a/lisp/cedet/srecode/cpp.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/cpp.el	Thu Sep 23 15:00:31 2010 -0400
@@ -26,6 +26,27 @@
 
 ;;; Code:
 
+(require 'srecode)
+(require 'srecode/dictionary)
+(require 'srecode/semantic)
+(require 'semantic/tag)
+
+;;; Customization
+;;
+
+(defgroup srecode-cpp nil
+  "C++-specific Semantic Recoder settings."
+  :group 'srecode)
+
+(defcustom srecode-cpp-namespaces
+  '("std" "boost")
+  "List expansion candidates for the :using-namespaces argument.
+A dictionary entry of the named PREFIX_NAMESPACE with the value
+NAMESPACE:: is created for each namespace unless the current
+buffer contains a using NAMESPACE; statement "
+  :group 'srecode-cpp
+  :type  '(repeat string))
+
 ;;; :cpp ARGUMENT HANDLING
 ;;
 ;; When a :cpp argument is required, fill the dictionary with
@@ -33,10 +54,6 @@
 ;;
 ;; Error if not in a C++ mode.
 
-(require 'srecode)
-(require 'srecode/dictionary)
-(require 'srecode/semantic)
-
 ;;;###autoload
 (defun srecode-semantic-handle-:cpp (dict)
   "Add macros into the dictionary DICT based on the current c++ file.
@@ -59,6 +76,23 @@
     )
   )
 
+(defun srecode-semantic-handle-:using-namespaces (dict)
+  "Add macros into the dictionary DICT based on used namespaces.
+Adds the following:
+PREFIX_NAMESPACE - for each NAMESPACE in `srecode-cpp-namespaces'."
+  (let ((tags (semantic-find-tags-by-class
+	       'using (semantic-fetch-tags))))
+    (dolist (name srecode-cpp-namespaces)
+      (let ((variable (format "PREFIX_%s" (upcase name)))
+	    (prefix   (format "%s::"      name)))
+	(srecode-dictionary-set-value dict variable prefix)
+	(dolist (tag tags)
+	  (when (and (eq (semantic-tag-get-attribute tag :kind)
+			 'namespace)
+		     (string= (semantic-tag-name tag) name))
+	    (srecode-dictionary-set-value dict variable ""))))))
+  )
+
 (define-mode-local-override srecode-semantic-apply-tag-to-dict
   c++-mode (tag-wrapper dict)
   "Apply C++ specific features from TAG-WRAPPER into DICT.
@@ -97,6 +131,7 @@
 	 (srecode-semantic-tag (semantic-tag-name value-tag)
 			       :prime value-tag)
 	 value-dict))
+
       ;; Discriminate using statements referring to namespaces and
       ;; types.
       (when (eq (semantic-tag-get-attribute tag :kind) 'namespace)
@@ -111,7 +146,8 @@
       ;; when they make sense. My best bet would be
       ;; (semantic-tag-function-parent tag), but it is not there, when
       ;; the function is defined in the scope of a class.
-      (let ((member    't)
+      (let ((member t)
+	    (templates (semantic-tag-get-attribute tag :template))
 	    (modifiers (semantic-tag-modifiers tag)))
 
 	;; Add modifiers into the dictionary
@@ -120,6 +156,9 @@
 				dict "MODIFIERS")))
 	    (srecode-dictionary-set-value modifier-dict "NAME" modifier)))
 
+	;; Add templates into child dictionaries.
+	(srecode-cpp-apply-templates dict templates)
+
 	;; When the function is a member function, it can have
 	;; additional modifiers.
 	(when member
@@ -133,11 +172,40 @@
 	  ;; entry.
 	  (when (semantic-tag-get-attribute tag :pure-virtual-flag)
 	    (srecode-dictionary-show-section dict "PURE"))
-	  )
-	))
+	  )))
+
+     ;;
+     ;; CLASS
+     ;;
+     ((eq class 'type)
+      ;; For classes, add template parameters.
+      (when (or (semantic-tag-of-type-p tag "class")
+		(semantic-tag-of-type-p tag "struct"))
+
+	;; Add templates into child dictionaries.
+	(let ((templates (semantic-tag-get-attribute tag :template)))
+	  (srecode-cpp-apply-templates dict templates))))
      ))
   )
 
+
+;;; Helper functions
+;;
+
+(defun srecode-cpp-apply-templates (dict templates)
+  "Add section dictionaries for TEMPLATES to DICT."
+  (when templates
+    (let ((templates-dict (srecode-dictionary-add-section-dictionary
+			   dict "TEMPLATES")))
+      (dolist (template templates)
+	(let ((template-dict (srecode-dictionary-add-section-dictionary
+			      templates-dict "ARGS")))
+	  (srecode-semantic-apply-tag-to-dict
+	   (srecode-semantic-tag (semantic-tag-name template)
+				 :prime template)
+	   template-dict)))))
+  )
+
 (provide 'srecode/cpp)
 
 ;; Local variables:
--- a/lisp/cedet/srecode/dictionary.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/dictionary.el	Thu Sep 23 15:00:31 2010 -0400
@@ -37,6 +37,7 @@
 (declare-function srecode-compile-parse-inserter "srecode/compile")
 (declare-function srecode-dump-code-list "srecode/compile")
 (declare-function srecode-load-tables-for-mode "srecode/find")
+(declare-function srecode-template-table-in-project-p "srecode/find")
 (declare-function srecode-insert-code-stream "srecode/insert")
 (declare-function data-debug-new-buffer "data-debug")
 (declare-function data-debug-insert-object-slots "eieio-datadebug")
@@ -157,40 +158,49 @@
 If BUFFER-OR-PARENT is t, then this dictionary should not be
 associated with a buffer or parent."
   (save-excursion
+    ;; Handle the parent
     (let ((parent nil)
 	  (buffer nil)
 	  (origin nil)
 	  (initfrombuff nil))
-      (cond ((bufferp buffer-or-parent)
-	     (set-buffer buffer-or-parent)
-	     (setq buffer buffer-or-parent
-		   origin (buffer-name buffer-or-parent)
-		   initfrombuff t))
-	    ((srecode-dictionary-child-p buffer-or-parent)
-	     (setq parent buffer-or-parent
-		   buffer (oref buffer-or-parent buffer)
-		   origin (concat (object-name buffer-or-parent) " in "
-				  (if buffer (buffer-name buffer)
-				    "no buffer")))
-	     (when buffer
-	       (set-buffer buffer)))
-	    ((eq buffer-or-parent t)
-	     (setq buffer nil
-		   origin "Unspecified Origin"))
-	    (t
-	     (setq buffer (current-buffer)
-		   origin (concat "Unspecified.  Assume "
-				  (buffer-name buffer))
-		   initfrombuff t)
-	     )
-	    )
+      (cond
+       ;; Parent is a buffer
+       ((bufferp buffer-or-parent)
+	(set-buffer buffer-or-parent)
+	(setq buffer buffer-or-parent
+	      origin (buffer-name buffer-or-parent)
+	      initfrombuff t))
+
+       ;; Parent is another dictionary
+       ((srecode-dictionary-child-p buffer-or-parent)
+	(setq parent buffer-or-parent
+	      buffer (oref buffer-or-parent buffer)
+	      origin (concat (object-name buffer-or-parent) " in "
+			     (if buffer (buffer-name buffer)
+			       "no buffer")))
+	(when buffer
+	  (set-buffer buffer)))
+
+       ;; No parent
+       ((eq buffer-or-parent t)
+	(setq buffer nil
+	      origin "Unspecified Origin"))
+
+       ;; Default to unspecified parent
+       (t
+	(setq buffer (current-buffer)
+	      origin (concat "Unspecified.  Assume "
+			     (buffer-name buffer))
+	      initfrombuff t)))
+
+      ;; Create the new dictionary object.
       (let ((dict (srecode-dictionary
 		   major-mode
-		   :buffer buffer
-		   :parent parent
-		   :namehash  (make-hash-table :test 'equal
-					       :size 20)
-		   :origin origin)))
+		   :buffer   buffer
+		   :parent   parent
+		   :namehash (make-hash-table :test 'equal
+					      :size 20)
+		   :origin   origin)))
 	;; Only set up the default variables if we are being built
 	;; directroy for a particular buffer.
 	(when initfrombuff
@@ -211,34 +221,37 @@
 TPL is an object representing a compiled template file."
   (when tpl
     (let ((tabs (oref tpl :tables)))
+      (require 'srecode/find) ; For srecode-template-table-in-project-p
       (while tabs
-	(let ((vars (oref (car tabs) variables)))
-	  (while vars
-	    (srecode-dictionary-set-value
-	     dict (car (car vars)) (cdr (car vars)))
-	    (setq vars (cdr vars))))
-	(setq tabs (cdr tabs))))))
+	(when (srecode-template-table-in-project-p (car tabs))
+	  (let ((vars (oref (car tabs) variables)))
+	    (while vars
+	      (srecode-dictionary-set-value
+	       dict (car (car vars)) (cdr (car vars)))
+	      (setq vars (cdr vars)))))
+  	(setq tabs (cdr tabs))))))
 
 
 (defmethod srecode-dictionary-set-value ((dict srecode-dictionary)
 					 name value)
   "In dictionary DICT, set NAME to have VALUE."
   ;; Validate inputs
-  (if (not (stringp name))
-      (signal 'wrong-type-argument (list name 'stringp)))
+  (unless (stringp name)
+    (signal 'wrong-type-argument (list name 'stringp)))
+
   ;; Add the value.
   (with-slots (namehash) dict
     (puthash name value namehash))
   )
 
 (defmethod srecode-dictionary-add-section-dictionary ((dict srecode-dictionary)
-						      name &optional show-only)
+						      name &optional show-only force)
   "In dictionary DICT, add a section dictionary for section macro NAME.
 Return the new dictionary.
 
-You can add several dictionaries to the same section macro.
-For each dictionary added to a macro, the block of codes in the
-template will be repeated.
+You can add several dictionaries to the same section entry.
+For each dictionary added to a variable, the block of codes in
+the template will be repeated.
 
 If optional argument SHOW-ONLY is non-nil, then don't add a new dictionary
 if there is already one in place.  Also, don't add FIRST/LAST entries.
@@ -255,10 +268,11 @@
 Adding a new dictionary will alter these values in previously
 inserted dictionaries."
   ;; Validate inputs
-  (if (not (stringp name))
-      (signal 'wrong-type-argument (list name 'stringp)))
+  (unless (stringp name)
+    (signal 'wrong-type-argument (list name 'stringp)))
+
   (let ((new (srecode-create-dictionary dict))
-	(ov (srecode-dictionary-lookup-name dict name)))
+	(ov  (srecode-dictionary-lookup-name dict name t)))
 
     (when (not show-only)
       ;; Setup the FIRST/NOTFIRST and LAST/NOTLAST entries.
@@ -275,7 +289,9 @@
 	(srecode-dictionary-show-section new "LAST"))
       )
 
-    (when (or (not show-only) (null ov))
+    (when (or force
+	      (not show-only)
+	      (null ov))
       (srecode-dictionary-set-value dict name (append ov (list new))))
     ;; Return the new sub-dictionary.
     new))
@@ -283,8 +299,9 @@
 (defmethod srecode-dictionary-show-section ((dict srecode-dictionary) name)
   "In dictionary DICT, indicate that the section NAME should be exposed."
   ;; Validate inputs
-  (if (not (stringp name))
-      (signal 'wrong-type-argument (list name 'stringp)))
+  (unless (stringp name)
+    (signal 'wrong-type-argument (list name 'stringp)))
+
   ;; Showing a section is just like making a section dictionary, but
   ;; with no dictionary values to add.
   (srecode-dictionary-add-section-dictionary dict name t)
@@ -294,51 +311,120 @@
   "In dictionary DICT, indicate that the section NAME should be hidden."
   ;; We need to find the has value, and then delete it.
   ;; Validate inputs
-  (if (not (stringp name))
-      (signal 'wrong-type-argument (list name 'stringp)))
+  (unless (stringp name)
+    (signal 'wrong-type-argument (list name 'stringp)))
+
   ;; Add the value.
   (with-slots (namehash) dict
     (remhash name namehash))
   nil)
 
-(defmethod srecode-dictionary-merge ((dict srecode-dictionary) otherdict)
-  "Merge into DICT the dictionary entries from OTHERDICT."
+(defmethod srecode-dictionary-add-entries ((dict srecode-dictionary)
+					   entries &optional state)
+  "Add ENTRIES to DICT.
+
+ENTRIES is a list of even length of dictionary entries to
+add. ENTRIES looks like this:
+
+  (NAME_1 VALUE_1 NAME_2 VALUE_2 ...)
+
+The following rules apply:
+ * NAME_N is a string
+and for values
+ * If VALUE_N is t, the section NAME_N is shown.
+ * If VALUE_N is a string, an ordinary value is inserted.
+ * If VALUE_N is a dictionary, it is inserted as entry NAME_N.
+ * Otherwise, a compound variable is created for VALUE_N.
+
+The optional argument STATE has to non-nil when compound values
+are inserted. An error is signaled if ENTRIES contains compound
+values but STATE is nil."
+  (while entries
+    (let ((name  (nth 0 entries))
+	  (value (nth 1 entries)))
+      (cond
+       ;; Value is t; show a section.
+       ((eq value t)
+	(srecode-dictionary-show-section dict name))
+
+       ;; Value is a simple string; create an ordinary dictionary
+       ;; entry
+       ((stringp value)
+	(srecode-dictionary-set-value dict name value))
+
+       ;; Value is a dictionary; insert as child dictionary.
+       ((srecode-dictionary-child-p value)
+	(srecode-dictionary-merge
+	 (srecode-dictionary-add-section-dictionary dict name)
+	 value t))
+
+       ;; Value is some other object; create a compound value.
+       (t
+	(unless state
+	  (error "Cannot insert compound values without state."))
+
+	(srecode-dictionary-set-value
+	 dict name
+	 (srecode-dictionary-compound-variable
+	  name :value value :state state)))))
+    (setq entries (nthcdr 2 entries)))
+  dict)
+
+(defmethod srecode-dictionary-merge ((dict srecode-dictionary) otherdict
+				     &optional force)
+  "Merge into DICT the dictionary entries from OTHERDICT.
+Unless the optional argument FORCE is non-nil, values in DICT are
+not modified, even if there are values of the same names in
+OTHERDICT."
   (when otherdict
     (maphash
      (lambda (key entry)
-       ;; Only merge in the new values if there was no old value.
+       ;; The new values is only merged in if there was no old value
+       ;; or FORCE is non-nil.
+       ;;
        ;; This protects applications from being whacked, and basically
        ;; makes these new section dictionary entries act like
        ;; "defaults" instead of overrides.
-       (when (not (srecode-dictionary-lookup-name dict key))
-	 (cond ((and (listp entry) (srecode-dictionary-p (car entry)))
-		;; A list of section dictionaries.
-		;; We need to merge them in.
-		(while entry
-		  (let ((new-sub-dict
-			 (srecode-dictionary-add-section-dictionary
-			  dict key)))
-		    (srecode-dictionary-merge new-sub-dict (car entry)))
-		  (setq entry (cdr entry)))
-		  )
+       (when (or force
+		 (not (srecode-dictionary-lookup-name dict key t)))
+	 (cond
+	  ;; A list of section dictionaries. We need to merge them in.
+	  ((and (listp entry)
+		(srecode-dictionary-p (car entry)))
+	   (dolist (sub-dict entry)
+	     (srecode-dictionary-merge
+	      (srecode-dictionary-add-section-dictionary
+	       dict key t t)
+	      sub-dict force)))
 
-	       (t
-		(srecode-dictionary-set-value dict key entry)))
-	       ))
+	  ;; Other values can be set directly.
+	  (t
+	   (srecode-dictionary-set-value dict key entry)))))
      (oref otherdict namehash))))
 
 (defmethod srecode-dictionary-lookup-name ((dict srecode-dictionary)
-					   name)
-  "Return information about the current DICT's value for NAME."
+					   name &optional non-recursive)
+  "Return information about DICT's value for NAME.
+DICT is a dictionary, and NAME is a string that is treated as the
+name of an entry in the dictionary. If such an entry exists, its
+value is returned. Otherwise, nil is returned. Normally, the
+lookup is recursive in the sense that the parent of DICT is
+searched for NAME if it is not found in DICT.  This recursive
+lookup can be disabled by the optional argument NON-RECURSIVE.
+
+This function derives values for some special NAMEs, such as
+'FIRST' and 'LAST'."
   (if (not (slot-boundp dict 'namehash))
       nil
-    ;; Get the value of this name from the dictionary
-    (or (with-slots (namehash) dict
-	  (gethash name namehash))
-	(and (not (member name '("FIRST" "LAST" "NOTFIRST" "NOTLAST")))
-	     (oref dict parent)
-	     (srecode-dictionary-lookup-name (oref dict parent) name))
-	)))
+    ;; Get the value of this name from the dictionary or its parent
+    ;; unless the lookup should be non-recursive.
+    (with-slots (namehash parent) dict
+      (or (gethash name namehash)
+	  (and (not non-recursive)
+	       (not (member name '("FIRST" "LAST" "NOTFIRST" "NOTLAST")))
+	       parent
+	       (srecode-dictionary-lookup-name parent name)))))
+  )
 
 (defmethod srecode-root-dictionary ((dict srecode-dictionary))
   "For dictionary DICT, return the root dictionary.
@@ -431,10 +517,22 @@
 	   (start (point))
 	   (name (oref sti :object-name)))
 
-      (if (or (not dv) (string= dv ""))
-	  (insert name)
-	(insert dv))
+      (cond
+       ;; No default value.
+       ((not dv) (insert name))
+       ;; A compound value as the default?  Recurse.
+       ((srecode-dictionary-compound-value-child-p dv)
+	(srecode-compound-toString dv function dictionary))
+       ;; A string that is empty?  Use the name.
+       ((and (stringp dv) (string= dv ""))
+	(insert name))
+       ;; Insert strings
+       ((stringp dv) (insert dv))
+       ;; Some other issue
+       (t
+	(error "Unknown default value for value %S" name)))
 
+      ;; Create a field from the inserter.
       (srecode-field name :name name
 		     :start start
 		     :end (point)
@@ -482,6 +580,53 @@
 	(setq sectiondicts (cdr sectiondicts)))
       new)))
 
+(defun srecode-create-dictionaries-from-tags (tags state)
+  "Create a dictionary with entries according to TAGS.
+
+TAGS should be in the format produced by the template file
+grammar. That is
+
+TAGS = (ENTRY_1 ENTRY_2 ...)
+
+where
+
+ENTRY_N = (NAME ENTRY_N_1 ENTRY_N_2 ...) | TAG
+
+where TAG is a semantic tag of class 'variable. The (NAME ... )
+form creates a child dictionary which is stored under the name
+NAME. The TAG form creates a value entry or section dictionary
+entry whose name is the name of the tag.
+
+STATE is the current compiler state."
+  (let ((dict    (srecode-create-dictionary t))
+	(entries (apply #'append
+			(mapcar
+			 (lambda (entry)
+			   (cond
+			    ;; Entry is a tag
+			    ((semantic-tag-p entry)
+			     (let ((name  (semantic-tag-name entry))
+				   (value (semantic-tag-variable-default entry)))
+			       (list name
+				     (if (and (listp value)
+					      (= (length value) 1)
+					      (stringp (car value)))
+					 (car value)
+				       value))))
+
+			    ;; Entry is a nested dictionary
+			    (t
+			     (let ((name    (car entry))
+				   (entries (cdr entry)))
+			       (list name
+				     (srecode-create-dictionaries-from-tags
+				      entries state))))))
+			 tags))))
+    (srecode-dictionary-add-entries
+     dict entries state)
+    dict)
+  )
+
 ;;; DUMP DICTIONARY
 ;;
 ;; Make a dictionary, and dump it's contents.
--- a/lisp/cedet/srecode/fields.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/fields.el	Thu Sep 23 15:00:31 2010 -0400
@@ -35,6 +35,8 @@
 ;; Each field has 2 overlays.  The second overlay allows control in
 ;; the character just after the field, but does not highlight it.
 
+;; @TODO - Cancel an old field array if a new one is about to be created!
+
 ;; Keep this library independent of SRecode proper.
 (require 'eieio)
 
@@ -43,6 +45,10 @@
   "While inserting a set of fields, collect in this variable.
 Once an insertion set is done, these fields will be activated.")
 
+
+;;; Customization
+;;
+
 (defface srecode-field-face
   '((((class color) (background dark))
      (:underline "green"))
@@ -51,6 +57,11 @@
   "*Face used to specify editable fields from a template."
   :group 'semantic-faces)
 
+(defcustom srecode-fields-exit-confirmation nil
+  "Ask for confirmation before leaving field editing mode."
+  :group 'srecode
+  :type  'boolean)
+
 ;;; BASECLASS
 ;;
 ;; Fields and the template region share some basic overlay features.
@@ -237,7 +248,7 @@
 	(remove-hook 'post-command-hook 'srecode-field-post-command t)
       (if (srecode-point-in-region-p ar)
 	  nil ;; Keep going
-	;; We moved out of the temlate.  Cancel the edits.
+	;; We moved out of the template.  Cancel the edits.
 	(srecode-delete ar)))
     ))
 
@@ -429,7 +440,8 @@
 (defun srecode-field-exit-ask ()
   "Ask if the user wants to exit field-editing mini-mode."
   (interactive)
-  (when (y-or-n-p "Exit field-editing mode? ")
+  (when (or (not srecode-fields-exit-confirmation)
+	    (y-or-n-p "Exit field-editing mode? "))
     (srecode-delete (srecode-active-template-region))))
 
 
--- a/lisp/cedet/srecode/find.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/find.el	Thu Sep 23 15:00:31 2010 -0400
@@ -92,6 +92,23 @@
 	))
     ))
 
+;;; PROJECT
+;;
+;; Find if a template table has a project set, and if so, is the
+;; current buffer in that project.
+(defmethod srecode-template-table-in-project-p ((tab srecode-template-table))
+  "Return non-nil if the table TAB can be used in the current project.
+If TAB has a :project set, check that the directories match.
+If TAB is nil, then always return t."
+  (let ((proj (oref tab :project)))
+    ;; Return t if the project wasn't set.
+    (if (not proj) t
+      ;; If the project directory was set, lets check it.
+      (let ((dd (expand-file-name default-directory))
+	    (projexp (regexp-quote (directory-file-name proj))))
+	(if (string-match (concat "^" projexp) dd)
+	    t nil)))))
+
 ;;; SEARCH
 ;;
 ;; Find a given template based on name, and features of the current
@@ -103,13 +120,14 @@
 Optional argument CONTEXT specifies that the template should part
 of a particular context.
 The APPLICATION argument is unused."
-  (if context
-      ;; If a context is specified, then look it up there.
-      (let ((ctxth (gethash context (oref tab contexthash))))
-	(when ctxth
-	  (gethash template-name ctxth)))
-    ;; No context, perhaps a merged name?
-    (gethash template-name (oref tab namehash))))
+  (when (srecode-template-table-in-project-p tab)
+    (if context
+	;; If a context is specified, then look it up there.
+	(let ((ctxth (gethash context (oref tab contexthash))))
+	  (when ctxth
+	    (gethash template-name ctxth)))
+      ;; No context, perhaps a merged name?
+      (gethash template-name (oref tab namehash)))))
 
 (defmethod srecode-template-get-table ((tab srecode-mode-table)
 				       template-name &optional
@@ -144,32 +162,33 @@
   "Find in the template name in table TAB, the template with BINDING.
 Optional argument CONTEXT specifies that the template should part
 of a particular context."
-  (let* ((keyout nil)
-	 (hashfcn (lambda (key value)
-		    (when (and (slot-boundp value 'binding)
-			       (oref value binding)
-			       (= (aref (oref value binding) 0) binding))
-		      (setq keyout key))))
-	 (contextstr (cond ((listp context)
-			    (car-safe context))
-			   ((stringp context)
-			    context)
-			   (t nil)))
-	 )
-    (if context
-	(let ((ctxth (gethash contextstr (oref tab contexthash))))
-	  (when ctxth
-	    ;; If a context is specified, then look it up there.
-	    (maphash hashfcn ctxth)
-	    ;; Context hashes EXCLUDE the context prefix which
-	    ;; we need to include, so concat it here
-	    (when keyout
-	      (setq keyout (concat contextstr ":" keyout)))
-	    )))
-    (when (not keyout)
-      ;; No context, or binding in context.  Try full hash.
-      (maphash hashfcn (oref tab namehash)))
-    keyout))
+  (when (srecode-template-table-in-project-p tab)
+    (let* ((keyout nil)
+	   (hashfcn (lambda (key value)
+		      (when (and (slot-boundp value 'binding)
+				 (oref value binding)
+				 (= (aref (oref value binding) 0) binding))
+			(setq keyout key))))
+	   (contextstr (cond ((listp context)
+			      (car-safe context))
+			     ((stringp context)
+			      context)
+			     (t nil)))
+	   )
+      (if context
+	  (let ((ctxth (gethash contextstr (oref tab contexthash))))
+	    (when ctxth
+	      ;; If a context is specified, then look it up there.
+	      (maphash hashfcn ctxth)
+	      ;; Context hashes EXCLUDE the context prefix which
+	      ;; we need to include, so concat it here
+	      (when keyout
+		(setq keyout (concat contextstr ":" keyout)))
+	      )))
+      (when (not keyout)
+	;; No context, or binding in context.  Try full hash.
+	(maphash hashfcn (oref tab namehash)))
+      keyout)))
 
 (defmethod srecode-template-get-table-for-binding
   ((tab srecode-mode-table) binding &optional context application)
@@ -220,7 +239,8 @@
 	   )
       (while tabs
 	;; Exclude templates for a perticular application.
-	(when (not (oref (car tabs) :application))
+	(when (and (not (oref (car tabs) :application))
+		   (srecode-template-table-in-project-p (car tabs)))
 	  (maphash (lambda (key temp)
 		     (puthash key temp mhash)
 		     )
--- a/lisp/cedet/srecode/getset.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/getset.el	Thu Sep 23 15:00:31 2010 -0400
@@ -55,8 +55,9 @@
       (error "No templates for inserting get/set"))
 
   ;; Step 1: Try to derive the tag for the class we will use
+  (semantic-fetch-tags)
   (let* ((class (or class-in (srecode-auto-choose-class (point))))
-	 (tagstart (semantic-tag-start class))
+	 (tagstart (when class (semantic-tag-start class)))
 	 (inclass (eq (semantic-current-tag-of-class 'type) class))
 	 (field nil)
 	 )
--- a/lisp/cedet/srecode/insert.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/insert.el	Thu Sep 23 15:00:31 2010 -0400
@@ -26,6 +26,9 @@
 ;; Manage the insertion process for a template.
 ;;
 
+(eval-when-compile
+  (require 'cl)) ;; for `lexical-let'
+
 (require 'srecode/compile)
 (require 'srecode/find)
 (require 'srecode/dictionary)
@@ -49,7 +52,7 @@
 NOTE: The field feature does not yet work with XEmacs."
   :group 'srecode
   :type '(choice (const :tag "Ask" ask)
-		 (cons :tag "Field" field)))
+		 (const :tag "Field" field)))
 
 (defvar srecode-insert-with-fields-in-progress nil
   "Non-nil means that we are actively inserting a template with fields.")
@@ -86,7 +89,6 @@
 				    (car dict-entries)
 				    (car (cdr dict-entries)))
       (setq dict-entries (cdr (cdr dict-entries))))
-    ;;(srecode-resolve-arguments temp newdict)
     (srecode-insert-fcn temp newdict)
     ;; Don't put code here.  We need to return the end-mark
     ;; for this insertion step.
@@ -100,6 +102,10 @@
   ;; Perform the insertion.
   (let ((standard-output (or stream (current-buffer)))
 	(end-mark nil))
+    ;; Merge any template entries into the input dictionary.
+    (when (slot-boundp template 'dictionary)
+      (srecode-dictionary-merge dictionary (oref template dictionary)))
+
     (unless skipresolver
       ;; Make sure the semantic tags are up to date.
       (semantic-fetch-tags)
@@ -110,7 +116,7 @@
 	;; If there is a buffer, turn off various hooks.  This will cause
 	;; the mod hooks to be buffered up during the insert, but
 	;; prevent tools like font-lock from fontifying mid-template.
-	;; Especialy important during insertion of complex comments that
+	;; Especially important during insertion of complex comments that
 	;; cause the new font-lock to comment-color stuff after the inserted
 	;; comment.
 	;;
@@ -239,6 +245,9 @@
 (defmethod srecode-insert-method ((st srecode-template) dictionary)
   "Insert the srecoder template ST."
   ;; Merge any template entries into the input dictionary.
+  ;; This may happen twice since some templates arguments need
+  ;; these dictionary values earlier, but these values always
+  ;; need merging for template inserting in other templates.
   (when (slot-boundp st 'dictionary)
     (srecode-dictionary-merge dictionary (oref st dictionary)))
   ;; Do an insertion.
@@ -264,7 +273,7 @@
 ;; Specific srecode inserters.
 ;; The base class is from srecode-compile.
 ;;
-;; Each inserter handles various macro codes from the temlate.
+;; Each inserter handles various macro codes from the template.
 ;; The `code' slot specifies a character used to identify which
 ;; inserter is to be created.
 ;;
@@ -471,7 +480,7 @@
 	;;    (setq val (format "%S" val))))
 	))
     ;; Output the dumb thing unless the type of thing specifically
-    ;; did the inserting forus.
+    ;; did the inserting for us.
     (when do-princ
       (princ val))))
 
@@ -498,7 +507,8 @@
 The prompt text used is derived from the previous PROMPT command in the
 template file.")
 
-(defmethod srecode-inserter-apply-state ((ins srecode-template-inserter-ask) STATE)
+(defmethod srecode-inserter-apply-state
+  ((ins srecode-template-inserter-ask) STATE)
   "For the template inserter INS, apply information from STATE.
 Loop over the prompts to see if we have a match."
   (let ((prompts (oref STATE prompts))
@@ -669,7 +679,13 @@
   )
 
 (defvar srecode-template-inserter-point-override nil
-  "When non-nil, the point inserter will do this function instead.")
+  "Point-positioning method for the SRecode template inserter.
+When nil, perform normal point-positioning behavior.
+When the value is a cons cell (DEPTH . FUNCTION), call FUNCTION
+instead, unless the template nesting depth, measured
+by (length (oref srecode-template active)), is greater than
+DEPTH.")
+
 
 (defclass srecode-template-inserter-point (srecode-template-inserter)
   ((key :initform ?^
@@ -702,15 +718,20 @@
 				  dictionary)
   "Insert the STI inserter.
 Save point in the class allocated 'point' slot.
-If `srecode-template-inserter-point-override' then this generalized
-marker will do something else.  See `srecode-template-inserter-include-wrap'
-as an example."
-  (if srecode-template-inserter-point-override
+If `srecode-template-inserter-point-override' non-nil then this
+generalized marker will do something else.  See
+`srecode-template-inserter-include-wrap' as an example."
+  ;; If `srecode-template-inserter-point-override' is non-nil, its car
+  ;; is the maximum template nesting depth for which the override is
+  ;; valid. Compare this to the actual template nesting depth and
+  ;; maybe use the override function which is stored in the cdr.
+  (if (and srecode-template-inserter-point-override
+	   (<= (length (oref srecode-template active))
+	       (car srecode-template-inserter-point-override)))
       ;; Disable the old override while we do this.
-      (let ((over srecode-template-inserter-point-override)
+      (let ((over (cdr srecode-template-inserter-point-override))
 	    (srecode-template-inserter-point-override nil))
-	(funcall over dictionary)
-	)
+	(funcall over dictionary))
     (oset sti point (point-marker))
     ))
 
@@ -751,9 +772,15 @@
 The template to insert is stored in SLOT."
   (let ((dicts (srecode-dictionary-lookup-name
 		dictionary (oref sti :object-name))))
+    (when (not (listp dicts))
+      (error "Cannot insert section %S from non-section variable."
+	     (oref sti :object-name)))
     ;; If there is no section dictionary, then don't output anything
     ;; from this section.
     (while dicts
+      (when (not (srecode-dictionary-p (car dicts)))
+	(error "Cannot insert section %S from non-section variable."
+	       (oref sti :object-name)))
       (srecode-insert-subtemplate sti (car dicts) slot)
       (setq dicts (cdr dicts)))))
 
@@ -853,39 +880,44 @@
     ;; If there was no template name, throw an error
     (if (not templatenamepart)
 	(error "Include macro %s needs a template name" (oref sti :object-name)))
-    ;; Find the template by name, and save it.
-    (if (or (not (slot-boundp sti 'includedtemplate))
-	    (not (oref sti includedtemplate)))
-	(let ((tmpl (srecode-template-get-table (srecode-table)
-						templatenamepart))
-	      (active (oref srecode-template active))
-	      ctxt)
+
+    ;; NOTE: We used to cache the template and not look it up a second time,
+    ;; but changes in the template tables can change which template is
+    ;; eventually discovered, so now we always lookup that template.
+
+    ;; Calculate and store the discovered template
+    (let ((tmpl (srecode-template-get-table (srecode-table)
+					    templatenamepart))
+	  (active (oref srecode-template active))
+	  ctxt)
+      (when (not tmpl)
+	;; If it isn't just available, scan back through
+	;; the active template stack, searching for a matching
+	;; context.
+	(while (and (not tmpl) active)
+	  (setq ctxt (oref (car active) context))
+	  (setq tmpl (srecode-template-get-table (srecode-table)
+						 templatenamepart
+						 ctxt))
 	  (when (not tmpl)
-	    ;; If it isn't just available, scan back through
-	    ;; the active template stack, searching for a matching
-	    ;; context.
-	    (while (and (not tmpl) active)
-	      (setq ctxt (oref (car active) context))
-	      (setq tmpl (srecode-template-get-table (srecode-table)
-						     templatenamepart
-						     ctxt))
-	      (when (not tmpl)
-		(when (slot-boundp (car active) 'table)
-		  (let ((app (oref (oref (car active) table) application)))
-		    (when app
-		      (setq tmpl (srecode-template-get-table
-				  (srecode-table)
-				  templatenamepart
-				  ctxt app)))
-		    )))
-	      (setq active (cdr active)))
-	    (when (not tmpl)
-	      ;; If it wasn't in this context, look to see if it
-	      ;; defines its own context
-	      (setq tmpl (srecode-template-get-table (srecode-table)
-						     templatenamepart)))
-	    )
-	  (oset sti :includedtemplate tmpl)))
+	    (when (slot-boundp (car active) 'table)
+	      (let ((app (oref (oref (car active) table) application)))
+		(when app
+		  (setq tmpl (srecode-template-get-table
+			      (srecode-table)
+			      templatenamepart
+			      ctxt app)))
+		)))
+	  (setq active (cdr active)))
+	(when (not tmpl)
+	  ;; If it wasn't in this context, look to see if it
+	  ;; defines it's own context
+	  (setq tmpl (srecode-template-get-table (srecode-table)
+						 templatenamepart)))
+	)
+
+      ;; Store the found template into this object for later use.
+      (oset sti :includedtemplate tmpl))
 
     (if (not (oref sti includedtemplate))
 	;; @todo - Call into a debugger to help find the template in question.
@@ -955,23 +987,31 @@
 template where a ^ inserter occurs."
   ;; Step 1: Look up the included inserter
   (srecode-insert-include-lookup sti dictionary)
-  ;; Step 2: Temporarilly override the point inserter.
-  (let* ((vaguely-unique-name sti)
-	 (srecode-template-inserter-point-override
-	  (lambda (dict2)
-	    (if (srecode-dictionary-lookup-name
-		 dict2 (oref vaguely-unique-name :object-name))
-		;; Insert our sectional part with looping.
-		(srecode-insert-method-helper
-		 vaguely-unique-name dict2 'template)
-	      ;; Insert our sectional part just once.
-	      (srecode-insert-subtemplate vaguely-unique-name
-					  dict2 'template))
-	   )))
+  ;; Step 2: Temporarily override the point inserter.
+  ;; We bind `srecode-template-inserter-point-override' to a cons cell
+  ;; (DEPTH . FUNCTION) that has the maximum template nesting depth,
+  ;; for which the override is valid, in DEPTH and a lambda function
+  ;; which implements the wrap insertion behavior in FUNCTION. The
+  ;; maximum valid nesting depth is just the current depth + 1.
+  (let ((srecode-template-inserter-point-override
+	 (lexical-let ((inserter1 sti))
+	   (cons
+	    ;; DEPTH
+	    (+ (length (oref srecode-template active)) 1)
+	    ;; FUNCTION
+	    (lambda (dict)
+	      (let ((srecode-template-inserter-point-override nil))
+		(if (srecode-dictionary-lookup-name
+		     dict (oref inserter1 :object-name))
+		    ;; Insert our sectional part with looping.
+		    (srecode-insert-method-helper
+		     inserter1 dict 'template)
+		  ;; Insert our sectional part just once.
+		  (srecode-insert-subtemplate
+		   inserter1 dict 'template))))))))
     ;; Do a regular insertion for an include, but with our override in
     ;; place.
-    (call-next-method)
-    ))
+    (call-next-method)))
 
 (provide 'srecode/insert)
 
--- a/lisp/cedet/srecode/map.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/map.el	Thu Sep 23 15:00:31 2010 -0400
@@ -295,8 +295,14 @@
 
     ;; 2) Do we not have a current map?  If so load.
     (when (not srecode-current-map)
-      (setq srecode-current-map
-	    (eieio-persistent-read srecode-map-save-file))
+      (condition-case nil
+	  (setq srecode-current-map
+		(eieio-persistent-read srecode-map-save-file))
+	(error
+	 ;; There was an error loading the old map.  Create a new one.
+	 (setq srecode-current-map
+	       (srecode-map "SRecode Map"
+			    :file srecode-map-save-file))))
       )
 
     )
--- a/lisp/cedet/srecode/mode.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/mode.el	Thu Sep 23 15:00:31 2010 -0400
@@ -112,7 +112,13 @@
      ["Dump Dictionary"
       srecode-dictionary-dump
       :active t
-      :help "Calculate a dump a dictionary for point."
+      :help "Calculate and dump a dictionary for point."
+      ])
+    (semantic-menu-item
+     ["Show Macro Help"
+      srecode-macro-help
+      :active t
+      :help "Display the different types of macros available."
       ])
     )
    )
@@ -196,43 +202,44 @@
       (setq context (car-safe (srecode-calculate-context)))
 
       (while subtab
-	(setq ltab (oref (car subtab) templates))
-	(while ltab
-	  (setq temp (car ltab))
-
-	  ;; Do something with this template.
+	(when (srecode-template-table-in-project-p (car subtab))
+	  (setq ltab (oref (car subtab) templates))
+	  (while ltab
+	    (setq temp (car ltab))
 
-	  (let* ((ctxt (oref temp context))
-		 (ctxtcons (assoc ctxt alltabs))
-		 (bind (if (slot-boundp temp 'binding)
-			   (oref temp binding)))
-		 (name (object-name-string temp)))
+	    ;; Do something with this template.
+
+	    (let* ((ctxt (oref temp context))
+		   (ctxtcons (assoc ctxt alltabs))
+		   (bind (if (slot-boundp temp 'binding)
+			     (oref temp binding)))
+		   (name (object-name-string temp)))
 
-	    (when (not ctxtcons)
-	      (if (string= context ctxt)
-		  ;; If this context is not in the current list of contexts
-		  ;; is equal to the current context, then manage the
-		  ;; active list instead
-		  (setq active
-			(setq ctxtcons (or active (cons ctxt nil))))
-		;; This is not an active context, add it to alltabs.
-		(setq ctxtcons (cons ctxt nil))
-		(setq alltabs (cons ctxtcons alltabs))))
+	      (when (not ctxtcons)
+		(if (string= context ctxt)
+		    ;; If this context is not in the current list of contexts
+		    ;; is equal to the current context, then manage the
+		    ;; active list instead
+		    (setq active
+			  (setq ctxtcons (or active (cons ctxt nil))))
+		  ;; This is not an active context, add it to alltabs.
+		  (setq ctxtcons (cons ctxt nil))
+		  (setq alltabs (cons ctxtcons alltabs))))
 
-	    (let ((new (vector
-			(if bind
-			    (concat name "   (" bind ")")
-			  name)
-			`(lambda () (interactive)
-			   (srecode-insert (concat ,ctxt ":" ,name)))
-			t)))
+	      (let ((new (vector
+			  (if bind
+			      (concat name "   (" bind ")")
+			    name)
+			  `(lambda () (interactive)
+			     (srecode-insert (concat ,ctxt ":" ,name)))
+			  t)))
 
-	      (setcdr ctxtcons (cons
-				new
-				(cdr ctxtcons)))))
+		(setcdr ctxtcons (cons
+				  new
+				  (cdr ctxtcons)))))
 
-	  (setq ltab (cdr ltab)))
-	(setq subtab (cdr subtab)))
+	    (setq ltab (cdr ltab))))
+  	(setq subtab (cdr subtab)))
 
       ;; Now create the menu
       (easy-menu-filter-return
@@ -273,6 +280,7 @@
 This command will insert whichever srecode template has a binding
 to the current key."
   (interactive)
+  (srecode-load-tables-for-mode major-mode)
   (let* ((k last-command-event)
 	 (ctxt (srecode-calculate-context))
 	 ;; Find the template with the binding K
--- a/lisp/cedet/srecode/semantic.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/semantic.el	Thu Sep 23 15:00:31 2010 -0400
@@ -91,7 +91,7 @@
 to be augmented.")
 
 (define-overload srecode-semantic-apply-tag-to-dict (tagobj dict)
-  "Insert fewatures of TAGOBJ into the dictionary DICT.
+  "Insert features of TAGOBJ into the dictionary DICT.
 TAGOBJ is an object of class `srecode-semantic-tag'.  This class
 is a compound inserter value.
 DICT is a dictionary object.
@@ -195,7 +195,7 @@
 ;;; :tag ARGUMENT HANDLING
 ;;
 ;; When a :tag argument is required, identify the current :tag,
-;; and apply it's parts into the dictionary.
+;; and apply its parts into the dictionary.
 (defun srecode-semantic-handle-:tag (dict)
   "Add macros into the dictionary DICT based on the current :tag."
   ;; We have a tag, start adding "stuff" into the dictionary.
@@ -305,8 +305,8 @@
 
 For various conditions, this function looks for a template with
 the name CLASS-tag, where CLASS is the tag class.  If it cannot
-find that, it will look for that template in the
-`declaration'context (if the current context was not `declaration').
+find that, it will look for that template in the `declaration'
+context (if the current context was not `declaration').
 
 If PROTOTYPE is specified, it will first look for templates with
 the name CLASS-tag-prototype, or CLASS-prototype as above.
@@ -382,7 +382,7 @@
       (error "Cannot find template %s in %s for inserting tag %S"
 	     errtype top (semantic-format-tag-summarize tag)))
 
-    ;; Resolve Arguments
+    ;; Resolve arguments
     (let ((srecode-semantic-selected-tag tag))
       (srecode-resolve-arguments temp dict))
 
--- a/lisp/cedet/srecode/table.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/table.el	Thu Sep 23 15:00:31 2010 -0400
@@ -31,6 +31,7 @@
 (require 'srecode)
 
 (declare-function srecode-load-tables-for-mode "srecode/find")
+(declare-function srecode-template-table-in-project-p "srecode/find")
 
 ;;; Code:
 
@@ -74,6 +75,12 @@
 When there are multiple template files with similar names, templates with
 the highest priority are scanned last, allowing them to override values in
 previous template files.")
+   (project :initarg :project
+	    :type (or null string)
+	    :documentation
+	    "Scope some project files to a specific project.
+The value is a directory which forms the root of a particular project,
+or a subset of a particular project.")
    ;;
    ;; Parsed Data from the template file
    ;;
@@ -224,6 +231,12 @@
   (when (oref tab :application)
     (princ "\nApplication: ")
     (princ (oref tab :application)))
+  (when (oref tab :project)
+    (require 'srecode/find) ; For srecode-template-table-in-project-p
+    (princ "\nProject Directory: ")
+    (princ (oref tab :project))
+    (when (not (srecode-template-table-in-project-p tab))
+      (princ "\n   ** Not Usable in this file. **")))
   (princ "\n\nVariables:\n")
   (let ((vars (oref tab variables)))
     (while vars
--- a/lisp/cedet/srecode/texi.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/cedet/srecode/texi.el	Thu Sep 23 15:00:31 2010 -0400
@@ -175,10 +175,17 @@
 
 (define-mode-local-override semantic-insert-foreign-tag
   texinfo-mode (foreign-tag)
-  "Insert TAG from a foreign buffer in TAGFILE.
+  "Insert FOREIGN-TAG from a foreign buffer in TAGFILE.
 Assume TAGFILE is a source buffer, and create a documentation
 thingy from it using the `document' tool."
-  (let ((srecode-semantic-selected-tag foreign-tag))
+  (srecode-texi-insert-tag-as-doc foreign-tag))
+
+(defun srecode-texi-insert-tag-as-doc (tag)
+  "Insert TAG into the current buffer with SRecode."
+  (when (not (eq major-mode 'texinfo-mode))
+    (error "Can only insert tags into texinfo in texinfo mode"))
+  (let ((srecode-semantic-selected-tag tag))
+    (srecode-load-tables-for-mode major-mode)
     ;; @todo - choose of the many types of tags to insert,
     ;; or put all that logic into srecode.
     (srecode-insert "declaration:function")))
--- a/lisp/emacs-lisp/eieio.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/emacs-lisp/eieio.el	Thu Sep 23 15:00:31 2010 -0400
@@ -5,7 +5,7 @@
 ;;   2005, 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
 
 ;; Author: Eric M. Ludlam <zappo@gnu.org>
-;; Version: 0.2
+;; Version: 1.3
 ;; Keywords: OO, lisp
 
 ;; This file is part of GNU Emacs.
@@ -31,6 +31,11 @@
 ;; Emacs running environment.
 ;;
 ;; See eieio.texi for complete documentation on using this package.
+;;
+;; Note: the implementation of the c3 algorithm is based on:
+;;   Kim Barrett et al.: A Monotonic Superclass Linearization for Dylan
+;;   Retrieved from:
+;;   http://192.220.96.201/dylan/linearization-oopsla96.html
 
 ;; There is funny stuff going on with typep and deftype.  This
 ;; is the only way I seem to be able to make this stuff load properly.
@@ -44,7 +49,7 @@
   (require 'cl)
   (require 'eieio-comp))
 
-(defvar eieio-version "1.2"
+(defvar eieio-version "1.3"
   "Current version of EIEIO.")
 
 (defun eieio-version ()
@@ -79,7 +84,7 @@
   "*This hook is executed, then cleared each time `defclass' is called.")
 
 (defvar eieio-error-unsupported-class-tags nil
-  "*Non-nil to throw an error if an encountered tag us unsupported.
+  "Non-nil to throw an error if an encountered tag is unsupported.
 This may prevent classes from CLOS applications from being used with EIEIO
 since EIEIO does not support all CLOS tags.")
 
@@ -170,6 +175,13 @@
 (defconst method-generic-after 6 "Index into generic :after tag on a method.")
 (defconst method-num-slots 7 "Number of indexes into a method's vector.")
 
+(defsubst eieio-specialized-key-to-generic-key (key)
+  "Convert a specialized KEY into a generic method key."
+  (cond ((eq key method-static) 0) ;; don't convert
+	((< key method-num-lists) (+ key 3)) ;; The conversion
+	(t key) ;; already generic.. maybe.
+	))
+
 ;; How to specialty compile stuff.
 (autoload 'byte-compile-file-form-defmethod "eieio-comp"
   "This function is used to byte compile methods in a nice way.")
@@ -243,8 +255,7 @@
        ))
 
 (defmacro class-option-assoc (list option)
-  "Return from LIST the found OPTION.
-Return nil if it doesn't exist."
+  "Return from LIST the found OPTION, or nil if it doesn't exist."
   `(car-safe (cdr (memq ,option ,list))))
 
 (defmacro class-option (class option)
@@ -518,7 +529,7 @@
 
     ;; Make sure the method invocation order  is a valid value.
     (let ((io (class-option-assoc options :method-invocation-order)))
-      (when (and io (not (member io '(:depth-first :breadth-first))))
+      (when (and io (not (member io '(:depth-first :breadth-first :c3))))
 	(error "Method invocation order %s is not allowed" io)
 	))
 
@@ -800,11 +811,11 @@
 (defun eieio-perform-slot-validation-for-default (slot spec value skipnil)
   "For SLOT, signal if SPEC does not match VALUE.
 If SKIPNIL is non-nil, then if VALUE is nil return t instead."
-  (let ((val (eieio-default-eval-maybe value)))
-    (if (and (not eieio-skip-typecheck)
-	     (not (and skipnil (null val)))
-	     (not (eieio-perform-slot-validation spec val)))
-	(signal 'invalid-slot-type (list slot spec val)))))
+  (if (and (not (eieio-eval-default-p value))
+	   (not eieio-skip-typecheck)
+	   (not (and skipnil (null value)))
+	   (not (eieio-perform-slot-validation spec value)))
+      (signal 'invalid-slot-type (list slot spec value))))
 
 (defun eieio-add-new-slot (newc a d doc type cust label custg print prot init alloc
 				 &optional defaultoverride skipnil)
@@ -1340,7 +1351,7 @@
       (if (= key -1)
 	  (signal 'wrong-type-argument (list :static 'non-class-arg)))
       ;; generics are higher
-      (setq key (+ key 3)))
+      (setq key (eieio-specialized-key-to-generic-key key)))
     ;; Put this lambda into the symbol so we can find it
     (if (byte-code-function-p (car-safe body))
 	(eieiomt-add method (car-safe body) key argclass)
@@ -1516,13 +1527,21 @@
 	 (eieio-default-eval-maybe val))
        obj cl 'oref-default))))
 
+(defsubst eieio-eval-default-p (val)
+  "Whether the default value VAL should be evaluated for use."
+  (and (consp val) (symbolp (car val)) (fboundp (car val))))
+
 (defun eieio-default-eval-maybe (val)
   "Check VAL, and return what `oref-default' would provide."
-  ;; check for quoted things, and unquote them
-  (if (and (listp val) (eq (car val) 'quote))
-      (car (cdr val))
-    ;; return it verbatim
-    val))
+  (cond
+   ;; Is it a function call?  If so, evaluate it.
+   ((eieio-eval-default-p val)
+    (eval val))
+   ;;;; check for quoted things, and unquote them
+   ;;((and (consp val) (eq (car val) 'quote))
+   ;; (car (cdr val)))
+   ;; return it verbatim
+   (t val)))
 
 ;;; Object Set macros
 ;;
@@ -1677,6 +1696,116 @@
   (if (not (class-p class)) (signal 'wrong-type-argument (list 'class-p class)))
   (class-children-fast class))
 
+(defun eieio-c3-candidate (class remaining-inputs)
+  "Returns CLASS if it can go in the result now, otherwise nil"
+  ;; Ensure CLASS is not in any position but the first in any of the
+  ;; element lists of REMAINING-INPUTS.
+  (and (not (let ((found nil))
+	      (while (and remaining-inputs (not found))
+		(setq found (member class (cdr (car remaining-inputs)))
+		      remaining-inputs (cdr remaining-inputs)))
+	      found))
+       class))
+
+(defun eieio-c3-merge-lists (reversed-partial-result remaining-inputs)
+  "Merge REVERSED-PARTIAL-RESULT REMAINING-INPUTS in a consistent order, if possible.
+If a consistent order does not exist, signal an error."
+  (if (let ((tail remaining-inputs)
+	    (found nil))
+	(while (and tail (not found))
+	  (setq found (car tail) tail (cdr tail)))
+	(not found))
+      ;; If all remaining inputs are empty lists, we are done.
+      (nreverse reversed-partial-result)
+    ;; Otherwise, we try to find the next element of the result. This
+    ;; is achieved by considering the first element of each
+    ;; (non-empty) input list and accepting a candidate if it is
+    ;; consistent with the rests of the input lists.
+    (let* ((found nil)
+	   (tail remaining-inputs)
+	   (next (progn
+		   (while (and tail (not found))
+		     (setq found (and (car tail)
+				      (eieio-c3-candidate (caar tail)
+							  remaining-inputs))
+			   tail (cdr tail)))
+		   found)))
+      (if next
+	  ;; The graph is consistent so far, add NEXT to result and
+	  ;; merge input lists, dropping NEXT from their heads where
+	  ;; applicable.
+	  (eieio-c3-merge-lists
+	   (cons next reversed-partial-result)
+	   (mapcar (lambda (l) (if (eq (first l) next) (rest l) l))
+		   remaining-inputs))
+	;; The graph is inconsistent, give up
+	(signal 'inconsistent-class-hierarchy (list remaining-inputs))))))
+
+(defun eieio-class-precedence-dfs (class)
+  "Return all parents of CLASS in depth-first order."
+  (let* ((parents (class-parents-fast class))
+	 (classes (copy-sequence
+		   (apply #'append
+			  (list class)
+			  (or
+			   (mapcar
+			    (lambda (parent)
+			      (cons parent
+				    (eieio-class-precedence-dfs parent)))
+			    parents)
+			   '((eieio-default-superclass))))))
+	 (tail classes))
+    ;; Remove duplicates.
+    (while tail
+      (setcdr tail (delq (car tail) (cdr tail)))
+      (setq tail (cdr tail)))
+    classes))
+
+(defun eieio-class-precedence-bfs (class)
+  "Return all parents of CLASS in breadth-first order."
+  (let ((result)
+	(queue (or (class-parents-fast class)
+		   '(eieio-default-superclass))))
+    (while queue
+      (let ((head (pop queue)))
+	(unless (member head result)
+	  (push head result)
+	  (unless (eq head 'eieio-default-superclass)
+	    (setq queue (append queue (or (class-parents-fast head)
+					  '(eieio-default-superclass))))))))
+    (cons class (nreverse result)))
+  )
+
+(defun eieio-class-precedence-c3 (class)
+  "Return all parents of CLASS in c3 order."
+  (let ((parents (class-parents-fast class)))
+    (eieio-c3-merge-lists
+     (list class)
+     (append
+      (or
+       (mapcar
+	(lambda (x)
+	  (eieio-class-precedence-c3 x))
+	parents)
+       '((eieio-default-superclass)))
+      (list parents))))
+  )
+
+(defun class-precedence-list (class)
+  "Return (transitively closed) list of parents of CLASS.
+The order, in which the parents are returned depends on the
+method invocation orders of the involved classes."
+  (if (or (null class) (eq class 'eieio-default-superclass))
+      nil
+    (case (class-method-invocation-order class)
+      (:depth-first
+       (eieio-class-precedence-dfs class))
+      (:breadth-first
+       (eieio-class-precedence-bfs class))
+      (:c3
+       (eieio-class-precedence-c3 class))))
+  )
+
 ;; Official CLOS functions.
 (defalias 'class-direct-superclasses 'class-parents)
 (defalias 'class-direct-subclasses 'class-children)
@@ -1714,7 +1843,8 @@
 	    p (cdr p)))
     (if child t)))
 
-(defun object-slots (obj) "Return list of slots available in OBJ."
+(defun object-slots (obj)
+  "Return list of slots available in OBJ."
   (if (not (eieio-object-p obj)) (signal 'wrong-type-argument (list 'eieio-object-p obj)))
   (aref (class-v (object-class-fast obj)) class-public-a))
 
@@ -2008,14 +2138,26 @@
 	    keys (append (make-list (length tlambdas) method-before) keys))
       )
 
-    ;; If there were no methods found, then there could be :static methods.
-    (when (not lambdas)
+    (if mclass
+	;; For the case of a class,
+	;; if there were no methods found, then there could be :static methods.
+	(when (not lambdas)
+	  (setq tlambdas
+		(eieio-generic-form method method-static mclass))
+	  (setq lambdas (cons tlambdas lambdas)
+		keys (cons method-static keys)
+		primarymethodlist  ;; Re-use even with bad name here
+		(eieiomt-method-list method method-static mclass)))
+      ;; For the case of no class (ie - mclass == nil) then there may
+      ;; be a primary method.
       (setq tlambdas
-	    (eieio-generic-form method method-static mclass))
-      (setq lambdas (cons tlambdas lambdas)
-	    keys (cons method-static keys)
-	    primarymethodlist  ;; Re-use even with bad name here
-	    (eieiomt-method-list method method-static mclass)))
+	    (eieio-generic-form method method-primary nil))
+      (when tlambdas
+	(setq lambdas (cons tlambdas lambdas)
+	      keys (cons method-primary keys)
+	      primarymethodlist
+	      (eieiomt-method-list method method-primary nil)))
+      )
 
     (run-hook-with-args 'eieio-pre-method-execution-hooks
 			primarymethodlist)
@@ -2142,37 +2284,23 @@
 If CLASS is nil, then an empty list of methods should be returned."
   ;; Note: eieiomt - the MT means MethodTree.  See more comments below
   ;; for the rest of the eieiomt methods.
-  (let ((lambdas nil)
-	(mclass (list class)))
-    (while mclass
-      ;; Note: a nil can show up in the class list once we start
-      ;;       searching through the method tree.
-      (when (car mclass)
-	;; lookup the form to use for the PRIMARY object for the next level
-	(let ((tmpl (eieio-generic-form method key (car mclass))))
-	  (when (or (not lambdas)
-		    ;; This prevents duplicates coming out of the
-		    ;; class method optimizer.  Perhaps we should
-		    ;; just not optimize before/afters?
-		    (not (eq (car tmpl) (car (car lambdas)))))
-	    (setq lambdas (cons tmpl lambdas))
-	    (if (null (car lambdas))
-		(setq lambdas (cdr lambdas))))))
-      ;; Add new classes to mclass.  Since our input might not be a class
-      ;; protect against that.
-      (if (car mclass)
-	  ;; If there is a class, append any methods it may provide
-	  ;; to the remainder of the class list.
-	  (let ((io (class-method-invocation-order (car mclass))))
-	    (if (eq io :depth-first)
-		;; Depth first.
-		(setq mclass (append (eieiomt-next (car mclass)) (cdr mclass)))
-	      ;; Breadth first.
-	      (setq mclass (append (cdr mclass) (eieiomt-next (car mclass)))))
-	    )
-	;; Advance to next entry in mclass if it is nil.
-	(setq mclass (cdr mclass)))
-      )
+
+  ;; Collect lambda expressions stored for the class and its parent
+  ;; classes.
+  (let (lambdas)
+    (dolist (ancestor (class-precedence-list class))
+      ;; Lookup the form to use for the PRIMARY object for the next level
+      (let ((tmpl (eieio-generic-form method key ancestor)))
+	(when (and tmpl
+		   (or (not lambdas)
+		       ;; This prevents duplicates coming out of the
+		       ;; class method optimizer.  Perhaps we should
+		       ;; just not optimize before/afters?
+		       (not (member tmpl lambdas))))
+	  (push tmpl lambdas))))
+
+    ;; Return collected lambda. For :after methods, return in current
+    ;; order (most general class last); Otherwise, reverse order.
     (if (eq key method-after)
 	lambdas
       (nreverse lambdas))))
@@ -2206,6 +2334,7 @@
 	(apply 'no-next-method (car newargs) (cdr newargs))
       (let* ((eieio-generic-call-next-method-list
 	      (cdr eieio-generic-call-next-method-list))
+	     (eieio-generic-call-arglst newargs)
 	     (scoped-class (cdr next))
 	     (fcn (car next))
 	     )
@@ -2298,32 +2427,18 @@
 
 (defun eieiomt-sym-optimize (s)
   "Find the next class above S which has a function body for the optimizer."
-  ;; (message "Optimizing %S" s)
-  (let* ((es (intern-soft (symbol-name s))) ;external symbol of class
-	 (io (class-method-invocation-order es))
-	 (ov nil)
-	 (cont t))
-    ;; This converts ES from a single symbol to a list of parent classes.
-    (setq es (eieiomt-next es))
-    ;; Loop over ES, then its children individually.
-    ;; We can have multiple hits only at one level of the parent tree.
-    (while (and es cont)
-      (setq ov (intern-soft (symbol-name (car es)) eieiomt-optimizing-obarray))
-      (if (fboundp ov)
-	  (progn
-	    (set s ov)			;store ov as our next symbol
-	    (setq cont nil))
-	(if (eq io :depth-first)
-	    ;; Pre-pend the subclasses of (car es) so we get
-	    ;; DEPTH FIRST optimization.
-	    (setq es (append (eieiomt-next (car es)) (cdr es)))
-	  ;; Else, we are breadth first.
-	  ;; (message "Class %s is breadth first" es)
-	  (setq es (append (cdr es) (eieiomt-next (car es))))
-	  )))
-    ;; If there is no nearest call, then set our value to nil
-    (if (not es) (set s nil))
-    ))
+  ;; Set the value to nil in case there is no nearest cell.
+  (set s nil)
+  ;; Find the nearest cell that has a function body. If we find one,
+  ;; we replace the nil from above.
+  (let ((external-symbol (intern-soft (symbol-name s))))
+    (catch 'done
+      (dolist (ancestor (rest (class-precedence-list external-symbol)))
+	(let ((ov (intern-soft (symbol-name ancestor)
+			       eieiomt-optimizing-obarray)))
+	  (when (fboundp ov)
+	    (set s ov) ;; store ov as our next symbol
+	    (throw 'done ancestor)))))))
 
 (defun eieio-generic-form (method key class)
  "Return the lambda form belonging to METHOD using KEY based upon CLASS.
@@ -2332,7 +2447,7 @@
 The first time a form is requested from a symbol, an optimized path
 is memorized for faster future use."
  (let ((emto (aref (get method 'eieio-method-obarray)
-		   (if class key (+ key 3)))))
+		   (if class key (eieio-specialized-key-to-generic-key key)))))
    (if (class-p class)
        ;; 1) find our symbol
        (let ((cs (intern-soft (symbol-name class) emto)))
@@ -2365,7 +2480,7 @@
 	       nil)))
      ;; for a generic call, what is a list, is the function body we want.
      (let ((emtl (aref (get method 'eieio-method-tree)
-		       (if class key (+ key 3)))))
+ 		       (if class key (eieio-specialized-key-to-generic-key key)))))
        (if emtl
 	   ;; The car of EMTL is supposed to be a class, which in this
 	   ;; case is nil, so skip it.
@@ -2430,6 +2545,11 @@
 (put 'unbound-slot 'error-conditions '(unbound-slot error nil))
 (put 'unbound-slot 'error-message "Unbound slot")
 
+(intern "inconsistent-class-hierarchy")
+(put 'inconsistent-class-hierarchy 'error-conditions
+     '(inconsistent-class-hierarchy error nil))
+(put 'inconsistent-class-hierarchy 'error-message "Inconsistent class hierarchy")
+
 ;;; Here are some CLOS items that need the CL package
 ;;
 
@@ -2525,6 +2645,17 @@
 	   (slot (aref scoped-class class-public-a))
 	   (defaults (aref scoped-class class-public-d)))
       (while slot
+	;; For each slot, see if we need to evaluate it.
+	;;
+	;; Paul Landes said in an email:
+	;; > CL evaluates it if it can, and otherwise, leaves it as
+	;; > the quoted thing as you already have.  This is by the
+	;; > Sonya E. Keene book and other things I've look at on the
+	;; > web.
+	(let ((dflt (eieio-default-eval-maybe (car defaults))))
+	  (when (not (eq dflt (car defaults)))
+	    (eieio-oset this (car slot) dflt) ))
+	;; Next.
 	(setq slot (cdr slot)
 	      defaults (cdr defaults))))
     ;; Shared initialize will parse our slots for us.
--- a/lisp/emacs-lisp/float-sup.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/emacs-lisp/float-sup.el	Thu Sep 23 15:00:31 2010 -0400
@@ -35,25 +35,25 @@
 
 ;; provide an easy hook to tell if we are running with floats or not.
 ;; define pi and e via math-lib calls. (much less prone to killer typos.)
-(defconst pi (* 4 (atan 1)) "The value of Pi (3.1415926...).")
+(defconst float-pi (* 4 (atan 1)) "The value of Pi (3.1415926...).")
+(defconst pi float-pi "Obsolete since Emacs-23.3.  Use `float-pi' instead.")
 
-;; It's too inconvenient to make `e' a constant because it's used as
-;; a temporary variable all the time.
-(defvar e (exp 1) "The value of e (2.7182818...).")
+(defconst float-e (exp 1) "The value of e (2.7182818...).")
+(defvar e float-e "Obsolete since Emacs-23.3.  Use `float-e' instead.")
 
-(defconst degrees-to-radians (/ pi 180.0)
+(defconst degrees-to-radians (/ float-pi 180.0)
   "Degrees to radian conversion constant.")
-(defconst radians-to-degrees (/ 180.0 pi)
+(defconst radians-to-degrees (/ 180.0 float-pi)
   "Radian to degree conversion constant.")
 
 ;; these expand to a single multiply by a float when byte compiled
 
 (defmacro degrees-to-radians (x)
   "Convert ARG from degrees to radians."
-  (list '* (/ pi 180.0) x))
+  (list '* degrees-to-radians x))
 (defmacro radians-to-degrees (x)
   "Convert ARG from radians to degrees."
-  (list '* (/ 180.0 pi) x))
+  (list '* radians-to-degrees x))
 
 (provide 'lisp-float-type)
 
--- a/lisp/gnus/ChangeLog	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/gnus/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -1,3 +1,8 @@
+2010-09-21  Glenn Morris  <rgm@gnu.org>
+
+	* message.el (message-output): Use gnus-output-to-rmail if a buffer is
+	visiting the fcc file in rmail-mode.
+
 2010-09-23  Lars Magne Ingebrigtsen  <larsi@gnus.org>
 
 	* nnimap.el (nnimap-update-info): Sync non-standard flags from the
--- a/lisp/gnus/message.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/gnus/message.el	Thu Sep 23 15:00:31 2010 -0400
@@ -5349,8 +5349,14 @@
 
 (defun message-output (filename)
   "Append this article to Unix/babyl mail file FILENAME."
-  (if (and (file-readable-p filename)
-	   (mail-file-babyl-p filename))
+  (if (or (and (file-readable-p filename)
+	       (mail-file-babyl-p filename))
+	  ;; gnus-output-to-mail does the wrong thing with live, mbox
+	  ;; Rmail buffers in Emacs 23.
+	  ;; http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=597255
+	  (let ((buff (find-buffer-visiting filename)))
+	    (and buff (with-current-buffer buff
+			(eq major-mode 'rmail-mode)))))
       (gnus-output-to-rmail filename t)
     (gnus-output-to-mail filename t)))
 
--- a/lisp/isearch.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/isearch.el	Thu Sep 23 15:00:31 2010 -0400
@@ -275,30 +275,37 @@
   :group 'isearch
   :group 'matching)
 
+(define-obsolete-variable-alias 'isearch-lazy-highlight-cleanup
+                                'lazy-highlight-cleanup
+                                "22.1")
+
 (defcustom lazy-highlight-cleanup t
   "Controls whether to remove extra highlighting after a search.
 If this is nil, extra highlighting can be \"manually\" removed with
 \\[lazy-highlight-cleanup]."
   :type 'boolean
   :group 'lazy-highlight)
-(define-obsolete-variable-alias 'isearch-lazy-highlight-cleanup
-                                'lazy-highlight-cleanup
+
+(define-obsolete-variable-alias 'isearch-lazy-highlight-initial-delay
+                                'lazy-highlight-initial-delay
                                 "22.1")
 
 (defcustom lazy-highlight-initial-delay 0.25
   "Seconds to wait before beginning to lazily highlight all matches."
   :type 'number
   :group 'lazy-highlight)
-(define-obsolete-variable-alias 'isearch-lazy-highlight-initial-delay
-                                'lazy-highlight-initial-delay
+
+(define-obsolete-variable-alias 'isearch-lazy-highlight-interval
+                                'lazy-highlight-interval
                                 "22.1")
 
 (defcustom lazy-highlight-interval 0 ; 0.0625
   "Seconds between lazily highlighting successive matches."
   :type 'number
   :group 'lazy-highlight)
-(define-obsolete-variable-alias 'isearch-lazy-highlight-interval
-                                'lazy-highlight-interval
+
+(define-obsolete-variable-alias 'isearch-lazy-highlight-max-at-a-time
+                                'lazy-highlight-max-at-a-time
                                 "22.1")
 
 (defcustom lazy-highlight-max-at-a-time 20
@@ -309,9 +316,6 @@
   :type '(choice (const :tag "All" nil)
 		 (integer :tag "Some"))
   :group 'lazy-highlight)
-(define-obsolete-variable-alias 'isearch-lazy-highlight-max-at-a-time
-                                'lazy-highlight-max-at-a-time
-                                "22.1")
 
 (defface lazy-highlight
   '((((class color) (min-colors 88) (background light))
@@ -327,10 +331,10 @@
   :group 'lazy-highlight
   :group 'basic-faces)
 (define-obsolete-face-alias 'isearch-lazy-highlight-face 'lazy-highlight "22.1")
-(defvar lazy-highlight-face 'lazy-highlight)
 (define-obsolete-variable-alias 'isearch-lazy-highlight-face
                                 'lazy-highlight-face
                                 "22.1")
+(defvar lazy-highlight-face 'lazy-highlight)
 
 ;; Define isearch help map.
 
--- a/lisp/net/net-utils.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/net/net-utils.el	Thu Sep 23 15:00:31 2010 -0400
@@ -99,6 +99,9 @@
   :group 'net-utils
   :type  'string)
 
+(define-obsolete-variable-alias 'ipconfig-program-options
+  'ifconfig-program-options "22.2")
+
 (defcustom ifconfig-program-options
   (list
    (if (eq system-type 'windows-nt)
@@ -113,9 +116,6 @@
   :type 'string
   :version "23.1")
 
-(define-obsolete-variable-alias 'ipconfig-program-options
-  'ifconfig-program-options "22.2")
-
 (defcustom iwconfig-program-options nil
  "Options for the iwconfig program."
  :group 'net-utils
--- a/lisp/newcomment.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/newcomment.el	Thu Sep 23 15:00:31 2010 -0400
@@ -319,7 +319,8 @@
 		   "+\\)[ \t]*")))
     (unless (and comment-end-skip
 		 ;; In case comment-end has changed since last time.
-		 (string-match comment-end-skip comment-end))
+		 (string-match comment-end-skip
+                               (if (string= "" comment-end) "\n" comment-end)))
       (let ((ce (if (string= "" comment-end) "\n"
 		  (comment-string-strip comment-end t t))))
 	(set (make-local-variable 'comment-end-skip)
--- a/lisp/play/bubbles.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/play/bubbles.el	Thu Sep 23 15:00:31 2010 -0400
@@ -1377,7 +1377,7 @@
                                    (g (nth 1 crgb))
                                    (b (nth 2 crgb))
                                    (brightness (/ (+ r g b) 3.0 256 256))
-                                   (val (sin (* brightness (/ pi 2))))
+                                   (val (sin (* brightness (/ float-pi 2))))
                                    (rr (* red val))
                                    (gg (* green val))
                                    (bb (* blue val))
--- a/lisp/textmodes/artist.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/textmodes/artist.el	Thu Sep 23 15:00:31 2010 -0400
@@ -2939,7 +2939,7 @@
 Returns a list of points.  Each point is on the form (X1 . Y1)."
   (let ((points))
     (while (> n 0)
-      (let* ((angle (* (random 359) (/ pi 180)))
+      (let* ((angle (* (random 359) (/ float-pi 180)))
 	     (dist  (random radius))
 	     (point (cons (round (* dist (cos angle)))
 			  (round (* dist (sin angle))))))
--- a/lisp/url/ChangeLog	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/url/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -1,3 +1,7 @@
+2010-09-23  Glenn Morris  <rgm@gnu.org>
+
+	* url-cache.el (url-is-cached): Doc fix.
+
 2010-09-23  Glenn Morris  <rgm@gnu.org>
 
 	* url-cache.el (url-cache-expired): Don't autoload.
--- a/lisp/url/url-cache.el	Thu Sep 23 13:10:21 2010 -0400
+++ b/lisp/url/url-cache.el	Thu Sep 23 15:00:31 2010 -0400
@@ -83,7 +83,8 @@
 
 ;;;###autoload
 (defun url-is-cached (url)
-  "Return non-nil if the URL is cached."
+  "Return non-nil if the URL is cached.
+The actual return value is the last modification time of the cache file."
   (let* ((fname (url-cache-create-filename url))
 	 (attribs (file-attributes fname)))
     (and fname				; got a filename
--- a/src/ChangeLog	Thu Sep 23 13:10:21 2010 -0400
+++ b/src/ChangeLog	Thu Sep 23 15:00:31 2010 -0400
@@ -1,3 +1,12 @@
+2010-09-23  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* syntax.c (back_comment): Detect the case where a 1-char comment
+	starter is also the 2nd char of a 2-char comment ender.
+
+2010-09-23  Jan Djärv  <jan.h.d@swipnet.se>
+
+	* gtkutil.c (xg_tool_bar_menu_proxy): Set gtk-menu-items to TRUE.
+
 2010-09-23  Eli Zaretskii  <eliz@gnu.org>
 
 	* editfns.c (transpose_markers, update_buffer_properties)
--- a/src/gtkutil.c	Thu Sep 23 13:10:21 2010 -0400
+++ b/src/gtkutil.c	Thu Sep 23 15:00:31 2010 -0400
@@ -3716,6 +3716,8 @@
       GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (wbutton));
       GtkImageType store_type = gtk_image_get_storage_type (wimage);
 
+      g_object_set (G_OBJECT (settings), "gtk-menu-images", TRUE, NULL);
+
       if (store_type == GTK_IMAGE_STOCK)
         {
           gchar *stock_id;
--- a/src/syntax.c	Thu Sep 23 13:10:21 2010 -0400
+++ b/src/syntax.c	Thu Sep 23 15:00:31 2010 -0400
@@ -559,6 +559,7 @@
     {
       int temp_byte, prev_syntax;
       int com2start, com2end;
+      int comstart;
 
       /* Move back and examine a character.  */
       DEC_BOTH (from, from_byte);
@@ -578,7 +579,8 @@
 		       || SYNTAX_FLAGS_COMMENT_NESTED (syntax)) == comnested);
       com2end = (SYNTAX_FLAGS_COMEND_FIRST (syntax)
 		 && SYNTAX_FLAGS_COMEND_SECOND (prev_syntax));
-
+      comstart = (com2start || code == Scomment);
+      
       /* Nasty cases with overlapping 2-char comment markers:
 	 - snmp-mode: -- c -- foo -- c --
 	              --- c --
@@ -589,15 +591,16 @@
 		      ///   */
 
       /* If a 2-char comment sequence partly overlaps with another,
-	 we don't try to be clever.  */
-      if (from > stop && (com2end || com2start))
+	 we don't try to be clever.  E.g. |*| in C, or }% in modes that
+	 have %..\n and %{..}%.  */
+      if (from > stop && (com2end || comstart))
 	{
 	  int next = from, next_byte = from_byte, next_c, next_syntax;
 	  DEC_BOTH (next, next_byte);
 	  UPDATE_SYNTAX_TABLE_BACKWARD (next);
 	  next_c = FETCH_CHAR_AS_MULTIBYTE (next_byte);
 	  next_syntax = SYNTAX_WITH_FLAGS (next_c);
-	  if (((com2start || comnested)
+	  if (((comstart || comnested)
 	       && SYNTAX_FLAGS_COMEND_SECOND (syntax)
 	       && SYNTAX_FLAGS_COMEND_FIRST (next_syntax))
 	      || ((com2end || comnested)