diff --git a/Misc/dlMakefile b/Misc/dlMakefile
deleted file mode 100755
index 0a69f2d..0000000
--- a/Misc/dlMakefile
+++ /dev/null
@@ -1,58 +0,0 @@
-# Makefile to do general-coverage creation of dynamic-load libraries
-# from python C-module sources.
-
-# $Id$
-# Created by Ken Manheimer, Jul-1994.  ken.manheimer@nist.gov, 301 975-3539
-
-# To configure for your site, select the appropriate SOURCES and macro
-# def and assign the right path to the prefix macro.
-
-ARCH=		sun4
-prefix=		/depot/sundry
-DESTLIB=	$(prefix)/lib/python/$(ARCH)
-
-### For Sun Make; tested in v 1.0, under both SunOS 4.1.3 and SunOS 5.3:
-#SOURCES:sh=	echo *.c
-### For Gnu Make; works at least for v 3.59:
-SOURCES=	$(wildcard *.c)
-
-# To configure for a new module:
-#  - put the module in the current directory
-#  - if it doesn't require any special compile or load options, that's it.
-#  - if it does require special compile or load options, create a macro
-#    composed of the (full) module name, sans suffix, plus 'CFLAGS' or
-#    'LDFLAGS', depending on the compile phase in question.
-metalbasemoduleCFLAGS=  -I$(prefix)/include/mbase51 -DNO_TIMEB -DNO_USHORT -DNO_ENCRYPT
-metalbasemoduleLDFLAGS= -L/depot/sundry/plat/lib -lmb
-cursesmoduleCFLAGS=  -I/usr/5include
-cursesmoduleLDFLAGS= -L/usr/5lib -lcurses -ltermcap
-
-OBJS=		$(SOURCES:.c=.so)
-
-CC=		gcc
-OPT=		-g -O
-DEFS=		-DHAVE_CONFIG_H
-INCLDIR=	$(prefix)/include/python
-CFLAGS=		$(OPT) -I$(INCLDIR) -I.. $(DEFS)
-LD=		ld
-
-all:	$(OBJS)
-
-%.o: %.c
-	$(CC) -c $(CFLAGS) $(CPPFLAGS) $($*CFLAGS) -o $@ $<
-
-%.so: %.o
-	$(LD) $(LDFLAGS) -o $@ $< $($*LDFLAGS) $(LOADLIBES)
-
-PHONY: echo		# For testing derivation of $(OBJS).
-echo:
-	@echo "(Set SOURCES def if you don't see a '.so' for each '.c' between the brackets)"
-	@echo :$(OBJS):
-
-PHONY : install
-install:	$(OBJS)
-	ls $(OBJS) | cpio -pm $(DESTLIB)
-
-PHONY : clean
-clean:
-	rm -f *.o *.so
diff --git a/Misc/gMakefile b/Misc/gMakefile
new file mode 100644
index 0000000..3e2d19c
--- /dev/null
+++ b/Misc/gMakefile
@@ -0,0 +1,66 @@
+# Generic Makefile for dynamically linked extension modules.
+#
+# Jim Fulton, Digital Creations, jim@digicool.com
+
+
+# Uncomment this line if you want to fix the location of the PYTHON
+# installation.  Otherwise, set the environment variable before using this
+# Makefile.
+# $(PYTHONHOME)= /usr/local/
+
+# The following lines should be left as is:
+pyinstalldir=	$(PYTHONHOME)
+installdir=	$(PYTHONHOME)
+exec_installdir=$(pyinstalldir)
+INCLUDEPY=	$(pyinstalldir)/include/Py
+LIBP=		$(exec_installdir)/lib/python
+LIBPL=		$(LIBP)/lib
+PYMAKE=		make -f $(LIBPL)/Makefile
+
+# LIBSO is the location of platform-dependent dynamically linked 
+# extension libraries.  This can be handy when you need to build 
+# shared libraries that are not extensions but want to store them
+# with other extensions and need to know where they are.
+# Leave this line as it is.
+LIBSO=		`$(PYMAKE) -s echodestshared`
+
+# Put your module name here:
+MODULE=your-module
+
+# Put the object files for your module here:
+OBS=$(MODULE).o
+
+# Put extra linker options, such as libraries here:
+EXTRA=
+
+# If you have any Python modules, include them here, so that they
+# can be installed.
+PYMODULES=
+
+build:
+	if [ "$(MODULE)" != your-module ]; then \
+	  $(PYMAKE) INCLDIR=$(INCLUDEPY) CONFIGINCLDIR=$(LIBPL) \
+		ASHAREDMODULE=$(MODULE) \
+		'ASHAREDMODULESOBS=$(OBS)' \
+		'ASHAREDMODULESEXTRA=$(EXTRA)' \
+		asharedmodule; \
+	fi
+
+install: installso installpy
+
+installso: build
+	if [ "$(MODULE)" != your-module ]; then \
+	  $(PYMAKE) exec_prefix=$(installdir) \
+		ASHAREDMODULE=$(MODULE) asharedinstall; \
+	fi
+
+installpy:
+	for m in $(PYMODULES) the-end; do \
+	  if [ "$$m" != the-end ]; then \
+	    python -c "import $$m"; \
+	    cp $$m.pyc $(installdir)/lib/python/; \
+	  fi; \
+	done
+
+clean::
+	-rm -f *.o *.so *~ *# so_locations
diff --git a/Misc/pyimenu.el b/Misc/pyimenu.el
deleted file mode 100755
index 738de7d..0000000
--- a/Misc/pyimenu.el
+++ /dev/null
@@ -1,305 +0,0 @@
-;;; PYIMENU.EL --- 
-
-;; Copyright (C) 1995 Perry A. Stoll
-
-;; Author: Perry A. Stoll <stoll@atr-sw.atr.co.jp>
-;; Created: 12 May 1995
-;; Version: 1.0
-;; Keywords: tools python imenu
-
-;; This program 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 2, or (at your option)
-;; any later version.
-
-;; This program 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.
-
-;; A copy of the GNU General Public License can be obtained from the
-;; Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
-;; USA.
-
-;;;; COMMENTS
-
-;; I use the imenu package a lot for looking at Lisp and C/C++
-;; code. When I started using Python, I was dismayed that I couldn't
-;; use it to look at Python source. So here's a rough go at it.
-
-;;;; USAGE
-
-;; This program is used in conjunction with the imenu package. When
-;; you call imenu in python-mode in a python buffer, a list of
-;; functions and classes is built. The top level menu has a list of
-;; all functions and classes defined at the top indentation
-;; level. Classes which have methods defined in them have a submenu
-;; which contains all definitions contained in them. Selecting any
-;; item will bring you to that point in the file.
-
-;;;; INSTALLATION
-
-;; You know the routine:
-;; 1) Save this file as pyimenu.el,
-;; 2) Place that file somewhere in your emacs load path (maybe ~/emacs
-;;    or ~/emacs/lisp),
-;; 3) Byte compile it (M-x byte-compile-file),
-;; 4) Add the following (between "cut here" and "end here") to your
-;;    ~/.emacs file,
-;; 5) Reboot. (joke: DON'T do that, although you'll probably have to
-;;    either reload your ~/.emacs file or start a new emacs)
-
-;;--------------cut here-------------------------------------------
-;;;; Load the pyimenu index function
-;;(autoload 'imenu "imenu" nil t)
-;;(autoload 'imenu-example--create-python-index "pyimenu")
-;;;; Add the index creation function to the python-mode-hook 
-;;(add-hook 'python-mode-hook
-;;	  (function
-;;	   (lambda ()
-;;	     (setq imenu-create-index-function
-;;		   (function imenu-example--create-python-index)))))
-;;----------------end here--------------------------------------------
-;;
-;; That is all you need. Of course, the following provides a more
-;; useful interface. i.e. this is how I have it set up ;-)
-;;
-;;----------------optionally cut here----------------------------------
-;;(autoload 'imenu-add-to-menubar "imenu" nil t)
-;;(defun my-imenu-install-hook ()
-;;  (imenu-add-to-menubar (format "%s-%s" "IM" mode-name)))
-;;(add-hook 'python-mode-hook (function my-imenu-install-hook))
-;;;; Bind imenu to some convenient (?) mouse key. This really lets you
-;;;; fly around the buffer. Here it is set to Meta-Shift-Mouse3Click.
-;;(global-set-key [M-S-down-mouse-3] (function imenu))
-;;-----------------optionaly end here-----------------------------------
-
-;;;; CAVEATS/NOTES
-
-;; 0) I'm not a professional elisp programmer and it shows in the code
-;;    below. If anyone there has suggestions/changes, I'd love to
-;;    hear them. I've tried the code out on a bunch of python files
-;;    from the python-1.1.1 Demo distribution and it worked with
-;;    them - your mileage may very.
-;;
-;; 1) You must have the imenu package to use this file. This file
-;;    works with imenu version 1.11 (the version included with emacs
-;;    19.28) and imenu version 1.14; if you have a later version, this
-;;    may not work with it.
-;;
-;; 2) This setup assumes you also have python-mode.el, so that it can
-;;    use the python-mode-hook. It comes with the python distribution.
-;;
-;; 3) I don't have the Python 1.2 distribution yet, so again, this may
-;;    not work with that.
-;;
-
-(require 'imenu)
-
-;;;
-;;; VARIABLES: customizable in your .emacs file.
-;;;
-
-(defvar imenu-example--python-show-method-args-p nil 
-  "*When using imenu package with python-mode, whether the arguments of
-the function/methods should be printed in the imenu buffer in addition
-to the function/method name. If non-nil, args are printed.")
-
-;;;
-;;; VARIABLES: internal use.
-;;;
-(defvar imenu-example--python-class-regexp
-  (concat                              ; <<classes>>
-   "\\("                               ;
-   "^[ \t]*"                           ; newline and maybe whitespace
-   "\\(class[ \t]+[a-zA-Z0-9_]+\\)"    ; class name
-                                       ; possibly multiple superclasses
-   "\\([ \t]*\\((\\([a-zA-Z0-9_, \t\n]\\)*)\\)?\\)"
-   "[ \t]*:"                           ; and the final :
-   "\\)"                               ; >>classes<<
-   )
-  "Regexp for Python classes for use with the imenu package."
-)
-
-(defvar imenu-example--python-method-regexp
-  (concat                               ; <<methods and functions>>
-   "\\("                                ; 
-   "^[ \t]*"                            ; new line and maybe whitespace
-   "\\(def[ \t]+"                       ; function definitions start with def
-   "\\([a-zA-Z0-9_]+\\)"                ;   name is here
-					;   function arguments...
-   "[ \t]*(\\([a-zA-Z0-9_=,\* \t\n]*\\))"
-   "\\)"                                ; end of def
-   "[ \t]*:"                            ; and then the :
-   "\\)"                                ; >>methods and functions<<
-   )
-  "Regexp for Python methods/functions for use with the imenu package."
-  )
-
-(defvar imenu-example--python-method-no-arg-parens '(2 8)
-  "Indicies into the parenthesis list of the regular expression for
-python for use with imenu. Using these values will result in smaller
-imenu lists, as arguments to functions are not listed.
-
-See the variable imenu-example--python-show-method-args-p to for
-information")
-
-(defvar imenu-example--python-method-arg-parens '(2 7)
-  "Indicies into the parenthesis list of the regular expression for
-python for use with imenu. Using these values will result in large
-imenu lists, as arguments to functions are listed.
-
-See the variable imenu-example--python-show-method-args-p to for
-information")
-
-;; Note that in this format, this variable can still be used with the
-;; imenu--generic-function. Otherwise, there is no real reason to have
-;; it.
-(defvar imenu-example--generic-python-expression
-  (cons
-   (concat 
-    imenu-example--python-class-regexp
-    "\\|"  ; or...
-    imenu-example--python-method-regexp
-    )
-   imenu-example--python-method-no-arg-parens)
-  "Generic Python expression which may be used directly with imenu by
-setting the variable imenu-generic-expression to this value. Also, see
-the function \\[imenu-example--create-python-index] for an alternate
-way of finding the index.")
-
-;; These next two variables are used when searching for the python
-;; class/definitions. Just saving some time in accessing the
-;; generic-python-expression, really.
-(defvar imenu-example--python-generic-regexp)
-(defvar imenu-example--python-generic-parens)
-
-;;;
-;;; CODE:
-;;;
-
-;; Note:
-;; At first, I tried using some of the functions supplied by
-;; python-mode to navigate through functions and classes, but after a
-;; while, I decided dump it. This file is relatively self contained
-;; and I liked it that.
-
-;;;###autoload
-(defun imenu-example--create-python-index ()
-  "Interface function for imenu package to find all python classes and
-functions/methods. Calls function
-\\[imenu-example--create-python-index-engine]. See that function for
-the details of how this works."
-  (setq imenu-example--python-generic-regexp
-	(car imenu-example--generic-python-expression))
-  (setq imenu-example--python-generic-parens
-	(if imenu-example--python-show-method-args-p
-	    imenu-example--python-method-arg-parens
-	  imenu-example--python-method-no-arg-parens))
-  (goto-char (point-min))
-  (imenu-example--create-python-index-engine nil))
-
-(defun imenu-example--create-python-index-engine (&optional start-indent)
-"Function for finding all definitions (classes, methods, or functions)
-in a python file for the imenu package. 
-
-Retuns a possibly nested alist of the form \(INDEX-NAME
- INDEX-POSITION). The second element of the alist may be an alist,
-producing a nested list as in \(INDEX-NAME . INDEX-ALIST).
-
-This function should not be called directly, as it calls itself
-recursively and requires some setup. Rather this is the engine for the
-function \\[imenu-example--create-python-index].
-
-It works recursively by looking for all definitions at the current
-indention level. When it finds one, it adds it to the alist. If it
-finds a definition at a greater indentation level, it removes the
-previous definition from the alist. In it's place it adds all
-definitions found at the next indentation level. When it finds a
-definition that is less indented then the current level, it retuns the
-alist it has created thus far.
-
- The optional argument START-INDENT indicates the starting indentation
-at which to continue looking for python classes, methods, or
-functions. If this is not supplied, the function uses the indentation
-of the first definition found. "
-  (let ((index-alist '())
-	(sub-method-alist '())
-	looking-p
-	def-name prev-name
-	cur-indent def-pos
-	(class-paren (first  imenu-example--python-generic-parens)) 
-	(def-paren   (second imenu-example--python-generic-parens)))
-    (setq looking-p
-	  (re-search-forward imenu-example--python-generic-regexp
-			     (point-max) t))
-    (while looking-p
-      (save-excursion
-	;; used to set def-name to this value but generic-extract-name is
-	;; new to imenu-1.14. this way it still works with imenu-1.11
-	;;(imenu--generic-extract-name imenu-example--python-generic-parens))
-	(let ((cur-paren (if (match-beginning class-paren)
-			     class-paren def-paren)))
-	  (setq def-name
-		(buffer-substring (match-beginning cur-paren)
-				  (match-end  cur-paren))))
-	(beginning-of-line)
-	(setq cur-indent (current-indentation)))
-
-      ;; HACK: want to go to the correct definition location. Assuming
-      ;; here that there are only two..which is true for python.
-      (setq def-pos
-	    (or  (match-beginning class-paren)
-		 (match-beginning def-paren)))
-
-      ; if we don't have a starting indent level, take this one
-      (or start-indent
-	  (setq start-indent cur-indent))
-
-      ; if we don't have class name yet, take this one
-      (or prev-name
-	  (setq prev-name def-name))
-
-      ;; what level is the next definition on? 
-      ;; must be same, deeper or shallower indentation
-      (cond
-
-       ;; at the same indent level, add it to the list...
-       ((= start-indent cur-indent)
-	(push (cons def-name def-pos) index-alist))
-
-       ;; deeper indented expression, recur...
-       ((< start-indent cur-indent)
-
-	;; the point is currently on the expression we're supposed to
-	;; start on, so go back to the last expression. The recursive
-	;; call will find this place again and add it to the correct
-	;; list
-	(re-search-backward imenu-example--python-generic-regexp
-			    (point-min) 'move)
-	(setq sub-method-alist (imenu-example--create-python-index-engine
-				cur-indent))
-
-	(if sub-method-alist
-	    ;; we put the last element on the index-alist on the start
-	    ;; of the submethod alist so the user can still get to it.
-	    (let ((save-elmt (pop index-alist)))
-	      (push (cons (imenu-create-submenu-name prev-name)
-			  (cons save-elmt sub-method-alist))
-		    index-alist))))
-
-       ;; found less indented expression, we're done.
-       (t 
-	(setq looking-p nil)
-	(re-search-backward imenu-example--python-generic-regexp 
-			    (point-min) t)))
-      (setq prev-name def-name)
-      (and looking-p
-	   (setq looking-p
-		 (re-search-forward imenu-example--python-generic-regexp
-				    (point-max) 'move))))
-    (nreverse index-alist)))
-
-(provide 'pyimenu)
-
-;;; PyImenu.EL ends here
