diff --git a/debuild/Makefile b/debuild/Makefile
index ce66c9885ef0b69a193dfda1651da82e8201fd0b..3895b7d3643579cbf874f2645950f3cbe70046d2 100644
--- a/debuild/Makefile
+++ b/debuild/Makefile
@@ -44,9 +44,9 @@ debdist = purr-data-$(debversion)
 # nw.js sdk
 # NOTE: arm packages need some special-casing, since they are released
 # separately, and the version numbers do not always match up.
-nwjsver = 0.24.4
+nwjsver = 0.28.1
 nwjspkg = nwjs-sdk-v$(nwjsver)-linux
-nwjsver_arm = 0.24.5
+nwjsver_arm = 0.27.6
 nwjspkg_arm = nwjs-sdk-v$(nwjsver_arm)-linux
 nwjs = $(nwjspkg)-ia32.tar.gz $(nwjspkg)-x64.tar.gz $(nwjspkg_arm)-arm.tar.gz
 
diff --git a/debuild/debian/rules b/debuild/debian/rules
index 33fbf0dfa436c44b23aacf68aa5f43cbf3a7ad8f..915afeffa527d8c162dffe56affdf4d068ad8e62 100755
--- a/debuild/debian/rules
+++ b/debuild/debian/rules
@@ -4,12 +4,12 @@
 # Uncomment this to turn on verbose mode.
 #export DH_VERBOSE=1
 
-nwjsver = 0.24.4
+nwjsver = 0.28.1
 nwjspkg = nwjs-sdk-v$(nwjsver)-linux
 
 ifeq ("$(shell dpkg-architecture -qDEB_HOST_ARCH)","armhf")
 arch = arm
-nwjsver = 0.24.5
+nwjsver = 0.27.6
 else ifeq ("$(shell dpkg-architecture -qDEB_HOST_ARCH)","amd64")
 arch = x64
 else
diff --git a/externals/Makefile b/externals/Makefile
index d9d40b227a2e206f55d8694e3441503faa7033a2..7f44b593076c0f710556f92b85819a1dc525d607 100644
--- a/externals/Makefile
+++ b/externals/Makefile
@@ -1876,72 +1876,17 @@ windowing_clean:
 ZEXY_NAME = zexy
 zexy_src := $(externals_src)/$(ZEXY_NAME)
 
-$(zexy_src)/configure: $(zexy_src)/configure.ac
-	cd $(zexy_src) && ./autogen.sh
-
-$(zexy_src)/Makefile: $(zexy_src)/configure $(zexy_src)/Makefile.am $(zexy_src)/src/Makefile.am
-	cd $(zexy_src) && ./configure --disable-library \
-		--with-extension=$(EXTENSION) \
-		--prefix=$(prefix) \
-		--libdir=$(objectsdir) \
-		--with-pd=$(pd_src)
-
 zexy: $(zexy_src)/Makefile
-	$(MAKE) -C $(zexy_src)
+	$(MAKE) -C $(zexy_src) PDINCLUDEDIR=$(pd_src)/src PDBINDIR=$(pd_src)/src
 
 zexy_install: zexy
 	$(MAKE) -C $(zexy_src) DESTDIR=$(DESTDIR) prefix=$(prefix) \
-		libdir=$(objectsdir) pkglibdir=$(objectsdir)/$(ZEXY_NAME) install
-# remove all .la files (libtool archives) created by autotools
-	find $(DESTDIR)$(objectsdir)/$(ZEXY_NAME) -name "*.la" -exec rm {} \;
-	find $(DESTDIR)$(objectsdir)/$(ZEXY_NAME) -name "*.dll.a" -exec rm {} \;
-# add missing aliases
-# can't do these on Windows because FAT, NTFS don't support these chars in filenames
-# on Windows, these are faked in by loading them as libs
-#ifneq ($(OS_NAME),windows)
-#	test -e $(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/..$(EXTENSION) || \
-#		ln -s 0x2e.$(EXTENSION) \
-#			$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/..$(EXTENSION)
-#	test -e '$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/&&~.$(EXTENSION)' || \
-#		ln -s 0x260x26_tilde.$(EXTENSION) \
-#			'$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/&&~.$(EXTENSION)'
-#	test -e '$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/<~.$(EXTENSION)' || \
-#		ln -s 0x3c_tilde.$(EXTENSION) \
-#			'$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/<~.$(EXTENSION)'
-#	test -e '$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/==~.$(EXTENSION)' || \
-#		ln -s 0x3d0x3d_tilde.$(EXTENSION) \
-#			'$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/==~.$(EXTENSION)'
-#	test -e '$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/>~.$(EXTENSION)' || \
-#		ln -s 0x3e_tilde.$(EXTENSION) \
-#			'$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/>~.$(EXTENSION)'
-#	test -e '$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/||~.$(EXTENSION)' || \
-#		ln -s 0x7c0x7c_tilde.$(EXTENSION) \
-#			'$(DESTDIR)$(objectsdir)/$(ZEXY_NAME)/||~.$(EXTENSION)'
-#endif
+		libdir=$(objectsdir) pkglibdir=$(objectsdir) install
 
 zexy_clean:
 	cd $(externals_src)/zexy
 	-$(MAKE) -C $(externals_src)/zexy clean
-	-rm -rf -- $(externals_src)/zexy/autom4te.cache
-	-rm -f -- $(externals_src)/zexy/aclocal.m4
-	-rm -f -- $(externals_src)/zexy/libtool
-	-rm -f -- $(externals_src)/zexy/ltmain.sh
-	-rm -f -- $(externals_src)/zexy/m4/lt*.m4
-	-rm -f -- $(externals_src)/zexy/m4/libtool.m4
-	-rm -f -- $(externals_src)/zexy/configure
 	-rm -f -- $(externals_src)/zexy/src/*.o
-	-rm -f -- $(externals_src)/zexy/Makefile
-	-rm -f -- $(externals_src)/zexy/Makefile.in
-	-rm -f -- $(externals_src)/zexy/*/Makefile
-	-rm -f -- $(externals_src)/zexy/*/Makefile.in
-	-rm -f -- $(externals_src)/zexy/compile
-	-rm -f -- $(externals_src)/zexy/config.*
-	-rm -f -- $(externals_src)/zexy/depcomp
-	-rm -f -- $(externals_src)/zexy/install-sh
-	-rm -f -- $(externals_src)/zexy/missing
-	-rm -f -- $(externals_src)/zexy/stamp-h1
-	-rm -f -- $(externals_src)/zexy/test-driver
-	-rm -f -- $(externals_src)/zexy/*.pd
 
 
 
diff --git a/externals/zexy/AUTHORS b/externals/zexy/AUTHORS
index cd9c307009304bf21484b77ce898052feccb1a94..f259806f9fa52b978a138a662b50dd2b795fb4d1 100644
--- a/externals/zexy/AUTHORS
+++ b/externals/zexy/AUTHORS
@@ -1,4 +1,4 @@
-Copyright 1999-2011 IOhannes m zmoelnig <zmoelnig@iem.at>
+Copyright 1999-2020 IOhannes m zmoelnig <zmoelnig@iem.at>
 
 contributions:
 Copyright 1998-2004 matt wright
@@ -7,6 +7,4 @@ Copyright 1999      guenter geiger
 Copyright 1996-1999 miller s puckette
 Copyright 2005-2006 tim blechmann
 Copyright 2009-2010 franz zotter
-Copyright 1999-2011 zexy-contributors
-
-
+Copyright 1999-2018 zexy-contributors
diff --git a/externals/zexy/BUGS.txt b/externals/zexy/BUGS.txt
deleted file mode 100644
index 39bb06b5c641ef9b6570e6874ae6ef8877f72f23..0000000000000000000000000000000000000000
--- a/externals/zexy/BUGS.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-[drip]
-	- sometimes crashes with small delays
-	. according to the backtrace this should be a memory corruption
-	. (actually the crashing patch was buggy by design and i haven't got a simple bug-patch yet)
-        = UNREPRODUCIBLE
-
-[s2l]
-	- numerically looking sub-symbols are converted wrongly to floats: e.g. "192.168.0.1" -> 192,168
-        + FIXED
diff --git a/externals/zexy/ChangeLog b/externals/zexy/ChangeLog
index dcd448be92e13059438946812084c18df81d4576..40550ee8194cc8405e2bcd3e5910d57eef03ad73 100644
--- a/externals/zexy/ChangeLog
+++ b/externals/zexy/ChangeLog
@@ -1,10 +1,57 @@
+zexy (2.3.0) RELEASED; urgency=medium
+
+  * [msgfile] new formats:
+    - 'csv': import/export of CSV-files (","-separated), with proper escaping
+    - 'fudi': "pd"-like import that handles escaped linebreaks
+    - 'txt': "cr"-like import that handles escaped linebreaks
+  * [lpt] completely new implementation for windows
+  * Bug-fixes
+  * Thin wrappers around class_new/class_addmethod for terser declarations
+  * Re-format entire code-base
+  * Switch to pd-lib-builder (drop all other build-systems)
+  * Switch to cerntralized iem-ci configuration
+  * Fix older ChangeLog entries
+
+ -- IOhannes m zmölnig (Debian/GNU) <umlaeute@debian.org>  Thu, 20 Feb 2020 22:02:20 +0200
+
+zexy (2.2.8) RELEASED; urgency=medium
+
+  * Fix typos (including limiter's "treshold")
+  * Drop support for Pd<0.41
+  * Fix MinGW linking issues with [time]/[date]
+  * Use (const char*) for t_symbol->s_name
+  * Fix line-endings
+  * Continuous Integration
+    * linux/macOS/w32/w64 builds & deken-uploads
+
+ -- IOhannes m zmölnig <zmoelnig@iem.at>  Tue, 2 Oct 2018 21:10:42 +0200
+
+zexy (2.2.7) RELEASED; urgency=medium
+
+  * [multireceive]
+  *  - dynamically calculate proxy names
+  *  - added help-patch
+  * [demultiplex] / [multiplex]
+  *  - use passive inlet instead of "select" method
+  * Turn aliases into proper clases
+    (Closes: https://sourceforge.net/p/pure-data/bugs/929/)
+  * Fix crasher bug with "dsp" methods
+  * Minor and major Bug-fixes
+  * Properly initialize variables
+  * More tests
+  * Fix typos
+  * Add CI-configuration
+  * Don't include repository-settings in release-tarballs
+
+ -- IOhannes m zmölnig <zmoelnig@iem.at>  Sun, 21 Jan 2018 22:55:11 +0100
+
 zexy (2.2.6) RELEASED; urgency=low
 
-  * Fixes NULL-pointer access and file handle leaks
-  * Fixes for autotools
+  * Fix NULL-pointer access and file handle leaks
+  * Fix for autotools
   * Allow to build both single-object and multiobject binaries in one go
     (just use "--enable-library=both")
-  * Allow  setting the build-date string via autoconf-args
+  * Allow setting the build-date string via autoconf-args
   * Consistency fixes for objects.
 
   * Switched to git
@@ -13,17 +60,17 @@ zexy (2.2.6) RELEASED; urgency=low
 
 zexy (2.2.5) RELEASED; urgency=low
 
-  * switched to autotools
-  * generate ChangeLog with "dch -c ChangeLog"
+  * Switch to autotools
+  * Generate ChangeLog with "dch -c ChangeLog"
 
  -- IOhannes m zmoelnig (gpg-key at iem) <zmoelnig@iem.at>  Thu, 29 Sep 2011 14:19:18 +0200
 
 zexy (2.2.4) RELEASED; urgency=low
 
-  * disable SIMD code by default (prevent crashes)
+  * Disable SIMD code by default (prevent crashes)
   * [msgfile] does not crash with [add2( on an emtpy buffer
   * [pack]/[unpack] now accept all messages (like their vanilla counterparts)
   * [limiter~] on-the-fly oversampling parameters (higher precision)
-  * all code is now UTF-8
+  * All code is now UTF-8
 
  -- IOhannes m zmoelnig (gpg-key at iem) <zmoelnig@iem.at>  Wed, 26 Sep 2011 21:20:20 +0200
diff --git a/externals/zexy/INSTALL b/externals/zexy/INSTALL
deleted file mode 100644
index 7d1c323beae76333f523f6df31c47a87f5597edb..0000000000000000000000000000000000000000
--- a/externals/zexy/INSTALL
+++ /dev/null
@@ -1,365 +0,0 @@
-Installation Instructions
-*************************
-
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
-
-   Copying and distribution of this file, with or without modification,
-are permitted in any medium without royalty provided the copyright
-notice and this notice are preserved.  This file is offered as-is,
-without warranty of any kind.
-
-Basic Installation
-==================
-
-   Briefly, the shell commands `./configure; make; make install' should
-configure, build, and install this package.  The following
-more-detailed instructions are generic; see the `README' file for
-instructions specific to this package.  Some packages provide this
-`INSTALL' file but do not implement all of the features documented
-below.  The lack of an optional feature in a given package is not
-necessarily a bug.  More recommendations for GNU packages can be found
-in *note Makefile Conventions: (standards)Makefile Conventions.
-
-   The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation.  It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions.  Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, and a
-file `config.log' containing compiler output (useful mainly for
-debugging `configure').
-
-   It can also use an optional file (typically called `config.cache'
-and enabled with `--cache-file=config.cache' or simply `-C') that saves
-the results of its tests to speed up reconfiguring.  Caching is
-disabled by default to prevent problems with accidental use of stale
-cache files.
-
-   If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release.  If you are using the cache, and at
-some point `config.cache' contains results you don't want to keep, you
-may remove or edit it.
-
-   The file `configure.ac' (or `configure.in') is used to create
-`configure' by a program called `autoconf'.  You need `configure.ac' if
-you want to change it or regenerate `configure' using a newer version
-of `autoconf'.
-
-   The simplest way to compile this package is:
-
-  1. `cd' to the directory containing the package's source code and type
-     `./configure' to configure the package for your system.
-
-     Running `configure' might take a while.  While running, it prints
-     some messages telling which features it is checking for.
-
-  2. Type `make' to compile the package.
-
-  3. Optionally, type `make check' to run any self-tests that come with
-     the package, generally using the just-built uninstalled binaries.
-
-  4. Type `make install' to install the programs and any data files and
-     documentation.  When installing into a prefix owned by root, it is
-     recommended that the package be configured and built as a regular
-     user, and only the `make install' phase executed with root
-     privileges.
-
-  5. Optionally, type `make installcheck' to repeat any self-tests, but
-     this time using the binaries in their final installed location.
-     This target does not install anything.  Running this target as a
-     regular user, particularly if the prior `make install' required
-     root privileges, verifies that the installation completed
-     correctly.
-
-  6. You can remove the program binaries and object files from the
-     source code directory by typing `make clean'.  To also remove the
-     files that `configure' created (so you can compile the package for
-     a different kind of computer), type `make distclean'.  There is
-     also a `make maintainer-clean' target, but that is intended mainly
-     for the package's developers.  If you use it, you may have to get
-     all sorts of other programs in order to regenerate files that came
-     with the distribution.
-
-  7. Often, you can also type `make uninstall' to remove the installed
-     files again.  In practice, not all packages have tested that
-     uninstallation works correctly, even though it is required by the
-     GNU Coding Standards.
-
-  8. Some packages, particularly those that use Automake, provide `make
-     distcheck', which can by used by developers to test that all other
-     targets like `make install' and `make uninstall' work correctly.
-     This target is generally not run by end users.
-
-Compilers and Options
-=====================
-
-   Some systems require unusual options for compilation or linking that
-the `configure' script does not know about.  Run `./configure --help'
-for details on some of the pertinent environment variables.
-
-   You can give `configure' initial values for configuration parameters
-by setting variables in the command line or in the environment.  Here
-is an example:
-
-     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
-
-   *Note Defining Variables::, for more details.
-
-Compiling For Multiple Architectures
-====================================
-
-   You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory.  To do this, you can use GNU `make'.  `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.  This
-is known as a "VPATH" build.
-
-   With a non-GNU `make', it is safer to compile the package for one
-architecture at a time in the source code directory.  After you have
-installed the package for one architecture, use `make distclean' before
-reconfiguring for another architecture.
-
-   On MacOS X 10.5 and later systems, you can create libraries and
-executables that work on multiple system types--known as "fat" or
-"universal" binaries--by specifying multiple `-arch' options to the
-compiler but only a single `-arch' option to the preprocessor.  Like
-this:
-
-     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
-                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
-                 CPP="gcc -E" CXXCPP="g++ -E"
-
-   This is not guaranteed to produce working output in all cases, you
-may have to build one architecture at a time and combine the results
-using the `lipo' tool if you have problems.
-
-Installation Names
-==================
-
-   By default, `make install' installs the package's commands under
-`/usr/local/bin', include files under `/usr/local/include', etc.  You
-can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX', where PREFIX must be an
-absolute file name.
-
-   You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files.  If you
-pass the option `--exec-prefix=PREFIX' to `configure', the package uses
-PREFIX as the prefix for installing programs and libraries.
-Documentation and other data files still use the regular prefix.
-
-   In addition, if you use an unusual directory layout you can give
-options like `--bindir=DIR' to specify different values for particular
-kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.  In general, the
-default for these options is expressed in terms of `${prefix}', so that
-specifying just `--prefix' will affect all of the other directory
-specifications that were not explicitly provided.
-
-   The most portable way to affect installation locations is to pass the
-correct locations to `configure'; however, many packages provide one or
-both of the following shortcuts of passing variable assignments to the
-`make install' command line to change installation locations without
-having to reconfigure or recompile.
-
-   The first method involves providing an override variable for each
-affected directory.  For example, `make install
-prefix=/alternate/directory' will choose an alternate location for all
-directory configuration variables that were expressed in terms of
-`${prefix}'.  Any directories that were specified during `configure',
-but not in terms of `${prefix}', must each be overridden at install
-time for the entire installation to be relocated.  The approach of
-makefile variable overrides for each directory variable is required by
-the GNU Coding Standards, and ideally causes no recompilation.
-However, some platforms have known limitations with the semantics of
-shared libraries that end up requiring recompilation when using this
-method, particularly noticeable in packages that use GNU Libtool.
-
-   The second method involves providing the `DESTDIR' variable.  For
-example, `make install DESTDIR=/alternate/directory' will prepend
-`/alternate/directory' before all installation names.  The approach of
-`DESTDIR' overrides is not required by the GNU Coding Standards, and
-does not work on platforms that have drive letters.  On the other hand,
-it does better at avoiding recompilation issues, and works well even
-when some directory options were not specified in terms of `${prefix}'
-at `configure' time.
-
-Optional Features
-=================
-
-   If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-   Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System).  The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
-   For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-   Some packages offer the ability to configure how verbose the
-execution of `make' will be.  For these packages, running `./configure
---enable-silent-rules' sets the default to minimal output, which can be
-overridden with `make V=1'; while running `./configure
---disable-silent-rules' sets the default to verbose, which can be
-overridden with `make V=0'.
-
-Particular systems
-==================
-
-   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU
-CC is not installed, it is recommended to use the following options in
-order to use an ANSI C compiler:
-
-     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
-
-and if that doesn't work, install pre-built binaries of GCC for HP-UX.
-
-   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
-parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
-a workaround.  If GNU CC is not installed, it is therefore recommended
-to try
-
-     ./configure CC="cc"
-
-and if that doesn't work, try
-
-     ./configure CC="cc -nodtk"
-
-   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This
-directory contains several dysfunctional programs; working variants of
-these programs are available in `/usr/bin'.  So, if you need `/usr/ucb'
-in your `PATH', put it _after_ `/usr/bin'.
-
-   On Haiku, software installed for all users goes in `/boot/common',
-not `/usr/local'.  It is recommended to use the following options:
-
-     ./configure --prefix=/boot/common
-
-Specifying the System Type
-==========================
-
-   There may be some features `configure' cannot figure out
-automatically, but needs to determine by the type of machine the package
-will run on.  Usually, assuming the package is built to be run on the
-_same_ architectures, `configure' can figure that out, but if it prints
-a message saying it cannot guess the machine type, give it the
-`--build=TYPE' option.  TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name which has the form:
-
-     CPU-COMPANY-SYSTEM
-
-where SYSTEM can have one of these forms:
-
-     OS
-     KERNEL-OS
-
-   See the file `config.sub' for the possible values of each field.  If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the machine type.
-
-   If you are _building_ compiler tools for cross-compiling, you should
-use the option `--target=TYPE' to select the type of system they will
-produce code for.
-
-   If you want to _use_ a cross compiler, that generates code for a
-platform different from the build platform, you should specify the
-"host" platform (i.e., that on which the generated programs will
-eventually be run) with `--host=TYPE'.
-
-Sharing Defaults
-================
-
-   If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists.  Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Defining Variables
-==================
-
-   Variables not defined in a site shell script can be set in the
-environment passed to `configure'.  However, some packages may run
-configure again during the build, and the customized values of these
-variables may be lost.  In order to avoid this problem, you should set
-them in the `configure' command line, using `VAR=value'.  For example:
-
-     ./configure CC=/usr/local2/bin/gcc
-
-causes the specified `gcc' to be used as the C compiler (unless it is
-overridden in the site shell script).
-
-Unfortunately, this technique does not work for `CONFIG_SHELL' due to
-an Autoconf bug.  Until the bug is fixed you can use this workaround:
-
-     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
-
-`configure' Invocation
-======================
-
-   `configure' recognizes the following options to control how it
-operates.
-
-`--help'
-`-h'
-     Print a summary of all of the options to `configure', and exit.
-
-`--help=short'
-`--help=recursive'
-     Print a summary of the options unique to this package's
-     `configure', and exit.  The `short' variant lists options used
-     only in the top level, while the `recursive' variant lists options
-     also present in any nested packages.
-
-`--version'
-`-V'
-     Print the version of Autoconf used to generate the `configure'
-     script, and exit.
-
-`--cache-file=FILE'
-     Enable the cache: use and save the results of the tests in FILE,
-     traditionally `config.cache'.  FILE defaults to `/dev/null' to
-     disable caching.
-
-`--config-cache'
-`-C'
-     Alias for `--cache-file=config.cache'.
-
-`--quiet'
-`--silent'
-`-q'
-     Do not print messages saying which checks are being made.  To
-     suppress all normal output, redirect it to `/dev/null' (any error
-     messages will still be shown).
-
-`--srcdir=DIR'
-     Look for the package's source code in directory DIR.  Usually
-     `configure' can determine that directory automatically.
-
-`--prefix=DIR'
-     Use DIR as the installation prefix.  *note Installation Names::
-     for more details, including other options available for fine-tuning
-     the installation locations.
-
-`--no-create'
-`-n'
-     Run the configure checks, but stop before creating any output
-     files.
-
-`configure' also accepts some other, not widely useful, options.  Run
-`configure --help' for more details.
-
diff --git a/externals/zexy/Makefile b/externals/zexy/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..3e29c0d66b94d619345d8fa87e02689e70de45ff
--- /dev/null
+++ b/externals/zexy/Makefile
@@ -0,0 +1,226 @@
+# Makefile to build 'zexy' for Pure Data.
+# Needs Makefile.pdlibbuilder as helper makefile for platform-dependent build
+# settings and rules.
+
+# library name
+lib.name = zexy
+
+
+make-lib-executable=yes
+with-regex=yes
+with-lpt=yes
+
+# input source file (class name == source file basename)
+class.sources = \
+	src/0x260x260x7e.c \
+	src/0x2e.c \
+	src/0x3c0x7e.c \
+	src/0x3d0x3d0x7e.c \
+	src/0x3e0x7e.c \
+	src/0x7c0x7c0x7e.c \
+	src/a2l.c \
+	src/abs~.c \
+	src/absgn~.c \
+	src/atof.c \
+	src/atoi.c \
+	src/avg~.c \
+	src/blockmirror~.c \
+	src/blockshuffle~.c \
+	src/blockswap~.c \
+	src/date.c \
+	src/demultiplex~.c \
+	src/demultiplex.c \
+	src/dfreq~.c \
+	src/dirac~.c \
+	src/doublepole~.c \
+	src/drip.c \
+	src/envrms~.c \
+	src/fifop.c \
+	src/freadln.c \
+	src/fwriteln.c \
+	src/glue.c \
+	src/index.c \
+	src/length.c \
+	src/lifop.c \
+	src/limiter~.c \
+	src/list2int.c \
+	src/list2lists.c \
+	src/list2symbol.c \
+	src/lister.c \
+	src/listfind.c \
+	src/liststorage.c \
+	src/longload.c \
+	src/lpt.c \
+	src/makesymbol.c \
+	src/matchbox.c \
+	src/mavg.c \
+	src/minmax.c \
+	src/msgfile.c \
+	src/multiline~.c \
+	src/multiplex~.c \
+	src/multiplex.c \
+	src/multireceive.c \
+	src/niagara.c \
+	src/noish~.c \
+	src/noisi~.c \
+	src/operating_system.c \
+	src/pack~.c \
+	src/pack.c \
+	src/packel.c \
+	src/pdf~.c \
+	src/prime.c \
+	src/quantize~.c \
+	src/rawprint.c \
+	src/regex.c \
+	src/relay.c \
+	src/repack.c \
+	src/repeat.c \
+	src/route~.c \
+	src/sfplay.c \
+	src/sfrecord.c \
+	src/sgn~.c \
+	src/sigzero~.c \
+	src/sleepgrain.c \
+	src/sort.c \
+	src/step~.c \
+	src/strcmp.c \
+	src/sum.c \
+	src/swap~.c \
+	src/symbol2list.c \
+	src/tabdump.c \
+	src/tabminmax.c \
+	src/tabread4~~.c \
+	src/tabset.c \
+	src/tavg~.c \
+	src/time.c \
+	src/unpack~.c \
+	src/unpack.c \
+	src/urn.c \
+	src/wrap.c \
+	src/z~.c \
+	$(empty)
+
+lib.setup.sources = \
+	src/zexy.c \
+	src/z_zexy.c \
+	$(empty)
+
+## TODO: install help-files for these aliases
+l.class.sources = src/lister.c
+demux~.class.sources = src/demultiplex~.c
+demux.class.sources = src/demultiplex.c
+mux~.class.sources = src/multiplex~.c
+mux.class.sources = src/multiplex.c
+l2s.class.sources = src/list2symbol.c
+s2l.class.sources = src/symbol2list.c
+l2i.class.sources = src/list2int.c
+any2list.class.sources = src/a2l.c
+
+# abs-aliases: any2list, l2i
+
+# all extra files to be included in binary distribution of the library
+datafiles = \
+	AUTHORS \
+	README.txt \
+	LICENSE.txt \
+	ChangeLog \
+	zexy-meta.pd \
+	$(empty)
+
+datafiles += \
+	$(wildcard abs/*.pd) \
+	$(wildcard reference/*.pd) \
+	$(empty)
+
+cflags = -DVERSION='"$(lib.version)"'
+
+DATE_FMT = %Y/%m/%d at %H:%M:%S UTC
+ifdef SOURCE_DATE_EPOCH
+    BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u "+$(DATE_FMT)")
+endif
+ifdef BUILD_DATE
+cflags += -DBUILD_DATE='"$(BUILD_DATE)"'
+endif
+
+
+ifeq ($(make-lib-executable),yes)
+ cflags += -DZEXY_LIBRARY
+endif
+
+ifeq ($(with-regex),yes)
+ cflags += -DHAVE_REGEX_H
+endif
+
+ifneq ($(with-lpt),yes)
+ cflags += -DZ_WANT_LPT=0
+endif
+
+define forWindows
+ ifeq ($(with-regex),yes)
+   regex.class.ldlibs += -lregex
+   matchbox.class.ldlibs += -lregex
+   ifeq ($(make-lib-executable),yes)
+     ldlibs += -lregex
+   endif
+ endif
+endef
+
+define forLinux
+ # on linux we need <sys/io.h> for the [lpt] object, so check if it is there...
+ ifeq ($(with-lpt),yes)
+  ifeq ($(shell $(CPP) -x c -include "sys/io.h" /dev/null >/dev/null 2>&1 || echo no), no)
+    cflags += -DZ_WANT_LPT=0
+  endif
+ endif
+endef
+
+
+
+# include Makefile.pdlibbuilder from submodule directory 'pd-lib-builder'
+PDLIBBUILDER_DIR=pd-lib-builder/
+include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder
+
+COPY=cp
+# aliases
+vpath %.pd abs reference
+zexyaliases = \
+	any2list.pd any2list-help.pd \
+	demux-help.pd demux~-help.pd \
+	mux-help.pd mux~-help.pd \
+	l2i.pd l2i-help.pd \
+	l2s-help.pd s2l-help.pd l-help.pd \
+	$(empty)
+datafiles += $(zexyaliases)
+
+# create aliases
+$(zexyaliases):
+	test -e $< && $(COPY) $< $@
+
+# delete aliases
+.PHONY: clean_zexyalias
+clean_zexyalias:
+	-rm -f $(zexyaliases)
+clean: clean_zexyalias
+
+# alias dependencies
+any2list.pd: a2l.pd
+any2list-help.pd: a2l-help.pd
+l2i.pd: list2int.pd
+l2i-help.pd: list2int-help.pd
+l2s-help.pd: list2symbol-help.pd
+s2l-help.pd: symbol2list-help.pd
+l-help.pd: lister-help.pd
+mux-help.pd: multiplex-help.pd
+mux~-help.pd: multiplex~-help.pd
+demux-help.pd: demultiplex-help.pd
+demux~-help.pd: demultiplex~-help.pd
+
+all: $(zexyaliases)
+
+.PHONY: check style
+
+style:
+	astyle --options=src/astyle.rc src/*.c src/*.h
+
+check: all
+	LIBDIR=$(CURDIR) find tests/*/ -type f -name "*.pd" -exec tests/testrunner.sh -v -Xls {} "+"
diff --git a/externals/zexy/Makefile.am b/externals/zexy/Makefile.am
deleted file mode 100644
index 09dfe56a5ef2b8f40464b73b163848d0f8943409..0000000000000000000000000000000000000000
--- a/externals/zexy/Makefile.am
+++ /dev/null
@@ -1,18 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-ACLOCAL_AMFLAGS = -I m4
-
-SUBDIRS = src abs reference
-SUBDIRS += tests build
-
-zexydir=$(pkglibdir)
-dist_zexy_DATA = \
-	AUTHORS \
-	README.txt \
-	INSTALL \
-	LICENSE.txt \
-	ChangeLog \
-	zexy-meta.pd
-
-LIBTOOL_DEPS = @LIBTOOL_DEPS@
-libtool: $(LIBTOOL_DEPS)
-	$(SHELL) ./config.status libtool
diff --git a/externals/zexy/README.txt b/externals/zexy/README.txt
index e337790675aa0bb197f7957dc98705c3f43f728a..3c237d208a0c2b5071150d82033f4b0a60bcd37b 100644
--- a/externals/zexy/README.txt
+++ b/externals/zexy/README.txt
@@ -1,134 +1,78 @@
-==============================================================================
-the zexy external
-==============================================================================
-
-outline of this file::
-==============================================================================
- +  general
- +  installation
-   +  linux, irix, OSX,... (autoconf)
-   +  w32
- +  using
- +  license
-
-
-general::
-==============================================================================
-the zexy external is a collection of externals for miller.s.puckette's 
-realtime-computermusic-environment called "puredata" (or abbreviated "pd")
-this zexy external will be of no use, if you don't have a running version of 
-pd on your system.
-check out for http://pd.iem.at to learn more about pd and how to get it 
-
-note: the zexy external is published under the Gnu General Public License 
-that is included (GnuGPL.txt). some parts of the code are taken directly 
-from the pd source-code, they, of course, fall under the license pd is 
-published under.
-
-
-
-installation::
-==============================================================================
-
-linux, irix, osx, mingw,... :
-------------------------------------------------------------------------------
-see INSTALL for more detailed instructions
-
-#0> ./autogen.sh
-#1> ./configure
-#2> make
-#3> make install
-
-installation directory:
-by defaultm zexy will install into /usr/local/lib/pd/extra/zexy
-the path can be changed via the "--prefix", or "--libdir"
-e.g. "./configure --prefix=/usr" -> /usr/lib/pd/extra/zexy
-e.g. "./configure --libdir=/tmp/foo" -> /tmp/foo/zexy
-
-puredata headers:
-zexy needs to find the Pd headers (and Pd.lib on some systems) during the build
-process.
-if you have installed the headers in a non-standard location, you can specify
-them with the "--with-pd" option:
-"./configure --with-pd=/usr/include/pd" will add /usr/include/pd to the INCLUDE
-path.
-"./configure --with-pd=/home/me/src/Pd-0.43.1" can be used to add
-/home/me/src/Pd-0.43.1/src to the INCLUDEs and /home/me/src/Pd-0.43.1/bin to the
-library search path
-
-custom external extension:
-zexy does it's best to determine the correct external extension for your system.
-e.g. it will use "dll" on w32, or "pd_linux" on linux.
-if - for whatever obscure reasons - you want to force the extension to certain
-value, you can use the "--with-extension" flag:
-"./configure --with-extension=l_ia64" will use "l_ia64" for the resulting
-binaries
-
-SSE2 (SIMD):
-by default zexy is compiled without SIMD optimization (recently there have been
-reports about crashes, when SSE2 was enabled; until this is fixed, the default
-is to use the safe fallback)
-if you want to enable SSE2 optimization, configure with
-"./configure --enable-simd=SSE2"
-
-multi-object vs single-object libraries:
-by default, zexy builds a single library "zexy" that contains all objects.
-if - for some obscure reason - you insist on having a lot of small libraries
-each containing a single object, you can enable this by using the
-"--disable-library" flag
-
-parallel port support:
-if you don't want the parallel-port object [lpt] you can disable it with
-	"--disable-lpt"
- (e.g.: because you don't have a parallel-port)
-
-
-fat (multiarch) binaries:
-for building multi-arch binaries (currently only supported on OSX), specify the
-wanted architectures in the "--enable-fat-binary" flag
-e.g. "./configure --enable-fat-binary=i386,ppc --with-extension=d_fat"
-
-win32 :
-------------------------------------------------------------------------------
-
-to compile: 
- + w/ MSVC use the build project found in build/win-vs*/
- OR
- + with GCC configure your pd path, eg:
-	#> ./configure --prefix=/c/program/pd; make; make install
- OR
- + cross-compilation for windows on linux using mingw (assumes that the 
-   crosscompiler is "i586-mingw32msvc-cc")
-	#> ./configure --host=i586-mingw32msvc --with-extension=dll \
-	   --disable-PIC --with-pd=/path/to/win/pd/
-	#> make CFLAGS="-fno-unit-at-a-time"
-     notes: configure tries to set the CFLAGS to "-g -O2" if the compiler
-            accepts this; however, this optimization sometimes generates 
-	    binaries that cannot be loaded by pd; it seems that disabling
-	    the "unit-at-a-time" optimization (which gets enabled by "-O2")
-	    is the cause of this problem. turning it off might help
-
-making pd run with the zexy external::
-==============================================================================
-make sure, that pd will be looking at this location 
-(add "-path <mypath>/pd/externs" either to your .pdrc or each time 
-you execute pd)
-make sure, that you somehow load the zexy external (either add "-lib zexy" 
-(if you advised pd somehow to look at the correct place) 
-or "-lib <myzexypath>/zexy" to your startup-script (.pdrc or whatever) 
-or load it via the object "zexy" at runtime
-
-license::
-==============================================================================
-    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 of the License, 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.
-
-    You should have received a copy of the GNU General Public License along
-    with this program.  If not, see <http://www.gnu.org/licenses/>.
+==============================================================================
+the zexy external
+==============================================================================
+
+outline of this file::
+==============================================================================
+ +  general
+ +  using
+ +  bugs
+ +  compilation/installation
+ +  license
+
+
+general::
+==============================================================================
+the zexy external is a collection of externals for miller.s.puckette's
+realtime-computermusic-environment called "pure data" (or abbreviated "pd")
+this zexy external will be of no use, if you don't have a running version of
+pd on your system.
+check out for http://pd.iem.at to learn more about pd and how to get it
+
+note: the zexy external is published under the GNU General Public License
+that is included (LICENSE.txt). some parts of the code are taken directly
+from the pd source-code, they, of course, fall under the license pd is
+published under.
+
+making pd run with the zexy external::
+==============================================================================
+make sure, that pd will be looking at the location you installed zexy to.
+ideally install zexy to some place, where pd already searches for libraries,
+e.g. "~/.local/lib/pd/extra/" (linux), "~/Library/Pd/extra/" (macOS) or
+"%AppData%\Pd\extra\" (Windows).
+if this is not an option, either add the path to your "Path..." settings in pd,
+or start pd with the cmdline option "-path /path/where/zexy/lives" (you can omit
+the trailing "/zexy" component of the path)
+
+make sure, that you somehow load the zexy external, either by adding "zexy" to
+the "Startup..." libraries (or by starting pd with "-lib zexy"), or (and this is
+the preferred method) by adding something like the following to your patches:
+
+    [declare -path zexy -lib zexy]
+
+
+bugs::
+==============================================================================
+if you happen to find any bugs, please report them at
+   https://git.iem.at/pd/zexy
+
+
+installation::
+==============================================================================
+
+linux, irix, osx, mingw,... :
+------------------------------------------------------------------------------
+
+you will need to have Pd installed, and a C-compiler (preferably gcc)
+as well as a GNUmake compatible implementation of 'make'.
+
+on windows, you also need MSYS2/MinGW installed.
+
+#1> make
+#2> make install
+
+
+license::
+==============================================================================
+    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 of the License, 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.
+
+    You should have received a copy of the GNU General Public License along
+    with this program.  If not, see <http://www.gnu.org/licenses/>.
diff --git a/externals/zexy/abs/Makefile.am b/externals/zexy/abs/Makefile.am
deleted file mode 100644
index 2a009ae553dda266838bf9e8ce9f11e3b1944e2c..0000000000000000000000000000000000000000
--- a/externals/zexy/abs/Makefile.am
+++ /dev/null
@@ -1,79 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-
-SUFFIXES = .pd
-
-zexydir=$(pkglibdir)
-
-dist_zexy_DATA= \
-	0x260x260x7e.pd \
-	0x3c0x7e-help.pd \
-	0x3c0x7e.pd \
-	0x3d0x3d0x7e.pd \
-	0x3e0x7e-help.pd \
-	0x3e0x7e.pd \
-	0x7c0x7c0x7e-help.pd \
-	0x7c0x7c0x7e.pd \
-	a2l.pd \
-	absgn~-help.pd \
-	absgn~.pd \
-	abs~-help.pd \
-	abs~.pd \
-	cart2pol-help.pd \
-	cart2pol.pd \
-	cart2sph-help.pd \
-	cart2sph.pd \
-	deg2rad-help.pd \
-	deg2rad.pd \
-	==~-help.pd \
-	&&~-help.pd \
-	length.pd \
-	list2int.pd \
-	mavg.pd \
-	mean-help.pd \
-	mean.pd \
-	minmax.pd \
-	nop~-help.pd \
-	nop-help.pd \
-	nop~.pd \
-	nop.pd \
-	pol2cart-help.pd \
-	pol2cart.pd \
-	pol2sph-help.pd \
-	pol2sph.pd \
-	polyfun-help.pd \
-	polyfun.pd \
-	rad2deg-help.pd \
-	rad2deg.pd \
-	repack.pd \
-	segregate-help.pd \
-	segregate.pd \
-	sgn~-help.pd \
-	sgn~.pd \
-	sph2cart-help.pd \
-	sph2cart.pd \
-	sph2pol-help.pd \
-	sph2pol.pd \
-	sum.pd \
-	tabset.pd \
-	uniqsym-help.pd \
-	uniqsym.pd
-#############
-# symlinks for aliases
-zexyaliasdir=$(pkglibdir)
-
-clean-local: clean_zexyalias
-.PHONY: clean_zexyalias
-
-dist_zexyalias_DATA = any2list.pd l2i.pd
-
-# create aliases
-$(dist_zexyalias_DATA):
-	test -e $< && $(LN_S) $< $@
-
-# delete aliases
-clean_zexyalias:
-	-rm -f $(dist_zexyalias_DATA)
-
-# define aliases
-any2list.pd: a2l.pd
-l2i.pd: list2int.pd
diff --git a/externals/zexy/autogen.sh b/externals/zexy/autogen.sh
deleted file mode 100755
index e0fbad4cd9f36916dfc9ef9931db6706aca332cc..0000000000000000000000000000000000000000
--- a/externals/zexy/autogen.sh
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/bin/sh
-
-package=zexy
-
-
-KERN=$(uname -s)
-case "${KERN}" in
- Darwin)
-   PATH=/sw/bin:${PATH}
-   ;;
- *)
-  ;;
-esac
-
-echo PATH: $PATH
-
-
-AUTORECONF=$(which autoreconf)
-
-AUTOHEADER=$(which autoheader)
-AUTOMAKE=$(which automake)
-ACLOCAL=$(which aclocal)
-LIBTOOL=$(which libtool)
-LIBTOOLIZE=$(which libtoolize)
-AUTOCONF=$(which autoconf)
-
-case "${KERN}" in
- MINGW*)
-   AUTORECONF=""
-   ;;
- *)
-  ;;
-esac
-
-
-#check whether the system supports pushd/popd
-if pushd . > /dev/null 2>&1
-then
- popd > /dev/null 2>&1
-else
-## some shells (namely dash) don't support pushd/popd
-## here we provide some dummies
-pushd () {
- echo "ignoring pushd to $@"
-}
-
-popd () {
- echo "ignoring popd ..."
-}
-fi
-
-
-autoconf_getsubdirs () {
- if [ -e configure.ac ]; then
- cat configure.ac | sed -e 's|#.*$||' | grep AC_CONFIG_SUBDIRS | \
-	sed -e 's|^.*AC_CONFIG_SUBDIRS(\[\(.*\)\]).*$|\1|'
- fi
-}
-
-runit () {
-echo "  $@"
-$@
-}
-
-manual_autoreconf_doit () {
- echo faking autoreconf for $1
- pushd $1
-
-  runit $ACLOCAL -I . -I $BASEDIR/m4 || exit 1
-
-  runit $LIBTOOLIZE --automake -c || exit 1
-
-  runit $AUTOCONF || exit 1
-
-  if test -e configure.ac && grep AC_CONFIG_HEADER configure.ac > /dev/null 2>&1; then
-   runit $AUTOHEADER --force || exit 1
-  fi
-
-  if [ -e Makefile.am ]; then
-   runit $AUTOMAKE --add-missing -c || exit 1
-  fi
- popd
-}
-
-manual_autoreconf () {
- echo faking autoreconf..
- BASEDIR=${0%/*}
- pushd $BASEDIR
- BASEDIR=$(pwd)
- popd
-
- if [ "x${SUBDIRS}" = "x" ]; then
-  #SUBDIRS=autoconf_getsubdirs
-
-  SUBDIRS="."
- fi
-
-
-# check for all the needed helpers
- DIE=0
-($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || {
-        echo
-        echo "You must have autoconf installed to compile $package."
-        echo "Download the appropriate package for your distribution,"
-        echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
-        DIE=1
-}
-
-($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
-        echo
-        echo "You must have automake installed to compile $package."
-        echo "Download the appropriate package for your system,"
-        echo "or get the source from one of the GNU ftp sites"
-        echo "listed in http://www.gnu.org/order/ftp.html"
-        DIE=1
-}
-
-($ACLOCAL --version) < /dev/null > /dev/null 2>&1 || {
-        echo
-        echo "You must have aclocal installed to compile $package."
-        echo "Download the appropriate package for your system,"
-        echo "or get the source from one of the GNU ftp sites"
-        echo "listed in http://www.gnu.org/order/ftp.html"
-        DIE=1
-}
-
-($LIBTOOL --version) < /dev/null > /dev/null 2>&1 || {
-        echo
-        echo "You must have libtool installed to compile $package."
-        echo "Download the appropriate package for your system,"
-        echo "or get the source from one of the GNU ftp sites"
-        echo "listed in http://www.gnu.org/order/ftp.html"
-        DIE=1
-}
-($LIBTOOLIZE --version) < /dev/null > /dev/null 2>&1 || {
-        echo
-        echo "You must have libtoolize installed to compile $package."
-        echo "Download the appropriate package for your system,"
-        echo "or get the source from one of the GNU ftp sites"
-        echo "listed in http://www.gnu.org/order/ftp.html"
-        DIE=1
-}
-
-if test "$DIE" -eq 1; then
-        exit 1
-fi
-
-for s in ${SUBDIRS}; do
- manual_autoreconf_doit ${BASEDIR}/${s}
-done
-}
-
-
-if test x$AUTORECONF != x; then
-  echo running autoreconf ${AUTORECONF}
-  $AUTORECONF --force --verbose --install 
-else
-  echo not running autoreconf...
-  manual_autoreconf
-fi
diff --git a/externals/zexy/build/Makefile.am b/externals/zexy/build/Makefile.am
deleted file mode 100644
index 364b98bf0ca745560dda19335e27aec88995f615..0000000000000000000000000000000000000000
--- a/externals/zexy/build/Makefile.am
+++ /dev/null
@@ -1,24 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-
-EXTRA_DIST = \
-	autoconf/README.txt \
-	README.txt \
-	win-vs2003/zexy.sln \
-	win-vs2003/zexy.vcproj \
-	win-vs2008/zexy.sln \
-	win-vs2008/zexy.vcproj \
-	win-vs6/zexy.dsp \
-	win-vs6/zexy.dsw \
-	win-vs7.10/zexy.sln \
-	win-vs7.10/zexy.vcproj \
-	autoconf/README.txt \
-	Makefile.am \
-	README.txt \
-	win-vs2003/zexy.sln \
-	win-vs2003/zexy.vcproj \
-	win-vs2008/zexy.sln \
-	win-vs2008/zexy.vcproj \
-	win-vs6/zexy.dsp \
-	win-vs6/zexy.dsw \
-	win-vs7.10/zexy.sln \
-	win-vs7.10/zexy.vcproj
diff --git a/externals/zexy/build/README.txt b/externals/zexy/build/README.txt
deleted file mode 100644
index fe4cd285da091e57438057a4a7aa06562b4a15c7..0000000000000000000000000000000000000000
--- a/externals/zexy/build/README.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-build-instructions for zexy
-===========================
-
-
-autoconf/make
-=============
-this is the preferred way to build zexy, if your system supports autoconf/make. 
-such systems include:
-- linux / gcc
-- os-x / gcc
-- windows / mingw
-- windows / cygwin
-- freebsd
-- ...
-
-just go into the zexy/src/ directory, and run
- % make
-or alternatively:
- % aclocal
- % autoconf
- % ./configure
- % make
-
-use
- % ./configure --help
-to see flags you can pass to configure to get special builds
-
-
-
-
-Microsoft Visual Studio
-=======================
-use the provided project-files in the directories
-win-nmake: for nmake based builds
-win-vs6: for Microsoft VisualStudio 6
-win-vs2003: for Microsoft VisualStudio .NET 2003
diff --git a/externals/zexy/build/autoconf/README.txt b/externals/zexy/build/autoconf/README.txt
deleted file mode 100644
index 304f93111f6e619b40e5643db950dbab14d59893..0000000000000000000000000000000000000000
--- a/externals/zexy/build/autoconf/README.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-the build/autoconf system is currently under revision;
-if it doesn't work, try the autoconf-system in <zexy>/src/ instead
-
-
-
-GENERIC INSTALL INSTRUCTIONS
-============================
-run the following commands:
-
- ./autogen.sh
- ./configure
- make
- make install
-
diff --git a/externals/zexy/build/win-vs2003/zexy.sln b/externals/zexy/build/win-vs2003/zexy.sln
deleted file mode 100644
index 241f59b15d2549d27625ff0b0c683fa6cf649f9e..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs2003/zexy.sln
+++ /dev/null
@@ -1,18 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zexy", "zexy.vcproj", "{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}.Release.ActiveCfg = Release|Win32
-		{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}.Release.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
diff --git a/externals/zexy/build/win-vs2003/zexy.vcproj b/externals/zexy/build/win-vs2003/zexy.vcproj
deleted file mode 100644
index 780725e20b23006a014e59a0d1b2c7deee07fe6f..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs2003/zexy.vcproj
+++ /dev/null
@@ -1,349 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="zexy"
-	ProjectGUID="{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}"
-	RootNamespace="zexy"
-	SccProjectName=""
-	SccLocalPath="">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="."
-			IntermediateDirectory=".\obj"
-			ConfigurationType="2"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="4"
-				AdditionalIncludeDirectories="..\..\..\pd\src;&quot;$(ProgramFiles)\pd\src&quot;"
-				PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY"
-				RuntimeLibrary="4"
-				StructMemberAlignment="5"
-				UsePrecompiledHeader="2"
-				PrecompiledHeaderFile=".\obj/zexy.pch"
-				AssemblerListingLocation=".\obj/"
-				ObjectFile=".\obj/"
-				ProgramDataBaseFileName=".\obj/"
-				BrowseInformation="1"
-				WarningLevel="3"
-				SuppressStartupBanner="TRUE"
-				CompileAs="0"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalOptions="/export:zexy_setup"
-				AdditionalDependencies="wsock32.lib libc.lib oldnames.lib pd.lib"
-				OutputFile="..\zexy.dll"
-				LinkIncremental="1"
-				SuppressStartupBanner="TRUE"
-				AdditionalLibraryDirectories="..\..\..\pd\bin;&quot;$(ProgramFiles)\pd\bin&quot;"
-				IgnoreAllDefaultLibraries="TRUE"
-				ProgramDatabaseFile="./zexy.pdb"
-				ImportLibrary="./zexy.lib"
-				TargetMachine="1"/>
-			<Tool
-				Name="VCMIDLTool"
-				SuppressStartupBanner="TRUE"
-				TargetEnvironment="1"
-				TypeLibraryName="./zexy.tlb"
-				HeaderFileName=""/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				Culture="3079"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="objectclasses"
-			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
-			<File
-				RelativePath="..\..\src\0x260x260x7e.c">
-			</File>
-			<File
-				RelativePath="..\..\src\0x2e.c">
-			</File>
-			<File
-				RelativePath="..\..\src\0x3c0x7e.c">
-			</File>
-			<File
-				RelativePath="..\..\src\0x3d0x3d0x7e.c">
-			</File>
-			<File
-				RelativePath="..\..\src\0x3e0x7e.c">
-			</File>
-			<File
-				RelativePath="..\..\src\0x7c0x7c0x7e.c">
-			</File>
-			<File
-				RelativePath="..\..\src\a2l.c">
-			</File>
-			<File
-				RelativePath="..\..\src\absgn~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\abs~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\atoi.c">
-			</File>
-			<File
-				RelativePath="..\..\src\avg~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\blockmirror~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\blockshuffle~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\blockswap~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\date.c">
-			</File>
-			<File
-				RelativePath="..\..\src\demultiplex.c">
-			</File>
-			<File
-				RelativePath="..\..\src\demultiplex~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\dfreq~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\dirac~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\drip.c">
-			</File>
-			<File
-				RelativePath="..\..\src\envrms~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\fifop.c">
-			</File>
-			<File
-				RelativePath="..\..\src\freadln.c">
-			</File>
-			<File
-				RelativePath="..\..\src\fwriteln.c">
-			</File>
-			<File
-				RelativePath="..\..\src\glue.c">
-			</File>
-			<File
-				RelativePath="..\..\src\index.c">
-			</File>
-			<File
-				RelativePath="..\..\src\length.c">
-			</File>
-			<File
-				RelativePath="..\..\src\lifop.c">
-			</File>
-			<File
-				RelativePath="..\..\src\limiter~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\list2int.c">
-			</File>
-			<File
-				RelativePath="..\..\src\list2lists.c">
-			</File>
-			<File
-				RelativePath="..\..\src\list2symbol.c">
-			</File>
-			<File
-				RelativePath="..\..\src\lister.c">
-			</File>
-			<File
-				RelativePath="..\..\src\listfind.c">
-			</File>
-			<File
-				RelativePath="..\..\src\lpt.c">
-			</File>
-			<File
-				RelativePath="..\..\src\makesymbol.c">
-			</File>
-			<File
-				RelativePath="..\..\src\matchbox.c">
-			</File>
-			<File
-				RelativePath="..\..\src\mavg.c">
-			</File>
-			<File
-				RelativePath="..\..\src\minmax.c">
-			</File>
-			<File
-				RelativePath="..\..\src\msgfile.c">
-			</File>
-			<File
-				RelativePath="..\..\src\multiline~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\multiplex.c">
-			</File>
-			<File
-				RelativePath="..\..\src\multiplex~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\niagara.c">
-			</File>
-			<File
-				RelativePath="..\..\src\noish~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\noisi~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\operating_system.c">
-			</File>
-			<File
-				RelativePath="..\..\src\pack.c">
-			</File>
-			<File
-				RelativePath="..\..\src\packel.c">
-			</File>
-			<File
-				RelativePath="..\..\src\pack~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\pdf~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\prime.c">
-			</File>
-			<File
-				RelativePath="..\..\src\quantize~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\regex.c">
-			</File>
-			<File
-				RelativePath="..\..\src\relay.c">
-			</File>
-			<File
-				RelativePath="..\..\src\repack.c">
-			</File>
-			<File
-				RelativePath="..\..\src\repeat.c">
-			</File>
-			<File
-				RelativePath="..\..\src\route~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\sfplay.c">
-			</File>
-			<File
-				RelativePath="..\..\src\sfrecord.c">
-			</File>
-			<File
-				RelativePath="..\..\src\sgn~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\sigzero~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\sort.c">
-			</File>
-			<File
-				RelativePath="..\..\src\step~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\strcmp.c">
-			</File>
-			<File
-				RelativePath="..\..\src\sum.c">
-			</File>
-			<File
-				RelativePath="..\..\src\swap~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\symbol2list.c">
-			</File>
-			<File
-				RelativePath="..\..\src\tabdump.c">
-			</File>
-			<File
-				RelativePath="..\..\src\tabminmax.c">
-			</File>
-			<File
-				RelativePath="..\..\src\tabread4~~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\tabset.c">
-			</File>
-			<File
-				RelativePath="..\..\src\tavg~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\time.c">
-			</File>
-			<File
-				RelativePath="..\..\src\unpack.c">
-			</File>
-			<File
-				RelativePath="..\..\src\unpack~.c">
-			</File>
-			<File
-				RelativePath="..\..\src\urn.c">
-			</File>
-			<File
-				RelativePath="..\..\src\wrap.c">
-			</File>
-			<File
-				RelativePath="..\..\src\z~.c">
-			</File>
-		</Filter>
-		<Filter
-			Name="zexy"
-			Filter="h;hpp;hxx;hm;inl">
-			<File
-				RelativePath="..\..\src\z_zexy.c">
-			</File>
-			<File
-				RelativePath="..\..\src\z_zexy.h">
-			</File>
-			<File
-				RelativePath="..\..\src\zexy.c">
-			</File>
-			<File
-				RelativePath="..\..\src\zexy.h">
-			</File>
-		</Filter>
-		<Filter
-			Name="helper"
-			Filter="">
-			<File
-				RelativePath="..\..\src\winNT_portio.c">
-			</File>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/externals/zexy/build/win-vs2008/zexy.sln b/externals/zexy/build/win-vs2008/zexy.sln
deleted file mode 100644
index f5670f07da2feadbf9bdee4ee80be1bf396375cf..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs2008/zexy.sln
+++ /dev/null
@@ -1,16 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 10.00
-# Visual Studio 2008
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zexy", "zexy.vcproj", "{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Release|Win32 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}.Release|Win32.ActiveCfg = Release|Win32
-		{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}.Release|Win32.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/externals/zexy/build/win-vs2008/zexy.vcproj b/externals/zexy/build/win-vs2008/zexy.vcproj
deleted file mode 100644
index a9de903cd7ad45ace6b4a90c2f354df92ac7b587..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs2008/zexy.vcproj
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="9,00"
-	Name="zexy"
-	ProjectGUID="{6B55773B-3FF5-4F09-B538-2A7007DEC4DB}"
-	RootNamespace="zexy"
-	TargetFrameworkVersion="131072"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="."
-			IntermediateDirectory=".\obj"
-			ConfigurationType="2"
-			InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="false"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-				SuppressStartupBanner="true"
-				TargetEnvironment="1"
-				TypeLibraryName="./zexy.tlb"
-				HeaderFileName=""
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="4"
-				AdditionalIncludeDirectories="..\..\..\pd\src;&quot;$(ProgramFiles)\pd\src&quot;;&quot;$(ProgramFiles)\pd-0.43.0\src&quot;"
-				PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY"
-				RuntimeLibrary="0"
-				StructMemberAlignment="5"
-				UsePrecompiledHeader="0"
-				PrecompiledHeaderFile=".\obj/zexy.pch"
-				AssemblerListingLocation=".\obj/"
-				ObjectFile=".\obj/"
-				ProgramDataBaseFileName=".\obj/"
-				BrowseInformation="1"
-				WarningLevel="3"
-				SuppressStartupBanner="true"
-				CompileAs="0"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				Culture="3079"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalOptions="/export:zexy_setup"
-				AdditionalDependencies="pd.lib wsock32.lib"
-				OutputFile="..\..\zexy.dll"
-				LinkIncremental="1"
-				SuppressStartupBanner="true"
-				AdditionalLibraryDirectories="..\..\..\pd\bin;&quot;$(ProgramFiles)\pd\bin&quot;;&quot;$(ProgramFiles)\pd-0.43.0\bin&quot;"
-				ProgramDatabaseFile="./zexy.pdb"
-				RandomizedBaseAddress="1"
-				DataExecutionPrevention="0"
-				ImportLibrary="./zexy.lib"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="objectclasses"
-			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-			>
-			<File RelativePath="..\..\src\0x260x260x7e.c" > </File>
-			<File RelativePath="..\..\src\0x2e.c" > </File>
-			<File RelativePath="..\..\src\0x3c0x7e.c" > </File>
-			<File RelativePath="..\..\src\0x3d0x3d0x7e.c" > </File>
-			<File RelativePath="..\..\src\0x3e0x7e.c" > </File>
-			<File RelativePath="..\..\src\0x7c0x7c0x7e.c" > </File>
-			<File RelativePath="..\..\src\a2l.c" > </File>
-			<File RelativePath="..\..\src\absgn~.c" > </File>
-			<File RelativePath="..\..\src\abs~.c" > </File>
-			<File RelativePath="..\..\src\atof.c" > </File>
-			<File RelativePath="..\..\src\atoi.c" > </File>
-			<File RelativePath="..\..\src\avg~.c" > </File>
-			<File RelativePath="..\..\src\blockmirror~.c" > </File>
-			<File RelativePath="..\..\src\blockshuffle~.c" > </File>
-			<File RelativePath="..\..\src\blockswap~.c" > </File>
-			<File RelativePath="..\..\src\date.c" > </File>
-			<File RelativePath="..\..\src\demultiplex.c" > </File>
-			<File RelativePath="..\..\src\demultiplex~.c" > </File>
-			<File RelativePath="..\..\src\dfreq~.c" > </File>
-			<File RelativePath="..\..\src\dirac~.c" > </File>
-			<File RelativePath="..\..\src\doublepole~.c"></File>
-			<File RelativePath="..\..\src\drip.c" > </File>
-			<File RelativePath="..\..\src\envrms~.c" > </File>
-			<File RelativePath="..\..\src\fifop.c" > </File>
-			<File RelativePath="..\..\src\freadln.c" > </File>
-			<File RelativePath="..\..\src\fwriteln.c" > </File>
-			<File RelativePath="..\..\src\glue.c" > </File>
-			<File RelativePath="..\..\src\index.c" > </File>
-			<File RelativePath="..\..\src\length.c" > </File>
-			<File RelativePath="..\..\src\lifop.c" > </File>
-			<File RelativePath="..\..\src\limiter~.c" > </File>
-			<File RelativePath="..\..\src\list2int.c" > </File>
-			<File RelativePath="..\..\src\list2lists.c" > </File>
-			<File RelativePath="..\..\src\list2symbol.c" > </File>
-			<File RelativePath="..\..\src\lister.c" > </File>
-			<File RelativePath="..\..\src\listfind.c" > </File>
-			<File RelativePath="..\..\src\liststorage.c" > </File>
-			<File RelativePath="..\..\src\longload~.c"></File>
-			<File RelativePath="..\..\src\lpt.c" > </File>
-			<File RelativePath="..\..\src\makesymbol.c" > </File>
-			<File RelativePath="..\..\src\matchbox.c" > </File>
-			<File RelativePath="..\..\src\mavg.c" > </File>
-			<File RelativePath="..\..\src\minmax.c" > </File>
-			<File RelativePath="..\..\src\msgfile.c" > </File>
-			<File RelativePath="..\..\src\multiline~.c" > </File>
-			<File RelativePath="..\..\src\multiplex.c" > </File>
-			<File RelativePath="..\..\src\multiplex~.c" > </File>
-			<File RelativePath="..\..\src\multireceive.c" > </File>
-			<File RelativePath="..\..\src\niagara.c" > </File>
-			<File RelativePath="..\..\src\noish~.c" > </File>
-			<File RelativePath="..\..\src\noisi~.c" > </File>
-			<File RelativePath="..\..\src\operating_system.c" > </File>
-			<File RelativePath="..\..\src\pack.c" > </File>
-			<File RelativePath="..\..\src\packel.c" > </File>
-			<File RelativePath="..\..\src\pack~.c" > </File>
-			<File RelativePath="..\..\src\pdf~.c" > </File>
-			<File RelativePath="..\..\src\prime.c" > </File>
-			<File RelativePath="..\..\src\quantize~.c" > </File>
-			<File RelativePath="..\..\src\rawprint.c" > </File>
-			<File RelativePath="..\..\src\regex.c" > </File>
-			<File RelativePath="..\..\src\relay.c" > </File>
-			<File RelativePath="..\..\src\repack.c" > </File>
-			<File RelativePath="..\..\src\repeat.c" > </File>
-			<File RelativePath="..\..\src\route~.c" > </File>
-			<File RelativePath="..\..\src\sfplay.c" > </File>
-			<File RelativePath="..\..\src\sfrecord.c" > </File>
-			<File RelativePath="..\..\src\sgn~.c" > </File>
-			<File RelativePath="..\..\src\sigzero~.c" > </File>
-			<File RelativePath="..\..\src\sleepgrain.c" > </File>
-			<File RelativePath="..\..\src\sort.c" > </File>
-			<File RelativePath="..\..\src\step~.c" > </File>
-			<File RelativePath="..\..\src\strcmp.c" > </File>
-			<File RelativePath="..\..\src\sum.c" > </File>
-			<File RelativePath="..\..\src\swap~.c" > </File>
-			<File RelativePath="..\..\src\symbol2list.c" > </File>
-			<File RelativePath="..\..\src\tabdump.c" > </File>
-			<File RelativePath="..\..\src\tabminmax.c" > </File>
-			<File RelativePath="..\..\src\tabread4~~.c" > </File>
-			<File RelativePath="..\..\src\tabset.c" > </File>
-			<File RelativePath="..\..\src\tavg~.c" > </File>
-			<File RelativePath="..\..\src\time.c" > </File>
-			<File RelativePath="..\..\src\unpack.c" > </File>
-			<File RelativePath="..\..\src\unpack~.c" > </File>
-			<File RelativePath="..\..\src\urn.c" > </File>
-			<File RelativePath="..\..\src\wrap.c" > </File>
-			<File RelativePath="..\..\src\z~.c" > </File>
-		</Filter>
-		<Filter
-			Name="zexy"
-			Filter="h;hpp;hxx;hm;inl"
-			>
-			<File RelativePath="..\..\src\z_zexy.c" > </File>
-			<File RelativePath="..\..\src\z_zexy.h" > </File>
-			<File RelativePath="..\..\src\zexySIMD.h" > </File>
-			<File RelativePath="..\..\src\zexy.c" > </File>
-			<File RelativePath="..\..\src\zexy.h" > </File>
-		</Filter>
-		<Filter
-			Name="helper"
-			>
-			<File RelativePath="..\..\src\winNT_portio.c" > </File>
-		</Filter>
-		<Filter
-			Name="tmp"
-			>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/externals/zexy/build/win-vs6/zexy.dsp b/externals/zexy/build/win-vs6/zexy.dsp
deleted file mode 100644
index 4542e271d2aa8e3def256876bad07e14f0680c4e..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs6/zexy.dsp
+++ /dev/null
@@ -1,407 +0,0 @@
-# Microsoft Developer Studio Project File - Name="zexy" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** NICHT BEARBEITEN **
-
-# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
-
-CFG=ZEXY - WIN32 RELEASE
-!MESSAGE Dies ist kein gültiges Makefile. Zum Erstellen dieses Projekts mit NMAKE
-!MESSAGE verwenden Sie den Befehl "Makefile exportieren" und führen Sie den Befehl
-!MESSAGE 
-!MESSAGE NMAKE /f "zexy.mak".
-!MESSAGE 
-!MESSAGE Sie können beim Ausführen von NMAKE eine Konfiguration angeben
-!MESSAGE durch Definieren des Makros CFG in der Befehlszeile. Zum Beispiel:
-!MESSAGE 
-!MESSAGE NMAKE /f "zexy.mak" CFG="ZEXY - WIN32 RELEASE"
-!MESSAGE 
-!MESSAGE Für die Konfiguration stehen zur Auswahl:
-!MESSAGE 
-!MESSAGE "zexy - Win32 Release" (basierend auf  "Win32 (x86) Dynamic-Link Library")
-!MESSAGE 
-
-# Begin Project
-# PROP AllowPerConfigDependencies 1
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-MTL=midl.exe
-RSC=rc.exe
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir ""
-# PROP Intermediate_Dir "obj\"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ZEXY_EXPORTS" /YX /FD /c
-# ADD CPP /nologo /Zp16 /W3 /GX /I "..\..\..\pd\src" /I "C:\Programme\pd\src" /D "__WIN32__" /D "ZEXY" /D "Z_WANT_LPT" /D "ZEXY_LIBRARY" /FR /YX /FD /c
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
-# ADD MTL /nologo /win32
-# SUBTRACT MTL /mktyplib203
-# ADD BASE RSC /l 0xc07 /d "NDEBUG"
-# ADD RSC /l 0xc07
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 kernel32.lib wsock32.lib uuid.lib libc.lib oldnames.lib pd.lib /nologo /dll /machine:I386 /nodefaultlib /out:"..\zexy.dll" /libpath:"../../bin" /libpath:"C:\Programme\pd\bin" /export:zexy_setup
-# SUBTRACT LINK32 /pdb:none
-# Begin Target
-
-# Name "zexy - Win32 Release"
-# Begin Group "Quellcodedateien"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=.\0x260x260x7e.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\0x2e.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\0x3c0x7e.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\0x3d0x3d0x7e.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\0x3e0x7e.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\0x7c0x7c0x7e.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\a2l.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\absgn~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\abs~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\atoi.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\avg~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\blockmirror~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\blockshuffle~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\blockswap~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\date.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\demultiplex.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\demultiplex~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\dfreq~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\dirac~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\drip.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\envrms~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\fifop.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\freadln.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\fwriteln.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\glue.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\index.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\length.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\lifop.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\limiter~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\list2int.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\list2lists.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\list2symbol.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\lister.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\listfind.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\lpt.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\makesymbol.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\matchbox.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\mavg.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\minmax.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\msgfile.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\multiline~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\multiplex.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\multiplex~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\niagara.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\noish~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\noisi~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\operating_system.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\pack.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\packel.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\pack~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\pdf~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\prime.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\quantize~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\regex.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\relay.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\repack.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\repeat.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\sfplay.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\sfrecord.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\sgn~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\sigzero~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\sort.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\step~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\strcmp.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\sum.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\swap~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\symbol2list.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\tabdump.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\tabminmax.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\tabread4~~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\tabset.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\tavg~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\time.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unpack.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\unpack~.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\urn.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\winNT_portio.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\wrap.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\z_zexy.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\zexy.c
-# End Source File
-# Begin Source File
-
-SOURCE=.\z~.c
-# End Source File
-# End Group
-# Begin Group "Header-Dateien"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\..\src\m_pd.h
-# End Source File
-# Begin Source File
-
-SOURCE=.\Zexy.h
-# End Source File
-# End Group
-# Begin Group "generic"
-
-# PROP Default_Filter ""
-# Begin Source File
-
-SOURCE=.\z_zexy.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/externals/zexy/build/win-vs6/zexy.dsw b/externals/zexy/build/win-vs6/zexy.dsw
deleted file mode 100644
index f8e4ba7084a8b9eade47cc96a5557f8222643f80..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs6/zexy.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN!
-
-###############################################################################
-
-Project: "zexy"=.\zexy.dsp - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/externals/zexy/build/win-vs7.10/zexy.sln b/externals/zexy/build/win-vs7.10/zexy.sln
deleted file mode 100644
index baea9f226679b98d4002b58289092d5d06615c80..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs7.10/zexy.sln
+++ /dev/null
@@ -1,18 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 8.00
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zexy", "zexy.vcproj", "{D6D6C3DC-5B5B-452F-9953-2B37FAC07F2A}"
-	ProjectSection(ProjectDependencies) = postProject
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfiguration) = preSolution
-		Release = Release
-	EndGlobalSection
-	GlobalSection(ProjectConfiguration) = postSolution
-		{D6D6C3DC-5B5B-452F-9953-2B37FAC07F2A}.Release.ActiveCfg = Release|Win32
-		{D6D6C3DC-5B5B-452F-9953-2B37FAC07F2A}.Release.Build.0 = Release|Win32
-	EndGlobalSection
-	GlobalSection(ExtensibilityGlobals) = postSolution
-	EndGlobalSection
-	GlobalSection(ExtensibilityAddIns) = postSolution
-	EndGlobalSection
-EndGlobal
diff --git a/externals/zexy/build/win-vs7.10/zexy.vcproj b/externals/zexy/build/win-vs7.10/zexy.vcproj
deleted file mode 100644
index 5c878dcf7cae9913b20f8b6c2da6120eddbcf626..0000000000000000000000000000000000000000
--- a/externals/zexy/build/win-vs7.10/zexy.vcproj
+++ /dev/null
@@ -1,897 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="7.10"
-	Name="zexy"
-	RootNamespace="zexy"
-	SccProjectName=""
-	SccLocalPath="">
-	<Platforms>
-		<Platform
-			Name="Win32"/>
-	</Platforms>
-	<Configurations>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="."
-			IntermediateDirectory=".\obj"
-			ConfigurationType="2"
-			UseOfMFC="0"
-			ATLMinimizesCRunTimeLibraryUsage="FALSE">
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="4"
-				AdditionalIncludeDirectories="..\..\..\pd\src,C:\Programme\pd\src"
-				PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY"
-				RuntimeLibrary="4"
-				StructMemberAlignment="5"
-				UsePrecompiledHeader="2"
-				PrecompiledHeaderFile=".\obj/zexy.pch"
-				AssemblerListingLocation=".\obj/"
-				ObjectFile=".\obj/"
-				ProgramDataBaseFileName=".\obj/"
-				BrowseInformation="1"
-				WarningLevel="3"
-				SuppressStartupBanner="TRUE"
-				CompileAs="0"/>
-			<Tool
-				Name="VCCustomBuildTool"/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalOptions="/export:zexy_setup"
-				AdditionalDependencies="wsock32.lib libc.lib oldnames.lib pd.lib"
-				OutputFile="..\zexy.dll"
-				LinkIncremental="1"
-				SuppressStartupBanner="TRUE"
-				AdditionalLibraryDirectories="C:\home\zmoelnig\pd\bin;..\..\pd\bin;C:\Programme\pd\bin"
-				IgnoreAllDefaultLibraries="TRUE"
-				ProgramDatabaseFile="./zexy.pdb"
-				ImportLibrary="./zexy.lib"
-				TargetMachine="1"/>
-			<Tool
-				Name="VCMIDLTool"
-				SuppressStartupBanner="TRUE"
-				TargetEnvironment="1"
-				TypeLibraryName="./zexy.tlb"
-				HeaderFileName=""/>
-			<Tool
-				Name="VCPostBuildEventTool"/>
-			<Tool
-				Name="VCPreBuildEventTool"/>
-			<Tool
-				Name="VCPreLinkEventTool"/>
-			<Tool
-				Name="VCResourceCompilerTool"
-				Culture="3079"/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"/>
-			<Tool
-				Name="VCWebDeploymentTool"/>
-			<Tool
-				Name="VCManagedWrapperGeneratorTool"/>
-			<Tool
-				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="Quellcodedateien"
-			Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat">
-			<File
-				RelativePath="0x260x260x7e.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="0x2e.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="0x3c0x7e.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="0x3d0x3d0x7e.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="0x3e0x7e.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="0x7c0x7c0x7e.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="a2l.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="absgn~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="abs~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="atoi.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="avg~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="blockmirror~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="blockswap~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="date.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="demultiplex.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="demultiplex~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="dfreq~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="dirac~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="drip.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="envrms~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="fifop.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="glue.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="index.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="length.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="lifop.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="limiter~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="list2int.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="list2symbol.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="lister.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="lpt.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="makesymbol.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="mavg.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="minmax.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="msgfile.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="multiline~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="multiplex.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="multiplex~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="niagara.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="noish~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="noisi~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="operating_system.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="packel.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="pack~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="pdf~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="prime.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="quantize~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="regex.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="relay.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="repack.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="repeat.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="sfplay.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="sfrecord.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="sgn~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="sigzero~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="sort.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="step~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="strcmp.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="sum.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="swap~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="symbol2list.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="tabdump.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="tabminmax.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="tabset.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="tavg~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="time.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="unpack~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="urn.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="winNT_portio.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="wrap.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="z_zexy.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="zexy.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-			<File
-				RelativePath="z~.c">
-				<FileConfiguration
-					Name="Release|Win32">
-					<Tool
-						Name="VCCLCompilerTool"
-						AdditionalIncludeDirectories=""
-						PreprocessorDefinitions="__WIN32__;ZEXY;Z_WANT_LPT;ZEXY_LIBRARY;$(NoInherit)"
-						BrowseInformation="1"/>
-				</FileConfiguration>
-			</File>
-		</Filter>
-		<Filter
-			Name="Header-Dateien"
-			Filter="h;hpp;hxx;hm;inl">
-			<File
-				RelativePath="Zexy.h">
-			</File>
-			<File
-				RelativePath=".\zexyconf.h">
-			</File>
-		</Filter>
-		<Filter
-			Name="generic"
-			Filter="">
-			<File
-				RelativePath="z_zexy.h">
-			</File>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/externals/zexy/configure.ac b/externals/zexy/configure.ac
deleted file mode 100644
index fef1c90a7ea2201b7ad9d0c99d55b58b9a2221c7..0000000000000000000000000000000000000000
--- a/externals/zexy/configure.ac
+++ /dev/null
@@ -1,183 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-AC_PREREQ([2.60])
-
-AC_INIT([zexy], [2.2.6], [zmoelnig@iem.at], [zexy], [https://git.iem.at/pd/zexy])
-AM_INIT_AUTOMAKE([1.10 foreign])
-m4_ifdef([LT_INIT], 
-	[LT_INIT([disable-static win32-dll])],
-	[AC_ENABLE_SHARED
-	 AC_DISABLE_STATIC
-	 AC_LIBTOOL_WIN32_DLL])
-
-AC_CONFIG_MACRO_DIR([m4])
-
-AC_CONFIG_HEADERS([config.h])
-AC_CONFIG_FILES([Makefile src/Makefile abs/Makefile reference/Makefile])
-AC_CONFIG_FILES([tests/Makefile build/Makefile])
-AC_CONFIG_FILES([zexy-meta.pd])
-
-AC_CONFIG_SRCDIR([src/zexy.c])
-
-IEM_OPERATING_SYSTEM
-ARCH=$(uname -m)
-KERN=$(uname -s)
-
-dnl m4_ifdef([AC_LIB_RPATH], [AC_LIB_RPATH])
-
-dnl Checks for programs.
-AC_PROG_CC
-AC_PROG_LN_S
-AC_LIBTOOL_WIN32_DLL
-AC_PROG_LIBTOOL
-
-AC_ARG_WITH([pd],       [  --with-pd=</path/to/pd> where to look for pd-headers and and -libs])
-AC_ARG_WITH([extension],[  --with-extension=<ext>  enforce a certain extension for the dynamic library (e.g. dll)])
-AC_ARG_ENABLE([library],[  --enable-library        build zexy as multi-object library (default, "yes"), as single-object externals ("no") or as both ("both")])
-AM_CONDITIONAL([LIBRARY], [test "x${enable_library}" != "xno"])
-AM_CONDITIONAL([SINGLEOBJECTS], [test "x${enable_library}" = "xno" || test "x${enable_library}" = "xboth"])
-
-## override build-date
-AC_ARG_WITH([build-date], AC_HELP_STRING([--with-build-date=<str>], [alternative date string]))
-AC_MSG_CHECKING([build-date])
-AS_IF([test "x$with_build_date" = "xyes" ],[with_build_date=""])
-AS_IF([test "x$with_build_date" = "xno"  ],[with_build_date=""])
-AS_IF([test "x$with_build_date" != "x"  ],[ AC_DEFINE_UNQUOTED([BUILD_DATE],
-["$with_build_date"], [user-defined build-date string])])
-## urgh, brackets need to be escaped with @<:@ and @:>@...
-AS_IF([test "x$with_build_date" != "x"  ],[ with_build_date="@<:@default@:>@" ])
-AC_MSG_RESULT([$with_build_date])
-
-
-if test "x${libdir}" = "x\${exec_prefix}/lib"; then
- libdir='${exec_prefix}/lib/pd/extra'
-fi
-
-
-if test "x$with_pd" != "x"; then
- if test -d "${with_pd}"; then
-   PDPATH=${with_pd}
- fi
- if test -d "${PDPATH}/src"; then
-  AC_MSG_RESULT([adding ${PDPATH}/src to INCLUDES])
-  CPPFLAGS="-I${PDPATH}/src ${CPPFLAGS}"
-
-  AC_MSG_RESULT([adding ${PDPATH}/src to LDFLAGS])
-  LDFLAGS="-L${PDPATH}/src ${LDFLAGS}"
- else
-  if test -d "${PDPATH}"; then
-   AC_MSG_RESULT([adding ${PDPATH} to INCLUDES])
-   CPPFLAGS="-I${PDPATH} ${CPPFLAGS}"
-  fi
- fi
- if test -d "${PDPATH}/bin"; then
-  AC_MSG_RESULT([adding ${PDPATH}/bin to LDFLAGS])
-  LDFLAGS="-L${PDPATH}/bin ${LDFLAGS}"
- else
-  if test -d "${PDPATH}"; then
-   AC_MSG_RESULT([adding ${PDPATH} to LDFLAGS])
-   LDFLAGS="-L${PDPATH} ${LDFLAGS}"
-  fi
- fi
-fi
-
-dnl Checks for libraries.
-dnl Replace `main' with a function in -lc:
-AC_CHECK_LIB([c], [main])
-AC_CHECK_LIB([crtdll], [fclose])
-
-AC_CHECK_LIB([coldname], [lseek])
-AC_CHECK_LIB([kernel32], [main])
-AC_CHECK_LIB([user32], [main])
-AC_CHECK_LIB([gdi32], [main])
-
-dnl Replace `main' with a function in -lm:
-AC_CHECK_LIB([m], [main])
-dnl Replace `main' with a function in -lpthread:
-dnl AC_CHECK_LIB([pthread], [main])
-dnl Replace `main' with a function in -lstk:
-dnl AC_CHECK_LIB([stk], [main], [STK=yes])
-
-tmp_pddll_LIBS=$LIBS
-AC_CHECK_LIB([:pd.dll], [nullfn], have_pddll="yes", have_pddll="no")
-LIBS=$tmp_pddll_LIBS
-
-if test "x$have_pddll" = "xyes"
-then
-  EXTRA_LTFLAGS="$EXTRA_LTFLAGS -Xlinker -l:pd.dll"
-else
-  AC_CHECK_LIB([pd], [nullfn])
-fi
-
-AC_CHECK_LIB([regex], [regcomp])
-
-dnl Checks for header files.
-AC_HEADER_STDC
-AC_CHECK_HEADERS([stdlib.h stdio.h string.h math.h time.h sys/time.h regex.h alloca.h])
-
-dnl Checks for typedefs, structures, and compiler characteristics.
-AC_HEADER_TIME
-
-dnl Checks for library functions.
-AC_FUNC_MMAP
-AC_CHECK_FUNCS([select socket strerror])
-
-IEM_CHECK_FAT(ARCH_FLAG)
-
-IEM_CHECK_CFLAGS([-mms-bitfields])
-IEM_CHECK_SIMD
-IEM_CHECK_LPT
-
-AC_MSG_CHECKING([extension])
-if test "x$with_extension" != "x"
-then
- EXTENSION=$with_extension
-else
- case "$KERN" in
- Darwin)
-   EXTENSION=pd_darwin
-   ;;
- Linux)
-   EXTENSION=pd_linux
-   ;;
- IRIX64)
-   EXTENSION=pd_irix6
-   ;;
- IRIX32)
-   EXTENSION=pd_irix5
-   ;;
- IRIX64)
-   EXTENSION=pd_irix6
-   ;;
- *CYGWIN*)
-   EXTENSION=dll
-   ;;
- *MINGW*)
-   EXTENSION=dll
-   ;;
- *)
-   EXTENSION=pd_linux
-   ;;
- esac
-fi
-AC_MSG_RESULT([$EXTENSION])
-
-
-have_pd="no"
-AC_CHECK_HEADERS([pd/m_pd.h m_pd.h], [have_pd="yes"])
-if test "x${have_pd}" = "xno"
-then
-AC_ERROR([m_pd.h is desperately needed!
-        install pd and/or use
-        "--with-pd=</path/to/pd/>"])
-fi
-
-AC_SUBST(CFLAGS)
-AC_SUBST(CPPFLAGS)
-AC_SUBST(DEFS)
-AC_SUBST(ARCH_FLAG)
-AC_SUBST([LIBTOOL_DEPS])
-AC_SUBST([EXTRA_LTFLAGS])
-
-AC_SUBST(EXTENSION)
-
-AC_OUTPUT()
diff --git a/externals/zexy/examples/README.txt b/externals/zexy/examples/README.txt
deleted file mode 100644
index b0f66091688e288fb8e0e4bed4f9fe12ce653a64..0000000000000000000000000000000000000000
--- a/externals/zexy/examples/README.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-here you (will) find example patches on how to make use of zexy objects.
-the reference-patches (aka help-patches) have been moved to ../reference
-
-mfg.asdr
-IOhannes - zmoelnig at iem dot at
diff --git a/externals/zexy/m4/iem_checkflags.m4 b/externals/zexy/m4/iem_checkflags.m4
deleted file mode 100644
index b58b7993da7a9091bfc23e5f166cc247f1e46122..0000000000000000000000000000000000000000
--- a/externals/zexy/m4/iem_checkflags.m4
+++ /dev/null
@@ -1,111 +0,0 @@
-dnl Copyright (C) 2005-2011 IOhannes m zmölnig
-dnl This file is free software; IOhannes m zmölnig
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-# IEM_CHECK_CPPFLAGS(ADDITIONAL-CPPFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(C) compiler accepts the ADDITIONAL-CPPFLAGS
-# if so, they are added to the CPPFLAGS
-AC_DEFUN([IEM_CHECK_CPPFLAGS],
-[
-  AC_MSG_CHECKING([whether $CPP accepts "$1"])
-  temp_check_cppflags="${CPPFLAGS}"
-  CPPFLAGS="$1 ${CPPFLAGS}"
-  AC_PREPROC_IFELSE(
-        [AC_LANG_SOURCE([[int main(void){return 0;}]])],
-        [AC_MSG_RESULT([yes])],
-        [AC_MSG_RESULT([no]); CPPFLAGS="${temp_check_cppflags}"])
-])# IEM_CHECK_CPPFLAGS
-
-
-
-# IEM_CHECK_CFLAGS(ADDITIONAL-CFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(C) compiler accepts the ADDITIONAL-CFLAGS
-# if so, they are added to the CFLAGS
-AC_DEFUN([IEM_CHECK_CFLAGS],
-[
-  AC_MSG_CHECKING([whether $CC accepts "$1"])
-cat > conftest.c << EOF
-int main(){
-  return 0;
-}
-EOF
-if $CC $CFLAGS [$1] -o conftest.o conftest.c > /dev/null 2>&1
-then
-  AC_MSG_RESULT([yes])
-  CFLAGS="${CFLAGS} [$1]"
-  [$2]
-else
-  AC_MSG_RESULT([no])
-  [$3]
-fi
-])# IEM_CHECK_CFLAGS
-
-# IEM_CHECK_CXXFLAGS(ADDITIONAL-CXXFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(CXX) (c++) compiler accepts the ADDITIONAL-CXXFLAGS
-# if so, they are added to the CXXFLAGS
-AC_DEFUN([IEM_CHECK_CXXFLAGS],
-[
-  AC_MSG_CHECKING([whether $CXX accepts "$1"])
-cat > conftest.c++ << EOF
-int main(){
-  return 0;
-}
-EOF
-if $CXX $CPPFLAGS $CXXFLAGS -o conftest.o conftest.c++ [$1] > /dev/null 2>&1
-then
-  AC_MSG_RESULT([yes])
-  CXXFLAGS="${CXXFLAGS} [$1]"
-  [$2]
-else
-  AC_MSG_RESULT([no])
-  [$3]
-fi
-])# IEM_CHECK_CXXFLAGS
-
-# IEM_CHECK_FRAMEWORK(FRAMEWORK, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-#
-AC_DEFUN([IEM_CHECK_FRAMEWORK],
-[
-  AC_MSG_CHECKING([for "$1"-framework])
-
-  temp_check_ldflags_org="${LDFLAGS}"
-  LDFLAGS="-framework [$1] ${LDFLAGS}"
-
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [temp_check_ldflags_success="yes"],[temp_check_ldflags_success="no"])
-
-  if test "x$temp_check_ldflags_success" = "xyes"; then
-    AC_MSG_RESULT([yes])
-    [$2]
-  else
-    AC_MSG_RESULT([no])
-    LDFLAGS="$temp_check_ldflags_org"
-    [$3]
-  fi
-])# IEM_CHECK_FRAMEWORK
-
-# IEM_CHECK_LDFLAGS(ADDITIONAL-LDFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(LD) linker accepts the ADDITIONAL-LDFLAGS
-# if so, they are added to the LDFLAGS
-AC_DEFUN([IEM_CHECK_LDFLAGS],
-[
-  AC_MSG_CHECKING([whether linker accepts "$1"])
-  temp_check_ldflags_org="${LDFLAGS}"
-  LDFLAGS="$1 ${LDFLAGS}"
-
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [temp_check_ldflags_success="yes"],[temp_check_ldflags_success="no"])
-
-  if test "x$temp_check_ldflags_success" = "xyes"; then
-    AC_MSG_RESULT([yes])
-    [$2]
-  else
-    AC_MSG_RESULT([no])
-    LDFLAGS="$temp_check_ldflags_org"
-    [$3]
-  fi
-])# IEM_CHECK_LDFLAGS
diff --git a/externals/zexy/m4/iem_fat.m4 b/externals/zexy/m4/iem_fat.m4
deleted file mode 100644
index 1ffeb5fe6d9fc36cfcc3ca2790f4fc6e33dcff05..0000000000000000000000000000000000000000
--- a/externals/zexy/m4/iem_fat.m4
+++ /dev/null
@@ -1,51 +0,0 @@
-dnl Copyright (C) 2005-2006 IOhannes m zmölnig
-dnl This file is free software; IOhannes m zmölnig
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([IEM_CHECK_FAT],
-[
-AC_ARG_ENABLE(fat-binary,
-       [  --enable-fat-binary=ARCHS
-                          build an Apple Multi Architecture Binary (MAB);
-                          ARCHS is a comma-delimited list of architectures for
-                          which to build; if ARCHS is omitted, then the package
-                          will be built for all architectures supported by the
-                          platform (e.g. "ppc,i386" for MacOS/X and Darwin; 
-                          if this option is disabled or omitted entirely, then
-                          the package will be built only for the target 
-                          platform],
-       [fat_binary=$enableval], [fat_binary=no])
-if test "$fat_binary" != no; then
-    AC_MSG_CHECKING([target architectures])
-
-    # Respect TARGET_ARCHS setting from environment if available.
-    if test -z "$TARGET_ARCHS"; then
-   	# Respect ARCH given to --enable-fat-binary if present.
-     if test "$fat_binary" != yes; then
-	    TARGET_ARCHS=`echo "$fat_binary" | tr ',' ' '`
-     else
-	    # Choose a default set of architectures based upon platform.
-      TARGET_ARCHS="ppc i386"
-     fi
-    fi
-    AC_MSG_RESULT([$TARGET_ARCHS])
-
-   define([Name],[translit([$1],[./-], [___])])
-   # /usr/lib/arch_tool -archify_list $TARGET_ARCHS
-   []Name=""
-   for archs in $TARGET_ARCHS 
-   do
-    []Name="$[]Name -arch $archs"
-   done
-
-   if test "x$[]Name" != "x"; then
-    IEM_CHECK_CFLAGS($[]Name,,[]Name="")
-    IEM_CHECK_CXXFLAGS($[]Name,,[]Name="")
-    IEM_CHECK_LDFLAGS($[]Name,,[]Name="")
-   fi
-
-
-   undefine([Name])
-fi
-])# IEM_CHECK_FAT
diff --git a/externals/zexy/m4/iem_operatingsystem.m4 b/externals/zexy/m4/iem_operatingsystem.m4
deleted file mode 100644
index 87726e110c499cab343361e89c504ab8f0561bc7..0000000000000000000000000000000000000000
--- a/externals/zexy/m4/iem_operatingsystem.m4
+++ /dev/null
@@ -1,55 +0,0 @@
-dnl try to figure out the target operating system and set some AM-macros accordingly 
-dnl
-dnl Copyright (C) 2011 IOhannes m zmölnig
-
-
-AC_DEFUN([IEM_OPERATING_SYSTEM],
-[
-AC_CANONICAL_HOST
-
-LINUX=no
-ANDROID=no
-MACOSX=no
-IPHONEOS=no
-BSD=no
-WINDOWS=no
-MINGW=no
-CYGWIN=no
-HURD=no
-IRIX=no
-
-case $host_os in
-*linux*)
-	 LINUX=yes
-  ;;
-*darwin*)
-	 MACOSX=yes
-	;;
-GNU/kFreeBSD)
-   BSD=yes
-	;;
-*mingw*)
-	WINDOWS=yes
-	MINGW=yes
-	;;
-*cygwin*)
-	WINDOWS=yes
-	CYGWIN=yes
-  ;;
-GNU)
-	 HURD=yes
-  ;;
-esac
-
-
-AM_CONDITIONAL(LINUX, test x$LINUX = xyes)
-AM_CONDITIONAL(ANDROID, test x$ANDROID = xyes)
-AM_CONDITIONAL(MACOSX, test x$MACOSX = xyes)
-AM_CONDITIONAL(IPHONEOS, test x$IPHONEOS = xyes)
-AM_CONDITIONAL(BSD, test x$BSD = xyes)
-AM_CONDITIONAL(WINDOWS, test x$WINDOWS = xyes)
-AM_CONDITIONAL(CYGWIN, test x$MINGW = xyes)
-AM_CONDITIONAL(MINGW, test x$MINGW = xyes)
-AM_CONDITIONAL(HURD, test x$HURD = xyes)
-AM_CONDITIONAL(IRIX, test x$IRIX = xyes)
-]) dnl IEM_OPERATING_SYSTEM
diff --git a/externals/zexy/m4/iem_parallelport.m4 b/externals/zexy/m4/iem_parallelport.m4
deleted file mode 100644
index f49707bf7e9390cf83526d8d30477ece80f1482c..0000000000000000000000000000000000000000
--- a/externals/zexy/m4/iem_parallelport.m4
+++ /dev/null
@@ -1,39 +0,0 @@
-dnl Copyright (C) 2005-2006 IOhannes m zmölnig
-dnl This file is free software; IOhannes m zmölnig
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([IEM_CHECK_LPT],
-[
-dnl check for LPT
-AC_ARG_ENABLE(lpt,    [  --enable-lpt            enable parallelport-support])
-
-if test "x" = "x${enable_lpt}" ; then
- enable_lpt="${with_lpt}"
-fi
-
-AC_CHECK_HEADERS(linux/ppdev.h, [ have_ppdev=" (with device-support)" ], [ have_ppdev="" ])
-
-if test x"$enable_lpt" != "xno"
-then
-  AC_MSG_CHECKING([parallel-port])
-  if test "x$enable_lpt" = "xyes"
-  then
-# forced
-    AC_DEFINE([Z_WANT_LPT], [1], [Define if you want parallelport support])
-    have_lpt="yes (forced)"
-  else
-    AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/io.h>]], [[ ioperm(0x3bc, 8, 1); outb(0, 0x3bc); ioperm(0x3bc, 8, 0); ]])],
-                    [have_lpt="yes"], [have_lpt="no"])
-  fi
-fi
-
-if test "x$have_lpt" != "xno"; then
- AC_DEFINE([Z_WANT_LPT], [1], [Define if you want line printer support])
- AC_MSG_RESULT([$have_lpt$have_ppdev])
-else
- AC_MSG_RESULT([no])
-fi
-AM_CONDITIONAL([LPT], [test "x${have_lpt}" != "xno"])
-
-]) dnl IEM_CHECK_LPT
diff --git a/externals/zexy/m4/iem_simd.m4 b/externals/zexy/m4/iem_simd.m4
deleted file mode 100644
index 6b8931b1e646daa9d59c9661741ab99bc6ae2079..0000000000000000000000000000000000000000
--- a/externals/zexy/m4/iem_simd.m4
+++ /dev/null
@@ -1,39 +0,0 @@
-dnl Copyright (C) 2005-2006 IOhannes m zmölnig
-dnl This file is free software; IOhannes m zmölnig
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-AC_DEFUN([IEM_CHECK_SIMD],
-[
-AC_ARG_ENABLE(simd,
-       [  --enable-simd=ARCHS
-                          enable SIMD optimization;
-                          valid arguments are: SSE2
-       ],
-       [simd=$enableval], [simd=no])
-if test "$simd" != no; then
-   AC_MSG_CHECKING([SIMD optimization])
-
-   # Respect SIMD given to --enable-simd if present.
-   if test "$simd" != yes; then
-	    SIMD=`echo "$simd" | tr ',' ' '`
-   else
-	    # Choose a default set of architectures based upon platform.
-      SIMD="SSE2"
-   fi
-
-   for smd in $SIMD 
-   do
-    case "${smd}" in
-    SSE2|sse2)
-      AC_MSG_RESULT([SSE2])
-      IEM_CHECK_CFLAGS([-mfpmath=sse -msse])
-      IEM_CHECK_CXXFLAGS([-mfpmath=sse -msse])
-    ;;
-    *)
-      AC_MSG_RESULT([unknown SIMD instructions: ${smd}])
-    ;;
-    esac
-   done
-fi
-])# IEM_CHECK_SIMD
diff --git a/externals/zexy/pd-lib-builder/CHANGELOG.txt b/externals/zexy/pd-lib-builder/CHANGELOG.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5bdfce6c9f2e4276498509d566131a780a8c4f09
--- /dev/null
+++ b/externals/zexy/pd-lib-builder/CHANGELOG.txt
@@ -0,0 +1,104 @@
+Changelog for Makefile.pdlibbuilder.
+
+v0.6.0, dated 2019-12-21
+- detect target platform (OS and architecture) rather than build platform (#55)
+- introduce optional user variable 'PLATFORM' for cross compilation
+- no longer build OSX/MacOS fat binaries by default (#21, #50)
+- do build fat binaries when 'extension=d_fat' is specified for OSX/MacOS
+- fix bug where minimum OSX/MacOS version wasn't defined, and set it to 10.6
+
+v0.5.1, dated 2018-03-15
+Fixes and improvements for Windows builds:
+- properly evaluate variables 'PDDIR' and 'PDBINDIR' to find pd.dll
+- define default path of 32 bit Pd on 64 bit Windows
+- link C++ externals with standard C libs on Windows, they don't load otherwise
+- strip installed Windows binaries by default
+(issues #34, #39, #41, #42 respectively)
+Warning for all platforms: variable 'PD_PATH' is no longer supported, use the
+equivalent 'PDDIR'.
+
+v0.5.0, dated 2018-01-23
+Implement target architecture detection for Windows builds,
+and set appropriate options for 32 and 64 bit (used to be for 32 bit only).
+(feature, issue #37 #38, merge commit 215bf3e)
+
+v0.4.4, dated 2016-11-22
+Use variable 'system' when evaluating 'for{Linux,Darwin,Windows}'
+(bugfix, issue #31, commit 2c14110)
+
+v0.4.3, dated 2016-11-02
+Replace flags '-fpic' by 'fPIC'.
+(bugfix, issue #29, commit 426b38b)
+
+v0.4.2, dated 2016-10-30
+Fix issue where incorrect message about m_pd.h is given.
+(bugfix, commit 2e13d8f)
+
+v0.4.1, dated 2016-10-27
+Respect cflag for minimum OSX version when defined by lib makefile.
+(bugfix, pull request #22, commit 48c4127)
+
+v0.4.0, dated 2016-10-14
+Introduced path variables PDDIR, PDINCLUDEDIR, PDBINDIR, PDLIBDIR which can
+also be defined in environment.
+(feature, issue #27, commit b0dab72)
+
+v0.3.1, dated 2016-10-13
+Fix bug where pd.dll wouldn't be found.
+(bugfix, commit a0c87be)
+
+v0.3.0, dated 2016-10-09
+Variable 'PD_PATH' introduced for pd-extended / pd-l2ork compatibility.
+(feature, issue #26, commit 41e9743)
+
+v0.2.8, dated 2016-10-09
+Allow installed files to contain weird characters (notably '$').
+(bugfix, pull request #20, commit 5b920b1)
+
+v0.2.7, dated 2016-10-04
+Remove all default pd search paths except vanilla's.
+(discussion, issue #25, commit a6a89dc)
+
+v0.2.6, dated 2016-09-20
+Redefined dependency checking so it won't stall rebuilds on OSX.
+(bugfix, issue #16, commit 9fd1795)
+
+v0.2.5, dated 2016-06-26
+Fixed dependency checking for object files in other directories.
+(bugfix, commit f06e550)
+
+v0.2.4, dated 2016-06-25
+Fixed regression bug that disabled all dependency checking.
+(bugfix, commit 1d7bb5e)
+
+v0.2.3, dated 2016-03-29
+Disabled dependency checking for OSX <= 10.5 because it stalled rebuilds.
+(bugfix, issue #16, commit eb614fd)
+
+v0.2.2, dated 2016-03-28
+Removed target 'pre' because it forced rebuild of everything in 'all'.
+(bugfix, issue #17, commit c989c8e)
+
+v0.2.1, dated 2015-12-27
+Implement / respect 'CPPFLAGS','CFLAGS'and 'LDFLAGS'.
+(bugfix, issue #5, commit 98f3582)
+
+v0.2.0, dated 2015-12-19
+Added per-platform multiline defines 'forLinux', 'forDarwin', 'forWindows'.
+(feature, pull request #9, commit 3946ea5)
+
+v0.1.0, dated 2015-12-08
+Added targets 'pre' and 'post' to automatically run before and after 'all'.
+(feature, pull request #4, commit a5678ac)
+
+v0.0.2, dated 2015-12-06
+Improved methods for searching pd paths.
+(bugfix, commit ed37e6b)
+
+v0.0.1, dated 2015-10-31
+Fixed expansion of variable 'lib.version'.
+(bugfix, issue #1, commit 974b617)
+
+v0.0.0, dated 2015-06-24
+Initial version.
+(commit 16517a2)
diff --git a/externals/zexy/pd-lib-builder/Makefile.pdlibbuilder b/externals/zexy/pd-lib-builder/Makefile.pdlibbuilder
new file mode 100644
index 0000000000000000000000000000000000000000..7d6c11cdb2703f76838f7e5fe96c92d8d07d3222
--- /dev/null
+++ b/externals/zexy/pd-lib-builder/Makefile.pdlibbuilder
@@ -0,0 +1,1336 @@
+# Makefile.pdlibbuilder dated 2019-12-21
+version = 0.6.0
+
+# Helper makefile for Pure Data external libraries.
+# Written by Katja Vetter March-June 2015 for the public domain. No warranties.
+# Inspired by Hans Christoph Steiner's Makefile Template and Stephan Beal's
+# ShakeNMake.
+#
+# Grab the newest version of Makefile.pdlibbuilder from
+#    https://github.com/pure-data/pd-lib-builder/
+#
+# GNU make version >= 3.81 required.
+#
+#
+#=== characteristics ===========================================================
+#
+#
+# - defines build settings based on autodetected OS and architecture
+# - defines rules to build Pd class- or lib executables from C or C++ sources
+# - defines rules for libdir installation
+# - defines convenience targets for developer and user
+# - evaluates implicit dependencies for non-clean builds
+#
+#
+#=== basic usage ===============================================================
+#
+#
+# In your Makefile, define your Pd lib name and class files, and include
+# Makefile.pdlibbuilder at the end of the Makefile. Like so:
+#
+#    ________________________________________________________________________
+#
+#     # Makefile for mylib
+#
+#     lib.name = mylib
+#
+#     class.sources = myclass1.c myclass2.c
+#
+#     datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt
+#
+#     include Makefile.pdlibbuilder
+#    ________________________________________________________________________
+#
+#
+# For files in class.sources it is assumed that class basename == source file
+# basename. The default target builds all classes as individual executables
+# with Pd's default extension for the platform. For anything more than the
+# most basic usage, continue reading.
+#
+#
+#=== list of Makefile.pdlibbuilder API variables ===============================
+#
+#
+# Variables available for definition in your library Makefile:
+#
+# - lib.name
+# - lib.setup.sources
+# - class.sources
+# - common.sources
+# - shared.sources
+# - <classname>.class.sources
+# - <classname>.class.ldflags
+# - <classname>.class.ldlibs
+# - cflags
+# - ldflags
+# - ldlibs
+# - datafiles
+# - datadirs
+# - makefiles
+# - makefiledirs
+# - externalsdir
+#
+# Optional multiline defines evaluated per operating system:
+#
+# - forLinux
+# - forDarwin
+# - forWindows
+#
+# Variables available for your makefile or make command line:
+#
+# - make-lib-executable
+# - suppress-wunused
+#
+# Path variables for make command line or environment:
+#
+# - PDDIR
+# - PDINCLUDEDIR
+# - PDBINDIR
+# - PDLIBDIR
+#
+# Standard make variables for make command line or environment:
+#
+# - CPPFLAGS
+# - CFLAGS
+# - LDFLAGS
+# - CC
+# - CXX
+# - INSTALL
+# - STRIP
+# - DESTDIR
+#
+# Optional user variables for make command line or environment:
+#
+# - PLATFORM
+#
+# Deprecated path variables:
+#
+# - pdincludepath
+# - pdbinpath
+# - objectsdir
+#
+#
+#=== descriptions of Makefile.pdlibbuilder API variables =======================
+#
+#
+# lib.name:
+# Name of the library directory as it will be installed / distributed. Also the
+# name of the lib executable in the case where all classes are linked into
+# a single binary.
+#
+# lib.setup.sources:
+# Source file(s) (C or C++) which must be compiled only when linking all classes
+# into a single lib binary.
+#
+# class.sources:
+# All sources files (C or C++) for which the condition holds that
+# class name == source file basename.
+#
+# <classname>.class.sources:
+# Source file(s) (C or C++) specific to class <classname>. Use this for
+# multiple-source classes or when class name != source file basename.
+#
+# common.sources:
+# Source file(s) which must be statically linked to each class in the library.
+#
+# shared.sources:
+# Source file(s) (C or C++) to build a shared dynamic link lib, to be linked
+# with all class executables.
+#
+# cflags, ldflags, ldlibs:
+# Define cflags (preprocessor&compiler), ldflags (linker) and ldlibs (dynamic
+# link libs) for the whole library. These flags are added to platform-specific
+# flags defined by Makefile.pdlibbuilder.
+#
+# <classname>.class.ldflags and <classname>.class.ldlibs:
+# Define ldflags resp. ldlibs specific to class <classname>. These flags are
+# added to platform-specific flags defined by Makefile.pdlibbuilder, and flags
+# defined in your Makefile for the whole library. Note: cflags can not be
+# defined per class in the current implementation.
+#
+# datafiles and datadirs:
+# All extra files you want to include in binary distributions of the
+# library: abstractions and help patches, example patches, meta patch, readme
+# and license texts, manuals, sound files, etcetera. Use 'datafiles' for all
+# files that should go into your lib rootdir and 'datadirs' for complete
+# directories you want to copy from source to distribution.
+#
+# forLinux, forDarwin, forWindows:
+# Shorthand for 'variable definitions for Linux only' etc. Use like:
+#    define forLinux
+#      cflags += -DLINUX
+#      class.sources += linuxthing.c
+#    endef
+#
+# makefiles and makefiledirs:
+# Extra makefiles or directories with makefiles that should be made in sub-make
+# processes.
+#
+# make-lib-executable:
+# When this variable is defined 'yes' in your makefile or as command argument,
+# Makefile.pdlibbuilder will try to build all classes into a single library
+# executable (but it will force exit if lib.setup.sources is undefined).
+# If your makefile defines 'make-lib-executable=yes' as the library default,
+# this can still be overridden with 'make-lib-executable=no' as command argument
+# to build individual class executables (the Makefile.pdlibbuilder default.)
+#
+# suppress-wunused:
+# When this variable is defined ('yes' or any other value), -Wunused-variable,
+# -Wunused-parameter, -Wunused-value and -Wunused-function are suppressed,
+# but the other warnings from -Wall are retained.
+#
+# PDDIR:
+# Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and
+# PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin.
+#
+# PDINCLUDEDIR:
+# Directory where Pd API m_pd.h should be found, and other Pd header files.
+# Overrides the default search path.
+#
+# PDBINDIR:
+# Directory where pd.dll should be found for linking (Windows only). Overrides
+# the default search path.
+#
+# PDLIBDIR:
+# Root directory for installation of Pd library directories. Overrides the
+# default install location.
+#
+# DESTDIR:
+# Prepended path component for staged install.
+#
+# PLATFORM:
+# Target platform for cross compilation in the form of GNU triplet:
+# cpu-vendor-os. Example: x86_64-w64-mingw32. This specifies the tool chain that
+# pdlibbuilder will use, if installed and locatable. System and architecture
+# will then be autodefined accordingly. In most cases no other variables need to
+# be overridden.
+#
+# CPPFLAGS:
+# Preprocessor flags which are not strictly required for building.
+#
+# CFLAGS:
+# Compiler flags which are not strictly required for building. Compiler flags
+# defined by Makefile.pdlibbuilder for warning, optimization and architecture
+# specification are overriden by CFLAGS.
+#
+# LDFLAGS:
+# Linker flags which are not strictly required for building. Linker flags
+# defined by Makefile.pdlibbuilder for architecture specification are overriden
+# by LDFLAGS.
+#
+# CC and CXX:
+# C and C++ compiler programs as defined in your build environment.
+#
+# INSTALL
+# Definition of install program.
+#
+# STRIP
+# Name of strip program. Default 'strip' can be overridden in cross compilation
+# environments.
+#
+# objectsdir:
+# Root directory for installation of Pd library directories, like PDLIBDIR but
+# not overridable by environment. Supported for compatibility with pd-extended
+# central makefile, but deprecated otherwise.
+#
+# pdincludepath, pdbinpath:
+# As PDINCLUDEDIR and PDBINDIR but not overridable by environment. Deprecated
+# as user variables.
+#
+#
+#=== paths =====================================================================
+#
+#
+# Source files in directories other than current working directory must be
+# prefixed with their relative path. Do not rely on VPATH or vpath.
+# Object (.o) files are built in the directory of their source files.
+# Executables are built in current working directory.
+#
+# Default search path for m_pd.h and other API header files is platform
+# dependent, and overridable by PDINCLUDEDIR:
+#
+# Linux:    /usr/include/pd
+#
+# OSX:      /Applications/Pd*.app/Contents/Resources/src
+#
+# Windows:  %PROGRAMFILES%/Pd/src
+#           %PROGRAMFILES(X86)%/Pd/src (32 bit builds on 64 bit Windows)
+#
+# Default search path for binary pd.dll (Windows), overridable by PDBINDIR
+#
+#           %PROGRAMFILES%/Pd/bin
+#           %PROGRAMFILES(X86)%/Pd/bin (32 bit builds on 64 bit Windows)
+#
+# Default location to install pd libraries is platform dependent, and
+# overridable by PDLIBDIR:
+#
+# Linux:    /usr/local/lib/pd-externals
+# OSX:      ~/Library/Pd
+# Windows:  %APPDATA%/Pd
+#
+# https://puredata.info/docs/faq/how-do-i-install-externals-and-help-files
+# The rationale for not installing to ~/pd-externals by default on Linux
+# is that some people share the home dir between 32 and 64 bit installations.
+#
+#
+#=== targets ===================================================================
+#
+#
+# all: build $(executables) plus optional post target
+# post: target to build after $(executables)
+# alldebug: build all with -g option turned on for debug symbols
+# <classname>: force clean build of an individual class
+# <sourcefile>.pre: make preprocessor output file in current working directory
+# <sourcefile>.lst: make asm/source output file in current working directory
+#
+# install: install executables and data files
+# clean: remove build products from source tree
+#
+# help: print help text
+# vars: print makefile variables
+# allvars: print all variables
+# depend: print generated prerequisites
+# dumpmachine: print compiler output of option '-dumpmachine'
+# coffee: dummy target
+#
+# Variable $(executables) expands to class executables plus optional shared lib,
+# or alternatively to single lib executable when make-lib-executable=true.
+# Targets pre and post can be defined by library makefile. Make sure to include
+# Makefile.pdlibbuilder first so default target all will not be redefined.
+#
+#
+#=== Pd-extended libdir concept ================================================
+#
+#
+# For libdir layout as conceived by Hans-Christoph Steiner, see:
+#
+# https://puredata.info/docs/developer/Libdir
+#
+# Files README.txt, LICENSE.txt and <lib.name>-meta.pd are part of the libdir
+# convention. Help patches for each class and abstraction are supposed to be
+# available. Makefile.pdlibbuilder does not force the presence of these files
+# however. It does not automatically include such files in libdir installations.
+# Data files you want to include in distributions must be defined explicitly in
+# your Makefile.
+#
+#
+#=== Makefile.pdlibbuilder syntax conventions ==================================
+#
+#
+# Makefile.pdlibbuilder variable names are lower case. Default make variables,
+# environment variables, and standard user variables (CC, CXX, CFLAGS, DESTDIR)
+# are upper case. Use target 'allvars' to print all variables and their values.
+#
+# 'Fields' in data variables are separated by dots, like in 'foo.class.sources'.
+# Words in variables expressing a function or command are separated by dashes,
+# like in 'make-lib-executable'.
+#
+#
+#=== useful make options =======================================================
+#
+#
+# Use 'make -d <target>' to print debug details of the make process.
+# Use 'make -p <target>' to print make's database.
+#
+#
+#=== TODO ======================================================================
+#
+#
+# - decide whether to use -static-libgcc or shared dll in MinGW
+# - cygwin support
+# - android support
+# - figure out how to handle '$' in filenames
+# - add makefile template targets dpkg-source dist libdir distclean tags?
+#
+#
+#=== end of documentation sections =============================================
+#
+#
+################################################################################
+################################################################################
+################################################################################
+
+
+# GNU make version 3.81 (2006) or higher is required because of the following:
+# - function 'info'
+# - variable '.DEFAULT_GOAL'
+
+# force exit when make version is < 3.81
+ifneq ($(firstword $(sort 3.81 $(MAKE_VERSION))), 3.81)
+  $(error GNU make version 3.81 or higher is required)
+endif
+
+# Relative path to externals root dir in multi-lib source tree like
+# pd-extended SVN. Default is parent of current working directory. May be
+# defined differently in including makefile.
+externalsdir ?= ..
+
+# variable you can use to check if Makefile.pdlibbuilder is already included
+Makefile.pdlibbuilder = true
+
+
+################################################################################
+### variables: library name and version ########################################
+################################################################################
+
+
+# strip possibles spaces from lib.name, they mess up calculated file names
+lib.name := $(strip $(lib.name))
+
+# if meta file exists, check library version
+metafile := $(wildcard $(lib.name)-meta.pd)
+
+ifdef metafile
+  lib.version := $(shell sed -n \
+    's|^\#X text [0-9][0-9]* [0-9][0-9]* VERSION \(.*\);|\1|p' \
+    $(metafile))
+endif
+
+
+################################################################################
+### variables: files ###########################################################
+################################################################################
+
+
+#=== sources ===================================================================
+
+
+# (re)define <classname>.class.sources using file names in class.sources
+
+define add-class-source
+$(notdir $(basename $v)).class.sources += $v
+endef
+
+$(foreach v, $(class.sources), $(eval $(add-class-source)))
+
+# derive class names from <classname>.class.sources variables
+sourcevariables := $(filter %.class.sources, $(.VARIABLES))
+classes := $(basename $(basename $(sourcevariables)))
+
+# accumulate all source files specified in makefile
+classes.sources := $(sort $(foreach v, $(sourcevariables), $($v)))
+all.sources := $(classes.sources) $(lib.setup.sources) \
+  $(shared.sources) $(common.sources)
+
+
+#=== object files ==============================================================
+
+
+# construct object filenames from all C and C++ source file names
+classes.objects := $(addsuffix .o, $(basename $(classes.sources)))
+common.objects := $(addsuffix .o, $(basename $(common.sources)))
+shared.objects := $(addsuffix .o, $(basename $(shared.sources)))
+lib.setup.objects := $(addsuffix .o, $(basename $(lib.setup.sources)))
+all.objects = $(classes.objects) $(common.objects) $(shared.objects) \
+  $(lib.setup.objects)
+
+
+#=== executables ===============================================================
+
+
+# use recursive variables here because executable extension is not yet known
+
+# construct class executable names from class names
+classes.executables = $(addsuffix .$(extension), $(classes))
+
+# construct shared lib executable name if shared sources are defined
+ifdef shared.sources
+  shared.lib = lib$(lib.name).$(shared.extension)
+else
+  shared.lib =
+endif
+
+
+################################################################################
+### target platform detection ##################################################
+################################################################################
+
+
+#=== target platform ===========================================================
+
+
+# PLATFORM: optional user variable to define target platform for cross
+# compilation. Redefine build tools accordingly. PLATFORM should match
+# the exact target prefix of tools present in $PATH, like x86_64-w64-mingw32,
+# x86_64-apple-darwin12 etc. Tool definitions are exported to ensure submakes
+# will get the same.
+
+ifneq ($(PLATFORM),)
+  ifneq ($(findstring darwin, $(PLATFORM)),)
+    export CC = $(PLATFORM)-cc
+    export CXX = $(PLATFORM)-c++
+    export CPP = $(PLATFORM)-cc
+  else
+    export CC = $(PLATFORM)-gcc
+    export CXX = $(PLATFORM)-g++
+    export CPP = $(PLATFORM)-cpp
+  endif
+  STRIP = $(PLATFORM)-strip
+endif
+
+# Let (native or cross-) compiler report target triplet and isolate individual
+# words therein to facilitate later processing.
+target.triplet := $(subst -, ,$(shell $(CC) -dumpmachine))
+
+
+#=== operating system ==========================================================
+
+
+# The following systems are defined: Linux, Darwin, Windows. GNU and
+# GNU/kFreeBSD are treated as Linux to get the same options.
+
+ifneq ($(filter linux gnu% kfreebsd, $(target.triplet)),)
+  system = Linux
+endif
+
+ifneq ($(filter darwin%, $(target.triplet)),)
+  system = Darwin
+endif
+
+ifneq ($(filter mingw% cygwin%, $(target.triplet)),)
+  system = Windows
+endif
+
+# evaluate possible system-specific multiline defines from library makefile
+$(eval $(for$(system)))
+
+
+# TODO: Cygwin, Android
+
+
+#=== architecture ==============================================================
+
+
+# The following CPU names can be processed by pdlibbuilder:
+# i*86    Intel 32 bit
+# x86_64  Intel 64 bit
+# arm     ARM 32 bit
+# aarch64 ARM 64 bit
+
+target.arch := $(firstword $(target.triplet))
+
+
+################################################################################
+### variables per platform #####################################################
+################################################################################
+
+
+#=== flags per architecture ====================================================
+
+
+# Set architecture-dependent cflags, mainly for Linux. For Mac and Windows,
+# arch.c.flags are overriden below. To see gcc's default architecture flags:
+# $ gcc -Q --help=target
+
+# ARMv6: Raspberry Pi 1st gen, not detectable from target.arch
+ifeq ($(shell uname), armv6l)
+  arch.c.flags = -march=armv6 -mfpu=vfp -mfloat-abi=hard
+
+# ARMv7: Beagle, Udoo, RPi2 etc.
+else ifeq ($(target.arch), arm)
+  arch.c.flags = -march=armv7-a -mfpu=vfpv3 -mfloat-abi=hard
+
+# ARMv8 64 bit, not tested yet
+else ifeq ($(target.arch), aarch64)
+  arch.c.flags = -mcpu=cortex-a53
+
+# Intel 32 bit, build with SSE and SSE2 instructions
+else ifneq ($(filter i%86, $(target.arch)),)
+  arch.c.flags = -march=pentium4 -mfpmath=sse -msse -msse2
+
+# Intel/AMD 64 bit, build with SSE, SSE2 and SSE3 instructions
+else ifeq ($(target.arch), x86_64)
+  arch.c.flags = -march=core2 -mfpmath=sse -msse -msse2 -msse3
+
+# if none of the above architectures detected
+else
+  arch.c.flags =
+endif
+
+
+#=== flags and paths for Linux =================================================
+
+
+ifeq ($(system), Linux)
+  prefix = /usr/local
+  libdir := $(prefix)/lib
+  pkglibdir = $(libdir)/pd-externals
+  pdincludepath := $(wildcard /usr/include/pd)
+  extension = pd_linux
+  cpp.flags := -DUNIX
+  c.flags := -fPIC
+  c.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  c.ldlibs := -lc -lm
+  cxx.flags := -fPIC -fcheck-new
+  cxx.ldflags := -rdynamic -shared -fPIC -Wl,-rpath,"\$$ORIGIN",--enable-new-dtags
+  cxx.ldlibs := -lc -lm -lstdc++
+  shared.extension = so
+  shared.ldflags := -rdynamic -fPIC -shared -Wl,-soname,$(shared.lib)
+endif
+
+
+#=== flags and paths for Darwin ================================================
+
+
+# LLVM-clang doesn't support -fcheck-new, therefore this flag is only used when
+# compiling with g++.
+
+ifeq ($(system), Darwin)
+  pkglibdir = $(HOME)/Library/Pd
+  pdincludepath := $(firstword $(wildcard \
+    /Applications/Pd*.app/Contents/Resources/src))
+  extension = pd_darwin
+  cpp.flags := -DUNIX -DMACOSX -I /sw/include
+  c.flags :=
+  c.ldflags := -undefined suppress -flat_namespace -bundle
+  c.ldlibs := -lc
+  cxx.ldflags := -undefined suppress -flat_namespace -bundle
+  cxx.ldlibs := -lc
+  shared.extension = dylib
+  shared.ldflags = -dynamiclib -undefined dynamic_lookup \
+    -install_name @loader_path/$(shared.lib) \
+    -compatibility_version 1 -current_version 1.0
+  ifneq ($(filter %g++, $(CXX)),)
+    cxx.flags := -fcheck-new
+  endif
+  ifeq ($(extension), d_fat)
+    arch := i386 x86_64
+  else
+    arch := $(target.arch)
+  endif
+  ifneq ($(filter -mmacosx-version-min=%, $(cflags)),)
+    version.flag := $(filter -mmacosx-version-min=%, $(cflags))
+  else
+    version.flag = -mmacosx-version-min=10.6
+  endif
+  arch.c.flags := $(addprefix -arch , $(arch)) $(version.flag)
+  arch.ld.flags := $(arch.c.flags)
+endif
+
+
+#=== flags and paths for Windows ===============================================
+
+
+# Standard paths on Windows contain spaces, and GNU make functions treat such
+# paths as lists, with unintended effects. Therefore we must use shell function
+# ls instead of make's wildcard when probing for a path, and use double quotes
+# when specifying a path in a command argument.
+
+# Default paths in Mingw / Mingw-w64 environments. 'PROGRAMFILES' is standard
+# location for builds with native architecture, 'ProgramFiles(x86)' for i686
+# builds on x86_64 Windows (detection method by Lucas Cordiviola). Curly braces
+# required because of parentheses in variable name.
+ifeq ($(system), Windows)
+  pkglibdir := $(APPDATA)/Pd
+  ifeq ($(target.arch), i686)
+    programfiles := ${ProgramFiles(x86)}
+  else
+    programfiles := $(PROGRAMFILES)
+  endif
+  pdbinpath := $(programfiles)/Pd/bin
+  pdincludepath := $(programfiles)/Pd/src
+endif
+
+# Store default path to pd.dll in PDBINDIR if the latter is not user-defined.
+# For include path this is done in the platform-independent paths section below,
+# but for PDBINDIR it is done here so ld flags can be evaluated as immediate
+# variables.
+ifeq ($(system), Windows)
+  ifdef PDDIR
+    PDBINDIR := $(PDDIR)/bin
+  endif
+  PDBINDIR ?= $(pdbinpath)
+endif
+
+# TODO: decide whether -mms-bitfields should be specified.
+ifeq ($(system), Windows)
+  cpp.flags := -DMSW -DNT
+  ifeq ($(target.arch), i686)
+     arch.c.flags := -march=pentium4 -msse -msse2 -mfpmath=sse
+  else ifeq ($(target.arch), x86_64)
+    cpp.flags := -DMSW -DNT -DPD_LONGINTTYPE=__int64
+    arch.c.flags := -march=core2 -msse -msse2 -msse3 -mfpmath=sse
+  else
+    arch.c.flags =
+  endif
+  extension = dll
+  c.flags :=
+  c.ldflags := -static-libgcc -shared \
+    -Wl,--enable-auto-import "$(PDBINDIR)/pd.dll"
+  c.ldlibs :=
+  cxx.flags := -fcheck-new
+  cxx.ldflags := -static-libgcc -static-libstdc++ -shared \
+    -Wl,--enable-auto-import "$(PDBINDIR)/pd.dll"
+  cxx.ldlibs :=
+  shared.extension = dll
+  shared.ldflags := -static-libgcc -shared "$(PDBINDIR)/pd.dll"
+  stripflags = --strip-all
+endif
+
+
+#=== paths =====================================================================
+
+
+# Platform-dependent default paths are specified above, but overridable.
+# Path variables in upper case can be defined as make command argument or in the
+# environment. Variable 'objectsdir' is supported for compatibility with
+# the build system that pd-l2ork has inherited from pd-extended.
+
+PDINCLUDEDIR ?= $(pdincludepath)
+PDLIBDIR ?= $(firstword $(objectsdir) $(pkglibdir))
+
+ifdef PDDIR
+  PDINCLUDEDIR := $(wildcard $(PDDIR)/src)
+endif
+
+# base path where all components of the lib will be installed by default
+installpath := $(DESTDIR)$(PDLIBDIR)/$(lib.name)
+
+# check if include path contains spaces (as is often the case on Windows)
+# if so, store the path so we can later do checks with it
+pdincludepathwithspaces := $(if $(word 2, $(PDINCLUDEDIR)), $(PDINCLUDEDIR))
+
+
+#=== accumulated build flags ===================================================
+
+
+# From GNU make docs: 'Users expect to be able to specify CFLAGS freely
+# themselves.' So we use CFLAGS to define options which  are not strictly
+# required for compilation: optimizations, architecture specifications, and
+# warnings. CFLAGS can be safely overriden using a make command argument.
+# Variables cflags, ldflags and ldlibs may be defined in including makefile.
+
+optimization.flags = -O3 -ffast-math -funroll-loops -fomit-frame-pointer
+warn.flags = -Wall -Wextra -Wshadow -Winline -Wstrict-aliasing
+
+# suppress -Wunused-variable & Co if you don't want to clutter a build log
+ifdef suppress-wunused
+  warn.flags += $(addprefix -Wno-unused-, function parameter value variable)
+endif
+
+CFLAGS = $(warn.flags) $(optimization.flags) $(arch.c.flags)
+
+# preprocessor flags
+cpp.flags := -DPD -I "$(PDINCLUDEDIR)" $(cpp.flags) $(CPPFLAGS)
+
+# flags for dependency checking (cflags from makefile may define -I options)
+depcheck.flags := $(cpp.flags) $(cflags)
+
+# architecture specifications for linker are overridable by LDFLAGS
+LDFLAGS := $(arch.ld.flags)
+
+# now add the same ld flags to shared dynamic lib
+shared.ldflags := $(shared.ldflags) $(LDFLAGS)
+
+# accumulated flags for C compiler / linker
+c.flags := $(cpp.flags) $(c.flags) $(cflags) $(CFLAGS)
+c.ldflags := $(c.ldflags) $(ldflags) $(LDFLAGS)
+c.ldlibs := $(c.ldlibs) $(ldlibs)
+
+# accumulated flags for C++ compiler / linker
+cxx.flags := $(cpp.flags) $(cxx.flags) $(cflags) $(CFLAGS)
+cxx.ldflags := $(cxx.ldflags) $(ldflags) $(LDFLAGS)
+cxx.ldlibs := $(cxx.ldlibs) $(ldlibs)
+
+
+################################################################################
+### variables: tools ###########################################################
+################################################################################
+
+
+# aliases so we can later define 'compile-$1' and set 'c' or 'cxx' as argument
+compile-c := $(CC)
+compile-cxx := $(CXX)
+
+
+################################################################################
+### checks #####################################################################
+################################################################################
+
+
+# At this point most variables are defined. Now do some checks and info's
+# before rules begin.
+
+# print Makefile.pdlibbuilder version before possible termination
+$(info ++++ info: using Makefile.pdlibbuilder version $(version))
+
+# Terminate if target triplet remained empty, to avoid all sorts of confusing
+# scenarios and spurious bugs.
+ifeq ($(target.triplet),)
+  $(error Command "$(CC) -dumpmachine" did not return a target triplet, \
+  needed for a build. \
+  Is compiler "$(CC)" installed in your PATH? ($(PATH)). \
+  Does compiler "$(CC)" support option "-dumpmachine"?)
+endif
+
+# 'forward declaration' of default target, needed to do checks
+all:
+
+# To avoid unpredictable results, make sure the default target is not redefined
+# by including makefile.
+ifneq ($(.DEFAULT_GOAL), all)
+  $(error Default target must be 'all'.)
+endif
+
+# find out which target(s) will be made
+ifdef MAKECMDGOALS
+  goals := $(MAKECMDGOALS)
+else
+  goals := all
+endif
+
+# store path to Pd API m_pd.h if it is found
+ifdef PDINCLUDEDIR
+  mpdh := $(shell ls "$(PDINCLUDEDIR)/m_pd.h")
+endif
+
+# store path to pd.dll; if not found, ls will give a useful error
+ifeq ($(system), Windows)
+  pddll := $(shell ls "$(PDBINDIR)/pd.dll")
+endif
+
+# when making target all, check if m_pd.h is found and print info about it
+ifeq ($(goals), all)
+  $(if $(mpdh), \
+    $(info ++++ info: using Pd API $(mpdh)), \
+    $(warning Where is Pd API m_pd.h? Do 'make help' for info.))
+endif
+
+# print target info
+$(info ++++ info: making target $(goals) $(if $(lib.name),in lib $(lib.name)))
+
+# when installing, print installpath info
+$(if $(filter install install-lib, $(goals)), $(info ++++ info: \
+  installpath is '$(installpath)'))
+
+
+#=== define executables ========================================================
+
+
+# By default we build class executables, and optionally a shared dynamic link
+# lib. When make-lib-executable=yes we build all classes into a single lib
+# executable, on the condition that variable lib.setup.sources is defined.
+
+ifeq ($(make-lib-executable),yes)
+  $(if $(lib.setup.sources), ,\
+    $(error Can not build library blob because lib.setup.sources is undefined))
+  executables := $(lib.name).$(extension)
+else
+  executables := $(classes.executables) $(shared.lib)
+endif
+
+
+################################################################################
+### rules: special targets #####################################################
+################################################################################
+
+
+# Disable built-in rules. If some target can't be built with the specified
+# rules, it should not be built at all.
+MAKEFLAGS += --no-builtin-rules
+
+.PRECIOUS:
+.SUFFIXES:
+.PHONY: all post build-lib \
+        $(classes) $(makefiledirs) $(makefiles) \
+        install install-executables install-datafiles install-datadirs \
+        force clean vars allvars depend help
+
+
+################################################################################
+### rules: build targets #######################################################
+################################################################################
+
+
+# Target all forces the build of targets [$(executables) post] in
+# deterministic order. Target $(executables) builds class executables plus
+# optional shared lib or alternatively a single lib executable when
+# make-lib-executable=true. Target post is optionally defined by
+# library makefile.
+
+all: post
+post: $(executables)
+
+all:
+	$(info ++++info: target all in lib $(lib.name) completed)
+
+# build all with -g option turned on for debug symbols
+alldebug: c.flags += -g
+alldebug: cxx.flags += -g
+alldebug: all
+
+
+#=== class executable ==========================================================
+
+
+# recipe for linking objects in class executable
+# argument $1 = compiler type (c or cxx)
+# argument $2 = class basename
+define link-class
+  $(compile-$1) \
+  $($1.ldflags) $($2.class.ldflags) \
+  -o $2.$(extension) \
+  $(addsuffix .o, $(basename $($2.class.sources))) \
+  $(addsuffix .o, $(basename $(common.sources))) \
+  $($1.ldlibs) $($2.class.ldlibs) $(shared.lib)
+endef
+
+# general rule for linking object files in class executable
+%.$(extension): $(shared.lib)
+	$(info ++++ info: linking objects in $@ for lib $(lib.name))
+	$(if $(filter %.cc %.cpp, $($*.class.sources)), \
+        $(call link-class,cxx,$*), \
+        $(call link-class,c,$*))
+
+
+#=== library blob ==============================================================
+
+
+# build all classes into single executable
+build-lib: $(lib.name).$(extension)
+	$(info ++++ info: library blob $(lib.name).$(extension) completed)
+
+# recipe for linking objects in lib executable
+# argument $1 = compiler type (c or cxx)
+define link-lib
+  $(compile-$1) \
+  $($1.ldflags) $(lib.ldflags) \
+  -o $(lib.name).$(extension) $(all.objects) \
+  $($1.ldlibs) $(lib.ldlibs)
+endef
+
+# rule for linking objects in lib executable
+# declared conditionally to avoid name clashes
+ifeq ($(make-lib-executable),yes)
+$(lib.name).$(extension): $(all.objects)
+	$(if $(filter %.cc %.cpp, $(all.sources)), \
+        $(call link-lib,cxx), \
+        $(call link-lib,c))
+endif
+
+
+#=== shared dynamic lib ========================================================
+
+
+# recipe for linking objects in shared executable
+# argument $1 = compiler type (c or cxx)
+define link-shared
+  $(compile-$1) \
+  $(shared.ldflags) \
+  -o lib$(lib.name).$(shared.extension) $(shared.objects) \
+  $($1.ldlibs) $(shared.ldlibs)
+endef
+
+# rule for linking objects in shared executable
+# build recipe is in macro 'link-shared'
+lib$(lib.name).$(shared.extension): $(shared.objects)
+	$(info ++++ info: linking objects in shared lib $@)
+	$(if $(filter %.cc %.cpp, $(shared.sources)), \
+        $(call link-shared,cxx), \
+        $(call link-shared,c))
+
+
+#=== object files ==============================================================
+
+
+# recipe to make .o file from source
+# argument $1 is compiler type (c or cxx)
+define make-object-file
+  $(info ++++ info: making $@ in lib $(lib.name))
+  $(compile-$1) \
+  $($1.flags) \
+  -o $@ -c $<
+endef
+
+# Three rules to create .o files. These are double colon 'terminal' rules,
+# meaning they are the last in a rules chain.
+
+%.o:: %.c
+	$(call make-object-file,c)
+
+%.o:: %.cc
+	$(call make-object-file,cxx)
+
+%.o:: %.cpp
+	$(call make-object-file,cxx)
+
+
+#=== explicit prerequisites for class executables ==============================
+
+
+# For class executables, prerequisite rules are declared in run time. Target
+# 'depend' prints these rules for debugging purposes.
+
+# declare explicit prerequisites rule like 'class: class.extension'
+# argument $v is class basename
+define declare-class-target
+$v: $v.$(extension)
+endef
+
+# declare explicit prerequisites rule like 'class.extension: object1.o object2.o'
+# argument $v is class basename
+define declare-class-executable-target
+$v.$(extension): $(addsuffix .o, $(basename $($v.class.sources))) \
+  $(addsuffix .o, $(basename $(common.sources)))
+endef
+
+# evaluate explicit prerequisite rules for all classes
+$(foreach v, $(classes), $(eval $(declare-class-target)))
+$(foreach v, $(classes), $(eval $(declare-class-executable-target)))
+
+
+#=== implicit prerequisites for class executables ==============================
+
+
+# Evaluating implicit prerequisites (header files) with help from the
+# preprocessor is 'expensive' so this is done conditionally and selectively.
+# Note that it is also possible to trigger a build via install targets, in
+# which case implicit prerequisites are not checked.
+
+# When the Pd include path contains spaces it will mess up the implicit
+# prerequisites rules.
+disable-dependency-tracking := $(strip $(pdincludepathwithspaces))
+
+ifndef disable-dependency-tracking
+  must-build-everything := $(filter all, $(goals))
+  must-build-class := $(filter $(classes), $(goals))
+  must-build-sources := $(foreach v, $(must-build-class), $($v.class.sources))
+endif
+
+# declare implicit prerequisites rule like 'object.o: header1.h header2.h ...'
+# argument $1 is input source file(s)
+# dir is explicitly added because option -MM strips it by default
+define declare-object-target
+$(dir $1)$(filter %.o: %.h, $(shell $(CPP) $(depcheck.flags) -MM $1)) $(MAKEFILE_LIST)
+endef
+
+# evaluate implicit prerequisite rules when rebuilding everything
+ifdef must-build-everything
+  $(if $(wildcard $(all.objects)), \
+  $(info ++++ info: evaluating implicit prerequisites in lib $(lib.name).....) \
+  $(foreach v, $(all.sources), $(eval $(call declare-object-target, $v))))
+endif
+
+# evaluate implicit prerequisite rules when selectively building classes
+ifdef must-build-class
+  $(foreach v, $(must-build-sources), \
+  $(eval $(call declare-object-target, $v)))
+  $(foreach v, $(shared.sources), \
+  $(eval $(call declare-object-target, $v)))
+endif
+
+
+################################################################################
+### rules: preprocessor and assembly files #####################################
+################################################################################
+
+
+# Preprocessor and assembly output files for bug tracing etc. They are not part
+# of the build processes for executables. By default these files are created in
+# the current working directory. Dependency tracking is not performed, the build
+# is forced instead to make sure it's up to date.
+
+force:
+
+
+#=== preprocessor file =========================================================
+
+
+# make preprocessor output file with extension .pre
+# argument $1 = compiler type (c or cxx)
+define make-preprocessor-file
+  $(info ++++ info: making preprocessor output file $(notdir $*.pre) \
+  in current working directory)
+  $(compile-$1) -E $< $(c.flags) $($1.flags) -o $(notdir $*.pre)
+endef
+
+%.pre:: %.c force
+	$(call make-preprocessor-file,c)
+
+%.pre:: %.cc force
+	$(call make-preprocessor-file,cxx)
+
+%.pre:: %.cpp force
+	$(call make-preprocessor-file,cxx)
+
+
+#=== assembly file =============================================================
+
+
+# make C / assembly interleaved output file with extension .lst
+# argument $1 = compiler type (c or cxx)
+define make-assembly-file
+  $(info ++++ info: making assembly output file $(notdir $*.lst) \
+  in current working directory)
+  $(compile-$1) \
+  -c -Wa,-a,-ad -fverbose-asm \
+  $($1.flags) \
+  $< > $(notdir $*.lst)
+endef
+
+%.lst:: %.c force
+	$(call make-assembly-file,c)
+
+%.lst:: %.cc force
+	$(call make-assembly-file,cxx)
+
+%.lst:: %.cpp force
+	$(call make-assembly-file,cxx)
+
+
+################################################################################
+### rules: installation targets ################################################
+################################################################################
+
+
+#=== strip =====================================================================
+
+
+# Stripping of installed binaries will only be done when variable 'stripflags'
+# is defined non-empty. No default definition is provided except for Windows
+# where the unstripped binaries are large, especially in the case of Mingw-w64.
+
+# Note: while stripping all symbols ('-s' or '--strip-all') is possible for
+# Linux and Windows, in the case of OSX only non-global symbols can be stripped
+# (option '-x' or '--discard-all').
+
+# Make definition of strip command overridable so it can be defined in an
+# environment for cross-compilation.
+STRIP ?= strip
+
+# Commands in 'strip-executables' will be executed conditionally in the rule for
+# target 'install-executables'.
+strip-executables = cd "$(installpath)" && \
+  $(foreach v, $(executables), $(STRIP) $(stripflags) '$v';)
+
+
+#=== install ===================================================================
+
+
+# Install targets depend on successful exit status of target all because nothing
+# must be installed in case of a build error.
+
+# -p = preserve time stamps
+# -m = set permission mode (as in chmod)
+# -d = create all components of specified directories
+INSTALL = install
+INSTALL_PROGRAM := $(INSTALL) -p -m 644
+INSTALL_DATA := $(INSTALL) -p -m 644
+INSTALL_DIR := $(INSTALL) -m 755 -d
+
+# strip spaces from file names
+executables := $(strip $(executables))
+datafiles := $(strip $(datafiles))
+datadirs := $(strip $(datadirs))
+
+# Do not make any install sub-target with empty variable definition because the
+# install program would exit with an error.
+install: $(if $(executables), install-executables)
+install: $(if $(datafiles), install-datafiles)
+install: $(if $(datadirs), install-datadirs)
+
+install-executables: all
+	$(INSTALL_DIR) -v "$(installpath)"
+	$(foreach v, $(executables), \
+	$(INSTALL_PROGRAM) '$v' "$(installpath)";)
+	$(info ++++ info: executables of lib $(lib.name) installed \
+        from $(CURDIR) to $(installpath))
+	$(if $(stripflags), $(strip-executables),)
+
+install-datafiles: all
+	$(INSTALL_DIR) -v "$(installpath)"
+	$(foreach v, $(datafiles), \
+	$(INSTALL_DATA) '$(v)' "$(installpath)";)
+	$(info ++++ info: data files of lib $(lib.name) installed \
+        from $(CURDIR) to $(installpath))
+
+install-datadirs: all
+	$(foreach v, $(datadirs), $(INSTALL_DIR) "$(installpath)/$v";)
+	$(foreach v, $(datadirs), \
+        $(INSTALL_DATA) $(wildcard $v/*) "$(installpath)/$v";)
+	$(info ++++ info: data directories of lib $(lib.name) installed \
+        from $(CURDIR) to $(installpath))
+
+
+################################################################################
+### rules: distribution targets ################################################
+################################################################################
+
+
+# TODO
+# These targets are implemented in Makefile Template, but I have to figure out
+# how to do it under the not-so-strict conditions of Makefile.pdlibbuilder.
+
+# make source package
+dist:
+	@echo "target dist not yet implemented"
+
+# make Debian source package
+dpkg-source:
+	@echo "target dpkg-source not yet implemented"
+
+$(ORIGDIR):
+
+$(DISTDIR):
+
+
+################################################################################
+### rules: clean targets #######################################################
+################################################################################
+
+
+# delete build products from build tree
+clean:
+	rm -f $(all.objects)
+	rm -f $(classes.executables) $(lib.name).$(extension) $(shared.lib)
+	rm -f *.pre *.lst
+
+# remove distribution directories and tarballs from build tree
+distclean: clean
+	@echo "target distclean not yet implemented"
+
+
+################################################################################
+### rules: submake targets #####################################################
+################################################################################
+
+
+# Iterate over sub-makefiles or makefiles in other directories.
+
+# When 'continue-make=yes' is set, sub-makes will report 'true' to the parent
+# process regardless of their real exit status. This prevents the parent make
+# from being aborted by a sub-make error. Useful when you want to quickly find
+# out which sub-makes from a large set will succeed.
+ifeq ($(continue-make),yes)
+  continue = || true
+endif
+
+# These targets will trigger sub-make processes for entries in 'makefiledirs'
+# and 'makefiles'.
+all alldebug install clean distclean dist dkpg-source: \
+        $(makefiledirs) $(makefiles)
+
+# this expands to identical rules for each entry in 'makefiledirs'
+$(makefiledirs):
+	$(MAKE) --directory=$@ $(MAKECMDGOALS) $(continue)
+
+# this expands to identical rules for each entry in 'makefiles'
+$(makefiles):
+	$(MAKE) --directory=$(dir $@) --makefile=$(notdir $@) $(MAKECMDGOALS) $(continue)
+
+
+################################################################################
+### rules: convenience targets #################################################
+################################################################################
+
+
+#=== show variables ============================================================
+
+
+# Several 'function' macro's cause errors when expanded within a rule or without
+# proper arguments. Variables which are set with the define directive are only
+# shown by name for that reason.
+functions = \
+add-class-source \
+declare-class-target \
+declare-class-executable-target \
+declare-object-target \
+link-class \
+link-lib \
+link-shared \
+make-object-file \
+make-preprocessor-file \
+make-assembly-file
+
+
+# show variables from makefiles
+vars:
+	$(info ++++ info: showing makefile variables:)
+	$(foreach v,\
+        $(sort $(filter-out $(functions) functions, $(.VARIABLES))),\
+        $(if $(filter file, $(origin $v)),\
+        $(info variable $v = $($v))))
+	$(foreach v, $(functions), $(info 'function' name: $v))
+	@echo
+
+# show all variables
+allvars:
+	$(info ++++ info: showing default, automatic and makefile variables:)
+	$(foreach v, \
+        $(sort $(filter-out $(functions) functions, $(.VARIABLES))), \
+        $(info variable ($(origin $v)) $v = $($v)))
+	$(foreach v, $(functions), $(info 'function' name: $v))
+	@echo
+
+
+#=== show dependencies =========================================================
+
+
+# show generated prerequisites rules
+depend:
+	$(info ++++ info: generated prerequisite rules)
+	$(foreach v, $(classes), $(info $(declare-class-target)))
+	$(foreach v, $(classes), $(info $(declare-class-executable-target)))
+	$(foreach v, $(all.sources), $(info $(call declare-object-target, $v)))
+	@echo
+
+
+#=== show help text ============================================================
+
+
+# brief info about targets and paths
+
+ifdef mpdh
+  mpdhinfo := $(mpdh)
+else
+  mpdhinfo := m_pd.h was not found. Is Pd installed?
+endif
+
+help:
+	@echo
+	@echo "  Main targets:"
+	@echo "    all:     build executables (default target)"
+	@echo "    install: install all components of the library"
+	@echo "    vars:    print makefile variables for troubleshooting"
+	@echo "    allvars: print all variables for troubleshooting"
+	@echo "    help:    print this help text"
+	@echo
+	@echo "  Pd API m_pd.h:"
+	@echo "    $(mpdhinfo)"
+	@echo "  You may specify your preferred Pd include directory as argument"
+	@echo "  to the make command, like 'PDINCLUDEDIR=path/to/pd/src'."
+	@echo
+	@echo "  Path for installation of your libdir(s):"
+	@echo "    $(PDLIBDIR)"
+	@echo "  Alternatively you may specify your path for installation as argument"
+	@echo "  to the make command, like 'PDLIBDIR=path/to/pd-externals'."
+	@echo
+	@echo "  Default paths are listed in the doc sections in Makefile.pdlibbuilder."
+	@echo
+
+
+#=== platform test =============================================================
+
+
+# This target can be used to test if the compiler for specified PLATFORM is
+# correctly defined and available.
+
+dumpmachine:
+	@$(CC) -dumpmachine
+
+
+#=== dummy target ==============================================================
+
+
+coffee:
+	@echo "Makefile.pdlibbuilder: Can not make coffee. Sorry."
+
+
+################################################################################
+### end of rules sections ######################################################
+################################################################################
+
+
+# for syntax highlighting in vim and github
+# vim: set filetype=make:
+
diff --git a/externals/zexy/pd-lib-builder/README.md b/externals/zexy/pd-lib-builder/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..187b132d7bdc8b7caef1999490ae4ec4304b9983
--- /dev/null
+++ b/externals/zexy/pd-lib-builder/README.md
@@ -0,0 +1,162 @@
+
+
+### Makefile.pdlibbuilder ###
+
+Helper makefile for Pure Data external libraries. Written by Katja Vetter
+March-June 2015 for the public domain and since then developed as a Pd
+community project. No warranties. Inspired by Hans Christoph Steiner's Makefile
+Template and Stephan Beal's ShakeNMake.
+
+GNU make version >= 3.81 required.
+
+
+### characteristics ###
+
+
+* defines build settings based on autodetected target platform
+* defines rules to build Pd class- or lib executables from C or C++ sources
+* defines rules for libdir installation
+* defines convenience targets for developer and user
+* evaluates implicit dependencies for non-clean builds
+
+
+### basic usage ###
+
+
+In your Makefile, define your Pd lib name and class files, and include
+Makefile.pdlibbuilder at the end of the Makefile. Like so:
+
+
+      # Makefile for mylib
+
+      lib.name = mylib
+
+      class.sources = myclass1.c myclass2.c
+
+      datafiles = myclass1-help.pd myclass2-help.pd README.txt LICENSE.txt
+
+      include Makefile.pdlibbuilder
+
+
+For files in class.sources it is assumed that class name == source file
+basename. The default target builds all classes as individual executables
+with Pd's default extension for the platform. For anything more than the
+most basic usage, read the documentation sections in Makefile.pdlibbuilder.
+
+
+### paths ###
+
+
+Makefile.pdlibbuilder >= v0.4.0 supports pd path variables which can be
+defined not only as make command argument but also in the environment, to
+override platform-dependent defaults:
+
+PDDIR:
+Root directory of 'portable' pd package. When defined, PDINCLUDEDIR and
+PDBINDIR will be evaluated as $(PDDIR)/src and $(PDDIR)/bin.
+
+PDINCLUDEDIR:
+Directory where Pd API m_pd.h should be found, and other Pd header files.
+Overrides the default search path.
+
+PDBINDIR:
+Directory where pd.dll should be found for linking (Windows only). Overrides
+the default search path.
+
+PDLIBDIR:
+Root directory for installation of Pd library directories. Overrides the
+default install location.
+
+
+### documentation ###
+
+
+This README.md provides only basic information. A large comment section inside
+Makefile.pdlibbuilder lists and explains the available user variables, default
+paths, and targets. The internal documentation reflects the exact functionality
+of the particular version. For suggestions about project maintenance and
+advanced compilation see tips-tricks.md.
+
+
+### versioning ###
+
+
+The project is versioned in MAJOR.MINOR.BUGFIX format (see http://semver.org),
+and maintained at https://github.com/pure-data/pd-lib-builder. Pd lib developers
+are invited to regulary check for updates, and to contribute and discuss
+improvements here. If you really need to distribute a personalized version with
+your library, rename Makefile.pdlibbuilder to avoid confusion.
+
+
+### examples ###
+
+The list of projects using pd-lib-builder can be helpful if you are looking for
+examples, from the simplest use case to more complex implementations.
+
+- helloworld: traditional illustration of simplest use case
+- pd-windowing: straightforward real world use case of a small library
+- pd-nilwind / pd-cyclone: more elaborate source tree
+- zexy: migrated from autotools to pd-lib-builder
+
+
+### projects using pd-lib-builder ###
+
+non-exhaustive list
+
+https://github.com/pure-data/helloworld
+
+https://github.com/electrickery/pd-nilwind
+
+https://github.com/electrickery/pd-maxlib
+
+https://github.com/electrickery/pd-sigpack
+
+https://github.com/electrickery/pd-tof
+
+https://github.com/electrickery/pd-windowing
+
+https://github.com/electrickery/pd-smlib
+
+https://github.com/porres/pd-cyclone
+
+https://github.com/porres/pd-else
+
+https://github.com/porres/pd-psycho
+
+https://git.iem.at/pd/comport
+
+https://git.iem.at/pd/hexloader
+
+https://git.iem.at/pd/iemgui
+
+https://git.iem.at/pd/iemguts
+
+https://git.iem.at/pd/iemlib
+
+https://git.iem.at/pd/iemnet
+
+https://git.iem.at/pd/iem_ambi
+
+https://git.iem.at/pd/iem_tab
+
+https://git.iem.at/pd/iem_adaptfilt
+
+https://git.iem.at/pd/iem_roomsim
+
+https://git.iem.at/pd/iem_spec2
+
+https://git.iem.at/pd/mediasettings
+
+https://git.iem.at/pd/zexy
+
+https://git.iem.at/pd-gui/punish
+
+https://github.com/residuum/PuRestJson
+
+https://github.com/libpd/abl_link
+
+https://github.com/wbrent/timbreID
+
+https://github.com/MetaluNet/moonlib
+
+
diff --git a/externals/zexy/pd-lib-builder/tips-tricks.md b/externals/zexy/pd-lib-builder/tips-tricks.md
new file mode 100644
index 0000000000000000000000000000000000000000..c1795f45ed87f23a0909ed65cca1592278cf32d0
--- /dev/null
+++ b/externals/zexy/pd-lib-builder/tips-tricks.md
@@ -0,0 +1,230 @@
+pd-lib-builder cheatsheet
+=========================
+
+# Creating special builds
+
+## cross-compiling on linux x86_64 for other platforms
+
+Using pd-lib-builder >=0.6.0 we can define variable `PLATFORM` to specify a 
+target triplet for cross-compilation. Example to build W32 binaries (assuming 
+package `mingw-w64` is installed and a W32 package for Pd is unzipped into a 
+path `${PDWIN32}`:
+
+    make PLATFORM=x86_64-w64-mingw32 PDDIR="${PDWIN32}"
+
+#### older pd-lib-builder versions
+
+Using pd-lib-builder < 0.6.0, in the absence of variable `PLATFORM`, you would
+instead override variables `system`, `target.arch`, `CC` and / or `CXX`,
+`STRIP`. Example:
+
+    make system=Windows target.arch=i686 CC=i686-w64-mingw32-gcc STRIP=i686-w64-mingw32-strip PDDIR="${PDWIN32}"
+
+#### toolchains
+
+Cross toolchains for relevant platforms in Debian Buster (install g++ 
+with dependencies for a given platform to get the whole tool chain):
+
+- `arm-linux-gnueabihf`
+- `aarch64-linux-gnu`
+- `i686-linux-gnu`
+- `i686-w64-mingw32` and `x86_64-w64-mingw32` (install `mingw-w64`)
+
+OSX/MacOS cross tool chains are not distributed by Debian. Use project 
+`osxcross` from Thomas Poechtraeger to create the tools.
+
+## building double-precision externals
+
+At the time of writing (2018-02) there is no official Pd that supports
+double-precision numbers yet.
+However, if you do get hold of an experimental double-precision Pd, you can
+easily build your externals for 64-bit numbers:
+
+   make CPPFLAGS="-DPD_FLOATSIZE=64"
+
+## building externals for W64 (64-bit Windows)
+
+At the time of writing (2018-02) there is no official Pd that supports
+W64 yet.
+However, if you do get hold of an experimental W64 Pd, you can
+easily build your externals for this environment with
+
+   make CPPFLAGS="-DPD_LONGINTTYPE=__int64" CC=x86_64-w64-mingw32-gcc
+
+
+To build a double-precision external for W64, use something like:
+
+   make CPPFLAGS="-DPD_LONGINTTYPE=__int64 -DPD_FLOATSIZE=64" CC=x86_64-w64-mingw32-gcc
+
+
+## TODO universal binaries on OSX
+
+
+# Project management
+
+In general it is advised to put the `Makefile.pdlibbuilder` into a separate
+subdirectory (e.g. `pd-lib-builder/`).
+This makes it much easier to update the `Makefile.pdlibbuilder` later
+
+You *should* also use a variable to the actual path of the Makefile.pdlibbuilder
+(even if you keep it in the root-directory), as this allows easy experimenting
+with newer (or older) (or site-specific) versions of the pd-lib-builder
+Makefile.
+
+~~~make
+PDLIBBUILDER_DIR=pd-lib-builder/
+include $(PDLIBBUILDER_DIR)/Makefile.pdlibbuilder
+~~~
+
+## Keeping pd-lib-builder up-to-date
+
+### `git subtree`
+
+With git-subtrees, you make the pd-lib-builder repository (or any other
+repository for that matter) part of your own repository - with full history and
+everything - put nicely into a distinct subdirectory.
+
+Support for *manipulating* subtrees has been added with Git-v1.7.11 (May 2012).
+The nice thing however is, that from "outside" the subtree is part of your
+repository like any other directory. E.g. older versions of Git can clone your
+repository with the full subtree (and all it's history) just fine.
+You can also use git-archive to make a complete snapshot of your repository
+(including the subtree) - nice, if you e.g. want self-contained downloads of
+your project from git hosting platforms (like Github, Gitlab, Bitbucket,...)
+
+In short, `git subtree` is the better `git submodule`.
+
+So here's how to do it:
+
+#### Initial setup/check-out
+This will create a `pd-lib-builder/` directory containing the full history of
+the pd-lib-builder repository up to its release `v0.5.0`
+
+~~~sh
+git subtree add --prefix=pd-lib-builder/ https://github.com/pure-data/pd-lib-builder v0.5.0
+~~~
+
+This will automatically merge the `pd-lib-builder/` history into your current
+branch, so everything is ready to go.
+
+#### Cloning your repository with the subtree
+Nothing special, really.
+Just clone your repository as always:
+
+~~~sh
+git clone https://git.example.org/pd/superbonk~.git
+~~~
+
+#### Updating the subtree
+Time passes and sooner or later you will find, that there is a shiny new
+pd-lib-builder with plenty of bugfixes and new features.
+To update your local copy to pd-lib-builder's current `master`, simply run:
+
+~~~sh
+git subtree pull --prefix pd-lib-builder/ https://github.com/pure-data/pd-lib-builder master
+~~~
+
+#### Pulling the updated subtree into existing clones
+Again, nothing special.
+Just pull as always:
+
+~~~sh
+git pull
+~~~
+
+
+#### Further reading
+More on the power of `git subtree` can be found online
+- https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844
+- https://www.atlassian.com/blog/git/alternatives-to-git-submodule-git-subtree
+- ...
+
+### ~~`git submodule`~~ [DISCOURAGED]
+
+
+#### Initial setup/check-out
+To add a new submodule to your repository, just run `git submodule add` and
+commit the changes:
+
+~~~sh
+git submodule add https://github.com/pure-data/pd-lib-builder
+git commit .gitmodules pd-lib-builder/ -m "Added pd-lib-builder as git-submodule"
+~~~
+
+#### Cloning your repository with the submodule
+
+When doing a fresh clone of your repository, pass the `--recursive` option to
+automatically fetch all submodules:
+
+~~~sh
+git clone --recursive https://git.example.org/pd/superbonk~.git
+~~~
+
+If you've cloned non-recursively, you can initialize and update the submodules
+manually:
+
+~~~sh
+git submodule init
+git submodule update
+~~~
+
+#### Updating the submodule
+Submodules are usually fixed to a given commit in their repository.
+To update the `pd-lib-builder` submodule to the current `master` do something
+like:
+
+~~~sh
+cd pd-lib-builder
+git checkout master
+git pull
+cd ..
+git status pd-lib-builder
+git commit pd-lib-builder -m "Updated pd-lib-builder to current master"
+~~~
+
+#### Pulling the updated submodule into existing clones
+After you have pushed the submodule updates in your repository, other clones of
+the repository can be updated as follows:
+
+~~~sh
+git pull
+~~~
+
+The above will make your repository aware, that the submodule is out-of-sync.
+
+~~~sh
+$ LANG=C git status pd-lib-builder
+On branch master
+Your branch is up to date with 'origin/master'.
+
+Changes not staged for commit:
+  (use "git add <file>..." to update what will be committed)
+  (use "git checkout -- <file>..." to discard changes in working directory)
+
+	modified:   pd-lib-builder (new commits)
+$
+~~~
+
+In order to sync the submodule to the correct commit, run the following:
+
+~~~sh
+git submodule update
+~~~
+
+#### Drawbacks
+`git submodule` has a number of drawbacks:
+- it requires special commands to synchronize the submodules, in addition to
+  synching your repository.
+- you must make sure to use an URL for the submodule that is accessible to your
+  potential users. e.g. using `git@github.com:pure-data/pd-lib-builder` is bad,
+  because it requires everybody who wants to checkout your sources to have a
+  github-account - even if they could checkout *your* repository anonymously.
+- submodules will be excluded from `git archive`. This means, that if you use a
+  mainstream git provider (like Github, GitLab, Bitbucket,...) and make releases
+  by creating a `git tag`, the automatically generated zipfiles with the sources
+  will lack the submodule - and your users will not be able to compile your
+  source code.
+
+In general, I would suggest to **avoid** `git submodule`, and instead use the
+better `git subtree` (above).
+
diff --git a/externals/zexy/pd-zexy.info b/externals/zexy/pd-zexy.info
deleted file mode 100644
index f7b897ebc80e5371f6e88a6a1ea58d6e375fad15..0000000000000000000000000000000000000000
--- a/externals/zexy/pd-zexy.info
+++ /dev/null
@@ -1,16 +0,0 @@
-Title Zexy for Pd
-Version MSP standard paths
-Description IOhannes m zmoelnig's zexy
-DefaultLocation /usr/local/lib
-DeleteWarning 
-
-### Package Flags
-
-NeedsAuthorization YES
-Required NO
-Relocatable YES
-RequiresReboot NO
-UseUserMask YES
-OverwritePermissions NO
-InstallFat NO
-RootVolumeOnly NO
diff --git a/externals/zexy/reference/Makefile.am b/externals/zexy/reference/Makefile.am
deleted file mode 100644
index b74db0c39bbc88ab74de1033b4b3f2a77814a054..0000000000000000000000000000000000000000
--- a/externals/zexy/reference/Makefile.am
+++ /dev/null
@@ -1,124 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-
-SUFFIXES = .pd
-
-zexydir=$(pkglibdir)
-
-empty=
-
-dist_zexy_DATA= \
-	a2l-help.pd \
-	atoi-help.pd \
-	avg~-help.pd \
-	blockmirror~-help.pd \
-	blockswap~-help.pd \
-	coordinates-help.pd \
-	date-help.pd \
-	demultiplex~-help.pd \
-	demultiplex-help.pd \
-	dfreq~-help.pd \
-	digidistort-help.pd \
-	dirac~-help.pd \
-	drip-help.pd \
-	envrms~-help.pd \
-	fifop-help.pd \
-	freadln-help.pd \
-	fwriteln-help.pd \
-	glue-help.pd \
-	index-help.pd \
-	length-help.pd \
-	lifop-help.pd \
-	limiter~-help.pd \
-	list2int-help.pd \
-	list2lists-help.pd \
-	list2symbol-help.pd \
-	lister-help.pd \
-	listfind-help.pd \
-	lpt-help.pd \
-	makesymbol-help.pd \
-	matchbox-help.pd \
-	mavg-help.pd \
-	minmax-help.pd \
-	msgfile-help.pd \
-	multiline~-help.pd \
-	multiplex~-help.pd \
-	multiplex-help.pd \
-	niagara-help.pd \
-	noish~-help.pd \
-	noisi~-help.pd \
-	operating_system-help.pd \
-	packel-help.pd \
-	pack~-help.pd \
-	pack-help.pd \
-	pdf~-help.pd \
-	prime-help.pd \
-	quantize~-help.pd \
-	rawprint-help.pd \
-	regex-help-help.pd \
-	regex-help.pd \
-	relay-help.pd \
-	repack-help.pd \
-	repeat-help.pd \
-	route~-help.pd \
-	scalarmult-help.pd \
-	sf-play_record-help.pd \
-	sigzero~-help.pd \
-	sort-help.pd \
-	step~-help.pd \
-	strcmp-help.pd \
-	sum-help.pd \
-	swap~-help.pd \
-	symbol2list-help.pd \
-	tabdump-help.pd \
-	tabminmax-help.pd \
-	tabset-help.pd \
-	tavg~-help.pd \
-	time-help.pd \
-	unpack~-help.pd \
-	unpack-help.pd \
-	urn-help.pd \
-	wrap-help.pd \
-	z~-help.pd \
-	zigbinops-help.pd \
-	$(empty)
-
-#############
-# symlinks for aliases
-zexyaliasdir=$(pkglibdir)
-
-clean-local: clean_zexyalias
-.PHONY: clean_zexyalias
-
-dist_zexyalias_DATA= \
-	unfold-help.pd \
-	mux-help.pd \
-	demux~-help.pd \
-	l2i-help.pd \
-	l2s-help.pd \
-	any2list-help.pd \
-	lp-help.pd \
-	demux-help.pd \
-	l-help.pd \
-	mux~-help.pd \
-	s2l-help.pd
-
-# create aliases
-$(dist_zexyalias_DATA):
-	test -e $< && $(LN_S) $< $@
-
-# delete aliases
-clean_zexyalias:
-	-rm -f $(dist_zexyalias_DATA)
-
-# define aliases
-any2list-help.pd: a2l-help.pd
-demux~-help.pd: demultiplex~-help.pd
-demux-help.pd: demultiplex-help.pd
-l2i-help.pd: list2int-help.pd
-l2s-help.pd: list2symbol-help.pd
-l-help.pd: lister-help.pd
-lp-help.pd: lpt-help.pd
-mux~-help.pd: multiplex~-help.pd
-mux-help.pd: multiplex-help.pd
-s2l-help.pd: symbol2list-help.pd
-unfold-help.pd: drip-help.pd
diff --git a/externals/zexy/reference/limiter~-help.pd b/externals/zexy/reference/limiter~-help.pd
index 246a36bb0193dc52d4da703a6547ee78bad69d0d..b7f4bb83dc1de5ada3ba90cde14c5d077956f539 100644
--- a/externals/zexy/reference/limiter~-help.pd
+++ b/externals/zexy/reference/limiter~-help.pd
@@ -26,7 +26,7 @@
 #X obj 382 341 env~;
 #X floatatom 382 359 4 0 0 0 - - -;
 #X text 30 299 to learn more about this object \, try these;
-#X text 48 371 http://iem.kug.ac.at/~zmoelnig;
+#X text 48 371 http://users.iem.at/zmoelnig;
 #N canvas 59 76 600 400 generator~ 0;
 #X obj 86 49 inlet;
 #X obj 252 54 inlet;
diff --git a/externals/zexy/reference/msgfile-help.pd b/externals/zexy/reference/msgfile-help.pd
index cdfe5d0395abeca38b6b55e343e2bc1315afa9ea..faf1d56857ce8d39aa6e0144cbb5c298f3f1a906 100644
--- a/externals/zexy/reference/msgfile-help.pd
+++ b/externals/zexy/reference/msgfile-help.pd
@@ -1,4 +1,4 @@
-#N canvas 0 31 854 331 10;
+#N canvas 80 115 854 331 10;
 #X obj 425 235 print done;
 #X text 72 260 see also:;
 #X msg 423 39 bang;
@@ -10,7 +10,7 @@
 #X text 18 57 The msgfile object is derived from the textfile object
 and expands its features.;
 #X text 15 97 new features are :;
-#X text 127 110 insert \, append \, delete \, replace;
+#X text 126 111 insert \, append \, delete \, replace;
 #X text 472 36 output one line as a list and move to the next;
 #X text 90 201 add2 : read "add too" \; append to an existing line
 ;
@@ -18,8 +18,8 @@ and expands its features.;
 sequence \; it will also get the current position when using "when"
 ;
 #X text 127 97 end \, goto \, skip;
-#X text 131 127 flush \, where \, this \, prev \, next;
-#X text 128 145 find;
+#X text 126 127 flush \, where \, this \, prev \, next;
+#X text 126 143 find;
 #X text 73 163 read/write can handle csv files too;
 #X text 598 7 part of zexy;
 #N canvas 112 31 646 300 navigation 0;
@@ -130,32 +130,68 @@ and the list is output (via the 2nd and 1st outlet).;
 #X connect 2 0 0 0;
 #X connect 6 0 0 0;
 #X restore 423 124 pd searching;
-#N canvas 0 0 853 402 file-i/o 0;
-#X obj 54 312 outlet;
+#N canvas 5 51 853 726 file-i/o 1;
+#X obj 57 532 outlet;
 #X text 265 75 read a file;
-#X text 299 96 write one;
-#X text 305 164 write a file \, terminating lines only with carriage
-return (omitting semicolons.) You can read files this way too \, in
-which case carriage returns are mapped to semicolons.;
-#X msg 87 76 read msgfile.txt;
-#X msg 87 168 write /tmp/msgfile2.txt cr;
-#X msg 87 191 read msgfile2.txt cr;
-#X msg 87 97 write /tmp/msgfile.txt;
+#X msg 97 76 read msgfile.txt;
+#X msg 127 248 write /tmp/msgfile2.txt cr;
+#X msg 127 268 read msgfile2.txt cr;
+#X msg 97 97 write /tmp/msgfile.txt;
 #X text 51 26 reading from and writing the contents of [msgfile] to
 files;
-#X msg 111 248 write /tmp/msgfile3.txt $$;
-#X text 331 238 on writing replace every occurence of $$ with a single
-$. This way you can write pd-patches which can handle arguments.;
-#X msg 146 291 add #X obj f $\$1;
-#X msg 92 130 read2 msgfile.txt;
+#X msg 102 130 read2 msgfile.txt;
 #X text 264 131 read file and append it to the current buffer;
-#X connect 4 0 0 0;
-#X connect 5 0 0 0;
-#X connect 6 0 0 0;
-#X connect 7 0 0 0;
-#X connect 9 0 0 0;
-#X connect 11 0 0 0;
-#X connect 12 0 0 0;
+#X msg 127 308 write /tmp/msgfile2.csv csv;
+#X msg 127 328 read msgfile2.csv csv;
+#X msg 127 468 read /tmp/msgfile2.txt txt;
+#X msg 127 418 read /tmp/msgfile.txt fudi;
+#X text 266 96 write a file;
+#X msg 127 186 read msgfile.txt pd;
+#X msg 127 206 write /tmp/msgfile.txt pd;
+#X text 343 170 read a file in Pd's native format (lines are terminated
+with semicolon). this is the DEFAULT.;
+#X text 343 200 write a file in Pd's native format (lines are terminated
+with semicolon). this is the DEFAULT.;
+#X text 343 240 write a file \, terminating lines only with carriage
+return (omitting semicolons). You can read files this way too \, in
+which case carriage returns are mapped to semicolons.;
+#X text 343 380 read a file in Pd's native format (with semicolons
+as line terminators): very much like the default mode ("pd") \, but
+handles backslash-escaped whitespace (so you can read symbols with
+spaces). You can write files this way too (which is the same as writing
+in 'pd' format);
+#X text 343 480 read a text file (with carriage return as line terminators):
+very much like the "cr" mode \, but handles backslash-escaped whitespace
+(so you can read symbols with spaces). You can write files this way
+too (which is the same as writing in 'cr' format);
+#X obj 57 161 t a;
+#X obj 57 237 t a;
+#X obj 57 298 t a;
+#X obj 57 358 t a;
+#X obj 57 498 t a;
+#X text 151 600 you can set the DEFAULT read/write mode as a creation
+argument.;
+#X obj 502 602 msgfile txt;
+#X text 343 300 write a CSV-file (Comma-Separated-Values) \, separating
+atoms with comma and terminating lines with carriage return. Symbol-atoms
+that contain whitespace (e.g. ' ') are automatically quoted. You can
+read files this way too.;
+#X connect 2 0 21 0;
+#X connect 3 0 23 0;
+#X connect 4 0 23 0;
+#X connect 5 0 21 0;
+#X connect 7 0 21 0;
+#X connect 9 0 24 0;
+#X connect 10 0 24 0;
+#X connect 11 0 25 0;
+#X connect 12 0 25 0;
+#X connect 14 0 22 0;
+#X connect 15 0 22 0;
+#X connect 21 0 22 0;
+#X connect 22 0 23 0;
+#X connect 23 0 24 0;
+#X connect 24 0 25 0;
+#X connect 25 0 0 0;
 #X restore 423 144 pd file-i/o;
 #N canvas 67 162 450 397 misc 0;
 #X obj 84 282 outlet;
diff --git a/externals/zexy/reference/multireceive-help.pd b/externals/zexy/reference/multireceive-help.pd
new file mode 100644
index 0000000000000000000000000000000000000000..8940eb46d58abd019eddae7c446ebe6300a43331
--- /dev/null
+++ b/externals/zexy/reference/multireceive-help.pd
@@ -0,0 +1,23 @@
+#N canvas 275 127 834 332 10;
+#X floatatom 389 174 5 0 0 0 - - -, f 5;
+#X obj 153 186 print x;
+#X text 51 32 [multireceive]: combine multiple receives;
+#X obj 389 202 s \$0-a;
+#X msg 442 171 set foo bar;
+#X obj 442 202 s \$0-c;
+#X msg 153 120 set foo bar;
+#X obj 153 164 multireceive \$0-a foo \$0-c;
+#X floatatom 549 154 5 0 0 0 - - -, f 5;
+#X obj 549 202 s foo;
+#X msg 549 173 foo \$1;
+#X obj 602 202 s bar;
+#X msg 602 173 bar-\$1;
+#X floatatom 602 154 5 0 0 0 - - -, f 5;
+#X connect 0 0 3 0;
+#X connect 4 0 5 0;
+#X connect 6 0 7 0;
+#X connect 7 0 1 0;
+#X connect 8 0 10 0;
+#X connect 10 0 9 0;
+#X connect 12 0 11 0;
+#X connect 13 0 12 0;
diff --git a/externals/zexy/reference/packel-help.pd b/externals/zexy/reference/packel-help.pd
index f31a9e7bcada555a17fb8b42baf1aeb383818d58..2616e4e851457bf3a03afe9479de30a4ba9c8a32 100644
--- a/externals/zexy/reference/packel-help.pd
+++ b/externals/zexy/reference/packel-help.pd
@@ -8,8 +8,8 @@
 #X obj 62 401 print REVERSE_ELEMENT;
 #X text 146 75 creation: packel [<n>];
 #X text 185 92 n indicates the index of the element to be output;
-#X text 185 110 n==0 ouputs the whole package;
-#X text 185 127 n<0 ouputs the nth-last element;
+#X text 185 110 n==0 outputs the whole package;
+#X text 185 127 n<0 outputs the nth-last element;
 #X text 461 26 part of zexy;
 #X msg 62 191 list uno dva drei quattre five;
 #X msg 62 357 list uno dva drei quattre five;
diff --git a/externals/zexy/reference/sf-play_record-help.pd b/externals/zexy/reference/sf-play_record-help.pd
index 512236567e53c08c50b99043d6c28ce0deee260a..33f397d1d9a2d931c20b0d635cb3bc6e5e05fd7b 100644
--- a/externals/zexy/reference/sf-play_record-help.pd
+++ b/externals/zexy/reference/sf-play_record-help.pd
@@ -30,7 +30,7 @@
 #X text 52 64 up to now \, the "sfrecord" only supports .RAW format
 ;
 #X text 51 78 "sfplay" can skip any header \, if you know it's size::
-just call "sfplay <num.of.chan> <skip.bytes>;
+just call "sfplay <num.of.chan> <skip.bytes>";
 #X floatatom 471 356 0 0 0 0 - - -;
 #N canvas 160 49 495 266 output 0;
 #X obj 338 160 t b;
diff --git a/externals/zexy/src/0x260x26_tilde.c b/externals/zexy/src/0x260x260x7e.c
similarity index 68%
rename from externals/zexy/src/0x260x26_tilde.c
rename to externals/zexy/src/0x260x260x7e.c
index 793ce500c6c9713c0c2c6d9674d76501b6bc1a6f..cea6326f2c04f73af3bfc9a9cbfa0186701ed45e 100644
--- a/externals/zexy/src/0x260x26_tilde.c
+++ b/externals/zexy/src/0x260x260x7e.c
@@ -23,7 +23,7 @@
 /* ------------------------ logical~ ----------------------------- */
 
 /* ----------------------------- andand_tilde ----------------------------- */
-static t_class *andand_tilde_class, *scalarandand_tilde_class;
+static t_class *andand_tilde_class=NULL, *scalarandand_tilde_class=NULL;
 
 typedef struct _andand_tilde {
   t_object x_obj;
@@ -33,7 +33,7 @@ typedef struct _andand_tilde {
 typedef struct _scalarandand_tilde {
   t_object x_obj;
   t_float x_f;
-  t_float x_g;    	    /* inlet value */
+  t_float x_g;              /* inlet value */
 } t_scalarandand_tilde;
 
 static void *andand_tilde_new(t_symbol * UNUSED(s), int argc, t_atom *argv)
@@ -147,34 +147,34 @@ static t_int *andand_tilde_performSSE(t_int *w)
 
   while (n--) {
     __m128 xmm0, xmm1, xmm2;
-    xmm0   = _mm_and_ps  (in1[0] , bitmask); /* =abs(f); */
-    xmm1   = _mm_and_ps  (in2[0] , bitmask);
-    xmm0   = _mm_cmpge_ps(xmm0   ,
+    xmm0   = _mm_and_ps  (in1[0], bitmask);  /* =abs(f); */
+    xmm1   = _mm_and_ps  (in2[0], bitmask);
+    xmm0   = _mm_cmpge_ps(xmm0,
                           one);     /* =(abs(f)>=1.0)=i (a weird cast to integer) */
-    xmm1   = _mm_cmpge_ps(xmm1   , one);
-    xmm2   = _mm_and_ps  (xmm0   , xmm1);    /* =(i0&&i1) */
-    out[0] = _mm_and_ps  (xmm2   , one);     /* 0xfffffff -> 1.0 */
-
-    xmm0   = _mm_and_ps  (in1[1] , bitmask);
-    xmm1   = _mm_and_ps  (in2[1] , bitmask);
-    xmm0   = _mm_cmpge_ps(xmm0   , one);
-    xmm1   = _mm_cmpge_ps(xmm1   , one);
-    xmm2   = _mm_and_ps  (xmm0   , xmm1);
-    out[1] = _mm_and_ps  (xmm2   , one);
-
-    xmm0   = _mm_and_ps  (in1[2] , bitmask);
-    xmm1   = _mm_and_ps  (in2[2] , bitmask);
-    xmm0   = _mm_cmpge_ps(xmm0   , one);
-    xmm1   = _mm_cmpge_ps(xmm1   , one);
-    xmm2   = _mm_and_ps  (xmm0   , xmm1);
-    out[2] = _mm_and_ps  (xmm2   , one);
-
-    xmm0   = _mm_and_ps  (in1[3] , bitmask);
-    xmm1   = _mm_and_ps  (in2[3] , bitmask);
-    xmm0   = _mm_cmpge_ps(xmm0   , one);
-    xmm1   = _mm_cmpge_ps(xmm1   , one);
-    xmm2   = _mm_and_ps  (xmm0   , xmm1);
-    out[3] = _mm_and_ps  (xmm2   , one);
+    xmm1   = _mm_cmpge_ps(xmm1, one);
+    xmm2   = _mm_and_ps  (xmm0, xmm1);       /* =(i0&&i1) */
+    out[0] = _mm_and_ps  (xmm2, one);        /* 0xfffffff -> 1.0 */
+
+    xmm0   = _mm_and_ps  (in1[1], bitmask);
+    xmm1   = _mm_and_ps  (in2[1], bitmask);
+    xmm0   = _mm_cmpge_ps(xmm0, one);
+    xmm1   = _mm_cmpge_ps(xmm1, one);
+    xmm2   = _mm_and_ps  (xmm0, xmm1);
+    out[1] = _mm_and_ps  (xmm2, one);
+
+    xmm0   = _mm_and_ps  (in1[2], bitmask);
+    xmm1   = _mm_and_ps  (in2[2], bitmask);
+    xmm0   = _mm_cmpge_ps(xmm0, one);
+    xmm1   = _mm_cmpge_ps(xmm1, one);
+    xmm2   = _mm_and_ps  (xmm0, xmm1);
+    out[2] = _mm_and_ps  (xmm2, one);
+
+    xmm0   = _mm_and_ps  (in1[3], bitmask);
+    xmm1   = _mm_and_ps  (in2[3], bitmask);
+    xmm0   = _mm_cmpge_ps(xmm0, one);
+    xmm1   = _mm_cmpge_ps(xmm1, one);
+    xmm2   = _mm_and_ps  (xmm0, xmm1);
+    out[3] = _mm_and_ps  (xmm2, one);
 
     in1+=4;
     in2+=4;
@@ -202,25 +202,25 @@ static t_int *scalarandand_tilde_performSSE(t_int *w)
   while (n--) {
     __m128 xmm0, xmm1;
     xmm0   = _mm_and_ps  (in[0], bitmask); /* =abs(f); */
-    xmm0   = _mm_cmpge_ps(xmm0 ,
+    xmm0   = _mm_cmpge_ps(xmm0,
                           one);     /* =(abs(f)>=1.0)=i (a weird cast to integer) */
-    xmm0   = _mm_and_ps  (xmm0 , scalar);  /* =(i0&&i1) */
-    out[0] = _mm_and_ps  (xmm0 , one);     /* 0xfffffff -> 1.0 */
+    xmm0   = _mm_and_ps  (xmm0, scalar);   /* =(i0&&i1) */
+    out[0] = _mm_and_ps  (xmm0, one);      /* 0xfffffff -> 1.0 */
 
     xmm1   = _mm_and_ps  (in[1], bitmask);
-    xmm1   = _mm_cmpge_ps(xmm1 , one);
-    xmm1   = _mm_and_ps  (xmm1 , scalar);
-    out[1] = _mm_and_ps  (xmm1 , one);
+    xmm1   = _mm_cmpge_ps(xmm1, one);
+    xmm1   = _mm_and_ps  (xmm1, scalar);
+    out[1] = _mm_and_ps  (xmm1, one);
 
     xmm0   = _mm_and_ps  (in[2], bitmask);
-    xmm0   = _mm_cmpge_ps(xmm0 , one);
-    xmm0   = _mm_and_ps  (xmm0 , scalar);
-    out[2] = _mm_and_ps  (xmm0 , one);
+    xmm0   = _mm_cmpge_ps(xmm0, one);
+    xmm0   = _mm_and_ps  (xmm0, scalar);
+    out[2] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_and_ps  (in[3], bitmask);
-    xmm1   = _mm_cmpge_ps(xmm1 , one);
-    xmm1   = _mm_and_ps  (xmm1 , scalar);
-    out[3] = _mm_and_ps  (xmm1 , one);
+    xmm1   = _mm_cmpge_ps(xmm1, one);
+    xmm1   = _mm_and_ps  (xmm1, scalar);
+    out[3] = _mm_and_ps  (xmm1, one);
 
     in +=4;
     out+=4;
@@ -245,13 +245,13 @@ static void andand_tilde_dsp(t_andand_tilde *UNUSED(x), t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(andand_tilde_performSSE, 4, in1, in2, out, (t_int)n);
+    dsp_add(andand_tilde_performSSE, 4, in1, in2, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(andand_tilde_perform, 4, in1, in2, out, (t_int)n);
+      dsp_add(andand_tilde_perform, 4, in1, in2, out, n);
     } else {
-      dsp_add(andand_tilde_perf8, 4, in1, in2, out, (t_int)n);
+      dsp_add(andand_tilde_perf8, 4, in1, in2, out, n);
     }
 }
 
@@ -268,42 +268,39 @@ static void scalarandand_tilde_dsp(t_scalarandand_tilde *x, t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(scalarandand_tilde_performSSE, 4, in, &x->x_g, out, (t_int)n);
+    dsp_add(scalarandand_tilde_performSSE, 4, in, &x->x_g, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(scalarandand_tilde_perform, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalarandand_tilde_perform, 4, in, &x->x_g, out, n);
     } else {
-      dsp_add(scalarandand_tilde_perf8,   4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalarandand_tilde_perf8,   4, in, &x->x_g, out, n);
     }
 }
 
-static void andand_tilde_help(t_object*x)
+static void andand_tilde_help(t_object* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " &&~\t\t:: logical AND operation on 2 signals");
 }
 
-void setup_0x260x26_tilde(void)
+ZEXY_SETUP void setup_0x260x260x7e(void)
 {
-  andand_tilde_class = class_new(gensym("&&~"),
-                                 (t_newmethod)andand_tilde_new, 0,
-                                 sizeof(t_andand_tilde), 0, A_GIMME, 0);
-  class_addmethod(andand_tilde_class, (t_method)andand_tilde_dsp,
-                  gensym("dsp"), A_CANT, 0);
+  andand_tilde_class = zexy_new("&&~",
+                                andand_tilde_new, 0, t_andand_tilde, 0, "*");
+  zexy_addmethod(andand_tilde_class, (t_method)andand_tilde_dsp, "dsp", "!");
   CLASS_MAINSIGNALIN(andand_tilde_class, t_andand_tilde, x_f);
-  class_addmethod  (andand_tilde_class, (t_method)andand_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(andand_tilde_class, (t_method)andand_tilde_help, "help",
+                 "");
   class_sethelpsymbol(andand_tilde_class, gensym("zigbinops"));
 
 
-  scalarandand_tilde_class = class_new(gensym("&&~"), 0, 0,
-                                       sizeof(t_scalarandand_tilde), 0, 0);
+  scalarandand_tilde_class = zexy_new("&&~",
+                                      0, 0, t_scalarandand_tilde, 0, "");
   CLASS_MAINSIGNALIN(scalarandand_tilde_class, t_scalarandand_tilde, x_f);
-  class_addmethod(scalarandand_tilde_class, (t_method)scalarandand_tilde_dsp,
-                  gensym("dsp"), A_CANT,
-                  0);
-  class_addmethod  (scalarandand_tilde_class, (t_method)andand_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(scalarandand_tilde_class, (t_method)scalarandand_tilde_dsp,
+                 "dsp", "!");
+  zexy_addmethod(scalarandand_tilde_class, (t_method)andand_tilde_help,
+                 "help", "");
   class_sethelpsymbol(scalarandand_tilde_class, gensym("zigbinops"));
 
   zexy_register("&&~");
@@ -312,6 +309,6 @@ void setup_0x260x26_tilde(void)
 #ifndef ZEXY_LIBRARY
 void setup(void)
 {
-  setup_0x260x26_tilde();
+  setup_0x260x260x7e();
 }
 #endif
diff --git a/externals/zexy/src/0x2e.c b/externals/zexy/src/0x2e.c
index 83f4abc2a1b3bf6e3a411e57bc95ef857ba4e14c..f5b662344cea74b2a465cb21956a8d65e1502c21 100644
--- a/externals/zexy/src/0x2e.c
+++ b/externals/zexy/src/0x2e.c
@@ -20,8 +20,8 @@
 
 #include "zexy.h"
 
-static t_class *scalmul_class;
-static t_class *scalmul_scal_class;
+static t_class *scalmul_class=NULL;
+static t_class *scalmul_scal_class=NULL;
 
 typedef struct _scalmul {
   t_object x_obj;
@@ -156,26 +156,23 @@ static void *scalmul_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
   return (x);
 }
 
-static void scalmul_help(t_scalmul*x)
+static void scalmul_help(t_scalmul* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " .\t\t:: scalar multiplication (in-product)");
 }
 
-void setup_0x2e(void)
+ZEXY_SETUP void setup_0x2e(void)
 {
-  scalmul_class = class_new(gensym("."), (t_newmethod)scalmul_new,
-                            (t_method)scalmul_free, sizeof(t_scalmul), 0, A_GIMME, 0);
+  scalmul_class = zexy_new(".",
+                           scalmul_new, scalmul_free, t_scalmul, 0, "*");
   class_addlist(scalmul_class, scalmul_lst);
-  class_addmethod  (scalmul_class, (t_method)scalmul_lst2, gensym(""),
-                    A_GIMME, 0);
-  class_addmethod(scalmul_class, (t_method)scalmul_help, gensym("help"),
-                  A_NULL);
+  zexy_addmethod(scalmul_class, (t_method)scalmul_lst2, "", "*");
+  zexy_addmethod(scalmul_class, (t_method)scalmul_help, "help", "");
 
-  scalmul_scal_class = class_new(gensym("."), 0, (t_method)scalmul_free,
-                                 sizeof(t_scalmul), 0, 0);
+  scalmul_scal_class = zexy_new(".",
+                                0, scalmul_free, t_scalmul, 0, "");
   class_addlist(scalmul_scal_class, scalmul_lst);
-  class_addmethod(scalmul_scal_class, (t_method)scalmul_help, gensym("help"),
-                  A_NULL);
+  zexy_addmethod(scalmul_scal_class, (t_method)scalmul_help, "help", "");
 
   class_sethelpsymbol(scalmul_class, gensym("scalarmult"));
   class_sethelpsymbol(scalmul_scal_class, gensym("scalarmult"));
diff --git a/externals/zexy/src/0x3c_tilde.c b/externals/zexy/src/0x3c0x7e.c
similarity index 79%
rename from externals/zexy/src/0x3c_tilde.c
rename to externals/zexy/src/0x3c0x7e.c
index 6e278fd96eb2a372dcf303683452bff43aece5e8..325e15ced12109f003b7a42877ce36f6724b9ece 100644
--- a/externals/zexy/src/0x3c_tilde.c
+++ b/externals/zexy/src/0x3c0x7e.c
@@ -1,5 +1,5 @@
 /*
- * <~: signal comparision
+ * <~: signal comparison
  *
  * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute, institute of electronic music and acoustics (iem)
  *
@@ -23,7 +23,7 @@
 
 
 /* ----------------------------- lt_tilde ----------------------------- */
-static t_class *lt_tilde_class, *scalarlt_tilde_class;
+static t_class *lt_tilde_class=NULL, *scalarlt_tilde_class=NULL;
 
 typedef struct _lt_tilde {
   t_object x_obj;
@@ -33,7 +33,7 @@ typedef struct _lt_tilde {
 typedef struct _scalarlt_tilde {
   t_object x_obj;
   t_float x_f;
-  t_float x_g;    	    /* inlet value */
+  t_float x_g;              /* inlet value */
 } t_scalarlt_tilde;
 
 static void *lt_tilde_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
@@ -139,16 +139,16 @@ static t_int *lt_tilde_performSSE(t_int *w)
   while (n--) {
     __m128 xmm0, xmm1;
     xmm0   = _mm_cmplt_ps(in1[0], in2[0]);
-    out[0] = _mm_and_ps  (xmm0 , one);
+    out[0] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_cmplt_ps(in1[1], in2[1]);
-    out[1] = _mm_and_ps  (xmm1 , one);
+    out[1] = _mm_and_ps  (xmm1, one);
 
     xmm0   = _mm_cmplt_ps(in1[2], in2[2]);
-    out[2] = _mm_and_ps  (xmm0 , one);
+    out[2] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_cmplt_ps(in1[3], in2[3]);
-    out[3] = _mm_and_ps  (xmm1 , one);
+    out[3] = _mm_and_ps  (xmm1, one);
 
     in1+=4;
     in2+=4;
@@ -202,13 +202,13 @@ static void lt_tilde_dsp(t_lt_tilde* UNUSED(x), t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(lt_tilde_performSSE, 4, in1, in2, out, (t_int)n);
+    dsp_add(lt_tilde_performSSE, 4, in1, in2, out, n);
   } else
 #endif
     if(n&7) {
-      dsp_add(lt_tilde_perform, 4, in1, in2, out, (t_int)n);
+      dsp_add(lt_tilde_perform, 4, in1, in2, out, n);
     } else {
-      dsp_add(lt_tilde_perf8, 4, in1, in2, out, (t_int)n);
+      dsp_add(lt_tilde_perf8, 4, in1, in2, out, n);
     }
 }
 
@@ -225,39 +225,35 @@ static void scalarlt_tilde_dsp(t_scalarlt_tilde *x, t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(scalarlt_tilde_performSSE, 4, in, &x->x_g, out, (t_int)n);
+    dsp_add(scalarlt_tilde_performSSE, 4, in, &x->x_g, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(scalarlt_tilde_perform, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalarlt_tilde_perform, 4, in, &x->x_g, out, n);
     } else {
-      dsp_add(scalarlt_tilde_perf8, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalarlt_tilde_perf8, 4, in, &x->x_g, out, n);
     }
 }
-static void lt_tilde_help(t_object*x)
+static void lt_tilde_help(t_object* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " <~\t\t:: compare 2 signals");
 }
 
-void setup_0x3c_tilde(void)
+ZEXY_SETUP void setup_0x3c0x7e(void)
 {
-  lt_tilde_class = class_new(gensym("<~"), (t_newmethod)lt_tilde_new, 0,
-                             sizeof(t_lt_tilde), 0, A_GIMME, 0);
-  class_addmethod(lt_tilde_class, (t_method)lt_tilde_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  lt_tilde_class = zexy_new("<~",
+                            lt_tilde_new, 0, t_lt_tilde, 0, "*");
+  zexy_addmethod(lt_tilde_class, (t_method)lt_tilde_dsp, "dsp", "!");
   CLASS_MAINSIGNALIN(lt_tilde_class, t_lt_tilde, x_f);
-  class_addmethod  (lt_tilde_class, (t_method)lt_tilde_help, gensym("help"),
-                    A_NULL);
+  zexy_addmethod(lt_tilde_class, (t_method)lt_tilde_help, "help", "");
   class_sethelpsymbol(lt_tilde_class, gensym("zigbinops"));
 
-  scalarlt_tilde_class = class_new(gensym("<~"), 0, 0,
-                                   sizeof(t_scalarlt_tilde), 0, 0);
+  scalarlt_tilde_class = zexy_new("<~",
+                                  0, 0, t_scalarlt_tilde, 0, "");
   CLASS_MAINSIGNALIN(scalarlt_tilde_class, t_scalarlt_tilde, x_f);
-  class_addmethod(scalarlt_tilde_class, (t_method)scalarlt_tilde_dsp,
-                  gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod  (scalarlt_tilde_class, (t_method)lt_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(scalarlt_tilde_class, (t_method)scalarlt_tilde_dsp, "dsp",
+                 "!");
+  zexy_addmethod(scalarlt_tilde_class, (t_method)lt_tilde_help, "help", "");
   class_sethelpsymbol(scalarlt_tilde_class, gensym("zigbinops"));
   zexy_register("<~");
 }
@@ -265,6 +261,6 @@ void setup_0x3c_tilde(void)
 #ifndef ZEXY_LIBRARY
 void setup(void)
 {
-  setup_0x3c_tilde();
+  setup_0x3c0x7e();
 }
 #endif
diff --git a/externals/zexy/src/0x3d0x3d_tilde.c b/externals/zexy/src/0x3d0x3d0x7e.c
similarity index 79%
rename from externals/zexy/src/0x3d0x3d_tilde.c
rename to externals/zexy/src/0x3d0x3d0x7e.c
index 3430987865663a6fdf7bacff2caab48721f5a69c..12fb894247065d4207a4bb7e82784812da3d1264 100644
--- a/externals/zexy/src/0x3d0x3d_tilde.c
+++ b/externals/zexy/src/0x3d0x3d0x7e.c
@@ -20,7 +20,7 @@
 #include "zexySIMD.h"
 
 /* ----------------------------- eq_tilde ----------------------------- */
-static t_class *eq_tilde_class, *scalareq_tilde_class;
+static t_class *eq_tilde_class=NULL, *scalareq_tilde_class=NULL;
 
 typedef struct _eq_tilde {
   t_object x_obj;
@@ -30,7 +30,7 @@ typedef struct _eq_tilde {
 typedef struct _scalareq_tilde {
   t_object x_obj;
   t_float x_f;
-  t_float x_g;    	    /* inlet value */
+  t_float x_g;              /* inlet value */
 } t_scalareq_tilde;
 
 static void *eq_tilde_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
@@ -137,16 +137,16 @@ static t_int *eq_tilde_performSSE(t_int *w)
   while (n--) {
     __m128 xmm0, xmm1;
     xmm0   = _mm_cmpeq_ps(in1[0], in2[0]);
-    out[0] = _mm_and_ps  (xmm0 , one);
+    out[0] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_cmpeq_ps(in1[1], in2[1]);
-    out[1] = _mm_and_ps  (xmm1 , one);
+    out[1] = _mm_and_ps  (xmm1, one);
 
     xmm0   = _mm_cmpeq_ps(in1[2], in2[2]);
-    out[2] = _mm_and_ps  (xmm0 , one);
+    out[2] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_cmpeq_ps(in1[3], in2[3]);
-    out[3] = _mm_and_ps  (xmm1 , one);
+    out[3] = _mm_and_ps  (xmm1, one);
 
     in1+=4;
     in2+=4;
@@ -159,7 +159,7 @@ static t_int *scalareq_tilde_performSSE(t_int *w)
 {
   __m128 *in = (__m128 *)(w[1]);
   __m128 *out = (__m128 *)(w[3]);
-  float f = *(float *)(w[2]);
+  t_float f = *(t_float *)(w[2]);
   __m128 scalar = _mm_set1_ps(f);
   int n = (int)(w[4])>>4;
   const __m128 one    = _mm_set1_ps(1.f);
@@ -201,13 +201,13 @@ static void eq_tilde_dsp(t_eq_tilde* UNUSED(x), t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(eq_tilde_performSSE, 4, in1, in2, out, (t_int)n);
+    dsp_add(eq_tilde_performSSE, 4, in1, in2, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(eq_tilde_perform, 4, in1, in2, out, (t_int)n);
+      dsp_add(eq_tilde_perform, 4, in1, in2, out, n);
     } else {
-      dsp_add(eq_tilde_perf8, 4, in1, in2, out, (t_int)n);
+      dsp_add(eq_tilde_perf8, 4, in1, in2, out, n);
     }
 }
 
@@ -224,39 +224,35 @@ static void scalareq_tilde_dsp(t_scalareq_tilde *x, t_signal **sp)
     Z_SIMD_CHKALIGN(out) &&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(scalareq_tilde_performSSE, 4, in, &x->x_g, out, (t_int)n);
+    dsp_add(scalareq_tilde_performSSE, 4, in, &x->x_g, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(scalareq_tilde_perform, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalareq_tilde_perform, 4, in, &x->x_g, out, n);
     } else {
-      dsp_add(scalareq_tilde_perf8,   4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalareq_tilde_perf8,   4, in, &x->x_g, out, n);
     }
 }
 
-static void eq_tilde_help(t_object*x)
+static void eq_tilde_help(t_object* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " &&~\t\t:: test 2 signals for equality");
 }
-void setup_0x3d0x3d_tilde(void)
+ZEXY_SETUP void setup_0x3d0x3d0x7e(void)
 {
-  eq_tilde_class = class_new(gensym("==~"), (t_newmethod)eq_tilde_new, 0,
-                             sizeof(t_eq_tilde), 0, A_GIMME, 0);
-  class_addmethod(eq_tilde_class, (t_method)eq_tilde_dsp, gensym("dsp"),
-                    A_CANT, 0);
+  eq_tilde_class = zexy_new("==~",
+                            eq_tilde_new, 0, t_eq_tilde, 0, "*");
+  zexy_addmethod(eq_tilde_class, (t_method)eq_tilde_dsp, "dsp", "!");
   CLASS_MAINSIGNALIN(eq_tilde_class, t_eq_tilde, x_f);
-  class_addmethod  (eq_tilde_class, (t_method)eq_tilde_help, gensym("help"),
-                    A_NULL);
+  zexy_addmethod(eq_tilde_class, (t_method)eq_tilde_help, "help", "");
   class_sethelpsymbol(eq_tilde_class, gensym("zigbinops"));
 
-  scalareq_tilde_class = class_new(gensym("==~"), 0, 0,
-                                   sizeof(t_scalareq_tilde), 0, 0);
+  scalareq_tilde_class = zexy_new("==~",
+                                  0, 0, t_scalareq_tilde, 0, "");
   CLASS_MAINSIGNALIN(scalareq_tilde_class, t_scalareq_tilde, x_f);
-  class_addmethod(scalareq_tilde_class, (t_method)scalareq_tilde_dsp,
-                  gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod  (scalareq_tilde_class, (t_method)eq_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(scalareq_tilde_class, (t_method)scalareq_tilde_dsp, "dsp",
+                 "!");
+  zexy_addmethod(scalareq_tilde_class, (t_method)eq_tilde_help, "help", "");
   class_sethelpsymbol(scalareq_tilde_class, gensym("zigbinops"));
 
   zexy_register("==~");
@@ -265,6 +261,6 @@ void setup_0x3d0x3d_tilde(void)
 #ifndef ZEXY_LIBRARY
 void setup(void)
 {
-  setup_0x3d0x3d_tilde();
+  setup_0x3d0x3d0x7e();
 }
 #endif
diff --git a/externals/zexy/src/0x3e_tilde.c b/externals/zexy/src/0x3e0x7e.c
similarity index 79%
rename from externals/zexy/src/0x3e_tilde.c
rename to externals/zexy/src/0x3e0x7e.c
index 008a3b1c32fd324c87ce14f9483429e59cb4ed96..ea0ba3a7cb9b1f4614b7812469374df16e96d946 100644
--- a/externals/zexy/src/0x3e_tilde.c
+++ b/externals/zexy/src/0x3e0x7e.c
@@ -1,5 +1,5 @@
 /*
- * >~: signal comparision
+ * >~: signal comparison
  *
  * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute, institute of electronic music and acoustics (iem)
  *
@@ -23,7 +23,7 @@
 /* ------------------------ relational~ ----------------------------- */
 
 /* ----------------------------- gt_tilde ----------------------------- */
-static t_class *gt_tilde_class, *scalargt_tilde_class;
+static t_class *gt_tilde_class=NULL, *scalargt_tilde_class=NULL;
 
 typedef struct _gt_tilde {
   t_object x_obj;
@@ -33,7 +33,7 @@ typedef struct _gt_tilde {
 typedef struct _scalargt_tilde {
   t_object x_obj;
   t_float x_f;
-  t_float x_g;    	    /* inlet value */
+  t_float x_g;              /* inlet value */
 } t_scalargt_tilde;
 
 static void *gt_tilde_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
@@ -139,16 +139,16 @@ static t_int *gt_tilde_performSSE(t_int *w)
   while (n--) {
     __m128 xmm0, xmm1;
     xmm0   = _mm_cmpgt_ps(in1[0], in2[0]);
-    out[0] = _mm_and_ps  (xmm0 , one);
+    out[0] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_cmpgt_ps(in1[1], in2[1]);
-    out[1] = _mm_and_ps  (xmm1 , one);
+    out[1] = _mm_and_ps  (xmm1, one);
 
     xmm0   = _mm_cmpgt_ps(in1[2], in2[2]);
-    out[2] = _mm_and_ps  (xmm0 , one);
+    out[2] = _mm_and_ps  (xmm0, one);
 
     xmm1   = _mm_cmpgt_ps(in1[3], in2[3]);
-    out[3] = _mm_and_ps  (xmm1 , one);
+    out[3] = _mm_and_ps  (xmm1, one);
 
     in1+=4;
     in2+=4;
@@ -204,13 +204,13 @@ static void gt_tilde_dsp(t_gt_tilde* UNUSED(x), t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(gt_tilde_performSSE, 4, in1, in2, out, (t_int)n);
+    dsp_add(gt_tilde_performSSE, 4, in1, in2, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(gt_tilde_perform, 4, in1, in2, out, (t_int)n);
+      dsp_add(gt_tilde_perform, 4, in1, in2, out, n);
     } else {
-      dsp_add(gt_tilde_perf8, 4, in1, in2, out, (t_int)n);
+      dsp_add(gt_tilde_perf8, 4, in1, in2, out, n);
     }
 }
 
@@ -227,40 +227,36 @@ static void scalargt_tilde_dsp(t_scalargt_tilde *x, t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(scalargt_tilde_performSSE, 4, in, &x->x_g, out, (t_int)n);
+    dsp_add(scalargt_tilde_performSSE, 4, in, &x->x_g, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(scalargt_tilde_perform, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalargt_tilde_perform, 4, in, &x->x_g, out, n);
     } else {
-      dsp_add(scalargt_tilde_perf8,   4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalargt_tilde_perf8,   4, in, &x->x_g, out, n);
     }
 }
 
-static void gt_tilde_help(t_object*x)
+static void gt_tilde_help(t_object* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " >~\t\t:: compare 2 signals");
 }
 
-void setup_0x3e_tilde(void)
+ZEXY_SETUP void setup_0x3e0x7e(void)
 {
-  gt_tilde_class = class_new(gensym(">~"), (t_newmethod)gt_tilde_new, 0,
-                             sizeof(t_gt_tilde), 0, A_GIMME, 0);
-  class_addmethod(gt_tilde_class, (t_method)gt_tilde_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  gt_tilde_class = zexy_new(">~",
+                            gt_tilde_new, 0, t_gt_tilde, 0, "*");
+  zexy_addmethod(gt_tilde_class, (t_method)gt_tilde_dsp, "dsp", "!");
   CLASS_MAINSIGNALIN(gt_tilde_class, t_gt_tilde, x_f);
-  class_addmethod  (gt_tilde_class, (t_method)gt_tilde_help, gensym("help"),
-                    A_NULL);
+  zexy_addmethod(gt_tilde_class, (t_method)gt_tilde_help, "help", "");
   class_sethelpsymbol(gt_tilde_class, gensym("zigbinops"));
 
-  scalargt_tilde_class = class_new(gensym(">~"), 0, 0,
-                                   sizeof(t_scalargt_tilde), 0, 0);
+  scalargt_tilde_class = zexy_new(">~",
+                                  0, 0, t_scalargt_tilde, 0, "");
   CLASS_MAINSIGNALIN(scalargt_tilde_class, t_scalargt_tilde, x_f);
-  class_addmethod(scalargt_tilde_class, (t_method)scalargt_tilde_dsp,
-                  gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod  (scalargt_tilde_class, (t_method)gt_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(scalargt_tilde_class, (t_method)scalargt_tilde_dsp, "dsp",
+                 "!");
+  zexy_addmethod(scalargt_tilde_class, (t_method)gt_tilde_help, "help", "");
   class_sethelpsymbol(scalargt_tilde_class, gensym("zigbinops"));
 
   zexy_register(">~");
@@ -269,6 +265,6 @@ void setup_0x3e_tilde(void)
 #ifndef ZEXY_LIBRARY
 void setup(void)
 {
-  setup_0x3e_tilde();
+  setup_0x3e0x7e();
 }
 #endif
diff --git a/externals/zexy/src/0x7c0x7c_tilde.c b/externals/zexy/src/0x7c0x7c0x7e.c
similarity index 75%
rename from externals/zexy/src/0x7c0x7c_tilde.c
rename to externals/zexy/src/0x7c0x7c0x7e.c
index 558c7609078098b3f9bb3cb29a1fb6e4d9486074..65b7657a550f10676a1bde6b8667f2a50b76788a 100644
--- a/externals/zexy/src/0x7c0x7c_tilde.c
+++ b/externals/zexy/src/0x7c0x7c0x7e.c
@@ -20,7 +20,7 @@
 #include "zexySIMD.h"
 
 /* ----------------------------- oror_tilde ----------------------------- */
-static t_class *oror_tilde_class, *scalaroror_tilde_class;
+static t_class *oror_tilde_class=NULL, *scalaroror_tilde_class=NULL;
 
 typedef struct _oror_tilde {
   t_object x_obj;
@@ -30,7 +30,7 @@ typedef struct _oror_tilde {
 typedef struct _scalaroror_tilde {
   t_object x_obj;
   t_float x_f;
-  t_float x_g;    	    /* inlet value */
+  t_float x_g;              /* inlet value */
 } t_scalaroror_tilde;
 
 static void *oror_tilde_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
@@ -140,23 +140,23 @@ static t_int *oror_tilde_performSSE(t_int *w)
     __m128 xmm0, xmm1, xmm2;
     xmm0   = _mm_cmpneq_ps(in1[0], zero);
     xmm1   = _mm_cmpneq_ps(in2[0], zero);
-    xmm2   = _mm_or_ps    (xmm0 , xmm1);
-    out[0] = _mm_and_ps   (xmm2 , one);
+    xmm2   = _mm_or_ps    (xmm0, xmm1);
+    out[0] = _mm_and_ps   (xmm2, one);
 
     xmm0   = _mm_cmpneq_ps(in1[1], zero);
     xmm1   = _mm_cmpneq_ps(in2[1], zero);
-    xmm2   = _mm_or_ps    (xmm0 , xmm1);
-    out[1] = _mm_and_ps   (xmm2 , one);
+    xmm2   = _mm_or_ps    (xmm0, xmm1);
+    out[1] = _mm_and_ps   (xmm2, one);
 
     xmm0   = _mm_cmpneq_ps(in1[2], zero);
     xmm1   = _mm_cmpneq_ps(in2[2], zero);
-    xmm2   = _mm_or_ps    (xmm0 , xmm1);
-    out[2] = _mm_and_ps   (xmm2 , one);
+    xmm2   = _mm_or_ps    (xmm0, xmm1);
+    out[2] = _mm_and_ps   (xmm2, one);
 
     xmm0   = _mm_cmpneq_ps(in1[3], zero);
     xmm1   = _mm_cmpneq_ps(in2[3], zero);
-    xmm2   = _mm_or_ps    (xmm0 , xmm1);
-    out[3] = _mm_and_ps   (xmm2 , one);
+    xmm2   = _mm_or_ps    (xmm0, xmm1);
+    out[3] = _mm_and_ps   (xmm2, one);
 
     in1+=4;
     in2+=4;
@@ -179,20 +179,20 @@ static t_int *scalaroror_tilde_performSSE(t_int *w)
   while (n--) {
     __m128 xmm0, xmm1;
     xmm0   = _mm_cmpneq_ps(in[0], zero);
-    xmm1   = _mm_or_ps    (xmm0 , scalar);
-    out[0] = _mm_and_ps   (xmm1 , one);
+    xmm1   = _mm_or_ps    (xmm0, scalar);
+    out[0] = _mm_and_ps   (xmm1, one);
 
     xmm0   = _mm_cmpneq_ps(in[1], zero);
-    xmm1   = _mm_or_ps    (xmm0 , scalar);
-    out[1] = _mm_and_ps   (xmm1 , one);
+    xmm1   = _mm_or_ps    (xmm0, scalar);
+    out[1] = _mm_and_ps   (xmm1, one);
 
     xmm0   = _mm_cmpneq_ps(in[2], zero);
-    xmm1   = _mm_or_ps    (xmm0 , scalar);
-    out[2] = _mm_and_ps   (xmm1 , one);
+    xmm1   = _mm_or_ps    (xmm0, scalar);
+    out[2] = _mm_and_ps   (xmm1, one);
 
     xmm0   = _mm_cmpneq_ps(in[3], zero);
-    xmm1   = _mm_or_ps    (xmm0 , scalar);
-    out[3] = _mm_and_ps   (xmm1 , one);
+    xmm1   = _mm_or_ps    (xmm0, scalar);
+    out[3] = _mm_and_ps   (xmm1, one);
 
 
     in +=4;
@@ -219,13 +219,13 @@ static void oror_tilde_dsp(t_oror_tilde* UNUSED(x), t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(oror_tilde_performSSE, 4, in1, in2, out, (t_int)n);
+    dsp_add(oror_tilde_performSSE, 4, in1, in2, out, n);
   } else
 #endif
     if(n&7) {
-      dsp_add(oror_tilde_perform, 4, in1, in2, out, (t_int)n);
+      dsp_add(oror_tilde_perform, 4, in1, in2, out, n);
     } else {
-      dsp_add(oror_tilde_perf8, 4, in1, in2, out, (t_int)n);
+      dsp_add(oror_tilde_perf8, 4, in1, in2, out, n);
     }
 }
 
@@ -242,40 +242,37 @@ static void scalaroror_tilde_dsp(t_scalaroror_tilde *x, t_signal **sp)
     Z_SIMD_CHKALIGN(out)&&
     ZEXY_TYPE_EQUAL(t_sample, float)
   ) {
-    dsp_add(scalaroror_tilde_performSSE, 4, in, &x->x_g, out, (t_int)n);
+    dsp_add(scalaroror_tilde_performSSE, 4, in, &x->x_g, out, n);
   } else
 #endif
     if (n&7) {
-      dsp_add(scalaroror_tilde_perform, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalaroror_tilde_perform, 4, in, &x->x_g, out, n);
     } else {
-      dsp_add(scalaroror_tilde_perf8, 4, in, &x->x_g, out, (t_int)n);
+      dsp_add(scalaroror_tilde_perf8, 4, in, &x->x_g, out, n);
     }
 }
 
-static void oror_tilde_help(t_object*x)
+static void oror_tilde_help(t_object* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " &&~\t\t:: logical OR operation on 2 signals");
 }
 
-void setup_0x7c0x7c_tilde(void)
+ZEXY_SETUP void setup_0x7c0x7c0x7e(void)
 {
-  oror_tilde_class = class_new(gensym("||~"), (t_newmethod)oror_tilde_new, 0,
-                               sizeof(t_oror_tilde), 0, A_GIMME, 0);
-  class_addmethod(oror_tilde_class, (t_method)oror_tilde_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  oror_tilde_class = zexy_new("||~",
+                              oror_tilde_new, 0, t_oror_tilde, 0, "*");
+  zexy_addmethod(oror_tilde_class, (t_method)oror_tilde_dsp, "dsp", "!");
   CLASS_MAINSIGNALIN(oror_tilde_class, t_oror_tilde, x_f);
-  class_addmethod  (oror_tilde_class, (t_method)oror_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(oror_tilde_class, (t_method)oror_tilde_help, "help", "");
   class_sethelpsymbol(oror_tilde_class, gensym("zigbinops"));
 
-  scalaroror_tilde_class = class_new(gensym("||~"), 0, 0,
-                                     sizeof(t_scalaroror_tilde), 0, 0);
+  scalaroror_tilde_class = zexy_new("||~",
+                                    0, 0, t_scalaroror_tilde, 0, "");
   CLASS_MAINSIGNALIN(scalaroror_tilde_class, t_scalaroror_tilde, x_f);
-  class_addmethod(scalaroror_tilde_class, (t_method)scalaroror_tilde_dsp,
-                  gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod  (scalaroror_tilde_class, (t_method)oror_tilde_help,
-                    gensym("help"), A_NULL);
+  zexy_addmethod(scalaroror_tilde_class, (t_method)scalaroror_tilde_dsp,
+                 "dsp", "!");
+  zexy_addmethod(scalaroror_tilde_class, (t_method)oror_tilde_help, "help",
+                 "");
   class_sethelpsymbol(scalaroror_tilde_class, gensym("zigbinops"));
 
   zexy_register("||~");
@@ -284,6 +281,6 @@ void setup_0x7c0x7c_tilde(void)
 #ifndef ZEXY_LIBRARY
 void setup(void)
 {
-  setup_0x7c0x7c_tilde();
+  setup_0x7c0x7c0x7e();
 }
 #endif
diff --git a/externals/zexy/src/Makefile.am b/externals/zexy/src/Makefile.am
deleted file mode 100644
index 399eb3d0bc21b163fd54345a3f48870fb0171979..0000000000000000000000000000000000000000
--- a/externals/zexy/src/Makefile.am
+++ /dev/null
@@ -1,250 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-ACLOCAL_AMFLAGS = -I m4
-
-pkglib_LTLIBRARIES=
-
-AM_CFLAGS =
-AM_LDFLAGS= -module -avoid-version -shared -shrext .@EXTENSION@
-
-if WINDOWS
-AM_LDFLAGS+= -no-undefined
-endif
-
-AM_LDFLAGS+= @EXTRA_LTFLAGS@
-
-# RTE
-AM_CFLAGS += 
-AM_LDFLAGS+= 
-
-EXTRA_DIST = \
-	astyle.rc
-
-if LIBRARY
-pkglib_LTLIBRARIES+=zexy.la
-endif LIBRARY
-if SINGLEOBJECTS
-pkglib_LTLIBRARIES+= \
-	0x260x26_tilde.la \
-	0x2e.la \
-	0x3c_tilde.la \
-	0x3d0x3d_tilde.la \
-	0x3e_tilde.la \
-	0x7c0x7c_tilde.la \
-	any2list.la \
-	a2l.la \
-	abs~.la \
-	absgn~.la \
-	atoi.la \
-	atof.la \
-	avg~.la \
-	blockmirror~.la \
-	blockshuffle~.la \
-	blockswap~.la \
-	date.la \
-	demultiplex~.la \
-	demux~.la \
-	demultiplex.la \
-	demux.la \
-	dfreq~.la \
-	dirac~.la \
-	doublepole~.la \
-	drip.la \
-	unfold.la \
-	envrms~.la \
-	fifop.la \
-	freadln.la \
-	fwriteln.la \
-	glue.la \
-	index.la \
-	length.la \
-	lifop.la \
-	limiter~.la \
-	l2i.la \
-	list2int.la \
-	list2lists.la \
-	l2s.la \
-	list2symbol.la \
-	l.la \
-	lister.la \
-	listfind.la \
-	liststorage.la \
-	longload.la \
-	lpt.la \
-	lp.la \
-	makesymbol.la \
-	matchbox.la \
-	mavg.la \
-	minmax.la \
-	msgfile.la \
-	multiline~.la \
-	mux~.la \
-	mux.la \
-	multiplex~.la \
-	multiplex.la \
-	multireceive.la \
-	niagara.la \
-	noish~.la \
-	noisi~.la \
-	operating_system.la \
-	pack~.la \
-	pack.la \
-	packel.la \
-	pdf~.la \
-	prime.la \
-	quantize~.la \
-	rawprint.la \
-	regex.la \
-	relay.la \
-	repack.la \
-	repeat.la \
-	route~.la \
-	sfplay.la \
-	sfrecord.la \
-	sgn~.la \
-	sigzero~.la \
-	sleepgrain.la \
-	sort.la \
-	step~.la \
-	strcmp.la \
-	sum.la \
-	swap~.la \
-	symbol2list.la \
-	s2l.la \
-	tabdump.la \
-	tabminmax.la \
-	tabread4~~.la \
-	tabset.la \
-	tavg~.la \
-	time.la \
-	unpack~.la \
-	unpack.la \
-	urn.la \
-	wrap.la \
-	z~.la
-endif SINGLEOBJECTS
-
-zexy_la_CPPFLAGS=-DZEXY_LIBRARY
-
-
-0x260x260x7e_la_SOURCES	= 0x260x260x7e.c
-0x2e_la_SOURCES		= 0x2e.c
-0x3c0x7e_la_SOURCES	= 0x3c0x7e.c
-0x3d0x3d0x7e_la_SOURCES	= 0x3d0x3d0x7e.c
-0x3e0x7e_la_SOURCES	= 0x3e0x7e.c
-0x7c0x7c0x7e_la_SOURCES	= 0x7c0x7c0x7e.c
-a2l_la_SOURCES		= a2l.c
-any2list_la_SOURCES	= a2l.c
-abs__la_SOURCES		= abs~.c
-absgn__la_SOURCES	= absgn~.c
-atoi_la_SOURCES		= atoi.c
-atof_la_SOURCES		= atof.c
-avg__la_SOURCES		= avg~.c
-blockmirror__la_SOURCES	= blockmirror~.c
-blockshuffle__la_SOURCES= blockshuffle~.c
-blockswap__la_SOURCES	= blockswap~.c
-date_la_SOURCES		= date.c
-demultiplex__la_SOURCES	= demultiplex~.c
-demux__la_SOURCES	= demultiplex~.c
-demultiplex_la_SOURCES	= demultiplex.c
-demux_la_SOURCES	= demultiplex.c
-dfreq__la_SOURCES	= dfreq~.c
-dirac__la_SOURCES	= dirac~.c
-doublepole__la_SOURCES	= doublepole~.c
-drip_la_SOURCES		= drip.c
-unfold_la_SOURCES	= drip.c
-envrms__la_SOURCES	= envrms~.c
-fifop_la_SOURCES	= fifop.c
-freadln_la_SOURCES	= freadln.c
-fwriteln_la_SOURCES	= fwriteln.c
-glue_la_SOURCES		= glue.c
-index_la_SOURCES	= index.c
-length_la_SOURCES	= length.c
-lifop_la_SOURCES	= lifop.c
-limiter__la_SOURCES	= limiter~.c
-list2int_la_SOURCES	= list2int.c
-l2i_la_SOURCES		= list2int.c
-list2lists_la_SOURCES	= list2lists.c
-list2symbol_la_SOURCES	= list2symbol.c
-l2s_la_SOURCES		= list2symbol.c
-lister_la_SOURCES	= lister.c
-l_la_SOURCES		= lister.c
-listfind_la_SOURCES	= listfind.c
-liststorage_la_SOURCES	= liststorage.c
-longload_la_SOURCES	= longload.c
-if LPT
-lpt_la_SOURCES		= lpt.c
-lp_la_SOURCES		= lpt.c
-if WINDOWS
-lpt_la_SOURCES		+= winNT_portio.c
-lp_la_SOURCES		+= winNT_portio.c
-endif
-endif
-makesymbol_la_SOURCES	= makesymbol.c
-matchbox_la_SOURCES	= matchbox.c
-mavg_la_SOURCES		= mavg.c
-minmax_la_SOURCES	= minmax.c
-msgfile_la_SOURCES	= msgfile.c
-multiline__la_SOURCES	= multiline~.c
-mux__la_SOURCES		= multiplex~.c
-multiplex__la_SOURCES	= multiplex~.c
-mux_la_SOURCES		= multiplex.c
-multiplex_la_SOURCES	= multiplex.c
-multireceive_la_SOURCES	= multireceive.c
-niagara_la_SOURCES	= niagara.c
-noish__la_SOURCES	= noish~.c
-noisi__la_SOURCES	= noisi~.c
-operating_system_la_SOURCES	= operating_system.c
-pack__la_SOURCES	= pack~.c
-pack_la_SOURCES		= pack.c
-packel_la_SOURCES	= packel.c
-pdf__la_SOURCES		= pdf~.c
-prime_la_SOURCES	= prime.c
-quantize__la_SOURCES	= quantize~.c
-rawprint_la_SOURCES	= rawprint.c
-regex_la_SOURCES	= regex.c
-relay_la_SOURCES	= relay.c
-repack_la_SOURCES	= repack.c
-repeat_la_SOURCES	= repeat.c
-route__la_SOURCES	= route~.c
-sfplay_la_SOURCES	= sfplay.c
-sfrecord_la_SOURCES	= sfrecord.c
-sgn__la_SOURCES		= sgn~.c
-sigzero__la_SOURCES	= sigzero~.c
-sleepgrain_la_SOURCES	= sleepgrain.c
-sort_la_SOURCES		= sort.c
-step__la_SOURCES	= step~.c
-strcmp_la_SOURCES	= strcmp.c
-sum_la_SOURCES		= sum.c
-swap__la_SOURCES	= swap~.c
-symbol2list_la_SOURCES	= symbol2list.c
-s2l_la_SOURCES		= symbol2list.c
-tabdump_la_SOURCES	= tabdump.c
-tabminmax_la_SOURCES	= tabminmax.c
-tabread4___la_SOURCES	= tabread4~~.c
-tabset_la_SOURCES	= tabset.c
-tavg__la_SOURCES	= tavg~.c
-time_la_SOURCES		= time.c
-unpack__la_SOURCES	= unpack~.c
-unpack_la_SOURCES	= unpack.c
-urn_la_SOURCES		= urn.c
-wrap_la_SOURCES		= wrap.c
-z__la_SOURCES		= z~.c
-
-zexy_la_SOURCES	= zexy.c z_zexy.c \
-	zexy.h zexySIMD.h z_zexy.h zexyconf.h \
-	0x260x260x7e.c 0x2e.c 0x3c0x7e.c 0x3d0x3d0x7e.c 0x3e0x7e.c 0x7c0x7c0x7e.c \
-	a2l.c abs~.c absgn~.c atoi.c atof.c avg~.c  \
-	blockmirror~.c blockshuffle~.c blockswap~.c \
-	date.c demultiplex~.c demultiplex.c dfreq~.c dirac~.c doublepole~.c drip.c envrms~.c \
-	fifop.c freadln.c fwriteln.c glue.c index.c length.c lifop.c limiter~.c \
-	list2int.c list2lists.c list2symbol.c lister.c listfind.c liststorage.c longload.c lpt.c \
-	makesymbol.c matchbox.c mavg.c minmax.c msgfile.c multiline~.c multiplex~.c \
-	multiplex.c multireceive.c niagara.c noish~.c noisi~.c operating_system.c pack~.c \
-	pack.c packel.c pdf~.c prime.c quantize~.c rawprint.c regex.c relay.c repack.c \
-	repeat.c route~.c sfplay.c sfrecord.c sgn~.c sigzero~.c sleepgrain.c sort.c \
-	step~.c strcmp.c sum.c swap~.c symbol2list.c tabdump.c tabminmax.c tabread4~~.c \
-	tabset.c tavg~.c time.c unpack~.c unpack.c urn.c wrap.c z~.c
-if WINDOWS
-zexy_la_SOURCES	+= winNT_portio.c
-endif
-
diff --git a/externals/zexy/src/a2l.c b/externals/zexy/src/a2l.c
index 0f9b9044032c827cb9f88a17170d96423ecb998a..c84458e2eca3c5c1b7c68bb4e322283d1c4f663c 100644
--- a/externals/zexy/src/a2l.c
+++ b/externals/zexy/src/a2l.c
@@ -20,7 +20,7 @@
 #include "zexy.h"
 #include <string.h>
 
-static t_class *a2l_class;
+static t_class *a2l_class=NULL;
 
 typedef struct _a2l {
   t_object x_obj;
@@ -74,26 +74,29 @@ static void *a2l_new(void)
   outlet_new(&x->x_obj, 0);
   return (x);
 }
-
-void a2l_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class *c = zexy_new(name,
+                        a2l_new, 0, t_a2l, 0, "");
+  class_addbang    (c, a2l_bang);
+  class_addfloat   (c, a2l_float);
+  class_addsymbol  (c, a2l_symbol);
+  class_addpointer (c, a2l_pointer);
+  class_addlist    (c, a2l_list);
+  class_addanything(c, a2l_anything);
+  return c;
+}
+static void dosetup()
 {
-
-  a2l_class = class_new(gensym("a2l"), (t_newmethod)a2l_new,
-                        0, sizeof(t_a2l), 0, 0);
-  class_addcreator((t_newmethod)a2l_new, gensym("any2list"), 0);
-
-
-  class_addbang    (a2l_class, a2l_bang);
-  class_addfloat   (a2l_class, a2l_float);
-  class_addsymbol  (a2l_class, a2l_symbol);
-  class_addpointer (a2l_class, a2l_pointer);
-  class_addlist    (a2l_class, a2l_list);
-  class_addanything(a2l_class, a2l_anything);
-
   zexy_register("any2list");
+  a2l_class=zclass_setup("any2list");
+  zclass_setup("a2l");
 }
-
 void any2list_setup(void)
 {
-  a2l_setup();
+  dosetup();
+}
+ZEXY_SETUP void a2l_setup(void)
+{
+  dosetup();
 }
diff --git a/externals/zexy/src/absgn~.c b/externals/zexy/src/absgn~.c
index 52d828927c6e47292f14d2fcf84f13a2c48ae802..e04a1b5092484fd9f7dd8b6ffd8e238a01ea0d06 100644
--- a/externals/zexy/src/absgn~.c
+++ b/externals/zexy/src/absgn~.c
@@ -27,7 +27,7 @@ typedef struct _absgn {
 
 /* ------------------------ sigABSGN~ ----------------------------- */
 
-static t_class *sigABSGN_class;
+static t_class *sigABSGN_class=NULL;
 
 static t_int *sigABSGN_perform(t_int *w)
 {
@@ -38,7 +38,7 @@ static t_int *sigABSGN_perform(t_int *w)
 
   while (n--) {
     t_sample val = *in++;
-    *out++ = fabsf(val);
+    *out++ = Z_FABS(val);
 
     if (val>0.) {
       *out2++=1.;
@@ -106,12 +106,12 @@ static void sigABSGN_dsp(t_absgn* UNUSED(x), t_signal **sp)
     zexy_testSSE(sigABSGN_perform, sigABSGN_performSSE, 1, 2)
   ) {
     dsp_add(sigABSGN_performSSE, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
   } else
 #endif
   {
     dsp_add(sigABSGN_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
   }
 }
 
@@ -132,16 +132,14 @@ static void *sigABSGN_new(void)
   return (x);
 }
 
-void absgn_tilde_setup(void)
+ZEXY_SETUP void absgn_tilde_setup(void)
 {
-  sigABSGN_class = class_new(gensym("absgn~"), (t_newmethod)sigABSGN_new, 0,
-                             sizeof(t_absgn), 0, A_DEFFLOAT, 0);
+  sigABSGN_class = zexy_new("absgn~",
+                            sigABSGN_new, 0, t_absgn, 0, "");
   CLASS_MAINSIGNALIN(sigABSGN_class, t_absgn, x_f);
-  class_addmethod(sigABSGN_class, (t_method)sigABSGN_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(sigABSGN_class, (t_method)sigABSGN_dsp, "dsp", "!");
 
-  class_addmethod(sigABSGN_class, (t_method)sigABSGN_helper, gensym("help"),
-                  0);
+  zexy_addmethod(sigABSGN_class, (t_method)sigABSGN_helper, "help", "");
   class_sethelpsymbol(sigABSGN_class, gensym("zigbinops"));
 
   zexy_register("absgn~");
diff --git a/externals/zexy/src/abs~.c b/externals/zexy/src/abs~.c
index c2bf55a28c6060b35d5dc9dee383d5988cd64378..14ba59d89ced017b16e6d981f43c7442d27c9094 100644
--- a/externals/zexy/src/abs~.c
+++ b/externals/zexy/src/abs~.c
@@ -28,7 +28,7 @@ typedef struct _abs {
 
 /* ------------------------ sigABS~ ----------------------------- */
 
-static t_class *sigABS_class;
+static t_class *sigABS_class=NULL;
 
 static t_int *sigABS_perform(t_int *w)
 {
@@ -37,7 +37,7 @@ static t_int *sigABS_perform(t_int *w)
   int n = (int)(w[3]);
 
   while (n--) {
-    *out++ = fabsf(*in++);
+    *out++ = Z_FABS(*in++);
   }
 
   return (w+4);
@@ -54,10 +54,10 @@ static t_int *sigABS_performSSE(t_int *w)
   __m128  bitmask= _mm_loadu_ps((float*)l_bitmask);
 
   while (n--) {
-    out[0] = _mm_and_ps(in[0] , bitmask);
-    out[1] = _mm_and_ps(in[1] , bitmask);
-    out[2] = _mm_and_ps(in[2] , bitmask);
-    out[3] = _mm_and_ps(in[3] , bitmask);
+    out[0] = _mm_and_ps(in[0], bitmask);
+    out[1] = _mm_and_ps(in[1], bitmask);
+    out[2] = _mm_and_ps(in[2], bitmask);
+    out[3] = _mm_and_ps(in[3], bitmask);
 
     in +=4;
     out+=4;
@@ -73,39 +73,39 @@ static t_int *sigABS_performSSE(t_int *w)
    * assembler
    */
   asm(
-    ".section	.rodata             \n"
-    ".align 16                    \n"
-    "2:                           \n"
-    ".long	2147483647          \n" /* bitmask */
-    ".long	2147483647          \n" /* 0x7fffffff */
-    ".long	2147483647          \n"
-    ".long	2147483647          \n"
+    ".section .rodata         \n"
+    ".align   16              \n"
+    "2:                       \n"
+    ".long    2147483647      \n" /* bitmask */
+    ".long    2147483647      \n" /* 0x7fffffff */
+    ".long    2147483647      \n"
+    ".long    2147483647      \n"
 
-    ".text                        \n"
+    ".text                    \n"
 
-    "movaps    (2b), %%xmm0       \n" /* xmm0 = bitmask */
-    "shrl      $4, %2             \n"
+    "movaps  (2b), %%xmm0     \n" /* xmm0 = bitmask */
+    "shrl    $4, %2           \n"
 
     /* loop: *dest = abs(*src) */
-    "1:                           \n"
-    "movaps    (%0,%3), %%xmm1    \n"
-    "andps     %%xmm0, %%xmm1     \n"
-    "movaps    %%xmm1, (%1,%3)    \n"
+    "1:                       \n"
+    "movaps  (%0,%3), %%xmm1  \n"
+    "andps   %%xmm0, %%xmm1   \n"
+    "movaps  %%xmm1, (%1,%3)  \n"
 
-    "movaps    16(%0,%3), %%xmm2  \n"
-    "andps     %%xmm0, %%xmm2     \n"
-    "movaps    %%xmm2, 16(%1,%3)  \n"
+    "movaps  16(%0,%3), %%xmm2\n"
+    "andps   %%xmm0, %%xmm2   \n"
+    "movaps  %%xmm2, 16(%1,%3)\n"
 
-    "movaps    32(%0,%3), %%xmm3  \n"
-    "andps     %%xmm0, %%xmm3     \n"
-    "movaps    %%xmm3, 32(%1,%3)  \n"
+    "movaps  32(%0,%3), %%xmm3\n"
+    "andps   %%xmm0, %%xmm3   \n"
+    "movaps  %%xmm3, 32(%1,%3)\n"
 
-    "movaps    48(%0,%3), %%xmm4  \n"
-    "andps     %%xmm0, %%xmm4     \n"
-    "movaps    %%xmm4, 48(%1,%3)  \n"
+    "movaps  48(%0,%3), %%xmm4\n"
+    "andps   %%xmm0, %%xmm4   \n"
+    "movaps  %%xmm4, 48(%1,%3)\n"
 
-    "addl      $64, %3            \n"
-    "loop      1b                 \n"
+    "addl    $64, %3          \n"
+    "loop    1b               \n"
     :
     :"r"(in), "r"(out), "c"(n), "r"(0)
     :"%xmm0", "%xmm1", "%xmm2", "%xmm3", "%xmm4"
@@ -116,7 +116,7 @@ static t_int *sigABS_performSSE(t_int *w)
 }
 #endif /* __SSE__ */
 
-static void sigABS_dsp(t_abs *x, t_signal **sp)
+static void sigABS_dsp(t_abs * UNUSED(x), t_signal **sp)
 {
 #ifdef __SSE__
   if(
@@ -128,11 +128,11 @@ static void sigABS_dsp(t_abs *x, t_signal **sp)
                  sigABS_performSSE,
                  1, 1)
   ) {
-    dsp_add(sigABS_performSSE, 3, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+    dsp_add(sigABS_performSSE, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
   } else
 #endif
   {
-    dsp_add(sigABS_perform, 3, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+    dsp_add(sigABS_perform, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
   }
 }
 
@@ -150,15 +150,14 @@ static void *sigABS_new(void)
   return (x);
 }
 
-void abs_tilde_setup(void)
+ZEXY_SETUP void abs_tilde_setup(void)
 {
-  sigABS_class = class_new(gensym("abs~"), (t_newmethod)sigABS_new, 0,
-                           sizeof(t_abs), 0, A_DEFFLOAT, 0);
+  sigABS_class = zexy_new("abs~",
+                          sigABS_new, 0, t_abs, 0, "");
   CLASS_MAINSIGNALIN(sigABS_class, t_abs, x_f);
-  class_addmethod(sigABS_class, (t_method)sigABS_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(sigABS_class, (t_method)sigABS_dsp, "dsp", "!");
 
-  class_addmethod(sigABS_class, (t_method)sigABS_helper, gensym("help"), 0);
+  zexy_addmethod(sigABS_class, (t_method)sigABS_helper, "help", "");
   class_sethelpsymbol(sigABS_class, gensym("zigbinops"));
 
   zexy_register("abs~");
diff --git a/externals/zexy/src/acinclude.m4 b/externals/zexy/src/acinclude.m4
deleted file mode 100644
index 14b472d0c21b58fe36f484c8cab03a471616a714..0000000000000000000000000000000000000000
--- a/externals/zexy/src/acinclude.m4
+++ /dev/null
@@ -1,196 +0,0 @@
-dnl Copyright (C) 2005-2006 IOhannes m zmölnig
-dnl This file is free software; IOhannes m zmölnig
-dnl gives unlimited permission to copy and/or distribute it,
-dnl with or without modifications, as long as this notice is preserved.
-
-# AC_CHECK_CPPFLAGS(ADDITIONAL-CPPFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(C) compiler accepts the ADDITIONAL-CPPFLAGS
-# if so, they are added to the CPPFLAGS
-AC_DEFUN([AC_CHECK_CPPFLAGS],
-[
-  AC_MSG_CHECKING([whether $CPP accepts "$1"])
-  temp_check_cppflags="${CPPFLAGS}"
-  CPPFLAGS="$1 ${CPPFLAGS}"
-  AC_PREPROC_IFELSE(
-        [AC_LANG_SOURCE([[int main(void){return 0;}]])],
-        [AC_MSG_RESULT([yes])],
-        [AC_MSG_RESULT([no]); CPPFLAGS="${temp_check_cppflags}"])
-])# AC_CHECK_CPPFLAGS
-
-
-
-# AC_CHECK_CFLAGS(ADDITIONAL-CFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(C) compiler accepts the ADDITIONAL-CFLAGS
-# if so, they are added to the CFLAGS
-AC_DEFUN([AC_CHECK_CFLAGS],
-[
-  AC_MSG_CHECKING([whether $CC accepts "$1"])
-cat > conftest.c << EOF
-int main(){
-  return 0;
-}
-EOF
-if $CC $CFLAGS [$1] -o conftest.o conftest.c > /dev/null 2>&1
-then
-  AC_MSG_RESULT([yes])
-  CFLAGS="${CFLAGS} [$1]"
-  AC_CHECK_CPPFLAGS([$1])
-  [$2]
-else
-  AC_MSG_RESULT([no])
-  [$3]
-fi
-])# AC_CHECK_CFLAGS
-
-# AC_CHECK_CXXFLAGS(ADDITIONAL-CXXFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(CXX) (c++) compiler accepts the ADDITIONAL-CXXFLAGS
-# if so, they are added to the CXXFLAGS
-AC_DEFUN([AC_CHECK_CXXFLAGS],
-[
-  AC_MSG_CHECKING([whether $CXX accepts "$1"])
-cat > conftest.c++ << EOF
-int main(){
-  return 0;
-}
-EOF
-if $CXX $CPPFLAGS $CXXFLAGS -o conftest.o conftest.c++ [$1] > /dev/null 2>&1
-then
-  AC_MSG_RESULT([yes])
-  CXXFLAGS="${CXXFLAGS} [$1]"
-  AC_CHECK_CPPFLAGS([$1])
-  [$2]
-else
-  AC_MSG_RESULT([no])
-  [$3]
-fi
-])# AC_CHECK_CXXFLAGS
-
-# AC_CHECK_FRAMEWORK(FRAMEWORK, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-#
-AC_DEFUN([AC_CHECK_FRAMEWORK],
-[
-  AC_MSG_CHECKING([for "$1"-framework])
-
-  temp_check_ldflags_org="${LDFLAGS}"
-  LDFLAGS="-framework [$1] ${LDFLAGS}"
-
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [temp_check_ldflags_success="yes"],[temp_check_ldflags_success="no"])
-
-  if test "x$temp_check_ldflags_success" = "xyes"; then
-    AC_MSG_RESULT([yes])
-    [$2]
-  else
-    AC_MSG_RESULT([no])
-    LDFLAGS="$temp_check_ldflags_org"
-    [$3]
-  fi
-])# AC_CHECK_FRAMEWORK
-
-# AC_CHECK_LDFLAGS(ADDITIONAL-LDFLAGS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
-#
-# checks whether the $(LD) linker accepts the ADDITIONAL-LDFLAGS
-# if so, they are added to the LDFLAGS
-AC_DEFUN([AC_CHECK_LDFLAGS],
-[
-  AC_MSG_CHECKING([whether linker accepts "$1"])
-  temp_check_ldflags_org="${LDFLAGS}"
-  LDFLAGS="$1 ${LDFLAGS}"
-
-  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], [temp_check_ldflags_success="yes"],[temp_check_ldflags_success="no"])
-
-  if test "x$temp_check_ldflags_success" = "xyes"; then
-    AC_MSG_RESULT([yes])
-    [$2]
-  else
-    AC_MSG_RESULT([no])
-    LDFLAGS="$temp_check_ldflags_org"
-    [$3]
-  fi
-])# AC_CHECK_LDFLAGS
-
-
-AC_DEFUN([AC_CHECK_FAT],
-[
-AC_ARG_ENABLE(fat-binary,
-       [  --enable-fat-binary=ARCHS
-                          build an Apple Multi Architecture Binary (MAB);
-                          ARCHS is a comma-delimited list of architectures for
-                          which to build; if ARCHS is omitted, then the package
-                          will be built for all architectures supported by the
-                          platform (e.g. "ppc,i386" for MacOS/X and Darwin; 
-                          if this option is disabled or omitted entirely, then
-                          the package will be built only for the target 
-                          platform],
-       [fat_binary=$enableval], [fat_binary=no])
-if test "$fat_binary" != no; then
-    AC_MSG_CHECKING([target architectures])
-
-    # Respect TARGET_ARCHS setting from environment if available.
-    if test -z "$TARGET_ARCHS"; then
-   	# Respect ARCH given to --enable-fat-binary if present.
-     if test "$fat_binary" != yes; then
-	    TARGET_ARCHS=`echo "$fat_binary" | tr ',' ' '`
-     else
-	    # Choose a default set of architectures based upon platform.
-      TARGET_ARCHS="ppc i386"
-     fi
-    fi
-    AC_MSG_RESULT([$TARGET_ARCHS])
-
-   define([Name],[translit([$1],[./-], [___])])
-   # /usr/lib/arch_tool -archify_list $TARGET_ARCHS
-   []Name=""
-   for archs in $TARGET_ARCHS 
-   do
-    []Name="$[]Name -arch $archs"
-   done
-
-   if test "x$[]Name" != "x"; then
-    AC_CHECK_CFLAGS($[]Name,,[]Name="")
-   fi
-
-   if test "x$[]Name" != "x"; then
-    AC_CHECK_LDFLAGS($[]Name,,[]Name="")
-   fi
-
-   undefine([Name])
-fi
-])# AC_CHECK_FAT
-
-AC_DEFUN([AC_CHECK_SIMD],
-[
-AC_ARG_ENABLE(simd,
-       [  --enable-simd=ARCHS
-                          enable SIMD optimization;
-                          valid arguments are: SSE2
-       ],
-       [simd=$enableval], [simd=no])
-if test "$simd" != no; then
-   AC_MSG_CHECKING([SIMD optimization])
-
-   # Respect SIMD given to --enable-simd if present.
-   if test "$simd" != yes; then
-	    SIMD=`echo "$simd" | tr ',' ' '`
-   else
-	    # Choose a default set of architectures based upon platform.
-      SIMD="SSE2"
-   fi
-   AC_MSG_RESULT([$SIMD])
-
-   for smd in $SIMD 
-   do
-    case "${smd}" in
-    SSE2|sse2)
-      AC_CHECK_CFLAGS([-mfpmath=sse -msse])
-    ;;
-    *)
-      AC_MSG_RESULT([unknown SIMD instructions: ${smd}])
-    ;;
-    esac
-   done
-fi
-])# AC_CHECK_SIMD
diff --git a/externals/zexy/src/astyle.rc b/externals/zexy/src/astyle.rc
index 0c0c1bc38203b445d70a78c789f5c3dd4157ce0a..1780cc82ebab60706ab208713383fe956cb2d6e7 100644
--- a/externals/zexy/src/astyle.rc
+++ b/externals/zexy/src/astyle.rc
@@ -1,5 +1,5 @@
 ## asytyle configuration for zexy
-# usage: astyle --options=astyle.conf *.c *.h
+# usage: astyle --options=astyle.rc *.c *.h
 
 ## CRLF line-ending
 lineend=linux
diff --git a/externals/zexy/src/atof.c b/externals/zexy/src/atof.c
index 8311d8333640870a8671370ce276df51207ab58a..ac113e923ba1197f925fca4b57856727c9074897 100644
--- a/externals/zexy/src/atof.c
+++ b/externals/zexy/src/atof.c
@@ -21,7 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-static t_class *atof_class;
+static t_class *atof_class=NULL;
 
 typedef struct _atof {
   t_object x_obj;
@@ -77,11 +77,10 @@ static void *atof_new(void)
   return (x);
 }
 
-void atof_setup(void)
+ZEXY_SETUP void atof_setup(void)
 {
-  atof_class = class_new(gensym("atof"), (t_newmethod)atof_new,
-                         (t_method)atof_free,
-                         sizeof(t_atof), 0, A_DEFFLOAT, 0);
+  atof_class = zexy_new("atof",
+                        atof_new, atof_free, t_atof, 0, "");
 
   class_addbang(atof_class, (t_method)atof_bang);
   class_addfloat(atof_class, (t_method)atof_float);
diff --git a/externals/zexy/src/atoi.c b/externals/zexy/src/atoi.c
index 17e6b99fa1039d01039756f6f833ebec7a750bbf..6557b5d918ae8db3cc5c28953f4facf0b9987e98 100644
--- a/externals/zexy/src/atoi.c
+++ b/externals/zexy/src/atoi.c
@@ -21,7 +21,7 @@
 #include <stdlib.h>
 #include <string.h>
 
-static t_class *atoi_class;
+static t_class *atoi_class=NULL;
 
 typedef struct _atoi {
   t_object x_obj;
@@ -95,11 +95,10 @@ static void *atoi_new(void)
   return (x);
 }
 
-void atoi_setup(void)
+ZEXY_SETUP void atoi_setup(void)
 {
-  atoi_class = class_new(gensym("atoi"), (t_newmethod)atoi_new,
-                         (t_method)atoi_free,
-                         sizeof(t_atoi), 0, A_DEFFLOAT, 0);
+  atoi_class = zexy_new("atoi",
+                        atoi_new, atoi_free, t_atoi, 0, "");
 
   class_addbang(atoi_class, (t_method)atoi_bang);
   class_addfloat(atoi_class, (t_method)atoi_float);
diff --git a/externals/zexy/src/avg~.c b/externals/zexy/src/avg~.c
index 669879ca4817d67ae0f8a8d4a60258d4f67ceada..073240cf0fe2dc362500f67b9602aabb7e1ed6e1 100644
--- a/externals/zexy/src/avg~.c
+++ b/externals/zexy/src/avg~.c
@@ -23,7 +23,7 @@
 
 /* tilde object to take absolute value. */
 
-static t_class *avg_class;
+static t_class *avg_class=NULL;
 
 typedef struct _avg {
   t_object x_obj;
@@ -55,7 +55,7 @@ static t_int *avg_perform(t_int *w)
 static void avg_dsp(t_avg *x, t_signal **sp)
 {
   x->n_inv=1./sp[0]->s_n;
-  dsp_add(avg_perform, 3, sp[0]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(avg_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
 }
 
 static void *avg_new(void)
@@ -71,14 +71,13 @@ static void avg_help(void)
 }
 
 
-void avg_tilde_setup(void)
+ZEXY_SETUP void avg_tilde_setup(void)
 {
-  avg_class = class_new(gensym("avg~"), (t_newmethod)avg_new, 0,
-                        sizeof(t_avg), 0, A_DEFFLOAT, 0);
-  class_addmethod(avg_class, nullfn, gensym("signal"), 0);
-  class_addmethod(avg_class, (t_method)avg_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  avg_class = zexy_new("avg~",
+                       avg_new, 0, t_avg, 0, "");
+  zexy_addmethod(avg_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(avg_class, (t_method)avg_dsp, "dsp", "!");
 
-  class_addmethod(avg_class, (t_method)avg_help, gensym("help"), 0);
+  zexy_addmethod(avg_class, (t_method)avg_help, "help", "");
   zexy_register("avg~");
 }
diff --git a/externals/zexy/src/blockmirror~.c b/externals/zexy/src/blockmirror~.c
index 2ad4092cdbb0542267043d139108e1cbd4c1599d..833cfdf4f42c1f36dc26971a015f2d6cdb440fc2 100644
--- a/externals/zexy/src/blockmirror~.c
+++ b/externals/zexy/src/blockmirror~.c
@@ -26,7 +26,7 @@
    {x[0], x[1], ... x[n-1]} --> {x[n-1], x[n-2], ... x[0]}
 */
 
-static t_class *blockmirror_class;
+static t_class *blockmirror_class=NULL;
 
 typedef struct _blockmirror {
   t_object x_obj;
@@ -42,7 +42,7 @@ static void blockmirror_float(t_blockmirror *x, t_floatarg f)
 
 static t_int *blockmirror_perform(t_int *w)
 {
-  t_blockmirror	*x = (t_blockmirror *)(w[1]);
+  t_blockmirror *x = (t_blockmirror *)(w[1]);
   t_sample *in = (t_sample *)(w[2]);
   t_sample *out = (t_sample *)(w[3]);
   int n = (int)(w[4]);
@@ -78,10 +78,10 @@ static void blockmirror_dsp(t_blockmirror *x, t_signal **sp)
     x->blocksize = sp[0]->s_n;
     x->blockbuffer = getbytes(sizeof(*x->blockbuffer)*x->blocksize);
   }
-  dsp_add(blockmirror_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(blockmirror_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
 }
 
-static void blockmirror_helper(t_blockmirror*x)
+static void blockmirror_helper(t_blockmirror* UNUSED(x))
 {
   post("\n"HEARTSYMBOL " blockmirror~-object for reverting a signal");
   post("'help' : view this\n"
@@ -104,19 +104,16 @@ static void *blockmirror_new(void)
   return (x);
 }
 
-void blockmirror_tilde_setup(void)
+ZEXY_SETUP void blockmirror_tilde_setup(void)
 {
-  blockmirror_class = class_new(gensym("blockmirror~"),
-                                (t_newmethod)blockmirror_new,
-                                (t_method)blockmirror_free,
-                                sizeof(t_blockmirror), 0, A_NULL);
-  class_addmethod(blockmirror_class, nullfn, gensym("signal"), 0);
-  class_addmethod(blockmirror_class, (t_method)blockmirror_dsp,
-                  gensym("dsp"), A_CANT, 0);
+  blockmirror_class = zexy_new("blockmirror~",
+                               blockmirror_new, blockmirror_free, t_blockmirror, 0, "");
+  zexy_addmethod(blockmirror_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(blockmirror_class, (t_method)blockmirror_dsp, "dsp", "!");
 
   class_addfloat(blockmirror_class, blockmirror_float);
 
-  class_addmethod(blockmirror_class, (t_method)blockmirror_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(blockmirror_class, (t_method)blockmirror_helper, "help",
+                 "");
   zexy_register("blockmirror~");
 }
diff --git a/externals/zexy/src/blockshuffle~.c b/externals/zexy/src/blockshuffle~.c
index de9b24fc9af6d34efdd0c9efa745a73189e1054a..0c3466c24f20b34ac2a04e01269b363d94f9c4ca 100644
--- a/externals/zexy/src/blockshuffle~.c
+++ b/externals/zexy/src/blockshuffle~.c
@@ -26,7 +26,7 @@
    {x[0], x[1], ... x[n-1]} --> {x[n-1], x[n-2], ... x[0]}
 */
 
-static t_class *blockshuffle_class;
+static t_class *blockshuffle_class=NULL;
 
 typedef struct _blockshuffle {
   t_object x_obj;
@@ -68,8 +68,8 @@ static void blockshuffle_buildindex(t_blockshuffle *x, int blocksize)
   }
 }
 
-static void blockshuffle_list(t_blockshuffle *x, t_symbol*s, int argc,
-                              t_atom*argv)
+static void blockshuffle_list(t_blockshuffle *x, t_symbol* UNUSED(s),
+                              int argc, t_atom*argv)
 {
   int i;
   if(x->shuffle) {
@@ -91,11 +91,11 @@ static t_int *blockshuffle_perform(t_int *w)
   t_sample *in = (t_sample *)(w[2]);
   t_sample *out = (t_sample *)(w[3]);
   int n = (int)(w[4]);
-  int i=0;
   t_sample *temp=x->blockbuf;
   t_int    *idx =x->indices;
 
   if(idx) {
+    int i=0;
     for(i=0; i<n; i++) {
       temp[i]=in[idx[i]];
     }
@@ -116,12 +116,13 @@ static void blockshuffle_dsp(t_blockshuffle *x, t_signal **sp)
   blockshuffle_buildindex(x, sp[0]->s_n);
 
   dsp_add(blockshuffle_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec,
-          (t_int)sp[0]->s_n);
+          sp[0]->s_n);
 }
 
-static void blockshuffle_helper(void)
+static void blockshuffle_helper(t_blockshuffle* UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " blockshuffle~-object for shuffling the samples within a signal-block");
+  post("\n"HEARTSYMBOL
+       " blockshuffle~-object for shuffling the samples within a signal-block");
   post("'help' : view this\n"
        "signal~");
   post("outlet : signal~");
@@ -151,19 +152,16 @@ static void *blockshuffle_new(void)
   return (x);
 }
 
-void blockshuffle_tilde_setup(void)
+ZEXY_SETUP void blockshuffle_tilde_setup(void)
 {
-  blockshuffle_class = class_new(gensym("blockshuffle~"),
-                                 (t_newmethod)blockshuffle_new,
-                                 (t_method)blockshuffle_free,
-                                 sizeof(t_blockshuffle), 0, A_NULL);
-  class_addmethod(blockshuffle_class, nullfn, gensym("signal"), 0);
-  class_addmethod(blockshuffle_class, (t_method)blockshuffle_dsp,
-                  gensym("dsp"), A_CANT, 0);
+  blockshuffle_class = zexy_new("blockshuffle~",
+                                blockshuffle_new, blockshuffle_free, t_blockshuffle, 0, "");
+  zexy_addmethod(blockshuffle_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(blockshuffle_class, (t_method)blockshuffle_dsp, "dsp", "!");
 
   class_addlist(blockshuffle_class, blockshuffle_list);
 
-  class_addmethod(blockshuffle_class, (t_method)blockshuffle_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(blockshuffle_class, (t_method)blockshuffle_helper, "help",
+                 "");
   zexy_register("blockshuffle~");
 }
diff --git a/externals/zexy/src/blockswap~.c b/externals/zexy/src/blockswap~.c
index 15785850f36a879d061990f6ff32634f324b964c..bcf577e4926ca67fadab9348c8e4b5999a687640 100644
--- a/externals/zexy/src/blockswap~.c
+++ b/externals/zexy/src/blockswap~.c
@@ -25,7 +25,7 @@
    {x[0], x[1], ... x[n-1]} --> {x[n-1], x[n-2], ... x[0]}
 */
 
-static t_class *blockswap_class;
+static t_class *blockswap_class=NULL;
 
 typedef struct _blockswap {
   t_object x_obj;
@@ -41,7 +41,7 @@ static void blockswap_float(t_blockswap *x, t_floatarg f)
 
 static t_int *blockswap_perform(t_int *w)
 {
-  t_blockswap	*x = (t_blockswap *)(w[1]);
+  t_blockswap *x = (t_blockswap *)(w[1]);
   t_sample *in = (t_sample *)(w[2]);
   t_sample *out = (t_sample *)(w[3]);
   int N = (int)(w[4]);
@@ -76,12 +76,13 @@ static void blockswap_dsp(t_blockswap *x, t_signal **sp)
     x->blocksize = sp[0]->s_n/2;
     x->blockbuffer = getbytes(sizeof(*x->blockbuffer)*x->blocksize);
   }
-  dsp_add(blockswap_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(blockswap_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
 }
 
-static void blockswap_helper(t_blockswap *x)
+static void blockswap_helper(t_blockswap* UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " blockswap~-object for blockwise-swapping of a signal ");
+  post("\n"HEARTSYMBOL
+       " blockswap~-object for blockwise-swapping of a signal ");
   post("'help' : view this\n"
        "signal~");
   post("outlet : signal~");
@@ -104,18 +105,15 @@ static void *blockswap_new(void)
   return (x);
 }
 
-void blockswap_tilde_setup(void)
+ZEXY_SETUP void blockswap_tilde_setup(void)
 {
-  blockswap_class = class_new(gensym("blockswap~"),
-                              (t_newmethod)blockswap_new, (t_method)blockswap_free,
-                              sizeof(t_blockswap), 0, A_NULL);
-  class_addmethod(blockswap_class, nullfn, gensym("signal"), 0);
-  class_addmethod(blockswap_class, (t_method)blockswap_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  blockswap_class = zexy_new("blockswap~",
+                             blockswap_new, blockswap_free, t_blockswap, 0, "");
+  zexy_addmethod(blockswap_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(blockswap_class, (t_method)blockswap_dsp, "dsp", "!");
 
   class_addfloat(blockswap_class, blockswap_float);
 
-  class_addmethod(blockswap_class, (t_method)blockswap_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(blockswap_class, (t_method)blockswap_helper, "help", "");
   zexy_register("blockswap~");
 }
diff --git a/externals/zexy/src/configure b/externals/zexy/src/configure
deleted file mode 100755
index 5fe20527196ff72e2bb3a9f74b43eb53cc8ae1fb..0000000000000000000000000000000000000000
--- a/externals/zexy/src/configure
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/sh
-
-TOPDIR=..
-
-echo "dummy configure... starting at top: ${TOPDIR}/"
-
-cd ${TOPDIR}/
-
-
-./configure $@
diff --git a/externals/zexy/src/date.c b/externals/zexy/src/date.c
index a749d57176247ddd6bdfe7e6c8e3891ffd94726f..1e9f26b6d4e0e7cabe6e4552f1f0ba31e6464667 100644
--- a/externals/zexy/src/date.c
+++ b/externals/zexy/src/date.c
@@ -40,10 +40,15 @@
 
 #include "zexy.h"
 
-#ifdef __WIN32__
-# define USE_TIMEB
+#if (defined __WIN32__)
+# if (defined __i386__) && (defined __MINGW32__)
+/* unless compiling under mingw/32bit, we want USE_TIMEB in redmond-land */
+# else
+#  define USE_TIMEB
+# endif
 #endif
 
+
 #ifdef __APPLE__
 # include <sys/types.h>
 /* typedef     _BSD_TIME_T_    time_t;                */
@@ -61,7 +66,7 @@
 
 /* ----------------------- date --------------------- */
 
-static t_class *date_class;
+static t_class *date_class=NULL;
 
 typedef struct _date {
   t_object x_obj;
@@ -79,10 +84,10 @@ typedef struct _date {
 static void *date_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 {
   t_date *x = (t_date *)pd_new(date_class);
-  char buf[5];
 
   x->GMT=0;
   if (argc) {
+    char buf[5];
     atom_string(argv, buf, 5);
     if (buf[0]=='G' && buf[1]=='M' && buf[2]=='T') {
       x->GMT = 1;
@@ -126,14 +131,13 @@ static void help_date(t_date* UNUSED(x))
   post("\ncreation\t::'date [GMT]': show local date or GMT");
 }
 
-void date_setup(void)
+ZEXY_SETUP void date_setup(void)
 {
-  date_class = class_new(gensym("date"),
-                         (t_newmethod)date_new, 0,
-                         sizeof(t_date), 0, A_GIMME, 0);
+  date_class = zexy_new("date",
+                        date_new, 0, t_date, 0, "*");
 
   class_addbang(date_class, date_bang);
 
-  class_addmethod(date_class, (t_method)help_date, gensym("help"), 0);
+  zexy_addmethod(date_class, (t_method)help_date, "help", "");
   zexy_register("date");
 }
diff --git a/externals/zexy/src/demultiplex.c b/externals/zexy/src/demultiplex.c
index ea6cd4a81bdb516fab38b489a7da2ed74b0692ce..ccf341b86ff7b54129990eaf488138e5c0231083 100644
--- a/externals/zexy/src/demultiplex.c
+++ b/externals/zexy/src/demultiplex.c
@@ -26,7 +26,7 @@
   a demultiplexer
 */
 
-static t_class *demux_class;
+static t_class *demux_class=NULL;
 
 typedef struct _demux {
   t_object x_obj;
@@ -34,17 +34,19 @@ typedef struct _demux {
   int n_out;
   t_outlet **out, *selected;
 
-
+  t_float findex;
 } t_demux;
 
-static void demux_select(t_demux *x, t_float f)
+static void demux_select(t_demux *x)
 {
+  t_float f = x->findex;
   int n = ( (f<0) || (f>x->n_out) ) ? 0 : f;
   x->selected = x->out[n];
 }
 
 static void demux_list(t_demux *x, t_symbol *s, int argc, t_atom *argv)
 {
+  demux_select(x);
   switch (argc) {
   case 0:
     outlet_bang(x->selected);
@@ -70,6 +72,7 @@ static void demux_list(t_demux *x, t_symbol *s, int argc, t_atom *argv)
 }
 static void demux_any(t_demux *x, t_symbol *s, int argc, t_atom *argv)
 {
+  demux_select(x);
   outlet_anything(x->selected, s, argc, argv);
 }
 
@@ -80,7 +83,8 @@ static void *demux_new(t_symbol* UNUSED(s), int argc, t_atom* UNUSED(argv))
 
   x->n_out = n - 1;
 
-  inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym("select"));
+  x->findex = 0;
+  floatinlet_new(&x->x_obj, &x->findex);
   x->out = (t_outlet **)getbytes(n * sizeof(t_outlet *));
 
   for (n=0; n<=x->n_out; n++) {
@@ -91,23 +95,25 @@ static void *demux_new(t_symbol* UNUSED(s), int argc, t_atom* UNUSED(argv))
 
   return (x);
 }
-
-void demultiplex_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class*c = zexy_new(name,
+                       demux_new, 0, t_demux, 0, "*");
+  class_addanything (c, demux_any);
+  class_addlist     (c, demux_list);
+  return c;
+}
+static void dosetup()
 {
-  demux_class = class_new(gensym("demultiplex"), (t_newmethod)demux_new,
-                          0, sizeof(t_demux), 0, A_GIMME,  0);
-  class_addcreator((t_newmethod)demux_new, gensym("demux"), A_GIMME, 0);
-
-  class_addanything (demux_class, demux_any);
-  class_addlist     (demux_class, demux_list);
-
-  class_addmethod   (demux_class, (t_method)demux_select, gensym("select"),
-                     A_DEFFLOAT, 0);
-
   zexy_register("demultiplex");
+  demux_class=zclass_setup("demultiplex");
+  zclass_setup("demux");
+}
+ZEXY_SETUP void demultiplex_setup(void)
+{
+  dosetup();
 }
 void demux_setup(void)
 {
-  demultiplex_setup();
+  dosetup();
 }
-
diff --git a/externals/zexy/src/demultiplex~.c b/externals/zexy/src/demultiplex~.c
index 4fb7e7876337a459a9c27273feea2e40cde7a5df..2bb7e8030e7750a2007e48cf556c98b21c0364e0 100644
--- a/externals/zexy/src/demultiplex~.c
+++ b/externals/zexy/src/demultiplex~.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *demux_class;
+static t_class *demux_tilde_class=NULL;
 
 typedef struct _demux {
   t_object x_obj;
@@ -73,13 +73,14 @@ static void demux_dsp(t_demux *x, t_signal **sp)
   while(n--) {
     *dummy++=sp[x->n_out-n]->s_vec;
   }
-  dsp_add(demux_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(demux_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
 }
 
 
 static void demux_helper(void)
 {
-  post("\n"HEARTSYMBOL " demux~\t:: demultiplex a signal to one of various outlets");
+  post("\n"HEARTSYMBOL
+       " demux~\t:: demultiplex a signal to one of various outlets");
   post("<#out>\t : the outlet-number (counting from 0) to witch the inlet is routed"
        "'help'\t : view this");
   post("creation : \"demux~ [arg1 [arg2...]]\"\t: the number of arguments equals the number of outlets\n");
@@ -92,7 +93,7 @@ static void demux_free(t_demux *x)
 
 static void *demux_new(t_symbol* UNUSED(s), int argc, t_atom* UNUSED(argv))
 {
-  t_demux *x = (t_demux *)pd_new(demux_class);
+  t_demux *x = (t_demux *)pd_new(demux_tilde_class);
   int i;
 
   if (!argc) {
@@ -113,26 +114,28 @@ static void *demux_new(t_symbol* UNUSED(s), int argc, t_atom* UNUSED(argv))
 
   return (x);
 }
-
-void demultiplex_tilde_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class *c = zexy_new(name,
+                        demux_new, demux_free, t_demux, 0, "*");
+  class_addfloat(c, demux_output);
+  zexy_addmethod(c, (t_method)demux_dsp, "dsp", "!");
+  zexy_addmethod(c, (t_method)nullfn, "signal", "");
+
+  zexy_addmethod(c, (t_method)demux_helper, "help", "");
+  return c;
+}
+static void dosetup()
 {
-  demux_class = class_new(gensym("demultiplex~"), (t_newmethod)demux_new,
-                          (t_method)demux_free, sizeof(t_demux), 0, A_GIMME, 0);
-  class_addcreator((t_newmethod)demux_new, gensym("demux~"), A_GIMME, 0);
-
-  class_addfloat(demux_class, demux_output);
-  class_addmethod(demux_class, (t_method)demux_dsp, gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod(demux_class, nullfn, gensym("signal"), 0);
-
-  class_addmethod(demux_class, (t_method)demux_helper, gensym("help"), 0);
-
   zexy_register("demultiplex~");
+  demux_tilde_class=zclass_setup("demultiplex~");
+  zclass_setup("demux~");
+}
+ZEXY_SETUP void demultiplex_tilde_setup(void)
+{
+  dosetup();
 }
 void demux_tilde_setup(void)
 {
-  demultiplex_tilde_setup();
+  dosetup();
 }
-
-
-
diff --git a/externals/zexy/src/dfreq~.c b/externals/zexy/src/dfreq~.c
index 2ad7715751fa40bfb83073b60e2bca91f743c0f6..233f2d84c2ee8b975e6d40d6f779672650b6f850 100644
--- a/externals/zexy/src/dfreq~.c
+++ b/externals/zexy/src/dfreq~.c
@@ -26,7 +26,7 @@
 
 /* datendefinition */
 
-static t_class *dfreq_class;
+static t_class *dfreq_class=NULL;
 
 typedef struct _dfreq {
   t_object x_obj;
@@ -82,7 +82,7 @@ static t_int *dfreq_perform(t_int *w)
 
 static void dfreq_dsp(t_dfreq *x, t_signal **sp)
 {
-  dsp_add(dfreq_perform, 4, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n,x);
+  dsp_add(dfreq_perform, 4, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n,x);
 }
 
 
@@ -99,21 +99,20 @@ static void *dfreq_new(void)
 
 static void dfreq_tilde_helper(void)
 {
-  post("\n"HEARTSYMBOL " dfreq~\t :: pitch-detector that counts zero-crossings");
+  post("\n"HEARTSYMBOL
+       " dfreq~\t :: pitch-detector that counts zero-crossings");
   post("\noutputs a frequency estimate as a stream~ that will be updated every zero-X");
   post("\ncreation::\t'dfreq~': that's all");
 }
 
 
-void dfreq_tilde_setup(void)
+ZEXY_SETUP void dfreq_tilde_setup(void)
 {
-  dfreq_class = class_new(gensym("dfreq~"), (t_newmethod)dfreq_new, 0,
-                          sizeof(t_dfreq), 0, A_NULL);
-  class_addmethod(dfreq_class, nullfn, gensym("signal"), 0);
-  class_addmethod(dfreq_class, (t_method)dfreq_dsp, gensym("dsp"),
-                  A_CANT, 0);
-
-  class_addmethod(dfreq_class, (t_method)dfreq_tilde_helper, gensym("help"),
-                  0);
+  dfreq_class = zexy_new("dfreq~",
+                         dfreq_new, 0, t_dfreq, 0, "");
+  zexy_addmethod(dfreq_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(dfreq_class, (t_method)dfreq_dsp, "dsp", "!");
+
+  zexy_addmethod(dfreq_class, (t_method)dfreq_tilde_helper, "help", "");
   zexy_register("dfreq~");
 }
diff --git a/externals/zexy/src/dirac~.c b/externals/zexy/src/dirac~.c
index 027fee5539284af8472b3db088eefcabc22e9fd5..669bef30a211c2d5808bc01bb00a1a1ff9a5a176 100644
--- a/externals/zexy/src/dirac~.c
+++ b/externals/zexy/src/dirac~.c
@@ -24,12 +24,12 @@
 /*
  * This external makes the two main test-functions available :
  * dirac~: will make a single peak (eg: a 1 in all the 0s) at
- *	   a desired position in the signal-vector
- *	   the position can be passed as an argument when creating the object
+ *         a desired position in the signal-vector
+ *         the position can be passed as an argument when creating the object
  *
  * NOTE : the inlets do NOT specify any times but sample-NUMBERS;
- *	  there are 64 samples in a "standard" signal-vector,
- *	  each "lasting" for 1/44100 secs.
+ *        there are 64 samples in a "standard" signal-vector,
+ *        each "lasting" for 1/44100 secs.
  */
 
 #include "zexy.h"
@@ -37,7 +37,7 @@
 /* ------------------------ dirac~ ----------------------------- */
 
 
-static t_class *dirac_class;
+static t_class *dirac_class=NULL;
 
 typedef struct _dirac {
   t_object x_obj;
@@ -76,8 +76,8 @@ static t_int *dirac_perform(t_int *w)
 }
 
 #ifndef __WIN32__
-/* LATER: investigate the occurence of zero_perf8() */
-/* it seems, like pd has the symbol zero_perf8(),
+/* LATER: investigate the occurrence of zero_perf8() */
+/* it seems, like Pd has the symbol zero_perf8(),
  * but it is not exported by m_pd.h:
  * so linux can use it, but w32 not
  * have to tell miller about that
@@ -110,9 +110,9 @@ static t_int *dirac_perf8(t_int *w)
 static void dirac_dsp(t_dirac *x, t_signal **sp)
 {
   if (sp[0]->s_n & 7) {
-    dsp_add(dirac_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+    dsp_add(dirac_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
   } else {
-    dsp_add(dirac_perf8, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+    dsp_add(dirac_perf8, 3, x, sp[0]->s_vec, sp[0]->s_n);
   }
 }
 
@@ -145,15 +145,14 @@ static void *dirac_new(t_floatarg where)
   return (x);
 }
 
-void dirac_tilde_setup(void)
+ZEXY_SETUP void dirac_tilde_setup(void)
 {
-  dirac_class = class_new(gensym("dirac~"), (t_newmethod)dirac_new, 0,
-                          sizeof(t_dirac), 0, A_DEFFLOAT, 0);
+  dirac_class = zexy_new("dirac~",
+                         dirac_new, 0, t_dirac, 0, "F");
   class_addfloat(dirac_class, dirac_float);
   class_addbang(dirac_class, dirac_bang);
-  class_addmethod(dirac_class, (t_method)dirac_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(dirac_class, (t_method)dirac_dsp, "dsp", "!");
 
-  class_addmethod(dirac_class, (t_method)dirac_helper, gensym("help"), 0);
+  zexy_addmethod(dirac_class, (t_method)dirac_helper, "help", "");
   zexy_register("dirac~");
 }
diff --git a/externals/zexy/src/doublepole~.c b/externals/zexy/src/doublepole~.c
index 650c8a5313f7c3adf4f3d505483465ac57b82a51..ad3473ac7db5f647fb2aa240b1227e7fff8fa965 100644
--- a/externals/zexy/src/doublepole~.c
+++ b/externals/zexy/src/doublepole~.c
@@ -4,7 +4,7 @@
 
 /*  "filters", both linear and nonlinear.
 */
-#include "m_pd.h"
+#include "zexy.h"
 #include <math.h>
 
 //* ---------------- doublepole~ - raw doublepole filter ----------------- */
@@ -64,8 +64,8 @@ static t_int *sigdoublepole_perform(t_int *w)
   return (w+5);
 }
 
-static void sigdoublepole_list(t_sigdoublepole *x, t_symbol *s, int argc,
-                               t_atom *argv)
+static void sigdoublepole_list(t_sigdoublepole *x, t_symbol* UNUSED(s),
+                               int argc, t_atom *argv)
 {
   t_float fb1 = atom_getfloatarg(0, argc, argv);
   t_float fb2 = atom_getfloatarg(1, argc, argv);
@@ -93,8 +93,8 @@ stable:
   c->c_fb2 = fb2;
 }
 
-static void sigdoublepole_set(t_sigdoublepole *x, t_symbol *s, int argc,
-                              t_atom *argv)
+static void sigdoublepole_set(t_sigdoublepole *x, t_symbol* UNUSED(s),
+                              int argc, t_atom *argv)
 {
   t_doublepolectl *c = x->x_ctl;
   c->c_x1 = atom_getfloatarg(0, argc, argv);
@@ -105,23 +105,21 @@ static void sigdoublepole_dsp(t_sigdoublepole *x, t_signal **sp)
 {
   dsp_add(sigdoublepole_perform, 4,
           sp[0]->s_vec, sp[1]->s_vec,
-          x->x_ctl, (t_int)sp[0]->s_n);
+          x->x_ctl, sp[0]->s_n);
 
 }
 
-void doublepole_tilde_setup(void)
+ZEXY_SETUP void doublepole_tilde_setup(void)
 {
-  sigdoublepole_class = class_new(gensym("doublepole~"),
-                                  (t_newmethod)sigdoublepole_new,
-                                  0, sizeof(t_sigdoublepole), 0, A_GIMME, 0);
+  sigdoublepole_class = zexy_new("doublepole~",
+                                 sigdoublepole_new, 0, t_sigdoublepole, 0, "*");
   CLASS_MAINSIGNALIN(sigdoublepole_class, t_sigdoublepole, x_f);
-  class_addmethod(sigdoublepole_class, (t_method)sigdoublepole_dsp,
-                  gensym("dsp"), A_CANT, 0);
+  zexy_addmethod(sigdoublepole_class, (t_method)sigdoublepole_dsp, "dsp",
+                 "!");
   class_addlist(sigdoublepole_class, sigdoublepole_list);
-  class_addmethod(sigdoublepole_class, (t_method)sigdoublepole_set,
-                  gensym("set"),
-                  A_GIMME, 0);
-  class_addmethod(sigdoublepole_class, (t_method)sigdoublepole_set,
-                  gensym("clear"),
-                  A_GIMME, 0);
+  zexy_addmethod(sigdoublepole_class, (t_method)sigdoublepole_set, "set",
+                 "*");
+  zexy_addmethod(sigdoublepole_class, (t_method)sigdoublepole_set, "clear",
+                 "*");
+  zexy_register("doublepole~");
 }
diff --git a/externals/zexy/src/drip.c b/externals/zexy/src/drip.c
index 59e504cb6361f3f291491c33ecfbfb1af7b4e58d..cf0ab921f876154efc8c77d6bd4eac7c8781fb8b 100644
--- a/externals/zexy/src/drip.c
+++ b/externals/zexy/src/drip.c
@@ -28,7 +28,7 @@ you can adjust the drop-speed in [ms]
 
 #include "zexy.h"
 
-static t_class *drip_class;
+static t_class *drip_class=NULL;
 
 typedef struct _drip {
   t_object x_obj;
@@ -197,13 +197,10 @@ static void *drip_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
   return (x);
 }
 
-void drip_setup(void)
+ZEXY_SETUP void drip_setup(void)
 {
-  drip_class = class_new(gensym("drip"), (t_newmethod)drip_new,
-                         (t_method)drip_free, sizeof(t_drip), 0 ,A_GIMME, 0);
-
-  class_addcreator((t_newmethod)drip_new, gensym("unfold"), A_GIMME, 0);
-  /* for historical reasons */
+  drip_class = zexy_new("drip",
+                        drip_new, drip_free, t_drip, 0, "*");
 
   class_addbang    (drip_class, drip_bang);
   class_addlist    (drip_class, drip_list);
diff --git a/externals/zexy/src/envrms~.c b/externals/zexy/src/envrms~.c
index b074414c8f95b3b12690f5f82ea55889e2606256..1cbfd4373447ec8aec3a8b158d6eefed5eb653af 100644
--- a/externals/zexy/src/envrms~.c
+++ b/externals/zexy/src/envrms~.c
@@ -26,19 +26,19 @@
 #define MAXOVERLAP 10
 #define MAXVSTAKEN 64
 
-t_class *sigenvrms_class;
+t_class *sigenvrms_class=NULL;
 
 typedef struct sigenvrms {
-  t_object x_obj; 	    	    /* header */
-  void *x_outlet;		    /* a "float" outlet */
-  void *x_clock;		    /* a "clock" object */
-  t_sample *x_buf;		    /* a Hanning window */
-  int x_phase;		    /* number of points since last output */
-  int x_period;		    /* requested period of output */
-  int x_realperiod;		    /* period rounded up to vecsize multiple */
-  int x_npoints;		    /* analysis window size in samples */
-  t_float x_result;		    /* result to output */
-  t_sample x_sumbuf[MAXOVERLAP];	    /* summing buffer */
+  t_object x_obj;                /* header */
+  void *x_outlet;                /* a "float" outlet */
+  void *x_clock;                 /* a "clock" object */
+  t_sample *x_buf;               /* a Hanning window */
+  int x_phase;                   /* number of points since last output */
+  int x_period;                  /* requested period of output */
+  int x_realperiod;              /* period rounded up to vecsize multiple */
+  int x_npoints;                 /* analysis window size in samples */
+  t_float x_result;              /* result to output */
+  t_sample x_sumbuf[MAXOVERLAP]; /* summing buffer */
 } t_sigenvrms;
 
 static void sigenvrms_tick(t_sigenvrms *x);
@@ -126,19 +126,20 @@ static void sigenvrms_dsp(t_sigenvrms *x, t_signal **sp)
   else {
     x->x_realperiod = x->x_period;
   }
-  dsp_add(sigenvrms_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(sigenvrms_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
   if (sp[0]->s_n > MAXVSTAKEN) {
     bug("sigenvrms_dsp");
   }
 }
 
-static void sigenvrms_tick(t_sigenvrms
-                           *x)	/* callback function for the clock */
+/* callback function for the clock */
+static void sigenvrms_tick(t_sigenvrms *x)
 {
   outlet_float(x->x_outlet, sqrtf(x->x_result));
 }
 
-static void sigenvrms_ff(t_sigenvrms *x)		/* cleanup on free */
+/* cleanup on free */
+static void sigenvrms_ff(t_sigenvrms *x)
 {
   clock_free(x->x_clock);
   freebytes(x->x_buf, (x->x_npoints + MAXVSTAKEN) * sizeof(*x->x_buf));
@@ -150,15 +151,13 @@ static void sigenvrms_help(void)
 }
 
 
-void envrms_tilde_setup(void)
+ZEXY_SETUP void envrms_tilde_setup(void)
 {
-  sigenvrms_class = class_new(gensym("envrms~"), (t_newmethod)sigenvrms_new,
-                              (t_method)sigenvrms_ff, sizeof(t_sigenvrms), 0, A_DEFFLOAT, A_DEFFLOAT, 0);
-  class_addmethod(sigenvrms_class, nullfn, gensym("signal"), 0);
-  class_addmethod(sigenvrms_class, (t_method)sigenvrms_dsp, gensym("dsp"),
-                  A_CANT, 0);
-
-  class_addmethod(sigenvrms_class, (t_method)sigenvrms_help, gensym("help"),
-                  0);
+  sigenvrms_class = zexy_new("envrms~",
+                             sigenvrms_new, sigenvrms_ff, t_sigenvrms, 0, "FF");
+  zexy_addmethod(sigenvrms_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(sigenvrms_class, (t_method)sigenvrms_dsp, "dsp", "!");
+
+  zexy_addmethod(sigenvrms_class, (t_method)sigenvrms_help, "help", "");
   zexy_register("envrms~");
 }
diff --git a/externals/zexy/src/fifop.c b/externals/zexy/src/fifop.c
index 36b9b760d3a1706d2e1c01536a88f0033a4fef76..d5c39c0ebfb1096bec767a3a31357afcd648900e 100644
--- a/externals/zexy/src/fifop.c
+++ b/externals/zexy/src/fifop.c
@@ -31,7 +31,7 @@
  * high priority means low numeric value
  */
 
-static t_class *fifop_class;
+static t_class *fifop_class=NULL;
 
 typedef struct _fifop_list {
   int                 argc;
@@ -103,7 +103,6 @@ static t_fifop_prioritylist*fifop_genprioritylist(t_fifop*x,
 
 static int add2fifo(t_fifop_prioritylist*fifoprio, int argc, t_atom *argv)
 {
-  t_fifop_list*fifo=0;
   t_fifop_list*entry=0;
 
   if(fifoprio==0) {
@@ -127,7 +126,7 @@ static int add2fifo(t_fifop_prioritylist*fifoprio, int argc, t_atom *argv)
   /* insert entry into fifo */
   if(fifoprio->fifo_end) {
     /* append to the end of the fifo */
-    fifo=fifoprio->fifo_end;
+    t_fifop_list*fifo=fifoprio->fifo_end;
 
     /* add new entry to end of fifo */
     fifo->next=entry;
@@ -205,7 +204,7 @@ static void fifop_bang(t_fifop *x)
 }
 static void fifop_query(t_fifop*x)
 {
-  z_verbose(1, "%d elements in fifo", (int)x->counter);
+  verbose(1, "%d elements in fifo", (int)x->counter);
 
   outlet_float(x->x_infout, (t_float)x->counter);
 }
@@ -265,9 +264,10 @@ static void fifop_dump(t_fifop*x)
   }
 }
 
-static void fifop_help(t_fifop*x)
+static void fifop_help(t_fifop* UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " fifop\t\t:: a First-In-First-Out queue with priorities");
+  post("\n"HEARTSYMBOL
+       " fifop\t\t:: a First-In-First-Out queue with priorities");
 }
 
 
@@ -293,23 +293,19 @@ static void *fifop_new(void)
   return (x);
 }
 
-void fifop_setup(void)
+ZEXY_SETUP void fifop_setup(void)
 {
-  fifop_class = class_new(gensym("fifop"), (t_newmethod)fifop_new,
-                          (t_method)fifop_free, sizeof(t_fifop), 0, A_NULL);
+  fifop_class = zexy_new("fifop",
+                         fifop_new, fifop_free, t_fifop, 0, "");
 
   class_addbang    (fifop_class, fifop_bang);
   class_addlist    (fifop_class, fifop_list);
 
-  class_addmethod  (fifop_class, (t_method)fifop_clear, gensym("clear"),
-                    A_NULL);
-  class_addmethod  (fifop_class, (t_method)fifop_dump, gensym("dump"),
-                    A_NULL);
+  zexy_addmethod(fifop_class, (t_method)fifop_clear, "clear", "");
+  zexy_addmethod(fifop_class, (t_method)fifop_dump, "dump", "");
 
-  class_addmethod  (fifop_class, (t_method)fifop_query, gensym("info"),
-                    A_NULL);
-  class_addmethod  (fifop_class, (t_method)fifop_help, gensym("help"),
-                    A_NULL);
+  zexy_addmethod(fifop_class, (t_method)fifop_query, "info", "");
+  zexy_addmethod(fifop_class, (t_method)fifop_help, "help", "");
 
   zexy_register("fifop");
 }
diff --git a/externals/zexy/src/freadln.c b/externals/zexy/src/freadln.c
index af911142a18fb9098e62dcf85e1c27384c304b36..033a39e30893146a8d44dcfcab1f863d6b6c99b8 100644
--- a/externals/zexy/src/freadln.c
+++ b/externals/zexy/src/freadln.c
@@ -42,14 +42,14 @@
  * into the RAM of your system
  */
 
-static t_class *freadln_class;
+static t_class *freadln_class=NULL;
 
 typedef struct freadln {
   t_object x_ob;
   FILE *x_file;
   char *x_filename;
   char *x_textbuf;
-  int  x_textbuf_length;
+  size_t  x_textbuf_length;
   t_outlet *x_message_outlet;
   t_outlet *x_readybang_outlet;
 
@@ -62,7 +62,7 @@ typedef struct freadln {
 static void freadln_close (t_freadln *x)
 {
   if(x->x_file) {
-    z_fclose(x->x_file);
+    sys_fclose(x->x_file);
   }
   x->x_file=0;
   if(x->x_filename) {
@@ -79,7 +79,7 @@ static void freadln_close (t_freadln *x)
 static void freadln_open (t_freadln *x, t_symbol *s, t_symbol*type)
 {
   char filenamebuf[MAXPDSTRING], *filenamebufptr;
-  char*dirname=canvas_getdir(x->x_canvas)->s_name;
+  const char*dirname=canvas_getdir(x->x_canvas)->s_name;
   int fd, len;
   post("open: %s", s->s_name);
 
@@ -109,7 +109,7 @@ static void freadln_open (t_freadln *x, t_symbol *s, t_symbol*type)
     pd_error(x, "%s: failed to open %s", s->s_name, filenamebuf);
     return;
   }
-  z_close(fd);
+  sys_close(fd);
   len=strlen(filenamebuf);
   if (!(x->x_filename=(char*)getbytes(sizeof(char)*(len+strlen(
                                         s->s_name)+2)))) {
@@ -120,7 +120,7 @@ static void freadln_open (t_freadln *x, t_symbol *s, t_symbol*type)
   strcpy(x->x_filename,filenamebuf);
   strcpy(x->x_filename+len,"/");
   strcpy(x->x_filename+len+1,filenamebufptr);
-  if (!(x->x_file=z_fopen(x->x_filename, "r"))) {
+  if (!(x->x_file=sys_fopen(x->x_filename, "r"))) {
     pd_error(x, "freadln: failed to fopen %s",x->x_filename);
     return;
   }
@@ -133,29 +133,32 @@ static void freadln_open (t_freadln *x, t_symbol *s, t_symbol*type)
   x->x_textbuf_length=MIN_FREADLN_LENGTH;
 }
 
-static int enlarge_cstr_if_required(const char **c_str, int *len,
-                                    const int desired_min_length)
+static size_t enlarge_cstr_if_required(const char **c_str, size_t *len,
+                                       const size_t desired_min_length)
 {
+  size_t L;
   if ((!(*c_str))||*len==0) {
     *c_str = (char*) calloc (1,sizeof(char));
     return 1;
   }
-  if (len[0]<desired_min_length) {
+  L=*len;
+  if (L<desired_min_length) {
     do {
-      len[0]<<=1;
-    } while ((len[0]<desired_min_length)&&(len[0]!=0));
-    freebytes((char*)*c_str, sizeof(char)*len[0]);
-    if (!(*c_str=(char*)calloc(len[0],sizeof(char)))) {
-      len[0]=0;
+      L<<=1;
+    } while ((L<desired_min_length)&&(L!=0));
+    freebytes((char*)*c_str, sizeof(char)*L);
+    if (!(*c_str=(char*)calloc(L,sizeof(char)))) {
+      L=0;
     }
   }
-  return len[0];
+  *len = L;
+  return L;
 }
 
 static int cstr_char_pos(const char *c_str, const char c)
 {
-  int cnt=1;
   if (c_str) {
+    int cnt=1;
     do {
       if (*c_str==c) {
         return cnt;
@@ -175,11 +178,10 @@ static void freadln_readline (t_freadln *x)
 {
   int min_length=(x->x_textbuf_length < 1)?1:x->x_textbuf_length;
   int linebreak_pos=0;
-  int items_read;
+  size_t items_read;
   t_binbuf *bbuf;
   t_atom *abuf;
   int abuf_length;
-  int rewind_after;
 
   if (!x->x_file) {
     pd_error(x, "no file opened for reading");
@@ -211,8 +213,8 @@ static void freadln_readline (t_freadln *x)
                                          x->linebreak_chr[0]))==-1) &&
            !(items_read < x->x_textbuf_length));
 
-  if (linebreak_pos-1  < items_read - strlen(x->linebreak_chr)) {
-    rewind_after=items_read-linebreak_pos;
+  if (linebreak_pos + strlen(x->linebreak_chr) < items_read + 1 ) {
+    int rewind_after=items_read-linebreak_pos;
     fseek(x->x_file,-(long)(rewind_after),SEEK_CUR);
   }
   if (linebreak_pos==-1) {
@@ -263,16 +265,13 @@ static void *freadln_new(void)
   return (void *)x;
 }
 
-void freadln_setup(void)
+ZEXY_SETUP void freadln_setup(void)
 {
-  freadln_class = class_new(gensym("freadln"), (t_newmethod)freadln_new,
-                            (t_method) freadln_free, sizeof(t_freadln), 0, 0);
-  class_addmethod(freadln_class, (t_method)freadln_open, gensym("open"),
-                  A_SYMBOL, A_DEFSYM, 0);
-  class_addmethod(freadln_class, (t_method)freadln_close, gensym("close"),
-                  A_NULL, 0);
+  freadln_class = zexy_new("freadln",
+                           freadln_new,  freadln_free, t_freadln, 0, "");
+  zexy_addmethod(freadln_class, (t_method)freadln_open, "open", "sS");
+  zexy_addmethod(freadln_class, (t_method)freadln_close, "close", "");
   class_addbang(freadln_class, (t_method)freadln_readline);
 
   zexy_register("freadln");
 }
-
diff --git a/externals/zexy/src/fwriteln.c b/externals/zexy/src/fwriteln.c
index e6309297398c562cbf4a1665d4ab034c9bb59ea5..43ab3bf7d001bcff344a2cfc02d028e4ee6a0395 100644
--- a/externals/zexy/src/fwriteln.c
+++ b/externals/zexy/src/fwriteln.c
@@ -38,7 +38,7 @@
  * iemmatrix
  */
 
-static t_class *fwriteln_class;
+static t_class *fwriteln_class=NULL;
 
 typedef struct fwriteln {
   t_object x_ob;
@@ -46,14 +46,14 @@ typedef struct fwriteln {
   char *x_filename;
   char *x_textbuf;
   char linebreak_chr[3];
-  char format_string_afloats[10];
+  char format_string_afloats[MAXPDSTRING];
 } t_fwriteln;
 
 
 static void fwriteln_close (t_fwriteln *x)
 {
   if(x->x_file) {
-    z_fclose(x->x_file);
+    sys_fclose(x->x_file);
   }
   x->x_file=0;
   if(x->x_filename) {
@@ -94,7 +94,7 @@ static void fwriteln_open (t_fwriteln *x, t_symbol *s, t_symbol*type)
     strcpy(x->linebreak_chr,";\n");
   }
 
-  if (!(x->x_file=z_fopen(filename, "w"))) {
+  if (!(x->x_file=sys_fopen(filename, "w"))) {
     pd_error(x, "failed to open %128s",filename);
     free(filename);
     return;
@@ -107,9 +107,9 @@ static void fwriteln_open (t_fwriteln *x, t_symbol *s, t_symbol*type)
 static void fwriteln_write (t_fwriteln *x, t_symbol *s, int argc,
                             t_atom *argv)
 {
-  int length=0;
   char *text=x->x_textbuf;
   if (x->x_file) {
+    int length=0;
     if ((s!=gensym("list"))||(argv->a_type==A_SYMBOL)) {
       snprintf(text,MAXPDSTRING,"%s ", s->s_name);
       text[MAXPDSTRING-1]=0;
@@ -189,68 +189,61 @@ static void fwriteln_free (t_fwriteln *x)
   fwriteln_close(x);
 }
 
-static void *fwriteln_new(t_symbol *s, int argc, t_atom *argv)
+static void *fwriteln_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 {
+#define MAXFMTSTRING 10
   int k;
-  int width;
-  int precision;
-  char float_format[3]="g ";
-  char width_str[3]="";
-  char precision_str[4]="";
-  char prefix[3]="%";
+  char float_format = 'g';
+  char sign=0;
+  char width_str[MAXFMTSTRING];
+  char precision_str[MAXFMTSTRING];
   t_fwriteln *x = (t_fwriteln *)pd_new(fwriteln_class);
+  memset(width_str, 0, MAXFMTSTRING);
+  memset(precision_str, 0, MAXFMTSTRING);
+
   x->x_filename=0;
   x->x_file=0;
   x->x_textbuf=0;
+
   for (k=0; k<argc; k++) {
-    if (atom_getsymbol(&argv[k])==gensym("p")) {
+    t_symbol*S = atom_getsymbol(&argv[k]);
+    if (gensym("p")==S) {
       if ((k+1>=argc)||(argv[k+1].a_type!=A_FLOAT)) {
-        post("fwriteln: no value given for precision!");
+        pd_error(x, "fwriteln: no value given for precision!");
       } else {
-        precision=atom_getint(&argv[++k]);
+        int precision=(int)atom_getfloat(&argv[++k]);
         precision=(precision<0)?0:precision;
         precision=(precision>30)?30:precision;
-        snprintf(precision_str,4,".%d",precision);
+        snprintf(precision_str, MAXFMTSTRING, ".%d",precision);
       }
-    } else if (atom_getsymbol(&argv[k])==gensym("w")) {
+    } else if (gensym("w")==S) {
       if ((k+1>=argc)||(argv[k+1].a_type!=A_FLOAT)) {
-        post("fwriteln: no value given for width!");
+        pd_error(x, "fwriteln: no value given for width!");
       } else {
-        width=atom_getint(&argv[++k]);
+        int width=(int)atom_getfloat(&argv[++k]);
         width=(width<1)?1:width;
         width=(width>40)?40:width;
-        snprintf(width_str,3,"%d",width);
+        snprintf(width_str, MAXFMTSTRING, "%d",width);
       }
-    } else if (atom_getsymbol(&argv[k])==gensym("g")) {
-      float_format[0]='g';
-    } else if (atom_getsymbol(&argv[k])==gensym("f")) {
-      float_format[0]='f';
-    } else if (atom_getsymbol(&argv[k])==gensym("e")) {
-      float_format[0]='e';
-    } else if (atom_getsymbol(&argv[k])==gensym("-")) {
-      strcpy(prefix,"%-");
-    } else if (atom_getsymbol(&argv[k])==gensym("+")) {
-      strcpy(prefix,"%+");
+    } else if (gensym("g")==S || gensym("f")==S || gensym("e")==S) {
+      float_format = S->s_name[0];
+    } else if (gensym("-")==S || gensym("+")==S) {
+      sign = S->s_name[0];
     }
   }
-  x->format_string_afloats[0]='\0';
-  strncat(x->format_string_afloats,prefix,2);
-  strncat(x->format_string_afloats,width_str,2);
-  strncat(x->format_string_afloats,precision_str,3);
-  strncat(x->format_string_afloats,float_format,2);
+  snprintf(x->format_string_afloats, MAXPDSTRING, "%%%c%s%s%c ", sign,
+           width_str, precision_str, float_format);
   return (void *)x;
 }
 
-void fwriteln_setup(void)
+
+ZEXY_SETUP void fwriteln_setup(void)
 {
-  fwriteln_class = class_new(gensym("fwriteln"), (t_newmethod)fwriteln_new,
-                             (t_method) fwriteln_free, sizeof(t_fwriteln), CLASS_DEFAULT, A_GIMME, 0);
-  class_addmethod(fwriteln_class, (t_method)fwriteln_open, gensym("open"),
-                  A_SYMBOL, A_DEFSYM, 0);
-  class_addmethod(fwriteln_class, (t_method)fwriteln_close, gensym("close"),
-                  A_NULL, 0);
+  fwriteln_class = zexy_new("fwriteln",
+                            fwriteln_new,  fwriteln_free, t_fwriteln, CLASS_DEFAULT, "*");
+  zexy_addmethod(fwriteln_class, (t_method)fwriteln_open, "open", "sS");
+  zexy_addmethod(fwriteln_class, (t_method)fwriteln_close, "close", "");
   class_addanything(fwriteln_class, (t_method)fwriteln_write);
 
   zexy_register("fwriteln");
 }
-
diff --git a/externals/zexy/src/glue.c b/externals/zexy/src/glue.c
index e3a2ee7b7a3c974b54e06861598ed2fc51441de1..124ca5c37ef5a3289213a2f2e58b886b23a3a52d 100644
--- a/externals/zexy/src/glue.c
+++ b/externals/zexy/src/glue.c
@@ -20,7 +20,7 @@
 #include "zexy.h"
 #include <string.h>
 
-static t_class *glue_class;
+static t_class *glue_class=NULL;
 
 typedef struct _zglue {
   t_object x_obj;
@@ -105,19 +105,20 @@ static void *glue_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
   return (x);
 }
 
-static void glue_help(t_glue*x)
+static void glue_help(t_glue* UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " glue\t\t:: glue together 2 lists (like [list append])");
+  post("\n"HEARTSYMBOL
+       " glue\t\t:: glue together 2 lists (like [list append])");
 }
 
-void glue_setup(void)
+ZEXY_SETUP void glue_setup(void)
 {
-  glue_class = class_new(gensym("glue"), (t_newmethod)glue_new,
-                         (t_method)glue_free, sizeof(t_glue), 0, A_GIMME, 0);
+  glue_class = zexy_new("glue",
+                        glue_new, glue_free, t_glue, 0, "*");
   class_addlist(glue_class, glue_lst);
-  class_addmethod  (glue_class, (t_method)glue_lst2, gensym(""), A_GIMME, 0);
+  zexy_addmethod(glue_class, (t_method)glue_lst2, "", "*");
   class_addbang(glue_class, glue_bang);
-  class_addmethod  (glue_class, (t_method)glue_help, gensym("help"), 0);
+  zexy_addmethod(glue_class, (t_method)glue_help, "help", "");
 
   zexy_register("glue");
 }
diff --git a/externals/zexy/src/index.c b/externals/zexy/src/index.c
index 9848945ddf0e27e182d57960dadaf92f38d7c76c..0b91adf5709c3130f0919fa4e815e9b1febcc3c7 100644
--- a/externals/zexy/src/index.c
+++ b/externals/zexy/src/index.c
@@ -42,7 +42,7 @@
 
 /* ----------------------- index --------------------- */
 
-static t_class *index_class;
+static t_class *index_class=NULL;
 
 typedef struct _index {
   t_object x_obj;
@@ -143,9 +143,9 @@ static void index_add(t_index *x, t_symbol *s, t_float f)
                            || newentry>=x->maxentries)) {
       /* do some resizing */
       int maxentries=(newentry>x->maxentries)?newentry:(x->maxentries*2);
-      int i;
       t_symbol**buf=(t_symbol **)getbytes(sizeof(t_symbol *) * maxentries);
       if(buf!=0) {
+        int i;
         memcpy(buf, x->names, sizeof(t_symbol *) * x->maxentries);
         for(i=x->maxentries; i<maxentries; i++) {
           buf[i]=0;
@@ -162,9 +162,9 @@ static void index_add(t_index *x, t_symbol *s, t_float f)
       if(newentry>0) {
         newentry--;
         if(x->names[newentry]) { /* it is already taken! */
-          z_verbose(1,
-                    "index :: couldn't add element '%s' at position %d (already taken)",
-                    s->s_name, newentry+1);
+          verbose(1,
+                  "index :: couldn't add element '%s' at position %d (already taken)",
+                  s->s_name, newentry+1);
           outlet_float(x->x_obj.ob_outlet, -1.f);
           return;
         }
@@ -184,7 +184,7 @@ static void index_add(t_index *x, t_symbol *s, t_float f)
       error("index :: max number of elements (%d) reached !", x->maxentries);
     }
   } else {
-    z_verbose(1, "index :: element '%s' already exists", s->s_name);
+    verbose(1, "index :: element '%s' already exists", s->s_name);
   }
   /* couldn't add the symbol to our index table */
   outlet_float(x->x_obj.ob_outlet, -1.f);
@@ -213,7 +213,7 @@ static void index_delete(t_index *x, t_symbol* UNUSED(s), int argc,
     x->entries--;
     outlet_float(x->x_obj.ob_outlet, 0.0);
   } else {
-    z_verbose(1, "index :: couldn't find element");
+    verbose(1, "index :: couldn't find element");
     outlet_float(x->x_obj.ob_outlet, -1.0);
   }
 }
@@ -352,7 +352,7 @@ static void index_free(t_index *x)
 }
 
 
-static void index_helper(t_index *x)
+static void index_helper(t_index* UNUSED(x))
 {
   endpost();
   post(""HEARTSYMBOL " index :: index symbols to indices");
@@ -377,33 +377,26 @@ static void index_helper(t_index *x)
   post("creation:\"index [<maxelements> [<auto>]]\": creates a <maxelements> sized index");
 }
 
-void index_setup(void)
+ZEXY_SETUP void index_setup(void)
 {
-  index_class = class_new(gensym("index"),
-                          (t_newmethod)index_new, (t_method)index_free,
-                          sizeof(t_index), 0, A_GIMME, 0);
+  index_class = zexy_new("index",
+                         index_new, index_free, t_index, 0, "*");
 
   class_addsymbol(index_class, index_symbol);
 
-  class_addmethod(index_class, (t_method)index_reset,  gensym("reset"), 0);
-  class_addmethod(index_class, (t_method)index_delete, gensym("delete"),
-                  A_GIMME, 0);
-  /*  class_addmethod(index_class, (t_method)index_add,	 gensym("add"), A_SYMBOL, 0); */
-  class_addmethod(index_class, (t_method)index_add,	 gensym("add"), A_SYMBOL,
-                  A_DEFFLOAT, 0);
+  zexy_addmethod(index_class, (t_method)index_reset, "reset", "");
+  zexy_addmethod(index_class, (t_method)index_delete, "delete", "*");
+  zexy_addmethod(index_class, (t_method)index_add, "add", "sF");
 
-  class_addmethod(index_class, (t_method)index_auto,	 gensym("auto"),
-                  A_FLOAT, 0);
-  class_addmethod(index_class, (t_method)index_resize,	 gensym("resize"),
-                  A_FLOAT, 0);
+  zexy_addmethod(index_class, (t_method)index_auto, "auto", "f");
+  zexy_addmethod(index_class, (t_method)index_resize, "resize", "f");
 
   class_addfloat(index_class,  (t_method)index_float);
   class_addbang(index_class,   (t_method)index_bang);
-  class_addmethod(index_class, (t_method)index_sort,  gensym("sort"), 0);
-  class_addmethod(index_class, (t_method)index_compact,  gensym("compact"),
-                  0);
-  class_addmethod(index_class, (t_method)index_dump,  gensym("dump"), 0);
+  zexy_addmethod(index_class, (t_method)index_sort, "sort", "");
+  zexy_addmethod(index_class, (t_method)index_compact, "compact", "");
+  zexy_addmethod(index_class, (t_method)index_dump, "dump", "");
 
-  class_addmethod(index_class, (t_method)index_helper, gensym("help"), 0);
+  zexy_addmethod(index_class, (t_method)index_helper, "help", "");
   zexy_register("index");
 }
diff --git a/externals/zexy/src/length.c b/externals/zexy/src/length.c
index 3a745d5b82af89d4776507dd6fa482279ce9c8fc..c42d7d548ec74e0e609116feca3ad6f4e121ee80 100644
--- a/externals/zexy/src/length.c
+++ b/externals/zexy/src/length.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *length_class;
+static t_class *length_class=NULL;
 typedef struct _length {
   t_object x_obj;
 } t_length;
@@ -42,10 +42,10 @@ static void *length_new(void)
   return (x);
 }
 
-void length_setup(void)
+ZEXY_SETUP void length_setup(void)
 {
-  length_class = class_new(gensym("length"), (t_newmethod)length_new, 0,
-                           sizeof(t_length), 0, A_DEFFLOAT, 0);
+  length_class = zexy_new("length",
+                          length_new, 0, t_length, 0, "");
 
   class_addlist(length_class, (t_method)length_list);
   class_addanything(length_class, (t_method)length_any);
diff --git a/externals/zexy/src/lifop.c b/externals/zexy/src/lifop.c
index 8dd0963da2df191a9a2db596724a2c8ca90bbe0f..133bc4e4363b3a99cfdd054caccbf362b8c5f3ef 100644
--- a/externals/zexy/src/lifop.c
+++ b/externals/zexy/src/lifop.c
@@ -32,7 +32,7 @@
  * high priority means low numeric value
  */
 
-static t_class *lifop_class;
+static t_class *lifop_class=NULL;
 
 typedef struct _lifop_list {
   int                 argc;
@@ -189,7 +189,7 @@ static void lifop_bang(t_lifop *x)
 }
 static void lifop_query(t_lifop*x)
 {
-  z_verbose(1, "%d elements in lifo", (int)x->counter);
+  verbose(1, "%d elements in lifo", (int)x->counter);
 
   outlet_float(x->x_infout, (t_float)x->counter);
 }
@@ -270,27 +270,24 @@ static void *lifop_new(void)
 
   return (x);
 }
-static void lifop_help(t_lifop*x)
+static void lifop_help(t_lifop*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " lifop\t\t:: a Last-In-First-Out queue with priorities");
+  post("\n"HEARTSYMBOL
+       " lifop\t\t:: a Last-In-First-Out queue with priorities");
 }
-void lifop_setup(void)
+ZEXY_SETUP void lifop_setup(void)
 {
-  lifop_class = class_new(gensym("lifop"), (t_newmethod)lifop_new,
-                          (t_method)lifop_free, sizeof(t_lifop), 0, A_NULL);
+  lifop_class = zexy_new("lifop",
+                         lifop_new, lifop_free, t_lifop, 0, "");
 
   class_addbang    (lifop_class, lifop_bang);
   class_addlist    (lifop_class, lifop_list);
 
-  class_addmethod  (lifop_class, (t_method)lifop_clear, gensym("clear"),
-                    A_NULL);
-  class_addmethod  (lifop_class, (t_method)lifop_dump, gensym("dump"),
-                    A_NULL);
+  zexy_addmethod(lifop_class, (t_method)lifop_clear, "clear", "");
+  zexy_addmethod(lifop_class, (t_method)lifop_dump, "dump", "");
 
-  class_addmethod  (lifop_class, (t_method)lifop_query, gensym("info"),
-                    A_NULL);
-  class_addmethod  (lifop_class, (t_method)lifop_help, gensym("help"),
-                    A_NULL);
+  zexy_addmethod(lifop_class, (t_method)lifop_query, "info", "");
+  zexy_addmethod(lifop_class, (t_method)lifop_help, "help", "");
 
   zexy_register("lifop");
 }
diff --git a/externals/zexy/src/limiter~.c b/externals/zexy/src/limiter~.c
index 153058b3d6d3f7fcae097a576da215b76f3760a8..17b7d0d76d3b1aaf9737adda377e71a2de33ed55 100644
--- a/externals/zexy/src/limiter~.c
+++ b/externals/zexy/src/limiter~.c
@@ -1,7 +1,8 @@
 /*
  * limiter~: limit/compress signals
  *
- * (c) 1999-2011 IOhannes m zmölnig, forum::fÌr::umlÀute, institute of electronic music and acoustics (iem)
+ * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute,
+ *               institute of electronic music and acoustics (iem)
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -22,10 +23,10 @@
 /*
   --------------------------------- limiter/compressor ---------------------------------
 
-  for details on how it works watch out for   "http://iem.kug.ac.at/~zmoelnig/pd"
+  for details on how it works watch out for "http://users.iem.at/zmoelnig/pd"
   ...and search for "limiter"
 
-  mail2me4more!n4m8ion : zmoelnig@iem.kug.ac.at
+  mail2me4more!n4m8ion : zmoelnig@iem.at
 */
 
 /*
@@ -33,7 +34,7 @@
    the limiter is based on Falkner's thesis
    "Entwicklung eines digitalen Stereo-limiters mit Hilfe des Signalprozessors DSP56001" pp.14
 
-   2108:forum::fÌr::umlÀute:1999		all rights reserved and no warranties...
+   2108:forum::für::umläute:1999              all rights reserved and no warranties...
 
    see GNU-license for details
 */
@@ -73,7 +74,7 @@
 
 static t_sample SINC[9];
 
-#define PI  3.1415926535897932384626433832795029L  /* pi */
+#define PI 3.1415926535897932384626433832795029L /* pi */
 
 static void init_sinc(void)
 {
@@ -89,7 +90,7 @@ static void init_sinc(void)
 /* ------------------------------------------------------------------------------------ */
 /* first define the structs... */
 
-static t_class *limiter_class;
+static t_class *limiter_class=NULL;
 
 typedef struct _limctl {
   /* variables changed by user */
@@ -99,42 +100,42 @@ typedef struct _limctl {
 } t_limctl;
 
 typedef struct _cmpctl {
-  t_float treshold,
-          ratio;		/* uclimit is the very same is the limiter1-limit (decalculated relative to our treshold) */
+  t_float threshold,
+          ratio;                /* uclimit is the very same is the limiter1-limit (decalculated relative to our threshold) */
   t_float uclimit,
-          climit_inverse;	/* climit == compressed limit (uclimit == uncompressed limit) */
+          climit_inverse;       /* climit == compressed limit (uclimit == uncompressed limit) */
 
-  t_float limiter_limit;		/* start limiting (stop compressing); == tresh/limit; */
+  t_float limiter_limit;                /* start limiting (stop compressing); == tresh/limit; */
 
   t_float treshdB, oneminusratio;
 } t_cmpctl;
 
 typedef struct _inbuf {
-  t_sample*	ringbuf;
-  int		buf_position;
+  t_sample* ringbuf;
+  int       buf_position;
 } t_inbuf;
 
 typedef struct _limiter {
-  t_object	x_obj;
+  t_object x_obj;
 
-  int		number_of_inlets, s_n;
+  int      number_of_inlets, s_n;
 
   /* variables changed by process */
-  t_sample	amplification;
-  t_float	samples_left, still_left;
+  t_sample amplification;
+  t_float  samples_left, still_left;
 
-  int		mode;
+  int      mode;
 
-  t_limctl	*val1, *val2;
-  t_cmpctl	*cmp;
+  t_limctl *val1, *val2;
+  t_cmpctl *cmp;
 
-  /* note :	limit is not the same for val1 & val2 :
-   *			at val1 it is the limit of the INPUT_VALUE
-   *			at val2 it is the limit for the AMPLIFICATION (in fact it is abs_limit1/abs_limit2)
+  /* note: limit is not the same for val1 & val2 :
+   *       at val1 it is the limit of the INPUT_VALUE
+   *       at val2 it is the limit for the AMPLIFICATION (in fact it is abs_limit1/abs_limit2)
    */
 
-  t_inbuf*	in;
-  int		buf_size;
+  t_inbuf  *in;
+  int       buf_size;
 
 } t_limiter;
 
@@ -161,7 +162,7 @@ static void set_uclimit(t_limiter *x)
 {
   t_cmpctl *c = x->cmp;
   t_float limit = x->val1->limit, limitdB = rmstodb(limit), ratio = c->ratio,
-          tresh = c->treshold, treshdB = rmstodb(tresh);
+          tresh = c->threshold, treshdB = rmstodb(tresh);
 
   c->climit_inverse  = limit / tresh;
   c->uclimit = tresh / dbtorms(treshdB+(limitdB - treshdB)/ratio);
@@ -172,15 +173,15 @@ static void set_uclimit(t_limiter *x)
 
 /* settings */
 
-static void set_treshold(t_limiter *x, t_float treshold)
+static void set_threshold(t_limiter *x, t_float threshold)
 {
   t_cmpctl *c = x->cmp;
-  t_float tresh = dbtorms (treshold);
+  t_float tresh = dbtorms (threshold);
   if (tresh > x->val1->limit) {
     tresh = x->val1->limit;
   }
 
-  c->treshold = tresh;
+  c->threshold = tresh;
 
   set_uclimit(x);
 }
@@ -246,8 +247,8 @@ static void set_limit(t_limiter *x, t_floatarg limit)
   }
   x->val1->limit = dbtorms(limit);
 
-  if (x->val1->limit < x->cmp->treshold) {
-    x->cmp->treshold = x->val1->limit;
+  if (x->val1->limit < x->cmp->threshold) {
+    x->cmp->threshold = x->val1->limit;
   }
   set_uclimit(x);
 }
@@ -264,15 +265,15 @@ static void set_limits(t_limiter *x, t_floatarg limit1, t_floatarg limit2)
   lim2 = dbtorms(limit2);
 
   if (lim2 < lim1) {
-    lim2 = 2*lim1;	/* this is to prevent lim2 (which should trigger the FAST regulation) */
-    x->mode = 0;	/* to underrun the SLOW regulation; this would cause distortion */
+    lim2 = 2*lim1;      /* this is to prevent lim2 (which should trigger the FAST regulation) */
+    x->mode = 0;        /* to underrun the SLOW regulation; this would cause distortion */
   }
 
   x->val1->limit = lim1;
   x->val2->limit = lim1/lim2;
 
-  if (lim1 < x->cmp->treshold) {
-    x->cmp->treshold = lim1;
+  if (lim1 < x->cmp->threshold) {
+    x->cmp->threshold = lim1;
   }
   set_uclimit(x);
 }
@@ -286,8 +287,8 @@ static void set1(t_limiter *x, t_floatarg limit, t_floatarg hold,
   x->val1->hold_samples = calc_holdsamples(hold, x->buf_size);
   x->val1->change_of_amplification = calc_coa(release);
 
-  if (lim < x->cmp->treshold) {
-    x->cmp->treshold = lim;
+  if (lim < x->cmp->threshold) {
+    x->cmp->threshold = lim;
   }
   set_uclimit(x);
 }
@@ -305,13 +306,13 @@ static void set2(t_limiter *x, t_floatarg limit, t_floatarg hold,
 
 
 static void set_compressor(t_limiter *x, t_floatarg limit,
-                           t_floatarg treshold, t_floatarg ratio)
+                           t_floatarg threshold, t_floatarg ratio)
 {
   t_cmpctl *c = x->cmp;
   t_float lim = dbtorms(limit);
-  t_float tresh = dbtorms(treshold);
+  t_float tresh = dbtorms(threshold);
 
-  if ((limit == 0) && (treshold == 0) && (ratio == 0)) {
+  if ((limit == 0) && (threshold == 0) && (ratio == 0)) {
     set_mode(x, COMPRESS);
     return;
   }
@@ -325,7 +326,7 @@ static void set_compressor(t_limiter *x, t_floatarg limit,
 
   c->ratio = ratio;
   x->val1->limit = lim;
-  c->treshold = tresh;
+  c->threshold = tresh;
   set_uclimit(x);
 
   set_mode(x, COMPRESS);
@@ -368,12 +369,12 @@ static void status(t_limiter *x)
     break;
   case COMPRESS:
     post("%d-channel compressor @ %fkHz\n"
-         "\noutput-limit\t= %fdB\ntreshold\t= %fdB\ninput-limit\t= %f\nratio\t\t= 1:%f\n"
+         "\noutput-limit\t= %fdB\nthreshold\t= %fdB\ninput-limit\t= %f\nratio\t\t= 1:%f\n"
          "\nhold\t\t= %fms\nrelease\t\t= %fms\n"
          "\namplify\t\t= %fdB\n",
          x->number_of_inlets, sr,
-         rmstodb(c->treshold * c->climit_inverse), rmstodb(c->treshold),
-         rmstodb(c->treshold / c->uclimit), 1./c->ratio,
+         rmstodb(c->threshold * c->climit_inverse), rmstodb(c->threshold),
+         rmstodb(c->threshold / c->uclimit), 1./c->ratio,
          (v1->hold_samples) / sr, LN2 / (log(v1->change_of_amplification) * sr),
          rmstodb(x->amplification));
   }
@@ -399,9 +400,9 @@ static void limiter_tilde_helper(t_limiter *x)
                "\n'set2 <limit2><htime2><rtime2>'\t: set crack-limiter");
     break;
   case COMPRESS:
-    poststring("\n'ratio <compressratio>'\t\t: set compressratio (Ŝ0.5Ŝ instead of Ŝ1:2Ŝ)"
-               "\n'treshold <treshold>'\t\t: set treshold of the compressor"
-               "\n'compress <limit><treshold><ratio>'\t: set compressor"
+    poststring("\n'ratio <compressratio>'\t\t: set compressratio ('0.5' instead of '1:2')"
+               "\n'threshold <threshold>'\t\t: set threshold of the compressor"
+               "\n'compress <limit><threshold><ratio>'\t: set compressor"
                "\n..........note that <limit> is the same for COMPRESSOR and LIMITER..........");
     break;
   default:
@@ -410,21 +411,21 @@ static void limiter_tilde_helper(t_limiter *x)
   poststring("\n'print'\t\t\t\t: view actual settings"
              "\n'help'\t\t\t\t: view this\n");
   poststring("\ncreating arguments are :\n"
-             "\"limiter~ [<in1> [<in2> [<in3> [...]]]]\":	<in*> may be anything\n");
+             "\"limiter~ [<in1> [<in2> [<in3> [...]]]]\":       <in*> may be anything\n");
   endpost();
 }
 
 
-/* ------------------------------------------------------------------------------------ */
-/* now do the dsp - thing							                                                  */
-/* ------------------------------------------------------------------------------------ */
+/* ---------------------- */
+/* now do the dsp - thing */
+/* ---------------------- */
 
 static t_int *oversampling_maxima(t_int *w)
 {
-  t_limiter *x = (t_limiter *)w[1];
-  t_inbuf *buf = (t_inbuf *)w[2];
-  t_sample *in	 = (t_sample *)w[3];
-  t_sample *out = (t_sample *)w[4];
+  t_limiter *x  = (t_limiter *)w[1];
+  t_inbuf *buf  = (t_inbuf *)  w[2];
+  t_sample *in  = (t_sample *) w[3];
+  t_sample *out = (t_sample *) w[4];
 
   int n = x->s_n;
   int bufsize = x->buf_size;
@@ -468,7 +469,7 @@ static t_int *oversampling_maxima(t_int *w)
 
     sinccurrent = SINC[4] * current;
 
-    os1= fabsf(SINC[0] * last4 +
+    os1= Z_FABS(SINC[0] * last4 +
                SINC[1] * last3 +
                SINC[2] * last2 +
                SINC[3] * last1 +
@@ -478,7 +479,7 @@ static t_int *oversampling_maxima(t_int *w)
                SINC[7] * next3 +
                SINC[8] * next4);
 
-    os2= fabsf(SINC[0] * next4 +
+    os2= Z_FABS(SINC[0] * next4 +
                SINC[1] * next3 +
                SINC[2] * next2 +
                SINC[3] * next1 +
@@ -488,7 +489,7 @@ static t_int *oversampling_maxima(t_int *w)
                SINC[7] * last3 +
                SINC[8] * last4);
 
-    max = fabsf(current);
+    max = Z_FABS(current);
 
 #if 0
     if(max>1. || os1>1. || os2>1.)
@@ -527,34 +528,34 @@ static t_int *limiter_perform(t_int *w)
   t_limiter *x=(t_limiter *)w[1];
   int n = x->s_n;
 
-  t_sample *in	= (t_sample *)w[2];
-  t_sample *out= (t_sample *)w[3];
+  t_sample *in  = (t_sample *)w[2];
+  t_sample *out = (t_sample *)w[3];
 
-  t_limctl *v1	= (t_limctl *)(x->val1);
-  t_limctl *v2	= (t_limctl *)(x->val2);
-  t_cmpctl *c     = (t_cmpctl *)(x->cmp);
+  t_limctl *v1  = (t_limctl *)(x->val1);
+  t_limctl *v2  = (t_limctl *)(x->val2);
+  t_cmpctl *c   = (t_cmpctl *)(x->cmp);
 
   /* now let's make things a little bit faster */
 
   /* these MUST NOT be changed by process */
-  const t_float limit		= v1->limit;
-  const t_float holdlong	= v1->hold_samples;
-  const t_float coa_long	= v1->change_of_amplification;
+  const t_float limit    = v1->limit;
+  const t_float holdlong = v1->hold_samples;
+  const t_float coa_long = v1->change_of_amplification;
 
-  const t_float alimit		= v2->limit;
-  const t_float holdshort	= v2->hold_samples;
-  const t_float coa_short	= v2->change_of_amplification;
+  const t_float alimit    = v2->limit;
+  const t_float holdshort = v2->hold_samples;
+  const t_float coa_short = v2->change_of_amplification;
 
-  t_float tresh  = c->treshold;
+  t_float tresh  = c->threshold;
   t_float uclimit = c->uclimit;
   t_float climit_inv = c->climit_inverse;
 
   t_float oneminusratio = c->oneminusratio;
 
   /* these will be changed by process */
-  t_float amp				= x->amplification;
-  t_float samplesleft		= x->samples_left;
-  t_float stillleft		= x->still_left;
+  t_float amp         = x->amplification;
+  t_float samplesleft = x->samples_left;
+  t_float stillleft   = x->still_left;
 
   /* an intern variable... */
   t_float max_val;
@@ -564,7 +565,7 @@ static t_int *limiter_perform(t_int *w)
     while (n--) {
       max_val = *in;
 
-      /* the MAIN routine for the 1-treshold-limiter */
+      /* the MAIN routine for the 1-threshold-limiter */
 
       if ((max_val * amp) > limit) {
         amp = limit / max_val;
@@ -620,7 +621,7 @@ static t_int *limiter_perform(t_int *w)
     while (n--) {
       max_val = *in;
 
-      /* the MAIN routine for the compressor (very similar to the 1-treshold-limiter) */
+      /* the MAIN routine for the compressor (very similar to the 1-threshold-limiter) */
 
       if (max_val * amp > tresh) {
         amp = tresh / max_val;
@@ -637,8 +638,7 @@ static t_int *limiter_perform(t_int *w)
         } else {
           *out++ = amp *
                    climit_inv;  /* amp must fit for limiting : amp(new) = limit/maxval; = amp(old)*limitOUT/tresh; */
-        }
-      else {
+        } else {
         *out++ = 1.;
       }
 
@@ -653,8 +653,8 @@ static t_int *limiter_perform(t_int *w)
   }
 
   /* now return the goodies */
-  x->amplification	= amp;
-  x->samples_left		= samplesleft;
+  x->amplification = amp;
+  x->samples_left  = samplesleft;
 
   return (w+4);
 }
@@ -688,7 +688,7 @@ static void limiter_dsp(t_limiter *x, t_signal **sp)
 /* ------------------------------------------------------------------------------------ */
 /* finally do the creation - things */
 
-static void *limiter_new(t_symbol *s, int argc, t_atom *argv)
+static void *limiter_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
 {
   t_limiter *x = (t_limiter *)pd_new(limiter_class);
   int i = 0;
@@ -700,10 +700,10 @@ static void *limiter_new(t_symbol *s, int argc, t_atom *argv)
     set_bufsize(x, 0);
   }
 
-  if (argc > 64)	{
+  if (argc > 64) {
     argc=64;
   }
-  if (argc == 0)	{
+  if (argc == 0) {
     argc=1;
   }
 
@@ -719,8 +719,8 @@ static void *limiter_new(t_symbol *s, int argc, t_atom *argv)
   while (i < x->number_of_inlets) {
     int n;
     t_sample* buf = (t_sample *)getbytes(sizeof(*buf) * x->buf_size);
-    x->in[i].ringbuf		= buf;
-    x->in[i].buf_position	= 0;
+    x->in[i].ringbuf      = buf;
+    x->in[i].buf_position = 0;
     for (n = 0; n < x->buf_size; n++) {
       x->in[i].ringbuf[n] = 0.;
     }
@@ -729,16 +729,16 @@ static void *limiter_new(t_symbol *s, int argc, t_atom *argv)
 
   x->val1 = (t_limctl *)getbytes(sizeof(t_limctl));
   x->val2 = (t_limctl *)getbytes(sizeof(t_limctl));
-  x->cmp = (t_cmpctl *)getbytes(sizeof(t_cmpctl));
+  x->cmp  = (t_cmpctl *)getbytes(sizeof(t_cmpctl));
 
   x->cmp->ratio = 1.;
-  x->cmp->treshold = 1;
+  x->cmp->threshold = 1;
 
   set1(x, 100, 30, 139);
   set2(x, 110, 5, 14.2);
 
-  x->amplification= 1;
-  x->samples_left	= x->still_left = x->mode = 0;
+  x->amplification = 1;
+  x->samples_left  = x->still_left = x->mode = 0;
 
   return (x);
 }
@@ -749,9 +749,9 @@ static void limiter_free(t_limiter *x)
 
   freebytes(x->val1, sizeof(t_limctl));
   freebytes(x->val2, sizeof(t_limctl));
-  freebytes(x->cmp , sizeof(t_cmpctl));
+  freebytes(x->cmp, sizeof(t_cmpctl));
 
-  while (i < x->number_of_inlets)	{
+  while (i < x->number_of_inlets)       {
     freebytes(x->in[i++].ringbuf, x->buf_size * sizeof(t_sample));
   }
 
@@ -765,50 +765,39 @@ static void limiter_free(t_limiter *x)
 
 
 
-void limiter_tilde_setup(void)
+ZEXY_SETUP void limiter_tilde_setup(void)
 {
   init_sinc();
 
-  limiter_class = class_new(gensym("limiter~"), (t_newmethod)limiter_new,
-                            (t_method)limiter_free,
-                            sizeof(t_limiter), 0, A_GIMME, 0);
-
-  class_addmethod(limiter_class, nullfn,					gensym("signal"), 0);
-  class_addmethod(limiter_class, (t_method)limiter_dsp,	gensym("dsp"),
-                  A_CANT, 0);
-
-  class_addmethod(limiter_class, (t_method)limiter_tilde_helper,
-                  gensym("help"), 0);
-  class_addmethod(limiter_class, (t_method)status,	gensym("print"), 0);
-
-  class_addmethod(limiter_class, (t_method)set_mode,	gensym("mode"), A_FLOAT,
-                  0);
-  class_addmethod(limiter_class, (t_method)set_LIMIT,	gensym("LIMIT"),  0);
-  class_addmethod(limiter_class, (t_method)set_CRACK,	gensym("CRACK"),  0);
-  class_addmethod(limiter_class, (t_method)set_COMPRESS,	gensym("COMPRESS"),
-                  0);
-
-
-  class_addmethod(limiter_class, (t_method)set_treshold,	gensym("tresh"),
-                  A_FLOAT, 0);
-  class_addmethod(limiter_class, (t_method)set_treshold,	gensym("treshold"),
-                  A_FLOAT, 0);
-  class_addmethod(limiter_class, (t_method)set_ratio,	gensym("ratio"),
-                  A_FLOAT, 0);
-  class_addmethod(limiter_class, (t_method)set1,		gensym("set"), A_FLOAT,
-                  A_FLOAT, A_FLOAT, 0);
-  class_addmethod(limiter_class, (t_method)set2,		gensym("set2"), A_FLOAT,
-                  A_FLOAT, A_FLOAT, 0);
-  class_addmethod(limiter_class, (t_method)set_compressor,gensym("compress"),
-                  A_FLOAT, A_FLOAT, A_FLOAT, 0);
-
-  class_addmethod(limiter_class, (t_method)set_limits,	gensym("limits"),
-                  A_FLOAT, A_FLOAT, 0);
-  class_addmethod(limiter_class, (t_method)set_limit,	gensym("limit"),
-                  A_FLOAT, 0);
+  limiter_class = zexy_new("limiter~",
+                           limiter_new, limiter_free, t_limiter, 0, "*");
+
+  zexy_addmethod(limiter_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(limiter_class, (t_method)limiter_dsp, "dsp", "!");
+
+  zexy_addmethod(limiter_class, (t_method)limiter_tilde_helper, "help", "");
+  zexy_addmethod(limiter_class, (t_method)status, "print", "");
+
+  zexy_addmethod(limiter_class, (t_method)set_mode, "mode", "f");
+  zexy_addmethod(limiter_class, (t_method)set_LIMIT, "LIMIT", "");
+  zexy_addmethod(limiter_class, (t_method)set_CRACK, "CRACK", "");
+  zexy_addmethod(limiter_class, (t_method)set_COMPRESS, "COMPRESS", "");
+
+
+  zexy_addmethod(limiter_class, (t_method)set_threshold, "tresh", "f");
+  zexy_addmethod(limiter_class, (t_method)set_threshold, "treshold", "f");
+  zexy_addmethod(limiter_class, (t_method)set_threshold, "thresh", "f");
+  zexy_addmethod(limiter_class, (t_method)set_threshold, "threshold", "f");
+  zexy_addmethod(limiter_class, (t_method)set_ratio, "ratio", "f");
+  zexy_addmethod(limiter_class, (t_method)set1, "set", "fff");
+  zexy_addmethod(limiter_class, (t_method)set2, "set2", "fff");
+  zexy_addmethod(limiter_class, (t_method)set_compressor, "compress", "fff");
+
+  zexy_addmethod(limiter_class, (t_method)set_limits, "limits", "ff");
+  zexy_addmethod(limiter_class, (t_method)set_limit, "limit", "f");
   class_addfloat (limiter_class, set_limit);
 
-  class_addmethod(limiter_class, (t_method)reset,		gensym("reset"), 0);
+  zexy_addmethod(limiter_class, (t_method)reset, "reset", "");
 
   zexy_register("limiter~");
 }
diff --git a/externals/zexy/src/list2int.c b/externals/zexy/src/list2int.c
index 82e2df7e02ff98e552771560873fd84a4634a4db..181ae2490be1488546d3b8e595ac415329eecd5d 100644
--- a/externals/zexy/src/list2int.c
+++ b/externals/zexy/src/list2int.c
@@ -20,7 +20,7 @@
 #include "zexy.h"
 #include <string.h>
 
-static t_class *list2int_class;
+static t_class *list2int_class=NULL;
 
 static void list2int_any(t_mypdlist *x, t_symbol *s, int argc,
                          t_atom *argv)
@@ -75,22 +75,29 @@ static void mypdlist_free(t_mypdlist *x)
 {
   freebytes(x->x_list, x->x_n * sizeof(t_atom));
 }
-
-void list2int_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class *c = zexy_new(name,
+                        list2int_new, mypdlist_free, t_mypdlist, 0, "*");
+  class_addanything(c, list2int_any);
+  class_addlist(c, list2int_any);
+  class_addbang(c, list2int_bang);
+  class_addfloat(c, list2int_float);
+  class_addsymbol(c, list2int_symbol);
+  class_addpointer(c, list2int_pointer);
+  return c;
+}
+static void dosetup()
 {
-  list2int_class = class_new(gensym("list2int"), (t_newmethod)list2int_new,
-                             (t_method)mypdlist_free, sizeof(t_mypdlist), 0, A_GIMME, 0);
-  class_addcreator((t_newmethod)list2int_new, gensym("l2i"), A_GIMME, 0);
-  class_addanything(list2int_class, list2int_any);
-  class_addlist(list2int_class, list2int_any);
-  class_addbang(list2int_class, list2int_bang);
-  class_addfloat(list2int_class, list2int_float);
-  class_addsymbol(list2int_class, list2int_symbol);
-  class_addpointer(list2int_class, list2int_pointer);
   zexy_register("list2int");
+  list2int_class=zclass_setup("list2int");
+  zclass_setup("l2i");
+}
+ZEXY_SETUP void list2int_setup(void)
+{
+  dosetup();
 }
-
 void l2i_setup(void)
 {
-  list2int_setup();
+  dosetup();
 }
diff --git a/externals/zexy/src/list2lists.c b/externals/zexy/src/list2lists.c
index f0279837d42e1cbd1a1f25a96cc79774af9f5da9..9c4eb80588c8a749081eb77a537ffbbaa944adff 100644
--- a/externals/zexy/src/list2lists.c
+++ b/externals/zexy/src/list2lists.c
@@ -1,5 +1,5 @@
 /*
- * list2lists:  split a list into several sublists given by their lenghts
+ * list2lists:  split a list into several sublists given by their lengths
  *
  * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute, institute of electronic music and acoustics (iem)
  *
@@ -29,7 +29,7 @@
 # define DEBUGFUN(x)
 #endif
 
-static t_class *list2lists_class;
+static t_class *list2lists_class=NULL;
 
 typedef struct _list2lists {
   t_object       x_obj;
@@ -44,7 +44,7 @@ typedef struct _list2lists {
 
 
 
-static void list2lists_list2(t_list2lists*x,t_symbol*s, int argc,
+static void list2lists_list2(t_list2lists*x,t_symbol*UNUSED(s), int argc,
                              t_atom*argv)
 {
   if(x->x_length!=0) {
@@ -132,21 +132,19 @@ static void *list2lists_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 }
 
 
-static void list2lists_help(t_list2lists*x)
+static void list2lists_help(t_list2lists*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " list2lists\t\t:: split lists into multiple sublists based on matches");
+  post("\n"HEARTSYMBOL
+       " list2lists\t\t:: split lists into multiple sublists based on matches");
 }
 
-void list2lists_setup(void)
+ZEXY_SETUP void list2lists_setup(void)
 {
-  list2lists_class = class_new(gensym("list2lists"),
-                               (t_newmethod)list2lists_new,
-                               (t_method)list2lists_free, sizeof(t_list2lists), 0, A_GIMME, 0);
+  list2lists_class = zexy_new("list2lists",
+                              list2lists_new, list2lists_free, t_list2lists, 0, "*");
   class_addlist    (list2lists_class, list2lists_list);
-  class_addmethod  (list2lists_class, (t_method)list2lists_list2,
-                    gensym("lst2"), A_GIMME, 0);
+  zexy_addmethod(list2lists_class, (t_method)list2lists_list2, "lst2", "*");
 
-  class_addmethod(list2lists_class, (t_method)list2lists_help,
-                  gensym("help"), A_NULL);
+  zexy_addmethod(list2lists_class, (t_method)list2lists_help, "help", "");
   zexy_register("list2lists");
 }
diff --git a/externals/zexy/src/list2symbol.c b/externals/zexy/src/list2symbol.c
index 03d0ac2ced2f0bda6b51b18ba2b2eb6dce2b6691..205e3db6dda7d3051a8c913ec6d9833fb9062438 100644
--- a/externals/zexy/src/list2symbol.c
+++ b/externals/zexy/src/list2symbol.c
@@ -23,7 +23,7 @@
 
 /* ------------------------- list2symbol ------------------------------- */
 
-static t_class *list2symbol_class;
+static t_class *list2symbol_class=NULL;
 
 typedef struct _list2symbol {
   t_object x_obj;
@@ -34,11 +34,6 @@ typedef struct _list2symbol {
   t_outlet*x_outlet;
 } t_list2symbol;
 
-static void list2symbol_connector(t_list2symbol *x, t_symbol *s)
-{
-  x->connector = s;
-}
-
 static void list2symbol_bang(t_list2symbol *x)
 {
   t_atom *argv=x->ap;
@@ -46,7 +41,7 @@ static void list2symbol_bang(t_list2symbol *x)
   char *result = 0;
   int length = 0, len=0;
   int i= argc;
-  char *connector=0;
+  const char *connector=0;
   char connlen=0;
   char*buffer = (char*)getbytes(MAXPDSTRING*sizeof(char));
   if(x->connector) {
@@ -84,7 +79,7 @@ static void list2symbol_bang(t_list2symbol *x)
 
   /* 2nd create the symbol */
   if (x->s) {
-    char *buf = x->s->s_name;
+    const char *buf = x->s->s_name;
     int buflen=strlen(buf);
     strncpy(result+len, buf, length-len);
     len+=buflen;
@@ -140,28 +135,21 @@ static void list2symbol_anything(t_list2symbol *x, t_symbol *s, int argc,
   list2symbol_bang(x);
 }
 
-static void list2symbol_list(t_list2symbol *x, t_symbol *s, int argc,
+static void list2symbol_list(t_list2symbol *x, t_symbol *UNUSED(s),
+                             int argc,
                              t_atom *argv)
 {
   list2symbol_anything(x, 0, argc, argv);
 }
-static void *list2symbol_new(t_symbol *s, int argc, t_atom *argv)
+static void *list2symbol_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
 {
   t_list2symbol *x = (t_list2symbol *)pd_new(list2symbol_class);
 
   x->x_outlet=outlet_new(&x->x_obj, 0);
-  x->x_inlet2=inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("symbol"),
-                        gensym(""));
-
-#if 0
-  /* old behaviour: the argument list is used as the list-to-be-converted */
-  x->connector = gensym(" ");
-  list2symbol_anything(x, 0, argc, argv);
-#else
-  /* new behaviour: set the delimiter with the argument */
-  list2symbol_connector(x, (argc)?atom_getsymbol(argv):gensym(" "));
-#endif
+  x->x_inlet2=symbolinlet_new(&x->x_obj, &x->connector);
 
+  /* set the delimiter with the argument */
+  x->connector = (argc)?atom_getsymbol(argv):gensym(" ");
 
   return (x);
 }
@@ -176,24 +164,26 @@ static void list2symbol_free(t_list2symbol *x)
   inlet_free(x->x_inlet2);
 }
 
-
-void list2symbol_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class*c = zexy_new(name,
+                       list2symbol_new, list2symbol_free, t_list2symbol, 0, "*");
+  class_addbang    (c, list2symbol_bang);
+  class_addlist    (c, list2symbol_list);
+  class_addanything(c, list2symbol_anything);
+  return c;
+}
+static void dosetup()
 {
-  list2symbol_class = class_new(gensym("list2symbol"),
-                                (t_newmethod)list2symbol_new,
-                                (t_method)list2symbol_free, sizeof(t_list2symbol), 0,
-                                A_GIMME, 0);
-
-  class_addcreator((t_newmethod)list2symbol_new, gensym("l2s"), A_GIMME, 0);
-  class_addbang    (list2symbol_class, list2symbol_bang);
-  class_addlist    (list2symbol_class, list2symbol_list);
-  class_addanything(list2symbol_class, list2symbol_anything);
-  class_addmethod  (list2symbol_class, (t_method)list2symbol_connector,
-                    gensym(""), A_SYMBOL, 0);
-
   zexy_register("list2symbol");
+  list2symbol_class=zclass_setup("list2symbol");
+  zclass_setup("l2s");
+}
+ZEXY_SETUP void list2symbol_setup(void)
+{
+  dosetup();
 }
 void l2s_setup(void)
 {
-  list2symbol_setup();
+  dosetup();
 }
diff --git a/externals/zexy/src/lister.c b/externals/zexy/src/lister.c
index 4b7084b41dcffdbf165aafdbe6f01b6a06c575ff..e654b482ccbf3d3397884a0ccd852de516185c1b 100644
--- a/externals/zexy/src/lister.c
+++ b/externals/zexy/src/lister.c
@@ -19,24 +19,8 @@
 
 #include "zexy.h"
 
-#ifdef HAVE_ALLOCA_H
-# include <alloca.h>
-#endif
+static t_class *lister_class = NULL;
 
-#define LIST_NGETBYTE 100 /* bigger that this we use alloc, not alloca */
-
-
-static t_class *mypdlist_class;
-
-#ifdef HAVE_ALLOCA_H
-# define ATOMS_ALLOCA(x, n) ((x) = (t_atom *)((n) < LIST_NGETBYTE ?  \
-        alloca((n) * sizeof(t_atom)) : getbytes((n) * sizeof(t_atom))))
-# define ATOMS_FREEA(x, n) ( \
-    ((n) < LIST_NGETBYTE || (freebytes((x), (n) * sizeof(t_atom)), 0)))
-#else
-# define ATOMS_ALLOCA(x, n) ((x) = (t_atom *)getbytes((n) * sizeof(t_atom)))
-# define ATOMS_FREEA(x, n) (freebytes((x), (n) * sizeof(t_atom)))
-#endif
 
 static void atoms_copy(int argc, t_atom *from, t_atom *to)
 {
@@ -57,7 +41,8 @@ static void mypdlist_storelist(t_mypdlist *x, int argc, t_atom *argv)
 
   atoms_copy(argc, argv, x->x_list);
 }
-static void mypdlist_secondlist(t_mypdlist *x, t_symbol *s, int argc,
+static void mypdlist_secondlist(t_mypdlist *x, t_symbol *UNUSED(s),
+                                int argc,
                                 t_atom *argv)
 {
   mypdlist_storelist(x, argc, argv);
@@ -66,11 +51,10 @@ static void mypdlist_secondlist(t_mypdlist *x, t_symbol *s, int argc,
 static void mypdlist_bang(t_mypdlist *x)
 {
   int outc=x->x_n;
-  t_atom*outv;
-  ATOMS_ALLOCA(outv, outc);
+  t_atom*outv = (t_atom*)getbytes(outc * sizeof(t_atom));
   atoms_copy(x->x_n, x->x_list, outv);
   outlet_list(x->x_obj.ob_outlet, gensym("list"), outc, outv);
-  ATOMS_FREEA(outv, outc);
+  freebytes(outv, outc * sizeof(t_atom));
 }
 
 
@@ -87,9 +71,9 @@ static void mypdlist_free(t_mypdlist *x)
   freebytes(x->x_list, x->x_n * sizeof(t_atom));
 }
 
-static void *mypdlist_new(t_symbol *s, int argc, t_atom *argv)
+static void *mypdlist_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
 {
-  t_mypdlist *x = (t_mypdlist *)pd_new(mypdlist_class);
+  t_mypdlist *x = (t_mypdlist *)pd_new(lister_class);
 
   outlet_new(&x->x_obj, 0);
   inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("list"), gensym("lst2"));
@@ -105,29 +89,33 @@ static void *mypdlist_new(t_symbol *s, int argc, t_atom *argv)
 }
 
 
-static void mypdlist_help(t_mypdlist*x)
+static void mypdlist_help(t_mypdlist*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " lister\t\t:: basic list storage (use pd>=0.39 for real [list] objects)");
+  post("\n"HEARTSYMBOL
+       " lister\t\t:: basic list storage (use pd>=0.39 for real [list] objects)");
 }
 
-void lister_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class *c = zexy_new(name,
+                        mypdlist_new, mypdlist_free, t_mypdlist, 0, "*");
+  class_addbang    (c, mypdlist_bang);
+  class_addlist    (c, mypdlist_list);
+  zexy_addmethod(c, (t_method)mypdlist_secondlist, "lst2", "*");
+  zexy_addmethod(c, (t_method)mypdlist_help, "help", "");
+  return c;
+}
+static void dosetup()
 {
-  mypdlist_class = class_new(gensym("lister"), (t_newmethod)mypdlist_new,
-                             (t_method)mypdlist_free, sizeof(t_mypdlist), 0, A_GIMME, 0);
-  /* i don't know how to get this work with name=="list" !!! */
-
-  class_addcreator((t_newmethod)mypdlist_new, gensym("l"), A_GIMME, 0);
-
-  class_addbang    (mypdlist_class, mypdlist_bang);
-  class_addlist    (mypdlist_class, mypdlist_list);
-  class_addmethod  (mypdlist_class, (t_method)mypdlist_secondlist,
-                    gensym("lst2"), A_GIMME, 0);
-
-  class_addmethod(mypdlist_class, (t_method)mypdlist_help, gensym("help"),
-                  A_NULL);
   zexy_register("lister");
+  lister_class = zclass_setup("lister");
+  zclass_setup("l");
+}
+ZEXY_SETUP void lister_setup(void)
+{
+  dosetup();
 }
 void l_setup(void)
 {
-  lister_setup();
+  dosetup();
 }
diff --git a/externals/zexy/src/listfind.c b/externals/zexy/src/listfind.c
index fe0df1d7ffeb128f82407ec53dd8bd317ff18648..829d2db507956623b97b0ef933ffd193e99d12c8 100644
--- a/externals/zexy/src/listfind.c
+++ b/externals/zexy/src/listfind.c
@@ -1,5 +1,5 @@
 /*
- * listfind: find a sublist in a list and return the index of the occurence (or indices if there are more)
+ * listfind: find a sublist in a list and return the index of the occurrence (or indices if there are more)
  *
  * (c) 1999-2011 IOhannes m zmölnig, forum::für::umläute, institute of electronic music and acoustics (iem)
  *
@@ -29,7 +29,7 @@
 # define DEBUGFUN(x)
 #endif
 
-static t_class *listfind_class;
+static t_class *listfind_class=NULL;
 
 
 typedef struct _listfind {
@@ -45,7 +45,8 @@ typedef struct _listfind {
 
 
 
-static void listfind_list2(t_listfind*x,t_symbol*s, int argc, t_atom*argv)
+static void listfind_list2(t_listfind*x,t_symbol*UNUSED(s), int argc,
+                           t_atom*argv)
 {
   if(x->x_argv!=0) {
     freebytes(x->x_argv, sizeof(t_atom)*x->x_argc);
@@ -67,7 +68,7 @@ static void listfind_list2(t_listfind*x,t_symbol*s, int argc, t_atom*argv)
   DEBUGFUN(post("list2: %d %x", x->x_argc, x->x_argv));
 }
 
-static int atom_equals(t_atom*a1, t_atom*a2)
+static int UNUSED_FUNCTION(atom_equals) (t_atom*a1, t_atom*a2)
 {
   if(a1->a_type!=a2->a_type) {
     return 0;
@@ -167,7 +168,7 @@ static void listfind_doit(t_outlet*out, int longcount, t_atom*longlist,
   freebytes(ap, length*sizeof(t_atom));
 }
 
-static void listfind_list(t_listfind *x, t_symbol *s, int argc,
+static void listfind_list(t_listfind *x, t_symbol *UNUSED(s), int argc,
                           t_atom *argv)
 {
 #if 0
@@ -217,20 +218,19 @@ static void *listfind_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 }
 
 
-static void listfind_help(t_listfind*x)
+static void listfind_help(t_listfind*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " listfind\t\t:: split lists into multiple sublists based on matches");
+  post("\n"HEARTSYMBOL
+       " listfind\t\t:: split lists into multiple sublists based on matches");
 }
 
-void listfind_setup(void)
+ZEXY_SETUP void listfind_setup(void)
 {
-  listfind_class = class_new(gensym("listfind"), (t_newmethod)listfind_new,
-                             (t_method)listfind_free, sizeof(t_listfind), 0, A_GIMME, 0);
+  listfind_class = zexy_new("listfind",
+                            listfind_new, listfind_free, t_listfind, 0, "*");
   class_addlist    (listfind_class, listfind_list);
-  class_addmethod  (listfind_class, (t_method)listfind_list2, gensym("lst2"),
-                    A_GIMME, 0);
+  zexy_addmethod(listfind_class, (t_method)listfind_list2, "lst2", "*");
 
-  class_addmethod(listfind_class, (t_method)listfind_help, gensym("help"),
-                  A_NULL);
+  zexy_addmethod(listfind_class, (t_method)listfind_help, "help", "");
   zexy_register("listfind");
 }
diff --git a/externals/zexy/src/liststorage.c b/externals/zexy/src/liststorage.c
index 7139cee85c3374125f1e96e7dab71ef4e4587f04..afcd7b0fe1fe04bce54d558d6da33368daafca4e 100644
--- a/externals/zexy/src/liststorage.c
+++ b/externals/zexy/src/liststorage.c
@@ -62,7 +62,7 @@ typedef struct _liststorage {
   t_msglist**x_slots;
 } t_liststorage;
 
-static t_class *liststorage_class;
+static t_class *liststorage_class=NULL;
 
 
 /* ************************************************************************ */
@@ -234,16 +234,14 @@ static void liststorage_bang(t_liststorage *x)
 }
 
 /* add a new list to the current slot */
-static void liststorage_add(t_liststorage *x, t_symbol *s, int ac,
+static void liststorage_add(t_liststorage *x, t_symbol *UNUSED(s), int ac,
                             t_atom *av)
 {
-  t_msglist*list=NULL;
   int slot=_liststorage_checkslot(x,
                                   "attempting to add data to invalid slot", 1);
   if(slot<0) {
     return;
   }
-  list=_liststorage_getslot(x, slot);
   x->x_slots[slot]=_liststorage_add2slot(x->x_slots[slot], ac, av);
 }
 
@@ -271,7 +269,7 @@ static void liststorage_clearall(t_liststorage *x)
 static void liststorage_insert(t_liststorage *x, t_floatarg f)
 {
   int current=x->x_currentslot;
-  int slot=-1;
+  int slot;
   int i=0;
 
   x->x_currentslot=f;
@@ -394,43 +392,39 @@ static void *liststorage_new(t_floatarg f)
   return (x);
 }
 
-void liststorage_setup(void)
+ZEXY_SETUP void liststorage_setup(void)
 {
-  liststorage_class = class_new(gensym("liststorage"),
-                                (t_newmethod)liststorage_new,
-                                (t_method)liststorage_free, sizeof(t_liststorage), 0, A_DEFFLOAT, 0);
+  liststorage_class = zexy_new("liststorage",
+                               liststorage_new, liststorage_free, t_liststorage, 0, "F");
 
   /* recall all lists from the current slot */
   class_addbang(liststorage_class, (t_method)liststorage_bang);
 
   /* add a new list to the current slot */
-  class_addmethod(liststorage_class, (t_method)liststorage_add,
-                  gensym("add"), A_GIMME, 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_add, "add", "*");
   /* clear the current slot */
-  class_addmethod(liststorage_class, (t_method)liststorage_clear,
-                  gensym("clear"), 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_clear, "clear",
+                 "");
   /* clear all slots */
-  class_addmethod(liststorage_class, (t_method)liststorage_clearall,
-                  gensym("clearall"), 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_clearall,
+                 "clearall", "");
 
 
   /* add a new list to the current slot */
-  class_addmethod(liststorage_class, (t_method)liststorage_slot,
-                  gensym("slot"), A_FLOAT, 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_slot, "slot", "f");
 
 
   /* insert an empty slot at (before) given position */
-  class_addmethod(liststorage_class, (t_method)liststorage_insert,
-                  gensym("insert"), A_DEFFLOAT, 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_insert, "insert",
+                 "F");
 
   /* remove empty slots */
-  class_addmethod(liststorage_class, (t_method)liststorage_compress,
-                  gensym("compress"), 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_compress,
+                 "compress", "");
 
 
   /* get the number of slots */
-  class_addmethod(liststorage_class, (t_method)liststorage_info,
-                  gensym("info"), 0);
+  zexy_addmethod(liststorage_class, (t_method)liststorage_info, "info", "");
 
   zexy_register("liststorage");
 }
diff --git a/externals/zexy/src/longload.c b/externals/zexy/src/longload.c
index 0e914e7d7c6b9775417e570daf0b5677bb48b4ce..d07f0e09d54f535a59c30f4e75f3b66ecd609a74 100644
--- a/externals/zexy/src/longload.c
+++ b/externals/zexy/src/longload.c
@@ -28,7 +28,7 @@
 #endif
 
 
-static t_class *longload_class;
+static t_class *longload_class=NULL;
 
 typedef struct _longload {
   t_object x_obj;
@@ -55,13 +55,9 @@ static void *longload_new(t_float f)
   return (x);
 }
 
-void longload_setup(void)
+ZEXY_SETUP void longload_setup(void)
 {
-  longload_class = class_new(gensym("longload"),
-                             (t_newmethod)longload_new,
-                             0,
-                             sizeof(t_longload),
-                             CLASS_NOINLET,
-                             A_DEFFLOAT, 0);
+  longload_class = zexy_new("longload",
+                            longload_new, 0, t_longload, CLASS_NOINLET, "F");
   zexy_register("longload");
 }
diff --git a/externals/zexy/src/lpt.c b/externals/zexy/src/lpt.c
index 809d7181ed89c3c5e946364af20287cebdd781e0..d48f398d5f6a3d34da4d4b9deca9c5aa6011ee3a 100644
--- a/externals/zexy/src/lpt.c
+++ b/externals/zexy/src/lpt.c
@@ -31,7 +31,6 @@
      TODO: test for timeouts,...
 
    thanks to
-    Olaf Matthes: porting to WindozeNT/2000/XP
     Thomas Musil: adding "control-output" and "input"
 */
 #define BASE0  0x3bc
@@ -42,130 +41,284 @@
 #define MODE_IOPL   0
 #define MODE_NONE   -1
 
+#if defined __linux__
+# ifndef Z_WANT_LPT
+#  define Z_WANT_LPT 1
+# endif
+#elif defined __WIN32__
+# if defined __i386__
+#  ifndef Z_WANT_LPT
+#   define Z_WANT_LPT 1
+#  endif
+#  define INPOUT_DLL "inpout32.dll"
+# elif defined __x86_64__
+#  ifndef Z_WANT_LPT
+#   define Z_WANT_LPT 1
+#  endif
+#  define INPOUT_DLL "inpoutx64.dll"
+# else
+#  warning lpt-support on Windows requires InpOut32, which is only available for i386/amd64
+# endif
+#else
+# warning no lpt-support for this OS
+#endif
+
+#ifndef Z_WANT_LPT
+# define Z_WANT_LPT 0
+#endif
+
 #include "zexy.h"
 
 /* ----------------------- lpt --------------------- */
 
-#ifdef Z_WANT_LPT
+#if Z_WANT_LPT
 # include <stdlib.h>
 # include <errno.h>
 
-# ifdef HAVE_LINUX_PPDEV_H
-#  include <unistd.h>
-#  include <sys/ioctl.h>
-#  include <linux/ppdev.h>
-#  include <linux/parport.h>
-#  include <fcntl.h>
-#  include <stdio.h>
-# endif /* HAVE_LINUX_PPDEV_H */
+# if defined __WIN32__
+#include "windows.h"
+typedef void    (__stdcall *lpOut32)(short, short);
+typedef short   (__stdcall *lpInp32)(short);
+typedef BOOL    (__stdcall *lpIsInpOutDriverOpen)(void);
+typedef BOOL    (__stdcall *lpIsXP64Bit)(void);
+
+/* Some global function pointers (messy but fine for an example) */
+lpOut32 gfpOut32;
+lpInp32 gfpInp32;
+lpIsInpOutDriverOpen gfpIsInpOutDriverOpen;
+lpIsXP64Bit gfpIsXP64Bit;
+/* the handle to the DLL, so we can close it once all [lpt]-objects have been deleted */
+static HINSTANCE hInpOutDll;
+/* reference count for the DLL-handle */
+static int z_inpout32_refcount = 0;
+
+static int z_getWinErr(char*outstr, size_t len)
+{
+  wchar_t*errstr;
+  size_t i;
+  DWORD err = GetLastError();
+  outstr[0] = 0;
+  if(!err) {
+    return 0;
+  }
+  errstr=calloc(len, sizeof(wchar_t));
+  FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
+                 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), errstr, len, NULL);
+  for(i=0; i<len; i++) {
+    wchar_t wc = errstr[i];
+    char c = ((wc>=0) && (wc<128))?((char)(wc)):'?';
+    if((10 == c) || (13 == c)) {
+      c = ' ';
+    }
 
+    outstr[i] = c;
+  }
+  free(errstr);
+  outstr[len-1] = 0;
+  return err;
+}
+static void z_findfile(const char*filename, char*buf, size_t bufsize)
+{
+  char *bufptr;
+  int fd = open_via_path(".", filename, "", buf, &bufptr, bufsize, 0);
 
-# ifdef __WIN32__
-/* on windoze everything is so complicated... */
-extern int read_parport(int port);
-extern void write_parport(int port, int value);
-extern int open_port(int port);
+  if (fd < 0) {
+    snprintf(buf, bufsize-1, "%s", filename);
+  } else {
+    sys_close(fd);
+    snprintf(buf, bufsize-1, "%s/%s", buf, bufptr);
+  }
+  buf[bufsize-1] = 0;
+
+}
 
-static int ioperm(int port, int a, int b)
+static int z_inpout32_ctor()
 {
-  if(open_port(port) == -1) {
-    return(1);
+  if(!z_inpout32_refcount) {
+    char filename[MAXPDSTRING];
+    z_findfile(INPOUT_DLL, filename, MAXPDSTRING);
+
+    SetLastError(0);
+    hInpOutDll = LoadLibrary ( filename );
+    if ( hInpOutDll == NULL )  {
+      char errstring[MAXPDSTRING];
+      int err = z_getWinErr(errstring, MAXPDSTRING);
+      error("unable to open %s for accessing the parallel-port!", INPOUT_DLL);
+      error("error[%d]: %s", err, errstring);
+      error("make sure you have InpOut32 installed");
+      error("--> http://www.highrez.co.uk/downloads/inpout32/");
+      return 0;
+    }
+    gfpOut32 = (lpOut32)GetProcAddress(hInpOutDll, "Out32");
+    gfpInp32 = (lpInp32)GetProcAddress(hInpOutDll, "Inp32");
+    gfpIsInpOutDriverOpen = (lpIsInpOutDriverOpen)GetProcAddress(hInpOutDll,
+                            "IsInpOutDriverOpen");
+    gfpIsXP64Bit = (lpIsXP64Bit)GetProcAddress(hInpOutDll, "IsXP64Bit");
   }
-  return(0);
-}
+  z_inpout32_refcount++;
 
-static int iopl(int i)
+  if (!gfpIsInpOutDriverOpen()) {
+    error("unable to start InpOut32 driver!");
+    return 0;
+  }
+  return z_inpout32_refcount;
+}
+static void z_inpout32_dtor()
 {
-  return(-1);
+  z_inpout32_refcount--;
+  if(!z_inpout32_refcount) {
+    gfpOut32 = NULL;
+    gfpInp32 = NULL;
+    gfpIsInpOutDriverOpen = NULL;
+    gfpIsXP64Bit = NULL;
+    FreeLibrary ( hInpOutDll );
+  }
+}
+static void sys_outb(unsigned char byte, unsigned short int port)
+{
+  if(gfpOut32) {
+    gfpOut32(port, byte);
+  }
+}
+static int sys_inb(unsigned short int port)
+{
+  if(gfpInp32) {
+    return gfpInp32(port);
+  }
+  return 0;
 }
 
-static void sys_outb(unsigned char byte, int port)
+/* on windoze everything is so complicated... */
+static int ioperm(unsigned short int UNUSED(port),
+                  int UNUSED(a), int UNUSED(b))
 {
-  write_parport(port, byte);
+  return(0);
 }
-static int sys_inb(int port)
+
+static int iopl(int UNUSED(i))
 {
-  return read_parport(port);
+  return(-1);
 }
-# else
+
+# elif defined (__linux__)
 /* thankfully there is linux */
+#  include <unistd.h>
+#  include <sys/ioctl.h>
+#  include <linux/ppdev.h>
+#  include <linux/parport.h>
+#  include <fcntl.h>
+#  include <stdio.h>
 #  include <sys/io.h>
 
-static void sys_outb(unsigned char byte, int port)
+static void sys_outb(unsigned char byte, unsigned short int port)
 {
   outb(byte, port);
 }
-static int sys_inb(int port)
+static int sys_inb(unsigned short int port)
 {
   return inb(port);
 }
-# endif /* __WIN32__ */
-#endif /* Z_WANT_LP */
+
+# else
+static void sys_outb(unsigned char UNUSED(byte),
+                     unsigned short int UNUSED(port))
+{}
+static int sys_inb(unsigned short int UNUSED(port))
+{
+  return 0;
+}
+# endif /* OS */
+#endif /* Z_WANT_LPT */
 
 
 static int count_iopl = 0;
-static t_class *lpt_class;
+static t_class *lpt_class=NULL;
 
 typedef struct _lpt {
   t_object x_obj;
 
-  unsigned long port;
+  unsigned short int port;
   int device; /* file descriptor of device, in case we are using one ...*/
 
   int mode; /* MODE_IOPERM, MODE_IOPL */
 } t_lpt;
 
+#if Z_WANT_LPT
 static void lpt_float(t_lpt *x, t_floatarg f)
 {
-#ifdef Z_WANT_LPT
   unsigned char b = f;
-# ifdef HAVE_LINUX_PPDEV_H
+#ifdef __linux__
   if (x->device>0) {
     ioctl (x->device, PPWDATA, &b);
   } else
-# endif
+#endif
     if (x->port) {
       sys_outb(b, x->port+0);
     }
-#endif /*  Z_WANT_LPT */
 }
 
 static void lpt_control(t_lpt *x, t_floatarg f)
 {
-#ifdef Z_WANT_LPT
   unsigned char b = f;
-# ifdef HAVE_LINUX_PPDEV_H
+#ifdef __linux__
   if (x->device>0) {
     ioctl (x->device, PPWCONTROL, &b);
   } else
-# endif
+#endif
     if (x->port) {
       sys_outb(b, x->port+2);
     }
-#endif /*  Z_WANT_LPT */
 }
 
 static void lpt_bang(t_lpt *x)
 {
-#ifdef Z_WANT_LPT
-# ifdef HAVE_LINUX_PPDEV_H
+#ifdef __linux__
   if (x->device>0) {
     unsigned char b=0;
     ioctl (x->device, PPRCONTROL, &b);
     outlet_float(x->x_obj.ob_outlet, (t_float)b);
   } else
-# endif
-    if (x->port)	{
+#endif
+    if (x->port) {
       outlet_float(x->x_obj.ob_outlet, (t_float)sys_inb(x->port+1));
     }
-#endif /*  Z_WANT_LPT */
 }
 
+static void lpt_free(t_lpt *x)
+{
+#ifdef __linux__
+  if (x->device>0) {
+    ioctl (x->device, PPRELEASE);
+    sys_close(x->device);
+    x->device=0;
+  } else
+#endif
+    if (x->port) {
+      if (x->mode==MODE_IOPERM && ioperm(x->port, 8, 0)) {
+        error("lpt: couldn't clean up device");
+      } else if (x->mode==MODE_IOPL && (!--count_iopl) && iopl(0)) {
+        error("lpt: couldn't clean up device");
+      }
+    }
+#ifdef __WIN32__
+  z_inpout32_dtor();
+#endif
+}
+
+#else
+static void lpt_float(t_lpt *x, t_floatarg f) { ; }
+static void lpt_control(t_lpt *x, t_floatarg f) { ; }
+static void lpt_bang(t_lpt *x) { ; }
+static void lpt_free(t_lpt *x) { ; }
+#endif /*  Z_WANT_LPT */
+
 
 static void *lpt_new(t_symbol *s, int argc, t_atom *argv)
 {
   t_lpt *x = (t_lpt *)pd_new(lpt_class);
-  char*devname = argc ? atom_getsymbol(argv)->s_name : &s_;
+  const char*devname=0;
+  long int hexport = 0;
+
   if(s==gensym("lp")) {
     error("lpt: the use of 'lp' has been deprecated; use 'lpt' instead");
   }
@@ -177,18 +330,21 @@ static void *lpt_new(t_symbol *s, int argc, t_atom *argv)
   x->port = 0;
   x->device = -1;
 
-#ifdef Z_WANT_LPT
+#if Z_WANT_LPT
   if ((argc==0)||(argv->a_type==A_FLOAT)) {
     /* FLOAT specifies a parallel port */
     switch ((int)((argc)?atom_getfloat(argv):0)) {
     case 0:
       x->port = BASE0;
+      devname="lpt0";
       break;
     case 1:
       x->port = BASE1;
+      devname="lpt1";
       break;
     case 2:
       x->port = BASE2;
+      devname="lpt2";
       break;
     default:
       error("lpt : only lpt0, lpt1 and lpt2 are accessible");
@@ -196,30 +352,31 @@ static void *lpt_new(t_symbol *s, int argc, t_atom *argv)
       return (x);
     }
   } else {
-    /* SYMBOL might be a file or a hex port-number;
-       we ignore the file (device) case by now;
-       LATER think about this
-    */
+    /* SYMBOL might be a file or a hex port-number */
+    devname=atom_getsymbol(argv)->s_name;
     x->device=-1;
-    x->port=strtol(devname, 0, 16);
+    hexport=strtol(devname, 0, 16);
+    if((hexport >= 0) && (hexport <= 0xFFFF)) {
+      x->port = hexport;
+    }
     if(0==x->port) {
-#ifdef HAVE_LINUX_PPDEV_H
-      x->device = z_open(devname, O_RDWR);
+#ifdef __linux__
+      x->device = sys_open(devname, O_RDWR);
       if(x->device<=0) {
         error("lpt: bad device %s", devname);
         return(x);
       } else {
         if (ioctl (x->device, PPCLAIM)) {
           perror ("PPCLAIM");
-          z_close (x->device);
+          sys_close (x->device);
           x->device=-1;
         }
       }
-#endif /* HAVE_LINUX_PPDEV_H */
+#endif /* __linux__ */
     }
   }
 
-  if ((x->device<0) && (!x->port || x->port>65535)) {
+  if ((x->device<0) && (!x->port)) {
     error("lpt : bad port %x", x->port);
     x->port = 0;
     return (x);
@@ -227,7 +384,7 @@ static void *lpt_new(t_symbol *s, int argc, t_atom *argv)
   if (x->device<0) {
     /* this is ugly: when using a named device,
      * we are currently assuming that we have read/write-access
-     * of course, this is not necessary true
+     * of course, this is not necessarily true
      */
     /* furthermore, we might also use the object
      * withOUT write permissions
@@ -255,15 +412,20 @@ static void *lpt_new(t_symbol *s, int argc, t_atom *argv)
       return (x);
     }
   }
+#ifdef __WIN32__
+  z_inpout32_ctor();
+#else
   if(x->device>0) {
     post("lpt: connected to device %s", devname);
   } else {
     post("lpt: connected to port %x in mode '%s'", x->port,
          (x->mode==MODE_IOPL)?"iopl":"ioperm");
   }
+#endif
   if (x->mode==MODE_IOPL) {
     post("lpt-warning: this might seriously damage your pc...");
   }
+
 #else
   error("zexy has been compiled without [lpt]!");
   count_iopl=0;
@@ -274,27 +436,6 @@ static void *lpt_new(t_symbol *s, int argc, t_atom *argv)
   return (x);
 }
 
-static void lpt_free(t_lpt *x)
-{
-#ifdef Z_WANT_LPT
-# ifdef HAVE_LINUX_PPDEV_H
-  if (x->device>0) {
-    ioctl (x->device, PPRELEASE);
-    z_close(x->device);
-    x->device=0;
-  } else
-# endif
-    if (x->port) {
-      if (x->mode==MODE_IOPERM && ioperm(x->port, 8, 0)) {
-        error("lpt: couldn't clean up device");
-      } else if (x->mode==MODE_IOPL && (!--count_iopl) && iopl(0)) {
-        error("lpt: couldn't clean up device");
-      }
-    }
-#endif /* Z_WANT_LPT */
-}
-
-
 static void lpt_helper(t_lpt*UNUSED(x))
 {
   post("\n"HEARTSYMBOL " lpt :: direct access to the parallel port");
@@ -303,18 +444,16 @@ static void lpt_helper(t_lpt*UNUSED(x))
   post("\t\t\"lpt <portaddr>\": connect to port @ <portaddr> (hex)");
 }
 
-void lpt_setup(void)
+ZEXY_SETUP void lpt_setup(void)
 {
-  lpt_class = class_new(gensym("lpt"),
-                        (t_newmethod)lpt_new, (t_method)lpt_free,
-                        sizeof(t_lpt), 0, A_GIMME, 0);
-  class_addcreator((t_newmethod)lpt_new, gensym("lp"), A_GIMME, 0);
+  lpt_class = zexy_new("lpt",
+                       lpt_new, lpt_free, t_lpt, 0, "*");
+  //class_addcreator((t_newmethod)lpt_new, gensym("lp"), A_GIMME, 0);
 
   class_addfloat(lpt_class, (t_method)lpt_float);
-  class_addmethod(lpt_class, (t_method)lpt_control, gensym("control"),
-                  A_FLOAT, 0);
+  zexy_addmethod(lpt_class, (t_method)lpt_control, "control", "f");
   class_addbang(lpt_class, (t_method)lpt_bang);
 
-  class_addmethod(lpt_class, (t_method)lpt_helper, gensym("help"), 0);
+  zexy_addmethod(lpt_class, (t_method)lpt_helper, "help", "");
   zexy_register("lpt");
 }
diff --git a/externals/zexy/src/makealias.sh b/externals/zexy/src/makealias.sh
index 43559ba658059e4b13afdc7a95b174a0819e7217..e6535af70696a15cb0df64078418c4e90a4821a9 100755
--- a/externals/zexy/src/makealias.sh
+++ b/externals/zexy/src/makealias.sh
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-EXTENSIONS=".pd -help.pd .pd_linux .pd_darwin .pd_freebsd .dll .b_i386 .l_ia64 .l_i386 .d_fat .d_i386 .d_ppc .m_i386" 
+EXTENSIONS=".pd -help.pd .pd_linux .pd_darwin .pd_freebsd .dll .b_i386 .l_ia64 .l_i386 .d_fat .d_i386 .d_ppc .m_i386"
 
 ALIASFILE=$1
 shift
diff --git a/externals/zexy/src/makesource.sh b/externals/zexy/src/makesource.sh
index f4e462956ccb08dfe834672ec96c688220166fde..d9f7ba88637e38082ea986853026684bdef62e69 100755
--- a/externals/zexy/src/makesource.sh
+++ b/externals/zexy/src/makesource.sh
@@ -1,71 +1,67 @@
 #!/bin/sh
 
-ZEXY_H=z_zexy.h
 ZEXY_C=z_zexy.c
 
-
-GREP=grep
-AWK=awk
-SED=sed
-
 #################################
 ## functions
 
-head_h() {
- echo "/* zexy-setup autogenerated header-file"
- echo " * generated by \"$0\""
- echo " * !! DO NOT MANUALLY EDIT  !!"
- echo " */"
- echo
- echo "#ifndef Z_ZEXY_H__"
- echo "#define Z_ZEXY_H__"
+mycolumn() {
+  cat
 }
+COLUMN=$(which column 2>/dev/null || echo mycolumn)
+
+head_c() {
+  cat <<EOL
+/* zexy-setup autogenerated setup-file
+ * generated by "$0"
+ * !! DO NOT MANUALLY EDIT  !!
+ */
 
-foot_h() {
- echo ""
- echo "void z_zexy_setup(void);"
- echo "#endif /* Z_ZEXY_H__ */"
- echo ""
+/* forward declarations */
+EOL
 }
 
-head_c() {
- echo "/* zexy-setup autogenerated setup-file"
- echo " * generated by \"$0\""
- echo " * !! DO NOT MANUALLY EDIT  !!"
- echo " */"
- echo 
- echo "#include \"$ZEXY_H\""
- echo
- echo "void z_zexy_setup(void)"
- echo "{"
+middle_c() {
+  cat <<EOL
+
+void z_zexy_setup(void)
+{
+EOL
 }
 
-foot_c() {
- echo "}"
- echo
+tail_c() {
+  cat <<EOL
+}
+EOL
 }
 
-setup_names() {
-find . -name "*.c" -not -name zexy.c -not -name z_zexy.c | sort | while read f; do
-  i=${f##*/}
-  i=${i%.c}
-  SETUPNAME=$(echo $i | sed -e "s/.*0x.*/setup_&/g" -e "s/~/_tilde/g" -e "/0x/! s/.*/&_setup/")
-  if grep -w ${SETUPNAME} $f > /dev/null; then
-    echo ${SETUPNAME} ${i}
-  fi
-done 
+get_setup_functions() {
+  find * -name "*.c" -not -name "* *" -exec grep ZEXY_SETUP {} + \
+  | sed -e 's|(.*||' -e 's|:.* | |' \
+  | LANG=C sort -u
 }
 
-##################################
-## body
-head_h > $ZEXY_H
-head_c > $ZEXY_C
+forward_declarations() {
+  get_setup_functions | while read file setup; do
+    echo "void ${setup}(void); /* ${file} */"
+  done
+}
+
+call_setup() {
+  get_setup_functions | while read file setup; do
+    echo "  ${setup}();"
+  done
+}
 
-setup_names | while read SETUPNAME i; do
- echo "void ${SETUPNAME}(void); /* $i */" >> $ZEXY_H
- echo "	${SETUPNAME}(); /* $i */" >> $ZEXY_C
-done
 
-foot_h >> $ZEXY_H
-foot_c >> $ZEXY_C
+##################################
+## body
+zexy_c() {
+  head_c
+  forward_declarations | "${COLUMN}" -t -c 76
+  middle_c
+  call_setup
+  tail_c
+}
 
+zexy_c | tee "${ZEXY_C}"
diff --git a/externals/zexy/src/makesymbol.c b/externals/zexy/src/makesymbol.c
index b92eb53a772fc07399983927b2ec78ced594f89c..03a62126d2c043aea7e8ed46d465e55eca138317 100644
--- a/externals/zexy/src/makesymbol.c
+++ b/externals/zexy/src/makesymbol.c
@@ -47,13 +47,13 @@
 
 /* ----------------------- makesymbol --------------------- */
 
-static t_class *makesymbol_class;
+static t_class *makesymbol_class=NULL;
 
 typedef struct _makesymbol {
   t_object x_obj;
   t_symbol *x_sym;
 
-  char* mask;
+  const char* mask;
   char* buf;
 } t_makesymbol;
 
@@ -70,7 +70,7 @@ static void reset_mask(t_makesymbol *x, t_symbol *s)
 
 typedef char cstring[MAXSTRINGLENG];
 
-static t_symbol* list2symbol(char *masque, int argc, t_atom *argv)
+static t_symbol* list2symbol(const char *masque, int argc, t_atom *argv)
 {
   cstring*buf=(cstring*)getbytes(MAXSTRINGARGS*sizeof(cstring));
   cstring buffer;
@@ -146,19 +146,16 @@ static void makesymbol_helper(t_makesymbol* UNUSED(x))
        "%s");
 }
 
-void makesymbol_setup(void)
+ZEXY_SETUP void makesymbol_setup(void)
 {
-  makesymbol_class = class_new(gensym("makesymbol"),
-                               (t_newmethod)makesymbol_new, (t_method)makesymbol_free,
-                               sizeof(t_makesymbol), 0, A_GIMME, 0);
+  makesymbol_class = zexy_new("makesymbol",
+                              makesymbol_new, makesymbol_free, t_makesymbol, 0, "*");
 
   class_addlist(makesymbol_class, makesymbol_list);
   class_addbang(makesymbol_class, makesymbol_bang);
 
-  class_addmethod(makesymbol_class, (t_method)reset_mask, gensym("sym1"),
-                  A_SYMBOL, 0);
+  zexy_addmethod(makesymbol_class, (t_method)reset_mask, "sym1", "s");
 
-  class_addmethod(makesymbol_class, (t_method)makesymbol_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(makesymbol_class, (t_method)makesymbol_helper, "help", "");
   zexy_register("makesymbol");
 }
diff --git a/externals/zexy/src/matchbox.c b/externals/zexy/src/matchbox.c
index 07899d9ec413578b0bcc2d673c10d80a54c5a83a..59ce26837e17de2b1f71b99149f4012fe94ab5d8 100644
--- a/externals/zexy/src/matchbox.c
+++ b/externals/zexy/src/matchbox.c
@@ -28,6 +28,7 @@
 
 
 #include "zexy.h"
+#include "zexy_strndup.h"
 
 #define MATCHBOX_EXACT 0
 #define MATCHBOX_OSC 1
@@ -47,7 +48,7 @@
 
 /* match the atoms of 2 lists */
 
-static t_class *matchbox_class;
+static t_class *matchbox_class=NULL;
 
 
 typedef struct _listlist {
@@ -212,8 +213,8 @@ static int OSC_PatternMatch (const char *  pattern, const char * test,
     }
   case ']'    :
   case '}'    :
-    z_verbose(1, "[matchbox]: spurious %c in OSC-pattern \".../%s/...\"",
-              pattern[0], theWholePattern);
+    verbose(1, "[matchbox]: spurious %c in OSC-pattern \".../%s/...\"",
+            pattern[0], theWholePattern);
     return FALSE;
   case '['    :
     return OSC_MatchBrackets (pattern,test, theWholePattern);
@@ -246,8 +247,8 @@ static int OSC_MatchBrackets (const char *pattern, const char *test,
   const char *p = pattern;
 
   if (pattern[1] == 0) {
-    z_verbose(1, "[matchbox]: unterminated [ in OSC-pattern \".../%s/...\"",
-              theWholePattern);
+    verbose(1, "[matchbox]: unterminated [ in OSC-pattern \".../%s/...\"",
+            theWholePattern);
     return FALSE;
   }
 
@@ -258,8 +259,8 @@ static int OSC_MatchBrackets (const char *pattern, const char *test,
 
   while (*p != ']') {
     if (*p == 0) {
-      z_verbose(1, "[matchbox]: unterminated [ in OSC-pattern \".../%s/...\"",
-                theWholePattern);
+      verbose(1, "[matchbox]: unterminated [ in OSC-pattern \".../%s/...\"",
+              theWholePattern);
       return FALSE;
     }
     if (p[1] == '-' && p[2] != 0) {
@@ -285,8 +286,8 @@ advance:
 
   while (*p != ']') {
     if (*p == 0) {
-      z_verbose(1, "[matchbox]: unterminated [ in OSC-pattern \".../%s/...\"",
-                theWholePattern);
+      verbose(1, "[matchbox]: unterminated [ in OSC-pattern \".../%s/...\"",
+              theWholePattern);
       return FALSE;
     }
     p++;
@@ -303,8 +304,8 @@ static int OSC_MatchList (const char *pattern, const char *test,
 
   for(restOfPattern = pattern; *restOfPattern != '}'; restOfPattern++) {
     if (*restOfPattern == 0) {
-      z_verbose(1, "[matchbox]: unterminated { in OSC-pattern \".../%s/...\"",
-                theWholePattern);
+      verbose(1, "[matchbox]: unterminated { in OSC-pattern \".../%s/...\"",
+              theWholePattern);
       return FALSE;
     }
   }
@@ -349,14 +350,16 @@ static int atommatch_osc(t_atom*pattern, t_atom*test)
   int result = FALSE;
 
   if(pattern->a_type==A_SYMBOL) {
-    s_pattern=pattern->a_w.w_symbol->s_name;
+    s_pattern=zexy_strndup(pattern->a_w.w_symbol->s_name, MAXPDSTRING);
+    pattern_size = strnlen(s_pattern, MAXPDSTRING);
   } else {
     pattern_size=sizeof(char)*MAXPDSTRING;
     s_pattern=(char*)getbytes(pattern_size);
     atom_string(pattern, s_pattern, pattern_size);
   }
   if(test->a_type==A_SYMBOL) {
-    s_test=test->a_w.w_symbol->s_name;
+    s_test=zexy_strndup(test->a_w.w_symbol->s_name, MAXPDSTRING);
+    test_size = strnlen(s_test, MAXPDSTRING);
   } else {
     test_size=sizeof(char)*MAXPDSTRING;
     s_test=(char*)getbytes(test_size);
@@ -398,7 +401,8 @@ static int atommatch_regex(regex_t*pattern,  t_atom*test)
   }
 
   if(test->a_type==A_SYMBOL) {
-    s_test=test->a_w.w_symbol->s_name;
+    s_test=zexy_strndup(test->a_w.w_symbol->s_name, MAXPDSTRING);
+    test_size = strnlen(s_test, MAXPDSTRING);
   } else {
     test_size=sizeof(char)*MAXPDSTRING;
     s_test=(char*)getbytes(test_size);
@@ -452,7 +456,8 @@ static t_listlist*matchlistlist_regex(unsigned int*numresults,
     int pattern_size=0;
     t_atom*pattern=p_argv+i;
     if(pattern->a_type==A_SYMBOL) {
-      s_pattern=pattern->a_w.w_symbol->s_name;
+      s_pattern=zexy_strndup(pattern->a_w.w_symbol->s_name, MAXPDSTRING);
+      pattern_size=strnlen(s_pattern, MAXPDSTRING);
     } else {
       pattern_size=sizeof(char)*MAXPDSTRING;
       s_pattern=(char*)getbytes(pattern_size);
@@ -460,7 +465,7 @@ static t_listlist*matchlistlist_regex(unsigned int*numresults,
     }
     regexpressions[i]=(regex_t*)getbytes(sizeof(regex_t));
     if(regcomp(regexpressions[i], s_pattern, flags)) {
-      z_verbose(1, "[matchbox]: invalid regular expression: %s", s_pattern);
+      verbose(1, "[matchbox]: invalid regular expression: %s", s_pattern);
       if(regexpressions[i]) {
         freebytes(regexpressions[i], sizeof(regex_t));
       }
@@ -593,7 +598,8 @@ static t_listlist*matchlistlist(unsigned int*numresults,
 }
 
 
-static void matchbox_list(t_matchbox*x, t_symbol*s, int argc, t_atom*argv)
+static void matchbox_list(t_matchbox*x, t_symbol*UNUSED(s), int argc,
+                          t_atom*argv)
 {
   unsigned int results=0;
   int mode=x->x_mode;
@@ -609,13 +615,14 @@ static void matchbox_list(t_matchbox*x, t_symbol*s, int argc, t_atom*argv)
   }
 }
 
-static void matchbox_add(t_matchbox*x, t_symbol*s, int argc, t_atom*argv)
+static void matchbox_add(t_matchbox*x, t_symbol*UNUSED(s), int argc,
+                         t_atom*argv)
 {
   /* 1st match, whether we already have this entry */
   if(matchlistlist(0, x->x_lists, argc, argv, MATCHBOX_EXACT, FALSE)) {
     /* already there, skip the rest */
-    z_verbose(1,
-              "[matchbox]: refusing to add already existing list to buffer...");
+    verbose(1,
+            "[matchbox]: refusing to add already existing list to buffer...");
     return;
   }
 
@@ -624,7 +631,7 @@ static void matchbox_add(t_matchbox*x, t_symbol*s, int argc, t_atom*argv)
   x->x_numlists++;
 }
 
-static void matchbox_delete(t_matchbox*x, t_symbol*s, int argc,
+static void matchbox_delete(t_matchbox*x, t_symbol*UNUSED(s), int argc,
                             t_atom*argv)
 {
   unsigned int results=0;
@@ -691,7 +698,7 @@ static void matchbox_mode(t_matchbox*x, t_symbol*s)
   }
 }
 
-static void *matchbox_new(t_symbol *s, int argc, t_atom*argv)
+static void *matchbox_new(t_symbol *UNUSED(s), int argc, t_atom*argv)
 {
   t_matchbox *x = (t_matchbox *)pd_new(matchbox_class);
 
@@ -724,36 +731,30 @@ static void matchbox_free(t_matchbox *x)
   x->x_lists=0;
 }
 
-static void matchbox_help(t_matchbox*x)
+static void matchbox_help(t_matchbox*UNUSED(x))
 {
   post("\n"HEARTSYMBOL " matchbox\t\t:: find a list in a pool of lists");
 }
 
-void matchbox_setup(void)
+ZEXY_SETUP void matchbox_setup(void)
 {
 #ifdef MATCHBOX_OSC
   post("matchbox: OSC-pattern matching code (c) Matt Wright, CNMAT");
 #endif /* MATCHBOX_OSC */
 
 
-  matchbox_class = class_new(gensym("matchbox"), (t_newmethod)matchbox_new,
-                             (t_method)matchbox_free, sizeof(t_matchbox), 0, A_GIMME, 0);
+  matchbox_class = zexy_new("matchbox",
+                            matchbox_new, matchbox_free, t_matchbox, 0, "*");
 
   class_addlist  (matchbox_class, matchbox_list);
 
-  class_addmethod(matchbox_class, (t_method)matchbox_add, gensym("add"),
-                  A_GIMME, 0);
-  class_addmethod(matchbox_class, (t_method)matchbox_delete,
-                  gensym("delete"), A_GIMME, 0);
-  class_addmethod(matchbox_class, (t_method)matchbox_clear, gensym("clear"),
-                  A_NULL, 0);
-  class_addmethod(matchbox_class, (t_method)matchbox_dump, gensym("dump"),
-                  A_NULL);
+  zexy_addmethod(matchbox_class, (t_method)matchbox_add, "add", "*");
+  zexy_addmethod(matchbox_class, (t_method)matchbox_delete, "delete", "*");
+  zexy_addmethod(matchbox_class, (t_method)matchbox_clear, "clear", "");
+  zexy_addmethod(matchbox_class, (t_method)matchbox_dump, "dump", "");
 
-  class_addmethod(matchbox_class, (t_method)matchbox_mode, gensym("mode"),
-                  A_SYMBOL, 0);
+  zexy_addmethod(matchbox_class, (t_method)matchbox_mode, "mode", "s");
 
-  class_addmethod(matchbox_class, (t_method)matchbox_help, gensym("help"),
-                  A_NULL);
+  zexy_addmethod(matchbox_class, (t_method)matchbox_help, "help", "");
   zexy_register("matchbox");
 }
diff --git a/externals/zexy/src/mavg.c b/externals/zexy/src/mavg.c
index 943dbb60378cef422865ab2c439e82b87077f2f2..9f45d8f61838018cc50179b24aff57651bcf0693 100644
--- a/externals/zexy/src/mavg.c
+++ b/externals/zexy/src/mavg.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *mavg_class;
+static t_class *mavg_class=NULL;
 
 typedef struct _mavg {
   t_object x_obj;
@@ -32,21 +32,25 @@ typedef struct _mavg {
 
 static void mavg_resize(t_mavg *x, t_float f)
 {
-  int i;
+  int i = (int)f;
   t_float *dumbuf;
 
-  f = (int)f;
-  if ((f<1) || (f == x->size)) {
+  if ((i<1) || (i == x->size)) {
     return;
   }
 
-  freebytes(x->buf, sizeof(t_float)*x->size);
-  x->n_inv = 1.0/f;
-  x->size = f;
-  x->buf = getbytes(sizeof(t_float)*x->size);
+  dumbuf = getbytes(sizeof(t_float)*i);
+  if(!dumbuf) {
+    pd_error(x, "unable to allocate memory for %d elements", i);
+    return;
+  }
+  if(x->buf) {
+    freebytes(x->buf, sizeof(t_float)*x->size);
+  }
+  x->buf = x->wp = dumbuf;
+  x->size = i;
+  x->n_inv = 1.0/(t_float)i;
 
-  dumbuf = x->wp = x->buf;
-  i = x->size;
   while(i--) {
     *dumbuf++ = x->avg;
   }
@@ -58,6 +62,9 @@ static void mavg_set(t_mavg *x, t_symbol* UNUSED(s), int argc,
   int i = x->size;
   t_float *dummy = x->buf;
   t_float f=(argc)?atom_getfloat(argv):x->avg;
+  if(!x->buf) {
+    return;
+  }
 
   while (i--) {
     *dummy++=f;
@@ -71,6 +78,9 @@ static void mavg_float(t_mavg *x, t_float f)
   int i = x->size;
   t_float dummy = 0;
   t_float *dumb = x->buf;
+  if(!x->buf) {
+    return;
+  }
 
   *x->wp++ = f;
   if (x->wp == x->buf + x->size) {
@@ -90,19 +100,15 @@ static void *mavg_new(t_floatarg f)
 {
   t_mavg *x = (t_mavg *)pd_new(mavg_class);
   int i = (f<1)?2:f;
-  t_float *dumbuf;
 
   outlet_new(&x->x_obj, gensym("float"));
   inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym(""));
+  x->size = 0;
+  x->buf = x->wp = NULL;
+  x->n_inv = 0.;
+  x->avg = 0.;
 
-  x->buf = x->wp = (t_float *)getbytes(sizeof(t_float) * i);
-  x->size = i;
-  x->n_inv = 1.0f/(t_float)i;
-
-  dumbuf = x->buf;
-  while (i--) {
-    *dumbuf++=0;
-  }
+  mavg_resize(x, i);
 
   return (x);
 }
@@ -112,17 +118,16 @@ static void mavg_help(void)
   post("mavg\t:: moving average filter");
 }
 
-void mavg_setup(void)
+ZEXY_SETUP void mavg_setup(void)
 {
-  mavg_class = class_new(gensym("mavg"), (t_newmethod)mavg_new, 0,
-                         sizeof(t_mavg), 0, A_DEFFLOAT, 0);
+  mavg_class = zexy_new("mavg",
+                        mavg_new, 0, t_mavg, 0, "F");
 
   class_addfloat(mavg_class, (t_method)mavg_float);
 
-  class_addmethod(mavg_class, (t_method)mavg_help, gensym("help"), 0);
-  class_addmethod(mavg_class, (t_method)mavg_set, gensym("set"), A_GIMME, 0);
-  class_addmethod(mavg_class, (t_method)mavg_resize, gensym(""), A_DEFFLOAT,
-                  0);
+  zexy_addmethod(mavg_class, (t_method)mavg_help, "help", "");
+  zexy_addmethod(mavg_class, (t_method)mavg_set, "set", "*");
+  zexy_addmethod(mavg_class, (t_method)mavg_resize, "", "F");
 
   zexy_register("mavg");
 }
diff --git a/externals/zexy/src/minmax.c b/externals/zexy/src/minmax.c
index 4dfb6f927b58417a3f7626ecf9e9bfa11b1945aa..39c4103b9d4d26d52d2971fb71c58097933f0017 100644
--- a/externals/zexy/src/minmax.c
+++ b/externals/zexy/src/minmax.c
@@ -20,7 +20,7 @@
 
 #include "zexy.h"
 
-static t_class *minmax_class;
+static t_class *minmax_class=NULL;
 
 typedef struct _minmax {
   t_object x_obj;
@@ -76,14 +76,14 @@ static void minmax_help(void)
   post("minmax\t:: get minimum and maximum of a list of floats");
 }
 
-void minmax_setup(void)
+ZEXY_SETUP void minmax_setup(void)
 {
-  minmax_class = class_new(gensym("minmax"), (t_newmethod)minmax_new, 0,
-                           sizeof(t_minmax), 0, A_DEFFLOAT, 0);
+  minmax_class = zexy_new("minmax",
+                          minmax_new, 0, t_minmax, 0, "");
 
   class_addlist(minmax_class, (t_method)minmax_list);
   class_addbang(minmax_class, (t_method)minmax_bang);
-  class_addmethod(minmax_class, (t_method)minmax_help, gensym("help"), 0);
+  zexy_addmethod(minmax_class, (t_method)minmax_help, "help", "");
 
   zexy_register("minmax");
 }
diff --git a/externals/zexy/src/msgfile.c b/externals/zexy/src/msgfile.c
index 9fa3604ca89de41b00e7d756175d2fae6f81ccd0..8fefdaaf17be12d3303ac14be3dbc22143f92604 100644
--- a/externals/zexy/src/msgfile.c
+++ b/externals/zexy/src/msgfile.c
@@ -42,17 +42,33 @@
 /* ****************************************************************************** */
 /* msgfile : save and load messages... */
 
-#define PD_MODE 0
-#define CR_MODE 1
-#define CSV_MODE 2
-/* modi
-   PD : separate items by ' '; seperate lines by ";\n"
-   looks like a PD-file
-   CR : separate items by ' '; seperate lines by " \n"
-   how you would expect a file to look like
-   CSV: separate items by ','; seperate lines by " \n"
-   spreadsheet: each argument gets its own column
-*/
+typedef enum {
+  /* PD
+   * separate items by whitespace (' ', '\t'), separate lines by ";"
+   * looks like a Pd-file */
+  FORMAT_PD = 0,
+  /* FUDI
+   * separate items by whitespace (' ', '\t'), separate lines by ";"
+   * looks like a Pd-file, but uses our own parser (to better handle escaped linebreaks) */
+  FORMAT_FUDI = 0,
+  /* CR
+   * separate items by whitespace (' ', '\t'), separate lines by linebreaks ("\n")
+   * how you would expect a file to look like
+   * (use Pd's parser that has some quirks with escaped linebreaks) */
+  FORMAT_CR,
+  /* TXT:
+   * separate items by whitespace (' ', '\t'), separate lines by "\n"
+   * how you would expect a file to look like
+   * (uses our own parser that handles escaped '\n' better!) */
+  FORMAT_TXT,
+  /* CSV: separate items by ','; separate lines by " \n"
+   * spreadsheet: each argument gets its own column
+   * with proper escaping of everything */
+  FORMAT_CSV,
+
+  /* illegal format */
+  FORMAT_ILLEGAL,
+} t_msgfile_format;
 
 
 typedef struct _msglist {
@@ -67,7 +83,7 @@ typedef struct _msgfile {
   t_object x_obj;              /* everything */
   t_outlet *x_secondout;        /* "done" */
 
-  int mode;
+  t_msgfile_format format;
 
   t_msglist *start;
 
@@ -81,7 +97,7 @@ typedef struct _msgfile {
 
 } t_msgfile;
 
-static t_class *msgfile_class;
+static t_class *msgfile_class=NULL;
 
 
 
@@ -94,7 +110,47 @@ static void msgfile_end(t_msgfile *x);
 static void msgfile_goto(t_msgfile *x, t_float f);
 
 /* ************************************************************************ */
-/* help functions                                                           */
+/* helper functions                                                         */
+
+static t_msgfile_format symbol2format(t_msgfile*x, t_symbol*s)
+{
+  if (!s || gensym("")==s) {
+    return x->format;
+  }
+  if (gensym("pd")==s) {
+    return FORMAT_PD;
+  }
+  if (gensym("fudi")==s) {
+    return FORMAT_FUDI;
+  }
+  if (gensym("cr")==s) {
+    return FORMAT_CR;
+  }
+  if (gensym("txt")==s) {
+    return FORMAT_TXT;
+  }
+  if (gensym("csv")==s) {
+    return FORMAT_CSV;
+  }
+  pd_error(x, "msgfile: ignoring unknown format: '%s'", s->s_name);
+  return x->format;
+}
+
+static int is_float(t_atom*a)
+{
+  return (a && A_FLOAT == a->a_type);
+}
+
+static int node_count(t_msgfile *x)
+{
+  t_msglist *dummy = x->start;
+  unsigned int counter = 0;
+  while (dummy && dummy->next) {
+    counter++;
+    dummy = dummy->next;
+  }
+  return counter;
+}
 
 static int node_wherearewe(t_msgfile *x)
 {
@@ -128,12 +184,14 @@ static void write_currentnode(t_msgfile *x, int ac, t_atom *av)
 
   newsize = cur->n + ac;
 
-  ap = (t_atom *)getbytes(newsize * sizeof(t_atom));
-  memcpy(ap, cur->thislist, cur->n * sizeof(t_atom));
-  cur->thislist = ap;
-  memcpy(cur->thislist + cur->n, av, ac * sizeof(t_atom));
+  ap = (t_atom*)resizebytes(cur->thislist, cur->n * sizeof(t_atom),
+                            newsize * sizeof(t_atom));
+  if (ap) {
+    cur->thislist = ap;
+    memcpy(cur->thislist + cur->n, av, ac * sizeof(t_atom));
 
-  cur->n = newsize;
+    cur->n = newsize;
+  }
 }
 
 static void delete_currentnode(t_msgfile *x)
@@ -271,14 +329,7 @@ static void delete_region(t_msgfile *x, int start, int stop)
   int newwhere, oldwhere = node_wherearewe(x);
 
   /* get the number of lists in the buffer */
-  t_msglist *dummy = x->start;
-  int counter = 0;
-
-  /* go to the end of the buffer */
-  while (dummy && dummy->next) {
-    counter++;
-    dummy = dummy->next;
-  }
+  int counter = node_count(x);
 
   if ((stop > counter) || (stop == -1)) {
     stop = counter;
@@ -332,25 +383,350 @@ static int atomcmp(t_atom *this, t_atom *that)
 }
 
 
-static void msgfile_binbuf2listbuf(t_msgfile *x, t_binbuf *bbuf)
+static t_atomtype str2atom(const char*atombuf, t_atom*ap,
+                           int force_symbol)
+{
+  if(!force_symbol) {
+    double f = 0;
+    unsigned int count=0;
+    int x = sscanf(atombuf, "%lg%n", &f, &count);
+    if(x && strlen(atombuf)==count) {
+      SETFLOAT(ap, f);
+      return A_FLOAT;
+    }
+  }
+  SETSYMBOL(ap, gensym(atombuf));
+  return A_SYMBOL;
+}
+
+static const char*parse_csv(const char*src, char dst[MAXPDSTRING],
+                            int *_eol, int*_quoted)
+{
+  size_t len = 0;
+  int quoted = (src[0] == '"');
+  *_eol = 0;
+  *_quoted = quoted;
+  if (quoted) {
+    src++;
+  }
+
+  while(*src) {
+    if (!quoted || '"' == src[0]) {
+      switch (src[quoted]) {
+      default:
+        break;
+      case '\n': /* EOL */
+        *_eol = 1;
+      /* fallthrough */
+      case ',': /* EOC */
+        if(len<MAXPDSTRING) {
+          dst[len++]=0;
+        }
+        dst[MAXPDSTRING-1] = 0;
+        return src+1+quoted;
+      case '"': /* quote */
+        if(quoted) {
+          src++;
+        }
+        break;
+      }
+    }
+    if(len<MAXPDSTRING) {
+      dst[len++]=*src;
+    }
+    src++;
+  }
+  dst[MAXPDSTRING-1] = 0;
+  return src;
+}
+
+static const char*parse_fudi(const char*src, char dst[MAXPDSTRING],
+                             int *_eol, int*_quoted)
 {
-  int ac = binbuf_getnatom(bbuf);
-  t_atom *ap = binbuf_getvec(bbuf);
+  size_t len = 0;
+  *_quoted = 0;
+  *_eol = 0;
+
+  while(*src) {
+    char c = *src++;
+    char c2;
+    switch (c) {
+    case '\\': /* quoting */
+      c2=c;
+      c=*src++;
+      switch(c) {
+      case ',':
+      case ';':
+      case '\t':
+      case ' ':
+      case '\n':
+      case '\r':
+        break;
+      default:
+        if(len<MAXPDSTRING) {
+          dst[len++]=c2;
+        }
+        break;
+      }
+      break;
+    case ';':
+      *_eol = 1;
+    case '\n':
+    case '\r': /* EOL/EOA */
+    case '\t':
+    case ' ':  /* EOA */
+      goto atomend;
+      break;
+    }
+    if(len<MAXPDSTRING) {
+      dst[len++]=c;
+    }
+  }
+atomend:
+  if(len<MAXPDSTRING) {
+    dst[len++]=0;
+  }
 
-  while (ac--) {
-    if (ap->a_type == A_SEMI) {
+  while(*src) {
+    switch(*src) {
+    /* skip remaining whitespace */
+    case '\n':
+    case '\r':
+    case ' ':
+    case '\t':
+      break;
+    default:
+      return src;
+    }
+    src++;
+  }
+  return src;
+}
+
+static const char*parse_txt(const char*src, char dst[MAXPDSTRING],
+                            int *_eol, int*_quoted)
+{
+  size_t len = 0;
+  *_quoted = 0;
+  *_eol = 0;
+
+  while(*src) {
+    char c = *src++;
+    char c2;
+    switch (c) {
+    case '\\': /* quoting */
+      c2=c;
+      c=*src++;
+      switch(c) {
+      case ',':
+      case ';':
+      case '\t':
+      case ' ':
+      case '\n':
+      case '\r':
+        break;
+      default:
+        if(len<MAXPDSTRING) {
+          dst[len++]=c2;
+        }
+        break;
+      }
+      break;
+    case '\n':
+    case '\r': /* EOL/EOA */
+      *_eol = 1;
+    case '\t':
+    case ' ':  /* EOA */
+      goto atomend;
+      break;
+    }
+    if(len<MAXPDSTRING) {
+      dst[len++]=c;
+    }
+  }
+atomend:
+  if(len<MAXPDSTRING) {
+    dst[len++]=0;
+  }
+
+  while(*src) {
+    switch(*src) {
+    /* skip remaining whitespace */
+    case '\n':
+    case '\r':
+      *_eol = 1;
+    case ' ':
+    case '\t':
+      break;
+    default:
+      return src;
+    }
+    src++;
+  }
+  return src;
+}
+
+typedef const char*(*t_parsefn)(const char*src, char dst[MAXPDSTRING],
+                                int *_eol, int*_symbol);
+
+static void msgfile_str2parse(t_msgfile *x, const char*src,
+                              t_parsefn parsefn)
+{
+  t_binbuf*bbuf=binbuf_new();
+  char atombuf[MAXPDSTRING + 1];
+  while(*src) {
+    int issymbol = 0;
+    int iseol = 0;
+    src = parsefn(src, atombuf, &iseol, &issymbol);
+    atombuf[MAXPDSTRING] = 0;
+    if(*atombuf) {
+      t_atom a;
+      str2atom(atombuf, &a, issymbol);
+      binbuf_add(bbuf, 1, &a);
+    }
+    if(iseol) {
+      t_atom*argv = binbuf_getvec(bbuf);
+      int argc =  binbuf_getnatom(bbuf);
       add_currentnode(x);
-    } else {
-      write_currentnode(x, 1, ap);
+      write_currentnode(x, argc, argv);
+      binbuf_clear(bbuf);
     }
-    ap++;
   }
 
+  do {
+    t_atom*argv = binbuf_getvec(bbuf);
+    int argc =  binbuf_getnatom(bbuf);
+    if(argc) {
+      add_currentnode(x);
+      write_currentnode(x, argc, argv);
+    }
+  } while(0);
+  binbuf_free(bbuf);
   delete_emptynodes(x);
 }
 
+static int nextsemi(t_atom*argv, int argc)
+{
+  int count = 0;
+  for(count=0; count<argc; count++) {
+    if (A_SEMI==argv[count].a_type) {
+      return count + 1;
+    }
+  }
+  return 0;
+}
 
+static void msgfile_addbinbuf(t_msgfile *x, t_binbuf*bbuf)
+{
+  t_atom*argv = binbuf_getvec(bbuf);
+  int argc =  binbuf_getnatom(bbuf);
 
+  while(argc>0) {
+    int next = nextsemi(argv, argc);
+    if(next>1) {
+      add_currentnode(x);
+      write_currentnode(x, next-1, argv);
+    } else if (next<1) {
+      add_currentnode(x);
+      write_currentnode(x, argc, argv);
+      break;
+    }
+    argv+=next;
+    argc-=next;
+  }
+  delete_emptynodes(x);
+}
+
+static char* escape_pd(const char*src, char*dst)
+{
+  /* ',' -> '\,'; ' ' -> '\ ' */
+  char*dptr = dst;
+  while(*src) {
+    switch(*src) {
+    default:
+      break;
+#if 0
+    /* Pd already escapes these for us... */
+    case ',':
+    case ';':
+#endif
+    case ' ':
+    case '\n':
+    case '\r':
+    case '\t':
+      *dptr++ = '\\';
+      break;
+    case 0:
+      *dptr++ = 0;
+      return dst;
+    }
+    *dptr++=*src++;
+  }
+  *dptr++ = 0;
+  return dst;
+}
+static char* escape_csv(const char*src, char*dst)
+{
+  /* if there are special characters in the string, quote everything */
+  int needsquotes = 0;
+  const char*sptr;
+  char*dptr = dst;
+  for(sptr = src; *sptr; sptr++) {
+    switch(*sptr) {
+    default:
+      break;
+    case ',':
+    case '"':
+    case '\n':
+      needsquotes = 1;
+      break;
+    }
+    if(needsquotes) {
+      break;
+    }
+  }
+  if (needsquotes) {
+    *dptr++ = '"';
+  }
+
+  for(sptr = src; *sptr; sptr++) {
+    switch(*sptr) {
+    default:
+      break;
+
+    /* unescape "\," and "\;" */
+    case '\\':
+      switch(sptr[1]) {
+      default:
+        break;
+      case ',':
+      case ';':
+      case '\\':
+        sptr++;
+        break;
+      }
+      break;
+    }
+
+    /* escape quotes */
+    switch(*sptr) {
+    default:
+      break;
+    case '"':
+      *dptr++ = '"';
+      break;
+    }
+    *dptr++=*sptr;
+  }
+
+  if (needsquotes) {
+    *dptr++ = '"';
+  }
+  *dptr++ = 0;
+  return dst;
+}
+
+typedef char*(*t_escapefn)(const char*src, char*dst);
 
 
 /* ************************************************************************ */
@@ -427,10 +803,31 @@ static void msgfile_clear(t_msgfile *x)
   }
 }
 
-static void msgfile_delete(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static int atom2rangeint(t_atom*a, int range)
 {
+  t_float f = atom_getfloat(a);
+  if (f>range) {
+    return range;
+  }
+  if (f<-range) {
+    return -range;
+  }
+  return (unsigned int)f;
+}
+static void msgfile_delete(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                           t_atom *av)
+{
+  int count = node_count(x);
+  int pos = atom2rangeint(av+0, count);
+  if (!is_float(av)) {
+    pd_error(x, "[msgfile] illegal deletion index %s",
+             atom_getsymbol(av)->s_name);
+    return;
+  }
+  if (count<1) {
+    return;
+  }
   if (ac==1) {
-    int pos = atom_getfloat(av);
     int oldwhere = node_wherearewe(x);
 
     if (pos<0) {
@@ -443,8 +840,13 @@ static void msgfile_delete(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
     delete_currentnode(x);
     msgfile_goto(x, oldwhere);
   } else if (ac==2) {
-    int pos1 = atom_getfloat(av++);
-    int pos2 = atom_getfloat(av);
+    int pos1 = pos;
+    int pos2 = atom2rangeint(av+1, count);
+    if (!is_float(av+1)) {
+      pd_error(x, "[msgfile] illegal deletion range %s",
+               atom_getsymbol(av+1)->s_name);
+      return;
+    }
 
     if ((pos1 < pos2) || (pos2 == -1)) {
       if (pos2+1) {
@@ -461,13 +863,15 @@ static void msgfile_delete(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
   }
 }
 
-static void msgfile_add(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_add(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                        t_atom *av)
 {
   msgfile_end(x);
   add_currentnode(x);
   write_currentnode(x, ac, av);
 }
-static void msgfile_add2(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_add2(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                         t_atom *av)
 {
   msgfile_end(x);
   if (x->current) {
@@ -483,7 +887,8 @@ static void msgfile_add2(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
     x->current = x->current->next;
   }
 }
-static void msgfile_append(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_append(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                           t_atom *av)
 {
   add_currentnode(x);
   write_currentnode(x, ac, av);
@@ -500,14 +905,16 @@ static void msgfile_append2(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
     msgfile_append(x, s, ac, av);
   }
 }
-static void msgfile_insert(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_insert(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                           t_atom *av)
 {
   t_msglist *cur = x->current;
   insert_currentnode(x);
   write_currentnode(x, ac, av);
   x->current = cur;
 }
-static void msgfile_insert2(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_insert2(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                            t_atom *av)
 {
   t_msglist *cur = x->current;
   if ((x->current) && (x->current->previous)) {
@@ -523,7 +930,8 @@ static void msgfile_set(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
   msgfile_add(x, s, ac, av);
 }
 
-static void msgfile_replace(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_replace(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                            t_atom *av)
 {
   if(x->current) {
     if(x->current->thislist) {
@@ -600,7 +1008,8 @@ static void msgfile_bang(t_msgfile *x)
   }
 }
 
-static void msgfile_find(t_msgfile *x, t_symbol *s, int ac, t_atom *av)
+static void msgfile_find(t_msgfile *x, t_symbol *UNUSED(s), int ac,
+                         t_atom *av)
 {
   t_msglist *found = 0;
   t_msglist *cur=x->current;
@@ -663,8 +1072,8 @@ static void msgfile_where(t_msgfile *x)
 static void msgfile_sort(t_msgfile *x, t_symbol *s0, t_symbol*s1,
                          t_symbol*r)
 {
-  post("sorting not implemented yet: '%s', '%s' -> '%s'", s0->s_name,
-       s1->s_name, r->s_name);
+  pd_error(x, "sorting not implemented yet: '%s', '%s' -> '%s'", s0->s_name,
+           s1->s_name, r->s_name);
 
 
 #if 0
@@ -707,47 +1116,76 @@ static void msgfile_sort(t_msgfile *x, t_symbol *s0, t_symbol*s1,
 /* file I/O                           */
 
 static void msgfile_read2(t_msgfile *x, t_symbol *filename,
-                          t_symbol *format)
+                          t_symbol *sformat)
 {
   int rmode = 0;
 
   int fd=0;
   FILE*fil=NULL;
-  long readlength, length, pos;
+  long readlength, length;
   char filnam[MAXPDSTRING];
   char buf[MAXPDSTRING], *bufptr, *readbuf;
-  char *charbinbuf=NULL, *cbb;
-  int charbinbuflength=0;
-  char*dirname=canvas_getdir(x->x_canvas)->s_name;
+  const char*dirname=canvas_getdir(x->x_canvas)->s_name;
+  t_parsefn parsefn = 0;
 
-  int mode = x->mode;
-  char separator, eol;
-
-  t_binbuf *bbuf = binbuf_new();
+  t_msgfile_format format = symbol2format(x, sformat);
 
 #ifdef __WIN32__
   rmode |= O_BINARY;
 #endif
 
+  switch(format) {
+  case FORMAT_CSV:
+    parsefn = parse_csv;
+    break;
+  case FORMAT_TXT:
+    parsefn = parse_txt;
+    break;
+  case FORMAT_FUDI:
+    parsefn = parse_fudi;
+    break;
+  default:
+    parsefn = 0;
+  }
+
+  if( !parsefn ) {
+    /* use Pd's own parser
+     * this gives somewhat weird results with escaped LF,
+     * but is consistent with how [textfile] reads the data
+     */
+    t_binbuf*bbuf = binbuf_new();
+    binbuf_read_via_canvas(bbuf, filename->s_name, x->x_canvas,
+                           (FORMAT_CR == format));
+    msgfile_addbinbuf(x, bbuf);
+    binbuf_free(bbuf);
+    return;
+  }
+
+  /* cannot use Pd's binbuf parser, so we do our own thing */
+
   fd = open_via_path(dirname,
                      filename->s_name, "", buf, &bufptr, MAXPDSTRING, 0);
 
   if (fd < 0) {
     /* open via path failed, fall back */
-    fd=z_open(filename->s_name, rmode);
+    fd=sys_open(filename->s_name, rmode);
     if(fd < 0) {
       pd_error(x, "can't open in %s/%s",  dirname, filename->s_name);
       return;
     } else {
-      z_close(fd);
-      sprintf(filnam, "%s", filename->s_name);
+      sys_close(fd);
+      snprintf(filnam, MAXPDSTRING, "%s", filename->s_name);
     }
   } else {
-    z_close(fd);
-    sprintf(filnam, "%s/%s", buf, bufptr);
+    sys_close(fd);
+    if(snprintf(filnam, MAXPDSTRING, "%s/%s", buf, bufptr) < 0) {
+      pd_error(x, "can't create in '%s/%s'",  buf, bufptr);
+      return;
+    }
   }
+  filnam[MAXPDSTRING-1]=0;
 
-  fil=z_fopen(filnam, "rb");
+  fil=sys_fopen(filnam, "rb");
   if(fil==NULL) {
     pd_error(x, "could not open '%s'", filnam);
     return;
@@ -756,95 +1194,30 @@ static void msgfile_read2(t_msgfile *x, t_symbol *filename,
   length=ftell(fil);
   fseek(fil, 0, SEEK_SET);
 
-  if (!(readbuf = t_getbytes(length))) {
+  if (!(readbuf = t_getbytes(length+1))) {
     pd_error(x, "msgfile_read: could not reserve %ld bytes to read into",
              length);
-    z_fclose(fil);
+    sys_fclose(fil);
     return;
   }
 
-  if (gensym("cr")==format) {
-    mode = CR_MODE;
-  } else if (gensym("csv")==format) {
-    mode = CSV_MODE;
-  } else if (gensym("pd")==format) {
-    mode = PD_MODE;
-  } else if (*format->s_name) {
-    pd_error(x, "msgfile_read: unknown flag: %s", format->s_name);
-  }
-
-  switch (mode) {
-  case CR_MODE:
-    separator = ' ';
-    eol = '\n';
-    break;
-  case CSV_MODE:
-    separator = ',';
-    eol = ' ';
-    break;
-  default:
-    separator = '\n';
-    eol = ';';
-    break;
-  }
-
   /* read */
   if ((readlength = fread(readbuf, sizeof(char), length, fil)) < length) {
     pd_error(x, "msgfile_read: unable to read %s: %ld of %ld", filnam,
              readlength, length);
-    z_fclose(fil);
-    t_freebytes(readbuf, length);
+    sys_fclose(fil);
+    t_freebytes(readbuf, length+1);
     return;
   }
-
   /* close */
-  z_fclose(fil);
-
-  /* convert separators and eols to what pd expects in a binbuf*/
-  bufptr=readbuf;
-
-# define MSGFILE_HEADROOM 1024
-  charbinbuflength=2*length+MSGFILE_HEADROOM;
-
-  charbinbuf=(char*)getbytes(charbinbuflength);
-
-  cbb=charbinbuf;
-  for(pos=0; pos<charbinbuflength; pos++) {
-    charbinbuf[pos]=0;
-  }
-
-  *cbb++=';';
-  pos=1;
-  while (readlength--) {
-    if(pos>=charbinbuflength) {
-      pd_error(x, "msgfile: read error (headroom %d too small!)",
-               MSGFILE_HEADROOM);
-      goto read_error;
-      break;
-    }
-    if (*bufptr == separator) {
-      *cbb = ' ';
-    } else if (*bufptr==eol) {
-      *cbb++=';';
-      pos++;
-      *cbb='\n';
-    } else {
-      *cbb=*bufptr;
-    }
+  sys_fclose(fil);
 
-    bufptr++;
-    cbb++;
-    pos++;
-  }
+  /* we overallocated readbuf by 1, so we can store a terminating 0 */
+  readbuf[length] = 0;
 
-  /* convert to binbuf */
-  binbuf_text(bbuf, charbinbuf, charbinbuflength);
-  msgfile_binbuf2listbuf(x, bbuf);
+  msgfile_str2parse(x, readbuf, parsefn);
 
-read_error:
-  binbuf_free(bbuf);
-  t_freebytes(readbuf, length);
-  t_freebytes(charbinbuf, charbinbuflength);
+  t_freebytes(readbuf, length+1);
 }
 static void msgfile_read(t_msgfile *x, t_symbol *filename,
                          t_symbol *format)
@@ -853,48 +1226,31 @@ static void msgfile_read(t_msgfile *x, t_symbol *filename,
   msgfile_read2(x, filename, format);
 }
 
+
 static void msgfile_write(t_msgfile *x, t_symbol *filename,
-                          t_symbol *format)
+                          t_symbol *sformat)
 {
   char buf[MAXPDSTRING];
-  t_binbuf *bbuf = binbuf_new();
   t_msglist *cur = x->start;
 
-  char *mytext = 0, *dumtext;
   char filnam[MAXPDSTRING];
-  int textlen = 0, i;
-
   char separator, eol;
-  int mode = x->mode;
+  t_msgfile_format format = symbol2format(x, sformat);
+  int errcount = 0;
+  t_escapefn escapefn = escape_pd;
 
   FILE *f=0;
 
-  while(cur) {
-    binbuf_add(bbuf, cur->n, cur->thislist);
-    binbuf_addsemi(bbuf);
-    cur = cur->next;
-  }
-
-  if(format&&gensym("")!=format) {
-    if(gensym("cr")==format) {
-      mode = CR_MODE;
-    } else if(gensym("csv")==format) {
-      mode = CSV_MODE;
-    } else if(gensym("pd")==format) {
-      mode = PD_MODE;
-    } else if(format&&format->s_name) {
-      pd_error(x, "msgfile_write: ignoring unknown flag: %s", format->s_name);
-    }
-  }
-
-  switch (mode) {
-  case CR_MODE:
+  switch (format) {
+  case FORMAT_TXT:
+  case FORMAT_CR:
     separator = ' ';
-    eol = ' ';
+    eol = 0;
     break;
-  case CSV_MODE:
+  case FORMAT_CSV:
     separator = ',';
-    eol = ' ';
+    eol = 0;
+    escapefn = escape_csv;
     break;
   default:
     separator = ' ';
@@ -902,37 +1258,54 @@ static void msgfile_write(t_msgfile *x, t_symbol *filename,
     break;
   }
 
-  binbuf_gettext(bbuf, &mytext, &textlen);
-  dumtext = mytext;
-  i = textlen;
-
-  while(i--) {
-    if (*dumtext==' ') {
-      *dumtext=separator;
-    } else if ((*dumtext==';') && (dumtext[1]=='\n')) {
-      *dumtext = eol;
-    }
-    dumtext++;
-  }
 
   /* open */
   canvas_makefilename(x->x_canvas, filename->s_name,
                       buf, MAXPDSTRING);
   sys_bashfilename(buf, filnam);
-  if (!(f = z_fopen(filnam, "w"))) {
+  f = sys_fopen(filnam, "w");
+  if (!f) {
     pd_error(x, "msgfile : failed to open %s", filnam);
-  } else {
-    /* write */
-    if (fwrite(mytext, textlen*sizeof(char), 1, f) < 1) {
-      pd_error(x, "msgfile : failed to write %s", filnam);
-    }
+    return;
   }
-  /* close */
-  if (f) {
-    z_fclose(f);
+
+  for(cur = x->start; cur; cur=cur->next) {
+    int i;
+    for(i=0; i<cur->n; i++) {
+      t_atom*a = cur->thislist + i;
+      switch(a->a_type) {
+      case A_FLOAT:
+        errcount += (fprintf(f, "%g", atom_getfloat(a)) < 1);
+        break;
+      case A_POINTER:
+        errcount += (fprintf(f, "%p", a->a_w.w_gpointer) < 1);
+        break;
+      default: {
+        int mylen = 0;
+        char mytext[MAXPDSTRING];
+        char mytext2[MAXPDSTRING*2];
+        atom_string(a, mytext, MAXPDSTRING);
+        escapefn(mytext, mytext2);
+        mylen = strnlen(mytext2, MAXPDSTRING);
+        errcount += (fwrite(mytext2, mylen, sizeof(char), f) < 1);
+      }
+      }
+      if(i + 1 < cur->n) {
+        errcount += (fwrite(&separator, sizeof(char), 1, f) < 1);
+      }
+    }
+    if(eol) {
+      errcount += (fwrite(&eol, sizeof(char), 1, f) < 1);
+    }
+    errcount += (fwrite("\n", sizeof(char), 1, f) < 1);
   }
 
-  binbuf_free(bbuf);
+  if (errcount > 0) {
+    pd_error(x, "msgfile : failed to write '%s': % d errors", filnam,
+             errcount);
+  }
+  /* close */
+  sys_fclose(f);
 }
 
 /* ********************************** */
@@ -947,8 +1320,8 @@ static void msgfile_print(t_msgfile *x)
   while (cur) {
     t_msglist *dum=cur;
     int i;
-    j++;
     startpost("line %d:", j);
+    j++;
     for (i = 0; i < dum->n; i++) {
       t_atom *a = dum->thislist + i;
       postatom(1, a);
@@ -958,7 +1331,7 @@ static void msgfile_print(t_msgfile *x)
   }
 }
 
-static void msgfile_help(t_msgfile *x)
+static void msgfile_help(t_msgfile *UNUSED(x))
 {
   post("\n"HEARTSYMBOL " msgfile\t:: handle and store files of lists");
   post("goto <n>\t: goto line <n>"
@@ -984,10 +1357,10 @@ static void msgfile_help(t_msgfile *x)
        "\nfind <list>\t: search for <list>"
        "\nread <file> [<format>]\t: read <file> as <format>"
        "\nwrite <file> [<format>]\t: write <file> as <format>"
-       "\n\t\t: valid <formats> are\t: PD, CR, CSV"
+       "\n\t\t: valid <formats> are\t: pd, cr, fudi, txt, csv"
        "\n\nprint\t\t: show buffer (for debugging)"
        "\nhelp\t\t: show this help");
-  post("creation: \"msgfile [<format>]\": <format> defines fileaccess-mode(default is PD)");
+  post("creation: \"msgfile [<format>]\": <format> defines fileaccess-mode(default is 'pd')");
 }
 static void msgfile_free(t_msgfile *x)
 {
@@ -995,7 +1368,7 @@ static void msgfile_free(t_msgfile *x)
   freebytes(x->current, sizeof(t_msglist));
 }
 
-static void *msgfile_new(t_symbol *s, int argc, t_atom *argv)
+static void *msgfile_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
 {
   t_msgfile *x = (t_msgfile *)pd_new(msgfile_class);
 
@@ -1004,19 +1377,10 @@ static void *msgfile_new(t_symbol *s, int argc, t_atom *argv)
   x->start   = 0;
   x->previous= 0;
 
-  x->mode=PD_MODE; /* that's the default */
+  x->format=FORMAT_PD; /* that's the default */
 
   if ((argc==1) && (argv->a_type == A_SYMBOL)) {
-    t_symbol*mode=atom_getsymbol(argv);
-    if      (gensym("cr") == mode) {
-      x->mode = CR_MODE;
-    } else if (gensym("csv")== mode) {
-      x->mode = CSV_MODE;
-    } else if (gensym("pd") == mode) {
-      x->mode = PD_MODE;
-    } else {
-      pd_error(x, "msgfile: unknown argument %s", argv->a_w.w_symbol->s_name);
-    }
+    x->format = symbol2format(x, atom_getsymbol(argv));
   }
 
   outlet_new(&x->x_obj, gensym("list"));
@@ -1029,74 +1393,49 @@ static void *msgfile_new(t_symbol *s, int argc, t_atom *argv)
   return (x);
 }
 
-void msgfile_setup(void)
+ZEXY_SETUP void msgfile_setup(void)
 {
-  msgfile_class = class_new(gensym("msgfile"), (t_newmethod)msgfile_new,
-                            (t_method)msgfile_free, sizeof(t_msgfile), 0, A_GIMME, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_goto, gensym("goto"),
-                  A_DEFFLOAT, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_rewind, gensym("rewind"),
-                  0);
-  class_addmethod(msgfile_class, (t_method)msgfile_rewind, gensym("begin"),
-                  0);
-  class_addmethod(msgfile_class, (t_method)msgfile_end, gensym("end"), 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_next, gensym("next"),
-                  A_DEFFLOAT, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_prev, gensym("prev"),
-                  A_DEFFLOAT, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_skip, gensym("skip"),
-                  A_DEFFLOAT, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_set, gensym("set"),
-                  A_GIMME, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_clear, gensym("clear"),
-                  0);
-  class_addmethod(msgfile_class, (t_method)msgfile_delete, gensym("delete"),
-                  A_GIMME, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_add, gensym("add"),
-                  A_GIMME, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_add2, gensym("add2"),
-                  A_GIMME, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_append, gensym("append"),
-                  A_GIMME, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_append2,
-                  gensym("append2"), A_GIMME, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_insert, gensym("insert"),
-                  A_GIMME, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_insert2,
-                  gensym("insert2"), A_GIMME, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_replace,
-                  gensym("replace"), A_GIMME, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_find, gensym("find"),
-                  A_GIMME, 0);
-
-  class_addmethod(msgfile_class, (t_method)msgfile_read, gensym("read"),
-                  A_SYMBOL, A_DEFSYM, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_read2, gensym("read2"),
-                  A_SYMBOL, A_DEFSYM, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_write, gensym("write"),
-                  A_SYMBOL, A_DEFSYM, 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_print, gensym("print"),
-                  0);
-  class_addmethod(msgfile_class, (t_method)msgfile_flush, gensym("flush"),
-                  0);
+  msgfile_class = zexy_new("msgfile",
+                           msgfile_new, msgfile_free, t_msgfile, 0, "*");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_goto, "goto", "F");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_rewind, "rewind", "");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_rewind, "begin", "");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_end, "end", "");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_next, "next", "F");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_prev, "prev", "F");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_skip, "skip", "F");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_set, "set", "*");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_clear, "clear", "");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_delete, "delete", "*");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_add, "add", "*");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_add2, "add2", "*");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_append, "append", "*");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_append2, "append2", "*");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_insert, "insert", "*");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_insert2, "insert2", "*");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_replace, "replace", "*");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_find, "find", "*");
+
+  zexy_addmethod(msgfile_class, (t_method)msgfile_read, "read", "sS");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_read2, "read2", "sS");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_write, "write", "sS");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_print, "print", "");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_flush, "flush", "");
 
   class_addbang(msgfile_class, msgfile_bang);
-  class_addmethod(msgfile_class, (t_method)msgfile_this, gensym("this"), 0);
-  class_addmethod(msgfile_class, (t_method)msgfile_where, gensym("where"),
-                  0);
+  zexy_addmethod(msgfile_class, (t_method)msgfile_this, "this", "");
+  zexy_addmethod(msgfile_class, (t_method)msgfile_where, "where", "");
 
 
-  class_addmethod(msgfile_class, (t_method)msgfile_sort, gensym("sort"),
-                  A_SYMBOL, A_SYMBOL, A_SYMBOL, 0);
+  zexy_addmethod(msgfile_class, (t_method)msgfile_sort, "sort", "sss");
 
-  class_addmethod(msgfile_class, (t_method)msgfile_help, gensym("help"), 0);
+  zexy_addmethod(msgfile_class, (t_method)msgfile_help, "help", "");
 
   zexy_register("msgfile");
 }
diff --git a/externals/zexy/src/multiline~.c b/externals/zexy/src/multiline~.c
index fea4f3d2218fc0d8c07d6993fce576c65da7a957..e89ff11f6db02b8b9eead0cc8e5333ced5840719 100644
--- a/externals/zexy/src/multiline~.c
+++ b/externals/zexy/src/multiline~.c
@@ -38,7 +38,7 @@
 
 /* --------------------------- multiline~ ---------------------------------- */
 
-static t_class *mline_class;
+static t_class *mline_class=NULL;
 
 typedef struct _mline {
   t_object x_obj;
@@ -211,7 +211,7 @@ static void mline_dsp(t_mline *x, t_signal **sp)
   }
 
   x->msec2tick = sp[0]->s_sr / (1000.f * sp[0]->s_n);
-  dsp_add(mline_perform, 2, x, (t_int)sp[0]->s_n);
+  dsp_add(mline_perform, 2, x, sp[0]->s_n);
 }
 
 
@@ -233,12 +233,9 @@ static void *mline_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 {
   t_mline *x = (t_mline *)pd_new(mline_class);
   int i;
-  t_atom sane_default[1];
 
   if (!argc) {
     argc = 1;
-    SETFLOAT(sane_default, 0.);
-    argv = sane_default;
     x->time = 0;
   } else {
     x->time = atom_getfloat(argv+argc-1);
@@ -288,25 +285,23 @@ static void *mline_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 }
 
 
-static void mline_help(t_mline*x)
+static void mline_help(t_mline*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " multiline~\t:: ramped multiplication of multiple signals");
+  post("\n"HEARTSYMBOL
+       " multiline~\t:: ramped multiplication of multiple signals");
 }
 
-void multiline_tilde_setup(void)
+ZEXY_SETUP void multiline_tilde_setup(void)
 {
-  mline_class = class_new(gensym("multiline~"), (t_newmethod)mline_new,
-                          (t_method)mline_free,
-                          sizeof(t_mline), 0, A_GIMME, 0);
+  mline_class = zexy_new("multiline~",
+                         mline_new, mline_free, t_mline, 0, "*");
 
-  class_addmethod(mline_class, (t_method)mline_dsp, gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod(mline_class, nullfn, gensym("signal"), 0);
+  zexy_addmethod(mline_class, (t_method)mline_dsp, "dsp", "!");
+  zexy_addmethod(mline_class, (t_method)nullfn, "signal", "");
 
-  class_addmethod(mline_class, (t_method)mline_list, gensym(""), A_GIMME, 0);
-  class_addmethod(mline_class, (t_method)mline_stop, gensym("stop"), 0);
+  zexy_addmethod(mline_class, (t_method)mline_list, "", "*");
+  zexy_addmethod(mline_class, (t_method)mline_stop, "stop", "");
 
-  class_addmethod  (mline_class, (t_method)mline_help, gensym("help"),
-                    A_NULL);
+  zexy_addmethod(mline_class, (t_method)mline_help, "help", "");
   zexy_register("multiline_tilde");
 }
diff --git a/externals/zexy/src/multiplex.c b/externals/zexy/src/multiplex.c
index 24faeea8a136b68af3a9c911f0d17f3719d96b35..264c3d1d96bbe4ec6ea33badfe048e53b194e5d7 100644
--- a/externals/zexy/src/multiplex.c
+++ b/externals/zexy/src/multiplex.c
@@ -23,8 +23,9 @@
 /*
  * THINK: should the selector-inlet be the first or the last ???
  * pros/cons:
- *  the 1st inlet being the selector is not consistant with pd (hot/cold)
- *   but as it since the hot inlet is selectable, the whole object is not really consitant
+ *  the 1st inlet being the selector is not consistent with pd (hot/cold)
+ *   but it since the hot inlet is selectable, the whole object is not really
+ *   consistent
  *  numbering would have to start with 1 (for the 1st not-leftmost inlet)
  * if the selector is rightmost this would mean: cold is right(most), hot is (somewhere) left
  * numbering would be ok
@@ -43,15 +44,15 @@
   a multiplexer
 */
 
-static t_class *mux_class;
-static t_class *muxproxy_class;
+static t_class *mux_class=NULL;
+static t_class *muxproxy_class=NULL;
 
 typedef struct _mux {
   t_object x_obj;
   struct _muxproxy  **x_proxy;
 
   int i_count;
-  int i_selected;
+  t_float f_selected;
   t_inlet **in;
 } t_mux;
 
@@ -62,26 +63,21 @@ typedef struct _muxproxy {
   int id;
 } t_muxproxy;
 
-static void mux_select(t_mux *x, t_float f)
-{
-  x->i_selected=f;
-}
-
 static void mux_anything(t_muxproxy *y, t_symbol *s, int argc,
                          t_atom *argv)
 {
   t_mux*x=y->p_master;
-  if(y->id==x->i_selected) {
+  if(y->id==(int)x->f_selected) {
     outlet_anything(x->x_obj.ob_outlet, s, argc, argv);
   }
 }
 
-static void *mux_new(t_symbol *s, int argc, t_atom *argv)
+static void *mux_new(t_symbol *UNUSED(s), int argc, t_atom *UNUSED(argv))
 {
   int n = (argc < 2)?2:argc;
   t_mux *x = (t_mux *)pd_new(mux_class);
 
-  x->i_selected=0;
+  x->f_selected=0;
   x->i_count = n;
   x->in = (t_inlet **)getbytes(x->i_count * sizeof(t_inlet *));
   x->x_proxy = (t_muxproxy**)getbytes(x->i_count * sizeof(t_muxproxy*));
@@ -93,7 +89,7 @@ static void *mux_new(t_symbol *s, int argc, t_atom *argv)
     x->in[n] = inlet_new ((t_object*)x, (t_pd*)x->x_proxy[n], 0,0);
   }
 
-  inlet_new(&x->x_obj, &x->x_obj.ob_pd, gensym("float"), gensym(""));
+  floatinlet_new(&x->x_obj, &x->f_selected);
 
   outlet_new(&x->x_obj, 0);
   return (x);
@@ -124,27 +120,26 @@ static void mux_free(t_mux*x)
 
   /* pd_free(&y->p_pd); */
 }
-
-void multiplex_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class*c = zexy_new(name,
+                       mux_new, mux_free, t_mux, CLASS_NOINLET, "*");
+  return c;
+}
+static void dosetup()
 {
-  mux_class = class_new(gensym("multiplex"), (t_newmethod)mux_new,
-                        (t_method)mux_free, sizeof(t_mux), CLASS_NOINLET, A_GIMME,  0);
-  class_addcreator((t_newmethod)mux_new, gensym("mux"), A_GIMME, 0);
-
-  class_addmethod   (mux_class, (t_method)mux_select, gensym(""), A_DEFFLOAT,
-                     0);
-
-  muxproxy_class = class_new(0, 0, 0,
-                             sizeof(t_muxproxy),
-                             CLASS_PD | CLASS_NOINLET, 0);
-  class_addanything(muxproxy_class, mux_anything);
-
-
   zexy_register("multiplex");
+  mux_class=zclass_setup("multiplex");
+  zclass_setup("mux");
+  muxproxy_class = zexy_new("multiplex proxy",
+                            0, 0, t_muxproxy, CLASS_PD | CLASS_NOINLET, "");
+  class_addanything(muxproxy_class, mux_anything);
+}
+ZEXY_SETUP void multiplex_setup(void)
+{
+  dosetup();
 }
-
 void mux_setup(void)
 {
-  multiplex_setup();
+  dosetup();
 }
-
diff --git a/externals/zexy/src/multiplex~.c b/externals/zexy/src/multiplex~.c
index 86de9c5604a5a1154508d691e7eee875e92f6298..dcbd6577d4450a40d7daa66966bcf46db13f9215 100644
--- a/externals/zexy/src/multiplex~.c
+++ b/externals/zexy/src/multiplex~.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *mux_tilde_class;
+static t_class *mux_tilde_class=NULL;
 
 typedef struct _mux {
   t_object x_obj;
@@ -64,12 +64,13 @@ static void mux_tilde_dsp(t_mux *x, t_signal **sp)
     *dummy++=sp[n]->s_vec;
   }
 
-  dsp_add(mux_tilde_perform, 3, x, sp[n]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(mux_tilde_perform, 3, x, sp[n]->s_vec, sp[0]->s_n);
 }
 
 static void mux_tilde_helper(void)
 {
-  post("\n"HEARTSYMBOL " multiplex~\t:: multiplex a one of various signals to one outlet");
+  post("\n"HEARTSYMBOL
+       " multiplex~\t:: multiplex a one of various signals to one outlet");
   post("<#out>\t : the inlet-number (counting from 0) witch is routed to the outlet"
        "'help'\t : view this");
   post("creation : \"mux~ [arg1 [arg2...]]\"\t: the number of arguments equals the number of inlets\n");
@@ -106,25 +107,31 @@ static void *mux_tilde_new(t_symbol* UNUSED(s), int argc,
 
   return (x);
 }
+static t_class* zclass_setup(const char*name)
+{
+  t_class*c = zexy_new(name,
+                       mux_tilde_new, mux_tilde_free, t_mux, 0, "*");
+
+  /* ouch, that hurts... */
+  class_addfloat(c, mux_tilde_input);
 
-void multiplex_tilde_setup(void)
+  zexy_addmethod(c, (t_method)mux_tilde_dsp, "dsp", "!");
+  zexy_addmethod(c, (t_method)nullfn, "signal", "");
+
+  zexy_addmethod(c, (t_method)mux_tilde_helper, "help", "");
+  return c;
+}
+static void dosetup()
 {
-  mux_tilde_class = class_new(gensym("multiplex~"),
-                              (t_newmethod)mux_tilde_new, (t_method)mux_tilde_free, sizeof(t_mux), 0,
-                              A_GIMME, 0);
-  class_addcreator((t_newmethod)mux_tilde_new, gensym("mux~"), A_GIMME, 0);
-
-  class_addfloat(mux_tilde_class, mux_tilde_input);
-  class_addmethod(mux_tilde_class, (t_method)mux_tilde_dsp, gensym("dsp"),
-                  A_CANT, 0);
-  class_addmethod(mux_tilde_class, nullfn, gensym("signal"), 0);
-
-  class_addmethod(mux_tilde_class, (t_method)mux_tilde_helper,
-                  gensym("help"), 0);
   zexy_register("multiplex~");
+  mux_tilde_class=zclass_setup("multiplex~");
+  zclass_setup("mux~");
+}
+ZEXY_SETUP void multiplex_tilde_setup(void)
+{
+  dosetup();
 }
 void mux_tilde_setup(void)
 {
-  multiplex_tilde_setup();
+  dosetup();
 }
-
diff --git a/externals/zexy/src/multireceive.c b/externals/zexy/src/multireceive.c
index 77c4707908955b2db098e55417ea7a0ad68d8f9e..87e4011e5b9cd67382e2d50fa38d21e19992f997 100644
--- a/externals/zexy/src/multireceive.c
+++ b/externals/zexy/src/multireceive.c
@@ -21,6 +21,12 @@
 
 #include "zexy.h"
 
+#ifdef _WIN32
+# include <sys/timeb.h>
+#else
+# include <sys/time.h>
+#endif
+
 /* -------------------------- multireceive ------------------------------ */
 
 static t_class *multireceive_class=NULL;
@@ -43,6 +49,27 @@ typedef struct _multireceive {
   t_outlet *x_out;
 } t_multireceive;
 
+
+static unsigned long long unique(void)
+{
+  unsigned long long uid = 0;
+#ifdef _WIN32
+  struct _timeb tb;
+  _ftime(&tb);
+  uid=(((unsigned long long)tb.time)<<(4*sizeof(uid))) |
+      (unsigned long long)(tb.millitm);
+#else
+  struct timeval tv;
+
+  gettimeofday(&tv, 0);
+
+  /* First get the seconds right */
+  uid=((unsigned long)tv.tv_sec)<<(4*sizeof(uid)) | tv.tv_usec;
+#endif
+  return uid;
+}
+
+
 static void multireceive_any(t_multireceive_proxy *x, t_symbol*s, int argc,
                              t_atom*argv)
 {
@@ -94,7 +121,8 @@ static void multireceive_clear(t_multireceive *x)
 }
 
 
-static void multireceive_set(t_multireceive *x, t_symbol*s, int argc,
+static void multireceive_set(t_multireceive *x, t_symbol*UNUSED(s),
+                             int argc,
                              t_atom*argv)
 {
   multireceive_clear(x);
@@ -119,7 +147,7 @@ static void multireceive_free(t_multireceive *x)
   x->x_out=NULL;
 }
 
-static void *multireceive_new(t_symbol *s, int argc, t_atom *argv)
+static void *multireceive_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
 {
   t_multireceive *x = (t_multireceive *)pd_new(multireceive_class);
   x->x_proxy=(t_multireceive_proxy*)pd_new(multireceive_proxy_class);
@@ -131,29 +159,20 @@ static void *multireceive_new(t_symbol *s, int argc, t_atom *argv)
   return (x);
 }
 
-void multireceive_setup(void)
+ZEXY_SETUP void multireceive_setup(void)
 {
-  multireceive_class = class_new(gensym("multireceive"),
-                                 (t_newmethod)multireceive_new,
-                                 (t_method)multireceive_free,
-                                 sizeof(t_multireceive),
-                                 0,
-                                 A_GIMME, 0);
-  class_addmethod(multireceive_class,
-                  (t_method)multireceive_set,
-                  gensym("set"),
-                  A_GIMME, 0);
-
-  class_addmethod(multireceive_class,
-                  (t_method)multireceive_add,
-                  gensym("add"),
-                  A_SYMBOL, 0);
-
-  multireceive_proxy_class = class_new(
-                               gensym("multireceive proxy "__DATE__""__TIME__""),
-                               0, 0,
-                               sizeof(t_multireceive_proxy),
-                               CLASS_PD | CLASS_NOINLET, 0);
+  char uniqsym[MAXPDSTRING];
+  unsigned long long uid=unique();
+
+  multireceive_class = zexy_new("multireceive",
+                                multireceive_new, multireceive_free, t_multireceive, 0, "*");
+  zexy_addmethod(multireceive_class, (t_method)multireceive_set, "set", "*");
+
+  zexy_addmethod(multireceive_class, (t_method)multireceive_add, "add", "s");
+  snprintf(uniqsym, MAXPDSTRING-2, "multireceive proxy %0llx", uid);
+  uniqsym[MAXPDSTRING-1]=0;
+  multireceive_proxy_class = zexy_new(uniqsym,
+                                      0, 0, t_multireceive_proxy, CLASS_PD | CLASS_NOINLET, "");
 
   class_addanything(multireceive_proxy_class, multireceive_any);
 
diff --git a/externals/zexy/src/niagara.c b/externals/zexy/src/niagara.c
index ccedb420b20408b668edf30d82cb1eddd21ad19c..0612f7ab6b31c0f3f4513dbb663c4fc306916cc4 100644
--- a/externals/zexy/src/niagara.c
+++ b/externals/zexy/src/niagara.c
@@ -23,12 +23,14 @@
 
 /*
   divides a package into 2 sub-packages at a specified point
-  like the niagara-falls, some water goes down to the left side, the rest to the right side, devided by the rock
+  like the niagara-falls, some water goes down to the left side,
+  the rest to the right side, divided by the rock
 
-  nowadays you can do this with [list split] (though this cannot handle negative indices)
+  nowadays you can do this with [list split]
+  (though this cannot handle negative indices)
 */
 
-static t_class *niagara_class;
+static t_class *niagara_class=NULL;
 
 typedef struct _niagara {
   t_object x_obj;
@@ -61,7 +63,7 @@ static void niagara_any(t_niagara *x, t_symbol *s, int argc, t_atom *argv)
 {
   int n_l, n_r;
   t_atom *ap_l, *ap_r;
-  t_symbol *s_r, *s_l;
+  t_symbol *s_l;
   int dumrock = x->rock;
   int rock = ((dumrock < 0.f)?(argc+dumrock):dumrock-1);
 
@@ -73,7 +75,7 @@ static void niagara_any(t_niagara *x, t_symbol *s, int argc, t_atom *argv)
   ap_r = &argv[n_l];
 
   if (n_r) {
-    s_r = 0;
+    t_symbol *s_r = 0;
     if (ap_r->a_type == A_FLOAT) {
       s_r = gensym("list");
     } else {
@@ -103,10 +105,10 @@ static void *niagara_new(t_floatarg f)
   return (x);
 }
 
-void niagara_setup(void)
+ZEXY_SETUP void niagara_setup(void)
 {
-  niagara_class = class_new(gensym("niagara"), (t_newmethod)niagara_new,
-                            0, sizeof(t_niagara), 0, A_DEFFLOAT,  0);
+  niagara_class = zexy_new("niagara",
+                           niagara_new, 0, t_niagara, 0, "F");
 
   class_addlist    (niagara_class, niagara_list);
   class_addanything(niagara_class, niagara_any);
diff --git a/externals/zexy/src/noish~.c b/externals/zexy/src/noish~.c
index f34455141f3f474701a28c853b5f6ab2976a18a7..f6eb9aa1712e6bd2add7ad327f8efad05ae240d6 100644
--- a/externals/zexy/src/noish~.c
+++ b/externals/zexy/src/noish~.c
@@ -68,7 +68,7 @@ static void set_noisseed(t_nois *x, t_floatarg seed)
 
 /* ------------------------ noish~ ----------------------------- */
 
-static t_class *noish_class;
+static t_class *noish_class=NULL;
 
 static t_int *noish_perform(t_int *w)
 {
@@ -118,7 +118,7 @@ static t_int *noish_perform(t_int *w)
   } else {
     /* anything else */
     while (n--) {
-      if (still_to_go-- <= 0) {	/* update only if all time has elapsed */
+      if (still_to_go-- <= 0) { /* update only if all time has elapsed */
         still_to_go += all_to_go;
 
         i_value *= 435898247;
@@ -141,7 +141,7 @@ static t_int *noish_perform(t_int *w)
 
 static void noish_dsp(t_nois *x, t_signal **sp)
 {
-  dsp_add(noish_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(noish_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
 }
 
 static void noish_helper(void)
@@ -170,18 +170,16 @@ static void *noish_new(t_floatarg f)
   return (x);
 }
 
-void noish_tilde_setup(void)
+ZEXY_SETUP void noish_tilde_setup(void)
 {
-  noish_class = class_new(gensym("noish~"), (t_newmethod)noish_new, 0,
-                          sizeof(t_nois), 0, A_DEFFLOAT, 0);
+  noish_class = zexy_new("noish~",
+                         noish_new, 0, t_nois, 0, "F");
 
   class_addfloat(noish_class, set_freq);
-  class_addmethod(noish_class, (t_method)noish_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(noish_class, (t_method)noish_dsp, "dsp", "!");
 
-  class_addmethod(noish_class, (t_method)set_noisseed, gensym("seed"),
-                  A_FLOAT, 0);
+  zexy_addmethod(noish_class, (t_method)set_noisseed, "seed", "f");
 
-  class_addmethod(noish_class, (t_method)noish_helper, gensym("help"), 0);
+  zexy_addmethod(noish_class, (t_method)noish_helper, "help", "");
   zexy_register("noish~");
 }
diff --git a/externals/zexy/src/noisi~.c b/externals/zexy/src/noisi~.c
index f79e939f7cf26bbbda6c5f5ae9951fb4b0854641..cf9b2a4466937539235daac71075d46541a7ef31 100644
--- a/externals/zexy/src/noisi~.c
+++ b/externals/zexy/src/noisi~.c
@@ -69,7 +69,7 @@ static void set_noisseed(t_nois *x, t_floatarg seed)
 
 /* ------------------------ noisi~ ----------------------------- */
 
-static t_class *noisi_class;
+static t_class *noisi_class=NULL;
 
 static inline t_sample int2sample(int i)
 {
@@ -95,12 +95,12 @@ static t_int *noisi_perform(t_int *w)
   t_sample all_to_go = x->updater;
   t_sample still_to_go = x->to_go;
 
-  if (all_to_go == 1)	{
+  if (all_to_go == 1) {
     /* this is "pure white" noise, so we have to calculate each sample */
     while (n--) {
       *out++ = int2sample(i_value=update_intNoise(i_value));
     }
-  }  else if (n < still_to_go)   {
+  }  else if (n < still_to_go) {
     /* signal won't change for the next 64 samples */
     still_to_go -= n;
     while (n--) {
@@ -108,7 +108,7 @@ static t_int *noisi_perform(t_int *w)
     }
   }  else if (all_to_go + still_to_go > n) {
     /* only one update calculation necessary for 64 samples !!! */
-    while (still_to_go-- > 0)	{
+    while (still_to_go-- > 0) {
       n--;
       *out++ = (f_value -= decrement);
     }
@@ -117,14 +117,14 @@ static t_int *noisi_perform(t_int *w)
     still_to_go += all_to_go + 1;
     decrement = (f_value - int2sample(i_value))  / all_to_go;
 
-    while (n--)	{
+    while (n--) {
       still_to_go--;
       *out++ = (f_value -= decrement);
     }
   }  else {
     /* anything else */
-    while (n--)	{
-      if (still_to_go-- <= 0) {		/* update only if all time has elapsed */
+    while (n--) {
+      if (still_to_go-- <= 0) {  /* update only if all time has elapsed */
         still_to_go += all_to_go;
         f_value=int2sample(i_value);
         i_value=update_intNoise(i_value);
@@ -144,13 +144,14 @@ static t_int *noisi_perform(t_int *w)
 
 static void noisi_dsp(t_nois *x, t_signal **sp)
 {
-  dsp_add(noisi_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(noisi_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
 }
 
 
 static void noisi_helper(void)
 {
-  post("\n"HEARTSYMBOL " noisi~\t:: a bandlimited interpolating pseudo-noise generator");
+  post("\n"HEARTSYMBOL
+       " noisi~\t:: a bandlimited interpolating pseudo-noise generator");
   post("<freq>\t : sampling-frequency (in Hz)\n"
        "'help'\t : view this");
   post("creation : \"noisi~ [<freq>]\"\t: ('0'(default) will produce 'white' noise)\n");
@@ -174,18 +175,16 @@ static void *noisi_new(t_floatarg f)
   return (x);
 }
 
-void noisi_tilde_setup(void)
+ZEXY_SETUP void noisi_tilde_setup(void)
 {
-  noisi_class = class_new(gensym("noisi~"), (t_newmethod)noisi_new, 0,
-                          sizeof(t_nois), 0, A_DEFFLOAT, 0);
+  noisi_class = zexy_new("noisi~",
+                         noisi_new, 0, t_nois, 0, "F");
 
   class_addfloat(noisi_class, set_noisfreq);
-  class_addmethod(noisi_class, (t_method)noisi_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(noisi_class, (t_method)noisi_dsp, "dsp", "!");
 
-  class_addmethod(noisi_class, (t_method)set_noisseed, gensym("seed"),
-                  A_FLOAT, 0);
+  zexy_addmethod(noisi_class, (t_method)set_noisseed, "seed", "f");
 
-  class_addmethod(noisi_class, (t_method)noisi_helper, gensym("help"), 0);
+  zexy_addmethod(noisi_class, (t_method)noisi_helper, "help", "");
   zexy_register("noisi~");
 }
diff --git a/externals/zexy/src/operating_system.c b/externals/zexy/src/operating_system.c
index cd25f90be7694bc60dff594bbce7637f9be13d33..5edc26bf041dd4bff0ad0e56ede1de55937eb9b3 100644
--- a/externals/zexy/src/operating_system.c
+++ b/externals/zexy/src/operating_system.c
@@ -25,7 +25,7 @@
 MESSAGE OPERATING_SYSTEM: simple and easy
 */
 
-static t_class *operating_system_class;
+static t_class *operating_system_class=NULL;
 
 typedef struct _operating_system {
   t_object x_obj;
@@ -55,19 +55,19 @@ static void *operating_system_new(void)
   return (x);
 }
 
-static void operating_system_help(t_operating_system*x)
+static void operating_system_help(t_operating_system*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " operating_system\t:: get the current operating system");
+  post("\n"HEARTSYMBOL
+       " operating_system\t:: get the current operating system");
 }
 
-void operating_system_setup(void)
+ZEXY_SETUP void operating_system_setup(void)
 {
-  operating_system_class = class_new(gensym("operating_system"),
-                                     (t_newmethod)operating_system_new,
-                                     0, sizeof(t_operating_system), 0, A_NULL);
+  operating_system_class = zexy_new("operating_system",
+                                    operating_system_new, 0, t_operating_system, 0, "");
 
   class_addbang  (operating_system_class, operating_system_bang);
-  class_addmethod(operating_system_class, (t_method)operating_system_help,
-                  gensym("help"), A_NULL);
+  zexy_addmethod(operating_system_class, (t_method)operating_system_help,
+                 "help", "");
   zexy_register("operating_system");
 }
diff --git a/externals/zexy/src/pack.c b/externals/zexy/src/pack.c
index b07f6a82a8f83abf7468b032142d773e71c2323c..30c0427b8838dc046224cf63873414872c0c5aeb 100644
--- a/externals/zexy/src/pack.c
+++ b/externals/zexy/src/pack.c
@@ -30,8 +30,8 @@
 
 /* ------------------------- zexy/pack ------------------------------- */
 
-static t_class *zpack_class;
-static t_class *zpackproxy_class;
+static t_class *zpack_class=NULL;
+static t_class *zpackproxy_class=NULL;
 
 typedef struct _zpack {
   t_object x_obj;
@@ -86,13 +86,15 @@ static void zpack_any(t_zpack*x, t_symbol *s, int argc, t_atom *argv)
   zpack_bang(x);
 }
 
-static void zpack_list(t_zpack*x, t_symbol *s, int argc, t_atom *argv)
+static void zpack_list(t_zpack*x, t_symbol *UNUSED(s), int argc,
+                       t_atom *argv)
 {
   zpack_any(x, 0, argc, argv);
 }
 
 
-static void zpack_proxy_list(t_zpackproxy *y, t_symbol *s, int argc,
+static void zpack_proxy_list(t_zpackproxy *y, t_symbol *UNUSED(s),
+                             int argc,
                              t_atom *argv)
 {
   /* until we have lists of lists, this only uses the 1st element */
@@ -100,8 +102,8 @@ static void zpack_proxy_list(t_zpackproxy *y, t_symbol *s, int argc,
     setatom(y->p_master, argv, y->id);
   }
 }
-static void zpack_proxy_any(t_zpackproxy *y, t_symbol *s, int argc,
-                            t_atom *argv)
+static void zpack_proxy_any(t_zpackproxy *y, t_symbol *s,
+                            int UNUSED(argc), t_atom *UNUSED(argv))
 {
   /* until we have lists of lists, this only uses the selector */
   t_atom a;
@@ -109,7 +111,7 @@ static void zpack_proxy_any(t_zpackproxy *y, t_symbol *s, int argc,
   setatom(y->p_master, &a, y->id);
 }
 
-static void *zpack_new(t_symbol *s, int argc, t_atom *argv)
+static void *zpack_new(t_symbol *UNUSED(s), int argc, t_atom *argv)
 {
   t_zpack *x = (t_zpack *)pd_new(zpack_class);
   int n =0;
@@ -170,10 +172,10 @@ static void zpack_free(t_zpack*x)
   }
 }
 
-void zpack_setup(void)
+ZEXY_SETUP void zpack_setup(void)
 {
-  zpack_class = class_new(gensym("zexy/pack"), (t_newmethod)zpack_new,
-                          (t_method)zpack_free, sizeof(t_zpack), 0, A_GIMME,  0);
+  zpack_class = zexy_new("zexy/pack",
+                         zpack_new, zpack_free, t_zpack, 0, "*");
 #if 0
   /* oops Pd>=0.42 allows us to override built-ins
    * this is bad as long as the 2 objects are not compatible */
@@ -183,9 +185,8 @@ void zpack_setup(void)
   class_addlist(zpack_class, zpack_list);
   class_addanything(zpack_class, zpack_any);
 
-  zpackproxy_class = class_new(gensym("zpack proxy"), 0, 0,
-                               sizeof(t_zpackproxy),
-                               CLASS_PD | CLASS_NOINLET, 0);
+  zpackproxy_class = zexy_new("zpack proxy",
+                              0, 0, t_zpackproxy, CLASS_PD | CLASS_NOINLET, "");
   class_addlist(zpackproxy_class, zpack_proxy_list);
   class_addanything(zpackproxy_class, zpack_proxy_any);
 
@@ -196,4 +197,3 @@ void pack_setup(void)
 {
   zpack_setup();
 }
-
diff --git a/externals/zexy/src/packel.c b/externals/zexy/src/packel.c
index 5329908539571bb5caab623d9a36fa71af658645..6b1663ad69deec7f0d2926543159fd65d650998f 100644
--- a/externals/zexy/src/packel.c
+++ b/externals/zexy/src/packel.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *packel_class;
+static t_class *packel_class=NULL;
 
 typedef struct _packel {
   t_object x_obj;
@@ -59,6 +59,7 @@ static void packel_outelement(t_packel*x, int id, t_symbol*s,int argc,
     switch (current->a_type) {
     case A_NULL:
       outlet_bang(out);
+      break;
     default:
       outlet_list(out, gensym("list"), 1, current);
     }
@@ -122,7 +123,7 @@ static void packel_free(t_packel *x)
 }
 
 
-static void *packel_new(t_symbol*s, int argc, t_atom*argv)
+static void *packel_new(t_symbol*UNUSED(s), int argc, t_atom*argv)
 {
   t_packel *x = (t_packel *)pd_new(packel_class);
 
@@ -150,12 +151,10 @@ static void *packel_new(t_symbol*s, int argc, t_atom*argv)
   return (x);
 }
 
-void packel_setup(void)
+ZEXY_SETUP void packel_setup(void)
 {
-  packel_class = class_new(gensym("packel"),
-                           (t_newmethod)packel_new, (t_method)packel_free,
-                           sizeof(t_packel), 0,
-                           A_GIMME, 0);
+  packel_class = zexy_new("packel",
+                          packel_new, packel_free, t_packel, 0, "*");
 
   class_addlist  (packel_class, packel_list);
   class_addanything(packel_class, packel_anything);
diff --git a/externals/zexy/src/pack~.c b/externals/zexy/src/pack~.c
index ef823ec87ac067a492f86379a477c13caa363294..be9327cbf4471d45417aced652aff04d1d04ed26 100644
--- a/externals/zexy/src/pack~.c
+++ b/externals/zexy/src/pack~.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *sigpack_class;
+static t_class *sigpack_class=NULL;
 
 typedef struct _sigpack {
   t_object x_obj;
@@ -64,7 +64,7 @@ static void sigpack_dsp(t_sigpack *x, t_signal **sp)
     x->vector_length = sp[0]->s_n;
     x->buffer = (t_atom *)getbytes(x->vector_length * sizeof(t_atom));
   }
-  dsp_add(sigpack_perform, 3, sp[0]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(sigpack_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
 }
 
 static void sigpack_free(t_sigpack*x)
@@ -90,16 +90,14 @@ static void sigpack_help(void)
   post("pack~\t:: outputs the signal-vectors as float-packages");
 }
 
-void pack_tilde_setup(void)
+ZEXY_SETUP void pack_tilde_setup(void)
 {
-  sigpack_class = class_new(gensym("pack~"), (t_newmethod)sigpack_new,
-                            (t_method)sigpack_free,
-                            sizeof(t_sigpack), 0, A_DEFFLOAT, 0);
-  class_addmethod(sigpack_class, nullfn, gensym("signal"), 0);
-  class_addmethod(sigpack_class, (t_method)sigpack_dsp, gensym("dsp"),
-                  A_CANT, 0);
-
-  class_addmethod(sigpack_class, (t_method)sigpack_help, gensym("help"), 0);
+  sigpack_class = zexy_new("pack~",
+                           sigpack_new, sigpack_free, t_sigpack, 0, "");
+  zexy_addmethod(sigpack_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(sigpack_class, (t_method)sigpack_dsp, "dsp", "!");
+
+  zexy_addmethod(sigpack_class, (t_method)sigpack_help, "help", "");
 
   zexy_register("pack~");
 }
diff --git a/externals/zexy/src/pdf~.c b/externals/zexy/src/pdf~.c
index 12db1db6c43e9e5911a31e9d919780f7c9284821..e1b7edc528e162e976558d51831105cb3f3f2f4b 100644
--- a/externals/zexy/src/pdf~.c
+++ b/externals/zexy/src/pdf~.c
@@ -21,7 +21,7 @@
 
 /* ------------------------ pdf~ ----------------------------- */
 
-static t_class *pdf_class;
+static t_class *pdf_class=NULL;
 
 typedef struct _pdf {
   t_object x_obj;
@@ -96,7 +96,7 @@ static void pdf_dsp(t_pdf *x, t_signal **sp)
 {
   x->halfsize = (x->size - 1) / 2.0;
 
-  dsp_add(pdf_perform, 3, sp[0]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(pdf_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
 }
 
 static void *pdf_new(t_floatarg f)
@@ -122,7 +122,8 @@ static void pdf_free(t_pdf *x)
 
 static void pdf_tilde_helper(void)
 {
-  post("\n"HEARTSYMBOL " pdf~\t:: get the probability density function of a signal (-1.0 to +1.0)");
+  post("\n"HEARTSYMBOL
+       " pdf~\t:: get the probability density function of a signal (-1.0 to +1.0)");
   post("'bang'\t  : output a list of the probabilities of 'n' function values"
        "\n'clear'\t  : clear the buffer (set all probabilities to zero)"
        "\n<1/0>\t  : short for 'bang' and 'clear'"
@@ -130,20 +131,18 @@ static void pdf_tilde_helper(void)
   post("creation :: 'pdf~ [<n>]':: get the pdf for <n> (default: 64) values");
 }
 
-void pdf_tilde_setup(void)
+ZEXY_SETUP void pdf_tilde_setup(void)
 {
-  pdf_class = class_new(gensym("pdf~"), (t_newmethod)pdf_new,
-                        (t_method)pdf_free,
-                        sizeof(t_pdf), 0, A_DEFFLOAT, 0);
+  pdf_class = zexy_new("pdf~",
+                       pdf_new, pdf_free, t_pdf, 0, "F");
 
-  class_addmethod(pdf_class, nullfn, gensym("signal"), 0);
-  class_addmethod(pdf_class, (t_method)pdf_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(pdf_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(pdf_class, (t_method)pdf_dsp, "dsp", "!");
 
-  class_addmethod(pdf_class, (t_method)pdf_bang, gensym("bang"), 0);
-  class_addmethod(pdf_class, (t_method)clear_pdfbuf, gensym("clear"), 0);
+  zexy_addmethod(pdf_class, (t_method)pdf_bang, "bang", "");
+  zexy_addmethod(pdf_class, (t_method)clear_pdfbuf, "clear", "");
   class_addfloat(pdf_class, pdf_float);
 
-  class_addmethod(pdf_class, (t_method)pdf_tilde_helper, gensym("help"), 0);
+  zexy_addmethod(pdf_class, (t_method)pdf_tilde_helper, "help", "");
   zexy_register("pdf~");
 }
diff --git a/externals/zexy/src/prime.c b/externals/zexy/src/prime.c
index 81a77f45841ca6bfeb3240a5bf02711a8257fb62..f54d1a0e448e8f4bcb548f09634b081142876b7c 100644
--- a/externals/zexy/src/prime.c
+++ b/externals/zexy/src/prime.c
@@ -20,7 +20,7 @@
 #include "zexy.h"
 
 
-static t_class *prime_class;
+static t_class *prime_class=NULL;
 
 typedef struct _prime {
   t_object  x_obj;
@@ -64,20 +64,18 @@ static void *prime_new(void)
   return (x);
 }
 
-static void prime_help(t_prime*x)
+static void prime_help(t_prime*UNUSED(x))
 {
   post("\n"HEARTSYMBOL " prime\t\t:: test whether a given number is prime");
 }
 
 
-void prime_setup(void)
+ZEXY_SETUP void prime_setup(void)
 {
-  prime_class = class_new(gensym("prime"),
-                          (t_newmethod)prime_new,
-                          0, sizeof(t_prime),
-                          CLASS_DEFAULT, 0);
+  prime_class = zexy_new("prime",
+                         prime_new, 0, t_prime, CLASS_DEFAULT, "");
 
   class_addfloat(prime_class, prime_float);
-  class_addmethod(prime_class, (t_method)prime_help, gensym("help"), A_NULL);
+  zexy_addmethod(prime_class, (t_method)prime_help, "help", "");
   zexy_register("prime");
 }
diff --git a/externals/zexy/src/quantize~.c b/externals/zexy/src/quantize~.c
index 36d8f8964d2a65d85141edfe0bf47f77934e7e8c..60ce2c75bf32af60679d29862366519489852fe7 100644
--- a/externals/zexy/src/quantize~.c
+++ b/externals/zexy/src/quantize~.c
@@ -28,7 +28,7 @@
 
 /* ------------------------ quantize~ ----------------------------- */
 
-static t_class *quantize_class;
+static t_class *quantize_class=NULL;
 
 typedef struct _quantize {
   t_object x_obj;
@@ -55,7 +55,7 @@ static void quantize_8bit(t_quantize *x)
 
 static t_int *quantize_perform(t_int *w)
 {
-  t_quantize	*x = (t_quantize *)(w[1]);
+  t_quantize *x = (t_quantize *)(w[1]);
   t_sample *in = (t_sample *)(w[2]);
   t_sample *out = (t_sample *)(w[3]);
   int n = (int)(w[4]);
@@ -65,8 +65,7 @@ static t_int *quantize_perform(t_int *w)
   if (quantiz)
     while (n--) {
       *out++ = dequantiz*(int)(quantiz**in++);
-    }
-  else while (n--) {
+    } else while (n--) {
       *out++ = *in++;
     }
 
@@ -75,12 +74,13 @@ static t_int *quantize_perform(t_int *w)
 
 static void quantize_dsp(t_quantize *x, t_signal **sp)
 {
-  dsp_add(quantize_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(quantize_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
 }
 
 static void quantize_tilde_helper(t_quantize* UNUSED(x))
 {
-  post(""HEARTSYMBOL " quantize~-object\t:: used for quantizing signals by various degrees");
+  post(""HEARTSYMBOL
+       " quantize~-object\t:: used for quantizing signals by various degrees");
   post("<quants> : quantize a signal into <quants> steps ('0' turns quantizing off)\n"
        "'8bit'   : quantize to 8 bit\n"
        "'16bit'  : quantize to 16 bit (default)\n"
@@ -104,22 +104,18 @@ static void *quantize_new(t_floatarg f)
   return (x);
 }
 
-void quantize_tilde_setup(void)
+ZEXY_SETUP void quantize_tilde_setup(void)
 {
-  quantize_class = class_new(gensym("quantize~"), (t_newmethod)quantize_new,
-                             0,
-                             sizeof(t_quantize), 0, A_DEFFLOAT, 0);
-  class_addmethod(quantize_class, nullfn, gensym("signal"), 0);
-  class_addmethod(quantize_class, (t_method)quantize_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  quantize_class = zexy_new("quantize~",
+                            quantize_new, 0, t_quantize, 0, "F");
+  zexy_addmethod(quantize_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(quantize_class, (t_method)quantize_dsp, "dsp", "!");
 
   class_addfloat(quantize_class, quantize_float);
-  class_addmethod(quantize_class, (t_method)quantize_8bit, gensym("8bit"),
-                  0);
-  class_addmethod(quantize_class, (t_method)quantize_16bit, gensym("16bit"),
-                  0);
+  zexy_addmethod(quantize_class, (t_method)quantize_8bit, "8bit", "");
+  zexy_addmethod(quantize_class, (t_method)quantize_16bit, "16bit", "");
 
-  class_addmethod(quantize_class, (t_method)quantize_tilde_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(quantize_class, (t_method)quantize_tilde_helper, "help",
+                 "");
   zexy_register("quantize~");
 }
diff --git a/externals/zexy/src/rawprint.c b/externals/zexy/src/rawprint.c
index e36495b372b63a33d2fe40fcd436bfa6ae434c35..65bce7b003c0c1c9d52c97c21af3c666cfb6c2f8 100644
--- a/externals/zexy/src/rawprint.c
+++ b/externals/zexy/src/rawprint.c
@@ -30,7 +30,7 @@
 # endif
 #endif
 
-static t_class *rawprint_class;
+static t_class *rawprint_class=NULL;
 
 typedef struct _rawprint {
   t_object  x_obj;
@@ -43,11 +43,12 @@ static void rawprint_any(t_rawprint *x, t_symbol*s, int argc, t_atom*argv)
   if(x->label) {
     startpost("%s: ", x->label->s_name);
   }
-  
-  if(s)
+
+  if(s) {
     startpost("\"%s\"", s->s_name);
-  else // this shouldn't happen, but sometimes does...
+  } else { // this shouldn't happen, but sometimes does...
     startpost("NULL");
+  }
 
   while(argc--) {
     switch(argv->a_type) {
@@ -108,12 +109,10 @@ static void *rawprint_new(t_symbol*s)
   return (x);
 }
 
-void rawprint_setup(void)
+ZEXY_SETUP void rawprint_setup(void)
 {
-  rawprint_class = class_new(gensym("rawprint"),
-                             (t_newmethod)rawprint_new,
-                             0, sizeof(t_rawprint),
-                             CLASS_DEFAULT, A_DEFSYMBOL, 0);
+  rawprint_class = zexy_new("rawprint",
+                            rawprint_new, 0, t_rawprint, CLASS_DEFAULT, "S");
 
   class_addanything(rawprint_class, rawprint_any);
   zexy_register("rawprint");
diff --git a/externals/zexy/src/regex.c b/externals/zexy/src/regex.c
index 8c32b37f993a50b9b2a7bc92377f7309de8249a2..40279fc968fc81711ddb71d1782dfc6f75599e5d 100644
--- a/externals/zexy/src/regex.c
+++ b/externals/zexy/src/regex.c
@@ -34,7 +34,7 @@
 
 /* match a regular expression against a string */
 
-static t_class *regex_class;
+static t_class *regex_class=NULL;
 
 typedef struct _regex {
   t_object x_obj;
@@ -76,11 +76,11 @@ static char*regex_l2s(int *reslen, t_symbol*s, int argc, t_atom*argv)
   i=argc;
   ap=argv;
   while(i--) {
-    char buffer[MAXPDSTRING];
     int len=0;
     if(A_SYMBOL==ap->a_type) {
       len=strlen(ap->a_w.w_symbol->s_name);
     } else {
+      char buffer[MAXPDSTRING];
       atom_string(ap, buffer, MAXPDSTRING);
       len=strlen(buffer);
     }
@@ -95,7 +95,7 @@ static char*regex_l2s(int *reslen, t_symbol*s, int argc, t_atom*argv)
   result = (char*)getbytes((length+1)*sizeof(char));
 
   if (s) {
-    char *buf = s->s_name;
+    const char *buf = s->s_name;
     strcpy(result+pos, buf);
     pos+=strlen(buf);
     if(i) {
@@ -173,7 +173,8 @@ static void regex_case(t_regex *x, t_float f)
 }
 
 
-static void regex_regex(t_regex *x, t_symbol*s, int argc, t_atom*argv)
+static void regex_regex(t_regex *x, t_symbol*UNUSED(s), int argc,
+                        t_atom*argv)
 {
 #ifdef HAVE_REGEX_H
   char*result=0;
@@ -200,7 +201,8 @@ static void regex_regex(t_regex *x, t_symbol*s, int argc, t_atom*argv)
 }
 
 /* compare the given list as string with the precompiled regex */
-static void regex_symbol(t_regex *x, t_symbol *s, int argc, t_atom*argv)
+static void regex_symbol(t_regex *x, t_symbol *UNUSED(s), int argc,
+                         t_atom*argv)
 {
 #ifdef HAVE_REGEX_H
   char*teststring=0;
@@ -280,7 +282,7 @@ cleanup:
 #endif
 }
 
-static void *regex_new(t_symbol *s, int argc, t_atom*argv)
+static void *regex_new(t_symbol *UNUSED(s), int argc, t_atom*argv)
 {
   t_regex *x = (t_regex *)pd_new(regex_class);
 
@@ -330,23 +332,22 @@ static void regex_free(t_regex *x)
 #endif
 }
 
-static void regex_help(t_regex*x)
+static void regex_help(t_regex*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " regex\t\t:: test the input whether it matches a regular expression");
+  post("\n"HEARTSYMBOL
+       " regex\t\t:: test the input whether it matches a regular expression");
 }
 
-void regex_setup(void)
+ZEXY_SETUP void regex_setup(void)
 {
-  regex_class = class_new(gensym("regex"), (t_newmethod)regex_new,
-                          (t_method)regex_free, sizeof(t_regex), 0, A_GIMME, 0);
+  regex_class = zexy_new("regex",
+                         regex_new, regex_free, t_regex, 0, "*");
 
   class_addlist  (regex_class, regex_symbol);
-  class_addmethod(regex_class, (t_method)regex_regex, gensym("regex"),
-                  A_GIMME, 0);
+  zexy_addmethod(regex_class, (t_method)regex_regex, "regex", "*");
 
-  class_addmethod(regex_class, (t_method)regex_case, gensym("case"), A_FLOAT,
-                  0);
+  zexy_addmethod(regex_class, (t_method)regex_case, "case", "f");
 
-  class_addmethod(regex_class, (t_method)regex_help, gensym("help"), A_NULL);
+  zexy_addmethod(regex_class, (t_method)regex_help, "help", "");
   zexy_register("regex");
 }
diff --git a/externals/zexy/src/relay.c b/externals/zexy/src/relay.c
index 246e1f26497b9b766b51ff7b3d92bc3ae90d7f8f..609d094f1a7b068706a21631bfd6b54e8aa419ca 100644
--- a/externals/zexy/src/relay.c
+++ b/externals/zexy/src/relay.c
@@ -38,7 +38,7 @@
 
 /* -------------------------- relay ------------------------------ */
 
-static t_class *relay_class;
+static t_class *relay_class=NULL;
 
 typedef struct _relayelement {
   t_word e_w;
@@ -56,9 +56,9 @@ typedef struct _relay {
 static void relay_anything(t_relay *x, t_symbol *sel, int argc,
                            t_atom *argv)
 {
-  t_relayelement *e;
-  int nelement;
   if (x->x_type == A_SYMBOL) {
+    int nelement;
+    t_relayelement *e;
     for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++) {
       if (e->e_w.w_symbol == sel) {
         outlet_anything(e->e_outlet, sel, argc, argv);
@@ -82,9 +82,9 @@ static void relay_list(t_relay *x, t_symbol *sel, int argc, t_atom *argv)
     f = atom_getfloat(argv);
     for (nelement = x->x_nelement, e = x->x_vec; nelement--; e++) {
       if (e->e_w.w_float == f) {
-	if (!sel) {
-	  sel=(argc==1)?gensym("float"):gensym("list");
-	}
+        if (!sel) {
+          sel=(argc==1)?gensym("float"):gensym("list");
+        }
         outlet_anything(e->e_outlet, sel, argc, argv);
         return;
       }
@@ -155,10 +155,10 @@ static void *relay_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
   return (x);
 }
 
-void relay_setup(void)
+ZEXY_SETUP void relay_setup(void)
 {
-  relay_class = class_new(gensym("relay"), (t_newmethod)relay_new,
-                          (t_method)relay_free, sizeof(t_relay), 0, A_GIMME, 0);
+  relay_class = zexy_new("relay",
+                         relay_new, relay_free, t_relay, 0, "*");
   class_addlist(relay_class, relay_list);
   class_addanything(relay_class, relay_anything);
   zexy_register("relay");
diff --git a/externals/zexy/src/repack.c b/externals/zexy/src/repack.c
index 51ceb14ab8bf3250713579dddbade2037767cfcf..b899a064c9f5eb603d4e1f60cf89426838353948 100644
--- a/externals/zexy/src/repack.c
+++ b/externals/zexy/src/repack.c
@@ -29,7 +29,7 @@
 the second inlet lets you change the default package size
 */
 
-static t_class *repack_class;
+static t_class *repack_class=NULL;
 
 typedef struct _repack {
   t_object x_obj;
@@ -165,10 +165,10 @@ static void *repack_new(t_floatarg f)
   return (x);
 }
 
-void repack_setup(void)
+ZEXY_SETUP void repack_setup(void)
 {
-  repack_class = class_new(gensym("repack"), (t_newmethod)repack_new,
-                           0, sizeof(t_repack), 0, A_DEFFLOAT, 0);
+  repack_class = zexy_new("repack",
+                          repack_new, 0, t_repack, 0, "F");
 
   class_addbang    (repack_class, repack_bang);
   class_addfloat   (repack_class, repack_float);
@@ -176,8 +176,7 @@ void repack_setup(void)
   class_addpointer (repack_class, repack_pointer);
   class_addlist    (repack_class, repack_list);
   class_addanything(repack_class, repack_anything);
-  class_addmethod  (repack_class, (t_method)repack_set, gensym(""),
-                    A_DEFFLOAT, 0);
+  zexy_addmethod(repack_class, (t_method)repack_set, "", "F");
 
   zexy_register("repack");
 }
diff --git a/externals/zexy/src/repeat.c b/externals/zexy/src/repeat.c
index dfd07b104af741f8df77721a227835687eff581f..a4aa1e963cff55efd346fd87568d24fa3eb6f8e5 100644
--- a/externals/zexy/src/repeat.c
+++ b/externals/zexy/src/repeat.c
@@ -21,7 +21,7 @@
 
 /* ------------------------- repeat ------------------------------- */
 
-static t_class *repeat_class;
+static t_class *repeat_class=NULL;
 
 typedef struct _repeat {
   t_object x_obj;
@@ -58,10 +58,10 @@ static void *repeat_new(t_symbol* UNUSED(s), int argc, t_atom*argv)
   return (x);
 }
 
-void repeat_setup(void)
+ZEXY_SETUP void repeat_setup(void)
 {
-  repeat_class = class_new(gensym("repeat"), (t_newmethod)repeat_new,
-                           0, sizeof(t_repeat), 0, A_GIMME, 0);
+  repeat_class = zexy_new("repeat",
+                          repeat_new, 0, t_repeat, 0, "*");
   class_addanything(repeat_class, repeat_anything);
 
   zexy_register("repeat");
diff --git a/externals/zexy/src/route~.c b/externals/zexy/src/route~.c
index 43add4e90d85811704456df8fa3604a2f0e29cf9..fcda2c353149104dfa9a67a7f113e2ce11eaf570 100644
--- a/externals/zexy/src/route~.c
+++ b/externals/zexy/src/route~.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *route_tilde_class;
+static t_class *route_tilde_class=NULL;
 typedef struct _route_tilde {
   t_object x_obj;
 
@@ -46,7 +46,7 @@ t_int *route_tilde_perform(t_int *w)
 static void route_tilde_dsp(t_route_tilde *x, t_signal **sp)
 {
   if(sp) {
-    dsp_add(route_tilde_perform, 3, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+    dsp_add(route_tilde_perform, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
   } else {
     route_tilde_any(x, gensym("dsp"), 0, 0);
   }
@@ -65,16 +65,14 @@ static void *route_tilde_new(void)
   return (x);
 }
 
-void route_tilde_setup(void)
+ZEXY_SETUP void route_tilde_setup(void)
 {
-  route_tilde_class = class_new(gensym("route~"),
-                                (t_newmethod)route_tilde_new, (t_method)route_tilde_free,
-                                sizeof(t_route_tilde), 0, A_NULL);
+  route_tilde_class = zexy_new("route~",
+                               route_tilde_new, route_tilde_free, t_route_tilde, 0, "");
 
   class_addanything(route_tilde_class, (t_method)route_tilde_any);
-  class_addmethod(route_tilde_class, nullfn, gensym("signal"), 0);
-  class_addmethod(route_tilde_class, (t_method)route_tilde_dsp,
-                  gensym("dsp"), A_CANT, 0);
+  zexy_addmethod(route_tilde_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(route_tilde_class, (t_method)route_tilde_dsp, "dsp", "!");
 
   zexy_register("route~");
 }
diff --git a/externals/zexy/src/sfplay.c b/externals/zexy/src/sfplay.c
index 49c6229e925c5ac5baa66377cbaee18179a31c8a..3c0e08baf3cec1f91a728d4a39778a4d687ef238 100644
--- a/externals/zexy/src/sfplay.c
+++ b/externals/zexy/src/sfplay.c
@@ -36,11 +36,11 @@ Modified:
   to search for, then with the first skip the first part of a
   soundfile is also loaded by the OS.
 
-  I experimented with asynchronous buffering with paralell
+  I experimented with asynchronous buffering with parallel
   process,which has shown no much performance hit, since more
   processes has to be handled and the modern OS's do caching anyway
   also caching is done in modern hard disk, so an additional cache
-  woud be an overhead, if not special behaviour is needed (big jumps
+  would be an overhead, if not special behaviour is needed (big jumps
   etc).
 
   This sfplayers should be used with an appropriate audio buffer for
@@ -58,7 +58,7 @@ Todo:
   then players and to enable glueless switching between soundfiles.
 
 please mail problems and ideas for improvements to
-ritsch@iem.kug.ac.at */
+ritsch@iem.at */
 
 /*#define DEBUG_ME // for debugging messages */
 
@@ -81,7 +81,7 @@ ritsch@iem.kug.ac.at */
 # define BINREADMODE "r"
 #endif
 
-static t_class *sfplay_class;
+static t_class *sfplay_class=NULL;
 
 typedef struct _sfplay {
   t_object x_obj;
@@ -153,7 +153,7 @@ static void sfplay_helper(t_sfplay* UNUSED(x))
 
 /* METHOD: "open" file */
 
-/* this dont use memory map, because I dont know about this on NT ?
+/* this don't use memory map, because I don't know about this on NT ?
 Use of the buffered functions fopen, fseek fread fclose instead the
 non buffered ones open read close */
 
@@ -184,10 +184,10 @@ static void sfplay_open(t_sfplay *x,t_symbol *filename,t_symbol *endian)
 #endif
 
   if (x->fp != NULL) {
-    z_fclose(x->fp);  /* should not happen */
+    sys_fclose(x->fp);  /* should not happen */
   }
 
-  if (!(x->fp = z_fopen(x->filename->s_name,BINREADMODE))) {
+  if (!(x->fp = sys_fopen(x->filename->s_name,BINREADMODE))) {
     error("sfplay: can't open %s", x->filename->s_name);
   }
 }
@@ -203,7 +203,7 @@ static void sfplay_close(t_sfplay *x)
   /* now in state machine
   if(x->fp != NULL)
   {
-     z_fclose(x->fp);
+     sys_fclose(x->fp);
      x->fp = NULL;
   }
   */
@@ -214,7 +214,7 @@ static void sfplay_close(t_sfplay *x)
   return;
 }
 
-/* for skipping header of soundfile  Dont use this for memory map */
+/* for skipping header of soundfile. don't use this for memory map */
 
 static int sfplay_skip(t_sfplay *x)
 {
@@ -255,7 +255,7 @@ static void sfplay_start(t_sfplay *x)
   post("sfplay: start");
 #endif
 
-  /* new offset postion ? (fom inlet offset) */
+  /* new offset position ? (fom inlet offset) */
   if( ((t_float) of) != x->x_offset) {
     x->skip=1;
     x->x_offset = of;
@@ -426,7 +426,7 @@ static t_int *sfplay_perform(t_int *w)
 
     if(!x->play || x->please_stop) {
 
-      /* if closing dont need o go to stop */
+      /* if closing don't need o go to stop */
       if(x->please_close) {
         x->state = SFPLAY_CLOSE;
         x->count = SFPLAY_WAITTICKS;
@@ -495,7 +495,7 @@ static t_int *sfplay_perform(t_int *w)
         *out[i]++ = s*(1./32768.);
       }
     }
-    return (w+c+4); /* dont zero out outs */
+    return (w+c+4); /* don't zero out outs */
 
   /* ok read error please close */
   case SFPLAY_ERROR:
@@ -523,7 +523,7 @@ static t_int *sfplay_perform(t_int *w)
 
       /* avoid openfiles */
       if(x->fp) {
-        z_fclose(x->fp);
+        sys_fclose(x->fp);
         x->fp = NULL;
       };
 
@@ -560,14 +560,14 @@ static void sfplay_dsp(t_sfplay *x, t_signal **sp)
     dsp_add(sfplay_perform, 4, x,
             sp[0]->s_vec,
             sp[1]->s_vec, /* out 1 */
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   case 2:
     dsp_add(sfplay_perform, 5, x,
             sp[0]->s_vec, /* out 1*/
             sp[1]->s_vec, /* out 2*/
             sp[2]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   case 4:
     dsp_add(sfplay_perform, 7, x,
@@ -576,7 +576,7 @@ static void sfplay_dsp(t_sfplay *x, t_signal **sp)
             sp[2]->s_vec,
             sp[3]->s_vec,
             sp[4]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   case 8:
     dsp_add(sfplay_perform, 11, x,
@@ -589,14 +589,14 @@ static void sfplay_dsp(t_sfplay *x, t_signal **sp)
             sp[6]->s_vec,
             sp[7]->s_vec,
             sp[8]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   }
 }
 
 
 /* create sfplay with args <channels> <skip> */
-static void *sfplay_new(t_floatarg chan,t_floatarg skip)
+static void *sfplay_new(t_floatarg chan, t_floatarg skip)
 {
   t_sfplay *x = (t_sfplay *)pd_new(sfplay_class);
   t_int c = chan;
@@ -662,33 +662,24 @@ static void sfplay_free(t_sfplay *x)
   freebytes(x->filep, DACBLKSIZE*sizeof(short)*x->x_channels);
 }
 
-void sfplay_setup(void)
+ZEXY_SETUP void sfplay_setup(void)
 {
-  sfplay_class = class_new(gensym("sfplay"), (t_newmethod)sfplay_new,
-                           (t_method)sfplay_free,
-                           sizeof(t_sfplay), 0, A_DEFFLOAT, A_DEFFLOAT,0);
-  class_addmethod(sfplay_class, nullfn, gensym("signal"), 0);
-  class_addmethod(sfplay_class, (t_method)sfplay_dsp, gensym("dsp"),
-                  A_CANT, 0);
-
-  class_addmethod(sfplay_class, (t_method)sfplay_helper, gensym("help"),
-                  A_NULL);
+  sfplay_class = zexy_new("sfplay",
+                          sfplay_new, sfplay_free, t_sfplay, 0, "FF");
+  zexy_addmethod(sfplay_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(sfplay_class, (t_method)sfplay_dsp, "dsp", "!");
+
+  zexy_addmethod(sfplay_class, (t_method)sfplay_helper, "help", "");
   class_sethelpsymbol(sfplay_class, gensym("sf-play_record"));
 
   /* method open with filename */
-  class_addmethod(sfplay_class, (t_method)sfplay_open, gensym("open"),
-                  A_SYMBOL,A_SYMBOL,A_NULL);
-  class_addmethod(sfplay_class, (t_method)sfplay_close, gensym("close"),
-                  A_NULL);
-
-  class_addmethod(sfplay_class, (t_method)sfplay_start, gensym("start"),
-                  A_NULL);
-  class_addmethod(sfplay_class, (t_method)sfplay_stop,  gensym("stop"),
-                  A_NULL);
-  class_addmethod(sfplay_class, (t_method)sfplay_rewind, gensym("rewind"),
-                  A_NULL);
-  class_addmethod(sfplay_class, (t_method)sfplay_offset, gensym("goto"),
-                  A_DEFFLOAT, A_NULL);
+  zexy_addmethod(sfplay_class, (t_method)sfplay_open, "open", "ss");
+  zexy_addmethod(sfplay_class, (t_method)sfplay_close, "close", "");
+
+  zexy_addmethod(sfplay_class, (t_method)sfplay_start, "start", "");
+  zexy_addmethod(sfplay_class, (t_method)sfplay_stop, "stop", "");
+  zexy_addmethod(sfplay_class, (t_method)sfplay_rewind, "rewind", "");
+  zexy_addmethod(sfplay_class, (t_method)sfplay_offset, "goto", "F");
 
   /* start stop with 0 and 1 */
   class_addfloat(sfplay_class, sfplay_float);
diff --git a/externals/zexy/src/sfrecord.c b/externals/zexy/src/sfrecord.c
index 0e491ce9d58d0e07417c6dad1e5a46666f2f9238..dcd4c775935cd505188bd9b6047dfea969dde5c2 100644
--- a/externals/zexy/src/sfrecord.c
+++ b/externals/zexy/src/sfrecord.c
@@ -23,8 +23,8 @@ Modified:
 sfrecord.c - hacked from sfplay ::: 2308:forum::für::umläute:1999 @ iem
 
 please mail problems and ideas for improvements to
-ritsch@iem.kug.ac.at
-zmoelnig@iem.kug.ac.at
+ritsch@iem.at
+zmoelnig@iem.at
 */
 
 /* TODO: deprecate this in favour of [writesf~] */
@@ -36,14 +36,14 @@ zmoelnig@iem.kug.ac.at
 
 /* #include "m_imp.h" */
 
-#define DACBLKSIZE 64	/* in m_imp.h, but error if it is included it here*/
+#define DACBLKSIZE 64   /* in m_imp.h, but error if it is included it here*/
 
 #include <stdio.h>
 #include <string.h>
 #include <fcntl.h>
 
 /* ------------------------ sfrecord ----------------------------- */
-#define MAX_CHANS 8		/* channels for soundfiles 1,2,4,8 */
+#define MAX_CHANS 8             /* channels for soundfiles 1,2,4,8 */
 
 #ifdef __WIN32__
 # define BINWRITEMODE "wb"
@@ -53,7 +53,7 @@ zmoelnig@iem.kug.ac.at
 # define BINWRITEMODE "w"
 #endif
 
-static t_class *sfrecord_class;
+static t_class *sfrecord_class=NULL;
 
 typedef struct _sfrecord {
   t_object x_obj;
@@ -62,36 +62,36 @@ typedef struct _sfrecord {
   t_symbol* filename; /* filename */
 
   /*
-  	because there is no command queue,
-  	flags are used instead
+        because there is no command queue,
+        flags are used instead
   */
-  t_int write;		/* write: 1, stop: 0 */
-  t_int please_stop;	/* can be reset only by stop-state itself */
-  t_int please_close;	/* can be reset only by close-state */
-  t_int x_channels;	/* channels to write */
-  t_float x_offset;	/* offset to start writing */
-  t_float offset;		/* inlet value offset in secs */
-  t_float x_skip;		/* skip bytes because header */
-  t_int skip;			/* pending skip if 1 */
-  t_float x_speed;	/* write speed, not supported in this version */
-  t_int size;			/* size of file (if memory mapped) */
-  t_int swap;			/* swap bytes from l->b or b->m */
-  FILE *fp;			/* file oper non-NULL of open */
-  t_int state;		/* which state is writer in */
-  t_int count;		/* count for ticks before next step */
+  t_int write;         /* write: 1, stop: 0 */
+  t_int please_stop;   /* can be reset only by stop-state itself */
+  t_int please_close;  /* can be reset only by close-state */
+  t_int x_channels;    /* channels to write */
+  t_float x_offset;    /* offset to start writing */
+  t_float offset;      /* inlet value offset in secs */
+  t_float x_skip;      /* skip bytes because header */
+  t_int skip;          /* pending skip if 1 */
+  t_float x_speed;     /* write speed, not supported in this version */
+  t_int size;          /* size of file (if memory mapped) */
+  t_int swap;          /* swap bytes from l->b or b->m */
+  FILE *fp;            /* file oper non-NULL of open */
+  t_int state;         /* which state is writer in */
+  t_int count;         /* count for ticks before next step */
 
 } t_sfrecord;
 
 /* states of statemachine */
-#define SFRECORD_WAIT	0		/* wait for open */
-#define SFRECORD_OPEN	1
-#define SFRECORD_CLOSE	2
-#define SFRECORD_SKIP	3
-#define SFRECORD_WRITE	4
-#define SFRECORD_STOP	5
-#define SFRECORD_ERROR	-1
+#define SFRECORD_WAIT   0  /* wait for open */
+#define SFRECORD_OPEN   1
+#define SFRECORD_CLOSE  2
+#define SFRECORD_SKIP   3
+#define SFRECORD_WRITE  4
+#define SFRECORD_STOP   5
+#define SFRECORD_ERROR -1
 
-#define SFRECORD_WAITTICKS 10	/* 1 tick of 64 Samples is ca.1.5ms on 441000 */
+#define SFRECORD_WAITTICKS 10   /* 1 tick of 64 Samples is ca.1.5ms on 441000 */
 
 /* split the os-calls in as many steps as possible
 to split them on different ticks in steps of SFRECORD_WAITTICKS
@@ -117,7 +117,7 @@ static void state_out(t_sfrecord *x, int state)
 
 /* METHOD: "open" file */
 
-/* this dont use memory map, because I dont know about this on NT ?
+/* this don't use memory map, because I don't know about this on NT ?
 Use of the buffered functions fopen, fseek fread fclose instead the
 non buffered ones open read close */
 
@@ -152,10 +152,10 @@ static void sfrecord_open(t_sfrecord *x,t_symbol *filename,
 #endif
 
   if (x->fp != NULL) {
-    z_fclose(x->fp);  /* should not happen */
+    sys_fclose(x->fp);  /* should not happen */
   }
 
-  if (!(x->fp = z_fopen(x->filename->s_name,BINWRITEMODE))) {
+  if (!(x->fp = sys_fopen(x->filename->s_name,BINWRITEMODE))) {
     error("sfrecord: can't open %s", x->filename->s_name);
   }
 }
@@ -168,14 +168,6 @@ static void sfrecord_close(t_sfrecord *x)
   x->write = 0;
   x->please_close = 1;
 
-  /* now in state machine
-  if(x->fp != NULL)
-  {
-  	z_fclose(x->fp);
-  	x->fp = NULL;
-  }
-  */
-
 #ifdef DEBUG_ME
   post("sfrecord: closing ");
 #endif
@@ -317,7 +309,7 @@ static t_int *sfrecord_perform(t_int *w)
     };
     break;
 
-  case SFRECORD_STOP:		/* in stop state mainly waits for write */
+  case SFRECORD_STOP: /* in stop state mainly waits for write */
 
     x->please_stop = 0;
 
@@ -345,11 +337,11 @@ static t_int *sfrecord_perform(t_int *w)
     }
     break;
 
-  case SFRECORD_WRITE:				/* yes write now */
+  case SFRECORD_WRITE:  /* yes write now */
 
     if(!x->write || x->please_stop) {
-      /* if closing dont need to go to stop */
-      if(x->please_close)	{
+      /* if closing don't need to go to stop */
+      if(x->please_close)       {
         x->state = SFRECORD_CLOSE;
         x->count = SFRECORD_WAITTICKS;
 #ifdef DEBUG_ME
@@ -357,7 +349,7 @@ static t_int *sfrecord_perform(t_int *w)
 #endif
         state_out(x, 0);
 
-      } else	{
+      } else    {
         x->state = SFRECORD_STOP;
 #ifdef DEBUG_ME
         post("write -> stop");
@@ -373,7 +365,8 @@ static t_int *sfrecord_perform(t_int *w)
       return (w+4+c);
     }
 
-    /* copy float to 16 Bit and swap if neccesairy */ /* LATER treat overflows */
+    /* copy float to 16 Bit and swap if neccesairy */
+    /* LATER treat overflows */
     while (n--) {
       for (i=0; i<c; i++) {
         s = *in[i]++ * 32768.;
@@ -400,7 +393,7 @@ static t_int *sfrecord_perform(t_int *w)
       if(feof(x->fp)) {
 
         while (n--) {
-          for (i=0; i<c; i++)	{
+          for (i=0; i<c; i++)   {
             if(--j > 0) {
               s = *buf++;
               if(swap) {
@@ -433,7 +426,7 @@ static t_int *sfrecord_perform(t_int *w)
   /* ok :?: write error, please close */
 case SFRECORD_ERROR:
 
-  if(!(x->count--))	{
+  if(!(x->count--))     {
     x->state = SFRECORD_CLOSE;
     sfrecord_close(x);
 #ifdef DEBUG_ME
@@ -456,7 +449,7 @@ case SFRECORD_CLOSE:
 
     /* avoid openfiles */
     if(x->fp) {
-      z_fclose(x->fp);
+      sys_fclose(x->fp);
       x->fp = NULL;
     };
 
@@ -489,13 +482,13 @@ static void sfrecord_dsp(t_sfrecord *x, t_signal **sp)
   case 1:
     dsp_add(sfrecord_perform, 3, x,
             sp[0]->s_vec, /* in 1 */
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   case 2:
     dsp_add(sfrecord_perform, 4, x,
             sp[0]->s_vec,
             sp[1]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   case 4:
     dsp_add(sfrecord_perform, 6, x,
@@ -503,7 +496,7 @@ static void sfrecord_dsp(t_sfrecord *x, t_signal **sp)
             sp[1]->s_vec,
             sp[2]->s_vec,
             sp[3]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   case 8:
     dsp_add(sfrecord_perform, 9, x,
@@ -515,7 +508,7 @@ static void sfrecord_dsp(t_sfrecord *x, t_signal **sp)
             sp[5]->s_vec,
             sp[6]->s_vec,
             sp[7]->s_vec,
-            (t_int)sp[0]->s_n);
+            sp[0]->s_n);
     break;
   }
 }
@@ -606,25 +599,19 @@ static void sfrecord_free(t_sfrecord *x)
   freebytes(x->filep, DACBLKSIZE*sizeof(short)*x->x_channels);
 }
 
-void sfrecord_setup(void)
+ZEXY_SETUP void sfrecord_setup(void)
 {
-  sfrecord_class = class_new(gensym("sfrecord"), (t_newmethod)sfrecord_new,
-                             (t_method)sfrecord_free,
-                             sizeof(t_sfrecord), 0, A_DEFFLOAT, A_DEFFLOAT,0);
-  class_addmethod(sfrecord_class, nullfn, gensym("signal"), 0);
-  class_addmethod(sfrecord_class, (t_method)sfrecord_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  sfrecord_class = zexy_new("sfrecord",
+                            sfrecord_new, sfrecord_free, t_sfrecord, 0, "F");
+  zexy_addmethod(sfrecord_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(sfrecord_class, (t_method)sfrecord_dsp, "dsp", "!");
 
   /* method open with filename */
-  class_addmethod(sfrecord_class, (t_method)sfrecord_open, gensym("open"),
-                  A_SYMBOL,A_SYMBOL,A_NULL);
-  class_addmethod(sfrecord_class, (t_method)sfrecord_close, gensym("close"),
-                  A_NULL);
+  zexy_addmethod(sfrecord_class, (t_method)sfrecord_open, "open", "ss");
+  zexy_addmethod(sfrecord_class, (t_method)sfrecord_close, "close", "");
 
-  class_addmethod(sfrecord_class, (t_method)sfrecord_start, gensym("start"),
-                  A_NULL);
-  class_addmethod(sfrecord_class, (t_method)sfrecord_stop,  gensym("stop"),
-                  A_NULL);
+  zexy_addmethod(sfrecord_class, (t_method)sfrecord_start, "start", "");
+  zexy_addmethod(sfrecord_class, (t_method)sfrecord_stop, "stop", "");
 
   /* start/stop with 0/1 */
   class_addfloat(sfrecord_class, sfrecord_float);
@@ -633,8 +620,7 @@ void sfrecord_setup(void)
   class_addbang(sfrecord_class,sfrecord_bang);
 
   /* some help */
-  class_addmethod(sfrecord_class, (t_method)sfrecord_helper,  gensym("help"),
-                  A_NULL);
+  zexy_addmethod(sfrecord_class, (t_method)sfrecord_helper, "help", "");
   class_sethelpsymbol(sfrecord_class, gensym("sf-play_record"));
   zexy_register("sfrecord");
 }
diff --git a/externals/zexy/src/sgn~.c b/externals/zexy/src/sgn~.c
index 6e6e03d8aa5a5ed3f3c179a524dc3088e4149697..7847907ec1b88283cd6ca5085316b3ac20461da2 100644
--- a/externals/zexy/src/sgn~.c
+++ b/externals/zexy/src/sgn~.c
@@ -26,7 +26,7 @@ typedef struct _sgnTilde {
 
 /* ------------------------ sgn~ ----------------------------- */
 
-static t_class *sgnTilde_class;
+static t_class *sgnTilde_class=NULL;
 
 static t_int *sgnTilde_perform(t_int *w)
 {
@@ -38,7 +38,7 @@ static t_int *sgnTilde_perform(t_int *w)
     x=*in++;
     if (x>0.) {
       *out++=1.;
-    } else if	(x<0.) {
+    } else if (x<0.) {
       *out++=-1.;
     } else {
       *out++=0.;
@@ -139,13 +139,13 @@ static t_int *sgnTilde_performSSE(t_int *w)
   while (n--) {
 
     val=in[0];
-    xmm0  = _mm_cmpneq_ps(val , zero);/* mask for non-zeros */
+    xmm0  = _mm_cmpneq_ps(val, zero); /* mask for non-zeros */
     xmm1  = _mm_and_ps   (val, sgnmask);/* sign (without value) */
     xmm0  = _mm_and_ps   (xmm0, one); /* (abs) value: (val==0.f)?0.f:1.f */
     out[0]= _mm_or_ps    (xmm1, xmm0);/* merge sign and value */
 
     val=in[1];
-    xmm0  = _mm_cmpneq_ps(val , zero);
+    xmm0  = _mm_cmpneq_ps(val, zero);
     xmm1  = _mm_and_ps   (val, sgnmask);
     xmm0  = _mm_and_ps   (xmm0, one);
     out[1]= _mm_or_ps    (xmm1, xmm0);
@@ -158,7 +158,7 @@ static t_int *sgnTilde_performSSE(t_int *w)
 }
 #endif /* __SSE__ */
 
-static void sgnTilde_dsp(t_sgnTilde *x, t_signal **sp)
+static void sgnTilde_dsp(t_sgnTilde *UNUSED(x), t_signal **sp)
 {
 #ifdef __SSE__
   if(
@@ -171,13 +171,13 @@ static void sgnTilde_dsp(t_sgnTilde *x, t_signal **sp)
                  sgnTilde_performSSE,
                  1,1)
   ) {
-    dsp_add(sgnTilde_performSSE, 3, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+    dsp_add(sgnTilde_performSSE, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
   } else
 #endif
     if (sp[0]->s_n & 7) {
-      dsp_add(sgnTilde_perform , 3, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+      dsp_add(sgnTilde_perform, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
     } else {
-      dsp_add(sgnTilde_perform8, 3, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+      dsp_add(sgnTilde_perform8, 3, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
     }
 
 }
@@ -195,16 +195,14 @@ static void *sgnTilde_new(void)
   return (x);
 }
 
-void sgn_tilde_setup(void)
+ZEXY_SETUP void sgn_tilde_setup(void)
 {
-  sgnTilde_class = class_new(gensym("sgn~"), (t_newmethod)sgnTilde_new, 0,
-                             sizeof(t_sgnTilde), 0, A_DEFFLOAT, 0);
-  class_addmethod(sgnTilde_class, nullfn, gensym("signal"), 0);
-  class_addmethod(sgnTilde_class, (t_method)sgnTilde_dsp, gensym("dsp"),
-                  A_CANT, 0);
-
-  class_addmethod(sgnTilde_class, (t_method)sgnTilde_helper, gensym("help"),
-                  0);
+  sgnTilde_class = zexy_new("sgn~",
+                            sgnTilde_new, 0, t_sgnTilde, 0, "");
+  zexy_addmethod(sgnTilde_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(sgnTilde_class, (t_method)sgnTilde_dsp, "dsp", "!");
+
+  zexy_addmethod(sgnTilde_class, (t_method)sgnTilde_helper, "help", "");
   class_sethelpsymbol(sgnTilde_class, gensym("zigbinops"));
   zexy_register("sgn~");
 }
diff --git a/externals/zexy/src/sigzero~.c b/externals/zexy/src/sigzero~.c
index 8a12b538c5c0b7e367fd788dc024276e02447200..e861e77f1c87abcc88c19ab2b046f016adf794cb 100644
--- a/externals/zexy/src/sigzero~.c
+++ b/externals/zexy/src/sigzero~.c
@@ -26,7 +26,7 @@
 #include "zexy.h"
 
 
-static t_class *sigzero_class;
+static t_class *sigzero_class=NULL;
 
 typedef struct _sigzero {
   t_object x_obj;
@@ -55,9 +55,9 @@ static t_int *sigzero_perform(t_int *w)
   t_sigzero *x = (t_sigzero *)w[2];
   int n = (int)w[3];
 
-  int non_zero = 0;
 
   if (x->activate) {
+    int non_zero = 0;
     while (n--) {
       if (*in++ != 0.) {
         non_zero = 1;
@@ -74,12 +74,13 @@ static t_int *sigzero_perform(t_int *w)
 
 static void sigzero_dsp(t_sigzero *x, t_signal **sp)
 {
-  dsp_add(sigzero_perform, 3, sp[0]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(sigzero_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
 }
 
 static void sigzero_tilde_helper(void)
 {
-  post("\n"HEARTSYMBOL " sigzero~-object :: for detecting whether a signal is currently zero or not");
+  post("\n"HEARTSYMBOL
+       " sigzero~-object :: for detecting whether a signal is currently zero or not");
   post("'bang'\t: turn the detector on\n"
        "'off'\t: turn it off\n"
        "<1/0>\t: turn it on/off\n"
@@ -95,19 +96,17 @@ static void *sigzero_new(void)
   return (x);
 }
 
-void sigzero_tilde_setup(void)
+ZEXY_SETUP void sigzero_tilde_setup(void)
 {
-  sigzero_class = class_new(gensym("sigzero~"), (t_newmethod)sigzero_new, 0,
-                            sizeof(t_sigzero), 0, 0);
+  sigzero_class = zexy_new("sigzero~",
+                           sigzero_new, 0, t_sigzero, 0, "");
   class_addfloat(sigzero_class, sigzero_activate);
   class_addbang(sigzero_class, sigzero_banged);
-  class_addmethod(sigzero_class, (t_method)sigzero_off, gensym("off"), 0);
+  zexy_addmethod(sigzero_class, (t_method)sigzero_off, "off", "");
 
-  class_addmethod(sigzero_class, nullfn, gensym("signal"), 0);
-  class_addmethod(sigzero_class, (t_method)sigzero_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(sigzero_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(sigzero_class, (t_method)sigzero_dsp, "dsp", "!");
 
-  class_addmethod(sigzero_class, (t_method)sigzero_tilde_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(sigzero_class, (t_method)sigzero_tilde_helper, "help", "");
   zexy_register("sigzero~");
 }
diff --git a/externals/zexy/src/sleepgrain.c b/externals/zexy/src/sleepgrain.c
index 8fe75ce9bf28bacc9b2042b4caae9e19153b996e..c341d20bff58ee0ee98c9477b66711b692428a81 100644
--- a/externals/zexy/src/sleepgrain.c
+++ b/externals/zexy/src/sleepgrain.c
@@ -24,7 +24,7 @@ EXTERN int* get_sys_sleepgrain(void ) ;
 /* ------------------------- sleepgrain ------------------------------- */
 
 
-static t_class *sleepgrain_class;
+static t_class *sleepgrain_class=NULL;
 
 typedef struct _sleepgrain {
   t_object x_obj;
@@ -61,11 +61,10 @@ static void *sleepgrain_new(void)
   return (x);
 }
 
-void sleepgrain_setup(void)
+ZEXY_SETUP void sleepgrain_setup(void)
 {
-  sleepgrain_class = class_new(gensym("sleepgrain"),
-                               (t_newmethod)sleepgrain_new,
-                               0, sizeof(t_sleepgrain), 0, A_NULL);
+  sleepgrain_class = zexy_new("sleepgrain",
+                              sleepgrain_new, 0, t_sleepgrain, 0, "");
 
   class_addbang  (sleepgrain_class, sleepgrain_bang);
   class_addfloat (sleepgrain_class, sleepgrain_float);
diff --git a/externals/zexy/src/sort.c b/externals/zexy/src/sort.c
index e0574a788147a3fe194d47da8d497a99040411c9..3eebc78920363ad02ccb9ff2f39253f3dc4b868a 100644
--- a/externals/zexy/src/sort.c
+++ b/externals/zexy/src/sort.c
@@ -25,7 +25,7 @@
   SHELL SORT: simple and easy
 */
 
-static t_class *sort_class;
+static t_class *sort_class=NULL;
 
 typedef struct _sort {
   t_object x_obj;
@@ -71,7 +71,8 @@ static void sort_buffer(t_sort *x, int argc, t_atom *argv)
   }
 }
 
-static void sort_list(t_sort *x, t_symbol *s, int argc, t_atom *argv)
+static void sort_list(t_sort *x, t_symbol *UNUSED(s), int argc,
+                      t_atom *argv)
 {
   int step = argc, n;
   t_atom *atombuf = (t_atom *)getbytes(sizeof(t_atom) * argc);
@@ -107,19 +108,17 @@ static void sort_list(t_sort *x, t_symbol *s, int argc, t_atom *argv)
   if (x->ascending)
     for (n = 0; n < argc; n++) {
       SETFLOAT(&atombuf[n], idx[n]);
-    }
-  else
+    } else
     for (n = 0, i=argc-1; n < argc; n++, i--) {
       SETFLOAT(&atombuf[n], idx[i]);
     }
 
-  outlet_list(x->indexOut , gensym("list"), n, atombuf);
+  outlet_list(x->indexOut, gensym("list"), n, atombuf);
 
   if (x->ascending)
     for (n = 0; n < argc; n++) {
       SETFLOAT(&atombuf[n], buf[n]);
-    }
-  else
+    } else
     for (n = 0, i=argc-1; n < argc; n++, i--) {
       SETFLOAT(&atombuf[n], buf[i]);
     }
@@ -146,19 +145,27 @@ static void *sort_new(t_floatarg f)
   return (x);
 }
 
-static void sort_help(t_sort*x)
+static void sort_help(t_sort*UNUSED(x))
 {
   post("\n"HEARTSYMBOL " sort\t\t:: sort a list of numbers");
 }
-void sort_setup(void)
+ZEXY_SETUP void zexy_sort_setup(void)
 {
-  sort_class = class_new(gensym("sort"), (t_newmethod)sort_new,
-                         0, sizeof(t_sort), 0, A_DEFFLOAT,  0);
+  sort_class = zexy_new("sort",
+                        sort_new, 0, t_sort, 0, "F");
 
   class_addlist    (sort_class, sort_list);
-  class_addmethod   (sort_class, (t_method)sort_dir, gensym("direction"),
-                     A_DEFFLOAT, 0);
-  class_addmethod(sort_class, (t_method)sort_help, gensym("help"), A_NULL);
+  zexy_addmethod(sort_class, (t_method)sort_dir, "direction", "F");
+  zexy_addmethod(sort_class, (t_method)sort_help, "help", "");
 
   zexy_register("sort");
 }
+#ifdef ZEXY_LIBRARY
+/* only use sort_setup() when building as standalone objects
+ * see https://git.iem.at/pd/zexy/issues/5
+ */
+void sort_setup(void)
+{
+  zexy_sort_setup();
+}
+#endif
diff --git a/externals/zexy/src/step~.c b/externals/zexy/src/step~.c
index a35ed35be5ba65f922b12735ea4933c3e08338e3..dee736d20704a6914cfb5108257858f9ecd7e5ee 100644
--- a/externals/zexy/src/step~.c
+++ b/externals/zexy/src/step~.c
@@ -18,22 +18,23 @@
  */
 
 /*
-  step~  : will make a unity step at a desired point in the signal-vector; the second input specifies a
-  length:	after the so-specified time has elapsed, the step will toggle back to the previous
-  value;
-  the length can be passed as an argument when creating the object
-  with length==1 you might do the dirac~ thing a little bit more complicated
-  with length==0 the output just toggles between 0 and 1 every time you bang the object
-
-  NOTE : the inlets do NOT specify any times but sample-NUMBERS; there are 64 samples in a signal-vector,
-  each "lasting" for 1/44100 secs.
+  step~ : will make a unity step at a desired point in the signal-vector;
+           the second input specifies a
+  length: after the so-specified time has elapsed,
+          the step will toggle back to the previous value;
+          the length can be passed as an argument when creating the object
+          with length==1 you might do the dirac~ thing a little bit more complicated
+          with length==0 the output just toggles between 0 and 1 every time you bang the object
+
+  NOTE  : the inlets do NOT specify any times but sample-NUMBERS;
+          there are 64 samples in a signal-vector, each "lasting" for 1/44100 secs.
 */
 
 #include "zexy.h"
 
 /* ------------------------ step~ ----------------------------- */
 
-static t_class *step_class;
+static t_class *step_class=NULL;
 
 typedef struct _step {
   t_object x_obj;
@@ -96,7 +97,7 @@ static t_int *step_perform(t_int *w)
 
 static void step_dsp(t_step *x, t_signal **sp)
 {
-  dsp_add(step_perform, 3, x, sp[0]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(step_perform, 3, x, sp[0]->s_vec, sp[0]->s_n);
 }
 
 
@@ -129,19 +130,17 @@ static void *step_new(t_floatarg farg)
   return (x);
 }
 
-void step_tilde_setup(void)
+ZEXY_SETUP void step_tilde_setup(void)
 {
-  step_class = class_new(gensym("step~"), (t_newmethod)step_new, 0,
-                         sizeof(t_step), 0, A_DEFFLOAT, 0);
+  step_class = zexy_new("step~",
+                        step_new, 0, t_step, 0, "F");
 
   class_addfloat(step_class, step_float);
   class_addbang(step_class, step_bang);
-  class_addmethod(step_class, (t_method)step_setlength, gensym("ft1"),
-                  A_FLOAT, 0);
-  class_addmethod(step_class, (t_method)step_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zexy_addmethod(step_class, (t_method)step_setlength, "ft1", "f");
+  zexy_addmethod(step_class, (t_method)step_dsp, "dsp", "!");
 
-  class_addmethod(step_class, (t_method)step_helper, gensym("help"), 0);
+  zexy_addmethod(step_class, (t_method)step_helper, "help", "");
 
   zexy_register("step~");
 }
diff --git a/externals/zexy/src/strcmp.c b/externals/zexy/src/strcmp.c
index 7219177782cb584c107e22d3f64c1b8d342dec5d..362e917a5a202e3b9313cf4985cf0037227e2f62 100644
--- a/externals/zexy/src/strcmp.c
+++ b/externals/zexy/src/strcmp.c
@@ -18,6 +18,7 @@
  */
 
 #include "zexy.h"
+#include "zexy_strndup.h"
 #include <stdlib.h>
 #include <string.h>
 
@@ -25,8 +26,8 @@
 
 /* compare 2 lists ( == for lists) */
 
-static t_class *strcmp_class;
-static t_class *strcmp_proxy_class;
+static t_class *strcmp_class=NULL;
+static t_class *strcmp_proxy_class=NULL;
 
 
 typedef struct _strcmp {
@@ -75,12 +76,13 @@ static void list2binbuf(t_binbuf**bbuf, int *n, char**str, int argc,
 
   binbuf_clear(*bbuf);
   binbuf_add(*bbuf, argc, argv);
-  binbuf_gettext(*bbuf, str, &i);
+  binbuf_gettext(*bbuf, str, n);
+  i=*n;
+  s=*str;
 
-  s = t_resizebytes(*str, i, i+1);
-  s[i] = 0;
-  *str = s;
-  *n = i+1;
+  if(' '==s[i]) {
+    s[i]=0;
+  }
 }
 
 static void strcmp_list(t_strcmp *x, t_symbol* UNUSED(s), int argc,
@@ -94,8 +96,8 @@ static void strcmp_symbol(t_strcmp *x, t_symbol *s)
   if(x->str1&&x->n1) {
     freebytes(x->str1, x->n1);
   }
-  x->n1=0;
-  x->str1=s->s_name;
+  x->str1=zexy_strndup(s->s_name, MAXPDSTRING);
+  x->n1=strnlen(x->str1, MAXPDSTRING);
   strcmp_bang(x);
 }
 
@@ -109,8 +111,8 @@ static void strcmp_secondsymbol(t_strcmp *x, t_symbol *s)
   if(x->str2&&x->n2) {
     freebytes(x->str2, x->n2);
   }
-  x->n2=0;
-  x->str2=s->s_name;
+  x->str2=zexy_strndup(s->s_name, MAXPDSTRING);
+  x->n2=strnlen(x->str2, MAXPDSTRING);
 }
 
 static void strcmp_proxy_list(t_strcmp_proxy *y, t_symbol *s, int argc,
@@ -167,27 +169,25 @@ static void strcmp_free(t_strcmp *x)
 }
 
 
-static void strcmp_help(t_strcmp*x)
+static void strcmp_help(t_strcmp*UNUSED(x))
 {
   post("\n"HEARTSYMBOL " strcmp\t\t:: compare to lists as strings");
 }
 
 
-void strcmp_setup(void)
+ZEXY_SETUP void strcmp_setup(void)
 {
-  strcmp_class = class_new(gensym("strcmp"), (t_newmethod)strcmp_new,
-                           (t_method)strcmp_free, sizeof(t_strcmp), 0, A_GIMME, 0);
+  strcmp_class = zexy_new("strcmp",
+                          strcmp_new, strcmp_free, t_strcmp, 0, "*");
 
   class_addbang    (strcmp_class, strcmp_bang);
   class_addsymbol  (strcmp_class, strcmp_symbol);
   class_addlist    (strcmp_class, strcmp_list);
 
-  strcmp_proxy_class = class_new(gensym("strcmp proxy"), 0, 0,
-                                 sizeof(t_strcmp_proxy),
-                                 CLASS_PD | CLASS_NOINLET, 0);
+  strcmp_proxy_class = zexy_new("strcmp proxy",
+                                0, 0, t_strcmp_proxy, CLASS_PD | CLASS_NOINLET, "");
   class_addsymbol(strcmp_proxy_class, strcmp_proxy_symbol);
   class_addlist(strcmp_proxy_class, strcmp_proxy_list);
-  class_addmethod(strcmp_class, (t_method)strcmp_help, gensym("help"),
-                  A_NULL);
+  zexy_addmethod(strcmp_class, (t_method)strcmp_help, "help", "");
   zexy_register("strcmp");
 }
diff --git a/externals/zexy/src/sum.c b/externals/zexy/src/sum.c
index 419b9d06cf1ed7dbe311200dca050e30b416a07a..fa84093f37fa42a093ee118324f4c7eb752987a1 100644
--- a/externals/zexy/src/sum.c
+++ b/externals/zexy/src/sum.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *sum_class;
+static t_class *sum_class=NULL;
 
 typedef struct _sum {
   t_object x_obj;
@@ -50,13 +50,13 @@ static void sum_help(void)
   post("sum\t:: calculate the sum of a list of floats");
 }
 
-void sum_setup(void)
+ZEXY_SETUP void sum_setup(void)
 {
-  sum_class = class_new(gensym("sum"), (t_newmethod)sum_new, 0,
-                        sizeof(t_sum), 0, A_DEFFLOAT, 0);
+  sum_class = zexy_new("sum",
+                       sum_new, 0, t_sum, 0, "");
 
   class_addlist(sum_class, (t_method)sum_list);
-  class_addmethod(sum_class, (t_method)sum_help, gensym("help"), 0);
+  zexy_addmethod(sum_class, (t_method)sum_help, "help", "");
 
   zexy_register("sum");
 }
diff --git a/externals/zexy/src/swap~.c b/externals/zexy/src/swap~.c
index 9d6486eead09a893d23d7a34bbcee7493f87b3dd..c368739d32ddd4b91f5523d9db0d1b79cf106957 100644
--- a/externals/zexy/src/swap~.c
+++ b/externals/zexy/src/swap~.c
@@ -30,7 +30,7 @@
 #define FLOAT2SHORT 32768.
 #define SHORT2FLOAT 1./32768.
 
-static t_class *swap_class;
+static t_class *swap_class=NULL;
 
 typedef struct _swap {
   t_object x_obj;
@@ -49,19 +49,17 @@ static void swap_bang(t_swap *x)
 
 static t_int *swap_perform(t_int *w)
 {
-  t_swap	*x = (t_swap *)(w[1]);
+  t_swap *x = (t_swap *)(w[1]);
   t_sample *in = (t_sample *)(w[2]);
   t_sample *out = (t_sample *)(w[3]);
   int n = (int)(w[4]);
 
-
   if (x->swapper)
     while (n--) {
       short dummy = FLOAT2SHORT **in++;
       *out++ = SHORT2FLOAT * (short)( ((dummy & 0xFF) << 8) | ((
                                         dummy & 0xFF00) >> 8) );
-    }
-  else while (n--) {
+    } else while (n--) {
       *out++ = *in++;
     }
 
@@ -70,7 +68,7 @@ static t_int *swap_perform(t_int *w)
 
 static void swap_dsp(t_swap *x, t_signal **sp)
 {
-  dsp_add(swap_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, (t_int)sp[0]->s_n);
+  dsp_add(swap_perform, 4, x, sp[0]->s_vec, sp[1]->s_vec, sp[0]->s_n);
 }
 
 static void swap_helper(void)
@@ -91,17 +89,16 @@ static void *swap_new(void)
   return (x);
 }
 
-void swap_tilde_setup(void)
+ZEXY_SETUP void swap_tilde_setup(void)
 {
-  swap_class = class_new(gensym("swap~"), (t_newmethod)swap_new, 0,
-                         sizeof(t_swap), 0, A_NULL);
-  class_addmethod(swap_class, nullfn, gensym("signal"), 0);
-  class_addmethod(swap_class, (t_method)swap_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  swap_class = zexy_new("swap~",
+                        swap_new, 0, t_swap, 0, "");
+  zexy_addmethod(swap_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(swap_class, (t_method)swap_dsp, "dsp", "!");
 
   class_addfloat(swap_class, swap_float);
   class_addbang(swap_class, swap_bang);
 
-  class_addmethod(swap_class, (t_method)swap_helper, gensym("help"), 0);
+  zexy_addmethod(swap_class, (t_method)swap_helper, "help", "");
   zexy_register("swap~");
 }
diff --git a/externals/zexy/src/symbol2list.c b/externals/zexy/src/symbol2list.c
index 935b2be2e8344d179adb41deae75a61e0c5cdd37..d8ec7f0a5ebed7814bc56aac275b2f4c625589fd 100644
--- a/externals/zexy/src/symbol2list.c
+++ b/externals/zexy/src/symbol2list.c
@@ -23,7 +23,7 @@
 
 /* ------------------------- symbol2list ------------------------------- */
 
-static t_class *symbol2list_class;
+static t_class *symbol2list_class = NULL;
 
 typedef struct _symbol2list {
   t_object x_obj;
@@ -38,12 +38,12 @@ static void symbol2list_delimiter(t_symbol2list *x, t_symbol *s)
   x->delimiter = s;
 }
 
-STATIC_INLINE void string2atom(t_atom *ap, char* cp, int clen)
+STATIC_INLINE void string2atom(t_atom *ap, const char* cp, int clen)
 {
   char *buffer=getbytes(sizeof(char)*(clen+1));
   char *endptr[1];
   t_float ftest;
-  strncpy(buffer, cp, clen);
+  strncpy(buffer, cp, clen+1);
   buffer[clen]=0;
   ftest=strtod(buffer, endptr);
   /* what should we do with the special cases of hexadecimal values, "INF" and "NAN" ???
@@ -62,10 +62,10 @@ STATIC_INLINE void string2atom(t_atom *ap, char* cp, int clen)
 }
 static void symbol2list_process(t_symbol2list *x)
 {
-  char *cc;
-  char *deli;
+  const char *cc, *cp;
+  const char *deli;
   int   dell;
-  char *cp, *d;
+  char *d;
   int i=1;
 
   if (x->s==NULL) {
@@ -159,31 +159,35 @@ static void *symbol2list_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
   return (x);
 }
 
-static void symbol2list_free(t_symbol2list *x)
+static void symbol2list_free(t_symbol2list *UNUSED(x))
 {}
 
-static void symbol2list_help(t_symbol2list*x)
+static void symbol2list_help(t_symbol2list*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " symbol2list\t:: split a symbol into a list of atoms");
+  post("\n"HEARTSYMBOL
+       " symbol2list\t:: split a symbol into a list of atoms");
 }
-
-void symbol2list_setup(void)
+static t_class* zclass_setup(const char*name)
+{
+  t_class*c = zexy_new(name,
+                       symbol2list_new, symbol2list_free, t_symbol2list, 0, "*");
+  class_addsymbol (c, symbol2list_symbol);
+  class_addbang   (c, symbol2list_bang);
+  zexy_addmethod(c, (t_method)symbol2list_delimiter, "", "s");
+  zexy_addmethod(c, (t_method)symbol2list_help, "help", "");
+  return c;
+}
+static void dosetup()
 {
-  symbol2list_class = class_new(gensym("symbol2list"),
-                                (t_newmethod)symbol2list_new,
-                                (t_method)symbol2list_free, sizeof(t_symbol2list), 0, A_GIMME, 0);
-
-  class_addcreator((t_newmethod)symbol2list_new, gensym("s2l"), A_GIMME, 0);
-  class_addsymbol (symbol2list_class, symbol2list_symbol);
-  class_addbang   (symbol2list_class, symbol2list_bang);
-  class_addmethod  (symbol2list_class, (t_method)symbol2list_delimiter,
-                    gensym(""), A_SYMBOL, 0);
-  class_addmethod(symbol2list_class, (t_method)symbol2list_help,
-                  gensym("help"), A_NULL);
-
   zexy_register("symbol2list");
+  symbol2list_class=zclass_setup("symbol2list");
+  zclass_setup("s2l");
+}
+ZEXY_SETUP void symbol2list_setup(void)
+{
+  dosetup();
 }
 void s2l_setup(void)
 {
-  symbol2list_setup();
+  dosetup();
 }
diff --git a/externals/zexy/src/tabdump.c b/externals/zexy/src/tabdump.c
index 03ef0614b7c9cb67906ab263758f7b645a05b5c8..dd13cf98d9df633900dc58e7c0bfef9f8b389178 100644
--- a/externals/zexy/src/tabdump.c
+++ b/externals/zexy/src/tabdump.c
@@ -21,7 +21,7 @@
 
 /* =================== tabdump ====================== */
 
-static t_class *tabdump_class;
+static t_class *tabdump_class=NULL;
 
 typedef struct _tabdump {
   t_object x_obj;
@@ -33,11 +33,11 @@ static void tabdump_bang(t_tabdump *x)
 {
   t_garray *A;
   int npoints;
-  zarray_t *vec;
+  t_word *vec;
 
   if (!(A = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) {
     error("%s: no such array", x->x_arrayname->s_name);
-  } else if (!zarray_getarray(A, &npoints, &vec)) {
+  } else if (!garray_getfloatwords(A, &npoints, &vec)) {
     error("%s: bad template for tabdump", x->x_arrayname->s_name);
   } else {
     int n;
@@ -55,7 +55,7 @@ static void tabdump_bang(t_tabdump *x)
 
     atombuf = (t_atom *)getbytes(sizeof(t_atom)*npoints);
     for (n = 0; n < npoints; n++) {
-      SETFLOAT(&atombuf[n], zarray_getfloat(vec, start+n));
+      SETFLOAT(&atombuf[n], vec[start+n].w_float);
     }
     outlet_list(x->x_obj.ob_outlet, gensym("list"), npoints, atombuf);
     freebytes(atombuf,sizeof(t_atom)*npoints);
@@ -97,7 +97,8 @@ static void *tabdump_new(t_symbol *s)
 
 static void tabdump_helper(void)
 {
-  post("\n"HEARTSYMBOL " tabdump - object : dumps a table as a package of floats");
+  post("\n"HEARTSYMBOL
+       " tabdump - object : dumps a table as a package of floats");
   post("'set <table>'\t: read out another table\n"
        "'bang'\t\t: dump the table\n"
        "outlet\t\t: table-data as package of floats");
@@ -105,17 +106,15 @@ static void tabdump_helper(void)
 
 }
 
-void tabdump_setup(void)
+ZEXY_SETUP void tabdump_setup(void)
 {
-  tabdump_class = class_new(gensym("tabdump"), (t_newmethod)tabdump_new,
-                            0, sizeof(t_tabdump), 0, A_DEFSYM, 0);
+  tabdump_class = zexy_new("tabdump",
+                           tabdump_new, 0, t_tabdump, 0, "S");
   class_addbang(tabdump_class, (t_method)tabdump_bang);
   class_addlist(tabdump_class, (t_method)tabdump_list);
 
-  class_addmethod(tabdump_class, (t_method)tabdump_set, gensym("set"),
-                  A_SYMBOL, 0);
+  zexy_addmethod(tabdump_class, (t_method)tabdump_set, "set", "s");
 
-  class_addmethod(tabdump_class, (t_method)tabdump_helper, gensym("help"),
-                  0);
+  zexy_addmethod(tabdump_class, (t_method)tabdump_helper, "help", "");
   zexy_register("tabdump");
 }
diff --git a/externals/zexy/src/tabminmax.c b/externals/zexy/src/tabminmax.c
index 89d8026cbe0b88eaaa348d8416dd50087dc68578..98e0ab836ffed97e1df76296229580425d901ec6 100644
--- a/externals/zexy/src/tabminmax.c
+++ b/externals/zexy/src/tabminmax.c
@@ -22,7 +22,7 @@
 
 /* =================== tabminmax ====================== */
 
-static t_class *tabminmax_class;
+static t_class *tabminmax_class=NULL;
 
 typedef struct _tabminmax {
   t_object x_obj;
@@ -35,11 +35,11 @@ static void tabminmax_bang(t_tabminmax *x)
 {
   t_garray *A;
   int npoints;
-  zarray_t *vec;
+  t_word *vec;
 
   if (!(A = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) {
     error("%s: no such array", x->x_arrayname->s_name);
-  } else if (!zarray_getarray(A, &npoints, &vec)) {
+  } else if (!garray_getfloatwords(A, &npoints, &vec)) {
     error("%s: bad template for tabminmax", x->x_arrayname->s_name);
   } else {
     int n;
@@ -57,14 +57,14 @@ static void tabminmax_bang(t_tabminmax *x)
     }
     npoints=stop-start;
 
-    min=zarray_getfloat(vec, start);
+    min=vec[start].w_float;
     max=min;
 
     mindex=start;
     maxdex=start;
 
     for (n = 1; n < npoints; n++) {
-      t_float val=zarray_getfloat(vec, start+n);
+      t_float val=vec[start+n].w_float;
       if(val<min) {
         mindex=start+n;
         min=val;
@@ -121,7 +121,8 @@ static void *tabminmax_new(t_symbol *s)
 
 static void tabminmax_helper(void)
 {
-  post("\n"HEARTSYMBOL " tabminmax - object : dumps a table as a package of floats");
+  post("\n"HEARTSYMBOL
+       " tabminmax - object : dumps a table as a package of floats");
   post("'set <table>'\t: read out another table\n"
        "'bang'\t\t: get min and max of the table\n"
        "outlet\t\t: table-data as package of floats");
@@ -129,18 +130,15 @@ static void tabminmax_helper(void)
 
 }
 
-void tabminmax_setup(void)
+ZEXY_SETUP void tabminmax_setup(void)
 {
-  tabminmax_class = class_new(gensym("tabminmax"),
-                              (t_newmethod)tabminmax_new,
-                              0, sizeof(t_tabminmax), 0, A_DEFSYM, 0);
+  tabminmax_class = zexy_new("tabminmax",
+                             tabminmax_new, 0, t_tabminmax, 0, "S");
   class_addbang(tabminmax_class, (t_method)tabminmax_bang);
   class_addlist(tabminmax_class, (t_method)tabminmax_list);
 
-  class_addmethod(tabminmax_class, (t_method)tabminmax_set, gensym("set"),
-                  A_SYMBOL, 0);
+  zexy_addmethod(tabminmax_class, (t_method)tabminmax_set, "set", "s");
 
-  class_addmethod(tabminmax_class, (t_method)tabminmax_helper,
-                  gensym("help"), 0);
+  zexy_addmethod(tabminmax_class, (t_method)tabminmax_helper, "help", "");
   zexy_register("tabminmax");
 }
diff --git a/externals/zexy/src/tabread4~~.c b/externals/zexy/src/tabread4~~.c
index 37cb27b4fa533d11cf1ee69c86d170d10f1906a0..cd59252c1c698002fcb4b7de598e641b298c8212 100644
--- a/externals/zexy/src/tabread4~~.c
+++ b/externals/zexy/src/tabread4~~.c
@@ -23,12 +23,12 @@
 /******************** tabread4~~ ***********************/
 
 
-static t_class *tabread4_tilde_class;
+static t_class *tabread4_tilde_class=NULL;
 
 typedef struct _tabread4_tilde {
   t_object x_obj;
   int x_npoints;
-  zarray_t *x_vec;
+  t_word *x_vec;
   t_symbol *x_arrayname;
   t_float x_f;
 } t_tabread4_tilde;
@@ -54,7 +54,7 @@ static t_int *tabread4_tilde_perform(t_int *w)
   t_sample *out = (t_sample *)(w[4]);
   int n = (int)(w[5]);
   int maxindex;
-  zarray_t *buf = x->x_vec, *wp;
+  t_word *buf = x->x_vec, *wp;
   int i;
 
   maxindex = x->x_npoints - 3;
@@ -81,10 +81,10 @@ static t_int *tabread4_tilde_perform(t_int *w)
 
     wp = buf + index;
 
-    a = zarray_getfloat(wp,-1);
-    b = zarray_getfloat(wp, 0);
-    c = zarray_getfloat(wp, 1);
-    d = zarray_getfloat(wp, 2);
+    a = wp[-1].w_float;
+    b = wp[ 0].w_float;
+    c = wp[ 1].w_float;
+    d = wp[ 2].w_float;
 
     cminusb = c-b;
     *out++ = b + frac * (
@@ -106,7 +106,7 @@ static void tabread4_tilde_set(t_tabread4_tilde *x, t_symbol *s)
       pd_error(x, "tabread4~~: %s: no such array", x->x_arrayname->s_name);
     }
     x->x_vec = 0;
-  } else if (!zarray_getarray(a, &x->x_npoints, &x->x_vec)) {
+  } else if (!garray_getfloatwords(a, &x->x_npoints, &x->x_vec)) {
     pd_error(x, "%s: bad template for tabread4~~", x->x_arrayname->s_name);
     x->x_vec = 0;
   } else {
@@ -119,24 +119,23 @@ static void tabread4_tilde_dsp(t_tabread4_tilde *x, t_signal **sp)
   tabread4_tilde_set(x, x->x_arrayname);
 
   dsp_add(tabread4_tilde_perform, 5, x,
-          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, (t_int)sp[0]->s_n);
+          sp[0]->s_vec, sp[1]->s_vec, sp[2]->s_vec, sp[0]->s_n);
 
 }
 
-static void tabread4_tilde_free(t_tabread4_tilde *x)
+static void tabread4_tilde_free(t_tabread4_tilde *UNUSED(x))
 {
 }
 
-void tabread4_tilde_tilde_setup(void)
+ZEXY_SETUP void tabread4_tilde_tilde_setup(void)
 {
-  tabread4_tilde_class = class_new(gensym("tabread4~~"),
-                                   (t_newmethod)tabread4_tilde_new, (t_method)tabread4_tilde_free,
-                                   sizeof(t_tabread4_tilde), 0, A_DEFSYM, 0);
+  tabread4_tilde_class = zexy_new("tabread4~~",
+                                  tabread4_tilde_new, tabread4_tilde_free, t_tabread4_tilde, 0, "S");
   CLASS_MAINSIGNALIN(tabread4_tilde_class, t_tabread4_tilde, x_f);
-  class_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_dsp,
-                  gensym("dsp"), A_CANT, 0);
-  class_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_set,
-                  gensym("set"), A_SYMBOL, 0);
+  zexy_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_dsp, "dsp",
+                 "!");
+  zexy_addmethod(tabread4_tilde_class, (t_method)tabread4_tilde_set, "set",
+                 "s");
 
   zexy_register("tabread4~~");
 }
diff --git a/externals/zexy/src/tabset.c b/externals/zexy/src/tabset.c
index 70b87a04fdf07d90c466f290203bfa5cd4f43fd5..466cb25431c9494f5bdc5b1c1b3b10cee5db56e0 100644
--- a/externals/zexy/src/tabset.c
+++ b/externals/zexy/src/tabset.c
@@ -24,7 +24,7 @@
 
 /* =================== tabset ====================== */
 
-static t_class *tabset_class;
+static t_class *tabset_class=NULL;
 
 typedef struct _tabset {
   t_object x_obj;
@@ -35,15 +35,15 @@ static void tabset_float(t_tabset *x, t_floatarg f)
 {
   t_garray *A;
   int npoints;
-  zarray_t *vec;
+  t_word *vec;
 
   if (!(A = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) {
     error("%s: no such array", x->x_arrayname->s_name);
-  } else if (!zarray_getarray(A, &npoints, &vec)) {
+  } else if (!garray_getfloatwords(A, &npoints, &vec)) {
     error("%s: bad template for tabset", x->x_arrayname->s_name);
   } else {
     while(npoints--) {
-      zarray_setfloat(vec, 0, f);
+      vec->w_float = f;
       vec++;
     }
     garray_redraw(A);
@@ -55,28 +55,27 @@ static void tabset_list(t_tabset *x, t_symbol* UNUSED(s), int argc,
 {
   t_garray *A;
   int npoints;
-  zarray_t *vec;
+  t_word *vec;
 
   if (!(A = (t_garray *)pd_findbyclass(x->x_arrayname, garray_class))) {
     error("%s: no such array", x->x_arrayname->s_name);
-  } else if (!zarray_getarray(A, &npoints, &vec)) {
+  } else if (!garray_getfloatwords(A, &npoints, &vec)) {
     error("%s: bad template for tabset", x->x_arrayname->s_name);
   } else {
     if (argc>=npoints)
       while(npoints--) {
         t_float f= atom_getfloat(argv++);
-        zarray_setfloat(vec, 0, f);
+        vec->w_float = f;
         vec++;
-      }
-    else {
+      } else {
       npoints-=argc;
       while (argc--) {
         t_float f= atom_getfloat(argv++);
-        zarray_setfloat(vec, 0, f);
+        vec->w_float = f;
         vec++;
       }
       while (npoints--) {
-        zarray_setfloat(vec, 0, 0);
+        vec->w_float = 0.;
         vec++;
       }
     }
@@ -98,22 +97,22 @@ static void *tabset_new(t_symbol *s)
 
 static void tabset_helper(void)
 {
-  post("\n"HEARTSYMBOL " tabset - object : set a table with a package of floats");
+  post("\n"HEARTSYMBOL
+       " tabset - object : set a table with a package of floats");
   post("'set <table>'\t: set another table\n"
        "<list>\t\t: set the table"
        "<float>\t\t: set the table to constant float\n");
   post("creation\t: \"tabset <table>\"");
 }
 
-void tabset_setup(void)
+ZEXY_SETUP void tabset_setup(void)
 {
-  tabset_class = class_new(gensym("tabset"), (t_newmethod)tabset_new,
-                           0, sizeof(t_tabset), 0, A_DEFSYM, 0);
+  tabset_class = zexy_new("tabset",
+                          tabset_new, 0, t_tabset, 0, "S");
   class_addfloat(tabset_class, (t_method)tabset_float);
   class_addlist (tabset_class, (t_method)tabset_list);
-  class_addmethod(tabset_class, (t_method)tabset_set, gensym("set"),
-                  A_SYMBOL, 0);
+  zexy_addmethod(tabset_class, (t_method)tabset_set, "set", "s");
 
-  class_addmethod(tabset_class, (t_method)tabset_helper, gensym("help"), 0);
+  zexy_addmethod(tabset_class, (t_method)tabset_helper, "help", "");
   zexy_register("tabset");
 }
diff --git a/externals/zexy/src/tavg~.c b/externals/zexy/src/tavg~.c
index b51dcd68e8df80f3986c9c0a5d971b5ac057467e..4ce754acf943370cd00dc6f5ab8e1b6f9f34bdcd 100644
--- a/externals/zexy/src/tavg~.c
+++ b/externals/zexy/src/tavg~.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *tavg_class;
+static t_class *tavg_class=NULL;
 
 typedef struct _tavg {
   t_object x_obj;
@@ -57,7 +57,7 @@ static t_int *tavg_perform(t_int *w)
 static void tavg_dsp(t_tavgtilde *x, t_signal **sp)
 {
   x->n_inv=1./sp[0]->s_n;
-  dsp_add(tavg_perform, 3, sp[0]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(tavg_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
 }
 
 static void *tavg_new(void)
@@ -73,16 +73,15 @@ static void tavg_help(void)
   post("<bang>\t\t:  triggers the output");
 }
 
-void tavg_tilde_setup(void)
+ZEXY_SETUP void tavg_tilde_setup(void)
 {
-  tavg_class = class_new(gensym("tavg~"), (t_newmethod)tavg_new, 0,
-                         sizeof(t_tavgtilde), 0, A_DEFFLOAT, 0);
-  class_addmethod(tavg_class, nullfn, gensym("signal"), 0);
-  class_addmethod(tavg_class, (t_method)tavg_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  tavg_class = zexy_new("tavg~",
+                        tavg_new, 0, t_tavgtilde, 0, "");
+  zexy_addmethod(tavg_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(tavg_class, (t_method)tavg_dsp, "dsp", "!");
 
   class_addbang(tavg_class, tavg_bang);
 
-  class_addmethod(tavg_class, (t_method)tavg_help, gensym("help"), 0);
+  zexy_addmethod(tavg_class, (t_method)tavg_help, "help", "");
   zexy_register("tavg~");
 }
diff --git a/externals/zexy/src/time.c b/externals/zexy/src/time.c
index 71317ab97a82d2a6bb4373e4380bf7c163cabf8b..5e4bb0b6bc19f8c5a9a669e863fff46537fbade4 100644
--- a/externals/zexy/src/time.c
+++ b/externals/zexy/src/time.c
@@ -22,8 +22,12 @@
  */
 #include "zexy.h"
 
-#ifdef __WIN32__
-#define USE_TIMEB
+#if (defined __WIN32__)
+# if (defined __i386__) && (defined __MINGW32__)
+/* unless compiling under mingw/32bit, we want USE_TIMEB in redmond-land */
+# else
+#  define USE_TIMEB
+# endif
 #endif
 
 #ifdef __APPLE__
@@ -43,7 +47,7 @@
 
 /* ----------------------- time --------------------- */
 
-static t_class *time_class;
+static t_class *time_class=NULL;
 
 typedef struct _time {
   t_object x_obj;
@@ -59,10 +63,10 @@ typedef struct _time {
 static void *time_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 {
   t_time *x = (t_time *)pd_new(time_class);
-  char buf[5];
 
   x->GMT=0;
   if (argc) {
+    char buf[5];
     atom_string(argv, buf, 5);
     if (buf[0]=='G' && buf[1]=='M' && buf[2]=='T') {
       x->GMT = 1;
@@ -80,7 +84,7 @@ static void *time_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
 static void time_bang(t_time *x)
 {
   struct tm *resolvetime;
-  float  ms = 0.f;
+  t_float  ms = 0.f;
 #ifdef USE_TIMEB
   struct timeb mytime;
   ftime(&mytime);
@@ -105,14 +109,13 @@ static void help_time(t_time* UNUSED(x))
   post("\ncreation\t:: 'time [GMT]': show local time or GMT");
 }
 
-void time_setup(void)
+ZEXY_SETUP void time_setup(void)
 {
-  time_class = class_new(gensym("time"),
-                         (t_newmethod)time_new, 0,
-                         sizeof(t_time), 0, A_GIMME, 0);
+  time_class = zexy_new("time",
+                        time_new, 0, t_time, 0, "*");
 
   class_addbang(time_class, time_bang);
 
-  class_addmethod(time_class, (t_method)help_time, gensym("help"), 0);
+  zexy_addmethod(time_class, (t_method)help_time, "help", "");
   zexy_register("time");
 }
diff --git a/externals/zexy/src/unpack.c b/externals/zexy/src/unpack.c
index 79986166c5f6904f5f6ad64fb17eb26531299330..c79b5b227c01adb699d119b5b23d1a7f737379bd 100644
--- a/externals/zexy/src/unpack.c
+++ b/externals/zexy/src/unpack.c
@@ -32,7 +32,7 @@
 
 /* like pack, but does no type-checking */
 
-static t_class *zunpack_class;
+static t_class *zunpack_class=NULL;
 
 typedef struct _zunpack {
   t_object x_obj;
@@ -54,7 +54,8 @@ static void zunpack_any(t_zunpack *x, t_symbol *s, int argc, t_atom *argv)
   }
 }
 
-static void zunpack_list(t_zunpack *x, t_symbol *s, int argc, t_atom *argv)
+static void zunpack_list(t_zunpack *x, t_symbol *UNUSED(s), int argc,
+                         t_atom *argv)
 {
   zunpack_any(x, 0, argc, argv);
 }
@@ -76,7 +77,7 @@ static void zunpack_free(t_zunpack *x)
   x->x_out=0;
 }
 
-static void *zunpack_new(t_symbol*s, int argc, t_atom*argv)
+static void *zunpack_new(t_symbol*UNUSED(s), int argc, t_atom*UNUSED(argv))
 {
   t_zunpack *x = (t_zunpack *)pd_new(zunpack_class);
   int count=(argc>0)?argc:2;
@@ -92,12 +93,11 @@ static void *zunpack_new(t_symbol*s, int argc, t_atom*argv)
   return (x);
 }
 
-void zunpack_setup(void)
+ZEXY_SETUP void zunpack_setup(void)
 {
 
-  zunpack_class = class_new(gensym("zexy/unpack"),
-                            (t_newmethod)zunpack_new, (t_method)zunpack_free, sizeof(t_zunpack),
-                            0,  A_GIMME, 0);
+  zunpack_class = zexy_new("zexy/unpack",
+                           zunpack_new, zunpack_free, t_zunpack, 0, "*");
 #if 0
   /* oops Pd-0.42 allows us to override built-ins
    * this is bad as long as the 2 objects are not compatible */
diff --git a/externals/zexy/src/unpack~.c b/externals/zexy/src/unpack~.c
index 2706261912d96a99e5ee5fd65221d27175e75e84..d7e5f3166d24785e053dd2efed753038aa9dc475 100644
--- a/externals/zexy/src/unpack~.c
+++ b/externals/zexy/src/unpack~.c
@@ -19,7 +19,7 @@
 
 #include "zexy.h"
 
-static t_class *sigunpack_class;
+static t_class *sigunpack_class=NULL;
 
 typedef struct _sigunpack {
   t_object x_obj;
@@ -39,7 +39,7 @@ static void sigunpack_float(t_sigunpack *x, t_float f)
   }
 }
 
-static void sigunpack_list(t_sigunpack *x, t_symbol *s, int argc,
+static void sigunpack_list(t_sigunpack *x, t_symbol *UNUSED(s), int argc,
                            t_atom *argv)
 {
   t_atom *ap = argv;
@@ -94,7 +94,7 @@ static void sigunpack_dsp(t_sigunpack *x, t_signal **sp)
     x->bufsize = newsize;
   }
 
-  dsp_add(sigunpack_perform, 3, sp[0]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(sigunpack_perform, 3, sp[0]->s_vec, x, sp[0]->s_n);
 }
 
 static void *sigunpack_new(t_floatarg f)
@@ -124,18 +124,14 @@ static void sigunpack_help(void)
   post("unpack~\t:: outputs a sequence of floats as a signal");
 }
 
-void unpack_tilde_setup(void)
+ZEXY_SETUP void unpack_tilde_setup(void)
 {
-  sigunpack_class = class_new(gensym("unpack~"), (t_newmethod)sigunpack_new,
-                              0,
-                              sizeof(t_sigunpack), 0, A_DEFFLOAT, 0);
-  class_addmethod(sigunpack_class, (t_method)sigunpack_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  sigunpack_class = zexy_new("unpack~",
+                             sigunpack_new, 0, t_sigunpack, 0, "F");
+  zexy_addmethod(sigunpack_class, (t_method)sigunpack_dsp, "dsp", "!");
   class_addfloat(sigunpack_class, (t_method)sigunpack_float);
   class_addlist (sigunpack_class, (t_method)sigunpack_list);
 
-
-  class_addmethod(sigunpack_class, (t_method)sigunpack_help, gensym("help"),
-                  0);
+  zexy_addmethod(sigunpack_class, (t_method)sigunpack_help, "help", "");
   zexy_register("unpack~");
 }
diff --git a/externals/zexy/src/urn.c b/externals/zexy/src/urn.c
index a7dc2f04f4702a8be1c903bbf418e7db6078a1bc..cde543d1a121a4b7efc41b7bd5feb8bd0badfb8a 100644
--- a/externals/zexy/src/urn.c
+++ b/externals/zexy/src/urn.c
@@ -21,7 +21,7 @@
 
 /* ------------------------- urn ------------------------------- */
 
-static t_class *urn_class;
+static t_class *urn_class=NULL;
 
 typedef struct _urn {
   t_object x_obj;
@@ -147,23 +147,23 @@ static void *urn_new(t_symbol* UNUSED(s), int argc, t_atom *argv)
   return (x);
 }
 
-static void urn_help(t_urn*x)
+static void urn_help(t_urn*UNUSED(x))
 {
-  post("\n"HEARTSYMBOL " urn\t\t:: generate randum numbers without repetition");
+  post("\n"HEARTSYMBOL
+       " urn\t\t:: generate randum numbers without repetition");
 }
 
-void urn_setup(void)
+ZEXY_SETUP void urn_setup(void)
 {
-  urn_class = class_new(gensym("urn"), (t_newmethod)urn_new,
-                        0, sizeof(t_urn), 0, A_GIMME,  0);
+  urn_class = zexy_new("urn",
+                       urn_new, 0, t_urn, 0, "*");
 
   class_addbang (urn_class, urn_bang);
-  class_addmethod(urn_class, (t_method)urn_clear, gensym("clear"), 0);
-  class_addmethod(urn_class, (t_method)urn_flt2, gensym(""), A_DEFFLOAT, 0);
-  class_addmethod(urn_class, (t_method)urn_seed, gensym("seed"), A_DEFFLOAT,
-                  0);
+  zexy_addmethod(urn_class, (t_method)urn_clear, "clear", "");
+  zexy_addmethod(urn_class, (t_method)urn_flt2, "", "F");
+  zexy_addmethod(urn_class, (t_method)urn_seed, "seed", "F");
 
-  class_addmethod(urn_class, (t_method)urn_help, gensym("help"), A_NULL);
+  zexy_addmethod(urn_class, (t_method)urn_help, "help", "");
 
   zexy_register("urn");
 }
diff --git a/externals/zexy/src/winNT_portio.c b/externals/zexy/src/winNT_portio.c
index b514912c58108cbc5b9649c5d2239747ce4bae20..87dae1c97159a9142065426fc5cd84bf91d6b3d4 100644
--- a/externals/zexy/src/winNT_portio.c
+++ b/externals/zexy/src/winNT_portio.c
@@ -6,18 +6,18 @@
  * to plug this on the usb bus.
  * if the interface changes, only this file has to be adopted for the target system
  */
-#if defined __WIN32__ && defined Z_WANT_LPT
+#if defined __WIN32__
 
 #include <stdio.h>
 #include <windows.h>
 
-int read_parport(int port);
-void write_parport(int port, int value);
-int open_port(int port);
+int read_parport(unsigned short int port);
+void write_parport(unsigned short int port, int value);
+int open_port(unsigned short int port);
 
 static BOOL bPrivException = FALSE;
 
-int read_parport(int port)
+int read_parport(unsigned short int port)
 {
   unsigned char value;
 #ifdef _MSC_VER
@@ -32,7 +32,7 @@ int read_parport(int port)
   return (int)value;
 }
 
-void write_parport(int port, int invalue)
+void write_parport(unsigned short int port, int invalue)
 {
   /* _outp((unsigned short)port, value); */
   BYTE value = (BYTE)invalue;
@@ -114,15 +114,15 @@ static int IsWinNT(void)
 }
 
 /* open parport */
-int open_port(int port)
+int open_port(unsigned short int port)
 {
-  if(IsWinNT()) {	/* we are under NT and need kernel driver */
+  if(IsWinNT()) { /* we are under NT and need kernel driver */
     if(StartUpIoPorts(port, 1, 0)) {
       return(0);
     }
     return(-1);
-  } else {	/* no need to use kernel driver */
+  } else { /* no need to use kernel driver */
     return(0);
   }
 }
-#endif /* __WIN32__ & Z_WANT_LPT */
+#endif /* __WIN32__ */
diff --git a/externals/zexy/src/wrap.c b/externals/zexy/src/wrap.c
index f410fe3bc5e485cb04b458c6d013d021c0e847c7..a90db2e6867c3e15eeb9face56ab68325bf94420 100644
--- a/externals/zexy/src/wrap.c
+++ b/externals/zexy/src/wrap.c
@@ -18,7 +18,7 @@
  */
 #include "zexy.h"
 
-static t_class *wrap_class;
+static t_class *wrap_class=NULL;
 
 typedef struct _wrap {
   t_object  x_obj;
@@ -71,20 +71,18 @@ static void *wrap_new(t_symbol *s, int argc, t_atom*argv)
   return (x);
 }
 
-static void wrap_help(t_wrap*x)
+static void wrap_help(t_wrap*UNUSED(x))
 {
   post("\n"HEARTSYMBOL " wrap\t\t:: wrap a float between to boundaries");
 }
 
-void wrap_setup(void)
+ZEXY_SETUP void wrap_setup(void)
 {
-  wrap_class = class_new(gensym("wrap"),
-                         (t_newmethod)wrap_new,
-                         0, sizeof(t_wrap),
-                         CLASS_DEFAULT, A_GIMME, A_NULL);
+  wrap_class = zexy_new("wrap",
+                        wrap_new, 0, t_wrap, CLASS_DEFAULT, "*");
 
   class_addfloat (wrap_class, wrap_float);
-  class_addmethod(wrap_class, (t_method)wrap_set, gensym("set"), A_GIMME, 0);
-  class_addmethod(wrap_class, (t_method)wrap_help, gensym("help"), A_NULL);
+  zexy_addmethod(wrap_class, (t_method)wrap_set, "set", "*");
+  zexy_addmethod(wrap_class, (t_method)wrap_help, "help", "");
   zexy_register("wrap");
 }
diff --git a/externals/zexy/src/z_zexy.c b/externals/zexy/src/z_zexy.c
index 8a15960cdd083f7e0db0492d6ac8fbd50ac03384..bdcc16024bcdcda7f6f3a0159a485e2141659487 100644
--- a/externals/zexy/src/z_zexy.c
+++ b/externals/zexy/src/z_zexy.c
@@ -3,95 +3,180 @@
  * !! DO NOT MANUALLY EDIT  !!
  */
 
-#include "z_zexy.h"
+/* forward declarations */
+void  setup_0x260x260x7e(void);          /*  0x260x260x7e.c      */
+void  setup_0x2e(void);                  /*  0x2e.c              */
+void  setup_0x3c0x7e(void);              /*  0x3c0x7e.c          */
+void  setup_0x3d0x3d0x7e(void);          /*  0x3d0x3d0x7e.c      */
+void  setup_0x3e0x7e(void);              /*  0x3e0x7e.c          */
+void  setup_0x7c0x7c0x7e(void);          /*  0x7c0x7c0x7e.c      */
+void  a2l_setup(void);                   /*  a2l.c               */
+void  absgn_tilde_setup(void);           /*  absgn~.c            */
+void  abs_tilde_setup(void);             /*  abs~.c              */
+void  atof_setup(void);                  /*  atof.c              */
+void  atoi_setup(void);                  /*  atoi.c              */
+void  avg_tilde_setup(void);             /*  avg~.c              */
+void  blockmirror_tilde_setup(void);     /*  blockmirror~.c      */
+void  blockshuffle_tilde_setup(void);    /*  blockshuffle~.c     */
+void  blockswap_tilde_setup(void);       /*  blockswap~.c        */
+void  date_setup(void);                  /*  date.c              */
+void  demultiplex_setup(void);           /*  demultiplex.c       */
+void  demultiplex_tilde_setup(void);     /*  demultiplex~.c      */
+void  dfreq_tilde_setup(void);           /*  dfreq~.c            */
+void  dirac_tilde_setup(void);           /*  dirac~.c            */
+void  doublepole_tilde_setup(void);      /*  doublepole~.c       */
+void  drip_setup(void);                  /*  drip.c              */
+void  envrms_tilde_setup(void);          /*  envrms~.c           */
+void  fifop_setup(void);                 /*  fifop.c             */
+void  freadln_setup(void);               /*  freadln.c           */
+void  fwriteln_setup(void);              /*  fwriteln.c          */
+void  glue_setup(void);                  /*  glue.c              */
+void  index_setup(void);                 /*  index.c             */
+void  length_setup(void);                /*  length.c            */
+void  lifop_setup(void);                 /*  lifop.c             */
+void  limiter_tilde_setup(void);         /*  limiter~.c          */
+void  list2int_setup(void);              /*  list2int.c          */
+void  list2lists_setup(void);            /*  list2lists.c        */
+void  list2symbol_setup(void);           /*  list2symbol.c       */
+void  lister_setup(void);                /*  lister.c            */
+void  listfind_setup(void);              /*  listfind.c          */
+void  liststorage_setup(void);           /*  liststorage.c       */
+void  longload_setup(void);              /*  longload.c          */
+void  lpt_setup(void);                   /*  lpt.c               */
+void  makesymbol_setup(void);            /*  makesymbol.c        */
+void  matchbox_setup(void);              /*  matchbox.c          */
+void  mavg_setup(void);                  /*  mavg.c              */
+void  minmax_setup(void);                /*  minmax.c            */
+void  msgfile_setup(void);               /*  msgfile.c           */
+void  multiline_tilde_setup(void);       /*  multiline~.c        */
+void  multiplex_setup(void);             /*  multiplex.c         */
+void  multiplex_tilde_setup(void);       /*  multiplex~.c        */
+void  multireceive_setup(void);          /*  multireceive.c      */
+void  niagara_setup(void);               /*  niagara.c           */
+void  noish_tilde_setup(void);           /*  noish~.c            */
+void  noisi_tilde_setup(void);           /*  noisi~.c            */
+void  operating_system_setup(void);      /*  operating_system.c  */
+void  zpack_setup(void);                 /*  pack.c              */
+void  packel_setup(void);                /*  packel.c            */
+void  pack_tilde_setup(void);            /*  pack~.c             */
+void  pdf_tilde_setup(void);             /*  pdf~.c              */
+void  prime_setup(void);                 /*  prime.c             */
+void  quantize_tilde_setup(void);        /*  quantize~.c         */
+void  rawprint_setup(void);              /*  rawprint.c          */
+void  regex_setup(void);                 /*  regex.c             */
+void  relay_setup(void);                 /*  relay.c             */
+void  repack_setup(void);                /*  repack.c            */
+void  repeat_setup(void);                /*  repeat.c            */
+void  route_tilde_setup(void);           /*  route~.c            */
+void  sfplay_setup(void);                /*  sfplay.c            */
+void  sfrecord_setup(void);              /*  sfrecord.c          */
+void  sgn_tilde_setup(void);             /*  sgn~.c              */
+void  sigzero_tilde_setup(void);         /*  sigzero~.c          */
+void  sleepgrain_setup(void);            /*  sleepgrain.c        */
+void  zexy_sort_setup(void);             /*  sort.c              */
+void  step_tilde_setup(void);            /*  step~.c             */
+void  strcmp_setup(void);                /*  strcmp.c            */
+void  sum_setup(void);                   /*  sum.c               */
+void  swap_tilde_setup(void);            /*  swap~.c             */
+void  symbol2list_setup(void);           /*  symbol2list.c       */
+void  tabdump_setup(void);               /*  tabdump.c           */
+void  tabminmax_setup(void);             /*  tabminmax.c         */
+void  tabread4_tilde_tilde_setup(void);  /*  tabread4~~.c        */
+void  tabset_setup(void);                /*  tabset.c            */
+void  tavg_tilde_setup(void);            /*  tavg~.c             */
+void  time_setup(void);                  /*  time.c              */
+void  zunpack_setup(void);               /*  unpack.c            */
+void  unpack_tilde_setup(void);          /*  unpack~.c           */
+void  urn_setup(void);                   /*  urn.c               */
+void  wrap_setup(void);                  /*  wrap.c              */
+void  z_tilde_setup(void);               /*  z~.c                */
 
 void z_zexy_setup(void)
 {
-  setup_0x260x260x7e(); /* 0x260x260x7e */
-  setup_0x2e(); /* 0x2e */
-  setup_0x3c0x7e(); /* 0x3c0x7e */
-  setup_0x3d0x3d0x7e(); /* 0x3d0x3d0x7e */
-  setup_0x3e0x7e(); /* 0x3e0x7e */
-  setup_0x7c0x7c0x7e(); /* 0x7c0x7c0x7e */
-  a2l_setup(); /* a2l */
-  abs_tilde_setup(); /* abs~ */
-  absgn_tilde_setup(); /* absgn~ */
-  atof_setup(); /* atof */
-  atoi_setup(); /* atoi */
-  avg_tilde_setup(); /* avg~ */
-  blockmirror_tilde_setup(); /* blockmirror~ */
-  blockshuffle_tilde_setup(); /* blockshuffle~ */
-  blockswap_tilde_setup(); /* blockswap~ */
-  date_setup(); /* date */
-  demultiplex_tilde_setup(); /* demultiplex~ */
-  demultiplex_setup(); /* demultiplex */
-  dfreq_tilde_setup(); /* dfreq~ */
-  dirac_tilde_setup(); /* dirac~ */
-  doublepole_tilde_setup(); /* doublepole~ */
-  drip_setup(); /* drip */
-  envrms_tilde_setup(); /* envrms~ */
-  fifop_setup(); /* fifop */
-  freadln_setup(); /* freadln */
-  fwriteln_setup(); /* fwriteln */
-  glue_setup(); /* glue */
-  index_setup(); /* index */
-  length_setup(); /* length */
-  lifop_setup(); /* lifop */
-  limiter_tilde_setup(); /* limiter~ */
-  list2int_setup(); /* list2int */
-  list2lists_setup(); /* list2lists */
-  list2symbol_setup(); /* list2symbol */
-  lister_setup(); /* lister */
-  listfind_setup(); /* listfind */
-  liststorage_setup(); /* liststorage */
-  longload_setup(); /* longload */
-  lpt_setup(); /* lpt */
-  makesymbol_setup(); /* makesymbol */
-  matchbox_setup(); /* matchbox */
-  mavg_setup(); /* mavg */
-  minmax_setup(); /* minmax */
-  msgfile_setup(); /* msgfile */
-  multiline_tilde_setup(); /* multiline~ */
-  multiplex_tilde_setup(); /* multiplex~ */
-  multiplex_setup(); /* multiplex */
-  multireceive_setup(); /* multireceive */
-  niagara_setup(); /* niagara */
-  noish_tilde_setup(); /* noish~ */
-  noisi_tilde_setup(); /* noisi~ */
-  operating_system_setup(); /* operating_system */
-  pack_tilde_setup(); /* pack~ */
-  pack_setup(); /* pack */
-  packel_setup(); /* packel */
-  pdf_tilde_setup(); /* pdf~ */
-  prime_setup(); /* prime */
-  quantize_tilde_setup(); /* quantize~ */
-  rawprint_setup(); /* rawprint */
-  regex_setup(); /* regex */
-  relay_setup(); /* relay */
-  repack_setup(); /* repack */
-  repeat_setup(); /* repeat */
-  route_tilde_setup(); /* route~ */
-  sfplay_setup(); /* sfplay */
-  sfrecord_setup(); /* sfrecord */
-  sgn_tilde_setup(); /* sgn~ */
-  sigzero_tilde_setup(); /* sigzero~ */
-  sleepgrain_setup(); /* sleepgrain */
-  sort_setup(); /* sort */
-  step_tilde_setup(); /* step~ */
-  strcmp_setup(); /* strcmp */
-  sum_setup(); /* sum */
-  swap_tilde_setup(); /* swap~ */
-  symbol2list_setup(); /* symbol2list */
-  tabdump_setup(); /* tabdump */
-  tabminmax_setup(); /* tabminmax */
-  tabread4_tilde_tilde_setup(); /* tabread4~~ */
-  tabset_setup(); /* tabset */
-  tavg_tilde_setup(); /* tavg~ */
-  time_setup(); /* time */
-  unpack_tilde_setup(); /* unpack~ */
-  unpack_setup(); /* unpack */
-  urn_setup(); /* urn */
-  wrap_setup(); /* wrap */
-  z_tilde_setup(); /* z~ */
+  setup_0x260x260x7e();
+  setup_0x2e();
+  setup_0x3c0x7e();
+  setup_0x3d0x3d0x7e();
+  setup_0x3e0x7e();
+  setup_0x7c0x7c0x7e();
+  a2l_setup();
+  absgn_tilde_setup();
+  abs_tilde_setup();
+  atof_setup();
+  atoi_setup();
+  avg_tilde_setup();
+  blockmirror_tilde_setup();
+  blockshuffle_tilde_setup();
+  blockswap_tilde_setup();
+  date_setup();
+  demultiplex_setup();
+  demultiplex_tilde_setup();
+  dfreq_tilde_setup();
+  dirac_tilde_setup();
+  doublepole_tilde_setup();
+  drip_setup();
+  envrms_tilde_setup();
+  fifop_setup();
+  freadln_setup();
+  fwriteln_setup();
+  glue_setup();
+  index_setup();
+  length_setup();
+  lifop_setup();
+  limiter_tilde_setup();
+  list2int_setup();
+  list2lists_setup();
+  list2symbol_setup();
+  lister_setup();
+  listfind_setup();
+  liststorage_setup();
+  longload_setup();
+  lpt_setup();
+  makesymbol_setup();
+  matchbox_setup();
+  mavg_setup();
+  minmax_setup();
+  msgfile_setup();
+  multiline_tilde_setup();
+  multiplex_setup();
+  multiplex_tilde_setup();
+  multireceive_setup();
+  niagara_setup();
+  noish_tilde_setup();
+  noisi_tilde_setup();
+  operating_system_setup();
+  zpack_setup();
+  packel_setup();
+  pack_tilde_setup();
+  pdf_tilde_setup();
+  prime_setup();
+  quantize_tilde_setup();
+  rawprint_setup();
+  regex_setup();
+  relay_setup();
+  repack_setup();
+  repeat_setup();
+  route_tilde_setup();
+  sfplay_setup();
+  sfrecord_setup();
+  sgn_tilde_setup();
+  sigzero_tilde_setup();
+  sleepgrain_setup();
+  zexy_sort_setup();
+  step_tilde_setup();
+  strcmp_setup();
+  sum_setup();
+  swap_tilde_setup();
+  symbol2list_setup();
+  tabdump_setup();
+  tabminmax_setup();
+  tabread4_tilde_tilde_setup();
+  tabset_setup();
+  tavg_tilde_setup();
+  time_setup();
+  zunpack_setup();
+  unpack_tilde_setup();
+  urn_setup();
+  wrap_setup();
+  z_tilde_setup();
 }
-
diff --git a/externals/zexy/src/z_zexy.h b/externals/zexy/src/z_zexy.h
deleted file mode 100644
index f8f6c55396993fd15dc73e022959e9769cb2e1a4..0000000000000000000000000000000000000000
--- a/externals/zexy/src/z_zexy.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/* zexy-setup autogenerated header-file
- * generated by "./makesource.sh"
- * !! DO NOT MANUALLY EDIT  !!
- */
-
-#ifndef Z_ZEXY_H__
-#define Z_ZEXY_H__
-void setup_0x260x260x7e(void); /* 0x260x260x7e */
-void setup_0x2e(void); /* 0x2e */
-void setup_0x3c0x7e(void); /* 0x3c0x7e */
-void setup_0x3d0x3d0x7e(void); /* 0x3d0x3d0x7e */
-void setup_0x3e0x7e(void); /* 0x3e0x7e */
-void setup_0x7c0x7c0x7e(void); /* 0x7c0x7c0x7e */
-void a2l_setup(void); /* a2l */
-void abs_tilde_setup(void); /* abs~ */
-void absgn_tilde_setup(void); /* absgn~ */
-void atof_setup(void); /* atof */
-void atoi_setup(void); /* atoi */
-void avg_tilde_setup(void); /* avg~ */
-void blockmirror_tilde_setup(void); /* blockmirror~ */
-void blockshuffle_tilde_setup(void); /* blockshuffle~ */
-void blockswap_tilde_setup(void); /* blockswap~ */
-void date_setup(void); /* date */
-void demultiplex_tilde_setup(void); /* demultiplex~ */
-void demultiplex_setup(void); /* demultiplex */
-void dfreq_tilde_setup(void); /* dfreq~ */
-void dirac_tilde_setup(void); /* dirac~ */
-void doublepole_tilde_setup(void); /* doublepole~ */
-void drip_setup(void); /* drip */
-void envrms_tilde_setup(void); /* envrms~ */
-void fifop_setup(void); /* fifop */
-void freadln_setup(void); /* freadln */
-void fwriteln_setup(void); /* fwriteln */
-void glue_setup(void); /* glue */
-void index_setup(void); /* index */
-void length_setup(void); /* length */
-void lifop_setup(void); /* lifop */
-void limiter_tilde_setup(void); /* limiter~ */
-void list2int_setup(void); /* list2int */
-void list2lists_setup(void); /* list2lists */
-void list2symbol_setup(void); /* list2symbol */
-void lister_setup(void); /* lister */
-void listfind_setup(void); /* listfind */
-void liststorage_setup(void); /* liststorage */
-void longload_setup(void); /* longload */
-void lpt_setup(void); /* lpt */
-void makesymbol_setup(void); /* makesymbol */
-void matchbox_setup(void); /* matchbox */
-void mavg_setup(void); /* mavg */
-void minmax_setup(void); /* minmax */
-void msgfile_setup(void); /* msgfile */
-void multiline_tilde_setup(void); /* multiline~ */
-void multiplex_tilde_setup(void); /* multiplex~ */
-void multiplex_setup(void); /* multiplex */
-void multireceive_setup(void); /* multireceive */
-void niagara_setup(void); /* niagara */
-void noish_tilde_setup(void); /* noish~ */
-void noisi_tilde_setup(void); /* noisi~ */
-void operating_system_setup(void); /* operating_system */
-void pack_tilde_setup(void); /* pack~ */
-void pack_setup(void); /* pack */
-void packel_setup(void); /* packel */
-void pdf_tilde_setup(void); /* pdf~ */
-void prime_setup(void); /* prime */
-void quantize_tilde_setup(void); /* quantize~ */
-void rawprint_setup(void); /* rawprint */
-void regex_setup(void); /* regex */
-void relay_setup(void); /* relay */
-void repack_setup(void); /* repack */
-void repeat_setup(void); /* repeat */
-void route_tilde_setup(void); /* route~ */
-void sfplay_setup(void); /* sfplay */
-void sfrecord_setup(void); /* sfrecord */
-void sgn_tilde_setup(void); /* sgn~ */
-void sigzero_tilde_setup(void); /* sigzero~ */
-void sleepgrain_setup(void); /* sleepgrain */
-void sort_setup(void); /* sort */
-void step_tilde_setup(void); /* step~ */
-void strcmp_setup(void); /* strcmp */
-void sum_setup(void); /* sum */
-void swap_tilde_setup(void); /* swap~ */
-void symbol2list_setup(void); /* symbol2list */
-void tabdump_setup(void); /* tabdump */
-void tabminmax_setup(void); /* tabminmax */
-void tabread4_tilde_tilde_setup(void); /* tabread4~~ */
-void tabset_setup(void); /* tabset */
-void tavg_tilde_setup(void); /* tavg~ */
-void time_setup(void); /* time */
-void unpack_tilde_setup(void); /* unpack~ */
-void unpack_setup(void); /* unpack */
-void urn_setup(void); /* urn */
-void wrap_setup(void); /* wrap */
-void z_tilde_setup(void); /* z~ */
-
-void z_zexy_setup(void);
-#endif /* Z_ZEXY_H__ */
-
diff --git a/externals/zexy/src/zexy.c b/externals/zexy/src/zexy.c
index e55f04dca29a4ad91baad3510abd839f4163439e..ae10a2882d74f3b694ca479c7b895cf0db640b6c 100644
--- a/externals/zexy/src/zexy.c
+++ b/externals/zexy/src/zexy.c
@@ -22,7 +22,6 @@
 */
 
 #include "zexy.h"
-#include "z_zexy.h"
 
 #include <stdio.h>
 #include <stdarg.h>
@@ -32,13 +31,16 @@
 # define vsnprintf _vsnprintf
 #endif
 
+/* foward declarations */
+void  z_zexy_setup(void);
+
 /* do a little help thing */
 
 typedef struct zexy {
   t_object t_ob;
 } t_zexy;
 
-t_class *zexy_class;
+t_class *zexy_class=NULL;
 
 static void zexy_help(void)
 {
@@ -88,7 +90,7 @@ static void zexy_help(void)
   post("sigzero~\t:: indicates whether a signal is zero throughout the block");
   post("avg~\t\t:: outputs average of a signal as float");
   post("tavg~\t\t:: outputs average of a signal between two bangs");
-  post("envrms~\t\t:: an env~-object that ouputs rms instead of db");
+  post("envrms~\t\t:: an env~-object that outputs rms instead of db");
   post("pdf~\t\t:: power density function");
 
   endpost();
@@ -137,7 +139,7 @@ static void zexy_help(void)
   endpost();
 }
 
-static void *zexy_new(void)
+static void *zexy_ctor(void)
 {
   t_zexy *x = (t_zexy *)pd_new(zexy_class);
   return (x);
@@ -165,8 +167,9 @@ void zexy_setup(void)
   endpost();
   endpost();
 
-  zexy_class = class_new(gensym("zexy"), zexy_new, 0, sizeof(t_zexy), 0, 0);
-  class_addmethod(zexy_class, zexy_help, gensym("help"), 0);
+  zexy_class = zexy_new("zexy",
+                        zexy_ctor, 0, t_zexy, 0, "");
+  zexy_addmethod(zexy_class, (t_method)zexy_help, "help", "");
 
   zexy_register("zexy");
 
diff --git a/externals/zexy/src/zexy.h b/externals/zexy/src/zexy.h
index ea6e2376307edccacde2e86ee961b1b4c26b10fc..a434c4a9a6e063aa8b22480443519bbd468a1f61 100644
--- a/externals/zexy/src/zexy.h
+++ b/externals/zexy/src/zexy.h
@@ -31,27 +31,6 @@
 #ifndef INCLUDE_ZEXY_H__
 #define INCLUDE_ZEXY_H__
 
-#ifdef __WIN32__
-# ifndef NT
-#  define NT
-# endif
-# ifndef MSW
-#  define MSW
-# endif
-#endif
-
-/*
- * to use the zexyconf.h compile-time configurations, you have to set HAVE_CONFIG_H
- * usually this is done in Make.config by configure
- */
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#else
-# include "zexyconf.h"
-#endif /* HAVE_CONFIG_H */
-
-
-
 /* these pragmas are only used for MSVC, not MinGW or Cygwin */
 #ifdef _MSC_VER
 # pragma warning( disable : 4018 )
@@ -63,8 +42,6 @@
 #include "m_pd.h"
 
 
-
-
 #ifndef VERSION
 # define VERSION "(unknown version)"
 #endif
@@ -93,20 +70,17 @@
 # define STATIC_INLINE static
 #endif
 
-#ifdef __APPLE__
-# include <AvailabilityMacros.h>
-# if defined (MAC_OS_X_VERSION_10_3) && MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_3
-#  define sqrtf sqrt
-# endif /* OSX-10.3 */
-#endif /* APPLE */
-
-
 #ifdef __GNUC__
-#  define UNUSED(x) ZUNUSED_ ## x __attribute__((__unused__))
-#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) ZUNUSEDFUN_ ## x
+# define UNUSED(x) ZUNUSED_ ## x __attribute__((__unused__))
+# define UNUSED_FUNCTION(x) __attribute__((__unused__)) ZUNUSEDFUN_ ## x
+# define MAYBE_USED_FUNCTION(x) __attribute__((__unused__)) x
+# if __GNUC__ >= 9
+#  pragma GCC diagnostic ignored "-Wcast-function-type"
+# endif
 #else
-#  define UNUSED(x) ZUNUSED_ ## x
-#  define UNUSED_FUNCTION(x) ZUNUSEDFUN_ ## x
+# define UNUSED(x) ZUNUSED_ ## x
+# define UNUSED_FUNCTION(x) ZUNUSEDFUN_ ## x
+# define MAYBE_USED_FUNCTION(x) x
 #endif
 
 #define ZEXY_TYPE_EQUAL(type1, type2) (sizeof(type1) == sizeof(type2))
@@ -122,67 +96,93 @@ typedef struct _mypdlist {
 # define BUILD_DATE  __DATE__
 #endif
 
+#if PD_FLOATSIZE == 32
+# define Z_FABS(f) fabsf(f)
+#else
+# define Z_FABS(f) fabs(f)
+#endif
+
+/* marker for setup-functions to be called by zexy_setup() */
+#define ZEXY_SETUP
+
+/* convenience functions */
+static int zexy_argparse(const char*argstring, int argc, t_atomtype*argv)
+{
+  const char*args = argstring;
+  int i;
+  for(i=0; i<argc; i++) {
+    argv[i]=A_NULL;
+  }
+  for(i=0; i<argc && *args; i++, args++) {
+    switch(*args) {
+    case 'f':
+      argv[i] = A_FLOAT;
+      break;
+    case 'F':
+      argv[i] = A_DEFFLOAT;
+      break;
+    case 's':
+      argv[i] = A_SYMBOL;
+      break;
+    case 'S':
+      argv[i] = A_DEFSYM;
+      break;
+    case 'p':
+      argv[i] = A_POINTER;
+      break;
+    case '!':
+      argv[i] = A_CANT;
+      break;
+    case '*':
+      argv[i] = A_GIMME;
+      break;
+    default:
+      error("ZEXYERROR: unknown argument specifier '%s'", argstring);
+      return -1;
+    }
+  }
+  return i;
+}
+
+static t_class MAYBE_USED_FUNCTION(*zexy_classnew) (const char*name,
+    t_newmethod newmethod, t_method freemethod, size_t size, int flags,
+    const char*args)
+{
+  t_atomtype at[5];
+  if(zexy_argparse(args, 5, at) < 0) {
+    return 0;
+  }
+  return class_new(gensym(name), newmethod, freemethod, size, flags, at[0],
+                   at[1], at[2], at[3], at[4], A_NULL);
+}
+#define zexy_new(name, ctor, dtor, memberstruct, flags, args) \
+  zexy_classnew(name, (t_newmethod)ctor, (t_method)dtor, sizeof(memberstruct), flags, args)
+
+
+static void MAYBE_USED_FUNCTION(zexy_addmethod) (t_class*c, t_method fn,
+    const char*s, const char*args)
+{
+  /* wrapper around 'class_addmethod' that is a bit more terse... */
+  t_atomtype at[5];
+  if(zexy_argparse(args, 5, at) < 0) {
+    return;
+  }
+  class_addmethod(c, fn, gensym(s), at[0], at[1], at[2], at[3], at[4],
+                  A_NULL);
+}
 
 #ifndef ZEXY_LIBRARY
 static void zexy_register(char*object)
 {
   if(object!=0) {
     post("[%s] part of zexy-%s (compiled "BUILD_DATE")", object, VERSION);
-    post("\tCopyright (c) 1999-2012 IOhannes m zmölnig, forum::für::umläute & IEM");
+    post("\tCopyright (c) 1999-2018 IOhannes m zmölnig, forum::für::umläute & IEM");
   }
 }
 #else
-static void zexy_register(char*object)
+static void zexy_register(char*UNUSED(object))
 {
-  object=0;
 }
 #endif /* ZEXY_LIBRARY */
 
-#if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 38)
-/*
- * pd>=0.39 has a verbose() function; older versions don't
- * btw, this finally makes zexy binary incompatible with older version
- */
-# define z_verbose verbose
-
-/* when compiling zexy as library, we also provide now provide a dummy verbose() function,
- * which will chime in, when pd is lacking one
- * this should make zexy binary compatible with older pd versions again
- */
-# ifndef __WIN32__
-void verbose(int level, const char *fmt, ...);
-# endif
-#else
-/*
- * on older version we just shut up!
- */
-# define z_verbose
-#endif
-
-#if (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION > 43)
-# define z_open sys_open
-# define z_close sys_close
-# define z_fopen sys_fopen
-# define z_fclose sys_fclose
-#else
-# define z_open open
-# define z_close close
-# define z_fopen fopen
-# define z_fclose fclose
-#endif
-
-
-#if (defined __x86_64__) && (defined PD_MAJOR_VERSION && defined PD_MINOR_VERSION) && (PD_MAJOR_VERSION > 0 || PD_MINOR_VERSION >= 41)
-# define zarray_t t_word
-# define zarray_getarray garray_getfloatwords
-# define zarray_getfloat(pointer, index) (pointer[index].w_float)
-# define zarray_setfloat(pointer, index, value) ((pointer[index].w_float)=value)
-#else
-# define zarray_t t_float
-# define zarray_getarray garray_getfloatarray
-# define zarray_getfloat(pointer, index) (pointer[index])
-# define zarray_setfloat(pointer, index, value) ((pointer[index])=value)
-#endif
-
-
 #endif /* INCLUDE_ZEXY_H__ */
diff --git a/externals/zexy/src/zexySIMD.h b/externals/zexy/src/zexySIMD.h
index a9048c04e1d235f42316f94bee46b4e422606025..9b9906637cd00d75f2425eccc42d4edaace18adc 100644
--- a/externals/zexy/src/zexySIMD.h
+++ b/externals/zexy/src/zexySIMD.h
@@ -6,7 +6,7 @@
 #define Z_SIMD_BLOCK 16  /* must be a power of 2 */
 #define Z_SIMD_BYTEALIGN (128/8)   /* assume 128 bits */
 #define Z_SIMD_CHKBLOCKSIZE(n) (!(n&(Z_SIMD_BLOCK-1)))
-#define Z_SIMD_CHKALIGN(ptr) ( ((unsigned long)(ptr) & (Z_SIMD_BYTEALIGN-1)) == 0 )
+#define Z_SIMD_CHKALIGN(ptr) ( ((t_int)(ptr) & (Z_SIMD_BYTEALIGN-1)) == 0 )
 
 typedef union {
   __m128 vec;
@@ -17,17 +17,21 @@ typedef union {
  * runs a check whether the SSE-optimized perform routine returns the same result as the generic routine
  * if the results differ, the SSE-code is probably broken, so we should fallback to the generic code
  */
+#ifdef __GNUC__
+# pragma GCC diagnostic push
+# pragma GCC diagnostic ignored "-Wunused-function"
+#endif
 static int zexy_testSSE(t_perfroutine genericperf, t_perfroutine sseperf,
                         unsigned int numinchannels, unsigned int numoutchannels)
 {
   /* this currently only works with single input, single output */
-  /* LATER make it work truely multichannel */
+  /* LATER make it work truly multichannel */
   if(1==numinchannels && 1==numoutchannels) {
     t_int w1[4], w2[4];
     t_sample4 in, in1[4], in2[4], out1[4], out2[4];
     int i, j;
 
-    z_verbose(2, "checking for SSE compatibility");
+    verbose(2, "checking for SSE compatibility");
 
     in.f[0]=0.;
     in.f[1]=-0.5;
@@ -62,14 +66,14 @@ static int zexy_testSSE(t_perfroutine genericperf, t_perfroutine sseperf,
 
     for(i=0; i<4; i++) {
       for(j=0; j<4; j++) {
-        if(fabsf(out1[i].f[j]-out2[i].f[j])>1e-17) {
-          z_verbose(2,
-                    "generic and optimized routines return different results: skipping optimization");
-          z_verbose(2, "[%d,%d]: ((%f->%f)!=(%f->%f))",
-                    i, j,
-                    in1[i].f[j], out1[i].f[j],
-                    in2[i].f[j], out2[i].f[j]
-                   );
+        if(Z_FABS(out1[i].f[j]-out2[i].f[j])>1e-17) {
+          verbose(2,
+                  "generic and optimized routines return different results: skipping optimization");
+          verbose(2, "[%d,%d]: ((%f->%f)!=(%f->%f))",
+                  i, j,
+                  in1[i].f[j], out1[i].f[j],
+                  in2[i].f[j], out2[i].f[j]
+                 );
           return 0;
         }
       }
@@ -77,9 +81,12 @@ static int zexy_testSSE(t_perfroutine genericperf, t_perfroutine sseperf,
   } else {
     /* no tests yet */
   }
-  z_verbose(2, "using SSE optimization");
+  verbose(2, "using SSE optimization");
   return 1;
 }
+#ifdef __GNUC__
+# pragma GCC diagnostic pop
+#endif
 
 #endif /* __SSE__ */
 
diff --git a/externals/zexy/src/zexy_strndup.h b/externals/zexy/src/zexy_strndup.h
new file mode 100644
index 0000000000000000000000000000000000000000..c74ce2211247c327c1f8b35b64baa98b817a7dbf
--- /dev/null
+++ b/externals/zexy/src/zexy_strndup.h
@@ -0,0 +1,52 @@
+/* ********************************************** */
+/* the ZEXY external                              */
+/* ********************************************** */
+/*                            forum::für::umläute */
+/* ********************************************** */
+
+/* the ZEXY external is a runtime-library for miller s. puckette's realtime-computermusic-software "pure data"
+ * therefore you NEED "pure data" to make any use of the ZEXY external
+ * (except if you want to use the code for other things)
+ * download "pure data" at
+
+ http://pd.iem.at
+ ftp://iem.at/pd
+
+ *
+ * if you are looking for the latest release of the ZEXY-external you should have another look at
+
+ http://puredata.info/community/projects/software/zexy/
+ ftp://iem.at/pd/Externals/ZEXY
+
+ *
+ * ZEXY is published under the GNU GeneralPublicLicense, that must be shipped with ZEXY.
+ * if you are using Debian GNU/linux, the GNU-GPL can be found under /usr/share/common-licenses/GPL
+ * if you still haven't found a copy of the GNU-GPL, have a look at http://www.gnu.org
+ *
+ * "pure data" has it's own license, that comes shipped with "pure data".
+ *
+ * there are ABSOLUTELY NO WARRANTIES for anything
+ */
+
+#ifndef INCLUDE_ZEXY_STRNDUP_H__
+#define INCLUDE_ZEXY_STRNDUP_H__
+
+#include <stdlib.h>
+#include <string.h>
+static char *zexy_strndup(const char *s, size_t n)
+{
+  char *result=0;
+  size_t len = strlen(s) + 1;
+  if(len>n) {
+    len=n+1;
+  }
+
+  result = malloc(len);
+  if(!result) {
+    return result;
+  }
+  memcpy(result, s, len);
+  result[len-1] = 0;
+  return result;
+}
+#endif /* INCLUDE_ZEXY_STRNDUP_H__ */
diff --git a/externals/zexy/src/zexyconf.h b/externals/zexy/src/zexyconf.h
deleted file mode 100644
index a592ae71a9e5b7bcf4b589d53af763da4e2d0331..0000000000000000000000000000000000000000
--- a/externals/zexy/src/zexyconf.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef _ZEXYCONF_H_
-#define _ZEXYCONF_H_
-/* zexyconf.h: configuration for zexy:
- *		this is only included if no config.h is created
- *		adapt this to your own needs
- */
-
-/* Define if you have the <regex.h> header file.  */
-/*
-#undef HAVE_REGEX_H
-*/
-
-/* Define if you have the <alloca.h> header file.  */
-/*
-#undef HAVE_ALLOCA_H
-*/
-
-/* define if you want parallelport-support (direct access to the port address) */
-/*
-#undef Z_WANT_LPT
-*/
-
-/* define if you have the <linux/ppdev.h> header file.
- * (for parport _device_ support)
- * you need Z_WANT_LPT for this to have an effect !
- */
-/*
-#undef HAVE_LINUX_PPDEV_H
-*/
-
-#endif /* _ZEXYCONF_H_ */
-
diff --git a/externals/zexy/src/z~.c b/externals/zexy/src/z~.c
index bafca048360221129806d7bc569a2d2601f92594..ae9acc07b1c6e25ab163ff6577065c9f0f21d395 100644
--- a/externals/zexy/src/z~.c
+++ b/externals/zexy/src/z~.c
@@ -29,7 +29,7 @@
 
 /* ----------------------------------------------------- */
 
-static t_class *zNdelay_class;
+static t_class *zNdelay_class=NULL;
 
 typedef struct _zNdelay {
   t_object x_obj;
@@ -89,10 +89,10 @@ static t_int *zN_perform(t_int *w)
 
 static void zNdelay_dsp(t_zNdelay *x, t_signal **sp)
 {
-  dsp_add(zN_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, (t_int)sp[0]->s_n);
+  dsp_add(zN_perform, 4, sp[0]->s_vec, sp[1]->s_vec, x, sp[0]->s_n);
 }
 
-static void *zNdelay_new(t_symbol*s, int argc, t_atom*argv)
+static void *zNdelay_new(t_symbol*UNUSED(s), int argc, t_atom*argv)
 {
   t_zNdelay *x = 0;
   int i = 0;
@@ -107,6 +107,7 @@ static void *zNdelay_new(t_symbol*s, int argc, t_atom*argv)
       i=atom_getint(argv);
       break;
     }
+  /* fallthrough */
   default:
     error("Bad arguments for [z~]: must be nought or initial delay [in samples]");
     return 0;
@@ -145,18 +146,15 @@ static void zdel_helper(void)
 }
 
 
-void z_tilde_setup(void)
+ZEXY_SETUP void z_tilde_setup(void)
 {
-  zNdelay_class = class_new(gensym("z~"), (t_newmethod)zNdelay_new,
-                            (t_method)zNdelay_free,
-                            sizeof(t_zNdelay), 0, A_GIMME, 0);
-  class_addmethod(zNdelay_class, nullfn, gensym("signal"), 0);
-  class_addmethod(zNdelay_class, (t_method)zNdelay_dsp, gensym("dsp"),
-                  A_CANT, 0);
+  zNdelay_class = zexy_new("z~",
+                           zNdelay_new, zNdelay_free, t_zNdelay, 0, "*");
+  zexy_addmethod(zNdelay_class, (t_method)nullfn, "signal", "");
+  zexy_addmethod(zNdelay_class, (t_method)zNdelay_dsp, "dsp", "!");
 
   class_addfloat(zNdelay_class, zdel_float);
-  class_addmethod(zNdelay_class, (t_method)zdel_float, gensym("ft1"),
-                  A_FLOAT, 0);
-  class_addmethod(zNdelay_class, (t_method)zdel_helper, gensym("help"), 0);
+  zexy_addmethod(zNdelay_class, (t_method)zdel_float, "ft1", "f");
+  zexy_addmethod(zNdelay_class, (t_method)zdel_helper, "help", "");
   zexy_register("z~");
 }
diff --git a/externals/zexy/tests/Makefile.am b/externals/zexy/tests/Makefile.am
deleted file mode 100644
index 4010f0aacaf0359be6adb8f5c8ac844c7a9f90ed..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/Makefile.am
+++ /dev/null
@@ -1,126 +0,0 @@
-AUTOMAKE_OPTIONS = foreign
-
-TESTS_ENVIRONMENT = RUNTESTS_NOLOG=yes TESTDIR=$(srcdir)
-
-TESTS=runtests.sh
-
-clean-local:
-	-rm -f runtests.txt
-
-EXTRA_DIST = \
-	README.txt \
-	runtests.sh \
-	runtests.bat \
-	runtests_nogui.pd \
-	runtests.pd \
-	testunit.pd
-
-EXTRA_DIST += \
-	msgfile/CR.txt \
-	msgfile/msgfile.txt \
-	testtests/README.txt \
-	absgn~/abs.pd \
-	absgn~/sgn.pd \
-	abs~/simple.pd \
-	and~/dualnoise.pd \
-	and~/singlenoise.pd \
-	eq~/dualnoise.pd \
-	eq~/singlenoise.pd \
-	gt~/dualnoise.pd \
-	gt~/singlenoise.pd \
-	help-msg/0x260x260x7e.pd \
-	help-msg/0x2e.pd \
-	help-msg/0x3c0x7e.pd \
-	help-msg/0x3d0x3d0x7e.pd \
-	help-msg/0x3e0x7e.pd \
-	help-msg/0x7c0x7c0x7e.pd \
-	help-msg/a2l.pd \
-	help-msg/absgn~.pd \
-	help-msg/abs~.pd \
-	help-msg/atoi.pd \
-	help-msg/avg~.pd \
-	help-msg/blockmirror~.pd \
-	help-msg/blockswap~.pd \
-	help-msg/date.pd \
-	help-msg/demultiplex~.pd \
-	help-msg/demultiplex.pd \
-	help-msg/dfreq~.pd \
-	help-msg/dirac~.pd \
-	help-msg/drip.pd \
-	help-msg/envrms~.pd \
-	help-msg/fifop.pd \
-	help-msg/glue.pd \
-	help-msg/index.pd \
-	help-msg/length.pd \
-	help-msg/lifop.pd \
-	help-msg/limiter~.pd \
-	help-msg/list2int.pd \
-	help-msg/list2symbol.pd \
-	help-msg/lister.pd \
-	help-msg/lpt.pd \
-	help-msg/makesymbol.pd \
-	help-msg/mavg.pd \
-	help-msg/minmax.pd \
-	help-msg/msgfile.pd \
-	help-msg/multiline~.pd \
-	help-msg/multiplex~.pd \
-	help-msg/multiplex.pd \
-	help-msg/niagara.pd \
-	help-msg/noish~.pd \
-	help-msg/noisi~.pd \
-	help-msg/operating_system.pd \
-	help-msg/packel.pd \
-	help-msg/pack~.pd \
-	help-msg/pdf~.pd \
-	help-msg/prime.pd \
-	help-msg/quantize~.pd \
-	help-msg/regex.pd \
-	help-msg/relay.pd \
-	help-msg/repack.pd \
-	help-msg/repeat.pd \
-	help-msg/sfplay.pd \
-	help-msg/sfrecord.pd \
-	help-msg/sgn~.pd \
-	help-msg/sigzero~.pd \
-	help-msg/sort.pd \
-	help-msg/step~.pd \
-	help-msg/strcmp.pd \
-	help-msg/sum.pd \
-	help-msg/swap~.pd \
-	help-msg/symbol2list.pd \
-	help-msg/tabdump.pd \
-	help-msg/tabminmax.pd \
-	help-msg/tabset.pd \
-	help-msg/tavg~.pd \
-	help-msg/time.pd \
-	help-msg/unpack~.pd \
-	help-msg/urn.pd \
-	help-msg/wrap.pd \
-	help-msg/zexy_.pd \
-	help-msg/z~.pd \
-	l2s/argument.pd \
-	l2s/delimiter.pd \
-	list2lists/negativelength.pd \
-	lister/inline2.pd \
-	lister/inline.pd \
-	lt~/dualnoise.pd \
-	lt~/singlenoise.pd \
-	msgfile/add2.pd \
-	msgfile/empty_at_end.pd \
-	msgfile/emptyreplace.pd \
-	msgfile/loadingCR.pd \
-	msgfile/loading.pd \
-	msgfile/prev_from_end.pd \
-	msgfile/reentrant.pd \
-	or~/dualnoise.pd \
-	or~/singlenoise.pd \
-	repeat/noargs.pd \
-	s2l/numsymbols.pd \
-	sgn~/simple.pd \
-	testtests/fail_noresult.pd \
-	testtests/fail.pd \
-	testtests/fail_wait0.pd \
-	testtests/fail_wait10.pd \
-	testtests/pass.pd \
-	testtests/pass_wait0.pd \
-	testtests/pass_wait10.pd
diff --git a/externals/zexy/tests/help-msg/0x260x260x7e.pd b/externals/zexy/tests/help-msg/0x260x260x7e.pd
deleted file mode 100644
index 4b6ce12e27fd2632dedb78d9f7c996593b3cbe8b..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/0x260x260x7e.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 341 512 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [0x260x260x7e] crashes when a "help"-message
-is sent;
-#X obj 113 214 &&~;
-#X connect 0 0 2 0;
-#X connect 2 0 3 0;
-#X connect 2 1 4 0;
-#X connect 3 0 1 0;
-#X connect 4 0 6 0;
diff --git a/externals/zexy/tests/help-msg/0x2e.pd b/externals/zexy/tests/help-msg/0x2e.pd
deleted file mode 100644
index f18564c04c6e9c779cf189e62d7244938e8637cd..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/0x2e.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [0x2e] crashes when a "help"-message is
-sent;
-#X obj 113 214 .;
-#X connect 0 0 2 0;
-#X connect 2 0 3 0;
-#X connect 2 1 4 0;
-#X connect 3 0 1 0;
-#X connect 4 0 6 0;
diff --git a/externals/zexy/tests/help-msg/0x3c0x7e.pd b/externals/zexy/tests/help-msg/0x3c0x7e.pd
deleted file mode 100644
index 8801e63b46a2f7f2bdb0928c3d3b03088e05416c..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/0x3c0x7e.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [0x3c0x7e] crashes when a "help"-message
-is sent;
-#X obj 113 214 >~;
-#X connect 0 0 2 0;
-#X connect 2 0 3 0;
-#X connect 2 1 4 0;
-#X connect 3 0 1 0;
-#X connect 4 0 6 0;
diff --git a/externals/zexy/tests/help-msg/0x3d0x3d0x7e.pd b/externals/zexy/tests/help-msg/0x3d0x3d0x7e.pd
deleted file mode 100644
index fa583763569cd408adbee3a082c4c587e3ead796..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/0x3d0x3d0x7e.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [0x3d0x3d0x7e] crashes when a "help"-message
-is sent;
-#X obj 113 214 ==~;
-#X connect 0 0 2 0;
-#X connect 2 0 3 0;
-#X connect 2 1 4 0;
-#X connect 3 0 1 0;
-#X connect 4 0 6 0;
diff --git a/externals/zexy/tests/help-msg/0x3e0x7e.pd b/externals/zexy/tests/help-msg/0x3e0x7e.pd
deleted file mode 100644
index 22896e9e1fd211f959a236a2b250ea64ebb6c9d4..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/0x3e0x7e.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [0x3e0x7e] crashes when a "help"-message
-is sent;
-#X obj 113 214 <~;
-#X connect 0 0 2 0;
-#X connect 2 0 3 0;
-#X connect 2 1 4 0;
-#X connect 3 0 1 0;
-#X connect 4 0 6 0;
diff --git a/externals/zexy/tests/help-msg/0x7c0x7c0x7e.pd b/externals/zexy/tests/help-msg/0x7c0x7c0x7e.pd
deleted file mode 100644
index 01a642e4ac21ea75fade190e2bed0cdf8f840d21..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/0x7c0x7c0x7e.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [0x7c0x7c0x7e] crashes when a "help"-message
-is sent;
-#X obj 113 214 ||~;
-#X connect 0 0 2 0;
-#X connect 2 0 3 0;
-#X connect 2 1 4 0;
-#X connect 3 0 1 0;
-#X connect 4 0 6 0;
diff --git a/externals/zexy/tests/help-msg/a2l.pd b/externals/zexy/tests/help-msg/a2l.pd
deleted file mode 100644
index 0cdfd91882a983293b62d5b7b7e9420f38ccf12c..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/a2l.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 a2l;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [a2l] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/absgn~.pd b/externals/zexy/tests/help-msg/absgn~.pd
deleted file mode 100644
index a446e5c9d2e0ed47f278e110ca9a47dc0f9051fe..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/absgn~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 absgn~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [absgn~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/abs~.pd b/externals/zexy/tests/help-msg/abs~.pd
deleted file mode 100644
index db304bffe848530b2770cace1d4843bc83264791..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/abs~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 abs~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [abs~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/atoi.pd b/externals/zexy/tests/help-msg/atoi.pd
deleted file mode 100644
index 609de09e1c109efa740a1105845f83cfbe73fe7d..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/atoi.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 atoi;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [atoi] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/avg~.pd b/externals/zexy/tests/help-msg/avg~.pd
deleted file mode 100644
index 8c0b41dfab140b5cede56fc2d2d1c54b16f50a78..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/avg~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 avg~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [avg~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/blockmirror~.pd b/externals/zexy/tests/help-msg/blockmirror~.pd
deleted file mode 100644
index c90a35ecbd621c7876f728f0cd5e232177aaa3ac..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/blockmirror~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 blockmirror~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [blockmirror~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/blockswap~.pd b/externals/zexy/tests/help-msg/blockswap~.pd
deleted file mode 100644
index 7ecbe3bea0d672bfe0f134f2567ff2c43d102a84..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/blockswap~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 blockswap~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [blockswap~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/date.pd b/externals/zexy/tests/help-msg/date.pd
deleted file mode 100644
index da8b5e9a9b974f106af8c0bbdc97c07ec5039c9d..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/date.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 date;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [date] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/demultiplex.pd b/externals/zexy/tests/help-msg/demultiplex.pd
deleted file mode 100644
index 2c8b4b8df7d834a8d2da020b8077dd8446d27248..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/demultiplex.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 demultiplex;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [demultiplex] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/demultiplex~.pd b/externals/zexy/tests/help-msg/demultiplex~.pd
deleted file mode 100644
index 709bee445ea5cc1664de6a54d7a3c61f35ea9c54..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/demultiplex~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 demultiplex~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [demultiplex~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/dfreq~.pd b/externals/zexy/tests/help-msg/dfreq~.pd
deleted file mode 100644
index 7e1aa1cd47ba08fe84297347b785a06ddc6e081f..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/dfreq~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 dfreq~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [dfreq~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/dirac~.pd b/externals/zexy/tests/help-msg/dirac~.pd
deleted file mode 100644
index 29ddf8541674155b35c8d5e90c428023f218cdd7..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/dirac~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 dirac~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [dirac~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/drip.pd b/externals/zexy/tests/help-msg/drip.pd
deleted file mode 100644
index 2c719c4a1d464cefad6ff8b8f5de1d0635560a96..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/drip.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 drip;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [drip] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/envrms~.pd b/externals/zexy/tests/help-msg/envrms~.pd
deleted file mode 100644
index bf7c075b5ec9f7bab796caad6f5b979b5c762c33..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/envrms~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 envrms~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [envrms~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/fifop.pd b/externals/zexy/tests/help-msg/fifop.pd
deleted file mode 100644
index badb7a43a6a1356d1be87315ab04bdf69e05b76e..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/fifop.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 fifop;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [fifop] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/glue.pd b/externals/zexy/tests/help-msg/glue.pd
deleted file mode 100644
index 45dd262583fc82178ea5f9ab6d982b3e27ecb622..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/glue.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 glue;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [glue] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/index.pd b/externals/zexy/tests/help-msg/index.pd
deleted file mode 100644
index 982bc4c2d7f5c420773750cc847179b23d5699a6..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/index.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 index;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [index] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/length.pd b/externals/zexy/tests/help-msg/length.pd
deleted file mode 100644
index 97c0383e5d5537fc43525e053298a1e15d8bb276..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/length.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 length;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [length] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/lifop.pd b/externals/zexy/tests/help-msg/lifop.pd
deleted file mode 100644
index 4347c6e5900600bd5a981b6722d8876b6bfc14bd..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/lifop.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 lifop;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [lifop] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/limiter~.pd b/externals/zexy/tests/help-msg/limiter~.pd
deleted file mode 100644
index fc9b79a5a8ce1b72dcc2bf433d75930f783788e3..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/limiter~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 limiter~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [limiter~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/list2int.pd b/externals/zexy/tests/help-msg/list2int.pd
deleted file mode 100644
index d7b6fdac7b4d439abdb58606f1f9344cf00ed14a..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/list2int.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 list2int;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [list2int] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/list2symbol.pd b/externals/zexy/tests/help-msg/list2symbol.pd
deleted file mode 100644
index f36c1e2480a952614ab5d7d582209ebd8edf706a..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/list2symbol.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 list2symbol;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [list2symbol] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/lister.pd b/externals/zexy/tests/help-msg/lister.pd
deleted file mode 100644
index d1dd8efaaf39d81d04268fb916faf9a1589acc2c..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/lister.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 lister;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [lister] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/lpt.pd b/externals/zexy/tests/help-msg/lpt.pd
deleted file mode 100644
index c5eac377c53a13a8fb44fe992a5ea6ae07a8f00d..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/lpt.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 lpt;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [lpt] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/makesymbol.pd b/externals/zexy/tests/help-msg/makesymbol.pd
deleted file mode 100644
index 84dbbab0a670a672e25ae1520d87ee5f07fa1761..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/makesymbol.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 makesymbol;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [makesymbol] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/mavg.pd b/externals/zexy/tests/help-msg/mavg.pd
deleted file mode 100644
index 8a5047c5428d2b88ef43d81c082337fc9e97dd38..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/mavg.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 mavg;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [mavg] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/minmax.pd b/externals/zexy/tests/help-msg/minmax.pd
deleted file mode 100644
index ce71ac47deae340ceed0e62d97b3d504ac0b7289..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/minmax.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 minmax;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [minmax] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/msgfile.pd b/externals/zexy/tests/help-msg/msgfile.pd
deleted file mode 100644
index 0e5d8c806261dea5784c15cb1d2b374c0fedde80..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/msgfile.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 msgfile;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [msgfile] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/multiline~.pd b/externals/zexy/tests/help-msg/multiline~.pd
deleted file mode 100644
index 42ffba04b03b59593632dd49e0e3f7a077f11908..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/multiline~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 multiline~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [multiline~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/multiplex.pd b/externals/zexy/tests/help-msg/multiplex.pd
deleted file mode 100644
index ff83297ee34a2be5d4dc9e8709723561000b9671..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/multiplex.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 multiplex;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [multiplex] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/multiplex~.pd b/externals/zexy/tests/help-msg/multiplex~.pd
deleted file mode 100644
index 61f1ab2d7d191379ddc339e42139ab449bfdd9f8..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/multiplex~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 multiplex~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [multiplex~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/niagara.pd b/externals/zexy/tests/help-msg/niagara.pd
deleted file mode 100644
index 5ea405e4fa0f684e1ce2ba370fd9b9cfae5a87a8..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/niagara.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 niagara;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [niagara] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/noish~.pd b/externals/zexy/tests/help-msg/noish~.pd
deleted file mode 100644
index 483fa6ba4b28145648bf772921f19a99f8668e39..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/noish~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 noish~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [noish~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/noisi~.pd b/externals/zexy/tests/help-msg/noisi~.pd
deleted file mode 100644
index b7b0d6b42ff67328f657d18dadfd33a6ccdf3984..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/noisi~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 noisi~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [noisi~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/operating_system.pd b/externals/zexy/tests/help-msg/operating_system.pd
deleted file mode 100644
index 804bd22ec316a3819a73a081ac21e951f7b05f62..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/operating_system.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 operating_system;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [operating_system] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/packel.pd b/externals/zexy/tests/help-msg/packel.pd
deleted file mode 100644
index b92f68163f97f0ff9018c4c04139da756020676f..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/packel.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 packel;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [packel] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/pack~.pd b/externals/zexy/tests/help-msg/pack~.pd
deleted file mode 100644
index 225c31dd6a30a4342098769d3392f4e893fd49f3..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/pack~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 pack~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [pack~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/pdf~.pd b/externals/zexy/tests/help-msg/pdf~.pd
deleted file mode 100644
index 9e09e1bdeb3b54cd02d1acb37d56aa3d784e639e..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/pdf~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 pdf~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [pdf~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/prime.pd b/externals/zexy/tests/help-msg/prime.pd
deleted file mode 100644
index fdf6d5f5c8b855e8fe46d6a3503bdfd3b551a786..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/prime.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 prime;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [prime] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/quantize~.pd b/externals/zexy/tests/help-msg/quantize~.pd
deleted file mode 100644
index 17955e675155fe912a18a06ea972d2cf1e1ac1c6..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/quantize~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 quantize~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [quantize~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/regex.pd b/externals/zexy/tests/help-msg/regex.pd
deleted file mode 100644
index 1ae4896a9adf8de5f368a858e7cc3a5a5a313259..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/regex.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 regex;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [regex] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/relay.pd b/externals/zexy/tests/help-msg/relay.pd
deleted file mode 100644
index 1ad88d04db3fde1d58d5c98042c531668f515ab9..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/relay.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 relay;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [relay] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/repack.pd b/externals/zexy/tests/help-msg/repack.pd
deleted file mode 100644
index e451f45d580311d60058f7a41d998688bdc59e7c..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/repack.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 repack;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [repack] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/repeat.pd b/externals/zexy/tests/help-msg/repeat.pd
deleted file mode 100644
index 0ffb53482ce38f578e4caa358229eca1969b8cb0..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/repeat.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 repeat;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [repeat] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/sfplay.pd b/externals/zexy/tests/help-msg/sfplay.pd
deleted file mode 100644
index fe7df5ebe68e1239edcbe3904caf8141b34f2f19..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/sfplay.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 sfplay;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [sfplay] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/sfrecord.pd b/externals/zexy/tests/help-msg/sfrecord.pd
deleted file mode 100644
index fc6291d044447afc55759468aa863c3e6ae1207a..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/sfrecord.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 sfrecord;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [sfrecord] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/sgn~.pd b/externals/zexy/tests/help-msg/sgn~.pd
deleted file mode 100644
index 056682aa49c2c1ca519900ff41cb9aae7ab4a3ea..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/sgn~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 sgn~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [sgn~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/sigzero~.pd b/externals/zexy/tests/help-msg/sigzero~.pd
deleted file mode 100644
index 7637621bb935c3b6878346ca1e2e785c0398cb1c..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/sigzero~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 sigzero~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [sigzero~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/sort.pd b/externals/zexy/tests/help-msg/sort.pd
deleted file mode 100644
index bf41ad17405aebcc3781b6f75bcff99cbb6f6d8e..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/sort.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 sort;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [sort] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/step~.pd b/externals/zexy/tests/help-msg/step~.pd
deleted file mode 100644
index 2facfe19243f8f503e90220557871dd4a2dbf662..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/step~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 step~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [step~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/strcmp.pd b/externals/zexy/tests/help-msg/strcmp.pd
deleted file mode 100644
index 174c1b5df50726eb21c26e646519b7421c498628..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/strcmp.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 strcmp;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [strcmp] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/sum.pd b/externals/zexy/tests/help-msg/sum.pd
deleted file mode 100644
index bd058803f83b5a0f3de604b9ba7dca64e3344721..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/sum.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 sum;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [sum] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/swap~.pd b/externals/zexy/tests/help-msg/swap~.pd
deleted file mode 100644
index b6de21e41c2bb70c867c01b6443608f5b8a2287f..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/swap~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 swap~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [swap~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/symbol2list.pd b/externals/zexy/tests/help-msg/symbol2list.pd
deleted file mode 100644
index db821beb09ec0b3aa68ff0a6e111b2bacf638d06..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/symbol2list.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 symbol2list;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [symbol2list] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/tabdump.pd b/externals/zexy/tests/help-msg/tabdump.pd
deleted file mode 100644
index 3f96767add041281eaf73182ec9e21594113f38b..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/tabdump.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 tabdump;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [tabdump] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/tabminmax.pd b/externals/zexy/tests/help-msg/tabminmax.pd
deleted file mode 100644
index 8d5ff9453b8f6097f72ae1400e07aa07d04ac2c6..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/tabminmax.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 tabminmax;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [tabminmax] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/tabset.pd b/externals/zexy/tests/help-msg/tabset.pd
deleted file mode 100644
index b97046f945fd47af5320772d72f11d90b965ec3f..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/tabset.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 tabset;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [tabset] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/tavg~.pd b/externals/zexy/tests/help-msg/tavg~.pd
deleted file mode 100644
index e831c558c646b2eb74af727a68f0ad2e2867cc9d..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/tavg~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 tavg~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [tavg~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/time.pd b/externals/zexy/tests/help-msg/time.pd
deleted file mode 100644
index ee2b27375bf3de1e31f9dd71c4569afb596a1be9..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/time.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 time;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [time] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/unpack~.pd b/externals/zexy/tests/help-msg/unpack~.pd
deleted file mode 100644
index a7f987bfcd28884b8f362d8eef8b8e757cf6665a..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/unpack~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 unpack~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [unpack~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/urn.pd b/externals/zexy/tests/help-msg/urn.pd
deleted file mode 100644
index 2c8403be97bf29fd240cd6e6dd4a296eabd934cf..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/urn.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 urn;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [urn] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/wrap.pd b/externals/zexy/tests/help-msg/wrap.pd
deleted file mode 100644
index cba992362e349f3d6b01681ee04780a958f31540..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/wrap.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 wrap;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [wrap] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/zexy_.pd b/externals/zexy/tests/help-msg/zexy_.pd
deleted file mode 100644
index 44d3d5816e584e32e0eb4f2483575b52144b5001..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/zexy_.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 zexy;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [zexy] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/help-msg/z~.pd b/externals/zexy/tests/help-msg/z~.pd
deleted file mode 100644
index cbee1c5c36efbd91e95835caf4fe25b12317fe60..0000000000000000000000000000000000000000
--- a/externals/zexy/tests/help-msg/z~.pd
+++ /dev/null
@@ -1,14 +0,0 @@
-#N canvas 179 117 582 310 10;
-#X obj 91 117 inlet bang;
-#X obj 91 270 outlet result;
-#X obj 91 138 t b b b;
-#X obj 113 214 z~;
-#X obj 91 240 i 1;
-#X msg 113 183 help;
-#X text 37 51 tests whether [z~] crashes when a "help"-message is
-sent;
-#X connect 0 0 2 0;
-#X connect 2 0 4 0;
-#X connect 2 1 5 0;
-#X connect 4 0 1 0;
-#X connect 5 0 3 0;
diff --git a/externals/zexy/tests/relay/floatfloat.pd b/externals/zexy/tests/relay/floatfloat.pd
new file mode 100644
index 0000000000000000000000000000000000000000..3abc4a7e46e83cd013892957599314d781112312
--- /dev/null
+++ b/externals/zexy/tests/relay/floatfloat.pd
@@ -0,0 +1,23 @@
+#N canvas 181 112 569 329 10;
+#X obj 91 107 inlet bang;
+#X obj 91 290 outlet result;
+#X obj 91 128 t b b b;
+#X obj 91 260 i;
+#X msg 107 233 1;
+#X msg 139 233 0;
+#X msg 107 159 1;
+#X obj 107 184 relay 1;
+#X obj 107 206 select 1;
+#X text 38 51 Pd's implicit float->list coercion on the inlet results
+in NULL-selectors \, wich eventually crashes Pd when passed to the
+outlet...;
+#X connect 0 0 2 0;
+#X connect 2 0 3 0;
+#X connect 2 1 6 0;
+#X connect 2 2 5 0;
+#X connect 3 0 1 0;
+#X connect 4 0 3 1;
+#X connect 5 0 3 1;
+#X connect 6 0 7 0;
+#X connect 7 0 8 0;
+#X connect 8 0 4 0;
diff --git a/externals/zexy/tests/run1.pd b/externals/zexy/tests/run1.pd
new file mode 100644
index 0000000000000000000000000000000000000000..773035b7913f84c4a4b41cfa0ecb5d1122fcbc89
--- /dev/null
+++ b/externals/zexy/tests/run1.pd
@@ -0,0 +1,12 @@
+#N canvas 359 534 538 390 10;
+#X obj 182 84 r test;
+#X obj 182 106 symbol;
+#X msg 259 171 \; pd dsp 1;
+#X obj 182 197 testunit;
+#X obj 182 128 t s b;
+#X msg 182 227 \; pd quit;
+#X connect 0 0 1 0;
+#X connect 1 0 4 0;
+#X connect 3 0 5 0;
+#X connect 4 0 3 0;
+#X connect 4 1 2 0;
diff --git a/externals/zexy/tests/runtests.sh b/externals/zexy/tests/runtests.sh
index cac11847f80d7d93d88f31fbfd501a3e9153fda7..d4dcd96a351c0e4e06cb749aca5c53b72f481c10 100755
--- a/externals/zexy/tests/runtests.sh
+++ b/externals/zexy/tests/runtests.sh
@@ -33,10 +33,10 @@ else
   RUNTESTS_LOG=tmp$$.log
 fi
 
-LIBFLAGS="-path ../src/.libs/:../src/:../ -lib zexy -path ../abs/:${TESTDIR}:."
+LIBFLAGS="-path ../ -lib zexy -path ../abs/:${TESTDIR}:."
 
 list_tests() {
-#  find . -mindepth 2  -name "*.pd" | sed 's|\.pd$|;|' 
+#  find . -mindepth 2  -name "*.pd" | sed 's|\.pd$|;|'
  ls -1 ${TESTDIR}/*/*.pd | sed 's|\.pd$|;|'
 }
 
@@ -81,7 +81,7 @@ evaluate_tests() {
 
 run_nogui() {
  debug "running test without gui"
- ${PD} ${LIBFLAGS} -nogui runtests_nogui.pd > ${RUNTESTS_LOG} 2>&1 
+ ${PD} ${LIBFLAGS} -nrt -noprefs -nostdpath -batch runtests_nogui.pd > ${RUNTESTS_LOG} 2>&1
  SUCCESS=$?
  debug "testing done"
  evaluate_tests ${RUNTESTS_TXT} ${RUNTESTS_LOG}
@@ -128,7 +128,9 @@ if [ "x${RUNTESTS_NOLOG}" != "x" ]; then
   RUNTESTS_FINAL_LOG=
 fi
 if [ "x${RUNTESTS_FINAL_LOG}" = "x" ]; then
- :
+ if [ ${SUCCESS} -ne 0 ]; then
+   cat "${RUNTESTS_LOG}"
+ fi
 else
  cat ${RUNTESTS_LOG} >> ${RUNTESTS_FINAL_LOG}
 fi
diff --git a/externals/zexy/tests/testrunner.sh b/externals/zexy/tests/testrunner.sh
new file mode 100755
index 0000000000000000000000000000000000000000..27ba82254aab7874be318a8b0766e6cec00e298c
--- /dev/null
+++ b/externals/zexy/tests/testrunner.sh
@@ -0,0 +1,305 @@
+#!/bin/sh
+
+
+if [ "x$(which realpath)" = "x" ]; then
+realpath() {
+    if [ -d "$1" ]; then
+        (cd "$1"; pwd -P)
+    else
+        (cd $(dirname "$1"); pwd -P)
+    fi
+}
+fi
+
+PD=${PD:=$(which pd)}
+LIBDIR=${LIBDIR:=..}
+ABSDIR=${ABSDIR:=${LIBDIR}/abs}
+SCRIPTDIR=${0%/*}
+TESTDIR=${TESTDIR:=${SCRIPTDIR}}
+SCRIPTDIR=$(realpath ${SCRIPTDIR})
+
+count_all=0
+count_pass=0
+count_fail=0
+count_skip=0
+count_xfail=0
+count_xpass=0
+count_error=0
+
+
+usage() {
+cat 1>&2 <<EOF
+usage: $0 [options] <testpatch> [ <testpatch>... ]
+	<testpatch>: Pd-patch to be tested
+    options
+	-v	raise verbosity
+	-q	lower verbosity
+        -l      show log on failure
+        -x      expect test to fail
+        -X      test-files starting with fail are expected to fail
+        -s      soft fail (don't fail on skip)
+EOF
+exit
+}
+sys_exit() {
+    test $softfail -gt 0 && test $1 -eq 77 && exit 0
+    exit $1
+}
+catverbose() {
+  if [ $1 -le $verbosity ]; then
+     cat
+  else
+     cat >/dev/null
+  fi
+}
+if test "X$TERM" != Xdumb && test -t 1 2>/dev/null; then
+    red='^[[0;31m'
+    #    grn='^[[0;32m'
+    lgn='^[[1;32m'
+    blu='^[[1;34m'
+    mgn='^[[0;35m'
+    brg='^[[1m'
+    #std='^[[m'
+
+    red='\e[0;31m'
+    lrd='\e[0;91m'
+    grn="\e[32m"
+    lgn='\e[1;32m'
+    blu='\e[1;34m'
+    mgn='\e[0;35m'
+    brg='\e[1m'
+
+    std="\e[0m"
+else
+    red=
+    grn=
+    lgn=
+    blu=
+    mgn=
+    brg=
+    std=
+fi
+
+report_success() {
+if [ 1 -le $verbosity ]; then
+    case "$1" in
+        0)
+            if [ "x${wantfail}" = "x1" ]; then
+                echo "${lgn}XFAIL${std}: $2"
+            else
+                echo "${grn}PASS${std}: $2"
+            fi
+            ;;
+        1)
+            if [ "x${wantfail}" = "x1" ]; then
+                echo "${lrd}XPASS${std}: $2"
+            else
+                echo "${red}FAIL${std}: $2"
+            fi
+            ;;
+        77)
+            echo "${blu}SKIP${std}: $2"
+            ;;
+        99)
+            echo "${mgn}ERROR${std}: $2"
+            ;;
+        *)
+            echo "${red}FAIL$1${std}: $2"
+            ;;
+    esac
+fi
+    count_all=$((count_all+1))
+    case "$1" in
+        0)
+            if [ "x${wantfail}" = "x1" ]; then
+                count_xfail=$((count_xfail+1))
+            else
+                count_pass=$((count_pass+1))
+            fi
+            ;;
+        77)
+            count_skip=$((count_skip+1))
+            ;;
+        99)
+            count_error=$((count_error+1))
+            ;;
+        *)
+            if [ "x${wantfail}" = "x1" ]; then
+                count_xpass=$((count_xpass+1))
+            else
+                count_fail=$((count_fail+1))
+            fi
+            ;;
+    esac
+}
+highlight_nonnull() {
+    if [  $1 -gt 0 ]; then
+        echo "$2$1$std"
+    else
+        echo "$1"
+    fi
+}
+summary_success() {
+    if [ 0 -le $verbosity ]; then
+        echo ""
+        echo "${grn}============================================================================${std}"
+        echo "${grn}Testsuite summary"
+        echo "${grn}============================================================================${std}"
+        echo "${brg}TOTAL${std}        $(highlight_nonnull ${count_all} ${brg})"
+        echo "${grn}PASS${std}         $(highlight_nonnull ${count_pass} ${grn})"
+        echo "${red}FAIL${std}         $(highlight_nonnull ${count_fail} ${red})"
+        echo "${blu}SKIP${std}         $(highlight_nonnull ${count_skip} ${blu})"
+        echo "${lgn}XFAIL${std}        $(highlight_nonnull ${count_xfail} ${lgn})"
+        echo "${lrd}XPASS${std}        $(highlight_nonnull ${count_xpass} ${lrd})"
+        echo "${mgn}ERROR${std}        $(highlight_nonnull ${count_error} ${mgn})"
+        echo "${grn}============================================================================${std}"
+    fi
+
+    if [  ${count_skip} -gt 0 ]; then SUCCESS=77; fi
+    if [  $((count_pass+count_xfail)) -gt 0 ]; then SUCCESS=0; fi
+    if [  $((count_fail+count_xpass)) -gt 0 ]; then SUCCESS=1; fi
+    if [  ${count_error} -gt 0 ]; then SUCCESS=99; fi
+}
+
+should_fail() {
+    if [ "x$1" = "xauto" ]; then
+        if [ "x${2#fail}" != "x${2}" ]; then
+            echo 1
+        else
+            echo 0
+        fi
+    else
+        echo $1
+    fi
+}
+
+check_success() {
+    if [  ${wantfail} -ge 1 ]; then
+        case "$1" in
+            0)
+                echo 1
+                ;;
+            77|99)
+                echo $1
+                ;;
+            *)
+                echo 0
+                ;;
+        esac
+    else
+        echo $1
+    fi
+}
+
+verbosity=1
+showlog=0
+shouldfail=0
+softfail=0
+
+while getopts "vqlxXsh?" opt; do
+    case $opt in
+        v)
+            verbosity=$((verbosity+1))
+            ;;
+        q)
+            verbosity=$((verbosity-1))
+            ;;
+        l)
+            showlog=1
+            ;;
+        x)
+            shouldfail=1
+            ;;
+        X)
+            shouldfail=auto
+            ;;
+        s)
+            softfail=1
+            ;;
+        :|h|\?)
+            usage
+            ;;
+    esac
+done
+shift $(($OPTIND - 1))
+if [ $# -lt 1 ]; then
+    usage
+fi
+
+
+wantfail=${shouldfail}
+if [ "x${PD}" = "x" ]; then
+ echo "couldn't find Pd (Hint: use the PD environment variable)" 1>&2
+ sys_exit 77
+fi
+LIBFLAGS="-path ${LIBDIR} -path ${ABSDIR} -path . -lib ${LIBDIR}/zexy"
+
+do_runtest() {
+
+TEST=$1
+if [  ! -e "${TEST}" ]; then
+    usage
+fi
+
+# assume that the first component of the test-path is the object to be tested
+# at least this object must not fail to create
+TESTOBJ=$(realpath "${TEST}")
+TESTOBJ=${TESTOBJ#${SCRIPTDIR}}
+TESTOBJ=${TESTOBJ#/}
+TESTOBJ=${TESTOBJ%%/*}
+
+TMPFILE=$(mktemp)
+
+SUCCESS=0
+${VALGRIND} "${PD}" \
+	    -noprefs -nostdpath \
+	    -oss -nosound -nrt \
+	    -nogui -batch -verbose \
+	    ${LIBFLAGS} \
+	    -open "${TESTDIR}/run1.pd" \
+	    -send "test ${TEST%.pd}" \
+            >"${TMPFILE}" 2>&1
+SUCCESS=$?
+cat "${TMPFILE}" | catverbose 3
+
+if [ $SUCCESS -eq 0 ]; then
+if egrep "^regression-test" "${TMPFILE}" >/dev/null; then
+    egrep "^regression-test: ${TEST%.pd}: OK" "${TMPFILE}" >/dev/null
+    SUCCESS=$?
+else
+    SUCCESS=77
+fi
+fi
+
+
+if egrep -B1 "^error: \.\.\. couldn't create" "${TMPFILE}" \
+	| egrep -v "^error: \.\.\. couldn't create" \
+	| awk '{print $1}' \
+        | egrep "^${TESTOBJ}$" \
+                >/dev/null
+then
+    echo "COULDN'T CREATE $TESTOBJ" | catverbose 2 1>&2
+    SUCCESS=1
+fi
+
+wantfail=$(should_fail $shouldfail ${TEST##*/})
+SUCCESS=$(check_success $SUCCESS)
+
+if test ${SUCCESS} -ge 1 && test ${showlog} -ge 1 && test $verbosity -le 3; then
+    cat "${TMPFILE}"
+fi
+rm "${TMPFILE}"
+report_success $SUCCESS "$TEST"
+
+}
+
+
+for t in "$@"; do
+    do_runtest "$t"
+done
+
+if [  ${count_all} -gt 1 ]; then
+    summary_success
+fi
+
+sys_exit ${SUCCESS}
diff --git a/externals/zexy/tests/testunit.pd b/externals/zexy/tests/testunit.pd
index bc723a7c834642ca436bda5351e56cbc5ae068e3..c58a501629137744f4eb41df4f6acd0d9aebc67b 100644
--- a/externals/zexy/tests/testunit.pd
+++ b/externals/zexy/tests/testunit.pd
@@ -1,10 +1,10 @@
-#N canvas 578 118 585 499 10;
-#N canvas 456 161 474 559 run-test 0;
-#X obj 71 136 symbol;
-#X obj 71 104 inlet test-to-run;
-#X obj 71 514 outlet result;
-#X obj 71 440 pack 0 s;
-#X msg 113 136 bang;
+#N canvas 580 113 585 499 10;
+#N canvas 460 151 515 549 run-test 0;
+#X obj 131 186 symbol;
+#X obj 64 104 inlet test-to-run;
+#X obj 131 514 outlet result;
+#X obj 131 440 pack 0 s;
+#X msg 173 186 bang;
 #N canvas 396 344 450 300 print 0;
 #X obj 101 247 print regression-test;
 #X obj 101 204 pack s s;
@@ -27,10 +27,10 @@
 #X connect 8 0 9 0;
 #X connect 9 0 2 0;
 #X connect 9 1 1 1;
-#X restore 96 491 pd print result;
-#X obj 71 252 t f b;
-#X text 99 217 start regression test;
-#X text 105 251 regression test finished;
+#X restore 156 491 pd print result;
+#X obj 131 302 t f b;
+#X text 159 267 start regression test;
+#X text 165 301 regression test finished;
 #N canvas 318 184 905 641 get 0;
 #X obj 105 488 outlet;
 #X obj 105 26 inlet reset;
@@ -80,14 +80,14 @@ triggers it's own destruction (stack corruption);
 #X connect 20 1 22 1;
 #X connect 21 0 22 0;
 #X connect 22 0 0 0;
-#X restore 71 232 pd get result;
+#X restore 131 282 pd get result;
 #X text 64 17 the test MUST return a result!;
 #X text 77 64 cons: the regression test suite will block until the
 test returns a result (potentially infinitely long)!;
 #X text 77 33 pros: the test need not be finished in zero-time (good
 for testing signal-objects or timed objects);
-#X obj 71 470 t l l;
-#N canvas 4 49 625 330 create/destroy 0;
+#X obj 131 470 t l l;
+#N canvas 8 48 625 330 create/destroy 0;
 #X obj 148 53 inlet;
 #X obj 449 48 inlet clear;
 #X obj 148 129 pack s \$0;
@@ -107,8 +107,8 @@ for testing signal-objects or timed objects);
 #X connect 5 1 3 0;
 #X connect 6 0 7 0;
 #X connect 8 0 2 0;
-#X restore 146 324 pd create/destroy testpatch;
-#N canvas 0 0 450 300 restartaudio 0;
+#X restore 206 374 pd create/destroy testpatch;
+#N canvas 0 50 450 300 restartaudio 0;
 #X obj 113 77 inlet;
 #X obj 113 99 t b;
 #X msg 113 121 dsp 0 \, dsp 1;
@@ -116,13 +116,15 @@ for testing signal-objects or timed objects);
 #X connect 0 0 1 0;
 #X connect 1 0 2 0;
 #X connect 2 0 3 0;
-#X restore 141 186 pd restartaudio;
-#X obj 71 214 t b;
-#X obj 71 186 t b b;
-#X obj 71 164 t b s s s;
-#X obj 142 165 print starting;
+#X restore 201 236 pd restartaudio;
+#X obj 131 264 t b;
+#X obj 131 236 t b b;
+#X obj 131 214 t b s s s;
+#X obj 202 215 print starting;
+#X obj 64 126 route bang;
+#X obj 64 148 t b;
 #X connect 0 0 18 0;
-#X connect 1 0 0 0;
+#X connect 1 0 20 0;
 #X connect 3 0 13 0;
 #X connect 4 0 0 0;
 #X connect 6 0 3 0;
@@ -137,6 +139,9 @@ for testing signal-objects or timed objects);
 #X connect 18 1 14 0;
 #X connect 18 2 3 1;
 #X connect 18 3 19 0;
+#X connect 20 0 21 0;
+#X connect 20 1 0 0;
+#X connect 21 0 14 1;
 #X restore 94 218 pd run-test;
 #X obj 94 243 outlet;
 #X obj 94 191 inlet;
@@ -150,6 +155,6 @@ for testing signal-objects or timed objects);
 #X text 64 92 if no result is returned immediately \, the test is considered
 to be FAILED!;
 #X text 63 131 note: we could have this be using "0" as the WAIT result
-\, an no-result as KO \; for legacy reasons we don't;
+\, and no-result as KO \; for legacy reasons we don't;
 #X connect 0 0 1 0;
 #X connect 2 0 0 0;
diff --git a/externals/zexy/z_install.bat b/externals/zexy/z_install.bat
deleted file mode 100644
index 3f39e469303a8d1b288cf712a66dcce8f974c54b..0000000000000000000000000000000000000000
--- a/externals/zexy/z_install.bat
+++ /dev/null
@@ -1,73 +0,0 @@
-@echo off
-REM ==============================================
-REM adapt the following to your needs
-REM ==============================================
-
-REM where does PD reside ??
-REM if you want spaces in the path, please use quotes ("")
-set PDPATH="%PROGRAMFILES%\pd"
-
-REM which pd-version do we have ?
-set PDVERSION=0.38
-
-
-
-
-
-
-
-
-
-REM ==============================================
-REM do not edit below this line !!!
-REM ==============================================
-
-echo :
-echo : installing zexy on your system
-echo :
-echo : assuming that PD-version is at least %PDVERSION%
-echo : assuming that PD is installed at %PDPATH%
-echo :
-echo : if this is correct, hit [return] to proceed
-echo : if this is incorrect, stop this programm ([Ctrl]-C), edit 'z_install.bat' to your needs and rerun
-echo :
-pause
-
-
-IF NOT EXIST %PDPATH%\bin\pd.exe goto location_error
-
-set BINPATH=extra
-set REFPATH=extra\zexy
-
-if %PDVERSION% LSS 0.37 set REFPATH=doc\5.reference\zexy
-
-echo Copying binary...
-copy zexy.dll %PDPATH%\%BINPATH% > tempInstall.trash
-
-echo copying help files
-mkdir %PDPATH%\%REFPATH%
-copy reference\* %PDPATH%\%REFPATH% > tempInstall.trash
-
-echo copying abstractions
-copy abs\*.pd %PDPATH%\%BINPATH% > tempInstall.trash
-
-echo : done
-echo : dont forget to load zexy on startup...
-echo : have fun
-
-
-
-goto end
-
-:location_error
-echo :
-echo : i believe i am in the wrong directory
-echo : i thought that the pd-executable would be %PDPATH%\bin\pd.exe
-echo : obviously it is not !!!
-echo : please edit this file and set the PDPATH-variable apropriatly
-echo :
-echo : stopping installation
-echo :
-
-:end
-pause
diff --git a/externals/zexy/zexy-meta.pd.in b/externals/zexy/zexy-meta.pd
similarity index 99%
rename from externals/zexy/zexy-meta.pd.in
rename to externals/zexy/zexy-meta.pd
index ff8774ae67b5a70ba0031c606f8ea9963f083b5f..076c3690c8e21a782de07a6c13ad5285e1096416 100644
--- a/externals/zexy/zexy-meta.pd.in
+++ b/externals/zexy/zexy-meta.pd
@@ -297,11 +297,11 @@ the type;
 #X text 430 82 bug-reports: zmoelnig-AT-iem.at;
 #N canvas 498 232 309 146 META 0;
 #X text 10 10 NAME zexy;
-#X text 10 30 VERSION @PACKAGE_VERSION@;
+#X text 10 30 VERSION 2.3.1;
 #X text 10 50 AUTHOR IOhannes m zmölnig;
 #X text 10 70 LICENSE GPL-2;
 #X text 10 90 DESCRIPTION the swiss army knife for Pd;
 #X restore 23 27 pd META;
 #X text 228 7 the zexy external;
-#X text 429 66 (c) forum::für::umläute 1999-2012;
+#X text 429 66 (c) forum::für::umläute 1999-2020;
 #X connect 1 0 0 0;
diff --git a/l2ork_addons/tar_em_up.sh b/l2ork_addons/tar_em_up.sh
index 675d083e3798b76facf0fa5d6b3479051153002b..3ac2a883ad222493e351a99348e0661b033f06e8 100755
--- a/l2ork_addons/tar_em_up.sh
+++ b/l2ork_addons/tar_em_up.sh
@@ -203,7 +203,7 @@ if [ ! -d "../pd/nw/nw" ]; then
 		if [ $arch == "armv7l" ]; then
 			nwjs_version="v0.17.6"
 		else
-			nwjs_version="v0.24.4"
+			nwjs_version="v0.28.1"
 		fi
 	fi
 
diff --git a/pd/nw/index.js b/pd/nw/index.js
index 30ee7736150d91b633dbe567dcf766c3f7c14e6b..6163aae2c87f442b0f0c8dd52bc86da1c1d284cd 100644
--- a/pd/nw/index.js
+++ b/pd/nw/index.js
@@ -401,8 +401,10 @@ function nw_create_window(cid, type, width, height, xpos, ypos, attr_array) {
 	    // why does Windows have different innerWidth and innerHeight from other OSs?
 	    // See pdgui.js' canvas_params for the explanation...
 	    // ico@vt.edu 2020-08-21: this should only apply to patch windows
-	    width -= 16 * pdgui.nw_os_is_windows;
-	    height -= 8 * pdgui.nw_os_is_windows;
+        // 2020-10-01: this is not needed anymore since it was a bug specific to 0.14.7
+        // and Windows is now using 0.24.4
+	    //width -= 16 * pdgui.nw_os_is_windows;
+	    //height -= 8 * pdgui.nw_os_is_windows;
     } else {
         my_title = type;
         if (type !== "search" && type !== "text") {
diff --git a/pd/nw/pd_canvas.js b/pd/nw/pd_canvas.js
index 12ad04b38017af8c17751e270d5393f87976a646..a67240a1af63dc632464c50db75f2930480bbad4 100644
--- a/pd/nw/pd_canvas.js
+++ b/pd/nw/pd_canvas.js
@@ -476,6 +476,9 @@ var canvas_events = (function() {
             },
             text_keydown: function(evt) {
                 evt.stopPropagation();
+                setTimeout(function() {
+                    pdgui.gui_message_update_textarea_border(textbox(), 0);
+                }, 0);
                 //evt.preventDefault();
                 return false;
             },
diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js
index 71a59afda0c33c4d8d162cb532ef9330cccf33c7..0d866aeb4c0f43452590de235eae413a21f48aa9 100644
--- a/pd/nw/pdgui.js
+++ b/pd/nw/pdgui.js
@@ -1039,8 +1039,9 @@ function canvas_check_geometry(cid) {
     // ico@vt.edu 2020-08-31:
     // why does Windows have different innerWidth and innerHeight from other OSs?
     // See canvas_params for the explanation...
-    win_w += 16 * nw_os_is_windows;
-    win_h += 8 * nw_os_is_windows;
+    // 2020-10-01: this was a bug in 0.14.7 but is no longer needed
+    //win_w += 16 * nw_os_is_windows;
+    //win_h += 8 * nw_os_is_windows;
 
     // We're reusing win_x and win_y below, as it
     // shouldn't make a difference to the bounds
@@ -2603,6 +2604,36 @@ function message_border_points(width, height) {
         .join(" ");
 }
 
+// called from pd_canvas.js text events to deal with 
+// the drawing of the msg box
+function gui_message_update_textarea_border(elem, init_width) {
+	if (elem.classList.contains("msg")) {
+		if (init_width) {
+			var i, ncols = 0,
+			    text = elem.innerHTML,
+			    textByLine = text.split(/\r*\n/);
+			for (i = 0; i < textByLine.length; i++) {
+				if (textByLine[i].length > ncols) {
+					ncols = textByLine[i].length;
+				}
+			}
+			configure_item(elem, {
+	            cols: ncols
+        	});
+        	gui_gobj_erase_io(elem.getAttribute("cid"), elem.getAttribute("tag"));
+		}
+
+		gui_message_redraw_border(
+			elem.getAttribute("cid"),
+			elem.getAttribute("tag"),
+			parseInt(elem.offsetWidth / elem.getAttribute("font_width")) * elem.getAttribute("font_width") + 4,
+			parseInt(elem.offsetHeight / elem.getAttribute("font_height")) * elem.getAttribute("font_height") + 4
+			);
+	}
+}
+
+exports.gui_message_update_textarea_border = gui_message_update_textarea_border;
+
 function gui_message_draw_border(cid, tag, width, height) {
     gui(cid).get_gobj(tag)
     .append(function(frag) {
@@ -6286,119 +6317,72 @@ function get_style_by_selector(w, selector) {
 // for debugging purposes
 exports.get_style_by_selector = get_style_by_selector;
 
-// Big, stupid, ugly SVG data url to shove into CSS when
-// the user clicks a box in edit mode. One set of points for
-// the "head", or main box, and the other for the "tail", or
-// message flag at the right.
-// ico@vt.edu 2020-08-31: if you thought the original hack was
-// ugly, wait until you see this new version. Hold onto your 
-// binary barf bags...
-function generate_msg_box_bg_data(type, stroke, height) {
-    //post("height="+height);
-    var header = 'url(\"data:image/svg+xml;utf8,' +
-            '<svg ' +
-              "xmlns:svg='http://www.w3.org/2000/svg' " +
-              "xmlns='http://www.w3.org/2000/svg' " +
-              "xmlns:xlink='http://www.w3.org/1999/xlink' " +
-              "version='1.0' " +
-              "viewBox='0 0 10 10' " +
-              "preserveAspectRatio='none'" +
-            ">";
-
-    var line_header = "<polyline vector-effect='non-scaling-stroke' " +
-                "id='bubbles' " +
-                "fill='none' " +
-                "stroke=' " +
-                  stroke + // Here's our stroke color
-                "' ";
-
-    var line_ender = "</svg>" +
-          '")';
-
-    if (type === "head")
-    {
-        return header + line_header + "stroke-width='2' points='10 0 0 0 0 10 10 10' />" + line_ender;
-    }
-    else {
-        // testing scaling of the flags with the increasing number of lines, top_flag, then bottom_flag
-        // 1 line:  2.5   7.5
-        // 2 lines: 1.5   8.5
-        // 3 lines: 1     9
-        // 4 lines: 0.75  9.25
-        var top_flag  = 2.5;
-        var decrement = 1;
-        while(height > 1)
-        {
-            top_flag -= decrement;
-            decrement /= 2;
-            height--;
-        }
-        var bottom_flag = 10 - top_flag;
-        return header +
-            line_header + "stroke-width='2' points='0 0 10 0' />" +
-            line_header + "stroke-width='2' points='0 10 10 10' />" +
-            line_header + "stroke-width='1' points='10 0 1 " + top_flag + " 1 " + bottom_flag + " 10 10' />" +
-            line_ender;
+// 2020-10-06 ico@vt.edu: the following deals with nw.js' discrepancy between
+// positioning svg text, versus html paragraph (editable) text
+var textarea_font_height_array_kludge = [
+// zoom levels      -7  -6  -5  -4  -3  -2  -1  0   1   2   3   4   5   6   7
+/* font size 8  */ [ 40, 48, 70, 90,116,140,150,133,133,136,133,135,136,133,135],
+/* font size 10 */ [ 50, 70, 90,116,132,133,133,133,134,133,134,133,132,131,130],
+/* font size 12 */ [ 80, 90,100,134,148,140,140,140,144,140,140,140,140,140,140],
+/* font size 16 */ [ 90,100,120,120,120,120,120,120,120,115,115,115,115,115,115],
+/* font size 24 */ [128,128,128,128,128,128,128,128,128,128,128,126,126,126,125],
+/* font size 36 */ [127,124,124,122,122,122,122,122,122,122,121,121,120,121,121]
+];
+
+var textarea_y_offset_array_kludge = [
+// zoom levels      -7  -6  -5  -4  -3  -2  -1  0   1   2   3   4   5   6   7
+/* font size 8  */ [1.5,1.5,1.5,1.5,1.5,0. ,-2.,1.5,1.5,1.0,1.0,1.0,0.2,0.5,0.5],
+/* font size 10 */ [0.5,0.5,0.5,1.5,0.5,1.5,0. ,0.5,0.7,0.8,0.8,1.0,0.5,0.5,0.8],
+/* font size 12 */ [1.5,1.5,1.5,2.0,1.5,1.5,1.5,1.5,1.5,1.5,1.5,2.0,1.5,1.5,1.5],
+/* font size 16 */ [1.5,1.5,-1.,1.5,1.0,1.5,0.0,1.5,1.5,1.5,1.2,1.5,1.0,0.7,1.2],
+/* font size 24 */ [1.5,2.5,2.5,3.0,1.5,2.5,2.5,1.5,2.5,2.5,1.5,2.0,1.5,1.5,2.2],
+/* font size 36 */ [1.5,1.5,1.5,3.0,1.5,1.5,1.5,2.5,2.5,1.5,2.0,2.5,1.7,1.6,1.9]
+];
+
+// helper function to get the right index inside the aforesaid kludge arrays
+// used by functions below
+function textarea_font_size_to_index(font_size) {
+    switch(font_size) {
+        case  8: return 0;
+        case 10: return 1;
+        case 12: return 2;
+        case 16: return 3;
+        case 24: return 4;
+        case 36: return 5;
     }
 }
 
-// Big problem here-- CSS fails miserably at something as simple as the
-// message box flag. We use a backgroundImage svg to address this, but
-// for security reasons HTML5 doesn't provide access to svg image styles.
-// As a workaround we just seek out the relevant CSS rules and shove the
-// whole svg data url into them. We do this each time the user
-// clicks a box to edit.
-// Also, notice that both CSS and SVG _still_ fail miserably at drawing a
-// message box flag that expands in the middle while retaining the same angles
-// at the edges. As the message spans more and more lines the ugliness becomes
-// more and more apparent.
-// Anyhow, this enormous workaround makes it possible to just specify the
-// edit box color in CSS for the presets.
-function shove_svg_background_data_into_css(w, height) {
-    var head_style = get_style_by_selector(w, "#new_object_textentry.msg"),
-        tail_style = get_style_by_selector(w, "p.msg::after"),
-        stroke = head_style.outlineColor;
-    head_style.backgroundImage = generate_msg_box_bg_data("head", stroke, height);
-    tail_style.backgroundImage = generate_msg_box_bg_data("tail", stroke, height);
-}
-
-function textarea_line_height_kludge(font_size) {
-	switch(font_size) {
-		case 8: return "133%";
-		case 10: return "133%";
-		case 12: return "140%";
-		case 16: return "120%";
-		case 24: return "128%";
-		case 36: return "122%";
-	}
+function textarea_line_height_kludge(font_size, zoom) {
+	return textarea_font_height_array_kludge
+        [textarea_font_size_to_index(font_size)][zoom+7]+"%";
+}
+
+function textarea_y_offset_kludge(font_size, zoom) {
+    return textarea_y_offset_array_kludge
+        [textarea_font_size_to_index(font_size)][zoom+7];
 }
 
-function textarea_y_offset_kludge(font_size) {
-	switch(font_size) {
-		case 8: return 1.5;
-		case 10: return 0.5;
-		case 12: return 1.5;
-		case 16: return 1.5;
-		case 24: return 1.5;
-		case 36: return 1.5;
+function textarea_x_offset_kludge(font_size, zoom) {
+	if (font_size === 36) {
+		return -2;
+	} else {
+		return -0.5;
 	}
 }
 
-function textarea_msg_kludge(zoom) {
-    switch(zoom) {
-        case 0: return -1;
-        case 1: return -0.5;
-        case 2: return -0.5;
-        case 3: return -0.5;
-        case 4: return -0.5;
-        case 5: return -0.5;
-        case 6: return -0.5;
-        case 7: return -0.5;
+function textarea_msg_y_offset_kludge(zoom) {
+    if (zoom == 0) {
+        return -1;
+    } else if (zoom > 0) {
+        return -0.5;
+    } else {
+        //default
+        return 0;
     }
 }
 
 function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text,
-    font_size, is_gop, state, sel_start, sel_end) {
+    font_size, font_width, font_height, is_gop, state, sel_start, sel_end) {
     var range, svg_view, p,
         gobj = get_gobj(cid, tag), zoom;
     gui(cid).get_nw_window(function(nw_win) {
@@ -6417,10 +6401,34 @@ function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text,
         // (We can probably solve this problem by throwing in yet another
         // gui_canvas_get_scroll, but this seems like the right way to go
         // anyway.)
-        configure_item(gobj, { visibility: "hidden" });
+
+        // Hide elements:
+        // all text objects except for the message box hide everything,
+        // while the message box has a new approach that retains the svg
+        // shape below it. LATER: we may want to:
+        //     1) extend this to support nlets (currently we hide them);
+        //     2) extend this to adjust patch cords as things are being edited, and
+        //     3) extend this to all text objects.
+        if (type === "msg") {
+        	// Message approach
+	        var i, nlets = patchwin[cid].window.document
+	        	.getElementById(tag+"gobj").querySelectorAll(".xlet_control");
+	        for (i = 0; i < nlets.length; i++) {
+	        	nlets[i].style.setProperty("visibility", "hidden");        	
+	        }
+	        gui(cid).get_gobj(tag).q(".box_text", { visibility: "hidden" });
+	    } else {
+	    	// Anything else but message
+			configure_item(gobj, { visibility: "hidden" });
+	    }
+
         p = patchwin[cid].window.document.createElement("p");
         configure_item(p, {
-            id: "new_object_textentry"
+            id: "new_object_textentry",
+            cid: cid,
+            tag: tag,
+            font_width: font_width,
+            font_height: font_height
         });
         svg_view = patchwin[cid].window.document.getElementById("patchsvg")
             .viewBox.baseVal;
@@ -6445,12 +6453,12 @@ function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text,
             */   
         }
         
-        p.style.setProperty("left", (x - svg_view.x - 0.5) + "px");
-        p.style.setProperty("top", (y - svg_view.y + textarea_y_offset_kludge(font_size)) + "px");
+        p.style.setProperty("left", (x - svg_view.x + textarea_x_offset_kludge(font_size, zoom)) + "px");
+        p.style.setProperty("top", (y - svg_view.y + textarea_y_offset_kludge(font_size, zoom)) + "px");
         p.style.setProperty("font-size",
             pd_fontsize_to_gui_fontsize(font_size) + "px");
         p.style.setProperty("line-height",
-        	textarea_line_height_kludge(font_size));
+        	textarea_line_height_kludge(font_size, zoom));
             //pd_fontsize_to_gui_fontsize(font_size) + 1 + "px");
         p.style.setProperty("transform", "translate(0px, " + 
             (zoom > 0 ? 0.5 : 0) + "px)");
@@ -6466,24 +6474,29 @@ function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text,
         if (is_gop == 1) {
             p.style.setProperty("min-height", height_spec - 4 + "px");
         }
-        // set backgroundimage for message box
-        if (type === "msg") {
-            // ico@vt.edu: 2020-08-31: message boxes are uniquely borked
-            // so, we do our best to address that here
-            p.style.setProperty("-webkit-padding-before", "2px");
-            p.style.setProperty("-webkit-padding-after", "3px");
-            p.style.setProperty("transform", "translate(0px, " +
-                textarea_msg_kludge(zoom) + "px)");
-            //post("line-height="+ parseInt(p.style.lineHeight) / 100 * font_size);
-            shove_svg_background_data_into_css(patchwin[cid].window,
-                parseInt(get_gobj(cid, tag).getBoundingClientRect().height /
-                    (parseInt(p.style.lineHeight) / 100 * font_size)));
-        }
         // remove leading/trailing whitespace
         text = text.trim();
         p.textContent = text;
         // append to doc body
         patchwin[cid].window.document.body.appendChild(p);
+        if (type === "msg")
+        {
+            // ico@vt.edu 2020-09-30: New approach to drawing
+            // messages that utilizes the original svg border
+            p.style.setProperty("-webkit-padding-before", "2px");
+            p.style.setProperty("-webkit-padding-after", "3px");
+            p.style.setProperty("-webkit-padding-start", "0px");
+            p.style.setProperty("-webkit-padding-end", "0px");
+            p.style.setProperty("margin-left", "2.5px");
+            p.style.setProperty("transform", "translate(0px, " +
+                textarea_msg_y_offset_kludge(zoom) + "px)");
+            p.style.setProperty("background-color", "");
+            //post("line-height="+ parseInt(p.style.lineHeight) / 100 * font_size);
+            //shove_svg_background_data_into_css(patchwin[cid].window,
+            //    parseInt(get_gobj(cid, tag).getBoundingClientRect().height /
+            //        (parseInt(p.style.lineHeight) / 100 * font_size)));
+        	gui_message_update_textarea_border(p,1);
+        }
         p.focus();
         select_text(cid, p, sel_start, sel_end);
         if (font_size === 36) {
@@ -6504,6 +6517,15 @@ function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text,
         if (p !== null) {
             p.parentNode.removeChild(p);
         }
+
+        // MSG approach
+        var i, nlets = patchwin[cid].window.document
+        	.getElementById(tag+"gobj").querySelectorAll(".xlet_control");
+        for (i = 0; i < nlets.length; i++) {
+        	nlets[i].style.setProperty("visibility", "visible");        	
+        }
+        gui(cid).get_gobj(tag).q(".box_text", { visibility: "visible" });
+
         if (patchwin[cid].window.canvas_events.get_previous_state() ===
                "search") {
             patchwin[cid].window.canvas_events.search();
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index 4deeeb882482587fc49460b4a7d3d5918a30e35d..36d9aa913bbe5d58e9dcf8ee54db04cf9412ac7b 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -6759,7 +6759,7 @@ static void canvas_cut(t_canvas *x)
         if (!bufsize)
             return;
         canvas_copy(x);
-        rtext_key(x->gl_editor->e_textedfor, 127, &s_);
+        //rtext_key(x->gl_editor->e_textedfor, 127, &s_);
         canvas_fixlinesfor(x,(t_text*) x->gl_editor->e_selection->sel_what);
         canvas_dirty(x, 1);
     }
diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c
index d4efedafbe85e75bd908f7965af1f64860af52dd..0d7e4ba2b9810610f2ec436f7d587aa701962439 100644
--- a/pd/src/g_rtext.c
+++ b/pd/src/g_rtext.c
@@ -642,7 +642,7 @@ void rtext_activate(t_rtext *x, int state)
     sprintf(tmpbuf, "%.*s", (int)x->x_bufsize, x->x_buf);
     /* in case x_bufsize is 0... */
     tmpbuf[x->x_bufsize] = '\0';
-    gui_vmess("gui_textarea", "xssiiiisiiiii",
+    gui_vmess("gui_textarea", "xssiiiisiiiiiii",
         canvas,
         x->x_tag,
         (pd_class((t_pd *)x->x_text) == message_class ? "msg" : "obj"),
@@ -652,6 +652,8 @@ void rtext_activate(t_rtext *x, int state)
         heightspec,
         tmpbuf,
         sys_hostfontsize(glist_getfont(glist)),
+        sys_fontwidth(glist_getfont(glist)),
+        sys_fontheight(glist_getfont(glist)),
         isgop,
         state,
         selstart,
diff --git a/pd/src/g_text.c b/pd/src/g_text.c
index da8e7960d8a96e586bbeba7cbeba5c00e83218dd..eb936ccee57166f5a978a85367427a68c339e105 100644
--- a/pd/src/g_text.c
+++ b/pd/src/g_text.c
@@ -1140,7 +1140,11 @@ static void gatom_key(void *z, t_floatarg f)
         else if (x->a_atom.a_type == A_SYMBOL)
         {
             //post("gatom_key release");
-            if (strcmp(x->a_buf, x->a_atom.a_w.w_symbol->s_name))
+            // ico@vt.edu 20200923: we also check for empty a_buf to ensure that
+            // the ... is deleted. This was created when the object was originally
+            // clicked on below, but only if the current gatom is symbol type and
+            // is empty.
+            if (x->a_buf[0] == 0 || strcmp(x->a_buf, x->a_atom.a_w.w_symbol->s_name))
             {
                 strcpy(x->a_buf, x->a_atom.a_w.w_symbol->s_name);
                 gatom_retext(x, 1, 1);
@@ -1256,7 +1260,18 @@ static void gatom_click(t_gatom *x,
             gatom_retext(x, 0, 1);
             return;
         }
-        x->a_shift = (int)shift;
+        x->a_shift = shift;
+        if (x->a_atom.a_type == A_SYMBOL &&
+            !strlen(x->a_atom.a_w.w_symbol->s_name))
+        {
+            char sbuf[ATOMBUFSIZE + 4];
+            t_atom at;
+            sprintf(sbuf, "%s...", x->a_buf);
+            SETSYMBOL(&at, gensym(sbuf));
+            binbuf_clear(x->a_text.te_binbuf);
+            binbuf_add(x->a_text.te_binbuf, 1, &at);
+            glist_retext(x->a_glist, &x->a_text);
+        }
         // unlike iemgui numbox, here we are unable to distinguish
         // between the exclusive and non-exclusive focus because
         // the old school "click" message passed to the object does
diff --git a/pd/src/s_inter.c b/pd/src/s_inter.c
index 6223912b22d3a6a4b5b8d9277f94a89a670559bc..f1e6cabbdf17e4419da05e942343a6026ea559f7 100644
--- a/pd/src/s_inter.c
+++ b/pd/src/s_inter.c
@@ -1347,10 +1347,11 @@ int sys_startgui(const char *guidir)
         {
 #ifdef MSW
             int err = WSAGetLastError();
+            if ((ntry++ > 20) || (err != WSAEADDRINUSE))
 #else
             int err = errno;
-#endif
             if ((ntry++ > 20) || (err != EADDRINUSE))
+#endif
             {
                 perror("bind");
                 fprintf(stderr,