[Pkg-puppet-devel] [SCM] Puppet packaging for Debian branch, master, updated. db94b467fb8abb1e37f717340d439826b8712b6f

Micah Anderson micah at riseup.net
Sun Mar 9 21:58:54 UTC 2008


The following commit has been merged in the master branch:
commit f703755bbc7fa06a72e8af6dacce900928e51495
Author: Micah Anderson <micah at riseup.net>
Date:   Sun Mar 9 13:54:50 2008 -0400

    Merged in upstream proposed 0.24.3

diff --git a/CHANGELOG b/CHANGELOG
index b29f768..c7e443e 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,108 @@
+    Fixing the rest of #1113: External node commands can specify
+    an environment and Puppet will now use it.
+
+    Partially fixing #1113: LDAP nodes now support environments,
+    and the schema has been updated accordingly.
+
+    Always duplicating resource defaults in the parser, so that
+    stacked metaparameter values do not result in all resources
+    that receive a given default also getting those stacked
+    values.
+
+0.24.2
+    Fixing #1062 by moving the yamldir setting to its own yaml
+    section.  This should keep the yamldir from being created
+    on clients.
+
+    Fixed #1047 -- Puppet's parser no longer changes the order
+    in which statements are evaluated, which means that case
+    statements can now set variables that are used by other
+    variables.
+
+    Fixed #1063 -- the master correctly logs syntax errors when
+    reparsing during a single run.
+
+    Removed the loglevels from the valid values for `logoutput`
+    in the Exec resource type -- the log levels are specified
+    using the `loglevel` parameter, not `logoutput`.  This never
+    worked, or at least hasn`t for ages, and now the docs are
+    just correct.
+
+    Somewhat refactored fileserving so that it no longer caches
+    any objects, nor does it use Puppet's RAL resources.  In the
+    process, I fixed #894 (you can now copy links) and refactored
+    other classes as necessary.  Mostly it was fixing tests.
+
+    Hopefully partially fixed #1010 -- clients should now fail
+    to install files whose checksums do not match the checksum
+    from the server.
+
+    Fixed #1018 -- resources now have their namevars added as
+    aliases in the resource catalog, just like they were added
+    in the resource classes.
+
+    Fixed #1037 -- remote unreadable files no longer have the
+    permission denied exceptions caught, thus forbidding them
+    from being replaced with 'nil'.
+
+    Fixed #1043 -- autoloading now searches the plugins directory
+    in each module, in addition to the lib directory.  The 'lib'
+    directory is also deprecated, but supported for now to give
+    people a chance to convert.
+
+    Fixed #1003 -- Applying DavidS's patch to fix searching for
+    tags in sql.
+
+    Fixed #992 -- Puppet is now compatible with gems 1.0.1.
+
+    Fixed #968 again, this time with tests -- parseonly works,
+    including not compiling the configurations, and also storeconfigs
+    is no longer required during parse-testing.
+
+    Fixed #1021 -- the problem was that my method of determining
+    the in-degree sometimes resulted in a lower number than the
+    number of in-edges.
+
+    Fixed #997 -- virtual defined types are no longer evaluated.
+    NOTE: This introduces a behaviour change, in that you previously
+    could realize a resource within a virtual defined resource, and now
+    you must realize the entire defined resource, rather than just
+    the contained resource.
+
+    Fixed #1030 - class and definition evaluation has been significantly
+    refactored, fixing this problem and making the whole interplay
+    between the classes, definitions, and nodes, and the Compile class much
+    cleaner.
+
+    Exec resources must now have unique names, although the commands can still
+    be duplicated.  This is easily accomplished by just specifying a unique
+    name with whatever (unique or otherwise) command you need.
+
+    Fixed #989 -- missing CRL files are correctly ignored, and the
+    value should be set to 'false' to explicitly not look for these
+    files.
+
+    Fixed #1017 -- environment-specific modulepath is no longer ignored.
+
+    Fixing #794 -- consolidating the gentoo configuration files.
+
+    Fixing #976 -- both the full name of qualified classes and
+    the class parts are now added as tags.  I've also
+    created a Tagging module that we should push throughout
+    the rest of the system that uses tags.
+
+    Fixing #995 -- puppetd no longer dies at startup if the server
+    is not running.
+
+    Fixing #977 -- the rundir is again set to 1777.
+
+    Fixed #971 -- classes can once again be included multiple
+    times.
+
+    Added builtin support for Nagios types using
+    Naginator to parse and generate the files.
+
+0.24.1
     Updated vim filetype detection. (#900 and #963)
 
     Default resources like schedules no longer conflict with
diff --git a/Rakefile b/Rakefile
index d5b65e4..f67ad92 100644
--- a/Rakefile
+++ b/Rakefile
@@ -83,10 +83,6 @@ rule(/_is_runnable$/) do |t|
     end
 end
 
-file "debian" => :bzr_is_runnable do
-    system("bzr get http://www.hezmatt.org/~mpalmer/bzr/puppet.debian.svn debian") || exit(1)
-end
-
 task :check_build_deps => 'dpkg-checkbuilddeps_is_runnable' do
     system("dpkg-checkbuilddeps") || exit(1)
 end
diff --git a/conf/freebsd/puppetd b/conf/freebsd/puppetd
index bf718a0..4a5ae59 100644
--- a/conf/freebsd/puppetd
+++ b/conf/freebsd/puppetd
@@ -18,7 +18,7 @@ pidfile="/var/run/$name.pid"
 # read configuration and set defaults
 load_rc_config "$name"
 : ${puppetd_enable="NO"}
-: ${puppetd_config="/usr/local/etc/puppetd.conf"}
+: ${puppetd_config="/usr/local/etc/puppet.conf"}
 : ${puppetd_flags=""}
 
 command_args="--config $puppetd_config $puppetd_flags"
diff --git a/conf/freebsd/puppetmasterd b/conf/freebsd/puppetmasterd
index 6f217dc..d41e003 100644
--- a/conf/freebsd/puppetmasterd
+++ b/conf/freebsd/puppetmasterd
@@ -18,7 +18,7 @@ pidfile="/var/run/$name.pid"
 # read configuration and set defaults
 load_rc_config "$name"
 : ${puppetmasterd_enable="NO"}
-: ${puppetmasterd_config="/usr/local/etc/puppetmasterd.conf"}
+: ${puppetmasterd_config="/usr/local/etc/puppet.conf"}
 : ${puppetmasterd_flags=""}
 
 command_args="--config $puppetmasterd_config $puppetmasterd_flags"
diff --git a/conf/redhat/puppet.conf b/conf/gentoo/puppet/puppet.conf
similarity index 100%
copy from conf/redhat/puppet.conf
copy to conf/gentoo/puppet/puppet.conf
diff --git a/conf/gentoo/puppet/puppetca.conf b/conf/gentoo/puppet/puppetca.conf
deleted file mode 100755
index 35f4abf..0000000
--- a/conf/gentoo/puppet/puppetca.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-[puppet]
-    # Where Puppet stores dynamic and growing data.
-    # The default value is '/var/puppet'.
-    vardir = /var/lib/puppet
-
-    # The Puppet log directory.
-    # The default value is '$vardir/log'.
-    logdir = /var/log/puppet
-
-    # Where Puppet PID files are kept.
-    # The default value is '$vardir/run'.
-    rundir = /var/run/puppet
-
-    # Where SSL certificates are kept.
-    # The default value is '$confdir/ssl'.
-    ssldir = $vardir/ssl
-
-[puppetd]
-    # The file in which puppetd stores a list of the classes
-    # associated with the retrieved configuratiion.  Can be loaded in
-    # the separate ``puppet`` executable using the ``--loadclasses``
-    # option.
-    # The default value is '$confdir/classes.txt'.
-    classfile = $vardir/classes.txt
-
-    # Where puppetd caches the local configuration.  An
-    # extension indicating the cache format is added automatically.
-    # The default value is '$confdir/localconfig'.
-    localconfig = $vardir/localconfig
diff --git a/conf/gentoo/puppet/puppetd.conf b/conf/gentoo/puppet/puppetd.conf
deleted file mode 100644
index 35f4abf..0000000
--- a/conf/gentoo/puppet/puppetd.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-[puppet]
-    # Where Puppet stores dynamic and growing data.
-    # The default value is '/var/puppet'.
-    vardir = /var/lib/puppet
-
-    # The Puppet log directory.
-    # The default value is '$vardir/log'.
-    logdir = /var/log/puppet
-
-    # Where Puppet PID files are kept.
-    # The default value is '$vardir/run'.
-    rundir = /var/run/puppet
-
-    # Where SSL certificates are kept.
-    # The default value is '$confdir/ssl'.
-    ssldir = $vardir/ssl
-
-[puppetd]
-    # The file in which puppetd stores a list of the classes
-    # associated with the retrieved configuratiion.  Can be loaded in
-    # the separate ``puppet`` executable using the ``--loadclasses``
-    # option.
-    # The default value is '$confdir/classes.txt'.
-    classfile = $vardir/classes.txt
-
-    # Where puppetd caches the local configuration.  An
-    # extension indicating the cache format is added automatically.
-    # The default value is '$confdir/localconfig'.
-    localconfig = $vardir/localconfig
diff --git a/conf/gentoo/puppet/puppetmasterd.conf b/conf/gentoo/puppet/puppetmasterd.conf
deleted file mode 100755
index 35f4abf..0000000
--- a/conf/gentoo/puppet/puppetmasterd.conf
+++ /dev/null
@@ -1,29 +0,0 @@
-[puppet]
-    # Where Puppet stores dynamic and growing data.
-    # The default value is '/var/puppet'.
-    vardir = /var/lib/puppet
-
-    # The Puppet log directory.
-    # The default value is '$vardir/log'.
-    logdir = /var/log/puppet
-
-    # Where Puppet PID files are kept.
-    # The default value is '$vardir/run'.
-    rundir = /var/run/puppet
-
-    # Where SSL certificates are kept.
-    # The default value is '$confdir/ssl'.
-    ssldir = $vardir/ssl
-
-[puppetd]
-    # The file in which puppetd stores a list of the classes
-    # associated with the retrieved configuratiion.  Can be loaded in
-    # the separate ``puppet`` executable using the ``--loadclasses``
-    # option.
-    # The default value is '$confdir/classes.txt'.
-    classfile = $vardir/classes.txt
-
-    # Where puppetd caches the local configuration.  An
-    # extension indicating the cache format is added automatically.
-    # The default value is '$confdir/localconfig'.
-    localconfig = $vardir/localconfig
diff --git a/conf/namespaceauth.conf b/conf/namespaceauth.conf
new file mode 100644
index 0000000..8372357
--- /dev/null
+++ b/conf/namespaceauth.conf
@@ -0,0 +1,20 @@
+# This is an example namespaceauth.conf file,
+# which you'll need if you want to start a client
+# in --listen mode.
+[fileserver]
+    allow *.domain.com
+
+[puppetmaster]
+    allow *.domain.com
+
+[puppetrunner]
+    allow culain.domain.com
+
+[puppetbucket]
+    allow *.domain.com
+
+[puppetreports]
+    allow *.domain.com
+
+[resource]
+    allow server.domain.com
diff --git a/conf/redhat/puppet.spec b/conf/redhat/puppet.spec
index 6f84f54..bca690c 100644
--- a/conf/redhat/puppet.spec
+++ b/conf/redhat/puppet.spec
@@ -7,7 +7,7 @@
 
 Summary: A network tool for managing many disparate systems
 Name: puppet
-Version: 0.24.1
+Version: 0.24.2
 Release: 1%{?dist}
 License: GPLv2+
 Group: System Environment/Base
@@ -157,6 +157,9 @@ fi
 rm -rf %{buildroot}
 
 %changelog
+* Sat Dec 22 2007 David Lutterkort <dlutter at redhat.com> - 0.24.1-1
+- New version
+
 * Mon Dec 17 2007 David Lutterkort <dlutter at redhat.com> - 0.24.0-2
 - Use updated upstream tarball that contains yumhelper.py
 
diff --git a/conf/solaris/smf/puppetd.xml b/conf/solaris/smf/puppetd.xml
index e2a1d89..ad1b452 100644
--- a/conf/solaris/smf/puppetd.xml
+++ b/conf/solaris/smf/puppetd.xml
@@ -18,7 +18,7 @@
                     grouping='require_all'
                     restart_on='none'
                     type='path'>
-                <service_fmri value='file:///etc/puppet/puppetd.conf'/>
+                <service_fmri value='file:///etc/puppet/puppet.conf'/>
         </dependency>
         
 	<dependency name='loopback'
diff --git a/conf/solaris/smf/puppetmasterd.xml b/conf/solaris/smf/puppetmasterd.xml
index e89e832..17c5291 100644
--- a/conf/solaris/smf/puppetmasterd.xml
+++ b/conf/solaris/smf/puppetmasterd.xml
@@ -18,7 +18,7 @@
                     grouping='require_all'
                     restart_on='none'
                     type='path'>
-                <service_fmri value='file:///etc/puppet/puppetmasterd.conf'/>
+                <service_fmri value='file:///etc/puppet/puppet.conf'/>
         </dependency>
         
 	<dependency name='loopback'
diff --git a/conf/suse/puppet.spec b/conf/suse/puppet.spec
index 6d4e9f5..f1fa0ba 100644
--- a/conf/suse/puppet.spec
+++ b/conf/suse/puppet.spec
@@ -5,7 +5,7 @@
 
 Summary: A network tool for managing many disparate systems
 Name: puppet
-Version: 0.18.4
+Version: 0.24.1
 Release: 3%{?dist}
 License: GPL
 Group: System Environment/Base
@@ -15,11 +15,11 @@ Source: http://reductivelabs.com/downloads/puppet/%{name}-%{version}.tgz
 Patch0: puppet.suse.patch
 Patch1: puppet.service.patch
 
-Requires: ruby >= 1.8.1
-Requires: facter >= 1.1.4
+Requires: ruby >= 1.8.6
+Requires: facter >= 1.3.7
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildArchitectures: noarch
-BuildRequires: ruby >= 1.8.1
+BuildRequires: ruby >= 1.8.6
 
 %description
 Puppet lets you centrally manage every important aspect of your system using a 
@@ -67,9 +67,7 @@ find %{buildroot}%{ruby_sitelibdir} -type f -perm +ugo+x -print0 | xargs -0 -r %
 %{__install} -Dp -m0644 %{confdir}/server.sysconfig %{buildroot}%{_sysconfdir}/sysconfig/puppetmaster
 %{__install} -Dp -m0755 %{suseconfdir}/server.init %{buildroot}%{_initrddir}/puppetmaster
 %{__install} -Dp -m0644 %{confdir}/fileserver.conf %{buildroot}%{_sysconfdir}/puppet/fileserver.conf
-%{__install} -Dp -m0644 %{confdir}/puppetd.conf %{buildroot}%{_sysconfdir}/puppet/puppetd.conf
-%{__ln_s} puppetd.conf %{buildroot}%{_sysconfdir}/puppet/puppetmasterd.conf
-%{__ln_s} puppetd.conf %{buildroot}%{_sysconfdir}/puppet/puppetca.conf
+%{__install} -Dp -m0644 %{confdir}/puppet.conf %{buildroot}%{_sysconfdir}/puppet/puppet.conf
 %{__install} -Dp -m0644 %{confdir}/logrotate %{buildroot}%{_sysconfdir}/logrotate.d/puppet
 
 %files
@@ -79,7 +77,7 @@ find %{buildroot}%{ruby_sitelibdir} -type f -perm +ugo+x -print0 | xargs -0 -r %
 %{ruby_sitelibdir}/*
 %{_initrddir}/puppet
 %config(noreplace) %{_sysconfdir}/sysconfig/puppet
-%config(noreplace) %{_sysconfdir}/puppet/puppetd.conf
+%config(noreplace) %{_sysconfdir}/puppet/puppet.conf
 %doc CHANGELOG COPYING LICENSE README TODO examples
 %exclude %{_sbindir}/puppetdoc
 %config(noreplace) %{_sysconfdir}/logrotate.d/puppet
@@ -131,6 +129,10 @@ fi
 %{__rm} -rf %{buildroot}
 
 %changelog
+* Sat Feb 16 2008 James Turnbull <james at lovedthanlost.net> - 0.24.1-1
+- Fixed puppet configuation file references to match single puppet.conf file
+- Update versions for 0.24.1 release
+ 
 * Tue Aug  3 2006 Martin Vuk <martin.vuk at fri.uni-lj.si> - 0.18.4-3
 - Replaced puppet-bin.patch with %build section from David's spec
 
diff --git a/debian/changelog b/debian/changelog
index 9870bcd..69984d6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,8 +1,9 @@
-puppet (0.24.1-2) UNRELEASED; urgency=low
+puppet (0.24.1-2) unstable; urgency=low
 
   * Set rundir correctly (Closes: #460203, #459579)
+  * Apply patch for puppet#1003 to enable collection of tagged resources
 
- -- Thom May <thom at debian.org>  Fri, 11 Jan 2008 12:00:32 +0100
+ -- Thom May <thom at debian.org>  Wed, 16 Jan 2008 11:08:55 +0100
 
 puppet (0.24.1-1) unstable; urgency=low
 
diff --git a/examples/root/etc/puppet/puppetmasterd.conf b/examples/root/etc/puppet/puppet.conf
similarity index 59%
rename from examples/root/etc/puppet/puppetmasterd.conf
rename to examples/root/etc/puppet/puppet.conf
index b318207..151364e 100644
--- a/examples/root/etc/puppet/puppetmasterd.conf
+++ b/examples/root/etc/puppet/puppet.conf
@@ -1,7 +1,10 @@
+[puppetd]
+report = true
+factsync = true
+pluginsync = true
+
 [puppetmasterd]
 reports = store,rrdgraph,tagmail,log
-
-[ldap]
-ldapnodes = true
+node_terminus = ldap
 ldapserver = culain.madstop.com
 ldapbase = dc=madstop,dc=com
diff --git a/examples/root/etc/puppet/puppetd.conf b/examples/root/etc/puppet/puppetd.conf
deleted file mode 100644
index ce988cf..0000000
--- a/examples/root/etc/puppet/puppetd.conf
+++ /dev/null
@@ -1,4 +0,0 @@
-[puppet]
-report = true
-factsync = true
-pluginsync = true
diff --git a/ext/ldap/puppet.schema b/ext/ldap/puppet.schema
index b7c715e..bbad23e 100644
--- a/ext/ldap/puppet.schema
+++ b/ext/ldap/puppet.schema
@@ -12,6 +12,11 @@ attributetype ( 1.1.3.9 NAME 'parentnode'
 	EQUALITY caseIgnoreIA5Match
 	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
 
+attributetype ( 1.1.3.9 NAME 'environment'
+	DESC 'Puppet Node Environment'
+	EQUALITY caseIgnoreIA5Match
+	SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
+
 objectclass ( 1.1.1.2 NAME 'puppetClient' SUP top AUXILIARY
 	DESC 'Puppet Client objectclass'
-	MAY ( puppetclass $ parentnode ))
+	MAY ( puppetclass $ parentnode $ environment ))
diff --git a/ext/logcheck/puppet b/ext/logcheck/puppet
index ab617e7..449ec70 100644
--- a/ext/logcheck/puppet
+++ b/ext/logcheck/puppet
@@ -13,3 +13,10 @@
 ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Caught (TERM|INT); shutting down$
 ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Shutting down$
 ^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Restarting with .*$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Starting catalog run$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Finished catalog run in [.0-9]+ seconds$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Loading fact .*$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Ignoring cache$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Ignoring --listen on onetime run$
+^\w{3} [ :0-9]{11} [._[:alnum:]-]+ puppetd\[[0-9]+\]: Retrieving plugins$
+
diff --git a/ext/puppet-test b/ext/puppet-test
index 362a439..e18dd1c 100755
--- a/ext/puppet-test
+++ b/ext/puppet-test
@@ -53,6 +53,9 @@
 # list::
 #   List all available tests.
 #
+# pause::
+#  Pause before starting test (useful for testing with dtrace).
+#
 # repeat::
 #  How many times to perform the test.
 #
@@ -88,7 +91,7 @@
 # Do an initial trap, so that cancels don't get a stack trace.
 trap(:INT) do
     $stderr.puts "Cancelling startup"
-    exit(0)
+    exit(1)
 end
 
 require 'puppet'
@@ -165,6 +168,12 @@ class Suite
         puts "Running %s %s test" % [@name, test]
         prepare()
 
+        if $options[:pause]
+            puts "Hit any key to continue"
+            $stdin.readline
+            puts "Continuing with test"
+        end
+
         if $options[:fork] > 0
             @forking = true
             $options[:fork].times {
@@ -200,6 +209,17 @@ class Suite
     end
 end
 
+Suite.new :parser, "Manifest parsing" do
+    def prepare
+    end
+
+    newtest :parse, "Parsed files" do
+        @parser = Puppet::Parser::Parser.new(:environment => Puppet[:environment])
+        @parser.file = Puppet[:manifest]
+        @parser.parse
+    end
+end
+
 Suite.new :catalog, "Catalog handling" do
     def prepare
         $args[:cache] = false
@@ -325,12 +345,13 @@ end
 
 $cmdargs = [
 	[ "--compile",    "-c",			GetoptLong::NO_ARGUMENT ],
-	[ "--describe",  "-D",			GetoptLong::REQUIRED_ARGUMENT ],
+	[ "--describe",     			GetoptLong::REQUIRED_ARGUMENT ],
 	[ "--retrieve",  "-R",			GetoptLong::REQUIRED_ARGUMENT ],
 	[ "--fork",          			GetoptLong::REQUIRED_ARGUMENT ],
 	[ "--fqdn",      "-F",			GetoptLong::REQUIRED_ARGUMENT ],
 	[ "--suite",     "-s",			GetoptLong::REQUIRED_ARGUMENT ],
 	[ "--test",      "-t",			GetoptLong::REQUIRED_ARGUMENT ],
+	[ "--pause",	 "-p",			GetoptLong::NO_ARGUMENT ],
 	[ "--repeat",    "-r",			GetoptLong::REQUIRED_ARGUMENT ],
 	[ "--debug",	 "-d",			GetoptLong::NO_ARGUMENT ],
 	[ "--help",		 "-h",			GetoptLong::NO_ARGUMENT ],
@@ -340,14 +361,14 @@ $cmdargs = [
 ]
 
 # Add all of the config parameters as valid $options.
-Puppet.config.addargs($cmdargs)
+Puppet.settings.addargs($cmdargs)
 Puppet::Util::Log.newdestination(:console)
 
 result = GetoptLong.new(*$cmdargs)
 
 $args = {}
 
-$options = {:repeat => 1, :fork => 0}
+$options = {:repeat => 1, :fork => 0, :pause => false}
 
 begin
     explicit_waitforcert = false
@@ -399,6 +420,8 @@ begin
                 $options[:test] = arg.intern
             when "--file"
                 $options[:file] = arg
+            when "--pause"
+                $options[:pause] = true
             when "--list"
                 Suite.suites.sort { |a,b| a.to_s <=> b.to_s }.each do |suite_name|
                     suite = Suite[suite_name]
@@ -407,7 +430,7 @@ begin
                 end
                 exit(0)
             else
-                Puppet.config.handlearg(opt, arg)
+                Puppet.settings.handlearg(opt, arg)
         end
     }
 rescue GetoptLong::InvalidOption => detail
diff --git a/lib/puppet.rb b/lib/puppet.rb
index 18037cd..a0cd1e7 100644
--- a/lib/puppet.rb
+++ b/lib/puppet.rb
@@ -25,7 +25,7 @@ require 'puppet/util/suidmanager'
 # it's also a place to find top-level commands like 'debug'
 
 module Puppet
-    PUPPETVERSION = '0.24.1'
+    PUPPETVERSION = '0.24.2'
 
     def Puppet.version
         return PUPPETVERSION
@@ -423,6 +423,7 @@ module Puppet
 end
 
 require 'puppet/type'
+require 'puppet/network'
 require 'puppet/module'
 require 'puppet/util/storage'
 require 'puppet/parser/interpreter'
diff --git a/lib/puppet/defaults.rb b/lib/puppet/defaults.rb
index a767d29..e022580 100644
--- a/lib/puppet/defaults.rb
+++ b/lib/puppet/defaults.rb
@@ -66,7 +66,11 @@ module Puppet
             :owner => "root",
             :desc => "Where SSL certificates are kept."
         },
-        :rundir => { :default => rundir,
+        :rundir => { 
+            :default => rundir,
+            :mode => 01777,
+            :owner => "$user",
+            :group => "$group",
             :desc => "Where Puppet PID files are kept."
         },
         :genconfig => [false,
@@ -136,8 +140,6 @@ module Puppet
         :show_diff => [false, "Whether to print a contextual diff when files are being replaced.  The diff
             is printed on stdout, so this option is meaningless unless you are running Puppet interactively.
             This feature currently requires the ``diff/lcs`` Ruby library."],
-        :yamldir => {:default => "$vardir/yaml", :owner => "$user", :group => "$user", :mode => "750",
-            :desc => "The directory in which YAML data is stored, usually in a subdirectory."},
         :daemonize => { :default => true,
             :desc => "Send the process into the background.  This is the default.",
             :short => "D"
@@ -228,7 +230,7 @@ module Puppet
             :owner => "$user",
             :group => "$group",
             :mode => 0664,
-            :desc => "The certificate revocation list (CRL) for the CA. Set this to 'none' if you do not want to use a CRL."
+            :desc => "The certificate revocation list (CRL) for the CA. Set this to 'false' if you do not want to use a CRL."
         },
         :caprivatedir => { :default => "$cadir/private",
             :owner => "$user",
@@ -256,6 +258,7 @@ module Puppet
         :serial => { :default => "$cadir/serial",
             :owner => "$user",
             :group => "$group",
+            :mode => 0600,
             :desc => "Where the serial number for certificates is stored."
         },
         :autosign => { :default => "$confdir/autosign.conf",
@@ -305,7 +308,7 @@ module Puppet
         :manifest => ["$manifestdir/site.pp",
             "The entry-point manifest for puppetmasterd."],
         :code => ["", "Code to parse directly.  This is essentially only used
-            by ``puppet`, and should only be set if you're writing your own Puppet
+            by ``puppet``, and should only be set if you're writing your own Puppet
             executable"],
         :masterlog => { :default => "$logdir/puppetmaster.log",
             :owner => "$user",
@@ -668,5 +671,10 @@ module Puppet
         :rrdinterval => ["$runinterval", "How often RRD should expect data.
             This should match how often the hosts report back to the server."]
     )
+
+    Puppet.setdefaults(:yaml,
+        :yamldir => {:default => "$vardir/yaml", :owner => "$user", :group => "$user", :mode => "750",
+            :desc => "The directory in which YAML data is stored, usually in a subdirectory."}
+    )
 end
 
diff --git a/lib/puppet/dsl.rb b/lib/puppet/dsl.rb
index 4fbce55..966feaf 100644
--- a/lib/puppet/dsl.rb
+++ b/lib/puppet/dsl.rb
@@ -46,58 +46,56 @@
 # 
 # apply
 
-module Puppet
-    # Provide the actual commands for acting like a language.
-    module DSL
-        def aspect(name, options = {}, &block)
-            Puppet::Aspect.new(name, options, &block)
-        end
+require 'puppet'
 
-        def acquire(*names)
-            names.each do |name|
-                if aspect = Puppet::Aspect[name]
-                    unless aspect.evaluated?
-                        aspect.evaluate
-                    end
-                else
-                    raise "Could not find aspect %s" % name
+# Provide the actual commands for acting like a language.
+module Puppet::DSL
+    def aspect(name, options = {}, &block)
+        Puppet::DSL::Aspect.new(name, options, &block)
+    end
+
+    def acquire(*names)
+        names.each do |name|
+            if aspect = Puppet::DSL::Aspect[name]
+                unless aspect.evaluated?
+                    aspect.evaluate
                 end
+            else
+                raise "Could not find aspect %s" % name
             end
         end
+    end
 
-        def apply
-            bucket = export()
-            catalog = bucket.to_catalog
-            catalog.apply
-        end
+    def apply
+        bucket = export()
+        catalog = bucket.to_catalog
+        catalog.apply
+    end
 
-        def export
-            objects = Puppet::Aspect.collect do |name, aspect|
-                if aspect.evaluated?
-                    aspect.export
-                end
-            end.reject { |a| a.nil? }.flatten.collect do |obj|
-                obj.to_trans
+    def export
+        objects = Puppet::DSL::Aspect.collect do |name, aspect|
+            if aspect.evaluated?
+                aspect.export
             end
-            bucket = Puppet::TransBucket.new(objects)
-            bucket.name = "top"
-            bucket.type = "class"
-
-            return bucket
+        end.reject { |a| a.nil? }.flatten.collect do |obj|
+            obj.to_trans
         end
+        bucket = Puppet::TransBucket.new(objects)
+        bucket.name = "top"
+        bucket.type = "class"
 
-        def init
-            unless Process.uid == 0
-                Puppet[:confdir] = File.expand_path("~/.puppet")
-                Puppet[:vardir] = File.expand_path("~/.puppet/var")
-            end
-            Puppet[:user] = Process.uid
-            Puppet[:group] = Process.gid
-            Puppet::Util::Log.newdestination(:console)
-            Puppet::Util::Log.level = :info
-        end
+        return bucket
+    end
 
-        private
+    def init
+        unless Process.uid == 0
+            Puppet[:confdir] = File.expand_path("~/.puppet")
+            Puppet[:vardir] = File.expand_path("~/.puppet/var")
+        end
+        Puppet[:user] = Process.uid
+        Puppet[:group] = Process.gid
+        Puppet::Util::Log.newdestination(:console)
+        Puppet::Util::Log.level = :info
     end
 
     class Aspect
@@ -224,10 +222,10 @@ module Puppet
         end
 
         def newresource(type, name, params = {})
-            if self.is_a?(Puppet::Aspect)
+            if self.is_a?(Puppet::DSL::Aspect)
                 source = self
             else
-                source = Puppet::Aspect[:main]
+                source = Puppet::DSL::Aspect[:main]
             end
             unless obj = @@objects[type][name]
                 obj = Resource.new :title => name, :type => type.name,
@@ -262,7 +260,7 @@ module Puppet
                     env = nil
                 end
                 @node.parameters = Facter.to_hash
-                @compile = Puppet::Parser::Compile.new(@node, @interp.send(:parser, env))
+                @compile = Puppet::Parser::Compiler.new(@node, @interp.send(:parser, env))
                 @scope = @compile.topscope
             end
             @scope
diff --git a/lib/puppet/external/gratr/rdot.rb b/lib/puppet/external/dot.rb
similarity index 100%
rename from lib/puppet/external/gratr/rdot.rb
rename to lib/puppet/external/dot.rb
diff --git a/lib/puppet/external/gratr.rb b/lib/puppet/external/gratr.rb
deleted file mode 100644
index b830cae..0000000
--- a/lib/puppet/external/gratr.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/base'
-require 'puppet/external/gratr/digraph'
-require 'puppet/external/gratr/undirected_graph'
-require 'puppet/external/gratr/common'
diff --git a/lib/puppet/external/gratr/adjacency_graph.rb b/lib/puppet/external/gratr/adjacency_graph.rb
deleted file mode 100644
index b740c47..0000000
--- a/lib/puppet/external/gratr/adjacency_graph.rb
+++ /dev/null
@@ -1,257 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/graph'
-require 'set'
-
-module GRATR
-
-  # This provides the basic routines needed to implement the Digraph, UndirectedGraph,
-  # PseudoGraph, DirectedPseudoGraph, MultiGraph and DirectedPseudoGraph class.
-  module AdjacencyGraph
-    
-    include Graph
-
-    class ArrayWithAdd < Array # :nodoc:
-      alias add push
-    end
-
-    # Initialization parameters can include an Array of edges to add, Graphs to
-    # copy (will merge if multiple)
-    # :parallel_edges denotes that duplicate edges are allowed
-    # :loops denotes that loops are allowed
-    def initialize(*params)
-      @vertex_dict     = Hash.new    
-      raise ArgumentError if params.any? do |p| 
-        !(p.kind_of? GRATR::Graph or 
-          p.kind_of? Array or 
-          p == :parallel_edges or
-          p == :loops)
-      end
-      clear_all_labels
-
-      # Basic configuration of adjacency
-      @allow_loops    = params.any? {|p| p == :loops}
-      @parallel_edges = params.any? {|p| p == :parallel_edges}
-      @edgelist_class = @parallel_edges ? ArrayWithAdd : Set
-      if @parallel_edges
-        @edge_number      = Hash.new
-        @next_edge_number = 0 
-      end
-
-      # Copy any given graph into this graph
-      params.select {|p| p.kind_of? GRATR::Graph}.each do |g|
-        g.edges.each do |e| 
-          add_edge!(e)
-          edge_label_set(e, edge_label(e)) if edge_label(e)
-        end
-        g.vertices.each do |v|
-          vertex_label_set(v, vertex_label(v)) if vertex_label(v)
-        end  
-      end
-
-      # Add all array edges specified
-      params.select {|p| p.kind_of? Array}.each do |a|
-        0.step(a.size-1, 2) {|i| add_edge!(a[i], a[i+1])}
-      end
-
-    end
-
-    # Returns true if v is a vertex of this Graph
-    # An O(1) implementation of vertex?
-    def vertex?(v) @vertex_dict.has_key?(v); end
-
-    # Returns true if [u,v] or u is an Edge
-    # An O(1) implementation 
-    def edge?(u, v=nil)
-      u, v = u.source, u.target if u.kind_of? GRATR::Edge
-      vertex?(u) and @vertex_dict[u].include?(v)
-    end
-
-    # Adds a vertex to the graph with an optional label
-    def add_vertex!(vertex, label=nil)
-      @vertex_dict[vertex] ||= @edgelist_class.new
-      self[vertex] = label if label
-      self
-    end
-
-    # Adds an edge to the graph
-    # Can be called in two basic ways, label is optional
-    #   * add_edge!(Edge[source,target], "Label")
-    #   * add_edge!(source,target, "Label")
-    def add_edge!(u, v=nil, l=nil, n=nil)
-      if u.class.include? EdgeNumber and n.nil?
-          n = u.number
-      end
-      if u.kind_of? GRATR::Edge
-          edge = u
-          u, v, l = u.source, u.target, u.label
-      end
-      if not @allow_loops and u == v
-          return self
-      end
-      if @parallel_edges and ! n
-          n = (@next_edge_number+=1)
-      end
-      add_vertex!(u);
-      add_vertex!(v)        
-      @vertex_dict[u].add(v)
-
-      if @parallel_edges
-          (@edge_number[u] ||= @edgelist_class.new).add(n)
-      end
-      unless directed?
-        @vertex_dict[v].add(u)
-        if @parallel_edges
-            (@edge_number[v] ||= @edgelist_class.new).add(n)
-        end
-      end        
-
-      if l
-          unless edge
-              if n
-                  edge = edge_class[u,v,n]
-              else
-                  edge = edge_class[u,v]
-              end
-          end
-          self[edge] = l
-      end
-      self
-    end
-
-    # Removes a given vertex from the graph
-    def remove_vertex!(v)
-# FIXME This is broken for multi graphs 
-      @vertex_dict.delete(v)
-      @vertex_dict.each_value { |adjList| adjList.delete(v) }
-      @vertex_dict.keys.each  do |u| 
-        delete_label(edge_class[u,v]) 
-        delete_label(edge_class[v,u])
-      end
-      delete_label(v) 
-      self
-    end
-
-    # Removes an edge from the graph, can be called with source and target or with
-    # and object of GRATR::Edge derivation
-    def remove_edge!(u, v=nil)
-      unless u.kind_of? GRATR::Edge
-        raise ArgumentError if @parallel_edges
-        u = edge_class[u,v]
-      end
-      raise ArgumentError if @parallel_edges and (u.number || 0) == 0
-      return self unless @vertex_dict[u.source] # It doesn't exist
-      delete_label(u) # Get rid of label
-      if @parallel_edges
-        index = @edge_number[u.source].index(u.number)
-        raise NoEdgeError unless index
-        @vertex_dict[u.source].delete_at(index)
-        @edge_number[u.source].delete_at(index) 
-      else
-        @vertex_dict[u.source].delete(u.target) 
-      end
-      self
-    end
-
-    # Returns an array of vertices that the graph has
-    def vertices() @vertex_dict.keys; end
-
-    # Returns an array of edges, most likely of class Edge or UndirectedEdge depending 
-    # upon the type of graph
-    def edges
-      @vertex_dict.keys.inject(Set.new) do |a,v|
-        if @parallel_edges and @edge_number[v]
-          @vertex_dict[v].zip(@edge_number[v]).each do |w|
-            s,t,n = v,w[0],w[1]
-            a.add( edge_class[ s,t,n, edge_label(s,t,n) ] )
-          end
-        else
-          @vertex_dict[v].each do |w|
-            a.add(edge_class[v,w,edge_label(v,w)])
-          end
-        end; a
-      end.to_a
-    end
- 
-    alias graph_adjacent adjacent
-    def adjacent(x, options={})
-        unless @vertex_dict.has_key?(x)
-            raise ArgumentError, "%s is not a vertex" % x
-        end
-      options[:direction] ||= :out
-      if !x.kind_of?(GRATR::Edge) and (options[:direction] == :out || !directed?)
-        if options[:type] == :edges
-          @parallel_edges ?
-            @vertex_dict[x].map {|v| e=edge_class[x,v, at edge_number[x][v]]; e.label = self[e]; e} :
-            @vertex_dict[x].map {|v| e=edge_class[x,v];  e.label = self[e]; e}
-        else
-          @vertex_dict[x].to_a
-        end
-      else
-        graph_adjacent(x,options)
-      end
-    end
-    
- 
-  public
-
-    def self.included(cl)
-      # Shortcut for creating a Graph
-      #
-      #  Example: GRATR::Digraph[1,2, 2,3, 2,4, 4,5].edges.to_a.to_s =>
-      #    "(1-2)(2-3)(2-4)(4-5)"
-      # 
-      # Or as a Hash for specifying lables
-      # GRATR::Digraph[ [:a,:b] => 3, [:b,:c] => 4 ]  (Note: Do not use for Multi or Pseudo graphs)
-      def cl.[] (*a)
-        result = new
-        if a.size == 1 and a[0].kind_of? Hash
-          # Convert to edge class
-          a[0].each do |k,v|
-            if result.edge_class.include? GRATR::EdgeNumber
-              result.add_edge!(result.edge_class[k[0],k[1],nil,v])
-            else
-             result.add_edge!(result.edge_class[k[0],k[1],v])
-            end 
-          end
-        elsif a[0].kind_of? GRATR::Edge
-          a.each{|e| result.add_edge!(e); result[e] = e.label}
-        elsif a.size % 2 == 0    
-          0.step(a.size-1, 2) {|i| result.add_edge!(a[i], a[i+1])}
-        else
-          raise ArgumentError
-        end
-        result
-      end
-    end
-          
-  end # Adjacency Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/base.rb b/lib/puppet/external/gratr/base.rb
deleted file mode 100644
index 72dded7..0000000
--- a/lib/puppet/external/gratr/base.rb
+++ /dev/null
@@ -1,34 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-GRATR_VERSION = "0.4.1"
-
-module GRATR
-  class NoVertexError      < IndexError;   end
-  class NoEdgeError        < IndexError;   end
-end
diff --git a/lib/puppet/external/gratr/biconnected.rb b/lib/puppet/external/gratr/biconnected.rb
deleted file mode 100644
index c976b2c..0000000
--- a/lib/puppet/external/gratr/biconnected.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'set'
-
-module GRATR
-  module Graph    
-    # Biconnected is a module for adding the biconnected algorithm to 
-    # UndirectedGraphs
-    module Biconnected
-
-      # biconnected computes the biconnected subgraphs
-      # of a graph using Tarjan's algorithm based on DFS. See: Robert E. Tarjan
-      # _Depth_First_Search_and_Linear_Graph_Algorithms_. SIAM Journal on 
-      # Computing, 1(2):146-160, 1972
-      #
-      # The output of the algorithm is a pair, the first value is an 
-      # array of biconnected subgraphs. The second is the set of
-      # articulation vertices.
-      #
-      # A connected graph is biconnected if the removal of any single vertex 
-      # (and all edges incident on that vertex) cannot disconnect the graph.
-      # More generally, the biconnected components of a graph are the maximal
-      # subsets of vertices such that the removal of a vertex from a particular
-      # component will not disconnect the component. Unlike connected components,
-      # vertices may belong to multiple biconnected components: those vertices
-      # that belong to more than one biconnected component are called articulation
-      # points or, equivalently, cut vertices. Articulation points are vertices
-      # whose removal would increase the number of connected components in the graph.
-      # Thus, a graph without articulation points is biconnected.
-      def biconnected
-        dfs_num     = 0
-        number      = {}; predecessor = {}; low_point   = {}
-        stack       = []; result      = []; articulation= []
-
-        root_vertex  = Proc.new {|v| predecessor[v]=v }
-        enter_vertex = Proc.new {|u| number[u]=low_point[u]=(dfs_num+=1) }
-        tree_edge  = Proc.new do |e|
-          stack.push(e)
-          predecessor[e.target] = e.source
-        end
-        back_edge  = Proc.new do |e|
-          if e.target != predecessor[e.source]
-            stack.push(e)
-            low_point[e.source] = [low_point[e.source], number[e.target]].min
-          end
-        end
-        exit_vertex = Proc.new do |u|
-          parent = predecessor[u]
-          is_articulation_point = false
-          if number[parent] > number[u]
-            parent = predecessor[parent]
-            is_articulation_point = true
-          end
-          if parent == u
-            is_articulation_point = false if (number[u] + 1) == number[predecessor[u]]
-          else
-            low_point[parent] = [low_point[parent], low_point[u]].min
-            if low_point[u] >= number[parent]
-              if number[parent] > number[predecessor[parent]]
-                predecessor[u] = predecessor[parent]
-                predecessor[parent] = u
-              end
-              result << (component = self.class.new)
-              while number[stack[-1].source] >= number[u]
-                component.add_edge!(stack.pop)
-              end
-              component.add_edge!(stack.pop)
-              if stack.empty?
-                predecessor[u] = parent
-                predecessor[parent] = u
-              end
-            end
-          end
-          articulation << u if is_articulation_point
-        end
-
-        # Execute depth first search
-        dfs({:root_vertex  => root_vertex,
-             :enter_vertex => enter_vertex, 
-             :tree_edge    => tree_edge,
-             :back_edge    => back_edge,
-             :exit_vertex  => exit_vertex})
-           
-        [result, articulation]
-      end # biconnected
-
-    end # Biconnected
-
-  end # Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/chinese_postman.rb b/lib/puppet/external/gratr/chinese_postman.rb
deleted file mode 100644
index 338a88b..0000000
--- a/lib/puppet/external/gratr/chinese_postman.rb
+++ /dev/null
@@ -1,123 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/digraph_distance'
-
-module GRATR
-  module Graph
-    module ChinesePostman    
-  
-      # Returns the shortest walk that traverses all arcs at least
-      # once, returning to the specified start node.
-      def closed_chinese_postman_tour(start, weight=nil, zero=0)
-        cost, path, delta = floyd_warshall(weight, zero)
-        return nil unless cp_valid_least_cost? cost, zero
-        positive, negative = cp_unbalanced(delta)
-        f = cp_find_feasible(delta, positive, negative, zero)
-        while cp_improve(f, positive, negative, cost, zero); end
-        cp_euler_circuit(start, f, path)
-      end
-
-    private
-   
-      def cp_euler_circuit(start, f, path) # :nodoc:
-        circuit = [u=v=start]
-        bridge_taken = Hash.new {|h,k| h[k] = Hash.new}
-        until v.nil?
-          if v=f[u].keys.detect {|k| f[u][k] > 0}
-            f[u][v] -= 1
-            circuit << (u = path[u][v]) while u != v 
-          else
-            unless bridge_taken[u][bridge = path[u][start]]
-              v = vertices.detect {|v1| v1 != bridge && edge?(u,v1) && !bridge_taken[u][v1]} || bridge
-              bridge_taken[u][v] = true
-              circuit << v            
-            end
-          end  
-          u=v
-        end; circuit
-      end
-   
-      def cp_cancel_cycle(cost, path, f, start, zero) # :nodoc:
-        u = start; k = nil
-        begin
-          v = path[u][start]
-          k = f[v][u] if cost[u][v] < zero and (k.nil? || k > f[v][u])
-        end until (u=v) != start
-        u = start
-        begin
-          v = path[u][start]
-          cost[u][v] < zero ? f[v][u] -= k : f[u][v] += k
-        end until (u=v) != start
-        true # This routine always returns true to make cp_improve easier
-      end
-    
-      def cp_improve(f, positive, negative, cost, zero) # :nodoc:
-        residual = self.class.new
-        negative.each do |u|
-          positive.each do |v|
-            residual.add_edge!(u,v,cost[u][v])
-            residual.add_edge!(v,u,-cost[u][v]) if f[u][v] != 0
-          end
-        end
-        r_cost, r_path, r_delta = residual.floyd_warshall(nil, zero)
-        i = residual.vertices.detect {|v| r_cost[v][v] and r_cost[v][v] < zero}
-        i ? cp_cancel_cycle(r_cost, r_path, f, i) : false
-      end
-    
-      def cp_find_feasible(delta, positive, negative, zero) # :nodoc:
-        f = Hash.new {|h,k| h[k] = Hash.new}
-        negative.each do |i|
-          positive.each do |j|
-            f[i][j] = -delta[i] < delta[j] ? -delta[i] : delta[j]
-            delta[i] += f[i][j]
-            delta[j] -= f[i][j]
-          end
-        end; f
-      end
-   
-      def cp_valid_least_cost?(c, zero) # :nodoc:
-        vertices.each do |i|
-          vertices.each do |j|
-            return false unless c[i][j] and c[i][j] >= zero
-          end
-        end; true
-      end
-    
-      def cp_unbalanced(delta) # :nodoc:
-        negative = []; positive = []
-        vertices.each do |v|
-          negative << v if delta[v] < 0
-          positive << v if delta[v] > 0
-        end; [positive, negative]  
-      end
-
-    end # Chinese Postman
-  end # Graph
-end # GRATR
-  
diff --git a/lib/puppet/external/gratr/common.rb b/lib/puppet/external/gratr/common.rb
deleted file mode 100644
index 347250e..0000000
--- a/lib/puppet/external/gratr/common.rb
+++ /dev/null
@@ -1,73 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/graph'
-
-module GRATR
-  # This class defines a cycle graph of size n
-  # This is easily done by using the base Graph
-  # class and implemeting the minimum methods needed to
-  # make it work. This is a good example to look
-  # at for making one's own graph classes
-  class Cycle
-    
-    def initialize(n) @size = n;       end
-    def directed?()     false;           end
-    def vertices()    (1.. at size).to_a; end
-    def vertex?(v)    v > 0 and v <= @size; end
-    def edge?(u,v=nil)
-      u, v = [u.source, v.target] if u.kind_of? GRATR::Edge
-      vertex?(u) && vertex?(v) && ((v-u == 1) or (u==@size && v=1))
-    end
-    def edges() Array.new(@size) {|i| GRATR::UndirectedEdge[i+1, (i+1)==@size ? 1 : i+2]}; end
-  end
-  
-  # This class defines a complete graph of size n
-  # This is easily done by using the base Graph
-  # class and implemeting the minimum methods needed to
-  # make it work. This is a good example to look
-  # at for making one's own graph classes
-  class Complete < Cycle
-    def initialize(n) @size = n; @edges = nil; end
-    def edges
-      return @edges if @edges      # Cache edges
-      @edges = []
-      @size.times do |u|
-        @size.times {|v| @edges << GRATR::UndirectedEdge[u+1, v+1]}
-      end; @edges
-    end
-    def edge?(u,v=nil)
-      u, v = [u.source, v.target] if u.kind_of? GRATR::Edge
-      vertex?(u) && vertex?(v)
-    end
-  end              # Complete
-  
-  
-  
-end                # GRATR
diff --git a/lib/puppet/external/gratr/comparability.rb b/lib/puppet/external/gratr/comparability.rb
deleted file mode 100644
index 1546fbe..0000000
--- a/lib/puppet/external/gratr/comparability.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
-  module Graph
-    module Comparability
-      
-      # A comparability graph is an UndirectedGraph that has a transitive
-      # orientation. This returns a boolean that says if this graph
-      # is a comparability graph.
-      def comparability?() gamma_decomposition[1]; end
-      
-      # Returns an array with two values, the first being a hash of edges 
-      # with a number containing their class assignment, the second valud
-      # is a boolean which states whether or not the graph is a 
-      # comparability graph
-      #
-      # Complexity in time O(d*|E|) where d is the maximum degree of a vertex
-      # Complexity in space O(|V|+|E|)
-      def gamma_decomposition
-        k = 0; comparability=true; classification={}
-        edges.map {|edge| [edge.source,edge.target]}.each do |e|
-          if classification[e].nil?
-            k += 1
-            classification[e] = k; classification[e.reverse] = -k
-            comparability &&= gratr_comparability_explore(e, k, classification)
-          end
-        end; [classification, comparability]
-      end
-      
-      # Returns one of the possible transitive orientations of 
-      # the UndirectedGraph as a Digraph
-      def transitive_orientation(digraph_class=Digraph)
-        raise NotImplementError
-      end
-      
-     private
-     
-      # Taken from Figure 5.10, on pg. 130 of Martin Golumbic's, _Algorithmic_Graph_
-      # _Theory_and_Perfect_Graphs.
-      def gratr_comparability_explore(edge, k, classification, space='')
-        ret = gratr_comparability_explore_inner(edge, k, classification, :forward, space)
-        gratr_comparability_explore_inner(edge.reverse, k, classification, :backward, space) && ret
-      end
-      
-      def gratr_comparability_explore_inner(edge, k, classification, direction,space)
-        comparability = true  
-        adj_target = adjacent(edge[1])
-        adjacent(edge[0]).select do |mt|
-          (classification[[edge[1],mt]] || k).abs < k or
-          not adj_target.any? {|adj_t| adj_t == mt} 
-        end.each do |m|
-          e = (direction == :forward) ? [edge[0], m] : [m,edge[0]]
-          if classification[e].nil?
-            classification[e] = k
-            classification[e.reverse] = -k
-            comparability = gratr_comparability_explore(e, k, classification, '  '+space) && comparability
-          elsif classification[e] == -k
-            classification[e] = k
-            gratr_comparability_explore(e, k, classification, '  '+space)
-            comparability = false
-          end
-        end; comparability
-      end # gratr_comparability_explore_inner
-      
-    end # Comparability
-  end # Graph
-end # GRATR
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/digraph.rb b/lib/puppet/external/gratr/digraph.rb
deleted file mode 100644
index 1223a65..0000000
--- a/lib/puppet/external/gratr/digraph.rb
+++ /dev/null
@@ -1,116 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/graph'
-require 'puppet/external/gratr/search'
-require 'puppet/external/gratr/adjacency_graph'
-require 'puppet/external/gratr/strong_components'
-require 'puppet/external/gratr/digraph_distance'
-require 'puppet/external/gratr/chinese_postman'
-
-module GRATR
-  #
-  # Digraph is a directed graph which is a finite set of vertices
-  # and a finite set of edges connecting vertices. It cannot contain parallel
-  # edges going from the same source vertex to the same target. It also
-  # cannot contain loops, i.e. edges that go have the same vertex for source 
-  # and target.
-  #
-  # DirectedPseudoGraph is a class that allows for parallel edges, and a
-  # DirectedMultiGraph is a class that allows for parallel edges and loops
-  # as well.
-  class Digraph
-    include AdjacencyGraph
-    include Graph::Search
-    include Graph::StrongComponents
-    include Graph::Distance
-    include Graph::ChinesePostman
-  
-    def initialize(*params)
-      raise ArgumentError if params.any? do |p| 
-       !(p.kind_of? GRATR::Graph or p.kind_of? Array)
-      end if self.class == GRATR::Digraph
-      super(*params)
-    end 
-
-    # A directed graph is directed by definition
-    def directed?() true; end
-
-    # A digraph uses the Edge class for edges
-    def edge_class() @parallel_edges ? GRATR::MultiEdge : GRATR::Edge; end
-
-    # Reverse all edges in a graph
-    def reversal
-      return new(self) unless directed?
-      result = self.class.new
-      edges.inject(result) {|a,e| a << e.reverse}
-      vertices.each { |v| result.add_vertex!(v) unless result.vertex?(v) }
-      result
-    end
-
-    # Return true if the Graph is oriented.
-    def oriented?
-      e = edges
-      re = e.map {|x| x.reverse}
-      not e.any? {|x| re.include?(x)}
-    end
-    
-    # Balanced is when the out edge count is equal to the in edge count
-    def balanced?(v) out_degree(v) == in_degree(v); end
-    
-    # Returns out_degree(v) - in_degree(v)
-    def delta(v) out_degree(v) - in_degree(v); end
-          
-  end
-
-  # DirectedGraph is just an alias for Digraph should one desire
-  DirectedGraph = Digraph
-
-  # This is a Digraph that allows for parallel edges, but does not
-  # allow loops
-  class DirectedPseudoGraph < Digraph
-    def initialize(*params)
-      raise ArgumentError if params.any? do |p| 
-       !(p.kind_of? GRATR::Graph or p.kind_of? Array)
-      end
-      super(:parallel_edges, *params)
-    end 
-  end
-
-  # This is a Digraph that allows for parallel edges and loops
-  class DirectedMultiGraph < Digraph
-    def initialize(*params)
-      raise ArgumentError if params.any? do |p| 
-       !(p.kind_of? GRATR::Graph or p.kind_of? Array)
-      end
-      super(:parallel_edges, :loops, *params)
-    end 
-  end
-
-end
diff --git a/lib/puppet/external/gratr/digraph_distance.rb b/lib/puppet/external/gratr/digraph_distance.rb
deleted file mode 100644
index 6f90384..0000000
--- a/lib/puppet/external/gratr/digraph_distance.rb
+++ /dev/null
@@ -1,185 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
-  module Graph
-    module Distance
-              
-      # Shortest path from Jorgen Band-Jensen and Gregory Gutin,
-      # _DIGRAPHS:_Theory,_Algorithms_and_Applications, pg 53-54
-      #
-      # Requires that the graph be acyclic. If the graph is not
-      # acyclic, then see dijkstras_algorithm or bellman_ford_moore
-      # for possible solutions.
-      #
-      # start is the starting vertex 
-      # weight can be a Proc, or anything else is accessed using the [] for the
-      #     the label or it defaults to using
-      #     the value stored in the label for the Edge. If it is a Proc it will 
-      #     pass the edge to the proc and use the resulting value.
-      # zero is used for math system with a different definition of zero
-      #
-      # Returns a hash with the key being a vertex and the value being the
-      # distance. A missing vertex from the hash is an infinite distance
-      #
-      # Complexity O(n+m)
-      def shortest_path(start, weight=nil, zero=0)
-        dist = {start => zero}; path = {}
-        topsort(start) do |vi|
-          next if vi == start
-          dist[vi],path[vi] = adjacent(vi, :direction => :in).map do |vj|
-            [dist[vj] + cost(vj,vi,weight), vj] 
-          end.min {|a,b| a[0] <=> b[0]}
-        end; 
-        dist.keys.size == vertices.size ? [dist,path] : nil
-      end # shortest_path    
-    
-      # Algorithm from Jorgen Band-Jensen and Gregory Gutin,
-      # _DIGRAPHS:_Theory,_Algorithms_and_Applications, pg 53-54
-      #  
-      # Finds the distances from a given vertex s in a weighted digraph
-      # to the rest of the vertices, provided all the weights of arcs
-      # are non-negative. If negative arcs exist in the graph, two 
-      # basic options exist, 1) modify all weights to be positive by
-      # using an offset, or 2) use the bellman_ford_moore algorithm.
-      # Also if the graph is acyclic, use the shortest_path algorithm.
-      #
-      # weight can be a Proc, or anything else is accessed using the [] for the
-      #     the label or it defaults to using
-      #     the value stored in the label for the Edge. If it is a Proc it will 
-      #     pass the edge to the proc and use the resulting value.
-      #  
-      # zero is used for math system with a different definition of zero
-      #
-      # Returns a hash with the key being a vertex and the value being the
-      # distance. A missing vertex from the hash is an infinite distance
-      #
-      # O(n*log(n) + m) complexity
-      def dijkstras_algorithm(s, weight = nil, zero = 0)
-        q = vertices; distance = { s => zero }; path = {}
-        while not q.empty?
-          v = (q & distance.keys).inject(nil) {|a,k| (!a.nil?) && (distance[a] < distance[k]) ? a : k} 
-          q.delete(v)
-          (q & adjacent(v)).each do |u|
-            c = cost(v,u,weight)
-            if distance[u].nil? or distance[u] > (c+distance[v])
-              distance[u] = c + distance[v]
-              path[u] = v
-            end
-          end
-        end; [distance, path]
-      end # dijkstras_algorithm
-
-      # Algorithm from Jorgen Band-Jensen and Gregory Gutin,
-      # _DIGRAPHS:_Theory,_Algorithms_and_Applications, pg 56-58
-      #  
-      # Finds the distances from a given vertex s in a weighted digraph
-      # to the rest of the vertices, provided the graph has no negative cycle.
-      # If no negative weights exist, then dijkstras_algorithm is more
-      # efficient in time and space. Also if the graph is acyclic, use the
-      # shortest_path algorithm.
-      #
-      # weight can be a Proc, or anything else is accessed using the [] for the
-      #     the label or it defaults to using
-      #     the value stored in the label for the Edge. If it is a Proc it will 
-      #     pass the edge to the proc and use the resulting value.
-      #  
-      # zero is used for math system with a different definition of zero
-      #
-      # Returns a hash with the key being a vertex and the value being the
-      # distance. A missing vertex from the hash is an infinite distance
-      #
-      # O(nm) complexity   
-      def bellman_ford_moore(start, weight = nil, zero = 0)
-        distance = { start => zero }; path = {}
-        2.upto(vertices.size) do
-          edges.each do |e|
-            u,v = e[0],e[1]
-            unless distance[u].nil?
-              c = cost(u, v, weight)+distance[u]
-              if distance[v].nil? or c < distance[v]
-                distance[v] = c
-                path[v] = u
-              end 
-            end        
-          end
-        end; [distance, path]
-      end # bellman_ford_moore
-    
-      # This uses the Floyd-Warshall algorithm to efficiently find
-      # and record shortest paths at the same time as establishing
-      # the costs for all vertices in a graph.
-      # See, S.Skiena, "The Algorithm Design Manual", 
-      # Springer Verlag, 1998 for more details.
-      #  
-      # Returns a pair of matrices and a hash of delta values. 
-      # The matrices will be indexed by two vertices and are
-      # implemented as a Hash of Hashes. The first matrix is the cost, the second
-      # matrix is the shortest path spanning tree. The delta (difference of number
-      # of in edges and out edges) is indexed by vertex.
-      #
-      # weight specifies how an edge weight is determined, if it's a
-      # Proc the Edge is passed to it, if it's nil it will just use
-      # the value in the label for the Edge, otherwise the weight is
-      # determined by applying the [] operator to the value in the 
-      # label for the Edge
-      #
-      # zero defines the zero value in the math system used. Defaults
-      # of course, to 0. This allows for no assumptions to be made
-      # about the math system and fully functional duck typing.
-      #
-      # O(n^3) complexity in time.
-      def floyd_warshall(weight=nil, zero=0)
-        c     = Hash.new {|h,k| h[k] = Hash.new}
-        path  = Hash.new {|h,k| h[k] = Hash.new}
-        delta = Hash.new {|h,k| h[k] = 0}
-        edges.each do |e| 
-          delta[e.source] += 1
-          delta[e.target] -= 1
-          path[e.source][e.target] = e.target      
-          c[e.source][e.target] = cost(e, weight)
-        end
-        vertices.each do |k|
-          vertices.each do |i|
-            if c[i][k]
-              vertices.each do |j|
-                if c[k][j] && 
-                  (c[i][j].nil? or c[i][j] > (c[i][k] + c[k][j]))
-                  path[i][j] = path[i][k]
-                  c[i][j] = c[i][k] + c[k][j]
-                  return nil if i == j and c[i][j] < zero
-                end
-              end
-            end  
-          end
-        end
-        [c, path, delta]
-      end # floyd_warshall
-           
-    end # Distance
-  end # Graph
-end # GRATR
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/dot.rb b/lib/puppet/external/gratr/dot.rb
deleted file mode 100644
index 5b74776..0000000
--- a/lib/puppet/external/gratr/dot.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-#
-# Minimal Dot support, based on Dave Thomas's dot module (included in rdoc).
-# rdot.rb is a modified version which also contains support for undirected
-# graphs.
-
-require 'puppet/external/gratr/rdot'
-
-module GRATR
-  module Graph
- 
-    # Return a DOT::DOTDigraph for directed graphs or a DOT::DOTSubgraph for an
-    # undirected Graph.  _params_ can contain any graph property specified in
-    # rdot.rb. If an edge or vertex label is a kind of Hash then the keys
-    # which match +dot+ properties will be used as well.
-    def to_dot_graph (params = {})
-      params['name'] ||= self.class.name.gsub(/:/,'_')
-      fontsize   = params['fontsize'] ? params['fontsize'] : '8'
-      graph      = (directed? ? DOT::DOTDigraph : DOT::DOTSubgraph).new(params)
-      edge_klass = directed? ? DOT::DOTDirectedEdge : DOT::DOTEdge
-      vertices.each do |v|
-        name = v.to_s
-        params = {'name'     => '"'+name+'"',
-                  'fontsize' => fontsize,
-                  'label'    => name}
-        v_label = vertex_label(v)
-        params.merge!(v_label) if v_label and v_label.kind_of? Hash
-        graph << DOT::DOTNode.new(params)
-      end
-      edges.each do |e|
-        params = {'from'     => '"'+ e.source.to_s + '"',
-                  'to'       => '"'+ e.target.to_s + '"',
-                  'fontsize' => fontsize }
-        e_label = edge_label(e)
-        params.merge!(e_label) if e_label and e_label.kind_of? Hash
-        graph << edge_klass.new(params)
-      end
-      graph
-    end
-    
-    # Output the dot format as a string
-    def to_dot (params={}) to_dot_graph(params).to_s; end
-
-    # Call +dotty+ for the graph which is written to the file 'graph.dot'
-    # in the # current directory.
-    def dotty (params = {}, dotfile = 'graph.dot')
-      File.open(dotfile, 'w') {|f| f << to_dot(params) }
-      system('dotty', dotfile)
-    end
-
-    # Use +dot+ to create a graphical representation of the graph.  Returns the
-    # filename of the graphics file.
-    def write_to_graphic_file (fmt='png', dotfile='graph')
-      src = dotfile + '.dot'
-      dot = dotfile + '.' + fmt
-      
-      File.open(src, 'w') {|f| f << self.to_dot << "\n"}
-      
-      system( "dot -T#{fmt} #{src} -o #{dot}" )
-      dot
-    end
-
-  end                           # module Graph
-end                             # module GRATR
diff --git a/lib/puppet/external/gratr/edge.rb b/lib/puppet/external/gratr/edge.rb
deleted file mode 100644
index 8470e54..0000000
--- a/lib/puppet/external/gratr/edge.rb
+++ /dev/null
@@ -1,145 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-module GRATR
-
-  # Edge includes classes for representing egdes of directed and
-  # undirected graphs. There is no need for a Vertex class, because any ruby
-  # object can be a vertex of a graph.
-  #
-  # Edge's base is a Struct with a :source, a :target and a :label
-  Struct.new("EdgeBase",:source, :target, :label)
-
-  class Edge < Struct::EdgeBase
-
-    def initialize(p_source,p_target,p_label=nil)
-      super(p_source, p_target, p_label)
-    end
-
-    # Ignore labels for equality
-    def eql?(other) self.class == other.class and target==other.target and source==other.source; end
-
-    # Alias for eql?
-    alias == eql?
-
-    # Returns (v,u) if self == (u,v).
-    def reverse() self.class.new(target, source, label); end
-
-    # Sort support
-    def <=>(rhs) [source,target] <=> [rhs.source,rhs.target]; end
-
-    # Edge.new[1,2].to_s => "(1-2 'label')"
-    def to_s
-      l = label ? " '#{label.to_s}'" : ''
-      "(#{source}-#{target}#{l})"
-    end
-    
-    # Hash is defined in such a way that label is not
-    # part of the hash value
-    def hash() source.hash ^ (target.hash+1); end
-
-    # Shortcut constructor. Instead of Edge.new(1,2) one can use Edge[1,2]
-    def self.[](p_source, p_target, p_label=nil)
-      new(p_source, p_target, p_label)
-    end
-    
-    def inspect() "#{self.class.to_s}[#{source.inspect},#{target.inspect},#{label.inspect}]"; end
-    
-  end
-    
-  # An undirected edge is simply an undirected pair (source, target) used in
-  # undirected graphs. UndirectedEdge[u,v] == UndirectedEdge[v,u]
-  class UndirectedEdge < Edge
-
-    # Equality allows for the swapping of source and target
-    def eql?(other) super or (self.class == other.class and target==other.source and source==other.target); end
-      
-    # Alias for eql?
-    alias == eql?
-
-    # Hash is defined such that source and target can be reversed and the
-    # hash value will be the same
-    #
-    # This will cause problems with self loops
-    def hash() source.hash ^ target.hash; end
-
-    # Sort support
-    def <=>(rhs)
-      [[source,target].max,[source,target].min] <=> 
-      [[rhs.source,rhs.target].max,[rhs.source,rhs.target].min]
-    end
-    
-    # UndirectedEdge[1,2].to_s == "(1=2 'label)"
-    def to_s
-      l = label ? " '#{label.to_s}'" : ''
-      s = source.to_s
-      t = target.to_s
-      "(#{[s,t].min}=#{[s,t].max}#{l})"
-    end
-    
-  end
-  
-  # This module provides for internal numbering of edges for differentiating between mutliple edges
-  module EdgeNumber
-    
-    attr_accessor :number # Used to differentiate between mutli-edges
-    
-    def initialize(p_source,p_target,p_number,p_label=nil)
-      self.number = p_number 
-      super(p_source, p_target, p_label)
-    end
-
-    # Returns (v,u) if self == (u,v).
-    def reverse() self.class.new(target, source, number, label); end
-    def hash() super ^ number.hash; end    
-    def to_s() super + "[#{number}]"; end
-    def <=>(rhs) (result = super(rhs)) == 0 ? number <=> rhs.number : result; end 
-    def inspect() "#{self.class.to_s}[#{source.inspect},#{target.inspect},#{number.inspect},#{label.inspect}]"; end
-    def eql?(rhs) super(rhs) and (rhs.number.nil? or number.nil? or number == rhs.number); end 
-    def ==(rhs) eql?(rhs); end
-
-    # Shortcut constructor. Instead of Edge.new(1,2) one can use Edge[1,2]
-    def self.included(cl)
-      
-      def cl.[](p_source, p_target, p_number=nil, p_label=nil)
-        new(p_source, p_target, p_number, p_label)
-      end
-    end
-
-  end
-  
-  class MultiEdge < Edge
-    include EdgeNumber
-  end
-  
-  class MultiUndirectedEdge < UndirectedEdge
-    include EdgeNumber
-  end
-  
-end
diff --git a/lib/puppet/external/gratr/graph.rb b/lib/puppet/external/gratr/graph.rb
deleted file mode 100644
index 7b73afc..0000000
--- a/lib/puppet/external/gratr/graph.rb
+++ /dev/null
@@ -1,303 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/edge'
-require 'puppet/external/gratr/labels'
-require 'puppet/external/gratr/graph_api'
-
-module GRATR
-  
-  # Using the functions required by the GraphAPI, it implements all the
-  # basic functions of a Graph class by using only functions in GraphAPI.
-  # An actual implementation still needs to be done, as in Digraph or
-  # UndirectedGraph.
-  module Graph
-    include Enumerable
-    include Labels
-    include GraphAPI
-      
-    # Non destructive version of add_vertex!, returns modified copy of Graph
-    def add_vertex(v, l=nil) x=self.class.new(self); x.add_vertex!(v,l); end
-      
-    # Non destructive version add_edge!, returns modified copy of Graph  
-    def add_edge(u, v=nil, l=nil) x=self.class.new(self); x.add_edge!(u,v,l); end
-      
-    # Non destructive version of remove_vertex!, returns modified copy of Graph
-    def remove_vertex(v) x=self.class.new(self); x.remove_vertex!(v); end  
-
-    # Non destructive version of remove_edge!, returns modified copy of Graph
-    def remove_edge(u,v=nil) x=self.class.new(self); x.remove_edge!(u,v); end
-      
-    # Return Array of adjacent portions of the Graph
-    #  x can either be a vertex an edge.
-    #  options specifies parameters about the adjacency search
-    #   :type can be either :edges or :vertices (default).
-    #   :direction can be :in, :out(default) or :all.
-    #
-    # Note: It is probably more efficently done in implementation.
-    def adjacent(x, options={})
-      d = directed? ? (options[:direction] || :out) : :all
-
-      # Discharge the easy ones first
-      return [x.source] if x.kind_of? Edge and options[:type] == :vertices and d == :in
-      return [x.target] if x.kind_of? Edge and options[:type] == :vertices and d == :out
-      return [x.source, x.target] if x.kind_of? Edge and options[:type] != :edges and d == :all
-
-      (options[:type] == :edges ? edges : to_a).select {|u| adjacent?(x,u,d)}
-    end
-
-    # Add all objects in _a_ to the vertex set.
-    def add_vertices!(*a) a.each {|v| add_vertex! v}; self; end
-      
-    # See add_vertices!
-
-    def add_vertices(*a) x=self.class.new(self); x.add_vertices(*a); self; end
-
-    # Add all edges in the _edges_ Enumerable to the edge set.  Elements of the
-    # Enumerable can be both two-element arrays or instances of DirectedEdge or
-    # UnDirectedEdge. 
-    def add_edges!(*args) args.each { |edge| add_edge!(edge) }; self; end
-      
-    # See add_edge!
-    def add_edges(*a) x=self.class.new(self); x.add_edges!(*a); self; end
-
-    # Remove all vertices specified by the Enumerable a from the graph by
-    # calling remove_vertex!.
-    def remove_vertices!(*a) a.each { |v| remove_vertex! v }; end
-      
-    # See remove_vertices!
-    def remove_vertices(*a) x=self.class.new(self); x.remove_vertices(*a); end
-
-    # Remove all vertices edges by the Enumerable a from the graph by
-    # calling remove_edge!
-    def remove_edges!(*a) a.each { |e| remove_edges! e }; end
-
-    # See remove_edges
-    def remove_edges(*a) x=self.class.new(self); x.remove_edges(*a); end
-
-    # Execute given block for each vertex, provides for methods in Enumerable
-    def each(&block) vertices.each(&block); end
-
-    # Returns true if _v_ is a vertex of the graph.
-    # This is a default implementation that is of O(n) average complexity.
-    # If a subclass uses a hash to store vertices, then this can be
-    # made into an O(1) average complexity operation.
-    def vertex?(v) vertices.include?(v); end  
-    
-    # Returns true if u or (u,v) is an Edge of the graph.
-    def edge?(*arg) edges.include?(edge_convert(*args)); end  
-
-    # Tests two objects to see if they are adjacent.
-    # direction parameter specifies direction of adjacency, :in, :out, or :all(default)
-    # All denotes that if there is any adjacency, then it will return true.
-    # Note that the default is different than adjacent where one is primarily concerned with finding
-    # all adjacent objects in a graph to a given object. Here the concern is primarily on seeing
-    # if two objects touch. For vertexes, any edge between the two will usually do, but the direction
-    # can be specified if need be.
-    def adjacent?(source, target, direction=:all)
-      if source.kind_of? GRATR::Edge
-        raise NoEdgeError unless edge? source
-        if target.kind_of? GRATR::Edge
-          raise NoEdgeError unless edge? target
-          (direction != :out and source.source == target.target) or (direction != :in and source.target == target.source)
-        else
-          raise NoVertexError unless vertex? target
-          (direction != :out and source.source == target)  or (direction != :in and source.target == target)
-        end
-      else
-        raise NoVertexError unless vertex? source
-        if target.kind_of? GRATR::Edge
-          raise NoEdgeError unless edge? target
-          (direction != :out and source == target.target) or (direction != :in and source == target.source)
-        else
-          raise NoVertexError unless vertex? target
-          (direction != :out and edge?(target,source)) or (direction != :in and edge?(source,target))
-        end
-      end
-    end
-
-    # Returns true if the graph has no vertex, i.e. num_vertices == 0.
-    def empty?() vertices.size.zero?; end
-
-    # Returns true if the given object is a vertex or Edge in the Graph.
-    # 
-    def include?(x) x.kind_of?(GRATR::Edge) ? edge?(x) : vertex?(x); end
-
-    # Returns the neighboorhood of the given vertex (or Edge)
-    # This is equivalent to adjacent, but bases type on the type of object.
-    # direction can be :all, :in, or :out 
-    def neighborhood(x, direction = :all)
-      adjacent(x, :direction => direction, :type => ((x.kind_of? GRATR::Edge) ? :edges : :vertices )) 
-    end
-    
-    # Union of all neighborhoods of vertices (or edges) in the Enumerable x minus the contents of x
-    # Definition taken from Jorgen Bang-Jensen, Gregory Gutin, _Digraphs: Theory, Algorithms and Applications_, pg 4
-    def set_neighborhood(x, direction = :all)
-      x.inject(Set.new) {|a,v| a.merge(neighborhood(v,direction))}.reject {|v2| x.include?(v2)}
-    end  
-    
-    # Union of all set_neighborhoods reachable in p edges
-    # Definition taken from Jorgen Bang-Jensen, Gregory Gutin, _Digraphs: Theory, Algorithms and Applications_, pg 46
-    def closed_pth_neighborhood(w,p,direction=:all)
-      if p <= 0
-        w 
-      elsif p == 1
-        (w + set_neighborhood(w,direction)).uniq
-      else
-        n = set_neighborhood(w, direction)
-        (w + n + closed_pth_neighborhood(n,p-1,direction)).uniq
-      end
-    end
-    
-    # Returns the neighboorhoods reachable in p steps from every vertex (or edge)
-    # in the Enumerable x        
-    # Definition taken from Jorgen Bang-Jensen, Gregory Gutin, _Digraphs: Theory, Algorithms and Applications_, pg 46
-    def open_pth_neighborhood(x, p, direction=:all)
-      if    p <= 0
-        x
-      elsif p == 1
-        set_neighborhood(x,direction)
-      else  
-        set_neighborhood(open_pth_neighborhood(x, p-1, direction),direction) - closed_pth_neighborhood(x,p-1,direction)
-      end    
-    end
-    
-    # Returns the number of out-edges (for directed graphs) or the number of
-    # incident edges (for undirected graphs) of vertex _v_.
-    def out_degree(v) adjacent(v, :direction => :out).size; end
-
-    # Returns the number of in-edges (for directed graphs) or the number of
-    # incident edges (for undirected graphs) of vertex _v_.
-    def in_degree(v)  adjacent(v, :direction => :in ).size; end
-
-    # Returns the sum of the number in and out edges for a vertex
-    def degree(v) in_degree(v) + out_degree(v); end
-
-    # Minimum in-degree 
-    def min_in_degree() to_a.map {|v| in_degree(v)}.min; end
-
-    # Minimum out-degree
-    def min_out_degree() to_a.map {|v| out_degree(v)}.min; end
-
-    # Minimum degree of all vertexes
-    def min_degree() [min_in_degree, min_out_degree].min; end
-
-    # Maximum in-degree 
-    def max_in_degree() vertices.map {|v| in_degree(v)}.max; end
-
-    # Maximum out-degree
-    def max_out_degree() vertices.map {|v| out_degree(v)}.max; end
-
-    # Minimum degree of all vertexes
-    def max_degree() [max_in_degree, max_out_degree].max; end
-
-    # Regular
-    def regular?() min_degree == max_degree; end
-
-    # Returns the number of vertices.
-    def size()         vertices.size; end
-
-    # Synonym for size.
-    def num_vertices() vertices.size; end
-
-    # Returns the number of edges.
-    def num_edges()    edges.size; end
-
-    # Utility method to show a string representation of the edges of the graph.
-    def to_s() edges.to_s; end
-
-    # Equality is defined to be same set of edges and directed?
-    def eql?(g) 
-      return false unless g.kind_of? GRATR::Graph
-
-      (g.directed?   == self.directed?)  and 
-      (vertices.sort == g.vertices.sort) and
-      (g.edges.sort  == edges.sort)
-    end
-
-    # Synonym for eql?
-    def ==(rhs) eql?(rhs); end
-
-    # Merge another graph into this one
-    def merge(other)
-      other.vertices.each {|v| add_vertex!(v)      }
-      other.edges.each    {|e| add_edge!(e)         }
-      other.edges.each    {|e| add_edge!(e.reverse) } if directed? and !other.directed? 
-      self 
-    end
-
-    # A synonym for merge, that doesn't modify the current graph
-    def +(other)
-      result = self.class.new(self)
-      case other
-        when GRATR::Graph : result.merge(other)
-        when GRATR::Edge  : result.add_edge!(other)
-        else              result.add_vertex!(other)
-      end
-    end
-
-    # Remove all vertices in the specified right hand side graph
-    def -(other)
-      case  other
-        when GRATR::Graph : induced_subgraph(vertices - other.vertices)
-        when GRATR::Edge  : self.class.new(self).remove_edge!(other)
-        else              self.class.new(self).remove_vertex!(other)
-      end
-    end
-
-    # A synonym for add_edge!
-    def <<(edge) add_edge!(edge); end
-
-    # Return the complement of the current graph
-    def complement
-      vertices.inject(self.class.new) do |a,v|
-        a.add_vertex!(v)
-        vertices.each {|v2| a.add_edge!(v,v2) unless edge?(v,v2) }; a
-      end
-    end
-
-    # Given an array of vertices return the induced subgraph
-    def induced_subgraph(v)
-      edges.inject(self.class.new) do |a,e| 
-        ( v.include?(e.source) and v.include?(e.target) ) ?  (a << e) : a
-      end;
-    end
-    
-    def inspect
-      l = vertices.select {|v| self[v]}.map {|u| "vertex_label_set(#{u.inspect},#{self[u].inspect})"}.join('.')
-      self.class.to_s + '[' + edges.map {|e| e.inspect}.join(', ') + ']' + (l ? '.'+l : '')
-    end
-    
-   private
-    def edge_convert(*args) args[0].kind_of?(GRATR::Edge) ? args[0] : edge_class[*args]; end
-    
-
-  end # Graph
-
-end # GRATR
diff --git a/lib/puppet/external/gratr/graph_api.rb b/lib/puppet/external/gratr/graph_api.rb
deleted file mode 100644
index 26d1895..0000000
--- a/lib/puppet/external/gratr/graph_api.rb
+++ /dev/null
@@ -1,83 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-module GRATR
-  
-  # This defines the minimum set of functions required to make a graph class that can
-  # use the algorithms defined by this library
-  module GraphAPI
-    
-    # Is the graph directed?
-    # 
-    # This method must be implemented by the specific graph class
-    def directed?()             raise NotImplementedError; end
-
-    # Add a vertex to the Graph and return the Graph
-    # An additional label l can be specified as well
-    # 
-    # This method must be implemented by the specific graph class    
-    def add_vertex!(v,l=nil)     raise NotImplementedError; end
-      
-    # Add an edge to the Graph and return the Graph
-    # u can be an object of type GRATR::Edge or u,v specifies
-    # a source, target pair. The last parameter is an optional label
-    # 
-    # This method must be implemented by the specific graph class
-    def add_edge!(u,v=nil,l=nil) raise NotImplementedError; end
-      
-    # Remove a vertex to the Graph and return the Graph
-    # 
-    # This method must be implemented by the specific graph class
-    def remove_vertex!(v)        raise NotImplementedError; end
-      
-    # Remove an edge from the Graph and return the Graph
-    # 
-    # Can be a type of GRATR::Edge or a source and target
-    # This method must be implemented by the specific graph class
-    def remove_edge!(u,v=nil)    raise NotImplementedError; end
-            
-    # Return the array of vertices.
-    # 
-    # This method must be implemented by the specific graph class
-    def vertices()              raise NotImplementedError; end
-
-    # Return the array of edges.
-    # 
-    # This method must be implemented by the specific graph class
-    def edges()                 raise NotImplementedError; end
-      
-    # Returns the edge class
-    def edge_class()            raise NotImplementedError; end
-    
-    # Return the chromatic number for this graph
-    # This is currently incomplete and in some cases will be NP-complete
-    # FIXME: Should this even be here? My gut feeling is no...
-    def chromatic_number()      raise NotImplementedError; end
-  end
-end
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/import.rb b/lib/puppet/external/gratr/import.rb
deleted file mode 100644
index d3678d8..0000000
--- a/lib/puppet/external/gratr/import.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr'
-
-# Pull all GRATR classes up into the current namespace
-Edge                  = GRATR::Edge
-UndirectedEdge        = GRATR::UndirectedEdge
-MultiEdge             = GRATR::MultiEdge
-MultiUndirectedEdge   = GRATR::MultiUndirectedEdge
-Graph                 = GRATR::Graph
-Digraph               = GRATR::Digraph
-DirectedGraph         = GRATR::DirectedGraph
-DirectedPseudoGraph   = GRATR::DirectedPseudoGraph
-DirectedMultiGraph    = GRATR::DirectedMultiGraph
-UndirectedGraph       = GRATR::UndirectedGraph
-UndirectedPseudoGraph = GRATR::UndirectedPseudoGraph
-UndirectedMultiGraph  = GRATR::UndirectedMultiGraph
-Complete              = GRATR::Complete
diff --git a/lib/puppet/external/gratr/labels.rb b/lib/puppet/external/gratr/labels.rb
deleted file mode 100644
index 7e53df4..0000000
--- a/lib/puppet/external/gratr/labels.rb
+++ /dev/null
@@ -1,90 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
-  module Labels
-    # Return a label for an edge or vertex
-    def [](u) (u.kind_of? GRATR::Edge) ? edge_label(u) : vertex_label(u); end
-
-    # Set a label for an edge or vertex
-    def []= (u, value) (u.kind_of? GRATR::Edge) ? edge_label_set(u,value) : vertex_label_set(u, value); end
-
-    # Delete a label entirely
-    def delete_label(u) (u.kind_of? GRATR::Edge) ? edge_label_delete(u) : vertex_label_delete(u); end
-
-    # Get the label for an edge
-    def vertex_label(v)        vertex_label_dict[v]; end
-
-    # Set the label for an edge
-    def vertex_label_set(v, l) vertex_label_dict[v] = l; self; end
-
-    # Get the label for an edge
-    def edge_label(u,v=nil,n=nil)
-      u = edge_convert(u,v,n)
-      edge_label_dict[u]
-    end
-
-    # Set the label for an edge
-    def edge_label_set(u, v=nil, l=nil, n=nil) 
-      u.kind_of?(GRATR::Edge) ? l = v : u = edge_convert(u,v,n)
-      edge_label_dict[u] = l; self
-    end
-
-    # Delete all graph labels
-    def clear_all_labels()  @vertex_labels = {}; @edge_labels = {}; end
-
-    # Delete an edge label
-    def edge_label_delete(u, v=nil, n=nil)
-      u = edge_convert(u,v,n)
-      edge_label_dict.delete(u)
-    end
-
-    # Delete a vertex label
-    def vertex_label_delete(v) vertex_label_dict.delete(v); end
-
-   protected
-
-    def vertex_label_dict() @vertex_labels ||= {}; end
-    def edge_label_dict()   @edge_labels   ||= {}; end
-
-    # A generic cost function. It either calls the weight function with and edge
-    # constructed from the two nodes, or calls the [] operator of the label
-    # when given a value. If no weight value is specified, the label itself is
-    # treated as the cost value.
-    #
-    # Note: This function will not work for Pseudo or Multi graphs at present. 
-    def cost(u,v=nil,weight=nil)
-      u.kind_of?(Edge) ? weight = v : u = edge_class[u,v] 
-      case weight
-        when Proc : weight.call(u)
-        when nil  : self[u]
-        else        self[u][weight]
-      end
-    end
-
-  end
-end
diff --git a/lib/puppet/external/gratr/maximum_flow.rb b/lib/puppet/external/gratr/maximum_flow.rb
deleted file mode 100644
index 7b3ef9b..0000000
--- a/lib/puppet/external/gratr/maximum_flow.rb
+++ /dev/null
@@ -1,64 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-module GRATR
-
-  module Graph
-
-    module MaximumFlow
-
-      # Maximum flow, it returns an array with the maximum flow and a hash of flow per edge
-      # Currently a highly inefficient implementation, FIXME, This should use Goldberg and Tarjan's method.
-      def maximum_flow(s, t, capacity = nil, zero = 0)
-        flow       = Hash.new(zero)
-        available  = Hash.new(zero)
-        total      = zero
-        edges.each {|e| available[e] = cost(e,capacity)} 
-        adj_positive = Proc.new do |u|
-          adjacent(u).select {|r| available[edge_class[u,r]] > zero}
-        end
-        while (tree = bfs_tree_from_vertex(start))[t]
-          route = [t]
-          while route[-1] != s
-            route << tree[route[route[-1]]]
-            raise ArgumentError, "No route from #{s} to #{t} possible"
-          end; route.reverse
-          amt   = route.map {|e| available[e]}.min
-          route.each do |e|
-            flow[e]      += amt
-            available[e] -= amt
-          end
-          total += amt
-        end
-        
-        [total, flow]
-      end
-
-    end # MaximumFlow
-  end # Graph
-end # GRATR
\ No newline at end of file
diff --git a/lib/puppet/external/gratr/search.rb b/lib/puppet/external/gratr/search.rb
deleted file mode 100644
index 3206ec5..0000000
--- a/lib/puppet/external/gratr/search.rb
+++ /dev/null
@@ -1,409 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-module GRATR
-  module Graph
-    module Search
-
-      # Options are mostly callbacks passed in as a hash. 
-      # The following are valid, anything else is ignored
-      # :enter_vertex  => Proc  Called upon entry of a vertex
-      # :exit_vertex   => Proc  Called upon exit of a vertex
-      # :root_vertex   => Proc  Called when a vertex the a root of a tree
-      # :start_vertex  => Proc  Called for the first vertex of the search
-      # :examine_edge  => Proc  Called when an edge is examined
-      # :tree_edge     => Proc  Called when the edge is a member of the tree
-      # :back_edge     => Proc  Called when the edge is a back edge
-      # :forward_edge  => Proc  Called when the edge is a forward edge
-      # :adjacent      => Proc that given a vertex returns adjacent nodes, defaults to adjacent call of graph useful for changing the definition of adjacent in some algorithms
-      #
-      # :start         => Vertex  Specifies the vertex to start search from
-      #
-      # If a &block is specified it defaults to :enter_vertex
-      #
-      # Returns the list of vertexes as reached by enter_vertex
-      # This allows for calls like, g.bfs.each {|v| ...}
-      #
-      # Can also be called like bfs_examine_edge {|e| ... } or
-      # dfs_back_edge {|e| ... } for any of the callbacks
-      #
-      # A full example usage is as follows:
-      #
-      #  ev = Proc.new {|x| puts "Enter Vertex #{x}"}
-      #  xv = Proc.new {|x| puts "Exit Vertex #{x}"}
-      #  sv = Proc.new {|x| puts "Start Vertex #{x}"}
-      #  ee = Proc.new {|x| puts "Examine Edge #{x}"}
-      #  te = Proc.new {|x| puts "Tree Edge #{x}"}
-      #  be = Proc.new {|x| puts "Back Edge #{x}"}
-      #  fe = Proc.new {|x| puts "Forward Edge #{x}"}
-      #  Digraph[1,2,2,3,3,4].dfs({ 
-      #        :enter_vertex => ev, 
-      #        :exit_vertex  => xv,
-      #        :start_vertex => sv,
-      #        :examine_edge => ee,
-      #        :tree_edge    => te,
-      #        :back_edge    => be,
-      #        :forward_edge => fe })
-      # 
-      # Which outputs:
-      #
-      # Start Vertex 1
-      # Enter Vertex 1
-      # Examine Edge (1=2)
-      # Tree Edge (1=2)
-      # Enter Vertex 2
-      # Examine Edge (2=3)
-      # Tree Edge (2=3)
-      # Enter Vertex 3
-      # Examine Edge (3=4)
-      # Tree Edge (3=4)
-      # Enter Vertex 4
-      # Examine Edge (1=4)
-      # Back Edge (1=4)
-      # Exit Vertex 4
-      # Exit Vertex 3
-      # Exit Vertex 2
-      # Exit Vertex 1
-      def bfs(options={}, &block) gratr_search_helper(:shift, options, &block); end
-
-      # See options for bfs method
-      def dfs(options={}, &block) gratr_search_helper(:pop,   options, &block); end
-      
-      # Routine to compute a spanning forest for the given search method
-      # Returns two values, first is a hash of predecessors and second an array of root nodes
-      def spanning_forest(start, routine)
-        predecessor = {}
-        roots       = []
-        te = Proc.new {|e| predecessor[e.target] = e.source}
-        rv = Proc.new {|v| roots << v}
-        method(routine).call :start => start, :tree_edge => te, :root_vertex => rv
-        [predecessor, roots]
-      end
-      
-      # Return the dfs spanning forest for the given start node, see spanning_forest
-      def dfs_spanning_forest(start) spanning_forest(start, :dfs); end
-      
-      # Return the bfs spanning forest for the given start node, see spanning_forest
-      def bfs_spanning_forest(start) spanning_forest(start, :bfs); end
-      
-      # Returns a hash of predecessors in a tree rooted at the start node. If this is a connected graph
-      # then it will be a spanning tree and contain all vertices. An easier way to tell if it's a spanning tree is to
-      # use a spanning_forest call and check if there is a single root node.
-      def tree_from_vertex(start, routine)
-        predecessor={}
-        correct_tree = false
-        te = Proc.new {|e| predecessor[e.target] = e.source if correct_tree}
-        rv = Proc.new {|v| correct_tree = (v == start)}
-        method(routine).call :start => start, :tree_edge => te, :root_vertex => rv
-        predecessor       
-      end
-      
-      # Returns a hash of predecessors for the depth first search tree rooted at the given node
-      def dfs_tree_from_vertex(start) tree_from_vertex(start, :dfs); end
-      
-      # Returns a hash of predecessors for the depth first search tree rooted at the given node
-      def bfs_tree_from_vertex(start) tree_from_vertex(start, :bfs); end
-       
-      # An inner class used for greater efficiency in lexicograph_bfs
-      #
-      # Original desgn taken from Golumbic's, "Algorithmic Graph Theory and
-      # Perfect Graphs" pg, 87-89
-      class LexicographicQueue
-      
-        # Called with the initial values (array)
-        def initialize(values)
-          @node = Struct.new(:back, :forward, :data)
-          @node.class_eval { def hash() @hash; end; @@cnt=0 }
-          @set  = {}
-          @tail = @node.new(nil, nil, Array.new(values))
-          @tail.instance_eval { @hash = (@@cnt+=1) }
-          values.each {|a| @set[a] = @tail}        
-        end
-     
-        # Pop an entry with maximum lexical value from queue 
-        def pop()
-          return nil unless @tail
-          value = @tail[:data].pop
-          @tail = @tail[:forward] while @tail and @tail[:data].size == 0
-          @set.delete(value); value
-        end
-      
-        # Increase lexical value of given values (array)
-        def add_lexeme(values)
-          fix = {}
-          values.select {|v| @set[v]}.each do |w|
-            sw = @set[w]
-            if fix[sw]
-              s_prime        = sw[:back]
-            else 
-              s_prime             = @node.new(sw[:back], sw, [])
-              s_prime.instance_eval { @hash = (@@cnt+=1) }
-              @tail = s_prime if @tail == sw
-              sw[:back][:forward] = s_prime if sw[:back]
-              sw[:back]           = s_prime
-              fix[sw]             = true
-            end
-            s_prime[:data] << w
-            sw[:data].delete(w)
-            @set[w] = s_prime
-          end
-          fix.keys.select {|n| n[:data].size == 0}.each do |e|
-            e[:forward][:back] = e[:back] if e[:forward]
-            e[:back][:forward] = e[:forward] if e[:back]
-          end
-        end 
-      
-      end
-    
-      # Lexicographic breadth-first search, the usual queue of vertices
-      # is replaced by a queue of unordered subsets of the vertices,
-      # which is sometimes refined but never reordered.
-      # 
-      # Originally developed by Rose, Tarjan, and Leuker, "Algorithmic
-      # aspects of vertex elimination on graphs", SIAM J. Comput. 5, 266-283
-      # MR53 #12077
-      #
-      # Implementation taken from Golumbic's, "Algorithmic Graph Theory and
-      # Perfect Graphs" pg, 84-90
-      def lexicograph_bfs(&block)
-        lex_q = GRATR::Graph::Search::LexicographicQueue.new(vertices)
-        result = []
-        num_vertices.times do               
-          v = lex_q.pop
-          result.unshift(v)
-          lex_q.add_lexeme(adjacent(v))            
-        end
-        result.each {|r| block.call(r)} if block
-        result
-      end
-
-
-      # A* Heuristic best first search
-      # 
-      # start is the starting vertex for the search
-      #
-      # func is a Proc that when passed a vertex returns the heuristic 
-      #   weight of sending the path through that node. It must always
-      #   be equal to or less than the true cost
-      # 
-      # options are mostly callbacks passed in as a hash, the default block is 
-      # :discover_vertex and weight is assumed to be the label for the Edge.
-      # The following options are valid, anything else is ignored.
-      #
-      # * :weight => can be a Proc, or anything else is accessed using the [] for the
-      #     the label or it defaults to using
-      #     the value stored in the label for the Edge. If it is a Proc it will 
-      #     pass the edge to the proc and use the resulting value.
-      # * :discover_vertex => Proc invoked when a vertex is first discovered
-      #   and is added to the open list.
-      # * :examine_vertex  => Proc invoked when a vertex is popped from the
-      #   queue (i.e., it has the lowest cost on the open list).
-      # * :examine_edge    => Proc invoked on each out-edge of a vertex
-      #   immediately after it is examined.
-      # * :edge_relaxed    => Proc invoked on edge (u,v) if d[u] + w(u,v) < d[v].
-      # * :edge_not_relaxed=> Proc invoked if the edge is not relaxed (see above).
-      # * :black_target    => Proc invoked when a vertex that is on the closed 
-      #     list is "rediscovered" via a more efficient path, and is re-added
-      #     to the OPEN list.
-      # * :finish_vertex    => Proc invoked on a vertex when it is added to the 
-      #     closed list, which happens after all of its out edges have been
-      #     examined. 
-      #
-      # Returns array of nodes in path, or calls block on all nodes, 
-      # upon failure returns nil
-      #
-      # Can also be called like astar_examine_edge {|e| ... } or
-      # astar_edge_relaxed {|e| ... } for any of the callbacks
-      #
-      # The criteria for expanding a vertex on the open list is that it has the
-      # lowest f(v) = g(v) + h(v) value of all vertices on open.
-      #
-      # The time complexity of A* depends on the heuristic. It is exponential 
-      # in the worst case, but is polynomial when the heuristic function h
-      # meets the following condition: |h(x) - h*(x)| < O(log h*(x)) where h*  
-      # is the optimal heuristic, i.e. the exact cost to get from x to the goal.
-      #
-      # Also see: http://en.wikipedia.org/wiki/A-star_search_algorithm
-      #
-      def astar(start, goal, func, options, &block)
-        options.instance_eval "def handle_vertex(sym,u) self[sym].call(u) if self[sym]; end"
-        options.instance_eval "def handle_edge(sym,u,v) self[sym].call(#{edge_class}[u,v]) if self[sym]; end"
-
-        d = { start => 0 }
-        f = { start => func.call(start) }
-        color = {start => :gray}
-        p = Hash.new {|k| p[k] = k}
-        queue = [start]
-        block.call(start) if block
-        until queue.empty?
-          u = queue.pop
-          options.handle_vertex(:examine_vertex, u)
-          adjacent(u).each do |v|
-            e = edge_class[u,v]
-            options.handle_edge(:examine_edge, u, v)
-            w = cost(e, options[:weight])
-            raise ArgumentError unless w
-            if d[v].nil? or (w + d[u]) < d[v] 
-              options.handle_edge(:edge_relaxed, u, v)
-              d[v] = w + d[u]
-              f[v] = d[v] + func.call(u)
-              p[v] = u
-              unless color[v] == :gray
-                options.handle_vertex(:black_target, v) if color[v] == :black
-                color[v] = :gray 
-                options.handle_vertex(:discover_vertex, v)
-                queue << v 
-                block.call(v) if block
-                return [start]+queue if v == goal
-              end
-            else
-              options.handle_edge(:edge_not_relaxed, u, v)
-            end
-          end # adjacent(u)
-          color[u] = :black
-          options.handle_vertex(:finish_vertex,u)
-        end # queue.empty?
-        nil # failure, on fall through
-      end # astar
-    
-      # Best first has all the same options as astar with func set to h(v) = 0.
-      # There is an additional option zero which should be defined to zero
-      # for the operation '+' on the objects used in the computation of cost.
-      # The parameter zero defaults to 0.
-      def best_first(start, goal, options, zero=0, &block)
-        func = Proc.new {|v| zero}   
-        astar(start, goal, func, options, &block)
-      end
-
-      alias_method :pre_search_method_missing, :method_missing # :nodoc: 
-      def method_missing(sym,*args, &block) # :nodoc:
-        m1=/^dfs_(\w+)$/.match(sym.to_s)
-        dfs((args[0] || {}).merge({m1.captures[0].to_sym => block})) if m1
-        m2=/^bfs_(\w+)$/.match(sym.to_s)
-        bfs((args[0] || {}).merge({m2.captures[0].to_sym => block})) if m2
-        pre_search_method_missing(sym, *args, &block) unless m1 or m2
-      end
-
-     private
-
-      def gratr_search_helper(op, options={}, &block) # :nodoc: 
-        return nil if size == 0
-        result = []
-        # Create options hash that handles callbacks
-        options = {:enter_vertex => block, :start => to_a[0]}.merge(options)
-        options.instance_eval "def handle_vertex(sym,u) self[sym].call(u) if self[sym]; end"
-        options.instance_eval "def handle_edge(sym,e) self[sym].call(e) if self[sym]; end"
-        # Create waiting list that is a queue or stack depending on op specified.
-        # First entry is the start vertex.
-        waiting = [options[:start]]
-        waiting.instance_eval "def next() #{op.to_s}; end" 
-        # Create color map with all set to unvisited except for start vertex
-        # will be set to waiting
-        color_map = vertices.inject({}) {|a,v| a[v] = :unvisited; a}
-        color_map.merge!(waiting[0] => :waiting)
-        options.handle_vertex(:start_vertex, waiting[0])
-        options.handle_vertex(:root_vertex,  waiting[0])
-        # Perform the actual search until nothing is waiting
-        until waiting.empty?
-          # Loop till the search iterator exhausts the waiting list
-          visited_edges={} # This prevents retraversing edges in undirected graphs
-          until waiting.empty?
-            gratr_search_iteration(options, waiting, color_map, visited_edges, result, op == :pop) 
-          end
-          # Waiting list is exhausted, see if a new root vertex is available
-          u=color_map.detect {|key,value| value == :unvisited}
-          waiting.push(u[0]) if u
-          options.handle_vertex(:root_vertex, u[0]) if u
-        end; result
-      end
-
-      def gratr_search_iteration(options, waiting, color_map, visited_edges, result, recursive=false) # :nodoc:
-        # Get the next waiting vertex in the list
-        u = waiting.next  
-        options.handle_vertex(:enter_vertex,u)
-        result << u
-        # Examine all adjacent outgoing edges, not previously traversed
-        adj_proc = options[:adjacent] || self.method(:adjacent).to_proc
-        adj_proc.call(u,:type => :edges, :direction => :out).reject {|w| visited_edges[w]}.each do |e|
-          e = e.reverse unless directed? or e.source == u # Preserves directionality where required 
-          v = e.target
-          options.handle_edge(:examine_edge, e)
-          visited_edges[e]=true
-          case color_map[v]
-            # If it's unvisited it goes into the waiting list
-            when :unvisited 
-              options.handle_edge(:tree_edge, e)
-              color_map[v] = :waiting
-              waiting.push(v) 
-              # If it's recursive (i.e. dfs) then call self
-              gratr_search_iteration(options, waiting, color_map, visited_edges, result, true) if recursive
-            when :waiting 
-              options.handle_edge(:back_edge, e)
-            else 
-              options.handle_edge(:forward_edge, e)
-          end
-        end
-        # Finished with this vertex
-        options.handle_vertex(:exit_vertex, u)
-        color_map[u] = :visited
-      end
-      
-     public
-      # Topological Sort Iterator
-      #
-      # The topological sort algorithm creates a linear ordering of the vertices
-      # such that if edge (u,v) appears in the graph, then u comes before v in
-      # the ordering. The graph must be a directed acyclic graph (DAG).
-      #
-      # The iterator can also be applied to undirected graph or to a DG graph
-      # which contains a cycle.  In this case, the Iterator does not reach all
-      # vertices.  The implementation of acyclic? and cyclic? uses this fact.
-      #
-      # Can be called with a block as a standard Ruby iterator, or it can
-      # be used directly as it will return the result as an Array
-      def topsort(start = nil, &block)
-        result  = []
-        go      = true 
-        back    = Proc.new {|e| go = false } 
-        push    = Proc.new {|v| result.unshift(v) if go}
-        start   ||= vertices[0]
-        dfs({:exit_vertex => push, :back_edge => back, :start => start})
-        result.each {|v| block.call(v)} if block; result
-      end
-
-      # Returns true if a graph contains no cycles, false otherwise
-      def acyclic?() topsort.size == size; end
-
-      # Returns false if a graph contains no cycles, true otherwise
-      def cyclic?()  not acyclic?; end
-
-      
-    end # Search 
-  end # Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/strong_components.rb b/lib/puppet/external/gratr/strong_components.rb
deleted file mode 100644
index 796ae16..0000000
--- a/lib/puppet/external/gratr/strong_components.rb
+++ /dev/null
@@ -1,127 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'set'
-
-module GRATR
-  module Graph
-    module StrongComponents
-      # strong_components computes the strongly connected components
-      # of a graph using Tarjan's algorithm based on DFS. See: Robert E. Tarjan
-      # _Depth_First_Search_and_Linear_Graph_Algorithms_. SIAM Journal on 
-      # Computing, 1(2):146-160, 1972
-      #
-      # The output of the algorithm is an array of components where is 
-      # component is an array of vertices
-      #
-      # A strongly connected component of a directed graph G=(V,E) is a maximal
-      # set of vertices U which is in V such that for every pair of 
-      # vertices u and v in U, we have both a path from u to v 
-      # and path from v to u. That is to say that u and v are reachable 
-      # from each other.
-      #
-      def strong_components
-
-        dfs_num    = 0
-        stack = []; result = []; root = {}; comp = {}; number = {}
-
-        # Enter vertex callback
-        enter = Proc.new do |v| 
-          root[v] = v
-          comp[v] = :new
-          number[v] = (dfs_num += 1)
-          stack.push(v)
-        end
-
-        # Exit vertex callback
-        exit  = Proc.new do |v|
-          adjacent(v).each do |w|
-            if comp[w] == :new
-              root[v] = (number[root[v]] < number[root[w]] ? root[v] : root[w])
-            end
-          end
-          if root[v] == v
-            component = []
-            begin
-              w = stack.pop
-              comp[w] = :assigned
-              component << w
-            end until w == v
-            result << component
-          end
-        end
-
-        # Execute depth first search
-        dfs({:enter_vertex => enter, :exit_vertex => exit}); result
-
-      end # strong_components
-      
-      # Returns a condensation graph of the strongly connected components
-      # Each node is an array of nodes from the original graph
-      def condensation
-        sc  = strong_components
-        cg  = self.class.new
-        map = sc.inject({}) do |a,c| 
-          c.each {|v| a[v] = c }; a
-        end
-        sc.each do |c|
-          c.each do |v|
-            adjacent(v).each {|v| cg.add_edge!(c, map[v]) unless c == map[v]}
-          end
-        end; cg
-      end
-
-      # Compute transitive closure of a graph. That is any node that is reachable
-      # along a path is added as a directed edge.
-      def transitive_closure!
-        cgtc = condensation.gratr_inner_transitive_closure!
-        cgtc.each do |cgv|
-          cgtc.adjacent(cgv).each do |adj|
-            cgv.each do |u| 
-              adj.each {|v| add_edge!(u,v)}  
-            end
-          end
-        end; self
-      end
-
-      # This returns the transitive closure of a graph. The original graph
-      # is not changed.
-      def transitive_closure() self.class.new(self).transitive_closure!; end
-
-     private
-      def gratr_inner_transitive_closure!  # :nodoc:
-        topsort.reverse.each do |u| 
-          adjacent(u).each do |v|
-            adjacent(v).each {|w| add_edge!(u,w) unless edge?(u,w)}
-          end
-        end; self
-      end
-    end # StrongComponens
-    
-  end # Graph
-end # GRATR
diff --git a/lib/puppet/external/gratr/undirected_graph.rb b/lib/puppet/external/gratr/undirected_graph.rb
deleted file mode 100644
index 86963d2..0000000
--- a/lib/puppet/external/gratr/undirected_graph.rb
+++ /dev/null
@@ -1,153 +0,0 @@
-#--
-# Copyright (c) 2006 Shawn Patrick Garbett
-# Copyright (c) 2002,2004,2005 by Horst Duchene
-# 
-# Redistribution and use in source and binary forms, with or without modification,
-# are permitted provided that the following conditions are met:
-# 
-#     * Redistributions of source code must retain the above copyright notice(s),
-#       this list of conditions and the following disclaimer.
-#     * Redistributions in binary form must reproduce the above copyright notice,
-#       this list of conditions and the following disclaimer in the documentation
-#       and/or other materials provided with the distribution.
-#     * Neither the name of the Shawn Garbett nor the names of its contributors
-#       may be used to endorse or promote products derived from this software
-#       without specific prior written permission.
-# 
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#++
-
-
-require 'puppet/external/gratr/adjacency_graph'
-require 'puppet/external/gratr/search'
-require 'puppet/external/gratr/biconnected'
-require 'puppet/external/gratr/comparability'
-require 'set'
-
-module GRATR
-  class UndirectedGraph
-    include AdjacencyGraph
-    include Graph::Search
-    include Graph::Biconnected
-    include Graph::Comparability
-    
-    def initialize(*params)
-      raise ArgumentError if params.any? do |p| 
-       !(p.kind_of? GRATR::Graph or p.kind_of? Array)
-      end if self.class == GRATR::UndirectedGraph
-      super(*params)
-    end 
-
-    # UndirectedGraph is by definition undirected, always returns false
-    def directed?()  false; end
-      
-    # Redefine degree (default was sum)
-    def degree(v)    in_degree(v); end
-      
-    # A vertex of an undirected graph is balanced by definition
-    def balanced?(v)  true;  end
-
-    # UndirectedGraph uses UndirectedEdge for the edge class.
-    def edge_class() @parallel_edges ? GRATR::MultiUndirectedEdge : GRATR::UndirectedEdge; end
-
-    def remove_edge!(u, v=nil)
-      unless u.kind_of? GRATR::Edge
-        raise ArgumentError if @parallel_edges 
-        u = edge_class[u,v]
-      end
-      super(u.reverse) unless u.source == u.target
-      super(u)
-    end
-    
-    # A triangulated graph is an undirected perfect graph that every cycle of length greater than
-    # three possesses a chord. They have also been called chordal, rigid circuit, monotone transitive,
-    # and perfect elimination graphs.
-    #
-    # Implementation taken from Golumbic's, "Algorithmic Graph Theory and
-    # Perfect Graphs" pg. 90
-    def triangulated?
-      a = Hash.new {|h,k| h[k]=Set.new}; sigma=lexicograph_bfs
-      inv_sigma = sigma.inject({}) {|acc,val| acc[val] = sigma.index(val); acc}
-      sigma[0..-2].each do |v|
-        x = adjacent(v).select {|w| inv_sigma[v] < inv_sigma[w] }
-        unless x.empty?
-           u = sigma[x.map {|y| inv_sigma[y]}.min]
-           a[u].merge(x - [u])
-        end
-        return false unless a[v].all? {|z| adjacent?(v,z)}
-      end
-      true
-    end
-    
-    def chromatic_number
-      return triangulated_chromatic_number if triangulated?
-      raise NotImplementedError    
-    end
-    
-    # An interval graph can have its vertices into one-to-one
-    # correspondence with a set of intervals F of a linearly ordered
-    # set (like the real line) such that two vertices are connected
-    # by an edge of G if and only if their corresponding intervals
-    # have nonempty intersection.
-    def interval?() triangulated? and complement.comparability?; end
-    
-    # A permutation diagram consists of n points on each of two parallel
-    # lines and n straight line segments matchin the points. The intersection
-    # graph of the line segments is called a permutation graph.
-    def permutation?() comparability? and complement.comparability?; end
-    
-    # An undirected graph is defined to be split if there is a partition
-    # V = S + K of its vertex set into a stable set S and a complete set K.    
-    def split?() triangulated? and complement.triangulated?; end
-    
-   private
-   # Implementation taken from Golumbic's, "Algorithmic Graph Theory and
-   # Perfect Graphs" pg. 99
-    def triangulated_chromatic_number
-      chi = 1; s= Hash.new {|h,k| h[k]=0}
-      sigma=lexicograph_bfs
-      inv_sigma = sigma.inject({}) {|acc,val| acc[val] = sigma.index(val); acc}
-      sigma.each do |v|
-        x = adjacent(v).select {|w| inv_sigma[v] < inv_sigma[w] }
-        unless x.empty?
-          u = sigma[x.map {|y| inv_sigma[y]}.min]
-          s[u] = [s[u], x.size-1].max
-          chi = [chi, x.size+1].max if s[v] < x.size
-        end
-      end; chi
-    end
-   
-  end # UndirectedGraph
-
-  # This is a UndirectedGraph that allows for parallel edges, but does not
-  # allow loops
-  class UndirectedPseudoGraph < UndirectedGraph
-    def initialize(*params)
-      raise ArgumentError if params.any? do |p| 
-       !(p.kind_of? Graph or p.kind_of? Array)
-      end
-      super(:parallel_edges, *params)
-    end 
-  end
-
-  # This is a UndirectedGraph that allows for parallel edges and loops
-  class UndirectedMultiGraph < UndirectedGraph
-    def initialize(*params)
-      raise ArgumentError if params.any? do |p| 
-       !(p.kind_of? Graph or p.kind_of? Array)
-      end
-      super(:parallel_edges, :loops, *params)
-    end 
-  end
-
-
-end # GRATR
diff --git a/lib/puppet/external/nagios.rb b/lib/puppet/external/nagios.rb
new file mode 100755
index 0000000..78459fc
--- /dev/null
+++ b/lib/puppet/external/nagios.rb
@@ -0,0 +1,50 @@
+#!/usr/local/bin/ruby -w
+
+#--------------------
+# A script to retrieve hosts from ldap and create an importable
+# cfservd file from them
+#
+# $Id: nagios.rb,v 1.3 2004/06/09 20:32:46 luke Exp $
+
+require 'digest/md5'
+#require 'ldap'
+require 'puppet/external/nagios/parser.rb'
+require 'puppet/external/nagios/base.rb'
+
+module Nagios
+    NAGIOSVERSION = '1.1'
+    # yay colors
+    PINK = ""
+    GREEN = ""
+    YELLOW = ""
+    SLATE = ""
+    ORANGE = ""
+    BLUE = ""
+    NOCOLOR = ""
+    RESET = ""
+
+    def self.version
+        NAGIOSVERSION
+    end
+
+	class Config
+		def Config.import(config)
+
+			text = String.new
+
+			File.open(config) { |file|
+				file.each { |line|
+					text += line
+				}
+			}
+			parser = Nagios::Parser.new
+			return parser.parse(text)
+		end
+		
+		def Config.each
+			Nagios::Object.objects.each { |object|
+				yield object
+			}
+		end
+	end
+end
diff --git a/lib/puppet/external/nagios/base.rb b/lib/puppet/external/nagios/base.rb
new file mode 100755
index 0000000..efc3982
--- /dev/null
+++ b/lib/puppet/external/nagios/base.rb
@@ -0,0 +1,421 @@
+# The base class for all of our Nagios object types.  Everything else
+# is mostly just data.
+class Nagios::Base
+
+    class UnknownNagiosType < RuntimeError # When an unknown type is asked for by name.
+    end
+
+    include Enumerable
+
+    class << self
+        attr_accessor :parameters, :derivatives, :ocs, :name, :att
+        attr_accessor :ldapbase
+
+        attr_writer :namevar
+
+        attr_reader :superior
+    end
+
+    # Attach one class to another.
+    def self.attach(hash)
+        @attach ||= {}
+        hash.each do |n, v| @attach[n] = v end
+    end
+
+    # Convert a parameter to camelcase
+    def self.camelcase(param)
+        param.gsub(/_./) do |match|
+            match.sub(/_/,'').capitalize
+        end
+    end
+
+    # Uncamelcase a parameter.
+    def self.decamelcase(param)
+        param.gsub(/[A-Z]/) do |match|
+            "_" + match.downcase
+        end
+    end
+
+    # Create a new instance of a given class.
+    def self.create(name, args = {})
+        name = name.intern if name.is_a? String
+
+        if @types.include?(name)
+            @types[name].new(args)
+        else
+            raise UnknownNagiosType, "Unknown type %s" % name
+        end
+    end
+
+    # Yield each type in turn.
+    def self.eachtype
+        @types.each do |name, type|
+            yield [name, type]
+        end
+    end
+
+    # Create a mapping.
+    def self.map(hash)
+        @map ||= {}
+        hash.each do |n, v| @map[n] = v end
+    end
+
+    # Return a mapping (or nil) for a param
+    def self.mapping(name)
+        name = name.intern if name.is_a? String
+        if defined? @map
+            @map[name]
+        else
+            nil
+        end
+    end
+
+    # Return the namevar for the canonical name.
+    def self.namevar
+        if defined? @namevar
+            return @namevar
+        else
+            if parameter?(:name)
+                return :name
+            elsif tmp = (self.name.to_s + "_name").intern and parameter?(tmp)
+                @namevar = tmp
+                return @namevar
+            else
+                raise "Type %s has no name var" % self.name
+            end
+        end
+    end
+
+    # Create a new type.
+    def self.newtype(name, &block)
+        name = name.intern if name.is_a? String
+
+        @types ||= {}
+
+        # Create the class, with the correct name.
+        t = Class.new(self)
+        t.name = name
+
+        # Everyone gets this.  There should probably be a better way, and I
+        # should probably hack the attribute system to look things up based on
+        # this "use" setting, but, eh.
+        t.parameters = [:use]
+
+        const_set(name.to_s.capitalize,t)
+
+        # Evaluate the passed block.  This should usually define all of the work.
+        t.class_eval(&block)
+
+        @types[name] = t
+    end
+
+    # Define both the normal case and camelcase method for a parameter
+    def self.paramattr(name)
+        camel = camelcase(name)
+        param = name
+
+        [name, camel].each do |method|
+            define_method(method) do
+                @parameters[param]
+            end
+
+            define_method(method.to_s + "=") do |value|
+                @parameters[param] = value
+            end
+        end
+
+    end
+
+    # Is the specified name a valid parameter?
+    def self.parameter?(name)
+        name = name.intern if name.is_a? String
+        return @parameters.include?(name)
+    end
+
+    # Manually set the namevar
+    def self.setnamevar(name)
+        name = name.intern if name.is_a? String
+        @namevar = name
+    end
+
+    # Set the valid parameters for this class
+    def self.setparameters(*array)
+        @parameters += array
+    end
+
+    # Set the superior ldap object class.  Seems silly to include this
+    # in this class, but, eh.
+    def self.setsuperior(name)
+        @superior = name
+    end
+
+    # Parameters to suppress in output.
+    def self.suppress(name)
+        @suppress ||= []
+        @suppress << name
+    end
+
+    # Whether a given parameter is suppressed.
+    def self.suppress?(name)
+        defined? @suppress and @suppress.include?(name)
+    end
+
+    # Return our name as the string.
+    def self.to_s
+        self.name.to_s
+    end
+
+    # Return a type by name.
+    def self.type(name)
+        name = name.intern if name.is_a? String
+
+        @types[name]
+    end
+
+    # Convenience methods.
+    def [](param)
+        send(param)
+    end
+
+    # Convenience methods.
+    def []=(param,value)
+        send(param.to_s + "=", value)
+    end
+
+    # Iterate across all ofour set parameters.
+    def each
+        @parameters.each { |param,value|
+            yield(param,value)
+        }
+    end
+
+    # Initialize our object, optionally with a list of parameters.
+    def initialize(args = {})
+        @parameters = {}
+
+        args.each { |param,value|
+            self[param] = value
+        }
+    end
+
+    # Handle parameters like attributes.
+    def method_missing(mname, *args)
+        pname = mname.to_s
+        pname.sub!(/=/, '')
+
+        if self.class.parameter?(pname)
+            if pname =~ /A-Z/
+                pname = self.class.decamelcase(pname)
+            end
+            self.class.paramattr(pname)
+
+            # Now access the parameters directly, to make it at least less
+            # likely we'll end up in an infinite recursion.
+            if mname.to_s =~ /=$/
+                @parameters[pname] = *args
+            else
+                return @parameters[mname]
+            end
+        else
+            super
+        end
+    end
+
+    # Retrieve our name, through a bit of redirection.
+    def name
+        send(self.class.namevar)
+    end
+
+    # This is probably a bad idea.
+    def name=(value)
+        send(self.class.namevar.to_s + "=", value)
+    end
+
+    def namevar
+        return (self.type + "_name").intern
+    end
+
+    def parammap(param)
+        unless defined? @map
+            map = {
+                self.namevar => "cn"
+            }
+            if self.class.map
+                map.update(self.class.map)
+            end
+        end
+        if map.include?(param)
+            return map[param]
+        else
+            return "nagios-" + param.id2name.gsub(/_/,'-')
+        end
+    end
+
+    def parent
+        unless defined? self.class.attached
+            puts "Duh, you called parent on an unattached class"
+            return
+        end
+
+        klass,param = self.class.attached
+        unless @parameters.include?(param)
+            puts "Huh, no attachment param"
+            return
+        end
+        klass[@parameters[param]]
+    end
+
+    # okay, this sucks
+    # how do i get my list of ocs?
+    def to_ldif
+        base = self.class.ldapbase
+        str = self.dn + "\n"
+        ocs = Array.new
+        if self.class.ocs
+            # i'm storing an array, so i have to flatten it and stuff
+            kocs = self.class.ocs
+            ocs.push(*kocs)
+        end
+        ocs.push "top"
+        oc = self.class.to_s
+        oc.sub!(/Nagios/,'nagios')
+        oc.sub!(/::/,'')
+        ocs.push oc
+        ocs.each { |oc|
+            str += "objectclass: " + oc + "\n"
+        }
+        @parameters.each { |name,value|
+            if self.class.suppress.include?(name)
+                next
+            end
+            ldapname = self.parammap(name)
+            str += ldapname + ": " + value + "\n"
+        }
+        str += "\n"
+        str
+    end
+
+    def to_s
+        str = "define #{self.type} {\n"
+
+        self.each { |param,value|
+            str += %{\t%-30s %s\n} % [ param,
+                if value.is_a? Array
+                    value.join(",")
+                else
+                    value
+                end
+                ]
+        }
+
+        str += "}\n"
+
+        str
+    end
+
+    # The type of object we are.
+    def type
+        self.class.name
+    end
+
+	# object types
+	newtype :command do
+		setparameters :command_name, :command_line
+	end
+
+	newtype :contact do
+        setparameters :contact_name, :alias, :host_notification_period,
+			:host_notification_commands, :service_notification_period,
+			:service_notification_commands,
+			:email, :pager, :service_notification_options, :host_notification_options
+
+        setsuperior "person"
+	end
+
+	newtype :contactgroup do
+		setparameters :contactgroup_name, :alias, :members
+	end
+
+	newtype :host do
+        setparameters :host_name, :notifications_enabled, :event_handler_enabled,
+			:flap_detection_enabled, :process_perf_data, :retain_status_information,
+			:retain_nonstatus_information, :register, :use, :alias,
+			:address, :check_command, :max_check_attempts, :notification_interval,
+			:notification_period, :notification_options, :checks_enabled,
+            :failure_prediction_enabled, :parents
+
+        setsuperior "person"
+
+        map :address => "ipHostNumber"
+	end
+
+	newtype :hostextinfo do
+		auxiliary = true
+
+        setparameters :host_name, :notes_url, :icon_image, :icon_image_alt, :vrml_image,
+			"2d_coords".intern, "3d_coords".intern
+
+        setnamevar :host_name
+	end
+
+	newtype :hostgroup do
+        setparameters :hostgroup_name, :alias, :contact_groups, :members
+	end
+
+	newtype :hostgroupescalation do
+		auxiliary = true
+        setparameters :hostgroup_name, :first_notification, :last_notification,
+			:contact_groups, :notification_interval
+
+        setnamevar :hostgroup_name
+	end
+
+	newtype :service do
+        attach :host => :host_name
+        setparameters :name, :active_checks_enabled, :passive_checks_enabled,
+            :parallelize_check, :obsess_over_service, :check_freshness,
+            :notifications_enabled, :event_handler_enabled,
+            :flap_detection_enabled, :process_perf_data,
+            :retain_status_information, :retain_nonstatus_information, :register,
+            :is_volatile, :check_period, :max_check_attempts,
+            :normal_check_interval, :retry_check_interval, :contact_groups,
+            :notification_interval, :notification_period, :notification_options,
+            :service_description, :host_name, :freshness_threshold,
+            :check_command
+
+        suppress :host_name
+
+        setnamevar :service_description
+	end
+
+	newtype :servicedependency do
+        auxiliary = true
+        setparameters :host_name, :service_description, :dependent_host_name,
+			:dependent_service_description, :execution_failure_criteria,
+			:notification_failure_criteria
+
+        setnamevar :host_name
+	end
+
+    newtype :serviceescalation do
+        setparameters :host_name, :service_description, :first_notification,
+            :last_notification, :contact_groups, :notification_interval
+
+        setnamevar :host_name
+    end
+
+	newtype :serviceextinfo do
+        auxiliary = true
+
+        setparameters :host_name, :service_description, :icon_image, :icon_image_alt
+
+        setnamevar :host_name
+	end
+
+	newtype :timeperiod do
+        setparameters :timeperiod_name, :alias, :sunday, :monday, :tuesday, :wednesday,
+			:thursday, :friday, :saturday
+	end
+end
+
+# $Id$
diff --git a/lib/puppet/external/nagios/grammar.ry b/lib/puppet/external/nagios/grammar.ry
new file mode 100644
index 0000000..f50818f
--- /dev/null
+++ b/lib/puppet/external/nagios/grammar.ry
@@ -0,0 +1,188 @@
+# vim: syntax=ruby
+class Nagios::Parser
+
+token DEFINE NAME STRING PARAM LCURLY RCURLY VALUE RETURN COMMENT INLINECOMMENT
+
+rule
+decls: decl { return val[0] if val[0] }
+	| decls decl {
+		if val[1].nil?
+			result = val[0]
+		else
+			if val[0].nil?
+				result = val[1]
+			else
+				result = [ val[0], val[1] ].flatten
+			end
+		end
+	}
+	;
+
+decl: object { result = [val[0]] }
+	| RETURN { result = nil }
+	| comment
+	;
+	
+comment: COMMENT RETURN { result = nil }
+	;
+
+object: DEFINE NAME LCURLY RETURN vars RCURLY {
+		result = Nagios::Base.create(val[1],val[4])
+	}
+	;
+
+vars: var
+	| vars var {
+		val[1].each {|p,v|
+			val[0][p] = v
+		}
+		result = val[0]
+	}
+	;
+
+var: PARAM VALUE icomment returns { result = {val[0],val[1]} }
+	;
+
+returns:      RETURN
+            | returns RETURN
+            ;
+
+icomment: # nothing
+	| INLINECOMMENT
+	;
+
+end
+
+----inner
+
+def parse(src)
+	@src = src
+
+	# state variables
+	@invar = false
+	@inobject = false
+	@done = false
+
+	@line = 0
+	@yydebug = true
+
+    begin
+        do_parse
+    rescue SyntaxError
+        $stderr.print "#{$!}\n"
+        exit
+    end
+end
+
+# The lexer.  Very simple.
+def token
+	@src.sub!(/\A\n/,'')
+	if $&
+		@line += 1
+		return [ :RETURN, "\n" ]
+	end
+
+	if @done
+		return nil
+	end
+	yytext = String.new
+
+
+	# remove comments from this line
+	@src.sub!(/\A[ \t]*;.*\n/,"\n")
+	if $&
+		return [:INLINECOMMENT, ""]
+	end
+
+	@src.sub!(/\A#.*\n/,"\n")
+	if $&
+		return [:COMMENT, ""]
+	end
+
+	@src.sub!(/#.*/,'')
+
+	if @src.length == 0
+		@done = true
+		return [false, '$']
+	end
+
+	if @invar
+		@src.sub!(/\A[ \t]+/,'')
+		@src.sub!(/\A([^;\n]+)(\n|;)/,'\2')
+		if $1
+			yytext += $1
+		end
+		@invar = false
+		return [:VALUE, yytext]
+	else
+		@src.sub!(/\A[\t ]*(\S+)([\t ]*|$)/,'')
+        if $1
+            yytext = $1
+            case yytext
+            when 'define'
+                #puts "got define"
+                return [:DEFINE, yytext]
+            when '{'
+                #puts "got {"
+                @inobject = true
+                return [:LCURLY, yytext]
+            else
+                unless @inobject
+                    #puts "got type: #{yytext}"
+                    if yytext =~ /\W/
+                        giveback = yytext.dup
+                        giveback.sub!(/^\w+/,'')
+                        #puts "giveback " + giveback
+                        #puts "yytext " + yytext
+                        yytext.sub!(/\W.*$/,'')
+                        #puts "yytext " + yytext
+                        #puts "all [#{giveback} #{yytext} #{orig}]"
+                        @src = giveback + @src
+                    end
+                    return [:NAME, yytext]
+                else
+                    if yytext == '}'
+                        #puts "got closure: #{yytext}"
+                        @inobject = false
+                        return [:RCURLY, '}']
+                    end
+
+                    unless @invar
+                        @invar = true
+                        return [:PARAM, $1]
+                    else
+                    end
+                end
+            end
+        end
+	end
+end
+
+def next_token
+	token
+end
+
+def yydebug
+    1
+end
+
+def yywrap
+    0
+end
+
+def on_error(token, value, vstack )
+	msg = ""
+	unless value.nil?
+		msg = "line #{@line}: syntax error at '#{value}'"
+	else
+		msg = "line #{@line}: syntax error at '#{token}'"
+	end
+	unless @src.size > 0
+		msg = "line #{@line}: Unexpected end of file"
+	end
+	if token == '$end'.intern
+		puts "okay, this is silly"
+	else
+		raise SyntaxError, msg
+	end
+end
diff --git a/lib/puppet/external/nagios/makefile b/lib/puppet/external/nagios/makefile
new file mode 100644
index 0000000..fc14564
--- /dev/null
+++ b/lib/puppet/external/nagios/makefile
@@ -0,0 +1,9 @@
+all: parser.rb
+
+debug: parser.rb setdebug
+
+parser.rb: grammar.ry
+	racc -E -oparser.rb grammar.ry
+
+setdebug:
+	perl -pi -e 's{\@yydebug =.*$$}{\@yydebug = true}' parser.rb
diff --git a/lib/puppet/external/nagios/parser.rb b/lib/puppet/external/nagios/parser.rb
new file mode 100644
index 0000000..b7e2c21
--- /dev/null
+++ b/lib/puppet/external/nagios/parser.rb
@@ -0,0 +1,816 @@
+#
+# DO NOT MODIFY!!!!
+# This file is automatically generated by racc 1.4.4
+# from racc grammer file "grammar.ry".
+#
+#
+# parser.rb: generated by racc (runtime embedded)
+#
+
+###### racc/parser.rb
+
+unless $".index 'racc/parser.rb'
+$".push 'racc/parser.rb'
+
+self.class.module_eval <<'..end /usr/lib/ruby/1.8/racc/parser.rb modeval..id1306b79176', '/usr/lib/ruby/1.8/racc/parser.rb', 1
+#
+# parser.rb
+#
+# Copyright (c) 1999-2003 Minero Aoki <aamine at loveruby.net>
+#
+# This program is free software.
+# You can distribute/modify this program under the same terms of ruby.
+#
+# As a special exception, when this code is copied by Racc
+# into a Racc output file, you may use that output file
+# without restriction.
+#
+# $raccId: parser.rb,v 1.4 2003/11/03 13:41:47 aamine Exp $
+#
+
+unless defined?(NotImplementedError)
+  NotImplementedError = NotImplementError
+end
+
+module Racc
+  class ParseError < StandardError; end
+end
+unless defined?(::ParseError)
+  ParseError = Racc::ParseError
+end
+
+
+module Racc
+
+  unless defined?(Racc_No_Extentions)
+    Racc_No_Extentions = false
+  end
+
+  class Parser
+
+    Racc_Runtime_Version = '1.4.4'
+    Racc_Runtime_Revision = '$raccRevision: 1.4 $'.split[1]
+
+    Racc_Runtime_Core_Version_R = '1.4.4'
+    Racc_Runtime_Core_Revision_R = '$raccRevision: 1.4 $'.split[1]
+    begin
+      require 'racc/cparse'
+    # Racc_Runtime_Core_Version_C  = (defined in extension)
+      Racc_Runtime_Core_Revision_C = Racc_Runtime_Core_Id_C.split[2]
+      unless new.respond_to?(:_racc_do_parse_c, true)
+        raise LoadError, 'old cparse.so'
+      end
+      if Racc_No_Extentions
+        raise LoadError, 'selecting ruby version of racc runtime core'
+      end
+
+      Racc_Main_Parsing_Routine    = :_racc_do_parse_c
+      Racc_YY_Parse_Method         = :_racc_yyparse_c
+      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_C
+      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_C
+      Racc_Runtime_Type            = 'c'
+    rescue LoadError
+      Racc_Main_Parsing_Routine    = :_racc_do_parse_rb
+      Racc_YY_Parse_Method         = :_racc_yyparse_rb
+      Racc_Runtime_Core_Version    = Racc_Runtime_Core_Version_R
+      Racc_Runtime_Core_Revision   = Racc_Runtime_Core_Revision_R
+      Racc_Runtime_Type            = 'ruby'
+    end
+
+    def Parser.racc_runtime_type
+      Racc_Runtime_Type
+    end
+
+    private
+
+    def _racc_setup
+      @yydebug = false unless self.class::Racc_debug_parser
+      @yydebug = false unless defined?(@yydebug)
+      if @yydebug
+        @racc_debug_out = $stderr unless defined?(@racc_debug_out)
+        @racc_debug_out ||= $stderr
+      end
+      arg = self.class::Racc_arg
+      arg[13] = true if arg.size < 14
+      arg
+    end
+
+    def _racc_init_sysvars
+      @racc_state  = [0]
+      @racc_tstack = []
+      @racc_vstack = []
+
+      @racc_t = nil
+      @racc_val = nil
+
+      @racc_read_next = true
+
+      @racc_user_yyerror = false
+      @racc_error_status = 0
+    end
+
+    ###
+    ### do_parse
+    ###
+
+    def do_parse
+      __send__(Racc_Main_Parsing_Routine, _racc_setup(), false)
+    end
+
+    def next_token
+      raise NotImplementedError, "#{self.class}\#next_token is not defined"
+    end
+
+    def _racc_do_parse_rb( arg, in_debug )
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+
+      _racc_init_sysvars
+      tok = act = i = nil
+      nerr = 0
+
+      catch(:racc_end_parse) {
+        while true
+          if i = action_pointer[@racc_state[-1]]
+            if @racc_read_next
+              if @racc_t != 0   # not EOF
+                tok, @racc_val = next_token()
+                unless tok      # EOF
+                  @racc_t = 0
+                else
+                  @racc_t = (token_table[tok] or 1)   # error token
+                end
+                racc_read_token(@racc_t, tok, @racc_val) if @yydebug
+                @racc_read_next = false
+              end
+            end
+            i += @racc_t
+            unless i >= 0 and
+                   act = action_table[i] and
+                   action_check[i] == @racc_state[-1]
+              act = action_default[@racc_state[-1]]
+            end
+          else
+            act = action_default[@racc_state[-1]]
+          end
+          while act = _racc_evalact(act, arg)
+            ;
+          end
+        end
+      }
+    end
+
+    ###
+    ### yyparse
+    ###
+
+    def yyparse( recv, mid )
+      __send__(Racc_YY_Parse_Method, recv, mid, _racc_setup(), true)
+    end
+
+    def _racc_yyparse_rb( recv, mid, arg, c_debug )
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+
+      _racc_init_sysvars
+      tok = nil
+      act = nil
+      i = nil
+      nerr = 0
+
+      catch(:racc_end_parse) {
+        until i = action_pointer[@racc_state[-1]]
+          while act = _racc_evalact(action_default[@racc_state[-1]], arg)
+            ;
+          end
+        end
+        recv.__send__(mid) do |tok, val|
+# $stderr.puts "rd: tok=#{tok}, val=#{val}"
+          unless tok
+            @racc_t = 0
+          else
+            @racc_t = (token_table[tok] or 1)   # error token
+          end
+          @racc_val = val
+          @racc_read_next = false
+
+          i += @racc_t
+          unless i >= 0 and
+                 act = action_table[i] and
+                 action_check[i] == @racc_state[-1]
+            act = action_default[@racc_state[-1]]
+# $stderr.puts "02: act=#{act}"
+# $stderr.puts "curstate=#{@racc_state[-1]}"
+          else
+# $stderr.puts "01: act=#{act}"
+          end
+
+          while act = _racc_evalact(act, arg)
+            ;
+          end
+
+          while not (i = action_pointer[@racc_state[-1]]) or
+                not @racc_read_next or
+                @racc_t == 0   # $
+            unless i and i += @racc_t and
+                   i >= 0 and
+                   act = action_table[i] and
+                   action_check[i] == @racc_state[-1]
+              act = action_default[@racc_state[-1]]
+# $stderr.puts "04: act=#{act}"
+            else
+# $stderr.puts "03: act=#{act}"
+            end
+            while act = _racc_evalact(act, arg)
+              ;
+            end
+          end
+        end
+      }
+    end
+
+    ###
+    ### common
+    ###
+
+    def _racc_evalact( act, arg )
+# $stderr.puts "ea: act=#{act}"
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+nerr = 0   # tmp
+
+      if act > 0 and act < shift_n
+        #
+        # shift
+        #
+        if @racc_error_status > 0
+          @racc_error_status -= 1 unless @racc_t == 1   # error token
+        end
+        @racc_vstack.push @racc_val
+        @racc_state.push act
+        @racc_read_next = true
+        if @yydebug
+          @racc_tstack.push @racc_t
+          racc_shift @racc_t, @racc_tstack, @racc_vstack
+        end
+
+      elsif act < 0 and act > -reduce_n
+        #
+        # reduce
+        #
+        code = catch(:racc_jump) {
+          @racc_state.push _racc_do_reduce(arg, act)
+          false
+        }
+        if code
+          case code
+          when 1 # yyerror
+            @racc_user_yyerror = true   # user_yyerror
+            return -reduce_n
+          when 2 # yyaccept
+            return shift_n
+          else
+            raise RuntimeError, '[Racc Bug] unknown jump code'
+          end
+        end
+
+      elsif act == shift_n
+        #
+        # accept
+        #
+        racc_accept if @yydebug
+        throw :racc_end_parse, @racc_vstack[0]
+
+      elsif act == -reduce_n
+        #
+        # error
+        #
+        case @racc_error_status
+        when 0
+          unless arg[21]    # user_yyerror
+            nerr += 1
+            on_error @racc_t, @racc_val, @racc_vstack
+          end
+        when 3
+          if @racc_t == 0   # is $
+            throw :racc_end_parse, nil
+          end
+          @racc_read_next = true
+        end
+        @racc_user_yyerror = false
+        @racc_error_status = 3
+        while true
+          if i = action_pointer[@racc_state[-1]]
+            i += 1   # error token
+            if  i >= 0 and
+                (act = action_table[i]) and
+                action_check[i] == @racc_state[-1]
+              break
+            end
+          end
+
+          throw :racc_end_parse, nil if @racc_state.size <= 1
+          @racc_state.pop
+          @racc_vstack.pop
+          if @yydebug
+            @racc_tstack.pop
+            racc_e_pop @racc_state, @racc_tstack, @racc_vstack
+          end
+        end
+        return act
+
+      else
+        raise RuntimeError, "[Racc Bug] unknown action #{act.inspect}"
+      end
+
+      racc_next_state(@racc_state[-1], @racc_state) if @yydebug
+
+      nil
+    end
+
+    def _racc_do_reduce( arg, act )
+      action_table, action_check, action_default, action_pointer,
+      goto_table,   goto_check,   goto_default,   goto_pointer,
+      nt_base,      reduce_table, token_table,    shift_n,
+      reduce_n,     use_result,   * = arg
+      state = @racc_state
+      vstack = @racc_vstack
+      tstack = @racc_tstack
+
+      i = act * -3
+      len       = reduce_table[i]
+      reduce_to = reduce_table[i+1]
+      method_id = reduce_table[i+2]
+      void_array = []
+
+      tmp_t = tstack[-len, len] if @yydebug
+      tmp_v = vstack[-len, len]
+      tstack[-len, len] = void_array if @yydebug
+      vstack[-len, len] = void_array
+      state[-len, len]  = void_array
+
+      # tstack must be updated AFTER method call
+      if use_result
+        vstack.push __send__(method_id, tmp_v, vstack, tmp_v[0])
+      else
+        vstack.push __send__(method_id, tmp_v, vstack)
+      end
+      tstack.push reduce_to
+
+      racc_reduce(tmp_t, reduce_to, tstack, vstack) if @yydebug
+
+      k1 = reduce_to - nt_base
+      if i = goto_pointer[k1]
+        i += state[-1]
+        if i >= 0 and (curstate = goto_table[i]) and goto_check[i] == k1
+          return curstate
+        end
+      end
+      goto_default[k1]
+    end
+
+    def on_error( t, val, vstack )
+      raise ParseError, sprintf("\nparse error on value %s (%s)",
+                                val.inspect, token_to_str(t) || '?')
+    end
+
+    def yyerror
+      throw :racc_jump, 1
+    end
+
+    def yyaccept
+      throw :racc_jump, 2
+    end
+
+    def yyerrok
+      @racc_error_status = 0
+    end
+
+    #
+    # for debugging output
+    #
+
+    def racc_read_token( t, tok, val )
+      @racc_debug_out.print 'read    '
+      @racc_debug_out.print tok.inspect, '(', racc_token2str(t), ') '
+      @racc_debug_out.puts val.inspect
+      @racc_debug_out.puts
+    end
+
+    def racc_shift( tok, tstack, vstack )
+      @racc_debug_out.puts "shift   #{racc_token2str tok}"
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_reduce( toks, sim, tstack, vstack )
+      out = @racc_debug_out
+      out.print 'reduce '
+      if toks.empty?
+        out.print ' <none>'
+      else
+        toks.each {|t| out.print ' ', racc_token2str(t) }
+      end
+      out.puts " --> #{racc_token2str(sim)}"
+          
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_accept
+      @racc_debug_out.puts 'accept'
+      @racc_debug_out.puts
+    end
+
+    def racc_e_pop( state, tstack, vstack )
+      @racc_debug_out.puts 'error recovering mode: pop token'
+      racc_print_states state
+      racc_print_stacks tstack, vstack
+      @racc_debug_out.puts
+    end
+
+    def racc_next_state( curstate, state )
+      @racc_debug_out.puts  "goto    #{curstate}"
+      racc_print_states state
+      @racc_debug_out.puts
+    end
+
+    def racc_print_stacks( t, v )
+      out = @racc_debug_out
+      out.print '        ['
+      t.each_index do |i|
+        out.print ' (', racc_token2str(t[i]), ' ', v[i].inspect, ')'
+      end
+      out.puts ' ]'
+    end
+
+    def racc_print_states( s )
+      out = @racc_debug_out
+      out.print '        ['
+      s.each {|st| out.print ' ', st }
+      out.puts ' ]'
+    end
+
+    def racc_token2str( tok )
+      self.class::Racc_token_to_s_table[tok] or
+          raise RuntimeError, "[Racc Bug] can't convert token #{tok} to string"
+    end
+
+    def token_to_str( t )
+      self.class::Racc_token_to_s_table[t]
+    end
+
+  end
+
+end
+..end /usr/lib/ruby/1.8/racc/parser.rb modeval..id1306b79176
+end   # end of racc/parser.rb
+
+
+module Nagios
+
+  class Parser < Racc::Parser
+
+module_eval <<'..end grammar.ry modeval..id458299781d', 'grammar.ry', 57
+
+def parse(src)
+	@src = src
+
+	# state variables
+	@invar = false
+	@inobject = false
+	@done = false
+
+	@line = 0
+	@yydebug = true
+
+    begin
+        do_parse
+    rescue SyntaxError
+        $stderr.print "#{$!}\n"
+        exit
+    end
+end
+
+# The lexer.  Very simple.
+def token
+	@src.sub!(/\A\n/,'')
+	if $&
+		@line += 1
+		return [ :RETURN, "\n" ]
+	end
+
+	if @done
+		return nil
+	end
+	yytext = String.new
+
+
+	# remove comments from this line
+	@src.sub!(/\A[ \t]*;.*\n/,"\n")
+	if $&
+		return [:INLINECOMMENT, ""]
+	end
+
+	@src.sub!(/\A#.*\n/,"\n")
+	if $&
+		return [:COMMENT, ""]
+	end
+
+	@src.sub!(/#.*/,'')
+
+	if @src.length == 0
+		@done = true
+		return [false, '$']
+	end
+
+	if @invar
+		@src.sub!(/\A[ \t]+/,'')
+		@src.sub!(/\A([^;\n]+)(\n|;)/,'\2')
+		if $1
+			yytext += $1
+		end
+		@invar = false
+		return [:VALUE, yytext]
+	else
+		@src.sub!(/\A[\t ]*(\S+)([\t ]*|$)/,'')
+        if $1
+            yytext = $1
+            case yytext
+            when 'define'
+                #puts "got define"
+                return [:DEFINE, yytext]
+            when '{'
+                #puts "got {"
+                @inobject = true
+                return [:LCURLY, yytext]
+            else
+                unless @inobject
+                    #puts "got type: #{yytext}"
+                    if yytext =~ /\W/
+                        giveback = yytext.dup
+                        giveback.sub!(/^\w+/,'')
+                        #puts "giveback " + giveback
+                        #puts "yytext " + yytext
+                        yytext.sub!(/\W.*$/,'')
+                        #puts "yytext " + yytext
+                        #puts "all [#{giveback} #{yytext} #{orig}]"
+                        @src = giveback + @src
+                    end
+                    return [:NAME, yytext]
+                else
+                    if yytext == '}'
+                        #puts "got closure: #{yytext}"
+                        @inobject = false
+                        return [:RCURLY, '}']
+                    end
+
+                    unless @invar
+                        @invar = true
+                        return [:PARAM, $1]
+                    else
+                    end
+                end
+            end
+        end
+	end
+end
+
+def next_token
+	token
+end
+
+def yydebug
+    1
+end
+
+def yywrap
+    0
+end
+
+def on_error(token, value, vstack )
+	msg = ""
+	unless value.nil?
+		msg = "line #{@line}: syntax error at '#{value}'"
+	else
+		msg = "line #{@line}: syntax error at '#{token}'"
+	end
+	unless @src.size > 0
+		msg = "line #{@line}: Unexpected end of file"
+	end
+	if token == '$end'.intern
+		puts "okay, this is silly"
+	else
+		raise SyntaxError, msg
+	end
+end
+..end grammar.ry modeval..id458299781d
+
+##### racc 1.4.4 generates ###
+
+racc_reduce_table = [
+ 0, 0, :racc_error,
+ 1, 13, :_reduce_1,
+ 2, 13, :_reduce_2,
+ 1, 14, :_reduce_3,
+ 1, 14, :_reduce_4,
+ 1, 14, :_reduce_none,
+ 2, 16, :_reduce_6,
+ 6, 15, :_reduce_7,
+ 1, 17, :_reduce_none,
+ 2, 17, :_reduce_9,
+ 4, 18, :_reduce_10,
+ 1, 20, :_reduce_none,
+ 2, 20, :_reduce_none,
+ 0, 19, :_reduce_none,
+ 1, 19, :_reduce_none ]
+
+racc_reduce_n = 15
+
+racc_shift_n = 26
+
+racc_action_table = [
+     9,    15,     1,    20,     1,    14,    12,    13,    11,     6,
+     7,     6,     7,    15,    18,     8,    21,    23,    25 ]
+
+racc_action_check = [
+     2,    16,     2,    16,     0,    12,     8,     9,     7,     2,
+     2,     0,     0,    14,    15,     1,    18,    22,    24 ]
+
+racc_action_pointer = [
+     2,    12,     0,   nil,   nil,   nil,   nil,    -1,     0,     7,
+   nil,   nil,    -4,   nil,     8,     6,    -4,   nil,     5,   nil,
+   nil,   nil,     8,   nil,     9,   nil ]
+
+racc_action_default = [
+   -15,   -15,   -15,    -1,    -3,    -5,    -4,   -15,   -15,   -15,
+    -2,    -6,   -15,    26,   -15,   -15,   -15,    -8,   -13,    -9,
+    -7,   -14,   -15,   -11,   -10,   -12 ]
+
+racc_goto_table = [
+    17,     3,    19,    10,     2,    16,    22,    24 ]
+
+racc_goto_check = [
+     6,     2,     6,     2,     1,     5,     7,     8 ]
+
+racc_goto_pointer = [
+   nil,     4,     1,   nil,   nil,    -9,   -14,   -12,   -15 ]
+
+racc_goto_default = [
+   nil,   nil,   nil,     4,     5,   nil,   nil,   nil,   nil ]
+
+racc_token_table = {
+ false => 0,
+ Object.new => 1,
+ :DEFINE => 2,
+ :NAME => 3,
+ :STRING => 4,
+ :PARAM => 5,
+ :LCURLY => 6,
+ :RCURLY => 7,
+ :VALUE => 8,
+ :RETURN => 9,
+ :COMMENT => 10,
+ :INLINECOMMENT => 11 }
+
+racc_use_result_var = true
+
+racc_nt_base = 12
+
+Racc_arg = [
+ racc_action_table,
+ racc_action_check,
+ racc_action_default,
+ racc_action_pointer,
+ racc_goto_table,
+ racc_goto_check,
+ racc_goto_default,
+ racc_goto_pointer,
+ racc_nt_base,
+ racc_reduce_table,
+ racc_token_table,
+ racc_shift_n,
+ racc_reduce_n,
+ racc_use_result_var ]
+
+Racc_token_to_s_table = [
+'$end',
+'error',
+'DEFINE',
+'NAME',
+'STRING',
+'PARAM',
+'LCURLY',
+'RCURLY',
+'VALUE',
+'RETURN',
+'COMMENT',
+'INLINECOMMENT',
+'$start',
+'decls',
+'decl',
+'object',
+'comment',
+'vars',
+'var',
+'icomment',
+'returns']
+
+Racc_debug_parser = false
+
+##### racc system variables end #####
+
+ # reduce 0 omitted
+
+module_eval <<'.,.,', 'grammar.ry', 6
+  def _reduce_1( val, _values, result )
+ return val[0] if val[0]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 18
+  def _reduce_2( val, _values, result )
+		if val[1].nil?
+			result = val[0]
+		else
+			if val[0].nil?
+				result = val[1]
+			else
+				result = [ val[0], val[1] ].flatten
+			end
+		end
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 20
+  def _reduce_3( val, _values, result )
+ result = [val[0]]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 21
+  def _reduce_4( val, _values, result )
+ result = nil
+   result
+  end
+.,.,
+
+ # reduce 5 omitted
+
+module_eval <<'.,.,', 'grammar.ry', 25
+  def _reduce_6( val, _values, result )
+ result = nil
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 31
+  def _reduce_7( val, _values, result )
+		result = Nagios::Base.create(val[1],val[4])
+   result
+  end
+.,.,
+
+ # reduce 8 omitted
+
+module_eval <<'.,.,', 'grammar.ry', 40
+  def _reduce_9( val, _values, result )
+		val[1].each {|p,v|
+			val[0][p] = v
+		}
+		result = val[0]
+   result
+  end
+.,.,
+
+module_eval <<'.,.,', 'grammar.ry', 42
+  def _reduce_10( val, _values, result )
+ result = {val[0],val[1]}
+   result
+  end
+.,.,
+
+ # reduce 11 omitted
+
+ # reduce 12 omitted
+
+ # reduce 13 omitted
+
+ # reduce 14 omitted
+
+ def _reduce_none( val, _values, result )
+  result
+ end
+
+  end   # class Parser
+
+end   # module Nagios
diff --git a/lib/puppet/file_serving/file_base.rb b/lib/puppet/file_serving/file_base.rb
index 7f169d1..e87d683 100644
--- a/lib/puppet/file_serving/file_base.rb
+++ b/lib/puppet/file_serving/file_base.rb
@@ -9,16 +9,28 @@ require 'puppet/file_serving'
 class Puppet::FileServing::FileBase
     attr_accessor :key
 
+    # Does our file exist?
+    def exist?
+        begin
+            stat
+            return true
+        rescue => detail
+            return false
+        end
+    end
+
     # Return the full path to our file.  Fails if there's no path set.
     def full_path
         raise(ArgumentError, "You must set a path to get a file's path") unless self.path
 
-        relative_path ? File.join(path, relative_path) : path
+        if relative_path.nil? or relative_path == ""
+            path
+        else
+            File.join(path, relative_path)
+        end
     end
 
     def initialize(key, options = {})
-        raise ArgumentError.new("Files must not be fully qualified") if path =~ /^#{::File::SEPARATOR}/
-
         @key = key
         @links = :manage
 
@@ -34,6 +46,7 @@ class Puppet::FileServing::FileBase
     # Determine how we deal with links.
     attr_reader :links
     def links=(value)
+        value = :manage if value == :ignore
         raise(ArgumentError, ":links can only be set to :manage or :follow") unless [:manage, :follow].include?(value) 
         @links = value
     end
diff --git a/lib/puppet/file_serving/metadata.rb b/lib/puppet/file_serving/metadata.rb
index e26e758..5671212 100644
--- a/lib/puppet/file_serving/metadata.rb
+++ b/lib/puppet/file_serving/metadata.rb
@@ -28,6 +28,25 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
 
     attr_reader :path, :owner, :group, :mode, :checksum_type, :checksum, :ftype, :destination
 
+    PARAM_ORDER = [:mode, :ftype, :owner, :group]
+
+    def attributes_with_tabs
+        desc = []
+        PARAM_ORDER.each { |check|
+            check = :ftype if check == :type
+            desc << send(check)
+        }
+
+        case ftype
+        when "file", "directory": desc << checksum
+        when "link": desc << @destination
+        else
+            raise ArgumentError, "Cannot manage files of type %s" % ftype
+        end
+
+        return desc.join("\t")
+    end
+
     def checksum_type=(type)
         raise(ArgumentError, "Unsupported checksum type %s" % type) unless respond_to?("%s_file" % type)
 
@@ -45,13 +64,19 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
         @ftype = stat.ftype
 
 
-        # Set the octal mode, but as a string.
-        @mode = "%o" % (stat.mode & 007777)
+        # We have to mask the mode, yay.
+        @mode = stat.mode & 007777
 
-        if stat.ftype == "symlink"
+        case stat.ftype
+        when "file":
+            @checksum = ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, real_path)
+        when "directory": # Always just timestamp the directory.
+            sumtype = @checksum_type.to_s =~ /time/ ? @checksum_type : "ctime"
+            @checksum = ("{%s}" % sumtype) + send("%s_file" % sumtype, path).to_s
+        when "link":
             @destination = File.readlink(real_path)
         else
-            @checksum = get_checksum(real_path)
+            raise ArgumentError, "Cannot manage files of type %s" % stat.ftype
         end
     end
 
@@ -59,11 +84,4 @@ class Puppet::FileServing::Metadata < Puppet::FileServing::FileBase
         @checksum_type = "md5"
         super
     end
-
-    private
-
-    # Retrieve our checksum.
-    def get_checksum(path)
-        ("{%s}" % @checksum_type) + send("%s_file" % @checksum_type, path)
-    end
 end
diff --git a/lib/puppet/indirector/node/exec.rb b/lib/puppet/indirector/node/exec.rb
index ed76bce..71f4fa8 100644
--- a/lib/puppet/indirector/node/exec.rb
+++ b/lib/puppet/indirector/node/exec.rb
@@ -30,7 +30,7 @@ class Puppet::Node::Exec < Puppet::Indirector::Exec
     def create_node(name, result)
         node = Puppet::Node.new(name)
         set = false
-        [:parameters, :classes].each do |param|
+        [:parameters, :classes, :environment].each do |param|
             if value = result[param]
                 node.send(param.to_s + "=", value)
                 set = true
diff --git a/lib/puppet/indirector/node/ldap.rb b/lib/puppet/indirector/node/ldap.rb
index dd11f4e..9320f3b 100644
--- a/lib/puppet/indirector/node/ldap.rb
+++ b/lib/puppet/indirector/node/ldap.rb
@@ -36,11 +36,14 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
                 information[:parameters][param] = value unless information[:parameters].include?(param)
             end
 
+            information[:environment] ||= parent_info[:environment]
+
             parent = parent_info[:parent]
         end
 
         node.classes = information[:classes].uniq unless information[:classes].empty?
         node.parameters = information[:parameters] unless information[:parameters].empty?
+        node.environment = information[:environment] if information[:environment]
         node.fact_merge
 
         return node
@@ -87,6 +90,8 @@ class Puppet::Node::Ldap < Puppet::Indirector::Ldap
             hash
         end
 
+        result[:environment] = result[:parameters]["environment"] if result[:parameters]["environment"]
+
         return result
     end
 
diff --git a/lib/puppet/indirector/terminus.rb b/lib/puppet/indirector/terminus.rb
index a0623b2..3015c8a 100644
--- a/lib/puppet/indirector/terminus.rb
+++ b/lib/puppet/indirector/terminus.rb
@@ -66,6 +66,7 @@ class Puppet::Indirector::Terminus
             subclass.terminus_type = self.name
 
             # Our subclass is specifically associated with an indirection.
+            raise("Invalid name %s" % longname) unless names.length > 0
             indirection_name = names.pop.sub(/^[A-Z]/) { |i| i.downcase }.gsub(/[A-Z]/) { |i| "_" + i.downcase }.intern
 
             if indirection_name == "" or indirection_name.nil?
diff --git a/lib/puppet/metatype/closure.rb b/lib/puppet/metatype/closure.rb
index 2598544..673a235 100644
--- a/lib/puppet/metatype/closure.rb
+++ b/lib/puppet/metatype/closure.rb
@@ -20,6 +20,10 @@ class Puppet::Type
         end
     end
 
+    def isomorphic?
+        self.class.isomorphic?
+    end
+
     # is the instance a managed instance?  A 'yes' here means that
     # the instance was created from the language, vs. being created
     # in order resolve other questions, such as finding a package
diff --git a/lib/puppet/metatype/evaluation.rb b/lib/puppet/metatype/evaluation.rb
index b3b6570..08756e9 100644
--- a/lib/puppet/metatype/evaluation.rb
+++ b/lib/puppet/metatype/evaluation.rb
@@ -125,26 +125,14 @@ class Puppet::Type
             raise Puppet::DevError, "Parameter ensure defined but missing from current values"
         end
         if @parameters.include?(:ensure) and ! ensureparam.insync?(currentvalues[ensureparam])
-#            self.info "ensuring %s from %s" %
-#                [@parameters[:ensure].should, @parameters[:ensure].is]
             changes << Puppet::PropertyChange.new(ensureparam, currentvalues[ensureparam])
         # Else, if the 'ensure' property is correctly absent, then do
         # nothing
         elsif @parameters.include?(:ensure) and currentvalues[ensureparam] == :absent
-            #            self.info "Object is correctly absent"
             return []
         else
-#            if @parameters.include?(:ensure)
-#                self.info "ensure: Is: %s, Should: %s" %
-#                    [@parameters[:ensure].is, @parameters[:ensure].should]
-#            else
-#                self.info "no ensure property"
-#            end
             changes = properties().find_all { |property|
-                unless currentvalues.include?(property)
-                    raise Puppet::DevError, "Property %s does not have a current value", 
-                               [property.name]
-                end
+                currentvalues[property] ||= :absent
                 ! property.insync?(currentvalues[property])
             }.collect { |property|
                 Puppet::PropertyChange.new(property, currentvalues[property])
@@ -152,10 +140,7 @@ class Puppet::Type
         end
 
         if Puppet[:debug] and changes.length > 0
-            self.debug("Changing " + changes.collect { |ch|
-                    ch.property.name
-                }.join(",")
-            )
+            self.debug("Changing " + changes.collect { |ch| ch.property.name }.join(","))
         end
 
         changes
diff --git a/lib/puppet/metatype/metaparams.rb b/lib/puppet/metatype/metaparams.rb
index b35adae..9983c34 100644
--- a/lib/puppet/metatype/metaparams.rb
+++ b/lib/puppet/metatype/metaparams.rb
@@ -258,7 +258,7 @@ class Puppet::Type
             @value.each do |value|
                 unless @resource.catalog.resource(*value)
                     description = self.class.direction == :in ? "dependency" : "dependent"
-                    raise Puppet::Error, "Could not find #{description} %s[%s]" % [value[0].to_s.capitalize, value[1]]
+                    fail Puppet::Error, "Could not find #{description} %s[%s] for %s" % [value[0].to_s.capitalize, value[1], resource.ref]
                 end
             end
         end
diff --git a/lib/puppet/network/http_server.rb b/lib/puppet/network.rb
similarity index 57%
copy from lib/puppet/network/http_server.rb
copy to lib/puppet/network.rb
index e3826a6..8993b88 100644
--- a/lib/puppet/network/http_server.rb
+++ b/lib/puppet/network.rb
@@ -1,3 +1,3 @@
 # Just a stub, so we can correctly scope other classes.
-module Puppet::Network::HTTPServer # :nodoc:
+module Puppet::Network # :nodoc:
 end
diff --git a/lib/puppet/network/client.rb b/lib/puppet/network/client.rb
index 283436e..cf1782f 100644
--- a/lib/puppet/network/client.rb
+++ b/lib/puppet/network/client.rb
@@ -7,6 +7,8 @@ require 'puppet/util/subclass_loader'
 require 'puppet/util/methodhelper'
 require 'puppet/sslcertificates/support'
 
+require 'puppet/network/handler'
+
 require 'net/http'
 
 # Some versions of ruby don't have this method defined, which basically causes
@@ -95,9 +97,7 @@ class Puppet::Network::Client
 
             # We have to start the HTTP connection manually before we start
             # sending it requests or keep-alive won't work.
-            if @driver.respond_to? :start
-                @driver.start
-            end
+            @driver.start if @driver.respond_to? :start
 
             @local = false
         elsif hash.include?(driverparam)
@@ -107,8 +107,7 @@ class Puppet::Network::Client
             end
             @local = true
         else
-            raise Puppet::Network::ClientError, "%s must be passed a Server or %s" %
-                [self.class, driverparam]
+            raise Puppet::Network::ClientError, "%s must be passed a Server or %s" % [self.class, driverparam]
         end
     end
 
diff --git a/lib/puppet/network/client/master.rb b/lib/puppet/network/client/master.rb
index 6d1a023..913c51b 100644
--- a/lib/puppet/network/client/master.rb
+++ b/lib/puppet/network/client/master.rb
@@ -26,22 +26,25 @@ class Puppet::Network::Client::Master < Puppet::Network::Client
         
         down = Puppet[:downcasefacts]
 
-        facts = {}
-        Facter.each { |name,fact|
+        facts = Facter.to_hash.inject({}) do |newhash, array|
+            name, fact = array
             if down
-                facts[name] = fact.to_s.downcase
+                newhash[name] = fact.to_s.downcase
             else
-                facts[name] = fact.to_s
+                newhash[name] = fact.to_s
             end
-        }
+            newhash
+        end
 
         # Add our client version to the list of facts, so people can use it
         # in their manifests
         facts["clientversion"] = Puppet.version.to_s
 
         # And add our environment as a fact.
-        facts["environment"] = Puppet[:environment]
-
+        unless facts.include?("environment")
+            facts["environment"] = Puppet[:environment]
+        end
+ 
         facts
     end
 
diff --git a/lib/puppet/network/handler/fileserver.rb b/lib/puppet/network/handler/fileserver.rb
index e6378bf..751a772 100755
--- a/lib/puppet/network/handler/fileserver.rb
+++ b/lib/puppet/network/handler/fileserver.rb
@@ -5,6 +5,9 @@ require 'cgi'
 require 'delegate'
 require 'sync'
 
+require 'puppet/file_serving'
+require 'puppet/file_serving/metadata'
+
 class Puppet::Network::Handler
     AuthStoreError = Puppet::AuthStoreError
     class FileServerError < Puppet::Error; end
@@ -59,40 +62,27 @@ class Puppet::Network::Handler
 
         # Describe a given file.  This returns all of the manageable aspects
         # of that file.
-        def describe(url, links = :ignore, client = nil, clientip = nil)
+        def describe(url, links = :follow, client = nil, clientip = nil)
             links = links.intern if links.is_a? String
 
-            if links == :manage
-                raise Puppet::Network::Handler::FileServerError, "Cannot currently copy links"
-            end
-
             mount, path = convert(url, client, clientip)
 
-            if client
-                mount.debug "Describing %s for %s" % [url, client]
-            end
+            mount.debug("Describing %s for %s" % [url, client]) if client
+
+            # use the mount to resolve the path for us.
+            metadata = Puppet::FileServing::Metadata.new(url, :path => mount.file_path(path, client), :links => links)
 
-            obj = nil
-            unless obj = mount.getfileobject(path, links, client)
+            return "" unless metadata.exist?
+
+            begin
+                metadata.collect_attributes
+            rescue => detail
+                puts detail.backtrace if Puppet[:trace]
+                Puppet.err detail
                 return ""
             end
 
-            currentvalues = mount.check(obj)
-    
-            desc = []
-            CHECKPARAMS.each { |check|
-                if value = currentvalues[check]
-                    desc << value
-                else
-                    if check == "checksum" and currentvalues[:type] == "file"
-                        mount.notice "File %s does not have data for %s" %
-                            [obj.name, check]
-                    end
-                    desc << nil
-                end
-            }
-
-            return desc.join("\t")
+            return metadata.attributes_with_tabs
         end
 
         # Create a new fileserving module.
@@ -140,26 +130,18 @@ class Puppet::Network::Handler
         def list(url, links = :ignore, recurse = false, ignore = false, client = nil, clientip = nil)
             mount, path = convert(url, client, clientip)
 
-            if client
-                mount.debug "Listing %s for %s" % [url, client]
-            end
+            mount.debug "Listing %s for %s" % [url, client] if client
 
-            obj = nil
-            unless mount.path_exists?(path, client)
-                return ""
-            end
+            return "" unless mount.path_exists?(path, client)
 
             desc = mount.list(path, recurse, ignore, client)
 
             if desc.length == 0
-                mount.notice "Got no information on //%s/%s" %
-                    [mount, path]
+                mount.notice "Got no information on //%s/%s" % [mount, path]
                 return ""
             end
-            
-            desc.collect { |sub|
-                sub.join("\t")
-            }.join("\n")
+
+            desc.collect { |sub| sub.join("\t") }.join("\n")
         end
         
         def local?
@@ -213,12 +195,7 @@ class Puppet::Network::Handler
                 return ""
             end
 
-            str = nil
-            if links == :manage
-                raise Puppet::Error, "Cannot copy links yet."
-            else
-                str = mount.read_file(path, client)
-            end
+            str = mount.read_file(path, client)
 
             if @local
                 return str
diff --git a/lib/puppet/network/http_pool.rb b/lib/puppet/network/http_pool.rb
index 99f09a9..69574d8 100644
--- a/lib/puppet/network/http_pool.rb
+++ b/lib/puppet/network/http_pool.rb
@@ -1,6 +1,9 @@
 require 'puppet/sslcertificates/support'
 require 'net/https'
 
+module Puppet::Network
+end
+
 # Manage Net::HTTP instances for keep-alive.
 module Puppet::Network::HttpPool
     # This handles reading in the key and such-like.
diff --git a/lib/puppet/network/http_server/mongrel.rb b/lib/puppet/network/http_server/mongrel.rb
index d6e21b1..6b2325d 100644
--- a/lib/puppet/network/http_server/mongrel.rb
+++ b/lib/puppet/network/http_server/mongrel.rb
@@ -33,6 +33,7 @@ require 'xmlrpc/server'
 require 'puppet/network/xmlrpc/server'
 require 'puppet/network/http_server'
 require 'puppet/network/client_request'
+require 'puppet/network/handler'
 require 'puppet/daemon'
 
 require 'resolv'
@@ -127,7 +128,12 @@ module Puppet::Network
                 client = dn_matchdata[1].to_str
                 valid = (params[Puppet[:ssl_client_verify_header]] == 'SUCCESS')
             else
-                client = Resolv.getname(ip)
+                begin
+                    client = Resolv.getname(ip)
+                rescue => detail
+                    Puppet.err "Could not resolve %s: %s" % [ip, detail]
+                    client = "unknown"
+                end
                 valid = false
             end
 
diff --git a/lib/puppet/network/http_server/webrick.rb b/lib/puppet/network/http_server/webrick.rb
index 3c9f72e..568b4e7 100644
--- a/lib/puppet/network/http_server/webrick.rb
+++ b/lib/puppet/network/http_server/webrick.rb
@@ -8,6 +8,7 @@ require 'puppet/sslcertificates/support'
 require 'puppet/network/xmlrpc/webrick_servlet'
 require 'puppet/network/http_server'
 require 'puppet/network/client'
+require 'puppet/network/handler'
 
 module Puppet
     class ServerError < RuntimeError; end
@@ -22,12 +23,12 @@ module Puppet
             # with them, with flags appropriate for checking client 
             # certificates for revocation
             def x509store
-                if Puppet[:cacrl] == 'none'
+                if Puppet[:cacrl] == 'false'
                     # No CRL, no store needed
                     return nil
                 end
                 unless File.exist?(Puppet[:cacrl])
-                    raise Puppet::Error, "Could not find CRL; set 'cacrl' to 'none' to disable CRL usage"
+                    raise Puppet::Error, "Could not find CRL; set 'cacrl' to 'false' to disable CRL usage"
                 end
                 crl = OpenSSL::X509::CRL.new(File.read(Puppet[:cacrl]))
                 store = OpenSSL::X509::Store.new
@@ -133,7 +134,7 @@ module Puppet
 
                 handlers.collect { |handler, args|
                     hclass = nil
-                    unless hclass = Handler.handler(handler)
+                    unless hclass = Puppet::Network::Handler.handler(handler)
                         raise ServerError, "Invalid handler %s" % handler
                     end
                     hclass.new(args)
diff --git a/lib/puppet/network/xmlrpc/client.rb b/lib/puppet/network/xmlrpc/client.rb
index 27bb3dc..f6a5e8d 100644
--- a/lib/puppet/network/xmlrpc/client.rb
+++ b/lib/puppet/network/xmlrpc/client.rb
@@ -90,6 +90,13 @@ module Puppet::Network
             @clients[handler] || self.mkclient(handler)
         end
 
+        def http
+            unless @http
+                @http = Puppet::Network::HttpPool.http_instance(@host, @port, true)
+            end
+            @http
+        end
+
         def initialize(hash = {})
             hash[:Path] ||= "/RPC2"
             hash[:Server] ||= Puppet[:server]
@@ -125,7 +132,11 @@ module Puppet::Network
         end
         
         def start
-            @http.start unless @http.started?
+            begin
+                @http.start unless @http.started?
+            rescue => detail
+                Puppet.err "Could not connect to server: %s" % detail
+            end
         end
 
         def local
diff --git a/lib/puppet/node/catalog.rb b/lib/puppet/node/catalog.rb
index c9de201..f885a41 100644
--- a/lib/puppet/node/catalog.rb
+++ b/lib/puppet/node/catalog.rb
@@ -1,5 +1,8 @@
 require 'puppet/indirector'
-require 'puppet/external/gratr/digraph'
+require 'puppet/pgraph'
+require 'puppet/transaction'
+
+require 'puppet/util/tagging'
 
 # This class models a node catalog.  It is the thing
 # meant to be passed from server to client, and it contains all
@@ -9,6 +12,8 @@ class Puppet::Node::Catalog < Puppet::PGraph
     extend Puppet::Indirector
     indirects :catalog, :terminus_class => :compiler
 
+    include Puppet::Util::Tagging
+
     # The host name this is a catalog for.
     attr_accessor :name
 
@@ -59,14 +64,21 @@ class Puppet::Node::Catalog < Puppet::PGraph
                 raise ArgumentError, "Can only add objects that respond to :ref"
             end
 
+            fail_unless_unique(resource)
+
             ref = resource.ref
-            if @resource_table.include?(ref)
-                raise ArgumentError, "Resource %s is already defined" % ref
-            else
-                @resource_table[ref] = resource
+
+            @resource_table[ref] = resource
+
+            # If the name and title differ, set up an alias
+            #self.alias(resource, resource.name) if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+            if resource.respond_to?(:name) and resource.respond_to?(:title) and resource.name != resource.title
+                self.alias(resource, resource.name) if resource.isomorphic?
             end
-            resource.catalog = self unless is_relationship_graph
-            add_vertex!(resource)
+
+            resource.catalog = self if resource.respond_to?(:catalog=) and ! is_relationship_graph
+
+            add_vertex(resource)
         end
     end
 
@@ -75,7 +87,10 @@ class Puppet::Node::Catalog < Puppet::PGraph
         resource.ref =~ /^(.+)\[/
 
         newref = "%s[%s]" % [$1 || resource.class.name, name]
-        raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref]) if @resource_table[newref]
+        if existing = @resource_table[newref]
+            return if existing == resource
+            raise(ArgumentError, "Cannot alias %s to %s; resource %s already exists" % [resource.ref, name, newref])
+        end
         @resource_table[newref] = resource
         @aliases[resource.ref] << newref
     end
@@ -212,9 +227,8 @@ class Puppet::Node::Catalog < Puppet::PGraph
         # Create a proc for examining edges, which we'll use to build our tree
         # of TransBuckets and TransObjects.
         bucket = nil
-        edges = proc do |edge|
+        walk(main, :out) do |source, target|
             # The sources are always non-builtins.
-            source, target = edge.source, edge.target
             unless tmp = buckets[source.to_s]
                 if tmp = buckets[source.to_s] = source.to_trans
                     bucket = tmp
@@ -239,11 +253,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
                 end
             end
         end
-        dfs(:start => main, :examine_edge => edges)
-
-        unless main
-            raise Puppet::DevError, "Could not find 'main' class; cannot generate catalog"
-        end
 
         # Retrieve the bucket for the top-level scope and set the appropriate metadata.
         unless result = buckets[main.to_s]
@@ -275,7 +284,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
         super()
         @name = name if name
         @extraction_format ||= :transportable
-        @tags = []
         @classes = []
         @resource_table = {}
         @transient_resources = []
@@ -320,9 +328,9 @@ class Puppet::Node::Catalog < Puppet::PGraph
             
             # First create the dependency graph
             self.vertices.each do |vertex|
-                @relationship_graph.add_vertex! vertex
+                @relationship_graph.add_vertex vertex
                 vertex.builddepends.each do |edge|
-                    @relationship_graph.add_edge!(edge)
+                    @relationship_graph.add_edge(edge)
                 end
             end
             
@@ -332,7 +340,7 @@ class Puppet::Node::Catalog < Puppet::PGraph
                     unless @relationship_graph.edge?(edge.source, edge.target) # don't let automatic relationships conflict with manual ones.
                         unless @relationship_graph.edge?(edge.target, edge.source)
                             vertex.debug "Autorequiring %s" % [edge.source]
-                            @relationship_graph.add_edge!(edge)
+                            @relationship_graph.add_edge(edge)
                         else
                             vertex.debug "Skipping automatic relationship with %s" % (edge.source == vertex ? edge.target : edge.source)
                         end
@@ -388,25 +396,6 @@ class Puppet::Node::Catalog < Puppet::PGraph
         @resource_table.keys
     end
 
-    # Add a tag.
-    def tag(*names)
-        names.each do |name|
-            name = name.to_s
-            @tags << name unless @tags.include?(name)
-            if name.include?("::")
-                name.split("::").each do |sub|
-                    @tags << sub unless @tags.include?(sub)
-                end
-            end
-        end
-        nil
-    end
-
-    # Return the list of tags.
-    def tags
-        @tags.dup
-    end
-
     # Convert our catalog into a RAL catalog.
     def to_ral
         to_catalog :to_type
@@ -454,6 +443,28 @@ class Puppet::Node::Catalog < Puppet::PGraph
         end
     end
 
+    # Verify that the given resource isn't defined elsewhere.
+    def fail_unless_unique(resource)
+        # Short-curcuit the common case, 
+        return unless existing_resource = @resource_table[resource.ref]
+
+        # Either it's a defined type, which are never
+        # isomorphic, or it's a non-isomorphic type, so
+        # we should throw an exception.
+        msg = "Duplicate definition: %s is already defined" % resource.ref
+
+        if existing_resource.file and existing_resource.line
+            msg << " in file %s at line %s" %
+                [existing_resource.file, existing_resource.line]
+        end
+
+        if resource.line or resource.file
+            msg << "; cannot redefine"
+        end
+
+        raise ArgumentError.new(msg)
+    end
+
     # An abstracted method for converting one catalog into another type of catalog.
     # This pretty much just converts all of the resources from one class to another, using
     # a conversion method.
@@ -488,12 +499,12 @@ class Puppet::Node::Catalog < Puppet::PGraph
                 raise Puppet::DevError, "Could not find resource %s when converting %s resources" % [edge.target.ref, message]
             end
 
-            result.add_edge!(source, target, edge.label)
+            result.add_edge(source, target, edge.label)
         end
 
         map.clear
 
-        result.add_class *self.classes
+        result.add_class(*self.classes)
         result.tag(*self.tags)
 
         return result
diff --git a/lib/puppet/parser/ast.rb b/lib/puppet/parser/ast.rb
index 14b686e..c9bd7c9 100644
--- a/lib/puppet/parser/ast.rb
+++ b/lib/puppet/parser/ast.rb
@@ -14,30 +14,6 @@ class Puppet::Parser::AST
     include Puppet::Util::MethodHelper
     attr_accessor :line, :file, :parent, :scope
 
-    # Just used for 'tree', which is only used in debugging.
-    @@pink = ""
-    @@green = ""
-    @@yellow = ""
-    @@slate = ""
-    @@reset = ""
-
-    # Just used for 'tree', which is only used in debugging.
-    @@indent = " " * 4
-    @@indline = @@pink + ("-" * 4) + @@reset
-    @@midline = @@slate + ("-" * 4) + @@reset
-
-    @@settypes = {}
-
-    # Just used for 'tree', which is only used in debugging.
-    def AST.indention
-        return @@indent * @@indention
-    end
-
-    # Just used for 'tree', which is only used in debugging.
-    def AST.midline
-        return @@midline
-    end
-
     # Does this ast object set something?  If so, it gets evaluated first.
     def self.settor?
         if defined? @settor
@@ -47,16 +23,12 @@ class Puppet::Parser::AST
         end
     end
 
-    # Evaluate the current object.  Basically just iterates across all
+    # Evaluate the current object.  Just a stub method, since the subclass
+    # should override this method.
     # of the contained children and evaluates them in turn, returning a
     # list of all of the collected values, rejecting nil values
-    def evaluate(args)
-        #Puppet.debug("Evaluating ast %s" % @name)
-        value = self.collect { |obj|
-            obj.safeevaluate(args)
-        }.reject { |obj|
-            obj.nil?
-        }
+    def evaluate(*options)
+        raise Puppet::DevError, "Did not override #evaluate in %s" % self.class
     end
 
     # Throw a parse error.
@@ -75,11 +47,11 @@ class Puppet::Parser::AST
     # correctly handles errors.  It is critical to use this method because
     # it can enable you to catch the error where it happens, rather than
     # much higher up the stack.
-    def safeevaluate(options)
+    def safeevaluate(*options)
         # We duplicate code here, rather than using exceptwrap, because this
         # is called so many times during parsing.
         begin
-            return self.evaluate(options)
+            return self.evaluate(*options)
         rescue Puppet::Error => detail
             raise adderrorcontext(detail)
         rescue => detail
@@ -90,14 +62,6 @@ class Puppet::Parser::AST
         end
     end
 
-    # Again, just used for printing out the parse tree.
-    def typewrap(string)
-        #return self.class.to_s.sub(/.+::/,'') +
-            #"(" + @@green + string.to_s + @@reset + ")"
-        return @@green + string.to_s + @@reset +
-            "(" + self.class.to_s.sub(/.+::/,'') + ")"
-    end
-
     # Initialize the object.  Requires a hash as the argument, and
     # takes each of the parameters of the hash and calls the settor
     # method for them.  This is probably pretty inefficient and should
@@ -107,13 +71,27 @@ class Puppet::Parser::AST
         @line = nil
         set_options(args)
     end
-    #---------------------------------------------------------------
-    # Now autoload everything.
-    @autoloader = Puppet::Util::Autoload.new(self,
-        "puppet/parser/ast"
-    )
-    @autoloader.loadall
 end
 
+# And include all of the AST subclasses.
+require 'puppet/parser/ast/astarray'
+require 'puppet/parser/ast/branch'
+require 'puppet/parser/ast/caseopt'
+require 'puppet/parser/ast/casestatement'
+require 'puppet/parser/ast/collection'
+require 'puppet/parser/ast/collexpr'
+require 'puppet/parser/ast/definition'
+require 'puppet/parser/ast/else'
+require 'puppet/parser/ast/function'
+require 'puppet/parser/ast/hostclass'
+require 'puppet/parser/ast/ifstatement'
 require 'puppet/parser/ast/leaf'
-
+require 'puppet/parser/ast/node'
+require 'puppet/parser/ast/resource'
+require 'puppet/parser/ast/resource_defaults'
+require 'puppet/parser/ast/resource_override'
+require 'puppet/parser/ast/resource_reference'
+require 'puppet/parser/ast/resourceparam'
+require 'puppet/parser/ast/selector'
+require 'puppet/parser/ast/tag'
+require 'puppet/parser/ast/vardef'
diff --git a/lib/puppet/parser/ast/astarray.rb b/lib/puppet/parser/ast/astarray.rb
index 5f1e838..8f09aa9 100644
--- a/lib/puppet/parser/ast/astarray.rb
+++ b/lib/puppet/parser/ast/astarray.rb
@@ -15,18 +15,7 @@ class Puppet::Parser::AST
         end
 
         # Evaluate our children.
-        def evaluate(hash)
-            scope = hash[:scope]
-            rets = nil
-            # We basically always operate declaratively, and when we
-            # do we need to evaluate the settor-like statements first.  This
-            # is basically variable and type-default declarations.
-            # This is such a stupid hack.  I've no real idea how to make a
-            # "real" declarative language, so I hack it so it looks like
-            # one, yay.
-            settors = []
-            others = []
-
+        def evaluate(scope)
             # Make a new array, so we don't have to deal with the details of
             # flattening and such
             items = []
@@ -35,23 +24,15 @@ class Puppet::Parser::AST
             @children.each { |child|
                 if child.instance_of?(AST::ASTArray)
                     child.each do |ac|
-                        if ac.class.settor?
-                            settors << ac
-                        else
-                            others << ac
-                        end
+                        items << ac
                     end
                 else
-                    if child.class.settor?
-                        settors << child
-                    else
-                        others << child
-                    end
+                    items << child
                 end
             }
 
-            rets = [settors, others].flatten.collect { |child|
-                child.safeevaluate(:scope => scope)
+            rets = items.flatten.collect { |child|
+                child.safeevaluate(scope)
             }
             return rets.reject { |o| o.nil? }
         end
diff --git a/lib/puppet/parser/ast/caseopt.rb b/lib/puppet/parser/ast/caseopt.rb
index d1d9d0e..824bde8 100644
--- a/lib/puppet/parser/ast/caseopt.rb
+++ b/lib/puppet/parser/ast/caseopt.rb
@@ -44,17 +44,17 @@ class Puppet::Parser::AST
         def eachvalue(scope)
             if @value.is_a?(AST::ASTArray)
                 @value.each { |subval|
-                    yield subval.evaluate(:scope => scope)
+                    yield subval.safeevaluate(scope)
                 }
             else
-                yield @value.evaluate(:scope => scope)
+                yield @value.safeevaluate(scope)
             end
         end
 
         # Evaluate the actual statements; this only gets called if
         # our option matched.
-        def evaluate(hash)
-            return @statements.safeevaluate(hash)
+        def evaluate(scope)
+            return @statements.safeevaluate(scope)
         end
     end
 end
diff --git a/lib/puppet/parser/ast/casestatement.rb b/lib/puppet/parser/ast/casestatement.rb
index 3c6f9c7..aa03090 100644
--- a/lib/puppet/parser/ast/casestatement.rb
+++ b/lib/puppet/parser/ast/casestatement.rb
@@ -8,9 +8,8 @@ class Puppet::Parser::AST
 
         # Short-curcuit evaluation.  Return the value of the statements for
         # the first option that matches.
-        def evaluate(hash)
-            scope = hash[:scope]
-            value = @test.safeevaluate(:scope => scope)
+        def evaluate(scope)
+            value = @test.safeevaluate(scope)
             sensitive = Puppet[:casesensitive]
             value = value.downcase if ! sensitive and value.respond_to?(:downcase)
 
@@ -30,7 +29,7 @@ class Puppet::Parser::AST
 
                 if found
                     # we found a matching option
-                    retvalue = option.safeevaluate(:scope => scope)
+                    retvalue = option.safeevaluate(scope)
                     break
                 end
 
@@ -42,7 +41,7 @@ class Puppet::Parser::AST
             # Unless we found something, look for the default.
             unless found
                 if default
-                    retvalue = default.safeevaluate(:scope => scope)
+                    retvalue = default.safeevaluate(scope)
                 else
                     Puppet.debug "No true answers and no default"
                     retvalue = nil
diff --git a/lib/puppet/parser/ast/collection.rb b/lib/puppet/parser/ast/collection.rb
index e05977a..9e795a3 100644
--- a/lib/puppet/parser/ast/collection.rb
+++ b/lib/puppet/parser/ast/collection.rb
@@ -9,18 +9,16 @@ class Collection < AST::Branch
     attr_accessor :type, :query, :form
 
     # We return an object that does a late-binding evaluation.
-    def evaluate(hash)
-        scope = hash[:scope]
-
+    def evaluate(scope)
         if self.query
-            str, code = self.query.safeevaluate :scope => scope
+            str, code = self.query.safeevaluate scope
         else
             str = code = nil
         end
 
         newcoll = Puppet::Parser::Collector.new(scope, @type, str, code, self.form)
 
-        scope.compile.add_collection(newcoll)
+        scope.compiler.add_collection(newcoll)
 
         newcoll
     end
diff --git a/lib/puppet/parser/ast/collexpr.rb b/lib/puppet/parser/ast/collexpr.rb
index 4a96d9c..3e13d94 100644
--- a/lib/puppet/parser/ast/collexpr.rb
+++ b/lib/puppet/parser/ast/collexpr.rb
@@ -9,9 +9,7 @@ class CollExpr < AST::Branch
     attr_accessor :test1, :test2, :oper, :form, :type, :parens
 
     # We return an object that does a late-binding evaluation.
-    def evaluate(hash)
-        scope = hash[:scope]
-
+    def evaluate(scope)
         # Make sure our contained expressions have all the info they need.
         [@test1, @test2].each do |t|
             if t.is_a?(self.class)
@@ -21,8 +19,8 @@ class CollExpr < AST::Branch
         end
 
         # The code is only used for virtual lookups
-        str1, code1 = @test1.safeevaluate :scope => scope
-        str2, code2 = @test2.safeevaluate :scope => scope
+        str1, code1 = @test1.safeevaluate scope
+        str2, code2 = @test2.safeevaluate scope
 
         # First build up the virtual code.
         # If we're a conjunction operator, then we're calling code.  I did
diff --git a/lib/puppet/parser/ast/definition.rb b/lib/puppet/parser/ast/definition.rb
index 3d6d618..0c65c70 100644
--- a/lib/puppet/parser/ast/definition.rb
+++ b/lib/puppet/parser/ast/definition.rb
@@ -1,155 +1,145 @@
 require 'puppet/parser/ast/branch'
 
-class Puppet::Parser::AST
-    # Evaluate the stored parse tree for a given component.  This will
-    # receive the arguments passed to the component and also the type and
-    # name of the component.
-    class Definition < AST::Branch
-        include Puppet::Util
-        include Puppet::Util::Warnings
-        include Puppet::Util::MethodHelper
-        class << self
-            attr_accessor :name
-        end
+require 'puppet/util/warnings'
 
-        # The class name
-        @name = :definition
+# The AST class for defined types, which is also the base class
+# nodes and classes.
+class Puppet::Parser::AST::Definition < Puppet::Parser::AST::Branch
+    include Puppet::Util::Warnings
+    class << self
+        attr_accessor :name
+    end
 
-        attr_accessor :classname, :arguments, :code, :scope, :keyword
-        attr_accessor :exported, :namespace, :parser, :virtual
+    # The class name
+    @name = :definition
 
-        # These are retrieved when looking up the superclass
-        attr_accessor :name
+    attr_accessor :classname, :arguments, :code, :scope, :keyword
+    attr_accessor :exported, :namespace, :parser, :virtual, :name
 
-        attr_reader :parentclass
+    attr_reader :parentclass
 
-        def child_of?(klass)
-            false
-        end
+    def child_of?(klass)
+        false
+    end
 
-        def evaluate(options)
-            origscope = options[:scope]
-            resource = options[:resource]
+    # Create a resource that knows how to evaluate our actual code.
+    def evaluate(scope)
+        resource = Puppet::Parser::Resource.new(:type => self.class.name, :title => self.classname, :scope => scope, :source => scope.source)
 
-            # Create a new scope.
-            scope = subscope(origscope, resource)
+        scope.catalog.tag(*resource.tags)
 
-            # Additionally, add a tag for whatever kind of class
-            # we are
-            if @classname != "" and ! @classname.nil?
-                @classname.split(/::/).each { |tag| scope.resource.tag(tag) }
-            end
+        scope.compiler.add_resource(scope, resource)
 
-            [resource.name, resource.title].each do |str|
-                unless str.nil? or str =~ /[^\w]/ or str == ""
-                    scope.resource.tag(str)
-                end
-            end
+        return resource
+    end
 
-            set_resource_parameters(scope, resource)
+    # Now evaluate the code associated with this class or definition.
+    def evaluate_code(resource)
+        # Create a new scope.
+        scope = subscope(resource.scope, resource)
 
-            if self.code
-                return self.code.safeevaluate(:scope => scope)
-            else
-                return nil
-            end
+        set_resource_parameters(scope, resource)
+
+        if self.code
+            return self.code.safeevaluate(scope)
+        else
+            return nil
         end
+    end
 
-        def initialize(hash = {})
-            @arguments = nil
-            @parentclass = nil
-            super
+    def initialize(hash = {})
+        @arguments = nil
+        @parentclass = nil
+        super
 
-            # Convert the arguments to a hash for ease of later use.
-            if @arguments
-                unless @arguments.is_a? Array
-                    @arguments = [@arguments]
-                end
-                oldargs = @arguments
-                @arguments = {}
-                oldargs.each do |arg, val|
-                    @arguments[arg] = val
-                end
-            else
-                @arguments = {}
+        # Convert the arguments to a hash for ease of later use.
+        if @arguments
+            unless @arguments.is_a? Array
+                @arguments = [@arguments]
             end
-
-            # Deal with metaparams in the argument list.
-            @arguments.each do |arg, defvalue|
-                next unless Puppet::Type.metaparamclass(arg)
-                if defvalue
-                    warnonce "%s is a metaparam; this value will inherit to all contained resources" % arg
-                else
-                    raise Puppet::ParseError, "%s is a metaparameter; please choose another parameter name in the %s definition" % [arg, self.classname]
-                end
+            oldargs = @arguments
+            @arguments = {}
+            oldargs.each do |arg, val|
+                @arguments[arg] = val
             end
+        else
+            @arguments = {}
         end
 
-        def find_parentclass
-            @parser.findclass(namespace, parentclass)
+        # Deal with metaparams in the argument list.
+        @arguments.each do |arg, defvalue|
+            next unless Puppet::Type.metaparamclass(arg)
+            if defvalue
+                warnonce "%s is a metaparam; this value will inherit to all contained resources" % arg
+            else
+                raise Puppet::ParseError, "%s is a metaparameter; please choose another parameter name in the %s definition" % [arg, self.classname]
+            end
         end
+    end
 
-        # Set our parent class, with a little check to avoid some potential
-        # weirdness.
-        def parentclass=(name)
-            if name == self.classname
-                parsefail "Parent classes must have dissimilar names"
-            end
+    def find_parentclass
+        @parser.findclass(namespace, parentclass)
+    end
 
-            @parentclass = name
+    # Set our parent class, with a little check to avoid some potential
+    # weirdness.
+    def parentclass=(name)
+        if name == self.classname
+            parsefail "Parent classes must have dissimilar names"
         end
 
-        # Hunt down our class object.
-        def parentobj
-            if @parentclass
-                # Cache our result, since it should never change.
-                unless defined?(@parentobj)
-                    unless tmp = find_parentclass
-                        parsefail "Could not find %s %s" % [self.class.name, @parentclass]
-                    end
+        @parentclass = name
+    end
 
-                    if tmp == self
-                        parsefail "Parent classes must have dissimilar names"
-                    end
+    # Hunt down our class object.
+    def parentobj
+        return nil unless @parentclass
 
-                    @parentobj = tmp
-                end
-                @parentobj
-            else
-                nil
+        # Cache our result, since it should never change.
+        unless defined?(@parentobj)
+            unless tmp = find_parentclass
+                parsefail "Could not find %s parent %s" % [self.class.name, @parentclass]
             end
+
+            if tmp == self
+                parsefail "Parent classes must have dissimilar names"
+            end
+
+            @parentobj = tmp
         end
+        @parentobj
+    end
 
-        # Create a new subscope in which to evaluate our code.
-        def subscope(scope, resource)
-            args = {
-                :resource => resource,
-                :keyword => self.keyword,
-                :namespace => self.namespace,
-                :source => self
-            }
+    # Create a new subscope in which to evaluate our code.
+    def subscope(scope, resource)
+        args = {
+            :resource => resource,
+            :keyword => self.keyword,
+            :namespace => self.namespace,
+            :source => self
+        }
 
-            oldscope = scope
-            scope = scope.newscope(args)
-            scope.source = self
+        oldscope = scope
+        scope = scope.newscope(args)
+        scope.source = self
 
-            return scope
-        end
+        return scope
+    end
 
-        def to_s
-            classname
-        end
+    def to_s
+        classname
+    end
 
-        # Check whether a given argument is valid.  Searches up through
-        # any parent classes that might exist.
-        def validattr?(param)
-            param = param.to_s
+    # Check whether a given argument is valid.  Searches up through
+    # any parent classes that might exist.
+    def validattr?(param)
+        param = param.to_s
 
-            if @arguments.include?(param)
-                # It's a valid arg for us
-                return true
-            elsif param == "name"
-                return true
+        if @arguments.include?(param)
+            # It's a valid arg for us
+            return true
+        elsif param == "name"
+            return true
 #            elsif defined? @parentclass and @parentclass
 #                # Else, check any existing parent
 #                if parent = @scope.lookuptype(@parentclass) and parent != []
@@ -160,53 +150,52 @@ class Puppet::Parser::AST
 #                    raise Puppet::Error, "Could not find parent class %s" %
 #                        @parentclass
 #                end
-            elsif Puppet::Type.metaparam?(param)
-                return true
-            else
-                # Or just return false
-                return false
-            end
+        elsif Puppet::Type.metaparam?(param)
+            return true
+        else
+            # Or just return false
+            return false
         end
+    end
 
-        private
-
-        # Set any arguments passed by the resource as variables in the scope.
-        def set_resource_parameters(scope, resource)
-            args = symbolize_options(resource.to_hash || {})
-
-            # Verify that all required arguments are either present or
-            # have been provided with defaults.
-            if self.arguments
-                self.arguments.each { |arg, default|
-                    arg = symbolize(arg)
-                    unless args.include?(arg)
-                        if defined? default and ! default.nil?
-                            default = default.safeevaluate :scope => scope
-                            args[arg] = default
-                            #Puppet.debug "Got default %s for %s in %s" %
-                            #    [default.inspect, arg.inspect, @name.inspect]
-                        else
-                            parsefail "Must pass %s to %s of type %s" %
-                                    [arg, resource.title, @classname]
-                        end
+    private
+
+    # Set any arguments passed by the resource as variables in the scope.
+    def set_resource_parameters(scope, resource)
+        args = symbolize_options(resource.to_hash || {})
+
+        # Verify that all required arguments are either present or
+        # have been provided with defaults.
+        if self.arguments
+            self.arguments.each { |arg, default|
+                arg = arg.to_sym
+                unless args.include?(arg)
+                    if defined? default and ! default.nil?
+                        default = default.safeevaluate scope
+                        args[arg] = default
+                        #Puppet.debug "Got default %s for %s in %s" %
+                        #    [default.inspect, arg.inspect, @name.inspect]
+                    else
+                        parsefail "Must pass %s to %s of type %s" %
+                                [arg, resource.title, @classname]
                     end
-                }
-            end
-
-            # Set each of the provided arguments as variables in the
-            # definition's scope.
-            args.each { |arg,value|
-                unless validattr?(arg)
-                    parsefail "%s does not accept attribute %s" % [@classname, arg]
-                end
-
-                exceptwrap do
-                    scope.setvar(arg.to_s, args[arg])
                 end
             }
-
-            scope.setvar("title", resource.title) unless args.include? :title
-            scope.setvar("name", resource.name) unless args.include? :name
         end
+
+        # Set each of the provided arguments as variables in the
+        # definition's scope.
+        args.each { |arg,value|
+            unless validattr?(arg)
+                parsefail "%s does not accept attribute %s" % [@classname, arg]
+            end
+
+            exceptwrap do
+                scope.setvar(arg.to_s, args[arg])
+            end
+        }
+
+        scope.setvar("title", resource.title) unless args.include? :title
+        scope.setvar("name", resource.name) unless args.include? :name
     end
 end
diff --git a/lib/puppet/parser/ast/else.rb b/lib/puppet/parser/ast/else.rb
index e760513..affac62 100644
--- a/lib/puppet/parser/ast/else.rb
+++ b/lib/puppet/parser/ast/else.rb
@@ -12,9 +12,8 @@ class Puppet::Parser::AST
 
         # Evaluate the actual statements; this only gets called if
         # our test was true matched.
-        def evaluate(hash)
-            scope = hash[:scope]
-            return @statements.safeevaluate(:scope => scope)
+        def evaluate(scope)
+            return @statements.safeevaluate(scope)
         end
     end
 end
diff --git a/lib/puppet/parser/ast/function.rb b/lib/puppet/parser/ast/function.rb
index 0cd1fff..63d7c7a 100644
--- a/lib/puppet/parser/ast/function.rb
+++ b/lib/puppet/parser/ast/function.rb
@@ -7,18 +7,11 @@ class Puppet::Parser::AST
 
         @settor = true
 
-        def evaluate(hash)
+        def evaluate(scope)
             # We don't need to evaluate the name, because it's plaintext
+            args = @arguments.safeevaluate(scope)
 
-            # Just evaluate the arguments
-            scope = hash[:scope]
-
-            args = @arguments.safeevaluate(:scope => scope)
-
-            #exceptwrap :message => "Failed to execute %s" % @name,
-            #        :type => Puppet::ParseError do
-                return scope.send("function_" + @name, args)
-            #end
+            return scope.send("function_" + @name, args)
         end
 
         def initialize(hash)
diff --git a/lib/puppet/parser/ast/hostclass.rb b/lib/puppet/parser/ast/hostclass.rb
index 63900d0..7f89f81 100644
--- a/lib/puppet/parser/ast/hostclass.rb
+++ b/lib/puppet/parser/ast/hostclass.rb
@@ -1,80 +1,87 @@
 require 'puppet/parser/ast/definition'
 
-class Puppet::Parser::AST
-    # The code associated with a class.  This is different from definitions
-    # in that each class is a singleton -- only one will exist for a given
-    # node.
-    class HostClass < AST::Definition
-        @name = :class
+# The code associated with a class.  This is different from definitions
+# in that each class is a singleton -- only one will exist for a given
+# node.
+class Puppet::Parser::AST::HostClass < Puppet::Parser::AST::Definition
+    @name = :class
 
-        # Are we a child of the passed class?  Do a recursive search up our
-        # parentage tree to figure it out.
-        def child_of?(klass)
-            return false unless self.parentclass
+    # Are we a child of the passed class?  Do a recursive search up our
+    # parentage tree to figure it out.
+    def child_of?(klass)
+        return false unless self.parentclass
 
-            if klass == self.parentobj
-                return true
-            else
-                return self.parentobj.child_of?(klass)
-            end
+        if klass == self.parentobj
+            return true
+        else
+            return self.parentobj.child_of?(klass)
         end
+    end
 
-        # Evaluate the code associated with this class.
-        def evaluate(options)
-            scope = options[:scope]
-            raise(ArgumentError, "Classes require resources") unless options[:resource]
-            # Verify that we haven't already been evaluated.  This is
-            # what provides the singleton aspect.
-            if existing_scope = scope.compile.class_scope(self)
-                Puppet.debug "Class '%s' already evaluated; not evaluating again" % (classname == "" ? "main" : classname)
-                return nil
-            end
+    # Make sure our parent class has been evaluated, if we have one.
+    def evaluate(scope)
+        if parentclass and ! scope.catalog.resource(self.class.name, parentclass)
+            parent_resource = parentobj.evaluate(scope)
+        end
 
-            scope.compile.catalog.tag(self.classname)
+        # Do nothing if the resource already exists; this makes sure we don't
+        # get multiple copies of the class resource, which helps provide the
+        # singleton nature of classes.
+        if resource = scope.catalog.resource(self.class.name, self.classname)
+            return resource
+        end
 
-            pnames = nil
-            if pklass = self.parentobj
-                pklass.safeevaluate :scope => scope, :resource => options[:resource]
+        super
+    end
 
-                scope = parent_scope(scope, pklass)
-                pnames = scope.namespaces
-            end
+    # Evaluate the code associated with this class.
+    def evaluate_code(resource)
+        scope = resource.scope
+        # Verify that we haven't already been evaluated.  This is
+        # what provides the singleton aspect.
+        if existing_scope = scope.compiler.class_scope(self)
+            Puppet.debug "Class '%s' already evaluated; not evaluating again" % (classname == "" ? "main" : classname)
+            return nil
+        end
 
-            # Don't create a subscope for the top-level class, since it already
-            # has its own scope.
-            unless options[:resource].title == :main
-                scope = subscope(scope, options[:resource])
-            end
+        pnames = nil
+        if pklass = self.parentobj
+            parent_resource = resource.scope.compiler.catalog.resource(self.class.name, pklass.classname)
+            # This shouldn't evaluate if the class has already been evaluated.
+            pklass.evaluate_code(parent_resource)
 
-            if pnames
-                pnames.each do |ns|
-                    scope.add_namespace(ns)
-                end
-            end
+            scope = parent_scope(scope, pklass)
+            pnames = scope.namespaces
+        end
 
-            # Set the class before we do anything else, so that it's set
-            # during the evaluation and can be inspected.
-            scope.compile.class_set(self.classname, scope)
+        # Don't create a subscope for the top-level class, since it already
+        # has its own scope.
+        scope = subscope(scope, resource) unless resource.title == :main
 
-            # Now evaluate our code, yo.
-            if self.code
-                return self.code.evaluate(:scope => scope)
-            else
-                return nil
+        # Add the parent scope namespaces to our own.
+        if pnames
+            pnames.each do |ns|
+                scope.add_namespace(ns)
             end
         end
 
-        def initialize(options)
-            @parentclass = nil
-            super
+        # Set the class before we evaluate the code, so that it's set during
+        # the evaluation and can be inspected.
+        scope.compiler.class_set(self.classname, scope)
+
+        # Now evaluate our code, yo.
+        if self.code
+            return self.code.safeevaluate(scope)
+        else
+            return nil
         end
+    end
 
-        def parent_scope(scope, klass)
-            if s = scope.compile.class_scope(klass)
-                return s
-            else
-                raise Puppet::DevError, "Could not find scope for %s" % klass.classname
-            end
+    def parent_scope(scope, klass)
+        if s = scope.compiler.class_scope(klass)
+            return s
+        else
+            raise Puppet::DevError, "Could not find scope for %s" % klass.classname
         end
     end
 end
diff --git a/lib/puppet/parser/ast/ifstatement.rb b/lib/puppet/parser/ast/ifstatement.rb
index 66a07b0..afa2cd5 100644
--- a/lib/puppet/parser/ast/ifstatement.rb
+++ b/lib/puppet/parser/ast/ifstatement.rb
@@ -12,15 +12,14 @@ class Puppet::Parser::AST
         # Short-curcuit evaluation.  If we're true, evaluate our statements,
         # else if there's an 'else' setting, evaluate it.
         # the first option that matches.
-        def evaluate(hash)
-            scope = hash[:scope]
-            value = @test.safeevaluate(:scope => scope)
+        def evaluate(scope)
+            value = @test.safeevaluate(scope)
 
             if Puppet::Parser::Scope.true?(value)
-                return @statements.safeevaluate(:scope => scope)
+                return @statements.safeevaluate(scope)
             else
                 if defined? @else
-                    return @else.safeevaluate(:scope => scope)
+                    return @else.safeevaluate(scope)
                 else
                     return nil
                 end
diff --git a/lib/puppet/parser/ast/leaf.rb b/lib/puppet/parser/ast/leaf.rb
index 2252530..c545c1e 100644
--- a/lib/puppet/parser/ast/leaf.rb
+++ b/lib/puppet/parser/ast/leaf.rb
@@ -6,7 +6,7 @@ class Puppet::Parser::AST
         attr_accessor :value, :type
 
         # Return our value.
-        def evaluate(hash)
+        def evaluate(scope)
             return @value
         end
 
@@ -35,14 +35,14 @@ class Puppet::Parser::AST
     class String < AST::Leaf
         # Interpolate the string looking for variables, and then return
         # the result.
-        def evaluate(hash)
-            return hash[:scope].strinterp(@value, @file, @line)
+        def evaluate(scope)
+            return scope.strinterp(@value, @file, @line)
         end
     end
 
     # An uninterpreted string.
     class FlatString < AST::Leaf
-        def evaluate(hash)
+        def evaluate(scope)
             return @value
         end
     end
@@ -81,9 +81,9 @@ class Puppet::Parser::AST
     class Variable < Name
         # Looks up the value of the object in the scope tree (does
         # not include syntactical constructs, like '$' and '{}').
-        def evaluate(hash)
+        def evaluate(scope)
             parsewrap do
-                return hash[:scope].lookupvar(@value)
+                return scope.lookupvar(@value)
             end
         end
     end
diff --git a/lib/puppet/parser/ast/node.rb b/lib/puppet/parser/ast/node.rb
index a296e43..2bf6c18 100644
--- a/lib/puppet/parser/ast/node.rb
+++ b/lib/puppet/parser/ast/node.rb
@@ -1,67 +1,35 @@
 require 'puppet/parser/ast/hostclass'
 
-class Puppet::Parser::AST
-    # The specific code associated with a host.  Nodes are annoyingly unlike
-    # other objects.  That's just the way it is, at least for now.
-    class Node < AST::HostClass
-        @name = :node
-        attr_accessor :name
-
-        def evaluate(options)
-            scope = options[:scope]
-
-            #pscope = if ! Puppet[:lexical] or options[:asparent]
-            #    @scope
-            #else
-            #    origscope
-            #end
-
-            # We don't have to worry about the declarativeness of node parentage,
-            # because the entry point is always a single node definition.
-            if parent = self.parentobj
-                scope = parent.safeevaluate :scope => scope, :resource => options[:resource]
-            end
-
-            scope = scope.newscope(
-                :resource => options[:resource],
-                :keyword => @keyword,
-                :source => self,
-                :namespace => "" # nodes are always in ""
-            )
-
-            # Mark our node name as a class, too, but strip it of the domain
-            # name.  Make the mark before we evaluate the code, so that it is
-            # marked within the code itself.
-            scope.compile.class_set(self.classname, scope)
-
-            # And then evaluate our code if we have any
-            if self.code
-                @code.safeevaluate(:scope => scope)
-            end
-
-            return scope
+# The specific code associated with a host.  Nodes are annoyingly unlike
+# other objects.  That's just the way it is, at least for now.
+class Puppet::Parser::AST::Node < Puppet::Parser::AST::HostClass
+    @name = :node
+
+    def initialize(options)
+        @parentclass = nil
+        super
+
+        # Do some validation on the node name
+        if @name =~ /[^-\w.]/
+            raise Puppet::ParseError, "Invalid node name %s" % @name
         end
+    end
 
-        def initialize(options)
-            @parentclass = nil
-            super
+    def namespace
+        ""
+    end
 
-            # Do some validation on the node name
-            if @name =~ /[^-\w.]/
-                raise Puppet::ParseError, "Invalid node name %s" % @name
-            end
-        end
+    # Make sure node scopes are marked as such.
+    def subscope(*args)
+        scope = super
+        scope.nodescope = true
+        scope
+    end
 
-        # Make sure node scopes are marked as such.
-        def subscope(*args)
-            scope = super
-            scope.nodescope = true
-        end
+    private
 
-        private
-        # Search for the object matching our parent class.
-        def find_parentclass
-            @parser.findnode(parentclass)
-        end
+    # Search for the object matching our parent class.
+    def find_parentclass
+        @parser.findnode(parentclass)
     end
 end
diff --git a/lib/puppet/parser/ast/resource.rb b/lib/puppet/parser/ast/resource.rb
index c53ab0a..8a60522 100644
--- a/lib/puppet/parser/ast/resource.rb
+++ b/lib/puppet/parser/ast/resource.rb
@@ -9,15 +9,13 @@ class Resource < AST::ResourceReference
 
     # Does not actually return an object; instead sets an object
     # in the current scope.
-    def evaluate(options)
-        scope = options[:scope]
-
+    def evaluate(scope)
         # Evaluate all of the specified params.
         paramobjects = @params.collect { |param|
-            param.safeevaluate(:scope => scope)
+            param.safeevaluate(scope)
         }
 
-        objtitles = @title.safeevaluate(:scope => scope)
+        objtitles = @title.safeevaluate(scope)
 
         # it's easier to always use an array, even for only one name
         unless objtitles.is_a?(Array)
@@ -50,10 +48,10 @@ class Resource < AST::ResourceReference
                     :scope => scope
                 )
 
-                # And then store the resource in the compile.
+                # And then store the resource in the compiler.
                 # At some point, we need to switch all of this to return
                 # objects instead of storing them like this.
-                scope.compile.store_resource(scope, obj)
+                scope.compiler.add_resource(scope, obj)
                 obj
             end
         }.reject { |obj| obj.nil? }
diff --git a/lib/puppet/parser/ast/resource_defaults.rb b/lib/puppet/parser/ast/resource_defaults.rb
index 8f9c1b8..4856f05 100644
--- a/lib/puppet/parser/ast/resource_defaults.rb
+++ b/lib/puppet/parser/ast/resource_defaults.rb
@@ -8,13 +8,11 @@ class Puppet::Parser::AST
 
         # As opposed to ResourceDef, this stores each default for the given
         # object type.
-        def evaluate(hash)
-            scope = hash[:scope]
-
+        def evaluate(scope)
             # Use a resource reference to canonize the type
             ref = Puppet::ResourceReference.new(@type, "whatever")
             type = ref.type
-            params = @params.safeevaluate(:scope => scope)
+            params = @params.safeevaluate(scope)
 
             parsewrap do
                 scope.setdefaults(type, params)
diff --git a/lib/puppet/parser/ast/resource_override.rb b/lib/puppet/parser/ast/resource_override.rb
index 46c9309..f9464ac 100644
--- a/lib/puppet/parser/ast/resource_override.rb
+++ b/lib/puppet/parser/ast/resource_override.rb
@@ -17,17 +17,15 @@ class Puppet::Parser::AST
 
         # Does not actually return an object; instead sets an object
         # in the current scope.
-        def evaluate(hash)
-            scope = hash[:scope]
-
+        def evaluate(scope)
             # Get our object reference.
-            object = @object.safeevaluate(:scope => scope)
+            object = @object.safeevaluate(scope)
 
             hash = {}
 
             # Evaluate all of the specified params.
             params = @params.collect { |param|
-                param.safeevaluate(:scope => scope)
+                param.safeevaluate(scope)
             }
 
             # Now we just create a normal resource, but we call a very different
@@ -44,7 +42,7 @@ class Puppet::Parser::AST
 
             # Now we tell the scope that it's an override, and it behaves as
             # necessary.
-            scope.compile.store_override(obj)
+            scope.compiler.add_override(obj)
 
             obj
         end
diff --git a/lib/puppet/parser/ast/resource_reference.rb b/lib/puppet/parser/ast/resource_reference.rb
index b06ea17..4bb4116 100644
--- a/lib/puppet/parser/ast/resource_reference.rb
+++ b/lib/puppet/parser/ast/resource_reference.rb
@@ -22,10 +22,8 @@ class Puppet::Parser::AST
 
         # Evaluate our object, but just return a simple array of the type
         # and name.
-        def evaluate(hash)
-            scope = hash[:scope]
-
-            title = @title.safeevaluate(:scope => scope)
+        def evaluate(scope)
+            title = @title.safeevaluate(scope)
             if @type.to_s.downcase == "class"
                 objtype = "class"
                 title = qualified_class(scope, title)
diff --git a/lib/puppet/parser/ast/resourceparam.rb b/lib/puppet/parser/ast/resourceparam.rb
index 8b1e7b3..c552a7e 100644
--- a/lib/puppet/parser/ast/resourceparam.rb
+++ b/lib/puppet/parser/ast/resourceparam.rb
@@ -10,12 +10,10 @@ class Puppet::Parser::AST
         end
 
         # Return the parameter and the value.
-        def evaluate(hash)
-            scope = hash[:scope]
-
+        def evaluate(scope)
             return Puppet::Parser::Resource::Param.new(
                 :name => @param,
-                :value => @value.safeevaluate(:scope => scope),
+                :value => @value.safeevaluate(scope),
                 :source => scope.source, :line => self.line, :file => self.file,
                 :add => self.add
             )
diff --git a/lib/puppet/parser/ast/selector.rb b/lib/puppet/parser/ast/selector.rb
index d363ab7..399d405 100644
--- a/lib/puppet/parser/ast/selector.rb
+++ b/lib/puppet/parser/ast/selector.rb
@@ -11,13 +11,12 @@ class Puppet::Parser::AST
         end
 
         # Find the value that corresponds with the test.
-        def evaluate(hash)
-            scope = hash[:scope]
+        def evaluate(scope)
             retvalue = nil
             found = nil
 
             # Get our parameter.
-            paramvalue = @param.safeevaluate(:scope => scope)
+            paramvalue = @param.safeevaluate(scope)
             
             sensitive = Puppet[:casesensitive]
             
@@ -33,13 +32,13 @@ class Puppet::Parser::AST
 
             # Then look for a match in the options.
             @values.each { |obj|
-                param = obj.param.safeevaluate(:scope => scope)
+                param = obj.param.safeevaluate(scope)
                 if ! sensitive && param.respond_to?(:downcase)
                     param = param.downcase
                 end
                 if param == paramvalue
                     # we found a matching option
-                    retvalue = obj.value.safeevaluate(:scope => scope)
+                    retvalue = obj.value.safeevaluate(scope)
                     found = true
                     break
                 elsif obj.param.is_a?(Default)
@@ -51,7 +50,7 @@ class Puppet::Parser::AST
             # Unless we found something, look for the default.
             unless found
                 if default
-                    retvalue = default.value.safeevaluate(:scope => scope)
+                    retvalue = default.value.safeevaluate(scope)
                 else
                     self.fail Puppet::ParseError,
                         "No matching value for selector param '%s'" % paramvalue
diff --git a/lib/puppet/parser/ast/tag.rb b/lib/puppet/parser/ast/tag.rb
index e2882d2..2909504 100644
--- a/lib/puppet/parser/ast/tag.rb
+++ b/lib/puppet/parser/ast/tag.rb
@@ -8,10 +8,8 @@ class Puppet::Parser::AST
         @name = :class
         attr_accessor :type
 
-        def evaluate(hash)
-            scope = hash[:scope]
-
-            types = @type.safeevaluate(:scope => scope)
+        def evaluate(scope)
+            types = @type.safeevaluate(scope)
 
             types = [types] unless types.is_a? Array
 
diff --git a/lib/puppet/parser/ast/vardef.rb b/lib/puppet/parser/ast/vardef.rb
index 1e7f874..ee79159 100644
--- a/lib/puppet/parser/ast/vardef.rb
+++ b/lib/puppet/parser/ast/vardef.rb
@@ -9,10 +9,9 @@ class Puppet::Parser::AST
 
         # Look up our name and value, and store them appropriately.  The
         # lexer strips off the syntax stuff like '$'.
-        def evaluate(hash)
-            scope = hash[:scope]
-            name = @name.safeevaluate(:scope => scope)
-            value = @value.safeevaluate(:scope => scope)
+        def evaluate(scope)
+            name = @name.safeevaluate(scope)
+            value = @value.safeevaluate(scope)
 
             parsewrap do
                 scope.setvar(name,value, @file, @line)
diff --git a/lib/puppet/parser/collector.rb b/lib/puppet/parser/collector.rb
index b8165a8..2699dc6 100644
--- a/lib/puppet/parser/collector.rb
+++ b/lib/puppet/parser/collector.rb
@@ -51,7 +51,7 @@ class Puppet::Parser::Collector
         search = "(exported=? AND restype=?)"
         values = [true, @type]
 
-        search += " AND (?)" and values << @equery if @equery
+        search += " AND (%s)" % @equery if @equery
 
         # We're going to collect objects from rails, but we don't want any
         # objects from this host.
@@ -118,20 +118,20 @@ class Puppet::Parser::Collector
         # If there are no more resources to find, delete this from the list
         # of collections.
         if @resources.empty?
-            @scope.compile.delete_collection(self)
+            @scope.compiler.delete_collection(self)
         end
 
         return result
     end
 
-    # Collect just virtual objects, from our local compile.
+    # Collect just virtual objects, from our local compiler.
     def collect_virtual(exported = false)
         if exported
             method = :exported?
         else
             method = :virtual?
         end
-        scope.compile.resources.find_all do |resource|
+        scope.compiler.resources.find_all do |resource|
             resource.type == @type and resource.send(method) and match?(resource)
         end
     end
@@ -150,7 +150,7 @@ class Puppet::Parser::Collector
 
         resource.exported = false
         
-        scope.compile.store_resource(scope, resource)
+        scope.compiler.add_resource(scope, resource)
 
         return resource
     end
diff --git a/lib/puppet/parser/compile.rb b/lib/puppet/parser/compiler.rb
similarity index 79%
rename from lib/puppet/parser/compile.rb
rename to lib/puppet/parser/compiler.rb
index fdd0cbc..8fba411 100644
--- a/lib/puppet/parser/compile.rb
+++ b/lib/puppet/parser/compiler.rb
@@ -1,17 +1,13 @@
 #  Created by Luke A. Kanies on 2007-08-13.
 #  Copyright (c) 2007. All rights reserved.
 
-require 'puppet/external/gratr/digraph'
-require 'puppet/external/gratr/import'
-require 'puppet/external/gratr/dot'
-
 require 'puppet/node'
 require 'puppet/node/catalog'
 require 'puppet/util/errors'
 
 # Maintain a graph of scopes, along with a bunch of data
 # about the individual catalog we're compiling.
-class Puppet::Parser::Compile
+class Puppet::Parser::Compiler
     include Puppet::Util
     include Puppet::Util::Errors
     attr_reader :parser, :node, :facts, :collections, :catalog, :node_scope
@@ -21,6 +17,29 @@ class Puppet::Parser::Compile
         @collections << coll
     end
 
+    # Store a resource override.
+    def add_override(override)
+        # If possible, merge the override in immediately.
+        if resource = @catalog.resource(override.ref)
+            resource.merge(override)
+        else
+            # Otherwise, store the override for later; these
+            # get evaluated in Resource#finish.
+            @resource_overrides[override.ref] << override
+        end
+    end
+
+    # Store a resource in our resource table.
+    def add_resource(scope, resource)
+        # Note that this will fail if the resource is not unique.
+        @catalog.add_resource(resource)
+
+        # And in the resource graph.  At some point, this might supercede
+        # the global resource table, but the table is a lot faster
+        # so it makes sense to maintain for now.
+        @catalog.add_edge(scope.resource, resource)
+    end
+
     # Do we use nodes found in the code, vs. the external node sources?
     def ast_nodes?
         parser.nodes.length > 0
@@ -30,10 +49,10 @@ class Puppet::Parser::Compile
     # the scope in which it was evaluated, so that we can look it up later.
     def class_set(name, scope)
         if existing = @class_scopes[name]
-            if existing.nodescope? or scope.nodescope?
+            if existing.nodescope? != scope.nodescope?
                 raise Puppet::ParseError, "Cannot have classes, nodes, or definitions with the same name"
             else
-                raise Puppet::DevError, "Somehow evaluated the same class twice"
+                raise Puppet::DevError, "Somehow evaluated %s %s twice" % [ existing.nodescope? ? "node" : "class", name]
             end
         end
         @class_scopes[name] = scope
@@ -58,7 +77,7 @@ class Puppet::Parser::Compile
         return @catalog.classes
     end
 
-    # Compile our catalog.  This mostly revolves around finding and evaluating classes.
+    # Compiler our catalog.  This mostly revolves around finding and evaluating classes.
     # This is the main entry into our catalog.
     def compile
         # Set the client's parameters into the top scope.
@@ -72,10 +91,10 @@ class Puppet::Parser::Compile
 
         evaluate_generators()
 
-        fail_on_unevaluated()
-
         finish()
 
+        fail_on_unevaluated()
+
         if Puppet[:storeconfigs]
             store()
         end
@@ -88,11 +107,6 @@ class Puppet::Parser::Compile
         @collections.delete(coll) if @collections.include?(coll)
     end
 
-    # LAK:FIXME There are no tests for this.
-    def delete_resource(resource)
-        @resource_table.delete(resource.ref) if @resource_table.include?(resource.ref)
-    end
-
     # Return the node's environment.
     def environment
         unless defined? @environment
@@ -122,15 +136,13 @@ class Puppet::Parser::Compile
         classes.each do |name|
             # If we can find the class, then make a resource that will evaluate it.
             if klass = scope.findclass(name)
-                # Create a resource to model this class, and then add it to the list
-                # of resources.
-                resource = Puppet::Parser::Resource.new(:type => "class", :title => klass.classname, :scope => scope, :source => scope.source)
-                store_resource(scope, resource)
+                found << name and next if class_scope(klass)
+
+                resource = klass.evaluate(scope)
 
                 # If they've disabled lazy evaluation (which the :include function does),
                 # then evaluate our resource immediately.
                 resource.evaluate unless lazy_evaluate
-                @catalog.tag(klass.classname)
                 found << name
             else
                 Puppet.info "Could not find class %s for %s" % [name, node.name]
@@ -141,10 +153,8 @@ class Puppet::Parser::Compile
     end
 
     # Return a resource by either its ref or its type and title.
-    def findresource(string, name = nil)
-        string = "%s[%s]" % [string.capitalize, name] if name
-
-        @resource_table[string]
+    def findresource(*args)
+        @catalog.resource(*args)
     end
 
     # Set up our compile.  We require a parser
@@ -159,7 +169,7 @@ class Puppet::Parser::Compile
             begin
                 send(param.to_s + "=", value)
             rescue NoMethodError
-                raise ArgumentError, "Compile objects do not accept %s" % param
+                raise ArgumentError, "Compiler objects do not accept %s" % param
             end
         end
 
@@ -172,10 +182,10 @@ class Puppet::Parser::Compile
     # its parent to the graph.
     def newscope(parent, options = {})
         parent ||= topscope
-        options[:compile] = self
+        options[:compiler] = self
         options[:parser] ||= self.parser
         scope = Puppet::Parser::Scope.new(options)
-        @scope_graph.add_edge!(parent, scope)
+        @scope_graph.add_edge(parent, scope)
         scope
     end
 
@@ -196,35 +206,7 @@ class Puppet::Parser::Compile
 
     # Return a list of all resources.
     def resources
-        @resource_table.values
-    end
-
-    # Store a resource override.
-    def store_override(override)
-        override.override = true
-
-        # If possible, merge the override in immediately.
-        if resource = @resource_table[override.ref]
-            resource.merge(override)
-        else
-            # Otherwise, store the override for later; these
-            # get evaluated in Resource#finish.
-            @resource_overrides[override.ref] << override
-        end
-    end
-
-    # Store a resource in our resource table.
-    def store_resource(scope, resource)
-        # This might throw an exception
-        verify_uniqueness(resource)
-
-        # Store it in the global table.
-        @resource_table[resource.ref] = resource
-
-        # And in the resource graph.  At some point, this might supercede
-        # the global resource table, but the table is a lot faster
-        # so it makes sense to maintain for now.
-        @catalog.add_edge!(scope.resource, resource)
+        @catalog.vertices
     end
 
     # The top scope is usually the top-level scope, but if we're using AST nodes,
@@ -251,9 +233,7 @@ class Puppet::Parser::Compile
 
         # Create a resource to model this node, and then add it to the list
         # of resources.
-        resource = Puppet::Parser::Resource.new(:type => "node", :title => astnode.classname, :scope => topscope, :source => topscope.source)
-        store_resource(topscope, resource)
-        @catalog.tag(astnode.classname)
+        resource = astnode.evaluate(topscope)
 
         resource.evaluate
 
@@ -286,11 +266,15 @@ class Puppet::Parser::Compile
     def evaluate_definitions
         exceptwrap do
             if ary = unevaluated_resources
+                evaluated = false
                 ary.each do |resource|
-                    resource.evaluate
+                    if not resource.virtual?
+                        resource.evaluate
+                        evaluated = true
+                    end
                 end
                 # If we evaluated, let the loop know.
-                return true
+                return evaluated
             else
                 return false
             end
@@ -310,6 +294,9 @@ class Puppet::Parser::Compile
             done = false if evaluate_collections
             done = false if evaluate_definitions
             break if done
+
+            count += 1
+
             if count > 1000
                 raise Puppet::ParseError, "Somehow looped more than 1000 times while evaluating host catalog"
             end
@@ -323,9 +310,7 @@ class Puppet::Parser::Compile
         @main_resource = Puppet::Parser::Resource.new(:type => "class", :title => :main, :scope => @topscope, :source => @main)
         @topscope.resource = @main_resource
 
-        @catalog.add_vertex!(@main_resource)
-
-        @resource_table["Class[main]"] = @main_resource
+        @catalog.add_resource(@main_resource)
 
         @main_resource.evaluate
     end
@@ -381,14 +366,27 @@ class Puppet::Parser::Compile
     # Make sure all of our resources and such have done any last work
     # necessary.
     def finish
-        @resource_table.each { |name, resource| resource.finish if resource.respond_to?(:finish) }
+        @catalog.vertices.each do |resource|
+            # Add in any resource overrides.
+            if overrides = resource_overrides(resource)
+                overrides.each do |over|
+                    resource.merge(over)
+                end
+
+                # Remove the overrides, so that the configuration knows there
+                # are none left.
+                overrides.clear
+            end
+
+            resource.finish if resource.respond_to?(:finish)
+        end
     end
 
     # Initialize the top-level scope, class, and resource.
     def init_main
         # Create our initial scope and a resource that will evaluate main.
-        @topscope = Puppet::Parser::Scope.new(:compile => self, :parser => self.parser)
-        @scope_graph.add_vertex!(@topscope)
+        @topscope = Puppet::Parser::Scope.new(:compiler => self, :parser => self.parser)
+        @scope_graph.add_vertex(@topscope)
     end
 
     # Set up all of our internal variables.
@@ -397,9 +395,6 @@ class Puppet::Parser::Compile
         # be used by top scopes and node scopes.
         @class_scopes = {}
 
-        # The table for all defined resources.
-        @resource_table = {}
-
         # The list of objects that will available for export.
         @exported_resources = {}
 
@@ -413,11 +408,8 @@ class Puppet::Parser::Compile
         # but they each refer back to the scope that created them.
         @collections = []
 
-        # A list of tags we've generated; most class names.
-        @tags = []
-
         # A graph for maintaining scope relationships.
-        @scope_graph = GRATR::Digraph.new
+        @scope_graph = Puppet::SimpleGraph.new
 
         # For maintaining the relationship between scopes and their resources.
         @catalog = Puppet::Node::Catalog.new(@node.name)
@@ -444,7 +436,7 @@ class Puppet::Parser::Compile
 
         # We used to have hooks here for forking and saving, but I don't
         # think it's worth retaining at this point.
-        store_to_active_record(@node, @resource_table.values)
+        store_to_active_record(@node, @catalog.vertices)
     end
 
     # Do the actual storage.
@@ -467,9 +459,7 @@ class Puppet::Parser::Compile
     # Return an array of all of the unevaluated resources.  These will be definitions,
     # which need to get evaluated into native resources.
     def unevaluated_resources
-        ary = @resource_table.find_all do |name, object|
-            ! object.builtin? and ! object.evaluated?
-        end.collect { |name, object| object }
+        ary = @catalog.vertices.reject { |resource| resource.builtin? or resource.evaluated?  }
 
         if ary.empty?
             return nil
@@ -477,33 +467,4 @@ class Puppet::Parser::Compile
             return ary
         end
     end
-
-    # Verify that the given resource isn't defined elsewhere.
-    def verify_uniqueness(resource)
-        # Short-curcuit the common case, 
-        unless existing_resource = @resource_table[resource.ref]
-            return true
-        end
-
-        if typeclass = Puppet::Type.type(resource.type) and ! typeclass.isomorphic?
-            Puppet.info "Allowing duplicate %s" % typeclass.name
-            return true
-        end
-
-        # Either it's a defined type, which are never
-        # isomorphic, or it's a non-isomorphic type, so
-        # we should throw an exception.
-        msg = "Duplicate definition: %s is already defined" % resource.ref
-
-        if existing_resource.file and existing_resource.line
-            msg << " in file %s at line %s" %
-                [existing_resource.file, existing_resource.line]
-        end
-
-        if resource.line or resource.file
-            msg << "; cannot redefine"
-        end
-
-        raise Puppet::ParseError.new(msg)
-    end
 end
diff --git a/lib/puppet/parser/functions.rb b/lib/puppet/parser/functions.rb
index 34b38b8..e0b60e1 100644
--- a/lib/puppet/parser/functions.rb
+++ b/lib/puppet/parser/functions.rb
@@ -111,7 +111,7 @@ module Functions
         vals = [vals] unless vals.is_a?(Array)
 
         # The 'false' disables lazy evaluation.
-        klasses = compile.evaluate_classes(vals, self, false)
+        klasses = compiler.evaluate_classes(vals, self, false)
 
         missing = vals.find_all do |klass|
             ! klasses.include?(klass)
@@ -146,7 +146,7 @@ module Functions
     tells you whether the current container is tagged with the specified tags.
     The tags are ANDed, so that all of the specified tags must be included for
     the function to return true.") do |vals|
-        configtags = compile.catalog.tags
+        configtags = compiler.catalog.tags
         resourcetags = resource.tags
 
         retval = true
@@ -235,7 +235,7 @@ module Functions
         vals = [vals] unless vals.is_a?(Array)
         coll.resources = vals
 
-        compile.add_collection(coll)
+        compiler.add_collection(coll)
     end
 
     newfunction(:search, :doc => "Add another namespace for this class to search.
diff --git a/lib/puppet/parser/grammar.ra b/lib/puppet/parser/grammar.ra
new file mode 100644
index 0000000..484efe8
--- /dev/null
+++ b/lib/puppet/parser/grammar.ra
@@ -0,0 +1,648 @@
+# vim: syntax=ruby
+
+# the parser
+
+class Puppet::Parser::Parser
+
+token LBRACK DQTEXT SQTEXT RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE
+token FALSE EQUALS LESSEQUAL NOTEQUAL DOT COLON LLCOLLECT RRCOLLECT
+token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN
+token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN
+token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSNAME CLASSREF
+token NOT OR AND UNDEF PARROW
+
+rule
+program:    statements {
+    if val[0]
+        # Make sure we always return an array.
+        if val[0].is_a?(AST::ASTArray)
+            if val[0].children.empty?
+                result = nil
+            else
+                result = val[0]
+            end
+        else
+            result = aryfy(val[0])
+        end
+    else
+        result = nil
+    end
+}
+            | nil
+
+statements:   statement
+            | statements statement {
+    if val[0] and val[1]
+        if val[0].instance_of?(AST::ASTArray)
+            val[0].push(val[1])
+            result = val[0]
+        else
+            result = ast AST::ASTArray, :children => [val[0],val[1]]
+        end
+    elsif obj = (val[0] || val[1])
+        result = obj
+    else result = nil
+    end
+}
+
+# The main list of valid statements
+statement:    resource
+            | virtualresource
+            | collection
+            | assignment
+            | casestatement
+            | ifstatement
+            | import
+            | fstatement
+            | definition
+            | hostclass
+            | nodedef
+            | resourceoverride
+
+fstatement:   NAME LPAREN funcvalues RPAREN {
+    args = aryfy(val[2])
+    result = ast AST::Function,
+        :name => val[0],
+        :arguments => args,
+        :ftype => :statement
+}
+            | NAME LPAREN RPAREN {
+    result = ast AST::Function,
+        :name => val[0],
+        :arguments => AST::ASTArray.new({}),
+        :ftype => :statement
+}
+            | NAME funcvalues {
+    args = aryfy(val[1])
+    result = ast AST::Function,
+        :name => val[0],
+        :arguments => args,
+        :ftype => :statement
+}
+
+funcvalues:       namestrings
+                | resourcerefs
+
+namestrings:      namestring
+                | namestrings COMMA namestring {
+    result = aryfy(val[0], val[2])
+    result.line = @lexer.line
+    result.file = @lexer.file
+}
+
+# This is *almost* an rvalue, but I couldn't get a full
+# rvalue to work without scads of shift/reduce conflicts.
+namestring:       name
+                | variable
+                | type
+                | boolean
+                | funcrvalue
+                | selector
+                | quotedtext
+                | CLASSNAME {
+                    result = ast AST::Name, :value => val[0]
+                }
+
+resourcerefs:     resourceref
+                | resourcerefs COMMA resourceref {
+    unless val[0].is_a?(AST::ASTArray)
+        val[0] = aryfy(val[0])
+    end
+
+    val[0].push(val[2])
+
+    result = val[0]
+}
+
+resource:       classname LBRACE resourceinstances endsemi RBRACE {
+    array = val[2]
+    if array.instance_of?(AST::ResourceInstance)
+        array = [array]
+    end
+    result = ast AST::ASTArray
+
+    # this iterates across each specified resourceinstance
+    array.each { |instance|
+        unless instance.instance_of?(AST::ResourceInstance)
+            raise Puppet::Dev, "Got something that isn't an instance"
+        end
+        # now, i need to somehow differentiate between those things with
+        # arrays in their names, and normal things
+        result.push ast(AST::Resource,
+            :type => val[0],
+            :title => instance[0],
+            :params => instance[1])
+    }
+}           | classname LBRACE params endcomma RBRACE {
+    # This is a deprecated syntax.
+    error "All resource specifications require names"
+}           | classref LBRACE params endcomma RBRACE {
+    # a defaults setting for a type
+    result = ast(AST::ResourceDefaults, :type => val[0], :params => val[2])
+}
+
+# Override a value set elsewhere in the configuration.
+resourceoverride:     resourceref LBRACE anyparams endcomma RBRACE {
+    result = ast AST::ResourceOverride, :object => val[0], :params => val[2]
+}
+
+# Exported and virtual resources; these don't get sent to the client
+# unless they get collected elsewhere in the db.
+virtualresource:  at resource {
+    type = val[0]
+
+    if (type == :exported and ! Puppet[:storeconfigs]) and ! Puppet[:parseonly]
+        error "You cannot collect without storeconfigs being set"
+    end
+
+    if val[1].is_a? AST::ResourceDefaults
+        error "Defaults are not virtualizable"
+    end
+
+    method = type.to_s + "="
+
+    # Just mark our resources as exported and pass them through.
+    if val[1].instance_of?(AST::ASTArray)
+        val[1].each do |obj|
+            obj.send(method, true)
+        end
+    else
+        val[1].send(method, true)
+    end
+
+    result = val[1]
+}
+
+at:   AT { result = :virtual }
+    | AT AT { result = :exported }
+
+# A collection statement.  Currently supports no arguments at all, but eventually
+# will, I assume.
+collection:     classref collectrhand {
+    if val[0] =~ /^[a-z]/
+        Puppet.warning addcontext("Collection names must now be capitalized")
+    end
+    type = val[0].downcase
+    args = {:type => type}
+
+    if val[1].is_a?(AST::CollExpr)
+        args[:query] = val[1]
+        args[:query].type = type
+        args[:form] = args[:query].form
+    else
+        args[:form] = val[1]
+    end
+    if args[:form] == :exported and ! Puppet[:storeconfigs] and ! Puppet[:parseonly]
+        error "You cannot collect exported resources without storeconfigs being set"
+    end
+    result = ast AST::Collection, args
+}
+
+
+collectrhand:     LCOLLECT collstatements RCOLLECT {
+    if val[1]
+        result = val[1]
+        result.form = :virtual
+    else
+        result = :virtual
+    end
+}
+                | LLCOLLECT collstatements RRCOLLECT {
+    if val[1]
+        result = val[1]
+        result.form = :exported
+    else
+        result = :exported
+    end
+}
+
+# A mini-language for handling collection comparisons.  This is organized
+# to avoid the need for precedence indications.
+collstatements:           nil
+                        | collstatement
+                        | collstatements colljoin collstatement {
+    result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+}
+
+collstatement:            collexpr
+                        | LPAREN collstatements RPAREN {
+    result = val[1]
+    result.parens = true
+}
+
+colljoin:                 AND | OR
+
+collexpr:                 colllval ISEQUAL simplervalue {
+    result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+    #result = ast AST::CollExpr
+    #result.push *val
+}
+                        | colllval NOTEQUAL simplervalue {
+    result = ast AST::CollExpr, :test1 => val[0], :oper => val[1], :test2 => val[2]
+    #result = ast AST::CollExpr
+    #result.push *val
+}
+
+colllval:                 variable
+                        | name
+
+resourceinst:   resourcename COLON params endcomma {
+    result = ast AST::ResourceInstance, :children => [val[0],val[2]]
+}
+
+resourceinstances:   resourceinst
+                 | resourceinstances SEMIC resourceinst {
+    if val[0].instance_of?(AST::ResourceInstance)
+        result = ast AST::ASTArray, :children => [val[0],val[2]]
+    else
+        val[0].push val[2]
+        result = val[0]
+    end
+}
+
+endsemi:      # nothing
+            | SEMIC
+
+undef:         UNDEF {
+    result = ast AST::Undef, :value => :undef
+}
+
+name:         NAME {
+    result = ast AST::Name, :value => val[0]
+}
+
+type:         CLASSREF {
+    result = ast AST::Type, :value => val[0]
+}
+
+resourcename:   quotedtext
+            | name
+            | type
+            | selector
+            | variable
+            | array
+
+assignment:     VARIABLE EQUALS rvalue {
+    if val[0] =~ /::/
+        raise Puppet::ParseError, "Cannot assign to variables in other namespaces"
+    end
+    # this is distinct from referencing a variable
+    variable = ast AST::Name, :value => val[0]
+    result = ast AST::VarDef, :name => variable, :value => val[2]
+}
+
+params:   # nothing
+{
+    result = ast AST::ASTArray
+}
+        | param { result = val[0] }
+        | params COMMA param {
+    if val[0].instance_of?(AST::ASTArray)
+        val[0].push(val[2])
+        result = val[0]
+    else
+        result = ast AST::ASTArray, :children => [val[0],val[2]]
+    end
+}
+
+param:        NAME FARROW rvalue {
+    result = ast AST::ResourceParam, :param => val[0], :value => val[2]
+}
+
+addparam:     NAME PARROW rvalue {
+    result = ast AST::ResourceParam, :param => val[0], :value => val[2],
+                                     :add => true
+}
+
+anyparam:     param
+            | addparam
+
+anyparams:   # nothing
+{
+    result = ast AST::ASTArray
+}
+        | anyparam { result = val[0] }
+        | anyparams COMMA anyparam {
+    if val[0].instance_of?(AST::ASTArray)
+        val[0].push(val[2])
+        result = val[0]
+    else
+        result = ast AST::ASTArray, :children => [val[0],val[2]]
+    end
+}
+
+rvalues:      rvalue
+            | rvalues comma rvalue {
+    if val[0].instance_of?(AST::ASTArray)
+        result = val[0].push(val[2])
+    else
+        result = ast AST::ASTArray, :children => [val[0],val[2]]
+    end
+}
+
+simplervalue:       quotedtext
+            | name
+            | type
+            | boolean
+            | selector
+            | variable
+
+rvalue:       quotedtext
+            | name
+            | type
+            | boolean
+            | selector
+            | variable
+            | array
+            | resourceref
+            | funcrvalue
+            | undef
+
+# We currently require arguments in these functions.
+funcrvalue:   NAME LPAREN funcvalues RPAREN {
+    args = aryfy(val[2])
+    result = ast AST::Function,
+        :name => val[0],
+        :arguments => args,
+        :ftype => :rvalue
+}           | NAME LPAREN RPAREN {
+    result = ast AST::Function,
+        :name => val[0],
+        :arguments => AST::ASTArray.new({}),
+        :ftype => :rvalue
+}
+
+quotedtext: DQTEXT {
+    result = ast AST::String, :value => val[0]
+}           | SQTEXT {
+    result = ast AST::FlatString, :value => val[0]
+}
+
+boolean:    BOOLEAN {
+    result = ast AST::Boolean, :value => val[0]
+}
+
+resourceref: NAME LBRACK rvalue RBRACK {
+    Puppet.warning addcontext("Deprecation notice:  Resource references should now be capitalized")
+    result = ast AST::ResourceReference, :type => val[0], :title => val[2]
+}               | classref LBRACK rvalue RBRACK {
+    result = ast AST::ResourceReference, :type => val[0], :title => val[2]
+}
+
+ifstatement:      IF iftest LBRACE statements RBRACE else {
+    args = {
+        :test => val[1],
+        :statements => val[3]
+    }
+
+    if val[5]
+        args[:else] = val[5]
+    end
+
+    result = ast AST::IfStatement, args
+}
+
+else:             # nothing
+                | ELSE LBRACE statements RBRACE {
+    result = ast AST::Else, :statements => val[2]
+}
+
+# Currently we only support a single value, but eventually one assumes
+# we'll support operators and such.
+iftest:         rvalue
+
+casestatement:  CASE rvalue LBRACE caseopts RBRACE {
+    options = val[3]
+    unless options.instance_of?(AST::ASTArray)
+        options = ast AST::ASTArray, :children => [val[3]]
+    end
+    result = ast AST::CaseStatement, :test => val[1], :options => options
+}
+
+caseopts:     caseopt
+            | caseopts caseopt {
+    if val[0].instance_of?(AST::ASTArray)
+        val[0].push val[1]
+        result = val[0]
+    else
+        result = ast AST::ASTArray, :children => [val[0], val[1]]
+    end
+}
+
+caseopt:        casevalues COLON LBRACE statements RBRACE {
+    result = ast AST::CaseOpt, :value => val[0], :statements => val[3]
+}               | casevalues COLON LBRACE RBRACE {
+    result = ast(AST::CaseOpt,
+        :value => val[0],
+        :statements => ast(AST::ASTArray)
+    )
+}
+
+casevalues:       selectlhand
+                | casevalues COMMA selectlhand {
+    if val[0].instance_of?(AST::ASTArray)
+        val[0].push(val[2])
+        result = val[0]
+    else
+        result = ast AST::ASTArray, :children => [val[0],val[2]]
+    end
+}
+
+selector:     selectlhand QMARK svalues {
+    result = ast AST::Selector, :param => val[0], :values => val[2]
+}
+
+svalues:      selectval
+            | LBRACE sintvalues endcomma RBRACE { result = val[1] }
+
+sintvalues:   selectval
+            | sintvalues comma selectval {
+    if val[0].instance_of?(AST::ASTArray)
+        val[0].push(val[2])
+        result = val[0]
+    else
+        result = ast AST::ASTArray, :children => [val[0],val[2]]
+    end
+}
+
+selectval:        selectlhand FARROW rvalue {
+    result = ast AST::ResourceParam, :param => val[0], :value => val[2]
+}
+
+selectlhand:  name
+            | type
+            | quotedtext
+            | variable
+            | funcrvalue
+            | boolean
+            | undef
+            | DEFAULT {
+    result = ast AST::Default, :value => val[0]
+}
+
+# These are only used for importing, and we don't interpolate there.
+qtexts:       quotedtext { result = [val[0].value] }
+            | qtexts COMMA quotedtext {
+    results = val[0] << val[2].value
+}
+
+import: IMPORT qtexts {
+    val[1].each do |file|
+        import(file)
+    end
+
+    result = AST::ASTArray.new(:children => [])
+}
+
+# Disable definition inheritance for now. 8/27/06, luke
+#definition: DEFINE NAME argumentlist parent LBRACE statements RBRACE {
+definition: DEFINE classname argumentlist LBRACE statements RBRACE {
+    newdefine classname(val[1]), :arguments => val[2], :code => val[4]
+    @lexer.indefine = false
+    result = nil
+
+#}           | DEFINE NAME argumentlist parent LBRACE RBRACE {
+}           | DEFINE classname argumentlist LBRACE RBRACE {
+    newdefine classname(val[1]), :arguments => val[2]
+    @lexer.indefine = false
+    result = nil
+}
+
+#hostclass: CLASS NAME argumentlist parent LBRACE statements RBRACE {
+hostclass: CLASS classname classparent LBRACE statements RBRACE {
+    # Our class gets defined in the parent namespace, not our own.
+    @lexer.namepop
+    newclass classname(val[1]), :code => val[4], :parent => val[2]
+    result = nil
+}           | CLASS classname classparent LBRACE RBRACE {
+    # Our class gets defined in the parent namespace, not our own.
+    @lexer.namepop
+    newclass classname(val[1]), :parent => val[2]
+    result = nil
+}
+
+nodedef: NODE hostnames nodeparent LBRACE statements RBRACE {
+    newnode val[1], :parent => val[2], :code => val[4]
+    result = nil
+}       |  NODE hostnames nodeparent LBRACE RBRACE {
+    newnode val[1], :parent => val[2]
+    result = nil
+}
+
+classref:       CLASSREF
+
+classname:       NAME
+            | CLASSNAME
+
+# Multiple hostnames, as used for node names.  These are all literal
+# strings, not AST objects.
+hostnames:    hostname 
+  | hostnames COMMA hostname {
+    result = val[0]
+    result = [result] unless result.is_a?(Array)
+    result << val[2]
+}
+
+hostname: NAME
+        | SQTEXT
+        | DQTEXT
+        | DEFAULT
+
+nil:    {
+    result = nil
+}
+
+nothing:    {
+    result = ast AST::ASTArray, :children => []
+}
+
+argumentlist: nil
+            | LPAREN nothing RPAREN {
+    result = nil
+}
+            | LPAREN arguments RPAREN {
+    result = val[1]
+    result = [result] unless result[0].is_a?(Array)
+}
+
+arguments:    argument
+            | arguments COMMA argument {
+    result = val[0]
+    result = [result] unless result[0].is_a?(Array)
+    result << val[2]
+}
+
+argument:     NAME EQUALS rvalue {
+    Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
+    result = [val[0], val[2]]
+}
+            | NAME {
+    Puppet.warning addcontext("Deprecation notice: must now include '$' in prototype")
+    result = [val[0]]
+}           | VARIABLE EQUALS rvalue {
+    result = [val[0], val[2]]
+}           | VARIABLE {
+    result = [val[0]]
+}
+
+nodeparent:       nil
+            | INHERITS hostname {
+    result = val[1]
+}
+
+classparent:       nil
+            | INHERITS classnameordefault {
+    result = val[1]
+}
+
+classnameordefault: classname | DEFAULT
+
+variable:     VARIABLE {
+    result = ast AST::Variable, :value => val[0]
+}
+
+array:        LBRACK rvalues RBRACK {
+    if val[1].instance_of?(AST::ASTArray)
+        result = val[1]
+    else
+        result = ast AST::ASTArray, :children => [val[1]]
+    end
+}           | LBRACK RBRACK {
+    result = ast AST::ASTArray
+}
+
+comma:        FARROW
+            | COMMA
+
+endcomma:     # nothing
+            | COMMA { result = nil }
+
+end
+---- header ----
+require 'puppet'
+require 'puppet/util/loadedfile'
+require 'puppet/parser/lexer'
+require 'puppet/parser/ast'
+#require 'puppet/parser/interpreter'
+
+module Puppet
+    class ParseError < Puppet::Error; end
+    class ImportError < Racc::ParseError; end
+    class AlreadyImportedError < ImportError; end
+end
+
+Puppet[:typecheck] = true
+Puppet[:paramcheck] = true
+
+---- inner ----
+
+# It got too annoying having code in a file that needs to be compiled.
+require 'puppet/parser/parser_support'
+
+# Make emacs happy
+# Local Variables:
+# mode: ruby
+# End:
+
+# $Id$
+
diff --git a/lib/puppet/parser/interpreter.rb b/lib/puppet/parser/interpreter.rb
index e29e199..f27c1c5 100644
--- a/lib/puppet/parser/interpreter.rb
+++ b/lib/puppet/parser/interpreter.rb
@@ -3,7 +3,7 @@ require 'timeout'
 require 'puppet/rails'
 require 'puppet/util/methodhelper'
 require 'puppet/parser/parser'
-require 'puppet/parser/compile'
+require 'puppet/parser/compiler'
 require 'puppet/parser/scope'
 
 # The interpreter is a very simple entry-point class that
@@ -24,8 +24,13 @@ class Puppet::Parser::Interpreter
 
     # evaluate our whole tree
     def compile(node)
-        raise Puppet::ParseError, "Could not parse configuration; cannot compile" unless env_parser = parser(node.environment)
-        return Puppet::Parser::Compile.new(node, env_parser).compile
+        raise Puppet::ParseError, "Could not parse configuration; cannot compile on node %s" % node.name unless env_parser = parser(node.environment)
+        begin
+          return Puppet::Parser::Compiler.new(node, env_parser).compile
+        rescue => detail
+          puts detail.backtrace if Puppet[:trace]
+          raise Puppet::Error, detail.to_s + " on node %s" % node.name
+        end
     end
 
     # create our interpreter
@@ -42,6 +47,30 @@ class Puppet::Parser::Interpreter
         @parsers = {}
     end
 
+    # Return the parser for a specific environment.
+    def parser(environment)
+        if ! @parsers[environment] or @parsers[environment].reparse?
+            # This will throw an exception if it does not succeed.  We only
+            # want to get rid of the old parser if we successfully create a new
+            # one.
+            begin
+                tmp = create_parser(environment)
+                @parsers[environment].clear if @parsers[environment]
+                @parsers[environment] = tmp
+            rescue => detail
+                # If a parser already exists, than assume that we logged the
+                # exception elsewhere and reuse the parser.  If one doesn't
+                # exist, then reraise.
+                if @parsers[environment]
+                    Puppet.err detail
+                else
+                    raise detail
+                end
+            end
+        end
+        @parsers[environment]
+    end
+
     private
 
     # Create a new parser object and pre-parse the configuration.
@@ -67,24 +96,4 @@ class Puppet::Parser::Interpreter
             raise error
         end
     end
-
-    # Return the parser for a specific environment.
-    def parser(environment)
-        if ! @parsers[environment] or @parsers[environment].reparse?
-            # This will throw an exception if it does not succeed.  We only
-            # want to get rid of the old parser if we successfully create a new
-            # one.
-            begin
-                tmp = create_parser(environment)
-                @parsers[environment].clear if @parsers[environment]
-                @parsers[environment] = tmp
-            rescue => detail
-                # If a parser already exists, than assume that we logged the
-                # exception elsewhere and reuse the parser.  If one doesn't
-                # exist, then reraise.
-                raise detail unless @parsers[environment]
-            end
-        end
-        @parsers[environment]
-    end
 end
diff --git a/lib/puppet/parser/lexer.rb b/lib/puppet/parser/lexer.rb
index 086d82c..51026ea 100644
--- a/lib/puppet/parser/lexer.rb
+++ b/lib/puppet/parser/lexer.rb
@@ -1,4 +1,3 @@
-
 # the scanner/lexer
 
 require 'strscan'
@@ -7,326 +6,436 @@ require 'puppet'
 
 module Puppet
     class LexError < RuntimeError; end
-    module Parser
-        #---------------------------------------------------------------
-        class Lexer
-            attr_reader :line, :last, :file
-
-            attr_accessor :indefine
-
-                #%r{\w+} => :WORD,
-            @@tokens = {
-                %r{#.*} => :COMMENT,
-                %r{\[} => :LBRACK,
-                %r{\]} => :RBRACK,
-                %r{\{} => :LBRACE,
-                %r{\}} => :RBRACE,
-                %r{\(} => :LPAREN,
-                %r{\)} => :RPAREN,
-                %r{\"} => :DQUOTE,
-                %r{\n} => :RETURN,
-                %r{\'} => :SQUOTE,
-                %r{=} => :EQUALS,
-                %r{==} => :ISEQUAL,
-                %r{>=} => :GREATEREQUAL,
-                %r{>} => :GREATERTHAN,
-                %r{<} => :LESSTHAN,
-                %r{<=} => :LESSEQUAL,
-                %r{!=} => :NOTEQUAL,
-                %r{!} => :NOT,
-                %r{,} => :COMMA,
-                %r{\.} => :DOT,
-                %r{:} => :COLON,
-                %r{@} => :AT,
-                %r{<<\|} => :LLCOLLECT,
-                %r{\|>>} => :RRCOLLECT,
-                %r{<\|} => :LCOLLECT,
-                %r{\|>} => :RCOLLECT,
-                %r{;} => :SEMIC,
-                %r{\?} => :QMARK,
-                %r{\\} => :BACKSLASH,
-                %r{=>} => :FARROW,
-                %r{\+>} => :PARROW,
-                %r{[a-z][-\w]*} => :NAME,
-                %r{([a-z][-\w]*::)+[a-z][-\w]*} => :CLASSNAME,
-                %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF,
-                %r{[0-9]+} => :NUMBER,
-                %r{\$(\w*::)*\w+} => :VARIABLE
-            }
-
-            @@pairs = {
-                "{" => "}",
-                "(" => ")",
-                "[" => "]",
-                "<|" => "|>",
-                "<<|" => "|>>"
-            }
-
-            @@reverse_pairs = @@pairs.inject({}) { |hash, pair| hash[pair[1]] = pair[0]; hash }
-
-            @@keywords = {
-                "case" => :CASE,
-                "class" => :CLASS,
-                "default" => :DEFAULT,
-                "define" => :DEFINE,
-                "false" => :BOOLEAN,
-                "import" => :IMPORT,
-                "if" => :IF,
-                "elsif" => :ELSIF,
-                "else" => :ELSE,
-                "inherits" => :INHERITS,
-                "node" => :NODE,
-                "true" => :BOOLEAN,
-                "and"  => :AND,
-                "or"   => :OR,
-                "undef"   => :UNDEF
-            }
-
-            def clear
-                initvars
-            end
+end
 
-            def expected
-                if @expected.empty?
-                    nil
-                else
-                    token = @expected[-1]
-                    @@tokens.each do |value, name|
-                        if token == name
-                            return value
-                        end
-                    end
-                    return token
-                end
-            end
+module Puppet::Parser; end
 
-            # scan the whole file
-            # basically just used for testing
-            def fullscan
-                array = []
-
-                self.scan { |token,str|
-                    # Ignore any definition nesting problems
-                    @indefine = false
-                    #Puppet.debug("got token '%s' => '%s'" % [token,str])
-                    if token.nil?
-                        return array
-                    else
-                        array.push([token,str])
-                    end
-                }
-                return array
+class Puppet::Parser::Lexer
+    attr_reader :last, :file
+
+    attr_accessor :line, :indefine
+
+    # Our base token class.
+    class Token
+        attr_accessor :regex, :name, :string, :skip, :incr_line, :skip_text
+
+        def initialize(regex, name)
+            if regex.is_a?(String)
+                @name, @string = name, regex
+                @regex = Regexp.new(Regexp.escape(@string))
+            else
+                @name, @regex = name, regex
             end
+        end
 
-            # this is probably pretty damned inefficient...
-            # it'd be nice not to have to load the whole file first...
-            def file=(file)
-                @file = file
-                @line = 1
-                File.open(file) { |of|
-                    str = ""
-                    of.each { |line| str += line }
-                    @scanner = StringScanner.new(str)
-                }
+        def skip?
+            self.skip
+        end
+
+        def to_s
+            if self.string
+                @string
+            else
+                @name.to_s
             end
+        end
+    end
 
-            def indefine?
-                if defined? @indefine
-                    @indefine
-                else
-                    false
-                end
+    # Maintain a list of tokens.
+    class TokenList
+        attr_reader :regex_tokens, :string_tokens
+
+        def [](name)
+            @tokens[name]
+        end
+
+        # Create a new token.
+        def add_token(name, regex, options = {}, &block)
+            token = Token.new(regex, name)
+            raise(ArgumentError, "Token %s already exists" % name) if @tokens.include?(name)
+            @tokens[token.name] = token
+            if token.string
+                @string_tokens << token
+                @tokens_by_string[token.string] = token
+            else
+                @regex_tokens << token
             end
 
-            def initialize
-                initvars()
+            options.each do |name, option|
+                token.send(name.to_s + "=", option)
             end
 
-            def initvars
-                @line = 1
-                @last = ""
-                @lasttoken = nil
-                @scanner = nil
-                @file = nil
-                # AAARRGGGG! okay, regexes in ruby are bloody annoying
-                # no one else has "\n" =~ /\s/
-                @skip = %r{[ \t]+}
+            token.meta_def(:convert, &block) if block_given?
+
+            token
+        end
 
-                @namestack = []
-                @indefine = false
+        def initialize
+            @tokens = {}
+            @regex_tokens = []
+            @string_tokens = []
+            @tokens_by_string = {}
+        end
 
-                @expected = []
-            end
+        # Look up a token by its value, rather than name.
+        def lookup(string)
+            @tokens_by_string[string]
+        end
 
-            # Go up one in the namespace.
-            def namepop
-                @namestack.pop
+        # Define more tokens.
+        def add_tokens(hash)
+            hash.each do |regex, name|
+                add_token(name, regex)
             end
+        end
 
-            # Collect the current namespace.
-            def namespace
-                @namestack.join("::")
+        # Sort our tokens by length, so we know once we match, we're done.
+        # This helps us avoid the O(n^2) nature of token matching.
+        def sort_tokens
+            @string_tokens.sort! { |a, b| b.string.length <=> a.string.length }
+        end
+    end
+
+    TOKENS = TokenList.new
+    TOKENS.add_tokens(
+        '[' => :LBRACK,
+        ']' => :RBRACK,
+        '{' => :LBRACE,
+        '}' => :RBRACE,
+        '(' => :LPAREN,
+        ')' => :RPAREN,
+        '=' => :EQUALS,
+        '==' => :ISEQUAL,
+        '>=' => :GREATEREQUAL,
+        '>' => :GREATERTHAN,
+        '<' => :LESSTHAN,
+        '<=' => :LESSEQUAL,
+        '!=' => :NOTEQUAL,
+        '!' => :NOT,
+        ',' => :COMMA,
+        '.' => :DOT,
+        ':' => :COLON,
+        '@' => :AT,
+        '<<|' => :LLCOLLECT,
+        '|>>' => :RRCOLLECT,
+        '<|' => :LCOLLECT,
+        '|>' => :RCOLLECT,
+        ';' => :SEMIC,
+        '?' => :QMARK,
+        '\\' => :BACKSLASH,
+        '=>' => :FARROW,
+        '+>' => :PARROW,
+        %r{([a-z][-\w]*::)+[a-z][-\w]*} => :CLASSNAME,
+        %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF
+    )
+
+    TOKENS.add_tokens "Whatever" => :DQTEXT, "Nomatter" => :SQTEXT, "alsonomatter" => :BOOLEAN
+
+    TOKENS.add_token :NAME, %r{[a-z][-\w]*} do |lexer, value|
+        string_token = self
+        # we're looking for keywords here
+        if tmp = KEYWORDS.lookup(value)
+            string_token = tmp
+            if [:TRUE, :FALSE].include?(string_token.name)
+                value = eval(value)
+                string_token = TOKENS[:BOOLEAN]
             end
+        end
+        [string_token, value]
+    end
+
+    TOKENS.add_token :NUMBER, %r{[0-9]+} do |lexer, value|
+        [TOKENS[:NAME], value]
+    end
+
+    TOKENS.add_token :COMMENT, %r{#.*}, :skip => true
+
+    TOKENS.add_token :RETURN, "\n", :skip => true, :incr_line => true, :skip_text => true
+
+    TOKENS.add_token :SQUOTE, "'" do |lexer, value|
+        value = lexer.slurpstring(value)
+        [TOKENS[:SQTEXT], value]
+    end
+
+    TOKENS.add_token :DQUOTE, '"' do |lexer, value|
+        value = lexer.slurpstring(value)
+        [TOKENS[:DQTEXT], value]
+    end
+
+    TOKENS.add_token :VARIABLE, %r{\$(\w*::)*\w+} do |lexer, value|
+        value = value.sub(/^\$/, '')
+        [self, value]
+    end
+
+    TOKENS.sort_tokens
+
+    @@pairs = {
+        "{" => "}",
+        "(" => ")",
+        "[" => "]",
+        "<|" => "|>",
+        "<<|" => "|>>"
+    }
+
+    KEYWORDS = TokenList.new
+
+    KEYWORDS.add_tokens(
+        "case" => :CASE,
+        "class" => :CLASS,
+        "default" => :DEFAULT,
+        "define" => :DEFINE,
+        "import" => :IMPORT,
+        "if" => :IF,
+        "elsif" => :ELSIF,
+        "else" => :ELSE,
+        "inherits" => :INHERITS,
+        "node" => :NODE,
+        "and"  => :AND,
+        "or"   => :OR,
+        "undef"   => :UNDEF,
+        "false" => :FALSE,
+        "true" => :TRUE
+    )
+
+    def clear
+        initvars
+    end
+
+    def expected
+        return nil if @expected.empty?
+        name = @expected[-1]
+        raise "Could not find expected token %s" % name unless token = TOKENS.lookup(name)
+
+        return token
+    end
+
+    # scan the whole file
+    # basically just used for testing
+    def fullscan
+        array = []
+
+        self.scan { |token, str|
+            # Ignore any definition nesting problems
+            @indefine = false
+            array.push([token,str])
+        }
+        return array
+    end
+
+    # this is probably pretty damned inefficient...
+    # it'd be nice not to have to load the whole file first...
+    def file=(file)
+        @file = file
+        @line = 1
+        File.open(file) { |of|
+            str = ""
+            of.each { |line| str += line }
+            @scanner = StringScanner.new(str)
+        }
+    end
 
-            # This value might have :: in it, but we don't care -- it'll be
-            # handled normally when joining, and when popping we want to pop
-            # this full value, however long the namespace is.
-            def namestack(value)
-                @namestack << value
+    def find_string_token
+        matched_token = value = nil
+
+        # We know our longest string token is three chars, so try each size in turn
+        # until we either match or run out of chars.  This way our worst-case is three
+        # tries, where it is otherwise the number of string chars we have.  Also,
+        # the lookups are optimized hash lookups, instead of regex scans.
+        [3, 2, 1].each do |i|
+            str = @scanner.peek(i)
+            if matched_token = TOKENS.lookup(str)
+                value = @scanner.scan(matched_token.regex)
+                break
             end
+        end
+
+        return matched_token, value
+    end
 
-            def rest
-                @scanner.rest
+    # Find the next token that matches a regex.  We look for these first.
+    def find_regex_token
+        @regex += 1
+        matched_token = nil
+        value = ""
+        length = 0
+
+        # I tried optimizing based on the first char, but it had
+        # a slightly negative affect and was a good bit more complicated.
+        TOKENS.regex_tokens.each do |token|
+            next unless match_length = @scanner.match?(token.regex) 
+            
+            # We've found a longer match
+            if match_length > length
+                value = @scanner.scan(token.regex) 
+                length = value.length
+                matched_token = token
             end
+        end
 
-            # this is the heart of the lexer
-            def scan
-                #Puppet.debug("entering scan")
-                if @scanner.nil?
-                    raise TypeError.new("Invalid or empty string")
-                end
+        return matched_token, value
+    end
 
-                @scanner.skip(@skip)
-                until @scanner.eos? do
-                    yielded = false
-                    sendbreak = false # gah, this is a nasty hack
-                    stoken = nil
-                    sregex = nil
-                    value = ""
-
-                    # first find out which type of token we've got
-                    @@tokens.each { |regex,token|
-                        # we're just checking, which doesn't advance the scan
-                        # pointer
-                        tmp = @scanner.check(regex)
-                        if tmp.nil?
-                            #puppet.debug("did not match %s to '%s'" %
-                            #    [regex, at scanner.rest])
-                            next
-                        end
-
-                        # find the longest match
-                        if tmp.length > value.length
-                            value = tmp 
-                            stoken = token
-                            sregex = regex
-                        else
-                            # we've already got a longer match
-                            next
-                        end
-                    }
-
-                    # error out if we didn't match anything at all
-                    if stoken.nil?
-                        nword = nil
-                        if @scanner.rest =~ /^(\S+)/
-                            nword = $1
-                        elsif at scanner.rest =~ /^(\s+)/
-                            nword = $1
-                        else
-                            nword = @scanner.rest
-                        end
-                        raise "Could not match '%s'" % nword
-                    end
+    # Find the next token, returning the string and the token.
+    def find_token
+        @find += 1
+        matched_token, value = find_regex_token
 
-                    value = @scanner.scan(sregex)
+        unless matched_token
+            matched_token, value = find_string_token
+        end
 
-                    if value == ""
-                        raise "Didn't match regex on token %s" % stoken
-                    end
+        return matched_token, value
+    end
 
-                    # token-specific operations
-                    # if this gets much more complicated, it should
-                    # be moved up to where the tokens themselves are defined
-                    # which will get me about 75% of the way to a lexer generator
-                    ptoken = stoken
-                    case stoken
-                    when :NAME then
-                        wtoken = stoken
-                        # we're looking for keywords here
-                        if @@keywords.include?(value)
-                            wtoken = @@keywords[value]
-                            #Puppet.debug("token '%s'" % wtoken)
-                            if wtoken == :BOOLEAN
-                                value = eval(value)
-                            end
-                        end
-                        ptoken = wtoken
-                    when :NUMBER then
-                        ptoken = :NAME
-                    when :COMMENT then
-                        # just throw comments away
-                        next
-                    when :RETURN then
-                        @line += 1
-                        @scanner.skip(@skip)
-                        next
-                    when :SQUOTE then
-                        #Puppet.debug("searching '%s' after '%s'" % [self.rest,value])
-                        value = self.slurpstring(value)
-                        ptoken = :SQTEXT
-                        #Puppet.debug("got string '%s' => '%s'" % [:DQTEXT,value])
-                    when :DQUOTE then
-                        value = self.slurpstring(value)
-                        ptoken = :DQTEXT
-                    when :VARIABLE then
-                        value = value.sub(/^\$/, '')
-                    end
+    def indefine?
+        if defined? @indefine
+            @indefine
+        else
+            false
+        end
+    end
 
-                    if match = @@pairs[value] and ptoken != :DQUOTE and ptoken != :SQUOTE
-                        @expected << match
-                    elsif exp = @expected[-1] and exp == value and ptoken != :DQUOTE and ptoken != :SQUOTE
-                        @expected.pop
-                    end
+    def initialize
+        @find = 0
+        @regex = 0
+        initvars()
+    end
 
-                    yield [ptoken, value]
+    def initvars
+        @line = 1
+        @previous_token = nil
+        @scanner = nil
+        @file = nil
+        # AAARRGGGG! okay, regexes in ruby are bloody annoying
+        # no one else has "\n" =~ /\s/
+        @skip = %r{[ \t]+}
+
+        @namestack = []
+        @indefine = false
+        @expected = []
+    end
 
-                    if @lasttoken == :CLASS
-                        namestack(value)
-                    end
+    # Make any necessary changes to the token and/or value.
+    def munge_token(token, value)
+        @line += 1 if token.incr_line
 
-                    if @lasttoken == :DEFINE
-                        if indefine?
-                            msg = "Cannot nest definition %s inside %s" % [value, @indefine]
-                            self.indefine = false
-                            raise Puppet::ParseError, msg
-                        end
+        skip() if token.skip_text
 
-                        @indefine = value
-                    end
+        return if token.skip
 
-                    @last = value
-                    @lasttoken = ptoken
+        token, value = token.convert(self, value) if token.respond_to?(:convert)
 
-                    @scanner.skip(@skip)
-                end
-                @scanner = nil
-                yield [false,false]
-            end
+        return unless token
+
+        return token, value
+    end
+
+    # Go up one in the namespace.
+    def namepop
+        @namestack.pop
+    end
 
-            # we've encountered an opening quote...
-            # slurp in the rest of the string and return it
-            def slurpstring(quote)
-                # we search for the next quote that isn't preceded by a
-                # backslash; the caret is there to match empty strings
-                str = @scanner.scan_until(/([^\\]|^)#{quote}/)
-                if str.nil?
-                    raise Puppet::LexError.new("Unclosed quote after '%s' in '%s'" %
-                        [self.last,self.rest])
+    # Collect the current namespace.
+    def namespace
+        @namestack.join("::")
+    end
+
+    # This value might have :: in it, but we don't care -- it'll be
+    # handled normally when joining, and when popping we want to pop
+    # this full value, however long the namespace is.
+    def namestack(value)
+        @namestack << value
+    end
+
+    def rest
+        @scanner.rest
+    end
+
+    # this is the heart of the lexer
+    def scan
+        #Puppet.debug("entering scan")
+        raise Puppet::LexError.new("Invalid or empty string") unless @scanner
+
+        # Skip any initial whitespace.
+        skip()
+
+        until @scanner.eos? do
+            yielded = false
+            matched_token, value = find_token
+
+            # error out if we didn't match anything at all
+            if matched_token.nil?
+                nword = nil
+                # Try to pull a 'word' out of the remaining string.
+                if @scanner.rest =~ /^(\S+)/
+                    nword = $1
+                elsif @scanner.rest =~ /^(\s+)/
+                    nword = $1
                 else
-                    str.sub!(/#{quote}\Z/,"")
-                    str.gsub!(/\\#{quote}/,quote)
+                    nword = @scanner.rest
                 end
+                raise "Could not match '%s'" % nword
+            end
 
-                return str
+            final_token, value = munge_token(matched_token, value)
+
+            next unless final_token
+
+            if match = @@pairs[value] and final_token.name != :DQUOTE and final_token.name != :SQUOTE
+                @expected << match
+            elsif exp = @expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
+                @expected.pop
             end
 
-            # just parse a string, not a whole file
-            def string=(string)
-                @scanner = StringScanner.new(string)
+            yield [final_token.name, value]
+
+            if @previous_token
+                namestack(value) if @previous_token.name == :CLASS
+
+                if @previous_token.name == :DEFINE
+                    if indefine?
+                        msg = "Cannot nest definition %s inside %s" % [value, @indefine]
+                        self.indefine = false
+                        raise Puppet::ParseError, msg
+                    end
+
+                    @indefine = value
+                end
             end
+
+            @previous_token = final_token
+            skip()
         end
-        #---------------------------------------------------------------
+        @scanner = nil
+
+        # This indicates that we're done parsing.
+        yield [false,false]
+    end
+
+    # Skip any skipchars in our remaining string.
+    def skip
+        @scanner.skip(@skip)
     end
-end
 
+    # we've encountered an opening quote...
+    # slurp in the rest of the string and return it
+    def slurpstring(quote)
+        # we search for the next quote that isn't preceded by a
+        # backslash; the caret is there to match empty strings
+        str = @scanner.scan_until(/([^\\]|^)#{quote}/)
+        if str.nil?
+            raise Puppet::LexError.new("Unclosed quote after '%s' in '%s'" %
+                [self.last,self.rest])
+        else
+            str.sub!(/#{quote}\Z/,"")
+            str.gsub!(/\\#{quote}/,quote)
+        end
+
+        return str
+    end
+
+    # just parse a string, not a whole file
+    def string=(string)
+        @scanner = StringScanner.new(string)
+    end
+end
diff --git a/lib/puppet/parser/makefile b/lib/puppet/parser/makefile
new file mode 100644
index 0000000..c4911d0
--- /dev/null
+++ b/lib/puppet/parser/makefile
@@ -0,0 +1,8 @@
+#parser.rb: grammar.ry
+#	ryacc --output parser grammar
+
+parser.rb: grammar.ra
+	racc -o$@ grammar.ra
+
+grammar.output: grammar.ra
+	racc -v -o$@ grammar.ra
diff --git a/lib/puppet/parser/parser.rb b/lib/puppet/parser/parser.rb
index c3279d4..e27a209 100644
--- a/lib/puppet/parser/parser.rb
+++ b/lib/puppet/parser/parser.rb
@@ -29,7 +29,7 @@ module Puppet
 
     class Parser < Racc::Parser
 
-module_eval <<'..end grammar.ra modeval..id9134b179f4', 'grammar.ra', 638
+module_eval <<'..end grammar.ra modeval..idfef5d70c9f', 'grammar.ra', 638
 
 # It got too annoying having code in a file that needs to be compiled.
 require 'puppet/parser/parser_support'
@@ -39,8 +39,9 @@ require 'puppet/parser/parser_support'
 # mode: ruby
 # End:
 
+# $Id$
 
-..end grammar.ra modeval..id9134b179f4
+..end grammar.ra modeval..idfef5d70c9f
 
 ##### racc 1.4.5 generates ###
 
@@ -956,7 +957,7 @@ module_eval <<'.,.,', 'grammar.ra', 174
   def _reduce_38( val, _values, result )
     type = val[0]
 
-    if type == :exported and ! Puppet[:storeconfigs]
+    if (type == :exported and ! Puppet[:storeconfigs]) and ! Puppet[:parseonly]
         error "You cannot collect without storeconfigs being set"
     end
 
@@ -1009,7 +1010,7 @@ module_eval <<'.,.,', 'grammar.ra', 199
     else
         args[:form] = val[1]
     end
-    if args[:form] == :exported and ! Puppet[:storeconfigs]
+    if args[:form] == :exported and ! Puppet[:storeconfigs] and ! Puppet[:parseonly]
         error "You cannot collect exported resources without storeconfigs being set"
     end
     result = ast AST::Collection, args
diff --git a/lib/puppet/parser/parser_support.rb b/lib/puppet/parser/parser_support.rb
index acf3c9f..ccfc4d4 100644
--- a/lib/puppet/parser/parser_support.rb
+++ b/lib/puppet/parser/parser_support.rb
@@ -47,11 +47,8 @@ class Puppet::Parser::Parser
 
     # Create an AST object, and automatically add the file and line information if
     # available.
-    def ast(klass, hash = nil)
-        hash ||= {}
-        unless hash.include?(:line)
-            hash[:line] = @lexer.line
-        end
+    def ast(klass, hash = {})
+        hash[:line] = @lexer.line unless hash.include?(:line)
 
         unless hash.include?(:file)
             if file = @lexer.file
@@ -180,7 +177,7 @@ class Puppet::Parser::Parser
                "in file #{@lexer.file} at line #{@lexer.line}"
             )
         end
-        files = Puppet::Module::find_manifests(pat, :cwd => dir)
+        files = Puppet::Module::find_manifests(pat, :cwd => dir, :environment => @environment)
         if files.size == 0
             raise Puppet::ImportError.new("No file(s) found for import " +
                                           "of '#{pat}'")
diff --git a/lib/puppet/parser/resource.rb b/lib/puppet/parser/resource.rb
index 3f34616..4b48ff6 100644
--- a/lib/puppet/parser/resource.rb
+++ b/lib/puppet/parser/resource.rb
@@ -3,18 +3,18 @@
 class Puppet::Parser::Resource
     require 'puppet/parser/resource/param'
     require 'puppet/parser/resource/reference'
+    require 'puppet/util/tagging'
     include Puppet::Util
     include Puppet::Util::MethodHelper
     include Puppet::Util::Errors
     include Puppet::Util::Logging
+    include Puppet::Util::Tagging
 
     attr_accessor :source, :line, :file, :scope, :rails_id
     attr_accessor :virtual, :override, :translated
 
     attr_reader :exported, :evaluated, :params
 
-    attr_writer :tags
-
     # Determine whether the provided parameter name is a relationship parameter.
     def self.relationship_parameter?(name)
         unless defined?(@relationship_names)
@@ -58,8 +58,7 @@ class Puppet::Parser::Resource
     def evaluate
         if klass = @ref.definedtype
             finish()
-            scope.compile.delete_resource(self)
-            return klass.evaluate(:scope => scope, :resource => self)
+            return klass.evaluate_code(self)
         elsif builtin?
             devfail "Cannot evaluate a builtin type"
         else
@@ -83,12 +82,19 @@ class Puppet::Parser::Resource
     # Do any finishing work on this object, called before evaluation or
     # before storage/translation.
     def finish
-        add_overrides()
+        return if finished?
+        @finished = true
         add_defaults()
         add_metaparams()
+        add_scope_tags()
         validate()
     end
 
+    # Has this resource already been finished?
+    def finished?
+        defined?(@finished) and @finished
+    end
+
     def initialize(options)
         # Set all of the options we can.
         options.each do |option, value|
@@ -130,12 +136,16 @@ class Puppet::Parser::Resource
             raise ArgumentError, "Resources do not accept %s" % options.keys.collect { |k| k.to_s }.join(", ")
         end
 
-        @tags = []
         tag(@ref.type)
-        tag(@ref.title) if @ref.title.to_s =~ /^[-\w]+$/
+        tag(@ref.title) if valid_tag?(@ref.title.to_s)
+    end
 
-        if scope.resource
-            @tags += scope.resource.tags
+    # Is this resource modeling an isomorphic resource type?
+    def isomorphic?
+        if builtin?
+            return @ref.builtintype.isomorphic?
+        else
+            return true
         end
     end
 
@@ -223,21 +233,18 @@ class Puppet::Parser::Resource
         @ref.to_s
     end
 
-    # Add a tag to our current list.  These tags will be added to all
-    # of the objects contained in this scope.
-    def tag(*ary)
-        ary.collect { |tag| tag.to_s.downcase }.collect { |tag| tag.split("::") }.flatten.each do |tag|
-            unless tag =~ /^\w[-\w]*$/
-                fail Puppet::ParseError, "Invalid tag %s" % tag.inspect
-            end
-            unless @tags.include?(tag)
-                @tags << tag
-            end
+    # Define a parameter in our resource.
+    def set_parameter(param, value = nil)
+        if value
+            param = Puppet::Parser::Resource::Param.new(
+                :name => param, :value => value, :source => self.source
+            )
+        elsif ! param.is_a?(Puppet::Parser::Resource::Param)
+            raise ArgumentError, "Must pass a parameter or all necessary values"
         end
-    end
 
-    def tags
-        @tags.dup
+        # And store it in our parameter hash.
+        @params[param.name] = param
     end
 
     def to_hash
@@ -260,6 +267,8 @@ class Puppet::Parser::Resource
         # Handle file specially
         db_resource.file = self.file
 
+        db_resource.save
+
         @params.each { |name, param|
             param.to_rails(db_resource)
         }
@@ -336,7 +345,7 @@ class Puppet::Parser::Resource
             unless @params.include?(name)
                 self.debug "Adding default for %s" % name
 
-                @params[name] = param
+                @params[name] = param.dup
             end
         end
     end
@@ -361,16 +370,9 @@ class Puppet::Parser::Resource
         end
     end
 
-    # Add any overrides for this object.
-    def add_overrides
-        if overrides = scope.compile.resource_overrides(self)
-            overrides.each do |over|
-                self.merge(over)
-            end
-
-            # Remove the overrides, so that the configuration knows there
-            # are none left.
-            overrides.clear
+    def add_scope_tags
+        if scope_resource = scope.resource
+            tag(*scope_resource.tags)
         end
     end
 
@@ -382,11 +384,8 @@ class Puppet::Parser::Resource
 
         # The parameter is already set.  Fail if they're not allowed to override it.
         unless param.source.child_of?(current.source)
-            if Puppet[:trace]
-                puts caller
-            end
-            msg = "Parameter '%s' is already set on %s" % 
-                [param.name, self.to_s]
+            puts caller if Puppet[:trace]
+            msg = "Parameter '%s' is already set on %s" % [param.name, self.to_s]
             if current.source.to_s != ""
                 msg += " by %s" % current.source
             end
@@ -438,20 +437,6 @@ class Puppet::Parser::Resource
         end
     end
 
-    # Define a parameter in our resource.
-    def set_parameter(param, value = nil)
-        if value
-            param = Puppet::Parser::Resource::Param.new(
-                :name => param, :value => value, :source => self.source
-            )
-        elsif ! param.is_a?(Puppet::Parser::Resource::Param)
-            raise ArgumentError, "Must pass a parameter or all necessary values"
-        end
-
-        # And store it in our parameter hash.
-        @params[param.name] = param
-    end
-
     # Make sure the resource's parameters are all valid for the type.
     def validate
         @params.each do |name, param|
diff --git a/lib/puppet/parser/resource/param.rb b/lib/puppet/parser/resource/param.rb
index 9352311..9dd3f26 100644
--- a/lib/puppet/parser/resource/param.rb
+++ b/lib/puppet/parser/resource/param.rb
@@ -12,7 +12,7 @@ class Puppet::Parser::Resource::Param
     end
 
     def inspect
-        "#<#{self.class} @name => #{self.name}, @value => #{self.value}, @source => #{self.source.name}>"
+        "#<#{self.class} @name => #{name}, @value => #{value}, @source => #{source.name}>"
     end
 
     def line_to_i
diff --git a/lib/puppet/parser/resource/reference.rb b/lib/puppet/parser/resource/reference.rb
index 6e70d23..c597480 100644
--- a/lib/puppet/parser/resource/reference.rb
+++ b/lib/puppet/parser/resource/reference.rb
@@ -37,10 +37,14 @@ class Puppet::Parser::Resource::Reference < Puppet::ResourceReference
                 if self.title == :main
                     tmp = @scope.findclass("")
                 else
-                    tmp = @scope.findclass(self.title)
+                    unless tmp = @scope.findclass(self.title)
+                        fail Puppet::ParseError, "Could not find class '%s'" % self.title
+                    end
                 end
             when "Node": # look for node definitions
-                tmp = @scope.parser.nodes[self.title]
+                unless tmp = @scope.parser.nodes[self.title]
+                    fail Puppet::ParseError, "Could not find node '%s'" % self.title
+                end
             else # normal definitions
                 # We have to swap these variables around so the errors are right.
                 tmp = @scope.finddefine(self.type)
@@ -49,7 +53,7 @@ class Puppet::Parser::Resource::Reference < Puppet::ResourceReference
             if tmp
                 @definedtype = tmp
             else
-                fail Puppet::ParseError, "Could not find resource '%s'" % self
+                fail Puppet::ParseError, "Could not find resource type '%s'" % self.type
             end
         end
 
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 028414c..a6e43e7 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -17,15 +17,20 @@ class Puppet::Parser::Scope
     include Puppet::Util::Errors
     attr_accessor :parent, :level, :parser, :source, :resource
     attr_accessor :base, :keyword, :nodescope
-    attr_accessor :top, :translated, :compile
+    attr_accessor :top, :translated, :compiler
+
+    # A demeterific shortcut to the catalog.
+    def catalog
+        compiler.catalog
+    end
 
     # Proxy accessors
     def host
-        @compile.node.name
+        @compiler.node.name
     end
 
     def interpreter
-        @compile.interpreter
+        @compiler.interpreter
     end
 
     # Is the value true?  This allows us to control the definition of truth
@@ -72,7 +77,7 @@ class Puppet::Parser::Scope
     end
 
     def findresource(string, name = nil)
-        compile.findresource(string, name)
+        compiler.findresource(string, name)
     end
 
     # Initialize our new scope.  Defaults to having no parent.
@@ -147,7 +152,7 @@ class Puppet::Parser::Scope
         unless klass
             raise Puppet::ParseError, "Could not find class %s" % klassname
         end
-        unless kscope = compile.class_scope(klass)
+        unless kscope = compiler.class_scope(klass)
             raise Puppet::ParseError, "Class %s has not been evaluated so its variables cannot be referenced" % klass.classname
         end
         return kscope.lookupvar(shortname, usestring)
@@ -184,7 +189,7 @@ class Puppet::Parser::Scope
 
     # Create a new scope and set these options.
     def newscope(options = {})
-        compile.newscope(self, options)
+        compiler.newscope(self, options)
     end
 
     # Is this class for a node?  This is used to make sure that
@@ -199,7 +204,7 @@ class Puppet::Parser::Scope
     # than doing lots of queries.
     def parent
         unless defined?(@parent)
-            @parent = compile.parent(self)
+            @parent = compiler.parent(self)
         end
         @parent
     end
diff --git a/lib/puppet/parser/templatewrapper.rb b/lib/puppet/parser/templatewrapper.rb
index 13823d4..7a8f741 100644
--- a/lib/puppet/parser/templatewrapper.rb
+++ b/lib/puppet/parser/templatewrapper.rb
@@ -7,7 +7,7 @@ class Puppet::Parser::TemplateWrapper
 
     def initialize(scope, file)
         @scope = scope
-        @file = Puppet::Module::find_template(file, @scope.compile.environment)
+        @file = Puppet::Module::find_template(file, @scope.compiler.environment)
 
         unless FileTest.exists?(@file)
             raise Puppet::ParseError,
diff --git a/lib/puppet/pgraph.rb b/lib/puppet/pgraph.rb
index 49fd214..3bcc2ce 100644
--- a/lib/puppet/pgraph.rb
+++ b/lib/puppet/pgraph.rb
@@ -1,51 +1,27 @@
 #  Created by Luke A. Kanies on 2006-11-24.
 #  Copyright (c) 2006. All rights reserved.
 
-require 'puppet/external/gratr/digraph'
-require 'puppet/external/gratr/import'
-require 'puppet/external/gratr/dot'
-
 require 'puppet/relationship'
 require 'puppet/simple_graph'
 
 # This class subclasses a graph class in order to handle relationships
 # among resources.
 class Puppet::PGraph < Puppet::SimpleGraph
-    # This is the type used for splicing.
-    attr_accessor :container_type
-
     include Puppet::Util
 
-    def add_edge!(*args)
+    def add_edge(*args)
         @reversal = nil
         super
     end
 
-    def add_vertex!(*args)
+    def add_vertex(*args)
         @reversal = nil
         super
     end
 
-    # Make sure whichever edge has a label keeps the label
-    def copy_label(source, target, label)
-        # 'require' relationships will not have a label,
-        # and all 'subscribe' relationships have the same
-        # label, at least for now.
-
-        # Labels default to {}, so we can't just test for nil.
-        newlabel = label || {}
-        oldlabel = edge_label(source, target) || {}
-        if ! newlabel.empty? and oldlabel.empty?
-            edge_label_set(source, target, label)
-            # We should probably check to see if the labels both exist
-            # and don't match, but we'd just throw an error which the user
-            # couldn't do anyting about.
-        end
-    end
-
     # Which resources a given resource depends upon.
     def dependents(resource)
-        tree_from_vertex2(resource).keys
+        tree_from_vertex(resource).keys
     end
     
     # Which resources depend upon the given resource.
@@ -58,19 +34,13 @@ class Puppet::PGraph < Puppet::SimpleGraph
         # Strangely, it's significantly faster to search a reversed
         # tree in the :out direction than to search a normal tree
         # in the :in direction.
-        @reversal.tree_from_vertex2(resource, :out).keys
-        #tree_from_vertex2(resource, :in).keys
-    end
-    
-    # Override this method to use our class instead.
-    def edge_class()
-        Puppet::Relationship
+        @reversal.tree_from_vertex(resource, :out).keys
     end
     
     # Determine all of the leaf nodes below a given vertex.
-    def leaves(vertex, type = :dfs)
-        tree = tree_from_vertex(vertex, type)
-        l = tree.keys.find_all { |c| adjacent(c, :direction => :out).empty? }
+    def leaves(vertex, direction = :out)
+        tree = tree_from_vertex(vertex, direction)
+        l = tree.keys.find_all { |c| adjacent(c, :direction => direction).empty? }
         return l
     end
     
@@ -128,83 +98,24 @@ class Puppet::PGraph < Puppet::SimpleGraph
                             t = edge.target
                         end
 
-                        # We don't want to add multiple copies of the
-                        # same edge, but we *do* want to make sure we
-                        # keep labels around.
-                        # XXX This will *not* work when we support multiple
-                        # types of labels, and only works now because
-                        # you can only do simple subscriptions.
-                        if edge?(s, t)
-                            copy_label(s, t, edge.label)
-                            next
-                        end
-                        add_edge!(s, t, edge.label)
+                        add_edge(s, t, edge.label)
                     end
 
                     # Now get rid of the edge, so remove_vertex! works correctly.
                     remove_edge!(edge)
-                    Puppet.debug "%s: %s => %s: %s" % [container,
-                        edge.source, edge.target, edge?(edge.source, edge.target)]
                 end
             end
             remove_vertex!(container)
         end
     end
-    
-    # For some reason, unconnected vertices do not show up in
-    # this graph.
-    def to_jpg(path, name)
-        gv = vertices()
-        Dir.chdir(path) do
-            induced_subgraph(gv).write_to_graphic_file('jpg', name)
-        end
-    end
-
-    # Replace the default method, because we want to throw errors on back edges,
-    # not just skip them.
-    def topsort(start = nil, &block)
-        result  = []
-        go      = true 
-        cycles = []
-        back    = Proc.new { |e|
-            cycles << e
-            go = false
-        }
-        push    = Proc.new { |v| result.unshift(v) if go}
-        start   ||= vertices[0]
-        dfs({:exit_vertex => push, :back_edge => back, :start => start})
-        if block_given?
-            result.each {|v| yield(v) }
-        end
-
-        if cycles.length > 0
-            msg = "Found cycles in the following relationships:"
-            cycles.each { |edge| msg += " %s => %s" % [edge.source, edge.target] }
-            raise Puppet::Error, msg
-        end
-        return result
-    end
-
-    def to_yaml_properties
-        instance_variables
-    end
 
     # A different way of walking a tree, and a much faster way than the
     # one that comes with GRATR.
-    def tree_from_vertex2(start, direction = :out)
+    def tree_from_vertex(start, direction = :out)
         predecessor={}
         walk(start, direction) do |parent, child|
             predecessor[child] = parent
         end
         predecessor       
     end
-
-    # A support method for tree_from_vertex2.  Just walk the tree and pass
-    # the parents and children.
-    def walk(source, direction, &block)
-        adjacent(source, :direction => direction).each do |target|
-            yield source, target
-            walk(target, direction, &block)
-        end
-    end
 end
diff --git a/lib/puppet/provider/interface/redhat.rb b/lib/puppet/provider/interface/redhat.rb
index aa21762..4a9fcb4 100644
--- a/lib/puppet/provider/interface/redhat.rb
+++ b/lib/puppet/provider/interface/redhat.rb
@@ -5,7 +5,7 @@ Puppet::Type.type(:interface).provide(:redhat) do
     desc "Manage network interfaces on Red Hat operating systems.  This provider
         parses and generates configuration files in ``/etc/sysconfig/network-scripts``."
 
-	INTERFACE_DIR = "/etc/sysconfig/network-scripts"
+    INTERFACE_DIR = "/etc/sysconfig/network-scripts"
     confine :exists => INTERFACE_DIR
     defaultfor :operatingsystem => [:fedora, :centos, :redhat]
 
@@ -43,52 +43,52 @@ NETMASK=<%= self.netmask %>
 BROADCAST=
 LOOPBACKDUMMY
 
-	# maximum number of dummy interfaces
-	@max_dummies = 10
+    # maximum number of dummy interfaces
+    @max_dummies = 10
 
-	# maximum number of aliases per interface
-	@max_aliases_per_iface = 10
+    # maximum number of aliases per interface
+    @max_aliases_per_iface = 10
 
-	@@dummies = []
-	@@aliases = Hash.new { |hash, key| hash[key] = [] }
+    @@dummies = []
+    @@aliases = Hash.new { |hash, key| hash[key] = [] }
 
-	# calculate which dummy interfaces are currently already in
-	# use prior to needing to call self.next_dummy later on.
-	def self.instances
-		# parse all of the config files at once
-		Dir.glob("%s/ifcfg-*" % INTERFACE_DIR).collect do |file|
-			record = parse(file)
+    # calculate which dummy interfaces are currently already in
+    # use prior to needing to call self.next_dummy later on.
+    def self.instances
+        # parse all of the config files at once
+        Dir.glob("%s/ifcfg-*" % INTERFACE_DIR).collect do |file|
+            record = parse(file)
 
-			# store the existing dummy interfaces
+            # store the existing dummy interfaces
             @@dummies << record[:ifnum] if (record[:interface_type] == :dummy and ! @@dummies.include?(record[:ifnum]))
 
             @@aliases[record[:interface]] << record[:ifnum] if record[:interface_type] == :alias
 
             new(record)
-		end
-	end
-
-	# return the next avaliable dummy interface number, in the case where
-	# ifnum is not manually specified
-	def self.next_dummy
-		@max_dummies.times do |i|
-			unless @@dummies.include?(i.to_s)
-				@@dummies << i.to_s
-				return i.to_s
-			end
-		end
-	end
-
-	# return the next available alias on a given interface, in the case
-	# where ifnum if not manually specified
-	def self.next_alias(interface)
-		@max_aliases_per_iface.times do |i|
-			unless @@aliases[interface].include?(i.to_s)
-				@@aliases[interface] << i.to_s
-				return i.to_s
-			end
-		end
-	end
+        end
+    end
+
+    # return the next avaliable dummy interface number, in the case where
+    # ifnum is not manually specified
+    def self.next_dummy
+        @max_dummies.times do |i|
+            unless @@dummies.include?(i.to_s)
+                @@dummies << i.to_s
+                return i.to_s
+            end
+        end
+    end
+
+    # return the next available alias on a given interface, in the case
+    # where ifnum if not manually specified
+    def self.next_alias(interface)
+        @max_aliases_per_iface.times do |i|
+            unless @@aliases[interface].include?(i.to_s)
+                @@aliases[interface] << i.to_s
+                return i.to_s
+            end
+        end
+    end
 
     # base the ifnum, for dummy / loopback interface in linux
     # on the last octect of the IP address
@@ -139,14 +139,14 @@ LOOPBACKDUMMY
     # on whether we are adding an alias to a real interface, or a loopback
     # address (also dummy) on linux. For linux it's quite involved, and we
     # will use an ERB template
-	def generate
+    def generate
         itype = self.interface_type == :alias ? :alias : :normal
         self.class.template(itype).result(binding)
-	end
+    end
 
     # Where should the file be written out?
-	# This defaults to INTERFACE_DIR/ifcfg-<namevar>, but can have a
-	# more symbolic name by setting interface_desc in the type. 
+    # This defaults to INTERFACE_DIR/ifcfg-<namevar>, but can have a
+    # more symbolic name by setting interface_desc in the type. 
     def file_path
         if resource and val = resource[:interface_desc]
             desc = val
@@ -185,16 +185,16 @@ LOOPBACKDUMMY
         end
     end
 
-	# create the device name, so this based on the IP, and interface + type
-	def device
-		case @resource.should(:interface_type)
-		when :loopback
-			@property_hash[:ifnum] ||= self.class.next_dummy
-        	return "dummy" + @property_hash[:ifnum]
-		when :alias
-			@property_hash[:ifnum] ||= self.class.next_alias(@resource[:interface])
-        	return @resource[:interface] + ":" + @property_hash[:ifnum]
-		end
+    # create the device name, so this based on the IP, and interface + type
+    def device
+        case @resource.should(:interface_type)
+        when :loopback
+            @property_hash[:ifnum] ||= self.class.next_dummy
+            return "dummy" + @property_hash[:ifnum]
+        when :alias
+            @property_hash[:ifnum] ||= self.class.next_alias(@resource[:interface])
+            return @resource[:interface] + ":" + @property_hash[:ifnum]
+        end
     end
 
     # Set the name to our ip address.
@@ -202,19 +202,19 @@ LOOPBACKDUMMY
         @property_hash[:name] = value
     end
 
-	# whether the device is to be brought up on boot or not. converts
-	# the true / false of the type, into yes / no values respectively
-	# writing out the ifcfg-* files
-	def on_boot
-		case @property_hash[:onboot].to_s
-		when "true"
-			return "yes"
-		when "false"
-			return "no"
-		else
-			return "neither"
-		end
-	end
+    # whether the device is to be brought up on boot or not. converts
+    # the true / false of the type, into yes / no values respectively
+    # writing out the ifcfg-* files
+    def on_boot
+        case @property_hash[:onboot].to_s
+        when "true"
+            return "yes"
+        when "false"
+            return "no"
+        else
+            return "neither"
+        end
+    end
 
     # Mark whether the interface should be started on boot.
     def on_boot=(value)
diff --git a/lib/puppet/provider/mount/parsed.rb b/lib/puppet/provider/mount/parsed.rb
index 2090833..9bc1cf5 100755
--- a/lib/puppet/provider/mount/parsed.rb
+++ b/lib/puppet/provider/mount/parsed.rb
@@ -14,7 +14,7 @@ Puppet::Type.type(:mount).provide(:parsed,
     :filetype => :flat
 ) do
     include Puppet::Provider::Mount
-    confine :exists => fstab
+    #confine :exists => fstab
 
     commands :mountcmd => "mount", :umount => "umount"
 
diff --git a/lib/puppet/provider/naginator.rb b/lib/puppet/provider/naginator.rb
new file mode 100644
index 0000000..8e8a3d6
--- /dev/null
+++ b/lib/puppet/provider/naginator.rb
@@ -0,0 +1,55 @@
+#  Created by Luke Kanies on 2007-11-27.
+#  Copyright (c) 2007. All rights reserved.
+
+require 'puppet'
+require 'puppet/provider/parsedfile'
+require 'puppet/external/nagios'
+
+# The base class for all Naginator providers.
+class Puppet::Provider::Naginator < Puppet::Provider::ParsedFile
+    # Retrieve the associated class from Nagios::Base.
+    def self.nagios_type
+        unless defined?(@nagios_type) and @nagios_type
+            name = resource_type.name.to_s.sub(/^nagios_/, '')
+            unless @nagios_type = Nagios::Base.type(name.to_sym)
+                raise Puppet::DevError, "Could not find nagios type '%s'" % name
+            end
+
+            # And add our 'ensure' settings, since they aren't a part of
+            # Naginator by default
+            @nagios_type.send(:attr_accessor, :ensure, :target, :on_disk)
+        end
+        @nagios_type
+    end
+
+    def self.parse(text)
+        Nagios::Parser.new.parse(text)
+    end
+
+    def self.to_file(records)
+        header + records.collect { |record| record.to_s }.join("\n")
+    end
+
+    def self.skip_record?(record)
+        false
+    end
+
+    def self.valid_attr?(klass, attr_name)
+        nagios_type.parameters.include?(attr_name)
+    end
+
+    def initialize(resource = nil)
+        if resource.is_a?(Nagios::Base)
+            # We don't use a duplicate here, because some providers (ParsedFile, at least)
+            # use the hash here for later events.
+            @property_hash = resource
+        elsif resource
+            @resource = resource if resource
+            # LAK 2007-05-09: Keep the model stuff around for backward compatibility
+            @model = resource
+            @property_hash = self.class.nagios_type.new
+        else
+            @property_hash = self.class.nagios_type.new
+        end
+    end
+end
diff --git a/lib/puppet/provider/nameservice/directoryservice.rb b/lib/puppet/provider/nameservice/directoryservice.rb
index b2ccfbd..e2e68b2 100644
--- a/lib/puppet/provider/nameservice/directoryservice.rb
+++ b/lib/puppet/provider/nameservice/directoryservice.rb
@@ -139,10 +139,12 @@ class DirectoryService < Puppet::Provider::NameService
         dscl_output.split("\n").each do |line|
             # JJM: Split the attribute name and the list of values.
             ds_attribute, ds_values_string = line.split(':')
+
+            # Split sets the values to nil if there's nothing after the :
+            ds_values_string ||= ""
             
             # JJM: skip this attribute line if the Puppet::Type doesn't care about it.
-            next unless (@@ds_to_ns_attribute_map.keys.include?(ds_attribute) \
-                and type_properties.include? @@ds_to_ns_attribute_map[ds_attribute])
+            next unless (@@ds_to_ns_attribute_map.keys.include?(ds_attribute) and type_properties.include? @@ds_to_ns_attribute_map[ds_attribute])
 
             # JJM: We asked dscl to output url encoded values so we're able
             #     to machine parse on whitespace.  We need to urldecode:
@@ -178,11 +180,8 @@ class DirectoryService < Puppet::Provider::NameService
         #     This method spits out proper DSCL commands for us.
         #     We EXPECT name to be @resource[:name] when called from an instance object.
 
-        # JJM: With dscl, the domain "/" is always the default local domain.
-        #      The domain /Search will search all domains, and you may
-        #      get at specific domains with /LDAPv3/server1.foobar.com,
-        #      /LDAPv3/server2.foobar.com, etc...
-        command_vector = [ command(:dscl), "-url", "/" ]
+        # There are two ways to specify paths in 10.5.  See man dscl.
+        command_vector = [ command(:dscl), "-url", "." ]
         # JJM: The actual action to perform.  See "man dscl"
         #      Common actiosn: -create, -delete, -merge, -append, -passwd
         command_vector << ds_action
diff --git a/lib/puppet/provider/package/fink.rb b/lib/puppet/provider/package/fink.rb
index e0933df..030e1a3 100755
--- a/lib/puppet/provider/package/fink.rb
+++ b/lib/puppet/provider/package/fink.rb
@@ -9,8 +9,6 @@ Puppet::Type.type(:package).provide :fink, :parent => :dpkg, :source => :dpkg do
     commands :aptcache => "/sw/bin/apt-cache"
     commands :dpkgquery => "/sw/bin/dpkg-query"
 
-    defaultfor :operatingsystem => :darwin
-
     has_feature :versionable
 
     # A derivative of DPKG; this is how most people actually manage
diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index 6e777a7..bb09bc5 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -23,14 +23,14 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
         end
 
         begin
-            list = execute(command).split("\n\n").collect do |set|
+            list = execute(command).split("\n").collect do |set|
                 if gemhash = gemsplit(set)
                     gemhash[:provider] = :gem
                     gemhash
                 else
                     nil
                 end
-            end.reject { |p| p.nil? }
+            end.compact
         rescue Puppet::ExecutionFailure => detail
             raise Puppet::Error, "Could not list gems: %s" % detail
         end
@@ -44,8 +44,8 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
 
     def self.gemsplit(desc)
         case desc
-        when /^\*\*\*/: return nil
-        when /^(\S+)\s+\((.+)\)\n/
+        when /^\*\*\*/, /^\s*$/, /^\s+/; return nil
+        when /^(\S+)\s+\((.+)\)/
             name = $1
             version = $2.split(/,\s*/)[0]
             return {
@@ -78,7 +78,11 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
             command << @resource[:name]
         end
 
-        gemcmd(*command)
+        output = gemcmd(*command)
+        # Apparently some stupid gem versions don't exit non-0 on failure
+        if output.include?("ERROR")
+            self.fail "Could not install: %s" % output.chomp
+        end
     end
 
     def latest
diff --git a/lib/puppet/provider/package/openbsd.rb b/lib/puppet/provider/package/openbsd.rb
index ce69dd4..f76c371 100755
--- a/lib/puppet/provider/package/openbsd.rb
+++ b/lib/puppet/provider/package/openbsd.rb
@@ -66,7 +66,7 @@ Puppet::Type.type(:package).provide :openbsd, :parent => Puppet::Provider::Packa
         info = pkginfo @resource[:name]
 
         # Search for the version info
-        if info =~ /Information for #{@resource[:name]}-(\S+)/
+        if info =~ /Information for (inst:)?#{@resource[:name]}-(\S+)/
             hash[:ensure] = $1
         else
             return nil
diff --git a/lib/puppet/provider/package/pkgdmg.rb b/lib/puppet/provider/package/pkgdmg.rb
index b7601cd..2614d09 100644
--- a/lib/puppet/provider/package/pkgdmg.rb
+++ b/lib/puppet/provider/package/pkgdmg.rb
@@ -87,10 +87,8 @@ Example usage::
 
 **WARNING**: Because I assume files will be downloaded to /tmp, the current
 implementation attempts to delete DMG files if you install directly from the
-file system and not via a URL method.
-"
+file system and not via a URL method."
   
-
     confine :exists => "/Library/Receipts"
     commands :installer => "/usr/sbin/installer"
     commands :hdiutil => "/usr/bin/hdiutil"
@@ -147,11 +145,8 @@ file system and not via a URL method.
         begin
             open(cached_source) do |dmg|
                 xml_str = hdiutil "mount", "-plist", "-nobrowse", "-readonly", "-noidme", "-mountrandom", "/tmp", dmg.path
-                ptable = Plist::parse_xml xml_str
-                # JJM Filter out all mount-paths into a single array, discard the rest.
-                mounts = ptable['system-entities'].collect { |entity|
-                    entity['mount-point']
-                }.select { |mountloc|; mountloc }
+                # JJM THIS IS A HORRIBLE HACK (Well, actually it's not so bad...)
+                mounts = xml_str.scan(/<string>(\/tmp.*?)<\/string>/)[0]
                 begin
                     mounts.each do |fspath|
                         Dir.entries(fspath).select { |f|
diff --git a/lib/puppet/provider/package/portage.rb b/lib/puppet/provider/package/portage.rb
index 03274a7..f795d03 100644
--- a/lib/puppet/provider/package/portage.rb
+++ b/lib/puppet/provider/package/portage.rb
@@ -10,8 +10,8 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
     defaultfor :operatingsystem => :gentoo
 
     def self.instances
-        result_format = /(\S+) (\S+) \[([^\[]*)(\[[^\]]*\])?\] \[[^0-9]*([^\s:\[]*)(\[[^\]]*\])?(:\S*)?\] ([\S]*) (.*)/
-        result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :overlay, :slot, :vendor, :description]
+        result_format = /(\S+) (\S+) \[(?:([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\([^\)]+\))?(?:\[([^\]]+)\])?[ ]*)*\] \[(?:(?:\{M\})?(?:\([~*]+\))?([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\(([^\)]+)\))?(?:![mf])*(?:\[([^\]]+)\])?)?\] ([\S]*) (.*)/
+        result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :slot, :overlay, :vendor, :description]
 
         search_format = "{installedversionsshort}<category> <name> [<installedversionsshort>] [<best>] <homepage> <description>{}"
 
@@ -39,7 +39,7 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
 
             return packages
         rescue Puppet::ExecutionFailure => detail
-            raise Puppet::PackageError.new(detail)
+            raise Puppet::Error.new(detail)
         end
     end
 
@@ -67,8 +67,8 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
     end
 
     def query
-        result_format = /(\S+) (\S+) \[([^\[]*)(\[[^\]]*\])?\] \[[^0-9]*([^\s:\[]*)(\[[^\]]*\])?(:\S*)?\] ([\S]*) (.*)/
-        result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :overlay, :slot, :vendor, :description]
+        result_format = /(\S+) (\S+) \[(?:([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\([^\)]+\))?(?:\[([^\]]+)\])?[ ]*)*\] \[(?:(?:\{M\})?(?:\([~*]+\))?([0-9.a-zA-Z]+(?:_(?:alpha|beta|pre|rc|p)[0-9]*)*(?:-r[0-9]*)?)(?:\(([^\)]+)\))?(?:![mf])*(?:\[([^\]]+)\])?)?\] ([\S]*) (.*)/
+        result_fields = [:category, :name, :ensure, :ensure_overlay, :version_available, :slot, :overlay, :vendor, :description]
 
         search_field = @resource[:category] ? "--category-name" : "--name"
         search_value = package_name
@@ -99,14 +99,14 @@ Puppet::Type.type(:package).provide :portage, :parent => Puppet::Provider::Packa
             case packages.size
                 when 0
 		    not_found_value = "%s/%s" % [@resource[:category] ? @resource[:category] : "<unspecified category>", @resource[:name]]
-                    raise Puppet::PackageError.new("No package found with the specified name [#{not_found_value}]")
+                    raise Puppet::Error.new("No package found with the specified name [#{not_found_value}]")
                 when 1
                     return packages[0]
                 else
-                    raise Puppet::PackageError.new("More than one package with the specified name [#{search_value}], please use the category parameter to disambiguate")
+                    raise Puppet::Error.new("More than one package with the specified name [#{search_value}], please use the category parameter to disambiguate")
             end
         rescue Puppet::ExecutionFailure => detail
-            raise Puppet::PackageError.new(detail)
+            raise Puppet::Error.new(detail)
         end
     end
 
diff --git a/lib/puppet/provider/package/yumhelper.py b/lib/puppet/provider/package/yumhelper.py
index 1142401..962b96c 100644
--- a/lib/puppet/provider/package/yumhelper.py
+++ b/lib/puppet/provider/package/yumhelper.py
@@ -13,8 +13,7 @@ OVERRIDE_OPTS = {
     'logfile': '/dev/null'
 }
 
-def pkg_lists():
-    my = yum.YumBase()
+def pkg_lists(my):
     my.doConfigSetup()
 
     for k in OVERRIDE_OPTS.keys():
@@ -28,10 +27,13 @@ def pkg_lists():
     return my.doPackageLists('updates')
 
 try:
-    ypl = pkg_lists()
+    try:
+        my = yum.YumBase()
+        ypl = pkg_lists(my)
+        for pkg in ypl.updates:
+            print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch)
+    finally:
+        my.closeRpmDB()
 except IOError, e:
     print "_err IOError %d %s" % (e.errno, e)
     sys.exit(1)
-    
-for pkg in ypl.updates:
-    print "_pkg %s %s %s %s %s" % (pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch)
diff --git a/lib/puppet/provider/parsedfile.rb b/lib/puppet/provider/parsedfile.rb
index 76654c4..b4a4a3b 100755
--- a/lib/puppet/provider/parsedfile.rb
+++ b/lib/puppet/provider/parsedfile.rb
@@ -180,7 +180,7 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
             matchers = resources.dup
             @records.each do |record|
                 # Skip things like comments and blank lines
-                next if record_type(record[:record_type]).text?
+                next if skip_record?(record)
 
                 if name = record[:name] and resource = resources[name]
                     resource.provider = new(record)
@@ -243,6 +243,12 @@ class Puppet::Provider::ParsedFile < Puppet::Provider
         end
     end
 
+    # Should we skip the record?  Basically, we skip text records.
+    # This is only here so subclasses can override it.
+    def self.skip_record?(record)
+        record_type(record[:record_type]).text?
+    end
+
     # Initialize the object if necessary.
     def self.target_object(target)
         @target_objects[target] ||= filetype.new(target)
diff --git a/lib/puppet/provider/service/debian.rb b/lib/puppet/provider/service/debian.rb
index 233242a..e54fb13 100755
--- a/lib/puppet/provider/service/debian.rb
+++ b/lib/puppet/provider/service/debian.rb
@@ -14,6 +14,7 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
     # Remove the symlinks
     def disable
         update "-f", @resource[:name], "remove"
+        update @resource[:name], "stop 1 2 3 4 5 6 ."
     end
 
     def enabled?
@@ -29,6 +30,7 @@ Puppet::Type.type(:service).provide :debian, :parent => :init do
     end
 
     def enable
+        update "-f", @resource[:name], "remove"
         update @resource[:name], "defaults"
     end
 end
diff --git a/lib/puppet/provider/service/gentoo.rb b/lib/puppet/provider/service/gentoo.rb
index 2dcc3e9..adbee69 100644
--- a/lib/puppet/provider/service/gentoo.rb
+++ b/lib/puppet/provider/service/gentoo.rb
@@ -8,6 +8,10 @@ Puppet::Type.type(:service).provide :gentoo, :parent => :init do
 
     defaultfor :operatingsystem => :gentoo
 
+    def self.defpath
+        superclass.defpath
+    end
+
     def disable
         begin
             output = update :del, @resource[:name], :default
diff --git a/lib/puppet/provider/service/init.rb b/lib/puppet/provider/service/init.rb
index d9919f5..274c334 100755
--- a/lib/puppet/provider/service/init.rb
+++ b/lib/puppet/provider/service/init.rb
@@ -110,7 +110,7 @@ Puppet::Type.type(:service).provide :init, :parent => :base do
     # we just return that; otherwise, we return false, which causes it to
     # fallback to other mechanisms.
     def statuscmd
-        if @resource[:hasstatus]
+        if @resource[:hasstatus] == :true
             return [self.initscript, :status]
         else
             return false
diff --git a/lib/puppet/provider/sshkey/parsed.rb b/lib/puppet/provider/sshkey/parsed.rb
index cb1010c..6f7d98f 100755
--- a/lib/puppet/provider/sshkey/parsed.rb
+++ b/lib/puppet/provider/sshkey/parsed.rb
@@ -12,6 +12,8 @@ Puppet::Type.type(:sshkey).provide(:parsed,
     :default_target => known,
     :filetype => :flat
 ) do
+    desc "Parse and generate host-wide known hosts files for SSH."
+
     text_line :comment, :match => /^#/
     text_line :blank, :match => /^\s+/
 
diff --git a/lib/puppet/provider/user/useradd.rb b/lib/puppet/provider/user/useradd.rb
index c247620..9ecaad8 100644
--- a/lib/puppet/provider/user/useradd.rb
+++ b/lib/puppet/provider/user/useradd.rb
@@ -19,7 +19,7 @@ Puppet::Type.type(:user).provide :useradd, :parent => Puppet::Provider::NameServ
 
     has_features :manages_homedir, :allows_duplicates
 
-    if Puppet.features.libshadow? and (Facter.value(:kernel) == "Linux")
+    if Puppet.features.libshadow?
         has_feature :manages_passwords
     end
 
diff --git a/lib/puppet/rails.rb b/lib/puppet/rails.rb
index a1192bf..a021c77 100644
--- a/lib/puppet/rails.rb
+++ b/lib/puppet/rails.rb
@@ -91,6 +91,10 @@ module Puppet::Rails
             raise Puppet::Error, "Could not find Puppet::Rails database dir"
         end
 
+        unless ActiveRecord::Base.connection.tables.include?("resources")
+            raise Puppet::Error, "Database has problems, can't migrate."
+        end    
+
         Puppet.notice "Migrating"
 
         begin
diff --git a/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb b/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb
new file mode 100644
index 0000000..71ee6ae
--- /dev/null
+++ b/lib/puppet/rails/database/001_add_created_at_to_all_tables.rb
@@ -0,0 +1,17 @@
+class AddCreatedAtToAllTables < ActiveRecord::Migration
+  def self.up
+    ActiveRecord::Base.connection.tables.each do |t|
+      unless ActiveRecord::Base.connection.columns(t).collect {|c| c.name}.include?("created_at")
+        add_column t.to_s, :created_at, :datetime 
+      end  
+    end 
+  end
+
+  def self.down
+    ActiveRecord::Base.connection.tables.each do |t|
+      unless ActiveRecord::Base.connection.columns(t).collect {|c| c.name}.include?("created_at")
+        remove_column t.to_s, :created_at
+      end  
+    end  
+  end
+end
diff --git a/lib/puppet/rails/external/tagging/acts_as_taggable.rb b/lib/puppet/rails/external/tagging/acts_as_taggable.rb
deleted file mode 100644
index 7fd7f6b..0000000
--- a/lib/puppet/rails/external/tagging/acts_as_taggable.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-module ActiveRecord
-  module Acts #:nodoc:
-    module Taggable #:nodoc:
-      def self.included(base)
-        base.extend(ClassMethods)  
-      end
-      
-      module ClassMethods
-        def acts_as_taggable(options = {})
-          write_inheritable_attribute(:acts_as_taggable_options, {
-            :taggable_type => ActiveRecord::Base.send(:class_name_of_active_record_descendant, self).to_s,
-            :from => options[:from]
-          })
-          
-          class_inheritable_reader :acts_as_taggable_options
-
-          has_many :taggings, :as => :taggable, :dependent => :destroy
-          has_many :tags, :through => :taggings
-
-          include ActiveRecord::Acts::Taggable::InstanceMethods
-          extend ActiveRecord::Acts::Taggable::SingletonMethods          
-        end
-      end
-      
-      module SingletonMethods
-        def find_tagged_with(list)
-          find_by_sql([
-            "SELECT #{table_name}.* FROM #{table_name}, tags, taggings " +
-            "WHERE #{table_name}.#{primary_key} = taggings.taggable_id " +
-            "AND taggings.taggable_type = ? " +
-            "AND taggings.tag_id = tags.id AND tags.name IN (?)",
-            acts_as_taggable_options[:taggable_type], list
-          ])
-        end
-        def tags(options = {})
-          options.merge!(:taggable_type => self.to_s)
-          Tag.tags(options)
-        end
-      end
-      
-      module InstanceMethods
-        def tag_with(list)
-          Tag.transaction do
-            taggings.destroy_all
-
-            Tag.parse(list).each do |name|
-              if acts_as_taggable_options[:from]
-                send(acts_as_taggable_options[:from]).tags.find_or_create_by_name(name).on(self)
-              else
-                Tag.find_or_create_by_name(name).on(self)
-              end
-            end
-          end
-        end
-
-        def tag_list
-          tags.collect { |tag| tag.name.include?(" ") ? "'#{tag.name}'" : tag.name }.join(" ")
-        end
-      end
-    end
-  end
-end
diff --git a/lib/puppet/rails/external/tagging/init.rb b/lib/puppet/rails/external/tagging/init.rb
deleted file mode 100644
index 5069d80..0000000
--- a/lib/puppet/rails/external/tagging/init.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'puppet/rails/external/tagging/acts_as_taggable'
-ActiveRecord::Base.send(:include, ActiveRecord::Acts::Taggable)
-
-require 'puppet/rails/external/tagging/tagging'
-require 'puppet/rails/external/tagging/tag'
diff --git a/lib/puppet/rails/external/tagging/tag.rb b/lib/puppet/rails/external/tagging/tag.rb
deleted file mode 100644
index c6bf4ca..0000000
--- a/lib/puppet/rails/external/tagging/tag.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-class Tag < ActiveRecord::Base
-  has_many :taggings
-
-  def self.tags(options = {})
-    query = "select tags.id, name, count(*) as count"
-    query << " from taggings, tags"
-    query << " where tags.id = tag_id"
-    query << " group by tag_id"
-    query << " order by #{options[:order]}" if options[:order] != nil
-    query << " limit #{options[:limit]}" if options[:limit] != nil
-    tags = Tag.find_by_sql(query)
-  end
-
-  def self.parse(list)
-    tag_names = []
-
-    # first, pull out the quoted tags
-    list.gsub!(/\"(.*?)\"\s*/ ) { tag_names << $1; "" }
-
-    # then, replace all commas with a space
-    list.gsub!(/,/, " ")
-
-    # then, get whatever's left
-    tag_names.concat list.split(/\s/)
-
-    # strip whitespace from the names
-    tag_names = tag_names.map { |t| t.strip }
-
-    # delete any blank tag names
-    tag_names = tag_names.delete_if { |t| t.empty? }
-    
-    return tag_names
-  end
-
-  def tagged
-    @tagged ||= taggings.collect { |tagging| tagging.taggable }
-  end
-  
-  def on(taggable)
-    taggings.build :taggable => taggable
-  end
-  
-  def ==(comparison_object)
-    super || name == comparison_object.to_s
-  end
-  
-  def to_s
-    name
-  end
-end
diff --git a/lib/puppet/rails/external/tagging/tagging.rb b/lib/puppet/rails/external/tagging/tagging.rb
deleted file mode 100644
index e06e88a..0000000
--- a/lib/puppet/rails/external/tagging/tagging.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-class Tagging < ActiveRecord::Base
-  belongs_to :tag
-  belongs_to :taggable, :polymorphic => true
-
-  def self.tagged_class(taggable)
-    ActiveRecord::Base.send(:class_name_of_active_record_descendant, taggable.class).to_s
-  end
-  
-  def self.find_taggable(tagged_class, tagged_id)
-    tagged_class.constantize.find(tagged_id)
-  end
-end
\ No newline at end of file
diff --git a/lib/puppet/rails/fact_value.rb b/lib/puppet/rails/fact_value.rb
index 0eb70be..b53591d 100644
--- a/lib/puppet/rails/fact_value.rb
+++ b/lib/puppet/rails/fact_value.rb
@@ -1,6 +1,10 @@
 class Puppet::Rails::FactValue < ActiveRecord::Base
     belongs_to :fact_name
     belongs_to :host
+
+    def to_label
+      "#{self.fact_name.name}"
+    end  
 end
 
 # $Id: fact_value.rb 1952 2006-12-19 05:47:57Z luke $
diff --git a/lib/puppet/rails/host.rb b/lib/puppet/rails/host.rb
index 72898fd..626edaa 100644
--- a/lib/puppet/rails/host.rb
+++ b/lib/puppet/rails/host.rb
@@ -11,8 +11,7 @@ class Puppet::Rails::Host < ActiveRecord::Base
 
     has_many :fact_values, :dependent => :destroy
     has_many :fact_names, :through => :fact_values
-    belongs_to :puppet_classes
-    has_many :source_files
+    belongs_to :source_file
     has_many :resources,
         :include => :param_values,
         :dependent => :destroy
diff --git a/lib/puppet/rails/param_value.rb b/lib/puppet/rails/param_value.rb
index 02c29c5..fc00a43 100644
--- a/lib/puppet/rails/param_value.rb
+++ b/lib/puppet/rails/param_value.rb
@@ -20,5 +20,9 @@ class Puppet::Rails::ParamValue < ActiveRecord::Base
             self[:value] = val
         end
     end
+
+    def to_label
+      "#{self.param_name.name}"
+    end  
 end
 
diff --git a/lib/puppet/rails/puppet_class.rb b/lib/puppet/rails/puppet_class.rb
deleted file mode 100644
index 35cef89..0000000
--- a/lib/puppet/rails/puppet_class.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-class Puppet::Rails::PuppetClass < ActiveRecord::Base
-    has_many :resources
-    has_many :source_files
-    has_many :hosts
-end
-
diff --git a/lib/puppet/rails/resource_tag.rb b/lib/puppet/rails/resource_tag.rb
index d067118..f9694e0 100644
--- a/lib/puppet/rails/resource_tag.rb
+++ b/lib/puppet/rails/resource_tag.rb
@@ -1,4 +1,8 @@
 class Puppet::Rails::ResourceTag < ActiveRecord::Base
     belongs_to :puppet_tag
     belongs_to :resource
+
+    def to_label
+      "#{self.puppet_tag.name}"
+    end  
 end
diff --git a/lib/puppet/rails/source_file.rb b/lib/puppet/rails/source_file.rb
index 51d1b1f..3ccf87a 100644
--- a/lib/puppet/rails/source_file.rb
+++ b/lib/puppet/rails/source_file.rb
@@ -1,5 +1,8 @@
 class Puppet::Rails::SourceFile < ActiveRecord::Base
     has_one :host
-    has_one :puppet_class
     has_one :resource
+
+    def to_label
+      "#{self.filename}"
+    end  
 end
diff --git a/lib/puppet/reference/node_source.rb b/lib/puppet/reference/node_source.rb
deleted file mode 100644
index 29a01f8..0000000
--- a/lib/puppet/reference/node_source.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-require 'puppet/node'
-
-noderef = Puppet::Util::Reference.newreference :node_source, :doc => "Sources of node configuration information" do
-    Puppet::Network::Handler.node.docs
-end
-
-noderef.header = "
-Nodes can be searched for in different locations.  This document describes those different locations.
-"
diff --git a/lib/puppet/reference/report.rb b/lib/puppet/reference/report.rb
deleted file mode 100644
index a8086f8..0000000
--- a/lib/puppet/reference/report.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-report = Puppet::Util::Reference.newreference :report, :doc => "All available transaction reports" do
-    Puppet::Network::Handler.report.reportdocs
-end
-
-report.header = "
-Puppet clients can report back to the server after each transaction.  This
-transaction report is sent as a YAML dump of the
-``Puppet::Transaction::Report`` class and includes every log message that was
-generated during the transaction along with as many metrics as Puppet knows how
-to collect.  See `ReportsAndReporting Reports and Reporting`:trac:
-for more information on how to use reports.
-
-Currently, clients default to not sending in reports; you can enable reporting
-by setting the ``report`` parameter to true.
-
-To use a report, set the ``reports`` parameter on the server; multiple
-reports must be comma-separated.  You can also specify ``none`` to disable
-reports entirely.
-
-Puppet provides multiple report handlers that will process client reports:
-"
diff --git a/lib/puppet/relationship.rb b/lib/puppet/relationship.rb
index c611928..05b7dc3 100644
--- a/lib/puppet/relationship.rb
+++ b/lib/puppet/relationship.rb
@@ -59,7 +59,11 @@ class Puppet::Relationship
     end
     
     def ref
-        "%s => %s" % [source.ref, target.ref]
+        "%s => %s" % [source, target]
+    end
+
+    def to_s
+        ref
     end
 end
 
diff --git a/lib/puppet/reports/tagmail.rb b/lib/puppet/reports/tagmail.rb
index a2c973f..9b37111 100644
--- a/lib/puppet/reports/tagmail.rb
+++ b/lib/puppet/reports/tagmail.rb
@@ -28,6 +28,10 @@ Puppet::Reports.register_report(:tagmail) do
 
         This will send all messages to ``me at domain.com``, and all messages from
         webservers that are not also from mailservers to ``httpadmins at domain.com``.
+
+        If you are using anti-spam controls, such as grey-listing, on your mail 
+        server you should whitelist the sending email (controlled by ``reportform`` 
+        configuration option) to ensure your email is not discarded as spam.  
         "
 
 
@@ -127,7 +131,14 @@ Puppet::Reports.register_report(:tagmail) do
                     Net::SMTP.start(Puppet[:smtpserver]) do |smtp|
                         reports.each do |emails, messages|
                             Puppet.info "Sending report to %s" % emails.join(", ")
-                            smtp.send_message(messages, Puppet[:reportfrom], *emails)
+                            smtp.open_message_stream(Puppet[:reportfrom], *emails) do |p|
+                              p.puts "From: #{Puppet[:reportfrom]}"
+                              p.puts "Subject: Puppet Report for %s" % self.host
+                              p.puts "To: " + emails.join(", ")
+                              p.puts "Date: " + Time.now.rfc2822
+                              p.puts
+                              p.puts messages
+                            end 
                         end
                     end
                 rescue => detail
diff --git a/lib/puppet/resource_reference.rb b/lib/puppet/resource_reference.rb
index 3e92662..771a91b 100644
--- a/lib/puppet/resource_reference.rb
+++ b/lib/puppet/resource_reference.rb
@@ -36,7 +36,7 @@ class Puppet::ResourceReference
     # If the title has square brackets, treat it like a reference and
     # set things appropriately; else, just set it.
     def title=(value)
-        if value =~ /^(.+)\[(.+)\]$/
+        if value =~ /^([^\[\]]+)\[(.+)\]$/
             self.type = $1
             @title = $2
         else
diff --git a/lib/puppet/simple_graph.rb b/lib/puppet/simple_graph.rb
index c9920e6..48f393f 100644
--- a/lib/puppet/simple_graph.rb
+++ b/lib/puppet/simple_graph.rb
@@ -1,14 +1,11 @@
 #  Created by Luke A. Kanies on 2007-11-07.
 #  Copyright (c) 2007. All rights reserved.
 
-require 'puppet/external/gratr/dot'
+require 'puppet/external/dot'
 require 'puppet/relationship'
-require 'puppet/external/gratr/search'
 
 # A hopefully-faster graph class to replace the use of GRATR.
 class Puppet::SimpleGraph
-    include GRATR::Graph::Search
-
     # An internal class for handling a vertex's edges.
     class VertexWrapper
         attr_accessor :in, :out, :vertex
@@ -52,6 +49,19 @@ class Puppet::SimpleGraph
             return false
         end
 
+        # Create methods for returning the degree and edges.
+        [:in, :out].each do |direction|
+            # LAK:NOTE If you decide to create methods for directly
+            # testing the degree, you'll have to get the values and flatten
+            # the results -- you might have duplicate edges, which can give
+            # a false impression of what the degree is.  That's just
+            # as expensive as just getting the edge list, so I've decided
+            # to only add this method.
+            define_method("%s_edges" % direction) do
+                @adjacencies[direction].values.flatten
+            end
+        end
+
         # The other vertex in the edge.
         def other_vertex(direction, edge)
             case direction
@@ -66,6 +76,10 @@ class Puppet::SimpleGraph
         def remove_edge(direction, edge)
             @adjacencies[direction][other_vertex(direction, edge)].delete(edge)
         end
+
+        def to_s
+            vertex.to_s
+        end
     end
 
     def initialize
@@ -80,7 +94,7 @@ class Puppet::SimpleGraph
         @edges.clear
     end
 
-    # Whether our graph is directed.  Always true.  (Used by the GRATR search lib.)
+    # Whether our graph is directed.  Always true.  Used to produce dot files.
     def directed?
         true
     end
@@ -88,26 +102,58 @@ class Puppet::SimpleGraph
     # Return a reversed version of this graph.
     def reversal
         result = self.class.new
-        vertices.each { |vertex| result.add_vertex!(vertex) }
+        vertices.each { |vertex| result.add_vertex(vertex) }
         edges.each do |edge|
             newedge = edge.class.new(edge.target, edge.source, edge.label)
-            result.add_edge!(newedge)
+            result.add_edge(newedge)
         end
         result
     end
 
-    # Return the size of the graph. Used by GRATR.
+    # Return the size of the graph.
     def size
         @vertices.length
     end
 
-    # Return the graph as an array.  Again, used by GRATR.
+    # Return the graph as an array.
     def to_a
         @vertices.keys
     end
 
+    # Provide a topological sort.
+    def topsort
+        degree = {}
+        zeros = []
+        result = []
+
+        # Collect each of our vertices, with the number of in-edges each has.
+        @vertices.each do |name, wrapper|
+            edges = wrapper.in_edges
+            zeros << wrapper if edges.length == 0
+            degree[wrapper.vertex] = edges
+        end
+
+        # Iterate over each 0-degree vertex, decrementing the degree of
+        # each of its out-edges.
+        while wrapper = zeros.pop do
+            result << wrapper.vertex
+            wrapper.out_edges.each do |edge|
+                degree[edge.target].delete(edge)
+                zeros << @vertices[edge.target] if degree[edge.target].length == 0
+            end
+        end
+
+        # If we have any vertices left with non-zero in-degrees, then we've found a cycle.
+        if cycles = degree.find_all { |vertex, edges| edges.length > 0 } and cycles.length > 0
+            message = cycles.collect { |vertex, edges| edges.collect { |e| e.to_s }.join(", ") }.join(", ")
+            raise Puppet::Error, "Found dependency cycles in the following relationships: %s" % message
+        end
+
+        return result
+    end
+
     # Add a new vertex to the graph.
-    def add_vertex!(vertex)
+    def add_vertex(vertex)
         return false if vertex?(vertex)
         setup_vertex(vertex)
         true # don't return the VertexWrapper instance.
@@ -133,7 +179,7 @@ class Puppet::SimpleGraph
 
     # Add a new edge.  The graph user has to create the edge instance,
     # since they have to specify what kind of edge it is.
-    def add_edge!(source, target = nil, label = nil)
+    def add_edge(source, target = nil, label = nil)
         if target
             edge = Puppet::Relationship.new(source, target, label)
         else
@@ -195,6 +241,27 @@ class Puppet::SimpleGraph
     end
  
     public
+    
+#    # For some reason, unconnected vertices do not show up in
+#    # this graph.
+#    def to_jpg(path, name)
+#        gv = vertices()
+#        Dir.chdir(path) do
+#            induced_subgraph(gv).write_to_graphic_file('jpg', name)
+#        end
+#    end
+
+    def to_yaml_properties
+        instance_variables
+    end
+
+    # Just walk the tree and pass each edge.
+    def walk(source, direction, &block)
+        adjacent(source, :direction => direction).each do |target|
+            yield source, target
+            walk(target, direction, &block)
+        end
+    end
 
     # LAK:FIXME This is just a paste of the GRATR code with slight modifications.
 
diff --git a/lib/puppet/sslcertificates.rb b/lib/puppet/sslcertificates.rb
index bd0ce8c..0c579d0 100755
--- a/lib/puppet/sslcertificates.rb
+++ b/lib/puppet/sslcertificates.rb
@@ -72,7 +72,7 @@ module Puppet::SSLCertificates
                 subject_alt_name << 'DNS:' + name.sub(/^[^.]+./, "puppet.") # add puppet.domain as an alias
             end
             key_usage = %w{digitalSignature keyEncipherment}
-            ext_key_usage = %w{serverAuth clientAuth}
+            ext_key_usage = %w{serverAuth clientAuth emailProtection}
         when :ocsp:
             basic_constraint = "CA:FALSE"
             key_usage = %w{nonRepudiation digitalSignature}
diff --git a/lib/puppet/sslcertificates/ca.rb b/lib/puppet/sslcertificates/ca.rb
index a3edd2c..7386318 100644
--- a/lib/puppet/sslcertificates/ca.rb
+++ b/lib/puppet/sslcertificates/ca.rb
@@ -194,8 +194,8 @@ class Puppet::SSLCertificates::CA
     # Revoke the certificate with serial number SERIAL issued by this
     # CA. The REASON must be one of the OpenSSL::OCSP::REVOKED_* reasons
     def revoke(serial, reason = OpenSSL::OCSP::REVOKED_STATUS_KEYCOMPROMISE)
-        if @config[:cacrl] == 'none'
-            raise Puppet::Error, "Revocation requires a CRL, but ca_crl is set to 'none'"
+        if @config[:cacrl] == 'false'
+            raise Puppet::Error, "Revocation requires a CRL, but ca_crl is set to 'false'"
         end
         time = Time.now
         revoked = OpenSSL::X509::Revoked.new
@@ -238,33 +238,6 @@ class Puppet::SSLCertificates::CA
         }
     end
 
-    # Create an exclusive lock for reading and writing, and do the
-    # writing in a tmp file.
-    def readwritelock(file, mode = 0600)
-        tmpfile = file + ".tmp"
-        sync = Sync.new
-        unless FileTest.directory?(File.dirname(tmpfile))
-            raise Puppet::DevError, "Cannot create %s; directory %s does not exist" %
-                [file, File.dirname(file)]
-        end
-        sync.synchronize(Sync::EX) do
-            File.open(file, "r+", mode) do |rf|
-                rf.lock_exclusive do
-                    File.open(tmpfile, "w", mode) do |tf|
-                        yield tf
-                    end
-                    begin
-                        File.rename(tmpfile, file)
-                    rescue => detail
-                        Puppet.err "Could not rename %s to %s: %s" %
-                            [file, tmpfile, detail]
-                    end
-                end
-            end
-        end
-    end
-
-
     # Sign a given certificate request.
     def sign(csr)
         unless csr.is_a?(OpenSSL::X509::Request)
@@ -278,9 +251,8 @@ class Puppet::SSLCertificates::CA
         end
 
         serial = nil
-        readwritelock(@config[:serial]) { |f|
+        Puppet.settings.readwritelock(:serial) { |f|
             serial = File.read(@config[:serial]).chomp.hex
-
             # increment the serial
             f << "%04X" % (serial + 1)
         }
@@ -372,7 +344,7 @@ class Puppet::SSLCertificates::CA
             @crl = OpenSSL::X509::CRL.new(
                 File.read(@config[:cacrl])
             )
-        elsif @config[:cacrl] == 'none'
+        elsif @config[:cacrl] == 'false'
             @crl = nil
         else
             # Create new CRL
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 6a49812..14b2037 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -15,8 +15,6 @@ class Transaction
     # The list of events generated in this transaction.
     attr_reader :events
     
-    attr_writer :tags
-
     include Puppet::Util
 
     # Add some additional times for reporting
@@ -173,7 +171,7 @@ class Transaction
             relationship_graph.add_resource(gen_child) unless relationship_graph.resource(gen_child.ref)
 
             unless relationship_graph.edge?(edge[1], edge[0])
-                relationship_graph.add_edge!(*edge)
+                relationship_graph.add_edge(*edge)
             else
                 resource.debug "Skipping automatic relationship to %s" % gen_child
             end
@@ -424,7 +422,7 @@ class Transaction
 
     # Should we ignore tags?
     def ignore_tags?
-        ! @catalog.host_config?
+        ! (@catalog.host_config? or Puppet[:name] == "puppet")
     end
 
     # this should only be called by a Puppet::Type::Component resource now
@@ -636,6 +634,11 @@ class Transaction
         
         @tags
     end
+
+    def tags=(tags)
+        tags = [tags] unless tags.is_a?(Array)
+        @tags = tags
+    end
     
     # Is this resource tagged appropriately?
     def missing_tags?(resource)
diff --git a/lib/puppet/transportable.rb b/lib/puppet/transportable.rb
index c1d68a8..f686fbb 100644
--- a/lib/puppet/transportable.rb
+++ b/lib/puppet/transportable.rb
@@ -193,7 +193,7 @@ module Puppet
                             next unless resource = child.to_type
                             config.add_resource resource
                         end
-                        config.add_edge!(container, resource)
+                        config.add_edge(container, resource)
                         if child.is_a?(self.class)
                             delver.call(child)
                         end
diff --git a/lib/puppet/type.rb b/lib/puppet/type.rb
index def9e44..09003e8 100644
--- a/lib/puppet/type.rb
+++ b/lib/puppet/type.rb
@@ -257,10 +257,7 @@ class Type
                 rescue ArgumentError, Puppet::Error, TypeError
                     raise
                 rescue => detail
-                    error = Puppet::DevError.new(
-                        "Could not set %s on %s: %s" %
-                            [attr, self.class.name, detail]
-                    )
+                    error = Puppet::DevError.new( "Could not set %s on %s: %s" % [attr, self.class.name, detail])
                     error.set_backtrace(detail.backtrace)
                     raise error
                 end
@@ -422,10 +419,6 @@ end
 
 require 'puppet/propertychange'
 require 'puppet/provider'
-require 'puppet/type/component'
-require 'puppet/type/pfile'
-require 'puppet/type/pfilebucket'
-require 'puppet/type/tidy'
-
-
 
+# Always load these types.
+require 'puppet/type/component'
diff --git a/lib/puppet/type/cron.rb b/lib/puppet/type/cron.rb
index 17cb166..c46a7c8 100755
--- a/lib/puppet/type/cron.rb
+++ b/lib/puppet/type/cron.rb
@@ -23,6 +23,24 @@ Puppet::Type.newtype(:cron) do
                 hour => 2,
                 minute => 0
             }
+
+        Note that all cron values can be specified as an array of values::
+
+            cron { logrotate:
+                command => \"/usr/sbin/logrotate\",
+                user => root,
+                hour => [2, 4]
+            }
+
+        Or using ranges, or the step syntax ``*/2`` (although there's no guarantee that
+        your ``cron`` daemon supports it)::
+
+            cron { logrotate:
+                command => \"/usr/sbin/logrotate\",
+                user => root,
+                hour => ['2-4'],
+                minute => '*/10'
+            }
         "
     ensurable
 
diff --git a/lib/puppet/type/exec.rb b/lib/puppet/type/exec.rb
index 5bb3158..2772b54 100755
--- a/lib/puppet/type/exec.rb
+++ b/lib/puppet/type/exec.rb
@@ -211,10 +211,7 @@ module Puppet
                 log the output when the command reports an error.  Values are
                 **true**, *false*, *on_failure*, and any legal log level."
 
-            values = [:true, :false, :on_failure]
-            # And all of the log levels
-            Puppet::Util::Log.eachlevel { |level| values << level }
-            newvalues(*values)
+            newvalues(:true, :false, :on_failure)
         end
 
         newparam(:refresh) do
@@ -229,6 +226,15 @@ module Puppet
         end
 
         newparam(:env) do
+            desc "This parameter is deprecated. Use 'environment' instead."
+
+            munge do |value|
+                warning "'env' is deprecated on exec; use 'environment' instead."
+                resource[:environment] = value
+            end
+        end
+
+        newparam(:environment) do
             desc "Any additional environment variables you want to set for a
                 command.  Note that if you use this to set PATH, it will override
                 the ``path`` attribute.  Multiple environment variables should be
@@ -279,7 +285,7 @@ module Puppet
                     # Rebuild the database, but only when the file changes
                     exec { newaliases:
                         path => [\"/usr/bin\", \"/usr/sbin\"],
-                        subscribe => file[\"/etc/aliases\"],
+                        subscribe => File[\"/etc/aliases\"],
                         refreshonly => true
                     }
                 
@@ -554,32 +560,32 @@ module Puppet
             begin
                 # Do our chdir
                 Dir.chdir(dir) do
-                    env = {}
+                    environment = {}
 
                     if self[:path]
-                        env[:PATH] = self[:path].join(":")
+                        environment[:PATH] = self[:path].join(":")
                     end
 
-                    if envlist = self[:env]
+                    if envlist = self[:environment]
                         envlist = [envlist] unless envlist.is_a? Array
                         envlist.each do |setting|
                             if setting =~ /^(\w+)=((.|\n)+)$/
                                 name = $1
                                 value = $2
-                                if env.include? name
+                                if environment.include? name
                                     warning(
                                     "Overriding environment setting '%s' with '%s'" %
                                         [name, value]
                                     )
                                 end
-                                env[name] = value
+                                environment[name] = value
                             else
-                                warning "Cannot understand env setting %s" % setting.inspect
+                                warning "Cannot understand environment setting %s" % setting.inspect
                             end
                         end
                     end
 
-                    withenv env do
+                    withenv environment do
                         Timeout::timeout(self[:timeout]) do
                             output, status = Puppet::Util::SUIDManager.run_and_capture(
                                 [command], self[:user], self[:group]
diff --git a/lib/puppet/type/pfile.rb b/lib/puppet/type/file.rb
similarity index 93%
rename from lib/puppet/type/pfile.rb
rename to lib/puppet/type/file.rb
index f86e1e2..3518e8b 100644
--- a/lib/puppet/type/pfile.rb
+++ b/lib/puppet/type/file.rb
@@ -5,10 +5,12 @@ require 'uri'
 require 'fileutils'
 require 'puppet/network/handler'
 require 'puppet/util/diff'
+require 'puppet/util/checksums'
 
 module Puppet
     newtype(:file) do
         include Puppet::Util::MethodHelper
+        include Puppet::Util::Checksums
         @doc = "Manages local files, including setting ownership and
             permissions, creation of both files and directories, and
             retrieving entire files from remote servers.  As Puppet matures, it
@@ -173,11 +175,9 @@ module Puppet
                 recursion), and ``follow`` will manage the file to which the
                 link points."
 
-            newvalues(:follow, :manage, :ignore)
+            newvalues(:follow, :manage)
 
-            # :ignore and :manage behave equivalently on local files,
-            # but don't copy remote links
-            defaultto :ignore
+            defaultto :manage
         end
 
         newparam(:purge, :boolean => true) do
@@ -460,7 +460,9 @@ module Puppet
             super
 
             # Get rid of any duplicate slashes, and remove any trailing slashes.
-            @title = @title.gsub(/\/+/, "/").sub(/\/$/, "")
+            @title = @title.gsub(/\/+/, "/")
+            
+            @title.sub!(/\/$/, "") unless @title == "/"
 
             # Clean out as many references to any file paths as possible.
             # This was the source of many, many bugs.
@@ -640,7 +642,6 @@ module Puppet
                     # :file.
                     return nil unless child = catalog.create_implicit_resource(self.class.name, args)
                 rescue => detail
-                    puts detail.backtrace
                     self.notice "Cannot manage: %s" % [detail]
                     return nil
                 end
@@ -648,7 +649,7 @@ module Puppet
 
             # LAK:FIXME This shouldn't be necessary, but as long as we're
             # modeling the relationship graph specifically, it is.
-            catalog.relationship_graph.add_edge! self, child
+            catalog.relationship_graph.add_edge self, child
 
             return child
         end
@@ -767,11 +768,8 @@ module Puppet
             begin
                 File.unlink(newfile)
             rescue => detail
-                if Puppet[:trace]
-                    puts detail.backtrace
-                end
-                self.err "Could not remove old backup: %s" %
-                    detail
+                puts detail.backtrace if Puppet[:trace]
+                self.err "Could not remove old backup: %s" % detail
                 return false
             end
         end
@@ -781,9 +779,7 @@ module Puppet
         def remove_existing(should)
             return unless s = stat(true)
 
-            unless handlebackup
-                self.fail "Could not back up; will not replace"
-            end
+            self.fail "Could not back up; will not replace" unless handlebackup
 
             unless should.to_s == "link"
                 return if s.ftype.to_s == should.to_s 
@@ -792,8 +788,7 @@ module Puppet
             case s.ftype
             when "directory":
                 if self[:force] == :true
-                    debug "Removing existing directory for replacement with %s" %
-                        should
+                    debug "Removing existing directory for replacement with %s" % should
                     FileUtils.rmtree(self[:path])
                 else
                     notice "Not removing directory; use 'force' to override"
@@ -977,7 +972,7 @@ module Puppet
         end
 
         def uri2obj(source)
-            sourceobj = FileSource.new
+            sourceobj = Puppet::Type::File::FileSource.new
             path = nil
             unless source
                 devfail "Got a nil source"
@@ -1033,54 +1028,38 @@ module Puppet
             return [sourceobj, path.sub(/\/\//, '/')]
         end
 
-        # Write out the file.  We open the file correctly, with all of the
-        # uid and mode and such, and then yield the file handle for actual
-        # writing.
-        def write(property, usetmp = true)
-            mode = self.should(:mode)
+        # Write out the file.  Requires the content to be written,
+        # the property name for logging, and the checksum for validation.
+        def write(content, property, checksum = nil)
+            if validate = validate_checksum?
+                # Use the appropriate checksum type -- md5, md5lite, etc.
+                sumtype = property(:checksum).checktype
+                checksum ||= "{#{sumtype}}" + property(:checksum).send(sumtype, content)
+            end
 
             remove_existing(:file)
 
-            # The temporary file
-            path = nil
-            if usetmp
-                path = self[:path] + ".puppettmp"
-            else
-                path = self[:path]
-            end
-
-            # As the correct user and group
-            write_if_writable(File.dirname(path)) do
-                f = nil
-                # Open our file with the correct modes
-                if mode
-                    Puppet::Util.withumask(000) do
-                        f = File.open(path,
-                            File::CREAT|File::WRONLY|File::TRUNC, mode)
-                    end
-                else
-                    f = File.open(path, File::CREAT|File::WRONLY|File::TRUNC)
-                end
+            use_temporary_file = (content.length != 0)
+            path = self[:path]
+            path += ".puppettmp" if use_temporary_file
 
-                # Yield it
-                yield f
+            mode = self.should(:mode) # might be nil
+            umask = mode ? 000 : 022
 
-                f.flush
-                f.close
+            Puppet::Util.withumask(umask) do
+                File.open(path, File::CREAT|File::WRONLY|File::TRUNC, mode) { |f| f.print content }
             end
 
             # And put our new file in place
-            if usetmp
+            if use_temporary_file # This is only not true when our file is empty.
                 begin
+                    fail_if_checksum_is_wrong(path, checksum) if validate
                     File.rename(path, self[:path])
                 rescue => detail
-                    self.err "Could not rename tmp %s for replacing: %s" %
-                        [self[:path], detail]
+                    self.err "Could not rename tmp %s for replacing: %s" % [self[:path], detail]
                 ensure
                     # Make sure the created file gets removed
-                    if FileTest.exists?(path)
-                        File.unlink(path)
-                    end
+                    File.unlink(path) if FileTest.exists?(path)
                 end
             end
 
@@ -1088,32 +1067,35 @@ module Puppet
             property_fix
 
             # And then update our checksum, so the next run doesn't find it.
-            # FIXME This is extra work, because it's going to read the whole
-            # file back in again.
-            self.setchecksum
-            
+            self.setchecksum(checksum)
         end
-        
-        # Run the block as the specified user if the dir is writeable, else
-        # run it as root (or the current user).
-        def write_if_writable(dir)
-            yield
-            # We're getting different behaviors from different versions of ruby, so...
-            # asroot = true
-            # Puppet::Util::SUIDManager.asuser(asuser(), self.should(:group)) do
-            #     if FileTest.writable?(dir)
-            #         asroot = false
-            #         yield
-            #     end
-            # end
-            # 
-            # if asroot
-            #     yield
-            # end
+
+        # Should we validate the checksum of the file we're writing?
+        def validate_checksum?
+            if sumparam = @parameters[:checksum]
+                return sumparam.checktype.to_s !~ /time/
+            else
+                return false
+            end
         end
 
         private
 
+        # Make sure the file we wrote out is what we think it is.
+        def fail_if_checksum_is_wrong(path, checksum)
+            if checksum =~ /^\{(\w+)\}.+/
+                sumtype = $1
+            else
+                # This shouldn't happen, but if it happens to, it's nicer
+                # to just use a default sumtype than fail.
+                sumtype = "md5"
+            end
+            newsum = property(:checksum).getsum(sumtype, path)
+            return if newsum == checksum
+
+            self.fail "File written to disk did not match checksum; discarding changes (%s vs %s)" % [checksum, newsum]
+        end
+
         # Override the parent method, because we don't want to generate changes
         # when the file is missing and there is no 'ensure' state.
         def propertychanges(currentvalues)
@@ -1150,20 +1132,20 @@ module Puppet
 
     # the filesource class can't include the path, because the path
     # changes for every file instance
-    class FileSource
+    class ::Puppet::Type::File::FileSource
         attr_accessor :mount, :root, :server, :local
     end
 
     # We put all of the properties in separate files, because there are so many
     # of them.  The order these are loaded is important, because it determines
     # the order they are in the property lit.
-    require 'puppet/type/pfile/checksum'
-    require 'puppet/type/pfile/content'     # can create the file
-    require 'puppet/type/pfile/source'      # can create the file
-    require 'puppet/type/pfile/target'      # creates a different type of file
-    require 'puppet/type/pfile/ensure'      # can create the file
-    require 'puppet/type/pfile/owner'
-    require 'puppet/type/pfile/group'
-    require 'puppet/type/pfile/mode'
-    require 'puppet/type/pfile/type'
+    require 'puppet/type/file/checksum'
+    require 'puppet/type/file/content'     # can create the file
+    require 'puppet/type/file/source'      # can create the file
+    require 'puppet/type/file/target'      # creates a different type of file
+    require 'puppet/type/file/ensure'      # can create the file
+    require 'puppet/type/file/owner'
+    require 'puppet/type/file/group'
+    require 'puppet/type/file/mode'
+    require 'puppet/type/file/type'
 end
diff --git a/lib/puppet/type/file/checksum.rb b/lib/puppet/type/file/checksum.rb
new file mode 100755
index 0000000..3be147c
--- /dev/null
+++ b/lib/puppet/type/file/checksum.rb
@@ -0,0 +1,274 @@
+require 'puppet/util/checksums'
+
+# Keep a copy of the file checksums, and notify when they change.  This
+# property never actually modifies the system, it only notices when the system
+# changes on its own.
+Puppet::Type.type(:file).newproperty(:checksum) do
+    include Puppet::Util::Checksums
+
+    desc "How to check whether a file has changed.  This state is used internally
+        for file copying, but it can also be used to monitor files somewhat
+        like Tripwire without managing the file contents in any way.  You can
+        specify that a file's checksum should be monitored and then subscribe to
+        the file from another object and receive events to signify
+        checksum changes, for instance."
+
+    @event = :file_changed
+
+    @unmanaged = true
+
+    @validtypes = %w{md5 md5lite timestamp mtime time}
+
+    def self.validtype?(type)
+        @validtypes.include?(type)
+    end
+
+    @validtypes.each do |ctype|
+        newvalue(ctype) do
+            handlesum()
+        end
+    end
+
+    str = @validtypes.join("|")
+
+    # This is here because Puppet sets this internally, using
+    # {md5}......
+    newvalue(/^\{#{str}\}/) do
+        handlesum()
+    end
+
+    newvalue(:nosum) do
+        # nothing
+        :nochange
+    end
+
+    # If they pass us a sum type, behave normally, but if they pass
+    # us a sum type + sum, stick the sum in the cache.
+    munge do |value|
+        if value =~ /^\{(\w+)\}(.+)$/
+            type = symbolize($1)
+            sum = $2
+            cache(type, sum)
+            return type
+        else
+            if FileTest.directory?(@resource[:path])
+                return :time
+            else
+                return symbolize(value)
+            end
+        end
+    end
+
+    # Store the checksum in the data cache, or retrieve it if only the
+    # sum type is provided.
+    def cache(type, sum = nil)
+        unless type
+            raise ArgumentError, "A type must be specified to cache a checksum"
+        end
+        type = symbolize(type)
+        type = :mtime if type == :timestamp
+        type = :ctime if type == :time
+
+        unless state = @resource.cached(:checksums) 
+            self.debug "Initializing checksum hash"
+            state = {}
+            @resource.cache(:checksums, state)
+        end
+
+        if sum
+            unless sum =~ /\{\w+\}/
+                sum = "{%s}%s" % [type, sum]
+            end
+            state[type] = sum
+        else
+            return state[type]
+        end
+    end
+
+    # Because source and content and whomever else need to set the checksum
+    # and do the updating, we provide a simple mechanism for doing so.
+    def checksum=(value)
+        munge(@should)
+        self.updatesum(value)
+    end
+
+    def checktype
+        self.should || :md5
+    end
+
+    # Checksums need to invert how changes are printed.
+    def change_to_s(currentvalue, newvalue)
+        begin
+            if currentvalue == :absent
+                return "defined '%s' as '%s'" %
+                    [self.name, self.currentsum]
+            elsif newvalue == :absent
+                return "undefined %s from '%s'" %
+                    [self.name, self.is_to_s(currentvalue)]
+            else
+                if defined? @cached and @cached
+                    return "%s changed '%s' to '%s'" %
+                        [self.name, @cached, self.is_to_s(currentvalue)]
+                else
+                    return "%s changed '%s' to '%s'" %
+                        [self.name, self.currentsum, self.is_to_s(currentvalue)]
+                end
+            end
+        rescue Puppet::Error, Puppet::DevError
+            raise
+        rescue => detail
+            raise Puppet::DevError, "Could not convert change %s to string: %s" %
+                [self.name, detail]
+        end
+    end
+
+    def currentsum
+        cache(checktype())
+    end
+
+    # Retrieve the cached sum
+    def getcachedsum
+        hash = nil
+        unless hash = @resource.cached(:checksums) 
+            hash = {}
+            @resource.cache(:checksums, hash)
+        end
+
+        sumtype = self.should
+
+        if hash.include?(sumtype)
+            #self.notice "Found checksum %s for %s" %
+            #    [hash[sumtype] , at resource[:path]]
+            sum = hash[sumtype]
+
+            unless sum =~ /^\{\w+\}/
+                sum = "{%s}%s" % [sumtype, sum]
+            end
+            return sum
+        elsif hash.empty?
+            #self.notice "Could not find sum of type %s" % sumtype
+            return :nosum
+        else
+            #self.notice "Found checksum for %s but not of type %s" %
+            #    [@resource[:path],sumtype]
+            return :nosum
+        end
+    end
+
+    # Calculate the sum from disk.
+    def getsum(checktype, file = nil)
+        sum = ""
+
+        checktype = :mtime if checktype == :timestamp
+        checktype = :ctime if checktype == :time
+
+        file ||= @resource[:path]
+
+        return nil unless FileTest.exist?(file)
+
+        if ! FileTest.file?(file)
+            checktype = :mtime
+        end
+        method = checktype.to_s + "_file"
+
+        self.fail("Invalid checksum type %s" % checktype) unless respond_to?(method)
+
+        return "{%s}%s" % [checktype, send(method, file)]
+    end
+
+    # At this point, we don't actually modify the system, we modify
+    # the stored state to reflect the current state, and then kick
+    # off an event to mark any changes.
+    def handlesum
+        currentvalue = self.retrieve
+        if currentvalue.nil?
+            raise Puppet::Error, "Checksum state for %s is somehow nil" %
+                @resource.title
+        end
+
+        if self.insync?(currentvalue)
+            self.debug "Checksum is already in sync"
+            return nil
+        end
+        # If we still can't retrieve a checksum, it means that
+        # the file still doesn't exist
+        if currentvalue == :absent
+            # if they're copying, then we won't worry about the file
+            # not existing yet
+            unless @resource.property(:source)
+                self.warning("File %s does not exist -- cannot checksum" % @resource[:path])
+            end
+            return nil
+        end
+        
+        # If the sums are different, then return an event.
+        if self.updatesum(currentvalue)
+            return :file_changed
+        else
+            return nil
+        end
+    end
+
+    def insync?(currentvalue)
+        @should = [checktype()]
+        if cache(checktype())
+            return currentvalue == currentsum()
+        else
+            # If there's no cached sum, then we don't want to generate
+            # an event.
+            return true
+        end
+    end
+    
+    # Even though they can specify multiple checksums, the insync?
+    # mechanism can really only test against one, so we'll just retrieve
+    # the first specified sum type.
+    def retrieve(usecache = false)
+        # When the 'source' is retrieving, it passes "true" here so
+        # that we aren't reading the file twice in quick succession, yo.
+        currentvalue = currentsum()
+        return currentvalue if usecache and currentvalue
+
+        stat = nil
+        return :absent unless stat = @resource.stat
+
+        if stat.ftype == "link" and @resource[:links] != :follow
+            self.debug "Not checksumming symlink"
+            # @resource.delete(:checksum)
+            return currentvalue
+        end
+
+        # Just use the first allowed check type
+        currentvalue = getsum(checktype())
+
+        # If there is no sum defined, then store the current value
+        # into the cache, so that we're not marked as being
+        # out of sync.  We don't want to generate an event the first
+        # time we get a sum.
+        self.updatesum(currentvalue) unless cache(checktype())
+        
+        # @resource.debug "checksum state is %s" % self.is
+        return currentvalue
+    end
+
+    # Store the new sum to the state db.
+    def updatesum(newvalue)
+        result = false
+
+        # if we're replacing, vs. updating
+        if sum = cache(checktype())
+            return false if newvalue == sum
+
+            self.debug "Replacing %s checksum %s with %s" % [@resource.title, sum, newvalue]
+            result = true
+        else
+            @resource.debug "Creating checksum %s" % newvalue
+            result = false
+        end
+
+        # Cache the sum so the log message can be right if possible.
+        @cached = sum
+        cache(checktype(), newvalue)
+        return result
+    end
+end
diff --git a/lib/puppet/type/pfile/content.rb b/lib/puppet/type/file/content.rb
similarity index 78%
rename from lib/puppet/type/pfile/content.rb
rename to lib/puppet/type/file/content.rb
index 6dcda0a..1eb1423 100755
--- a/lib/puppet/type/pfile/content.rb
+++ b/lib/puppet/type/file/content.rb
@@ -1,5 +1,5 @@
 module Puppet
-    Puppet.type(:file).newproperty(:content) do
+    Puppet::Type.type(:file).newproperty(:content) do
         include Puppet::Util::Diff
 
         desc "Specify the contents of a file as a string.  Newlines, tabs, and
@@ -47,23 +47,13 @@ module Puppet
             return result
         end
 
-        # We should probably take advantage of existing md5 sums if they're there,
-        # but I really don't feel like dealing with the complexity right now.
         def retrieve
-            stat = nil
-            unless stat = @resource.stat
-                return :absent
-            end
+            return :absent unless stat = @resource.stat
 
-            if stat.ftype == "link" and @resource[:links] == :ignore
-                return self.should
-            end
+            return self.should if stat.ftype == "link" and @resource[:links] == :ignore
 
             # Don't even try to manage the content on directories
-            if stat.ftype == "directory" and @resource[:links] == :ignore
-                @resource.delete(:content)
-                return nil
-            end
+            return nil if stat.ftype == "directory"
 
             begin
                 currentvalue = File.read(@resource[:path])
@@ -74,12 +64,17 @@ module Puppet
             end
         end
 
+        # Make sure we're also managing the checksum property.
+        def should=(value)
+            super
+            @resource.newattr(:checksum) unless @resource.property(:checksum)
+        end
 
         # Just write our content out to disk.
         def sync
             return_event = @resource.stat ? :file_changed : :file_created
             
-            @resource.write(:content) { |f| f.print self.should }
+            @resource.write(self.should, :content)
 
             return return_event
         end
diff --git a/lib/puppet/type/pfile/ensure.rb b/lib/puppet/type/file/ensure.rb
similarity index 90%
rename from lib/puppet/type/pfile/ensure.rb
rename to lib/puppet/type/file/ensure.rb
index 0a6f73d..0d21712 100755
--- a/lib/puppet/type/pfile/ensure.rb
+++ b/lib/puppet/type/file/ensure.rb
@@ -46,7 +46,7 @@ module Puppet
             if property = (@resource.property(:content) || @resource.property(:source))
                 property.sync
             else
-                @resource.write(false) { |f| f.flush }
+                @resource.write("", :ensure)
                 mode = @resource.should(:mode)
             end
             return :file_created
@@ -67,14 +67,12 @@ module Puppet
                     "Cannot create %s; parent directory %s does not exist" %
                         [@resource[:path], parent]
             end
-            @resource.write_if_writable(parent) do
-                if mode
-                    Puppet::Util.withumask(000) do
-                        Dir.mkdir(@resource[:path],mode)
-                    end
-                else
-                    Dir.mkdir(@resource[:path])
+            if mode
+                Puppet::Util.withumask(000) do
+                    Dir.mkdir(@resource[:path],mode)
                 end
+            else
+                Dir.mkdir(@resource[:path])
             end
             @resource.send(:property_fix)
             @resource.setchecksum
@@ -101,9 +99,13 @@ module Puppet
         munge do |value|
             value = super(value)
 
+            # It doesn't make sense to try to manage links unless, well,
+            # we're managing links.
+            resource[:links] = :manage if value == :link
             return value if value.is_a? Symbol
 
             @resource[:target] = value
+            resource[:links] = :manage
 
             return :link
         end
@@ -136,6 +138,11 @@ module Puppet
         # We have to treat :present specially, because it works with any
         # type of file.
         def insync?(currentvalue)
+            if property = @resource.property(:source) and ! property.described?
+                warning "No specified sources exist"
+                return true
+            end
+
             if self.should == :present
                 if currentvalue.nil? or currentvalue == :absent
                     return false
diff --git a/lib/puppet/type/pfile/group.rb b/lib/puppet/type/file/group.rb
similarity index 100%
rename from lib/puppet/type/pfile/group.rb
rename to lib/puppet/type/file/group.rb
diff --git a/lib/puppet/type/pfile/mode.rb b/lib/puppet/type/file/mode.rb
similarity index 100%
rename from lib/puppet/type/pfile/mode.rb
rename to lib/puppet/type/file/mode.rb
diff --git a/lib/puppet/type/pfile/owner.rb b/lib/puppet/type/file/owner.rb
similarity index 100%
rename from lib/puppet/type/pfile/owner.rb
rename to lib/puppet/type/file/owner.rb
diff --git a/lib/puppet/type/pfile/source.rb b/lib/puppet/type/file/source.rb
similarity index 84%
rename from lib/puppet/type/pfile/source.rb
rename to lib/puppet/type/file/source.rb
index 1849d5a..1b0dd31 100755
--- a/lib/puppet/type/pfile/source.rb
+++ b/lib/puppet/type/file/source.rb
@@ -101,15 +101,17 @@ module Puppet
             begin
                 desc = server.describe(path, @resource[:links])
             rescue Puppet::Network::XMLRPCClientError => detail
-                self.err "Could not describe %s: %s" %
-                    [path, detail]
+                self.err "Could not describe %s: %s" % [path, detail]
                 return nil
             end
 
+            return nil if desc == ""
+
+            # Collect everything except the checksum
+            values = desc.split("\t")
+            other = values.pop
             args = {}
-            pinparams.zip(
-                desc.split("\t")
-            ).each { |param, value|
+            pinparams.zip(values).each { |param, value|
                 if value =~ /^[0-9]+$/
                     value = value.to_i
                 end
@@ -118,16 +120,19 @@ module Puppet
                 end
             }
 
-            # we can't manage ownership as root, so don't even try
-            unless Puppet::Util::SUIDManager.uid == 0
-                args.delete(:owner)
+            # Now decide whether we're doing checksums or symlinks
+            if args[:type] == "link"
+                args[:target] = other
+            else
+                args[:checksum] = other
             end
 
-            if args.empty? or (args[:type] == "link" and @resource[:links] == :ignore)
-                return nil
-            else
-                return args
+            # we can't manage ownership unless we're root, so don't even try
+            unless Puppet::Util::SUIDManager.uid == 0
+                args.delete(:owner)
             end
+            
+            return args
         end
         
         # Have we successfully described the remote source?
@@ -138,10 +143,10 @@ module Puppet
         # Use the info we get from describe() to check if we're in sync.
         def insync?(currentvalue)
             unless described?
-                info "No specified sources exist"
+                warning "No specified sources exist"
                 return true
             end
-            
+
             if currentvalue == :nocopy
                 return true
             end
@@ -163,7 +168,7 @@ module Puppet
 
             # Diff the contents if they ask it.  This is quite annoying -- we need to do this in
             # 'insync?' because they might be in noop mode, but we don't want to do the file
-            # retrieval twice, so we cache the value annoyingly.
+            # retrieval twice, so we cache the value.
             if ! result and Puppet[:show_diff] and File.exists?(@resource[:path]) and ! @stats[:_diffed]
                 @stats[:_remote_content] = get_remote_content
                 string_file_diff(@resource[:path], @stats[:_remote_content])
@@ -173,7 +178,7 @@ module Puppet
         end
 
         def pinparams
-            Puppet::Network::Handler.handler(:fileserver).params
+            [:mode, :type, :owner, :group]
         end
         
         # This basically calls describe() on our file, and then sets all
@@ -202,14 +207,11 @@ module Puppet
             end
             
             case @stats[:type]
-            when "directory", "file":
-                unless @resource.deleting?
-                    @resource[:ensure] = @stats[:type]
-                end
+            when "directory", "file", "link":
+                @resource[:ensure] = @stats[:type] unless @resource.deleting?
             else
                 self.info @stats.inspect
-                self.err "Cannot use files of type %s as sources" %
-                    @stats[:type]
+                self.err "Cannot use files of type %s as sources" % @stats[:type]
                 return :nocopy
             end
 
@@ -221,11 +223,9 @@ module Puppet
 
                 # was the stat already specified, or should the value
                 # be inherited from the source?
-                unless @resource.argument?(stat)
-                    @resource[stat] = value
-                end
+                @resource[stat] = value unless @resource.argument?(stat)
             }
-            
+
             return @stats[:checksum]
         end
         
@@ -241,9 +241,7 @@ module Puppet
             checks.delete(:checksum)
             
             @resource[:check] = checks
-            unless @resource.property(:checksum)
-                @resource[:checksum] = :md5
-            end
+            @resource[:checksum] = :md5 unless @resource.property(:checksum)
         end
 
         def sync
@@ -251,7 +249,7 @@ module Puppet
 
             exists = File.exists?(@resource[:path])
 
-            @resource.write(:source) { |f| f.print contents }
+            @resource.write(contents, :source, @stats[:checksum])
 
             if exists
                 return :file_changed
@@ -261,34 +259,22 @@ module Puppet
         end
 
         private
+
         def get_remote_content
-            unless @stats[:type] == "file"
-                #if @stats[:type] == "directory"
-                        #[@resource.name, @should.inspect]
-                #end
-                raise Puppet::DevError, "Got told to copy non-file %s" %
-                    @resource[:path]
-            end
+            raise Puppet::DevError, "Got told to copy non-file %s" % @resource[:path] unless @stats[:type] == "file"
 
             sourceobj, path = @resource.uri2obj(@source)
 
             begin
                 contents = sourceobj.server.retrieve(path, @resource[:links])
-            rescue Puppet::Network::XMLRPCClientError => detail
-                self.err "Could not retrieve %s: %s" %
-                    [path, detail]
-                return nil
+            rescue => detail
+                self.fail "Could not retrieve %s: %s" % [path, detail]
             end
 
-            # FIXME It's stupid that this isn't taken care of in the
-            # protocol.
-            unless sourceobj.server.local
-                contents = CGI.unescape(contents)
-            end
+            contents = CGI.unescape(contents) unless sourceobj.server.local
 
             if contents == ""
-                self.notice "Could not retrieve contents for %s" %
-                    @source
+                self.notice "Could not retrieve contents for %s" % @source
             end
 
             return contents
diff --git a/lib/puppet/type/pfile/target.rb b/lib/puppet/type/file/target.rb
similarity index 100%
rename from lib/puppet/type/pfile/target.rb
rename to lib/puppet/type/file/target.rb
diff --git a/lib/puppet/type/pfile/type.rb b/lib/puppet/type/file/type.rb
similarity index 100%
rename from lib/puppet/type/pfile/type.rb
rename to lib/puppet/type/file/type.rb
diff --git a/lib/puppet/type/pfilebucket.rb b/lib/puppet/type/filebucket.rb
similarity index 100%
rename from lib/puppet/type/pfilebucket.rb
rename to lib/puppet/type/filebucket.rb
diff --git a/lib/puppet/type/host.rb b/lib/puppet/type/host.rb
index be5c2ed..3e34c0b 100755
--- a/lib/puppet/type/host.rb
+++ b/lib/puppet/type/host.rb
@@ -4,6 +4,13 @@ module Puppet
 
         newproperty(:ip) do
             desc "The host's IP address, IPv4 or IPv6."
+
+        validate do |value|
+           unless value =~ /((([0-9a-fA-F]+:){7}[0-9a-fA-F]+)|(([0-9a-fA-F]+:)*[0-9a-fA-F]+)?::(([0-9a-fA-F]+:)*[0-9a-fA-F]+)?)|((25[0-5]|2[0-4][\d]|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3})/
+             raise Puppet::Error, "Invalid IP address"            
+           end
+        end
+
         end
 
         newproperty(:alias) do
@@ -78,6 +85,12 @@ module Puppet
             desc "The host name."
 
             isnamevar
+
+            validate do |value|
+               unless value =~ /^\w+-?[\w+]?\.?[\w+.{1}]*\w+$/
+                  raise Puppet::Error, "Invalid host name"
+               end
+            end 
         end
 
         @doc = "Installs and manages host entries.  For most systems, these
diff --git a/lib/puppet/type/mailalias.rb b/lib/puppet/type/mailalias.rb
index 92f6092..50ca26e 100755
--- a/lib/puppet/type/mailalias.rb
+++ b/lib/puppet/type/mailalias.rb
@@ -9,7 +9,7 @@ module Puppet
         end
 
         newproperty(:recipient, :array_matching => :all) do
-            desc "Where email should should be sent.  Multiple values
+            desc "Where email should be sent.  Multiple values
                 should be specified as an array."
 
             def is_to_s(value)
diff --git a/lib/puppet/type/nagios_command.rb b/lib/puppet/type/nagios_command.rb
new file mode 100644
index 0000000..0d0e11b
--- /dev/null
+++ b/lib/puppet/type/nagios_command.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :command
diff --git a/lib/puppet/type/nagios_contact.rb b/lib/puppet/type/nagios_contact.rb
new file mode 100644
index 0000000..d5a1f3c
--- /dev/null
+++ b/lib/puppet/type/nagios_contact.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :contact
diff --git a/lib/puppet/type/nagios_contactgroup.rb b/lib/puppet/type/nagios_contactgroup.rb
new file mode 100644
index 0000000..b8f14c0
--- /dev/null
+++ b/lib/puppet/type/nagios_contactgroup.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :contactgroup
diff --git a/lib/puppet/type/nagios_host.rb b/lib/puppet/type/nagios_host.rb
new file mode 100644
index 0000000..f2e03f6
--- /dev/null
+++ b/lib/puppet/type/nagios_host.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :host
diff --git a/lib/puppet/type/nagios_hostextinfo.rb b/lib/puppet/type/nagios_hostextinfo.rb
new file mode 100644
index 0000000..da8e08d
--- /dev/null
+++ b/lib/puppet/type/nagios_hostextinfo.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :hostextinfo
diff --git a/lib/puppet/type/nagios_hostgroup.rb b/lib/puppet/type/nagios_hostgroup.rb
new file mode 100644
index 0000000..e1943be
--- /dev/null
+++ b/lib/puppet/type/nagios_hostgroup.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :hostgroup
diff --git a/lib/puppet/type/nagios_hostgroupescalation.rb b/lib/puppet/type/nagios_hostgroupescalation.rb
new file mode 100644
index 0000000..21b39f6
--- /dev/null
+++ b/lib/puppet/type/nagios_hostgroupescalation.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :hostgroupescalation
diff --git a/lib/puppet/type/nagios_service.rb b/lib/puppet/type/nagios_service.rb
new file mode 100644
index 0000000..22b987f
--- /dev/null
+++ b/lib/puppet/type/nagios_service.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :service
diff --git a/lib/puppet/type/nagios_servicedependency.rb b/lib/puppet/type/nagios_servicedependency.rb
new file mode 100644
index 0000000..0e3340c
--- /dev/null
+++ b/lib/puppet/type/nagios_servicedependency.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :servicedependency
diff --git a/lib/puppet/type/nagios_serviceescalation.rb b/lib/puppet/type/nagios_serviceescalation.rb
new file mode 100644
index 0000000..cb2af15
--- /dev/null
+++ b/lib/puppet/type/nagios_serviceescalation.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :serviceescalation
diff --git a/lib/puppet/type/nagios_serviceextinfo.rb b/lib/puppet/type/nagios_serviceextinfo.rb
new file mode 100644
index 0000000..6bdc709
--- /dev/null
+++ b/lib/puppet/type/nagios_serviceextinfo.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :serviceextinfo
diff --git a/lib/puppet/type/nagios_timeperiod.rb b/lib/puppet/type/nagios_timeperiod.rb
new file mode 100644
index 0000000..25a06d3
--- /dev/null
+++ b/lib/puppet/type/nagios_timeperiod.rb
@@ -0,0 +1,3 @@
+require 'puppet/util/nagios_maker'
+
+Puppet::Util::NagiosMaker.create_nagios_type :timeperiod
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index 6163622..f004f7c 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -176,7 +176,7 @@ module Puppet
             a common name to packages::
 
                 # In the 'openssl' class
-                $ssl = $operationgsystem ? {
+                $ssl = $operatingsystem ? {
                     solaris => SMCossl,
                     default => openssl
                 }
@@ -190,7 +190,7 @@ module Puppet
 
                 . etc. .
 
-                $ssh = $operationgsystem ? {
+                $ssh = $operatingsystem ? {
                     solaris => SMCossh,
                     default => openssh
                 }
@@ -200,7 +200,7 @@ module Puppet
                 package { $ssh:
                     ensure => installed,
                     alias => openssh,
-                    require => package[openssl]
+                    require => Package[openssl]
                 }
             
             "
@@ -211,14 +211,6 @@ module Puppet
             desc "Where to find the actual package.  This must be a local file
                 (or on a network file system) or a URL that your specific
                 packaging type understands; Puppet will not retrieve files for you."
-
-            validate do |value|
-                unless value =~ /^#{File::SEPARATOR}/ or value =~ /\w+:\/\//
-                    self.fail(
-                        "Package sources must be fully qualified files or URLs, depending on the platform."
-                    )
-                end
-            end
         end
         newparam(:instance) do
             desc "A read-only parameter set by the package."
@@ -248,7 +240,7 @@ module Puppet
 
         newparam(:responsefile) do
             desc "A file containing any necessary answers to questions asked by
-                the package.  This is currently only used on Solaris.  The
+                the package.  This is currently used on Solaris and Debian.  The
                 value will be validated according to system rules, but it should
                 generally be a fully qualified path."
         end
diff --git a/lib/puppet/type/pfile/checksum.rb b/lib/puppet/type/pfile/checksum.rb
deleted file mode 100755
index 08f48ea..0000000
--- a/lib/puppet/type/pfile/checksum.rb
+++ /dev/null
@@ -1,326 +0,0 @@
-# Keep a copy of the file checksums, and notify when they change.
-
-# This state never actually modifies the system, it only notices when the system
-# changes on its own.
-module Puppet
-    Puppet.type(:file).newproperty(:checksum) do
-        desc "How to check whether a file has changed.  This state is used internally
-            for file copying, but it can also be used to monitor files somewhat
-            like Tripwire without managing the file contents in any way.  You can
-            specify that a file's checksum should be monitored and then subscribe to
-            the file from another object and receive events to signify
-            checksum changes, for instance."
-
-        @event = :file_changed
-
-        @unmanaged = true
-
-        @validtypes = %w{md5 md5lite timestamp mtime time}
-
-        def self.validtype?(type)
-            @validtypes.include?(type)
-        end
-
-        @validtypes.each do |ctype|
-            newvalue(ctype) do
-                handlesum()
-            end
-        end
-
-        str = @validtypes.join("|")
-
-        # This is here because Puppet sets this internally, using
-        # {md5}......
-        newvalue(/^\{#{str}\}/) do
-            handlesum()
-        end
-
-        newvalue(:nosum) do
-            # nothing
-            :nochange
-        end
-
-        # If they pass us a sum type, behave normally, but if they pass
-        # us a sum type + sum, stick the sum in the cache.
-        munge do |value|
-            if value =~ /^\{(\w+)\}(.+)$/
-                type = symbolize($1)
-                sum = $2
-                cache(type, sum)
-                return type
-            else
-                if FileTest.directory?(@resource[:path])
-                    return :time
-                else
-                    return symbolize(value)
-                end
-            end
-        end
-
-        # Store the checksum in the data cache, or retrieve it if only the
-        # sum type is provided.
-        def cache(type, sum = nil)
-            unless type
-                raise ArgumentError, "A type must be specified to cache a checksum"
-            end
-            type = symbolize(type)
-            unless state = @resource.cached(:checksums) 
-                self.debug "Initializing checksum hash"
-                state = {}
-                @resource.cache(:checksums, state)
-            end
-
-            if sum
-                unless sum =~ /\{\w+\}/
-                    sum = "{%s}%s" % [type, sum]
-                end
-                state[type] = sum
-            else
-                return state[type]
-            end
-        end
-
-        # Because source and content and whomever else need to set the checksum
-        # and do the updating, we provide a simple mechanism for doing so.
-        def checksum=(value)
-            munge(@should)
-            self.updatesum(value)
-        end
-
-        def checktype
-            self.should || :md5
-        end
-
-        # Checksums need to invert how changes are printed.
-        def change_to_s(currentvalue, newvalue)
-            begin
-                if currentvalue == :absent
-                    return "defined '%s' as '%s'" %
-                        [self.name, self.currentsum]
-                elsif newvalue == :absent
-                    return "undefined %s from '%s'" %
-                        [self.name, self.is_to_s(currentvalue)]
-                else
-                    if defined? @cached and @cached
-                        return "%s changed '%s' to '%s'" %
-                            [self.name, @cached, self.is_to_s(currentvalue)]
-                    else
-                        return "%s changed '%s' to '%s'" %
-                            [self.name, self.currentsum, self.is_to_s(currentvalue)]
-                    end
-                end
-            rescue Puppet::Error, Puppet::DevError
-                raise
-            rescue => detail
-                raise Puppet::DevError, "Could not convert change %s to string: %s" %
-                    [self.name, detail]
-            end
-        end
-
-        def currentsum
-            #"{%s}%s" % [self.should, cache(self.should)]
-            cache(checktype())
-        end
-
-        # Retrieve the cached sum
-        def getcachedsum
-            hash = nil
-            unless hash = @resource.cached(:checksums) 
-                hash = {}
-                @resource.cache(:checksums, hash)
-            end
-
-            sumtype = self.should
-
-            if hash.include?(sumtype)
-                #self.notice "Found checksum %s for %s" %
-                #    [hash[sumtype] , at resource[:path]]
-                sum = hash[sumtype]
-
-                unless sum =~ /^\{\w+\}/
-                    sum = "{%s}%s" % [sumtype, sum]
-                end
-                return sum
-            elsif hash.empty?
-                #self.notice "Could not find sum of type %s" % sumtype
-                return :nosum
-            else
-                #self.notice "Found checksum for %s but not of type %s" %
-                #    [@resource[:path],sumtype]
-                return :nosum
-            end
-        end
-
-        # Calculate the sum from disk.
-        def getsum(checktype)
-            sum = ""
-
-            checktype = checktype.intern if checktype.is_a? String
-            case checktype
-            when :md5, :md5lite:
-                if ! FileTest.file?(@resource[:path])
-                    @resource.debug "Cannot MD5 sum %s; using mtime" %
-                        [@resource.stat.ftype]
-                    sum = @resource.stat.mtime.to_s
-                else
-                    begin
-                        File.open(@resource[:path]) { |file|
-                            hashfunc = Digest::MD5.new
-                            while (!file.eof)
-                                readBuf = file.read(512)
-                                hashfunc.update(readBuf)
-                                if checktype == :md5lite then
-                                   break
-                                end
-                             end
-                            sum = hashfunc.hexdigest
-                        }
-                    rescue Errno::EACCES => detail
-                        self.notice "Cannot checksum %s: permission denied" %
-                            @resource[:path]
-                        @resource.delete(self.class.name)
-                    rescue => detail
-                        self.notice "Cannot checksum: %s" %
-                            detail
-                        @resource.delete(self.class.name)
-                    end
-                end
-            when :timestamp, :mtime:
-                sum = @resource.stat.mtime.to_s
-                #sum = File.stat(@resource[:path]).mtime.to_s
-            when :time:
-                sum = @resource.stat.ctime.to_s
-                #sum = File.stat(@resource[:path]).ctime.to_s
-            else
-                raise Puppet::Error, "Invalid sum type %s" % checktype
-            end
-
-            return "{#{checktype}}" + sum.to_s
-        end
-
-        # At this point, we don't actually modify the system, we modify
-        # the stored state to reflect the current state, and then kick
-        # off an event to mark any changes.
-        def handlesum
-            currentvalue = self.retrieve
-            if currentvalue.nil?
-                raise Puppet::Error, "Checksum state for %s is somehow nil" %
-                    @resource.title
-            end
-
-            if self.insync?(currentvalue)
-                self.debug "Checksum is already in sync"
-                return nil
-            end
-            # @resource.debug "%s(%s): after refresh, is '%s'" %
-                #    [self.class.name, at resource.name, at is]
-
-                # If we still can't retrieve a checksum, it means that
-                # the file still doesn't exist
-            if currentvalue == :absent
-                # if they're copying, then we won't worry about the file
-                # not existing yet
-                unless @resource.property(:source)
-                    self.warning("File %s does not exist -- cannot checksum" %
-                                     @resource[:path]
-                                 )
-                end
-                return nil
-            end
-            
-            # If the sums are different, then return an event.
-            if self.updatesum(currentvalue)
-                return :file_changed
-            else
-                return nil
-            end
-        end
-
-        def insync?(currentvalue)
-            @should = [checktype()]
-            if cache(checktype())
-                return currentvalue == currentsum()
-            else
-                # If there's no cached sum, then we don't want to generate
-                # an event.
-                return true
-            end
-        end
-        
-        # Even though they can specify multiple checksums, the insync?
-        # mechanism can really only test against one, so we'll just retrieve
-        # the first specified sum type.
-        def retrieve(usecache = false)
-            # When the 'source' is retrieving, it passes "true" here so
-            # that we aren't reading the file twice in quick succession, yo.
-            currentvalue = currentsum()
-            if usecache and currentvalue
-               return currentvalue
-            end
-
-            stat = nil
-            unless stat = @resource.stat
-                return :absent
-            end
-
-            if stat.ftype == "link" and @resource[:links] != :follow
-                self.debug "Not checksumming symlink"
-                # @resource.delete(:checksum)
-                return currentvalue
-            end
-
-            # Just use the first allowed check type
-            currentvalue = getsum(checktype())
-
-            # If there is no sum defined, then store the current value
-            # into the cache, so that we're not marked as being
-            # out of sync.  We don't want to generate an event the first
-            # time we get a sum.
-            unless cache(checktype())
-                # FIXME we should support an updatechecksums-like mechanism
-                self.updatesum(currentvalue)
-            end
-            
-            # @resource.debug "checksum state is %s" % self.is
-            return currentvalue
-        end
-
-        # Store the new sum to the state db.
-        def updatesum(newvalue)
-            result = false
-
-            if newvalue.is_a?(Symbol)
-                raise Puppet::Error, "%s has invalid checksum" % @resource.title
-            end
-
-            # if we're replacing, vs. updating
-            if sum = cache(checktype())
-                # unless defined? @should
-                #     raise Puppet::Error.new(
-                #         ("@should is not initialized for %s, even though we " +
-                #         "found a checksum") % @resource[:path]
-                #     )
-                # end
-                
-                if newvalue == sum
-                    return false
-                end
-
-                self.debug "Replacing %s checksum %s with %s" %
-                    [@resource.title, sum, newvalue]
-                # @resource.debug "currentvalue: %s; @should: %s" % 
-                #    [newvalue, at should]
-                result = true
-            else
-                @resource.debug "Creating checksum %s" % newvalue
-                result = false
-            end
-
-            # Cache the sum so the log message can be right if possible.
-            @cached = sum
-            cache(checktype(), newvalue)
-            return result
-        end
-    end
-end
-
diff --git a/lib/puppet/type/service.rb b/lib/puppet/type/service.rb
index c41a788..1b625cc 100644
--- a/lib/puppet/type/service.rb
+++ b/lib/puppet/type/service.rb
@@ -28,6 +28,8 @@ module Puppet
         feature :enableable, "The provider can enable and disable the service",
             :methods => [:disable, :enable, :enabled?]
 
+        feature :controllable, "The provider uses a control variable."
+
         newproperty(:enable, :required_features => :enableable) do
             desc "Whether a service should be enabled to start at boot.
                 This property behaves quite differently depending on the platform;
@@ -163,6 +165,13 @@ module Puppet
             desc "Specify a *stop* command manually."
         end
 
+        newparam(:control) do
+            desc "The control variable used to manage services (originally for HP-UX).
+                Defaults to the upcased service name plus ``START`` replacing dots with
+                underscores, for those providers that support the ``controllable`` feature."
+            defaultto { resource.name.gsub(".","_").upcase + "_START" if resource.provider.controllable? }
+        end
+
         newparam :hasrestart do
             desc "Specify that an init script has a ``restart`` option.  Otherwise,
                 the init script's ``stop`` and ``start`` methods are used."
diff --git a/lib/puppet/type/sshkey.rb b/lib/puppet/type/sshkey.rb
index bf4b0aa..c2bdd39 100755
--- a/lib/puppet/type/sshkey.rb
+++ b/lib/puppet/type/sshkey.rb
@@ -53,14 +53,14 @@ module Puppet
         end
 
         newparam(:name) do
-            desc "The host name."
+            desc "The host name that the key is associated with."
 
             isnamevar
         end
 
         newproperty(:target) do
-            desc "The file in which to store the mount table.  Only used by
-                those providers that write to disk (i.e., not NetInfo)."
+            desc "The file in which to store the ssh key.  Only used by
+                the ``parsed`` provider."
 
             defaultto { if @resource.class.defaultprovider.ancestors.include?(Puppet::Provider::ParsedFile)
                     @resource.class.defaultprovider.default_target
diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb
index a525755..535d9ef 100644
--- a/lib/puppet/util/autoload.rb
+++ b/lib/puppet/util/autoload.rb
@@ -1,6 +1,9 @@
+require 'puppet/util/warnings'
+
 # Autoload paths, either based on names or all at once.
 class Puppet::Util::Autoload
     include Puppet::Util
+    include Puppet::Util::Warnings
 
     @autoloaders = {}
     @loaded = []
@@ -109,9 +112,8 @@ class Puppet::Util::Autoload
             Dir.glob("#{dir}/*.rb").each do |file|
                 name = File.basename(file).sub(".rb", '').intern
                 next if loaded?(name)
-                rubypath = File.join(@path, name.to_s)
                 begin
-                    Kernel.require rubypath
+                    Kernel.require file
                     loaded(name, file)
                 rescue => detail
                     if Puppet[:trace]
@@ -123,8 +125,6 @@ class Puppet::Util::Autoload
         end
     end
 
-    private
-
     # Yield each subdir in turn.
     def eachdir
         searchpath.each do |dir|
@@ -137,7 +137,7 @@ class Puppet::Util::Autoload
     def searchpath
         # JJM: Search for optional lib directories in each module bundle.
         module_lib_dirs = Puppet[:modulepath].split(":").collect do |d|
-            Dir.glob("%s/*/lib" % d).select do |f|
+            Dir.glob("%s/*/{plugins,lib}" % d).select do |f|
                 FileTest.directory?(f) 
             end
         end.flatten
diff --git a/lib/puppet/util/checksums.rb b/lib/puppet/util/checksums.rb
index 6f6ea59..15d2ead 100644
--- a/lib/puppet/util/checksums.rb
+++ b/lib/puppet/util/checksums.rb
@@ -1,37 +1,75 @@
+# A stand-alone module for calculating checksums
+# in a generic way.
 module Puppet::Util::Checksums
+    # Calculate a checksum using Digest::MD5.
     def md5(content)
         require 'digest/md5'
         Digest::MD5.hexdigest(content)
     end
 
-    def md5_file(filename)
+    # Calculate a checksum of the first 500 chars of the content using Digest::MD5.
+    def md5lite(content)
+        md5(content[0..511])
+    end
+
+    # Calculate a checksum of a file's content using Digest::MD5.
+    def md5_file(filename, lite = false)
         require 'digest/md5'
 
-        incr_digest = Digest::MD5.new()
-        File.open(filename, 'r') do |file|
-            file.each_line do |line|
-                incr_digest << line
-            end
-        end
+        digest = Digest::MD5.new()
+        return checksum_file(digest, filename,  lite)
+    end
+
+    # Calculate a checksum of the first 500 chars of a file's content using Digest::MD5.
+    def md5lite_file(filename)
+        md5_file(filename, true)
+    end
 
-        return incr_digest.hexdigest
+    # Return the :mtime timestamp of a file.
+    def mtime_file(filename)
+        File.stat(filename).send(:mtime)
     end
 
+    # Calculate a checksum using Digest::SHA1.
     def sha1(content)
         require 'digest/sha1'
         Digest::SHA1.hexdigest(content)
     end
 
-    def sha1_file(filename)
+    # Calculate a checksum of the first 500 chars of the content using Digest::SHA1.
+    def sha1lite(content)
+        sha1(content[0..511])
+    end
+
+    # Calculate a checksum of a file's content using Digest::SHA1.
+    def sha1_file(filename, lite = false)
         require 'digest/sha1'
 
-        incr_digest = Digest::SHA1.new()
+        digest = Digest::SHA1.new()
+        return checksum_file(digest, filename, lite)
+    end
+
+    # Calculate a checksum of the first 500 chars of a file's content using Digest::SHA1.
+    def sha1lite_file(filename)
+        sha1_file(filename, true)
+    end
+
+    # Return the :ctime of a file.
+    def ctime_file(filename)
+        File.stat(filename).send(:ctime)
+    end
+
+    private
+
+    # Perform an incremental checksum on a file.
+    def checksum_file(digest, filename, lite = false)
         File.open(filename, 'r') do |file|
-            file.each_line do |line|
-                incr_digest << line
+            while content = file.read(512)
+                digest << content
+                break if lite
             end
         end
 
-        return incr_digest.hexdigest
+        return digest.hexdigest
     end
 end
diff --git a/lib/puppet/util/constant_inflector.rb b/lib/puppet/util/constant_inflector.rb
new file mode 100644
index 0000000..8b08395
--- /dev/null
+++ b/lib/puppet/util/constant_inflector.rb
@@ -0,0 +1,14 @@
+# Created on 2008-02-12
+# Copyright Luke Kanies
+
+# A common module for converting between constants and
+# file names.
+module Puppet::Util::ConstantInflector
+    def file2constant(file)
+        file.split("/").collect { |name| name.capitalize }.join("::").gsub(/_+(.)/) { |term| $1.capitalize }
+    end
+
+    def constant2file(constant)
+        constant.to_s.gsub(/([a-z])([A-Z])/) { |term| $1 + "_" + $2 }.gsub("::", "/").downcase
+    end
+end
diff --git a/lib/puppet/util/filetype.rb b/lib/puppet/util/filetype.rb
index 1c7734c..bbc837e 100755
--- a/lib/puppet/util/filetype.rb
+++ b/lib/puppet/util/filetype.rb
@@ -165,7 +165,7 @@ class Puppet::Util::FileType
 
         # Remove a specific @path's cron tab.
         def remove
-            if Facter.value("operatingsystem") == "FreeBSD"
+            if %w{Darwin FreeBSD}.include?(Facter.value("operatingsystem"))
                 %x{/bin/echo yes | #{cmdbase()} -r 2>/dev/null}
             else
                 %x{#{cmdbase()} -r 2>/dev/null}
diff --git a/lib/puppet/util/graph.rb b/lib/puppet/util/graph.rb
index 028df55..d1ef36f 100644
--- a/lib/puppet/util/graph.rb
+++ b/lib/puppet/util/graph.rb
@@ -16,21 +16,15 @@ module Puppet::Util::Graph
         
         self.each do |child|
             unless block_given? and ! yield(child)
-                graph.add_edge!(self, child)
-
-                if graph.cyclic?
-                    raise Puppet::Error, "%s created a cyclic graph" % self
-                end
+                graph.add_edge(self, child)
                 
                 if child.respond_to?(:to_graph)
                     child.to_graph(graph, &block)
                 end
             end
         end
-        
-        if graph.cyclic?
-            raise Puppet::Error, "%s created a cyclic graph" % self
-        end
+
+        # Do a topsort, which will throw an exception if the graph is cyclic.
         
         graph
     end
diff --git a/lib/puppet/util/nagios_maker.rb b/lib/puppet/util/nagios_maker.rb
new file mode 100644
index 0000000..a7aae4e
--- /dev/null
+++ b/lib/puppet/util/nagios_maker.rb
@@ -0,0 +1,57 @@
+require 'puppet/external/nagios'
+require 'puppet/external/nagios/base'
+require 'puppet/provider/naginator'
+
+module Puppet::Util::NagiosMaker
+    # Create a new nagios type, using all of the parameters
+    # from the parser.
+    def self.create_nagios_type(name)
+        name = name.to_sym
+        full_name = ("nagios_" + name.to_s).to_sym
+
+        raise(Puppet::DevError, "No nagios type for %s" % name) unless nagtype = Nagios::Base.type(name)
+
+        type = Puppet::Type.newtype(full_name) {}
+
+        type.ensurable
+
+        type.newparam(nagtype.namevar, :namevar => true) do
+            desc "The name parameter for Nagios type %s" % nagtype.name
+        end
+
+        # We deduplicate the parameters because it makes sense to allow Naginator to have dupes.
+        nagtype.parameters.uniq.each do |param|
+            next if param == nagtype.namevar
+
+            # We can't turn these parameter names into constants, so at least for now they aren't
+            # supported.
+            next if param.to_s =~ /^[0-9]/
+
+            type.newproperty(param) do
+                desc "Nagios configuration file parameter."
+            end
+        end
+
+        type.newproperty(:target) do
+            desc 'target'
+
+            defaultto do
+                resource.class.defaultprovider.default_target
+            end
+        end
+
+        target = "/etc/nagios/#{full_name.to_s}.cfg"
+        provider = type.provide(:naginator, :parent => Puppet::Provider::Naginator, :default_target => target) {}
+
+        type.desc "The Nagios type #{name.to_s}.  This resource type is autogenerated using the
+            model developed in Naginator_, and all of the Nagios types are generated using the
+            same code and the same library.
+
+            This type generates Nagios configuration statements in Nagios-parseable configuration
+            files.  By default, the statements will be added to ``#{target}``, but
+            you can send them to a different file by setting their ``target`` attribute.
+
+            .. _naginator: http://reductivelabs.com/trac/naginator
+        "
+    end
+end
diff --git a/lib/puppet/util/settings.rb b/lib/puppet/util/settings.rb
index b672d95..259e204 100644
--- a/lib/puppet/util/settings.rb
+++ b/lib/puppet/util/settings.rb
@@ -243,14 +243,7 @@ class Puppet::Util::Settings
 
     # Make a directory with the appropriate user, group, and mode
     def mkdir(default)
-        obj = nil
-        unless obj = @config[default]
-            raise ArgumentError, "Unknown default %s" % default
-        end
-
-        unless obj.is_a? CFile
-            raise ArgumentError, "Default %s is not a file" % default
-        end
+        obj = get_config_default(default)
 
         Puppet::Util::SUIDManager.asuser(obj.owner, obj.group) do
             mode = obj.mode || 0750
@@ -509,19 +502,19 @@ class Puppet::Util::Settings
                 objects += add_user_resources(section, obj, done)
             end
 
+            value = obj.value
+
             # Only files are convertable to transportable resources.
-            if obj.respond_to? :to_transportable
-                next if value(obj.name) =~ /^\/dev/
-                transobjects = obj.to_transportable
-                transobjects = [transobjects] unless transobjects.is_a? Array
-                transobjects.each do |trans|
-                    # transportable could return nil
-                    next unless trans
-                    unless done[:file].include? trans.name
-                        @created << trans.name
-                        objects << trans
-                        done[:file][trans.name] = trans
-                    end
+            next unless obj.respond_to? :to_transportable and transobjects = obj.to_transportable
+
+            transobjects = [transobjects] unless transobjects.is_a? Array
+            transobjects.each do |trans|
+                # transportable could return nil
+                next unless trans
+                unless done[:file].include? trans.name
+                    @created << trans.name
+                    objects << trans
+                    done[:file][trans.name] = trans
                 end
             end
         end
@@ -737,49 +730,15 @@ Generated on #{Time.now}.
     end
 
     # Open a file with the appropriate user, group, and mode
-    def write(default, *args)
-        obj = nil
-        unless obj = @config[default]
-            raise ArgumentError, "Unknown default %s" % default
-        end
-
-        unless obj.is_a? CFile
-            raise ArgumentError, "Default %s is not a file" % default
-        end
-
-        chown = nil
-        if Puppet::Util::SUIDManager.uid == 0
-            chown = [obj.owner, obj.group]
-        else
-            chown = [nil, nil]
-        end
-        Puppet::Util::SUIDManager.asuser(*chown) do
-            mode = obj.mode || 0640
-
-            if args.empty?
-                args << "w"
-            end
-
-            args << mode
-
-            File.open(value(obj.name), *args) do |file|
-                yield file
-            end
-        end
+    def write(default, *args, &bloc)
+        obj = get_config_default(default)
+        writesub(default, value(obj.name), *args, &bloc)
     end
 
     # Open a non-default file under a default dir with the appropriate user,
     # group, and mode
-    def writesub(default, file, *args)
-        obj = nil
-        unless obj = @config[default]
-            raise ArgumentError, "Unknown default %s" % default
-        end
-
-        unless obj.is_a? CFile
-            raise ArgumentError, "Default %s is not a file" % default
-        end
-
+    def writesub(default, file, *args, &bloc)
+        obj = get_config_default(default)
         chown = nil
         if Puppet::Util::SUIDManager.uid == 0
             chown = [obj.owner, obj.group]
@@ -804,8 +763,51 @@ Generated on #{Time.now}.
         end
     end
 
+    def readwritelock(default, *args, &bloc)
+        file = value(get_config_default(default).name)
+        tmpfile = file + ".tmp"
+        sync = Sync.new
+        unless FileTest.directory?(File.dirname(tmpfile))
+            raise Puppet::DevError, "Cannot create %s; directory %s does not exist" %
+                [file, File.dirname(file)]
+        end
+
+        sync.synchronize(Sync::EX) do
+            File.open(file, "r+", 0600) do |rf|
+                rf.lock_exclusive do
+                    if File.exist?(tmpfile)
+                        raise Puppet::Error, ".tmp file already exists for %s; Aborting locked write. Check the .tmp file and delete if appropriate" %
+                            [file]
+                    end
+
+                    writesub(default, tmpfile, *args, &bloc)
+
+                    begin
+                        File.rename(tmpfile, file)
+                    rescue => detail
+                        Puppet.err "Could not rename %s to %s: %s" %
+                            [file, tmpfile, detail]
+                    end
+                end
+            end
+        end
+    end
+
     private
 
+    def get_config_default(default)
+        obj = nil
+        unless obj = @config[default]
+            raise ArgumentError, "Unknown default %s" % default
+        end
+
+        unless obj.is_a? CFile
+            raise ArgumentError, "Default %s is not a file" % default
+        end
+
+        return obj
+    end
+    
     # Create the transportable objects for users and groups.
     def add_user_resources(section, obj, done)
         resources = []
@@ -1124,7 +1126,7 @@ Generated on #{Time.now}.
         # the variable 'dir', or adding a slash at the end.
         def munge(value)
             # If it's not a fully qualified path...
-            if value.is_a?(String) and value !~ /^\$/ and value !~ /^\//
+            if value.is_a?(String) and value !~ /^\$/ and value !~ /^\// and value != 'false'
                 # Make it one
                 value = File.join(Dir.getwd, value)
             end
@@ -1153,12 +1155,15 @@ Generated on #{Time.now}.
         def to_transportable
             type = self.type
             return nil unless type
-            path = @parent.value(self.name).split(File::SEPARATOR)
-            path.shift # remove the leading nil
 
-            objects = []
             path = self.value
 
+            return nil unless path.is_a?(String)
+            return nil if path =~ /^\/dev/
+            return nil if Puppet::Type.type(:file)[path] # skip files that are in our global resource list.
+
+            objects = []
+
             # Skip plain files that don't exist, since we won't be managing them anyway.
             return nil unless self.name.to_s =~ /dir$/ or File.exist?(path) or self.create
             obj = Puppet::TransObject.new(path, "file")
diff --git a/lib/puppet/util/tagging.rb b/lib/puppet/util/tagging.rb
new file mode 100644
index 0000000..8a50f34
--- /dev/null
+++ b/lib/puppet/util/tagging.rb
@@ -0,0 +1,39 @@
+# Created on 2008-01-19
+# Copyright Luke Kanies
+
+# A common module to handle tagging.
+module Puppet::Util::Tagging
+    # Add a tag to our current list.  These tags will be added to all
+    # of the objects contained in this scope.
+    def tag(*ary)
+        @tags ||= []
+
+        qualified = []
+
+        ary.collect { |tag| tag.to_s.downcase }.each do |tag|
+            fail(Puppet::ParseError, "Invalid tag %s" % tag.inspect) unless valid_tag?(tag)
+            qualified << tag if tag.include?("::")
+            @tags << tag unless @tags.include?(tag)
+        end
+
+        qualified.collect { |name| name.split("::") }.flatten.each { |tag| @tags << tag unless @tags.include?(tag) }
+    end
+
+    # Are we tagged with the provided tag?
+    def tagged?(tag)
+        defined?(@tags) and @tags.include?(tag.to_s)
+    end
+
+    # Return a copy of the tag list, so someone can't ask for our tags
+    # and then modify them.
+    def tags
+        @tags ||= []
+        @tags.dup
+    end
+
+    private
+
+    def valid_tag?(tag)
+        tag =~ /^\w[-\w:.]*$/
+    end
+end
diff --git a/man/man8/puppet.8 b/man/man8/puppet.8
new file mode 100644
index 0000000..53e5270
--- /dev/null
+++ b/man/man8/puppet.8
@@ -0,0 +1,513 @@
+.\" -*- nroff -*-
+.\" This file may be copied under the terms of the GNU Public License.
+.\" 
+.TH PUPPET 8 "Jan 2007" "Reductive Labs"
+.SH NAME
+puppet, puppetmasterd, ca \- automated configuration management
+.SH SYNOPSIS
+.B puppet
+.RI [options]
+.br
+.B puppetmasterd
+.RI [options]
+.br
+.B ca
+.RI [options]
+.SH DESCRIPTION
+This document is intended as a secondary reference only.  Please refer to the complete documentation on the
+.B puppet
+website:
+.PP
+\h"4"http://www.reductivelabs.com/trac/puppet/wiki/DocumentationStart
+.PP
+Every 
+.B puppet
+executable (with the exception of 
+.B puppetdoc
+) accepts all of the arguments below, but not all of the arguments make sense for every executable. Each argument has a section listed with it in parentheses; often, that section will map to an executable (e.g., 
+.B puppetd
+), in which case it probably only makes sense for that one executable. If 
+.B puppet
+is listed as the section, it is most likely an option that is valid for everyone.
+.PP
+This will not always be the case. I have tried to be as thorough as possible in the descriptions of the arguments, so it should be obvious whether an argument is appropriate or not.
+.PP
+These arguments can be supplied to the executables either as command-line arugments or in the configuration file for the appropriate executable. For instance, the command-line invocation below would set the configuration directory to /private/puppet:
+.PP
+\h"4"$ puppetd --confdir=/private/puppet
+.PP
+Note that boolean options are turned on and off with a slightly different syntax on the command line:
+.PP
+\h"4"$ puppetd --storeconfigs
+.PP
+\h"4"$ puppetd --no-storeconfigs
+.PP
+The invocations above will enable and disable, respectively, the storage of the client configuration.
+.PP
+As mentioned above, the configuration parameters can also be stored in a configuration file located in the configuration directory (/etc/puppet by default). The file is called puppet.conf.
+.PP
+The file, which follows INI-style formatting, should contain a bracketed heading named for each executable, followed by pairs of parameters with their values. Here is an example of a very simple puppet.conf file:
+.PP
+\h"4"[puppetd]
+.br
+\h"4"confdir = /private/puppet
+.br
+\h"4"storeconfigs = true
+.br
+.PP
+Note that boolean parameters must be explicitly specified as true or false as seen above.
+.PP
+If you're starting out with a fresh configuration, you may wish to let the executable generate a template configuration file for you by invoking the executable in question with the --genconfig command. The executable will print a template configuration to standard output, which can be redirected to a file like so:
+.PP
+\h"4"$ puppetd --genconfig > /etc/puppet/puppet.conf
+.PP
+Note that this invocation will "clobber" (throw away) the contents of any pre-existing puppet.conf file, so make a backup of your present config if it contains valuable information.
+.PP
+Like the --genconfig argument, the executables also accept a --genmanifest argument, which will generate a manifest that can be used to manage all of 
+.B Puppet's
+directories and files and prints it to standard output. This can likewise be redirected to a file:
+.PP
+\h"4"$ puppetd --genmanifest > /etc/puppet/manifests/site.pp
+.PP
+.B Puppet
+can also create user and group accounts for itself (one puppet group and one puppet user) if it is invoked as root with the --mkusers argument:
+.PP
+\h"4"$ puppetd --mkusers
+.PP
+.SH SIGNALS
+The 
+.B puppetd
+and
+.B puppetmasterd
+executables catch some signals for special handling. Both daemons catch (SIGHUP), which forces the server to restart tself. Predictably, interrupt and terminate (SIGINT and SIGHUP) will shut down the server, whether it be an instance of 
+.B puppetd
+or
+.B puppetmasterd.
+.PP
+Sending the SIGUSR1 signal to an instance of 
+.B puppetd
+will cause it to immediately begin a new configuration transaction with the server. This signal has no effect on 
+.B puppetmasterd.
+.SH OPTIONS
+.TP
+.B \-\-authconfig
+(puppet) The configuration file that defines the rights to the different namespaces and methods. This can be used as a coarse-grained authorization system for both 
+.B puppetd
+and
+.B puppetmasterd
+. Default value is: /etc/puppet/namespaceauth.conf
+.TP
+.B \-\-autoflush
+(puppet) Whether log files should always flush to disk.
+.TP
+.B \-\-autosign
+(ca) Whether to enable autosign. Valid values are true (which autosigns any key request, and is a very bad idea), false (which never autosigns any key request), and the path to a file, which uses that configuration file to determine which keys to sign. Default value is: /etc/puppet/autosign.conf
+.TP
+.B \-\-bucketdir
+(puppetmasterd) Where FileBucket files are stored. Default value is: /var/puppet/bucket
+.TP
+.B \-\-ca_days
+(ca) How long a certificate should be valid. This parameter is deprecated, use ca_ttl instead
+.TP
+.B \-\-ca_md
+(ca) The type of hash used in certificates. Default value is: md5
+.TP
+.B \-\-ca_ttl
+(ca) The default TTL for new certificates; valid values must be an integer, optionally followed by one of the units 'y' (years of 365 days), 'd' (days), 'h' (hours), or 's' (seconds). The unit defaults to seconds. If this parameter is set, ca_days is ignored. Examples are '3600' (one hour) and '1825d', which is the same as '5y' (5 years) 5y
+.TP
+.B \-\-cacert
+(ca) The CA certificate. Default value is: /etc/puppet/ssl/ca/ca_crt.pem
+.TP
+.B \-\-cacrl
+(ca) The certificate revocation list (CRL) for the CA. Set this to 'none' if you do not want to use a CRL. Default value is: /etc/puppet/ssl/ca/ca_crl.pem
+.TP
+.B \-\-cadir
+(ca) The root directory for the certificate authority. Default value is: /etc/puppet/ssl/ca
+.TP
+.B \-\-cakey
+(ca) The CA private key. Default value is: /etc/puppet/ssl/ca/ca_key.pem
+.TP
+.B \-\-capass
+(ca) Where the CA stores the password for the private key. Default value is: /etc/puppet/ssl/ca/private/ca.pass
+.TP
+.B \-\-caprivatedir
+(ca) Where the CA stores private certificate information. Default value is: /etc/puppet/ssl/ca/private
+.TP
+.B \-\-capub
+(ca) The CA public key. Default value is: /etc/puppet/ssl/ca/ca_pub.pem
+.TP
+.B \-\-casesensitive
+(puppet) Whether matching in case statements and selectors should be case-sensitive. Case insensitivity is handled by downcasing all values before comparison.
+.TP
+.B \-\-cert_inventory
+(ca) A Complete listing of all certificates. Default value is: /etc/puppet/ssl/ca/inventory.txt
+.TP
+.B \-\-certdir
+(certificates) The certificate directory. Default value is: /etc/puppet/ssl/certs
+.TP
+.B \-\-classfile
+(puppetd) The file in which 
+.B puppetd
+stores a list of the classes associated with the retrieved configuratiion. Can be loaded in the separate puppet executable using the --loadclasses option. Default value is: /etc/puppet/classes.txt
+.TP
+.B \-\-clientbucketdir
+(filebucket) Where FileBucket files are stored locally. Default value is: /var/puppet/clientbucket
+.TP
+.B \-\-color
+(puppet) Whether to use colors when logging to the console. Valid values are ansi (equivalent to true), html (mostly used during testing with TextMate), and false, which produces no color. Default value is: ansi
+.TP
+.B \-\-confdir
+(puppet) The main Puppet configuration directory. Default value is: /etc/puppet
+.TP
+.B \-\-config
+(puppetdoc) The configuration file for puppetdoc. Default value is: /etc/puppet/puppetdoc.conf
+.TP
+.B \-\-configprint
+(puppet) Print the value of a specific configuration parameter. If a parameter is provided for this, then the value is printed and puppet exits. Comma-separate mul.TPle values. For a list of all values, specify 'all'. This feature is only available in Puppet versions higher than 0.18.4.
+.TP
+.B \-\-csrdir
+(ca) Where the CA stores certificate requests Default value is: /etc/puppet/ssl/ca/requests
+.TP
+.B \-\-dbadapter
+(puppetmaster) The type of database to use. Default value is: sqlite3
+.TP
+.B \-\-dblocation
+(puppetmaster) The database cache for client configurations. Used for querying within the language. Default value is: /var/puppet/state/clientconfigs.sqlite3
+.TP
+.B \-\-dbmigrate
+(puppetmaster) Whether to automatically migrate the database.
+.TP
+.B \-\-dbname
+(puppetmaster) The name of the database to use. Default value is: puppet
+.TP
+.B \-\-dbpassword
+(puppetmaster) The database password for Client caching. Only used when networked databases are used. Default value is: puppet
+.TP
+.B \-\-dbserver
+(puppetmaster) The database server for Client caching. Only used when networked databases are used. Default value is: localhost
+.TP
+.B \-\-dbuser
+(puppetmaster) The database user for Client caching. Only used when networked databases are used. Default value is: puppet
+.TP
+.B \-\-evaltrace
+(transaction) Whether each resource should log when it is being evaluated. This allows you to interactively see exactly what is being done.
+.TP
+.B \-\-external_nodes
+(puppet) An external command that can produce node information. The first line of output must be either the parent node or blank, and if there is a second line of output it should be a list of whitespace-separated classes to include on that node. This command makes it straightforward to store your node mapping information in other data sources like databases. For unknown nodes, the commands should exit with an exit code of 1. Default value is: none
+.TP
+.B \-\-factdest
+(puppet) Where Puppet should store facts that it pulls down from the central server. Default value is: /var/puppet/facts
+.TP
+.B \-\-factpath
+(puppet) Where Puppet should look for facts. Mul.TPle directories should be colon-separated, like normal PATH variables. Default value is: /var/puppet/facts
+.TP
+.B \-\-factsignore
+(puppet) What files to ignore when pulling down facts. Default value is: .svn CVS
+.TP
+.B \-\-factsource
+(puppet) From where to retrieve facts. The standard Puppet file type is used for retrieval, so anything that is a valid file source can be used here. Default value is: puppet://puppet/facts
+.TP
+.B \-\-factsync
+(puppet) Whether facts should be synced with the central server.
+.TP
+.B \-\-fileserverconfig
+(fileserver) Where the fileserver configuration is stored. Default value is: /etc/puppet/fileserver.conf
+.TP
+.B \-\-filetimeout
+(puppet) The minimum time to wait between checking for updates in configuration files. Default value is: 15
+.TP
+.B \-\-genconfig
+(puppet) Whether to just print a configuration to stdout and exit. Only makes sense when used interactively. Takes into account arguments specified on the CLI.
+.TP
+.B \-\-genmanifest
+(puppet) Whether to just print a manifest to stdout and exit. Only makes sense when used interactively. Takes into account arguments specified on the CLI.
+.TP
+.B \-\-graph
+(puppet) Whether to create dot graph files for the different configuration graphs. These dot files can be interpreted by tools like OmniGraffle or dot (which is part of ImageMagick).
+.TP
+.B \-\-graphdir
+(puppet) Where to store dot-outputted graphs. Default value is: /var/puppet/state/graphs
+.TP
+.B \-\-group
+(puppetmasterd) The group 
+.B puppetmasterd
+ should run as. Default value is: puppet
+.TP
+.B \-\-hostcert
+(certificates) Where individual hosts store and look for their certificates. Default value is: /etc/puppet/ssl/certs/culain.madstop.com.pem
+.TP
+.B \-\-hostprivkey
+(certificates) Where individual hosts store and look for their private key. Default value is: /etc/puppet/ssl/private_keys/culain.madstop.com.pem
+.TP
+.B \-\-hostpubkey
+(certificates) Where individual hosts store and look for their public key. Default value is: /etc/puppet/ssl/public_keys/culain.madstop.com.pem
+.TP
+.B \-\-httplog
+(puppetd) Where the 
+.B puppetd
+web server logs. Default value is: /var/puppet/log/http.log
+.TP
+.B \-\-ignoreschedules
+(puppetd) Boolean; whether 
+.B puppetd
+should ignore schedules. Default value is: This is useful for initial 
+.B puppetd
+runs.
+.TP
+.B \-\-keylength
+(ca) The bit length of keys. Default value is: 1024
+.TP
+.B \-\-ldapattrs
+(ldap) The LDAP attributes to use to define Puppet classes. Values should be comma-separated. Default value is: puppetclass
+.TP
+.B \-\-ldapbase
+(ldap) The search base for LDAP searches. It's impossible to provide a meaningful default here, although the LDAP libraries might have one already set. Generally, it should be the 'ou=Hosts' branch under your main directory.
+.TP
+.B \-\-ldapnodes
+(ldap) Whether to search for node configurations in LDAP.
+.TP
+.B \-\-ldapparentattr
+(ldap) The attribute to use to define the parent node. Default value is: parentnode
+.TP
+.B \-\-ldappassword
+(ldap) The password to use to connect to LDAP.
+.TP
+.B \-\-ldapport
+(ldap) The LDAP port. Only used if ldapnodes is enabled. Default value is: 389
+.TP
+.B \-\-ldapserver
+(ldap) The LDAP server. Only used if ldapnodes is enabled. Default value is: ldap
+.TP
+.B \-\-ldapssl
+(ldap) Whether SSL should be used when searching for nodes. Defaults to false because SSL usually requires certificates to be set up on the client side.
+.TP
+.B \-\-ldapstring
+Default value is: (ldap) 
+.TP
+.B \-\-The search string used to find an LDAP node.
+Default value is: (&(objectclass=puppetClient)(cn=%s)) 
+.TP
+.B \-\-ldaptls
+(ldap) Whether TLS should be used when searching for nodes. Defaults to false because TLS usually requires certificates to be set up on the client side.
+.TP
+.B \-\-ldapuser
+(ldap) The user to use to connect to LDAP. Must be specified as a full DN.
+.TP
+.B \-\-lexical
+(puppet) Whether to use lexical scoping (vs. dynamic).
+.TP
+.B \-\-listen
+(puppetd) Whether 
+.B puppetd
+should listen for connections. If this is true, then by default only the runner server is started, which allows remote authorized and authenticated nodes to connect and trigger 
+.B puppetd
+runs.
+.TP
+.B \-\-localcacert
+(certificates) Where each client stores the CA certificate. Default value is: /etc/puppet/ssl/certs/ca.pem
+.TP
+.B \-\-localconfig
+(puppetd) Where 
+.B puppetd
+caches the local configuration. An extension indicating the cache format is added automatically. Default value is: /etc/puppet/localconfig
+.TP
+.B \-\-lockdir
+(puppet) Where lock files are kept. Default value is: /var/puppet/locks
+.TP
+.B \-\-logdir
+(puppet) The Puppet log directory. Default value is: /var/puppet/log
+.TP
+.B \-\-manifest
+(puppetmasterd) The entry-point manifest for 
+.B puppetmasterd
+. Default value is: /etc/puppet/manifests/site.pp
+.TP
+.B \-\-manifestdir
+(puppetmasterd) Where 
+.B puppetmasterd
+ looks for its manifests. Default value is: /etc/puppet/manifests
+.TP
+.B \-\-masterhttplog
+(puppetmasterd) Where the 
+.B puppetmasterd
+ web server logs. Default value is: /var/puppet/log/masterhttp.log
+.TP
+.B \-\-masterlog
+(puppetmasterd) Where 
+.B puppetmasterd
+ logs. This is generally not used, since syslog is the default log destination. Default value is: /var/puppet/log/puppetmaster.log
+.TP
+.B \-\-masterport
+(puppetmasterd) Which port 
+.B puppetmasterd
+ listens on. Default value is: 8140
+.TP
+.B \-\-mkusers
+(puppet) Whether to create the necessary user and group that 
+.B puppetd
+will run as.
+.TP
+.B \-\-node_name
+(puppetmasterd) How the puppetmaster determines the client's identity and sets the 'hostname' fact for use in the manifest, in particular for determining which 'node' statement applies to the client. Possible values are 'cert' (use the subject's CN in the client's certificate) and 'facter' (use the hostname that the client reported in its facts) Default value is: cert
+.TP
+.B \-\-noop
+(puppetd) Whether 
+.B puppetd
+should be run in noop mode.
+.TP
+.B \-\-paramcheck
+(ast) Whether to validate parameters during parsing. Default value is: true
+.TP
+.B \-\-parseonly
+(puppetmasterd) Just check the syntax of the manifests.
+.TP
+.B \-\-passfile
+(certificates) Where 
+.B puppetd
+stores the password for its private key. Generally unused. Default value is: /etc/puppet/ssl/private/password
+.TP
+.B \-\-path
+(puppet) The shell search path. Defaults to whatever is inherited from the parent process. Default value is: none
+.TP
+.B \-\-plugindest
+(puppet) Where Puppet should store plugins that it pulls down from the central server. Default value is: /var/puppet/plugins
+.TP
+.B \-\-pluginpath
+(puppet) Where Puppet should look for plugins. Mul.TPle directories should be colon-separated, like normal PATH variables. Default value is: /var/puppet/plugins
+.TP
+.B \-\-pluginsignore
+(puppet) What files to ignore when pulling down plugins. Default value is: .svn CVS
+.TP
+.B \-\-pluginsource
+(puppet) From where to retrieve plugins. The standard Puppet file type is used for retrieval, so anything that is a valid file source can be used here. Default value is: puppet://puppet/plugins
+.TP
+.B \-\-pluginsync
+(puppet) Whether plugins should be synced with the central server.
+.TP
+.B \-\-privatedir
+(certificates) Where the client stores private certificate information. Default value is: /etc/puppet/ssl/private
+.TP
+.B \-\-privatekeydir
+(certificates) The private key directory. Default value is: /etc/puppet/ssl/private_keys
+.TP
+.B \-\-publickeydir
+(certificates) The public key directory. Default value is: /etc/puppet/ssl/public_keys
+.TP
+.B \-\-puppetdlockfile
+(puppetd) A lock file to temporarily stop 
+.B puppetd
+from doing anything. Default value is: /var/puppet/state/puppetdlock
+.TP
+.B \-\-puppetdlog
+(puppetd) The log file for puppetd. This is generally not used. Default value is: /var/puppet/log/puppetd.log
+.TP
+.B \-\-puppetport
+(puppetd) Which port 
+.B puppetd
+listens on. Default value is: 8139
+.TP
+.B \-\-railslog
+(puppetmaster) Where Rails-specific logs are sent Default value is: /var/puppet/log/rails.log
+.TP
+.B \-\-report
+(puppetd) Whether to send reports after every transaction.
+.TP
+.B \-\-reportdir
+(reporting) The directory in which to store reports received from the client. Each client gets a separate subdirectory. /var/puppet/reports
+.TP
+.B \-\-reports
+(reporting) The list of reports to generate. All reports are looked for in puppet/reports/.rb, and mul.TPle report names should be comma-separated (whitespace is okay). Default value is: store
+.TP
+.B \-\-reportserver
+(puppetd) The server to which to send transaction reports. Default value is: puppet
+.TP
+.B \-\-req_bits
+(ca) The bit length of the certificates. Default value is: 2048
+.TP
+.B \-\-rrddir
+(metrics) The directory where RRD database files are stored. Directories for each reporting host will be created under this directory. Default value is: /var/puppet/rrd
+.TP
+.B \-\-rrdgraph
+(metrics) Whether RRD information should be graphed.
+.TP
+.B \-\-rrdinterval
+(metrics) How often RRD should expect data. This should match how often the hosts report back to the server. Default value is: 1800
+.TP
+.B \-\-rundir
+(puppet) Where Puppet PID files are kept. Default value is: /var/puppet/run
+.TP
+.B \-\-runinterval
+(puppetd) How often 
+.B puppetd
+applies the client configuration; in seconds Default value is: 1800
+.TP
+.B \-\-serial
+(ca) Where the serial number for certificates is stored. Default value is: /etc/puppet/ssl/ca/serial
+.TP
+.B \-\-server
+(puppetd) The server to which server 
+.B puppetd
+should connect puppet
+.TP
+.B \-\-setpidfile
+(puppet) Whether to store a PID file for the daemon. Default value is: true
+.TP
+.B \-\-signeddir
+(ca) Where the CA stores signed certificates. Default value is: /etc/puppet/ssl/ca/signed
+.TP
+.B \-\-ssldir
+(puppet) Where SSL certificates are kept. Default value is: /etc/puppet/ssl
+.TP
+.B \-\-statedir
+(puppet) The directory where Puppet state is stored. Generally, this directory can be removed without causing harm (although it might result in spurious service restarts). Default value is: /var/puppet/state
+.TP
+.B \-\-statefile
+(puppet) Where 
+.B puppetd
+and 
+.B puppetmasterd
+ store state associated with the running configuration. In the case of puppetmasterd, this file reflects the state discovered through interacting with clients. Default value is: /var/puppet/state/state.yaml
+.TP
+.B \-\-storeconfigs
+(puppetmaster) Whether to store each client's configuration. This requires ActiveRecord from Ruby on Rails.
+.TP
+.B \-\-syslogfacility
+(puppet) What syslog facility to use when logging to syslog. Syslog has a fixed list of valid facilities, and you must choose one of those; you cannot just make one up. daemon
+.TP
+.B \-\-tags
+(transaction) Tags to use to find resources. If this is set, then only resources tagged with the specified tags will be applied. Values must be comma-separated.
+.TP
+.B \-\-templatedir
+(puppet) Where Puppet looks for template files. Default value is: /var/puppet/templates
+.TP
+.B \-\-trace
+(puppet) Whether to print stack traces on some errors
+.TP
+.B \-\-typecheck
+(ast) Whether to validate types during parsing. Default value is: true
+.TP
+.B \-\-usecacheonfailure
+(puppetd) Whether to use the cached configuration when the remote configuration will not compile. This option is useful for testing new configurations, where you want to fix the broken configuration rather than reverting to a known-good one. Default value is: true
+.TP
+.B \-\-user
+(puppetmasterd) The user 
+.B puppetmasterd
+ should run as. Default value is: puppet
+.TP
+.B \-\-vardir
+(puppet) Where Puppet stores dynamic and growing data. Default value is: /var/puppet
+.SH SEE ALSO
+.br
+http://www.reductivelabs.com/projects/puppet
+.br
+http://www.reductivelabs.com/trac/puppet/wiki/DocumentationStart
+.PP
+.SH AUTHOR
+.B puppet 
+was written by Luke Kanies (luke at reductivelabs.com) along with contributions from a great many tireless developers.
+.SH AVAILABILITY
+.B puppet
+is available from http://www.reductivelabs.com/downloads/.
+.SH SEE ALSO
+.BR facter (8)
+
diff --git a/test/README b/test/README
new file mode 100644
index 0000000..82a749a
--- /dev/null
+++ b/test/README
@@ -0,0 +1,24 @@
+$Id$
+
+To run all tests, run: 'rake test'.  To run an individual suite, run the file
+directly.  e.g. cd test/util; ./utiltest.rb
+
+You might need to run some tests as root.
+
+If you do not have rake installed:
+  gem install rake
+
+## The following information is possibly out of date?
+
+Tests are organized into a dual hierarchy: each subdirectory is
+considered a test suite, and each file in the subdirectory is considered
+a test case.  You can use any test case as an example of how to write
+more of them, but basically the only requirements are that they each have
+their own class names, their names each match /tc_.+\.r/, and that they have
+the following header:
+
+if __FILE__ == $0
+    $:.unshift '..'
+    $:.unshift '../../lib'
+    $blinkbase = "../.."
+end
diff --git a/test/data/failers/badclassnoparam b/test/data/failers/badclassnoparam
new file mode 100644
index 0000000..a0397aa
--- /dev/null
+++ b/test/data/failers/badclassnoparam
@@ -0,0 +1,10 @@
+class comp() {
+    file { "/etc/passwd":
+        mode => 644
+    }
+}
+
+# this argument is invalid, thus we should get a falure
+comp {
+    fakearg => "yay"
+}
diff --git a/test/data/failers/badclassparam b/test/data/failers/badclassparam
new file mode 100644
index 0000000..4c9ff61
--- /dev/null
+++ b/test/data/failers/badclassparam
@@ -0,0 +1,10 @@
+class comp(arg1) {
+    file { "/etc/passwd":
+        mode => 644
+    }
+}
+
+# i've specified an arg but it's an invalid one
+comp {
+    fakearg => "yay"
+}
diff --git a/test/data/failers/badcompnoparam b/test/data/failers/badcompnoparam
new file mode 100644
index 0000000..fd25c94
--- /dev/null
+++ b/test/data/failers/badcompnoparam
@@ -0,0 +1,9 @@
+define comp() {
+    file { "/etc/passwd":
+        mode => 644
+    }
+}
+
+comp {
+    fakearg => "yay"
+}
diff --git a/test/data/failers/badcompparam b/test/data/failers/badcompparam
new file mode 100644
index 0000000..346e64b
--- /dev/null
+++ b/test/data/failers/badcompparam
@@ -0,0 +1,9 @@
+define comp($arg1) {
+    file { "/etc/passwd":
+        mode => 644
+    }
+}
+
+comp {
+    fakearg => "yay"
+}
diff --git a/test/data/failers/badtypeparam b/test/data/failers/badtypeparam
new file mode 100644
index 0000000..4634f20
--- /dev/null
+++ b/test/data/failers/badtypeparam
@@ -0,0 +1,3 @@
+file { "/etc/passwd":
+    fakeparam => 644
+}
diff --git a/test/data/failers/noobjectrvalue b/test/data/failers/noobjectrvalue
new file mode 100644
index 0000000..ef60647
--- /dev/null
+++ b/test/data/failers/noobjectrvalue
@@ -0,0 +1 @@
+$variable = file { "/etc/passwd": owner => root }
diff --git a/test/data/providers/cron/crontab.allthree b/test/data/providers/cron/crontab.allthree
new file mode 100644
index 0000000..dd2a404
--- /dev/null
+++ b/test/data/providers/cron/crontab.allthree
@@ -0,0 +1,17 @@
+--- 
+- |
+  # comment 1
+  # Puppet Name: name2
+  env3=val
+  * * * * * command4
+  # comment 5
+
+- - :record_type: :comment
+    :line: "# comment 1"
+  - :command: command4
+    :environment: 
+    - env3=val
+    :name: name2
+    :record_type: :crontab
+  - :record_type: :comment
+    :line: "# comment 5"
diff --git a/test/data/providers/cron/crontab.envNcomment b/test/data/providers/cron/crontab.envNcomment
new file mode 100644
index 0000000..63effe0
--- /dev/null
+++ b/test/data/providers/cron/crontab.envNcomment
@@ -0,0 +1,12 @@
+--- 
+- |
+  # comment 9
+  env10=val
+  * * * * * command11
+
+- - :record_type: :comment
+    :line: "# comment 9"
+  - :record_type: :environment
+    :line: env10=val
+  - :command: command11
+    :record_type: :crontab
diff --git a/test/data/providers/cron/crontab.envNname b/test/data/providers/cron/crontab.envNname
new file mode 100644
index 0000000..cc05824
--- /dev/null
+++ b/test/data/providers/cron/crontab.envNname
@@ -0,0 +1,11 @@
+--- 
+- |
+  env6=val
+  # Puppet Name: name7
+  * * * * * command8
+
+- - :record_type: :environment
+    :line: env6=val
+  - :command: command8
+    :record_type: :crontab
+    :name: name7
diff --git a/test/data/providers/cron/crontab.multirecords b/test/data/providers/cron/crontab.multirecords
new file mode 100644
index 0000000..63effe0
--- /dev/null
+++ b/test/data/providers/cron/crontab.multirecords
@@ -0,0 +1,12 @@
+--- 
+- |
+  # comment 9
+  env10=val
+  * * * * * command11
+
+- - :record_type: :comment
+    :line: "# comment 9"
+  - :record_type: :environment
+    :line: env10=val
+  - :command: command11
+    :record_type: :crontab
diff --git a/test/data/providers/cron/crontab_collections.yaml b/test/data/providers/cron/crontab_collections.yaml
new file mode 100644
index 0000000..45c8eaf
--- /dev/null
+++ b/test/data/providers/cron/crontab_collections.yaml
@@ -0,0 +1,44 @@
+--- 
+:with_name: 
+- :name
+- :spaces_in_command_with_times
+:with_env: 
+- :environment
+- :spaces_in_command_with_times
+:simple: 
+- :spaces_in_command_with_times
+:with_multiple_envs: 
+- :environment
+- :lowercase_environment
+- :spaces_in_command_with_times
+:with_name_and_env: 
+- :name_with_spaces
+- :another_env
+- :spaces_in_command_with_times
+:with_name_and_multiple_envs: 
+- :long_name
+- :another_env
+- :fourth_env
+- :spaces_in_command_with_times
+--- 
+:with_name: 
+- :name
+- :spaces_in_command_with_times
+:with_env: 
+- :environment
+- :spaces_in_command_with_times
+:simple: 
+- :spaces_in_command_with_times
+:with_multiple_envs: 
+- :environment
+- :lowercase_environment
+- :spaces_in_command_with_times
+:with_name_and_env: 
+- :name_with_spaces
+- :another_env
+- :spaces_in_command_with_times
+:with_name_and_multiple_envs: 
+- :long_name
+- :another_env
+- :fourth_env
+- :spaces_in_command_with_times
diff --git a/test/data/providers/cron/crontab_multiple_with_env.yaml b/test/data/providers/cron/crontab_multiple_with_env.yaml
new file mode 100644
index 0000000..8573bd4
--- /dev/null
+++ b/test/data/providers/cron/crontab_multiple_with_env.yaml
@@ -0,0 +1,54 @@
+--- 
+- |
+  # comment 1
+  # Puppet Name: name2
+  env3=val
+  * * * * * command4
+  # Puppet Name: name with spaces
+  env3=val
+  env4=other
+  * * * * * command5
+  # comment 5
+
+- - :record_type: :comment
+    :line: "# comment 1"
+  - :command: command4
+    :environment: 
+    - env3=val
+    :name: name2
+    :record_type: :crontab
+  - :command: command5
+    :environment: 
+    - env3=val
+    - env4=other
+    :name: name with spaces
+    :record_type: :crontab
+  - :record_type: :comment
+    :line: "# comment 5"
+--- 
+- |
+  # comment 1
+  # Puppet Name: name2
+  env3=val
+  * * * * * command4
+  # Puppet Name: name with spaces
+  env3=val
+  env4=other
+  * * * * * command5
+  # comment 5
+
+- - :record_type: :comment
+    :line: "# comment 1"
+  - :command: command4
+    :environment: 
+    - env3=val
+    :name: name2
+    :record_type: :crontab
+  - :command: command5
+    :environment: 
+    - env3=val
+    - env4=other
+    :name: name with spaces
+    :record_type: :crontab
+  - :record_type: :comment
+    :line: "# comment 5"
diff --git a/test/data/providers/cron/crontab_sample_records.yaml b/test/data/providers/cron/crontab_sample_records.yaml
new file mode 100644
index 0000000..cafe9de
--- /dev/null
+++ b/test/data/providers/cron/crontab_sample_records.yaml
@@ -0,0 +1,272 @@
+--- 
+:longcommment: 
+  :text: "# This is a comment"
+  :record: 
+    :line: "# This is a comment"
+    :record_type: :comment
+:special: 
+  :text: "@hourly /bin/date"
+  :record: 
+    :special: hourly
+    :command: /bin/date
+    :record_type: :freebsd_special
+:long_name: 
+  :text: "# Puppet Name: long_name"
+  :record: 
+    :line: "# Puppet Name: long_name"
+    :name: long_name
+    :record_type: :comment
+:multiple_minutes: 
+  :text: 5,15 * * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    - "15"
+    :command: /bin/date
+    :record_type: :crontab
+:environment: 
+  :text: ONE=TWO
+  :record: 
+    :line: ONE=TWO
+    :record_type: :environment
+:empty: 
+  :text: ""
+  :record: 
+    :line: ""
+    :record_type: :blank
+:simple: 
+  :text: "* * * * * /bin/date"
+  :record: 
+    :command: /bin/date
+    :record_type: :crontab
+:whitespace: 
+  :text: "   "
+  :record: 
+    :line: "   "
+    :record_type: :blank
+:minute_and_hour: 
+  :text: 5 15 * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    :hour: 
+    - "15"
+    :command: /bin/date
+    :record_type: :crontab
+:lowercase_environment: 
+  :text: a=b
+  :record: 
+    :line: a=b
+    :record_type: :environment
+:special_with_spaces: 
+  :text: "@daily /bin/echo testing"
+  :record: 
+    :special: daily
+    :command: /bin/echo testing
+    :record_type: :freebsd_special
+:tabs: 
+  :text: !binary |
+    CQ==
+
+  :record: 
+    :line: !binary |
+      CQ==
+
+    :record_type: :blank
+:multiple_minute_and_hour: 
+  :text: 5,10 15,20 * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    - "10"
+    :hour: 
+    - "15"
+    - "20"
+    :command: /bin/date
+    :record_type: :crontab
+:name: 
+  :text: "# Puppet Name: testing"
+  :record: 
+    :line: "# Puppet Name: testing"
+    :name: testing
+    :record_type: :comment
+:another_env: 
+  :text: Testing=True
+  :record: 
+    :line: Testing=True
+    :record_type: :environment
+:shortcomment: 
+  :text: "#"
+  :record: 
+    :line: "#"
+    :record_type: :comment
+:spaces_in_command: 
+  :text: "* * * * * /bin/echo testing"
+  :record: 
+    :command: /bin/echo testing
+    :record_type: :crontab
+:fourth_env: 
+  :text: True=False
+  :record: 
+    :line: True=False
+    :record_type: :environment
+:simple_with_minute: 
+  :text: 5 * * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    :command: /bin/date
+    :record_type: :crontab
+:spaces_in_command_with_times: 
+  :text: 5,10 15,20 * * * /bin/echo testing
+  :record: 
+    :minute: 
+    - "5"
+    - "10"
+    :hour: 
+    - "15"
+    - "20"
+    :command: /bin/echo testing
+    :record_type: :crontab
+:name_with_spaces: 
+  :text: "# Puppet Name: another name"
+  :record: 
+    :line: "# Puppet Name: another name"
+    :name: another name
+    :record_type: :comment
+--- 
+:longcommment: 
+  :text: "# This is a comment"
+  :record: 
+    :line: "# This is a comment"
+    :record_type: :comment
+:special: 
+  :text: "@hourly /bin/date"
+  :record: 
+    :special: hourly
+    :command: /bin/date
+    :record_type: :freebsd_special
+:long_name: 
+  :text: "# Puppet Name: long_name"
+  :record: 
+    :line: "# Puppet Name: long_name"
+    :name: long_name
+    :record_type: :comment
+:multiple_minutes: 
+  :text: 5,15 * * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    - "15"
+    :command: /bin/date
+    :record_type: :crontab
+:environment: 
+  :text: ONE=TWO
+  :record: 
+    :line: ONE=TWO
+    :record_type: :environment
+:empty: 
+  :text: ""
+  :record: 
+    :line: ""
+    :record_type: :blank
+:simple: 
+  :text: "* * * * * /bin/date"
+  :record: 
+    :command: /bin/date
+    :record_type: :crontab
+:whitespace: 
+  :text: "   "
+  :record: 
+    :line: "   "
+    :record_type: :blank
+:minute_and_hour: 
+  :text: 5 15 * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    :hour: 
+    - "15"
+    :command: /bin/date
+    :record_type: :crontab
+:lowercase_environment: 
+  :text: a=b
+  :record: 
+    :line: a=b
+    :record_type: :environment
+:special_with_spaces: 
+  :text: "@daily /bin/echo testing"
+  :record: 
+    :special: daily
+    :command: /bin/echo testing
+    :record_type: :freebsd_special
+:tabs: 
+  :text: !binary |
+    CQ==
+
+  :record: 
+    :line: !binary |
+      CQ==
+
+    :record_type: :blank
+:multiple_minute_and_hour: 
+  :text: 5,10 15,20 * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    - "10"
+    :hour: 
+    - "15"
+    - "20"
+    :command: /bin/date
+    :record_type: :crontab
+:name: 
+  :text: "# Puppet Name: testing"
+  :record: 
+    :line: "# Puppet Name: testing"
+    :name: testing
+    :record_type: :comment
+:another_env: 
+  :text: Testing=True
+  :record: 
+    :line: Testing=True
+    :record_type: :environment
+:shortcomment: 
+  :text: "#"
+  :record: 
+    :line: "#"
+    :record_type: :comment
+:spaces_in_command: 
+  :text: "* * * * * /bin/echo testing"
+  :record: 
+    :command: /bin/echo testing
+    :record_type: :crontab
+:fourth_env: 
+  :text: True=False
+  :record: 
+    :line: True=False
+    :record_type: :environment
+:simple_with_minute: 
+  :text: 5 * * * * /bin/date
+  :record: 
+    :minute: 
+    - "5"
+    :command: /bin/date
+    :record_type: :crontab
+:spaces_in_command_with_times: 
+  :text: 5,10 15,20 * * * /bin/echo testing
+  :record: 
+    :minute: 
+    - "5"
+    - "10"
+    :hour: 
+    - "15"
+    - "20"
+    :command: /bin/echo testing
+    :record_type: :crontab
+:name_with_spaces: 
+  :text: "# Puppet Name: another name"
+  :record: 
+    :line: "# Puppet Name: another name"
+    :name: another name
+    :record_type: :comment
diff --git a/test/data/providers/cron/examples/freebsd b/test/data/providers/cron/examples/freebsd
new file mode 100644
index 0000000..fba1e31
--- /dev/null
+++ b/test/data/providers/cron/examples/freebsd
@@ -0,0 +1,2 @@
+ at daily /path/to/some/job
+ at reboot /path/to/some/job
diff --git a/test/data/providers/cron/examples/one b/test/data/providers/cron/examples/one
new file mode 100644
index 0000000..9cddf97
--- /dev/null
+++ b/test/data/providers/cron/examples/one
@@ -0,0 +1,14 @@
+TZ=Europe/Paris
+#
+# Some comments
+# and more comments
+#
+SHELL=/bin/sh
+0 0 * * * /usr/local/bin/savelogs --period --postmovehook="/usr/local/apache/bin/apachectl graceful" --apacheconf=/www/conf/httpd.conf
+58 23 * * * /usr/bin/diff /var/log/slow-queries.log /backup/var/log/slow-queries.log
+59 23 * * * /usr/bin/diff /var/db/mysql/*.err /backup/var/db/mysql/*.err
+0 7 * * Mon cd /usr/local/install; find . -maxdepth 1 -type f -mtime -30 -exec ls -l {} \; | mail -E -s 'Recent vinstall kits' vinstall at domain.com
+#* * * * * /bin/ls|mail -s 'test !!' gg at domain.com
+47 4 * * 1 /usr/local/bin/wget 'ftp://ftp.perl.org/pub/CPAN/MIRRORED.BY' -O /home/installman/www/install.domain.com/inst/MIRRORED.BY
+25 */2 * * * /usr/local/bin/freshclam --quiet
+#* * * * * /root/top.sh
diff --git a/test/data/providers/cron/examples/openbsd b/test/data/providers/cron/examples/openbsd
new file mode 100644
index 0000000..d77597d
--- /dev/null
+++ b/test/data/providers/cron/examples/openbsd
@@ -0,0 +1,20 @@
+#
+SHELL=/bin/sh
+PATH=/bin:/sbin:/usr/bin:/usr/sbin
+HOME=/var/log
+#
+#minute hour    mday    month   wday    command
+#
+# sendmail clientmqueue runner
+*/30    *       *       *       *       /usr/sbin/sendmail -L sm-msp-queue -Ac -q
+#
+# rotate log files every hour, if necessary
+0       *       *       *       *       /usr/bin/newsyslog
+# send log file notifications, if necessary
+#1-59   *       *       *       *       /usr/bin/newsyslog -m
+#
+# do daily/weekly/monthly maintenance
+30      1       *       *       *       /bin/sh /etc/daily 2>&1 | tee /var/log/daily.out | mail -s "`/bin/hostname` daily output" root
+30      3       *       *       6       /bin/sh /etc/weekly 2>&1 | tee /var/log/weekly.out | mail -s "`/bin/hostname` weekly output" root
+30      5       1       *       *       /bin/sh /etc/monthly 2>&1 | tee /var/log/monthly.out | mail -s "`/bin/hostname` monthly output" root
+#0      *       *       *       *       /usr/libexec/spamd-setup
diff --git a/test/data/providers/package/testpackages.yaml b/test/data/providers/package/testpackages.yaml
new file mode 100644
index 0000000..8d8935e
--- /dev/null
+++ b/test/data/providers/package/testpackages.yaml
@@ -0,0 +1,65 @@
+--- 
+- :operatingsystem: Solaris
+  :files: 
+  - /usr/local/pkg/rdesktop-1.3.1-sol10-intel-local
+  - /usr/local/pkg/rdesktop-1.4.1-sol10-x86-local
+  :hardwareisa: i386
+  :name: SMCrdesk
+  :operatingsystemrelease: "5.10"
+  :provider: :sun
+- :operatingsystem: Solaris
+  :name: cabextract
+  :provider: :blastwave
+- :operatingsystem: Solaris
+  :files: 
+  - /usr/local/pkg/arc-5.21e-sol8-sparc-local
+  :hardwareisa: sparc
+  :name: SMCarc
+  :operatingsystemrelease: "5.8"
+  :provider: :sun
+- :operatingsystem: Solaris
+  :files: 
+  - /usr/local/pkg/arc-5.21e-sol8-intel-local
+  :hardwareisa: i386
+  :name: SMCarc
+  :operatingsystemrelease: "5.8"
+  :provider: :sun
+- :operatingsystem: OpenBSD
+  :files: 
+  - ftp://ftp.usa.openbsd.org/pub/OpenBSD/3.8/packages/i386/aalib-1.2-no_x11.tgz
+  :name: aalib
+  :provider: :openbsd
+- :operatingsystem: Debian
+  :name: zec
+  :provider: :apt
+- :operatingsystem: Debian
+  :name: zec
+  :provider: :aptitude
+- :operatingsystem: Fedora
+  :name: wv
+  :provider: :yum
+- :operatingsystem:
+  - Fedora
+  - CentOS
+  - RedHat
+  :files: 
+  - /home/luke/rpm/RPMS/noarch/enhost-1.0.1-1.noarch.rpm
+  - /home/luke/rpm/RPMS/noarch/enhost-1.0.2-1.noarch.rpm
+  :name: enhost
+  :provider: :rpm
+- :operatingsystem: Darwin
+  :name: aop
+  :provider: :darwinports
+- :operatingsystem: FreeBSD
+  :name: yahtzee
+  :provider: :ports
+- :provider: :apple
+  :files:
+  - /Users/luke/Documents/Puppet/pkgtesting.pkg
+  :name: pkgtesting
+  :cleanup: rm -rf /Library/Receipts/pkgtesting.pkg/ /tmp/file
+- :provider: :gem
+  :name: wxrubylayouts
+  :versions:
+  - 0.0.2
+  - 0.0.3
diff --git a/test/data/reports/1.yaml b/test/data/reports/1.yaml
new file mode 100644
index 0000000..3805e90
--- /dev/null
+++ b/test/data/reports/1.yaml
@@ -0,0 +1,108 @@
+--- !ruby/object:Puppet::Transaction::Report 
+host: culain.madstop.com
+logs: 
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: executed successfully
+  objectsource: true
+  source: //culain.madstop.com/puppetserver/exec=/bin/echo testing/returns
+  tags: 
+  - :puppetserver
+  - :puppetserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :exec
+  - :returns
+  time: 2006-09-21 13:06:59.867782 -05:00
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: ensure changed 'stopped' to 'running'
+  objectsource: true
+  source: //culain.madstop.com/mailserver/service=spamassassin/ensure
+  tags: 
+  - :mailserver
+  - :mailserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :service
+  - :ensure
+  time: 2006-09-21 13:07:01.336511 -05:00
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: ensure changed 'stopped' to 'running'
+  objectsource: true
+  source: //culain.madstop.com/mailserver/service=courier-imap-ssl/ensure
+  tags: 
+  - :mailserver
+  - :mailserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :service
+  - :ensure
+  time: 2006-09-21 13:07:01.573506 -05:00
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: ensure changed 'stopped' to 'running'
+  objectsource: true
+  source: //culain.madstop.com/mailserver/service=courier-authdaemon/ensure
+  tags: 
+  - :mailserver
+  - :mailserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :service
+  - :ensure
+  time: 2006-09-21 13:07:01.680440 -05:00
+metrics: 
+  time: !ruby/object:Puppet::Metric 
+    label: Time
+    name: time
+    values: 
+    - - :config_retrieval
+      - Config retrieval
+      - 2.26467204093933
+    - - :total
+      - Total
+      - 21.7894113063812
+  changes: !ruby/object:Puppet::Metric 
+    label: Changes
+    name: changes
+    values: 
+    - - :total
+      - Total
+      - 4
+  objects: !ruby/object:Puppet::Metric 
+    label: Objects
+    name: objects
+    values: 
+    - - :scheduled
+      - Scheduled
+      - 78
+    - - :applied
+      - Applied
+      - 4
+    - - :restarted
+      - Restarted
+      - 0
+    - - :skipped
+      - Skipped
+      - 0
+    - - :failed_restarts
+      - Failed restarts
+      - 0
+    - - :out_of_sync
+      - Out of sync
+      - 4
+    - - :failed
+      - Failed
+      - 0
+    - - :total
+      - Total
+      - 79
+records: {}
+
+time: 2006-09-21 13:07:06.825337 -05:00
diff --git a/test/data/reports/2.yaml b/test/data/reports/2.yaml
new file mode 100644
index 0000000..3805e90
--- /dev/null
+++ b/test/data/reports/2.yaml
@@ -0,0 +1,108 @@
+--- !ruby/object:Puppet::Transaction::Report 
+host: culain.madstop.com
+logs: 
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: executed successfully
+  objectsource: true
+  source: //culain.madstop.com/puppetserver/exec=/bin/echo testing/returns
+  tags: 
+  - :puppetserver
+  - :puppetserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :exec
+  - :returns
+  time: 2006-09-21 13:06:59.867782 -05:00
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: ensure changed 'stopped' to 'running'
+  objectsource: true
+  source: //culain.madstop.com/mailserver/service=spamassassin/ensure
+  tags: 
+  - :mailserver
+  - :mailserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :service
+  - :ensure
+  time: 2006-09-21 13:07:01.336511 -05:00
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: ensure changed 'stopped' to 'running'
+  objectsource: true
+  source: //culain.madstop.com/mailserver/service=courier-imap-ssl/ensure
+  tags: 
+  - :mailserver
+  - :mailserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :service
+  - :ensure
+  time: 2006-09-21 13:07:01.573506 -05:00
+- !ruby/object:Puppet::Log 
+  level: :notice
+  message: ensure changed 'stopped' to 'running'
+  objectsource: true
+  source: //culain.madstop.com/mailserver/service=courier-authdaemon/ensure
+  tags: 
+  - :mailserver
+  - :mailserver
+  - :basenode
+  - :"culain.madstop.com"
+  - :puppet
+  - :service
+  - :ensure
+  time: 2006-09-21 13:07:01.680440 -05:00
+metrics: 
+  time: !ruby/object:Puppet::Metric 
+    label: Time
+    name: time
+    values: 
+    - - :config_retrieval
+      - Config retrieval
+      - 2.26467204093933
+    - - :total
+      - Total
+      - 21.7894113063812
+  changes: !ruby/object:Puppet::Metric 
+    label: Changes
+    name: changes
+    values: 
+    - - :total
+      - Total
+      - 4
+  objects: !ruby/object:Puppet::Metric 
+    label: Objects
+    name: objects
+    values: 
+    - - :scheduled
+      - Scheduled
+      - 78
+    - - :applied
+      - Applied
+      - 4
+    - - :restarted
+      - Restarted
+      - 0
+    - - :skipped
+      - Skipped
+      - 0
+    - - :failed_restarts
+      - Failed restarts
+      - 0
+    - - :out_of_sync
+      - Out of sync
+      - 4
+    - - :failed
+      - Failed
+      - 0
+    - - :total
+      - Total
+      - 79
+records: {}
+
+time: 2006-09-21 13:07:06.825337 -05:00
diff --git a/test/data/reports/tagmail_failers.conf b/test/data/reports/tagmail_failers.conf
new file mode 100644
index 0000000..d116b5f
--- /dev/null
+++ b/test/data/reports/tagmail_failers.conf
@@ -0,0 +1,3 @@
+tag:
+: abuse at domain.com
+invalid!tag: abuse at domain.com
diff --git a/test/data/reports/tagmail_passers.conf b/test/data/reports/tagmail_passers.conf
new file mode 100644
index 0000000..6cadf03
--- /dev/null
+++ b/test/data/reports/tagmail_passers.conf
@@ -0,0 +1,30 @@
+# A comment
+# or maybe two
+# plus some blank lines
+    # with some blanks plus a comment
+
+# a simple tag report
+one: abuse at domain.com
+
+# with weird spacing
+ one : abuse at domain.com 
+
+# with multiple tags
+one, two: abuse at domain.com
+
+# again with the weird syntax
+ one , two : abuse at domain.com
+
+# Some negations
+one, !two: abuse at domain.com
+
+# some oddly-formatted tags
+one, two-three, !four-five, !six: abuse at domain.com
+
+# multiple addresses
+one, two: abuse at domain.com, testing at domain.com
+
+# and with weird spacing
+one, two: abuse at domain.com , testing at domain.com    
+
+# and a trailing comment
diff --git a/test/data/snippets/aliastest.pp b/test/data/snippets/aliastest.pp
new file mode 100644
index 0000000..f2b6159
--- /dev/null
+++ b/test/data/snippets/aliastest.pp
@@ -0,0 +1,16 @@
+file { "a file":
+    path => "/tmp/aliastest",
+    ensure => file
+}
+
+file { "another":
+    path => "/tmp/aliastest2",
+    ensure => file,
+    require => File["a file"]
+}
+
+file { "a third":
+    path => "/tmp/aliastest3",
+    ensure => file,
+    require => File["/tmp/aliastest"]
+}
diff --git a/test/data/snippets/argumentdefaults b/test/data/snippets/argumentdefaults
new file mode 100644
index 0000000..eac9dd7
--- /dev/null
+++ b/test/data/snippets/argumentdefaults
@@ -0,0 +1,14 @@
+# $Id$
+
+define testargs($file, $mode = 755) {
+    file { $file: ensure => file, mode => $mode }
+}
+
+testargs { "testingname":
+    file => "/tmp/argumenttest1"
+}
+
+testargs { "testingother":
+    file => "/tmp/argumenttest2",
+    mode => 644
+}
diff --git a/test/data/snippets/casestatement.pp b/test/data/snippets/casestatement.pp
new file mode 100644
index 0000000..4fcf2e4
--- /dev/null
+++ b/test/data/snippets/casestatement.pp
@@ -0,0 +1,58 @@
+# $Id$
+
+$var = "value"
+
+case $var {
+  "nope": {
+     file { "/tmp/fakefile": mode => 644, ensure => file }
+  }
+  "value": {
+     file { "/tmp/existsfile": mode => 755, ensure => file }
+  }
+}
+
+$ovar = "yayness"
+
+case $ovar {
+    "fooness": {
+         file { "/tmp/nostillexistsfile": mode => 644, ensure => file }
+    }
+    "booness", "yayness": {
+        case $var {
+            "nep": { 
+                 file { "/tmp/noexistsfile": mode => 644, ensure => file }
+            }
+            "value": { 
+                 file { "/tmp/existsfile2": mode => 755, ensure => file }
+            }
+        }
+    }
+}
+
+case $ovar {
+    "fooness": {
+         file { "/tmp/nostillexistsfile": mode => 644, ensure => file }
+    }
+    default: {
+        file { "/tmp/existsfile3": mode => 755, ensure => file }
+    }
+}
+
+$bool = true
+
+case $bool {
+    true: {
+        file { "/tmp/existsfile4": mode => 755, ensure => file }
+    }
+}
+
+$yay = yay
+$a = yay
+$b = boo
+
+case $yay {
+    $a: { file { "/tmp/existsfile5": mode => 755, ensure => file } }
+    $b: { file { "/tmp/existsfile5": mode => 644, ensure => file } }
+    default: { file { "/tmp/existsfile5": mode => 711, ensure => file } }
+
+}
diff --git a/test/data/snippets/classheirarchy.pp b/test/data/snippets/classheirarchy.pp
new file mode 100644
index 0000000..36619d8
--- /dev/null
+++ b/test/data/snippets/classheirarchy.pp
@@ -0,0 +1,15 @@
+# $Id$
+
+class base {
+    file { "/tmp/classheir1": ensure => file, mode => 755 }
+}
+
+class sub1 inherits base {
+    file { "/tmp/classheir2": ensure => file, mode => 755 }
+}
+
+class sub2 inherits base {
+    file { "/tmp/classheir3": ensure => file, mode => 755 }
+}
+
+include sub1, sub2
diff --git a/test/data/snippets/classincludes.pp b/test/data/snippets/classincludes.pp
new file mode 100644
index 0000000..9278005
--- /dev/null
+++ b/test/data/snippets/classincludes.pp
@@ -0,0 +1,17 @@
+# $Id$
+
+class base {
+    file { "/tmp/classincludes1": ensure => file, mode => 755 }
+}
+
+class sub1 inherits base {
+    file { "/tmp/classincludes2": ensure => file, mode => 755 }
+}
+
+class sub2 inherits base {
+    file { "/tmp/classincludes3": ensure => file, mode => 755 }
+}
+
+$sub = "sub2" 
+
+include sub1, $sub
diff --git a/test/data/snippets/classpathtest b/test/data/snippets/classpathtest
new file mode 100644
index 0000000..5803333
--- /dev/null
+++ b/test/data/snippets/classpathtest
@@ -0,0 +1,11 @@
+# $Id$
+
+define mytype {
+    file { "/tmp/classtest": ensure => file, mode => 755 }
+}
+
+class testing {
+    mytype { "componentname": }
+}
+
+include testing
diff --git a/test/data/snippets/collection.pp b/test/data/snippets/collection.pp
new file mode 100644
index 0000000..bc29510
--- /dev/null
+++ b/test/data/snippets/collection.pp
@@ -0,0 +1,10 @@
+class one {
+    @file { "/tmp/colltest1": content => "one" }
+    @file { "/tmp/colltest2": content => "two" }
+}
+
+class two {
+    File <| content == "one" |>
+}
+
+include one, two
diff --git a/test/data/snippets/collection_within_virtual_definitions.pp b/test/data/snippets/collection_within_virtual_definitions.pp
new file mode 100644
index 0000000..3c21468
--- /dev/null
+++ b/test/data/snippets/collection_within_virtual_definitions.pp
@@ -0,0 +1,20 @@
+define test($name) {
+    file {"/tmp/collection_within_virtual_definitions1_$name.txt":
+        content => "File name $name\n"
+    }
+    Test2 <||>
+}
+
+define test2() {
+    file {"/tmp/collection_within_virtual_definitions2_$name.txt":
+        content => "This is a test\n"
+    }
+}
+
+node default {
+    @test {"foo":
+        name => "foo"
+    }
+    @test2 {"foo2": }
+    Test <||>
+}
diff --git a/test/data/snippets/componentmetaparams.pp b/test/data/snippets/componentmetaparams.pp
new file mode 100644
index 0000000..7d9f0c2
--- /dev/null
+++ b/test/data/snippets/componentmetaparams.pp
@@ -0,0 +1,11 @@
+file { "/tmp/component1":
+    ensure => file
+}
+
+define thing {
+    file { $name: ensure => file }
+}
+
+thing { "/tmp/component2":
+    require => File["/tmp/component1"]
+}
diff --git a/test/data/snippets/componentrequire.pp b/test/data/snippets/componentrequire.pp
new file mode 100644
index 0000000..a61d205
--- /dev/null
+++ b/test/data/snippets/componentrequire.pp
@@ -0,0 +1,8 @@
+define testfile($mode) {
+    file { $name: mode => $mode, ensure => present }
+}
+
+testfile { "/tmp/testing_component_requires2": mode => 755 }
+
+file { "/tmp/testing_component_requires1": mode => 755, ensure => present,
+    require => Testfile["/tmp/testing_component_requires2"] }
diff --git a/test/data/snippets/deepclassheirarchy.pp b/test/data/snippets/deepclassheirarchy.pp
new file mode 100644
index 0000000..249e633
--- /dev/null
+++ b/test/data/snippets/deepclassheirarchy.pp
@@ -0,0 +1,23 @@
+# $Id$
+
+class base {
+    file { "/tmp/deepclassheir1": ensure => file, mode => 755 }
+}
+
+class sub1 inherits base {
+    file { "/tmp/deepclassheir2": ensure => file, mode => 755 }
+}
+
+class sub2 inherits sub1 {
+    file { "/tmp/deepclassheir3": ensure => file, mode => 755 }
+}
+
+class sub3 inherits sub2 {
+    file { "/tmp/deepclassheir4": ensure => file, mode => 755 }
+}
+
+class sub4 inherits sub3 {
+    file { "/tmp/deepclassheir5": ensure => file, mode => 755 }
+}
+
+include sub4
diff --git a/test/data/snippets/defineoverrides.pp b/test/data/snippets/defineoverrides.pp
new file mode 100644
index 0000000..c68b139
--- /dev/null
+++ b/test/data/snippets/defineoverrides.pp
@@ -0,0 +1,17 @@
+# $Id$
+
+$file = "/tmp/defineoverrides1"
+
+define myfile($mode) {
+    file { $name: ensure => file, mode => $mode }
+}
+
+class base {
+    myfile { $file: mode => 644 }
+}
+
+class sub inherits base {
+    Myfile[$file] { mode => 755, } # test the end-comma
+}
+
+include sub
diff --git a/test/data/snippets/emptyclass.pp b/test/data/snippets/emptyclass.pp
new file mode 100644
index 0000000..48047e7
--- /dev/null
+++ b/test/data/snippets/emptyclass.pp
@@ -0,0 +1,9 @@
+# $Id$
+
+define component {
+}
+
+class testing {
+}
+
+include testing
diff --git a/test/data/snippets/emptyexec.pp b/test/data/snippets/emptyexec.pp
new file mode 100644
index 0000000..847a30d
--- /dev/null
+++ b/test/data/snippets/emptyexec.pp
@@ -0,0 +1,3 @@
+exec { "touch /tmp/emptyexectest":
+    path => "/usr/bin:/bin"
+}
diff --git a/test/data/snippets/falsevalues.pp b/test/data/snippets/falsevalues.pp
new file mode 100644
index 0000000..2143b79
--- /dev/null
+++ b/test/data/snippets/falsevalues.pp
@@ -0,0 +1,3 @@
+$value = false
+
+file { "/tmp/falsevalues$value": ensure => file }
diff --git a/test/data/snippets/filecreate b/test/data/snippets/filecreate
new file mode 100644
index 0000000..d7972c2
--- /dev/null
+++ b/test/data/snippets/filecreate
@@ -0,0 +1,11 @@
+# $Id$
+
+file {
+    "/tmp/createatest": ensure => file, mode => 755;
+    "/tmp/createbtest": ensure => file, mode => 755
+}
+
+file {
+    "/tmp/createctest": ensure => file;
+    "/tmp/createdtest": ensure => file;
+}
diff --git a/test/data/snippets/fqdefinition.pp b/test/data/snippets/fqdefinition.pp
new file mode 100644
index 0000000..ddb0675
--- /dev/null
+++ b/test/data/snippets/fqdefinition.pp
@@ -0,0 +1,5 @@
+define one::two($ensure) {
+    file { "/tmp/fqdefinition": ensure => $ensure }
+}
+
+one::two { "/tmp/fqdefinition": ensure => file }
diff --git a/test/data/snippets/fqparents.pp b/test/data/snippets/fqparents.pp
new file mode 100644
index 0000000..40fb933
--- /dev/null
+++ b/test/data/snippets/fqparents.pp
@@ -0,0 +1,11 @@
+class base {
+    class one {
+        file { "/tmp/fqparent1": ensure => file }
+    }   
+}   
+
+class two::three inherits base::one {
+    file { "/tmp/fqparent2": ensure => file }
+}
+
+include two::three
diff --git a/test/data/snippets/implicititeration b/test/data/snippets/implicititeration
new file mode 100644
index 0000000..6f34cb2
--- /dev/null
+++ b/test/data/snippets/implicititeration
@@ -0,0 +1,15 @@
+# $Id$
+
+$files = ["/tmp/iterationatest", "/tmp/iterationbtest"]
+
+file { $files: ensure => file, mode => 755 }
+
+file { ["/tmp/iterationctest", "/tmp/iterationdtest"]:
+    ensure => file,
+    mode => 755
+}
+
+file {
+    ["/tmp/iterationetest", "/tmp/iterationftest"]: ensure => file, mode => 755;
+    ["/tmp/iterationgtest", "/tmp/iterationhtest"]: ensure => file, mode => 755;
+}
diff --git a/test/data/snippets/multipleinstances b/test/data/snippets/multipleinstances
new file mode 100644
index 0000000..2f9b3c2
--- /dev/null
+++ b/test/data/snippets/multipleinstances
@@ -0,0 +1,7 @@
+# $Id$
+
+file {
+    "/tmp/multipleinstancesa": ensure => file, mode => 755;
+    "/tmp/multipleinstancesb": ensure => file, mode => 755;
+    "/tmp/multipleinstancesc": ensure => file, mode => 755;
+}
diff --git a/test/data/snippets/multisubs.pp b/test/data/snippets/multisubs.pp
new file mode 100644
index 0000000..bcec69e
--- /dev/null
+++ b/test/data/snippets/multisubs.pp
@@ -0,0 +1,13 @@
+class base {
+    file { "/tmp/multisubtest": content => "base", mode => 644 }
+}
+
+class sub1 inherits base {
+    File["/tmp/multisubtest"] { mode => 755 }
+}
+
+class sub2 inherits base {
+    File["/tmp/multisubtest"] { content => sub2 }
+}
+
+include sub1, sub2
diff --git a/test/data/snippets/namevartest b/test/data/snippets/namevartest
new file mode 100644
index 0000000..dbee1c3
--- /dev/null
+++ b/test/data/snippets/namevartest
@@ -0,0 +1,9 @@
+define filetest($mode, $ensure = file) {
+    file { $name:
+        mode => $mode,
+        ensure => $ensure
+    }
+}
+
+filetest { "/tmp/testfiletest": mode => 644}
+filetest { "/tmp/testdirtest": mode => 755, ensure => directory}
diff --git a/test/data/snippets/scopetest b/test/data/snippets/scopetest
new file mode 100644
index 0000000..3314917
--- /dev/null
+++ b/test/data/snippets/scopetest
@@ -0,0 +1,13 @@
+
+$mode = 640
+
+define thing {
+    file { "/tmp/$name": ensure => file, mode => $mode }
+}
+
+class testing {
+    $mode = 755
+    thing {scopetest: }
+}
+
+include testing
diff --git a/test/data/snippets/selectorvalues.pp b/test/data/snippets/selectorvalues.pp
new file mode 100644
index 0000000..cd8cf77
--- /dev/null
+++ b/test/data/snippets/selectorvalues.pp
@@ -0,0 +1,42 @@
+$value1 = ""
+$value2 = true
+$value3 = false
+$value4 = yay
+
+$test = "yay"
+
+$mode1 = $value1 ? {
+    "" => 755,
+    default => 644
+}
+
+$mode2 = $value2 ? {
+    true => 755,
+    default => 644
+}
+
+$mode3 = $value3 ? {
+    false => 755,
+    default => 644
+}
+
+$mode4 = $value4 ? {
+    $test => 755,
+    default => 644
+}
+
+$mode5 = yay ? {
+    $test => 755,
+    default => 644
+}
+
+$mode6 = $mode5 ? {
+    755 => 755
+}
+
+file { "/tmp/selectorvalues1": ensure => file, mode => $mode1 }
+file { "/tmp/selectorvalues2": ensure => file, mode => $mode2 }
+file { "/tmp/selectorvalues3": ensure => file, mode => $mode3 }
+file { "/tmp/selectorvalues4": ensure => file, mode => $mode4 }
+file { "/tmp/selectorvalues5": ensure => file, mode => $mode5 }
+file { "/tmp/selectorvalues6": ensure => file, mode => $mode6 }
diff --git a/test/data/snippets/simpledefaults b/test/data/snippets/simpledefaults
new file mode 100644
index 0000000..63d199a
--- /dev/null
+++ b/test/data/snippets/simpledefaults
@@ -0,0 +1,5 @@
+# $Id$
+
+File { mode => 755 }
+
+file { "/tmp/defaulttest": ensure => file }
diff --git a/test/data/snippets/simpleselector b/test/data/snippets/simpleselector
new file mode 100644
index 0000000..8b9bc72
--- /dev/null
+++ b/test/data/snippets/simpleselector
@@ -0,0 +1,38 @@
+# $Id$
+
+$var = "value"
+
+file { "/tmp/snippetselectatest":
+    ensure => file,
+    mode => $var ? {
+        nottrue => 641,
+        value => 755
+    }
+}
+
+file { "/tmp/snippetselectbtest":
+    ensure => file,
+    mode => $var ? {
+        nottrue => 644,
+        default => 755
+    }
+}
+
+$othervar = "complex value"
+
+file { "/tmp/snippetselectctest":
+    ensure => file,
+    mode => $othervar ? {
+        "complex value" => 755,
+        default => 644
+    }
+}
+$anothervar = Yayness
+
+file { "/tmp/snippetselectdtest":
+    ensure => file,
+    mode => $anothervar ? {
+        Yayness => 755,
+        default => 644
+    }
+}
diff --git a/test/data/snippets/singleary.pp b/test/data/snippets/singleary.pp
new file mode 100644
index 0000000..9ce56dd
--- /dev/null
+++ b/test/data/snippets/singleary.pp
@@ -0,0 +1,19 @@
+# $Id$
+
+file { "/tmp/singleary1":
+    ensure => file
+}
+
+file { "/tmp/singleary2":
+    ensure => file
+}
+
+file { "/tmp/singleary3":
+    ensure => file,
+    require => [File["/tmp/singleary1"], File["/tmp/singleary2"]]
+}
+
+file { "/tmp/singleary4":
+    ensure => file,
+    require => [File["/tmp/singleary1"]]
+}
diff --git a/test/data/snippets/singlequote.pp b/test/data/snippets/singlequote.pp
new file mode 100644
index 0000000..dc876a2
--- /dev/null
+++ b/test/data/snippets/singlequote.pp
@@ -0,0 +1,11 @@
+# $Id$
+
+file { "/tmp/singlequote1":
+    ensure => file,
+    content => 'a $quote'
+}
+
+file { "/tmp/singlequote2":
+    ensure => file,
+    content => 'some "\yayness\"'
+}
diff --git a/test/data/snippets/singleselector.pp b/test/data/snippets/singleselector.pp
new file mode 100644
index 0000000..520a140
--- /dev/null
+++ b/test/data/snippets/singleselector.pp
@@ -0,0 +1,22 @@
+$value1 = ""
+$value2 = true
+$value3 = false
+$value4 = yay
+
+$test = "yay"
+
+$mode1 = $value1 ? {
+    "" => 755
+}
+
+$mode2 = $value2 ? {
+    true => 755
+}
+
+$mode3 = $value3 ? {
+    default => 755
+}
+
+file { "/tmp/singleselector1": ensure => file, mode => $mode1 }
+file { "/tmp/singleselector2": ensure => file, mode => $mode2 }
+file { "/tmp/singleselector3": ensure => file, mode => $mode3 }
diff --git a/test/data/snippets/subclass_name_duplication.pp b/test/data/snippets/subclass_name_duplication.pp
new file mode 100755
index 0000000..10f1d75
--- /dev/null
+++ b/test/data/snippets/subclass_name_duplication.pp
@@ -0,0 +1,11 @@
+#!/usr/bin/env puppet
+
+class one::fake {
+    file { "/tmp/subclass_name_duplication1": ensure => present }
+}
+
+class two::fake {
+    file { "/tmp/subclass_name_duplication2": ensure => present }
+}
+
+include one::fake, two::fake
diff --git a/test/data/snippets/tag.pp b/test/data/snippets/tag.pp
new file mode 100644
index 0000000..e6e770d
--- /dev/null
+++ b/test/data/snippets/tag.pp
@@ -0,0 +1,9 @@
+# $Id$
+
+$variable = value
+
+tag yayness, rahness
+
+tag booness, $variable
+
+file { "/tmp/settestingness": ensure => file }
diff --git a/test/data/snippets/tagged.pp b/test/data/snippets/tagged.pp
new file mode 100644
index 0000000..7bf90a6
--- /dev/null
+++ b/test/data/snippets/tagged.pp
@@ -0,0 +1,35 @@
+# $Id$
+
+tag testing
+tag(funtest)
+
+class tagdefine {
+    $path = tagged(tagdefine) ? {
+        true => "true", false => "false"
+    }
+
+    file { "/tmp/taggeddefine$path": ensure => file }
+}
+
+include tagdefine
+
+$yayness = tagged(yayness) ? {
+    true => "true", false => "false"
+}
+
+$funtest = tagged(testing) ? {
+    true => "true", false => "false"
+}
+
+$both = tagged(testing, yayness) ? {
+    true => "true", false => "false"
+}
+
+$bothtrue = tagged(testing, testing) ? {
+    true => "true", false => "false"
+}
+
+file { "/tmp/taggedyayness$yayness": ensure => file }
+file { "/tmp/taggedtesting$funtest": ensure => file }
+file { "/tmp/taggedboth$both": ensure => file }
+file { "/tmp/taggedbothtrue$bothtrue": ensure => file }
diff --git a/test/data/snippets/virtualresources.pp b/test/data/snippets/virtualresources.pp
new file mode 100644
index 0000000..a29406b
--- /dev/null
+++ b/test/data/snippets/virtualresources.pp
@@ -0,0 +1,14 @@
+class one {
+    @file { "/tmp/virtualtest1": content => "one" }
+    @file { "/tmp/virtualtest2": content => "two" }
+    @file { "/tmp/virtualtest3": content => "three" }
+    @file { "/tmp/virtualtest4": content => "four" }
+}
+
+class two {
+    File <| content == "one" |>
+    realize File["/tmp/virtualtest2"]
+    realize(File["/tmp/virtualtest3"], File["/tmp/virtualtest4"])
+}
+
+include one, two
diff --git a/test/data/types/hosts/1 b/test/data/types/hosts/1
new file mode 100644
index 0000000..f0b27f3
--- /dev/null
+++ b/test/data/types/hosts/1
@@ -0,0 +1,3 @@
+# Do not remove the following line, or various programs
+# that require network functionality will fail.
+127.0.0.1               hostname.domain.net hostname localhost.localdomain localhost 
diff --git a/test/data/types/hosts/2 b/test/data/types/hosts/2
new file mode 100644
index 0000000..a25c39c
--- /dev/null
+++ b/test/data/types/hosts/2
@@ -0,0 +1,13 @@
+127.0.0.1		localhost
+192.168.0.3		culain.madstop.com	culain
+192.168.0.100		yaytest
+
+# The following lines are desirable for IPv6 capable hosts
+# (added automatically by netbase upgrade)
+
+::1     ip6-localhost ip6-loopback
+fe00::0 ip6-localnet
+ff00::0 ip6-mcastprefix
+ff02::1 ip6-allnodes
+ff02::2 ip6-allrouters
+ff02::3 ip6-allhosts
diff --git a/test/data/types/hosts/solaris b/test/data/types/hosts/solaris
new file mode 100644
index 0000000..be3b97f
--- /dev/null
+++ b/test/data/types/hosts/solaris
@@ -0,0 +1,5 @@
+#
+# Internet host table
+#
+127.0.0.1	localhost
+192.168.0.50	sol10b
diff --git a/test/data/types/mailalias/file1 b/test/data/types/mailalias/file1
new file mode 100644
index 0000000..a7cbd4e
--- /dev/null
+++ b/test/data/types/mailalias/file1
@@ -0,0 +1,183 @@
+# This is the aliases file - it says who gets mail for whom.
+# It was originally generated by `eximconfig', part of the exim package
+# distributed with Debian, but it may edited by the mail system administrator.
+# This file originally generated by eximconfig at Tue Jul 12345 12345:12345:12345 CDT 12345
+# See exim info section for details of the things that can be configured here.
+
+# Local aliases
+eight-phone: 12345 at domain.com
+eight-pager: eight-phone
+eight-sms: eight-phone
+cindy-phone: 12345 at domain.com
+cindy-pager: cindy-phone
+cindy-sms: cindy-phone
+
+ben-phone: 12345 at txt.att.net
+ben: eight
+ajax: eight
+
+teyo: teyo at brainfinger.org
+
+#----------------#
+# Family aliases #
+#----------------#
+
+smithes: eight,six,two,seven,isaiah,kristen,cindy,three
+smith: smithes
+#morris: morrisbpaddlin at hotmail.com
+#six: grendelwench at hotmail.com
+two: twosmith at thirddomain.com
+seven: sevensmith at thirddomain.com
+isaiah: ismith at thirddomain.com
+kristen: kristenwells at thirddomain.com
+one-phone: 12345 at otherdomain.com
+one-pager: one-phone
+seven-phone: 12345 at otherdomain.com
+seven-pager: seven-phone
+seven-sms: seven-phone
+ike-phone: 12345 at otherdomain.com
+ike-page: ike-phone
+ike-sms: ike-phone
+six-phone: 12345 at otherdomain.com
+six-page: six-phone
+six-sms: six-phone
+three: tferguson at mmc.edu
+three-phone: 12345 at otherdomain.com
+three-page: three-phone
+three-sms: three-phone
+four-phone: 12345 at otherdomain.com
+four-page: four-phone
+four-sms: four-phone
+two-phone: 12345 at otherdomain.com
+two-page: two-phone
+two-sms: two-phone
+five-phone: 12345 at otherdomain.com
+five-page: five-phone
+five-sms: five-phone
+
+#----------------#
+# work aliases #
+#----------------#
+consulting: eight
+svn: eight
+info: eight
+blog: eight
+paypal: eight
+trac: puppet-dev
+dev: eight
+sales: eight
+training: eight
+support: eight
+faq: eight
+puppet-docs: eight,nine at domain.com,ten at domain.com,eleven at other.com
+docs: puppet-docs
+jobs: eight
+
+# System stuff
+postmaster: eight
+root: eight
+
+daemon: root
+bin: root
+sys: root
+sync: root
+games: root
+man: root
+lp: root
+mail: root
+news: root
+uucp: root
+proxy: root
+postgres: root
+www-data: root
+backup: root
+operator: root
+list: root
+irc: root
+gnats: root
+nobody: root
+
+filemaker: eight
+
+hostmaster: root
+usenet: root
+webmaster: root
+www: root
+ftp: root
+abuse: root
+noc: root
+security: root
+
+mailer-daemon: postmaster
+
+tap: one at two.com,two at three.com,three at four.com,four at five.com,five at six.com
+
+mailman:              "|/var/lib/mailman/mail/mailman post mailman"
+mailman-admin:        "|/var/lib/mailman/mail/mailman admin mailman"
+mailman-bounces:      "|/var/lib/mailman/mail/mailman bounces mailman"
+mailman-confirm:      "|/var/lib/mailman/mail/mailman confirm mailman"
+mailman-join:         "|/var/lib/mailman/mail/mailman join mailman"
+mailman-leave:        "|/var/lib/mailman/mail/mailman leave mailman"
+mailman-owner:        "|/var/lib/mailman/mail/mailman owner mailman"
+mailman-request:      "|/var/lib/mailman/mail/mailman request mailman"
+mailman-subscribe:    "|/var/lib/mailman/mail/mailman subscribe mailman"
+mailman-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe mailman"
+
+puppet-dev:              "|/var/lib/mailman/mail/mailman post puppet-dev"
+puppet-dev-admin:        "|/var/lib/mailman/mail/mailman admin puppet-dev"
+puppet-dev-bounces:      "|/var/lib/mailman/mail/mailman bounces puppet-dev"
+puppet-dev-confirm:      "|/var/lib/mailman/mail/mailman confirm puppet-dev"
+puppet-dev-join:         "|/var/lib/mailman/mail/mailman join puppet-dev"
+puppet-dev-leave:        "|/var/lib/mailman/mail/mailman leave puppet-dev"
+puppet-dev-owner:        "|/var/lib/mailman/mail/mailman owner puppet-dev"
+puppet-dev-request:      "|/var/lib/mailman/mail/mailman request puppet-dev"
+puppet-dev-subscribe:    "|/var/lib/mailman/mail/mailman subscribe puppet-dev"
+puppet-dev-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe puppet-dev"
+
+## puppet-commit mailing list
+puppet-commit:              "|/var/lib/mailman/mail/mailman post puppet-commit"
+puppet-commit-admin:        "|/var/lib/mailman/mail/mailman admin puppet-commit"
+puppet-commit-bounces:      "|/var/lib/mailman/mail/mailman bounces puppet-commit"
+puppet-commit-confirm:      "|/var/lib/mailman/mail/mailman confirm puppet-commit"
+puppet-commit-join:         "|/var/lib/mailman/mail/mailman join puppet-commit"
+puppet-commit-leave:        "|/var/lib/mailman/mail/mailman leave puppet-commit"
+puppet-commit-owner:        "|/var/lib/mailman/mail/mailman owner puppet-commit"
+puppet-commit-request:      "|/var/lib/mailman/mail/mailman request puppet-commit"
+puppet-commit-subscribe:    "|/var/lib/mailman/mail/mailman subscribe puppet-commit"
+puppet-commit-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe puppet-commit"
+
+## bnageek mailing list
+bnageek:              "|/var/lib/mailman/mail/mailman post bnageek"
+bnageek-admin:        "|/var/lib/mailman/mail/mailman admin bnageek"
+bnageek-bounces:      "|/var/lib/mailman/mail/mailman bounces bnageek"
+bnageek-confirm:      "|/var/lib/mailman/mail/mailman confirm bnageek"
+bnageek-join:         "|/var/lib/mailman/mail/mailman join bnageek"
+bnageek-leave:        "|/var/lib/mailman/mail/mailman leave bnageek"
+bnageek-owner:        "|/var/lib/mailman/mail/mailman owner bnageek"
+bnageek-request:      "|/var/lib/mailman/mail/mailman request bnageek"
+bnageek-subscribe:    "|/var/lib/mailman/mail/mailman subscribe bnageek"
+bnageek-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe bnageek"
+
+## puppet-users mailing list
+puppet-users:              "|/var/lib/mailman/mail/mailman post puppet-users"
+puppet-users-admin:        "|/var/lib/mailman/mail/mailman admin puppet-users"
+puppet-users-bounces:      "|/var/lib/mailman/mail/mailman bounces puppet-users"
+puppet-users-confirm:      "|/var/lib/mailman/mail/mailman confirm puppet-users"
+puppet-users-join:         "|/var/lib/mailman/mail/mailman join puppet-users"
+puppet-users-leave:        "|/var/lib/mailman/mail/mailman leave puppet-users"
+puppet-users-owner:        "|/var/lib/mailman/mail/mailman owner puppet-users"
+puppet-users-request:      "|/var/lib/mailman/mail/mailman request puppet-users"
+puppet-users-subscribe:    "|/var/lib/mailman/mail/mailman subscribe puppet-users"
+puppet-users-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe puppet-users"
+
+## puppet-bugs mailing list
+puppet-bugs:              "|/var/lib/mailman/mail/mailman post puppet-bugs"
+puppet-bugs-admin:        "|/var/lib/mailman/mail/mailman admin puppet-bugs"
+puppet-bugs-bounces:      "|/var/lib/mailman/mail/mailman bounces puppet-bugs"
+puppet-bugs-confirm:      "|/var/lib/mailman/mail/mailman confirm puppet-bugs"
+puppet-bugs-join:         "|/var/lib/mailman/mail/mailman join puppet-bugs"
+puppet-bugs-leave:        "|/var/lib/mailman/mail/mailman leave puppet-bugs"
+puppet-bugs-owner:        "|/var/lib/mailman/mail/mailman owner puppet-bugs"
+puppet-bugs-request:      "|/var/lib/mailman/mail/mailman request puppet-bugs"
+puppet-bugs-subscribe:    "|/var/lib/mailman/mail/mailman subscribe puppet-bugs"
+puppet-bugs-unsubscribe:  "|/var/lib/mailman/mail/mailman unsubscribe puppet-bugs"
diff --git a/test/data/types/mount/freebsd.fstab b/test/data/types/mount/freebsd.fstab
new file mode 100644
index 0000000..c39416b
--- /dev/null
+++ b/test/data/types/mount/freebsd.fstab
@@ -0,0 +1,7 @@
+# Device		Mountpoint	FStype	Options		Dump	Pass#
+/dev/ad0s1b		none		swap	sw		0	0
+/dev/ad0s1a		/		ufs	rw		1	1
+/dev/ad0s1e		/tmp		ufs	rw		2	2
+/dev/ad0s1f		/usr		ufs	rw		2	2
+/dev/ad0s1d		/var		ufs	rw		2	2
+/dev/acd0		/cdrom		cd9660	ro,noauto	0	0
diff --git a/test/data/types/mount/linux.fstab b/test/data/types/mount/linux.fstab
new file mode 100644
index 0000000..b1debff
--- /dev/null
+++ b/test/data/types/mount/linux.fstab
@@ -0,0 +1,11 @@
+# A sample fstab, typical for a Fedora system
+/dev/vg00/lv00          /                       ext3    defaults        1 1
+LABEL=/boot             /boot                   ext3    defaults        1 2
+devpts                  /dev/pts                devpts  gid=5,mode=620  0
+tmpfs                   /dev/shm                tmpfs   defaults        0
+LABEL=/home             /home                   ext3    defaults        1 2
+/home                   /homes                  auto    bind            0 2
+proc                    /proc                   proc    defaults        0 0
+/dev/vg00/lv01          /spare                  ext3    defaults        1 2
+sysfs                   /sys                    sysfs   defaults        0 0
+LABEL=SWAP-hda6         swap                    swap    defaults        0 0
diff --git a/test/data/types/mount/solaris.fstab b/test/data/types/mount/solaris.fstab
new file mode 100644
index 0000000..c7de967
--- /dev/null
+++ b/test/data/types/mount/solaris.fstab
@@ -0,0 +1,11 @@
+#device		device		mount		FS	fsck	mount	mount
+#to mount	to fsck		point		type	pass	at boot	options
+#
+fd	-	/dev/fd	fd	-	no	-
+/proc	-	/proc	proc	-	no	-
+/dev/dsk/c0d0s0	/dev/rdsk/c0d0s0	/	ufs	1	no	-
+/dev/dsk/c0d0p0:boot	-	/boot	pcfs	-	no	-
+/devices	-	/devices	devfs	-	no	-
+ctfs	-	/system/contract	ctfs	-	no	-
+objfs	-	/system/object	objfs	-	no	-
+#swap	-	/tmp	tmpfs	-	yes	-
diff --git a/test/data/types/port/1 b/test/data/types/port/1
new file mode 100644
index 0000000..8fcc801
--- /dev/null
+++ b/test/data/types/port/1
@@ -0,0 +1,533 @@
+# Network services, Internet style
+#
+# Note that it is presently the policy of IANA to assign a single well-known
+# port number for both TCP and UDP; hence, officially ports have two entries
+# even if the protocol doesn't support UDP operations.
+#
+# Updated from http://www.iana.org/assignments/port-numbers and other
+# sources like http://www.freebsd.org/cgi/cvsweb.cgi/src/etc/services .
+# New ports will be added on request if they have been officially assigned
+# by IANA and used in the real-world or are needed by a debian package.
+# If you need a huge list of used numbers please install the nmap package.
+
+tcpmux		1/tcp				# TCP port service multiplexer
+echo		7/tcp
+echo		7/udp
+discard		9/tcp		sink null
+discard		9/udp		sink null
+systat		11/tcp		users
+daytime		13/tcp
+daytime		13/udp
+netstat		15/tcp
+qotd		17/tcp		quote
+msp		18/tcp				# message send protocol
+msp		18/udp
+chargen		19/tcp		ttytst source
+chargen		19/udp		ttytst source
+ftp-data	20/tcp
+ftp		21/tcp
+fsp		21/udp		fspd
+ssh		22/tcp				# SSH Remote Login Protocol
+ssh		22/udp
+telnet		23/tcp
+smtp		25/tcp		mail
+time		37/tcp		timserver
+time		37/udp		timserver
+rlp		39/udp		resource	# resource location
+nameserver	42/tcp		name		# IEN 116
+whois		43/tcp		nicname
+tacacs		49/tcp				# Login Host Protocol (TACACS)
+tacacs		49/udp
+re-mail-ck	50/tcp				# Remote Mail Checking Protocol
+re-mail-ck	50/udp
+domain		53/tcp		nameserver	# name-domain server
+domain		53/udp		nameserver
+mtp		57/tcp				# deprecated
+tacacs-ds	65/tcp				# TACACS-Database Service
+tacacs-ds	65/udp
+bootps		67/tcp				# BOOTP server
+bootps		67/udp
+bootpc		68/tcp				# BOOTP client
+bootpc		68/udp
+tftp		69/udp
+gopher		70/tcp				# Internet Gopher
+gopher		70/udp
+rje		77/tcp		netrjs
+finger		79/tcp
+www		80/tcp		http		# WorldWideWeb HTTP
+www		80/udp				# HyperText Transfer Protocol
+link		87/tcp		ttylink
+kerberos	88/tcp		kerberos5 krb5 kerberos-sec	# Kerberos v5
+kerberos	88/udp		kerberos5 krb5 kerberos-sec	# Kerberos v5
+supdup		95/tcp
+hostnames	101/tcp		hostname	# usually from sri-nic
+iso-tsap	102/tcp		tsap		# part of ISODE
+acr-nema	104/tcp		dicom		# Digital Imag. & Comm. 300
+acr-nema	104/udp		dicom		# Digital Imag. & Comm. 300
+csnet-ns	105/tcp		cso-ns		# also used by CSO name server
+csnet-ns	105/udp		cso-ns
+rtelnet		107/tcp				# Remote Telnet
+rtelnet		107/udp
+pop2		109/tcp		postoffice pop-2 # POP version 2
+pop2		109/udp		pop-2
+pop3		110/tcp		pop-3		# POP version 3
+pop3		110/udp		pop-3
+sunrpc		111/tcp		portmapper	# RPC 4.0 portmapper
+sunrpc		111/udp		portmapper
+auth		113/tcp		authentication tap ident
+sftp		115/tcp
+uucp-path	117/tcp
+nntp		119/tcp		readnews untp	# USENET News Transfer Protocol
+ntp		123/tcp
+ntp		123/udp				# Network Time Protocol
+pwdgen		129/tcp				# PWDGEN service
+pwdgen		129/udp				# PWDGEN service
+loc-srv		135/tcp		epmap		# Location Service
+loc-srv		135/udp		epmap
+netbios-ns	137/tcp				# NETBIOS Name Service
+netbios-ns	137/udp
+netbios-dgm	138/tcp				# NETBIOS Datagram Service
+netbios-dgm	138/udp
+netbios-ssn	139/tcp				# NETBIOS session service
+netbios-ssn	139/udp
+imap2		143/tcp		imap		# Interim Mail Access P 2 and 4
+imap2		143/udp		imap
+snmp		161/tcp				# Simple Net Mgmt Protocol
+snmp		161/udp				# Simple Net Mgmt Protocol
+snmp-trap	162/tcp		snmptrap	# Traps for SNMP
+snmp-trap	162/udp		snmptrap	# Traps for SNMP
+cmip-man	163/tcp				# ISO mgmt over IP (CMOT)
+cmip-man	163/udp
+cmip-agent	164/tcp
+cmip-agent	164/udp
+mailq		174/tcp			# Mailer transport queue for Zmailer
+mailq		174/udp			# Mailer transport queue for Zmailer
+xdmcp		177/tcp				# X Display Mgr. Control Proto
+xdmcp		177/udp
+nextstep	178/tcp		NeXTStep NextStep	# NeXTStep window
+nextstep	178/udp		NeXTStep NextStep	#  server
+bgp		179/tcp				# Border Gateway Protocol
+bgp		179/udp
+prospero	191/tcp				# Cliff Neuman's Prospero
+prospero	191/udp
+irc		194/tcp				# Internet Relay Chat
+irc		194/udp
+smux		199/tcp				# SNMP Unix Multiplexer
+smux		199/udp
+at-rtmp		201/tcp				# AppleTalk routing
+at-rtmp		201/udp
+at-nbp		202/tcp				# AppleTalk name binding
+at-nbp		202/udp
+at-echo		204/tcp				# AppleTalk echo
+at-echo		204/udp
+at-zis		206/tcp				# AppleTalk zone information
+at-zis		206/udp
+qmtp		209/tcp				# Quick Mail Transfer Protocol
+qmtp		209/udp				# Quick Mail Transfer Protocol
+z3950		210/tcp		wais		# NISO Z39.50 database
+z3950		210/udp		wais
+ipx		213/tcp				# IPX
+ipx		213/udp
+imap3		220/tcp				# Interactive Mail Access
+imap3		220/udp				# Protocol v3
+pawserv		345/tcp				# Perf Analysis Workbench
+pawserv		345/udp
+zserv		346/tcp				# Zebra server
+zserv		346/udp
+fatserv		347/tcp				# Fatmen Server
+fatserv		347/udp
+rpc2portmap	369/tcp
+rpc2portmap	369/udp				# Coda portmapper
+codaauth2	370/tcp
+codaauth2	370/udp				# Coda authentication server
+clearcase	371/tcp		Clearcase
+clearcase	371/udp		Clearcase
+ulistserv	372/tcp				# UNIX Listserv
+ulistserv	372/udp
+ldap		389/tcp			# Lightweight Directory Access Protocol
+ldap		389/udp
+imsp		406/tcp			# Interactive Mail Support Protocol
+imsp		406/udp
+https		443/tcp				# http protocol over TLS/SSL
+https		443/udp
+snpp		444/tcp				# Simple Network Paging Protocol
+snpp		444/udp
+microsoft-ds	445/tcp				# Microsoft Naked CIFS
+microsoft-ds	445/udp
+saft		487/tcp			# Simple Asynchronous File Transfer
+saft		487/udp
+isakmp		500/tcp			# IPsec - Internet Security Association
+isakmp		500/udp			#  and Key Management Protocol
+rtsp		554/tcp			# Real Time Stream Control Protocol
+rtsp		554/udp			# Real Time Stream Control Protocol
+nqs		607/tcp				# Network Queuing system
+nqs		607/udp
+npmp-local	610/tcp		dqs313_qmaster		# npmp-local / DQS
+npmp-local	610/udp		dqs313_qmaster
+npmp-gui	611/tcp		dqs313_execd		# npmp-gui / DQS
+npmp-gui	611/udp		dqs313_execd
+hmmp-ind	612/tcp		dqs313_intercell	# HMMP Indication / DQS
+hmmp-ind	612/udp		dqs313_intercell
+ipp		631/tcp				# Internet Printing Protocol
+ipp		631/udp
+#
+# UNIX specific services
+#
+exec		512/tcp
+biff		512/udp		comsat
+login		513/tcp
+who		513/udp		whod
+shell		514/tcp		cmd		# no passwords used
+syslog		514/udp
+printer		515/tcp		spooler		# line printer spooler
+talk		517/udp
+ntalk		518/udp
+route		520/udp		router routed	# RIP
+timed		525/udp		timeserver
+tempo		526/tcp		newdate
+courier		530/tcp		rpc
+conference	531/tcp		chat
+netnews		532/tcp		readnews
+netwall		533/udp				# for emergency broadcasts
+gdomap		538/tcp				# GNUstep distributed objects
+gdomap		538/udp
+uucp		540/tcp		uucpd		# uucp daemon
+klogin		543/tcp				# Kerberized `rlogin' (v5)
+kshell		544/tcp		krcmd		# Kerberized `rsh' (v5)
+afpovertcp	548/tcp				# AFP over TCP
+afpovertcp	548/udp
+remotefs	556/tcp		rfs_server rfs	# Brunhoff remote filesystem
+nntps		563/tcp		snntp		# NNTP over SSL
+nntps		563/udp		snntp
+submission	587/tcp				# Submission [RFC2476]
+submission	587/udp
+ldaps		636/tcp				# LDAP over SSL
+ldaps		636/udp
+tinc		655/tcp				# tinc control port
+tinc		655/udp
+silc		706/tcp
+silc		706/udp
+kerberos-adm	749/tcp				# Kerberos `kadmin' (v5)
+#
+webster		765/tcp				# Network dictionary
+webster		765/udp
+rsync		873/tcp
+rsync		873/udp
+ftps-data	989/tcp				# FTP over SSL (data)
+ftps		990/tcp
+telnets		992/tcp				# Telnet over SSL
+telnets		992/udp
+imaps		993/tcp				# IMAP over SSL
+imaps		993/udp
+ircs		994/tcp				# IRC over SSL
+ircs		994/udp
+pop3s		995/tcp				# POP-3 over SSL
+pop3s		995/udp
+#
+# From ``Assigned Numbers'':
+#
+#> The Registered Ports are not controlled by the IANA and on most systems
+#> can be used by ordinary user processes or programs executed by ordinary
+#> users.
+#
+#> Ports are used in the TCP [45,106] to name the ends of logical
+#> connections which carry long term conversations.  For the purpose of
+#> providing services to unknown callers, a service contact port is
+#> defined.  This list specifies the port used by the server process as its
+#> contact port.  While the IANA can not control uses of these ports it
+#> does register or list uses of these ports as a convienence to the
+#> community.
+#
+socks		1080/tcp			# socks proxy server
+socks		1080/udp
+proofd		1093/tcp
+proofd		1093/udp
+rootd		1094/tcp
+rootd		1094/udp
+openvpn		1194/tcp
+openvpn		1194/udp
+rmiregistry	1099/tcp			# Java RMI Registry
+rmiregistry	1099/udp
+kazaa		1214/tcp
+kazaa		1214/udp
+nessus		1241/tcp			# Nessus vulnerability
+nessus		1241/udp			#  assessment scanner
+lotusnote	1352/tcp	lotusnotes	# Lotus Note
+lotusnote	1352/udp	lotusnotes
+ms-sql-s	1433/tcp			# Microsoft SQL Server
+ms-sql-s	1433/udp
+ms-sql-m	1434/tcp			# Microsoft SQL Monitor
+ms-sql-m	1434/udp
+ingreslock	1524/tcp
+ingreslock	1524/udp
+prospero-np	1525/tcp			# Prospero non-privileged
+prospero-np	1525/udp
+datametrics	1645/tcp	old-radius
+datametrics	1645/udp	old-radius
+sa-msg-port	1646/tcp	old-radacct
+sa-msg-port	1646/udp	old-radacct
+kermit		1649/tcp
+kermit		1649/udp
+l2f		1701/tcp	l2tp
+l2f		1701/udp	l2tp
+radius		1812/tcp
+radius		1812/udp
+radius-acct	1813/tcp	radacct		# Radius Accounting
+radius-acct	1813/udp	radacct
+unix-status	1957/tcp			# remstats unix-status server
+log-server	1958/tcp			# remstats log server
+remoteping	1959/tcp			# remstats remoteping server
+rtcm-sc104	2101/tcp			# RTCM SC-104 IANA 1/29/99
+rtcm-sc104	2101/udp
+cvspserver	2401/tcp			# CVS client/server operations
+cvspserver	2401/udp
+venus		2430/tcp			# codacon port
+venus		2430/udp			# Venus callback/wbc interface
+venus-se	2431/tcp			# tcp side effects
+venus-se	2431/udp			# udp sftp side effect
+codasrv		2432/tcp			# not used
+codasrv		2432/udp			# server port
+codasrv-se	2433/tcp			# tcp side effects
+codasrv-se	2433/udp			# udp sftp side effect
+mon		2583/tcp			# MON
+mon		2583/udp
+dict		2628/tcp			# Dictionary server
+dict		2628/udp
+gpsd		2947/tcp
+gpsd		2947/udp
+gds_db		3050/tcp			# InterBase server
+gds_db		3050/udp
+icpv2		3130/tcp	icp		# Internet Cache Protocol
+icpv2		3130/udp	icp
+mysql		3306/tcp
+mysql		3306/udp
+nut		3493/tcp			# Network UPS Tools
+nut		3493/udp
+distcc		3632/tcp			# distributed compiler
+distcc		3632/udp
+daap		3689/tcp			# Digital Audio Access Protocol
+daap		3689/udp
+svn		3690/tcp	subversion	# Subversion protocol
+svn		3690/udp	subversion
+iax		4569/tcp			# Inter-Asterisk eXchange
+iax		4569/udp
+radmin-port	4899/tcp			# RAdmin Port
+radmin-port	4899/udp
+rfe		5002/udp			# Radio Free Ethernet
+rfe		5002/tcp
+sip		5060/tcp			# Session Initiation Protocol
+sip		5060/udp
+sip-tls		5061/tcp
+sip-tls		5061/udp
+xmpp-client	5222/tcp	jabber-client	# Jabber Client Connection
+xmpp-client	5222/udp	jabber-client
+xmpp-server	5269/tcp	jabber-server	# Jabber Server Connection
+xmpp-server	5269/udp	jabber-server
+cfengine	5308/tcp
+cfengine	5308/udp
+postgresql	5432/tcp	postgres	# PostgreSQL Database
+postgresql	5432/udp	postgres
+x11		6000/tcp	x11-0		# X Window System
+x11		6000/udp	x11-0
+x11-1		6001/tcp
+x11-1		6001/udp
+x11-2		6002/tcp
+x11-2		6002/udp
+x11-3		6003/tcp
+x11-3		6003/udp
+x11-4		6004/tcp
+x11-4		6004/udp
+x11-5		6005/tcp
+x11-5		6005/udp
+x11-6		6006/tcp
+x11-6		6006/udp
+x11-7		6007/tcp
+x11-7		6007/udp
+gnutella-svc	6346/tcp			# gnutella
+gnutella-svc	6346/udp
+gnutella-rtr	6347/tcp			# gnutella 
+gnutella-rtr	6347/udp
+afs3-fileserver 7000/tcp	bbs		# file server itself
+afs3-fileserver 7000/udp	bbs
+afs3-callback	7001/tcp			# callbacks to cache managers
+afs3-callback	7001/udp
+afs3-prserver	7002/tcp			# users & groups database
+afs3-prserver	7002/udp
+afs3-vlserver	7003/tcp			# volume location database
+afs3-vlserver	7003/udp
+afs3-kaserver	7004/tcp			# AFS/Kerberos authentication
+afs3-kaserver	7004/udp
+afs3-volser	7005/tcp			# volume managment server
+afs3-volser	7005/udp
+afs3-errors	7006/tcp			# error interpretation service
+afs3-errors	7006/udp
+afs3-bos	7007/tcp			# basic overseer process
+afs3-bos	7007/udp
+afs3-update	7008/tcp			# server-to-server updater
+afs3-update	7008/udp
+afs3-rmtsys	7009/tcp			# remote cache manager service
+afs3-rmtsys	7009/udp
+font-service	7100/tcp	xfs		# X Font Service
+font-service	7100/udp	xfs
+bacula-dir	9101/tcp			# Bacula Director
+bacula-dir	9101/udp
+bacula-fd	9102/tcp			# Bacula File Daemon
+bacula-fd	9102/udp
+bacula-sd	9103/tcp			# Bacula Storage Daemon
+bacula-sd	9103/udp
+amanda		10080/tcp			# amanda backup services
+amanda		10080/udp
+hkp		11371/tcp			# OpenPGP HTTP Keyserver
+hkp		11371/udp			# OpenPGP HTTP Keyserver
+bprd            13720/tcp			# VERITAS NetBackup
+bprd            13720/udp
+bpdbm           13721/tcp			# VERITAS NetBackup
+bpdbm           13721/udp
+bpjava-msvc     13722/tcp			# BP Java MSVC Protocol
+bpjava-msvc     13722/udp
+vnetd           13724/tcp			# Veritas Network Utility
+vnetd           13724/udp
+bpcd            13782/tcp			# VERITAS NetBackup
+bpcd            13782/udp
+vopied          13783/tcp			# VERITAS NetBackup
+vopied          13783/udp
+wnn6		22273/tcp			# wnn6
+wnn6		22273/udp
+
+#
+# Datagram Delivery Protocol services
+#
+rtmp		1/ddp			# Routing Table Maintenance Protocol
+nbp		2/ddp			# Name Binding Protocol
+echo		4/ddp			# AppleTalk Echo Protocol
+zip		6/ddp			# Zone Information Protocol
+
+#=========================================================================
+# The remaining port numbers are not as allocated by IANA.
+#=========================================================================
+
+# Kerberos (Project Athena/MIT) services
+# Note that these are for Kerberos v4, and are unofficial.  Sites running
+# v4 should uncomment these and comment out the v5 entries above.
+#
+kerberos4	750/udp		kerberos-iv kdc	# Kerberos (server)
+kerberos4	750/tcp		kerberos-iv kdc
+kerberos_master	751/udp				# Kerberos authentication
+kerberos_master	751/tcp	
+passwd_server	752/udp				# Kerberos passwd server
+krb_prop	754/tcp		krb5_prop hprop	# Kerberos slave propagation
+krbupdate	760/tcp		kreg		# Kerberos registration
+kpasswd		761/tcp		kpwd		# Kerberos "passwd"
+swat		901/tcp				# swat
+kpop		1109/tcp			# Pop with Kerberos
+knetd		2053/tcp			# Kerberos de-multiplexor
+zephyr-srv	2102/udp			# Zephyr server
+zephyr-clt	2103/udp			# Zephyr serv-hm connection
+zephyr-hm	2104/udp			# Zephyr hostmanager
+eklogin		2105/tcp			# Kerberos encrypted rlogin
+# Hmmm. Are we using Kv4 or Kv5 now? Worrying.
+# The following is probably Kerberos v5  --- ajt at debian.org (11/02/2000)
+kx		2111/tcp			# X over Kerberos
+iprop		2121/tcp			# incremental propagation
+#
+# Unofficial but necessary (for NetBSD) services
+#
+supfilesrv	871/tcp				# SUP server
+supfiledbg	1127/tcp			# SUP debugging
+
+#
+# Services added for the Debian GNU/Linux distribution
+#
+linuxconf	98/tcp				# LinuxConf
+poppassd	106/tcp				# Eudora
+poppassd	106/udp
+ssmtp		465/tcp		smtps		# SMTP over SSL
+moira_db	775/tcp				# Moira database
+moira_update	777/tcp				# Moira update protocol
+moira_ureg	779/udp				# Moira user registration
+spamd		783/tcp				# spamassassin daemon
+omirr		808/tcp		omirrd		# online mirror
+omirr		808/udp		omirrd
+customs		1001/tcp			# pmake customs server
+customs		1001/udp
+skkserv		1178/tcp			# skk jisho server port
+predict		1210/udp			# predict -- satellite tracking
+rmtcfg		1236/tcp			# Gracilis Packeten remote config server
+wipld		1300/tcp			# Wipl network monitor
+xtel		1313/tcp			# french minitel
+xtelw		1314/tcp			# french minitel
+support		1529/tcp			# GNATS
+sieve		2000/tcp			# Sieve mail filter daemon
+cfinger		2003/tcp			# GNU Finger
+ndtp		2010/tcp			# Network dictionary transfer protocol
+frox		2121/tcp			# frox: caching ftp proxy
+ninstall	2150/tcp			# ninstall service
+ninstall	2150/udp
+zebrasrv	2600/tcp			# zebra service
+zebra		2601/tcp			# zebra vty
+ripd		2602/tcp			# ripd vty (zebra)
+ripngd		2603/tcp			# ripngd vty (zebra)
+ospfd		2604/tcp			# ospfd vty (zebra)
+bgpd		2605/tcp			# bgpd vty (zebra)
+ospf6d		2606/tcp			# ospf6d vty (zebra)
+ospfapi		2607/tcp			# OSPF-API
+isisd		2608/tcp			# ISISd vty (zebra)
+afbackup	2988/tcp			# Afbackup system
+afbackup	2988/udp
+afmbackup	2989/tcp			# Afmbackup system
+afmbackup	2989/udp
+xtell		4224/tcp			# xtell server
+fax		4557/tcp			# FAX transmission service (old)
+hylafax		4559/tcp			# HylaFAX client-server protocol (new)
+distmp3		4600/tcp			# distmp3host daemon
+munin		4949/tcp	lrrd		# Munin
+enbd-cstatd	5051/tcp			# ENBD client statd
+enbd-sstatd	5052/tcp			# ENBD server statd
+pcrd		5151/tcp			# PCR-1000 Daemon
+noclog		5354/tcp			# noclogd with TCP (nocol)
+noclog		5354/udp			# noclogd with UDP (nocol)
+hostmon		5355/tcp			# hostmon uses TCP (nocol)
+hostmon		5355/udp			# hostmon uses UDP (nocol)
+rplay		5555/udp			# RPlay audio service
+rplay		5555/tcp
+rptp		5556/udp			# Remote Play Transfer Protocol
+rptp		5556/tcp
+nsca		5667/tcp			# Nagios Agent - NSCA
+mrtd		5674/tcp			# MRT Routing Daemon
+bgpsim		5675/tcp			# MRT Routing Simulator
+canna		5680/tcp			# cannaserver
+sane-port	6566/tcp	sane saned	# SANE network scanner daemon
+ircd		6667/tcp			# Internet Relay Chat
+zope-ftp	8021/tcp			# zope management by ftp
+webcache	8080/tcp			# WWW caching service
+tproxy		8081/tcp			# Transparent Proxy
+omniorb		8088/tcp			# OmniORB
+omniorb		8088/udp
+clc-build-daemon 8990/tcp			# Common lisp build daemon
+xinetd		9098/tcp
+mandelspawn	9359/udp	mandelbrot	# network mandelbrot
+zope		9673/tcp			# zope server
+kamanda		10081/tcp			# amanda backup services (Kerberos)
+kamanda		10081/udp
+amandaidx	10082/tcp			# amanda backup services
+amidxtape	10083/tcp			# amanda backup services
+smsqp		11201/tcp			# Alamin SMS gateway
+smsqp		11201/udp
+xpilot		15345/tcp			# XPilot Contact Port
+xpilot		15345/udp
+sgi-cmsd	17001/udp		# Cluster membership services daemon
+sgi-crsd	17002/udp
+sgi-gcd		17003/udp			# SGI Group membership daemon
+sgi-cad		17004/tcp			# Cluster Admin daemon
+isdnlog		20011/tcp			# isdn logging system
+isdnlog		20011/udp
+vboxd		20012/tcp			# voice box system
+vboxd		20012/udp
+binkp		24554/tcp			# binkp fidonet protocol
+asp		27374/tcp			# Address Search Protocol
+asp		27374/udp
+dircproxy	57000/tcp			# Detachable IRC Proxy
+tfido		60177/tcp			# fidonet EMSI over telnet
+fido		60179/tcp			# fidonet EMSI over TCP
+
+# Local services
diff --git a/test/data/types/port/darwin b/test/data/types/port/darwin
new file mode 100644
index 0000000..8c6b355
--- /dev/null
+++ b/test/data/types/port/darwin
@@ -0,0 +1,11866 @@
+#
+# Network services, Internet style
+#
+# Note that it is presently the policy of IANA to assign a single well-known
+# port number for both TCP and UDP; hence, most entries here have two entries
+# even if the protocol doesn't support UDP operations.
+#
+# The latest IANA port assignments can be gotten from
+#
+#	http://www.iana.org/assignments/port-numbers
+#
+# The Well Known Ports are those from 0 through 1023.
+# The Registered Ports are those from 1024 through 49151
+# The Dynamic and/or Private Ports are those from 49152 through 65535
+#
+# $FreeBSD: src/etc/services,v 1.89 2002/12/17 23:59:10 eric Exp $
+#	From: @(#)services	5.8 (Berkeley) 5/9/91
+#
+# WELL KNOWN PORT NUMBERS
+#
+rtmp              1/ddp    #Routing Table Maintenance Protocol
+tcpmux            1/udp     # TCP Port Service Multiplexer
+tcpmux            1/tcp     # TCP Port Service Multiplexer
+#                          Mark Lottor <MKL at nisc.sri.com>
+nbp               2/ddp    #Name Binding Protocol
+compressnet       2/udp     # Management Utility
+compressnet       2/tcp     # Management Utility
+compressnet       3/udp     # Compression Process
+compressnet       3/tcp     # Compression Process
+#                          Bernie Volz <VOLZ at PROCESS.COM>
+echo              4/ddp    #AppleTalk Echo Protocol
+#                 4/tcp    Unassigned
+#                 4/udp    Unassigned
+rje               5/udp     # Remote Job Entry
+rje               5/tcp     # Remote Job Entry
+#                          Jon Postel <postel at isi.edu>
+zip               6/ddp    #Zone Information Protocol
+#                 6/tcp    Unassigned
+#                 6/udp    Unassigned
+echo              7/udp     # Echo
+echo              7/tcp     # Echo
+#                          Jon Postel <postel at isi.edu>
+#                 8/tcp    Unassigned
+#                 8/udp    Unassigned
+discard           9/udp     # Discard
+discard           9/tcp     # Discard
+#                          Jon Postel <postel at isi.edu>
+#                10/tcp    Unassigned
+#                10/udp    Unassigned
+systat           11/udp     # Active Users
+systat           11/tcp     # Active Users
+#                          Jon Postel <postel at isi.edu>
+#                12/tcp    Unassigned
+#                12/udp    Unassigned
+daytime          13/udp     # Daytime (RFC 867)
+daytime          13/tcp     # Daytime (RFC 867)
+#                          Jon Postel <postel at isi.edu>
+#                14/tcp    Unassigned
+#                14/udp    Unassigned
+#                15/tcp    Unassigned [was netstat]
+#                15/udp    Unassigned
+#                16/tcp    Unassigned
+#                16/udp    Unassigned
+qotd             17/udp     # Quote of the Day
+qotd             17/tcp     # Quote of the Day
+#                          Jon Postel <postel at isi.edu>
+msp              18/udp     # Message Send Protocol
+msp              18/tcp     # Message Send Protocol
+#                          Rina Nethaniel <---none--->
+chargen          19/udp     # Character Generator
+chargen          19/tcp     # Character Generator
+ftp-data         20/udp     # File Transfer [Default Data]
+ftp-data         20/tcp     # File Transfer [Default Data]
+ftp              21/udp     # File Transfer [Control]
+ftp              21/tcp     # File Transfer [Control]
+#                          Jon Postel <postel at isi.edu>
+ssh              22/udp     # SSH Remote Login Protocol
+ssh              22/tcp     # SSH Remote Login Protocol
+#                          Tatu Ylonen <ylo at cs.hut.fi>
+telnet           23/udp     # Telnet
+telnet           23/tcp     # Telnet
+#                          Jon Postel <postel at isi.edu>
+                 24/udp     # any private mail system
+                 24/tcp     # any private mail system
+#                          Rick Adams <rick at UUNET.UU.NET>
+smtp             25/udp     # Simple Mail Transfer
+smtp             25/tcp     # Simple Mail Transfer
+#                          Jon Postel <postel at isi.edu>
+#                26/tcp    Unassigned
+#                26/udp    Unassigned
+nsw-fe           27/udp     # NSW User System FE
+nsw-fe           27/tcp     # NSW User System FE
+#                          Robert Thomas <BThomas at F.BBN.COM>
+#                28/tcp    Unassigned
+#                28/udp    Unassigned
+msg-icp          29/udp     # MSG ICP
+msg-icp          29/tcp     # MSG ICP
+#                          Robert Thomas <BThomas at F.BBN.COM>
+#                30/tcp    Unassigned
+#                30/udp    Unassigned
+msg-auth         31/udp     # MSG Authentication
+msg-auth         31/tcp     # MSG Authentication
+#                          Robert Thomas <BThomas at F.BBN.COM>
+#                32/tcp    Unassigned
+#                32/udp    Unassigned
+dsp              33/udp     # Display Support Protocol
+dsp              33/tcp     # Display Support Protocol
+#                          Ed Cain <cain at edn-unix.dca.mil>
+#                34/tcp    Unassigned
+#                34/udp    Unassigned
+                 35/udp     # any private printer server
+                 35/tcp     # any private printer server
+#                          Jon Postel <postel at isi.edu>
+#                36/tcp    Unassigned
+#                36/udp    Unassigned
+time             37/udp     # Time
+time             37/tcp     # Time
+#                          Jon Postel <postel at isi.edu>
+rap              38/udp     # Route Access Protocol
+rap              38/tcp     # Route Access Protocol
+#                          Robert Ullmann <ariel at world.std.com>
+rlp              39/udp     # Resource Location Protocol
+rlp              39/tcp     # Resource Location Protocol
+#                          Mike Accetta <MIKE.ACCETTA at CMU-CS-A.EDU>
+#                40/tcp    Unassigned
+#                40/udp    Unassigned
+graphics         41/udp     # Graphics
+graphics         41/tcp     # Graphics
+name             42/udp     nameserver # Host Name Server
+name             42/tcp     nameserver # Host Name Server
+nicname          43/udp     # Who Is
+nicname          43/tcp     # Who Is
+mpm-flags        44/udp     # MPM FLAGS Protocol
+mpm-flags        44/tcp     # MPM FLAGS Protocol
+mpm              45/udp     # Message Processing Module [recv]
+mpm              45/tcp     # Message Processing Module [recv]
+mpm-snd          46/udp     # MPM [default send]
+mpm-snd          46/tcp     # MPM [default send]
+#                          Jon Postel <postel at isi.edu>
+ni-ftp           47/udp     # NI FTP
+ni-ftp           47/tcp     # NI FTP
+#                          Steve Kille <S.Kille at isode.com>
+auditd           48/udp     # Digital Audit Daemon
+auditd           48/tcp     # Digital Audit Daemon
+#                          Larry Scott <scott at zk3.dec.com>
+tacacs           49/udp     # Login Host Protocol (TACACS)
+tacacs           49/tcp     # Login Host Protocol (TACACS)
+#                          Pieter Ditmars <pditmars at BBN.COM>
+re-mail-ck       50/udp     # Remote Mail Checking Protocol
+re-mail-ck       50/tcp     # Remote Mail Checking Protocol
+#                          Steve Dorner <s-dorner at UIUC.EDU>
+la-maint         51/udp     # IMP Logical Address Maintenance
+la-maint         51/tcp     # IMP Logical Address Maintenance
+#                          Andy Malis <malis_a at timeplex.com>
+xns-time         52/udp     # XNS Time Protocol
+xns-time         52/tcp     # XNS Time Protocol
+#                          Susie Armstrong <Armstrong.wbst128 at XEROX>
+domain           53/udp     # Domain Name Server
+domain           53/tcp     # Domain Name Server
+#                          Paul Mockapetris <PVM at ISI.EDU>
+xns-ch           54/udp     # XNS Clearinghouse
+xns-ch           54/tcp     # XNS Clearinghouse
+#                          Susie Armstrong <Armstrong.wbst128 at XEROX>
+isi-gl           55/udp     # ISI Graphics Language
+isi-gl           55/tcp     # ISI Graphics Language
+xns-auth         56/udp     # XNS Authentication
+xns-auth         56/tcp     # XNS Authentication
+#                          Susie Armstrong <Armstrong.wbst128 at XEROX>
+                 57/udp     # any private terminal access
+                 57/tcp     # any private terminal access
+#                          Jon Postel <postel at isi.edu>
+xns-mail         58/udp     # XNS Mail
+xns-mail         58/tcp     # XNS Mail
+#                          Susie Armstrong <Armstrong.wbst128 at XEROX>
+                 59/udp     # any private file service
+                 59/tcp     # any private file service
+#                          Jon Postel <postel at isi.edu>
+                 60/udp     # Unassigned
+                 60/tcp     # Unassigned
+ni-mail          61/udp     # NI MAIL
+ni-mail          61/tcp     # NI MAIL
+#                          Steve Kille <S.Kille at isode.com>
+acas             62/udp     # ACA Services
+acas             62/tcp     # ACA Services
+#                          E. Wald <ewald at via.enet.dec.com>
+whois++          63/udp     # whois++
+whois++          63/tcp     # whois++
+#                          Rickard Schoultz <schoultz at sunet.se>
+covia            64/udp     # Communications Integrator (CI)
+covia            64/tcp     # Communications Integrator (CI)
+#                          Dan Smith <dan.smith at den.galileo.com>
+tacacs-ds        65/udp     # TACACS-Database Service
+tacacs-ds        65/tcp     # TACACS-Database Service
+#                          Kathy Huber <khuber at bbn.com>
+sql*net          66/udp     # Oracle SQL*NET
+sql*net          66/tcp     # Oracle SQL*NET
+#                          Jack Haverty <jhaverty at ORACLE.COM>
+bootps           67/udp     # Bootstrap Protocol Server
+bootps           67/tcp     # Bootstrap Protocol Server
+bootpc           68/udp     # Bootstrap Protocol Client
+bootpc           68/tcp     # Bootstrap Protocol Client
+#                          Bill Croft <Croft at SUMEX-AIM.STANFORD.EDU>
+tftp             69/udp     # Trivial File Transfer
+tftp             69/tcp     # Trivial File Transfer
+#                          David Clark <ddc at LCS.MIT.EDU>
+gopher           70/udp     # Gopher
+gopher           70/tcp     # Gopher
+#                          Mark McCahill <mpm at boombox.micro.umn.edu>
+netrjs-1         71/udp     # Remote Job Service
+netrjs-1         71/tcp     # Remote Job Service
+netrjs-2         72/udp     # Remote Job Service
+netrjs-2         72/tcp     # Remote Job Service
+netrjs-3         73/udp     # Remote Job Service
+netrjs-3         73/tcp     # Remote Job Service
+netrjs-4         74/udp     # Remote Job Service
+netrjs-4         74/tcp     # Remote Job Service
+#                          Bob Braden <Braden at ISI.EDU>
+                 75/udp     # any private dial out service
+                 75/tcp     # any private dial out service
+#                          Jon Postel <postel at isi.edu>
+deos             76/udp     # Distributed External Object Store
+deos             76/tcp     # Distributed External Object Store
+#                          Robert Ullmann <ariel at world.std.com>
+                 77/udp     # any private RJE service
+                 77/tcp     # any private RJE service
+#                          Jon Postel <postel at isi.edu>
+vettcp           78/udp     # vettcp
+vettcp           78/tcp     # vettcp
+#                          Christopher Leong <leong at kolmod.mlo.dec.com>
+finger           79/udp     # Finger
+finger           79/tcp     # Finger
+#                          David Zimmerman <dpz at RUTGERS.EDU>
+http             80/udp     www www-http # World Wide Web HTTP
+http             80/tcp     www www-http # World Wide Web HTTP
+#                          Tim Berners-Lee <timbl at W3.org>
+hosts2-ns        81/udp     # HOSTS2 Name Server
+hosts2-ns        81/tcp     # HOSTS2 Name Server
+#                          Earl Killian <EAK at MORDOR.S1.GOV>
+xfer             82/udp     # XFER Utility
+xfer             82/tcp     # XFER Utility
+#                          Thomas M. Smith <Thomas.M.Smith at lmco.com>
+mit-ml-dev       83/udp     # MIT ML Device
+mit-ml-dev       83/tcp     # MIT ML Device
+#                          David Reed <--none--->
+ctf              84/udp     # Common Trace Facility
+ctf              84/tcp     # Common Trace Facility
+#                          Hugh Thomas <thomas at oils.enet.dec.com>
+mit-ml-dev       85/udp     # MIT ML Device
+mit-ml-dev       85/tcp     # MIT ML Device
+#                          David Reed <--none--->
+mfcobol          86/udp     # Micro Focus Cobol
+mfcobol          86/tcp     # Micro Focus Cobol
+#                          Simon Edwards <--none--->
+                 87/udp     # any private terminal link
+                 87/tcp     # any private terminal link
+#                          Jon Postel <postel at isi.edu>
+kerberos         88/udp     # Kerberos
+kerberos         88/tcp     # Kerberos
+#                          B. Clifford Neuman <bcn at isi.edu>
+su-mit-tg        89/udp     # SU/MIT Telnet Gateway
+su-mit-tg        89/tcp     # SU/MIT Telnet Gateway
+#                          Mark Crispin <MRC at PANDA.COM>
+########### PORT 90 also being used unofficially by Pointcast #########
+dnsix            90/udp     # DNSIX Securit Attribute Token Map
+dnsix            90/tcp     # DNSIX Securit Attribute Token Map
+#                          Charles Watt <watt at sware.com>
+mit-dov          91/udp     # MIT Dover Spooler
+mit-dov          91/tcp     # MIT Dover Spooler
+#                          Eliot Moss <EBM at XX.LCS.MIT.EDU>
+npp              92/udp     # Network Printing Protocol
+npp              92/tcp     # Network Printing Protocol
+#                          Louis Mamakos <louie at sayshell.umd.edu>
+dcp              93/udp     # Device Control Protocol
+dcp              93/tcp     # Device Control Protocol
+#                          Daniel Tappan <Tappan at BBN.COM>
+objcall          94/udp     # Tivoli Object Dispatcher
+objcall          94/tcp     # Tivoli Object Dispatcher
+#                          Tom Bereiter <--none--->
+supdup           95/udp     # SUPDUP
+supdup           95/tcp     # SUPDUP
+#                          Mark Crispin <MRC at PANDA.COM>
+dixie            96/udp     # DIXIE Protocol Specification
+dixie            96/tcp     # DIXIE Protocol Specification
+#                Tim Howes <Tim.Howes at terminator.cc.umich.edu>
+swift-rvf        97/udp     # Swift Remote Virtural File Protocol
+swift-rvf        97/tcp     # Swift Remote Virtural File Protocol
+#                          Maurice R. Turcotte
+#                <mailrus!uflorida!rm1!dnmrt%rmatl at uunet.UU.NET> 
+tacnews          98/udp     # TAC News
+tacnews          98/tcp     # TAC News
+#                          Jon Postel <postel at isi.edu>
+metagram         99/udp     # Metagram Relay
+metagram         99/tcp     # Metagram Relay
+#                          Geoff Goodfellow <Geoff at FERNWOOD.MPK.CA.US>
+newacct         100/tcp     # [unauthorized use]
+hostname        101/udp     # NIC Host Name Server
+hostname        101/tcp     # NIC Host Name Server
+#                          Jon Postel <postel at isi.edu>
+iso-tsap        102/udp     # ISO-TSAP Class 0
+iso-tsap        102/tcp     # ISO-TSAP Class 0
+#                          Marshall Rose <mrose at dbc.mtview.ca.us>
+gppitnp         103/udp     # Genesis Point-to-Point Trans Net
+gppitnp         103/tcp     # Genesis Point-to-Point Trans Net
+acr-nema        104/udp     # ACR-NEMA Digital Imag. & Comm. 300
+acr-nema        104/tcp     # ACR-NEMA Digital Imag. & Comm. 300
+#                          Patrick McNamee <--none--->
+cso             105/udp     # CCSO name server protocol
+cso             105/tcp     # CCSO name server protocol
+#                          Martin Hamilton <martin at mrrl.lut.as.uk>           
+csnet-ns        105/udp     # Mailbox Name Nameserver
+csnet-ns        105/tcp     # Mailbox Name Nameserver
+#                          Marvin Solomon <solomon at CS.WISC.EDU>
+3com-tsmux      106/udp     # 3COM-TSMUX
+3com-tsmux      106/tcp     # 3COM-TSMUX
+#                          Jeremy Siegel <jzs at NSD.3Com.COM>
+##########      106        Unauthorized use by insecure poppassd protocol
+rtelnet         107/udp     # Remote Telnet Service
+rtelnet         107/tcp     # Remote Telnet Service
+#                          Jon Postel <postel at isi.edu>
+snagas          108/udp     # SNA Gateway Access Server
+snagas          108/tcp     # SNA Gateway Access Server
+#                          Kevin Murphy <murphy at sevens.lkg.dec.com>
+pop2            109/udp     # Post Office Protocol - Version 2
+pop2            109/tcp     # Post Office Protocol - Version 2
+#                          Joyce K. Reynolds <jkrey at isi.edu>
+pop3            110/udp     # Post Office Protocol - Version 3
+pop3            110/tcp     # Post Office Protocol - Version 3
+#                          Marshall Rose <mrose at dbc.mtview.ca.us>
+sunrpc          111/udp     # SUN Remote Procedure Call
+sunrpc          111/tcp     # SUN Remote Procedure Call
+#                          Chuck McManis <cmcmanis at freegate.net>
+mcidas          112/udp     # McIDAS Data Transmission Protocol
+mcidas          112/tcp     # McIDAS Data Transmission Protocol
+#                          Glenn Davis <support at unidata.ucar.edu>
+auth            113/udp     # Authentication Service
+ident           113/tcp     auth # 
+#                          Mike St. Johns <stjohns at arpa.mil>
+audionews       114/udp     # Audio News Multicast
+audionews       114/tcp     # Audio News Multicast
+#                          Martin Forssen <maf at dtek.chalmers.se>
+sftp            115/udp     # Simple File Transfer Protocol
+sftp            115/tcp     # Simple File Transfer Protocol
+#                          Mark Lottor <MKL at nisc.sri.com>
+ansanotify      116/udp     # ANSA REX Notify
+ansanotify      116/tcp     # ANSA REX Notify
+#                          Nicola J. Howarth <njh at ansa.co.uk>
+uucp-path       117/udp     # UUCP Path Service
+uucp-path       117/tcp     # UUCP Path Service
+sqlserv         118/udp     # SQL Services
+sqlserv         118/tcp     # SQL Services
+#                          Larry Barnes <barnes at broke.enet.dec.com>
+nntp            119/udp     # Network News Transfer Protocol
+nntp            119/tcp     # Network News Transfer Protocol
+#                          Phil Lapsley <phil at UCBARPA.BERKELEY.EDU>
+cfdptkt         120/udp     # CFDPTKT
+cfdptkt         120/tcp     # CFDPTKT
+#                          John Ioannidis <ji at close.cs.columbia.ed>
+erpc            121/udp     # Encore Expedited Remote Pro.Call
+erpc            121/tcp     # Encore Expedited Remote Pro.Call
+#                          Jack O'Neil <---none--->
+smakynet        122/udp     # SMAKYNET
+smakynet        122/tcp     # SMAKYNET
+#                          Pierre Arnaud <pierre.arnaud at iname.com>
+ntp             123/udp     # Network Time Protocol
+ntp             123/tcp     # Network Time Protocol
+#                          Dave Mills <Mills at HUEY.UDEL.EDU>
+ansatrader      124/udp     # ANSA REX Trader
+ansatrader      124/tcp     # ANSA REX Trader
+#                          Nicola J. Howarth <njh at ansa.co.uk>
+locus-map       125/udp     # Locus PC-Interface Net Map Ser
+locus-map       125/tcp     # Locus PC-Interface Net Map Ser
+#                          Eric Peterson <lcc.eric at SEAS.UCLA.EDU>
+nxedit		126/udp     # NXEdit
+nxedit		126/tcp     # NXEdit
+#			   Don Payette <Don.Payette at unisys.com>
+###########Port 126 Previously assigned to application below#######
+#unitary         126/tcp    Unisys Unitary Login
+#unitary         126/udp    Unisys Unitary Login
+#                          <feil at kronos.nisd.cam.unisys.com>
+###########Port 126 Previously assigned to application above#######
+locus-con       127/udp     # Locus PC-Interface Conn Server
+locus-con       127/tcp     # Locus PC-Interface Conn Server
+#                          Eric Peterson <lcc.eric at SEAS.UCLA.EDU>
+gss-xlicen      128/udp     # GSS X License Verification
+gss-xlicen      128/tcp     # GSS X License Verification
+#                          John Light <johnl at gssc.gss.com>
+pwdgen          129/udp     # Password Generator Protocol
+pwdgen          129/tcp     # Password Generator Protocol
+#                          Frank J. Wacho <WANCHO at WSMR-SIMTEL20.ARMY.MIL>
+cisco-fna       130/udp     # cisco FNATIVE
+cisco-fna       130/tcp     # cisco FNATIVE
+cisco-tna       131/udp     # cisco TNATIVE
+cisco-tna       131/tcp     # cisco TNATIVE
+cisco-sys       132/udp     # cisco SYSMAINT
+cisco-sys       132/tcp     # cisco SYSMAINT
+statsrv         133/udp     # Statistics Service
+statsrv         133/tcp     # Statistics Service
+#                          Dave Mills <Mills at HUEY.UDEL.EDU>
+ingres-net      134/udp     # INGRES-NET Service
+ingres-net      134/tcp     # INGRES-NET Service
+#                          Mike Berrow <---none--->
+epmap           135/udp     # DCE endpoint resolution
+epmap           135/tcp     # DCE endpoint resolution
+#                          Joe Pato <pato at apollo.hp.com>
+profile         136/udp     # PROFILE Naming System           
+profile         136/tcp     # PROFILE Naming System           
+#                          Larry Peterson <llp at ARIZONA.EDU>
+netbios-ns      137/udp     # NETBIOS Name Service    
+netbios-ns      137/tcp     # NETBIOS Name Service    
+netbios-dgm     138/udp     # NETBIOS Datagram Service
+netbios-dgm     138/tcp     # NETBIOS Datagram Service
+netbios-ssn     139/udp     # NETBIOS Session Service
+netbios-ssn     139/tcp     # NETBIOS Session Service
+#                          Jon Postel <postel at isi.edu>
+emfis-data      140/udp     # EMFIS Data Service
+emfis-data      140/tcp     # EMFIS Data Service
+emfis-cntl      141/udp     # EMFIS Control Service
+emfis-cntl      141/tcp     # EMFIS Control Service
+#                          Gerd Beling <GBELING at ISI.EDU>
+bl-idm          142/udp     # Britton-Lee IDM           
+bl-idm          142/tcp     # Britton-Lee IDM           
+#                          Susie Snitzer <---none--->
+imap            143/udp     # Internet Message Access Protocol
+imap            143/tcp     # Internet Message Access Protocol
+#                          Mark Crispin <MRC at CAC.Washington.EDU>
+uma		144/udp     # Universal Management Architecture
+uma 		144/tcp     # Universal Management Architecture
+#			   Jay Whitney <jw at powercenter.com>
+uaac            145/udp     # UAAC Protocol             
+uaac            145/tcp     # UAAC Protocol             
+#                          David A. Gomberg <gomberg at GATEWAY.MITRE.ORG>
+iso-tp0         146/udp     # ISO-IP0
+iso-tp0         146/tcp     # ISO-IP0
+iso-ip          147/udp     # ISO-IP
+iso-ip          147/tcp     # ISO-IP
+#                          Marshall Rose <mrose at dbc.mtview.ca.us>
+jargon          148/udp     # Jargon
+jargon          148/tcp     # Jargon
+#			   Bill Weinman <wew at bearnet.com>
+aed-512         149/udp     # AED 512 Emulation Service           
+aed-512         149/tcp     # AED 512 Emulation Service           
+#                          Albert G. Broscius <broscius at DSL.CIS.UPENN.EDU>
+sql-net         150/udp     # SQL-NET                    
+sql-net         150/tcp     # SQL-NET                    
+#                          Martin Picard <<---none--->
+hems            151/udp     # HEMS                              
+hems            151/tcp     # HEMS                              
+bftp            152/udp     # Background File Transfer Program 
+bftp            152/tcp     # Background File Transfer Program 
+#                          Annette DeSchon <DESCHON at ISI.EDU>
+sgmp            153/udp     # SGMP                    
+sgmp            153/tcp     # SGMP                    
+#                          Marty Schoffstahl <schoff at NISC.NYSER.NET>
+netsc-prod      154/udp     # NETSC                             
+netsc-prod      154/tcp     # NETSC                             
+netsc-dev       155/udp     # NETSC                             
+netsc-dev       155/tcp     # NETSC                             
+#                          Sergio Heker <heker at JVNCC.CSC.ORG>
+sqlsrv          156/udp     # SQL Service                  
+sqlsrv          156/tcp     # SQL Service                  
+#                          Craig Rogers <Rogers at ISI.EDU>
+knet-cmp        157/udp     # KNET/VM Command/Message Protocol
+knet-cmp        157/tcp     # KNET/VM Command/Message Protocol
+#                          Gary S. Malkin <GMALKIN at XYLOGICS.COM>
+pcmail-srv      158/udp     # PCMail Server                 
+pcmail-srv      158/tcp     # PCMail Server                 
+#                          Mark L. Lambert <markl at PTT.LCS.MIT.EDU>
+nss-routing     159/udp     # NSS-Routing                  
+nss-routing     159/tcp     # NSS-Routing                  
+#                          Yakov Rekhter <Yakov at IBM.COM>
+sgmp-traps      160/udp     # SGMP-TRAPS                
+sgmp-traps      160/tcp     # SGMP-TRAPS                
+#                          Marty Schoffstahl <schoff at NISC.NYSER.NET>
+snmp            161/udp     # SNMP
+snmp            161/tcp     # SNMP
+snmptrap        162/udp     # SNMPTRAP
+snmptrap        162/tcp     # SNMPTRAP
+#                          Marshall Rose <mrose at dbc.mtview.ca.us>
+cmip-man        163/udp     # CMIP/TCP Manager   
+cmip-man        163/tcp     # CMIP/TCP Manager   
+cmip-agent      164/udp     # CMIP/TCP Agent     
+cmip-agent      164/tcp     # CMIP/TCP Agent     
+#                          Amatzia Ben-Artzi <---none--->
+xns-courier     165/udp     # Xerox                          
+xns-courier     165/tcp     # Xerox                          
+#                          Susie Armstrong <Armstrong.wbst128 at XEROX.COM>
+s-net           166/udp     # Sirius Systems          
+s-net           166/tcp     # Sirius Systems          
+#                          Brian Lloyd <brian at lloyd.com>
+namp            167/udp     # NAMP                    
+namp            167/tcp     # NAMP                    
+#                          Marty Schoffstahl <schoff at NISC.NYSER.NET>
+rsvd            168/udp     # RSVD                              
+rsvd            168/tcp     # RSVD                              
+#                          Neil Todd <mcvax!ist.co.uk!neil at UUNET.UU.NET>
+send            169/udp     # SEND                              
+send            169/tcp     # SEND                              
+#                          William D. Wisner <wisner at HAYES.FAI.ALASKA.EDU>
+print-srv       170/udp     # Network PostScript              
+print-srv       170/tcp     # Network PostScript              
+#                          Brian Reid <reid at DECWRL.DEC.COM>
+multiplex       171/udp     # Network Innovations Multiplex
+multiplex       171/tcp     # Network Innovations Multiplex
+cl/1            172/udp     # Network Innovations CL/1     
+cl/1            172/tcp     # Network Innovations CL/1     
+#                          Kevin DeVault <<---none--->
+xyplex-mux      173/udp     # Xyplex                          
+xyplex-mux      173/tcp     # Xyplex                          
+#                          Bob Stewart <STEWART at XYPLEX.COM>
+mailq           174/udp     # MAILQ                               
+mailq           174/tcp     # MAILQ                               
+#                          Rayan Zachariassen <rayan at AI.TORONTO.EDU>
+vmnet           175/udp     # VMNET  
+vmnet           175/tcp     # VMNET                                
+#                          Christopher Tengi <tengi at Princeton.EDU>
+genrad-mux      176/udp     # GENRAD-MUX                      
+genrad-mux      176/tcp     # GENRAD-MUX                      
+#                          Ron Thornton <thornton at qm7501.genrad.com>
+xdmcp           177/udp     # X Display Manager Control Protocol  
+xdmcp           177/tcp     # X Display Manager Control Protocol  
+#                          Robert W. Scheifler <RWS at XX.LCS.MIT.EDU>
+nextstep        178/udp     # NextStep Window Server     
+nextstep        178/tcp     # NextStep Window Server     
+#                          Leo Hourvitz <leo at NEXT.COM>
+bgp             179/udp     # Border Gateway Protocol             
+bgp             179/tcp     # Border Gateway Protocol             
+#                          Kirk Lougheed <LOUGHEED at MATHOM.CISCO.COM>
+ris             180/udp     # Intergraph                         
+ris             180/tcp     # Intergraph                         
+#                          Dave Buehmann <ingr!daveb at UUNET.UU.NET>
+unify           181/udp     # Unify                  
+unify           181/tcp     # Unify                  
+#                          Mark Ainsley <ianaportmaster at unify.com>
+audit           182/udp     # Unisys Audit SITP                  
+audit           182/tcp     # Unisys Audit SITP                  
+#                          Gil Greenbaum <gcole at nisd.cam.unisys.com>
+ocbinder        183/udp     # OCBinder                     
+ocbinder        183/tcp     # OCBinder                     
+ocserver        184/udp     # OCServer                     
+ocserver        184/tcp     # OCServer                     
+#                          Jerrilynn Okamura <--none--->
+remote-kis      185/udp     # Remote-KIS                        
+remote-kis      185/tcp     # Remote-KIS                        
+kis             186/udp     # KIS Protocol                      
+kis             186/tcp     # KIS Protocol                      
+#                          Ralph Droms <rdroms at NRI.RESTON.VA.US>
+aci             187/udp     # Application Communication Interface
+aci             187/tcp     # Application Communication Interface
+#                          Rick Carlos <rick.ticipa.csc.ti.com>
+mumps           188/udp     # Plus Five's MUMPS            
+mumps           188/tcp     # Plus Five's MUMPS            
+#                          Hokey Stenn <hokey at PLUS5.COM>
+qft             189/udp     # Queued File Transport        
+qft             189/tcp     # Queued File Transport        
+#                          Wayne Schroeder <schroeder at SDS.SDSC.EDU>
+gacp            190/udp     # Gateway Access Control Protocol
+gacp            190/tcp     # Gateway Access Control Protocol
+#                          C. Philip Wood <cpw at LANL.GOV>
+prospero        191/udp     # Prospero Directory Service      
+prospero        191/tcp     # Prospero Directory Service      
+#                          B. Clifford Neuman <bcn at isi.edu>
+osu-nms         192/udp     # OSU Network Monitoring System       
+osu-nms         192/tcp     # OSU Network Monitoring System       
+#                          Doug Karl <KARL-D at OSU-20.IRCC.OHIO-STATE.EDU>
+srmp            193/udp     # Spider Remote Monitoring Protocol 
+srmp            193/tcp     # Spider Remote Monitoring Protocol 
+#                          Ted J. Socolofsky <Teds at SPIDER.CO.UK>
+irc             194/udp     # Internet Relay Chat Protocol        
+irc             194/tcp     # Internet Relay Chat Protocol        
+#                          Jarkko Oikarinen <jto at TOLSUN.OULU.FI>
+dn6-nlm-aud     195/udp     # DNSIX Network Level Module Audit    
+dn6-nlm-aud     195/tcp     # DNSIX Network Level Module Audit    
+dn6-smm-red     196/udp     # DNSIX Session Mgt Module Audit Redir
+dn6-smm-red     196/tcp     # DNSIX Session Mgt Module Audit Redir
+#                          Lawrence Lebahn <DIA3 at PAXRV-NES.NAVY.MIL>
+dls             197/udp     # Directory Location Service        
+dls             197/tcp     # Directory Location Service        
+dls-mon         198/udp     # Directory Location Service Monitor
+dls-mon         198/tcp     # Directory Location Service Monitor
+#                          Scott Bellew <smb at cs.purdue.edu>
+smux            199/udp     # SMUX
+smux            199/tcp     # SMUX
+#                          Marshall Rose <mrose at dbc.mtview.ca.us>
+src             200/udp     # IBM System Resource Controller
+src             200/tcp     # IBM System Resource Controller
+#                          Gerald McBrearty <---none--->
+at-rtmp         201/udp     # AppleTalk Routing Maintenance       
+at-rtmp         201/tcp     # AppleTalk Routing Maintenance       
+at-nbp          202/udp     # AppleTalk Name Binding              
+at-nbp          202/tcp     # AppleTalk Name Binding              
+at-3            203/udp     # AppleTalk Unused                    
+at-3            203/tcp     # AppleTalk Unused                    
+at-echo         204/udp     # AppleTalk Echo                      
+at-echo         204/tcp     # AppleTalk Echo                      
+at-5            205/udp     # AppleTalk Unused                    
+at-5            205/tcp     # AppleTalk Unused                    
+at-zis          206/udp     # AppleTalk Zone Information          
+at-zis          206/tcp     # AppleTalk Zone Information          
+at-7            207/udp     # AppleTalk Unused                    
+at-7            207/tcp     # AppleTalk Unused                    
+at-8            208/udp     # AppleTalk Unused                    
+at-8            208/tcp     # AppleTalk Unused                    
+#                          Rob Chandhok <chandhok at gnome.cs.cmu.edu>
+qmtp            209/udp     # The Quick Mail Transfer Protocol
+qmtp            209/tcp     # The Quick Mail Transfer Protocol
+#                          Dan Bernstein <djb at silverton.berkeley.edu>
+z39.50          210/udp     # ANSI Z39.50
+z39.50          210/tcp     # ANSI Z39.50
+#                          Mark H. Needleman <markn at sirsi.com> 
+914c/g          211/udp     # Texas Instruments 914C/G Terminal
+914c/g          211/tcp     # Texas Instruments 914C/G Terminal
+#                          Bill Harrell <---none--->
+anet            212/udp     # ATEXSSTR   
+anet            212/tcp     # ATEXSSTR   
+#                          Jim Taylor <taylor at heart.epps.kodak.com>
+ipx             213/udp     # IPX                                
+ipx             213/tcp     # IPX         	                      
+#                          Don Provan <donp at xlnvax.novell.com>
+vmpwscs         214/udp     # VM PWSCS                         
+vmpwscs         214/tcp     # VM PWSCS                         
+#                          Dan Shia <dset!shia at uunet.UU.NET>
+softpc          215/udp     # Insignia Solutions
+softpc          215/tcp     # Insignia Solutions
+#                          Martyn Thomas <---none--->
+CAIlic          216/udp     # Computer Associates Int'l License Server
+CAIlic          216/tcp     # Computer Associates Int'l License Server
+#                          Chuck Spitz <spich04 at cai.com>
+dbase           217/udp     # dBASE Unix
+dbase           217/tcp     # dBASE Unix
+#                          Don Gibson
+#            <sequent!aero!twinsun!ashtate.A-T.COM!dong at uunet.UU.NET> 
+mpp             218/udp     # Netix Message Posting Protocol
+mpp             218/tcp     # Netix Message Posting Protocol
+#                          Shannon Yeh <yeh at netix.com>
+uarps           219/udp     # Unisys ARPs               
+uarps           219/tcp     # Unisys ARPs               
+#                          Ashok Marwaha <---none--->
+imap3           220/udp     # Interactive Mail Access Protocol v3
+imap3           220/tcp     # Interactive Mail Access Protocol v3
+#                          James Rice <RICE at SUMEX-AIM.STANFORD.EDU>
+fln-spx         221/udp     # Berkeley rlogind with SPX auth   
+fln-spx         221/tcp     # Berkeley rlogind with SPX auth   
+rsh-spx         222/udp     # Berkeley rshd with SPX auth      
+rsh-spx         222/tcp     # Berkeley rshd with SPX auth      
+cdc             223/udp     # Certificate Distribution Center  
+cdc             223/tcp     # Certificate Distribution Center  
+#               Kannan Alagappan <kannan at sejour.enet.dec.com>
+########### Possible Conflict of Port 222 with "Masqdialer"##############
+### Contact for Masqdialer is Charles Wright <cpwright at villagenet.com>###
+masqdialer	224/udp     # masqdialer
+masqdialer	224/tcp     # masqdialer
+#			   Charles Wright <cpwright at villagenet.com>
+#               225-241    Reserved
+#                          Jon Postel <postel at isi.edu>
+direct          242/udp     # Direct
+direct          242/tcp     # Direct
+#                          Herb Sutter <HerbS at cntc.com>
+sur-meas        243/udp     # Survey Measurement          
+sur-meas        243/tcp     # Survey Measurement          
+#                          Dave Clark <ddc at LCS.MIT.EDU>
+inbusiness      244/udp     # inbusiness
+inbusiness      244/tcp     # inbusiness
+#			   Derrick Hisatake <derrick.i.hisatake at intel.com>
+link            245/udp     # LINK
+link            245/tcp     # LINK
+dsp3270         246/udp     # Display Systems Protocol        
+dsp3270         246/tcp     # Display Systems Protocol        
+#                          Weldon J. Showalter <Gamma at MINTAKA.DCA.MIL>
+subntbcst_tftp  247/udp     # SUBNTBCST_TFTP
+subntbcst_tftp  247/tcp     # SUBNTBCST_TFTP
+#			   John Fake <fake at us.ibm.com>
+bhfhs		248/udp     # bhfhs
+bhfhs		248/tcp     # bhfhs
+#			   John Kelly <johnk at bellhow.com>
+#               249-255    Reserved
+#                          Jon Postel <postel at isi.edu>
+rap             256/udp     # RAP
+rap             256/tcp     # RAP
+#                          J.S. Greenfield <greeny at raleigh.ibm.com>
+set             257/udp     # Secure Electronic Transaction
+set             257/tcp     # Secure Electronic Transaction
+#                          Donald Eastlake <dee3 at torque.pothole.com>
+yak-chat        258/udp     # Yak Winsock Personal Chat
+yak-chat        258/tcp     # Yak Winsock Personal Chat
+#                          Brian Bandy <bbandy at swbell.net>
+esro-gen        259/udp     # Efficient Short Remote Operations
+esro-gen        259/tcp     # Efficient Short Remote Operations
+#                          Mohsen Banan <mohsen at rostam.neda.com>
+openport        260/udp     # Openport
+openport        260/tcp     # Openport
+#                          John Marland <jmarland at dean.openport.com>
+nsiiops		261/udp     # IIOP Name Service over TLS/SSL
+nsiiops 	261/tcp     # IIOP Name Service over TLS/SSL
+#                          Jeff Stewart <jstewart at netscape.com>
+arcisdms	262/udp	    # Arcisdms
+arcisdms	262/tcp     # Arcisdms
+#			   Russell Crook (rmc at sni.ca>
+hdap		263/udp     # HDAP
+hdap		263/tcp     # HDAP
+#			   Troy Gau <troy at zyxel.com>
+bgmp		264/udp     # BGMP
+bgmp		264/tcp     # BGMP
+#			   Dave Thaler <thalerd at eecs.umich.edu>
+x-bone-ctl	265/udp     # X-Bone CTL
+x-bone-ctl	265/tcp     # X-Bone CTL
+#			   Joe Touch <touch at isi.edu>
+sst             266/udp     # SCSI on ST
+sst             266/tcp     # SCSI on ST
+#                          Donald D. Woelz <don at genroco.com>
+td-service      267/udp     # Tobit David Service Layer
+td-service      267/tcp     # Tobit David Service Layer
+td-replica      268/udp     # Tobit David Replica
+td-replica      268/tcp     # Tobit David Replica
+#                          Franz-Josef Leuders <development at tobit.com>
+#               269-279    Unassigned
+http-mgmt       280/udp     # http-mgmt
+http-mgmt       280/tcp     # http-mgmt
+#                          Adrian Pell
+#                          <PELL_ADRIAN/HP-UnitedKingdom_om6 at hplb.hpl.hp.com>
+personal-link	281/udp     # Personal Link
+personal-link   281/tcp	    # Personal Link
+#			   Dan Cummings <doc at cnr.com>
+cableport-ax	282/udp     # Cable Port A/X
+cableport-ax	282/tcp     # Cable Port A/X
+#			   Craig Langfahl <Craig_J_Langfahl at ccm.ch.intel.com>
+rescap		283/udp     # rescap
+rescap		283/tcp     # rescap
+#			   Paul Hoffman <phoffman at imc.org>
+corerjd		284/udp     # corerjd
+corerjd		284/tcp     # corerjd
+#			   Chris Thornhill <cjt at corenetworks.com>
+#               285        Unassigned  
+fxp-1           286/udp     # FXP-1
+fxp-1           286/tcp     # FXP-1
+#                          James Darnall <jim at cennoid.com>   
+k-block         287/udp     # K-BLOCK
+k-block         287/tcp     # K-BLOCK
+#                          Simon P Jackson <jacko at kring.co.uk>    
+#               288-307    Unassigned
+novastorbakcup	308/udp     # Novastor Backup
+novastorbakcup	308/tcp     # Novastor Backup
+#			   Brian Dickman <brian at novastor.com>
+entrusttime     309/udp     # EntrustTime    
+entrusttime     309/tcp     # EntrustTime    
+#                          Peter Whittaker <pww at entrust.com>
+bhmds 		310/udp     # bhmds
+bhmds		310/tcp     # bhmds
+#			   John Kelly <johnk at bellhow.com>
+asip-webadmin	311/udp     # AppleShare IP WebAdmin
+asip-webadmin	311/tcp     # AppleShare IP WebAdmin
+#			   Ann Huang <annhuang at apple.com>
+vslmp		312/udp     # VSLMP
+vslmp		312/tcp     # VSLMP
+#			   Gerben Wierda <Gerben_Wierda at RnA.nl>
+magenta-logic	313/udp	    # Magenta Logic
+magenta-logic	313/tcp     # Magenta Logic
+#			   Karl Rousseau <kr at netfusion.co.uk>
+opalis-robot	314/udp     # Opalis Robot
+opalis-robot	314/tcp     # Opalis Robot
+#			   Laurent Domenech, Opalis <ldomenech at opalis.com>
+dpsi		315/udp     # DPSI
+dpsi		315/tcp     # DPSI
+#			   Tony Scamurra <Tony at DesktopPaging.com>
+decauth		316/udp     # decAuth
+decauth		316/tcp     # decAuth
+#			   Michael Agishtein <misha at unx.dec.com>
+zannet		317/udp     # Zannet
+zannet		317/tcp     # Zannet
+#			   Zan Oliphant <zan at accessone.com>
+pkix-timestamp	318/udp     # PKIX TimeStamp
+pkix-timestamp	318/tcp     # PKIX TimeStamp
+#			   Robert Zuccherato <robert.zuccherato at entrust.com>
+ptp-event	319/udp     # PTP Event
+ptp-event	319/tcp     # PTP Event
+ptp-general	320/udp     # PTP General
+ptp-general	320/tcp     # PTP General
+#			   John Eidson <eidson at hpl.hp.com>
+pip		321/udp     # PIP
+pip		321/tcp     # PIP
+#			   Gordon Mohr <gojomo at usa.net>
+rtsps		322/udp     # RTSPS
+rtsps		322/tcp     # RTSPS
+#			   Anders Klemets <anderskl at microsoft.com>
+#               323-332    Unassigned
+texar		333/udp     # Texar Security Port
+texar		333/tcp     # Texar Security Port
+#			   Eugen Bacic <ebacic at texar.com>
+#		334-343    Unassigned
+pdap            344/udp     # Prospero Data Access Protocol
+pdap            344/tcp     # Prospero Data Access Protocol
+#                          B. Clifford Neuman <bcn at isi.edu>
+pawserv         345/udp     # Perf Analysis Workbench
+pawserv         345/tcp     # Perf Analysis Workbench
+zserv           346/udp     # Zebra server
+zserv           346/tcp     # Zebra server
+fatserv         347/udp     # Fatmen Server
+fatserv         347/tcp     # Fatmen Server
+csi-sgwp        348/udp     # Cabletron Management Protocol
+csi-sgwp        348/tcp     # Cabletron Management Protocol
+mftp            349/udp     # mftp
+mftp            349/tcp     # mftp
+#                          Dave Feinleib <davefe at microsoft.com>
+matip-type-a	350/udp     # MATIP Type A
+matip-type-a    350/tcp     # MATIP Type A
+matip-type-b    351/udp     # MATIP Type B
+matip-type-b    351/tcp     # MATIP Type B
+#			   Alain Robert <arobert at par.sita.int>
+# The following entry records an unassigned but widespread use
+bhoetty		351/udp     # bhoetty
+bhoetty		351/tcp	    # bhoetty (added 5/21/97)
+#			   John Kelly <johnk at bellhow.com>
+dtag-ste-sb	352/udp	    # DTAG
+dtag-ste-sb	352/tcp	    # DTAG (assigned long ago)
+#			   Ruediger Wald <wald at ez-darmstadt.telekom.de>
+# The following entry records an unassigned but widespread use
+bhoedap4	352/udp     # bhoedap4
+bhoedap4	352/tcp     # bhoedap4 (added 5/21/97)
+#			   John Kelly <johnk at bellhow.com>
+ndsauth		353/udp     # NDSAUTH
+ndsauth		353/tcp     # NDSAUTH
+#			   Jayakumar Ramalingam <jayakumar at novell.com>
+bh611		354/udp     # bh611
+bh611		354/tcp	    # bh611
+#			   John Kelly <johnk at bellhow.com>
+datex-asn	355/udp     # DATEX-ASN
+datex-asn	355/tcp	    # DATEX-ASN
+#			   Kenneth Vaughn <kvaughn at mail.viggen.com>
+cloanto-net-1	356/udp     # Cloanto Net 1
+cloanto-net-1	356/tcp     # Cloanto Net 1
+#			   Michael Battilana <mcb-iana at cloanto.com>
+bhevent		357/udp     # bhevent
+bhevent		357/tcp	    # bhevent
+#			   John Kelly <johnk at bellhow.com>
+shrinkwrap	358/udp     # Shrinkwrap
+shrinkwrap	358/tcp     # Shrinkwrap
+#			   Bill Simpson <wsimpson at greendragon.com>
+nsrmp      	359/udp     # Network Security Risk Management Protocol
+nsrmp	        359/tcp     # Network Security Risk Management Protocol
+#			   Eric Jacksch <jacksch at tenebris.ca>
+scoi2odialog	360/udp     # scoi2odialog
+scoi2odialog	360/tcp     # scoi2odialog
+#			   Keith Petley <keithp at sco.COM>
+semantix	361/udp     # Semantix
+semantix	361/tcp     # Semantix
+#		   	   Semantix <xsSupport at semantix.com>
+srssend		362/udp     # SRS Send
+srssend		362/tcp     # SRS Send
+#			   Curt Mayer <curt at emergent.com>
+rsvp_tunnel	363/udp     # RSVP Tunnel
+rsvp_tunnel	363/tcp     # RSVP Tunnel
+#			   Andreas Terzis <terzis at cs.ucla.edu>
+aurora-cmgr	364/udp     # Aurora CMGR
+aurora-cmgr	364/tcp     # Aurora CMGR
+#			   Philip Budne <budne at auroratech.com>
+dtk		365/udp     # DTK
+dtk		365/tcp     # DTK
+#			   Fred Cohen <fc at all.net>
+odmr		366/udp     # ODMR
+odmr		366/tcp     # ODMR
+#			   Randall Gellens <randy at qualcomm.com>
+mortgageware	367/udp     # MortgageWare
+mortgageware	367/tcp     # MortgageWare
+#			   Ole Hellevik <oleh at interlinq.com>
+qbikgdp		368/udp     # QbikGDP
+qbikgdp		368/tcp     # QbikGDP
+#			   Adrien de Croy <adrien at qbik.com>
+rpc2portmap	369/udp     # rpc2portmap
+rpc2portmap	369/tcp     # rpc2portmap 
+codaauth2	370/udp     # codaauth2
+codaauth2	370/tcp     # codaauth2
+#			   Robert Watson <robert at cyrus.watson.org>
+clearcase       371/udp     # Clearcase
+clearcase       371/tcp     # Clearcase
+#                          Dave LeBlang <leglang at atria.com>
+ulistproc       372/udp     # ListProcessor
+ulistproc       372/tcp     # ListProcessor
+#                          Anastasios Kotsikonas <tasos at cs.bu.edu>
+legent-1        373/udp     # Legent Corporation
+legent-1        373/tcp     # Legent Corporation
+legent-2        374/udp     # Legent Corporation
+legent-2        374/tcp     # Legent Corporation
+#                          Keith Boyce <---none--->
+hassle          375/udp     # Hassle
+hassle          375/tcp     # Hassle
+#                          Reinhard Doelz <doelz at comp.bioz.unibas.ch>
+nip             376/udp     # Amiga Envoy Network Inquiry Proto
+nip             376/tcp     # Amiga Envoy Network Inquiry Proto   
+#                          Heinz Wrobel <hwrobel at gmx.de>
+tnETOS          377/udp     # NEC Corporation
+tnETOS          377/tcp     # NEC Corporation
+dsETOS          378/udp     # NEC Corporation
+dsETOS          378/tcp     # NEC Corporation
+#                          Tomoo Fujita <tf at arc.bs1.fc.nec.co.jp>
+is99c           379/udp     # TIA/EIA/IS-99 modem client
+is99c           379/tcp     # TIA/EIA/IS-99 modem client
+is99s           380/udp     # TIA/EIA/IS-99 modem server
+is99s           380/tcp     # TIA/EIA/IS-99 modem server
+#                          Frank Quick <fquick at qualcomm.com>
+hp-collector    381/udp     # hp performance data collector
+hp-collector    381/tcp     # hp performance data collector
+hp-managed-node 382/udp     # hp performance data managed node
+hp-managed-node 382/tcp     # hp performance data managed node
+hp-alarm-mgr    383/udp     # hp performance data alarm manager
+hp-alarm-mgr    383/tcp     # hp performance data alarm manager
+#                          Frank Blakely <frankb at hpptc16.rose.hp.com>
+arns            384/udp     # A Remote Network Server System
+arns            384/tcp     # A Remote Network Server System
+#                          David Hornsby <djh at munnari.OZ.AU>
+ibm-app         385/udp     # IBM Application
+ibm-app         385/tcp     # IBM Application
+#                          Lisa Tomita <---none--->
+asa             386/udp     # ASA Message Router Object Def.
+asa             386/tcp     # ASA Message Router Object Def.
+#                          Steve Laitinen <laitinen at brutus.aa.ab.com>
+aurp            387/udp     # Appletalk Update-Based Routing Pro.
+aurp            387/tcp     # Appletalk Update-Based Routing Pro.
+#                          Chris Ranch <cranch at novell.com>
+unidata-ldm     388/udp     # Unidata LDM 
+unidata-ldm     388/tcp     # Unidata LDM  
+#                          Glenn Davis <support at unidata.ucar.edu>
+ldap            389/udp     # Lightweight Directory Access Protocol
+ldap            389/tcp     # Lightweight Directory Access Protocol
+#                          Tim Howes <Tim.Howes at terminator.cc.umich.edu>
+uis             390/udp     # UIS
+uis             390/tcp     # UIS
+#                          Ed Barron <---none---> 
+synotics-relay  391/udp     # SynOptics SNMP Relay Port
+synotics-relay  391/tcp     # SynOptics SNMP Relay Port
+synotics-broker 392/udp     # SynOptics Port Broker Port
+synotics-broker 392/tcp     # SynOptics Port Broker Port
+#                          Illan Raab <iraab at synoptics.com>
+meta5           393/udp     # Meta5
+meta5           393/tcp     # Meta5
+#                          Jim Kanzler <jim.kanzler at meta5.com>
+embl-ndt        394/udp     # EMBL Nucleic Data Transfer
+embl-ndt        394/tcp     # EMBL Nucleic Data Transfer
+#                          Peter Gad <peter at bmc.uu.se>
+netcp           395/udp     # NETscout Control Protocol
+netcp           395/tcp     # NETscout Control Protocol
+#                          Anil Singhal <---none--->
+netware-ip      396/udp     # Novell Netware over IP
+netware-ip      396/tcp     # Novell Netware over IP
+mptn            397/udp     # Multi Protocol Trans. Net.
+mptn            397/tcp     # Multi Protocol Trans. Net.
+#                          Soumitra Sarkar <sarkar at vnet.ibm.com>
+kryptolan       398/udp     # Kryptolan
+kryptolan       398/tcp     # Kryptolan
+#                          Peter de Laval <pdl at sectra.se>
+iso-tsap-c2     399/udp     # ISO Transport Class 2 Non-Control over UDP
+iso-tsap-c2     399/tcp     # ISO Transport Class 2 Non-Control over TCP
+#                          Yanick Pouffary <pouffary at taec.enet.dec.com>
+work-sol        400/udp     # Workstation Solutions
+work-sol        400/tcp     # Workstation Solutions
+#                          Jim Ward <jimw at worksta.com>
+ups             401/udp     # Uninterruptible Power Supply
+ups             401/tcp     # Uninterruptible Power Supply
+#                          Charles Bennett <chuck at benatong.com>
+genie           402/udp     # Genie Protocol
+genie           402/tcp     # Genie Protocol
+#                          Mark Hankin <---none--->
+decap           403/udp     # decap
+decap           403/tcp     # decap
+nced            404/udp     # nced
+nced            404/tcp     # nced
+ncld            405/udp     # ncld
+ncld            405/tcp     # ncld
+#                          Richard Jones <---none--->
+imsp            406/udp     # Interactive Mail Support Protocol
+imsp            406/tcp     # Interactive Mail Support Protocol
+#                          John Myers <jgm+ at cmu.edu>
+timbuktu        407/udp     # Timbuktu
+timbuktu        407/tcp     # Timbuktu
+#                          Marc Epard <marc at netopia.com>
+prm-sm          408/udp     # Prospero Resource Manager Sys. Man.
+prm-sm          408/tcp     # Prospero Resource Manager Sys. Man.
+prm-nm          409/udp     # Prospero Resource Manager Node Man.
+prm-nm          409/tcp     # Prospero Resource Manager Node Man.
+#                          B. Clifford Neuman <bcn at isi.edu>
+decladebug      410/udp     # DECLadebug Remote Debug Protocol
+decladebug      410/tcp     # DECLadebug Remote Debug Protocol
+#                          Anthony Berent <anthony.berent at reo.mts.dec.com>
+rmt             411/udp     # Remote MT Protocol
+rmt             411/tcp     # Remote MT Protocol
+#                          Peter Eriksson <pen at lysator.liu.se>
+synoptics-trap  412/udp     # Trap Convention Port
+synoptics-trap  412/tcp     # Trap Convention Port
+#                          Illan Raab <iraab at synoptics.com>
+smsp            413/udp     # Storage Management Services Protocol
+smsp            413/tcp     # Storage Management Services Protocol
+#                          Murthy Srinivas <murthy at novell.com>
+infoseek        414/udp     # InfoSeek
+infoseek        414/tcp     # InfoSeek
+#                          Steve Kirsch <stk at infoseek.com>
+bnet            415/udp     # BNet
+bnet            415/tcp     # BNet
+#                          Jim Mertz <JMertz+RV09 at rvdc.unisys.com>
+silverplatter   416/udp     # Silverplatter
+silverplatter   416/tcp     # Silverplatter
+#                          Peter Ciuffetti <petec at silverplatter.com>
+onmux           417/udp     # Onmux
+onmux           417/tcp     # Onmux
+#                          Stephen Hanna <hanna at world.std.com>
+hyper-g         418/udp     # Hyper-G
+hyper-g         418/tcp     # Hyper-G
+#                          Frank Kappe <fkappe at iicm.tu-graz.ac.at>
+ariel1          419/udp     # Ariel 1
+ariel1          419/tcp     # Ariel 1
+#                          Joel Karafin <jkarafin at infotrieve.com>
+smpte           420/udp     # SMPTE
+smpte           420/tcp     # SMPTE
+#                          Si Becker <71362.22 at CompuServe.COM>
+ariel2          421/udp     # Ariel 2
+ariel2          421/tcp     # Ariel 2
+ariel3          422/udp     # Ariel 3 
+ariel3          422/tcp     # Ariel 3
+#                          Joel Karafin <jkarafin at infotrieve.com>
+opc-job-start   423/udp     # IBM Operations Planning and Control Start
+opc-job-start   423/tcp     # IBM Operations Planning and Control Start
+opc-job-track   424/udp     # IBM Operations Planning and Control Track
+opc-job-track   424/tcp     # IBM Operations Planning and Control Track
+#                          Conny Larsson  <cocke at VNET.IBM.COM>
+icad-el         425/udp     # ICAD
+icad-el         425/tcp     # ICAD
+#		           Larry Stone	<lcs at icad.com>
+smartsdp        426/udp     # smartsdp
+smartsdp        426/tcp     # smartsdp
+#                          Alexander Dupuy <dupuy at smarts.com>
+svrloc          427/udp     # Server Location
+svrloc          427/tcp     # Server Location
+#                          <veizades at ftp.com>
+ocs_cmu         428/udp     # OCS_CMU
+ocs_cmu         428/tcp     # OCS_CMU
+ocs_amu         429/udp     # OCS_AMU
+ocs_amu         429/tcp     # OCS_AMU
+#                          Florence Wyman <wyman at peabody.plk.af.mil>
+utmpsd          430/udp     # UTMPSD
+utmpsd          430/tcp     # UTMPSD
+utmpcd          431/udp     # UTMPCD
+utmpcd          431/tcp     # UTMPCD
+iasd            432/udp     # IASD  
+iasd            432/tcp     # IASD  
+#                          Nir Baroz <nbaroz at encore.com>
+nnsp            433/udp     # NNSP
+nnsp            433/tcp     # NNSP
+#                          Rob Robertson <rob at gangrene.berkeley.edu>
+mobileip-agent  434/udp     # MobileIP-Agent
+mobileip-agent  434/tcp     # MobileIP-Agent
+mobilip-mn      435/udp     # MobilIP-MN
+mobilip-mn      435/tcp     # MobilIP-MN
+#                          Kannan Alagappan <kannan at sejour.lkg.dec.com>
+dna-cml         436/udp     # DNA-CML   
+dna-cml         436/tcp     # DNA-CML   
+#                          Dan Flowers <flowers at smaug.lkg.dec.com>
+comscm          437/udp     # comscm
+comscm          437/tcp     # comscm
+#                          Jim Teague <teague at zso.dec.com>
+dsfgw           438/udp     # dsfgw
+dsfgw           438/tcp     # dsfgw
+#                          Andy McKeen <mckeen at osf.org>
+dasp            439/udp     # dasp      tommy at inlab.m.eunet.de
+dasp            439/tcp     # dasp      Thomas Obermair
+#                          Thomas Obermair <tommy at inlab.m.eunet.de>
+sgcp            440/udp     # sgcp      
+sgcp            440/tcp     # sgcp      
+#                          Marshall Rose <mrose at dbc.mtview.ca.us>
+decvms-sysmgt   441/udp     # decvms-sysmgt
+decvms-sysmgt   441/tcp     # decvms-sysmgt
+#                          Lee Barton <barton at star.enet.dec.com>
+cvc_hostd       442/udp     # cvc_hostd
+cvc_hostd       442/tcp     # cvc_hostd
+#                          Bill Davidson <billd at equalizer.cray.com>
+https           443/udp     # http protocol over TLS/SSL
+https           443/tcp     # http protocol over TLS/SSL
+#                          Kipp E.B. Hickman <kipp at mcom.com>
+snpp            444/udp     # Simple Network Paging Protocol
+snpp            444/tcp     # Simple Network Paging Protocol
+#                          [RFC1568]
+microsoft-ds    445/udp     # Microsoft-DS
+microsoft-ds    445/tcp     # Microsoft-DS
+#                          Pradeep Bahl <pradeepb at microsoft.com>
+ddm-rdb         446/udp     # DDM-RDB
+ddm-rdb         446/tcp     # DDM-RDB
+ddm-dfm         447/udp     # DDM-RFM
+ddm-dfm         447/tcp     # DDM-RFM
+#                          Jan David Fisher <jdfisher at VNET.IBM.COM>
+ddm-ssl         448/udp     # DDM-SSL
+ddm-ssl         448/tcp     # DDM-SSL
+#			   Steve Ritland <srr at vnet.ibm.com>
+as-servermap    449/udp     # AS Server Mapper
+as-servermap    449/tcp     # AS Server Mapper
+#                          Barbara Foss <BGFOSS at rchvmv.vnet.ibm.com>
+tserver         450/udp     # Computer Supported Telecomunication Applications
+tserver         450/tcp     # Computer Supported Telecomunication Applications
+#                          Harvey S. Schultz <harvey at acm.org>
+sfs-smp-net     451/udp     # Cray Network Semaphore server
+sfs-smp-net     451/tcp     # Cray Network Semaphore server
+sfs-config	452/udp     # Cray SFS config server
+sfs-config	452/tcp     # Cray SFS config server
+#                          Walter Poxon <wdp at ironwood.cray.com>
+creativeserver  453/udp     # CreativeServer
+creativeserver  453/tcp     # CreativeServer
+contentserver   454/udp     # ContentServer
+contentserver   454/tcp     # ContentServer
+creativepartnr  455/udp     # CreativePartnr
+creativepartnr  455/tcp     # CreativePartnr
+#                          Jesus Ortiz <jesus_ortiz at emotion.com>
+macon-udp       456/udp     # macon-udp
+macon-tcp       456/tcp     # macon-tcp
+#                          Yoshinobu Inoue
+#                          <shin at hodaka.mfd.cs.fujitsu.co.jp>
+scohelp         457/udp     # scohelp
+scohelp         457/tcp     # scohelp
+#                          Faith Zack <faithz at sco.com>
+appleqtc        458/udp     # apple quick time
+appleqtc        458/tcp     # apple quick time
+#                          Murali Ranganathan 
+#                          <murali_ranganathan at quickmail.apple.com>
+ampr-rcmd       459/udp     # ampr-rcmd              
+ampr-rcmd       459/tcp     # ampr-rcmd              
+#                          Rob Janssen <rob at sys3.pe1chl.ampr.org>
+skronk          460/udp     # skronk
+skronk          460/tcp     # skronk
+#                          Henry Strickland <strick at yak.net>
+datasurfsrv     461/udp     # DataRampSrv
+datasurfsrv     461/tcp     # DataRampSrv
+datasurfsrvsec  462/udp     # DataRampSrvSec
+datasurfsrvsec  462/tcp     # DataRampSrvSec
+#                          Diane Downie <downie at jibe.MV.COM>
+alpes           463/udp     # alpes
+alpes           463/tcp     # alpes
+#                          Alain Durand <Alain.Durand at imag.fr>
+kpasswd         464/udp     # kpasswd
+kpasswd         464/tcp     # kpasswd
+#                          Theodore Ts'o <tytso at MIT.EDU>
+igmpv3lite      465/udp     # IGMP over UDP for SSM 
+urd             465/tcp     # URL Rendesvous Directory for SSM
+#                          Toerless Eckert <eckert at cisco.com>
+digital-vrc     466/udp     # digital-vrc
+digital-vrc     466/tcp     # digital-vrc
+#                          Peter Higginson <higginson at mail.dec.com>
+mylex-mapd      467/udp     # mylex-mapd
+mylex-mapd      467/tcp     # mylex-mapd
+#                          Gary Lewis <GaryL at hq.mylex.com>
+photuris        468/udp     # proturis
+photuris        468/tcp     # proturis
+#                          Bill Simpson <Bill.Simpson at um.cc.umich.edu>
+rcp             469/udp     # Radio Control Protocol
+rcp             469/tcp     # Radio Control Protocol
+#                          Jim Jennings +1-708-538-7241
+scx-proxy       470/udp     # scx-proxy
+scx-proxy       470/tcp     # scx-proxy
+#                          Scott Narveson <sjn at cray.com>
+mondex          471/udp     # Mondex
+mondex          471/tcp     # Mondex
+#                          Bill Reding <redingb at nwdt.natwest.co.uk>
+ljk-login       472/udp     # ljk-login
+ljk-login       472/tcp     # ljk-login
+#                          LJK Software, Cambridge, Massachusetts
+#                          <support at ljk.com>
+hybrid-pop      473/udp     # hybrid-pop
+hybrid-pop      473/tcp     # hybrid-pop
+#                          Rami Rubin <rami at hybrid.com>
+tn-tl-w2        474/udp     # tn-tl-w2
+tn-tl-w1        474/tcp     # tn-tl-w1
+#                          Ed Kress <eskress at thinknet.com>
+tcpnethaspsrv   475/udp     # tcpnethaspsrv
+tcpnethaspsrv   475/tcp     # tcpnethaspsrv
+#                          Charlie Hava <charlie at aladdin.co.il>
+tn-tl-fd1       476/udp     # tn-tl-fd1
+tn-tl-fd1       476/tcp     # tn-tl-fd1
+#                          Ed Kress <eskress at thinknet.com>
+ss7ns           477/udp     # ss7ns
+ss7ns           477/tcp     # ss7ns
+#                          Jean-Michel URSCH <ursch at taec.enet.dec.com>
+spsc            478/udp     # spsc
+spsc            478/tcp     # spsc
+#                          Mike Rieker <mikea at sp32.com>
+iafserver       479/udp     # iafserver
+iafserver       479/tcp     # iafserver
+iafdbase        480/udp     # iafdbase
+iafdbase        480/tcp     # iafdbase
+#                          ricky at solect.com <Rick Yazwinski>
+ph              481/udp     # Ph service
+ph              481/tcp     # Ph service
+#                          Roland Hedberg <Roland.Hedberg at umdac.umu.se>
+bgs-nsi         482/udp     # bgs-nsi
+bgs-nsi         482/tcp     # bgs-nsi
+#                          Jon Saperia <saperia at bgs.com>         
+ulpnet          483/udp     # ulpnet
+ulpnet          483/tcp     # ulpnet
+#                          Kevin Mooney <kevinm at bfs.unibol.com>
+integra-sme     484/udp     # Integra Software Management Environment
+integra-sme     484/tcp     # Integra Software Management Environment
+#                          Randall Dow <rand at randix.m.isr.de>
+powerburst      485/udp     # Air Soft Power Burst
+powerburst      485/tcp     # Air Soft Power Burst
+#                          <gary at airsoft.com>
+avian           486/udp     # avian
+avian           486/tcp     # avian
+#                          Robert Ullmann 
+#                          <Robert_Ullmann/CAM/Lotus.LOTUS at crd.lotus.com>
+saft            487/udp     # saft Simple Asynchronous File Transfer
+saft            487/tcp     # saft Simple Asynchronous File Transfer
+#                          Ulli Horlacher <framstag at rus.uni-stuttgart.de>
+gss-http        488/udp     # gss-http
+gss-http        488/tcp     # gss-http
+#                          Doug Rosenthal <rosenthl at krypton.einet.net>
+nest-protocol   489/udp     # nest-protocol
+nest-protocol   489/tcp     # nest-protocol
+#                          Gilles Gameiro <ggameiro at birdland.com>
+micom-pfs       490/udp     # micom-pfs
+micom-pfs       490/tcp     # micom-pfs
+#                          David Misunas <DMisunas at micom.com>
+go-login        491/udp     # go-login
+go-login        491/tcp     # go-login
+#                          Troy Morrison <troy at graphon.com>
+ticf-1          492/udp     # Transport Independent Convergence for FNA
+ticf-1          492/tcp     # Transport Independent Convergence for FNA
+ticf-2          493/udp     # Transport Independent Convergence for FNA
+ticf-2          493/tcp     # Transport Independent Convergence for FNA
+#                          Mamoru Ito <Ito at pcnet.ks.pfu.co.jp>
+pov-ray         494/udp     # POV-Ray
+pov-ray         494/tcp     # POV-Ray
+#                          POV-Team Co-ordinator 
+#                          <iana-port.remove-spamguard at povray.org>
+intecourier     495/udp     # intecourier
+intecourier     495/tcp     # intecourier
+#                          Steve Favor <sfavor at tigger.intecom.com>
+pim-rp-disc     496/udp     # PIM-RP-DISC
+pim-rp-disc     496/tcp     # PIM-RP-DISC
+#                          Dino Farinacci <dino at cisco.com>
+dantz           497/udp     # dantz
+dantz           497/tcp     # dantz
+#                          Richard Zulch <richard_zulch at dantz.com>
+siam            498/udp     # siam
+siam            498/tcp     # siam
+#                          Philippe Gilbert <pgilbert at cal.fr>
+iso-ill         499/udp     # ISO ILL Protocol
+iso-ill         499/tcp     # ISO ILL Protocol
+#                          Mark H. Needleman <markn at sirsi.com>
+isakmp          500/udp     # isakmp
+isakmp          500/tcp     # isakmp
+#                          Mark Schertler <mjs at tycho.ncsc.mil>
+stmf            501/udp     # STMF
+stmf            501/tcp     # STMF
+#                          Alan Ungar <aungar at farradyne.com>
+asa-appl-proto  502/udp     # asa-appl-proto
+asa-appl-proto  502/tcp     # asa-appl-proto
+#                          Dennis Dube <ddube at modicon.com>
+intrinsa        503/udp     # Intrinsa
+intrinsa        503/tcp     # Intrinsa
+#                          Robert Ford <robert at intrinsa.com>
+citadel         504/udp     # citadel
+citadel         504/tcp     # citadel
+#                          Art Cancro <ajc at uncnsrd.mt-kisco.ny.us>
+mailbox-lm      505/udp     # mailbox-lm
+mailbox-lm      505/tcp     # mailbox-lm
+#                          Beverly Moody <Beverly_Moody at stercomm.com>
+ohimsrv         506/udp     # ohimsrv
+ohimsrv         506/tcp     # ohimsrv
+#                          Scott Powell <spowell at openhorizon.com>
+crs             507/udp     # crs
+crs             507/tcp     # crs
+#                          Brad Wright <bradwr at microsoft.com>
+xvttp           508/udp     # xvttp
+xvttp           508/tcp     # xvttp
+#                          Keith J. Alphonso <alphonso at ncs-ssc.com>
+snare           509/udp     # snare
+snare           509/tcp     # snare
+#                          Dennis Batchelder <dennis at capres.com>
+fcp             510/udp     # FirstClass Protocol
+fcp             510/tcp     # FirstClass Protocol
+#                          Mike Marshburn <paul at softarc.com>
+passgo          511/udp     # PassGo
+passgo          511/tcp     # PassGo
+#                          John Rainford <jrainford at passgo.com>
+exec            512/tcp     # remote process execution;
+#                          authentication performed using
+#                          passwords and UNIX login names
+comsat          512/udp biff # 
+#                          of new mail received; currently
+#                          receives messages only from 
+#                          processes on the same machine
+login           513/tcp     # remote login a la telnet;
+#                          automatic authentication performed
+#                          based on priviledged port numbers
+#                          and distributed data bases which
+#                          identify "authentication domains"
+who             513/udp     # maintains data bases showing who's
+#                          logged in to machines on a local 
+#                          net and the load average of the
+#                          machine
+shell           514/tcp     # cmd
+#                          like exec, but automatic authentication 
+#                          is performed as for login server
+syslog          514/udp # 
+printer         515/udp     # spooler
+printer         515/tcp     # spooler
+videotex        516/udp     # videotex
+videotex        516/tcp     # videotex
+#                          Daniel Mavrakis <system at venus.mctel.fr>
+talk            517/tcp     # like tenex link, but across
+#                          machine - unfortunately, doesn't
+#                          use link protocol (this is actually
+#                          just a rendezvous port from which a
+#                          tcp connection is established)
+talk            517/udp     # like tenex link, but across
+#                          machine - unfortunately, doesn't
+#                          use link protocol (this is actually
+#                          just a rendezvous port from which a
+#                          tcp connection is established)
+ntalk           518/udp # 
+ntalk           518/tcp # 
+utime           519/udp     # unixtime
+utime           519/tcp     # unixtime
+router          520/udp     # local routing process (on site);
+efs             520/tcp     # extended file name server
+#                          uses variant of Xerox NS routing
+#                          information protocol - RIP
+ripng           521/udp     # ripng
+ripng           521/tcp     # ripng
+#                          Robert E. Minnear <minnear at ipsilon.com>
+ulp             522/udp     # ULP    
+ulp             522/tcp     # ULP    
+#                          Max Morris <maxm at MICROSOFT.com>
+ibm-db2         523/udp     # IBM-DB2
+ibm-db2         523/tcp     # IBM-DB2
+#                          Peter Pau <pau at VNET.IBM.COM>
+ncp             524/udp     # NCP    
+ncp             524/tcp     # NCP
+#                          Don Provan <donp at sjf.novell.com>
+timed           525/udp     # timeserver
+timed  	        525/tcp     # timeserver
+tempo	        526/udp     # newdate
+tempo	        526/tcp     # newdate
+#                          Unknown
+stx             527/udp     # Stock IXChange
+stx             527/tcp     # Stock IXChange
+custix          528/udp     # Customer IXChange
+custix          528/tcp     # Customer IXChange
+#                          Ferdi Ladeira <ferdi.ladeira at ixchange.com> 
+irc-serv        529/udp     # IRC-SERV
+irc-serv        529/tcp     # IRC-SERV
+#                          Brian Tackett <cym at acrux.net>
+courier         530/udp     # rpc
+courier         530/tcp     # rpc
+conference      531/udp     # chat
+conference      531/tcp     # chat
+netnews         532/udp     # readnews
+netnews         532/tcp     # readnews
+netwall	        533/udp     # for emergency broadcasts
+netwall	        533/tcp     # for emergency broadcasts
+mm-admin        534/udp     # MegaMedia Admin
+mm-admin        534/tcp     # MegaMedia Admin
+#                          Andreas Heidemann <a.heidemann at ais-gmbh.de>
+iiop            535/udp     # iiop
+iiop            535/tcp     # iiop
+#                          Jeff M.Michaud <michaud at zk3.dec.com>
+opalis-rdv      536/udp     # opalis-rdv
+opalis-rdv      536/tcp     # opalis-rdv
+#                          Laurent Domenech <ldomenech at opalis.com>
+nmsp            537/udp     # Networked Media Streaming Protocol
+nmsp            537/tcp     # Networked Media Streaming Protocol
+#                          Paul Santinelli Jr. <psantinelli at narrative.com>
+gdomap          538/udp     # gdomap
+gdomap          538/tcp     # gdomap
+#                          Richard Frith-Macdonald <richard at brainstorm.co.uk>
+apertus-ldp     539/udp     # Apertus Technologies Load Determination
+apertus-ldp     539/tcp     # Apertus Technologies Load Determination
+uucp	        540/udp     # uucpd		
+uucp	        540/tcp     # uucpd		
+uucp-rlogin     541/udp     # uucp-rlogin
+uucp-rlogin     541/tcp     # uucp-rlogin  
+#                          Stuart Lynne <sl at wimsey.com>
+commerce        542/udp     # commerce
+commerce        542/tcp     # commerce
+#                          Randy Epstein <repstein at host.net>
+klogin          543/udp # 
+klogin          543/tcp # 
+kshell 	        544/udp     # krcmd
+kshell 	        544/tcp     # krcmd
+appleqtcsrvr    545/udp     # appleqtcsrvr
+appleqtcsrvr    545/tcp     # appleqtcsrvr
+#                          Murali Ranganathan 
+#                          <Murali_Ranganathan at quickmail.apple.com>
+dhcpv6-client   546/udp     # DHCPv6 Client
+dhcpv6-client   546/tcp     # DHCPv6 Client
+dhcpv6-server   547/udp     # DHCPv6 Server
+dhcpv6-server   547/tcp     # DHCPv6 Server
+#                          Jim Bound <bound at zk3.dec.com>
+afpovertcp      548/udp     # AFP over TCP
+afpovertcp      548/tcp     # AFP over TCP
+#                          Leland Wallace <randall at apple.com>
+idfp            549/udp     # IDFP
+idfp            549/tcp     # IDFP
+#                          Ramana Kovi <ramana at kovi.com>
+new-rwho        550/udp     # new-who
+new-rwho        550/tcp     # new-who
+cybercash       551/udp     # cybercash
+cybercash       551/tcp     # cybercash
+#                          Donald E. Eastlake 3rd <dee at cybercash.com>
+devshr-nts      552/udp     # DeviceShare
+devshr-nts      552/tcp     # DeviceShare
+#                          Benjamin Rosenberg <brosenberg at advsyscon.com>
+pirp            553/udp     # pirp
+pirp            553/tcp     # pirp
+#                          D. J. Bernstein <djb at silverton.berkeley.edu>
+rtsp            554/udp     # Real Time Stream Control Protocol
+rtsp            554/tcp     # Real Time Stream Control Protocol
+#                          Rob Lanphier <robla at prognet.com>
+dsf             555/udp # 
+dsf             555/tcp # 
+remotefs        556/udp     # rfs server
+remotefs        556/tcp     # rfs server
+openvms-sysipc  557/udp     # openvms-sysipc
+openvms-sysipc  557/tcp     # openvms-sysipc
+#                          Alan Potter <potter at movies.enet.dec.com>
+sdnskmp         558/udp     # SDNSKMP
+sdnskmp         558/tcp     # SDNSKMP
+teedtap         559/udp     # TEEDTAP
+teedtap         559/tcp     # TEEDTAP
+#                          Mort Hoffman <hoffman at mail.ndhm.gtegsc.com>
+rmonitor        560/udp     # rmonitord
+rmonitor        560/tcp     # rmonitord
+monitor         561/udp # 
+monitor         561/tcp # 
+chshell         562/udp     # chcmd
+chshell         562/tcp     # chcmd
+nntps           563/udp     # nntp protocol over TLS/SSL (was snntp)
+nntps           563/tcp     # nntp protocol over TLS/SSL (was snntp)
+#                          Kipp E.B. Hickman <kipp at netscape.com>
+9pfs            564/udp     # plan 9 file service
+9pfs            564/tcp     # plan 9 file service
+whoami          565/udp     # whoami
+whoami          565/tcp     # whoami
+streettalk      566/udp     # streettalk
+streettalk      566/tcp     # streettalk
+banyan-rpc      567/udp     # banyan-rpc
+banyan-rpc      567/tcp     # banyan-rpc
+#                          Tom Lemaire <toml at banyan.com>
+ms-shuttle      568/udp     # microsoft shuttle
+ms-shuttle      568/tcp     # microsoft shuttle
+#                          Rudolph Balaz <rudolphb at microsoft.com>
+ms-rome         569/udp     # microsoft rome
+ms-rome         569/tcp     # microsoft rome
+#                          Rudolph Balaz <rudolphb at microsoft.com>
+meter           570/udp     # demon
+meter           570/tcp     # demon
+meter	        571/udp     # udemon
+meter	        571/tcp     # udemon
+sonar           572/udp     # sonar
+sonar           572/tcp     # sonar
+#                          Keith Moore <moore at cs.utk.edu>
+banyan-vip      573/udp     # banyan-vip
+banyan-vip      573/tcp     # banyan-vip
+#                          Denis Leclerc <DLeclerc at banyan.com>
+ftp-agent       574/udp     # FTP Software Agent System
+ftp-agent       574/tcp     # FTP Software Agent System
+#                          Michael S. Greenberg <arnoff at ftp.com>
+vemmi           575/udp     # VEMMI
+vemmi           575/tcp     # VEMMI
+#                          Daniel Mavrakis <mavrakis at mctel.fr>
+ipcd            576/udp     # ipcd
+ipcd            576/tcp     # ipcd
+vnas            577/udp     # vnas
+vnas            577/tcp     # vnas
+ipdd            578/udp     # ipdd
+ipdd            578/tcp     # ipdd
+#                          Jay Farhat <jfarhat at ipass.com>
+decbsrv		579/udp     # decbsrv
+decbsrv		579/tcp     # decbsrv
+#			   Rudi Martin <movies::martin"@movies.enet.dec.com>
+sntp-heartbeat  580/udp	    # SNTP HEARTBEAT
+sntp-heartbeat  580/tcp     # SNTP HEARTBEAT
+#			   Louis Mamakos <louie at uu.net>
+bdp		581/udp	    # Bundle Discovery Protocol
+bdp		581/tcp     # Bundle Discovery Protocol
+#			   Gary Malkin <gmalkin at xylogics.com>
+scc-security    582/udp	    # SCC Security
+scc-security    582/tcp     # SCC Security
+#			   Prashant Dholakia <prashant at semaphorecom.com>
+philips-vc	583/udp     # Philips Video-Conferencing
+philips-vc	583/tcp     # Philips Video-Conferencing
+#			   Janna Chang <janna at pmc.philips.com>
+keyserver	584/udp	    # Key Server
+keyserver	584/tcp     # Key Server
+#			   Gary Howland <gary at systemics.com>
+imap4-ssl	585/udp     # IMAP4+SSL (use 993 instead)
+imap4-ssl	585/tcp     # IMAP4+SSL (use 993 instead)
+#			   Terry Gray <gray at cac.washington.edu>
+#               Use of 585 is not recommended, use 993 instead
+password-chg	586/udp	    # Password Change
+password-chg 	586/tcp     # Password Change
+submission	587/udp     # Submission
+submission	587/tcp     # Submission
+#			   Randy Gellens <randy at qualcomm.com>
+cal		588/udp     # CAL
+cal		588/tcp     # CAL
+#			   Myron Hattig <Myron_Hattig at ccm.jf.intel.com>
+eyelink		589/udp	    # EyeLink
+eyelink		589/tcp     # EyeLink
+#			   Dave Stampe <dstampe at psych.toronto.edu>
+tns-cml		590/udp     # TNS CML
+tns-cml		590/tcp     # TNS CML
+#			   Jerome Albin <albin at taec.enet.dec.com>
+http-alt	591/udp     # FileMaker, Inc. - HTTP Alternate (see Port 80)
+http-alt	591/tcp     # FileMaker, Inc. - HTTP Alternate (see Port 80)
+#			   Clay Maeckel <clay_maeckel at filemaker.com>
+eudora-set	592/udp	    # Eudora Set
+eudora-set	592/tcp     # Eudora Set
+#			   Randall Gellens <randy at qualcomm.com>
+http-rpc-epmap  593/udp     # HTTP RPC Ep Map
+http-rpc-epmap  593/tcp     # HTTP RPC Ep Map
+#			   Edward Reus <edwardr at microsoft.com>
+tpip		594/udp     # TPIP
+tpip		594/tcp     # TPIP
+#			   Brad Spear <spear at platinum.com>
+cab-protocol	595/udp     # CAB Protocol
+cab-protocol	595/tcp     # CAB Protocol
+#			   Winston Hetherington
+smsd            596/udp     # SMSD
+smsd            596/tcp     # SMSD
+#                          Wayne Barlow <web at unx.dec.com>
+ptcnameservice	597/udp     # PTC Name Service
+ptcnameservice	597/tcp     # PTC Name Service
+#                          Yuri Machkasov <yuri at ptc.com>
+sco-websrvrmg3	598/udp     # SCO Web Server Manager 3
+sco-websrvrmg3	598/tcp     # SCO Web Server Manager 3
+#                          Simon Baldwin <simonb at sco.com>
+acp             599/udp     # Aeolon Core Protocol
+acp             599/tcp     # Aeolon Core Protocol
+#                          Michael Alyn Miller <malyn at aeolon.com>
+ipcserver       600/udp     # Sun IPC server
+ipcserver       600/tcp     # Sun IPC server
+#                          Bill Schiefelbein <schief at aspen.cray.com>
+syslog-conn     601/udp     # Reliable Syslog Service
+syslog-conn     601/tcp     # Reliable Syslog Service
+#                          RFC 3195
+xmlrpc-beep     602/udp     # XML-RPC over BEEP
+xmlrpc-beep     602/tcp     # XML-RPC over BEEP
+#                          RFC3529 <ftp://ftp.isi.edu/in-notes/rfc3529.txt> March 2003
+idxp            603/udp     # IDXP
+idxp            603/tcp     # IDXP
+#                          RFC-ietf-idwg-beep-idxp-07.txt
+tunnel          604/udp     # TUNNEL
+tunnel          604/tcp     # TUNNEL
+#                          RFC-ietf-idwg-beep-tunnel-05.txt
+soap-beep       605/udp     # SOAP over BEEP
+soap-beep       605/tcp     # SOAP over BEEP
+#                          RFC3288 <ftp://ftp.isi.edu/in-notes/rfc3288.txt> April 2002
+urm             606/udp     # Cray Unified Resource Manager
+urm             606/tcp     # Cray Unified Resource Manager
+nqs             607/udp     # nqs
+nqs             607/tcp     # nqs
+#                          Bill Schiefelbein <schief at aspen.cray.com>
+sift-uft        608/udp     # Sender-Initiated/Unsolicited File Transfer
+sift-uft        608/tcp     # Sender-Initiated/Unsolicited File Transfer 
+#                          Rick Troth <troth at rice.edu>
+npmp-trap       609/udp     # npmp-trap
+npmp-trap       609/tcp     # npmp-trap
+npmp-local      610/udp     # npmp-local
+npmp-local      610/tcp     # npmp-local
+npmp-gui        611/udp     # npmp-gui  
+npmp-gui        611/tcp     # npmp-gui  
+#                          John Barnes <jbarnes at crl.com>
+hmmp-ind	612/udp	    # HMMP Indication
+hmmp-ind	612/tcp     # HMMP Indication
+hmmp-op		613/udp	    # HMMP Operation
+hmmp-op		613/tcp     # HMMP Operation
+#			   Andrew Sinclair <andrsin at microsoft.com>
+sshell   	614/udp	    # SSLshell
+sshell		614/tcp     # SSLshell
+#			   Simon J. Gerraty <sjg at quick.com.au>
+sco-inetmgr	615/udp     # Internet Configuration Manager
+sco-inetmgr	615/tcp	    # Internet Configuration Manager
+sco-sysmgr	616/udp     # SCO System Administration Server
+sco-sysmgr	616/tcp     # SCO System Administration Server
+sco-dtmgr	617/udp     # SCO Desktop Administration Server
+sco-dtmgr	617/tcp     # SCO Desktop Administration Server
+#			   Christopher Durham <chrisdu at sco.com>
+dei-icda	618/udp     # DEI-ICDA
+dei-icda	618/tcp     # DEI-ICDA
+#			   David Turner <digital at Quetico.tbaytel.net>
+compaq-evm	619/udp     # Compaq EVM
+compaq-evm	619/tcp     # Compaq EVM
+#			   Jem Treadwell <Jem.Treadwell at compaq.com>
+sco-websrvrmgr  620/udp     # SCO WebServer Manager
+sco-websrvrmgr  620/tcp     # SCO WebServer Manager
+#			   Christopher Durham <chrisdu at sco.com>
+escp-ip		621/udp     # ESCP
+escp-ip		621/tcp     # ESCP
+#			   Lai Zit Seng <lzs at pobox.com>
+collaborator	622/udp	    # Collaborator
+collaborator	622/tcp     # Collaborator
+#			   Johnson Davis <johnsond at opteamasoft.com>
+asf-rmcp        623/udp     # ASF Remote Management and Control Protocol
+asf-rmcp        623/tcp     # ASF Remote Management and Control Protocol
+#                          Carl First <Carl.L.First at intel.com>
+cryptoadmin	624/udp     # Crypto Admin
+cryptoadmin	624/tcp     # Crypto Admin
+#			   Tony Walker <tony at cryptocard.com>
+dec_dlm		625/udp     # DEC DLM
+dec_dlm		625/tcp     # DEC DLM
+#			   Rudi Martin <Rudi.Martin at edo.mts.dec.com>
+asia		626/udp     # ASIA
+asia		626/tcp     # ASIA
+#			   Michael Dasenbrock <dasenbro at apple.com>
+passgo-tivoli	627/udp     # PassGo Tivoli
+passgo-tivoli	627/tcp     # PassGo Tivoli
+#			   Chris Hall <chall at passgo.com>
+qmqp		628/udp     # QMQP
+qmqp		628/tcp     # QMQP
+#			   Dan Bernstein <djb at cr.yp.to>
+3com-amp3	629/udp     # 3Com AMP3
+3com-amp3	629/tcp     # 3Com AMP3
+#			   Prakash Banthia <prakash_banthia at 3com.com>
+rda		630/udp     # RDA
+rda		630/tcp     # RDA
+#			   John Hadjioannou <john at minster.co.uk>
+ipp		631/udp     # IPP (Internet Printing Protocol)
+ipp		631/tcp     # IPP (Internet Printing Protocol)
+#			   Carl-Uno Manros <manros at cp10.es.xerox.com>
+bmpp		632/udp     # bmpp
+bmpp		632/tcp     # bmpp
+#			   Troy Rollo <troy at kroll.corvu.com.au>	
+servstat	633/udp     # Service Status update (Sterling Software)
+servstat	633/tcp     # Service Status update (Sterling Software)
+#                          Greg Rose <Greg_Rose at sydney.sterling.com>
+ginad           634/udp     # ginad
+ginad           634/tcp     # ginad
+#                          Mark Crother <mark at eis.calstate.edu>
+rlzdbase        635/udp     # RLZ DBase
+rlzdbase        635/tcp     # RLZ DBase
+#                          Michael Ginn <ginn at tyxar.com>
+ldaps           636/udp     # ldap protocol over TLS/SSL (was sldap)
+ldaps           636/tcp     # ldap protocol over TLS/SSL (was sldap)
+#                          Pat Richard <patr at xcert.com>
+lanserver       637/udp     # lanserver
+lanserver       637/tcp     # lanserver
+#                          Chris Larsson <clarsson at VNET.IBM.COM>
+mcns-sec	638/udp     # mcns-sec
+mcns-sec	638/tcp     # mcns-sec
+#			   Kaz Ozawa <k.ozawa at cablelabs.com>
+msdp		639/udp     # MSDP
+msdp		639/tcp     # MSDP
+#			   Dino Farinacci <dino at cisco.com>
+entrust-sps	640/udp     # entrust-sps
+entrust-sps	640/tcp     # entrust-sps
+#			   Marek Buchler <Marek.Buchler at entrust.com>
+repcmd		641/udp     # repcmd
+repcmd		641/tcp     # repcmd
+#			   Scott Dale <scott at Replicase.com>
+esro-emsdp	642/udp     # ESRO-EMSDP V1.3
+esro-emsdp	642/tcp     # ESRO-EMSDP V1.3
+#			   Mohsen Banan <mohsen at neda.com> 
+sanity		643/udp     # SANity
+sanity		643/tcp     # SANity
+#			   Peter Viscarola <PeterGV at osr.com>
+dwr		644/udp     # dwr
+dwr		644/tcp     # dwr
+#			   Bill Fenner <fenner at parc.xerox.com>
+pssc		645/udp     # PSSC
+pssc		645/tcp     # PSSC
+#			   Egon Meier-Engelen <egon.meier-engelen at dlr.de>
+ldp		646/udp     # LDP
+ldp		646/tcp     # LDP
+#			   Bob Thomas <rhthomas at cisco.com>
+dhcp-failover   647/udp     # DHCP Failover
+dhcp-failover   647/tcp     # DHCP Failover
+#                          Bernard Volz <volz at ipworks.com> 
+rrp             648/udp     # Registry Registrar Protocol (RRP)
+rrp             648/tcp     # Registry Registrar Protocol (RRP)
+#                          Scott Hollenbeck <shollenb at netsol.com>	
+cadview-3d      649/udp     # Cadview-3d - streaming 3d models over the internet
+cadview-3d      649/tcp     # Cadview-3d - streaming 3d models over the internet
+#                          David Cooper <david.cooper at oracle.com> 
+obex		650/udp     # OBEX
+obex		650/tcp     # OBEX
+#			   Jeff Garbers <FJG030 at email.mot.com>
+ieee-mms	651/udp     # IEEE MMS
+ieee-mms	651/tcp     # IEEE MMS
+#			   Curtis Anderson <canderson at turbolinux.com>
+hello-port	652/udp     # HELLO_PORT	
+hello-port	652/tcp     # HELLO_PORT
+#			   Patrick Cipiere <Patrick.Cipiere at UDcast.com>
+repscmd		653/udp     # RepCmd
+repscmd		653/tcp     # RepCmd
+#			   Scott Dale <scott at tioga.com>
+aodv		654/udp	    # AODV
+aodv		654/tcp	    # AODV
+#			   Charles Perkins <cperkins at eng.sun.com>
+tinc		655/udp     # TINC
+tinc		655/tcp     # TINC
+#			   Ivo Timmermans <itimmermans at bigfoot.com>
+spmp		656/udp     # SPMP
+spmp		656/tcp     # SPMP
+#			   Jakob Kaivo <jkaivo at nodomainname.net>
+rmc		657/udp     # RMC
+rmc		657/tcp     # RMC
+#			   Michael Schmidt <mmaass at us.ibm.com>
+tenfold		658/udp     # TenFold
+tenfold		658/tcp     # TenFold
+#			   Louis Olszyk <lolszyk at 10fold.com>
+#               659        Removed (2001-06-06)
+mac-srvr-admin  660/udp     # MacOS Server Admin
+mac-srvr-admin  660/tcp     # MacOS Server Admin
+#                          Forest Hill <forest at apple.com>
+hap             661/udp     # HAP
+hap             661/tcp     # HAP
+#                          Igor Plotnikov <igor at uroam.com>
+pftp            662/udp     # PFTP
+pftp            662/tcp     # PFTP
+#                          Ben Schluricke <support at pftp.de>
+purenoise       663/udp     # PureNoise
+purenoise       663/tcp     # PureNoise
+#                          Sam Osa <pristine at mailcity.com>
+asf-secure-rmcp 664/udp     # ASF Secure Remote Management and Control Protocol
+asf-secure-rmcp 664/tcp     # ASF Secure Remote Management and Control Protocol
+#                          Carl First <Carl.L.First at intel.com>
+sun-dr          665/udp     # Sun DR
+sun-dr          665/tcp     # Sun DR
+#                          Harinder Bhasin <Harinder.Bhasin at Sun.COM>
+mdqs            666/udp	 doom # 
+mdqs            666/tcp	 doom # 
+#                          <ddt at idcube.idsoftware.com>
+disclose        667/udp     # campaign contribution disclosures - SDR Technologies
+disclose        667/tcp     # campaign contribution disclosures - SDR Technologies
+#                          Jim Dixon  <jim at lambda.com>
+mecomm          668/udp     # MeComm
+mecomm          668/tcp     # MeComm
+meregister      669/udp     # MeRegister
+meregister      669/tcp     # MeRegister
+#                          Armin Sawusch <armin at esd1.esd.de>
+vacdsm-sws      670/udp     # VACDSM-SWS
+vacdsm-sws      670/tcp     # VACDSM-SWS
+vacdsm-app      671/udp     # VACDSM-APP
+vacdsm-app      671/tcp     # VACDSM-APP
+vpps-qua        672/udp     # VPPS-QUA
+vpps-qua        672/tcp     # VPPS-QUA
+cimplex         673/udp     # CIMPLEX
+cimplex         673/tcp     # CIMPLEX
+#                          Ulysses G. Smith Jr. <ugsmith at cesi.com>
+acap            674/udp	    # ACAP
+acap            674/tcp     # ACAP
+#                          Chris Newman <chris.newman at sun.com>
+dctp		675/udp     # DCTP
+dctp		675/tcp     # DCTP
+#			   Andre Kramer <Andre.Kramer at ansa.co.uk>
+vpps-via	676/udp     # VPPS Via
+vpps-via	676/tcp     # VPPS Via
+#			   Ulysses G. Smith Jr. <ugsmith at cesi.com>
+vpp		677/udp     # Virtual Presence Protocol 
+vpp		677/tcp     # Virtual Presence Protocol 
+#			   Klaus Wolf <wolf at cobrow.com>
+ggf-ncp		678/udp     # GNU Generation Foundation NCP
+ggf-ncp		678/tcp     # GNU Generation Foundation NCP
+#			   Noah Paul <noahp at altavista.net>
+mrm		679/udp     # MRM
+mrm		679/tcp     # MRM
+#			   Liming Wei <lwei at cisco.com>
+entrust-aaas	680/udp     # entrust-aaas 
+entrust-aaas	680/tcp     # entrust-aaas 
+entrust-aams	681/udp     # entrust-aams
+entrust-aams	681/tcp     # entrust-aams
+#			   Adrian Mancini <adrian.mancini at entrust.com>
+xfr		682/udp     # XFR
+xfr		682/tcp     # XFR
+#			   Noah Paul <noahp at ultranet.com>
+corba-iiop	683/udp     # CORBA IIOP 
+corba-iiop	683/tcp     # CORBA IIOP 
+corba-iiop-ssl	684/udp     # CORBA IIOP SSL
+corba-iiop-ssl	684/tcp     # CORBA IIOP SSL
+#			   Henry Lowe <lowe at omg.org>
+mdc-portmapper	685/udp     # MDC Port Mapper
+mdc-portmapper	685/tcp     # MDC Port Mapper
+#			   Noah Paul <noahp at altavista.net>
+hcp-wismar	686/udp     # Hardware Control Protocol Wismar
+hcp-wismar	686/tcp     # Hardware Control Protocol Wismar
+#			   David Merchant <d.f.merchant at livjm.ac.uk>	
+asipregistry	687/udp     # asipregistry
+asipregistry	687/tcp     # asipregistry
+#			   Erik Sea <sea at apple.com>
+realm-rusd	688/udp     # REALM-RUSD
+realm-rusd	688/tcp     # REALM-RUSD
+#			   Jerry Knight <jknight at realminfo.com>
+nmap		689/udp     # NMAP
+nmap		689/tcp     # NMAP
+#			   Peter Dennis Bartok <peter at novonyx.com>
+vatp		690/udp     # VATP
+vatp		690/tcp     # VATP
+#			   Atica Software <comercial at aticasoft.es>
+msexch-routing	691/udp     # MS Exchange Routing
+msexch-routing	691/tcp     # MS Exchange Routing
+#			   David Lemson <dlemson at microsoft.com>
+hyperwave-isp	692/udp     # Hyperwave-ISP
+hyperwave-isp	692/tcp     # Hyperwave-ISP
+#			   Gerald Mesaric <gmesaric at hyperwave.com>
+connendp	693/udp     # connendp
+connendp	693/tcp     # connendp
+#			   Ronny Bremer <rbremer at future-gate.com>
+ha-cluster	694/udp     # ha-cluster
+ha-cluster	694/tcp     # ha-cluster
+#			   Alan Robertson <alanr at unix.sh>
+ieee-mms-ssl    695/udp     # IEEE-MMS-SSL
+ieee-mms-ssl    695/tcp     # IEEE-MMS-SSL
+#                          Curtis Anderson <ecanderson at turbolinux.com> 
+rushd           696/udp     # RUSHD
+rushd           696/tcp     # RUSHD
+#                          Greg Ercolano <erco at netcom.com>
+uuidgen         697/udp     # UUIDGEN
+uuidgen         697/tcp     # UUIDGEN
+#                          James Falkner <james.falkner at sun.com>
+olsr            698/udp     # OLSR
+olsr            698/tcp     # OLSR
+#                          Thomas Clausen <thomas.clausen at inria.fr>   
+accessnetwork   699/udp     # Access Network
+accessnetwork   699/tcp     # Access Network
+#                          Yingchun Xu <Yingchun_Xu at 3com.com>
+#               700-703    Unassigned
+elcsd	        704/udp     # errlog copy/server daemon
+elcsd	        704/tcp     # errlog copy/server daemon
+agentx		705/udp     # AgentX
+agentx	        705/tcp     # AgentX
+#			   Bob Natale <natale at acec.com>
+silc            706/udp     # SILC
+silc		706/tcp     # SILC
+#                          Pekka Riikonen <priikone at poseidon.pspt.fi>	
+borland-dsj	707/udp	    # Borland DSJ
+borland-dsj	707/tcp     # Borland DSJ
+#			   Gerg Cole <gcole at corp.borland.com>
+#		708        Unassigned
+entrust-kmsh    709/udp     # Entrust Key Management Service Handler
+entrust-kmsh    709/tcp     # Entrust Key Management Service Handler
+entrust-ash     710/udp     # Entrust Administration Service Handler
+entrust-ash     710/tcp     # Entrust Administration Service Handler
+#                          Peter Whittaker <pww at entrust.com>
+cisco-tdp	711/udp     # Cisco TDP
+cisco-tdp	711/tcp     # Cisco TDP
+#			   Bruce Davie <bsd at cisco.com>
+#               712-728    Unassigned
+netviewdm1      729/udp     # IBM NetView DM/6000 Server/Client
+netviewdm1      729/tcp     # IBM NetView DM/6000 Server/Client
+netviewdm2      730/udp     # IBM NetView DM/6000 send/tcp
+netviewdm2      730/tcp     # IBM NetView DM/6000 send/tcp
+netviewdm3      731/udp     # IBM NetView DM/6000 receive/tcp
+netviewdm3      731/tcp     # IBM NetView DM/6000 receive/tcp
+#                          Philippe Binet  (phbinet at vnet.IBM.COM)
+#               732-740    Unassigned           
+netgw           741/udp     # netGW
+netgw           741/tcp     # netGW
+#                          Oliver Korfmacher (okorf at netcs.com)
+netrcs          742/udp     # Network based Rev. Cont. Sys.
+netrcs          742/tcp     # Network based Rev. Cont. Sys.
+#                          Gordon C. Galligher <gorpong at ping.chi.il.us>
+#               743        Unassigned
+flexlm          744/udp     # Flexible License Manager
+flexlm          744/tcp     # Flexible License Manager
+#                          Matt Christiano
+#                          <globes at matt@oliveb.atc.olivetti.com> 
+#               745-746    Unassigned
+fujitsu-dev     747/udp     # Fujitsu Device Control
+fujitsu-dev     747/tcp     # Fujitsu Device Control
+ris-cm          748/udp     # Russell Info Sci Calendar Manager
+ris-cm          748/tcp     # Russell Info Sci Calendar Manager
+kerberos-adm    749/udp     # kerberos administration
+kerberos-adm    749/tcp     # kerberos administration
+loadav          750/udp kerberos-iv # 
+rfile 	        750/tcp # 
+#                          Martin Hamilton <martin at mrrl.lut.as.uk>
+pump	        751/udp # 
+pump	        751/tcp # 
+qrh	        752/udp # 
+qrh	        752/tcp # 
+rrh	        753/udp # 
+rrh    	        753/tcp # 
+tell	        754/udp	    # send
+tell	        754/tcp	    # send
+#                          Josyula R. Rao <jrrao at watson.ibm.com>
+#               755-756    Unassigned
+nlogin	        758/udp # 
+nlogin	        758/tcp # 
+con	        759/udp # 
+con	        759/tcp # 
+ns	        760/udp # 
+ns	        760/tcp # 
+rxe	        761/udp # 
+rxe	        761/tcp # 
+quotad	        762/udp # 
+quotad	        762/tcp # 
+cycleserv       763/udp # 
+cycleserv       763/tcp # 
+omserv	        764/udp # 
+omserv	        764/tcp # 
+webster	        765/udp # 
+webster	        765/tcp # 
+#                          Josyula R. Rao <jrrao at watson.ibm.com>
+#               766        Unassigned
+phonebook       767/udp	    # phone
+phonebook       767/tcp	    # phone
+#                          Josyula R. Rao <jrrao at watson.ibm.com>
+#               768        Unassigned
+vid	        769/udp # 
+vid	        769/tcp # 
+cadlock         770/udp # 
+cadlock         770/tcp # 
+rtip 	        771/udp # 
+rtip 	        771/tcp # 
+cycleserv2      772/udp # 
+cycleserv2      772/tcp # 
+notify	        773/udp # 
+submit	        773/tcp # 
+acmaint_dbd     774/udp # 
+rpasswd	        774/tcp # 
+acmaint_transd	775/udp # 
+entomb	        775/tcp # 
+wpages          776/udp # 
+wpages		776/tcp # 
+#                          Josyula R. Rao <jrrao at watson.ibm.com>
+multiling-http	777/udp     # Multiling HTTP
+multiling-http	777/tcp     # Multiling HTTP
+#			   Alejandro Bonet <babel at ctv.es>
+#		778-779    Unassigned
+wpgs		780/udp # 
+wpgs		780/tcp # 
+#                          Josyula R. Rao <jrrao at watson.ibm.com>
+#               781-785    Unassigned
+#               786        Unassigned (Removed 2002-05-08)
+#               787        Unassigned (Removed 2002-10-08)
+#               788-799    Unassigned
+mdbs_daemon	800/udp	 # 
+mdbs_daemon	800/tcp	 # 
+device		801/udp # 
+device		801/tcp # 
+#		802-809    Unassigned
+fcp-udp		810/udp     # FCP Datagram
+fcp-udp		810/tcp     # FCP
+#			   Paul Whittemore <paul at softarc.com>
+#		811-827    Unassigned
+itm-mcell-s	828/udp     # itm-mcell-s
+itm-mcell-s	828/tcp     # itm-mcell-s
+#			   Miles O'Neal <meo at us.itmasters.com>
+pkix-3-ca-ra    829/udp     # PKIX-3 CA/RA
+pkix-3-ca-ra	829/tcp     # PKIX-3 CA/RA
+#			   Carlisle Adams <Cadams at entrust.com>
+#               830-846    Unassigned
+dhcp-failover2  847/udp     # dhcp-failover 2
+dhcp-failover2  847/tcp     # dhcp-failover 2
+#                          Bernard Volz <volz at ipworks.com> 
+gdoi            848/udp     # GDOI
+gdoi            848/tcp     # GDOI
+#                          RFC-ietf-msec-gdoi-07.txt
+#               849-859    Unassigned
+iscsi           860/udp     # iSCSI
+iscsi           860/tcp     # iSCSI
+#                          RFC-draft-ietf-ips-iscsi-20.txt
+#               861-872    Unassigned
+rsync           873/udp     # rsync
+rsync           873/tcp     # rsync
+#                          Andrew Tridgell <tridge at samba.anu.edu.au>
+#               874-885    Unassigned
+iclcnet-locate  886/udp     # ICL coNETion locate server
+iclcnet-locate  886/tcp     # ICL coNETion locate server
+#                          Bob Lyon <bl at oasis.icl.co.uk>
+iclcnet_svinfo  887/udp     # ICL coNETion server info
+iclcnet_svinfo  887/tcp     # ICL coNETion server info
+#                          Bob Lyon <bl at oasis.icl.co.uk>
+accessbuilder   888/udp     # AccessBuilder
+accessbuilder   888/tcp     # AccessBuilder
+#                          Steve Sweeney <Steven_Sweeney at 3mail.3com.com>
+# The following entry records an unassigned but widespread use
+cddbp           888/tcp     # CD Database Protocol
+#                          Steve Scherf <steve at moonsoft.com>
+#
+#		889-899    Unassigned
+omginitialrefs  900/udp     # OMG Initial Refs
+omginitialrefs  900/tcp     # OMG Initial Refs
+#			   Christian Callsen <Christian.Callsen at eng.sun.com>
+smpnameres      901/udp     # SMPNAMERES
+smpnameres      901/tcp     # SMPNAMERES
+#                          Leif Ekblad <leif at rdos.net>
+ideafarm-chat   902/udp     # IDEAFARM-CHAT
+ideafarm-chat   902/tcp     # IDEAFARM-CHAT
+ideafarm-catch  903/udp     # IDEAFARM-CATCH
+ideafarm-catch  903/tcp     # IDEAFARM-CATCH
+#                          Wo'o Ideafarm <wo at ideafarm.com> 
+#               904-910    Unassigned
+xact-backup     911/udp     # xact-backup
+xact-backup     911/tcp     # xact-backup
+#                          Bill Carroll <billc at xactlabs.com>
+apex-mesh       912/udp     # APEX relay-relay service
+apex-mesh       912/tcp     # APEX relay-relay service
+apex-edge       913/udp     # APEX endpoint-relay service    
+apex-edge       913/tcp     # APEX endpoint-relay service
+#                          [RFC3340]
+#               914-988    Unassigned
+ftps-data	989/udp     # ftp protocol, data, over TLS/SSL
+ftps-data	989/tcp     # ftp protocol, data, over TLS/SSL
+ftps		990/udp     # ftp protocol, control, over TLS/SSL
+ftps		990/tcp     # ftp protocol, control, over TLS/SSL
+#			   Christopher Allen <ChristopherA at consensus.com>
+nas		991/udp     # Netnews Administration System
+nas		991/tcp     # Netnews Administration System
+#			   Vera Heinau <heinau at fu-berlin.de>
+#			   Heiko Schlichting <heiko at fu-berlin.de>
+telnets		992/udp     # telnet protocol over TLS/SSL
+telnets		992/tcp     # telnet protocol over TLS/SSL
+imaps		993/udp     # imap4 protocol over TLS/SSL
+imaps		993/tcp     # imap4 protocol over TLS/SSL
+ircs		994/udp     # irc protocol over TLS/SSL
+ircs		994/tcp     # irc protocol over TLS/SSL
+#			   Christopher Allen <ChristopherA at consensus.com>
+pop3s           995/udp     # pop3 protocol over TLS/SSL (was spop3)
+pop3s           995/tcp     # pop3 protocol over TLS/SSL (was spop3)
+#                          Gordon Mangione <gordm at microsoft.com>
+vsinet          996/udp     # vsinet
+vsinet          996/tcp     # vsinet
+#                          Rob Juergens <robj at vsi.com>
+maitrd		997/udp # 
+maitrd		997/tcp # 
+puparp		998/udp # 
+busboy		998/tcp # 
+applix		999/udp	        puprouter # Applix ac
+garcon		999/tcp puprouter # 
+cadlock2	1000/udp # 
+cadlock2	1000/tcp # 
+#               1001-1009      Unassigned
+#		1008/udp   Possibly used by Sun Solaris????
+surf		1010/udp        # surf
+surf		1010/tcp        # surf
+#			       Joseph Geer <jgeer at peapod.com>	 
+#		1011-1022      Reserved
+	        1023/udp        # Reserved
+                1023/tcp        # Reserved
+#                              IANA <iana at iana.org>
+                1024/udp    # Reserved             
+                1024/tcp    # Reserved		
+#                          IANA <iana at iana.org>
+#
+# REGISTERED PORT NUMBERS
+#
+blackjack       1025/udp    # network blackjack
+blackjack       1025/tcp    # network blackjack
+#                          Unknown contact
+cap             1026/udp    # Calender Access Protocol
+cap             1026/tcp    # Calender Access Protocol
+#                          Doug Royer <Doug at Royer.com> June 2002
+exosee          1027/udp    # ExoSee
+exosee          1027/tcp    # ExoSee
+#                          Chagdali Isamail <chagdali at free.fr> June 2003
+#               1028-1029  Unassigned 
+iad1            1030/udp    # BBN IAD
+iad1            1030/tcp    # BBN IAD
+iad2            1031/udp    # BBN IAD
+iad2            1031/tcp    # BBN IAD
+iad3            1032/udp    # BBN IAD
+iad3            1032/tcp    # BBN IAD
+#                          Andy Malis <malis_a at timeplex.com>
+netinfo-local   1033/udp    # local netinfo port
+netinfo-local   1033/tcp    # local netinfo port
+#                          Marc Majka <majka at apple.com> August 2002
+activesync      1034/udp    # ActiveSync Notifications
+activesync      1034/tcp    # ActiveSync Notifications
+#                          Sandra Vargas <Sandrama at microsoft.com> March 2003
+mxxrlogin       1035/udp    # MX-XR RPC
+mxxrlogin       1035/tcp    # MX-XR RPC
+#                          Arnold E. Mauer <amauer at vrms.com> April 2003
+pcg-radar       1036/udp    # RADAR Service Protocol
+pcg-radar       1036/tcp    # RADAR Service Protocol
+#                          Steve Ravida <Steve at pcguru.com>
+#               1037-1039  Unassigned
+netarx          1040/udp    # Netarx
+netarx          1040/tcp    # Netarx
+#                          Fredrick Paul Eisele <phreed at netarx.com>
+#               1041-1044  Unassigned
+fpitp           1045/udp    # Fingerprint Image Transfer Protocol
+fpitp           1045/tcp    # Fingerprint Image Transfer Protocol
+#                          Steven Fields <sfields at identix.com> February 2002
+#               1046       Unassigned
+neod1           1047/udp    # Sun's NEO Object Request Broker
+neod1           1047/tcp    # Sun's NEO Object Request Broker
+neod2           1048/udp    # Sun's NEO Object Request Broker
+neod2           1048/tcp    # Sun's NEO Object Request Broker
+#                          Rohit Garg <rohit.garg at eng.sun.com>
+td-postman      1049/udp    # Tobit David Postman VPMN
+td-postman      1049/tcp    # Tobit David Postman VPMN
+#                          Franz-Josef Leuders <development at tobit.com>
+cma             1050/udp    # CORBA Management Agent
+cma             1050/tcp    # CORBA Management Agent
+#                          Ramy Zaarour <ramy at lumos.com>  
+optima-vnet     1051/udp    # Optima VNET
+optima-vnet     1051/tcp    # Optima VNET
+#                          Ralf Doewich <ralf.doewich at optimatele.com>
+ddt             1052/udp    # Dynamic DNS Tools
+ddt             1052/tcp    # Dynamic DNS Tools
+#                          Remi Lefebvre <remi at debian.org>
+remote-as       1053/udp    # Remote Assistant (RA)
+remote-as       1053/tcp    # Remote Assistant (RA)
+#                          Roman Kriis <roman at previo.ee>   
+brvread         1054/udp    # BRVREAD
+brvread         1054/tcp    # BRVREAD
+#                          Gilles Roussel <groussel at eu-symtrax.com>
+ansyslmd        1055/udp    # ANSYS - License Manager
+ansyslmd        1055/tcp    # ANSYS - License Manager 
+#                          Suzanne Lorrin <suzanne.lorrin at ansys.com>
+vfo             1056/udp    # VFO 
+vfo             1056/tcp    # VFO
+#                          Anthony Gonzalez <agonzal1 at telcordia.com>
+startron        1057/udp    # STARTRON
+startron        1057/tcp    # STARTRON
+#                          Markus Sabadello <sabadello at startron.org> 
+nim             1058/udp    # nim
+nim             1058/tcp    # nim
+nimreg          1059/udp    # nimreg
+nimreg          1059/tcp    # nimreg
+#                          Robert Gordon <rbg at austin.ibm.com>
+polestar        1060/udp    # POLESTAR
+polestar        1060/tcp    # POLESTAR
+#                          Masakuni Okada <masakuni at jp.ibm.com>
+kiosk           1061/udp    # KIOSK
+kiosk           1061/tcp    # KIOSK
+#                          Howard Buck <hbuck at maytag.com>
+veracity        1062/udp    # Veracity
+veracity        1062/tcp    # Veracity
+#                          Ross Williams <ross at rocksoft.com>
+kyoceranetdev   1063/udp    # KyoceraNetDev
+kyoceranetdev   1063/tcp    # KyoceraNetDev
+#                          Shigenaka Kanemitsu 
+#                          <Shigenaka_Kanemitsu at ypd.kyocera.co.jp>
+jstel           1064/udp    # JSTEL
+jstel           1064/tcp    # JSTEL
+#                          Duane Kiser <dkiser at jsexpress.com> 
+syscomlan       1065/udp    # SYSCOMLAN
+syscomlan       1065/tcp    # SYSCOMLAN
+#                          Urs Ryf <urs.ryf at selectron.ch>
+fpo-fns         1066/udp    # FPO-FNS
+fpo-fns         1066/tcp    # FPO-FNS
+#                          Jens Klose <jklose at intercope.com>
+instl_boots     1067/udp    # Installation Bootstrap Proto. Serv. 
+instl_boots     1067/tcp    # Installation Bootstrap Proto. Serv. 
+instl_bootc     1068/udp    # Installation Bootstrap Proto. Cli.  
+instl_bootc     1068/tcp    # Installation Bootstrap Proto. Cli.  
+#                          David Arko <darko at hpfcrn.fc.hp.com>
+cognex-insight  1069/udp    # COGNEX-INSIGHT
+cognex-insight  1069/tcp    # COGNEX-INSIGHT
+#                          Steve Olson <solson at cognex.com>
+gmrupdateserv   1070/udp    # GMRUpdateSERV
+gmrupdateserv   1070/tcp    # GMRUpdateSERV
+#                          Steve Kellogg <stevekellogg at mezzogmr.com>
+bsquare-voip    1071/udp    # BSQUARE-VOIP
+bsquare-voip    1071/tcp    # BSQUARE-VOIP
+#                          Yen Lee <YenL at bsquare.com>
+cardax          1072/udp    # CARDAX
+cardax          1072/tcp    # CARDAX
+#                          Charles Oram <charleso at cardax.com>
+bridgecontrol   1073/udp    # Bridge Control
+bridgecontrol   1073/tcp    # Bridge Control
+#                          Andy Heron <btexact.ports at bt.com>
+fastechnologlm  1074/udp    # FASTechnologies License Manager
+fastechnologlm  1074/tcp    # FASTechnologies License Manager
+#                          Robert C. Henningsgard
+#                          <rhenn at fastechnologies.com>
+rdrmshc         1075/udp    # RDRMSHC
+rdrmshc         1075/tcp    # RDRMSHC
+#                          Ericko Shimada <eriko at kel.fujitsu.co.jp> 
+dab-sti-c       1076/udp    # DAB STI-C
+dab-sti-c       1076/tcp    # DAB STI-C
+#                          World DAB <worlddab_irc at worlddab.org>
+imgames         1077/udp    # IMGames
+imgames         1077/tcp    # IMGames
+#                          Jean A. Ames <engr-admin at flipside.com>
+avocent-proxy   1078/udp    # Avocent Proxy Protocol
+avocent-proxy   1078/tcp    # Avocent Proxy Protocol
+#                          Steven W. Clark <steven.clark at avocent.com> 
+asprovatalk     1079/udp    # ASPROVATalk
+asprovatalk     1079/tcp    # ASPROVATalk
+#                          Chiew Farn Chung <cfchung at asprova.com>
+socks           1080/udp    # Socks    
+socks           1080/tcp    # Socks    
+#                          Ying-Da Lee <ylee at syl.dl.nec.com
+pvuniwien       1081/udp    # PVUNIWIEN
+pvuniwien       1081/tcp    # PVUNIWIEN
+#                          Peter Lipp >Peter.Lipp at iaik.at>
+amt-esd-prot    1082/udp    # AMT-ESD-PROT 
+amt-esd-prot    1082/tcp    # AMT-ESD-PROT
+#                          AMTEC S.p.A <sp.amtec at interbusiness.it>
+ansoft-lm-1     1083/udp    # Anasoft License Manager
+ansoft-lm-1     1083/tcp    # Anasoft License Manager
+ansoft-lm-2     1084/udp    # Anasoft License Manager
+ansoft-lm-2     1084/tcp    # Anasoft License Manager
+webobjects	1085/udp    # Web Objects
+webobjects	1085/tcp    # Web Objects
+#			   Andy Belk <abelk at apple.com>
+cplscrambler-lg 1086/udp    # CPL Scrambler Logging
+cplscrambler-lg 1086/tcp    # CPL Scrambler Logging
+cplscrambler-in 1087/udp    # CPL Scrambler Internal 
+cplscrambler-in 1087/tcp    # CPL Scrambler Internal
+cplscrambler-al 1088/udp    # CPL Scrambler Alarm Log
+cplscrambler-al 1088/tcp    # CPL Scrambler Alarm Log
+#                          Richard Corn <rac at racc.com> 
+ff-annunc       1089/udp    # FF Annunciation 
+ff-annunc       1089/tcp    # FF Annunciation 
+ff-fms          1090/udp    # FF Fieldbus Message Specification
+ff-fms          1090/tcp    # FF Fieldbus Message Specification 
+ff-sm           1091/udp    # FF System Management
+ff-sm           1091/tcp    # FF System Management
+#                          Fieldbus Foundation <dave.glanzer at fieldbus.org>
+obrpd           1092/udp    # Open Business Reporting Protocol
+obrpd           1092/tcp    # Open Business Reporting Protocol
+#                          William Randolph Royere III 
+#                          <william at royere.net>
+proofd          1093/udp    # PROOFD
+proofd          1093/tcp    # PROOFD
+rootd           1094/udp    # ROOTD
+rootd           1094/tcp    # ROOTD
+#                          Fons Rademakers <Fons.Rademakers at cern.ch>
+nicelink        1095/udp    # NICELink
+nicelink        1095/tcp    # NICELink
+#                          Jordi Lisbona <jlisbona at tango04.net>   
+cnrprotocol     1096/udp    # Common Name Resolution Protocol
+cnrprotocol     1096/tcp    # Common Name Resolution Protocol
+#                          Michael Mealling <michaelm at netsol.com> 
+sunclustermgr	1097/udp    # Sun Cluster Manager
+sunclustermgr	1097/tcp    # Sun Cluster Manager
+#                          Ashit Patel <Ashit.Patel at eng.Sun.COM>
+rmiactivation	1098/udp    # RMI Activation
+rmiactivation	1098/tcp    # RMI Activation
+rmiregistry     1099/udp    # RMI Registry
+rmiregistry     1099/tcp    # RMI Registry
+#                          Mark Hodapp <mark.hodapp at sun.com>
+mctp            1100/udp    # MCTP
+mctp            1100/tcp    # MCTP 
+#                          Vitaly Revsin <vitaly at webmanage.com>
+pt2-discover    1101/udp    # PT2-DISCOVER
+pt2-discover    1101/tcp    # PT2-DISCOVER
+#                          Ralph Kammerlander 
+#                          <ralph.kammerlander at khe.siemens.de> 
+adobeserver-1   1102/udp    # ADOBE SERVER 1
+adobeserver-1   1102/tcp    # ADOBE SERVER 1
+adobeserver-2   1103/udp    # ADOBE SERVER 2
+adobeserver-2   1103/tcp    # ADOBE SERVER 2
+#                          Frank Soetebeer <frsoeteb at adobe.com>
+xrl             1104/udp    # XRL
+xrl             1104/tcp    # XRL
+#                          Patrick Robinson <probinson at plosive.com>
+ftranhc         1105/udp    # FTRANHC
+ftranhc         1105/tcp    # FTRANHC
+#                          Eriko Shimada <eriko at kel.fujitsu.co.jp> 
+isoipsigport-1  1106/udp    # ISOIPSIGPORT-1 
+isoipsigport-1  1106/tcp    # ISOIPSIGPORT-1
+isoipsigport-2  1107/udp    # ISOIPSIGPORT-2 
+isoipsigport-2  1107/tcp    # ISOIPSIGPORT-2 
+#                          Peter Egli <peter.egli at inalp.com> 
+ratio-adp       1108/udp    # ratio-adp
+ratio-adp       1108/tcp    # ratio-adp
+#                          Oliver Thulke <oth at ratio.de>
+#               1109       Reserved - IANA
+nfsd-keepalive  1110/udp    # Client status info
+nfsd-status     1110/tcp    # Cluster status info
+#                          Edgar Circenis <ec at hpfclj.fc.hp.com>
+lmsocialserver  1111/udp    # LM Social Server
+lmsocialserver  1111/tcp    # LM Social Server
+#                          Ron Lussier <coyote at likeminds.com>
+icp             1112/udp    # Intelligent Communication Protocol
+icp             1112/tcp    # Intelligent Communication Protocol
+#                          Mark H. David <mhd at gensym.com>   
+#               1113       Unassigned 
+mini-sql        1114/udp    # Mini SQL
+mini-sql        1114/tcp    # Mini SQL
+#                          David Hughes <bambi at Hughes.com.au>
+ardus-trns      1115/udp    # ARDUS Transfer
+ardus-trns      1115/tcp    # ARDUS Transfer
+ardus-cntl      1116/udp    # ARDUS Control
+ardus-cntl      1116/tcp    # ARDUS Control
+ardus-mtrns     1117/udp    # ARDUS Multicast Transfer
+ardus-mtrns     1117/tcp    # ARDUS Multicast Transfer
+#                          Shinya Abe <abeabe at pfu.co.jp>
+#               1118-1121  Unassigned
+availant-mgr    1122/udp    # availant-mgr
+availant-mgr    1122/tcp    # availant-mgr
+#                          Steven Pelletier <stevep at Availant.com> 
+murray          1123/udp    # Murray
+murray          1123/tcp    # Murray
+#                          Stu Mark <fordii at j51.com>
+#               1124-1154  Unassigned 
+nfa             1155/udp    # Network File Access                
+nfa             1155/tcp    # Network File Access                
+#                          James Powell <james at mailhost.unidata.com>
+#               1156-1160  Unassigned
+health-polling  1161/udp    # Health Polling
+health-polling  1161/tcp    # Health Polling
+health-trap     1162/udp    # Health Trap
+health-trap     1162/tcp    # Health Trap
+#               1163-1167  Unassigned
+vchat           1168/udp    # VChat Conference Service
+vchat           1168/tcp    # VChat Conference Service
+#                          Andreas Wetzel <mickey at enforcer.cc> September 2002
+tripwire        1169/udp    # TRIPWIRE
+tripwire        1169/tcp    # TRIPWIRE
+#                          Ed Metcalf <emetcalf at tripwiresecurity.com>
+#                          Albert Holt <alberth at triosoftware.com>
+#               1170-1179  Unassigned
+mc-client       1180/udp    # Millicent Client Proxy
+mc-client       1180/tcp    # Millicent Client Proxy
+#                          Steve Glassman <steveg at pa.dec.com>
+#               1181-1182  Unassigned
+llsurfup-http   1183/udp    # LL Surfup HTTP
+llsurfup-http   1183/tcp    # LL Surfup HTTP
+llsurfup-https  1184/udp    # LL Surfup HTTPS
+llsurfup-https  1184/tcp    # LL Surfup HTTPS
+#                          Katy Lynn McCullough <KatyM at LapLink.com>
+catchpole       1185/udp    # Catchpole port
+catchpole       1185/tcp    # Catchpole port
+#                          Christian Catchpole <christian at catchpole.net> March 2002
+#               1186-1187  Unassigned
+hp-webadmin     1188/udp    # HP Web Admin
+hp-webadmin     1188/tcp    # HP Web Admin
+#                          Lance Kind <lance_kind at hp.com>
+#               1189-1198  Unassigned
+dmidi           1199/udp    # DMIDI
+dmidi           1199/tcp    # DMIDI
+#                          Phil Kerr <phil at plus24.com> February 2002
+scol            1200/udp    # SCOL
+scol            1200/tcp    # SCOL
+#                          Cryo-Networks <p.favre at cryo-networks.fr>
+nucleus-sand    1201/udp    # Nucleus Sand
+nucleus-sand    1201/tcp    # Nucleus Sand
+#                          James Marsh <James.Marsh at sandtechnology.com>
+caiccipc        1202/udp    # caiccipc
+caiccipc        1202/tcp    # caiccipc
+#                          Vince Re <Vincent.Re at cai.com>
+ssslic-mgr      1203/udp    # License Validation
+ssslic-mgr      1203/tcp    # License Validation
+ssslog-mgr      1204/udp    # Log Request Listener
+ssslog-mgr      1204/tcp    # Log Request Listener
+#                          Eric Bruno <ebruno at solution-soft.com>
+accord-mgc      1205/udp    # Accord-MGC
+accord-mgc      1205/tcp    # Accord-MGC
+#                          Roni Even <roni_e at accord.co.il>
+anthony-data    1206/udp    # Anthony Data
+anthony-data    1206/tcp    # Anthony Data
+#                          Paul Dollemore <pauld at anthonydata.com>
+metasage        1207/udp    # MetaSage
+metasage        1207/tcp    # MetaSage
+#                          Peter Anvelt <panvelt at xnai.com> 
+seagull-ais     1208/udp    # SEAGULL AIS
+seagull-ais     1208/tcp    # SEAGULL AIS
+#                          Lee Breisacher <lbreisacher at seagullsw.com> 
+ipcd3           1209/udp    # IPCD3
+ipcd3           1209/tcp    # IPCD3
+#                          Mark Ciskey <mlciskey at plato.com>  
+eoss            1210/udp    # EOSS
+eoss            1210/tcp    # EOSS
+#                          Robert Armes <rarmes at axarte.com>
+groove-dpp      1211/udp    # Groove DPP
+groove-dpp      1211/tcp    # Groove DPP
+#                          Ken Moore <kmoore at groove.net>
+lupa            1212/udp    # lupa
+lupa            1212/tcp    # lupa
+#                          Barney Wolff <barney at databus.com>
+mpc-lifenet     1213/udp    # MPC LIFENET
+mpc-lifenet     1213/tcp    # MPC LIFENET
+#                          Ward Silver <hwardsil at wolfenet.com>
+kazaa           1214/udp    # KAZAA
+kazaa           1214/tcp    # KAZAA
+#                          Ahti Heinla <ahti at ahti.bluemoon.ee>  
+scanstat-1      1215/udp    # scanSTAT 1.0
+scanstat-1      1215/tcp    # scanSTAT 1.0
+#                          William Scheding <wls at wls.org>
+etebac5         1216/udp    # ETEBAC 5
+etebac5         1216/tcp    # ETEBAC 5
+#                          GSIT <jl.barbut at gsit.fr>
+hpss-ndapi      1217/udp    # HPSS-NDAPI
+hpss-ndapi      1217/tcp    # HPSS-NDAPI
+#                          Michael Gleicher <mkg at san.rr.com>
+aeroflight-ads  1218/udp    # AeroFlight-ADs
+aeroflight-ads  1218/tcp    # AeroFlight-ADs
+aeroflight-ret  1219/udp    # AeroFlight-Ret
+aeroflight-ret  1219/tcp    # AeroFlight-Ret
+#                          Eric Johnson <eric at gruver.net>
+qt-serveradmin  1220/udp    # QT SERVER ADMIN
+qt-serveradmin  1220/tcp    # QT SERVER ADMIN
+#                          Chris LeCroy <lecroy at apple.com>
+sweetware-apps  1221/udp    # SweetWARE Apps
+sweetware-apps  1221/tcp    # SweetWARE Apps
+#                          David Dunetz <david at sweetware.com> 
+nerv            1222/udp    # SNI R&D network                  
+nerv            1222/tcp    # SNI R&D network                  
+#                          Martin Freiss <freiss.pad at sni.de>
+tgp             1223/udp    # TGP
+tgp             1223/tcp    # TGP
+#                          Gur Kimchi <gur at mail.trulyglobal.com>  
+vpnz            1224/udp    # VPNz
+vpnz            1224/tcp    # VPNz
+#                          Tom Strack <TSTRACK at Advnw.com>      
+slinkysearch    1225/udp    # SLINKYSEARCH
+slinkysearch    1225/tcp    # SLINKYSEARCH
+#                          Desmond Chan <deschan at prismedia.com>
+stgxfws         1226/udp    # STGXFWS
+stgxfws         1226/tcp    # STGXFWS
+#                          Tetsuya Shioda <tetsuya at saint.nm.fujitsu.co.jp>   
+dns2go          1227/udp    # DNS2Go
+dns2go          1227/tcp    # DNS2Go
+#                          Mark Richards <mark.richards at deerfield.com>
+florence        1228/udp    # FLORENCE
+florence        1228/tcp    # FLORENCE
+#                          Brian Trammell <btrammell at iventurelab.com>
+novell-zfs      1229/udp    # Novell ZFS
+novell-zfs      1229/tcp    # Novell ZFS
+#                          Ty Ellis <tellis at novell.com> 
+periscope       1230/udp    # Periscope
+periscope       1230/tcp    # Periscope
+#                          Kevin Madden <Kevin at emailxtras.com>
+menandmice-lpm  1231/udp    # menandmice-lpm
+menandmice-lpm  1231/tcp    # menandmice-lpm
+#                          Sigfus Magnusson <sigfusm at menandmice.com>
+#####  Microsoft (unoffically) using 1232     #####
+univ-appserver  1233/udp    # Universal App Server
+univ-appserver  1233/tcp    # Universal App Server
+#                          Tim Sent <tim.sent at systemsarchitects.com>
+search-agent    1234/udp    # Infoseek Search Agent
+search-agent    1234/tcp    # Infoseek Search Agent
+#                          Jackie Wu <jackiew at infoseek.com>
+mosaicsyssvc1   1235/udp    # mosaicsyssvc1
+mosaicsyssvc1   1235/tcp    # mosaicsyssvc1
+#                          Brian Matthews <bmatthews at mosaicsystems.com>	
+bvcontrol       1236/udp    # bvcontrol
+bvcontrol       1236/tcp    # bvcontrol
+#                          Daniel J Walsh <dwalsh at bindview.com>
+tsdos390        1237/udp    # tsdos390
+tsdos390        1237/tcp    # tsdos390
+#                          Ben Pracht <ben.pracht at tivoli.com> 
+hacl-qs	        1238/udp    # hacl-qs
+hacl-qs	        1238/tcp    # hacl-qs
+#                          Farid Faez <farid_faez at hp.com>
+nmsd            1239/udp    # NMSD
+nmsd            1239/tcp    # NMSD
+#                          Yuri Machkasov <yuri at ptc.com>
+instantia       1240/udp    # Instantia
+instantia       1240/tcp    # Instantia
+#                          Ruth Slater <ruth.slater at ideagen.co.uk> 
+nessus	        1241/udp    # nessus
+nessus	        1241/tcp    # nessus
+#                          Jordan Hrycaj <jordan at mjh.teddy-net.com>
+nmasoverip      1242/udp    # NMAS over IP
+nmasoverip      1242/tcp    # NMAS over IP
+#                          Hal Henderson <hhenders at novell.com>		
+serialgateway   1243/udp    # SerialGateway
+serialgateway   1243/tcp    # SerialGateway
+#                          Stephen LaValley <lavalley at lucent.com>
+isbconference1  1244/udp    # isbconference1
+isbconference1  1244/tcp    # isbconference1
+isbconference2  1245/udp    # isbconference2
+isbconference2  1245/tcp    # isbconference2
+#                          Arnold Dittmann <dittmann at isbcad.de>
+payrouter       1246/udp    # payrouter
+payrouter       1246/tcp    # payrouter
+#                          David Wilson <dwilson at integral-ie.com>
+visionpyramid   1247/udp    # VisionPyramid
+visionpyramid   1247/tcp    # VisionPyramid
+#                          Gavin Hutchinson <gavinh at visionlogistics.com>
+hermes		1248/udp    # hermes
+hermes		1248/tcp    # hermes
+#                          Not known
+mesavistaco	1249/udp    # Mesa Vista Co
+mesavistaco	1249/tcp    # Mesa Vista Co
+#                          Rick LaBanca <rel at mesasys.com>
+swldy-sias	1250/udp    # swldy-sias
+swldy-sias	1250/tcp    # swldy-sias
+#                          Peter E Williams <peter.williams at smallworld-us.com>
+servergraph	1251/udp    # servergraph
+servergraph     1251/tcp    # servergraph
+#                          Lindsay Morris <lmorris at servergraph.com>
+bspne-pcc       1252/udp    # bspne-pcc
+bspne-pcc	1252/tcp    # bspne-pcc
+q55-pcc		1253/udp    # q55-pcc
+q55-pcc         1253/tcp    # q55-pcc
+#                          Prem Tirilok <Prem.Tirilok at tellabs.com>	
+de-noc		1254/udp    # de-noc
+de-noc		1254/tcp    # de-noc
+de-cache-query  1255/udp    # de-cache-query
+de-cache-query  1255/tcp    # de-cache-query
+de-server	1256/udp    # de-server
+de-server	1256/tcp    # de-server
+#			   Jeff Burdette <support at digitalenvoy.net>
+shockwave2	1257/udp    # Shockwave 2
+shockwave2      1257/tcp    # Shockwave 2
+#			   Dave Simmons <dsimmons at macromedia.com>	
+opennl		1258/udp    # Open Network Library
+opennl		1258/tcp    # Open Network Library
+opennl-voice	1259/udp    # Open Network Library Voice
+opennl-voice    1259/tcp    # Open Network Library Voice
+#                          Phil Frisbie <phil at hawksoft.com> 
+ibm-ssd		1260/udp    # ibm-ssd
+ibm-ssd		1260/tcp    # ibm-ssd
+#			   Barry Whyte <barry_whyte at uk.ibm.com>
+mpshrsv		1261/udp    # mpshrsv
+mpshrsv         1261/tcp    # mpshrsv
+#                          Makoto Ikeyama <ikeyama at ael.fujitsu.co.jp>
+qnts-orb        1262/udp    # QNTS-ORB
+qnts-orb	1262/tcp    # QNTS-ORB
+#                          Raghurama Bhat <raghu at quintus.com> 
+dka		1263/udp    # dka
+dka		1263/tcp    # dka
+#                          Chris Griffin <cgriffin at dka.com>
+prat            1264/udp    # PRAT
+prat		1264/tcp    # PRAT
+#                          Keith Wood <keith.wood at epid.eurotherm.co.uk> 
+dssiapi         1265/udp    # DSSIAPI
+dssiapi         1265/tcp    # DSSIAPI
+#                          Steve Sando <steve.sando at diversifiedsoftware.com> 
+dellpwrappks    1266/udp    # DELLPWRAPPKS
+dellpwrappks    1266/tcp    # DELLPWRAPPKS
+#                          David Troeger <David_Troeger at dell.com> 
+epc             1267/udp    # eTrust Policy Compliance
+epc             1267/tcp    # eTrust Policy Compliance
+#                          Aaron Stein <aaron.stein at ca.com>
+propel-msgsys   1268/udp    # PROPEL-MSGSYS
+propel-msgsys   1268/tcp    # PROPEL-MSGSYS
+#                          Bert Van der Linden <bert at propel.com>
+watilapp        1269/udp    # WATiLaPP
+watilapp        1269/tcp    # WATiLaPP
+#                          Frederic Weymann <Fizzban at swcombine.com>
+opsmgr          1270/udp    # Microsoft Operations Manager
+opsmgr          1270/tcp    # Microsoft Operations Manager
+#                          Ashvin Sanghvi <AshvinS at microsoft.com>
+dabew           1271/udp    # Dabew
+dabew           1271/tcp    # Dabew
+#                          Norm Freedman <normfree at att.net>
+cspmlockmgr     1272/udp    # CSPMLockMgr
+cspmlockmgr     1272/tcp    # CSPMLockMgr
+#                          Ibtsam Mahfouz <imahfouz at cisco.com>
+emc-gateway     1273/udp    # EMC-Gateway
+emc-gateway     1273/tcp    # EMC-Gateway
+#                          Rene Fontaine <fontaine_rene at emc.com>
+t1distproc      1274/udp    # t1distproc
+t1distproc      1274/tcp    # t1distproc
+#                          Julian Biddle <julian_biddle at TechnologyOneCorp.com>
+ivcollector     1275/udp    # ivcollector
+ivcollector     1275/tcp    # ivcollector
+ivmanager       1276/udp    # ivmanager
+ivmanager       1276/tcp    # ivmanager
+#                          Xavier Roques <xroques at infovista.fr>
+miva-mqs        1277/udp    # mqs
+miva-mqs        1277/tcp    # mqs
+#                          Miva Corporation <jwoods at miva.com.au>
+dellwebadmin-1  1278/udp    # Dell Web Admin 1
+dellwebadmin-1  1278/tcp    # Dell Web Admin 1
+dellwebadmin-2  1279/udp    # Dell Web Admin 2   
+dellwebadmin-2  1279/tcp    # Dell Web Admin 2
+#                          Bridget Navoda <Bridget_Navoda at dell.com> 
+pictrography    1280/udp    # Pictrography
+pictrography    1280/tcp    # Pictrography
+#                          Takashi Hoshino <hoshino at miya.fujifilm.co.jp>   
+healthd         1281/udp    # healthd
+healthd         1281/tcp    # healthd
+#                          James E. Housley <jim at thehousleys.net> 
+emperion        1282/udp    # Emperion
+emperion        1282/tcp    # Emperion
+#                          Claus Thor Barth <ctb at satworks.net>
+productinfo     1283/udp    # ProductInfo
+productinfo     1283/tcp    # ProductInfo
+iee-qfx         1284/udp    # IEE-QFX
+iee-qfx         1284/tcp    # IEE-QFX
+#                          Kevin D. Quitt <KQuitt at IEEInc.com>
+neoiface        1285/udp    # neoiface
+neoiface        1285/tcp    # neoiface
+#                          Jason McManus <jasonm at neoinformatics.com>
+netuitive       1286/udp    # netuitive 
+netuitive       1286/tcp    # netuitive
+#                          Clayton Wilkinson <cwilkinson at netuitive.com>
+#               1287       Unassigned
+navbuddy        1288/udp    # NavBuddy
+navbuddy        1288/tcp    # NavBuddy
+#                          Eric Hackman <ehackman at millapps.com>
+jwalkserver     1289/udp    # JWalkServer
+jwalkserver     1289/tcp    # JWalkServer
+winjaserver     1290/udp    # WinJaServer  
+winjaserver     1290/tcp    # WinJaServer 
+seagulllms      1291/udp    # SEAGULLLMS
+seagulllms      1291/tcp    # SEAGULLLMS
+#                          Lee Breisacher <lbreisacher at seafullsw.com>
+dsdn            1292/udp    # dsdn
+dsdn            1292/tcp    # dsdn
+#                          Stanislaw Skowronek <thesis at elementary.pl>
+pkt-krb-ipsec   1293/udp    # PKT-KRB-IPSec
+pkt-krb-ipsec   1293/tcp    # PKT-KRB-IPSec
+#                          Nancy Davoust <n.davoust at cablelabs.com>
+cmmdriver       1294/udp    # CMMdriver
+cmmdriver       1294/tcp    # CMMdriver
+#                          Lutz Karras <karras at zeiss.de>
+ehtp            1295/udp    # End-by-Hop Transmission Protocol
+ehtp            1295/tcp    # End-by-Hop Transmission Protocol
+#                          Alexander Bogdanov <alexandr_bgd at softhome.net>  
+dproxy          1296/udp    # dproxy
+dproxy          1296/tcp    # dproxy
+sdproxy         1297/udp    # sdproxy
+sdproxy         1297/tcp    # sdproxy
+#                          Raimond Diederik <rdiederik at descartes.com> 
+lpcp            1298/udp    # lpcp
+lpcp            1298/tcp    # lpcp
+#                          Christian Stredicke <stredicke at snom.de>
+hp-sci          1299/udp    # hp-sci
+hp-sci          1299/tcp    # hp-sci
+#                          Kim Scott <kims at cup.hp.com>       
+h323hostcallsc	1300/udp    # H323 Host Call Secure
+h323hostcallsc	1300/tcp    # H323 Host Call Secure
+#			   Jim Toga <jtoga at ideal.jf.intel.com>
+ci3-software-1  1301/udp    # CI3-Software-1
+ci3-software-1  1301/tcp    # CI3-Software-1
+ci3-software-2  1302/udp    # CI3-Software-2
+ci3-software-2  1302/tcp    # CI3-Software-2
+#                          Kelli Watson <kwatson at ci3software.com>
+sftsrv          1303/udp    # sftsrv
+sftsrv          1303/tcp    # sftsrv
+#                          Robert Frazier <BobF at mrp3.com>
+boomerang       1304/udp    # Boomerang
+boomerang       1304/tcp    # Boomerang
+#                          Bruce Lueckenhoff <brucelu at cisco.com>
+pe-mike         1305/udp    # pe-mike
+pe-mike	        1305/tcp    # pe-mike
+#                          Stephen Hemminger <shemminger at passedge.com>
+re-conn-proto   1306/udp    # RE-Conn-Proto
+re-conn-proto   1306/tcp    # RE-Conn-Proto
+#                          Sandeep Singhal <sandeep at reefedge.com>
+pacmand         1307/udp    # Pacmand
+pacmand         1307/tcp    # Pacmand
+#                          Edward T. O'Shea <oshea at bellsouth.net> 
+odsi            1308/udp    # Optical Domain Service Interconnect (ODSI)
+odsi            1308/tcp    # Optical Domain Service Interconnect (ODSI)
+#                          K. Arvind <arvind at tenornetworks.com> 
+jtag-server     1309/udp    # JTAG server
+jtag-server     1309/tcp    # JTAG server
+#                          Andrew Draper <adraper at altera.com>
+husky		1310/udp    # Husky
+husky		1310/tcp    # Husky
+#			   Mark Zang <mark at zang.com>
+rxmon		1311/udp    # RxMon
+rxmon		1311/tcp    # RxMon
+#			   Javier Jiminez <javier_l_jimenez at dell.com>
+sti-envision	1312/udp    # STI Envision
+sti-envision	1312/tcp    # STI Envision
+#			   Don Stedman <dones at stisystems.com>
+bmc_patroldb    1313/udp    # BMC_PATROLDB
+bmc_patroldb    1313/tcp    # BMC_PATROLDB
+#                          Devon Shows <Devon_Shows at crow.bmc.com>
+pdps            1314/udp    # Photoscript Distributed Printing System
+pdps		1314/tcp    # Photoscript Distributed Printing System
+#			   Les Klein <sgy at cix.compulink.co.uk>
+els		1315/udp    # E.L.S., Event Listener Service
+els		1315/tcp    # E.L.S., Event Listener Service
+#			   Jim Cleppe <clep13 at cfer.com>
+exbit-escp      1316/udp    # Exbit-ESCP
+exbit-escp      1316/tcp    # Exbit-ESCP
+#                          Morten Christensen <mjc at exbit.dk>
+vrts-ipcserver  1317/udp    # vrts-ipcserver
+vrts-ipcserver  1317/tcp    # vrts-ipcserver
+#                          Bruce Hestand <Bruce.Hestand at veritas.com>
+krb5gatekeeper  1318/udp    # krb5gatekeeper
+krb5gatekeeper  1318/tcp    # krb5gatekeeper
+#                          Patrick Moore <pcmoore at sandia.gov> 
+panja-icsp      1319/udp    # Panja-ICSP
+panja-icsp      1319/tcp    # Panja-ICSP
+#                          Ron Barber <ron.barber at panja.com>     
+panja-axbnet	1320/udp    # Panja-AXBNET
+panja-axbnet	1320/tcp    # Panja-AXBNET
+#			   Andrew van Wensen <avanwensen at panja.com>
+pip		1321/udp    # PIP
+pip		1321/tcp    # PIP
+#			   Gordon Mohr <gojomo at usa.net>
+novation        1322/udp    # Novation
+novation        1322/tcp    # Novation
+#                          Alan Dano <wiseobject at yahoo.com>
+brcd            1323/udp    # brcd
+brcd            1323/tcp    # brcd
+#                          Todd Picquelle <todd at convergence.net>
+delta-mcp       1324/udp    # delta-mcp
+delta-mcp       1324/tcp    # delta-mcp
+#                          Quinton Tormanen <quinton at deltacompsys.com> 
+dx-instrument   1325/udp    # DX-Instrument
+dx-instrument   1325/tcp    # DX-Instrument
+#                          Walt Modic <Walt.Modic at dionex.com>
+wimsic          1326/udp    # WIMSIC
+wimsic          1326/tcp    # WIMSIC
+#                          James Brown <ender at admdev.com>
+ultrex          1327/udp    # Ultrex
+ultrex          1327/tcp    # Ultrex
+#                          Tim Walsh <tim at ultrex.com>
+ewall           1328/udp    # EWALL
+ewall           1328/tcp    # EWALL
+#                          Jeff Busma <busma at echogent.com>
+netdb-export    1329/udp    # netdb-export
+netdb-export    1329/tcp    # netdb-export
+#                          Konstantinos Kostis <netdb at kostis.net>
+streetperfect   1330/udp    # StreetPerfect
+streetperfect   1330/tcp    # StreetPerfect
+#                          Michael R. Young <michael.young at tor.sunpub.com> 
+intersan        1331/udp    # intersan
+intersan        1331/tcp    # intersan
+#                          Barry H. Feild <barry at intersan.net> 
+pcia-rxp-b      1332/udp    # PCIA RXP-B
+pcia-rxp-b      1332/tcp    # PCIA RXP-B
+#                          James Dabbs <jdabbs at tga.com>
+passwrd-policy  1333/udp    # Password Policy
+passwrd-policy  1333/tcp    # Password Policy
+#                          Tonio Pirotta <tonio at tpis.com.au> 
+writesrv        1334/udp    # writesrv
+writesrv        1334/tcp    # writesrv
+#                          Marvin Toungate <toungate at austin.ibm.com>   
+digital-notary	1335/udp    # Digital Notary Protocol
+digital-notary	1335/tcp    # Digital Notary Protocol
+#			   Wes Doonan
+ischat          1336/udp    # Instant Service Chat
+ischat	        1336/tcp    # Instant Service Chat
+#                          Mike Clise <mikec at instantservice.com>
+menandmice-dns  1337/udp    # menandmice DNS
+menandmice-dns  1337/tcp    # menandmice DNS
+#                          Sigfus Magnusson <sigfusm at menandmice.com>
+wmc-log-svc     1338/udp    # WMC-log-svr
+wmc-log-svc     1338/tcp    # WMC-log-svr
+#                          Stephen Brosseau <brosseau at workingmachines.com>  
+kjtsiteserver   1339/udp    # kjtsiteserver
+kjtsiteserver   1339/tcp    # kjtsiteserver
+#                          Jason Aubain <jaubain at kjt.com>
+naap            1340/udp    # NAAP
+naap		1340/tcp    # NAAP
+#                          Henry Haverinen <henry.haverinen at nokia.com>	
+qubes		1341/udp    # QuBES
+qubes           1341/tcp    # QuBES
+#                          Eric Grange <egrange at creative-it.net> 
+esbroker	1342/udp    # ESBroker
+esbroker	1342/tcp    # ESBroker
+#                          Alexander Medvinsky <smedvinsky at gi.com>
+re101           1343/udp    # re101
+re101		1343/tcp    # re101
+#                          Doriano Blengino <tecnico at xonelectronics.it>
+icap            1344/udp    # ICAP
+icap		1344/tcp    # ICAP
+#                          Jeremy Elson <jelson at isi.edu>
+vpjp            1345/udp    # VPJP
+vpjp            1345/tcp    # VPJP
+#                          Michael Collins <UBMCollins at aol.com>
+alta-ana-lm     1346/udp    # Alta Analytics License Manager 
+alta-ana-lm     1346/tcp    # Alta Analytics License Manager 
+bbn-mmc		1347/udp    # multi media conferencing
+bbn-mmc		1347/tcp    # multi media conferencing
+bbn-mmx		1348/udp    # multi media conferencing
+bbn-mmx		1348/tcp    # multi media conferencing
+sbook           1349/udp    # Registration Network Protocol       
+sbook           1349/tcp    # Registration Network Protocol       
+editbench       1350/udp    # Registration Network Protocol       
+editbench       1350/tcp    # Registration Network Protocol       
+#                          Simson L. Garfinkel <simsong at next.cambridge.ma.us>
+equationbuilder 1351/udp    # Digital Tool Works (MIT)            
+equationbuilder 1351/tcp    # Digital Tool Works (MIT)            
+#                          Terrence J. Talbot <lexcube!tjt at bu.edu>
+lotusnote       1352/udp    # Lotus Note                          
+lotusnote       1352/tcp    # Lotus Note                          
+#                          Greg Pflaum <iris.com!Greg_Pflaum at uunet.uu.net>
+relief          1353/udp    # Relief Consulting                   
+relief          1353/tcp    # Relief Consulting                   
+#                          John Feiler <relief!jjfeiler at uu2.psi.com>
+rightbrain      1354/udp    # RightBrain Software              
+rightbrain      1354/tcp    # RightBrain Software              
+#                          Glenn Reid <glann at rightbrain.com>
+intuitive-edge  1355/udp    # Intuitive Edge 
+intuitive-edge  1355/tcp    # Intuitive Edge 
+#                          Montgomery Zukowski
+#                          <monty at nextnorth.acs.ohio-state.edu> 
+cuillamartin    1356/udp    # CuillaMartin Company 
+cuillamartin    1356/tcp    # CuillaMartin Company 
+pegboard        1357/udp    # Electronic PegBoard  
+pegboard        1357/tcp    # Electronic PegBoard  
+#                          Chris Cuilla
+#                          <balr!vpnet!cuilla!chris at clout.chi.il.us> 
+connlcli        1358/udp    # CONNLCLI                             
+connlcli        1358/tcp    # CONNLCLI                             
+ftsrv           1359/udp    # FTSRV                                
+ftsrv           1359/tcp    # FTSRV                                
+#                          Ines Homem de Melo <sidinf at brfapesp.bitnet>
+mimer           1360/udp    # MIMER                               
+mimer           1360/tcp    # MIMER                               
+#                          Per Schroeder  <Per.Schroder at mimer.se>
+linx            1361/udp    # LinX                        
+linx            1361/tcp    # LinX                        
+#                          Steffen Schilke <---none--->
+timeflies       1362/udp    # TimeFlies                           
+timeflies       1362/tcp    # TimeFlies                           
+#                          Doug Kent <mouthers at slugg@nwnexus.wa.com>
+ndm-requester   1363/udp    # Network DataMover Requester
+ndm-requester   1363/tcp    # Network DataMover Requester
+ndm-server      1364/udp    # Network DataMover Server   
+ndm-server      1364/tcp    # Network DataMover Server   
+#                          Toshio Watanabe
+#                          <watanabe at godzilla.rsc.spdd.ricoh.co.j> 
+adapt-sna       1365/udp    # Network Software Associates
+adapt-sna       1365/tcp    # Network Software Associates
+#                          Jeffery Chiao <714-768-401>
+netware-csp     1366/udp    # Novell NetWare Comm Service Platform
+netware-csp     1366/tcp    # Novell NetWare Comm Service Platform
+#                          Laurie Lindsey <llindsey at novell.com>
+dcs             1367/udp    # DCS                             
+dcs             1367/tcp    # DCS                             
+#                          Stefan Siebert <ssiebert at dcs.de>
+screencast      1368/udp    # ScreenCast                          
+screencast      1368/tcp    # ScreenCast                          
+#                          Bill Tschumy <other!bill at uunet.UU.NET>
+gv-us           1369/udp    # GlobalView to Unix Shell             
+gv-us           1369/tcp    # GlobalView to Unix Shell             
+us-gv           1370/udp    # Unix Shell to GlobalView             
+us-gv           1370/tcp    # Unix Shell to GlobalView             
+#                          Makoto Mita <mita at ssdev.ksp.fujixerox.co.jp>
+fc-cli          1371/udp    # Fujitsu Config Protocol             
+fc-cli          1371/tcp    # Fujitsu Config Protocol             
+fc-ser          1372/udp    # Fujitsu Config Protocol             
+fc-ser          1372/tcp    # Fujitsu Config Protocol             
+#                          Ryuichi Horie <horie at spad.sysrap.cs.fujitsu.co.jp>
+chromagrafx     1373/udp    # Chromagrafx                         
+chromagrafx     1373/tcp    # Chromagrafx                         
+#                          Mike Barthelemy <msb at chromagrafx.com>
+molly           1374/udp    # EPI Software Systems        
+molly           1374/tcp    # EPI Software Systems        
+#                          Jim Vlcek <jvlcek at veeco.com>
+bytex           1375/udp    # Bytex                             
+bytex           1375/tcp    # Bytex                             
+#                          Mary Ann Burt <bytex!ws054!maryann at uunet.UU.NET>
+ibm-pps         1376/udp    # IBM Person to Person Software     
+ibm-pps         1376/tcp    # IBM Person to Person Software     
+#                          Simon Phipps <sphipps at vnet.ibm.com>
+cichlid         1377/udp    # Cichlid License Manager       
+cichlid         1377/tcp    # Cichlid License Manager       
+#                          Andy Burgess <aab at cichlid.com>
+elan            1378/udp    # Elan License Manager   
+elan            1378/tcp    # Elan License Manager   
+#                          Ken Greer <kg at elan.com>
+dbreporter      1379/udp    # Integrity Solutions                 
+dbreporter      1379/tcp    # Integrity Solutions                 
+#                          Tim Dawson <tdawson%mspboss at uunet.UU.NET>
+telesis-licman  1380/udp    # Telesis Network License Manager     
+telesis-licman  1380/tcp    # Telesis Network License Manager     
+#                          Karl Schendel, Jr. <wiz at telesis.com>
+apple-licman    1381/udp    # Apple Network License Manager 
+apple-licman    1381/tcp    # Apple Network License Manager 
+#                          Earl Wallace <earlw at apple.com>
+udt_os          1382/udp    # udt_os
+udt_os          1382/tcp    # udt_os
+gwha            1383/udp    # GW Hannaway Network License Manager
+gwha            1383/tcp    # GW Hannaway Network License Manager
+#                          J. Gabriel Foster <fop at gwha.com>
+os-licman       1384/udp    # Objective Solutions License Manager 
+os-licman       1384/tcp    # Objective Solutions License Manager 
+#                          Donald Cornwell <don.cornwell at objective.com>
+atex_elmd       1385/udp    # Atex Publishing License Manager
+atex_elmd       1385/tcp    # Atex Publishing License Manager
+#                          Brett Sorenson <bcs at atex.com>
+checksum        1386/udp    # CheckSum License Manager            
+checksum        1386/tcp    # CheckSum License Manager            
+#                          Andreas Glocker <glocker at sirius.com>
+cadsi-lm        1387/udp    # Computer Aided Design Software Inc LM 
+cadsi-lm        1387/tcp    # Computer Aided Design Software Inc LM 
+#                          Sulistio Muljadi <e-mail?>
+objective-dbc   1388/udp    # Objective Solutions DataBase Cache
+objective-dbc   1388/tcp    # Objective Solutions DataBase Cache
+#                          Donald Cornwell <e-mail?>
+iclpv-dm        1389/udp    # Document Manager                    
+iclpv-dm        1389/tcp    # Document Manager                    
+iclpv-sc        1390/udp    # Storage Controller                  
+iclpv-sc        1390/tcp    # Storage Controller                  
+iclpv-sas       1391/udp    # Storage Access Server               
+iclpv-sas       1391/tcp    # Storage Access Server               
+iclpv-pm        1392/udp    # Print Manager                       
+iclpv-pm        1392/tcp    # Print Manager                       
+iclpv-nls       1393/udp    # Network Log Server                  
+iclpv-nls       1393/tcp    # Network Log Server                  
+iclpv-nlc       1394/udp    # Network Log Client                  
+iclpv-nlc       1394/tcp    # Network Log Client                  
+iclpv-wsm       1395/udp    # PC Workstation Manager software     
+iclpv-wsm       1395/tcp    # PC Workstation Manager software     
+#                          A.P. Hobson <A.P.Hobson at bra0112.wins.icl.co.uk>
+dvl-activemail  1396/udp    # DVL Active Mail                     
+dvl-activemail  1396/tcp    # DVL Active Mail                     
+audio-activmail 1397/udp    # Audio Active Mail                   
+audio-activmail 1397/tcp    # Audio Active Mail                   
+video-activmail 1398/udp    # Video Active Mail                   
+video-activmail 1398/tcp    # Video Active Mail                   
+#                          Avshalom Houri <Avshalom at ubique.com>
+cadkey-licman   1399/udp    # Cadkey License Manager         
+cadkey-licman   1399/tcp    # Cadkey License Manager         
+cadkey-tablet   1400/udp    # Cadkey Tablet Daemon           
+cadkey-tablet   1400/tcp    # Cadkey Tablet Daemon           
+#                          Joe McCollough <joe at cadkey.com>
+goldleaf-licman 1401/udp    # Goldleaf License Manager
+goldleaf-licman 1401/tcp    # Goldleaf License Manager
+#                          John Fox <---none--->
+prm-sm-np       1402/udp    # Prospero Resource Manager
+prm-sm-np       1402/tcp    # Prospero Resource Manager
+prm-nm-np       1403/udp    # Prospero Resource Manager
+prm-nm-np       1403/tcp    # Prospero Resource Manager
+#                          B. Clifford Neuman <bcn at isi.edu>
+igi-lm          1404/udp    # Infinite Graphics License Manager
+igi-lm          1404/tcp    # Infinite Graphics License Manager
+ibm-res         1405/udp    # IBM Remote Execution Starter
+ibm-res         1405/tcp    # IBM Remote Execution Starter
+netlabs-lm      1406/udp    # NetLabs License Manager
+netlabs-lm      1406/tcp    # NetLabs License Manager
+dbsa-lm         1407/udp    # DBSA License Manager        
+dbsa-lm         1407/tcp    # DBSA License Manager        
+#                          Scott Shattuck <ss at dbsa.com>
+sophia-lm       1408/udp    # Sophia License Manager              
+sophia-lm       1408/tcp    # Sophia License Manager              
+#                          Eric Brown <sst!emerald!eric at uunet.UU.net>
+here-lm         1409/udp    # Here License Manager             
+here-lm         1409/tcp    # Here License Manager             
+#                          David Ison  <here at dialup.oar.net>
+hiq             1410/udp    # HiQ License Manager               
+hiq             1410/tcp    # HiQ License Manager               
+#                          Rick Pugh <rick at bilmillennium.com>
+af              1411/udp    # AudioFile                  
+af              1411/tcp    # AudioFile                  
+#                          Jim Gettys <jg at crl.dec.com>
+innosys         1412/udp    # InnoSys               
+innosys         1412/tcp    # InnoSys               
+innosys-acl     1413/udp    # Innosys-ACL           
+innosys-acl     1413/tcp    # Innosys-ACL           
+#                          Eric Welch <--none--->
+ibm-mqseries    1414/udp    # IBM MQSeries                        
+ibm-mqseries    1414/tcp    # IBM MQSeries                        
+#                          Roger Meli <rmmeli%winvmd at vnet.ibm.com>
+dbstar          1415/udp    # DBStar                          
+dbstar          1415/tcp    # DBStar                          
+#                          Jeffrey Millman <jcm at dbstar.com>
+novell-lu6.2    1416/udp    # Novell LU6.2         
+novell-lu6.2    1416/tcp    # Novell LU6.2         
+#                          Peter Liu <--none--->
+timbuktu-srv1   1417/udp    # Timbuktu Service 1 Port            
+timbuktu-srv1   1417/tcp    # Timbuktu Service 1 Port            
+timbuktu-srv2   1418/udp    # Timbuktu Service 2 Port            
+timbuktu-srv2   1418/tcp    # Timbuktu Service 2 Port            
+timbuktu-srv3   1419/udp    # Timbuktu Service 3 Port            
+timbuktu-srv3   1419/tcp    # Timbuktu Service 3 Port            
+timbuktu-srv4   1420/udp    # Timbuktu Service 4 Port            
+timbuktu-srv4   1420/tcp    # Timbuktu Service 4 Port            
+#                          Marc Epard <marc at netopia.com>
+gandalf-lm      1421/udp    # Gandalf License Manager
+gandalf-lm      1421/tcp    # Gandalf License Manager
+#                          gilmer at gandalf.ca
+autodesk-lm     1422/udp    # Autodesk License Manager   
+autodesk-lm     1422/tcp    # Autodesk License Manager   
+#                          David Ko <dko at autodesk.com>
+essbase         1423/udp    # Essbase Arbor Software     
+essbase         1423/tcp    # Essbase Arbor Software     
+hybrid          1424/udp    # Hybrid Encryption Protocol  
+hybrid          1424/tcp    # Hybrid Encryption Protocol  
+#                          Howard Hart <hch at hybrid.com>
+zion-lm         1425/udp    # Zion Software License Manager 
+zion-lm         1425/tcp    # Zion Software License Manager 
+#                          David Ferrero <david at zion.com>
+sais            1426/udp    # Satellite-data Acquisition System 1
+sais            1426/tcp    # Satellite-data Acquisition System 1
+#                          Bill Taylor <sais at ssec.wisc.edu>
+mloadd          1427/udp    # mloadd monitoring tool     
+mloadd          1427/tcp    # mloadd monitoring tool     
+#                          Bob Braden <braden at isi.edu>
+informatik-lm   1428/udp    # Informatik License Manager
+informatik-lm   1428/tcp    # Informatik License Manager
+#                          Harald Schlangmann
+#                          <schlangm at informatik.uni-muenchen.de> 
+nms             1429/udp    # Hypercom NMS                      
+nms             1429/tcp    # Hypercom NMS                      
+tpdu            1430/udp    # Hypercom TPDU                     
+tpdu            1430/tcp    # Hypercom TPDU                     
+#                          Noor Chowdhury <noor at hypercom.com>
+rgtp            1431/udp    # Reverse Gossip Transport
+rgtp            1431/tcp    # Reverse Gossip Transport
+#                          Ian Jackson  <iwj at cam-orl.co.uk>
+blueberry-lm    1432/udp    # Blueberry Software License Manager  
+blueberry-lm    1432/tcp    # Blueberry Software License Manager  
+#                          Steve Beigel <ublueb!steve at uunet.uu.net>
+ms-sql-s        1433/udp    # Microsoft-SQL-Server 
+ms-sql-s        1433/tcp    # Microsoft-SQL-Server 
+ms-sql-m        1434/udp    # Microsoft-SQL-Monitor                
+ms-sql-m        1434/tcp    # Microsoft-SQL-Monitor
+#                          Peter Hussey <peterhus at microsoft.com>
+ibm-cics        1435/udp    # IBM CICS
+ibm-cics        1435/tcp    # IBM CICS
+#                          Geoff Meacock <gbibmswl at ibmmail.COM>
+saism           1436/udp    # Satellite-data Acquisition System 2
+saism           1436/tcp    # Satellite-data Acquisition System 2
+#                          Bill Taylor <sais at ssec.wisc.edu>
+tabula          1437/udp    # Tabula
+tabula          1437/tcp    # Tabula
+#                          Marcelo Einhorn
+#                          <KGUNE%HUJIVM1.bitnet at taunivm.tau.ac.il> 
+eicon-server    1438/udp    # Eicon Security Agent/Server         
+eicon-server    1438/tcp    # Eicon Security Agent/Server         
+eicon-x25       1439/udp    # Eicon X25/SNA Gateway               
+eicon-x25       1439/tcp    # Eicon X25/SNA Gateway               
+eicon-slp       1440/udp    # Eicon Service Location Protocol     
+eicon-slp       1440/tcp    # Eicon Service Location Protocol     
+#                          Pat Calhoun <CALHOUN at admin.eicon.qc.ca>
+cadis-1         1441/udp    # Cadis License Management       
+cadis-1         1441/tcp    # Cadis License Management       
+cadis-2         1442/udp    # Cadis License Management       
+cadis-2         1442/tcp    # Cadis License Management       
+#                          Todd Wichers <twichers at csn.org>
+ies-lm          1443/udp    # Integrated Engineering Software     
+ies-lm          1443/tcp    # Integrated Engineering Software     
+#                          David Tong <David_Tong at integrated.mb.ca>
+marcam-lm       1444/udp    # Marcam  License Management    
+marcam-lm       1444/tcp    # Marcam  License Management    
+#                          Therese Hunt <hunt at marcam.com>
+proxima-lm      1445/udp    # Proxima License Manager       
+proxima-lm      1445/tcp    # Proxima License Manager       
+ora-lm          1446/udp    # Optical Research Associates License Manager
+ora-lm          1446/tcp    # Optical Research Associates License Manager
+apri-lm         1447/udp    # Applied Parallel Research LM
+apri-lm         1447/tcp    # Applied Parallel Research LM
+#                          Jim Dillon <jed at apri.com>
+oc-lm           1448/udp    # OpenConnect License Manager
+oc-lm           1448/tcp    # OpenConnect License Manager
+#                          Sue Barnhill <snb at oc.com>
+peport          1449/udp    # PEport                               
+peport          1449/tcp    # PEport                               
+#                          Qentin Neill <quentin at ColumbiaSC.NCR.COM>
+dwf             1450/udp    # Tandem Distributed Workbench Facility 
+dwf             1450/tcp    # Tandem Distributed Workbench Facility 
+#                          Mike Bert <BERG_MIKE at tandem.com>
+infoman         1451/udp    # IBM Information Management
+infoman         1451/tcp    # IBM Information Management
+#                          Karen Burns <---none--->
+gtegsc-lm       1452/udp    # GTE Government Systems License Man   
+gtegsc-lm       1452/tcp    # GTE Government Systems License Man   
+#                          Mike Gregory <Gregory_Mike at msmail.iipo.gtegsc.com>
+genie-lm        1453/udp    # Genie License Manager                
+genie-lm        1453/tcp    # Genie License Manager                
+#                          Paul Applegate <p.applegate2 at genie.geis.com>
+interhdl_elmd   1454/udp    # interHDL License Manager      
+interhdl_elmd   1454/tcp    # interHDL License Manager      
+#                          Eli Sternheim eli at interhdl.com
+esl-lm          1455/udp    # ESL License Manager           
+esl-lm          1455/tcp    # ESL License Manager           
+#                          Abel Chou <abel at willy.esl.com>
+dca             1456/udp    # DCA           
+dca             1456/tcp    # DCA           
+#                          Jeff Garbers <jgarbers at netcom.com>
+valisys-lm      1457/udp    # Valisys License Manager
+valisys-lm      1457/tcp    # Valisys License Manager
+#                          Leslie Lincoln <leslie_lincoln at valisys.com>
+nrcabq-lm       1458/udp    # Nichols Research Corp.
+nrcabq-lm       1458/tcp    # Nichols Research Corp.
+#                          Howard Cole <hcole at tumbleweed.nrcabq.com>
+proshare1       1459/udp    # Proshare Notebook Application
+proshare1       1459/tcp    # Proshare Notebook Application
+proshare2       1460/udp    # Proshare Notebook Application
+proshare2       1460/tcp    # Proshare Notebook Application
+#                          Robin Kar <Robin_Kar at ccm.hf.intel.com>
+ibm_wrless_lan  1461/udp    # IBM Wireless LAN 
+ibm_wrless_lan  1461/tcp    # IBM Wireless LAN 
+#                          <flanne at vnet.IBM.COM>
+world-lm        1462/udp    # World License Manager
+world-lm        1462/tcp    # World License Manager
+#                          Michael S Amirault <ambi at world.std.com>
+nucleus         1463/udp    # Nucleus
+nucleus         1463/tcp    # Nucleus
+#                          Venky Nagar <venky at fafner.Stanford.EDU>
+msl_lmd         1464/udp     # MSL License Manager
+msl_lmd         1464/tcp     # MSL License Manager
+#                           Matt Timmermans
+pipes           1465/udp     # Pipes Platform  mfarlin at peerlogic.com
+pipes           1465/tcp     # Pipes Platform 
+#                           Mark Farlin <mfarlin at peerlogic.com>
+oceansoft-lm    1466/udp     # Ocean Software License Manager
+oceansoft-lm    1466/tcp     # Ocean Software License Manager
+#                           Randy Leonard <randy at oceansoft.com>
+csdmbase        1467/udp     # CSDMBASE  
+csdmbase        1467/tcp     # CSDMBASE  
+csdm            1468/udp     # CSDM      
+csdm            1468/tcp     # CSDM      
+#               Robert Stabl <stabl at informatik.uni-muenchen.de>
+aal-lm          1469/udp     # Active Analysis Limited License Manager
+aal-lm          1469/tcp     # Active Analysis Limited License Manager
+#                           David Snocken  +44 (71)437-7009
+uaiact          1470/udp     # Universal Analytics  
+uaiact          1470/tcp     # Universal Analytics  
+#                           Mark R. Ludwig <Mark-Ludwig at uai.com>
+csdmbase        1471/udp     # csdmbase   
+csdmbase        1471/tcp     # csdmbase   
+csdm            1472/udp     # csdm       
+csdm            1472/tcp     # csdm       
+#               Robert Stabl <stabl at informatik.uni-muenchen.de>
+openmath        1473/udp     # OpenMath   
+openmath        1473/tcp     # OpenMath   
+#                           Garth Mayville <mayville at maplesoft.on.ca>
+telefinder      1474/udp     # Telefinder 
+telefinder      1474/tcp     # Telefinder 
+#                           Jim White <Jim_White at spiderisland.com>
+taligent-lm     1475/udp     # Taligent License Manager  
+taligent-lm     1475/tcp     # Taligent License Manager  
+#               Mark Sapsford <Mark_Sapsford@@taligent.com>
+clvm-cfg        1476/udp     # clvm-cfg  
+clvm-cfg        1476/tcp     # clvm-cfg  
+#                           Eric Soderberg <seric at cup.hp.com>
+ms-sna-server   1477/udp     # ms-sna-server  
+ms-sna-server   1477/tcp     # ms-sna-server  
+ms-sna-base     1478/udp     # ms-sna-base    
+ms-sna-base     1478/tcp     # ms-sna-base    
+#                           Gordon Mangione <gordm at microsoft.com>
+dberegister     1479/udp     # dberegister  
+dberegister     1479/tcp     # dberegister  
+#                           Brian Griswold <brian at dancingbear.com>
+pacerforum      1480/udp     # PacerForum  
+pacerforum      1480/tcp     # PacerForum  
+#                           Peter Caswell <pfc at pacvax.pacersoft.com>
+airs            1481/udp     # AIRS        
+airs            1481/tcp     # AIRS        
+#                           Bruce Wilson, 905-771-6161
+miteksys-lm     1482/udp     # Miteksys License Manager
+miteksys-lm     1482/tcp     # Miteksys License Manager
+#                           Shane McRoberts <mcroberts at miteksys.com>
+afs             1483/udp     # AFS License Manager   
+afs             1483/tcp     # AFS License Manager   
+#                           Michael R. Pizolato <michael at afs.com>
+confluent       1484/udp     # Confluent License Manager 
+confluent       1484/tcp     # Confluent License Manager 
+#                           James Greenfiel <jim at pa.confluent.com>
+lansource       1485/udp     # LANSource 
+lansource       1485/tcp     # LANSource 
+#                           Christopher Wells <Christopher_Wells at 3com.com>
+nms_topo_serv   1486/udp     # nms_topo_serv  
+nms_topo_serv   1486/tcp     # nms_topo_serv  
+#                           Sylvia Siu <Sylvia_Siu at Novell.CO>
+localinfosrvr   1487/udp     # LocalInfoSrvr  
+localinfosrvr   1487/tcp     # LocalInfoSrvr  
+#               Brian Matthews <brian_matthews at ibist.ibis.com>
+docstor         1488/udp     # DocStor  
+docstor         1488/tcp     # DocStor  
+#                           Brian Spears <bspears at salix.com>
+dmdocbroker     1489/udp     # dmdocbroker  
+dmdocbroker     1489/tcp     # dmdocbroker  
+#                           Razmik Abnous <abnous at documentum.com>
+insitu-conf     1490/udp     # insitu-conf  
+insitu-conf     1490/tcp     # insitu-conf  
+#                           Paul Blacknell <paul at insitu.com>
+anynetgateway   1491/udp     # anynetgateway  
+anynetgateway   1491/tcp     # anynetgateway  
+#                           Dan Poirier <poirier at VNET.IBM.COM>
+stone-design-1  1492/udp     # stone-design-1  
+stone-design-1  1492/tcp     # stone-design-1  
+#                           Andrew Stone <andrew at stone.com>
+netmap_lm       1493/udp     # netmap_lm  
+netmap_lm       1493/tcp     # netmap_lm  
+#                           Phillip Magson <philm at extro.ucc.su.OZ.AU>
+ica             1494/udp     # ica   
+ica             1494/tcp     # ica   
+#                           John Richardson, Citrix Systems
+cvc             1495/udp     # cvc  
+cvc             1495/tcp     # cvc  
+#                           Bill Davidson <billd at equalizer.cray.com>
+liberty-lm      1496/udp     # liberty-lm
+liberty-lm      1496/tcp     # liberty-lm
+#                           Jim Rogers <trane!jimbo at pacbell.com>
+rfx-lm          1497/udp     # rfx-lm
+rfx-lm          1497/tcp     # rfx-lm
+#                           Bill Bishop <bil at rfx.rfx.com>
+sybase-sqlany   1498/udp     # Sybase SQL Any
+sybase-sqlany   1498/tcp     # Sybase SQL Any
+#                           Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+fhc             1499/udp     # Federico Heinz Consultora
+fhc             1499/tcp     # Federico Heinz Consultora
+#                           Federico Heinz <federico at heinz.com>
+vlsi-lm         1500/udp     # VLSI License Manager
+vlsi-lm         1500/tcp     # VLSI License Manager
+#                           Shue-Lin Kuo <shuelin at mdk.sanjose.vlsi.com>
+saiscm          1501/udp     # Satellite-data Acquisition System 3 
+saiscm          1501/tcp     # Satellite-data Acquisition System 3 
+#                           Bill Taylor <sais at ssec.wisc.edu>
+shivadiscovery  1502/udp     # Shiva
+shivadiscovery  1502/tcp     # Shiva
+#                           Jonathan Wenocur <jhw at Shiva.COM>
+imtc-mcs        1503/udp     # Databeam
+imtc-mcs        1503/tcp     # Databeam
+#                           Jim Johnston <jjohnston at databeam.com>
+evb-elm         1504/udp     # EVB Software Engineering License Manager
+evb-elm         1504/tcp     # EVB Software Engineering License Manager
+#                           B.G. Mahesh < mahesh at sett.com>
+funkproxy       1505/udp     # Funk Software, Inc.
+funkproxy       1505/tcp     # Funk Software, Inc.
+#                           Robert D. Vincent <bert at willowpond.com>
+utcd            1506/udp     # Universal Time daemon (utcd)
+utcd            1506/tcp     # Universal Time daemon (utcd)
+#                           Walter Poxon <wdp at ironwood.cray.com>
+symplex         1507/udp     # symplex
+symplex         1507/tcp     # symplex
+#                           Mike Turley <turley at symplex.com>
+diagmond        1508/udp     # diagmond
+diagmond        1508/tcp     # diagmond
+#                           Pete Moscatelli <moscat at hprdstl0.rose.hp.com>
+robcad-lm       1509/udp     # Robcad, Ltd. License Manager
+robcad-lm       1509/tcp     # Robcad, Ltd. License Manager
+#                           Hindin Joseph <hindin%robcad at uunet.uu.net>
+mvx-lm          1510/udp     # Midland Valley Exploration Ltd. Lic. Man.
+mvx-lm          1510/tcp     # Midland Valley Exploration Ltd. Lic. Man.
+#                           Neil Salter <neil at indigo2.mvel.demon.co.uk>Laszlo
+3l-l1           1511/udp     # 3l-l1
+3l-l1           1511/tcp     # 3l-l1
+#                           Ian A. Young <iay at threel.co.uk>
+wins            1512/udp     # Microsoft's Windows Internet Name Service
+wins            1512/tcp     # Microsoft's Windows Internet Name Service
+#                           Pradeep Bahl <pradeepb at microsoft.com>
+fujitsu-dtc     1513/udp     # Fujitsu Systems Business of America, Inc
+fujitsu-dtc     1513/tcp     # Fujitsu Systems Business of America, Inc
+fujitsu-dtcns   1514/udp     # Fujitsu Systems Business of America, Inc
+fujitsu-dtcns   1514/tcp     # Fujitsu Systems Business of America, Inc
+#                           Charles A. Higgins <75730.2257 at compuserve.com>
+ifor-protocol   1515/udp     # ifor-protocol
+ifor-protocol   1515/tcp     # ifor-protocol
+#                           Dr. R.P. Alston <robin at gradient.com>
+vpad            1516/udp     # Virtual Places Audio data
+vpad            1516/tcp     # Virtual Places Audio data
+vpac            1517/udp     # Virtual Places Audio control
+vpac            1517/tcp     # Virtual Places Audio control
+vpvd            1518/udp     # Virtual Places Video data
+vpvd            1518/tcp     # Virtual Places Video data
+vpvc            1519/udp     # Virtual Places Video control
+vpvc            1519/tcp     # Virtual Places Video control
+#                           Avshalom Houri <Avshalom at ubique.com>
+atm-zip-office  1520/udp     # atm zip office
+atm-zip-office  1520/tcp     # atm zip office
+#                           Wilson Kwan <wilsonk%toronto at zip.atm.com>
+ncube-lm        1521/udp     # nCube License Manager
+ncube-lm        1521/tcp     # nCube License Manager
+#                           Maxine Yuen <maxine at hq.ncube.com>
+ricardo-lm      1522/udp     # Ricardo North America License Manager
+ricardo-lm      1522/tcp     # Ricardo North America License Manager
+#                           Mike Flemming <mf at xnet.com>
+cichild-lm      1523/udp     # cichild
+cichild-lm      1523/tcp     # cichild
+#                           Andy Burgess <aab at cichlid.com>
+ingreslock	1524/udp     # ingres
+ingreslock	1524/tcp     # ingres
+orasrv          1525/udp     prospero-np # oracle
+orasrv          1525/tcp     prospero-np # oracle
+pdap-np         1526/udp     # Prospero Data Access Prot non-priv 
+pdap-np         1526/tcp     # Prospero Data Access Prot non-priv 
+#                           B. Clifford Neuman <bcn at isi.edu>
+tlisrv          1527/udp     # oracle
+tlisrv          1527/tcp     # oracle
+mciautoreg      1528/udp     # micautoreg
+mciautoreg      1528/tcp     # micautoreg
+#                           John Klensin <klensin at MAIL1.RESTON.MCI.NET>
+coauthor        1529/udp     # oracle
+coauthor        1529/tcp     # oracle
+rap-service     1530/udp     # rap-service
+rap-service     1530/tcp     # rap-service
+rap-listen      1531/udp     # rap-listen
+rap-listen      1531/tcp     # rap-listen
+#                           Phil Servita <meister at ftp.com>
+miroconnect     1532/udp     # miroconnect
+miroconnect     1532/tcp     # miroconnect
+#                           Michael Fischer +49 531 21 13 0
+virtual-places  1533/udp     # Virtual Places Software
+virtual-places  1533/tcp     # Virtual Places Software
+#                           Avshalom Houri <Avshalom at ubique.com> 
+micromuse-lm    1534/udp     # micromuse-lm    
+micromuse-lm    1534/tcp     # micromuse-lm    
+#                           Adam Kerrison <adam at micromuse.co.uk>
+ampr-info       1535/udp     # ampr-info    
+ampr-info       1535/tcp     # ampr-info    
+ampr-inter      1536/udp     # ampr-inter
+ampr-inter      1536/tcp     # ampr-inter
+#                           Rob Janssen <rob at sys3.pe1chl.ampr.org>
+sdsc-lm         1537/udp     # isi-lm
+sdsc-lm         1537/tcp     # isi-lm
+#                           Len Wanger <lrw at sdsc.edu>
+3ds-lm          1538/udp     # 3ds-lm
+3ds-lm          1538/tcp     # 3ds-lm
+#                           Keith Trummel <ktrummel at autodesk.com>
+intellistor-lm  1539/udp     # Intellistor License Manager
+intellistor-lm  1539/tcp     # Intellistor License Manager
+#                           Ron Vaughn <rv at intellistor.com>
+rds             1540/udp     # rds
+rds             1540/tcp     # rds
+rds2            1541/udp     # rds2
+rds2            1541/tcp     # rds2
+#                           Sudhakar Rajamannar <mobius1 at cerfnet.com>
+gridgen-elmd    1542/udp     # gridgen-elmd
+gridgen-elmd    1542/tcp     # gridgen-elmd
+#                           John R. Chawner +1 817 354-1004
+simba-cs        1543/udp     # simba-cs
+simba-cs        1543/tcp     # simba-cs
+#                           Betsy Alexander +1 604-681-4549
+aspeclmd        1544/udp     # aspeclmd
+aspeclmd        1544/tcp     # aspeclmd
+#                           V. Balaji <balaji at aspec.com>
+vistium-share   1545/udp     # vistium-share
+vistium-share   1545/tcp     # vistium-share
+#                           Allison Carleton 
+#                           <acarleto at naper1.napervilleil.ncr.com>
+abbaccuray      1546/udp     # abbaccuray
+abbaccuray      1546/tcp     # abbaccuray
+#                           John Wendt 614-261-2000
+laplink         1547/udp     # laplink
+laplink         1547/tcp     # laplink
+#                           Michael Crawford <MichaelC at dev.travsoft.com>
+axon-lm         1548/udp     # Axon License Manager
+axon-lm         1548/tcp     # Axon License Manager
+#   Mark Pearce <<Mark_A.._Pearce/AXON_Networks_Inc.. at notes.axon.com>
+shivasound      1549/udp     # Shiva Sound
+shivahose       1549/tcp     # Shiva Hose
+#                           Kin Chan <kchan at shiva.com>
+3m-image-lm     1550/udp     # Image Storage license manager 3M Company
+3m-image-lm     1550/tcp     # Image Storage license manager 3M Company
+#                           J. C. Canessa <jccanessa at mmm.com>
+hecmtl-db       1551/udp     # HECMTL-DB
+hecmtl-db       1551/tcp     # HECMTL-DB
+#                           Maxime Belanger <R173 at hec.ca>
+pciarray        1552/udp     # pciarray
+pciarray        1552/tcp     # pciarray
+#                           Ron Folk <rfolkes at avl.com>
+sna-cs          1553/udp     # sna-cs
+sna-cs          1553/tcp     # sna-cs
+#                           Tony Sowter <ts at datcon.co.uk>
+caci-lm         1554/udp     # CACI Products Company License Manager
+caci-lm         1554/tcp     # CACI Products Company License Manager
+#                           Erik Blume <erikb at caciasl.com>
+livelan         1555/udp     # livelan
+livelan         1555/tcp     # livelan
+#                           khedayat at roadrunner.pictel.com <Kaynam Hedayat>
+ashwin          1556/udp     # AshWin CI Tecnologies
+ashwin          1556/tcp     # AshWin CI Tecnologies
+#                           Dave Neal <daven at ashwin.com>
+arbortext-lm    1557/udp     # ArborText License Manager
+arbortext-lm    1557/tcp     # ArborText License Manager
+#                           David J. Wilson <djw at arbortext.com>
+xingmpeg        1558/udp     # xingmpeg
+xingmpeg        1558/tcp     # xingmpeg
+#                           Howard Gordon <hgordon at system.xingtech.com>
+web2host        1559/udp     # web2host
+web2host        1559/tcp     # web2host
+#                           Stephen Johnson <sjohnson at mindspring.com>
+asci-val        1560/udp     # ASCI-RemoteSHADOW
+asci-val        1560/tcp     # ASCI-RemoteSHADOW
+#                           Benjamin Rosenberg <brosenberg at advsyscon.com>
+facilityview    1561/udp     # facilityview
+facilityview    1561/tcp     # facilityview
+#                           Ed Green <egreen at pmeasuring.com>
+pconnectmgr     1562/udp     # pconnectmgr
+pconnectmgr     1562/tcp     # pconnectmgr
+#                           Bob Kaiser <BKaiser at palindrome.com>
+cadabra-lm      1563/udp     # Cadabra License Manager
+cadabra-lm      1563/tcp     # Cadabra License Manager
+#                           Arthur Castonguay <arthurc at doe.carleton.ca>
+pay-per-view    1564/udp     # Pay-Per-View
+pay-per-view    1564/tcp     # Pay-Per-View
+#                           Brian Tung <brian at isi.edu>
+winddlb         1565/udp     # WinDD
+winddlb         1565/tcp     # WinDD
+#                           Kelly Sims <kellys at garnet.wv.tek.com>
+corelvideo      1566/udp     # CORELVIDEO
+corelvideo      1566/tcp     # CORELVIDEO
+#                           Ming Poon <mingp at corel.ca>
+jlicelmd        1567/udp     # jlicelmd
+jlicelmd        1567/tcp     # jlicelmd
+#                           Christian Schormann <100410.3063 at compuserve.com>
+tsspmap         1568/udp     # tsspmap
+tsspmap         1568/tcp     # tsspmap
+#                           Paul W. Nelson <nelson at thursby.com>
+ets             1569/udp     # ets
+ets             1569/tcp     # ets
+#                           Carstein Seeberg <case at boole.no> 
+orbixd          1570/udp     # orbixd
+orbixd          1570/tcp     # orbixd
+#                           Bridget Walsh <bwalsh at iona.ie>
+rdb-dbs-disp    1571/udp     # Oracle Remote Data Base
+rdb-dbs-disp    1571/tcp     # Oracle Remote Data Base
+#                           <mackin at us.oracle.com>
+chip-lm         1572/udp     # Chipcom License Manager
+chip-lm         1572/tcp     # Chipcom License Manager
+#                           Jerry Natowitz <Jerry Natowitz>
+itscomm-ns      1573/udp     # itscomm-ns
+itscomm-ns      1573/tcp     # itscomm-ns
+#                           Rich Thompson <richt at watson.ibm.com>
+mvel-lm         1574/udp     # mvel-lm
+mvel-lm         1574/tcp     # mvel-lm
+#                           David Bisset <dbisset at mvel.demon.co.uk>
+oraclenames     1575/udp     # oraclenames
+oraclenames     1575/tcp     # oraclenames
+#                           P.V.Shivkumar <PSHIVKUM at us.oracle.com>
+moldflow-lm     1576/udp     # moldflow-lm
+moldflow-lm     1576/tcp     # moldflow-lm
+#                           Paul Browne <browne at moldflow.com.au>
+hypercube-lm    1577/udp     # hypercube-lm
+hypercube-lm    1577/tcp     # hypercube-lm
+#                           Christopher McLendon <cem at hyper.com>
+jacobus-lm      1578/udp     # Jacobus License Manager
+jacobus-lm      1578/tcp     # Jacobus License Manager
+#                           Tony Cleveland <tony.cleveland at jacobus.com>
+ioc-sea-lm      1579/udp     # ioc-sea-lm
+ioc-sea-lm      1579/tcp     # ioc-sea-lm
+#                           Paul Nelson <paul at ioc-sea.com>
+tn-tl-r2        1580/udp     # tn-tl-r2
+tn-tl-r1        1580/tcp     # tn-tl-r1
+#                           Ed Kress <eskress at thinknet.com>
+mil-2045-47001  1581/udp     # MIL-2045-47001
+mil-2045-47001  1581/tcp     # MIL-2045-47001
+#                           Eric Whitehill <eawhiteh at itt.com>
+msims           1582/udp     # MSIMS
+msims           1582/tcp     # MSIMS
+#                           Glenn Olander <gjo at msi.com>
+simbaexpress    1583/udp     # simbaexpress
+simbaexpress    1583/tcp     # simbaexpress
+#                           Betsy Alexander +1 604-681-4549
+tn-tl-fd2       1584/udp     # tn-tl-fd2
+tn-tl-fd2       1584/tcp     # tn-tl-fd2
+#                           Ed Kress <eskress at thinknet.com>
+intv            1585/udp     # intv
+intv            1585/tcp     # intv
+#                           Dermot Tynand <dtynan at claddagh.ie>
+ibm-abtact      1586/udp     # ibm-abtact
+ibm-abtact      1586/tcp     # ibm-abtact
+#                           Sandeep K. Singhal <singhal at CS.Stanford.EDU>
+pra_elmd        1587/udp     # pra_elmd
+pra_elmd        1587/tcp     # pra_elmd
+#                           Dennis Mastin <dennis at tasmania.platte.com>
+triquest-lm     1588/udp     # triquest-lm 
+triquest-lm     1588/tcp     # triquest-lm 
+#                           Nand Kumar <nkumar at triquest-da.com>
+vqp             1589/udp     # VQP
+vqp             1589/tcp     # VQP
+#                           Keith McCloghrie <kzm at cisco.com>
+gemini-lm       1590/udp     # gemini-lm
+gemini-lm       1590/tcp     # gemini-lm
+#                           Tony Sawyer <tonys at gemtech.com>
+ncpm-pm         1591/udp     # ncpm-pm
+ncpm-pm         1591/tcp     # ncpm-pm
+#                           Ted Power <tedp at hpinpcb.cup.hp.com>
+commonspace     1592/udp     # commonspace
+commonspace     1592/tcp     # commonspace
+#                           Rob Chandhok <chandhok at within.com>
+mainsoft-lm     1593/udp     # mainsoft-lm
+mainsoft-lm     1593/tcp     # mainsoft-lm
+#                           Anand Gangadharan <anand at goa.mainsoft.com>
+sixtrak         1594/udp     # sixtrak
+sixtrak         1594/tcp     # sixtrak
+#                           Bob Rennie <rjrennie at wizvax.net>
+radio           1595/udp     # radio
+radio           1595/tcp     # radio
+radio-bc        1596/udp     # radio-bc
+radio-sm        1596/tcp     # radio-sm
+#                           Ken Chapman <kchapman at isis.com>
+orbplus-iiop    1597/udp     # orbplus-iiop
+orbplus-iiop    1597/tcp     # orbplus-iiop
+#                           Robert A. Kukura <kukura at apollo.hp.com>
+picknfs         1598/udp     # picknfs
+picknfs         1598/tcp     # picknfs
+#                           John Lombardo <johnl at picksys.com>
+simbaservices   1599/udp     # simbaservices
+simbaservices   1599/tcp     # simbaservices
+#                           Betsy Alexander +1 604-681-4549
+issd		1600/udp # 
+issd		1600/tcp # 
+aas             1601/udp    # aas
+aas             1601/tcp    # aas
+#                          Bob Beard <bobb at lachman.com>
+inspect         1602/udp    # inspect
+inspect         1602/tcp    # inspect
+#                          Frank O'Neill <frank at morse.ilo.dec.com>
+picodbc         1603/udp    # pickodbc
+picodbc         1603/tcp    # pickodbc
+#                          John Lombardo <johnl at picksys.com>
+icabrowser      1604/udp    # icabrowser
+icabrowser      1604/tcp    # icabrowser
+#                          Brad Pedersen <bradp at citrix.com>       
+slp             1605/udp    # Salutation Manager (Salutation Protocol)
+slp             1605/tcp    # Salutation Manager (Salutation Protocol)
+slm-api         1606/udp    # Salutation Manager (SLM-API)
+slm-api         1606/tcp    # Salutation Manager (SLM-API)
+#                          Tohru Mori <tmori at VNET.IBM.COM>       
+stt             1607/udp    # stt
+stt             1607/tcp    # stt
+#                          Ryan Bolz <ryanbo at microsoft.com>
+smart-lm        1608/udp    # Smart Corp. License Manager
+smart-lm        1608/tcp    # Smart Corp. License Manager
+#                          Connie Qiu <connie at scdb.com>
+isysg-lm        1609/udp    # isysg-lm
+isysg-lm        1609/tcp    # isysg-lm
+#                          Adam Curtin <adam.curtin at isysg.com>
+taurus-wh       1610/udp    # taurus-wh
+taurus-wh       1610/tcp    # taurus-wh
+#                          Jeff Moffatt <jeff at taurus.com>
+ill             1611/udp    # Inter Library Loan
+ill             1611/tcp    # Inter Library Loan
+#                          Niall Murphy <niallm at orca.ucd.ie>
+netbill-trans   1612/udp    # NetBill Transaction Server
+netbill-trans   1612/tcp    # NetBill Transaction Server
+netbill-keyrep  1613/udp    # NetBill Key Repository
+netbill-keyrep  1613/tcp    # NetBill Key Repository
+netbill-cred    1614/udp    # NetBill Credential Server
+netbill-cred    1614/tcp    # NetBill Credential Server
+netbill-auth    1615/udp    # NetBill Authorization Server
+netbill-auth    1615/tcp    # NetBill Authorization Server
+netbill-prod    1616/udp    # NetBill Product Server
+netbill-prod    1616/tcp    # NetBill Product Server
+#                          Marvin Sirbu <sirbu+ at andrew.cmu.edu>
+nimrod-agent    1617/udp    # Nimrod Inter-Agent Communication
+nimrod-agent    1617/tcp    # Nimrod Inter-Agent Communication
+#                          Charles Lynn <clynn at bbn.com>
+skytelnet       1618/udp    # skytelnet
+skytelnet       1618/tcp    # skytelnet
+#                          Byron Jones <byronj at bellsouth.net>
+xs-openstorage  1619/udp   # xs-openstorage
+xs-openstorage  1619/tcp   # xs-openstorage
+#                         XuiS Software Ltd. <100322.2376 at compuserve.com>
+faxportwinport  1620/udp   # faxportwinport
+faxportwinport  1620/tcp   # faxportwinport
+#                         Chris Wells <chris_wells at lansource.com>
+softdataphone   1621/udp   # softdataphone
+softdataphone   1621/tcp   # softdataphone
+#                         Dror Gill <drorgi at VNET.IBM.COM>n
+ontime          1622/udp   # ontime
+ontime          1622/tcp   # ontime
+#                         Keith Rhodes 810-559-5955
+jaleosnd        1623/udp   # jaleosnd
+jaleosnd        1623/tcp   # jaleosnd
+#                         Christian Schormann <100410.3063 at compuserve.com>
+udp-sr-port     1624/udp   # udp-sr-port
+udp-sr-port     1624/tcp   # udp-sr-port
+#                         Herb Jensen <HWJensen at nfsrv.avionics.itt.com>
+svs-omagent     1625/udp   # svs-omagent
+svs-omagent     1625/tcp   # svs-omagent
+#                         Alberto Berlen <aberlen at VNET.IBM.COM>
+shockwave	1626/udp   # Shockwave
+shockwave	1626/tcp   # Shockwave
+#			  Sarah Allen <sallen at macromedia.com>
+t128-gateway	1627/udp   # T.128 Gateway
+t128-gateway	1627/tcp   # T.128 Gateway
+#			  Phil May <pm at datcon.co.uk>
+lontalk-norm	1628/udp   # LonTalk normal
+lontalk-norm	1628/tcp   # LonTalk normal
+lontalk-urgnt	1629/udp   # LonTalk urgent
+lontalk-urgnt	1629/tcp   # LonTalk urgent
+#			  Dan Wing <dwing at cisco.com>
+oraclenet8cman	1630/udp   # Oracle Net8 Cman
+oraclenet8cman	1630/tcp   # Oracle Net8 Cman
+#			  Tong-Ming Lee <tmlee at us.oracle.com>
+visitview	1631/udp   # Visit view 	
+visitview	1631/tcp   # Visit view 	
+#			  Tom Whittaker <tomw at ssec.wisc.edu>
+pammratc	1632/udp   # PAMMRATC
+pammratc	1632/tcp   # PAMMRATC
+pammrpc		1633/udp   # PAMMRPC
+pammrpc		1633/tcp   # PAMMRPC
+#			  John Britton <johnb at peakaudio.com>
+loaprobe	1634/udp   # Log On America Probe
+loaprobe	1634/tcp   # Log On America Probe
+#			  James Tavares, Log On America <krontor at loa.com> 
+edb-server1     1635/udp   # EDB Server 1
+edb-server1     1635/tcp   # EDB Server 1
+#                         Carlos Portela <cportela at simple-sw.com>
+cncp            1636/udp   # CableNet Control Protocol
+cncp            1636/tcp   # CableNet Control Protocol
+cnap            1637/udp   # CableNet Admin Protocol
+cnap            1637/tcp   # CableNet Admin Protocol
+cnip            1638/udp   # CableNet Info Protocol
+cnip            1638/tcp   # CableNet Info Protocol
+#                         Damian Hamill <damian at cablenet.net>
+cert-initiator  1639/udp   # cert-initiator
+cert-initiator  1639/tcp   # cert-initiator
+cert-responder  1640/udp   # cert-responder
+cert-responder  1640/tcp   # cert-responder
+#                         Tom Markson <markson at osmosys.incog.com>
+invision        1641/udp   # InVision
+invision        1641/tcp   # InVision
+#                         Christopher Davey <niallocl at quay.ie>
+isis-am         1642/udp   # isis-am
+isis-am         1642/tcp   # isis-am
+isis-ambc       1643/udp   # isis-ambc
+isis-ambc       1643/tcp   # isis-ambc
+#                         Ken Chapman <kchapman at isis.com>
+saiseh          1644/tcp   # Satellite-data Acquisition System 4
+#                         Bill Taylor <sais at ssec.wisc.edu>
+sightline       1645/udp   # SightLine  
+sightline       1645/tcp   # SightLine   
+#                         Stuart J. Newman <stuart.newman at fortel.com>
+sa-msg-port     1646/udp   # sa-msg-port
+sa-msg-port     1646/tcp   # sa-msg-port
+#                         Eric Whitehill <eawhiteh at itt.com>
+rsap            1647/udp   # rsap
+rsap            1647/tcp   # rsap
+#                         Holger Reif 
+#                         <Holger.Reif at prakinf.tu-ilmenau.de> 
+concurrent-lm   1648/udp   # concurrent-lm
+concurrent-lm   1648/tcp   # concurrent-lm
+#                         Maggie Brinsford <mjb at concurrent.co.uk>
+kermit          1649/udp   # kermit 
+kermit          1649/tcp   # kermit
+#                         Frank da Cruz <fdc at watsun.cc.columbia.edu>
+nkd		1650/udp   # nkd
+nkd		1650/tcp   # nkdn
+shiva_confsrvr  1651/udp   # shiva_confsrvr
+shiva_confsrvr  1651/tcp   # shiva_confsrvr
+#                         Mike Horowitz <mah at Shiva.COM>
+xnmp            1652/udp   # xnmp
+xnmp            1652/tcp   # xnmp
+#                         Ali Saleh <scomm at cerf.net>
+alphatech-lm    1653/udp   # alphatech-lm
+alphatech-lm    1653/tcp   # alphatech-lm
+#                         Joseph Hauk <joseph.hauk at alphatech.com>
+stargatealerts  1654/udp   # stargatealerts
+stargatealerts  1654/tcp   # stargatealerts
+#                         Tim Coppernoll
+#                         <Tim_Coppernoll at ccm.jf.intel.com>
+dec-mbadmin     1655/udp   # dec-mbadmin
+dec-mbadmin     1655/tcp   # dec-mbadmin
+dec-mbadmin-h   1656/udp   # dec-mbadmin-h
+dec-mbadmin-h   1656/tcp   # dec-mbadmin-h
+#                         Nick Shipman <Nick.Shipman at mrmog.reo.dec.com>
+fujitsu-mmpdc   1657/udp   # fujitsu-mmpdc
+fujitsu-mmpdc   1657/tcp   # fujitsu-mmpdc
+#                         Katsumi Oomuro <NAE01421 at niftyserve.or.jp>
+sixnetudr       1658/udp   # sixnetudr
+sixnetudr       1658/tcp   # sixnetudr
+#                         Bob Rennie <rjrennie at wizvax.net>
+sg-lm           1659/udp   # Silicon Grail License Manager
+sg-lm           1659/tcp   # Silicon Grail License Manager
+#                         William R Bishop <wrb at world.std.com>
+skip-mc-gikreq  1660/udp   # skip-mc-gikreq
+skip-mc-gikreq  1660/tcp   # skip-mc-gikreq
+#                         Tom Markson <markson at osmosys.incog.com>
+netview-aix-1   1661/udp   # netview-aix-1
+netview-aix-1   1661/tcp   # netview-aix-1
+netview-aix-2   1662/udp   # netview-aix-2
+netview-aix-2   1662/tcp   # netview-aix-2
+netview-aix-3   1663/udp   # netview-aix-3
+netview-aix-3   1663/tcp   # netview-aix-3
+netview-aix-4   1664/udp   # netview-aix-4
+netview-aix-4   1664/tcp   # netview-aix-4
+netview-aix-5   1665/udp   # netview-aix-5
+netview-aix-5   1665/tcp   # netview-aix-5
+netview-aix-6   1666/udp   # netview-aix-6
+netview-aix-6   1666/tcp   # netview-aix-6
+netview-aix-7   1667/udp   # netview-aix-7
+netview-aix-7   1667/tcp   # netview-aix-7
+netview-aix-8   1668/udp   # netview-aix-8
+netview-aix-8   1668/tcp   # netview-aix-8
+netview-aix-9   1669/udp   # netview-aix-9
+netview-aix-9   1669/tcp   # netview-aix-9
+netview-aix-10  1670/udp   # netview-aix-10
+netview-aix-10  1670/tcp   # netview-aix-10
+netview-aix-11  1671/udp   # netview-aix-11
+netview-aix-11  1671/tcp   # netview-aix-11
+netview-aix-12  1672/udp   # netview-aix-12
+netview-aix-12  1672/tcp   # netview-aix-12
+#                         Martha Crisson 
+#                         <CRISSON at ralvm12.vnet.ibm.com>
+proshare-mc-1   1673/udp   # Intel Proshare Multicast
+proshare-mc-1   1673/tcp   # Intel Proshare Multicast
+proshare-mc-2   1674/udp   # Intel Proshare Multicast
+proshare-mc-2   1674/tcp   # Intel Proshare Multicast
+#                         Mark Lewis <Mark_Lewis at ccm.jf.intel.com>
+pdp             1675/udp   # Pacific Data Products
+pdp             1675/tcp   # Pacific Data Products
+#                         Gary Morton <mortong at pacdata.com>
+netcomm2        1676/udp   # netcomm2
+netcomm1        1676/tcp   # netcomm1
+#                         Bulent Kasman <BKasman at symantec.com>
+groupwise       1677/udp   # groupwise
+groupwise       1677/tcp   # groupwise
+#                         Brent Bradshaw <bbradshaw at novell.com>
+prolink         1678/udp   # prolink
+prolink         1678/tcp   # prolink
+#                         Brian Abramson <brianab at soul.tv.tek.com>
+darcorp-lm      1679/udp   # darcorp-lm
+darcorp-lm      1679/tcp   # darcorp-lm
+#                         <DARcorp at aol.com>
+microcom-sbp    1680/udp   # microcom-sbp	
+microcom-sbp    1680/tcp   # microcom-sbp	
+#                         Boris B. Maiden <Boris_Maiden at smtp.microcom.com> 
+sd-elmd         1681/udp   # sd-elmd
+sd-elmd         1681/tcp   # sd-elmd
+#                         Bryan Otey <bwo at softdesk.com>
+lanyon-lantern  1682/udp   # lanyon-lantern
+lanyon-lantern  1682/tcp   # lanyon-lantern
+#                         Robin Lewis <robin.lewis at lanyon.com>
+ncpm-hip        1683/udp   # ncpm-hip
+ncpm-hip        1683/tcp   # ncpm-hip
+#                         Ken Hearn <hearn at hpindacx.cup.hp.com>
+snaresecure     1684/udp   # SnareSecure
+snaresecure     1684/tcp   # SnareSecure
+#                         Marty Batchelder <marty at capres.com>
+n2nremote       1685/udp   # n2nremote
+n2nremote       1685/tcp   # n2nremote
+#                         Kin Chan <kchan at net2net.com>
+cvmon           1686/udp   # cvmon
+cvmon           1686/tcp   # cvmon
+#                         Carol Ann Krug <carolann at hpmfas3.cup.hp.com>
+nsjtp-ctrl      1687/udp     # nsjtp-ctrl
+nsjtp-ctrl      1687/tcp     # nsjtp-ctrl
+nsjtp-data      1688/udp     # nsjtp-data
+nsjtp-data      1688/tcp     # nsjtp-data
+#                           Orazio Granato <og at wsbgrd01.italy.hp.com>
+firefox         1689/udp     # firefox
+firefox         1689/tcp     # firefox
+#                           Mark S. Edwards <marke at firefox.co.uk>
+ng-umds         1690/udp     # ng-umds
+ng-umds         1690/tcp     # ng-umds
+#                           Louis E. Simard <76400.3371 at compuserve.com>
+empire-empuma   1691/udp     # empire-empuma
+empire-empuma   1691/tcp     # empire-empuma
+#                           Bobby Krupczak <rdk at empiretech.com>
+sstsys-lm       1692/udp     # sstsys-lm
+sstsys-lm       1692/tcp     # sstsys-lm
+#                           Yih-Wu Wang <sstsys at ix.netcom.com>
+rrirtr          1693/udp     # rrirtr
+rrirtr          1693/tcp     # rrirtr
+rrimwm          1694/udp     # rrimwm
+rrimwm          1694/tcp     # rrimwm
+rrilwm          1695/udp     # rrilwm
+rrilwm          1695/tcp     # rrilwm
+rrifmm          1696/udp     # rrifmm
+rrifmm          1696/tcp     # rrifmm
+rrisat          1697/udp     # rrisat
+rrisat          1697/tcp     # rrisat
+#                           Allen Briggs <briggs at access.rrinc.com>
+rsvp-encap-1    1698/udp     # RSVP-ENCAPSULATION-1
+rsvp-encap-1    1698/tcp     # RSVP-ENCAPSULATION-1
+rsvp-encap-2    1699/udp     # RSVP-ENCAPSULATION-2
+rsvp-encap-2    1699/tcp     # RSVP-ENCAPSULATION-2
+#                           Bob Braden <braden at isi.edu>
+mps-raft        1700/udp     # mps-raft
+mps-raft        1700/tcp     # mps-raft
+#                           Jason Leupen <Jleupen at aol.com>
+l2f             1701/udp     l2tp # l2f
+l2f             1701/tcp     l2tp # l2f
+#                           Andy Valencia <vandys at vandys-lap.cisco.com>
+deskshare       1702/udp     # deskshare
+deskshare       1702/tcp     # deskshare
+#                           Sarah Thompson <sarah at telergy.com
+hb-engine       1703/udp     # hb-engine
+hb-engine       1703/tcp     # hb-engine
+#                           Charles C.L. Chou >cchou at zoom.com>
+bcs-broker      1704/udp     # bcs-broker
+bcs-broker      1704/tcp     # bcs-broker
+#                           Andy Warner <andyw at knoware.nl>
+slingshot       1705/udp     # slingshot
+slingshot       1705/tcp     # slingshot
+#                           Paul Groarke <paulg at quay.ie>
+jetform         1706/udp     # jetform
+jetform         1706/tcp     # jetform
+#                           gdeinsta <gdeinsta at jetform.com>
+vdmplay         1707/udp     # vdmplay
+vdmplay         1707/tcp     # vdmplay
+#                           Vadim Lebedev <vadim at magic.fr>
+gat-lmd         1708/udp     # gat-lmd
+gat-lmd         1708/tcp     # gat-lmd
+#                           Igor Zaoutine <igor at global-tech.com>
+centra          1709/udp     # centra
+centra          1709/tcp     # centra
+#                           Drew Wolff <dwolff at centra.net>
+impera          1710/udp     # impera
+impera          1710/tcp     # impera
+#                           Stepehen Campbell <campbell at uniprise.com>
+pptconference   1711/udp     # pptconference
+pptconference   1711/tcp     # pptconference
+#                           John Tafoya <johnt at microsoft.com>
+registrar       1712/udp     # resource monitoring service
+registrar       1712/tcp     # resource monitoring service
+#                           Ron Lawson <ronaldl at hpindacx.cup.hp.com>
+conferencetalk  1713/udp     # ConferenceTalk
+conferencetalk  1713/tcp     # ConferenceTalk
+#                           George Kajos <gkajos at mail1.videoserver.com>
+sesi-lm         1714/udp     # sesi-lm
+sesi-lm         1714/tcp     # sesi-lm
+houdini-lm      1715/udp     # houdini-lm
+houdini-lm      1715/tcp     # houdini-lm
+#                           Paul Breslin <phb at SIDEFX.COM>
+xmsg            1716/udp     # xmsg
+xmsg            1716/tcp     # xmsg
+#                           Mark E. Fogle <mefogle at xantel.com>
+fj-hdnet        1717/udp     # fj-hdnet
+fj-hdnet        1717/tcp     # fj-hdnet
+#                           Manabu Makino <m-makino at ael.fujitsu.co.jp>
+h323gatedisc    1718/udp     # h323gatedisc
+h323gatedisc    1718/tcp     # h323gatedisc
+h323gatestat    1719/udp     # h323gatestat 
+h323gatestat    1719/tcp     # h323gatestat 
+h323hostcall    1720/udp     # h323hostcall
+h323hostcall    1720/tcp     # h323hostcall
+#                           Jim Toga <jtoga at ibeam.jf.intel.com>
+caicci          1721/udp     # caicci
+caicci          1721/tcp     # caicci
+#                           Sylvia Scheuren <schsy02 at cai.com>
+hks-lm          1722/udp     # HKS License Manager
+hks-lm          1722/tcp     # HKS License Manager
+#                           Michael Wood <wood at althea.hks.com>
+pptp            1723/udp     # pptp
+pptp            1723/tcp     # pptp
+#                           Ken Crocker <kcrocker at microsoft.com>
+csbphonemaster  1724/udp     # csbphonemaster
+csbphonemaster  1724/tcp     # csbphonemaster
+#                           Mark Kellerhuis <Mark_Kellerhuis at msn.com>
+iden-ralp       1725/udp     # iden-ralp
+iden-ralp       1725/tcp     # iden-ralp
+#                           Chris Stanaway <stanaway at comm.mot.com>
+iberiagames     1726/udp     # IBERIAGAMES
+iberiagames     1726/tcp     # IBERIAGAMES
+#                           Jose Luis <73374.313 at compuserve.com>
+winddx          1727/udp     # winddx
+winddx          1727/tcp     # winddx
+#                           Bill Andrews <billa at vnd.tek.com>
+telindus        1728/udp     # TELINDUS
+telindus        1728/tcp     # TELINDUS
+#                           Paul Pyck <papy at telindus.be
+citynl          1729/udp     # CityNL License Management
+citynl          1729/tcp     # CityNL License Management
+#                           CityDisc >citydisc at euronet.nl>
+roketz          1730/udp     # roketz
+roketz          1730/tcp     # roketz
+#                           Ahti Heinla <ahti at ahti.bluemoon.ee>
+msiccp          1731/udp     # MSICCP
+msiccp          1731/tcp     # MSICCP
+#                           Max Morris <maxm at MICROSOFT.com>
+proxim          1732/udp     # proxim
+proxim          1732/tcp     # proxim
+#                           Srinivas N. Mogalapalli <srinivas at proxim.com>
+siipat          1733/udp     # SIMS - SIIPAT Protocol for Alarm Transmission
+siipat          1733/tcp     # SIMS - SIIPAT Protocol for Alarm Transmission
+#                           Steve Ryckman <sryckman at simsware.com>
+cambertx-lm     1734/udp     # Camber Corporation License Management
+cambertx-lm     1734/tcp     # Camber Corporation License Management
+#                           Jeannie Burleson <jeannie at cambertx.com>
+privatechat     1735/udp     # PrivateChat
+privatechat     1735/tcp     # PrivateChat
+#                           Louis E. Simard <76400.3371 at CompuServe.COM>
+street-stream   1736/udp     # street-stream
+street-stream   1736/tcp     # street-stream
+#                           Glenn Levitt <streetd1 at ix.netcom.com>
+ultimad         1737/udp     # ultimad
+ultimad         1737/tcp     # ultimad
+#                           (Michael Lanzetta <hagbard at ultimatech.com>
+gamegen1        1738/udp     # GameGen1
+gamegen1        1738/tcp     # GameGen1
+#                           Glen Pearson <GlenP at multigen.com>
+webaccess       1739/udp     # webaccess
+webaccess       1739/tcp     # webaccess
+#                           Christian Saether <ChristianS at asymetrix.com>
+encore          1740/udp     # encore
+encore          1740/tcp     # encore
+#                           Stuart Button <button at promis.com>
+cisco-net-mgmt  1741/udp     # cisco-net-mgmt
+cisco-net-mgmt  1741/tcp     # cisco-net-mgmt
+#                           John McCormack <jmac at cisco.com>
+3Com-nsd        1742/udp     # 3Com-nsd
+3Com-nsd        1742/tcp     # 3Com-nsd
+#                           Nitza Steinberg <nitza at isd.3com.com>
+cinegrfx-lm     1743/udp     # Cinema Graphics License Manager
+cinegrfx-lm     1743/tcp     # Cinema Graphics License Manager
+#                           Rodney Iwashina <rodney at cyclone.rfx.com>
+ncpm-ft         1744/udp     # ncpm-ft
+ncpm-ft         1744/tcp     # ncpm-ft
+#                           Ken Hearn <hearn at hpindacx.cup.hp.com>
+remote-winsock  1745/udp     # remote-winsock
+remote-winsock  1745/tcp     # remote-winsock
+#                           Avi Nathan <avin at microsoft.com>
+ftrapid-1       1746/udp     # ftrapid-1
+ftrapid-1       1746/tcp     # ftrapid-1
+ftrapid-2       1747/udp     # ftrapid-2
+ftrapid-2       1747/tcp     # ftrapid-2
+#                           Richard J. Williams <RJW1 at trpo4.tr.unisys.com>
+oracle-em1      1748/udp     # oracle-em1
+oracle-em1      1748/tcp     # oracle-em1
+#                           Bob Purvy <bpurvy at us.oracle.com>
+aspen-services  1749/udp     # aspen-services
+aspen-services  1749/tcp     # aspen-services
+#                           Mark B. Hurst <mhurst at aspenres.com>
+sslp            1750/udp     # Simple Socket Library's PortMaster
+sslp            1750/tcp     # Simple Socket Library's PortMaster
+#                           Dr. Charles E. Campbell Jr.
+#                           <cec at gryphon.gsfc.nasa.gov> 
+swiftnet        1751/udp     # SwiftNet
+swiftnet        1751/tcp     # SwiftNet
+#                           Terry Lim <tkl at pentek.com>
+lofr-lm         1752/udp     # Leap of Faith Research License Manager 
+lofr-lm         1752/tcp     # Leap of Faith Research License Manager 
+#                           
+translogic-lm   1753/udp     # Translogic License Manager
+translogic-lm   1753/tcp     # Translogic License Manager
+#                           Stan Dallas <stan at translogic.com>
+oracle-em2      1754/udp     # oracle-em2
+oracle-em2      1754/tcp     # oracle-em2
+#                           Bob Purvy <bpurvy at us.oracle.com>
+ms-streaming    1755/udp     # ms-streaming
+ms-streaming    1755/tcp     # ms-streaming
+#                           Bret O'Rourke
+capfast-lmd     1756/udp     # capfast-lmd
+capfast-lmd     1756/tcp     # capfast-lmd
+#                           Chuck Neal <chuck at phase3.com>
+cnhrp           1757/udp     # cnhrp
+cnhrp           1757/tcp     # cnhrp
+#                           William Stoye <wstoye at atml.co.uk>
+tftp-mcast      1758/udp     # tftp-mcast
+tftp-mcast      1758/tcp     # tftp-mcast
+#                           Tom Emberson <tom at lanworks.com>
+spss-lm         1759/udp     # SPSS License Manager
+spss-lm         1759/tcp     # SPSS License Manager
+#                           Tex Hull <tex at spss.com>
+www-ldap-gw     1760/udp     # www-ldap-gw
+www-ldap-gw     1760/tcp     # www-ldap-gw
+#                           Nick Emery <Nick.Emery at altavista.digital.com>
+cft-0           1761/udp     # cft-0
+cft-0           1761/tcp     # cft-0
+cft-1           1762/udp     # cft-1
+cft-1           1762/tcp     # cft-1
+cft-2           1763/udp     # cft-2
+cft-2           1763/tcp     # cft-2
+cft-3           1764/udp     # cft-3
+cft-3           1764/tcp     # cft-3
+cft-4           1765/udp     # cft-4
+cft-4           1765/tcp     # cft-4
+cft-5           1766/udp     # cft-5
+cft-5           1766/tcp     # cft-5
+cft-6           1767/udp     # cft-6
+cft-6           1767/tcp     # cft-6
+cft-7           1768/udp     # cft-7
+cft-7           1768/tcp     # cft-7
+#                           Martine Marchand 16 1 46 59 24 84
+bmc-net-adm     1769/udp     # bmc-net-adm
+bmc-net-adm     1769/tcp     # bmc-net-adm
+#                           Cameron Haight <cameron_haight at bmc.com>
+bmc-net-svc     1770/udp     # bmc-net-svc
+bmc-net-svc     1770/tcp     # bmc-net-svc
+#                           Cameron Haight <cameron_haight at bmc.com>bmc-net-svc
+vaultbase       1771/udp     # vaultbase
+vaultbase       1771/tcp     # vaultbase
+#                           Jose A. Sesin <sesin at vaultbase.com>
+essweb-gw       1772/udp     # EssWeb Gateway
+essweb-gw       1772/tcp     # EssWeb Gateway
+#                           Bob Nattenberg <bnattenberg at arborsoft.com>
+kmscontrol      1773/udp     # KMSControl
+kmscontrol      1773/tcp     # KMSControl
+#                           Roy Chastain <roy at kmsys.com>
+global-dtserv   1774/udp     # global-dtserv
+global-dtserv   1774/tcp     # global-dtserv
+#                           Nicholas Davies <N.Davies at globalcomm.co.uk>
+#               1775/tcp
+femis           1776/udp     # Federal Emergency Management Information System
+femis           1776/tcp     # Federal Emergency Management Information System
+#                           Larry Gerhardstein <lh_gerhardstein at pnl.gov>
+powerguardian   1777/udp     # powerguardian
+powerguardian   1777/tcp     # powerguardian
+#                           Charles Bennett <chuck at benatong.com>
+prodigy-intrnet	1778/udp     # prodigy-internet
+prodigy-intrnet	1778/tcp     # prodigy-internet
+#                           Bob Dedrick <bob at staff.prodigy.com>
+pharmasoft      1779/udp     # pharmasoft
+pharmasoft      1779/tcp     # pharmasoft
+#                           Ola Strandberg <Ola.Strandberg at pharmasoft.se>
+dpkeyserv       1780/udp     # dpkeyserv
+dpkeyserv       1780/tcp     # dpkeyserv
+#                           Yasunari Gon Yamasita <yamasita at omronsoft.co.jp>
+answersoft-lm   1781/udp     # answersoft-lm 
+answersoft-lm   1781/tcp     # answersoft-lm
+#                           James A. Brewster <jimbrew at answersoft.com>
+hp-hcip         1782/udp     # hp-hcip
+hp-hcip         1782/tcp     # hp-hcip
+#                           Allen Baker <abaker at boi.hp.com>
+#               1783        Decomissioned Port 04/14/00, ms    
+#                           <naonao at kikaku.mmp.fujitsu.co.jp> 
+finle-lm        1784/udp     # Finle License Manager
+finle-lm        1784/tcp     # Finle License Manager
+#                           Dongling Wang <dongling at finle.com>
+windlm          1785/udp     # Wind River Systems License Manager
+windlm          1785/tcp     # Wind River Systems License Manager
+#                           Will Dere <will at wrs.com>
+funk-logger     1786/udp     # funk-logger
+funk-logger     1786/tcp     # funk-logger
+funk-license    1787/udp     # funk-license
+funk-license    1787/tcp     # funk-license
+#                           Cimarron Boozer <cboozer at funk.com>
+#                           Eric Wilde <eric at funk.com>
+psmond          1788/udp     # psmond
+psmond          1788/tcp     # psmond
+#                           Will Golson <golson at fc.hp.com>
+hello           1789/udp     # hello
+hello           1789/tcp     # hello
+#                           D. J. Bernstein <djb at koobera.math.uic.edu>       
+nmsp            1790/udp     # Narrative Media Streaming Protocol
+nmsp            1790/tcp     # Narrative Media Streaming Protocol
+#                           Paul Santinelli, Jr. <psantinelli at narrative.com>
+ea1             1791/udp     # EA1
+ea1             1791/tcp     # EA1
+#                           Kirk MacLean <kmaclean at ea.com>
+ibm-dt-2        1792/udp     # ibm-dt-2
+ibm-dt-2        1792/tcp     # ibm-dt-2
+#                           Sam Borman <sam_borman at uk.ibm.com>
+rsc-robot       1793/udp     # rsc-robot
+rsc-robot       1793/tcp     # rsc-robot
+#                           Andrew Jay Schneider <ajs at relsoft.com>
+cera-bcm        1794/udp     # cera-bcm
+cera-bcm        1794/tcp     # cera-bcm
+#                           Leo Moesgaard <leo_moesgaard at dk.ibm.com>
+dpi-proxy       1795/udp     # dpi-proxy
+dpi-proxy       1795/tcp     # dpi-proxy
+#                           Charles Gordon <cgordon at digprod.com>
+vocaltec-admin  1796/udp     # Vocaltec Server Administration
+vocaltec-admin  1796/tcp     # Vocaltec Server Administration
+#                           Scott Petrack <Scott_Petrack at vocaltec.com>
+uma             1797/udp     # UMA
+uma             1797/tcp     # UMA 
+#                           Martin Kirk <m.kirk at opengroup.org>
+etp             1798/udp     # Event Transfer Protocol
+etp             1798/tcp     # Event Transfer Protocol
+#                           Mike Wray <mjw at hplb.hpl.hp.com>
+netrisk		1799/udp     # NETRISK
+netrisk		1799/tcp     # NETRISK
+#			    Kevin Green <Kevin_Green at tds.com>
+ansys-lm	1800/udp     # ANSYS-License manager
+ansys-lm	1800/tcp     # ANSYS-License manager
+#			    Suzanne Lorrin <sml at ansyspo.ansys.com>
+msmq		1801/udp     # Microsoft Message Que
+msmq		1801/tcp     # Microsoft Message Que
+#			    Amnon Horowitz <amnonh at MICROSOFT.com>
+concomp1	1802/udp     # ConComp1
+concomp1	1802/tcp     # ConComp1
+#			    Ed Vincent <@edv at concomp.com>
+hp-hcip-gwy	1803/udp     # HP-HCIP-GWY
+hp-hcip-gwy	1803/tcp     # HP-HCIP-GWY
+#			    Allen Baker <abaker at boi.hp.com>
+enl		1804/udp     # ENL
+enl		1804/tcp     # ENL
+#			    Brian Olson <BOlson at veritas.com>
+enl-name	1805/udp     # ENL-Name
+enl-name	1805/tcp     # ENL-Name
+#			    Brian Olson <BOlson at veritas.com>
+musiconline	1806/udp     # Musiconline
+musiconline	1806/tcp     # Musiconline
+#			    Craig Weeks <cweeks at syspace.co.uk>
+fhsp		1807/udp     # Fujitsu Hot Standby Protocol
+fhsp		1807/tcp     # Fujitsu Hot Standby Protocol
+#			    Eiki Iwata (eiki at nd.net.fujitsu.co.jp>
+oracle-vp2	1808/udp     # Oracle-VP2
+oracle-vp2	1808/tcp     # Oracle-VP2
+#                           Craig Fowler <cfowler at us.oracle.com>
+oracle-vp1	1809/udp     # Oracle-VP1
+oracle-vp1      1809/tcp     # Oracle-VP1
+#                           Craig Fowler <cfowler at us.oracle.com>
+jerand-lm	1810/udp     # Jerand License Manager
+jerand-lm       1810/tcp     # Jerand License Manager
+#                           Robert Monat <jerand at jerand.com>
+scientia-sdb	1811/udp     # Scientia-SDB
+scientia-sdb    1811/tcp     # Scientia-SDB
+#                           Ian Miller <Ian_Miller at scientia.com>
+radius          1812/udp     # RADIUS
+radius          1812/tcp     # RADIUS
+#                           Carl Rigney <cdr at livingston.com>
+radius-acct     1813/udp     # RADIUS Accounting
+radius-acct     1813/tcp     # RADIUS Accounting
+#                           Carl Rigney <cdr at livingston.com>
+tdp-suite       1814/udp     # TDP Suite
+tdp-suite       1814/tcp     # TDP Suite
+#                           Rob Lockhart <rob.lockhart at mot.com>
+mmpft		1815/udp     # MMPFT
+mmpft		1815/tcp     # MMPFT
+#			    Ralf Muckenhirn <FAX: 49-7622-398200>
+#                           <Phone: 49-7622-3980>
+harp		1816/udp     # HARP
+harp		1816/tcp     # HARP
+#			    Bjorn Chambless <bjorn at cs.pdx.edu>
+rkb-oscs	1817/udp     # RKB-OSCS
+rkb-oscs	1817/tcp     # RKB-OSCS
+#			    Robert Kevin Breton <BOBBRETON at HOTMAIL.COM>
+etftp           1818/udp     # Enhanced Trivial File Transfer Protocol
+etftp           1818/tcp     # Enhanced Trivial File Transfer Protocol
+#                           William Polites <wpolites at mitre.org>
+plato-lm        1819/udp     # Plato License Manager
+plato-lm        1819/tcp     # Plato License Manager
+#                           Mark Morris <mim at ermuk.com>
+mcagent         1820/udp     # mcagent
+mcagent         1820/tcp     # mcagent
+#                           Ryoichi Shinohara <shinohara at VNET.IBM.COM>
+donnyworld      1821/udp     # donnyworld
+donnyworld      1821/tcp     # donnyworld
+#                           Don Oliver <don at donnyworld.com>
+es-elmd         1822/udp     # es-elmd
+es-elmd         1822/tcp     # es-elmd
+#                           David Duncan <dduncan at es.com>
+unisys-lm       1823/udp     # Unisys Natural Language License Manager
+unisys-lm       1823/tcp     # Unisys Natural Language License Manager
+#                           Raymond A. Diedrichs <rayd at slu.tr.unisys.com>
+metrics-pas     1824/udp     # metrics-pas
+metrics-pas     1824/tcp     # metrics-pas
+#                           Tom Haapanen <tomh at metrics.com>
+direcpc-video	1825/udp     # DirecPC Video
+direcpc-video	1825/tcp     # DirecPC Video
+#			    Chris Kerrigan <ckerrigan at hns.com>    
+ardt		1826/udp     # ARDT
+ardt		1826/tcp     # ARDT
+#			    Mike Goddard <mike.goddard at ardent.com.au>
+asi		1827/udp     # ASI 
+asi		1827/tcp     # ASI 
+#			    Bob Tournoux <bob.tournoux at usiny.mail.abb.com>
+itm-mcell-u	1828/udp     # itm-mcell-u
+itm-mcell-u	1828/tcp     # itm-mcell-u
+#			    Miles O'Neal <meo at us.itmasters.com>
+optika-emedia	1829/udp     # Optika eMedia 
+optika-emedia	1829/tcp     # Optika eMedia 
+#			    Daryle DeBalski <ddebalski at optika.com>
+net8-cman	1830/udp     # Oracle Net8 CMan Admin
+net8-cman	1830/tcp     # Oracle Net8 CMan Admin
+#			    Shuvayu Kanjilal
+myrtle		1831/udp     # Myrtle
+myrtle		1831/tcp     # Myrtle
+#			    Ron Achin <RAchin at genscan.com>
+tht-treasure	1832/udp     # ThoughtTreasure
+tht-treasure	1832/tcp     # ThoughtTreasure
+#			    Erik Mueller <erik at signiform.com>
+udpradio	1833/udp     # udpradio
+udpradio	1833/tcp     # udpradio
+#			    Guus Sliepen <guus at warande3094.warande.uu.nl>
+ardusuni	1834/udp     # ARDUS Unicast
+ardusuni	1834/tcp     # ARDUS Unicast
+ardusmul	1835/udp     # ARDUS Multicast
+ardusmul	1835/tcp     # ARDUS Multicast
+#			    Toshikatsu Ito <ito-t at pfu.co.jp>
+ste-smsc	1836/udp     # ste-smsc
+ste-smsc	1836/tcp     # ste-smsc
+#			    Tom Snauwaert <tom.snauwaert at st-electronics.be>
+csoft1		1837/udp     # csoft1
+csoft1		1837/tcp     # csoft1
+#			    John Coll <john at csoft.co.uk> 
+talnet		1838/udp     # TALNET
+talnet		1838/tcp     # TALNET
+#			    Aaron Lav <aaron at taltrade.com>
+netopia-vo1	1839/udp     # netopia-vo1
+netopia-vo1	1839/tcp     # netopia-vo1
+netopia-vo2	1840/udp     # netopia-vo2
+netopia-vo2	1840/tcp     # netopia-vo2
+netopia-vo3	1841/udp     # netopia-vo3
+netopia-vo3	1841/tcp     # netopia-vo3
+netopia-vo4	1842/udp     # netopia-vo4
+netopia-vo4	1842/tcp     # netopia-vo4
+netopia-vo5	1843/udp     # netopia-vo5
+netopia-vo5	1843/tcp     # netopia-vo5
+#			    Marc Epard <marc at netopia.com>
+direcpc-dll	1844/udp     # DirecPC-DLL
+direcpc-dll	1844/tcp     # DirecPC-DLL
+#			    Chris Kerrigan <ckerrigan at hns.com>
+altalink        1845/udp     # altalink
+altalink        1845/tcp     # altalink
+#                           Alberto Raydan <alberto at altasol.com>
+tunstall-pnc    1846/udp     # Tunstall PNC
+tunstall-pnc    1846/tcp     # Tunstall PNC
+#                           Robert M. Moore <r_moore at tunstall.co.uk>
+slp-notify      1847/udp     # SLP Notification
+slp-notify      1847/tcp     # SLP Notification
+#                           James Kempf <james.kempf at sun.com> 
+fjdocdist       1848/udp     # fjdocdist
+fjdocdist       1848/tcp     # fjdocdist
+#                           Yuichi Ohiwa <y-ohiwa at ael.fujitsu.co.jp>
+alpha-sms       1849/udp     # ALPHA-SMS
+alpha-sms       1849/tcp     # ALPHA-SMS
+#                           Benjamin Grimm <bg at webnetix.de> 
+gsi		1850/udp     # GSI
+gsi		1850/tcp     # GSI
+#			    William Mullaney <mullanwi at usa.net>
+ctcd		1851/udp     # ctcd
+ctcd		1851/tcp     # ctcd
+#			    John Ryan <john at cybertrace.com>
+virtual-time    1852/udp     # Virtual Time
+virtual-time    1852/tcp     # Virtual Time
+#                           Angie S. Morner <webmaster at dsbcpas.com>
+vids-avtp       1853/udp     # VIDS-AVTP
+vids-avtp       1853/tcp     # VIDS-AVTP
+#                           Sascha Kuemmel <kuemmel at vidsoft.de>
+buddy-draw      1854/udp     # Buddy Draw
+buddy-draw      1854/tcp     # Buddy Draw
+#                           Marvin Shin <president at medialingo.com>  
+fiorano-rtrsvc  1855/udp     # Fiorano RtrSvc
+fiorano-rtrsvc  1855/tcp     # Fiorano RtrSvc
+fiorano-msgsvc  1856/udp     # Fiorano MsgSvc
+fiorano-msgsvc  1856/tcp     # Fiorano MsgSvc
+#                           Albert Holt <alberth at fiorano.com> 
+datacaptor      1857/udp     # DataCaptor
+datacaptor      1857/tcp     # DataCaptor
+#                           Steven M. Forrester <StevenF at CapsuleTech.com>
+privateark      1858/udp     # PrivateArk
+privateark      1858/tcp     # PrivateArk
+#                           Ronen Zoran <ronenz at cyber-ark.com>  
+gammafetchsvr   1859/udp     # Gamma Fetcher Server
+gammafetchsvr   1859/tcp     # Gamma Fetcher Server
+#                           Cnaan Aviv <cnaan at gammasite.com>     
+sunscalar-svc	1860/udp     # SunSCALAR Services
+sunscalar-svc	1860/tcp     # SunSCALAR Services
+#			    Sanjay Radia <srradia at kasumbi.Eng.Sun.COM>
+lecroy-vicp	1861/udp     # LeCroy VICP
+lecroy-vicp	1861/tcp     # LeCroy VICP
+#			    Anthony Cake <anthonyrc at lecroy.com>
+techra-server	1862/udp     # techra-server
+techra-server	1862/tcp     # techra-server
+#			    Roy Lyseng <roy.lyseng at maxware.no>
+msnp		1863/udp     # MSNP
+msnp		1863/tcp     # MSNP
+#			    William Lai <wlai at microsoft.com>
+paradym-31port	1864/udp     # Paradym 31 Port
+paradym-31port	1864/tcp     # Paradym 31 Port
+#			    David Wooden <dwooden at wizdom.com>
+entp		1865/udp     # ENTP
+entp		1865/tcp     # ENTP
+#			    Seiko Epson <Ishida.Hitoshi at exc.epson.co.jp>
+swrmi           1866/udp     # swrmi
+swrmi           1866/tcp     # swrmi
+#                           Jun Yoshii <yoshii at ael.fujitsu.co.jp> 
+udrive          1867/udp     # UDRIVE
+udrive          1867/tcp     # UDRIVE
+#                           Robby Walker <webmaster at cd-lab.com>
+viziblebrowser  1868/udp     # VizibleBrowser
+viziblebrowser  1868/tcp     # VizibleBrowser
+#                           Jimmy Talbot <jtalbot at vizible.com> 
+yestrader       1869/udp     # YesTrader
+yestrader       1869/tcp     # YesTrader
+#                           Robert Bryan <bbryan at yestrader.com> 
+sunscalar-dns	1870/udp     # SunSCALAR DNS Service
+sunscalar-dns   1870/tcp     # SunSCALAR DNS Service
+#                           Sanjay Radia <srradia at kasumbi.Eng.Sun.COM>
+canocentral0	1871/udp     # Cano Central 0
+canocentral0	1871/tcp     # Cano Central 0
+canocentral1	1872/udp     # Cano Central 1
+canocentral1	1872/tcp     # Cano Central 1
+#			    Mark McNamara <markm at research.canon.com.au>
+fjmpjps		1873/udp     # Fjmpjps
+fjmpjps		1873/tcp     # Fjmpjps
+fjswapsnp	1874/udp     # Fjswapsnp
+fjswapsnp	1874/tcp     # Fjswapsnp
+#			    Y. Ohiwa <y-ohiwa at ael.fujitsu.co.jp>
+westell-stats   1875/udp     # westell stats
+westell-stats   1875/tcp     # westell stats
+#                           Thomas McCabe <tmcca at westell.com>
+ewcappsrv       1876/udp     # ewcappsrv
+ewcappsrv       1876/tcp     # ewcappsrv
+#                           Howard Yin <howard.yin at ericsson.com>
+hp-webqosdb     1877/udp     # hp-webqosdb
+hp-webqosdb     1877/tcp     # hp-webqosdb
+#                           Kim Scott <kims at cup.hp.com>
+drmsmc          1878/udp     # drmsmc
+drmsmc          1878/tcp     # drmsmc
+#                           Katsuhiko Abe <kabe at hst.fujitsu.co.jp>
+nettgain-nms    1879/udp     # NettGain NMS
+nettgain-nms    1879/tcp     # NettGain NMS
+#                           Dr. Yair Shapira <yair at flashnetworks.com>
+vsat-control    1880/udp     # Gilat VSAT Control
+vsat-control    1880/tcp     # Gilat VSAT Control
+#                           Yariv Kaplan <yarivk at gilat.com> 
+ibm-mqseries2	1881/udp     # IBM WebSphere MQ
+ibm-mqseries2	1881/tcp     # IBM WebSphere MQ
+#                           Richard Maxwell <richard_maxwell at uk.ibm.com>
+ecsqdmn         1882/udp     # ecsqdmn
+ecsqdmn         1882/tcp     # ecsqdmn
+#                           Paul Wissmiller <Paul.Wissmiller at ca.com>
+ibm-mqisdp      1883/udp     # IBM MQSeries SCADA
+ibm-mqisdp      1883/tcp     # IBM MQSeries SCADA
+#                           Andy Stanford-Clark <andysc at uk.ibm.com>
+idmaps          1884/udp     # Internet Distance Map Svc
+idmaps          1884/tcp     # Internet Distance Map Svc
+#                           Sugih Jamim <jamin at eecs.umich.edu> 
+vrtstrapserver  1885/udp     # Veritas Trap Server
+vrtstrapserver  1885/tcp     # Veritas Trap Server
+#                           Russell Thrasher <rthrashe at veritas.com>
+leoip           1886/udp     # Leonardo over IP
+leoip           1886/tcp     # Leonardo over IP
+#                           Dietmar Finkler <d.finkler at hermstedt.de>
+filex-lport     1887/udp     # FileX Listening Port
+filex-lport     1887/tcp     # FileX Listening Port
+#                           Megan Woods <meganwoods at datafast.net.au>
+ncconfig        1888/udp     # NC Config Port
+ncconfig        1888/tcp     # NC Config Port
+#                           Simon Parker <simon.j.parker at philips.com>
+unify-adapter   1889/udp     # Unify Web Adapter Service
+unify-adapter   1889/tcp     # Unify Web Adapter Service
+#                           Duane Gibson <ianaportmaster at unify.com>
+wilkenlistener  1890/udp     # wilkenListener
+wilkenlistener  1890/tcp     # wilkenListener
+#                           Wilken GmbH <fy at wilken.de> 
+childkey-notif  1891/udp     # ChildKey Notification
+childkey-notif	1891/tcp     # ChildKey Notification
+childkey-ctrl   1892/udp     # ChildKey Control 	
+childkey-ctrl   1892/tcp     # ChildKey Control
+#                           Ivan Berardinelli <ivan at gestweb.com>
+elad            1893/udp     # ELAD Protocol
+elad            1893/tcp     # ELAD Protocol
+#                           Franco Milan <franco at eladit.com>
+o2server-port   1894/udp     # O2Server Port
+o2server-port	1894/tcp     # O2Server Port
+#                           Tim Howard <timothygh at hotmail.com> 	
+#####  Microsoft (unoffically) using 1895     #####  
+b-novative-ls   1896/udp     # b-novative license server
+b-novative-ls   1896/tcp     # b-novative license server
+#                           Matthias Riese <Matthias.Riese at b-novative.de>
+metaagent       1897/udp     # MetaAgent
+metaagent       1897/tcp     # MetaAgent
+#                           Stephane Vinsot <vinsot at enatel.com>
+cymtec-port     1898/udp     # Cymtec secure management
+cymtec-port	1898/tcp     # Cymtec secure management
+#                           Michael Mester <mmester at cymtec.com>
+mc2studios	1899/udp     # MC2Studios
+mc2studios	1899/tcp     # MC2Studios
+#			    Michael Coon <michael at thecube.com>	
+ssdp		1900/udp     # SSDP
+ssdp		1900/tcp     # SSDP
+#			    Yaron Goland <yarong at microsoft.com>
+fjicl-tep-a     1901/udp     # Fujitsu ICL Terminal Emulator Program A
+fjicl-tep-a     1901/tcp     # Fujitsu ICL Terminal Emulator Program A
+#                           Bob Lyon <bl at oasis.icl.co.uk>
+fjicl-tep-b     1902/udp     # Fujitsu ICL Terminal Emulator Program B
+fjicl-tep-b     1902/tcp     # Fujitsu ICL Terminal Emulator Program B
+#                           Bob Lyon <bl at oasis.icl.co.uk>
+linkname        1903/udp     # Local Link Name Resolution
+linkname        1903/tcp     # Local Link Name Resolution
+#                           Dan Harrington <dth at lucent.com>
+fjicl-tep-c     1904/udp     # Fujitsu ICL Terminal Emulator Program C
+fjicl-tep-c     1904/tcp     # Fujitsu ICL Terminal Emulator Program C
+#                           Bob Lyon <bl at oasis.icl.co.uk>
+sugp            1905/udp     # Secure UP.Link Gateway Protocol
+sugp   		1905/tcp     # Secure UP.Link Gateway Protocol
+#			    Peter King <king at uplanet.com>
+tpmd		1906/udp     # TPortMapperReq
+tpmd		1906/tcp     # TPortMapperReq
+# 			    Sheila Devins <sheila_devins at VNET.IBM.COM>
+intrastar	1907/udp     # IntraSTAR
+intrastar	1907/tcp     # IntraSTAR
+#			    Peter Schoenberger <ps at teles.de>
+dawn		1908/udp     # Dawn
+dawn		1908/tcp     # Dawn
+#			    Michael Crawford <michaelc at travsoft.com>
+global-wlink	1909/udp     # Global World Link
+global-wlink	1909/tcp     # Global World Link
+#			    Nicholas Davies <N.Davies at globalcomm.co.uk>
+ultrabac        1910/udp     # UltraBac Software communications port
+ultrabac        1910/tcp     # UltraBac Software communications port
+#                           Paul Bunn <iana at ultrabac.com>	
+mtp             1911/udp     # Starlight Networks Multimedia Transport Protocol
+mtp             1911/tcp     # Starlight Networks Multimedia Transport Protocol
+#                           Bruce Lieberman <brucel at iserver.starlight.com>
+rhp-iibp	1912/udp     # rhp-iibp	
+rhp-iibp	1912/tcp     # rhp-iibp	
+#			    George Nachman
+#                           Tom Lake <tlake at m-ware.com>
+armadp          1913/udp     # armadp
+armadp          1913/tcp     # armadp
+#                           Kevin Welton <Kevin.Welton at armltd.co.uk>
+elm-momentum    1914/udp     # Elm-Momentum
+elm-momentum    1914/tcp     # Elm-Momentum
+#                           Willie Wu <willie at mds.com>
+facelink        1915/udp     # FACELINK
+facelink        1915/tcp     # FACELINK
+#                           J.H. Hermans <j.h.hermans at hiscom.nl>
+persona         1916/udp     # Persoft Persona
+persona         1916/tcp     # Persoft Persona
+#                           Tom Spidell <spidell at persoft.com>
+noagent		1917/udp     # nOAgent
+noagent		1917/tcp     # nOAgent
+#			    Martin Bestmann <martin at datawatch.de>
+can-nds		1918/udp     # Candle Directory Service - NDS
+can-nds   	1918/tcp     # Candle Directory Service - NDS    
+can-dch   	1919/udp     # Candle Directory Service - DCH
+can-dch		1919/tcp     # Candle Directory Service - DCH
+can-ferret	1920/udp     # Candle Directory Service - FERRET
+can-ferret	1920/tcp     # Candle Directory Service - FERRET
+#			    Dannis Yang <Dannis_Yang at candle.com>
+noadmin		1921/udp     # NoAdmin
+noadmin		1921/tcp     # NoAdmin
+#			    Martin Bestmann <martin at datawatch.de>
+tapestry	1922/udp     # Tapestry	
+tapestry	1922/tcp     # Tapestry	
+#			    Ken Oliver <koliver at anritsu.com>
+spice		1923/udp     # SPICE
+spice		1923/tcp     # SPICE
+#			    Nicholas Chua <nick at sendit.se>
+xiip		1924/udp     # XIIP
+xiip		1924/tcp     # XIIP
+#			    Alain Robert <Alain.Robert at HMRinc.com>	
+discovery-port  1925/udp     # Surrogate Discovery Port
+discovery-port  1925/tcp     # Surrogate Discovery Port
+#                           Keith Thompson <keith.thompson at sun.com>
+egs             1926/udp     # Evolution Game Server
+egs             1926/tcp     # Evolution Game Server
+#                           Simon Butcher <simonb at alien.net.au>
+videte-cipc     1927/udp     # Videte CIPC Port
+videte-cipc     1927/tcp     # Videte CIPC Port
+#                           Videte IT <info at videte.com>
+emsd-port       1928/udp     # Expnd Maui Srvr Dscovr
+emsd-port       1928/tcp     # Expnd Maui Srvr Dscovr
+#                           Edo Yahav <standards at expand.com>
+bandwiz-system  1929/udp     # Bandwiz System - Server
+bandwiz-system  1929/tcp     # Bandwiz System - Server
+#                           Joseph Weihs <yossi at bandwiz.com>
+driveappserver	1930/udp     # Drive AppServer
+driveappserver	1930/tcp     # Drive AppServer
+#			    Andrew Johnson
+#			    <andrew.johnson at bliss-support.demon.co.uk>
+amdsched	1931/udp     # AMD SCHED
+amdsched	1931/tcp     # AMD SCHED
+#			    Michael Walsh <mww at warwick.net>
+ctt-broker      1932/udp     # CTT Broker
+ctt-broker      1932/tcp     # CTT Broker
+#                           Jens Edlund <edlund at speech.kth.se>
+xmapi           1933/udp     # IBM LM MT Agent
+xmapi		1933/tcp     # IBM LM MT Agent
+xaapi           1934/udp     # IBM LM Appl Agent
+xaapi           1934/tcp     # IBM LM Appl Agent
+#                           Helga Wolin <hwolin at us.ibm.com>
+macromedia-fcs  1935/udp     # Macromedia Flash Communications server MX
+macromedia-fcs  1935/tcp     # Macromedia Flash Communications Server MX
+#                           Pritham Shetty <pritham at macromedia.com> 
+jetcmeserver    1936/udp     # JetCmeServer Server Port
+jetcmeserver    1936/tcp     # JetCmeServer Server Port
+jwserver        1937/udp     # JetVWay Server Port
+jwserver        1937/tcp     # JetVWay Server Port
+jwclient        1938/udp     # JetVWay Client Port
+jwclient        1938/tcp     # JetVWay Client Port
+jvserver        1939/udp     # JetVision Server Port
+jvserver        1939/tcp     # JetVision Server Port
+jvclient        1940/udp     # JetVision Client Port
+jvclient        1940/tcp     # JetVision Client Port
+#                           Stephen Tsun <stsun at jetstream.com>
+dic-aida        1941/udp     # DIC-Aida
+dic-aida        1941/tcp     # DIC-Aida
+#                           Frans S.C. Witte <fscwitte at dicgroep.nl> 
+res             1942/udp     # Real Enterprise Service
+res             1942/tcp     # Real Enterprise Service
+#                           Bob Janssen <bob at res.nl>
+beeyond-media   1943/udp     # Beeyond Media
+beeyond-media   1943/tcp     # Beeyond Media
+#                           Bob Deblier <bob at virtualunlimited.com>
+close-combat    1944/udp     # close-combat
+close-combat    1944/tcp     # close-combat
+#                           David Hua <davhua at microsoft.com>
+dialogic-elmd   1945/udp     # dialogic-elmd
+dialogic-elmd   1945/tcp     # dialogic-elmd
+#                           Roger Kay <r.kay at nz.dialogic.com>
+tekpls          1946/udp     # tekpls
+tekpls          1946/tcp     # tekpls
+#                           Brian Abramson <brianab at vnd.tek.com>
+hlserver        1947/udp     # hlserver
+hlserver        1947/tcp     # hlserver
+#                           Michael Zzunke <mzunke at fast-ag.de>
+eye2eye         1948/udp     # eye2eye
+eye2eye         1948/tcp     # eye2eye
+#                           Trevor Bell <Trevor at iguana.iosoftware.com>
+ismaeasdaqlive  1949/udp     # ISMA Easdaq Live
+ismaeasdaqlive  1949/tcp     # ISMA Easdaq Live
+ismaeasdaqtest  1950/udp     # ISMA Easdaq Test
+ismaeasdaqtest  1950/tcp     # ISMA Easdaq Test
+#                           Stephen Dunne <sdun at isma.co.uk>
+bcs-lmserver    1951/udp     # bcs-lmserver
+bcs-lmserver    1951/tcp     # bcs-lmserver
+#                           Andy Warner <andyw at knoware.nl>
+mpnjsc		1952/udp     # mpnjsc
+mpnjsc		1952/tcp     # mpnjsc
+#			    Takenori Miyahara <miyahara at pfu.co.jp>	
+rapidbase	1953/udp     # Rapid Base
+rapidbase	1953/tcp     # Rapid Base
+#			    Antoni Wolski <antoni.wolski at vtt.fi>
+abr-basic       1954/udp     # ABR-Basic Data
+abr-basic       1954/tcp     # ABR-Basic Data
+abr-secure      1955/udp     # ABR-Secure Data
+abr-secure      1955/tcp     # ABR-Secure Data
+#                           Aero9 - Graham Wooden <graham at aero9.com> 
+vrtl-vmf-ds     1956/udp     # Vertel VMF DS
+vrtl-vmf-ds     1956/tcp     # Vertel VMF DS
+#                           Alan Akahoshi <alan-akahoshi at vertel.com>
+unix-status     1957/udp     # unix-status
+unix-status     1957/tcp     # unix-status
+#                           Thomas Erskine <erskine at sourceworks.com>
+dxadmind        1958/udp     # CA Administration Daemon
+dxadmind        1958/tcp     # CA Administration Daemon
+#                           John Birrell <birjo99 at cai.com> 
+simp-all        1959/udp     # SIMP Channel
+simp-all        1959/tcp     # SIMP Channel
+#                           Tim Hunnewell <thunnewell at pinna.com> 
+nasmanager      1960/udp     # Merit DAC NASmanager
+nasmanager      1960/tcp     # Merit DAC NASmanager
+#                           Richard S. Conto <rsc at merit.edu>
+bts-appserver	1961/udp    # BTS APPSERVER
+bts-appserver	1961/tcp    # BTS APPSERVER
+#			   Carl Obsorn <carl_osborn at sabre.com>
+biap-mp         1962/udp    # BIAP-MP
+biap-mp         1962/tcp    # BIAP-MP
+#                          Chuck Shotton <cshotton at biap.com>  
+webmachine      1963/udp    # WebMachine
+webmachine      1963/tcp    # WebMachine
+#                          Tim Jowers <Tim.Jowers at ColumbiaSC.NCR.com>
+solid-e-engine	1964/udp    # SOLID E ENGINE
+solid-e-engine	1964/tcp    # SOLID E ENGINE
+#			   Ari Valtanen <ari.valtanen at solidtech.com>
+tivoli-npm	1965/udp    # Tivoli NPM
+tivoli-npm	1965/tcp    # Tivoli NPM
+#			   Ivana Cuozzo <Ivana.Cuozzo at tivoli.com>
+slush		1966/udp    # Slush
+slush		1966/tcp    # Slush
+#			   Damien Miller <damien at ibs.com.au>
+sns-quote	1967/udp    # SNS Quote
+sns-quote	1967/tcp    # SNS Quote
+#			   Robert Ellman <rellman at calicotech.com>
+lipsinc         1968/udp    # LIPSinc
+lipsinc         1968/tcp    # LIPSinc
+lipsinc1        1969/udp    # LIPSinc 1
+lipsinc1        1969/tcp    # LIPSinc 1
+#                          Robert Armington <rarmington at lipsinc.com> 
+netop-rc        1970/udp    # NetOp Remote Control
+netop-rc        1970/tcp    # NetOp Remote Control
+netop-school    1971/udp    # NetOp School
+netop-school    1971/tcp    # NetOp School
+#                          NetOp Technical Support <support at danware.dk>
+intersys-cache	1972/udp    # Cache
+intersys-cache	1972/tcp    # Cache
+#			   Mark Hanson <markh at intersys.com>
+dlsrap          1973/udp    # Data Link Switching Remote Access Protocol
+dlsrap          1973/tcp    # Data Link Switching Remote Access Protocol
+#                          Steve T. Chiang <schiang at cisco.com>
+drp		1974/udp    # DRP
+drp		1974/tcp    # DRP
+#			   Richard Alan Johnson <raj at cisco.com>
+tcoflashagent	1975/udp    # TCO Flash Agent
+tcoflashagent	1975/tcp    # TCO Flash Agent
+tcoregagent	1976/udp    # TCO Reg Agent 
+tcoregagent	1976/tcp    # TCO Reg Agent 
+tcoaddressbook	1977/udp    # TCO Address Book
+tcoaddressbook	1977/tcp    # TCO Address Book
+#			   Allan Panitch <allanp at tcosoft.com>
+unisql		1978/udp    # UniSQL
+unisql		1978/tcp    # UniSQL
+unisql-java	1979/udp    # UniSQL Java
+unisql-java	1979/tcp    # UniSQL Java
+#			   Keith Yarbrough <kyarbro at windtraveller.com>
+pearldoc-xact   1980/udp    # PearlDoc XACT
+pearldoc-xact   1980/tcp    # PearlDoc XACT
+#                          Chris Vertonghen <chrisv at pearldoc.com>
+p2pq            1981/udp    # p2pQ
+p2pq            1981/tcp    # p2pQ
+#                          Warren Alexander <warren at chameleon-creative.co.uk>
+estamp          1982/udp    # Evidentiary Timestamp
+estamp          1982/tcp    # Evidentiary Timestamp
+#                          Todd Glassey <todd.glassey at att.net>
+lhtp            1983/udp    # Loophole Test Protocol
+lhtp            1983/tcp    # Loophole Test Protocol
+#                          Kade Hansson <kade_fh at postoffice.utas.edu.au>
+bb		1984/udp    # BB
+bb		1984/tcp    # BB
+#			   Sean MacGuire <sean at maclawran.ca>
+hsrp		1985/udp    # Hot Standby Router Protocol
+hsrp		1985/tcp    # Hot Standby Router Protocol
+#			   Phil Morton <pmorton at cisco.com>
+licensedaemon   1986/udp    # cisco license management
+licensedaemon   1986/tcp    # cisco license management
+tr-rsrb-p1      1987/udp    # cisco RSRB Priority 1 port
+tr-rsrb-p1      1987/tcp    # cisco RSRB Priority 1 port
+tr-rsrb-p2      1988/udp    # cisco RSRB Priority 2 port
+tr-rsrb-p2      1988/tcp    # cisco RSRB Priority 2 port
+tr-rsrb-p3      1989/udp    # cisco RSRB Priority 3 port
+tr-rsrb-p3      1989/tcp    # cisco RSRB Priority 3 port
+# The following entry records an unassigned but widespread use
+mshnet          1989/udp    # MHSnet system
+mshnet          1989/tcp    # MHSnet system
+#                          Bob Kummerfeld <bob at sarad.cs.su.oz.au>
+stun-p1         1990/udp    # cisco STUN Priority 1 port
+stun-p1         1990/tcp    # cisco STUN Priority 1 port
+stun-p2         1991/udp    # cisco STUN Priority 2 port
+stun-p2         1991/tcp    # cisco STUN Priority 2 port
+stun-p3         1992/udp    # cisco STUN Priority 3 port
+stun-p3         1992/tcp    # cisco STUN Priority 3 port
+# The following entry records an unassigned but widespread use
+ipsendmsg       1992/udp    # IPsendmsg
+ipsendmsg       1992/tcp    # IPsendmsg
+#                          Bob Kummerfeld <bob at sarad.cs.su.oz.au>
+snmp-tcp-port   1993/udp    # cisco SNMP TCP port
+snmp-tcp-port   1993/tcp    # cisco SNMP TCP port
+stun-port       1994/udp    # cisco serial tunnel port
+stun-port       1994/tcp    # cisco serial tunnel port
+perf-port       1995/udp    # cisco perf port
+perf-port       1995/tcp    # cisco perf port
+tr-rsrb-port    1996/udp    # cisco Remote SRB port
+tr-rsrb-port    1996/tcp    # cisco Remote SRB port
+gdp-port        1997/udp    # cisco Gateway Discovery Protocol
+gdp-port        1997/tcp    # cisco Gateway Discovery Protocol
+x25-svc-port    1998/udp    # cisco X.25 service (XOT)
+x25-svc-port    1998/tcp    # cisco X.25 service (XOT)
+tcp-id-port     1999/udp    # cisco identification port
+tcp-id-port     1999/tcp    # cisco identification port
+#
+callbook        2000/udp    # callbook
+callbook        2000/tcp    # callbook
+#                          Devon Bowen <bowen at cs.buffalo.edu>
+wizard		2001/udp    # curry
+dc		2001/tcp # 
+globe		2002/udp # 
+globe		2002/tcp # 
+emce            2004/udp    # CCWS mm conf
+mailbox		2004/tcp # 
+oracle		2005/udp # 
+berknet		2005/tcp # 
+raid-cc		2006/udp    # raid
+invokator	2006/tcp # 
+raid-am		2007/udp # 
+dectalk		2007/tcp # 
+terminaldb	2008/udp # 
+conf		2008/tcp # 
+whosockami	2009/udp # 
+news		2009/tcp # 
+pipe_server	2010/udp # 
+search		2010/tcp # 
+servserv	2011/udp # 
+raid-cc		2011/tcp    # raid
+raid-ac		2012/udp # 
+ttyinfo		2012/tcp # 
+raid-cd		2013/udp # 
+raid-am		2013/tcp # 
+raid-sf		2014/udp # 
+troff		2014/tcp # 
+raid-cs		2015/udp # 
+cypress		2015/tcp # 
+bootserver	2016/udp # 
+bootserver	2016/tcp # 
+bootclient	2017/udp # 
+cypress-stat	2017/tcp # 
+rellpack	2018/udp # 
+terminaldb	2018/tcp # 
+about		2019/udp # 
+whosockami	2019/tcp # 
+xinupageserver	2020/udp # 
+xinupageserver	2020/tcp # 
+xinuexpansion1	2021/udp # 
+servexec	2021/tcp # 
+xinuexpansion2	2022/udp # 
+down		2022/tcp # 
+xinuexpansion3	2023/udp # 
+xinuexpansion3	2023/tcp # 
+xinuexpansion4	2024/udp # 
+xinuexpansion4	2024/tcp # 
+xribs		2025/udp # 
+ellpack		2025/tcp # 
+scrabble	2026/udp # 
+scrabble	2026/tcp # 
+shadowserver	2027/udp # 
+shadowserver	2027/tcp # 
+submitserver	2028/udp # 
+submitserver	2028/tcp # 
+#               2029       Unassigned
+device2		2030/udp # 
+device2		2030/tcp # 
+#               2031       Unassigned    
+blackboard      2032/udp # 
+blackboard      2032/tcp # 
+glogger		2033/udp # 
+glogger		2033/tcp # 
+scoremgr	2034/udp # 
+scoremgr	2034/tcp # 
+imsldoc		2035/udp # 
+imsldoc		2035/tcp # 
+#               2036       Unassigned
+p2plus          2037/udp    # P2plus Application Server
+p2plus          2037/tcp    # P2plus Application Server
+#                          Thomas Boerkel <tb at ap-ag.com>
+objectmanager	2038/udp # 
+objectmanager	2038/tcp # 
+#               2039       Unassigned
+lam		2040/udp # 
+lam		2040/tcp # 
+interbase	2041/udp # 
+interbase	2041/tcp # 
+isis		2042/udp    # isis
+isis		2042/tcp    # isis
+isis-bcast	2043/udp    # isis-bcast
+isis-bcast	2043/tcp    # isis-bcast
+#                          Ken Chapman <kchapman at isis.com>
+rimsl		2044/udp # 
+rimsl		2044/tcp # 
+cdfunc		2045/udp # 
+cdfunc		2045/tcp # 
+sdfunc		2046/udp # 
+sdfunc		2046/tcp # 
+dls		2047/udp # 
+dls		2047/tcp # 
+dls-monitor	2048/udp # 
+dls-monitor	2048/tcp # 
+#                         <== NOTE Conflict on 2049 !
+shilp		2049/udp nfs # 
+shilp		2049/tcp nfs # 
+#                          Brent Callaghan <brent at terra.eng.sun.com>
+av-emb-config   2050/udp    # Avaya EMB Config Port
+av-emb-config   2050/tcp    # Avaya EMB Config Port
+#                          John Yeager <johnyeager at avaya.com>
+epnsdp          2051/udp    # EPNSDP
+epnsdp          2051/tcp    # EPNSDP
+#                          Hiroyasu Ogata <Ogata.Hiroyasu at exc.epson.co.jp>
+clearvisn       2052/udp    # clearVisn Services Port
+clearvisn       2052/tcp    # clearVisn Services Port
+#                          Dave Lyons <dlyons at dnpg.com>    
+lot105-ds-upd   2053/udp    # Lot105 DSuper Updates
+lot105-ds-upd   2053/tcp    # Lot105 DSuper Updates
+#                          Piers Scannell <iana-form at lot105.com>
+weblogin        2054/udp    # Weblogin Port
+weblogin        2054/tcp    # Weblogin Port
+#                          Diego Saravia <dsa at unsa.edu.ar>
+iop             2055/udp    # Iliad-Odyssey Protocol
+iop             2055/tcp    # Iliad-Odyssey Protocol
+#                          Bruce Lueckenhoff <brucelu at cisco.com>
+omnisky         2056/udp    # OmniSky Port
+omnisky         2056/tcp    # OmniSky Port
+#	                   Oren Hurvitz <oren at omnisky.com>  
+rich-cp         2057/udp    # Rich Content Protocol
+rich-cp         2057/tcp    # Rich Content Protocol
+#                          Ronen Vainish <ronen at digitalfountain.com> 
+newwavesearch   2058/udp    # NewWaveSearchables RMI
+newwavesearch   2058/tcp    # NewWaveSearchables RMI
+#                          Thomas Kerkau <Thomas.Kerkau at io-software.com>  
+bmc-messaging   2059/udp    # BMC Messaging Service
+bmc-messaging   2059/tcp    # BMC Messaging Service
+#                          Roger Huebner <Roger_Huebner at bmc.com>
+teleniumdaemon  2060/udp    # Telenium Daemon IF
+teleniumdaemon  2060/tcp    # Telenium Daemon IF
+#                          Nick Woronuk <nick.woronuk at megasys.com>
+netmount        2061/udp    # NetMount
+netmount        2061/tcp    # NetMount
+#                          Alex Oberlander <alexo at netmount.com>
+icg-swp         2062/udp    # ICG SWP Port
+icg-swp         2062/tcp    # ICG SWP Port
+icg-bridge      2063/udp    # ICG Bridge Port
+icg-bridge      2063/tcp    # ICG Bridge Port
+icg-iprelay     2064/udp    # ICG IP Relay Port
+icg-iprelay     2064/tcp    # ICG IP Relay Port
+#                          Steve Quintana <steve at icgresearch.com> 
+dlsrpn          2065/udp    # Data Link Switch Read Port Number
+dlsrpn          2065/tcp    # Data Link Switch Read Port Number
+#                          Amir Peless <amirp at radware.co.il>
+#               2066       Unassigned 
+dlswpn          2067/udp    # Data Link Switch Write Port Number
+dlswpn          2067/tcp    # Data Link Switch Write Port Number
+#                          Amir Peless <amirp at radware.co.il>   
+avauthsrvprtcl  2068/udp    # Avocent AuthSrv Protocol
+avauthsrvprtcl  2068/tcp    # Avocent AuthSrv Protocol
+#                          Steven W. Clark <sclark at equinox.com>
+event-port      2069/udp    # HTTP Event Port
+event-port      2069/tcp    # HTTP Event Port
+#                          Larry Emlich <larry.emlich at compaq.com>
+ah-esp-encap    2070/udp    # AH and ESP Encapsulated in UDP packet
+ah-esp-encap    2070/tcp    # AH and ESP Encapsulated in UDP packet
+#                          Amy Weaver <aweaver at vpnet.com> 
+acp-port        2071/udp    # Axon Control Protocol
+acp-port        2071/tcp    # Axon Control Protocol
+#                          Christiaan Simons <christiaan.simons at axon.nl>
+msync           2072/udp    # GlobeCast mSync
+msync           2072/tcp    # GlobeCast mSync
+#                          Piers Scannell <piers at globecastne.com>
+gxs-data-port   2073/udp    # DataReel Database Socket
+gxs-data-port   2073/tcp    # DataReel Database Socket
+#                          Douglas M. Gaer <doug at datareel.com>
+vrtl-vmf-sa     2074/udp    # Vertel VMF SA
+vrtl-vmf-sa     2074/tcp    # Vertel VMF SA
+#                          Alan Akahoshi <alan-akahoshi at vertel.com>
+newlixengine    2075/udp    # Newlix ServerWare Engine
+newlixengine    2075/tcp    # Newlix ServerWare Engine
+newlixconfig    2076/udp    # Newlix JSPConfig
+newlixconfig    2076/tcp    # Newlix JSPConfig
+#                          Jean-Serge Gagnon <jean-serge.gagnon at newlix.com>
+trellisagt      2077/udp    # TrelliSoft Agent
+trellisagt      2077/tcp    # TrelliSoft Agent
+trellissvr      2078/udp    # TrelliSoft Server
+trellissvr      2078/tcp    # TrelliSoft Server
+#                          Justin R. Bendich <bendich at TrelliSoft.com>
+idware-router   2079/udp    # IDWARE Router Port
+idware-router   2079/tcp    # IDWARE Router Port
+#                          Zdenek Kolba <zdenek.kolba at id-karta.cz>
+autodesk-nlm    2080/udp    # Autodesk NLM (FLEXlm)
+autodesk-nlm    2080/tcp    # Autodesk NLM (FLEXlm)
+#                          Greg Suppes <greg.suppes at autodesk.com>  
+kme-trap-port   2081/udp    # KME PRINTER TRAP PORT
+kme-trap-port   2081/tcp    # KME PRINTER TRAP PORT
+#                          Masakatsu Matsuo <masa at sdsft.kme.mei.co.jp>
+infowave        2082/udp    # Infowave Mobiltiy Server
+infowave        2082/tcp    # Infowave Mobility Server
+#                          Kaz Kylheku <kkylheku at infowave.com>
+#               2083-2085  Unassigned
+gnunet          2086/udp    # GNUnet
+gnunet          2086/tcp    # GNUnet
+#                          Christian Grothoff <grothoff at cs.purdue.edu> October 2002
+eli             2087/udp    # ELI - Event Logging Integration
+eli             2087/tcp    # ELI - Event Logging Integration
+#                          Maya Zimerman <mayaz at radware.co.il>  
+#               2088       Unassigned 
+sep             2089/udp    # Security Encapsulation Protocol - SEP 
+sep             2089/tcp    # Security Encapsulation Protocol - SEP 
+#                          Maya Zimerman <mayaz at radware.co.il>
+lrp		2090/udp    # Load Report Protocol
+lrp		2090/tcp    # Load Report Protocol
+#			   Amir Peless <amirp at radware.co.il>
+prp		2091/udp    # PRP
+prp		2091/tcp    # PRP
+#			   Amir Peless <amirp at radware.co.il>
+descent3	2092/udp    # Descent 3
+descent3	2092/tcp    # Descent 3
+#			   Kevin Bentley <Kevin at outrage.com>
+nbx-cc		2093/udp    # NBX CC
+nbx-cc		2093/tcp    # NBX CC
+nbx-au		2094/udp    # NBX AU
+nbx-au		2094/tcp    # NBX AU
+nbx-ser		2095/udp    # NBX SER
+nbx-ser		2095/tcp    # NBX SER
+nbx-dir		2096/udp    # NBX DIR
+nbx-dir		2096/tcp    # NBX DIR
+#			   Henry Houh <hhouh at nbxcorp.com>
+jetformpreview	2097/udp    # Jet Form Preview
+jetformpreview	2097/tcp    # Jet Form Preview
+#			   Zygmunt Wiercioch <zyg at jetform.com>
+dialog-port	2098/udp    # Dialog Port
+dialog-port	2098/tcp    # Dialog Port
+#			   Joseph Mathew <mjoseph at dosa.cisco.com>
+h2250-annex-g	2099/udp    # H.225.0 Annex G
+h2250-annex-g	2099/tcp    # H.225.0 Annex G
+#			   Gur Kimchi <gur.kimchi at vocaltec.com>
+amiganetfs      2100/udp    # Amiga Network Filesystem
+amiganetfs      2100/tcp    # Amiga Network Filesystem
+#                          Rudi Chiarito <nutello at sweetness.com>
+rtcm-sc104	2101/udp    # rtcm-sc104
+rtcm-sc104	2101/tcp    # rtcm-sc104
+#			   Wolfgang Rupprecht <wolfgang at wsrcc.com>
+zephyr-srv      2102/udp    # Zephyr server
+zephyr-srv      2102/tcp    # Zephyr server
+zephyr-clt      2103/udp    # Zephyr serv-hm connection
+zephyr-clt      2103/tcp    # Zephyr serv-hm connection
+zephyr-hm       2104/udp    # Zephyr hostmanager
+zephyr-hm       2104/tcp    # Zephyr hostmanager
+#                          Greg Hudson <zephyr-bugs at mit.edu>
+minipay		2105/udp    # MiniPay
+minipay		2105/tcp    # MiniPay
+#			   Amir Herzberg <amirh at vnet.ibm.com>
+mzap		2106/udp    # MZAP
+mzap		2106/tcp    # MZAP
+#			   Dave Thaler <dthaler at microsoft.com>
+bintec-admin	2107/udp    # BinTec Admin 
+bintec-admin	2107/tcp    # BinTec Admin 
+#			   Thomas Schmidt <ts at bintec.de>
+comcam		2108/udp    # Comcam
+comcam		2108/tcp    # Comcam
+#			   Don Gilbreath <don at comcam.net>
+ergolight       2109/udp    # Ergolight
+ergolight       2109/tcp    # Ergolight
+#                          Jindra Ryvola <jryvola at ledalite.com>
+umsp            2110/udp    # UMSP
+umsp            2110/tcp    # UMSP
+#                          Alexander Bogdanov <alexander_bgd at softhome.net>    
+dsatp           2111/udp    # DSATP
+dsatp           2111/tcp    # DSATP
+#                          Ralph Beck <beck at altaworks.com>
+idonix-metanet  2112/udp    # Idonix MetaNet
+idonix-metanet  2112/tcp    # Idonix MetaNet
+#                          Paul Harrison <paulh at idonix.co.uk>
+hsl-storm       2113/udp    # HSL StoRM
+hsl-storm       2113/tcp    # HSL StoRM
+#                          Jost Faganel <jost.faganel at hermes.si>   
+newheights      2114/udp    # NEWHEIGHTS
+newheights      2114/tcp    # NEWHEIGHTS
+#                          Michael Levy <ml at nh.ca>
+kdm             2115/udp    # Key Distribution Manager
+kdm             2115/tcp    # Key Distribution Manager
+#                          Mike Little <mike.little at GDC4S.com>
+ccowcmr         2116/udp    # CCOWCMR
+ccowcmr         2116/tcp    # CCOWCMR
+#                          Mark Morwood <markm at sentillion.com> 
+mentaclient     2117/udp    # MENTACLIENT
+mentaclient     2117/tcp    # MENTACLIENT
+mentaserver     2118/udp    # MENTASERVER
+mentaserver     2118/tcp    # MENTASERVER
+#                          Ilan Shlosberg <ilan at mentasoftware.com>
+gsigatekeeper   2119/udp    # GSIGATEKEEPER
+gsigatekeeper   2119/tcp    # GSIGATEKEEPER
+#                          Steve Tuecke <tuecke at mcs.anl.gov>
+qencp           2120/udp    # Quick Eagle Networks CP
+qencp           2120/tcp    # Quick Eagle Networks CP
+#                          Santa Dasu <Santa_Dasu at quickeagle.com>
+scientia-ssdb   2121/udp    # SCIENTIA-SSDB
+scientia-ssdb   2121/tcp    # SCIENTIA-SSDB
+#                          Ian Miller <Ian_Miller at scientia.com>
+caupc-remote    2122/udp    # CauPC Remote Control
+caupc-remote    2122/tcp    # CauPC Remote Control
+#                          Environics Oy <pasi.nuutinmaki at environics.fi>    
+gtp-control     2123/udp    # GTP-Control Plane (3GPP)
+gtp-control     2123/tcp    # GTP-Control Plane (3GPP)
+#                          Alessio Casati <a.casati at computer.org>
+elatelink       2124/udp    # ELATELINK
+elatelink       2124/tcp    # ELATELINK
+#                          Tim Lawrence <lawrence at tao-group.com>
+lockstep        2125/udp    # LOCKSTEP
+lockstep        2125/tcp    # LOCKSTEP
+#                          Karl Forster <kforster at lockstep.com> 
+pktcable-cops   2126/udp    # PktCable-COPS
+pktcable-cops   2126/tcp    # PktCable-COPS
+#                          Glenn Russell <grussell at cablelabs.com> 
+index-pc-wb     2127/udp    # INDEX-PC-WB
+index-pc-wb     2127/tcp    # INDEX-PC-WB
+#                          James David Fisher <jfisher1 at avaya.com>
+net-steward     2128/udp    # Net Steward Control
+net-steward     2128/tcp    # Net Steward Control
+#                          Martin Norman <martin at ndl.co.uk>
+cs-live         2129/udp    # cs-live.com
+cs-live         2129/tcp    # cs-live.com
+#                          Matt Lachance <matt at cs-live.com>
+swc-xds         2130/udp    # SWC-XDS
+swc-xds         2130/tcp    # SWC-XDS
+#                          Peter Zurich <peter.zurich at swc.com>
+avantageb2b     2131/udp    # Avantageb2b
+avantageb2b     2131/tcp    # Avantageb2b
+#                          Avi Software <srobert at logava.com>
+avail-epmap     2132/udp    # AVAIL-EPMAP
+avail-epmap     2132/tcp    # AVAIL-EPMAP
+#                          Mark Armstrong <avail at pacbell.net>
+zymed-zpp       2133/udp    # ZYMED-ZPP
+zymed-zpp       2133/tcp    # ZYMED-ZPP
+#                          Gregg Welker <greggw at zmi.com>
+avenue          2134/udp    # AVENUE
+avenue          2134/tcp    # AVENUE
+#                          Jason Cater <jason at ncsmags.com>
+gris            2135/udp    # Grid Resource Information Server
+gris            2135/tcp    # Grid Resource Information Server
+#                          Steve Tuecke <tuecke at mcs.anl.gov>   
+appworxsrv      2136/udp    # APPWORXSRV
+appworxsrv      2136/tcp    # APPWORXSRV
+#                          Fred McLain <fmclain at appworx.com>
+connect         2137/udp    # CONNECT
+connect         2137/tcp    # CONNECT
+#                          Reid Ligon <reid at connectrf.com>   
+unbind-cluster  2138/udp    # UNBIND-CLUSTER
+unbind-cluster  2138/tcp    # UNBIND-CLUSTER
+#                          Francois Harvey <securiweb at pandore.qc.ca>
+ias-auth        2139/udp    # IAS-AUTH
+ias-auth        2139/tcp    # IAS-AUTH	     
+ias-reg         2140/udp    # IAS-REG
+ias-reg         2140/tcp    # IAS-REG
+ias-admind      2141/udp    # IAS-ADMIND
+ias-admind      2141/tcp    # IAS-ADMIND
+#                          Baiju V. Patel <Baiju.v.patel at intel.com>
+tdm-over-ip     2142/udp    # TDM-OVER-IP
+tdm-over-ip     2142/tcp    # TDM-OVER-IP
+#                          Tal Gilad <tal_g at rad.co.il>
+lv-jc           2143/udp    # Live Vault Job Control
+lv-jc           2143/tcp    # Live Vault Job Control
+lv-ffx          2144/udp    # Live Vault Fast Object Transfer
+lv-ffx          2144/tcp    # Live Vault Fast Object Transfer
+lv-pici         2145/udp    # Live Vault Remote Diagnostic Console Support
+lv-pici         2145/tcp    # Live Vault Remote Diagnostic Console Support
+lv-not          2146/udp    # Live Vault Admin Event Notification
+lv-not          2146/tcp    # Live Vault Admin Event Notification
+lv-auth         2147/udp    # Live Vault Authentication
+lv-auth         2147/tcp    # Live Vault Authentication
+#                          Ted Hess <thess at livevault.com>
+veritas-ucl     2148/udp    # VERITAS UNIVERSAL COMMUNICATION LAYER
+veritas-ucl     2148/tcp    # VERITAS UNIVERSAL COMMUNICATION LAYER
+#                          Songlin Ren <ren at veritas.com>	
+acptsys         2149/udp    # ACPTSYS
+acptsys         2149/tcp    # ACPTSYS
+#                          Michael Lekias <admin at psdesign.com.au>         
+dynamic3d       2150/udp    # DYNAMIC3D
+dynamic3d       2150/tcp    # DYNAMIC3D
+#                          Tobias Wegner <wegner at novagate.de>		
+docent          2151/udp    # DOCENT
+docent          2151/tcp    # DOCENT
+#                          Hali Lindbloom <halil at docent.com>
+gtp-user        2152/udp    # GTP-User Plane (3GPP)
+gtp-user        2152/tcp    # GTP-User Plane (3GPP)
+#                          Alessio Casati <a.casati at computer.org> 
+#               2153-2158  Unassigned
+gdbremote       2159/udp    # GDB Remote Debug Port
+gdbremote       2159/tcp    # GDB Remote Debug Port
+#                          Nigel Stephens <nigel at algor.co.uk>
+apc-2160        2160/udp    # APC 2160
+apc-2160        2160/tcp    # APC 2160
+#                          American Power Conversion <ports at apcc.com>
+apc-2161        2161/udp    # APC 2161
+apc-2161        2161/tcp    # APC 2161
+#                          American Power Conversion <ports at apcc.com>
+navisphere      2162/udp    # Navisphere
+navisphere      2162/tcp    # Navisphere
+navisphere-sec  2163/udp    # Navisphere Secure
+navisphere-sec  2163/tcp    # Navisphere Secure
+#                          Andreas Bauer <bauer_andreas at emc.com>
+ddns-v3         2164/udp    # Dynamic DNS Version 3
+ddns-v3         2164/tcp    # Dynamic DNS Version 3
+#                          Alan Yates <alany at ay.com.au>
+x-bone-api	2165/udp    # X-Bone API
+x-bone-api	2165/tcp    # X-Bone API
+#			   Joe Touch <touch at isi.edu>
+iwserver        2166/udp    # iwserver
+iwserver        2166/tcp    # iwserver
+#                          Fred Surr <quest_iana at oz.quest.com>
+raw-serial      2167/udp    # Raw Async Serial Link
+raw-serial      2167/tcp    # Raw Async Serial Link
+#                          Benjamin Green <benjamin at lh.co.nz>
+#	        2168-2179  Unassigned
+mc-gt-srv	2180/udp    # Millicent Vendor Gateway Server
+mc-gt-srv	2180/tcp    # Millicent Vendor Gateway Server
+#			   Steve Glassman <steveg at pa.dec.com>
+eforward        2181/udp    # eforward
+eforward        2181/tcp    # eforward
+#                          Greg Pringle <admin at corvedia.com>
+#               2182-2189  Unassigned
+tivoconnect     2190/udp    # TiVoConnect Beacon
+tivoconnect     2190/tcp    # TiVoConnect Beacon
+#                          Jeffrey J. Peters <jpeters at tivo.com> August 2002
+tvbus           2191/udp    # TvBus Messaging
+tvbus           2191/tcp    # TvBus Messaging
+#                          Brian W. Beach <brian at tivo.com> January 2003               
+#               2192-2199  Unassigned
+ici             2200/udp    # ICI
+ici             2200/tcp    # ICI
+#                          Brent Hines <brent.hines at unisys.com>
+ats             2201/udp    # Advanced Training System Program
+ats             2201/tcp    # Advanced Training System Program
+#                          (Need contact info)
+imtc-map        2202/udp    # Int. Multimedia Teleconferencing Cosortium
+imtc-map        2202/tcp    # Int. Multimedia Teleconferencing Cosortium
+#                          Pat Galvin <pgalvin at databeam.com>
+kali            2213/udp    # Kali
+kali            2213/tcp    # Kali
+#                          Jay Cotton <JAY at calc.vet.uga.edu>
+netiq           2220/udp    # NetIQ End2End
+netiq           2220/tcp    # NetIQ End2End
+#			   Gary Weichinger <gary.weichinger at netiq.com>
+rockwell-csp1	2221/udp    # Rockwell CSP1
+rockwell-csp1	2221/tcp    # Rockwell CSP1
+rockwell-csp2	2222/udp    # Rockwell CSP2
+rockwell-csp2	2222/tcp    # Rockwell CSP2
+rockwell-csp3	2223/udp    # Rockwell CSP3
+rockwell-csp3	2223/tcp    # Rockwell CSP3
+#			   Brian Batke <babatke at ra.rockwell.com>	
+#
+ivs-video       2232/udp    # IVS Video default
+ivs-video       2232/tcp    # IVS Video default
+#                  Thierry Turletti <Thierry.Turletti at sophia.inria.fr>
+infocrypt	2233/udp    # INFOCRYPT
+infocrypt	2233/tcp    # INFOCRYPT
+#			   Erica Liu <liue at isolation.com>
+directplay      2234/udp    # DirectPlay
+directplay      2234/tcp    # DirectPlay
+#                          Ajay Jindal <ajayj at microsoft.com>
+sercomm-wlink   2235/udp    # Sercomm-WLink
+sercomm-wlink	2235/tcp    # Sercomm-WLink
+#			   Melinda Tsao <melinda at tpe1.sercomm.com.tw>
+nani		2236/udp    # Nani
+nani		2236/tcp    # Nani
+#			   Steve Benoit <sbenoi01 at eng.eds.com>
+optech-port1-lm 2237/udp    # Optech Port1 License Manager
+optech-port1-lm 2237/tcp    # Optech Port1 License Manager
+#		 	   Gerard Cannie <jcannie at opticaltech.com>
+aviva-sna	2238/udp    # AVIVA SNA SERVER
+aviva-sna	2238/tcp    # AVIVA SNA SERVER
+#			   Vick Keshishian <vickenK at 192.219.82.71>
+imagequery      2239/udp    # Image Query
+imagequery	2239/tcp    # Image Query	
+#			   Charles Jacobs <cjacobs at numinous.com>
+recipe		2240/udp    # RECIPe
+recipe		2240/tcp    # RECIPe
+#			   Charlie Limoges <charlie.limoges at gd-cs.com>
+ivsd            2241/udp    # IVS Daemon
+ivsd            2241/tcp    # IVS Daemon
+#                          Thierry Turletti 
+#                          <Thierry.Turletti at sophia.inria.fr>
+foliocorp       2242/udp    # Folio Remote Server
+foliocorp       2242/tcp    # Folio Remote Server
+#                          Pat Mcgowan <pmcgowan at folio.com>
+magicom		2243/udp    # Magicom Protocol
+magicom		2243/tcp    # Magicom Protocol
+#			   Yossi Appleboum <yossia at magicom.co.il>
+nmsserver	2244/udp    # NMS Server
+nmsserver	2244/tcp    # NMS Server
+#			   Dmitry Krasnonosenkikh
+#			   <Dmitry_Krasnonosenkih at nmss.com>
+hao		2245/udp    # HaO
+hao		2245/tcp    # HaO
+#			   Panic Ride <panicride at hao.org>
+pc-mta-addrmap  2246/udp    # PacketCable MTA Addr Map
+pc-mta-addrmap  2246/tcp    # PacketCable MTA Addr Map
+#                          Dave Maxwell <d.maxwell at cablelabs.com>
+#               2247       Unassigned
+ums 		2248/udp    # User Management Service
+ums             2248/tcp    # User Management Service
+#                          Andrew Crockford 
+#                          <andrew.crockford at modus-interactive.co.uk>
+rfmp		2249/udp    # RISO File Manager Protocol
+rfmp		2249/tcp    # RISO File Manager Protocol
+#                          Shinji Yamanaka <syamanaka at jci.co.jp>
+remote-collab   2250/udp    # remote-collab
+remote-collab   2250/tcp    # remote-collab
+#                          Richard Walters <walters at cs.ucdavis.edu>
+dif-port        2251/udp    # Distributed Framework Port
+dif-port	2251/tcp    # Distributed Framework Port
+#                          Sebastien Lambla <lambla at bouygtel.com>
+njenet-ssl      2252/udp    # NJENET using SSL
+njenet-ssl      2252/tcp    # NJENET using SSL
+#                          Hans U Schmidt <schmidth at de.ibm.com>
+dtv-chan-req    2253/udp    # DTV Channel Request
+dtv-chan-req	2253/tcp    # DTV Channel Request
+#                          Richard Hodges <rh at matriplex.com>
+seispoc         2254/udp    # Seismic P.O.C. Port
+seispoc         2254/tcp    # Seismic P.O.C. Port
+#                          Robert Reimiller <bob at certsoft.com>
+vrtp            2255/udp    # VRTP - ViRtue Transfer Protocol
+vrtp            2255/tcp    # VRTP - ViRtue Transfer Protocol
+#                          Max Fudim <fudim at virtue3d.com> 
+#               2256-2259  Unassigned
+apc-2260        2260/udp    # APC 2260
+apc-2260        2260/tcp    # APC 2260
+#                          American Power Conversion <ports at apcc.com> February 2002
+#               2261-2278  Unassigned
+xmquery         2279/udp    # xmquery
+xmquery         2279/tcp    # xmquery
+#                          Niels Christiansen <nchris at austin.ibm.com>
+lnvpoller       2280/udp    # LNVPOLLER
+lnvpoller       2280/tcp    # LNVPOLLER
+lnvconsole      2281/udp    # LNVCONSOLE
+lnvconsole      2281/tcp    # LNVCONSOLE
+lnvalarm        2282/udp    # LNVALARM
+lnvalarm        2282/tcp    # LNVALARM
+lnvstatus       2283/udp    # LNVSTATUS
+lnvstatus       2283/tcp    # LNVSTATUS
+lnvmaps         2284/udp    # LNVMAPS
+lnvmaps         2284/tcp    # LNVMAPS
+lnvmailmon      2285/udp    # LNVMAILMON
+lnvmailmon      2285/tcp    # LNVMAILMON
+#                          John Payne <jpayne at lotus.com> 
+nas-metering    2286/udp    # NAS-Metering
+nas-metering    2286/tcp    # NAS-Metering
+#                          Steven Sawkins <ssawkins at symantec.com>    
+dna		2287/udp    # DNA
+dna		2287/tcp    # DNA
+#			   Tung Nguyen <dash at ricochet.net>
+netml		2288/udp    # NETML
+netml		2288/tcp    # NETML
+#			   Jochen Hansmeyer <cjh at krypton.de>
+#               2289-2293  Unassigned
+konshus-lm	2294/udp    # Konshus License Manager (FLEX)
+konshus-lm	2294/tcp    # Konshus License Manager (FLEX)
+#			   Francois Painchaud <fpainchaud at konshus.com>
+advant-lm	2295/udp    # Advant License Manager
+advant-lm	2295/tcp    # Advant License Manager
+#			   Lars-Goran Magnusson 
+#                          <lars-goran.magnusson at seisy.mail.abb.com>
+theta-lm	2296/udp    # Theta License Manager (Rainbow)
+theta-lm	2296/tcp    # Theta License Manager (Rainbow)
+#		   	   David Thompson <theta at theta-ent.com>
+d2k-datamover1	2297/udp    # D2K DataMover 1
+d2k-datamover1	2297/tcp    # D2K DataMover 1
+d2k-datamover2	2298/udp    # D2K DataMover 2
+d2k-datamover2  2298/tcp    # D2K DataMover 2
+#			   Eric Lan <elan at d2k.com>
+pc-telecommute	2299/udp    # PC Telecommute
+pc-telecommute	2299/tcp    # PC Telecommute
+#			   John Daniel Bonamico <jbonamico at symantec.com>
+cvmmon          2300/udp    # CVMMON
+cvmmon          2300/tcp    # CVMMON
+#                          Roger Kumpf <kumpf at cup.hp.com>
+cpq-wbem        2301/udp    # Compaq HTTP
+cpq-wbem        2301/tcp    # Compaq HTTP
+#                          Scott Shaffer <scott.shaffer at hp.com>
+binderysupport	2302/udp    # Bindery Support
+binderysupport	2302/tcp    # Bindery Support
+#			   Narasimha Rao N. <nnarasimharao at novell.com>
+proxy-gateway	2303/udp    # Proxy Gateway
+proxy-gateway	2303/tcp    # Proxy Gateway
+#			   Paul Funk <paul at funk.com>
+attachmate-uts	2304/udp    # Attachmate UTS
+attachmate-uts	2304/tcp    # Attachmate UTS
+#			   George Gianelos <Georgegi at Attachmate.com>
+mt-scaleserver	2305/udp    # MT ScaleServer
+mt-scaleserver	2305/tcp    # MT ScaleServer
+#			   Paul Glaubitz <Paul.Glaubitz at mt.com>
+tappi-boxnet	2306/udp    # TAPPI BoxNet
+tappi-boxnet	2306/tcp    # TAPPI BoxNet
+#			   Richard Spartz <rspartz at alliancetechnical.com>
+pehelp          2307/udp    # pehelp
+pehelp          2307/tcp    # pehelp
+#                          Jens Kilian <jensk at hpbeo82.bbn.hp.com>
+sdhelp		2308/udp    # sdhelp
+sdhelp		2308/tcp    # sdhelp
+#			   Annette Klecha <annette_klecha at bbn.hp.com>
+sdserver	2309/udp    # SD Server
+sdserver	2309/tcp    # SD Server
+sdclient	2310/udp    # SD Client
+sdclient	2310/tcp    # SD Client
+#			   Jeurgen Broesamle <juergb at bbn.hp.com>
+messageservice	2311/udp    # Message Service
+messageservice	2311/tcp    # Message Service
+#			   No contact Listed	
+iapp		2313/udp    # IAPP (Inter Access Point Protocol)
+iapp		2313/tcp    # IAPP (Inter Access Point Protocol)
+#			   Henri Moelard <moelard at lucent.com>
+cr-websystems	2314/udp    # CR WebSystems
+cr-websystems	2314/tcp    # CR WebSystems
+#			   Robin Giese <rgiese at peddie.org>
+precise-sft	2315/udp    # Precise Sft.
+precise-sft	2315/tcp    # Precise Sft.
+#			   Michael Landwehr <mikel at precisesoft.co.il>
+sent-lm		2316/udp    # SENT License Manager
+sent-lm		2316/tcp    # SENT License Manager
+#			   Pisharath Krishnan <krishnan at axis-inc.com>
+attachmate-g32	2317/udp    # Attachmate G32
+attachmate-g32	2317/tcp    # Attachmate G32
+#			   Bryce Bhatnagar <BRYCEBH at Attachmate.com>
+cadencecontrol	2318/udp    # Cadence Control
+cadencecontrol	2318/tcp    # Cadence Control
+#			   Buck Caldwell <buck_c at polygon.com>
+infolibria	2319/udp    # InfoLibria
+infolibria	2319/tcp    # InfoLibria
+#			   Chris Chiotasso <cchiotasso at infolibria.com>
+siebel-ns	2320/udp    # Siebel NS
+siebel-ns	2320/tcp    # Siebel NS
+#			   Gilberto Arnaiz <garnaiz at siebel.com>
+rdlap		2321/udp    # RDLAP
+rdlap		2321/tcp    # RDLAP
+#			   Robert Wiebe <crw010 at email.mot.com>
+ofsd		2322/udp    # ofsd
+ofsd		2322/tcp    # ofsd
+3d-nfsd		2323/udp    # 3d-nfsd
+3d-nfsd		2323/tcp    # 3d-nfsd
+#			   Mike Sherrill <sherrill at commvault.com>
+cosmocall	2324/udp    # Cosmocall
+cosmocall	2324/tcp    # Cosmocall
+#			   Steve Dellutri
+designspace-lm	2325/udp    # Design Space License Management
+designspace-lm	2325/tcp    # Design Space License Management
+#			   Suzanne Lorrin <suzanne.lorrin at ansys.com>
+idcp		2326/udp    # IDCP
+idcp		2326/tcp    # IDCP
+#			   Keisokugiken Corp. <adda at kgc.co.jp>
+xingcsm		2327/udp    # xingcsm
+xingcsm		2327/tcp    # xingcsm
+#			   Dave Spencer <dspencer at xingtech.com>
+netrix-sftm	2328/udp    # Netrix SFTM
+netrix-sftm	2328/tcp    # Netrix SFTM
+#			   Garrett Herschleb <garrett at netrix.com>
+nvd		2329/udp    # NVD
+nvd		2329/tcp    # NVD
+#			   Peter Weyman <pjweyman at noblenet.com>
+tscchat		2330/udp    # TSCCHAT
+tscchat		2330/tcp    # TSCCHAT
+#			   Mike Jackson <mhjack at tscnet.com>
+agentview	2331/udp    # AGENTVIEW
+agentview	2331/tcp    # AGENTVIEW
+#			   Ram Iyer <ram at aaccorp.com>
+rcc-host	2332/udp    # RCC Host
+rcc-host	2332/tcp    # RCC Host 
+#			   Martin Shoemaker <shoemakerml at rapistan.com>
+snapp           2333/udp    # SNAPP
+snapp           2333/tcp    # SNAPP
+#                          Kevin Osborn <kosborn at snapappliance.com>
+ace-client	2334/udp    # ACE Client Auth
+ace-client	2334/tcp    # ACE Client Auth
+ace-proxy	2335/udp    # ACE Proxy
+ace-proxy	2335/tcp    # ACE Proxy
+#			   Riaz Zolfonoon <rzolfonoon at securitydynamics.com>
+appleugcontrol	2336/udp    # Apple UG Control
+appleugcontrol  2336/tcp    # Apple UG Control
+#			   Gene Tyacke <gene at apple.com>
+ideesrv		2337/udp    # ideesrv
+ideesrv		2337/tcp    # ideesrv
+#			   Marazzi <fmarazzi at ideetique.com>
+norton-lambert	2338/udp    # Norton Lambert
+norton-lambert	2338/tcp    # Norton Lambert
+#			   Richard de Mornay <rdemornay at norton-lambert.com>
+3com-webview	2339/udp    # 3Com WebView
+3com-webview	2339/tcp    # 3Com WebView
+#			   Jennifer Grace <Jennifer_Grace at 3com.com>
+wrs_registry	2340/udp    # WRS Registry
+wrs_registry	2340/tcp    # WRS Registry
+#			   Christophe Cleraux <chrisc at wrs.com>
+xiostatus	2341/udp    # XIO Status
+xiostatus	2341/tcp    # XIO Status
+#			   Randy Maas <randym at xiotech.com>
+manage-exec	2342/udp    # Seagate Manage Exec
+manage-exec	2342/tcp    # Seagate Manage Exec
+#			   Jim Flaherty <jim.flaherty at seagatesoftware.com>
+nati-logos	2343/udp    # nati logos
+nati-logos	2343/tcp    # nati logos
+#			   David Pierce <David.Pierce at natinst.com>
+fcmsys		2344/udp    # fcmsys
+fcmsys		2344/tcp    # fcmsys
+dbm		2345/udp    # dbm
+dbm		2345/tcp    # dbm
+#			   Dean Robson <dean.robson at fujitsu.com.au>
+redstorm_join	2346/udp    # Game Connection Port
+redstorm_join	2346/tcp    # Game Connection Port
+redstorm_find	2347/udp    # Game Announcement and Location
+redstorm_find	2347/tcp    # Game Announcement and Location
+redstorm_info	2348/udp    # Information to query for game status
+redstorm_info	2348/tcp    # Information to query for game status
+redstorm_diag	2349/udp    # Diagnostics Port
+redstorm_diag	2349/tcp    # Diagnostics Port
+#			   David Weinstein <david.weinstein at redstorm.com>
+psbserver	2350/udp    # psbserver
+psbserver	2350/tcp    # psbserver
+psrserver	2351/udp    # psrserver
+psrserver	2351/tcp    # psrserver
+pslserver	2352/udp    # pslserver
+pslserver	2352/tcp    # pslserver
+pspserver	2353/udp    # pspserver
+pspserver	2353/tcp    # pspserver
+psprserver	2354/udp    # psprserver
+psprserver	2354/tcp    # psprserver
+psdbserver	2355/udp    # psdbserver
+psdbserver	2355/tcp    # psdbserver
+#			   Paul Reddy <Paul at pharos.co.nz>
+gxtelmd		2356/udp    # GXT License Managemant
+gxtelmd		2356/tcp    # GXT License Managemant
+#			   Robert Hodgson <rrh at gxt.com>
+unihub-server	2357/udp    # UniHub Server
+unihub-server	2357/tcp    # UniHub Server
+#			   Tim Kenyon <Tim_Kenyon at csicontrols.com>
+futrix		2358/udp    # Futrix
+futrix		2358/tcp    # Futrix
+#			   Peter Frankenberg <pcfberg at ibm.net>
+flukeserver	2359/udp    # FlukeServer
+flukeserver	2359/tcp    # FlukeServer
+#			   Bill Marbaker <wrm at fortenet.com>
+nexstorindltd	2360/udp    # NexstorIndLtd
+nexstorindltd	2360/tcp    # NexstorIndLtd
+#			   NexStor India Limited <next at nda.vsnl.net.in>	
+tl1		2361/udp    # TL1
+tl1		2361/tcp    # TL1
+#			   Charles Scott Roberson <chip at cerent.com> 
+digiman         2362/udp    # digiman
+digiman         2362/tcp    # digiman
+#                          Aaron S. Kurland <akurland at netsilicon.com>
+mediacntrlnfsd  2363/udp    # Media Central NFSD 
+mediacntrlnfsd  2363/tcp    # Media Central NFSD 
+#			   shivakumar s. govindarajapuram <shivak at eng.sun.com>
+oi-2000		2364/udp    # OI-2000
+oi-2000		2364/tcp    # OI-2000
+#			   Software Horizons Inc. <oi2000 at shorizons.com>   
+dbref		2365/udp    # dbref
+dbref		2365/tcp    # dbref
+#			   Yoshihiro Yamazaki <yamazaki at ael.fujitsu.co.jp>
+qip-login	2366/udp    # qip-login
+qip-login	2366/tcp    # qip-login
+#			   Mike Morgan <mmorgan at lucent.com>
+service-ctrl	2367/udp    # Service Control
+service-ctrl	2367/tcp    # Service Control
+#			   Humberto Sanchez <Humberto_Sanchez at hp.com>
+opentable	2368/udp    # OpenTable
+opentable	2368/tcp    # OpenTable
+#			   Thomas Theobald <ttheobald at opentable.com>
+acs2000-dsp	2369/udp    # ACS2000 DSP
+acs2000-dsp	2369/tcp    # ACS2000 DSP
+#			   Jeffrey Beauchamp <jeffrey.beauchamp at acs2000.net>
+l3-hbmon	2370/udp    # L3-HBMon
+l3-hbmon	2370/tcp    # L3-HBMon
+#			   Dolores Scott <Dolores.Scott at L-3security.com>
+#### Port 2370 Unofficially used by Compaq ####
+worldwire       2371/udp    # Compaq WorldWire Port
+worldwire       2371/tcp    # Compaq WorldWire Port
+#                          Michael Spratte <michael.spratte at compaq.com>
+#               2372-2380  Unassigned
+compaq-https    2381/udp    # Compaq HTTPS
+compaq-https    2381/tcp    # Compaq HTTPS
+#                          Scott Shaffer <scott.shaffer at hp.com>
+ms-olap3	2382/udp    # Microsoft OLAP
+ms-olap3	2382/tcp    # Microsoft OLAP
+ms-olap4	2383/udp    # Microsoft OLAP
+ms-olap4	2383/tcp    # Microsoft OLAP
+#			   Mosha Pasumansky <moshap at microsoft.com>
+sd-capacity     2384/udp    # SD-CAPACITY
+sd-request      2384/tcp    # SD-REQUEST
+#                          Jason McManus <jasonm at sleepdep.net>
+sd-data         2385/udp    # SD-DATA
+sd-data         2385/tcp    # SD-DATA
+#                          Jason McManus <jasonm at sleepdep.net>
+virtualtape	2386/udp    # Virtual Tape
+virtualtape	2386/tcp    # Virtual Tape
+vsamredirector  2387/udp    # VSAM Redirector
+vsamredirector  2387/tcp    # VSAM Redirector
+#                          Ingo Franzki <ifranzki at de.ibm.com>
+mynahautostart  2388/udp    # MYNAH AutoStart
+mynahautostart  2388/tcp    # MYNAH AutoStart
+#                          Thomas J. Klehr <tklehr at telcordia.com>
+ovsessionmgr	2389/udp    # OpenView Session Mgr
+ovsessionmgr	2389/tcp    # OpenView Session Mgr
+#			   Eric Pulsipher <eric_pulsipher at hp.com>
+rsmtp		2390/udp    # RSMTP
+rsmtp		2390/tcp    # RSMTP
+#			   Geoff Collyer <geoff at research.bell-labs.com>
+3com-net-mgmt	2391/udp    # 3COM Net Management
+3com-net-mgmt	2391/tcp    # 3COM Net Management
+#			   Prathibha Nagvar
+tacticalauth	2392/udp    # Tactical Auth
+tacticalauth	2392/tcp    # Tactical Auth
+#			   David Yon <yon at tactical-sw.com>   
+ms-olap1	2393/udp    # MS OLAP 1
+ms-olap1	2393/tcp    # MS OLAP 1
+ms-olap2	2394/udp    # MS OLAP 2
+ms-olap2	2394/tcp    # MS OLAP 2
+#			   Mosha Pasumansky <moshap at microsoft.com>
+lan900_remote	2395/udp    # LAN900 Remote
+lan900_remote	2395/tcp    # LAN900 Remote
+#			   Tom Quinlan <tquinlan at digitechinc.com>
+wusage 		2396/udp    # Wusage
+wusage		2396/tcp    # Wusage
+#			   Thomas Boutell <boutell at boutell.com>
+ncl		2397/udp    # NCL
+ncl		2397/tcp    # NCL
+#			   Robert Wiebe <crw010 at email.mot.com>
+orbiter		2398/udp    # Orbiter
+orbiter		2398/tcp    # Orbiter
+#			   David Goldberg <dgoldberg at callisto.com>
+fmpro-fdal	2399/udp    # FileMaker, Inc. - Data Access Layer
+fmpro-fdal	2399/tcp    # FileMaker, Inc. - Data Access Layer
+#			   Clay Maeckal <clay_maeckel at filemaker.com>
+opequus-server	2400/udp    # OpEquus Server
+opequus-server	2400/tcp    # OpEquus Server
+#			   Gavin Hutchinson <gavinh at tesl.com>
+cvspserver      2401/udp    # cvspserver
+cvspserver      2401/tcp    # cvspserver
+#                          Jim Kingdon <kingdon at harvey.cyclic.com>
+taskmaster2000	2402/udp    # TaskMaster 2000 Server
+taskmaster2000	2402/tcp    # TaskMaster 2000 Server
+taskmaster2000	2403/udp    # TaskMaster 2000 Web
+taskmaster2000	2403/tcp    # TaskMaster 2000 Web
+#			   Ed Odjaghian <edo at datacap.com>
+iec-104         2404/udp    # IEC 60870-5-104 process control over IP
+iec-104         2404/tcp    # IEC 60870-5-104 process control over IP
+#                          Walter K. Eichelburg <walter.eichelburg at sat-automation.com>
+trc-netpoll	2405/udp    # TRC Netpoll
+trc-netpoll	2405/tcp    # TRC Netpoll
+#			   Bizhan Ghavami <ghavami at telcores.com>
+jediserver	2406/udp    # JediServer
+jediserver	2406/tcp    # JediServer
+#			   Paul McEntire <paul.mcentire at columbiasc.ncr.com>
+orion           2407/udp    # Orion
+orion           2407/tcp    # Orion
+#                          Matthew Horoschun <mhoroschun at canprint.com.au>
+optimanet	2408/udp    # OptimaNet
+optimanet	2408/tcp    # OptimaNet
+#			   John Graham-Cumming <jgc at optimal.com>
+sns-protocol	2409/udp    # SNS Protocol
+sns-protocol	2409/tcp    # SNS Protocol
+#			   Amir Blich <amir at netmanage.co.il>
+vrts-registry	2410/udp    # VRTS Registry
+vrts-registry	2410/tcp    # VRTS Registry
+#			   Pranay Varma <pran at veritas.com>
+netwave-ap-mgmt	2411/udp    # Netwave AP Management
+netwave-ap-mgmt	2411/tcp    # Netwave AP Management
+#			   Johnny Zweig <zweig at netwave-wireless.com>
+cdn		2412/udp    # CDN
+cdn		2412/tcp    # CDN
+#			   Alan Noble <noble at netmind.com>
+orion-rmi-reg	2413/udp    # orion-rmi-reg
+orion-rmi-reg	2413/tcp    # orion-rmi-reg 
+#			   J.S. Greenfield <greeny at us.ibm.com>
+beeyond		2414/udp    # Beeyond
+beeyond		2414/tcp    # Beeyond
+#			   Bob Deblier <bob at virtualunlimited.com>
+codima-rtp      2415/udp    # Codima Remote Transaction Protocol
+codima-rtp      2415/tcp    # Codima Remote Transaction Protocol
+#                          Sylvia Ross <sross at codimatech.com>
+rmtserver	2416/udp    # RMT Server
+rmtserver	2416/tcp    # RMT Server	
+#			   Yvon Marineau <yvon at simware.com>
+composit-server	2417/udp    # Composit Server
+composit-server	2417/tcp    # Composit Server
+#			   Katsuaki Naoi <naoi at pfu.co.jp>
+cas		2418/udp    # cas
+cas		2418/tcp    # cas
+#			   Akiyoshi Ochi <akiyoshi at net.paso.fujitsu.co.jp>
+attachmate-s2s	2419/udp    # Attachmate S2S
+attachmate-s2s	2419/tcp    # Attachmate S2S
+#			   Chris Rominski <ChrisRom at attachmate.com>
+dslremote-mgmt	2420/udp    # DSL Remote Management
+dslremote-mgmt	2420/tcp    # DSL Remote Management
+#			   Westell, Inc. <jronk at westell.com> 	
+g-talk		2421/udp    # G-Talk
+g-talk		2421/tcp    # G-Talk
+#			   Matt Hammond <matt_hammond at four-sight.co.uk>
+crmsbits	2422/udp    # CRMSBITS
+crmsbits	2422/tcp    # CRMSBITS
+#			   Rod Ward <RWard at vaccmel1.telstra.com.au>
+rnrp		2423/udp    # RNRP
+rnrp		2423/tcp    # RNRP
+#			   Per Sahlqvist <psahlqvi at sw.seisy.abb.se>
+kofax-svr	2424/udp    # KOFAX-SVR
+kofax-svr	2424/tcp    # KOFAX-SVR
+#			   Terry Reagan <treagan at kofax.com>
+fjitsuappmgr	2425/udp    # Fujitsu App Manager
+fjitsuappmgr	2425/tcp    # Fujitsu App Manager
+#			   Hiroyuki Kawabuchi <buchi at ael.fujitsu.co.jp>
+#               2426       Unassigned (Removed 2002-04-29)
+mgcp-gateway    2427/udp    # Media Gateway Control Protocol Gateway
+mgcp-gateway    2427/tcp    # Media Gateway Control Protocol Gateway
+#                          Christian Huitema <huitema at research.telcordia.com>
+ott             2428/udp    # One Way Trip Time
+ott             2428/tcp    # One Way Trip Time
+#                          Greg Troxel <gdt at ir.bbn.com>
+ft-role		2429/udp    # FT-ROLE
+ft-role		2429/tcp    # FT-ROLE
+#			   Doug Boone <dboone at atg.CLR.com>
+venus		2430/udp    # venus
+venus		2430/tcp    # venus
+venus-se	2431/udp    # venus-se
+venus-se	2431/tcp    # venus-se
+codasrv		2432/udp    # codasrv
+codasrv		2432/tcp    # codasrv
+codasrv-se	2433/udp    # codasrv-se
+codasrv-se	2433/tcp    # codasrv-se
+#			   Robert Watson <robert at cyrus.watson.org>
+pxc-epmap	2434/udp    # pxc-epmap
+pxc-epmap	2434/tcp    # pxc-epmap
+#			   Jun Nakamura <jnakamur at cp10.es.xerox.com>
+optilogic	2435/udp    # OptiLogic
+optilogic	2435/tcp    # OptiLogic
+#			   Clark Williams <clark at wirespeed.com>
+topx		2436/udp    # TOP/X
+topx		2436/tcp    # TOP/X
+#			   Dragos Pop <dragos at cs.ubbcluj.ro>
+unicontrol	2437/udp    # UniControl
+unicontrol	2437/tcp    # UniControl
+#			   Ing. Markus Huemer <markus.huemer at hsd.at>
+msp		2438/udp    # MSP
+msp		2438/tcp    # MSP
+#			   Evan Caves <evan at acc.com>
+sybasedbsynch	2439/udp    # SybaseDBSynch
+sybasedbsynch	2439/tcp    # SybaseDBSynch
+#			   Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+spearway	2440/udp    # Spearway Lockers
+spearway	2440/tcp    # Spearway Lockers
+#			   Pierre Frisch <Pierre.Frisch at spearway.com>
+pvsw-inet       2441/udp    # Pervasive I*net Data Server
+pvsw-inet       2441/tcp    # Pervasive I*net Data Server
+#                          Chuck Talk <ctalk at pervasive.com>
+netangel	2442/udp    # Netangel
+netangel	2442/tcp    # Netangel
+#			   Ladislav Baranyay <identcod at identcode.sk>
+powerclientcsf  2443/udp    # PowerClient Central Storage Facility
+powerclientcsf  2443/tcp    # PowerClient Central Storage Facility
+#			   Brian Klassen <Brian.Klassen at Unisys.com>	
+btpp2sectrans   2444/udp    # BT PP2 Sectrans
+btpp2sectrans   2444/tcp    # BT PP2 Sectrans
+#                          Ian Daniels <btexact.ports at bt.com> 
+dtn1		2445/udp    # DTN1
+dtn1		2445/tcp    # DTN1
+#			   Bob Gaddie <bobg at dtn.com> 
+bues_service	2446/udp    # bues_service
+bues_service	2446/tcp    # bues_service
+#			   Leonhard Diekmann
+#                          <diekmann at 04.mstr02.telekom400.dbp.de>
+ovwdb		2447/udp    # OpenView NNM daemon
+ovwdb		2447/tcp    # OpenView NNM daemon
+#			   Eric Pulsipher <eric_pulsipher at fc.hp.com>
+hpppssvr	2448/udp    # hpppsvr
+hpppssvr	2448/tcp    # hpppsvr
+#			   Bridgette Landers <blanders at boi.hp.com>
+ratl		2449/udp    # RATL
+ratl		2449/tcp    # RATL
+#			   Paul Greenfield <paul.greenfield at unisys.com>
+netadmin	2450/udp    # netadmin
+netadmin	2450/tcp    # netadmin
+netchat		2451/udp    # netchat
+netchat		2451/tcp    # netchat
+#			   Julian Mehnle <julian at mehnle.net>
+snifferclient	2452/udp    # SnifferClient
+snifferclient	2452/tcp    # SnifferClient
+#			   Amy Weaver <amy_weaver at nai.com>
+madge-om	2453/udp    # madge-om
+madge-om	2453/tcp    # madge-om
+#			   Andrew Draper <adraper at dev.madge.com>
+indx-dds	2454/udp    # IndX-DDS
+indx-dds	2454/tcp    # IndX-DDS
+#			   Paul Carmichael <paulcarmichael at indx.net>
+wago-io-system	2455/udp    # WAGO-IO-SYSTEM
+wago-io-system	2455/tcp    # WAGO-IO-SYSTEM
+#			   Uwe Rathert <uwe.rathert at ieee.org>
+altav-remmgt	2456/udp    # altav-remmgt
+altav-remmgt	2456/tcp    # altav-remmgt
+#			   Gary M. Allen <gallen at symantec.com>
+rapido-ip	2457/udp    # Rapido_IP
+rapido-ip	2457/tcp    # Rapido_IP
+#			   Man Shuen Cheung <man_shuen_cheung at wamnet.co.uk>
+griffin		2458/udp    # griffin
+griffin		2458/tcp    # griffin
+#			   Tom Taylor <Tom.Taylor at unisys.com>
+community	2459/udp    # Community
+community	2459/tcp    # Community
+#			   David Schwartz <davids at webmaster.com>
+ms-theater	2460/udp    # ms-theater
+ms-theater	2460/tcp    # ms-theater
+#			   Anton Kucer <a-antonk at microsoft.com>
+qadmifoper	2461/udp    # qadmifoper
+qadmifoper	2461/tcp    # qadmifoper
+qadmifevent	2462/udp    # qadmifevent	
+qadmifevent	2462/tcp    # qadmifevent
+#			   Pekka Takaranta <pekka.takaranta at tellabs.fi>
+symbios-raid	2463/udp    # Symbios Raid
+symbios-raid	2463/tcp    # Symbios Raid
+#			   Bill Delaney <bill.delaney at symbios.com>
+direcpc-si	2464/udp    # DirecPC SI
+direcpc-si	2464/tcp    # DirecPC SI
+#			   Doug Dillon <dillon at hns.com>
+lbm		2465/udp    # Load Balance Management
+lbm		2465/tcp    # Load Balance Management
+lbf		2466/udp    # Load Balance Forwarding
+lbf		2466/tcp    # Load Balance Forwarding
+#			   Kazuhiro Koide <kaz at pfu.co.jp>
+high-criteria	2467/udp    # High Criteria
+high-criteria	2467/tcp    # High Criteria
+#			   Konstantin Iavid <kiavid at highcriteria.com>
+qip-msgd	2468/udp    # qip_msgd
+qip-msgd	2468/tcp    # qip_msgd
+#			   Mike Morgan <mmorgan at lucent.com>
+mti-tcs-comm	2469/udp    # MTI-TCS-COMM
+mti-tcs-comm	2469/tcp    # MTI-TCS-COMM
+#			   Mario Bonin <boninm at microtempus.com>
+taskman-port	2470/udp    # taskman port
+taskman-port	2470/tcp    # taskman port
+#			   Boris Panteleev <bpanteleev at himel.com>
+seaodbc		2471/udp    # SeaODBC
+seaodbc		2471/tcp    # SeaODBC
+#			   Adrian Hornby <Adrian.Hornby at aran.co.uk>
+c3		2472/udp    # C3
+c3		2472/tcp    # C3
+#			   Eckhard Grieger <e.grieger at com-on.de>
+aker-cdp	2473/udp    # Aker-cdp
+aker-cdp	2473/tcp    # Aker-cdp
+#			   Rodrigo Ormonde <ormonde at aker.com.br>
+vitalanalysis	2474/udp    # Vital Analysis
+vitalanalysis	2474/tcp    # Vital Analysis
+#			   Srinivas Reddy <sreddy at vitalsigns.com>
+ace-server	2475/udp    # ACE Server
+ace-server	2475/tcp    # ACE Server
+ace-svr-prop	2476/udp    # ACE Server Propagation
+ace-svr-prop	2476/tcp    # ACE Server Propagation
+ssm-cvs		2477/udp    # SecurSight Certificate Valifation Service
+ssm-cvs		2477/tcp    # SecurSight Certificate Valifation Service
+ssm-cssps	2478/udp    # SecurSight Authentication Server (SSL)
+ssm-cssps	2478/tcp    # SecurSight Authentication Server (SSL)
+ssm-els		2479/udp    # SecurSight Event Logging Server (SSL)
+ssm-els		2479/tcp    # SecurSight Event Logging Server (SSL)
+#			   John Linn <jlinn at securitydynamics.com>
+lingwood	2480/udp    # Lingwood's Detail
+lingwood	2480/tcp    # Lingwood's Detail
+#			   Dave Richmond <drichmond at striva.com>
+giop		2481/udp    # Oracle GIOP
+giop		2481/tcp    # Oracle GIOP
+giop-ssl	2482/udp    # Oracle GIOP SSL
+giop-ssl	2482/tcp    # Oracle GIOP SSL
+ttc		2483/udp    # Oracle TTC
+ttc		2483/tcp    # Oracle TTC
+ttc-ssl		2484/udp    # Oracle TTC SSL
+ttc-ssl		2484/tcp    # Oracle TTC SSL
+#			   Chandar Venkataraman <CVENKATA at us.oracle.com>
+netobjects1	2485/udp    # Net Objects1
+netobjects1	2485/tcp    # Net Objects1
+netobjects2	2486/udp    # Net Objects2
+netobjects2	2486/tcp    # Net Objects2
+#			   Francois Granade <francois at netobjects.com>
+pns		2487/udp    # Policy Notice Service
+pns		2487/tcp    # Policy Notice Service
+#			   Akiyoshi Ochi <akiyoshi at net.paso.fujitsu.co.jp>
+moy-corp	2488/udp    # Moy Corporation
+moy-corp	2488/tcp    # Moy Corporation
+#			   Gang Gong Moy
+tsilb		2489/udp    # TSILB
+tsilb		2489/tcp    # TSILB
+#			   James Irwin <jimi at travsoft.com>
+qip-qdhcp	2490/udp    # qip_qdhcp
+qip-qdhcp	2490/tcp    # qip_qdhcp
+#			   Mike Morgan <mmorgan at lucent.com>
+conclave-cpp	2491/udp    # Conclave CPP
+conclave-cpp	2491/tcp    # Conclave CPP
+#			   Larry Lipstone <lrl at interdyn.com>
+groove		2492/udp    # GROOVE
+groove		2492/tcp    # GROOVE
+#			   Ray Ozzie <ray at rocks.net>
+talarian-mqs	2493/udp    # Talarian MQS
+talarian-mqs	2493/tcp    # Talarian MQS
+#			   Jim Stabile <jstabile at talarian.com>
+bmc-ar		2494/udp    # BMC AR
+bmc-ar		2494/tcp    # BMC AR
+#			   Shelia Childs <sheila_childs at bmc.com>
+fast-rem-serv	2495/udp    # Fast Remote Services
+fast-rem-serv	2495/tcp    # Fast Remote Services
+#			   Scott St. Clair <stclair at NTC.ADAPTEC.com>
+dirgis		2496/udp    # DIRGIS
+dirgis		2496/tcp    # DIRGIS
+#			   Deutschland Informations- und
+#                          Reservierungsgesellschaft mbH <beratung at dirg.de>
+quaddb		2497/udp    # Quad DB
+quaddb		2497/tcp    # Quad DB
+#			   Jeff Rosenthal <jrosenthal at quad-sys.com>
+odn-castraq	2498/udp    # ODN-CasTraq
+odn-castraq	2498/tcp    # ODN-CasTraq
+#			   Richard Hodges <rh at source.net>
+unicontrol	2499/udp    # UniControl
+unicontrol	2499/tcp    # UniControl
+#			   Ing. Markus Huemer
+rtsserv         2500/udp    # Resource Tracking system server
+rtsserv         2500/tcp    # Resource Tracking system server
+rtsclient       2501/udp    # Resource Tracking system client
+rtsclient       2501/tcp    # Resource Tracking system client
+#                          Aubrey Turner
+#                          <S95525ta%etsuacad.bitnet at ETSUADMN.ETSU.EDU>
+kentrox-prot	2502/udp    # Kentrox Protocol
+kentrox-prot	2502/tcp    # Kentrox Protocol
+#			   Anil Lakhwara <anil_lakhwara at kentrox.com>
+nms-dpnss	2503/udp    # NMS-DPNSS
+nms-dpnss	2503/tcp    # NMS-DPNSS
+#			   Jean-Christophe Desire
+#			   <Jean-Christophe_Desire at NMS-Europe.com>	
+wlbs		2504/udp    # WLBS 
+wlbs		2504/tcp    # WLBS 
+#			   William Bain <bbain at microsoft.com>
+#           2505       Removed (2002-06-14)
+jbroker		2506/udp    # jbroker
+jbroker		2506/tcp    # jbroker
+#			   Rohit Garg <rohit at objectScape.com>
+spock		2507/udp    # spock
+spock		2507/tcp    # spock
+#			   Jon A. Christopher <jac8792 at tamu.edu>
+jdatastore	2508/udp    # JDataStore
+jdatastore	2508/tcp    # JDataStore
+#			   Tod Landis <tlandis at inprise.com>
+fjmpss		2509/udp    # fjmpss
+fjmpss		2509/tcp    # fjmpss
+#			   Makoto Watanabe <makoto at saint.nm.fujitsu.co.jp>
+fjappmgrbulk	2510/udp    # fjappmgrbulk
+fjappmgrbulk	2510/tcp    # fjappmgrbulk
+#			   Hiroyuki Kawabuchi <buchi at ael.fujitsu.co.jp>
+metastorm	2511/udp    # Metastorm
+metastorm	2511/tcp    # Metastorm
+#			   Eric Isom <eisom at metastorm.com>
+citrixima	2512/udp    # Citrix IMA
+citrixima	2512/tcp    # Citrix IMA
+citrixadmin	2513/udp    # Citrix ADMIN
+citrixadmin	2513/tcp    # Citrix ADMIN
+#			   Myk Willis <myk.willis at citrix.com>
+facsys-ntp	2514/udp    # Facsys NTP
+facsys-ntp	2514/tcp    # Facsys NTP
+facsys-router	2515/udp    # Facsys Router
+facsys-router	2515/tcp    # Facsys Router
+#			   Jeff Hoffman <jeffh at facsys.com>
+maincontrol	2516/udp    # Main Control   
+maincontrol	2516/tcp    # Main Control   
+#			   Nathan Sadia <sadia at maincontrol.com>	
+call-sig-trans	2517/udp    # H.323 Annex E call signaling transport
+call-sig-trans	2517/tcp    # H.323 Annex E call signaling transport
+#			   Gur Kimchi <gur.kimchi at vocaltec.com>
+willy		2518/udp    # Willy
+willy		2518/tcp    # Willy
+#			   Carl-Johan Wik <cjw at hudsmoar.com>
+globmsgsvc	2519/udp    # globmsgsvc
+globmsgsvc	2519/tcp    # globmsgsvc
+#			   David Wiltz <dwiltz at hf.intel.com>	
+pvsw            2520/udp    # Pervasive Listener
+pvsw            2520/tcp    # Pervasive Listener
+#                          Chuck Talk <ctalk at pervasive.com>
+adaptecmgr	2521/udp    # Adaptec Manager
+adaptecmgr	2521/tcp    # Adaptec Manager
+#			   Mark Parenti <map at ntc.adaptec.com>
+windb		2522/udp    # WinDb
+windb		2522/tcp    # WinDb
+#			   Larry Traylor <larry at arium.com>
+qke-llc-v3      2523/udp    # Qke LLC V.3
+qke-llc-v3      2523/tcp    # Qke LLC V.3
+#                          Joerg Niehoff <joerg.niehoff at alcatel-ke.de>
+optiwave-lm	2524/udp    # Optiwave License Management
+optiwave-lm	2524/tcp    # Optiwave License Management
+#			   Slawomir Krzesinski <slavek at optiwave.com>
+ms-v-worlds	2525/udp    # MS V-Worlds 
+ms-v-worlds	2525/tcp    # MS V-Worlds 
+#			   Pete Wong <petewong at microsoft.com>
+ema-sent-lm	2526/udp    # EMA License Manager
+ema-sent-lm	2526/tcp    # EMA License Manager
+#			   Thaddeus Perala <tr at emaden.com>
+iqserver	2527/udp    # IQ Server
+iqserver	2527/tcp    # IQ Server
+#			   Nick Straguzzi <Nick_Straguzzi at akbs.com>
+ncr_ccl		2528/udp    # NCR CCL
+ncr_ccl		2528/tcp    # NCR CCL
+#			   Amitava Dutta <Amitava.Dutta at WoodbridgeNJ.ncr.com>
+utsftp		2529/udp    # UTS FTP
+utsftp		2529/tcp    # UTS FTP
+#			   David Moore <dmoore at uttc-uts.com>
+vrcommerce	2530/udp    # VR Commerce
+vrcommerce	2530/tcp    # VR Commerce
+#			   Yosi Mass <yosimass at haifa.vnet.ibm.com>
+ito-e-gui	2531/udp    # ITO-E GUI
+ito-e-gui	2531/tcp    # ITO-E GUI
+#			   Michael Haeuptle <Michael_Haeuptle at hp.com>
+ovtopmd		2532/udp    # OVTOPMD
+ovtopmd		2532/tcp    # OVTOPMD
+#			   Eric Pulsipher <eric_pulsipher at hp.com>
+snifferserver	2533/udp    # SnifferServer
+snifferserver	2533/tcp    # SnifferServer
+#			   Amy Weaver <Amy_Weaver at NAI.com>
+combox-web-acc	2534/udp    # Combox Web Access
+combox-web-acc	2534/tcp    # Combox Web Access
+#		   	   Yochai Cohen <yochai at combox.co.il>
+madcap		2535/udp    # MADCAP
+madcap		2535/tcp    # MADCAP
+#			   Stephen Hanna <steve.hanna at sun.com>
+btpp2audctr1    2536/udp    # btpp2audctr1
+btpp2audctr1    2536/tcp    # btpp2audctr1
+#                          Ian Daniels <btexact.ports at bt.com>
+upgrade		2537/udp    # Upgrade Protocol
+upgrade		2537/tcp    # Upgrade Protocol
+#			   Breck Auten <bauten at dst-inc.com>
+vnwk-prapi	2538/udp    # vnwk-prapi
+vnwk-prapi	2538/tcp    # vnwk-prapi
+#			   John Hasselkus <Jhasselkus at VisualNetworks.com>
+vsiadmin	2539/udp    # VSI Admin
+vsiadmin	2539/tcp    # VSI Admin
+#			   Rob Juergens <robj at vsi.com>
+lonworks	2540/udp    # LonWorks
+lonworks	2540/tcp    # LonWorks
+lonworks2	2541/udp    # LonWorks2 
+lonworks2	2541/tcp    # LonWorks2
+#			   Gary Bartlett <garyb at echelon.com>
+davinci         2542/udp    # daVinci Presenter
+davinci         2542/tcp    # daVinci Presenter
+#                          b-novative GmbH <info at b-novative.com>
+reftek		2543/udp    # REFTEK
+reftek		2543/tcp    # REFTEK
+#			   Robert Banfill <r.banfill at reftek.com>
+novell-zen	2544/udp    # Novell ZEN
+novell-zen	2544/tcp    # Novell ZEN
+#			   Randy Cook <RACOOK at novell.com>
+sis-emt		2545/udp    # sis-emt
+sis-emt		2545/tcp    # sis-emt
+#			   Bill Crawford <Bill.Crawford at securicor.co.uk>
+vytalvaultbrtp	2546/udp    # vytalvaultbrtp
+vytalvaultbrtp  2546/tcp    # vytalvaultbrtp
+vytalvaultvsmp	2547/udp    # vytalvaultvsmp
+vytalvaultvsmp	2547/tcp    # vytalvaultvsmp
+vytalvaultpipe	2548/udp    # vytalvaultpipe
+vytalvaultpipe	2548/tcp    # vytalvaultpipe
+#			   Tim Boldt <timb at vytalnet.com>
+ipass		2549/udp    # IPASS
+ipass		2549/tcp    # IPASS
+#			   Michael Fischer <otterley at Pass.COM>
+ads		2550/udp    # ADS
+ads		2550/tcp    # ADS
+#			   Michael O'Connor <moconnor at adobe.com>
+isg-uda-server	2551/udp    # ISG UDA Server
+isg-uda-server	2551/tcp    # ISG UDA Server
+#			   Dror Harari <Dror.Harari at isgsoft.com>
+call-logging	2552/udp    # Call Logging
+call-logging	2552/tcp    # Call Logging
+#			   Dean Webb <dean.webb at ascend.com>
+efidiningport	2553/udp    # efidiningport
+efidiningport	2553/tcp    # efidiningport
+#			   Lynn Carter <carterl at execpc.com>
+vcnet-link-v10	2554/udp    # VCnet-Link v10
+vcnet-link-v10	2554/tcp    # VCnet-Link v10
+#			   Csaba Mate <mc36 at freemail.c3.hu>
+compaq-wcp	2555/udp    # Compaq WCP
+compaq-wcp	2555/tcp    # Compaq WCP
+#			   Ferruccio Barletta <ferruccio.barletta at compaq.com>
+nicetec-nmsvc	2556/udp    # nicetec-nmsvc
+nicetec-nmsvc	2556/tcp    # nicetec-nmsvc
+nicetec-mgmt	2557/udp    # nicetec-mgmt
+nicetec-mgmt	2557/tcp    # nicetec-mgmt
+#			   Joerg Paulus <tech at nicetec.de>	
+pclemultimedia	2558/udp    # PCLE Multi Media
+pclemultimedia	2558/tcp    # PCLE Multi Media
+#			   Bernd Scharping <bscharping at pinnaclesys.com>
+lstp		2559/udp    # LSTP
+lstp		2559/tcp    # LSTP
+#			   Waiki Wright <waiki at us.ibm.com>
+labrat		2560/udp    # labrat
+labrat		2560/tcp    # labrat
+#			   John Harvey <johnbob at austin.ibm.com>
+mosaixcc	2561/udp    # MosaixCC
+mosaixcc	2561/tcp    # MosaixCC
+#			   Steven Frare <stevefr at mosaix.com>
+delibo		2562/udp    # Delibo
+delibo		2562/tcp    # Delibo
+#			   NovaWiz LTD <Moshe at Novawiz.com>
+cti-redwood	2563/udp    # CTI Redwood
+cti-redwood	2563/tcp    # CTI Redwood
+#			   Songwon Chi <swchi at daou.co.kr>
+hp-3000-telnet  2564/tcp    # HP 3000 NS/VT block mode telnet
+#
+coord-svr	2565/udp    # Coordinator Server
+coord-svr	2565/tcp    # Coordinator Server
+#			   Richard Steiger <steiger at ensemblesoft.com>
+pcs-pcw		2566/udp    # pcs-pcw
+pcs-pcw		2566/tcp    # pcs-pcw
+#			   W. Jordan Fitzhugh <jfitz at pcare.com>
+clp		2567/udp    # Cisco Line Protocol
+clp		2567/tcp    # Cisco Line Protocol
+#			   Susan Hinrichs <shinrich at cisco.com>
+spamtrap	2568/udp    # SPAM TRAP
+spamtrap	2568/tcp    # SPAM TRAP
+#			   Chuck Bennett <chuck at benatong.com>
+sonuscallsig	2569/udp    # Sonus Call Signal
+sonuscallsig	2569/tcp    # Sonus Call Signal
+#			   Mark Garti <mgarti at sonusnet.com>
+hs-port		2570/udp    # HS Port
+hs-port		2570/tcp    # HS Port
+#			   Uri Doron <uri at il.netect.com>
+cecsvc		2571/udp    # CECSVC
+cecsvc		2571/tcp    # CECSVC
+#			   Roger Pao <rpao at corder-eng.com>
+ibp		2572/udp    # IBP
+ibp		2572/tcp    # IBP
+#			   Jonathan Downes <jonno at activ.net.au>
+trustestablish  2573/udp    # Trust Establish
+trustestablish  2573/tcp    # Trust Establish
+#                          Yosi Mass <yosimass at haifa.vnet.ibm.com>
+blockade-bpsp   2574/udp    # Blockade BPSP
+blockade-bpsp   2574/tcp    # Blockade BPSP
+#                          VP - Research & Development <development at blockade.com>
+hl7             2575/udp    # HL7
+hl7             2575/tcp    # HL7
+#                          Tim Jacobs
+tclprodebugger  2576/udp    # TCL Pro Debugger
+tclprodebugger  2576/tcp    # TCL Pro Debugger
+scipticslsrvr   2577/udp    # Scriptics Lsrvr
+scipticslsrvr   2577/tcp    # Scriptics Lsrvr
+#                          Brent Welch <welch at scriptics.com>
+rvs-isdn-dcp	2578/udp    # RVS ISDN DCP
+rvs-isdn-dcp	2578/tcp    # RVS ISDN DCP
+#			   Michael Zirpel <mbz at rvscom.com>	
+mpfoncl		2579/udp    # mpfoncl
+mpfoncl		2579/tcp    # mpfoncl
+#			   Itaru Kimura <kimura at kel.fujitsu.co.jp>
+tributary	2580/udp    # Tributary
+tributary	2580/tcp    # Tributary
+#			   Louis Lu <LouisL at bristol.com>
+argis-te	2581/udp    # ARGIS TE
+argis-te	2581/tcp    # ARGIS TE
+argis-ds	2582/udp    # ARGIS DS
+argis-ds	2582/tcp    # ARGIS DS
+#			   John Legh-Page <john.legh-page at argis.com>
+mon		2583/udp    # MON
+mon		2583/tcp    # MON
+#			   Jim Trocki <trockij at transmeta.com>
+cyaserv		2584/udp    # cyaserv
+cyaserv		2584/tcp    # cyaserv
+#			   Morgan Jones <mwj at cyasolutions.com>
+netx-server	2585/udp    # NETX Server
+netx-server	2585/tcp    # NETX Server
+netx-agent	2586/udp    # NETX Agent
+netx-agent	2586/tcp    # NETX Agent
+#			   Brett Dolecheck <Dolecheck at IPMetrics.com>
+masc		2587/udp    # MASC
+masc		2587/tcp    # MASC
+#			   Pavlin Ivanov Radoslavov 
+#			   <pavlin at catarina.usc.edu> 
+privilege	2588/udp    # Privilege
+privilege	2588/tcp    # Privilege
+#			   Gil Hecht <GilH at aks.com>
+quartus-tcl	2589/udp    # quartus tcl
+quartus-tcl	2589/tcp    # quartus tcl
+#			   Subroto Datta <subrotod at altera.com>
+idotdist	2590/udp    # idotdist
+idotdist	2590/tcp    # idotdist
+#			   Jason Hunter <jthunter at invino.com>
+maytagshuffle	2591/udp    # Maytag Shuffle
+maytagshuffle	2591/tcp    # Maytag Shuffle
+#			   Maytag Corporation <hbuck at maytag.com>
+netrek          2592/udp    # netrek
+netrek          2592/tcp    # netrek
+#                          Al Guetzlaff <aeg at teamquest.com>
+mns-mail	2593/udp    # MNS Mail Notice Service
+mns-mail	2593/tcp    # MNS Mail Notice Service
+#			   Rumiko Kikuta <kiku at nd.net.fujitsu.co.jp>
+dts		2594/udp    # Data Base Server
+dts		2594/tcp    # Data Base Server
+#			   Andreas Roene <support at home-online.de>
+worldfusion1	2595/udp    # World Fusion 1
+worldfusion1	2595/tcp    # World Fusion 1
+worldfusion2	2596/udp    # World Fusion 2
+worldfusion2	2596/tcp    # World Fusion 2
+#			   World Fusion <net at worldfusion.com>
+homesteadglory	2597/udp    # Homestead Glory
+homesteadglory	2597/tcp    # Homestead Glory
+#			   John Tokash <jtokash at homestead.com>
+citriximaclient	2598/udp    # Citrix MA Client
+citriximaclient	2598/tcp    # Citrix MA Client
+#			   Myk Willis <myk.willis at citrix.com>
+snapd           2599/udp    # Snap Discovery
+snapd           2599/tcp    # Snap Discovery
+#                          Kevin Osborn <kosborn at snapappliance.com>
+hpstgmgr	2600/udp    # HPSTGMGR
+hpstgmgr	2600/tcp    # HPSTGMGR
+#			   Kevin Collins <kevinc at .cnd.hp.com>
+discp-client	2601/udp    # discp client
+discp-client	2601/tcp    # discp client
+discp-server	2602/udp    # discp server
+discp-server	2602/tcp    # discp server
+#			   Peter White <peter_white at 3com.com>
+servicemeter	2603/udp    # Service Meter
+servicemeter	2603/tcp    # Service Meter
+#			   Duncan Hare <Duncan.Hare at synoia.com>
+nsc-ccs		2604/udp    # NSC CCS	
+nsc-ccs		2604/tcp    # NSC CCS	
+nsc-posa	2605/udp    # NSC POSA
+nsc-posa	2605/tcp    # NSC POSA
+#			   Tom Findley <tom.findley at networksciences.net>
+netmon		2606/udp    # Dell Netmon
+netmon		2606/tcp    # Dell Netmon
+connection	2607/udp    # Dell Connection
+connection	2607/tcp    # Dell Connection
+#			   Sudhir Shetty <Sudhir_Shetty at Dell.com>
+wag-service	2608/udp    # Wag Service
+wag-service	2608/tcp    # Wag Service
+#			   Gilles Bourquard <gbo at wag.ch>
+system-monitor	2609/udp    # System Monitor 
+system-monitor	2609/tcp    # System Monitor 
+#			   Greg Robson-Garth <gregr at alphalink.com.au>
+versa-tek	2610/udp    # VersaTek
+versa-tek	2610/tcp    # VersaTek
+#			   James Kou <Jamesk at versatek.com>
+lionhead	2611/udp    # LIONHEAD
+lionhead	2611/tcp    # LIONHEAD
+#			   Tim Rance <trance at lionhead.co.uk>
+qpasa-agent	2612/udp    # Qpasa Agent
+qpasa-agent	2612/tcp    # Qpasa Agent
+#			   Craig Ching <cching at mqsoftware.com> 
+smntubootstrap	2613/udp    # SMNTUBootstrap
+smntubootstrap	2613/tcp    # SMNTUBootstrap
+#			   Matt Cecile <mattc at metrics.com>
+neveroffline	2614/udp    # Never Offline
+neveroffline	2614/tcp    # Never Offline
+#			   Dustin Brand <amo at amo.net>
+firepower       2615/udp    # firepower
+firepower       2615/tcp    # firepower
+#                          Jason Volk <jason at teknidude.com>
+appswitch-emp	2616/udp    # appswitch-emp
+appswitch-emp	2616/tcp    # appswitch-emp
+#			   Ted Ross <ross at TopLayer.com>
+cmadmin		2617/udp    # Clinical Context Managers
+cmadmin		2617/tcp    # Clinical Context Managers
+#			   Mark Morwood <markm at sentillion.com>  
+priority-e-com	2618/udp    # Priority E-Com
+priority-e-com	2618/tcp    # Priority E-Com
+#			   Marcelo Einhorn <marcelo at eshbel.com>
+bruce		2619/udp    # bruce
+bruce		2619/tcp    # bruce
+#			   Alec Muffett <alecm at sun.com>
+lpsrecommender	2620/udp    # LPSRecommender
+lpsrecommender	2620/tcp    # LPSRecommender
+#			   Pritham Shetty <pritham at andromedia.com>
+miles-apart	2621/udp    # Miles Apart Jukebox Server
+miles-apart	2621/tcp    # Miles Apart Jukebox Server
+#			   Michael Rathmann <rathmann_ia at milesinfo.com>
+metricadbc	2622/udp    # MetricaDBC
+metricadbc	2622/tcp    # MetricaDBC
+#			   Russ Olivant <russ.olivant at metrica.co.uk>
+lmdp		2623/udp    # LMDP
+lmdp		2623/tcp    # LMDP
+#			   Ken Bailey <kbailey at rockettalk.com>
+aria		2624/udp    # Aria
+aria		2624/tcp    # Aria
+#			   Logan Bruns <logan at andromedia.com>
+blwnkl-port	2625/udp    # Blwnkl Port
+blwnkl-port	2625/tcp    # Blwnkl Port
+#			   Weng Chin (Winson) Yung <Winson_Yung at 3com.com>
+gbjd816		2626/udp    # gbjd816
+gbjd816		2626/tcp    # gbjd816
+#			   George Balesta <George.Baletsa at tfn.com>
+moshebeeri	2627/udp    # Moshe Beeri
+moshebeeri	2627/tcp    # Moshe Beeri
+#			   Moshe Beeri <moshe at whale-com.com>
+dict		2628/udp    # DICT
+dict		2628/tcp    # DICT
+#			   Rik Faith <faith at cs.unc.edu>
+sitaraserver	2629/udp    # Sitara Server
+sitaraserver	2629/tcp    # Sitara Server
+sitaramgmt	2630/udp    # Sitara Management
+sitaramgmt	2630/tcp    # Sitara Management
+sitaradir	2631/udp    # Sitara Dir
+sitaradir	2631/tcp    # Sitara Dir
+#		  	   Manickam R.Sridhar <msridhar at sitaranetworks.com>
+irdg-post	2632/udp    # IRdg Post
+irdg-post	2632/tcp    # IRdg Post
+#			   IRdg, Inc. <jtaylor at irdg.com>
+interintelli	2633/udp    # InterIntelli
+interintelli	2633/tcp    # InterIntelli
+#			   Mike Gagle <MikeG at inter-intelli.com>
+pk-electronics  2634/udp    # PK Electronics
+pk-electronics  2634/tcp    # PK Electronics
+#			   Seb Ibis <seb_ibis at pkworld.com>
+backburner	2635/udp    # Back Burner
+backburner	2635/tcp    # Back Burner
+#			   Kevin Teiskoetter <kevint at metacreations.com>
+solve		2636/udp    # Solve
+solve		2636/tcp    # Solve
+#			   Peter Morrison <peter_morrison at sydney.sterling.com>
+imdocsvc	2637/udp    # Import Document Service
+imdocsvc	2637/tcp    # Import Document Service
+#			   Zia Bhatti <zia at netright.com>
+sybaseanywhere	2638/udp    # Sybase Anywhere
+sybaseanywhere  2638/tcp    # Sybase Anywhere
+#			   Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+aminet		2639/udp    # AMInet
+aminet		2639/tcp    # AMInet
+#			   Alcorn McBride Inc. <jeff at alcorn.com>
+sai_sentlm	2640/udp    # Sabbagh Associates Licence Manager
+sai_sentlm	2640/tcp    # Sabbagh Associates Licence Manager
+#			   Elias Sabbagh <ehs at sabbagh.com>
+hdl-srv		2641/udp    # HDL Server
+hdl-srv		2641/tcp    # HDL Server
+#			   David Ely <dely at cnri.reston.va.us>
+tragic		2642/udp    # Tragic
+tragic		2642/tcp    # Tragic
+#			   Stu Mark <fordii at j51.com>
+gte-samp	2643/udp    # GTE-SAMP
+gte-samp	2643/tcp    # GTE-SAMP
+#			   Asher Altman <Asher.Altman at GSC.GTE.Com>
+travsoft-ipx-t	2644/udp    # Travsoft IPX Tunnel
+travsoft-ipx-t	2644/tcp    # Travsoft IPX Tunnel
+#			   Jack Wilson <JackW at travsoft.com>
+novell-ipx-cmd	2645/udp    # Novell IPX CMD
+novell-ipx-cmd	2645/tcp    # Novell IPX CMD
+#			   Juan Carlos Luciani <jluciani at novell.com>
+and-lm		2646/udp    # AND License Manager
+and-lm		2646/tcp    # AND License Manager
+#			   Dick van der Sijs <dick at and.nl>
+syncserver	2647/udp    # SyncServer
+syncserver	2647/tcp    # SyncServer
+#			   Dave Finnegan <dave at syncinc.com>
+upsnotifyprot	2648/udp    # Upsnotifyprot
+upsnotifyprot	2648/tcp    # Upsnotifyprot
+#			   Mario Leboute <leboute at pro.via-rs.com.br>
+vpsipport	2649/udp    # VPSIPPORT
+vpsipport	2649/tcp    # VPSIPPORT
+#			   Joon Radley <jradley at csir.co.za>
+eristwoguns     2650/udp    # eristwoguns
+eristwoguns     2650/tcp    # eristwoguns
+#                          NetPro Computing Inc. <ports at netpro.com>
+ebinsite	2651/udp    # EBInSite
+ebinsite	2651/tcp    # EBInSite
+#			   Lefteris Kalamaras <lefteris at ebi.com>
+interpathpanel	2652/udp    # InterPathPanel
+interpathpanel	2652/tcp    # InterPathPanel
+#			   Stephen Misel <steve.misel at interpath.net>
+sonus		2653/udp    # Sonus
+sonus		2653/tcp    # Sonus
+#			   Mark Garti <mgarti at sonusnet.com>
+corel_vncadmin  2654/udp    # Corel VNC Admin
+corel_vncadmin	2654/tcp    # Corel VNC Admin
+#			   Oleg Noskov <olegn at corelcomputer.com>
+unglue		2655/udp    # UNIX Nt Glue
+unglue		2655/tcp    # UNIX Nt Glue
+#			   Peter Santoro <peter at pscomp.com>
+kana		2656/udp    # Kana
+kana		2656/tcp    # Kana
+#			   Colin Goldstein <Colin at kana.com>
+sns-dispatcher	2657/udp    # SNS Dispatcher
+sns-dispatcher	2657/tcp    # SNS Dispatcher
+sns-admin	2658/udp    # SNS Admin
+sns-admin	2658/tcp    # SNS Admin
+sns-query	2659/udp    # SNS Query
+sns-query	2659/tcp    # SNS Query
+#			   Mary Holstege <holstege at firstfloor.com>
+gcmonitor	2660/udp    # GC Monitor
+gcmonitor	2660/tcp    # GC Monitor
+#			   Gustavo Rodriguez-Rivera <grr at geodesic.com>
+olhost		2661/udp    # OLHOST
+olhost		2661/tcp    # OLHOST
+#			   Robert Ripberger <rip at lan-aces.com>
+bintec-capi	2662/udp    # BinTec-CAPI
+bintec-capi	2662/tcp    # BinTec-CAPI
+bintec-tapi	2663/udp    # BinTec-TAPI
+bintec-tapi	2663/tcp    # BinTec-TAPI
+#
+patrol-mq-gm	2664/udp    # Patrol for MQ GM
+patrol-mq-gm	2664/tcp    # Patrol for MQ GM
+patrol-mq-nm	2665/udp    # Patrol for MQ NM
+patrol-mq-nm	2665/tcp    # Patrol for MQ NM
+#			   Richard Nikula <richard_nikula at bmc.com>
+extensis	2666/udp    # extensis
+extensis	2666/tcp    # extensis
+#			   Milton Sagen <msagen at extensis.com>	
+alarm-clock-s	2667/udp    # Alarm Clock Server
+alarm-clock-s	2667/tcp    # Alarm Clock Server
+alarm-clock-c	2668/udp    # Alarm Clock Client
+alarm-clock-c	2668/tcp    # Alarm Clock Client
+toad		2669/udp    # TOAD
+toad		2669/tcp    # TOAD
+#			   Michael Marking <marking at tatanka.com>
+tve-announce	2670/udp    # TVE Announce
+tve-announce	2670/tcp    # TVE Announce
+#			   Dean Blackketter <dean at corp.webtv.net>
+newlixreg	2671/udp    # newlixreg
+newlixreg	2671/tcp    # newlixreg
+#			   Jean-Serge Gagnon <jsg at newlix.com>
+nhserver	2672/udp    # nhserver
+nhserver	2672/tcp    # nhserver
+#			   Adrian Hornby <Adrian.Hornby at aran.co.uk>
+firstcall42	2673/udp    # First Call 42 
+firstcall42	2673/tcp    # First Call 42 
+#			   Luke Bowen <leb at tfn.com>
+ewnn		2674/udp    # ewnn
+ewnn		2674/tcp    # ewnn
+#			   Yasunari Yamashita <yamasita at omronsoft.co.jp>
+ttc-etap	2675/udp    # TTC ETAP
+ttc-etap	2675/tcp    # TTC ETAP
+#			   Daniel Becker <becker2d at ttc.com>
+simslink	2676/udp    # SIMSLink
+simslink	2676/tcp    # SIMSLink
+#			   Steve Ryckman <sryckman at simsware.com>
+gadgetgate1way	2677/udp    # Gadget Gate 1 Way
+gadgetgate1way	2677/tcp    # Gadget Gate 1 Way
+gadgetgate2way	2678/udp    # Gadget Gate 2 Way
+gadgetgate2way	2678/tcp    # Gadget Gate 2 Way
+#			   Matt Rollins <matt at internetgadgets.com>
+syncserverssl	2679/udp    # Sync Server SSL
+syncserverssl	2679/tcp    # Sync Server SSL
+#			   Dave Finnegan <dave at syncinc.com>
+pxc-sapxom	2680/udp    # pxc-sapxom
+pxc-sapxom	2680/tcp    # pxc-sapxom
+#			   Hideki Kiriyama <kiriyama at cp10.es.xerox.com>
+mpnjsomb	2681/udp    # mpnjsomb
+mpnjsomb	2681/tcp    # mpnjsomb
+#			   Takenori Miyahara <miyahara at pfu.co.jp>
+#               2682   Removed (2002-04-30)
+ncdloadbalance	2683/udp    # NCDLoadBalance 
+ncdloadbalance	2683/tcp    # NCDLoadBalance 
+#			   Tim Stevenson <tes at ncd.com>
+mpnjsosv	2684/udp    # mpnjsosv
+mpnjsosv	2684/tcp    # mpnjsosv
+mpnjsocl	2685/udp    # mpnjsocl
+mpnjsocl	2685/tcp    # mpnjsocl
+mpnjsomg	2686/udp    # mpnjsomg
+mpnjsomg	2686/tcp    # mpnjsomg
+#			   Takenori Miyahara <miyahara at pfu.co.jp>
+pq-lic-mgmt	2687/udp    # pq-lic-mgmt
+pq-lic-mgmt	2687/tcp    # pq-lic-mgmt
+#			   Bob Sledge <bob at pqsystems.com>
+md-cg-http	2688/udp    # md-cf-http
+md-cg-http	2688/tcp    # md-cf-http
+#			   Lyndon Nerenberg <lyndon at execmail.ca>
+fastlynx	2689/udp    # FastLynx
+fastlynx	2689/tcp    # FastLynx
+#			   Dave Sewell <dave at sewelld.com>
+hp-nnm-data	2690/udp    # HP NNM Embedded Database
+hp-nnm-data	2690/tcp    # HP NNM Embedded Database
+#			   Chris Das <cdas at cnd.hp.com>
+itinternet	2691/udp    # ITInternet ISM Server
+itinternet	2691/tcp    # ITInternet ISM Server
+#			   Ron Ehli <ron at itinternet.net>
+admins-lms	2692/udp    # Admins LMS
+admins-lms	2692/tcp    # Admins LMS
+#			   Dagfinn Saether <Dagfinn at admins.com>
+belarc-http	2693/udp    # belarc-http
+belarc-http	2693/tcp    # belarc-http
+#			   Gary Newman <gnewman at belarc.com>
+pwrsevent	2694/udp    # pwrsevent	
+pwrsevent	2694/tcp    # pwrsevent	
+#			   Yoshinobu Nakamura
+#			   <nakamura at np.lps.cs.fujitsu.co.jp>
+vspread		2695/udp    # VSPREAD
+vspread		2695/tcp    # VSPREAD
+#			   Sumitake kobayashi
+#			   <kobayashi at np.lps.cs.fujitsu.co.jp>
+unifyadmin      2696/udp    # Unify Admin
+unifyadmin      2696/tcp    # Unify Admin
+#                          Duane Gibson <ianaportmaster at unify.com>
+oce-snmp-trap   2697/udp    # Oce SNMP Trap Port 
+oce-snmp-trap   2697/tcp    # Oce SNMP Trap Port 
+#                          Peter Teeuwen <ptee at oce.nl>
+mck-ivpip	2698/udp    # MCK-IVPIP
+mck-ivpip	2698/tcp    # MCK-IVPIP
+#			   Robert Vincent <bert at mck.com>
+csoft-plusclnt	2699/udp    # Csoft Plus Client
+csoft-plusclnt	2699/tcp    # Csoft Plus Client
+#			   Nedelcho Stanev <nstanev at csoft.bg>
+tqdata          2700/udp    # tqdata
+tqdata          2700/tcp    # tqdata
+#                          Al Guetzlaff <aeg at teamquest.com>
+sms-rcinfo	2701/udp    # SMS RCINFO
+sms-rcinfo	2701/tcp    # SMS RCINFO
+sms-xfer	2702/udp    # SMS XFER
+sms-xfer	2702/tcp    # SMS XFER
+sms-chat	2703/udp    # SMS CHAT
+sms-chat	2703/tcp    # SMS CHAT
+sms-remctrl	2704/udp    # SMS REMCTRL
+sms-remctrl	2704/tcp    # SMS REMCTRL
+#			   Tom Friend <tomfr at microsoft.com>
+sds-admin	2705/udp    # SDS Admin
+sds-admin	2705/tcp    # SDS Admin
+#			   Don Traub <don.traub at sun.com>
+ncdmirroring	2706/udp    # NCD Mirroring
+ncdmirroring	2706/tcp    # NCD Mirroring
+#			   Tim Stevenson <tes at ncd.com>
+emcsymapiport	2707/udp    # EMCSYMAPIPORT
+emcsymapiport	2707/tcp    # EMCSYMAPIPORT
+#			   Bruce Ferjulian <ferjulian_bruce at emc.com>
+banyan-net	2708/udp    # Banyan-Net
+banyan-net	2708/tcp    # Banyan-Net
+#			   R. Thirumurthy <rtm at banyannetworks.com>
+supermon	2709/udp    # Supermon
+supermon	2709/tcp    # Supermon
+#			   Ron Minnich <rminnich at acl.lanl.gov>
+sso-service	2710/udp    # SSO Service
+sso-service	2710/tcp    # SSO Service
+sso-control	2711/udp    # SSO Control
+sso-control	2711/tcp    # SSO Control
+#			   Martin Proulx <mproulx at okiok.com>
+aocp		2712/udp    # Axapta Object Communication Protocol
+aocp		2712/tcp    # Axapta Object Communication Protocol
+#			   Jakob Steen Hansen <jsh at dk.damgaard.com>
+raven1		2713/udp    # Raven1
+raven1		2713/tcp    # Raven1
+raven2		2714/udp    # Raven2
+raven2		2714/tcp    # Raven2
+#			   Daniel Sorlov <Daniel at sorlov.com>
+hpstgmgr2	2715/udp    # HPSTGMGR2
+hpstgmgr2	2715/tcp    # HPSTGMGR2
+#			   Kevin Collins <kevinc at cnd.hp.com>
+inova-ip-disco	2716/udp    # Inova IP Disco
+inova-ip-disco	2716/tcp    # Inova IP Disco
+#			   Chris Koeritz <ckoeritz at inovacorp.com>
+pn-requester	2717/udp    # PN REQUESTER
+pn-requester	2717/tcp    # PN REQUESTER
+pn-requester2	2718/udp    # PN REQUESTER 2
+pn-requester2	2718/tcp    # PN REQUESTER 2
+#			   Edmund Chang <Edmund_Chang at bmc.com>
+scan-change	2719/udp    # Scan & Change
+scan-change	2719/tcp    # Scan & Change
+#			   Alexander Raji <araji at lucent.com>
+wkars		2720/udp    # wkars
+wkars		2720/tcp    # wkars
+#			   Barry Shelton <bshelton at wirelessknowledge.com>
+smart-diagnose	2721/udp    # Smart Diagnose
+smart-diagnose	2721/tcp    # Smart Diagnose
+#			   Geoffry Meek <geoff at meek.com>
+proactivesrvr	2722/udp    # Proactive Server
+proactivesrvr	2722/tcp    # Proactive Server
+#			   Dalit Naor <dalit at il.ibm.com>
+watchdognt	2723/udp    # WatchDog NT
+watchdognt	2723/tcp    # WatchDog NT
+#			   Glen Sansoucie <glens at llmwin.com>
+qotps		2724/udp    # qotps
+qotps		2724/tcp    # qotps
+#			   Piotr Parlewicz <pparlewicz at queryobject.com>
+msolap-ptp2     2725/udp    # MSOLAP PTP2
+msolap-ptp2     2725/tcp    # MSOLAP PTP2
+#                          Cristian Petculescu <cristp at microsoft.com>
+tams            2726/udp    # TAMS
+tams            2726/tcp    # TAMS
+#                          David Leinbach <dleinbach at jti.bc.ca>
+mgcp-callagent  2727/udp    # Media Gateway Control Protocol Call Agent
+mgcp-callagent  2727/tcp    # Media Gateway Control Protocol Call Agent
+#                          Christian Huitema <huitema at research.telcordia.com>
+sqdr		2728/udp    # SQDR
+sqdr		2728/tcp    # SQDR
+#			   Matthew Orzen <standards at starquest.com>
+tcim-control	2729/udp    # TCIM Control
+tcim-control	2729/tcp    # TCIM Control
+#			   Dean Skelton <mdskel at ftw.rsc.raytheon.com>
+nec-raidplus	2730/udp    # NEC RaidPlus
+nec-raidplus	2730/tcp    # NEC RaidPlus
+#			   Yusuke Asai <yasai at nw1.file.fc.nec.co.jp>
+fyre-messanger	2731/udp    # Fyre Messagner
+fyre-messanger	2731/tcp    # Fyre Messanger
+#			   Robert Waters <bobtek at hotmail.com>
+g5m		2732/udp    # G5M
+g5m		2732/tcp    # G5M
+#			   Graham Klyne <GK at ACM.ORG>
+signet-ctf	2733/udp    # Signet CTF
+signet-ctf	2733/tcp    # Signet CTF
+#			   Greg Broiles <greg at sac.net>
+ccs-software	2734/udp    # CCS Software 
+ccs-software	2734/tcp    # CCS Software 
+#			   Bertus Jacobs <bertus at ccs-software.co.za>
+netiq-mc        2735/udp    # NetIQ Monitor Console
+netiq-mc        2735/tcp    # NetIQ Monitor Console
+#			   Scott Southard <scott.southard at netiq.com>
+radwiz-nms-srv	2736/udp    # RADWIZ NMS SRV
+radwiz-nms-srv	2736/tcp    # RADWIZ NMS SRV
+#			   Israel Shainert <israels at 209.88.177.2>
+srp-feedback	2737/udp    # SRP Feedback
+srp-feedback	2737/tcp    # SRP Feedback
+#			   Werner Almesberger <Werner.Almesberger at epfl.ch>
+ndl-tcp-ois-gw	2738/udp    # NDL TCP-OSI Gateway
+ndl-tcp-ois-gw	2738/tcp    # NDL TCP-OSI Gateway
+#			   Martin Norman <martin at ndl.co.uk> 
+tn-timing	2739/udp    # TN Timing
+tn-timing	2739/tcp    # TN Timing
+#			   Paul Roberts <PaulRoberts at engineer.com>
+alarm		2740/udp    # Alarm
+alarm		2740/tcp    # Alarm
+#			   Uriy Makasjuk <racer at bfpg.ru>
+tsb		2741/udp    # TSB
+tsb		2741/tcp    # TSB
+tsb2		2742/udp    # TSB2
+tsb2		2742/tcp    # TSB2
+#			   Ashish Chatterjee
+#			   <achatterjee at freeway.proxy.lucent.com>
+murx		2743/udp    # murx
+murx		2743/tcp    # murx
+#			   Thomas Kuiper <engerim at dachbu.de>
+honyaku		2744/udp    # honyaku
+honyaku		2744/tcp    # honyaku
+#			   Yasunari Yamashita <yamasita at omronsoft.co.jp>
+urbisnet	2745/udp    # URBISNET
+urbisnet	2745/tcp    # URBISNET
+#			   Urbis.Net Ltd <postmaster at urbis.net>
+cpudpencap	2746/udp    # CPUDPENCAP
+cpudpencap	2746/tcp    # CPUDPENCAP
+#			   Tamir Zegman <zegman at checkpoint.com>
+fjippol-swrly	2747/udp # 
+fjippol-swrly	2747/tcp # 
+fjippol-polsvr	2748/udp # 
+fjippol-polsvr	2748/tcp # 
+fjippol-cnsl	2749/udp # 
+fjippol-cnsl	2749/tcp # 
+fjippol-port1	2750/udp # 
+fjippol-port1	2750/tcp # 
+fjippol-port2	2751/udp # 
+fjippol-port2	2751/tcp # 
+#			   Shoichi Tachibana <tatibana at yk.fujitsu.co.jp>
+rsisysaccess	2752/udp    # RSISYS ACCESS
+rsisysaccess	2752/tcp    # RSISYS ACCESS
+#			   Christophe Besant
+de-spot		2753/udp    # de-spot
+de-spot		2753/tcp    # de-spot
+#			   Sanjay Parekh <spot at digitalenvoy.net>
+apollo-cc	2754/udp    # APOLLO CC
+apollo-cc	2754/tcp    # APOLLO CC
+#			   Brand Communications <donovan at brandcomms.com>
+expresspay	2755/udp    # Express Pay
+expresspay	2755/tcp    # Express Pay
+#			   Ben Higgins <bhiggins at netcom.ca>
+simplement-tie	2756/udp    # simplement-tie
+simplement-tie	2756/tcp    # simplement-tie
+#			   Tzvika Chumash <tzvikac at netvision.net.il>
+cnrp		2757/udp    # CNRP
+cnrp		2757/tcp    # CNRP
+#			   Jacob Ulmert <Jacob.Ulmert at se.abb.com>
+apollo-status	2758/udp    # APOLLO Status
+apollo-status	2758/tcp    # APOLLO Status
+apollo-gms	2759/udp    # APOLLO GMS
+apollo-gms	2759/tcp    # APOLLO GMS
+#			   Simon Hovell <simonh at brandcomms.com>
+sabams		2760/udp    # Saba MS
+sabams		2760/tcp    # Saba MS
+#			   Davoud Maha <dmaha at saba.com>
+dicom-iscl	2761/udp    # DICOM ISCL
+dicom-iscl	2761/tcp    # DICOM ISCL
+dicom-tls	2762/udp    # DICOM TLS
+dicom-tls	2762/tcp    # DICOM TLS
+#			   Lawrence Tarbox <ltarbox at scr.siemens.com>
+desktop-dna	2763/udp    # Desktop DNA
+desktop-dna	2763/tcp    # Desktop DNA
+#			   Jon Walker <jwalker at miramarsys.com>
+data-insurance	2764/udp    # Data Insurance
+data-insurance	2764/tcp    # Data Insurance
+#			   Brent Irwin <birwin at standard.com>
+qip-audup	2765/udp    # qip-audup
+qip-audup	2765/tcp    # qip-audup
+#			   Mike Morgan <mmorgan at lucent.com>
+compaq-scp	2766/udp    # Compaq SCP
+compaq-scp	2766/tcp    # Compaq SCP
+#			   Ferruccio Barletta <ferruccio.barletta at compaq.com>
+uadtc		2767/udp    # UADTC
+uadtc		2767/tcp    # UADTC
+uacs		2768/udp    # UACS
+uacs		2768/tcp    # UACS
+#			   Vishwas Lele <Vishwas_Lele at appliedis.com>
+singlept-mvs	2769/udp    # Single Point MVS
+singlept-mvs	2769/tcp    # Single Point MVS
+#			   Thomas Anderson <anderson at clark.net>
+veronica	2770/udp    # Veronica
+veronica	2770/tcp    # Veronica
+#			   Jonas Oberg <jonas at coyote.org>
+vergencecm	2771/udp    # Vergence CM
+vergencecm	2771/tcp    # Vergence CM
+#			   Mark Morwood <markm at sentillion.com>
+auris		2772/udp    # auris
+auris		2772/tcp    # auris
+#			   Francisco Saez Arance <fsaez at tid.es>
+rbakcup1        2773/udp   # RBackup Remote Backup
+rbakcup1        2773/tcp   # RBackup Remote Backup
+rbakcup2        2774/udp   # RBackup Remote Backup
+rbakcup2        2774/tcp   # RBackup Remote Backup
+#                         Rob Cosgrove <rob at alice.net>
+smpp		2775/udp    # SMPP
+smpp		2775/tcp    # SMPP
+#			   Owen Sullivan <owen.sullivan at aldiscon.ie>
+ridgeway1	2776/udp    # Ridgeway Systems & Software
+ridgeway1	2776/tcp    # Ridgeway Systems & Software
+ridgeway2	2777/udp    # Ridgeway Systems & Software
+ridgeway2	2777/tcp    # Ridgeway Systems & Software
+#			   Steve Read <sread at ridgeway-sys.com>
+gwen-sonya	2778/udp    # Gwen-Sonya 
+gwen-sonya	2778/tcp    # Gwen-Sonya 
+#			   Mark Hurst <mhurst at inconnect.com>
+lbc-sync	2779/udp    # LBC Sync
+lbc-sync	2779/tcp    # LBC Sync
+lbc-control	2780/udp    # LBC Control
+lbc-control	2780/tcp    # LBC Control
+#			   Keiji Michine <michine at net.paso.fujitsu.co.jp>
+whosells	2781/udp    # whosells
+whosells	2781/tcp    # whosells
+#			   William Randolph Royere III 
+#                          <william at royere.net>
+everydayrc	2782/udp    # everydayrc
+everydayrc	2782/tcp    # everydayrc
+#			   Ahti Heinla <ahti at ahti.bluemoon.ee>
+aises		2783/udp    # AISES
+aises		2783/tcp    # AISES
+#			   Daniel Grazioli <dgrazioli at pgaero.co.uk>
+www-dev         2784/udp    # world wide web - development
+www-dev         2784/tcp    # world wide web - development
+aic-np          2785/udp    # aic-np
+aic-np          2785/tcp    # aic-np
+#                          Brad Parker <brad at american.com>
+aic-oncrpc      2786/udp    # aic-oncrpc - Destiny MCD database
+aic-oncrpc      2786/tcp    # aic-oncrpc - Destiny MCD database
+#                          Brad Parker  <brad at american.com>
+piccolo         2787/udp    # piccolo - Cornerstone Software
+piccolo         2787/tcp    # piccolo - Cornerstone Software
+#                          Dave Bellivea <DaveBelliveau at corsof.com>
+fryeserv        2788/udp    # NetWare Loadable Module - Seagate Software
+fryeserv        2788/tcp    # NetWare Loadable Module - Seagate Software
+#                          Joseph LoPilato 
+#                          <Joseph_M_LoPilato at notes.seagate.com>
+media-agent     2789/udp    # Media Agent
+media-agent     2789/tcp    # Media Agent
+#			   Nitzan Daube <nitzan at brm.com>
+plgproxy	2790/udp    # PLG Proxy
+plgproxy	2790/tcp    # PLG Proxy
+#			   Charlie Hava <charlieh at aks.com>
+mtport-regist	2791/udp    # MT Port Registrator
+mtport-regist	2791/tcp    # MT Port Registrator
+#			   Maxim Tseitlin <mtseitlin at iname.com>
+f5-globalsite	2792/udp    # f5-globalsite
+f5-globalsite	2792/tcp    # f5-globalsite
+#			   Christian Saether <c.saether at f5.com>
+initlsmsad	2793/udp    # initlsmsad
+initlsmsad	2793/tcp    # initlsmsad
+#			   Kelly Green <green at compaq.com>
+aaftp		2794/udp    # aaftp
+aaftp		2794/tcp    # aaftp
+#			   E. Jay Berkenbilt <ejb at ql.org>
+livestats	2795/udp    # LiveStats
+livestats	2795/tcp    # LiveStats
+#			   Chris Greene <cgreeneOA at avidsports.com>
+ac-tech		2796/udp    # ac-tech
+ac-tech		2796/tcp    # ac-tech
+#			   Chiming Huang <chuang at ac-tech.com>
+esp-encap	2797/udp    # esp-encap
+esp-encap	2797/tcp    # esp-encap
+#			   Jorn Sierwald <joern.sierwald at datafellows.com>
+tmesis-upshot	2798/udp    # TMESIS-UPShot
+tmesis-upshot	2798/tcp    # TMESIS-UPShot
+#			   Brian Schenkenberger <VAXman at TMESIS.COM>
+icon-discover	2799/udp    # ICON Discover
+icon-discover	2799/tcp    # ICON Discover
+#			   Alexander Falk <falk at icon.at>
+acc-raid	2800/udp    # ACC RAID
+acc-raid	2800/tcp    # ACC RAID
+#			   Scott St. Clair <stclair at ntc.adaptec.com>
+igcp		2801/udp    # IGCP
+igcp		2801/tcp    # IGCP
+#			   David Hampson <davidha at codemasters.com>
+veritas-udp1	2802/udp    # Veritas UDP1
+veritas-tcp1	2802/tcp    # Veritas TCP1
+#			   Russ Thrasher <Russell.Thrasher at veritas.com>
+btprjctrl	2803/udp    # btprjctrl
+btprjctrl	2803/tcp    # btprjctrl
+#			   Huw Thomas <huw.thomas at bt.com>
+telexis-vtu	2804/udp    # Telexis VTU
+telexis-vtu	2804/tcp    # Telexis VTU
+#			   Todd White <twhite at telexicorp.com>
+wta-wsp-s	2805/udp    # WTA WSP-S
+wta-wsp-s	2805/tcp    # WTA WSP-S
+#			   Sebastien Bury (WAP Forum)
+#			   <sebastien.bury at art.alcatel.fr>
+cspuni		2806/udp    # cspuni
+cspuni		2806/tcp    # cspuni
+cspmulti	2807/udp    # cspmulti
+cspmulti	2807/tcp    # cspmulti
+#			   Terumasa Yoneda <yonedat at pfu.co.jp>
+j-lan-p		2808/udp    # J-LAN-P
+j-lan-p		2808/tcp    # J-LAN-P
+#			   Takeshi Sahara <sahara at jdl.co.jp>
+corbaloc	2809/udp    # CORBA LOC
+corbaloc	2809/tcp    # CORBA LOC
+#			   Ted McFadden <mcfadden at dstc.edu.au>
+netsteward	2810/udp    # Active Net Steward
+netsteward	2810/tcp    # Active Net Steward
+#			   Keith Morley <keith at ndl.co.uk>
+gsiftp		2811/udp    # GSI FTP
+gsiftp		2811/tcp    # GSI FTP
+#			   Von Welch <vwelch at ncsa.uiuc.edu>
+atmtcp		2812/udp    # atmtcp
+atmtcp		2812/tcp    # atmtcp
+#			   Werner Almesberger <Werner.Almesberger at epfl.ch>
+llm-pass	2813/udp    # llm-pass
+llm-pass	2813/tcp    # llm-pass
+llm-csv		2814/udp    # llm-csv
+llm-csv		2814/tcp    # llm-csv
+#			   Glen Sansoucie <glen at llmwin.com>
+lbc-measure	2815/udp    # LBC Measurement
+lbc-measure	2815/tcp    # LBC Measurement
+lbc-watchdog	2816/udp    # LBC Watchdog
+lbc-watchdog	2816/tcp    # LBC Watchdog
+#			   Akiyoshi Ochi <akiyoshi at net.paso.fujitsu.co.jp>
+nmsigport	2817/udp    # NMSig Port
+nmsigport	2817/tcp    # NMSig Port
+#			   Peter Egli <peter.egli at mail.inalp.com>
+rmlnk		2818/udp    # rmlnk
+rmlnk		2818/tcp    # rmlnk
+fc-faultnotify	2819/udp    # FC Fault Notification
+fc-faultnotify	2819/tcp    # FC Fault Notification
+#			   Dave Watkins <davew at boi.hp.com>
+univision	2820/udp    # UniVision
+univision	2820/tcp    # UniVision
+#			   Keith Ansell <KeithA at fastfreenet.com> 
+vrts-at-port    2821/udp    # VERITAS Authentication Service
+vrts-at-port    2821/tcp    # VERITAS Authentication Service
+#                          Stefan Winkel <stefan at veritas.com>
+ka0wuc		2822/udp    # ka0wuc
+ka0wuc		2822/tcp    # ka0wuc
+#			   Kit Haskins <kit at ka0wuc.org>
+cqg-netlan	2823/udp    # CQG Net/LAN
+cqg-netlan	2823/tcp    # CQG Net/LAN
+cqg-netlan-1    2824/udp    # CQG Net/Lan 1 
+cqg-netlan-1    2824/tcp    # CQG Net/LAN 1
+#			   Jeff Wood <jw at cqg.com>
+#               2825       (unassigned) Possibly assigned
+slc-systemlog	2826/udp    # slc systemlog
+slc-systemlog	2826/tcp    # slc systemlog
+slc-ctrlrloops	2827/udp    # slc ctrlrloops
+slc-ctrlrloops	2827/tcp    # slc ctrlrloops
+#			   Erwin Hogeweg <erwin at airtech.demon.nl>
+itm-lm		2828/udp    # ITM License Manager 
+itm-lm		2828/tcp    # ITM License Manager 
+#			   Miles O'Neal <meo at us.itmasters.com>
+silkp1		2829/udp    # silkp1
+silkp1		2829/tcp    # silkp1
+silkp2		2830/udp    # silkp2
+silkp2		2830/tcp    # silkp2
+silkp3		2831/udp    # silkp3
+silkp3		2831/tcp    # silkp3
+silkp4		2832/udp    # silkp4
+silkp4		2832/tcp    # silkp4
+#			   Erik Skyten <eki at silknet.com>
+glishd		2833/udp    # glishd
+glishd		2833/tcp    # glishd
+#			   Darrell Schiebel <dschieb at cv.nrao.edu>
+evtp		2834/udp    # EVTP
+evtp		2834/tcp    # EVTP
+evtp-data	2835/udp    # EVTP-DATA
+evtp-data	2835/tcp    # EVTP-DATA
+#			   Eric Bruno <ebruno at solution-soft.com> 
+catalyst	2836/udp    # catalyst
+catalyst	2836/tcp    # catalyst
+#			   Garret Tollkuhn <garret at multiviewgroup.com>
+repliweb	2837/udp    # Repliweb
+repliweb	2837/tcp    # Repliweb
+#			   William Orme <bill at repliweb.com>
+starbot		2838/udp    # Starbot
+starbot		2838/tcp    # Starbot
+#			   Markus Sabadello <sabadello at starbot.org>
+nmsigport	2839/udp    # NMSigPort
+nmsigport	2839/tcp    # NMSigPort
+#			   Peter Egli <peter.egli at mail.inalp.com>
+l3-exprt	2840/udp    # l3-exprt
+l3-exprt	2840/tcp    # l3-exprt
+l3-ranger	2841/udp    # l3-ranger
+l3-ranger	2841/tcp    # l3-ranger
+l3-hawk		2842/udp    # l3-hawk
+l3-hawk		2842/tcp    # l3-hawk
+#			   Dolores Scott <dolores.scott at l-3security.com>
+pdnet		2843/udp    # PDnet
+pdnet		2843/tcp    # PDnet
+#			   Torsten Scheffler <torsten.scheffler at apex.de>
+bpcp-poll	2844/udp    # BPCP POLL
+bpcp-poll	2844/tcp    # BPCP POLL
+bpcp-trap	2845/udp    # BPCP TRAP
+bpcp-trap	2845/tcp    # BPCP TRAP
+#			   Steve Van Duser
+#                          <steve.vanduser at bestpower.gensig.com>
+aimpp-hello	2846/udp    # AIMPP Hello
+aimpp-hello	2846/tcp    # AIMPP Hello
+aimpp-port-req	2847/udp    # AIMPP Port Req
+aimpp-port-req	2847/tcp    # AIMPP Port Req
+#			   Brian Martinicky
+#                          <Brian_Martinicky at automationintelligence.com>
+amt-blc-port	2848/udp    # AMT-BLC-PORT
+amt-blc-port	2848/tcp    # AMT-BLC-PORT
+#			   Sandra Frulloni <frulloni.amtec at interbusiness.it>
+fxp		2849/udp    # FXP
+fxp		2849/tcp    # FXP
+#			   Martin Lichtin <lichtin at oanda.com>
+metaconsole	2850/udp    # MetaConsole
+metaconsole	2850/tcp    # MetaConsole
+#			   Rakesh Mahajan <rmahajan at netaphor-software.com>
+webemshttp	2851/udp    # webemshttp
+webemshttp	2851/tcp    # webemshttp
+#			   Stephen Tsun <stsun at jetstream.com>
+bears-01	2852/udp    # bears-01
+bears-01	2852/tcp    # bears-01
+#			   Bruce McKinnon <brucemck at bears.aust.com>
+ispipes		2853/udp    # ISPipes
+ispipes		2853/tcp    # ISPipes
+#			   Rajesh Nandyalam <rnandyal at emc.com>
+infomover	2854/udp    # InfoMover
+infomover	2854/tcp    # InfoMover
+#			   Carla Caputo <caputo at emc.com>
+cesdinv		2856/udp    # cesdinv
+cesdinv		2856/tcp    # cesdinv
+#			   Yoshiaki Tokumoto <toku at pfu.co.jp>
+simctlp		2857/udp    # SimCtIP
+simctlp		2857/tcp    # SimCtIP
+#			   Christian Zietz <czietz at gmx.net>
+ecnp		2858/udp    # ECNP
+ecnp		2858/tcp    # ECNP
+#			   Robert Reimiller <bob at certsoft.com>
+activememory	2859/udp    # Active Memory
+activememory	2859/tcp    # Active Memory
+#			   Joe Graham <joe at edaconsulting.com>
+dialpad-voice1	2860/udp    # Dialpad Voice 1
+dialpad-voice1	2860/tcp    # Dialpad Voice 1
+dialpad-voice2	2861/udp    # Dialpad Voice 2
+dialpad-voice2	2861/tcp    # Dialpad Voice 2
+#			   Wongyu Cho <wgcho at dialpad.com>
+ttg-protocol	2862/udp    # TTG Protocol
+ttg-protocol	2862/tcp    # TTG Protocol
+#			   Mark Boler <markb at ttgsoftware.com>
+sonardata	2863/udp    # Sonar Data
+sonardata	2863/tcp    # Sonar Data
+#			   Ian Higginbottom <sonardata at sonardata.com>
+astromed-main	2864/udp    # main 5001 cmd
+astromed-main	2864/tcp    # main 5001 cmd
+#			   Chris Tate <ctate at astromed.com>
+pit-vpn		2865/udp    # pit-vpn
+pit-vpn		2865/tcp    # pit-vpn
+#			   Norbert Sendetzky <norbert at linuxnetworks.de>
+iwlistener	2866/udp    # iwlistener
+iwlistener	2866/tcp    # iwlistener
+#			   Fred Surr <quest_iana at oz.quest.com>
+esps-portal	2867/udp    # esps-portal
+esps-portal	2867/tcp    # esps-portal
+#			   Nicholas Stowfis <nstowfis at esps.com>
+npep-messaging	2868/udp    # NPEP Messaging
+npep-messaging	2868/tcp    # NPEP Messaging
+#			   Kristian A. Bognaes <kbo at norman.no>
+icslap		2869/udp    # ICSLAP
+icslap		2869/tcp    # ICSLAP
+#			   Richard Lamb <rlamb at microsoft.com>
+daishi		2870/udp    # daishi
+daishi		2870/tcp    # daishi
+#			   Patrick Chipman <pchipman at memphis.edu>
+msi-selectplay	2871/udp    # MSI Select Play
+msi-selectplay	2871/tcp    # MSI Select Play
+#			   Paul Fonte <paul_fonte at mediastation.com>
+radix		2872/udp    # RADIX
+radix		2872/tcp    # RADIX
+#			   Stein Roger Skaflotten
+#                          <sskaflot at online.no>
+paspar2-zoomin	2873/udp    # PASPAR2 ZoomIn
+paspar2-zoomin	2873/tcp    # PASPAR2 ZoomIn
+#			   Amonn David <amnon at paspar2.com>
+dxmessagebase1	2874/udp    # dxmessagebase1
+dxmessagebase1	2874/tcp    # dxmessagebase1
+dxmessagebase2	2875/udp    # dxmessagebase2
+dxmessagebase2	2875/tcp    # dxmessagebase2
+#			   Ozz Nixon <root at delphix.com>
+sps-tunnel	2876/udp    # SPS Tunnel
+sps-tunnel	2876/tcp    # SPS Tunnel
+#			   Bill McIntosh <bmcintosh at fortresstech.com>
+bluelance	2877/udp    # BLUELANCE
+bluelance	2877/tcp    # BLUELANCE
+#			   Michael Padrezas <mpaderzas at bluelance.com>
+aap		2878/udp    # AAP
+aap		2878/tcp    # AAP
+#			   Stephen Hanna <steve.hanna at sun.com>
+ucentric-ds	2879/udp    # ucentric-ds
+ucentric-ds	2879/tcp    # ucentric-ds
+#			   Alex Vasilevsky <alexv at 204.165.216.115>
+synapse		2880/udp    # Synapse Transport
+synapse		2880/tcp    # Synapse Transport
+#			   Ali Fracyon <sxdev at modulardreams.com>
+ndsp		2881/udp    # NDSP
+ndsp		2881/tcp    # NDSP
+ndtp		2882/udp    # NDTP
+ndtp		2882/tcp    # NDTP
+ndnp		2883/udp    # NDNP
+ndnp		2883/tcp    # NDNP
+#			   Khelben Blackstaff <khelben at gmx.at>
+flashmsg	2884/udp    # Flash Msg
+flashmsg	2884/tcp    # Flash Msg
+#			   Jeffrey Zinkerman <jeff at zinknet.com>
+topflow		2885/udp    # TopFlow
+topflow		2885/tcp    # TopFlow
+#			   Ted Ross <ross at toplayer.com>
+responselogic   2886/udp    # RESPONSELOGIC
+responselogic   2886/tcp    # RESPONSELOGIC
+#			   Bruce Casey <bcasey at responselogic.com>
+aironetddp      2887/udp    # aironet
+aironetddp      2887/tcp    # aironet
+#			   Victor Griswold <vgris at aironet.com> 	
+spcsdlobby      2888/udp    # SPCSDLOBBY
+spcsdlobby      2888/tcp    # SPCSDLOBBY
+#			   Matthew Williams <SPCsd_MWDD at hotmail.com> 
+rsom            2889/udp    # RSOM
+rsom            2889/tcp    # RSOM
+#			   Justine Higgins <iana at corsof.com>
+cspclmulti      2890/udp    # CSPCLMULTI
+cspclmulti      2890/tcp    # CSPCLMULTI
+#			   Yoneda Terumasa <yonedat at pfu.co.jp>
+cinegrfx-elmd   2891/udp    # CINEGRFX-ELMD License Manager
+cinegrfx-elmd   2891/tcp    # CINEGRFX-ELMD License Manager
+#			   Greg Ercolano <erco at cinegrfx.com>
+snifferdata     2892/udp    # SNIFFERDATA
+snifferdata     2892/tcp    # SNIFFERDATA
+#			   Jeff Mangasarian <jeffrey_mangasarian at nai.com>
+vseconnector    2893/udp    # VSECONNECTOR
+vseconnector    2893/tcp    # VSECONNECTOR
+#			   Ingo Franzki <ifranzki at de.ibm.com>
+abacus-remote   2894/udp    # ABACUS-REMOTE
+abacus-remote   2894/tcp    # ABACUS-REMOTE
+#			   Mike Bello <mbello at zarak.com>
+natuslink       2895/udp    # NATUS LINK
+natuslink       2895/tcp    # NATUS LINK
+#			   Jonathan Mergy <mergy at natus.com>
+ecovisiong6-1   2896/udp    # ECOVISIONG6-1
+ecovisiong6-1   2896/tcp    # ECOVISIONG6-1
+#			   Henrik Holst <henrik.holst at ecovision.se>	
+citrix-rtmp	2897/udp    # Citrix RTMP
+citrix-rtmp	2897/tcp    # Citrix RTMP
+#			   Myk Willis <myk.willis at citrix.com>
+appliance-cfg   2898/udp    # APPLIANCE-CFG
+appliance-cfg   2898/tcp    # APPLIANCE-CFG
+#                          Gary A. James <gary.james at criticallink.com>
+powergemplus    2899/udp    # POWERGEMPLUS
+powergemplus    2899/tcp    # POWERGEMPLUS
+#                          Koich Nakamura <naka at case.nm.fujitsu.co.jp>
+quicksuite      2900/udp    # QUICKSUITE
+quicksuite      2900/tcp    # QUICKSUITE
+#                          William Egge <begge at emagisoft.com> 
+allstorcns      2901/udp    # ALLSTORCNS
+allstorcns      2901/tcp    # ALLSTORCNS
+#                          Steve Dobson <sdobson at allstor.com> 
+netaspi         2902/udp    # NET ASPI
+netaspi         2902/tcp    # NET ASPI
+#                          Johnson Luo <johnson_luo at mail.sercomm.com.tw> 
+suitcase        2903/udp    # SUITCASE
+suitcase        2903/tcp    # SUITCASE
+#                          Milton E. Sagen <msagen at extensis.com> 
+m2ua            2904/sctp   # M2UA
+m2ua            2904/udp    # M2UA
+m2ua            2904/tcp    # M2UA
+#                          Lyndon Ong <LyOng at ciena.com>
+m3ua            2905/sctp   # M3UA
+m3ua            2905/udp    # De-registered (2001 June 07)
+m3ua            2905/tcp    # M3UA
+#                          Lyndon Ong <LyOng at ciena.com>
+caller9         2906/udp    # CALLER9
+caller9         2906/tcp    # CALLER9
+#                          Shams Naqi <SSNAQVI at aol.com>
+webmethods-b2b  2907/udp    # WEBMETHODS B2B
+webmethods-b2b  2907/tcp    # WEBMETHODS B2B
+#                          Joseph Hines <jhines at webmethods.com>
+mao             2908/udp    # mao
+mao             2908/tcp    # mao
+#                          Marc Baudoin <babafou at babafou.eu.org>
+funk-dialout	2909/udp    # Funk Dialout
+funk-dialout 	2909/tcp    # Funk Dialout
+#			   Cimarron Boozer <cboozer at funk.com>
+tdaccess	2910/udp    # TDAccess
+tdaccess	2910/tcp    # TDAccess
+#			   Tom Haapanen <tomh at metrics.com>
+blockade        2911/udp    # Blockade
+blockade        2911/tcp    # Blockade
+#                          VP - Research & Development <development at blockade.com>
+epicon		2912/udp    # Epicon
+epicon		2912/tcp    # Epicon
+#			   Michael Khalandovsky <mlk at epicon.com>
+boosterware	2913/udp    # Booster Ware
+boosterware	2913/tcp    # Booster Ware
+#		 	   Ido Ben-David <dgntcom at netvision.net.il>
+gamelobby       2914/udp    # Game Lobby
+gamelobby       2914/tcp    # Game Lobby
+#                          Paul Ford-Hutchinson <paulfordh at uk.ibm.com>
+tksocket	2915/udp    # TK Socket
+tksocket	2915/tcp    # TK Socket
+#			   Alan Fahrner <alan at protix.com>
+elvin_server	2916/udp    # Elvin Server
+elvin_server	2916/tcp    # Elvin Server
+elvin_client	2917/udp    # Elvin Client
+elvin_client	2917/tcp    # Elvin Client
+#			   David Arnold <davida at pobox.com>
+kastenchasepad	2918/udp    # Kasten Chase Pad
+kastenchasepad	2918/tcp    # Kasten Chase Pad
+#			   Marc Gauthier <mgau at kastenchase.com>
+roboer          2919/udp    # ROBOER
+roboer          2919/tcp    # ROBOER
+#                          Paul Snook <paul.snook at heroix.co.uk>
+roboeda         2920/udp    # ROBOEDA
+roboeda         2920/tcp    # ROBOEDA
+#                          Paul Snook <paul.snook at heroix.co.uk>
+cesdcdman       2921/udp    # CESD Contents Delivery Management
+cesdcdman       2921/tcp    # CESD Contents Delivery Management
+#                          Shinya Abe <abeabe at pfu.co.jp>
+cesdcdtrn       2922/udp    # CESD Contents Delivery Data Transfer
+cesdcdtrn       2922/tcp    # CESD Contents Delivery Data Transfer
+#                          Shinya Abe <abeabe at pfu.co.jp> 
+wta-wsp-wtp-s   2923/udp    # WTA-WSP-WTP-S
+wta-wsp-wtp-s   2923/tcp    # WTA-WSP-WTP-S
+#                          Sebastien Bury (WAP Forum)
+#                          <sebastien.bury at art.alcatel.fr>
+precise-vip     2924/udp    # PRECISE-VIP
+precise-vip     2924/tcp    # PRECISE-VIP
+#                          Michael Landwehr <mikel at precisesoft.co.il>
+#               2925       Unassigned (FRP-Released 12/7/00)
+mobile-file-dl  2926/udp    # MOBILE-FILE-DL
+mobile-file-dl  2926/tcp    # MOBILE-FILE-DL
+#                          Mitsuji Toda <toda at mmedia.mci.mei.co.jp>
+unimobilectrl   2927/udp    # UNIMOBILECTRL
+unimobilectrl   2927/tcp    # UNIMOBILECTRL
+#                          Vikas <vikas at graycell.com>
+redstone-cpss   2928/udp    # REDSTONE-CPSS
+redstone-cpss   2928/tcp    # REDSTONE-CPSS
+#                          Jeff Looman <jeff at looman.org>
+amx-webadmin    2929/udp    # AMX-WEBADMIN
+amx-webadmin    2929/tcp    # AMX-WEBADMIN
+#                          Mike Morris <mike.morris at amx.com>
+amx-weblinx     2930/udp    # AMX-WEBLINX
+amx-weblinx     2930/tcp    # AMX-WEBLINX
+#                          Mike Morris <mike.morris at amx.com>
+circle-x        2931/udp    # Circle-X
+circle-x        2931/tcp    # Circle-X
+#                          Norm Freedman <normfree at worldnet.att.net>
+incp            2932/udp    # INCP
+incp            2932/tcp    # INCP
+#                          Keith Paulsen <kpaulsen at phobos.com>
+4-tieropmgw     2933/udp    # 4-TIER OPM GW
+4-tieropmgw     2933/tcp    # 4-TIER OPM GW 
+#                          Francois Peloffy <fpeloffy at 4tier.com>
+4-tieropmcli    2934/udp    # 4-TIER OPM CLI
+4-tieropmcli    2934/tcp    # 4-TIER OPM CLI
+#                          Francois Peloffy <fpeloffy at 4tier.com>
+qtp             2935/udp    # QTP
+qtp             2935/tcp    # QTP
+#                          Cameron Young <Cameron_Young at inetco.com>
+otpatch         2936/udp    # OTPatch
+otpatch         2936/tcp    # OTPatch
+#                          Thomas J. Theobald <ttheobald at opentable.com>
+pnaconsult-lm   2937/udp    # PNACONSULT-LM
+pnaconsult-lm   2937/tcp    # PNACONSULT-LM
+#                          Theo Nijssen <theon at nijssen.nl>
+sm-pas-1        2938/udp    # SM-PAS-1
+sm-pas-1        2938/tcp    # SM-PAS-1
+sm-pas-2        2939/udp    # SM-PAS-2
+sm-pas-2        2939/tcp    # SM-PAS-2
+sm-pas-3        2940/udp    # SM-PAS-3
+sm-pas-3        2940/tcp    # SM-PAS-3
+sm-pas-4        2941/udp    # SM-PAS-4
+sm-pas-4        2941/tcp    # SM-PAS-4
+sm-pas-5        2942/udp    # SM-PAS-5
+sm-pas-5        2942/tcp    # SM-PAS-5
+#                          Tom Haapanen <tomh at metrics.com> 
+ttnrepository   2943/udp    # TTNRepository
+ttnrepository   2943/tcp    # TTNRepository
+#                          Robert Orr <rorr at teltone.com> 
+megaco-h248     2944/udp    # Megaco H-248
+megaco-h248     2944/tcp    # Megaco H-248
+h248-binary     2945/udp    # H248 Binary
+h248-binary     2945/tcp    # H248 Binary
+#                          Tom Taylor <taylor at nortelnetworks.com> 
+fjsvmpor        2946/udp    # FJSVmpor
+fjsvmpor        2946/tcp    # FJSVmpor
+#                          Naoki Hayashi <ha at fjh.se.fujitsu.co.jp>
+gpsd            2947/udp    # GPSD
+gpsd            2947/tcp    # GPSD
+#                          Derrick J. Brashear <shadow at dementia.org>
+wap-push        2948/udp    # WAP PUSH
+wap-push        2948/tcp    # WAP PUSH
+wap-pushsecure  2949/udp    # WAP PUSH SECURE
+wap-pushsecure  2949/tcp    # WAP PUSH SECURE
+#                          WAP FORUM <wap-feedback at mail.wapforum.org>
+esip            2950/udp    # ESIP
+esip            2950/tcp    # ESIP
+#                          David Stephenson <david_stephenson at hp.com>
+ottp            2951/udp    # OTTP
+ottp            2951/tcp    # OTTP
+#                          Brent Foster <brent.foster at onstreamsystems.com>
+mpfwsas         2952/udp    # MPFWSAS
+mpfwsas         2952/tcp    # MPFWSAS
+#                          Toru Murai <murai at saint.nm.fujitsu.co.jp>
+ovalarmsrv      2953/udp    # OVALARMSRV
+ovalarmsrv      2953/tcp    # OVALARMSRV
+ovalarmsrv-cmd  2954/udp    # OVALARMSRV-CMD
+ovalarmsrv-cmd  2954/tcp    # OVALARMSRV-CMD
+#                          Eric Pulsipher <eric_pulsipher at hp.com>
+csnotify        2955/udp    # CSNOTIFY
+csnotify        2955/tcp    # CSNOTIFY
+#                          Israel Beniaminy <israel.beniaminy at clickservice.com>
+ovrimosdbman    2956/udp    # OVRIMOSDBMAN
+ovrimosdbman    2956/tcp    # OVRIMOSDBMAN
+#                          Dimitrios Souflis <dsouflis at altera.gr>
+jmact5          2957/udp    # JAMCT5
+jmact5          2957/tcp    # JAMCT5
+jmact6          2958/udp    # JAMCT6
+jmact6          2958/tcp    # JAMCT6
+rmopagt         2959/udp    # RMOPAGT
+rmopagt         2959/tcp    # RMOPAGT
+#                          Shuji Okubo <okubo at yk.fujitsu.co.jp>
+dfoxserver      2960/udp    # DFOXSERVER
+dfoxserver      2960/tcp    # DFOXSERVER
+#                          David Holden <mdh at rentek.net>
+boldsoft-lm     2961/udp    # BOLDSOFT-LM
+boldsoft-lm     2961/tcp    # BOLDSOFT-LM
+#                          Fredrik Haglund <fredik.haglund at boldsoft.com>
+iph-policy-cli  2962/udp    # IPH-POLICY-CLI
+iph-policy-cli  2962/tcp    # IPH-POLICY-CLI
+iph-policy-adm  2963/udp    # IPH-POLICY-ADM
+iph-policy-adm  2963/tcp    # IPH-POLICY-ADM
+#                          Shai Herzog <herzog at iphighway.com>
+bullant-srap    2964/udp    # BULLANT SRAP
+bullant-srap    2964/tcp    # BULLANT SRAP
+bullant-rap     2965/udp    # BULLANT RAP
+bullant-rap     2965/tcp    # BULLANT RAP
+#                          Michael Cahill <Michael.Cahill at bullant.net>
+idp-infotrieve  2966/udp    # IDP-INFOTRIEVE
+idp-infotrieve  2966/tcp    # IDP-INFOTRIEVE
+#                          Kevin Bruckert <kbruckert at idpco.com> 
+ssc-agent       2967/udp    # SSC-AGENT
+ssc-agent       2967/tcp    # SSC-AGENT
+#                          George Dzieciol <gdzieciol at symantec.com>   
+enpp            2968/udp    # ENPP
+enpp            2968/tcp    # ENPP
+#                          Kazuhito Gassho <Gassho.Kasuhito at exc.epson.co.jp>
+essp            2969/udp    # ESSP
+essp            2969/tcp    # ESSP
+#                          Hitoshi Ishida <ishida.hitoshi at exc.epson.co.jp>
+index-net       2970/udp    # INDEX-NET
+index-net       2970/tcp    # INDEX-NET
+#                          Chris J. Wren <C.Wren at lucent.com>
+netclip         2971/udp    # NetClip clipboard daemon
+netclip         2971/tcp    # NetClip clipboard daemon
+#                          Rudi Chiarito <nutello at sweetness.com>
+pmsm-webrctl	2972/udp    # PMSM Webrctl
+pmsm-webrctl	2972/tcp    # PMSM Webrctl
+#			   Markus Michels <mmi at pmsmicado.com>
+svnetworks	2973/udp    # SV Networks
+svnetworks	2973/tcp    # SV Networks
+#			   Sylvia Siu <ssiu at svnetworks.com>
+signal		2974/udp    # Signal
+signal		2974/tcp    # Signal
+#			   Wyatt Williams <wyattw at icall.com>
+fjmpcm		2975/udp    # Fujitsu Configuration Management Service
+fjmpcm		2975/tcp    # Fujitsu Configuration Management Service
+#			   Hiroki Kawano <kawano at saint.nm.fujitsu.co.jp>
+cns-srv-port	2976/udp    # CNS Server Port
+cns-srv-port	2976/tcp    # CNS Server Port
+#			   Ram Golla <rgolla at cisco.com>
+ttc-etap-ns	2977/udp    # TTCs Enterprise Test Access Protocol - NS
+ttc-etap-ns	2977/tcp    # TTCs Enterprise Test Access Protocol - NS
+ttc-etap-ds	2978/udp    # TTCs Enterprise Test Access Protocol - DS
+ttc-etap-ds	2978/tcp    # TTCs Enterprise Test Access Protocol - DS
+#			   Daniel Becker <beckerd at ttc.com>
+h263-video	2979/udp    # H.263 Video Streaming 
+h263-video	2979/tcp    # H.263 Video Streaming 
+#			   Jauvane C. de Oliveira <jauvane at acm.org>
+wimd		2980/udp    # Instant Messaging Service
+wimd		2980/tcp    # Instant Messaging Service
+#			   Kevin Birch <kbirch at pobox.com>
+mylxamport	2981/udp    # MYLXAMPORT
+mylxamport	2981/tcp    # MYLXAMPORT
+#			   Wei Gao <wei at mylex.com>
+iwb-whiteboard  2982/udp    # IWB-WHITEBOARD
+iwb-whiteboard  2982/tcp    # IWB-WHITEBOARD
+#                          David W. Radcliffe <davidr at adicarte.co.uk>
+netplan         2983/udp    # NETPLAN
+netplan         2983/tcp    # NETPLAN
+#                          Thomas Driemeyer <thomas at bitrot.de>
+hpidsadmin      2984/udp    # HPIDSADMIN
+hpidsadmin      2984/tcp    # HPIDSADMIN
+hpidsagent      2985/udp    # HPIDSAGENT
+hpidsagent      2985/tcp    # HPIDSAGENT
+#                          John Trudeau <jtrudeau at cup.hp.com>
+stonefalls      2986/udp    # STONEFALLS
+stonefalls      2986/tcp    # STONEFALLS
+#                          Scott Grau <sgrau at stonefalls.com>
+identify        2987/udp    # identify
+identify        2987/tcp    # identify
+hippad          2988/udp    # HIPPA Reporting Protocol
+hippad          2988/tcp    # HIPPA Reporting Protocol
+#                          William Randolph Royere III 
+#                          <william at royere.net>
+zarkov          2989/udp    # ZARKOV Intelligent Agent Communication
+zarkov          2989/tcp    # ZARKOV Intelligent Agent Communication
+#                          Robin Felix <zarkov-port at zarkov.com>
+boscap          2990/udp    # BOSCAP
+boscap          2990/tcp    # BOSCAP
+#                          Dirk Hillbrecht <dirk at hillbrecht.de>
+wkstn-mon       2991/udp    # WKSTN-MON
+wkstn-mon       2991/tcp    # WKSTN-MON
+#                          William David <william.david at lmco.com>
+itb301          2992/udp    # ITB301
+itb301          2992/tcp    # ITB301
+#                          Bodo Rueskamp <br at itchigo.com> 
+veritas-vis1    2993/udp    # VERITAS VIS1
+veritas-vis1    2993/tcp    # VERITAS VIS1
+veritas-vis2    2994/udp    # VERITAS VIS2
+veritas-vis2    2994/tcp    # VERITAS VIS2
+#                          Dinkar Chivaluri <dinkar at veritas.com>
+idrs            2995/udp    # IDRS
+idrs            2995/tcp    # IDRS
+#                          Jeff Eaton <jeaton at intermec.com>
+vsixml		2996/udp    # vsixml
+vsixml		2996/tcp    # vsixml
+#			   Rob Juergens <robj at vsi.com>
+rebol           2997/udp    # REBOL
+rebol		2997/tcp    # REBOL
+#                          Holger Kruse <holger at rebol.net>
+realsecure	2998/udp    # Real Secure
+realsecure	2998/tcp    # Real Secure
+#			   Tim Farley <TFarley at iss.net>
+remoteware-un	2999/udp    # RemoteWare Unassigned
+remoteware-un	2999/tcp    # RemoteWare Unassigned
+#			   Tim Farley <Tim.Farley at xcellenet.com>
+hbci            3000/udp    # HBCI
+hbci            3000/tcp    # HBCI
+#                          Kurt Haubner <haubner at ibm.net>
+# The following entry records an unassigned but widespread use
+remoteware-cl   3000/udp    # RemoteWare Client
+remoteware-cl   3000/tcp    # RemoteWare Client
+#                          Tim Farley <Tim.Farley at xcellenet.com>
+redwood-broker  3001/udp    # Redwood Broker
+redwood-broker  3001/tcp    # Redwood Broker
+#                          Joseph Morrison <joe at powerframe.com>
+exlm-agent      3002/udp    # EXLM Agent
+exlm-agent      3002/tcp    # EXLM Agent
+#                          Randy Martin <exlmoc at clemson.edu>
+# The following entry records an unassigned but widespread use
+remoteware-srv  3002/udp    # RemoteWare Server
+remoteware-srv  3002/tcp    # RemoteWare Server
+#                          Tim Farley <Tim.Farley at xcellenet.com>
+cgms            3003/udp    # CGMS
+cgms            3003/tcp    # CGMS
+#                          Jim Mazzonna <jmazzonna at tiscom.uscg.mil>
+csoftragent     3004/udp    # Csoft Agent
+csoftragent     3004/tcp    # Csoft Agent
+#                          Nedelcho Stanev <decho at csoft.bg>
+geniuslm        3005/udp    # Genius License Manager
+geniuslm        3005/tcp    # Genius License Manager
+#                          Jakob Spies <Jakob.Spies at genius.de>
+ii-admin        3006/udp    # Instant Internet Admin
+ii-admin        3006/tcp    # Instant Internet Admin
+#                          Lewis Donzis <ldonzis at nortelnetworks.com>
+lotusmtap       3007/udp    # Lotus Mail Tracking Agent Protocol
+lotusmtap       3007/tcp    # Lotus Mail Tracking Agent Protocol
+#                          Ken Lin <ken_lin at lotus.com>
+midnight-tech   3008/udp    # Midnight Technologies
+midnight-tech   3008/tcp    # Midnight Technologies
+#                          Kyle Unice <kyle at midnighttech.com>
+pxc-ntfy        3009/udp    # PXC-NTFY
+pxc-ntfy        3009/tcp    # PXC-NTFY
+#                          Takeshi Nishizawa <takeshi at cp10.es.xerox.com>
+ping-pong       3010/udp    # Telerate Workstation
+gw              3010/tcp    # Telerate Workstation
+#                          Timo Sivonen <timo.sivonen at ccmail.dowjones.com>
+trusted-web     3011/udp    # Trusted Web
+trusted-web     3011/tcp    # Trusted Web
+twsdss          3012/udp    # Trusted Web Client
+twsdss          3012/tcp    # Trusted Web Client
+#                          Alex Duncan <alex.duncan at sse.ie>
+gilatskysurfer  3013/udp    # Gilat Sky Surfer
+gilatskysurfer  3013/tcp    # Gilat Sky Surfer
+#                          Yossi Gal <yossi at gilat.com>
+broker_service  3014/udp    # Broker Service
+broker_service  3014/tcp    # Broker Service
+#                          Dale Bethers <dbethers at novell.com>
+nati-dstp       3015/udp    # NATI DSTP
+nati-dstp       3015/tcp    # NATI DSTP
+#                          Paul Austin <paul.austin at natinst.com>
+notify_srvr     3016/udp    # Notify Server
+notify_srvr     3016/tcp    # Notify Server
+#                          Hugo Parra <hparra at novell.com>
+event_listener  3017/udp    # Event Listener
+event_listener  3017/tcp    # Event Listener
+#                          Ted Tronson <ttronson at novell.com>
+srvc_registry   3018/udp    # Service Registry
+srvc_registry   3018/tcp    # Service Registry
+#                          Mark Killgore <MKillgore at novell.com>
+resource_mgr    3019/udp    # Resource Manager
+resource_mgr    3019/tcp    # Resource Manager
+#                          Gary Glover <gglover at novell.com>
+cifs            3020/udp    # CIFS
+cifs            3020/tcp    # CIFS
+#                          Paul Leach <paulle at microsoft.com>
+agriserver      3021/udp    # AGRI Server
+agriserver      3021/tcp    # AGRI Server
+#                          Frank Neulichedl <frank at websmile.com>
+csregagent      3022/udp    # CSREGAGENT
+csregagent      3022/tcp    # CSREGAGENT
+#                          Nedelcho Stanev <nstanev at csoft.bg>
+magicnotes      3023/udp    # magicnotes
+magicnotes      3023/tcp    # magicnotes
+#                          Karl Edwall <karl at magicnotes.com>	
+nds_sso         3024/udp    # NDS_SSO
+nds_sso	        3024/tcp    # NDS_SSO
+#                          Mel Oyler <mel at novell.com>
+arepa-raft      3025/udp    # Arepa Raft 
+arepa-raft      3025/tcp    # Arepa Raft 
+#                          Mark Ellison <ellison at ieee.org>
+agri-gateway    3026/udp    # AGRI Gateway
+agri-gateway    3026/tcp    # AGRI Gateway
+#                          Agri Datalog <contact at agri-datalog.com>
+LiebDevMgmt_C   3027/udp    # LiebDevMgmt_C
+LiebDevMgmt_C   3027/tcp    # LiebDevMgmt_C
+LiebDevMgmt_DM  3028/udp    # LiebDevMgmt_DM
+LiebDevMgmt_DM  3028/tcp    # LiebDevMgmt_DM
+LiebDevMgmt_A   3029/udp    # LiebDevMgmt_A
+LiebDevMgmt_A   3029/tcp    # LiebDevMgmt_A
+#                          Mike Velten <Mike_Velten at Liebert.com>
+arepa-cas       3030/udp    # Arepa Cas
+arepa-cas       3030/tcp    # Arepa Cas
+#                          Seth Silverman <seth at arepa.com>
+eppc            3031/udp    # Remote AppleEvents/PPC Toolbox
+eppc            3031/tcp    # Remote AppleEvents/PPC Toolbox
+#                          Steve Zellers <zellers at apple.com>
+redwood-chat    3032/udp    # Redwood Chat
+redwood-chat    3032/tcp    # Redwood Chat
+#                          Songwon Chi <swchi at daou.co.kr>
+pdb             3033/udp    # PDB
+pdb             3033/tcp    # PDB
+#                          Don Bowman <don at pixstream.com>
+osmosis-aeea    3034/udp    # Osmosis / Helix (R) AEEA Port
+osmosis-aeea    3034/tcp    # Osmosis / Helix (R) AEEA Port
+#                          Larry Atkin <latkin at commongrnd.com>	
+fjsv-gssagt     3035/udp    # FJSV gssagt
+fjsv-gssagt     3035/tcp    # FJSV gssagt
+#                          Tomoji Koike <koike at ael.fujitsu.co.jp>	
+hagel-dump      3036/udp    # Hagel DUMP
+hagel-dump      3036/tcp    # Hagel DUMP
+#                          Haim Gelfenbeyn <haim at hageltech.com>
+hp-san-mgmt     3037/udp    # HP SAN Mgmt
+hp-san-mgmt     3037/tcp    # HP SAN Mgmt
+#                          Steve Britt <steve_britt at hp.com>
+santak-ups      3038/udp    # Santak UPS
+santak-ups      3038/tcp    # Santak UPS
+#                          Tom Liu <ssc at sc.stk.com.cn>
+cogitate        3039/udp    # Cogitate, Inc.
+cogitate        3039/tcp    # Cogitate, Inc.
+#                          Jim Harlan <jimh at infowest.com> 
+tomato-springs  3040/udp    # Tomato Springs
+tomato-springs  3040/tcp    # Tomato Springs
+#                          Jack Waller III <jack at tomatosprings.com>
+di-traceware    3041/udp    # di-traceware
+di-traceware    3041/tcp    # di-traceware
+#                          Carlos Hung <chung at digisle.net>
+journee         3042/udp    # journee
+journee         3042/tcp    # journee
+#                          Kevin Calman <postmaster at journee.com>	
+brp             3043/udp    # BRP
+brp             3043/tcp    # BRP
+#                          Greg Gee <ggee at hns.com>
+epp             3044/udp    # EndPoint Protocol
+epp             3044/tcp    # EndPoint Protocol
+#                          Stephen Cipolli <scipolli at radvision.com> 
+responsenet     3045/udp    # ResponseNet
+responsenet     3045/tcp    # ResponseNet
+#                          Chul Yoon <cyoon at responsenetworks.com>
+di-ase          3046/udp    # di-ase
+di-ase          3046/tcp    # di-ase
+#                          Carlos Hung <chung at digisle.net>
+hlserver        3047/udp    # Fast Security HL Server
+hlserver        3047/tcp    # Fast Security HL Server
+#                          Michael Zunke <mzunke at fast-ag.de>
+pctrader        3048/udp    # Sierra Net PC Trader
+pctrader        3048/tcp    # Sierra Net PC Trader
+#                          Chris Hahn <chrish at sierra.net>
+nsws            3049/udp    # NSWS
+nsws            3049/tcp    # NSWS
+#                          Ray Gwinn <p00321 at psilink.com>
+gds_db          3050/udp    # gds_db
+gds_db          3050/tcp    # gds_db
+#                          Madhukar N. Thakur <mthakur at interbase.com>	
+galaxy-server	3051/udp    # Galaxy Server
+galaxy-server	3051/tcp    # Galaxy Server
+#			   Michael Andre <mandre at gts-tkts.com>
+apc-3052        3052/udp    # APC 3052
+apc-3052        3052/tcp    # APC 3052
+#                          American Power Conversion <ports at apcc.com>
+dsom-server	3053/udp    # dsom-server
+dsom-server	3053/tcp    # dsom-server
+#			   Daniel Sisk <danielr.sisk at pnl.gov>
+amt-cnf-prot	3054/udp    # AMT CNF PROT
+amt-cnf-prot	3054/tcp    # AMT CNF PROT
+#			   Marco Marcucci <mmarcucci.amtec at interbusiness.it>
+policyserver	3055/udp    # Policy Server
+policyserver	3055/tcp    # Policy Server
+#			   Mark Garti <mgarti at sonusnet.com>
+cdl-server	3056/udp    # CDL Server
+cdl-server	3056/tcp    # CDL Server
+#			   Paul Roberts <PaulRoberts at engineer.com>
+goahead-fldup	3057/udp    # GoAhead FldUp
+goahead-fldup	3057/tcp    # GoAhead FldUp
+#			   Alan Pickrell <alanp at goahead.com>
+videobeans	3058/udp    # videobeans
+videobeans	3058/tcp    # videobeans
+#			   Hiroyuki Takahashi <hiro.takahashi at eng.Sun.COM>
+qsoft		3059/udp    # qsoft
+qsoft		3059/tcp    # qsoft
+#			   James Kunz <jkunz at earlhaig.com>
+interserver	3060/udp    # interserver
+interserver	3060/tcp    # interserver
+#			   Madhukar N. Thakur <mthakur at interbase.com>
+cautcpd		3061/udp    # cautcpd
+cautcpd		3061/tcp    # cautcpd
+ncacn-ip-tcp	3062/udp    # ncacn-ip-tcp
+ncacn-ip-tcp	3062/tcp    # ncacn-ip-tcp
+ncadg-ip-udp    3063/udp    # ncadg-ip-udp
+ncadg-ip-udp	3063/tcp    # ncadg-ip-udp
+#			   Gabi Kalmar <kalga01 at cai.com>
+rprt            3064/udp    # Remote Port Redirector
+rprt            3064/tcp    # Remote Port Redirector
+#                          Robin Johnston <robinj at learningtree.com>
+slinterbase	3065/udp    # slinterbase
+slinterbase	3065/tcp    # slinterbase
+#			   Bie Tie <stie at interbase.com>
+netattachsdmp   3066/udp    # NETATTACHSDMP
+netattachsdmp   3066/tcp    # NETATTACHSDMP
+#                          Mike Young <myong at netattach.com>
+fjhpjp          3067/udp    # FJHPJP
+fjhpjp          3067/tcp    # FJHPJP
+#                          Ryozo Furutani <furutani at np.lps.cs.fujitsu.co.jp>
+ls3bcast	3068/udp    # ls3 Broadcast
+ls3bcast	3068/tcp    # ls3 Broadcast
+ls3		3069/udp    # ls3
+ls3		3069/tcp    # ls3
+#			   Andrei Tsyganenko <atsyganenko at powerware.com>
+mgxswitch       3070/udp    # MGXSWITCH
+mgxswitch       3070/tcp    # MGXSWITCH
+#                          George Walter <george.walter at ascentialsoftware.com>
+csd-mgmt-port   3071/udp    # ContinuStor Manager Port
+csd-mgmt-port	3071/tcp    # ContinuStor Manager Port
+csd-monitor     3072/udp    # ContinuStor Monitor Port
+csd-monitor     3072/tcp    # ContinuStor Monitor Port
+#                          Ray Jantz <ray.jantz at lsil.com>
+vcrp            3073/udp    # Very simple chatroom prot
+vcrp            3073/tcp    # Very simple chatroom prot
+#                          Andreas Wurf <a.wurf at mediaTools.de> 
+xbox            3074/udp    # Xbox game port
+xbox            3074/tcp    # Xbox game port
+#                          Damon Danieli <damond at microsoft.com>
+orbix-locator   3075/udp    # Orbix 2000 Locator
+orbix-locator   3075/tcp    # Orbix 2000 Locator
+orbix-config    3076/udp    # Orbix 2000 Config
+orbix-config    3076/tcp    # Orbix 2000 Config
+orbix-loc-ssl   3077/udp    # Orbix 2000 Locator SSL
+orbix-loc-ssl   3077/tcp    # Orbix 2000 Locator SSL
+orbix-cfg-ssl   3078/udp    # Orbix 2000 Locator SSL
+orbix-cfg-ssl   3078/tcp    # Orbix 2000 Locator SSL
+#                          Eric Newcomer <eric.newcomer at iona.com>
+lv-frontpanel   3079/udp    # LV Front Panel
+lv-frontpanel   3079/tcp    # LV Front Panel
+#                          Darshan Shah <darshan.shah at ni.com>
+stm_pproc	3080/udp    # stm_pproc
+stm_pproc	3080/tcp    # stm_pproc
+#			   Paul McGinnis <pmcginnis at server.stmi.com>
+tl1-lv		3081/udp    # TL1-LV
+tl1-lv		3081/tcp    # TL1-LV
+tl1-raw		3082/udp    # TL1-RAW
+tl1-raw		3082/tcp    # TL1-RAW
+tl1-telnet	3083/udp    # TL1-TELNET
+tl1-telnet	3083/tcp    # TL1-TELNET
+#			   SONET Internetworking Forum (SIF)
+#			   <bwarijsman at lucent.com> - SONET Contact
+itm-mccs        3084/udp    # ITM-MCCS
+itm-mccs        3084/tcp    # ITM-MCCS
+#                          Alain Callebaut <ac at itmasters.com>
+pcihreq         3085/udp    # PCIHReq
+pcihreq         3085/tcp    # PCIHReq
+#                          Paul Sanders <p.sanders at dial.pipex.com>
+jdl-dbkitchen   3086/udp    # JDL-DBKitchen
+jdl-dbkitchen   3086/tcp    # JDL-DBKitchen
+#                          Hideo Wakabayashi <hiwaka at alles.or.jp>
+asoki-sma       3087/udp    # Asoki SMA
+asoki-sma	3087/tcp    # Asoki SMA
+#                          Andrew Mossberg <amossberg at asoki.net>     
+xdtp            3088/udp    # eXtensible Data Transfer Protocol
+xdtp            3088/tcp    # eXtensible Data Transfer Protocol
+#                          Michael Shearson <mshearson at peerglobal.com>    
+ptk-alink       3089/udp    # ParaTek Agent Linking
+ptk-alink       3089/tcp    # ParaTek Agent Linking
+#                          Robert Hodgson <robert at paratek.co.uk> 
+rtss            3090/udp    # Rappore Session Services
+rtss            3090/tcp    # Rappore Session Services
+#                          Peter Boucher <pboucher at rappore.com>
+1ci-smcs        3091/udp    # 1Ci Server Management
+1ci-smcs        3091/tcp    # 1Ci Server Management
+#                          Ralf Bensmann <iana at 1ci.de>
+njfss           3092/udp    # Netware sync services
+njfss           3092/tcp    # Netware sync services
+#                          Gordon Ross <G.Ross at ccw.gov.uk> 
+rapidmq-center  3093/udp    # Jiiva RapidMQ Center
+rapidmq-center  3093/tcp    # Jiiva RapidMQ Center
+rapidmq-reg     3094/udp    # Jiiva RapidMQ Registry
+rapidmq-reg     3094/tcp    # Jiiva RapidMQ Registry
+#                          Mark Ericksen <mark at jiiva.com>
+panasas         3095/udp    # Panasas rendevous port
+panasas         3095/tcp    # Panasas rendevous port
+#                          Peter Berger <peterb at panasas.com>
+ndl-aps         3096/udp    # Active Print Server Port
+ndl-aps         3096/tcp    # Active Print Server Port
+#                          Martin Norman <martin at ndl.co.uk> 
+#               3097/tcp   Reserved
+#               3097/udp   Reserved
+itu-bicc-stc    3097/sctp   # ITU-T Q.1902.1/Q.2150.3
+#                          Greg Sidebottom <gregside at home.com>
+umm-port        3098/udp    # Universal Message Manager
+umm-port        3098/tcp    # Universal Message Manager
+#                          Phil Braham <phil at braham.net>
+chmd            3099/udp    # CHIPSY Machine Daemon
+chmd            3099/tcp    # CHIPSY Machine Daemon
+#                          Trond Borsting <Trond.Borsting at telelogic.com>
+opcon-xps       3100/udp    # OpCon/xps
+opcon-xps       3100/tcp    # OpCon/xps
+#                          David Bourland <DBourland at smausa.com> 
+hp-pxpib        3101/udp    # HP PolicyXpert PIB Server
+hp-pxpib        3101/tcp    # HP PolicyXpert PIB Server
+#                          Brian O'Keefe <bokeefe at cnd.hp.com>
+slslavemon      3102/udp    # SoftlinK Slave Mon Port
+slslavemon      3102/tcp    # SoftlinK Slave Mon Port
+#                          Moshe Livne <moshe at softlinkusa.com>
+autocuesmi      3103/udp    # Autocue SMI Protocol
+autocuesmi      3103/tcp    # Autocue SMI Protocol
+autocuetime     3104/udp    # Autocue Time Service
+autocuelog      3104/tcp    # Autocue Logger Protocol
+#                          Geoff Back <geoff at autocue.co.uk>
+cardbox		3105/udp    # Cardbox
+cardbox		3105/tcp    # Cardbox
+cardbox-http	3106/udp    # Cardbox HTTP
+cardbox-http	3106/tcp    # Cardbox HTTP
+#			   Martin Kochanski <martin at cardbox.co.uk>
+business    	3107/udp    # Business protocol
+business    	3107/tcp    # Business protocol
+geolocate   	3108/udp    # Geolocate protocol
+geolocate   	3108/tcp    # Geolocate protocol
+personnel   	3109/udp    # Personnel protocol
+personnel   	3109/tcp    # Personnel protocol
+#                          William Randolph Royere III 
+#                          <william at royere.net>
+sim-control     3110/udp    # simulator control port
+sim-control     3110/tcp    # simulator control port
+#                          Ian Bell <ianb at arca-technologies.com>
+wsynch          3111/udp    # Web Synchronous Services
+wsynch          3111/tcp    # Web Synchronous Services
+#                          Valery Fremaux <vf at eisti.fr>
+ksysguard       3112/udp    # KDE System Guard
+ksysguard       3112/tcp    # KDE System Guard
+#                          Chris Schlaeger <cs at kde.org>
+cs-auth-svr     3113/udp    # CS-Authenticate Svr Port
+cs-auth-svr     3113/tcp    # CS-Authenticate Svr Port
+#                          Cliff Diamond <cdiamond at crypto-solutions.co.uk>
+#                          Andy Georgiou <ageorgiou at crypto-solutions.co.uk>
+ccmad           3114/udp    # CCM AutoDiscover
+ccmad           3114/tcp    # CCM AutoDiscover
+#                          Ram Sudama <rsudama at on.com> 
+mctet-master    3115/udp    # MCTET Master
+mctet-master    3115/tcp    # MCTET Master
+mctet-gateway   3116/udp    # MCTET Gateway
+mctet-gateway   3116/tcp    # MCTET Gateway
+mctet-jserv     3117/udp    # MCTET Jserv
+mctet-jserv     3117/tcp    # MCTET Jserv
+#                          Manuel Veloso <veloso at us.itmasters.com> 
+pkagent         3118/udp    # PKAgent
+pkagent         3118/tcp    # PKAgent
+#                          Michael Douglass <mikedoug at datafoundry.net>
+d2000kernel     3119/udp    # D2000 Kernel Port
+d2000kernel     3119/tcp    # D2000 Kernel Port
+d2000webserver  3120/udp    # D2000 Webserver Port
+d2000webserver  3120/tcp    # D2000 Webserver Port 
+#                          Tomas Rajcan <trajcan at ipesoft.sk>
+epp-temp        3121/udp    # Extensible Provisioning Protocol
+epp-temp        3121/tcp    # Extensible Provisioning Protocol
+#                          Scott Hollenbeck <shollenbeck at verisign.com>
+vtr-emulator    3122/udp    # MTI VTR Emulator port
+vtr-emulator    3122/tcp    # MTI VTR Emulator port
+#                          John Mertus <mertus at mathtech.com>
+edix            3123/udp    # EDI Translation Protocol
+edix            3123/tcp    # EDI Translation Protocol
+#                          William Randolph Royere III <william at royere.net>
+beacon-port     3124/udp    # Beacon Port
+beacon-port     3124/tcp    # Beacon Port
+#                          James Paul Duncan <pduncan at beaconcrm.com>
+a13-an          3125/udp    # A13-AN Interface
+a13-an          3125/tcp    # A13-AN Interface
+#                          Douglas Knisely <dnk at lucent.com>
+ms-dotnetster   3126/udp    # Microsoft .NETster Port
+ms-dotnetster   3126/tcp    # Microsoft .NETster Port
+#                          Dave Mendlen <davemen at microsoft.com>
+ctx-bridge      3127/udp    # CTX Bridge Port
+ctx-bridge      3127/tcp    # CTX Bridge Port
+#                          Alexander Dubrovsky <dubrovsky_alex at emc.com>
+ndl-aas         3128/udp    # Active API Server Port
+ndl-aas         3128/tcp    # Active API Server Port
+#                          Martin Norman <martin at ndl.co.uk>
+netport-id      3129/udp    # NetPort Discovery Port
+netport-id      3129/tcp    # NetPort Discovery Port
+#                          P.T.K. Farrar <farrarp at teccon.co.uk>
+icpv2		3130/udp    # ICPv2
+icpv2		3130/tcp    # ICPv2
+#			   Duane Wessels <wessels at nlanr.net>
+netbookmark	3131/udp    # Net Book Mark
+netbookmark	3131/tcp    # Net Book Mark
+#			   Yiftach Ravid <yiftach at haifa.vnet.ibm.com>
+ms-rule-engine  3132/udp    # Microsoft Business Rule Engine Update Service
+ms-rule-engine  3132/tcp    # Microsoft Business Rule Engine Update Service
+#                          Anush Kumar <anushk at microsoft.com>
+prism-deploy    3133/udp    # Prism Deploy User Port
+prism-deploy    3133/tcp    # Prism Deploy User Port
+#                          Joan Linck <jlinck at lanovation.com>
+ecp             3134/udp    # Extensible Code Protocol
+ecp             3134/tcp    # Extensible Code Protocol
+#                          Jim Trek <jtrek at rochester.rr.com>
+#                          Mark Bocko <bocko at ece.rochester.edu>
+peerbook-port   3135/udp    # PeerBook Port
+peerbook-port   3135/tcp    # PeerBook Port
+#                          John Flowers <jf at gigamediaaccess.com>
+grubd           3136/udp    # Grub Server Port
+grubd           3136/tcp    # Grub Server Port
+#                          Kord Campbell <kord at grub.org>
+rtnt-1          3137/udp    # rtnt-1 data packets
+rtnt-1          3137/tcp    # rtnt-1 data packets
+rtnt-2          3138/udp    # rtnt-2 data packets
+rtnt-2          3138/tcp    # rtnt-2 data packets
+#                          Ron Muellerschoen <rjm at cobra.jpl.nasa.gov>
+incognitorv     3139/udp    # Incognito Rendez-Vous
+incognitorv     3139/tcp    # Incognito Rendez-Vous
+#                          Stephane Bourque <stephb at incognito.com>
+ariliamulti     3140/udp    # Arilia Multiplexor
+ariliamulti     3140/tcp    # Arilia Multiplexor
+#                          Stephane Bourque <sbourque at arilia.com>
+vmodem          3141/udp    # VMODEM
+vmodem          3141/tcp    # VMODEM
+#                          Ray Gwinn <p00321 at psilink.com>
+rdc-wh-eos	3142/udp    # RDC WH EOS
+rdc-wh-eos	3142/tcp    # RDC WH EOS
+#			   Udi Nir <udi_nir at ncc.co.il>
+seaview		3143/udp    # Sea View
+seaview		3143/tcp    # Sea View
+#			   Jim Flaherty <jim_e_flaherty at notes.seagate.com>
+tarantella	3144/udp    # Tarantella
+tarantella	3144/tcp    # Tarantella
+#			   Roger Binns <rogerb at sco.com>
+csi-lfap	3145/udp    # CSI-LFAP
+csi-lfap	3145/tcp    # CSI-LFAP
+#			   Paul Amsden <amsden at .ctron.com>
+bears-02        3146/udp    # bears-02
+bears-02        3146/tcp    # bears-02
+#                          Bruce McKinnon <brucemck at bearsolutions.com.au>
+rfio		3147/udp    # RFIO
+rfio		3147/tcp    # RFIO
+#			   Frederic Hemmer <Frederic.Hemmer at cern.ch>
+nm-game-admin	3148/udp    # NetMike Game Administrator
+nm-game-admin	3148/tcp    # NetMike Game Administrator
+nm-game-server	3149/udp    # NetMike Game Server
+nm-game-server	3149/tcp    # NetMike Game Server
+nm-asses-admin	3150/udp    # NetMike Assessor Administrator
+nm-asses-admin	3150/tcp    # NetMike Assessor Administrator
+nm-assessor	3151/udp    # NetMike Assessor
+nm-assessor	3151/tcp    # NetMike Assessor
+#			   Andrew Sharpe <help at smartsims.com>
+feitianrockey   3152/udp    # FeiTian Port
+feitianrockey   3152/tcp    # FeiTian Port
+#                          Huang Yu <llw at ftsafe.com>
+s8-client-port  3153/udp    # S8Cargo Client Port
+s8-client-port  3153/tcp    # S8Cargo Client Port
+#                          Jon S. Kyle <JKyle at SpeedwaySoftware.com>
+ccmrmi		3154/udp    # ON RMI Registry
+ccmrmi          3154/tcp    # ON RMI Registry
+#                          Ram Sudama <rsudama at on.com>
+jpegmpeg        3155/udp    # JpegMpeg Port
+jpegmpeg        3155/tcp    # JpegMpeg Port
+#                          Richard Bassous <rbassous at yahoo.com>
+indura          3156/udp    # Indura Collector
+indura          3156/tcp    # Indura Collector
+#                          Bruce Kosbab <bruce.kosbab at indurasoft.com>
+e3consultants   3157/udp    # CCC Listener Port
+e3consultants   3157/tcp    # CCC Listener Port
+#                          Brian Carnell <brian at e3consultants.com>
+stvp            3158/udp    # SmashTV Protocol
+stvp            3158/tcp    # SmashTV Protocol
+#                          Christian Wolff <stvp at smash.tv>
+navegaweb-port  3159/udp    # NavegaWeb Tarification
+navegaweb-port  3159/tcp    # NavegaWeb Tarification
+#                          Miguel Angel Fernandez <mafg at tid.es>
+tip-app-server  3160/udp    # TIP Application Server
+tip-app-server  3160/tcp    # TIP Application Server
+#                          Olivier Mascia <om at tipgroup.com>
+doc1lm          3161/udp    # DOC1 License Manager
+doc1lm          3161/tcp    # DOC1 License Manager
+#                          Greg Goodson <ggoodson at group1software.co.uk>
+sflm            3162/udp    # SFLM
+sflm            3162/tcp    # SFLM
+#                          Keith Turner <support at silvaco.com>
+res-sap         3163/udp    # RES-SAP
+res-sap		3163/tcp    # RES-SAP
+#                          Bob Janssen <bob at res.nl>
+imprs           3164/udp    # IMPRS
+imprs		3164/tcp    # IMPRS
+#                          Lars Bohn <Lars.Bohn at nokia.com>
+newgenpay       3165/udp    # Newgenpay Engine Service
+newgenpay       3165/tcp    # Newgenpay Engine Service
+#                          Ilan Zisser <ilan at newgenpay.com>
+qrepos          3166/udp    # Quest Repository
+qrepos          3166/tcp    # Quest Repository
+#                          Fred Surr <quest_iana at oz.quest.com>
+poweroncontact  3167/udp    # poweroncontact
+poweroncontact  3167/tcp    # poweroncontact
+poweronnud      3168/udp    # poweronnud
+poweronnud      3168/tcp    # poweronnud
+#                          Paul Cone <paul at poweronsoftware.com>
+serverview-as   3169/udp    # SERVERVIEW-AS
+serverview-as	3169/tcp    # SERVERVIEW-AS
+serverview-asn  3170/udp    # SERVERVIEW-ASN
+serverview-asn  3170/tcp    # SERVERVIEW-ASN
+serverview-gf   3171/udp    # SERVERVIEW-GF
+serverview-gf   3171/tcp    # SERVERVIEW-GF
+serverview-rm   3172/udp    # SERVERVIEW-RM
+serverview-rm   3172/tcp    # SERVERVIEW-RM
+serverview-icc  3173/udp    # SERVERVIEW-ICC
+serverview-icc  3173/tcp    # SERVERVIEW-ICC
+#                          Guenther Kroenert 
+#                          <Guenther.Kroenert at fujitsu-siemens.com>
+armi-server     3174/udp    # ARMI Server
+armi-server     3174/tcp    # ARMI Server
+#                          Bobby Martin <bobbymartin at hotmail.com>
+t1-e1-over-ip   3175/udp    # T1_E1_Over_IP
+t1-e1-over-ip   3175/tcp    # T1_E1_Over_IP
+#                          Mark Doyle <mark at engagecom.com>
+ars-master      3176/udp    # ARS Master
+ars-master      3176/tcp    # ARS Master
+#                          Ade Adebayo <ade at us.itmasters.com>
+phonex-port     3177/udp    # Phonex Protocol
+phonex-port     3177/tcp    # Phonex Protocol
+#                          Doug Grover <dgrover at phonex.com>
+radclientport   3178/udp    # Radiance UltraEdge Port
+radclientport   3178/tcp    # Radiance UltraEdge Port
+#                          Sri Subramaniam <sri at radiance.com>
+h2gf-w-2m       3179/udp    # H2GF W.2m Handover prot.
+h2gf-w-2m       3179/tcp    # H2GF W.2m Handover prot.
+#                          Arne Norefors <Arne.Norefors at ericsson.com>
+mc-brk-srv	3180/udp    # Millicent Broker Server
+mc-brk-srv	3180/tcp    # Millicent Broker Server
+#			   Steve Glassman <steveg at pa.dec.com>
+bmcpatrolagent  3181/udp    # BMC Patrol Agent
+bmcpatrolagent	3181/tcp    # BMC Patrol Agent
+bmcpatrolrnvu   3182/udp    # BMC Patrol Rendezvous
+bmcpatrolrnvu	3182/tcp    # BMC Patrol Rendezvous
+#			   Eric Anderson <eric_anderson at bmc.com>
+cops-tls        3183/udp    # COPS/TLS
+cops-tls        3183/tcp    # COPS/TLS
+#                          Mark Stevens <mstevens at ellacoya.com>
+apogeex-port    3184/udp    # ApogeeX Port
+apogeex-port    3184/tcp    # ApogeeX Port
+#                          Tom Nys <tom.nys.tn at belgium.agfa.com>
+smpppd          3185/udp    # SuSE Meta PPPD
+smpppd          3185/tcp    # SuSE Meta PPPD
+#                          Arvin Schnell <arvin at suse.de>
+iiw-port        3186/udp    # IIW Monitor User Port
+iiw-port        3186/tcp    # IIW Monitor User Port
+#                          Corey Burnett <corey.burnett at biopop.com>
+odi-port        3187/udp    # Open Design Listen Port
+odi-port        3187/tcp    # Open Design Listen Port
+#                          Phivos Aristides <phivos at opendesign.com>
+brcm-comm-port  3188/udp    # Broadcom Port
+brcm-comm-port  3188/tcp    # Broadcom Port
+#                          Thomas L. Johnson <tjohnson at broadcom.com>
+pcle-infex      3189/udp    # Pinnacle Sys InfEx Port
+pcle-infex      3189/tcp    # Pinnacle Sys InfEx Port
+#                          Anthon van der Neut <anthon at mnt.org>
+csvr-proxy      3190/udp    # ConServR Proxy
+csvr-proxy      3190/tcp    # ConServR Proxy
+csvr-sslproxy   3191/udp    # ConServR SSL Proxy
+csvr-sslproxy   3191/tcp    # ConServR SSL Proxy
+#                          Mikhail Kruk <mkruk at biscom.com>
+firemonrcc      3192/udp    # FireMon Revision Control
+firemonrcc      3192/tcp    # FireMon Revision Control
+#                          Michael Bishop <mbishop at fishnetsecurity.com>
+cordataport     3193/udp    # Cordaxis Data Port
+cordataport     3193/tcp    # Cordaxis Data Port
+#                          Jay Fesco <jay at cordaxis.com>
+magbind         3194/udp    # Rockstorm MAG protocol
+magbind         3194/tcp    # Rockstorm MAG protocol
+#                          Jens Nilsson <jens at rockstorm.se>
+ncu-1           3195/udp    # Network Control Unit
+ncu-1           3195/tcp    # Network Control Unit
+ncu-2           3196/udp    # Network Control Unit
+ncu-2           3196/tcp    # Network Control Unit
+#                          Charlie Hundre <charlie at rdsrv.reco.com.tw>
+embrace-dp-s    3197/udp    # Embrace Device Protocol Server
+embrace-dp-s    3197/tcp    # Embrace Device Protocol Server
+embrace-dp-c    3198/udp    # Embrace Device Protocol Client
+embrace-dp-c    3198/tcp    # Embrace Device Protocol Client
+#                          Elliot Schwartz <elliot at embracenetworks.com>
+dmod-workspace  3199/udp    # DMOD WorkSpace
+dmod-workspace  3199/tcp    # DMOD WorkSpace
+#                          Nick Plante <nplante at dmod.com>
+tick-port       3200/udp    # Press-sense Tick Port
+tick-port       3200/tcp    # Press-sense Tick Port
+#                          Boris Svetlitsky <boris at press-sense.com>
+cpq-tasksmart   3201/udp    # CPQ-TaskSmart
+cpq-tasksmart   3201/tcp    # CPQ-TaskSmart
+#                          Jackie Lau <jackie.lau at compaq.com>
+intraintra      3202/udp    # IntraIntra
+intraintra      3202/tcp    # IntraIntra
+#                          Matthew Asham <matthewa at bcwireless.net>
+netwatcher-mon  3203/udp    # Network Watcher Monitor
+netwatcher-mon  3203/tcp    # Network Watcher Monitor
+netwatcher-db   3204/udp    # Network Watcher DB Access
+netwatcher-db   3204/tcp    # Network Watcher DB Access
+#                          Hirokazu Fujisawa <fujisawa at pfu.fujitsu.com>
+isns            3205/udp    # iSNS Server Port
+isns            3205/tcp    # iSNS Server Port
+#                          Josh Tseng <jtseng at nishansystems.com>
+ironmail        3206/udp    # IronMail POP Proxy
+ironmail        3206/tcp    # IronMail POP Proxy
+#                          Mike Hudack <mike at mhudack.com>
+vx-auth-port    3207/udp    # Veritas Authentication Port
+vx-auth-port    3207/tcp    # Veritas Authentication Port
+#                          Senthil Ponnuswamy <senthil at veritas.com>
+pfu-prcallback  3208/udp    # PFU PR Callback
+pfu-prcallback  3208/tcp    # PFU PR Callback
+#                          Tetsuharu Hanada <hanada at pfu.fujitsu.com>
+netwkpathengine 3209/udp    # HP OpenView Network Path Engine Server
+netwkpathengine 3209/tcp    # HP OpenView Network Path Engine Server
+#                          Anthony Walker <anthony_walker at hp.com>
+flamenco-proxy  3210/udp    # Flamenco Networks Proxy
+flamenco-proxy  3210/tcp    # Flamenco Networks Proxy
+#                          Corey Corrick <corey.corrick at flamenconetworks.com>
+avsecuremgmt    3211/udp    # Avocent Secure Management
+avsecuremgmt    3211/tcp    # Avocent Secure Management
+#                          Brian S. Stewart <Brian.Stewart at Avocent.com>
+surveyinst      3212/udp    # Survey Instrument
+surveyinst      3212/tcp    # Survey Instrument
+#                          Al Amet <aamet at point-inc.com>
+neon24x7        3213/udp    # NEON 24X7 Mission Control
+neon24x7        3213/tcp    # NEON 24X7 Mission Control
+#                          Tony Lubrano <tlubrano at neonsys.com>
+jmq-daemon-1    3214/udp    # JMQ Daemon Port 1
+jmq-daemon-1    3214/tcp    # JMQ Daemon Port 1
+jmq-daemon-2    3215/udp    # JMQ Daemon Port 2
+jmq-daemon-2    3215/tcp    # JMQ Daemon Port 2
+#                          Martin West <Martin.West at spirit-soft.com>
+ferrari-foam    3216/udp    # Ferrari electronic FOAM
+ferrari-foam    3216/tcp    # Ferrari electronic FOAM
+#                          Johann Deutinger <deutinger at ferrari-electronic.de>
+unite           3217/udp    # Unified IP & Telecomm Env
+unite           3217/tcp    # Unified IP & Telecomm Env
+#                          Christer Gunnarsson
+#                          <christer.gunnarsson at ascomtateco.se>
+smartpackets    3218/udp    # EMC SmartPackets
+smartpackets    3218/tcp    # EMC SmartPackets
+#                          Steve Spataro <spataro_steve at emc.com>
+wms-messenger   3219/udp    # WMS Messenger
+wms-messenger   3219/tcp    # WMS Messenger
+#                          Michael Monasterio <michael at wmsoftware.com>
+xnm-ssl         3220/udp    # XML NM over SSL
+xnm-ssl         3220/tcp    # XML NM over SSL
+xnm-clear-text  3221/udp    # XML NM over TCP
+xnm-clear-text  3221/tcp    # XML NM over TCP
+#                          Mark Trostler <trostler at juniper.net>
+glbp            3222/udp    # Gateway Load Balancing Pr
+glbp            3222/tcp    # Gateway Load Balancing Pr
+#                          Douglas McLaggan <glbp-info at cisco.com>
+digivote        3223/udp    # DIGIVOTE (R) Vote-Server
+digivote        3223/tcp    # DIGIVOTE (R) Vote-Server
+#                          Christian Treczoks <ct at braehler.com>
+aes-discovery   3224/udp    # AES Discovery Port
+aes-discovery   3224/tcp    # AES Discovery Port
+#                          Ken Richard <kenr at aeseducation.com>              
+fcip-port       3225/udp    # FCIP
+fcip-port       3225/tcp    # FCIP
+#                          RFC-ietf-ips-fcovertcpip-12.txt
+isi-irp         3226/udp    # ISI Industry Software IRP
+isi-irp         3226/tcp    # ISI Industry Software IRP
+#                          Peter Sandstrom <peter.sandstrom at tassen.fi>
+dwnmshttp       3227/udp    # DiamondWave NMS Server
+dwnmshttp       3227/tcp    # DiamondWave NMS Server
+dwmsgserver     3228/udp    # DiamondWave MSG Server
+dwmsgserver     3228/tcp    # DiamondWave MSG Server
+#                          Varma Bhupatiraju <varma at calient.net>
+global-cd-port  3229/udp    # Global CD Port
+global-cd-port  3229/tcp    # Global CD Port
+#                          Vitaly Revsin <vitaly at netapp.com>
+sftdst-port     3230/udp    # Software Distributor Port
+sftdst-port     3230/tcp    # Software Distributor Port
+#                          Andrea Lanza <andrea.lanza at frameweb.it>
+dsnl            3231/udp    # Delta Solutions Direct
+dsnl            3231/tcp    # Delta Solutions Direct
+#                          Peter Ijkhout <peter at deltasolutions.nl>
+mdtp            3232/udp    # MDT port
+mdtp            3232/tcp    # MDT port
+#                          IJsbrand Wijnands <ice at cisco.com>
+whisker         3233/udp    # WhiskerControl main port
+whisker         3233/tcp    # WhiskerControl main port
+#                          Rudolf Cardinal <rudolf at pobox.com> February 2002
+alchemy         3234/udp    # Alchemy Server
+alchemy         3234/tcp    # Alchemy Server 
+#                          Mikhail Belov <mikhail at imrgold.com> February 2002
+mdap-port       3235/udp    # MDAP Port
+mdap-port       3235/tcp    # MDAP port
+#                          Johan Deleu <johan.deleu at alcatel.be> February 2002
+apparenet-ts    3236/udp    # appareNet Test Server
+apparenet-ts    3236/tcp    # appareNet Test Server
+apparenet-tps   3237/udp    # appareNet Test Packet Sequencer
+apparenet-tps   3237/tcp    # appareNet Test Packet Sequencer
+apparenet-as    3238/udp    # appareNet Analysis Server
+apparenet-as    3238/tcp    # appareNet Analysis Server
+apparenet-ui    3239/udp    # appareNet User Interface
+apparenet-ui    3239/tcp    # appareNet User Interface
+#                          Fred Klassen <fklassen at jaalam.com> February 2002
+triomotion      3240/udp    # Trio Motion Control Port
+triomotion      3240/tcp    # Trio Motion Control Port
+#                          Tony Matthews <tmatthews at triomotion.com> February 2002
+sysorb          3241/udp    # SysOrb Monitoring Server
+sysorb          3241/tcp    # SysOrb Monitoring Server
+#                          Jakob Oestergaard <joe at sysorb.com> February 2002
+sdp-id-port     3242/udp    # Session Description ID
+sdp-id-port     3242/tcp    # Session Description ID
+#                          Greg Rose <ggr at qualcomm.com> February 2002
+timelot         3243/udp    # Timelot Port
+timelot         3243/tcp    # Timelot Port
+#                          David Ferguson <dferguson at xtralot.com> February 2002
+onesaf          3244/udp    # OneSAF
+onesaf          3244/tcp    # OneSAF
+#                          Gene McCulley <mcculley at cuspy.com> February 2002
+vieo-fe         3245/udp    # VIEO Fabric Executive
+vieo-fe         3245/tcp    # VIEO Fabric Executive
+#                          James Cox <jocox at view.com> February 2002
+dvt-system      3246/udp    # DVT SYSTEM PORT
+dvt-system      3246/tcp    # DVT SYSTEM PORT
+dvt-data        3247/udp    # DVT DATA LINK
+dvt-data        3247/tcp    # DVT DATA LINK
+#                          Phillip Heil <phil.heil at dvtsensors.com> February 2002
+procos-lm       3248/udp    # PROCOS LM
+procos-lm       3248/tcp    # PROCOS LM
+#                          Torsten Rendelmann
+#                          <torsten.rendelmann at procos.com> February 2002
+ssp             3249/udp    # State Sync Protocol
+ssp             3249/tcp    # State Sync Protocol
+#                          Stephane Beaulieu <stephane at cisco.com> February 2002
+hicp            3250/udp    # HMS hicp port
+hicp            3250/tcp    # HMS hicp port
+#                          Joel Palsson, HMS Industrial Networks AB
+#                          <ianacontact at hms.se> February 2002
+sysscanner      3251/udp    # Sys Scanner
+sysscanner      3251/tcp    # Sys Scanner
+#                          Dick Georges <georges at monaco.net> February 2002
+dhe             3252/udp    # DHE port
+dhe             3252/tcp    # DHE port
+#                          Fabrizio Massimo Ferrara <fmf at gesi.it> February 2002
+pda-data        3253/udp    # PDA Data
+pda-data        3253/tcp    # PDA Data
+pda-sys         3254/udp    # PDA System
+pda-sys         3254/tcp    # PDA System
+#                          Jian Fan <fjian at dmfsys.com> February 2002
+semaphore       3255/udp    # Semaphore Connection Port
+semaphore       3255/tcp    # Semaphore Connection Port
+#                          Jay Eckles <ecklesweb at yahoo.com> February 2002
+cpqrpm-agent    3256/udp    # Compaq RPM Agent Port
+cpqrpm-agent    3256/tcp    # Compaq RPM Agent Port
+cpqrpm-server   3257/udp    # Compaq RPM Server Port
+cpqrpm-server   3257/tcp    # Compaq RPM Server Port
+#                          Royal King <royal.king at compaq.com> February 2002
+ivecon-port     3258/udp    # Ivecon Server Port
+ivecon-port     3258/tcp    # Ivecon Server Port
+#                          Serguei Tevs <STevs at ivecon.com> February 2002
+epncdp2         3259/udp    # Epson Network Common Devi
+epncdp2         3259/tcp    # Epson Network Common Devi
+#                          SEIKO EPSON Corporation - Oishi Toshiaki
+#                          <Oishi.Toshiaki at exc.epson.co.jp> February 2002
+iscsi-target    3260/udp    # iSCSI port
+iscsi-target    3260/tcp    # iSCSI port
+#                          Julian Satran <Julian_Satran at il.ibm.com>
+winshadow       3261/udp    # winShadow
+winshadow       3261/tcp    # winShadow
+#                          Colin Barry <cbarry at gbahn.com>
+necp            3262/udp    # NECP
+necp            3262/tcp    # NECP
+#                          Alberto Cerpa <cerpa at isi.edu>
+ecolor-imager   3263/udp    # E-Color Enterprise Imager
+ecolor-imager   3263/tcp    # E-Color Enterprise Imager
+#                          Tamara Baker <tbaker at ecolor.com>
+ccmail          3264/udp    # cc:mail/lotus
+ccmail          3264/tcp    # cc:mail/lotus
+#                          <brockman at ccmail.com>
+altav-tunnel    3265/udp    # Altav Tunnel
+altav-tunnel    3265/tcp    # Altav Tunnel
+#                          Gary M. Allen <gallen at symantec.com>
+ns-cfg-server   3266/udp    # NS CFG Server
+ns-cfg-server   3266/tcp    # NS CFG Server
+#                          Aivi Lie <LIEA at netsoft.com>
+ibm-dial-out    3267/udp    # IBM Dial Out
+ibm-dial-out    3267/tcp    # IBM Dial Out
+#                          Skip Booth <sbooth at VNET.IBM.COM>
+msft-gc         3268/udp    # Microsoft Global Catalog
+msft-gc         3268/tcp    # Microsoft Global Catalog
+msft-gc-ssl     3269/udp    # Microsoft Global Catalog with LDAP/SSL
+msft-gc-ssl     3269/tcp    # Microsoft Global Catalog with LDAP/SSL
+#                          Asaf Kashi <asafk at microsoft.com>
+verismart       3270/udp    # Verismart
+verismart       3270/tcp    # Verismart
+#                          Jay Weber <weber at vfi.com>
+csoft-prev      3271/udp    # CSoft Prev Port
+csoft-prev      3271/tcp    # CSoft Prev Port
+#                          Nedelcho Stanev <decho at iname.com>
+user-manager    3272/udp    # Fujitsu User Manager
+user-manager    3272/tcp    # Fujitsu User Manager
+#                          Yukihiko Sakurai <y-sakurai at ael.fujitsu.co.jp>
+sxmp            3273/udp    # Simple Extensible Multiplexed Protocol
+sxmp            3273/tcp    # Simple Extensible Multiplexed Protocol
+#                          Stuart Newman <stuart.newman at fortel.com>
+ordinox-server  3274/udp    # Ordinox Server
+ordinox-server  3274/tcp    # Ordinox Server
+#                          Guy Letourneau <gletourneau at ordinox.com>
+samd            3275/udp    # SAMD
+samd            3275/tcp    # SAMD
+#                          Edgar Circenis <ec at fc.hp.com>
+maxim-asics	3276/udp    # Maxim ASICs
+maxim-asics	3276/tcp    # Maxim ASICs
+#			   Dave Inman <davei at mxim.com>
+awg-proxy	3277/udp    # AWG Proxy
+awg-proxy	3277/tcp    # AWG Proxy
+#			   Alex McDonald <alexm at an.hp.com>
+lkcmserver	3278/udp    # LKCM Server
+lkcmserver	3278/tcp    # LKCM Server
+#			   Javier Jimenez
+admind		3279/udp    # admind
+admind		3279/tcp    # admind
+#			   Jeff Haynes <haynes at chistech.com>
+vs-server	3280/udp    # VS Server
+vs-server	3280/tcp    # VS Server
+#			   Scott Godlew <Scott at godlew.com>
+sysopt 		3281/udp    # SYSOPT
+sysopt		3281/tcp    # SYSOPT
+#			   Tony Hoffman <ajh at unx.dec.com>
+datusorb	3282/udp    # Datusorb
+datusorb	3282/tcp    # Datusorb
+#			   Thomas Martin <thomas at datus-usa.com>
+net-assistant	3283/udp    # Net Assistant
+net-assistant	3283/tcp    # Net Assistant
+#			   Michael Stein <mvs at apple.com>
+4talk		3284/udp    # 4Talk
+4talk		3284/tcp    # 4Talk
+#			   Tony Bushnell <tony_bushnell at four-sight.co.uk>
+plato		3285/udp    # Plato
+plato		3285/tcp    # Plato
+#			   Jim Battin <battin at tro.com>
+e-net		3286/udp    # E-Net
+e-net		3286/tcp    # E-Net
+#			   Steven Grigsby <sgrigsby at austin.eent.com>
+directvdata	3287/udp    # DIRECTVDATA
+directvdata	3287/tcp    # DIRECTVDATA
+#			   Michael Friedman <mfr1 at worldnet.att.net>
+cops 		3288/udp    # COPS
+cops		3288/tcp    # COPS
+#			   Shai Herzog <herzog at iphighway.com>
+enpc		3289/udp    # ENPC
+enpc		3289/tcp    # ENPC
+#			   SEIKO EPSON <Ishida.Hitoshi at exc.epson.co.jp>
+caps-lm		3290/udp    # CAPS LOGISTICS TOOLKIT - LM
+caps-lm		3290/tcp    # CAPS LOGISTICS TOOLKIT - LM
+#			   Joseph Krebs <joek at caps.com>
+sah-lm		3291/udp    # S A Holditch & Associates - LM
+sah-lm		3291/tcp    # S A Holditch & Associates - LM
+#			   Randy Hudgens <rhh at nmail.holditch.com>
+cart-o-rama	3292/udp    # Cart O Rama
+cart-o-rama	3292/tcp    # Cart O Rama
+#			   Phillip Dillinger <Phillip.Dillinger at sealabs.com>
+fg-fps		3293/udp    # fg-fps
+fg-fps		3293/tcp    # fg-fps
+fg-gip		3294/udp    # fg-gip
+fg-gip		3294/tcp    # fg-gip
+#			   Jean-Marc Frailong <jmf at freegate.net>
+dyniplookup	3295/udp    # Dynamic IP Lookup
+dyniplookup	3295/tcp    # Dynamic IP Lookup
+#			   Eugene Osovetsky <eugeneo at geocities.com>
+rib-slm		3296/udp    # Rib License Manager
+rib-slm		3296/tcp    # Rib License Manager
+#			   Kristean Heisler <kh at rib.de>
+cytel-lm	3297/udp    # Cytel License Manager
+cytel-lm	3297/tcp    # Cytel License Manager
+#			   Yogesh P. Gajjar <yogesh at cytel.com>
+deskview        3298/udp    # DeskView
+deskview        3298/tcp    # DeskView
+#                          Manfred Randelzofer 
+#                          <manfred.randelzofer at fujitsu-siemens.com>
+pdrncs		3299/udp    # pdrncs
+pdrncs		3299/tcp    # pdrncs
+#			   Paul Wissenbach <paulwi at vnd.tek.com>
+###########	3300-3301  Unauthorized Use by SAP R/3   ######
+mcs-fastmail	3302/udp    # MCS Fastmail
+mcs-fastmail	3302/tcp    # MCS Fastmail
+#			   Patti Jo Newsom <pjn at mcsdallas.com>
+opsession-clnt  3303/udp    # OP Session Client
+opsession-clnt	3303/tcp    # OP Session Client
+opsession-srvr  3304/udp    # OP Session Server
+opsession-srvr  3304/tcp    # OP Session Server
+#			   Amir Blich <amir at netmanage.co.il>
+odette-ftp	3305/udp    # ODETTE-FTP
+odette-ftp	3305/tcp    # ODETTE-FTP
+#			   David Nash <dnash at ford.com>
+mysql		3306/udp    # MySQL
+mysql		3306/tcp    # MySQL
+#			   Monty <monty at analytikerna.se>
+opsession-prxy	3307/udp    # OP Session Proxy
+opsession-prxy	3307/tcp    # OP Session Proxy
+#			   Amir Blich <amir at netmanage.co.il>
+tns-server	3308/udp    # TNS Server
+tns-server	3308/tcp    # TNS Server
+tns-adv		3309/udp    # TNS ADV
+tns-adv		3309/tcp    # TNS ADV
+#			   Jerome Albin <albin at taec.enet.dec.com>
+dyna-access	3310/udp    # Dyna Access
+dyna-access	3310/tcp    # Dyna Access
+#			   Dave Belliveau
+#			   <DaveBelliveau at cornerstonesoftware.com>
+mcns-tel-ret	3311/udp    # MCNS Tel Ret
+mcns-tel-ret	3311/tcp    # MCNS Tel Ret
+#			   Randall Atkinson <rja at home.net>
+appman-server   3312/udp    # Application Management Server
+appman-server   3312/tcp    # Application Management Server
+uorb            3313/udp    # Unify Object Broker
+uorb            3313/tcp    # Unify Object Broker
+uohost          3314/udp    # Unify Object Host
+uohost          3314/tcp    # Unify Object Host
+#                          Duane Gibson <ianaportmaster at unify.com>
+cdid		3315/udp    # CDID
+cdid		3315/tcp    # CDID
+#			   Andrew Borisov <hdr at chat.ru>
+aicc-cmi	3316/udp    # AICC/CMI
+aicc-cmi	3316/tcp    # AICC/CMI
+#			   William McDonald <billmc at atc.boeing.com>
+vsaiport	3317/udp    # VSAI PORT
+vsaiport	3317/tcp    # VSAI PORT
+#			   Rieko Asai <asai at isl.mei.co.jp>
+ssrip		3318/udp    # Swith to Swith Routing Information Protocol
+ssrip		3318/tcp    # Swith to Swith Routing Information Protocol
+#			   Baba Hidekazu <baba at flare.nd.net.fujitsu.co.jp>
+sdt-lmd		3319/udp    # SDT License Manager
+sdt-lmd		3319/tcp    # SDT License Manager
+#			   Salvo Nassisi <sdtech at tin.it>
+officelink2000	3320/udp    # Office Link 2000
+officelink2000	3320/tcp    # Office Link 2000
+#			   Mike Balch <mbalch at teltone.com>
+vnsstr		3321/udp    # VNSSTR
+vnsstr		3321/tcp    # VNSSTR
+#			   Takeshi Ohmura <ohmura at isl.mei.co.jp>
+#			   Bob Braden <braden at isi.edu>
+sftu		3326/udp    # SFTU
+sftu		3326/tcp    # SFTU
+#		   Eduardo Rosenberg de Moura <eduardor at spacenet.com.br>
+bbars		3327/udp    # BBARS
+bbars		3327/tcp    # BBARS
+#			   Lou Harris <lharris at outlx.bandl.com>
+egptlm		3328/udp    # Eaglepoint License Manager
+egptlm		3328/tcp    # Eaglepoint License Manager
+#			   Dave Benton <dave.benton at eaglepoint.com>
+hp-device-disc  3329/udp    # HP Device Disc
+hp-device-disc  3329/tcp    # HP Device Disc
+#			   Shivaun Albright <shivaun_albright at hp.com>
+mcs-calypsoicf  3330/udp    # MCS Calypso ICF
+mcs-calypsoicf  3330/tcp    # MCS Calypso ICF
+mcs-messaging	3331/udp    # MCS Messaging
+mcs-messaging	3331/tcp    # MCS Messaging
+mcs-mailsvr	3332/udp    # MCS Mail Server
+mcs-mailsvr	3332/tcp    # MCS Mail Server
+#			   Patti Jo Newsom <pjn at mcsdallas.com>
+dec-notes       3333/udp    # DEC Notes
+dec-notes       3333/tcp    # DEC Notes
+#                          Kim Moraros <moraros at via.enet.dec.com>
+directv-web	3334/udp    # Direct TV Webcasting
+directv-web	3334/tcp    # Direct TV Webcasting
+directv-soft	3335/udp    # Direct TV Software Updates
+directv-soft	3335/tcp    # Direct TV Software Updates
+directv-tick	3336/udp    # Direct TV Tickers
+directv-tick	3336/tcp    # Direct TV Tickers
+directv-catlg	3337/udp    # Direct TV Data Catalog
+directv-catlg	3337/tcp    # Direct TV Data Catalog
+#			   Michael Friedman <mfr1 at worldnet.att.net>
+anet-b		3338/udp    # OMF data b
+anet-b		3338/tcp    # OMF data b
+anet-l		3339/udp    # OMF data l
+anet-l		3339/tcp    # OMF data l
+anet-m		3340/udp    # OMF data m
+anet-m		3340/tcp    # OMF data m
+anet-h		3341/udp    # OMF data h
+anet-h		3341/tcp    # OMF data h
+#			   Per Sahlqvist <psahlqvi at sw.seisy.abb.se>
+webtie		3342/udp    # WebTIE
+webtie		3342/tcp    # WebTIE
+#			   Kevin Frender <kbf at ngdc.noaa.gov>
+ms-cluster-net	3343/udp    # MS Cluster Net
+ms-cluster-net	3343/tcp    # MS Cluster Net
+#			   Mike Massa <mikemas at microsoft.com>
+bnt-manager     3344/udp    # BNT Manager
+bnt-manager     3344/tcp    # BNT Manager
+#                          Brian J. Ives <Brian.Ives at BadgerNT.com>
+influence	3345/udp    # Influence
+influence	3345/tcp    # Influence
+#			   Russ Ferriday <russf at topia.com>
+trnsprntproxy   3346/udp    # Trnsprnt Proxy
+trnsprntproxy	3346/tcp    # Trnsprnt Proxy
+#			   Grant Kirby <grant_kirby at ccm.al.intel.com>
+phoenix-rpc	3347/udp    # Phoenix RPC
+phoenix-rpc	3347/tcp    # Phoenix RPC
+#			   Ian Anderson <ian_anderson at phoenix.com>
+pangolin-laser	3348/udp    # Pangolin Laser
+pangolin-laser	3348/tcp    # Pangolin Laser
+#			   William Benner <William_Benner at msn.com>
+chevinservices  3349/udp    # Chevin Services
+chevinservices	3349/tcp    # Chevin Services
+#			   Gus McNaughton <gus at chevin.com>
+findviatv	3350/udp    # FINDVIATV
+findviatv	3350/tcp    # FINDVIATV
+#			   Oran Davis <oran at 8x8.com>
+btrieve         3351/udp    # Btrieve port
+btrieve         3351/tcp    # Btrieve port
+ssql            3352/udp    # Scalable SQL
+ssql            3352/tcp    # Scalable SQL
+#                          Chuck Talk <ctalk at pervasive.com>
+fatpipe		3353/udp    # FATPIPE
+fatpipe		3353/tcp    # FATPIPE
+#			   Sanchaita Datta <sdatta at ragula.com>
+suitjd		3354/udp    # SUITJD
+suitjd		3354/tcp    # SUITJD
+#			   Todd Moyer <tsm at unx.dec.com>
+ordinox-dbase	3355/udp    # Ordinox Dbase
+ordinox-dbase	3355/tcp    # Ordinox Dbase
+#			   Guy Litourneau <gletourneau at ordinox.com>
+upnotifyps	3356/udp    # UPNOTIFYPS
+upnotifyps	3356/tcp    # UPNOTIFYPS
+#			   Mark Fox <markf at uplanet.com>
+adtech-test	3357/udp    # Adtech Test IP
+adtech-test	3357/tcp    # Adtech Test IP
+#			   Robin Uyeshiro <robin_u at adtech-inc.com>
+mpsysrmsvr	3358/udp    # Mp Sys Rmsvr
+mpsysrmsvr	3358/tcp    # Mp Sys Rmsvr
+#			   Hiroyuki Kawabuchi <buchi at ael.fujitsu.co.jp>   
+wg-netforce	3359/udp    # WG NetForce
+wg-netforce	3359/tcp    # WG NetForce
+#			   Lee Wheat <wheat at wg.com>
+kv-server	3360/udp    # KV Server
+kv-server	3360/tcp    # KV Server
+kv-agent	3361/udp    # KV Agent
+kv-agent	3361/tcp    # KV Agent 
+#			   Thomas Soranno <tom_soranno at cipartners.com>
+dj-ilm		3362/udp    # DJ ILM
+dj-ilm		3362/tcp    # DJ ILM
+#			   Don Tyson
+nati-vi-server	3363/udp    # NATI Vi Server
+nati-vi-server	3363/tcp    # NATI Vi Server
+#			   Robert Dye <rob at natinst.com>
+creativeserver	3364/udp    # Creative Server
+creativeserver	3364/tcp    # Creative Server
+contentserver	3365/udp    # Content Server
+contentserver	3365/tcp    # Content Server
+creativepartnr	3366/udp    # Creative Partner
+creativepartnr	3366/tcp    # Creative Partner
+#			   Jesus Ortiz <Jesus_A._Ortiz at notes.emotion.com>
+#			   Scott Engel <ScottX_Engel at ccm.jf.intel.com>
+tip2		3372/udp    # TIP 2
+tip2		3372/tcp    # TIP 2
+#			   Keith Evans <keith at loc252.tandem.com>
+lavenir-lm	3373/udp    # Lavenir License Manager
+lavenir-lm	3373/tcp    # Lavenir License Manager
+#			   Marius Matioc <marius at lavenir.com>
+cluster-disc	3374/udp    # Cluster Disc
+cluster-disc	3374/tcp    # Cluster Disc
+#			   Jeff Hughes <Jeff.Hughes at columbiasc.ncr.com>
+vsnm-agent      3375/udp    # VSNM Agent
+vsnm-agent	3375/tcp    # VSNM Agent
+#			   Venkat Rangan <venkatr at vitalsigns.com>
+cdbroker	3376/udp    # CD Broker
+cdbroker	3376/tcp    # CD Broker
+#			   Moon Ho Chung <mchung at esps.com>
+cogsys-lm	3377/udp    # Cogsys Network License Manager
+cogsys-lm	3377/tcp    # Cogsys Network License Manager
+#			   Simon Chinnick <support at cogsys.co.uk>
+wsicopy		3378/udp    # WSICOPY
+wsicopy		3378/tcp    # WSICOPY
+#			   James Overby
+socorfs		3379/udp    # SOCORFS
+socorfs		3379/tcp    # SOCORFS
+#			   Hugo Charbonneau
+sns-channels	3380/udp    # SNS Channels
+sns-channels	3380/tcp    # SNS Channels
+#			   Shekar Pasumarthi <shekarp at firstfloor.com>
+geneous		3381/udp    # Geneous
+geneous		3381/tcp    # Geneous
+#			   Nick de Smith <nick.desmith at histech.com>
+fujitsu-neat	3382/udp    # Fujitsu Network Enhanced Antitheft function
+fujitsu-neat	3382/tcp    # Fujitsu Network Enhanced Antitheft function
+#			   Markku Viima <markku.viima at team.icl.se>
+esp-lm		3383/udp    # Enterprise Software Products License Manager
+esp-lm		3383/tcp    # Enterprise Software Products License Manager
+#			   George Rudy <george at entsoft.com>
+hp-clic 	3384/udp    # Hardware Management
+hp-clic		3384/tcp    # Cluster Management Services
+#			   Rajesh Srinivasaraghavan <srajesh at cup.hp.com>
+qnxnetman	3385/udp    # qnxnetman
+qnxnetman	3385/tcp    # qnxnetman
+#			   Michael Hunter <mphunter at qnx.com>
+gprs-sig	3386/udp    # GPRS SIG
+gprs-data	3386/tcp    # GPRS Data
+#			   Ansgar Bergmann <Ansgar.Bergmann at etsi.fr>
+backroomnet	3387/udp    # Back Room Net
+backroomnet	3387/tcp    # Back Room Net
+#			   Clayton Wilkinson <cwilkinson at carreker.com>
+cbserver	3388/udp    # CB Server
+cbserver	3388/tcp    # CB Server
+#			   Allen Wei <Allen_Wei at arborsoft.com>
+ms-wbt-server	3389/udp    # MS WBT Server
+ms-wbt-server	3389/tcp    # MS WBT Server
+#			   Ritu Bahl <ritub at microsoft.com>
+dsc		3390/udp    # Distributed Service Coordinator
+dsc		3390/tcp    # Distributed Service Coordinator
+#			   Chas Honton <chas at secant.com>
+savant		3391/udp    # SAVANT
+savant		3391/tcp    # SAVANT
+#			   Andy Bruce <franklin_yah at yahoo.com>
+efi-lm		3392/udp    # EFI License Management
+efi-lm		3392/tcp    # EFI License Management
+#			   Ross E. Greinke <greinker at execpc.com>
+d2k-tapestry1	3393/udp    # D2K Tapestry Client to Server
+d2k-tapestry1	3393/tcp    # D2K Tapestry Client to Server
+d2k-tapestry2	3394/udp    # D2K Tapestry Server to Server
+d2k-tapestry2	3394/tcp    # D2K Tapestry Server to Server
+#			   Eric Lan <elan at d2k.com>
+dyna-lm		3395/udp    # Dyna License Manager (Elam)
+dyna-lm		3395/tcp    # Dyna License Manager (Elam)
+#			   Anjana Iyer <anjana at dyna.com>
+printer_agent	3396/udp    # Printer Agent
+printer_agent	3396/tcp    # Printer Agent
+#			   Devon Taylor <dtaylor at novell.com>
+cloanto-lm	3397/udp    # Cloanto License Manager 
+cloanto-lm	3397/tcp    # Cloanto License Manager
+#		    	   Takeo Sato <takeo_sato-iana at cloanto.com>
+mercantile	3398/udp    # Mercantile
+mercantile	3398/tcp    # Mercantile
+#			   Erik Kragh Jensen <kragh at inet.uni2.dk>
+csms		3399/udp    # CSMS
+csms		3399/tcp    # CSMS
+csms2		3400/udp    # CSMS2
+csms2		3400/tcp    # CSMS2
+#			   Markus Michels <mmi at cedros.com>
+filecast        3401/udp    # filecast
+filecast        3401/tcp    # filecast
+#                          Eden Sherry <eden at pair.com>
+fxaengine-net   3402/udp    # FXa Engine Network Port
+fxaengine-net   3402/tcp    # FXa Engine Network Port
+#                          Lucas Alonso <luke at demiurgestudios.com> February 2002
+copysnap        3403/udp    # CopySnap Server Port
+copysnap        3403/tcp    # CopySnap Server Port
+#                          Steve Zellers <zellers at basilsoft.com> February 2002
+#               3404       Removed (2002-05-01)
+nokia-ann-ch1   3405/udp    # Nokia Announcement ch 1
+nokia-ann-ch1   3405/tcp    # Nokia Announcement ch 1
+nokia-ann-ch2   3406/udp    # Nokia Announcement ch 2
+nokia-ann-ch2   3406/tcp    # Nokia Announcement ch 2
+#                          Morteza Kalhour <Morteza.Kalhour at Nokia.com> February 2002
+ldap-admin      3407/udp    # LDAP admin server port
+ldap-admin      3407/tcp    # LDAP admin server port
+#                          Stephen Tsun <stsun at calient.net> February 2002
+issapi          3408/udp    # POWERpack API Port
+issapi          3408/tcp    # POWERpack API Port
+#                          Colin Griffiths <colin.griffiths at int-link.com> February 2002
+networklens     3409/udp    # NetworkLens Event Port
+networklens     3409/tcp    # NetworkLens Event Port
+networklenss    3410/udp    # NetworkLens SSL Event
+networklenss    3410/tcp    # NetworkLens SSL Event
+#                          Greg Bailey <gbailey at lxpro.com> February 2002
+biolink-auth    3411/udp    # BioLink Authenteon server
+biolink-auth    3411/tcp    # BioLink Authenteon server
+#                          BioLink Support <reginfo at biolinkusa.com> February 2002
+xmlblaster      3412/udp    # xmlBlaster
+xmlblaster      3412/tcp    # xmlBlaster
+#                          Marcel Ruff <ruff at swand.lake.de> February 2002
+svnet           3413/udp    # SpecView Networking
+svnet           3413/tcp    # SpecView Networking
+#                          Richard Dickins <rad at specview.com> February 2002
+wip-port        3414/udp    # BroadCloud WIP Port
+wip-port        3414/tcp    # BroadCloud WIP Port
+bcinameservice  3415/udp    # BCI Name Service
+bcinameservice  3415/tcp    # BCI Name Service
+#                          Dennis Parker <dparker at broadcloud.com> February 2002
+commandport     3416/udp    # AirMobile IS Command Port
+commandport     3416/tcp    # AirMobile IS Command Port
+#                          Mike Klein <m.klein at motorla.com> February 2002
+csvr            3417/udp    # ConServR file translation
+csvr            3417/tcp    # ConServR file translation
+#                          Albert Leung <aleung at biscom.com> February 2002
+rnmap           3418/udp    # Remote nmap
+rnmap           3418/tcp    # Remote nmap
+#                          Tuomo Makinen <tmakinen at pp.htv.fi> February 2002
+softaudit       3419/udp    # ISogon SoftAudit
+softaudit       3419/tcp    # Isogon SoftAudit
+#                          Per Hellberg <phellberg at isogon.com> February 2002
+ifcp-port       3420/udp    # iFCP User Port
+ifcp-port       3420/tcp    # iFCP User Port
+#                          Charles Monia <cmonia at nishansystems.com>
+bmap            3421/udp    # Bull Apprise portmapper
+bmap            3421/tcp    # Bull Apprise portmapper
+#                          Jeremy Gilbert <J.Gilbert at ma30.bull.com>
+rusb-sys-port   3422/udp    # Remote USB System Port
+rusb-sys-port   3422/tcp    # Remote USB System Port
+#                          Steven Klein <stevek at ionetworks.com> February 2002
+xtrm            3423/udp    # xTrade Reliable Messaging
+xtrm            3423/tcp    # xTrade Reliable Messaging
+xtrms           3424/udp    # xTrade over TLS/SSL
+xtrms           3424/tcp    # xTrade over TLS/SSL
+#                          Mats Nilsson <mats.nilsson at xware.se> February 2002
+agps-port       3425/udp    # AGPS Access Port
+agps-port       3425/tcp    # AGPS Access Port
+#                          Kristoffer Nilsson
+#                          <kristoffer.nilsson at hutchison3g.com> February 2002
+arkivio         3426/udp    # Arkivio Storage Protocol
+arkivio         3426/tcp    # Arkivio Storage Protocol
+#                          Bruce Greenblatt <bruce at arkivio.com> February 2002
+websphere-snmp  3427/udp    # WebSphere SNMP
+websphere-snmp  3427/tcp    # WebSphere SNMP
+#                          Richard Mills <ramills at us.ibm.com> February 2002
+twcss           3428/udp    # 2Wire CSS
+twcss           3428/tcp    # 2Wire CSS
+#                          2Wire IANA Contact <iana at 2wire.com> February 2002
+gcsp            3429/udp    # GCSP user port
+gcsp            3429/tcp    # GCSP user port
+#                          Anirban Majumder <majumderanirban at lycos.com> March 2002
+ssdispatch      3430/udp    # Scott Studios Dispatch
+ssdispatch      3430/tcp    # Scott Studios Dispatch
+#                          Michael Settles <michael.settles at verizon.net> March 2002
+ndl-als         3431/udp    # Active License Server Port
+ndl-als         3431/tcp    # Active License Server Port
+#                          Quentin Brown <ndldev at ndl.co.uk> March 2002
+osdcp           3432/udp    # Secure Device Protocol
+osdcp           3432/tcp    # Secure Device Protocol
+#                          Peter Fernandez <fernandez at omnisec.ch> March 2002
+alta-smp        3433/udp    # Altaworks Service Management Platform
+alta-smp        3433/tcp    # Altaworks Service Management Platform
+#                          Ted Macomber <TedM at Altaworks.com> March 2002
+opencm          3434/udp    # OpenCM Server
+opencm          3434/tcp    # OpenCM Server
+#                          Jonathan S. Shapiro <registrar at eros-os.org> March 2002
+pacom           3435/udp    # Pacom Security User Port
+pacom           3435/tcp    # Pacom Security User Port
+#                          Steve Barton <steveb at pacomsystems.com> March 2002
+gc-config       3436/udp    # GuardControl Exchange Protocol
+gc-config       3436/tcp    # GuardControl Exchange Protocol
+#                          Andreas Schwarz <andi at trancefield.de> March 2002
+autocueds       3437/udp    # Autocue Directory Service
+autocueds       3437/tcp    # Autocue Directory Service
+#                          Geoff Back <geoff at autocue.co.uk> March 2002
+spiral-admin    3438/udp    # Spiralcraft Admin
+spiral-admin    3438/tcp    # Spiralcraft Admin
+#                          Michael Toth <mike at spiralcraft.com> March 2002
+hri-port        3439/udp    # HRI Interface Port
+hri-port        3439/tcp    # HRI Interface Port
+#                          John Fayos <john.fayos at criticallink.com> March 2002
+ans-console     3440/udp    # Net Steward Mgmt Console
+ans-console     3440/tcp    # Net Steward Mgmt Console
+#                          John Richmond <developers at securitydesigners.com> March 2002
+connect-client  3441/udp    # OC Connect Client
+connect-client  3441/tcp    # OC Connect Client
+connect-server  3442/udp    # OC Connect Server
+connect-server  3442/tcp    # OC Connect Server
+#                          Mike Velten <mike.Velten at liebert.com> March 2002
+ov-nnm-websrv   3443/udp    # OpenView Network Node Manager WEB Server
+ov-nnm-websrv   3443/tcp    # OpenView Network Node Manager WEB Server
+#                          Anthony Walker <anthony_walker at hp.com> March 2002
+denali-server   3444/udp    # Denali Server
+denali-server   3444/tcp    # Denali Server
+#                          Joe Devlin <Joe.Devlin at rocketsoftware.com> March 2002
+monp            3445/udp    # Media Object Network
+monp            3445/tcp    # Media Object Network
+#                          Ron Herardian <ron at zoogaloo.com> March 2002
+3comfaxrpc      3446/udp    # 3Com FAX RPC port
+3comfaxrpc      3446/tcp    # 3Com FAX RPC port
+#                          Christopher Wells <christopher_wells at 3com.com> April 2002
+cddn            3447/udp    # CompuDuo DirectNet
+cddn            3447/tcp    # CompuDuo DirectNet
+#                          Gregory Richards <GregorR at compuduo.com> April 2002
+dnc-port        3448/udp    # Discovery and Net Config
+dnc-port        3448/tcp    # Discovery and Net Config
+#                          Chi Chen <chichen at us.ibm.com> April 2002
+hotu-chat       3449/udp    # HotU Chat
+hotu-chat       3449/tcp    # HotU Chat
+#                          Tim Burgess <tim at hotu.com> April 2002
+castorproxy     3450/udp    # CAStorProxy
+castorproxy     3450/tcp    # CAStorProxy
+#                          Raymond J. Young <Raymond.Young at ca.com> April 2002
+asam            3451/udp    # ASAM Services
+asam            3451/tcp    # ASAM Services
+#                          Mike Gossett <mike at omnibond.com> April 2002
+sabp-signal     3452/udp    # SABP-Signalling Protocol
+sabp-signal     3452/tcp    # SABP-Signalling Protocol
+#                          Brendan McWilliams <brendan.mcwilliams at vf.vodafone.co.uk> April 2002
+pscupd          3453/udp    # PSC Update Port
+pscupd          3453/tcp    # PSC Update Port
+#                          Reid B. Ligon <reid.ligon at pscnet.com>
+mira            3454/tcp    # Apple Remote Access Protocol
+#                          Mike Alexander <mta at um.cc.umich.edu>
+prsvp           3455/udp    # RSVP Port
+prsvp           3455/tcp    # RSVP Port
+#                          Bob Braden <Braden at isi.edu>
+vat             3456/udp    # VAT default data
+vat             3456/tcp    # VAT default data
+#                          Van Jacobson <van at ee.lbl.gov>
+vat-control     3457/udp    # VAT default control
+vat-control     3457/tcp    # VAT default control
+#                          Van Jacobson <van at ee.lbl.gov>
+d3winosfi       3458/udp    # D3WinOSFI
+d3winosfi       3458/tcp    # D3WinOSFI
+#                          Brad Hamilton <bh at picksys.com>
+integral        3459/udp    # TIP Integral
+integral        3459/tcp    # TIP Integral
+#                          Olivier Mascia <om at tipgroup.com>
+edm-manager     3460/udp    # EDM Manger
+edm-manager     3460/tcp    # EDM Manger
+edm-stager      3461/udp    # EDM Stager
+edm-stager      3461/tcp    # EDM Stager
+edm-std-notify  3462/udp    # EDM STD Notify
+edm-std-notify  3462/tcp    # EDM STD Notify
+edm-adm-notify  3463/udp    # EDM ADM Notify
+edm-adm-notify  3463/tcp    # EDM ADM Notify
+edm-mgr-sync    3464/udp    # EDM MGR Sync
+edm-mgr-sync    3464/tcp    # EDM MGR Sync
+edm-mgr-cntrl   3465/udp    # EDM MGR Cntrl
+edm-mgr-cntrl   3465/tcp    # EDM MGR Cntrl
+#                          Tom Hennessy <thenn at novadigm.com>
+workflow        3466/udp    # WORKFLOW
+workflow        3466/tcp    # WORKFLOW
+#                          Robert Hufsky <rhufsky at csesys.co.at>
+rcst            3467/udp    # RCST
+rcst            3467/tcp    # RCST
+#                          Kit Sturgeon <Kit at remotecontrolsextoys.com>
+ttcmremotectrl  3468/udp    # TTCM Remote Controll
+ttcmremotectrl  3468/tcp    # TTCM Remote Controll
+#                          Yossi Cohen-Shahar <yossi at proxy.co.il>
+pluribus        3469/udp    # Pluribus
+pluribus        3469/tcp    # Pluribus
+#                          Mark Miller <markm at caplet.com>
+jt400           3470/udp    # jt400
+jt400           3470/tcp    # jt400
+jt400-ssl       3471/udp    # jt400-ssl
+jt400-ssl       3471/tcp    # jt400-ssl
+#                          Clifton Nock <cnock at us.ibm.com>
+jaugsremotec-1  3472/udp    # JAUGS N-G Remotec 1
+jaugsremotec-1  3472/tcp    # JAUGS N-G Remotec 1
+jaugsremotec-2  3473/udp    # JAUGS N-G Remotec 2
+jaugsremotec-2  3473/tcp    # JAUGS N-G Remotec 2
+#                          Steven B. Cliff <scliff at remotec-andros.com> April 2002
+ttntspauto      3474/udp    # TSP Automation
+ttntspauto      3474/tcp    # TSP Automation
+#                          Arnie Koster <akoster at teltone.com> April 2002
+genisar-port    3475/udp    # Genisar Comm Port
+genisar-port    3475/tcp    # Genisar Comm Port
+#                          Candace Niccolson <cniccolson at genisar.com> April 2002
+nppmp           3476/udp    # NVIDIA Mgmt Protocol
+nppmp           3476/tcp    # NVIDIA Mgmt Protocol
+#                          Gilbert Yeung <gyeung at nvidia.com> April 2002
+ecomm           3477/udp    # eComm link port
+ecomm           3477/tcp    # eComm link port
+#                          Thomas Soerensen <thomassoerensen at stofanet.dk> April 2002
+nat-stun-port   3478/udp    # Simple Traversal of UDP Through NAT (STUN) port
+nat-stun-port   3478/tcp    # Simple Traversal of UDP Through NAT (STUN) port
+#                          Jonathan Rosenberg <jdrosen at dynamicsoft.com> April 2002
+twrpc           3479/udp    # 2Wire RPC
+twrpc           3479/tcp    # 2Wire RPC
+#                          2Wire IANA Contact <iana at 2wire.com> April 2002
+plethora        3480/udp    # Secure Virtual Workspace
+plethora        3480/tcp    # Secure Virtual Workspace
+#                          Tim Simms <tsimms at plethoratech.com> April 2002
+cleanerliverc   3481/udp    # CleanerLive remote ctrl
+cleanerliverc   3481/tcp    # CleanerLive remote ctrl
+#                          David Mojdehi <david.mojdehi at autodesk.com> April 2002
+vulture         3482/udp    # Vulture Monitoring System
+vulture         3482/tcp    # Vulture Monitoring System
+#                          Jason Santos <jason.santos at megaslow.net> April 2002
+slim-devices    3483/udp    # Slim Devices Protocol
+slim-devices    3483/tcp    # Slim Devices Protocol
+#                          Sean Adams <sean at slimdevices.com> May 2002
+gbs-stp         3484/udp    # GBS SnapTalk Protocol
+gbs-stp         3484/tcp    # GBS SnapTalk Protocol
+#                          Eric Harris-Braun <eric at glassbead.com> May 2002
+celatalk        3485/udp    # CelaTalk
+celatalk        3485/tcp    # CelaTalk
+#                          Carl Blundell <cblundell at celador.co.uk> May 2002
+ifsf-hb-port    3486/udp    # IFSF Heartbeat Port
+ifsf-hb-port    3486/tcp    # IFSF Heartbeat Port
+#                          IFSF Secretary <secretary at ifsf.org> May 2002
+ltcudp          3487/udp    # LISA UDP Transfer Channel
+ltctcp          3487/tcp    # LISA TCP Transfer Channel
+#                          Pit Vetterick <pit at 3dgo.com> May 2002
+fs-rh-srv       3488/udp    # FS Remote Host Server
+fs-rh-srv       3488/tcp    # FS Remote Host Server
+#                          Brian Nickles <RogueSpear91 at hotmail.com> May 2002
+dtp-dia         3489/udp    # DTP/DIA
+dtp-dia         3489/tcp    # DTP/DIA
+#                          Alexei V. Soloviev <avsolov at lab127.karelia.ru> May 2002
+colubris        3490/udp    # Colubris Management Port
+colubris        3490/tcp    # Colubris Management Port
+#                          Gilbert Moineau <gilbert.moineau at colubris.com> May 2002
+swr-port        3491/udp    # SWR Port 
+swr-port        3491/tcp    # SWR Port
+#                          Ian Manning <imanning at dtsuk.com> May 2002
+tvdumtray-port  3492/udp    # TVDUM Tray Port
+tvdumtray-port  3492/tcp    # TVDUM Tray Port
+#                          Peter Boers <boers at isisglobal.nl> May 2002 
+nut             3493/udp    # Network UPS Tools
+nut             3493/tcp    # Network UPS Tools
+#                          Russell Kroll <nut-iana at exploits.org> May 2002
+ibm3494         3494/udp    # IBM 3494
+ibm3494         3494/tcp    # IBM 3494
+#                          Jeffrey Pilch <jpilch at us.ibm.com>
+seclayer-tcp    3495/udp    # securitylayer over tcp
+seclayer-tcp    3495/tcp    # securitylayer over tcp
+seclayer-tls    3496/udp    # securitylayer over tls
+seclayer-tls    3496/tcp    # securitylayer over tls
+#                          Arno Hollosi <arno.hollosi at cio.gv.at> March 2002
+ipether232port  3497/udp    # ipEther232Port
+ipether232port  3497/tcp    # ipEther232Port
+#                          Marcus Leufgen <leufgen at ipcas.de> May 2002
+dashpas-port    3498/udp    # DASHPAS user port
+dashpas-port    3498/tcp    # DASHPAS user port
+#                          Albrecht Mayer <albrecht.mayer at infineon.com> May 2002
+sccip-media     3499/udp    # SccIP Media
+sccip-media     3499/tcp    # SccIP Media
+#                          David Yon <dyon at dialout.net> May 2002
+rtmp-port       3500/udp    # RTMP Port
+rtmp-port       3500/tcp    # RTMP Port
+#                          Miriam Wohlgelernter <miriamw at adirtech.com>
+isoft-p2p       3501/udp    # iSoft-P2P
+isoft-p2p       3501/tcp    # iSoft-P2P
+#                          David Walling <dwalling at isoft.com>
+avinstalldisc   3502/udp    # Avocent Install Discovery
+avinstalldisc   3502/tcp    # Avocent Install Discovery
+#                          Brian S. Stewart <Brian.Stewart at Avovent.com>
+lsp-ping        3503/udp    # MPLS LSP-echo Port
+lsp-ping        3503/tcp    # MPLS LSP-echo Port
+#                          Ping Pan <pingpan at juniper.net>
+ironstorm       3504/udp    # IronStorm game server
+ironstorm       3504/tcp    # IronStorm game server
+#                          Arnaud Clermonte <clermonte at 4xtechnologies.com>
+ccmcomm         3505/udp    # CCM communications port
+ccmcomm         3505/tcp    # CCM communications port
+#                          Tom Bougan <tomb at apptechsys.com>
+apc-3506        3506/udp    # APC 3506
+apc-3506        3506/tcp    # APC 3506
+#                          American Power Conversion <ports at apcc.com>
+nesh-broker     3507/udp    # Nesh Broker Port
+nesh-broker     3507/tcp    # Nesh Broker Port
+#                          Jeremy Maiden <jeremy at komarr.demon.co.uk>
+interactionweb  3508/udp    # Interaction Web
+interactionweb  3508/tcp    # Interaction Web
+#                          Andy Niksch <andyn at inin.com>
+vt-ssl          3509/udp    # Virtual Token SSL Port
+vt-ssl          3509/tcp    # Virtual Token SSL Port
+#                          Libor Sykora <libor.sykora at st.com> May 2002
+xss-port        3510/udp    # XSS Port
+xss-port        3510/tcp    # XSS Port
+#                          Joe Purcell <jpurcell at ensuretech.com> May 2002
+webmail-2       3511/udp    # WebMail/2
+webmail-2       3511/tcp    # WebMail/2
+#                          Dimitris Michelinakis <dimitris at michelinakis.gr> May 2002
+aztec           3512/udp    # Aztec Distribution Port
+aztec           3512/tcp    # Aztec Distribution Port
+#                          Alan Francis <AlanF at zonal.co.uk> May 2002
+arcpd           3513/udp    # Adaptec Remote Protocol
+arcpd           3513/tcp    # Adaptec Remote Protocol
+#                          Hardy Doelfel <hardy_doelfel at adaptec.com> May 2002
+must-p2p        3514/udp    # MUST Peer to Peer
+must-p2p        3514/tcp    # MUST Peer to Peer
+must-backplane  3515/udp    # MUST Backplane
+must-backplane  3515/tcp    # MUST Backplane
+#                          Rick Stefanik <r.stefanik at gatelinx.com> May 2002
+smartcard-port  3516/udp    # Smartcard Port 
+smartcard-port  3516/tcp    # Smartcard Port
+#                          Scott Guthery <sguthery at mobile-mind.com> May 2002
+802-11-iapp     3517/udp    # IEEE 802.11 WLANs WG IAPP
+802-11-iapp     3517/tcp    # IEEE 802.11 WLANs WG IAPP
+#                          Stuart J. Kerry (Chair IEEE 802.11 WG)
+#                          <stuart at ok-brit.com> May 2002
+artifact-msg    3518/udp    # Artifact Message Server
+artifact-msg    3518/tcp    # Artifact Message Server
+#                          Ron Capwell <ron at artifactsoftware.com> June 2002
+galileo         3519/udp    # Netvion Galileo Port
+nvmsgd          3519/tcp    # Netvion Messenger Port
+galileolog      3520/udp    # Netvion Galileo Log Port
+galileolog      3520/tcp    # Netvion Galileo Log Port
+#                          Ray Caruso <ray.caruso at netvion.com> June 2002
+mc3ss           3521/udp    # Telequip Labs MC3SS
+mc3ss           3521/tcp    # Telequip Labs MC3SS
+#                          Michael Sparks <msparks at telequiplabs.com> June 2002
+nssocketport    3522/udp    # DO over NSSocketPort
+nssocketport    3522/tcp    # DO over NSSocketPort
+#                          Douglas Davidson <drd at apple.com> June 2002
+odeumservlink   3523/udp    # Odeum Serverlink
+odeumservlink   3523/tcp    # Odeum Serverlink 
+#                          Mads Peter Back <iana-contact at webhouse.dk> June 2002
+ecmport         3524/udp    # ECM Server port
+ecmport         3524/tcp    # ECM Server port
+eisport         3525/udp    # EIS Server port
+eisport         3525/tcp    # EIS Server port
+#                          Paul Kraus <paul.kraus at veritas.com> June 2002
+starquiz-port   3526/udp    # starQuiz Port
+starquiz-port   3526/tcp    # starQuiz Port
+#                          Adam Ernst <contact at cosmicsoft.net> June 2002
+beserver-msg-q  3527/udp    # VERITAS Backup Exec Server
+beserver-msg-q  3527/tcp    # VERITAS Backup Exec Server
+#                          Katherine Wattwood <katherine.wattwood at veritas.com> June 2002
+jboss-iiop      3528/udp    # JBoss IIOP
+jboss-iiop      3528/tcp    # JBoss IIOP
+jboss-iiop-ssl  3529/udp    # JBoss IIOP/SSL
+jboss-iiop-ssl  3529/tcp    # JBoss IIOP/SSL
+#                          Francisco Reverbel <reverbel at ime.usp.br> June 2002
+gf              3530/udp    # Grid Friendly
+gf              3530/tcp    # Grid Friendly
+#                          Daivd P. Chassin <david.chassin at pnl.gov> June 2002
+joltid          3531/udp    # Joltid
+joltid          3531/tcp    # Joltid
+#                          Ahti Heinla <ahti at ahti.bluemoon.ee> June 2002
+raven-rmp       3532/udp    # Raven Remote Management Control
+raven-rmp       3532/tcp    # Raven Remote Management Control
+raven-rdp       3533/udp    # Raven Remote Management Data
+raven-rdp       3533/tcp    # Raven Remote Management Data
+#                          Daniel Sorlov <daniel at sorlov.com> June 2002
+urld-port       3534/udp    # URL Daemon Port
+urld-port       3534/tcp    # URL Daemon Port
+#                          Jim Binkley <jrb at cs.pdx.edu> June 2002
+ms-la           3535/udp    # MS-LA
+ms-la           3535/tcp    # MS-LA
+#                          Eric Ledoux <ericle at microsoft.com> 
+snac            3536/udp    # SNAC
+snac            3536/tcp    # SNAC
+#                          Tatsuya Igarashi <Tatsuya.Igarashi at jp.sony.com> July 2002
+ni-visa-remote  3537/udp    # Remote NI-VISA port
+ni-visa-remote  3537/tcp    # Remote NI-VISA port
+#                          Sinnadurai Dharshan <sinnadurai.dharshan at ni.com> July 2002
+ibm-diradm      3538/udp    # IBM Directory Server
+ibm-diradm      3538/tcp    # IBM Directory Server
+ibm-diradm-ssl  3539/udp    # IBM Directory Server SSL
+ibm-diradm-ssl  3539/tcp    # IBM Directory Server SSL
+#                          Mark Cavage <mcavage at us.ibm.com> July 2002
+pnrp-port       3540/udp    # PNRP User Port
+pnrp-port       3540/tcp    # PNRP User Port
+#                          Igor Kostic <igorko at microsoft.com> July 2002
+voispeed-port   3541/udp    # VoiSpeed Port
+voispeed-port   3541/tcp    # VoiSpeed Port
+#                          Virgilio Lattanzi <virgilio at harpax.com> July 2002
+hacl-monitor    3542/udp    # HA cluster monitor
+hacl-monitor    3542/tcp    # HA cluster monitor
+#                          Jason Ko <jason_ko at hp.com> July 2002
+qftest-lookup   3543/udp    # qftest Lookup Port
+qftest-lookup   3543/tcp    # qftest Lookup Port
+#                          Gregor Schmid <gs at qfs.de> July 2002
+teredo          3544/udp    # Teredo Port
+teredo          3544/tcp    # Teredo Port
+#                          Dave Thaler <dthaler at microsoft.com> July 2002
+camac           3545/udp    # CAMAC equipment
+camac           3545/tcp    # CAMAC equipment
+#                          Eugene Zhiganov <zed at dfe3300.karelia.ru> July 2002
+#               3546       Unassigned (removed September 2002)
+symantec-sim    3547/udp    # Symantec SIM
+symantec-sim    3547/tcp    # Symantec SIM
+#                          George Dzieciol <gdzieciol at symantec.com> July 2002
+interworld      3548/udp    # Interworld
+interworld      3548/tcp    # Interworld
+#                          John Stephen <iana at mundocani.com> July 2002
+tellumat-nms    3549/udp    # Tellumat MDR NMS
+tellumat-nms    3549/tcp    # Tellumat MDR NMS 
+#                          Hennie van der Merwe <hvandermerwe at tellumat.com> July 2002
+ssmpp           3550/udp    # Secure SMPP
+ssmpp           3550/tcp    # Secure SMPP
+#                          Cormac Long <webmaster at smsforum.net> July 2002
+apcupsd         3551/udp    # Apcupsd Information Port
+apcupsd         3551/tcp    # Apcupsd Information Port
+#                          Riccardo Facchetti <riccardo at inetcosmos.org> July 2002
+taserver        3552/udp    # TeamAgenda Server Port
+taserver        3552/tcp    # TeamAgenda Server Port
+#                          Dany Ayotte <ayotte at teamsoft.com> July 2002
+rbr-discovery   3553/udp    # Red Box Recorder ADP
+rbr-discovery   3553/tcp    # Red Box Recorder ADP
+#                          Simon Jolly <simon.jolly at origin-data.co.uk> July 2002
+questnotify     3554/udp    # Quest Notification Server
+questnotify     3554/tcp    # Quest Notification Server
+#                          Rob Griffin <quest_iana at oz.quest.com> July 2002
+razor           3555/udp    # Vipul's Razor
+razor           3555/tcp    # Vipul's Razor
+#                          Vipul Ved Prakash <mail at vipul.net> July 2002
+sky-transport   3556/udp    # Sky Transport Protocol
+sky-transport   3556/tcp    # Sky Transport Protocol
+#                          Michael Paddon <michael.paddon at activesky.com> July 2002
+personalos-001  3557/udp    # PersonalOS Comm Port
+personalos-001  3557/tcp    # PersonalOS Comm Port
+#                          Shane Roberts <shane at shaneroberts.com> July 2002
+mcp-port        3558/udp    # MCP user port
+mcp-port        3558/tcp    # MCP user port
+#                          Professor Paul S. Wang <pwang at cs.kent.edu> July 2002
+cctv-port       3559/udp    # CCTV control port
+cctv-port       3559/tcp    # CCTV control port
+#                          Raymond Lyons <rlyons at vicon-cctv.com> July 2002
+iniserve-port   3560/udp    # INIServe port
+iniserve-port   3560/tcp    # INIServe port
+#                          Peter Moylan <peter at ee.newcastle.edu.au> August 2002
+bmc-onekey      3561/udp    # BMC-OneKey
+bmc-onekey      3561/tcp    # BMC-OneKey
+#                          Alon Tam <alon_tam at bmc.com> August 2002
+sdbproxy        3562/udp    # SDBProxy
+sdbproxy        3562/tcp    # SDBProxy
+#                          Eric Grange <egrange at creative-it.net> August 2002   
+watcomdebug     3563/udp    # Watcom Debug
+watcomdebug     3563/tcp    # Watcom Debug
+#                          Dave Neudoerffer <Dave.Neudoerffer at ianywhere.com>
+esimport        3564/udp    # Electromed SIM port
+esimport        3564/tcp    # Electromed SIM port
+#                          Francois Marchand <francois.marchand at electromed.com> August 2002
+m2pa            3565/sctp   # M2PA
+m2pa            3565/tcp    # M2PA
+#                          Tom George <Tom.George at alcatel.com> May 2002
+quest-launcher  3566/udp    # Quest Agent Manager
+quest-launcher  3566/tcp    # Quest Agent Manager
+#                          Eyal Kalderon <eyal.kalderon at quest.com> April 2002
+emware-oft      3567/udp    # emWare OFT Services
+emware-oft      3567/tcp    # emWare OFT Services
+#                          Bryant Eastham <beastham at emware.com> August 2002
+emware-epss     3568/udp    # emWare EMIT/Secure
+emware-epss     3568/tcp    # emWare EMIT/Secure
+#                          Bryant Eastham <beastham at emware.com> January 2003
+mbg-ctrl        3569/udp    # Meinberg Control Service
+mbg-ctrl        3569/tcp    # Meinberg Control Service
+#                          Martin Burnicki <martin.burnicki at meinberg.de> August 2002
+mccwebsvr-port  3570/udp    # MCC Web Server Port
+mccwebsvr-port  3570/tcp    # MCC Web Server Port
+megardsvr-port  3571/udp    # MegaRAID Server Port
+megardsvr-port  3571/tcp    # MegaRAID Server Port
+megaregsvrport  3572/udp    # Registration Server Port
+megaregsvrport  3572/tcp    # Registration Server Port
+#                          Sreenivas Bagalkote <sreenib at lsil.com> August 2002
+tag-ups-1       3573/udp    # Advantage Group UPS Suite
+tag-ups-1       3573/tcp    # Advantage Group UPS Suite
+#                          James Goddard <jamesg at taglim.com> August 2002
+dmaf-caster     3574/udp    # DMAF Caster
+dmaf-server     3574/tcp    # DMAF Server
+#                          Ramakrishna Nadendla <rama_nadendla at agilent.com> August 2002
+ccm-port        3575/udp    # Coalsere CCM Port
+ccm-port        3575/tcp    # Coalsere CCM Port
+cmc-port        3576/udp    # Coalsere CMC Port
+cmc-port        3576/tcp    # Coalsere CMC Port
+#                          Chris Hawkinson <chawkinson at coalsere.com> August 2002
+config-port     3577/udp    # Configuration Port
+config-port     3577/tcp    # Configuration Port
+data-port       3578/udp    # Data Port
+data-port       3578/tcp    # Data Port
+#                          Anupam Bharali <abharali at peribit.com> August 2002
+ttat3lb         3579/udp    # Tarantella Load Balancing
+ttat3lb         3579/tcp    # Tarantella Load Balancing
+#                          Jim Musgrave <jimm at tarantella.com> August 2002
+nati-svrloc     3580/udp    # NATI-ServiceLocator
+nati-svrloc     3580/tcp    # NATI-ServiceLocator
+#                          Jason Case <jason.case at ni.com> August 2002
+kfxaclicensing  3581/udp    # Ascent Capture Licensing
+kfxaclicensing  3581/tcp    # Ascent Capture Licensing
+#                          Brad Hamilton <brad_hamilton at kofax.com> August 2002
+press           3582/udp    # PEG PRESS Server
+press           3582/tcp    # PEG PRESS Server
+#                          Jim DeLisle <jdelisle at swellsoftware.com> August 2002
+canex-watch     3583/udp    # CANEX Watch System
+canex-watch     3583/tcp    # CANEX Watch System
+#                          Peter Kollath <peter.kollath at canex.sk> August 2002
+u-dbap          3584/udp    # U-DBase Access Protocol
+u-dbap          3584/tcp    # U-DBase Access Protocol
+#                          Bodo Rueskamp <br at clabsms.de> August 2002
+emprise-lls     3585/udp    # Emprise License Server
+emprise-lls     3585/tcp    # Emprise License Server
+emprise-lsc     3586/udp    # License Server Console
+emprise-lsc     3586/tcp    # License Server Console
+#                          James J. Diaz <JDiaz at EmpriseCorporation.com> August 2002
+p2pgroup        3587/udp    # Peer to Peer Grouping
+p2pgroup        3587/tcp    # Peer to Peer Grouping
+#                          Igor Kostic <igorko at microsoft.com> August 2002
+sentinel        3588/udp    # Sentinel Server
+sentinel        3588/tcp    # Sentinel Server
+#                          Ian Gordon <ian.s.gordon at btopenworld.com> August 2002
+isomair         3589/udp    # isomair
+isomair         3589/tcp    # isomair
+#                          Richard Fleming <richard at apoapsis.com> August 2002
+wv-csp-sms      3590/udp    # WV CSP SMS Binding
+wv-csp-sms      3590/tcp    # WV CSP SMS Binding
+#                          Matti Salmi <matti.salmi at nokia.com> August 2002
+gtrack-server   3591/udp    # LOCANIS G-TRACK Server
+gtrack-server   3591/tcp    # LOCANIS G-TRACK Server
+gtrack-ne       3592/udp    # LOCANIS G-TRACK NE Port
+gtrack-ne       3592/tcp    # LOCANIS G-TRACK NE Port
+#                          Juergen.Edelhaeuser <Juergen.Edelhaeuser at locanis.com> August 2002
+bpmd            3593/udp    # BP Model Debugger
+bpmd            3593/tcp    # BP Model Debugger
+#                          Keith Fligg <keith at projtech.com> September 2002
+mediaspace      3594/udp    # MediaSpace
+mediaspace      3594/tcp    # MediaSpace
+shareapp        3595/udp    # ShareApp
+shareapp        3595/tcp    # ShareApp
+#                          Jeff King <jking at wave3software.com> September 2002
+iw-mmogame      3596/udp    # Illusion Wireless MMOG
+iw-mmogame      3596/tcp    # Illusion Wireless MMOG
+#                          Jan Vrsinsky <jan.vrsinsky at illusionsoftworks.com> September 2002
+a14             3597/udp    # A14 (AN-to-SC/MM)
+a14             3597/tcp    # A14 (AN-to-SC/MM)
+a15             3598/udp    # A15 (AN-to-AN)
+a15             3598/tcp    # A15 (AN-to-AN)
+#                          David Ott <dott at qualcomm.com> September 2002
+quasar-server   3599/udp    # Quasar Accounting Server
+quasar-server   3599/tcp    # Quasar Accounting Server
+#                          Brad Pepers <brad at linuxcanada.com> September 2002
+trap-daemon     3600/udp    # text relay-answer
+trap-daemon     3600/tcp    # text relay-answer
+#                          John Willis <jwillis at arielusa.com> September 2002
+visinet-gui     3601/udp    # Visinet Gui
+visinet-gui     3601/tcp    # Visinet Gui
+#                          Jeff Douglass <ist at att.net> September 2002
+infiniswitchcl  3602/udp    # InfiniSwitch Mgr Client
+infiniswitchcl  3602/tcp    # InfiniSwitch Mgr Client
+#                          Lee VanTine <lvantine at infiniswitc.com> September 2002
+int-rcv-cntrl   3603/udp    # Integrated Rcvr Control
+int-rcv-cntrl   3603/tcp    # Integrated Rcvr Control
+#                          Dave Stone <dstone01 at harris.com> September 2002
+bmc-jmx-port    3604/udp    # BMC JMX Port
+bmc-jmx-port    3604/tcp    # BMC JMX Port
+#                          Mike Behne <Mike_Behne at bmc.com> September 2002
+comcam-io       3605/udp    # ComCam IO Port
+comcam-io       3605/tcp    # ComCam IO Port
+#                          Don Gilbreath <don at comcam.net> September 2002
+splitlock       3606/udp    # Splitlock Server
+splitlock       3606/tcp    # Splitlock Server
+#                          Andrew Tune <Andrew.Tune at splitlock.com> September 2002
+precise-i3      3607/udp    # Precise I3
+precise-i3      3607/tcp    # Precise I3
+#                          Tomer Shain <tshain at precise.com> September 2002
+trendchip-dcp   3608/udp    # Trendchip control protocol
+trendchip-dcp   3608/tcp    # Trendchip control protocol
+#                          Ming-Jen Chen <mjchen at trendchip.com.tw> September 2002
+cpdi-pidas-cm   3609/udp    # CPDI PIDAS Connection Mon
+cpdi-pidas-cm   3609/tcp    # CPDI PIDAS Connection Mon
+#                          Tony Splaver <tony at cpdi.com> September 2002
+echonet         3610/udp    # ECHONET
+echonet         3610/tcp    # ECHONET
+#                          Takeshi Saito <takeshi.saito at toshiba.co.jp> September 2002
+six-degrees     3611/udp    # Six Degrees Port
+six-degrees     3611/tcp    # Six Degrees Port
+#                          Dan Hansen <dhansen at dimensional.com> September 2002
+hp-dataprotect  3612/udp    # HP Data Protector
+hp-dataprotect  3612/tcp    # HP Data Protector
+#                          Stephen Gold <stephen_gold at hp.com> September 2002
+alaris-disc     3613/udp    # Alaris Device Discovery
+alaris-disc     3613/tcp    # Alaris Device Discovery
+#                          Chris McAllen <cmcallen at alarismed.com> October 2002
+sigma-port      3614/udp    # Invensys Sigma Port
+sigma-port      3614/tcp    # Invensys Sigma Port
+#                          Dr. Sajed Husein <sajed.husein at invensys.com> October 2002
+start-network   3615/udp    # Start Messaging Network
+start-network   3615/tcp    # Start Messaging Network
+#                          Peter Rocca <rocca at multiboard.com> October 2002
+cd3o-protocol   3616/udp    # cd3o Control Protocol
+cd3o-protocol   3616/tcp    # cd3o Control Protocol
+#                          Chris Wilcox <cwilcox at cd3o.com> October 2002
+sharp-server    3617/udp    # ATI SHARP Logic Engine  
+sharp-server    3617/tcp    # ATI SHARP Logic Engine
+#                          Bill Reveile <Bill at allentek.com>
+aairnet-1       3618/udp    # AAIR-Network 1
+aairnet-1       3618/tcp    # AAIR-Network 1
+aairnet-2       3619/udp    # AAIR-Network 2
+aairnet-2       3619/tcp    # AAIR-Network 2 
+#                          James Mealey <jymealey at yahoo.com> October 2002
+ep-pcp          3620/udp    # EPSON Projector Control Port
+ep-pcp          3620/tcp    # EPSON Projector Control Port
+ep-nsp          3621/udp    # EPSON Network Screen Port
+ep-nsp          3621/tcp    # EPSON Network Screen Port
+#                          SEIKO EPSON <Sato.Minoru3 at exc.epson.co.jp> October 2002
+ff-lr-port      3622/udp    # FF LAN Redundancy Port
+ff-lr-port      3622/tcp    # FF LAN Redundancy Port
+#                          Fieldbus Foundation <dave.glanzer at fieldbus.org> October 2002
+haipe-discover  3623/udp    # HAIPIS Dynamic Discovery
+haipe-discover  3623/tcp    # HAIPIS Dynamic Discovery
+#                          Mike Irani <irani_mike at bah.com> October 2002
+dist-upgrade    3624/udp    # Distributed Upgrade Port
+dist-upgrade    3624/tcp    # Distributed Upgrade Port
+#                          Jason Schoon <jason.schoon at intermec.com> October 2002
+volley          3625/udp    # Volley
+volley          3625/tcp    # Volley
+#                          David Catmull <uncommon at uncommonplace.com> October 2002
+bvcdaemon-port  3626/udp    # bvControl Daemon
+bvcdaemon-port  3626/tcp    # bvControl Daemon
+#                          Ravi Gokhale <rgokhale at bindview.com> October 2002
+jamserverport   3627/udp    # Jam Server Port
+jamserverport   3627/tcp    # Jam Server Port
+#                          Art Pope <apope at sarnoff.com> October 2002
+ept-machine     3628/udp    # EPT Machine Interface
+ept-machine     3628/tcp    # EPT Machine Interface
+#                          Victor H. Farrace <vfarrace at eaglept.com> October 2002
+escvpnet        3629/udp    # ESC/VP.net
+escvpnet        3629/tcp    # ESC/VP.net
+#                          Hiroyuki Hashimoto <easymp at exc.epson.co.jp> October 2002
+cs-remote-db    3630/udp    # C&S Remote Database Port
+cs-remote-db    3630/tcp    # C&S Remote Database Port
+cs-services     3631/udp    # C&S Web Services Port
+cs-services     3631/tcp    # C&S Web Services Port
+#                          Computer Software GmbH <BrunoRistok at cs-ag.de> October 2002
+distcc          3632/udp    # distributed complier
+distcc          3632/tcp    # distributed compiler
+#                          Martin Pool <mbp at samba.org> November 2002
+wacp            3633/udp    # Wyrnix AIS port
+wacp            3633/tcp    # Wyrnix AIS port
+#                          Harry T. Vennik <htvennik at zonnet.nl> November 2002
+hlibmgr         3634/udp    # hNTSP Library Manager 
+hlibmgr         3634/tcp    # hNTSP Library Manager
+#                          Kenji Tetsuyama <kenji at onkyo.co.jp> November 2002
+sdo             3635/udp    # Simple Distributed Objects
+sdo             3635/tcp    # Simple Distributed Objects
+#                          Alexander Philippou <alex at noemax.com> November 2002
+opscenter       3636/udp    # OpsCenter
+opscenter       3636/tcp    # OpsCenter
+#                          Ralph Campbell <ralph.campbell at xasystems.com> November 2002
+scservp         3637/udp    # Customer Service Port
+scservp         3637/tcp    # Customer Service Port
+#                          Jonathan A. Zdziarski <johathan at networkdweebs.com> November 2002
+ehp-backup      3638/udp    # EHP Backup Protocol
+ehp-backup      3638/tcp    # EHP Backup Protocol
+#                          Ed Fair <ed_fair at yahoo.com> November 2002
+xap-ha          3639/udp    # Extensible Automation 
+xap-ha          3639/tcp    # Extensible Automation 
+#                          Mark Harrison <Mark at xapautomation.org> November 2002
+netplay-port1   3640/udp    # Netplay Port 1
+netplay-port1   3640/tcp    # Netplay Port 1
+netplay-port2   3641/udp    # Netplay Port 2
+netplay-port2   3641/tcp    # Netplay Port 2
+#                          Predrag Filipovic <pfilipovic at digital5.com> November 2002
+juxml-port      3642/udp    # Juxml Replication port
+juxml-port      3642/tcp    # Juxml Replication port
+#                          Colin Reid <creid at projux.com> November 2002
+audiojuggler    3643/udp    # AudioJuggler
+audiojuggler    3643/tcp    # AudioJuggler
+#                          Morten Mertner <mm at audiojuggler.com> November 2002
+ssowatch        3644/udp    # ssowatch
+ssowatch        3644/tcp    # ssowatch
+#                          Stephane Vinsot <vinsot at enatel.com> November 2002
+cyc             3645/udp    # Cyc 
+cyc             3645/tcp    # Cyc
+#                          Stephen Reed <reed at cyc.com> January 2003            
+xss-srv-port    3646/udp    # XSS Server Port
+xss-srv-port    3646/tcp    # XSS Server Port
+#                          Joe Purcell <jpurcell at ensuretech.com> January 2003
+splitlock-gw    3647/udp    # Splitlock Gateway
+splitlock-gw    3647/tcp    # Splitlock Gateway
+#                          Andrew Tune <Andrew.Tune at splitlock.com> January 2003
+fjcp            3648/udp    # Fujitsu Cooperation Port
+fjcp            3648/tcp    # Fujitsu Cooperation Port
+#                          Kouji Sugisawa <sugisawa.kouji at soft.fujitsu.com> January 2003
+nmmp            3649/udp    # Nishioka Miyuki Msg Protocol
+nmmp            3649/tcp    # Nishioka Miyuki Msg Protocol
+#                          TAKEDA Hiroyuki <takeda at atashi.net> January 2003
+prismiq-plugin  3650/udp    # PRISMIQ VOD plug-in
+prismiq-plugin  3650/tcp    # PRISMIQ VOD plug-in
+#                          Richard Hodges <rhodges at prismiq.com> January 2003
+xrpc-registry   3651/udp    # XRPC Registry
+xrpc-registry   3651/tcp    # XRPC Registry
+#                          Slava Monich <Slava.Monich at nokia.com> January 2003
+vxcrnbuport     3652/udp    # VxCR NBU Default Port
+vxcrnbuport     3652/tcp    # VxCR NBU Default Port
+#                          Boris Star <boris.star at veritas.com> January 2003
+tsp             3653/udp    # Tunnel Setup Protocol
+tsp             3653/tcp    # Tunnel Setup Protocol
+#                          Marc Blanchet <Marc.Blanchet at viagenie.qc.ca> January 2003
+vaprtm          3654/udp    # VAP RealTime Messenger
+vaprtm          3654/tcp    # VAP RealTime Messenger
+#                          Boris Polevoy <vapcom at mail.ru> January 2003
+abatemgr        3655/udp    # ActiveBatch Exec Agent 
+abatemgr        3655/tcp    # ActiveBatch Exec Agent
+abatjss         3656/udp    # ActiveBatch Job Scheduler
+abatjss         3656/tcp    # ActiveBatch Job Scheduler
+#                          Ben Rosenberg <brosenberg at advsyscon.com> January 2003
+immedianet-bcn  3657/udp    # ImmediaNet Beacon
+immedianet-bcn  3657/tcp    # ImmediaNet Beacon
+#                          Bill Homan <bhoman at spanworks.com> January 2003
+ps-ams          3658/udp    # PlayStation AMS (Secure)
+ps-ams          3658/tcp    # PlayStation AMS (Secure)
+#                          Edgar Alan Tu <Edgar_Tu at playstation.sony.com> January 2003
+apple-sasl      3659/udp    # Apple SASL
+apple-sasl      3659/tcp    # Apple SASL
+#                          David M. O'Rourke <daveo at apple.com> January 2003
+can-nds-ssl     3660/udp    # Candle Directory Services using SSL
+can-nds-ssl     3660/tcp    # Candle Directory Services using SSL
+can-ferret-ssl  3661/udp    # Candle Directory Services using SSL
+can-ferret-ssl  3661/tcp    # Candle Directory Services using SSL
+#                          Nic Catrambone <Nic_Catrambond at candle.com> January 2003
+pserver         3662/udp    # pserver
+pserver         3662/tcp    # pserver
+#                          Patrick Furlong <pfurlong at darkknight.ca> January 2003
+dtp             3663/udp    # DIRECWAY Tunnel Protocol
+dtp             3663/tcp    # DIRECWAY Tunnel Protocol
+#                          Greg Gee <ggee at hns.com> January 2003
+ups-engine      3664/udp    # UPS Engine Port
+ups-engine      3664/tcp    # UPS Engine Port
+ent-engine      3665/udp    # Enterprise Engine Port
+ent-engine      3665/tcp    # Enterprise Engine Port
+#                          Mike Delgrosso <mdelgros at tripplite.com> January 2003
+eserver-pap     3666/udp    # IBM EServer PAP
+eserver-pap     3666/tcp    # IBM eServer PAP
+#                          Dave Gimpl <gimpl at us.ibm.com> January 2003
+infoexch        3667/udp    # IBM Information Exchange
+infoexch        3667/tcp    # IBM Information Exchange
+#                          Paul Ford-Hutchinson <paulfordh at uk.ibm.com> January 2003
+dell-rm-port    3668/udp    # Dell Remote Management
+dell-rm-port    3668/tcp    # Dell Remote Management
+#                          Bradley Bransom <bradley_bransom at dell.com> January 2003
+casanswmgmt     3669/udp    # CA SAN Switch Management
+casanswmgmt     3669/tcp    # CA SAN Switch Management
+#                          Emre Tunar <emre.tunar at ca.com> January 2003
+smile           3670/udp    # SMILE TCP/UDP Interface
+smile           3670/tcp    # SMILE TCP/UDP Interface
+#                          Andre Petras <A_Petras at web.de> January 2003
+efcp            3671/udp    # e Field Control (EIBnet)
+efcp            3671/tcp    # e Field Control (EIBnet)
+#                          Marc Goossens <mgoossens at eiba.com> January 2003
+lispworks-orb   3672/udp    # LispWorks ORB
+lispworks-orb   3672/tcp    # LispWorks ORB
+#                          Lisp Support <lisp-support at xanalys.com>
+mediavault-gui  3673/udp    # Openview Media Vault GUI
+mediavault-gui  3673/tcp    # Openview Media Vault GUI
+#                          Stephen Gold <stephen_gold at hp.com> January 2003
+wininstall-ipc  3674/udp    # WinINSTALL IPC Port
+wininstall-ipc  3674/tcp    # WinINSTALL IPC Port
+#                          Bill Somerville <Bill.Somerville at OnDemandSoftware.com> January 2003
+calltrax        3675/udp    # CallTrax Data Port
+calltrax        3675/tcp    # CallTrax Data Port
+#                          Oliver Bailey <oliver at time-lines.com> January 2003
+va-pacbase      3676/udp    # VisualAge Pacbase server
+va-pacbase      3676/tcp    # VisualAge Pacbase server
+#                          Dominique Lelievre <dominique.lelievre at fr.ibm.com> January 2003
+roverlog        3677/udp    # RoverLog IPC
+roverlog        3677/tcp    # RoverLog IPC
+#                          Tom Mayo <tmayo1 at rochester.rr.com> January 2003
+ipr-dglt        3678/udp    # DataGuardianLT
+ipr-dglt        3678/tcp    # DataGuardianLT
+#                          Bruce Carlson <bruce.carlson at iprintl.com> January 2003
+newton-dock     3679/udp    # Newton Dock
+newton-dock     3679/tcp    # Newton Dock
+npds-tracker    3680/udp    # NPDS Tracker
+npds-tracker    3680/tcp    # NPDS Tracker
+#                          Paul Guyot <pguyot at kallisys.net> January 2003
+bts-x73         3681/udp    # BTS X73 Port
+bts-x73         3681/tcp    # BTS X73 Port
+#                          Todd Cooper <todd at DO11073.com> January 2003
+cas-mapi        3682/udp    # EMC SmartPackets-MAPI
+cas-mapi        3682/tcp    # EMC SmartPackets-MAPI
+#                          Koen Schoofs <schoofs_koen at emc.com> January 2003
+bmc-ea          3683/udp    # BMC EDV/EA
+bmc-ea          3683/tcp    # BMC EDV/EA
+#                          Jeffrey Glanz <jeffrey_glanz at bmc.com> January 2003
+faxstfx-port    3684/udp    # FAXstfX
+faxstfx-port    3684/tcp    # FAXstfX
+#                          Alec Carlson <acarlson at smithmicro.com> January 2003
+dsx-agent       3685/udp    # DS Expert Agent
+dsx-agent       3685/tcp    # DS Expert Agent
+#                          NetPro Computing <ports at netpro.com> January 2003
+tnmpv2          3686/udp    # Trivial Network Management
+tnmpv2          3686/tcp    # Trivial Network Management
+#                          Andrea Premoli <Andrea_maria.Premoli at icn.siemens.it> January 2003
+simple-push     3687/udp    # simple-push
+simple-push     3687/tcp    # simple-push
+simple-push-s   3688/udp    # simple-push Secure
+simple-push-s   3688/tcp    # simple-push Secure
+#                          C. Enrique Ortiz <eortiz at j2medeveloper.com> January 2003
+daap            3689/udp    # Digital Audio Access Protocol
+daap            3689/tcp    # Digital Audio Access Protocol
+#                          Amandeep Jawa <daap at apple.com> January 2003
+svn             3690/udp    # Subversion
+svn             3690/tcp    # Subversion
+#                          Greg Hudson <ghudson at mit.edu> January 2003
+magaya-network  3691/udp    # Magaya Network Port
+magaya-network  3691/tcp    # Magaya Network Port
+#                          Jesus David Rodriguez <jesusdavid at magaya.com> February 2003
+intelsync       3692/udp    # Brimstone IntelSync
+intelsync       3692/tcp    # Brimstone IntelSync
+#                          Davey Taylor <davey.taylor at brimstone.net> February 2003
+gttp            3693/udp    # GTTP
+gttp            3693/tcp    # GTTP
+vpncpp          3694/udp    # VPN Cookie Prop Protocol
+vpncpp          3694/tcp    # VPN Cookie Prop Protocol
+#                          Rondald P. Bonica <Ronald.P.Bonica at wcom.com> February 2003
+bmc-data-coll   3695/udp    # BMC Data Collection
+bmc-data-coll   3695/tcp    # BMC Data Collection
+#                          Randall De Weerd <rdeweerd at bmc.com> February 2003
+telnetcpcd      3696/udp    # Telnet Com Port Control
+telnetcpcd      3696/tcp    # Telnet Com Port Control
+#                          Thomas J. Pinkl <tom at hbsrx.com> February 2003
+nw-license      3697/udp    # NavisWorks Licnese System
+nw-license      3697/tcp    # NavisWorks License System
+#                          Tim Wiegand <tim.wiegand at navisworks.com> February 2003
+sagectlpanel    3698/udp    # SAGECTLPANEL
+sagectlpanel    3698/tcp    # SAGECTLPANEL
+#                          Mark Gamble <mark.gamble at sage.com> February 2003
+kpn-icw         3699/udp    # Internet Call Waiting
+kpn-icw         3699/tcp    # Internet Call Waiting
+#                          B.J. Kortekaas <b.j.kortekaas at kpn.com> February 2003
+lrs-paging      3700/udp    # LRS NetPage
+lrs-paging      3700/tcp    # LRS NetPage
+#                          Geoffrey Wossum <geoffrey at pager.net> February 2003
+netcelera       3701/udp    # NetCelera 
+netcelera       3701/tcp    # NetCelera
+#                          Tarek Nabhan <standards at itworx.com> February 2003
+upnp-discovery  3702/udp    # UPNP v2 Discovery
+upnp-discovery  3702/tcp    # UPNP v2 Discovery
+#                          Christian Huitema <huitema at microsoft.com> February 2003
+adobeserver-3   3703/udp    # Adobe Server 3
+adobeserver-3   3703/tcp    # Adobe Server 3
+adobeserver-4   3704/udp    # Adobe Server 4
+adobeserver-4   3704/tcp    # Adobe Server 4
+adobeserver-5   3705/udp    # Adobe Server 5
+adobeserver-5   3705/tcp    # Adobe Server 5
+#                          Frank Soetebeer <frsoeteb at adobe.com> January 2003
+rt-event        3706/udp    # Real-Time Event Port
+rt-event        3706/tcp    # Real-Time Event Port
+rt-event-s      3707/udp    # Real-Time Event Secure Port
+rt-event-s      3707/tcp    # Real-Time Event Secure Port
+#                          Terry Gin <terry_gin at inter-tel.com> February 2003
+#               3708       Unassigned
+ca-idms         3709/udp    # CA-IDMS Server
+ca-idms         3709/tcp    # CA-IDMS Server
+#                          Dave Ross <david.ross at ca.com> 
+portgate-auth   3710/udp    # PortGate Authentication
+portgate-auth   3710/tcp    # PortGate Authentication
+#                          Scott Harris <Scott at XRamp.com> February 2003
+edb-server2     3711/udp    # EBD Server 2
+edb-server2     3711/tcp    # EBD Server 2
+#                          Carlos Portela <cportela at simple-sw.com> February 2003
+sentinel-ent    3712/udp    # Sentinel Enterprise
+sentinel-ent    3712/tcp    # Sentinel Enterprise
+#                          Ian Gordon <ian at n-genltd.co.uk> March 2003
+tftps           3713/udp    # TFTP over TLS
+tftps           3713/tcp    # TFTP over TLS
+#                          Mark mayernick <Mark.Mayernick at thomson.net> March 2003
+delos-dms       3714/udp    # DELOS Direct Messaging
+delos-dms       3714/tcp    # DELOS Direct Messaging
+#                          Ekkehard Morgenstern <flnca at gmx.de> March 2003
+anoto-rendezv   3715/udp    # Anoto Rendezvous Port
+anoto-rendezv   3715/tcp    # Anoto Rendezvous Port
+#                          Ola Sandstrom <ola.sandstrom at anoto.com> March 2003
+wv-csp-sms-cir  3716/udp    # WV CSP SMS CIR Channel
+wv-csp-sms-cir  3716/tcp    # WV CSP SMS CIR Channel
+wv-csp-udp-cir  3717/udp    # WV CSP UDP/IP CIR Channel
+wv-csp-udp-cir  3717/tcp    # WV CSP UDP/IP CIR Channel
+#                          Jon Ingi Ingimundarson <jii at oz.com> March 2003
+opus-services   3718/udp    # OPUS Server Port
+opus-services   3718/tcp    # OPUS Server Port
+#                          Detlef Stoever <mail at ivotec.com> March 2003
+itelserverport  3719/udp    # iTel Server Port
+itelserverport  3719/tcp    # iTel Server Port
+#                          Mark Hendricks <markah at copper.net> March 2003
+ufastro-instr   3720/udp    # UF Astro. Instr. Services
+ufastro-instr   3720/tcp    # UF Astro. Instr. Services
+#                          David B. Hon <hon at astro.ufl.edu> March 2003
+xsync           3721/udp    # Xsync
+xsync           3721/tcp    # Xsync
+xserveraid      3722/udp    # Xserver RAID
+xserveraid      3722/tcp    # Xserver RAID
+#                          Bob Bradley <bradley at apple.com> March 2003
+sychrond        3723/udp    # Sychron Service Daemon
+sychrond        3723/tcp    # Sychron Service Daemon
+#                          Robert Marinelli <bob at sychron.com> March 2003
+battlenet       3724/udp    # Blizzard Battlenet
+battlenet       3724/tcp    # Blizzard Battlenet
+#                          Adrian Luff <aluff at blizzard.com> March 2003
+na-er-tip       3725/udp    # Netia NA-ER Port
+na-er-tip       3725/tcp    # Netia NA-ER Port
+#                          Jean-Pierre Garcia <jp.garcia at netia.net> April 2003
+array-manager   3726/udp    # Xyartex Array Manager
+array-manager   3726/tcp    # Xyratex Array Manager
+#                          David A. Lethe <david_lethe at us.xyratex.com> April 2003
+e-mdu           3727/udp    # Ericsson Mobile Data Unit
+e-mdu           3727/tcp    # Ericsson Mobile Data Unit
+e-woa           3728/udp    # Ericsson Web on Air
+e-woa           3728/tcp    # Ericsson Web on Air
+#                          Marco Casole <marco.casole at ebc.ericsson.se> April 2003
+fksp-audit      3729/udp    # Fireking Audit Port
+fksp-audit      3729/tcp    # Fireking Audit Port
+#                          Richard Thurman <richt at fireking.com> April 2003
+client-ctrl     3730/udp    # Client Control
+client-ctrl     3730/tcp    # Client Control
+#                          Lawrence W. Dunn <larrydunn at aptcomp.com> April 2003
+smap            3731/udp    # Service Manager
+smap            3731/tcp    # Service Manager
+m-wnn           3732/udp    # Mobile Wnn
+m-wnn           3732/tcp    # Mobile Wnn
+#                          Yasunari Yamashita <yamasita at omronsoft.co.jp> April 2003
+multip-msg      3733/udp    # Multipuesto Msg Port
+multip-msg      3733/tcp    # Multipuesto Msg Port
+#                          Felisa Ares <faa06 at tid.es> April 2003
+synel-data      3734/udp    # Synel Data Collection Port
+synel-data      3734/tcp    # Synel Data Collection Port
+#                          David Ashkenazi <david at synel.co.il> April 2003
+pwdis           3735/udp    # Password Distribution
+pwdis           3735/tcp    # Password Distribution
+#                          Robert Erl <roerl at web.de> April 2003
+rs-rmi          3736/udp    # RealSpace RMI
+rs-rmi          3736/tcp    # RealSpace RMI
+#                          Barry McDarby <realspace at starwolf.biz> April 2003
+#               3737       Unassigned (Removed 2003-02-26)
+versatalk       3738/udp    # versaTalk Server Port
+versatalk       3738/tcp    # versaTalk Server Port
+#                          Dr. Kingsley C. Nwosu <knwosu at aglowmail.com> April 2003
+launchbird-lm   3739/udp    # Launchbird LicenseManager
+launchbird-lm   3739/tcp    # Launchbird LicenseManager
+#                          Tom Hawkins <tom1 at launchbird.com> April 2003
+heartbeat       3740/udp    # Heartbeat Protocol
+heartbeat       3740/tcp    # Heartbeat Protocol
+#                          Jeroen Massar <jeroen at unfix.org> April 2003
+wysdma          3741/udp    # WysDM Agent
+wysdma          3741/tcp    # WysDM Agent
+#                          Jim McDonald <Jim.McDonald at sysdm.com> April 2003
+cst-port        3742/udp    # CST - Configuration & Service Tracker
+cst-port        3742/tcp    # CST - Configuration & Service Tracker
+#                          Hai Ou-Yang <hai.ou-yang at sun.com> April 2003
+ipcs-command    3743/udp    # IP Control Systems Ltd.
+ipcs-command    3743/tcp    # IP Control Systems Ltd.
+#                          Paul Anderson <paul.anderson at ip-cs.com> April 2003
+sasg            3744/udp    # SASG
+sasg            3744/tcp    # SASG
+#                          Cristian Petculescu <cristp at hotmail.com> April 2003
+gw-call-port    3745/udp    # GWRTC Call Port
+gw-call-port    3745/tcp    # GWRTC Call Port
+#                          Felisa Ares <faa06 at tid.es> April 2003
+linktest        3746/udp    # LXPRO.COM LinkTest
+linktest        3746/tcp    # LXPRO.COM LinkTest
+linktest-s      3747/udp    # LXPRO.COM LinkTest SSL
+linktest-s      3747/tcp    # LXPRO.COM LinkTest SSL
+#                          Greg Bailey <gbailey at lxpro.com> April 2003
+webdata         3748/udp    # webData
+webdata         3748/tcp    # webData
+#                          Michael Whiteley <michael at whiteley.com> April 2003
+cimtrak         3749/udp    # CimTrak
+cimtrak         3749/tcp    # CimTrak
+cbos-ip-port    3750/udp    # CBOS/IP ncapsalatoin port
+cbos-ip-port    3750/tcp    # CBOS/IP ncapsalation port
+#                          Thomas Dannemiller <tom.dannemiller at rolls-royce.com> April 2003
+gprs-cube       3751/udp    # CommLinx GPRS Cube
+gprs-cube       3751/tcp    # CommLinx GPRS Cube
+#                          Peter Johnson <peter at commlinx.com.au> April 2003
+vipremoteagent  3752/udp    # Vigil-IP RemoteAgent
+vipremoteagent  3752/tcp    # Vigil-IP RemoteAgent
+#                          Bryan Alvord <bryan at vaticor.com> April 2003
+nattyserver     3753/udp    # NattyServer Port
+nattyserver     3753/tcp    # NattyServer Port
+#                          Akira Saito <admin at kobu.com> April 2003
+timestenbroker  3754/udp    # TimesTen Broker Port
+timestenbroker  3754/tcp    # TimesTen Broker Port 
+#                          David Aspinwall <aspinwall at TimesTen.com> April 2003
+sas-remote-hlp  3755/udp    # SAS Remote Help Server
+sas-remote-hlp  3755/tcp    # SAS Remote Help Server
+#                          Gary T. Ciampa <Gary.Ciampa at sas.com> April 2003
+canon-capt      3756/udp    # Canon CAPT Port
+canon-capt      3756/tcp    # Canon CAPT Port
+#                          Takashi Okazawa <okazawa.takashi at canon.co.jp> April 2003
+grf-port        3757/udp    # GRF Server Port
+grf-port        3757/tcp    # GRF Server Port
+#                          Robert Banfill <robert at banfill.net> April 2003
+apw-registry    3758/udp    # apw RMI registry
+apw-registry    3758/tcp    # apw RMI registry
+#                          Dan Davis <Dan.A.Davis at hp.com> April 2003
+exapt-lmgr      3759/udp    # Exapt License Manager
+exapt-lmgr      3759/tcp    # Exapt License Manager
+#                          Christoph Kukulies <info at exapt.de> April 2003
+adtempusclient  3760/udp    # adTEmpus Client
+adtempusclient  3760/tcp    # adTempus Client
+#                          Bill Wingate <bill.wingate at arcanadev.com> May 2003 
+gsakmp          3761/udp    # gsakmp port
+gsakmp          3761/tcp    # gsakmp port
+#                          Uri Meth <umeth at sparta.com> June 2003
+gbs-smp         3762/udp    # GBS SnapMail Protocol
+gbs-smp         3762/tcp    # GBS SnapMail Protocol
+#                          Eric Harris-Braun <eric at glassbead.com> June 2003
+xo-wave         3763/udp    # XO Wave Control Port
+xo-wave         3763/tcp    # XO Wave Control Port
+#                          Bjorn Dittmer-Roche <bjorn at xowave.com> June 2003
+mni-prot-rout   3764/udp    # MNI Protected Routing
+mni-prot-rout   3764/tcp    # MNI Protected Routing
+#                          Tim Behne <timothyb at microwavenetworks.com> June 2003
+rtraceroute     3765/udp    # Remote Traceroute
+rtraceroute     3765/tcp    # Remote Traceroute
+#                          A. Blake Cooper <blake at cluebie.net> June 2003
+listmgr-port    3767/udp    # ListMGR Port
+listmgr-port    3767/tcp    # ListMGR Port
+#                          Takashi Kubota <kubota.takashi at pfu.fugitsu.com> June 2003
+rblcheckd       3768/udp    # rblcheckd server daemon
+rblcheckd       3768/tcp    # rblcheckd server daemon
+#                          Sabri Berisha <sabri at cluecentral.net> June 2003
+haipe-otnk      3769/udp    # HAIPE Network Keying
+haipe-otnk      3769/tcp    # HAIPE Network Keying
+#                          Mike Irani <irani at spawar.navy.mil> June 2003
+cindycollab     3770/udp    # Cinderella Collaboration
+cindycollab     3770/tcp    # Cinderella Collaboration
+#                          Ulrich Kortenkamp  <kortenkamp at cinderella.de> June 2003
+paging-port     3771/udp    # RTP Paging Port
+paging-port     3771/tdp    # RTP Paging Port
+#                          Patrick Ferriter <Patrick.Ferriter at zultys.com> June 2003
+ctp             3772/udp    # Chantry Tunnel Protocol
+ctp             3772/tcp    # Chantry Tunnel Protocol
+#                          Inderpreet Singh <isingh at chantrynetworks.com> June 2003
+ctdhercules     3773/udp    # ctdhercules
+ctdhercules     3773/tcp    # ctdhercules
+#                          Carl Banzhof <cbanzhof at citadel.com> June 2003
+zicom           3774/udp    # ZICOM
+zicom           3774/tcp    # ZICOM
+#                          Sabu Das <sabud at zicomsecure.com> June 2003
+ispmmgr         3775/udp    # ISPM Manager Port
+ispmmgr         3775/tcp    # ISPM Manager Port
+#                          Eric Anderson <eanderson at netvision.com> June 2003
+#               3776       Unassigned
+jibe-eb         3777/udp    # Jibe EdgeBurst
+jibe-eb         3777/tcp    # Jibe EdgeBurst
+#                          Chap Tippin <chad.tippin at jibeinc.com> June 2003						   
+c-h-it-port     3778/udp    # Cutler-Hammer IT Port
+c-h-it-port     3778/tcp    # Cutler-Hammer IT Port
+#                          Thomas Ruchti <thomasmruchti at eaton.com> June 2003
+cognima         3779/udp    # Cognima Replication
+cognima         3779/tcp    # Cognima Replication
+#                          Raplh Grenwell <ralph.greenwell at cognima.com> June 2003
+nnp             3780/udp    # Nuzzler Network Protocol
+nnp             3780/tcp    # Nuzzler Network Protocol
+#                          Andreas Schwarz <andreas.schwarz at securepoint.de> June 2003
+abcvoice-port   3781/udp    # ABCvoice server port
+abcvoice-port   3781/tcp    # ABCvoice server port
+#                          Carlos Gonzalez-Roman Ferrer <iana at abcdatos.com> June 2003
+iso-tp0s        3782/udp    # Secure ISO TP0 port
+iso-tp0s        3782/tcp    # Secure ISO TP0 port
+#                          Herbert Falk <herb at sisconet.com> June 2003
+#               3783-3799  Unassigned
+pwgpsi          3800/udp    # Print Services Interface
+pwgpsi          3800/tcp    # Print Services Interface
+#                          Harry Lewis <harryl at us.ibm.com> May 2003  
+#               3801       Unassigned
+vhd             3802/udp    # VHD
+vhd             3802/tcp    # VHD
+#                          Chris Duncombe <cdunc at intoo.com>    
+#               3803-3844  Unassigned      
+v-one-spp       3845/udp    # V-ONE Single Port Proxy
+v-one-spp       3845/tcp    # V-ONE Single Port Proxy
+#                          Daniel Becker <dbecker at v-one.com> 
+#               3846-3860  Unassigned
+winshadow-hd    3861/udp    # winShadow Host Discovery
+winshadow-hd    3861/tcp    # winShadow Host Discovery
+#                          Shu-Wei Tan <stan at omnicomtech.com> March 2003
+giga-pocket     3862/udp    # GIGA-POCKET
+giga-pocket     3862/tcp    # GIGA-POCKET
+#                          Yoshikazu Watanabe <nabe at sm.sony.co.jp>
+#               3863-3874  Unassigned
+pnbscada        3875/udp    # PNBSCADA
+pnbscada        3875/tcp    # PNBSCADA
+#                          Philip N. Bergstresser <phil at bergstresser.org> 
+#               3876-3884  Unassigned
+topflow-ssl     3885/udp    # TopFlow SSL
+topflow-ssl     3885/tcp    # TopFlow SSL
+#                          Ken Nelson <nelson at TopLayer.com>
+#               3886-3899  Unassigned
+udt_os          3900/udp    # Unidata UDT OS
+udt_os          3900/tcp    # Unidata UDT OS
+#                          James Powell <james at mailhost.unidata.com>
+#               3901-3938  Unassigned
+aamp            3939/udp    # Anti-virus Application Management Port
+aamp            3939/tcp    # Anti-virus Application Management Port
+#                          In-sik Choi <iscard at virusdesk.com> February 2002
+#               3940-3983  Unassigned     
+mapper-nodemgr  3984/udp    # MAPPER network node manager
+mapper-nodemgr  3984/tcp    # MAPPER network node manager
+mapper-mapethd  3985/udp    # MAPPER TCP/IP server
+mapper-mapethd  3985/tcp    # MAPPER TCP/IP server
+mapper-ws_ethd  3986/udp    # MAPPER workstation server
+mapper-ws_ethd  3986/tcp    # MAPPER workstation server
+#                          John C. Horton <jch at unirsvl.rsvl.unisys.com>
+centerline	3987/udp    # Centerline
+centerline	3987/tcp    # Centerline
+#			   Mark Simpson <simpson at centerline.com>
+#		3988-3999  Unassigned
+terabase	4000/udp    # Terabase
+terabase	4000/tcp    # Terabase
+#			   Thor Olson <Thor at terabase.com>   
+####### Potential Conflict of ports ################################
+####### PORT 4000 also used by ICQ <www.icq.com> ################### 
+newoak		4001/udp    # NewOak
+newoak		4001/tcp    # NewOak
+#			   Jim Philippou <jphilippou at newoak.com>
+pxc-spvr-ft	4002/udp    # pxc-spvr-ft
+pxc-spvr-ft	4002/tcp    # pxc-spvr-ft
+pxc-splr-ft	4003/udp    # pxc-splr-ft
+pxc-splr-ft	4003/tcp    # pxc-splr-ft
+pxc-roid	4004/udp    # pxc-roid
+pxc-roid	4004/tcp    # pxc-roid
+pxc-pin		4005/udp    # pxc-pin
+pxc-pin		4005/tcp    # pxc-pin
+pxc-spvr	4006/udp    # pxc-spvr
+pxc-spvr	4006/tcp    # pxc-spvr
+pxc-splr	4007/udp    # pxc-splr
+pxc-splr	4007/tcp    # pxc-splr
+#			   Dave Nesbitt <nesbitt at cp10.es.xerox.com>
+netcheque       4008/udp    # NetCheque accounting 
+netcheque       4008/tcp    # NetCheque accounting 
+#                          B. Clifford Neuman <bcn at isi.edu>
+chimera-hwm	4009/udp    # Chimera HWM
+chimera-hwm     4009/tcp    # Chimera HWM
+#			   Ken Anderson <kanderso at kleber.ICS.UCI.EDU>
+samsung-unidex	4010/udp    # Samsung Unidex
+samsung-unidex  4010/tcp    # Samsung Unidex
+#			   Konstantin V. Vyaznikov <kv at ssm6000.samsung.ru>
+altserviceboot	4011/udp    # Alternate Service Boot
+altserviceboot	4011/tcp    # Alternate Service Boot
+#			   Eric Dittert <Eric_Dittert at ccm.jf.intel.com>
+pda-gate	4012/udp    # PDA Gate
+pda-gate	4012/tcp    # PDA Gate
+#			   Masakuni Okada <masakuni at jp.ibm.com>
+acl-manager	4013/udp    # ACL Manager
+acl-manager	4013/tcp    # ACL Manager
+#			   Toru Murai <murai at saint.nm.fujitsu.co.jp>
+taiclock	4014/udp    # TAICLOCK
+taiclock	4014/tcp    # TAICLOCK
+#			   Dan Bernstein <djb at koobera.math.uic.edu>
+talarian-mcast1	4015/udp    # Talarian Mcast
+talarian-mcast1	4015/tcp    # Talarian Mcast
+talarian-mcast2	4016/udp    # Talarian Mcast
+talarian-mcast2	4016/tcp    # Talarian Mcast
+talarian-mcast3	4017/udp    # Talarian Mcast
+talarian-mcast3	4017/tcp    # Talarian Mcast
+talarian-mcast4	4018/udp    # Talarian Mcast
+talarian-mcast4	4018/tcp    # Talarian Mcast
+talarian-mcast5	4019/udp    # Talarian Mcast
+talarian-mcast5	4019/tcp    # Talarian Mcast
+#			   Geoff Mendal <mendal at talarian.com>
+trap            4020/udp    # TRAP Port
+trap            4020/tcp    # TRAP Port
+#                          Jeffrey C. Byrd <admin at vspacegroup.com>
+nexus-portal    4021/udp    # Nexus Portal
+nexus-portal    4021/tcp    # Nexus Portal
+#                          Damian Tarnawsky <support at nexusconcepts.com>
+dnox            4022/udp    # DNOX
+dnox            4022/tcp    # DNOX
+#                          Leo Rathnayake <leo at perlnet.com>
+esnm-zoning     4023/udp    # ESNM Zoning Port
+esnm-zoning     4023/tcp    # ESNM Zoning Port
+#                          Yong Cai <ycai at emc.com>
+tnp1-port       4024/udp    # TNP1 User Port
+tnp1-port       4024/tcp    # TNP1 User Port
+#                          Tony Gibbs <tony.gibbs at europe.simoco.com>
+partimage       4025/udp    # Partition Image Port
+partimage       4025/tcp    # Partition Image Port
+#                          Franck Ladurelle <ladurelf at partimage.org>
+as-debug        4026/udp    # Graphical Debug Server
+as-debug        4026/tcp    # Graphical Debug Server
+#                          Steve Halverson <shalver at us.ibm.com>
+bxp             4027/udp    # bitxpress
+bxp             4027/tcp    # bitxpress
+#                          Morgan Doyle <morgan at mpt.ie>
+dtserver-port   4028/udp    # DTServer Port
+dtserver-port   4028/tcp    # DTServer Port
+#                          Stephen Aikins <stephen.aikins at embarcadero.com>
+ip-qsig         4029/udp    # IP Q signaling protocol
+ip-qsig         4029/tcp    # IP Q signaling protocol
+#                          Toru Tachibana <tatibana at exs.ts.fujitsu.co.jp>
+jdmn-port       4030/udp    # Accell/JSP Daemon Port
+jdmn-port       4030/tcp    # Accell/JSP Daemon Port
+#                          Art Grand <aig at unify.com>
+suucp           4031/udp    # UUCP over SSL
+suucp           4031/tcp    # UUCP over SSL
+#                          Harald Welte <laforge at gnumonks.org>
+vrts-auth-port  4032/udp    # VERITAS Authorization Service
+vrts-auth-port  4032/tcp    # VERITAS Authorization Service
+#                          Stefan Winkel <stefan at veritas.com>
+sanavigator     4033/udp    # SANavigator Peer Port
+sanavigator     4033/tcp    # SANavigator Peer Port
+#                          Robert J. Chansler <rchansler at SANavigator.com>
+ubxd            4034/udp    # Ubiquinox Daemon
+ubxd            4034/tcp    # Ubiquinox Daemon 
+#                          Kit Smithers <ksmithers at argogroup.com>
+wap-push-http   4035/udp    # WAP Push OTA-HTTP port
+wap-push-http   4035/tcp    # WAP Push OTA-HTTP port
+wap-push-https  4036/udp    # WAP Push OTA-HTTP secure
+wap-push-https  4036/tcp    # WAP Push OTA-HTTP secure
+#                          Matthieu Lachance 
+#                          <matthieu.lachance at openwave.com>
+#               4037-4039  Unassigned
+yo-main         4040/udp    # Yo.net main service
+yo-main         4040/tcp    # Yo.net main service
+#                          John Tintor <jt at yo.net>
+houston         4041/udp    # Rocketeer-Houston
+houston         4041/tcp    # Rocketeer-Houston
+#                          Johnny C. Norris II <jnorris at uiuc.edu>
+ldxp            4042/udp    # LDXP
+ldxp            4042/tcp    # LDXP
+#                          Craig Calef <craig at katmango.com>    
+#		4043-4095  Unassigned
+bre 		4096/udp    # BRE (Bridge Relay Element)
+bre 		4096/tcp    # BRE (Bridge Relay Element)
+#			   Stephen Egbert <egbert at ra.timeplex.com>
+patrolview	4097/udp    # Patrol View
+patrolview	4097/tcp    # Patrol View
+#			   Vincent Chin <vincent_chin at bmc.com>
+drmsfsd		4098/udp    # drmsfsd
+drmsfsd		4098/tcp    # drmsfsd
+#			   Masao Iwai <iwai at kel.fujitsu.co.jp>
+dpcp		4099/udp    # DPCP
+dpcp		4099/tcp    # DPCP
+#			   John Croft <john.croft at calista.demon.co.uk>
+igo-incognito   4100/udp    # IGo Incognito Data Port
+igo-incognito   4100/tcp    # IGo Incognito Data Port
+#                          Paul Reddy <support at igo-incognito.com> February 2002
+#               4101-4110  Unassigned
+xgrid          4111/tcp    # Xgrid
+xgrid          4111/udp    # Xgrid
+jomamqmonitor   4114/udp    # JomaMQMonitor
+jomamqmonitor   4114/tcp    # JomaMQMonitor
+#                          Marcel Hofstetter <marcel.hofstetter at jomasoft.ch> January 2003       
+#               4115-4131  Unassigned
+nuts_dem        4132/udp    # NUTS Daemon
+nuts_dem        4132/tcp    # NUTS Daemon
+nuts_bootp      4133/udp    # NUTS Bootp Server
+nuts_bootp      4133/tcp    # NUTS Bootp Server
+#                          Martin Freiss <freiss.pad at sni.>
+nifty-hmi       4134/udp    # NIFTY-Serve HMI protocol
+nifty-hmi       4134/tcp    # NIFTY-Serve HMI protocol
+#                          Ryuichi Suzuki <SCI00376 at niftyserve.or.jp>
+#               4135-4137  Unassigned
+nettest         4138/udp    # nettest
+nettest         4138/tcp    # nettest
+#                          David Borman <dab at windriver.com> March 2003
+#               4139-4140  Unassigned
+oirtgsvc        4141/udp    # Workflow Server
+oirtgsvc        4141/tcp    # Workflow Server
+oidocsvc        4142/udp    # Document Server
+oidocsvc        4142/tcp    # Document Server
+oidsr           4143/udp    # Document Replication
+oidsr           4143/tcp    # Document Replication
+#                          Norman Brie <norm_brie at sns.ca>
+##########  Compuserve (unoffically) is using port 4144 #########
+#               4144  Unassigned
+vvr-control     4145/udp   # VVR Control
+vvr-control     4145/tcp   # VVR Control
+#                         Ming Xu <ming at veritas.com>
+#               4146-4153  Unassigned
+atlinks         4154/udp    # atlinks device discovery
+atlinks         4154/tcp    # atlinks device discovery
+#                          Scott Griepentrog <griepentrogs at atlinks.com> October 2002
+#               4155-4159  Unassigned
+jini-discovery  4160/udp    # Jini Discovery
+jini-discovery  4160/tcp    # Jini Discovery
+#                          Mark Hodapp <mark.hodapp at sun.com>	
+#		4161-4198  Unassigned
+eims-admin      4199/udp    # EIMS ADMIN
+eims-admin      4199/tcp    # EIMS ADMIN
+#                          Glenn Anderson <glenn at qualcomm.co.nz> 
+#			   Mitra <mitra at earth.path.net>
+corelccam	4300/udp    # Corel CCam
+corelccam	4300/tcp    # Corel CCam
+#			   Jason Aiken <jasona at corelcomputer.com>
+#		4301-4320  Unassigned
+rwhois          4321/udp    # Remote Who Is
+rwhois          4321/tcp    # Remote Who Is
+#                          Mark Kosters  <markk at internic.net>
+unicall         4343/udp    # UNICALL
+unicall         4343/tcp    # UNICALL
+#                          James Powell <james at enghp.unidata.comp>
+vinainstall	4344/udp    # VinaInstall
+vinainstall 	4344/tcp    # VinaInstall
+#			   Jay Slupesky <js at vina-tech.com>
+m4-network-as   4345/udp    # Macro 4 Network AS
+m4-network-as	4345/tcp    # Macro 4 Network AS
+#			   Paul Wren <Paul.Wren at macro4.com>
+elanlm		4346/udp    # ELAN LM
+elanlm		4346/tcp    # ELAN LM
+#			   Paul Ballew <ballew at projtech.com>
+lansurveyor	4347/udp    # LAN Surveyor
+lansurveyor	4347/tcp    # LAN Surveyor
+#			   Michael Swan <swan at neon.com>
+itose		4348/udp    # ITOSE
+itose		4348/tcp    # ITOSE
+#			   Michael Haeuptle <Michael_Haeuptle at hp.com>
+fsportmap	4349/udp    # File System Port Map
+fsportmap	4349/tcp    # File System Port Map
+#			   Ron Minnich <rminnich at sarnoff.com>
+net-device	4350/udp    # Net Device
+net-device	4350/tcp    # Net Device
+#			   Glenn Peterson <glennp at microsoft.com>
+plcy-net-svcs	4351/udp    # PLCY Net Services
+plcy-net-svcs	4351/tcp    # PLCY Net Services
+#			   J.J. Ekstrom
+#		4352       Unassigned
+f5-iquery	4353/udp    # F5 iQuery 
+f5-iquery	4353/tcp    # F5 iQuery 
+#			   Tom Kee <t.kee at f5.com>
+qsnet-trans     4354/udp    # QSNet Transmitter
+qsnet-trans     4354/tcp    # QSNet Transmitter
+qsnet-workst    4355/udp    # QSNet Workstation
+qsnet-workst    4355/tcp    # QSNet Workstation
+qsnet-assist    4356/udp    # QSNet Assistant
+qsnet-assist    4356/tcp    # QSNet Assistant
+qsnet-cond      4357/udp    # QSNet Conductor
+qsnet-cond      4357/tcp    # QSNet Conductor
+qsnet-nucl      4358/udp    # QSNet Nucleus
+qsnet-nucl      4358/tcp    # QSNet Nucleus
+#                          Neer Kleinman <neer at qsr.co.il>
+#		4359-4441  Unassigned
+saris		4442/udp    # Saris
+saris		4442/tcp    # Saris
+pharos		4443/udp    # Pharos
+pharos		4443/tcp    # Pharos
+#			   TeleConsult GmbH, 76275 Ettlingen, Germany
+#			   <teleconsult at t-online.de>	
+krb524          4444/udp    # KRB524
+krb524          4444/tcp    # KRB524
+#                          B. Clifford Neuman <bcn at isi.edu>
+# PROBLEM krb524 assigned the port, 
+# PROBLEM nv used it without an assignment
+nv-video        4444/udp    # NV Video default
+nv-video        4444/tcp    # NV Video default
+#                          Ron Frederick <frederick at parc.xerox.com>
+upnotifyp 	4445/udp    # UPNOTIFYP
+upnotifyp	4445/tcp    # UPNOTIFYP
+#			   Mark Fox <markf at uplanet.com>
+n1-fwp		4446/udp    # N1-FWP
+n1-fwp		4446/tcp    # N1-FWP
+n1-rmgmt	4447/udp    # N1-RMGMT
+n1-rmgmt	4447/tcp    # N1-RMGMT
+#			   Lori Tassin <Ramsey at network-1.com>
+asc-slmd	4448/udp    # ASC Licence Manager
+asc-slmd	4448/tcp    # ASC Licence Manager
+#			   Casper Stoel <cbs at ascinc.com>
+privatewire     4449/udp    # PrivateWire
+privatewire     4449/tcp    # PrivateWire
+#			   Uri Resnitzky <uri at arx.com>
+camp		4450/udp    # Camp
+camp		4450/tcp    # Camp
+ctisystemmsg    4451/udp    # CTI System Msg
+ctisystemmsg    4451/tcp    # CTI System Msg
+ctiprogramload  4452/udp    # CTI Program Load
+ctiprogramload  4452/tcp    # CTI Program Load
+#			   Steven Cliff <sbcliff at controltechnology.com>
+nssalertmgr	4453/udp    # NSS Alert Manager
+nssalertmgr 	4453/tcp    # NSS Alert Manager
+nssagentmgr 	4454/udp    # NSS Agent Manager
+nssagentmgr	4454/tcp    # NSS Agent Manager
+#			   Jim Hill<jhill at symantec.com>
+prchat-user	4455/udp    # PR Chat User
+prchat-user	4455/tcp    # PR Chat User
+prchat-server	4456/udp    # PR Chat Server
+prchat-server	4456/tcp    # PR Chat Server
+prRegister	4457/udp    # PR Register
+prRegister	4457/tcp    # PR Register
+#			   Donny Gilor <dgilor at pop01.ny.us.ibm.net>
+#		4458-4499  Unassigned
+ipsec-msft      4500/udp    # Microsoft IPsec NAT-T
+ipsec-msft      4500/tcp    # Microsoft IPsec NAT-T
+#                          Christian Huitema <Huitema at microsoft.com> March 2002
+#               4501  De-registered (08 June 2001)
+#                          IANA <iana at iana.org>
+#               4502-4544  Unassigned
+worldscores	4545/udp    # WorldScores
+worldscores	4545/tcp    # WorldScores
+#                          Steve Davis <sdavis at optum-inc.com>
+sf-lm           4546/udp    # SF License Manager (Sentinel)
+sf-lm           4546/tcp    # SF License Manager (Sentinel)
+#                          Thomas Koell <info at sf.com>
+lanner-lm	4547/udp    # Lanner License Manager
+lanner-lm	4547/tcp    # Lanner License Manager
+#			   Les Enstone <lenstone at lanner.co.uk>
+#               4548-4554  Unassigned
+rsip            4555/udp    # RSIP Port
+rsip            4555/tcp    # RSIP Port
+#                          RFC 3103    
+#               4556-4558  Unassigned
+hylafax         4559/udp    # HylaFAX
+hylafax         4559/tcp    # HylaFAX
+#                          Lee Howard <iana at hylafax.org> March 2002 
+#               4560-4566  Unassigned
+tram            4567/udp    # TRAM
+tram            4567/tcp    # TRAM
+#                          Joe Wesley <joe.wesley at east.sun.com>
+bmc-reporting   4568/udp    # BMC Reporting 
+bmc-reporting   4568/tcp    # BMC Reporting 
+#                          Randall De Weerd <rdeweerd at bmc.com>
+#               4569-4599  Unassigned
+piranha1        4600/udp    # Piranha1
+piranha1        4600/tcp    # Piranha1
+piranha2        4601/udp    # Piranha2
+piranha2        4601/tcp    # Piranha2
+#                          Primark Corporation <joe.boone at primark.com>
+#               4602-4659  Unassigned
+smaclmgr        4660/udp    # smaclmgr
+smaclmgr        4660/tcp    # smaclmgr
+#                          Hiromi Taki <stg-togo at saint.nm.fujitsu.co.jp> 
+kar2ouche       4661/udp    # Kar2ouche Peer location service
+kar2ouche       4661/tcp    # Kar2ouche Peer location service
+#                          Andy Krouwel <andy at kar2ouche.com>  
+#               4662-4671  Unassigned
+rfa             4672/udp    # remote file access server
+rfa             4672/tcp    # remote file access server
+#               4673-4751  Unassigned
+snap            4752/udp    # Simple Network Audio Protocol
+snap            4752/tcp    # Simple Network Audio Protocol
+#                          Dameon Wagner <d.wagner at freemail.absa.co.za> February 2002
+#               4753-4799  Unassigned
+iims            4800/udp    # Icona Instant Messenging System
+iims            4800/tcp    # Icona Instant Messenging System
+iwec            4801/udp    # Icona Web Embedded Chat
+iwec            4801/tcp    # Icona Web Embedded Chat
+ilss            4802/udp    # Icona License System Server
+ilss            4802/tcp    # Icona License System Server
+#                          Paul Stephen Borlie <paul at icona.it>
+#               4803-4826  Unassigned
+htcp            4827/udp    # HTCP
+htcp            4827/tcp    # HTCP
+#                          Paul Vixie <paul at vix.com>
+#               4828-4836  Unassigned
+varadero-0      4837/udp    # Varadero-0 
+varadero-0      4837/tcp    # Varadero-0
+varadero-1      4838/udp    # Varadero-1
+varadero-1      4838/tcp    # Varadero-1
+varadero-2      4839/udp    # Varadero-2
+varadero-2      4839/tcp    # Varadero-2
+#                          Carlos Arteaga <carteaga at abacoinc.com>
+#               4840-4847  Unassigned
+appserv-http    4848/udp    # App Server - Admin HTTP
+appserv-http    4848/tcp    # App Server - Admin HTTP
+appserv-https   4849/udp    # App Server - Admin HTTPS
+appserv-https   4849/tcp    # App Server - Admin HTTPS
+#                          Sreeram Duvvuru <sduv at sfbay.sun.com> April 2002
+#               4850-4867  Unassigned
+phrelay         4868/udp    # Photon Relay
+phrelay         4868/tcp    # Photon Relay
+phrelaydbg      4869/udp    # Photon Relay Debug
+phrelaydbg      4869/tcp    # Photon Relay Debug
+#                          Michael Hunter <mphunter at qnx.com>
+#               4870-4884  Unassigned
+abbs            4885/udp    # ABBS
+abbs            4885/tcp    # ABBS
+#                          Ryan Rubley <root at ark.dyn.ml.org>
+#               4886-4893  Unassigned
+lyskom          4894/udp    # LysKOM Protocol A
+lyskom          4894/tcp    # LysKOM Protocol A
+#                          Per Cederqvist <ceder at lysator.liu.se>
+#               4895-4898  Unassigned
+radmin-port     4899/udp    # RAdmin Port
+radmin-port     4899/tcp    # RAdmin Port
+#                          Dmitri Znosko <support at radmin.com> March 2003
+#               4900-4982  Unassigned
+att-intercom    4983/udp    # AT&T Intercom
+att-intercom    4983/tcp    # AT&T Intercom
+#                          Tony Hansen <intercom at maillennium.att.com>
+#               4984-4986  Unassigned
+smar-se-port1   4987/udp    # SMAR Ethernet Port 1
+smar-se-port1   4987/tcp    # SMAR Ethernet Port 1
+smar-se-port2   4988/udp    # SMAR Ethernet Port 2
+smar-se-port2   4988/tcp    # SMAR Ethernet Port 2
+#                          Delcio Prizon <dprizon at smar.com.br>
+parallel        4989/udp    # Parallel for GAUSS (tm)
+parallel        4989/tcp    # Parallel for GAUSS (tm)
+#                          Matthew Ford <Matthew.Ford at forward.com.au> March 2003
+#               4990-4999  Unassigned
+commplex-main	5000/udp # 
+commplex-main	5000/tcp # 
+commplex-link	5001/udp # 
+commplex-link	5001/tcp # 
+rfe             5002/udp    # radio free ethernet
+rfe             5002/tcp    # radio free ethernet
+fmpro-internal  5003/udp    # FileMaker, Inc. - Proprietary name binding
+fmpro-internal  5003/tcp    # FileMaker, Inc. - Proprietary transport
+#                          Clay Maeckel <clay_maeckel at filemaker.com>
+avt-profile-1   5004/udp    # avt-profile-1
+avt-profile-1   5004/tcp    # avt-profile-1
+avt-profile-2   5005/udp    # avt-profile-2
+avt-profile-2   5005/tcp    # avt-profile-2
+#                          Henning Schulzrinne <schulzrinne at fokus.gmd.de>
+wsm-server      5006/udp    # wsm server
+wsm-server      5006/tcp    # wsm server
+wsm-server-ssl  5007/udp    # wsm server ssl
+wsm-server-ssl  5007/tcp    # wsm server ssl
+#                          Adam Berk <aberk at empirix.com>
+synapsis-edge   5008/udp    # Synapsis EDGE
+synapsis-edge   5008/tcp    # Synapsis EDGE
+#                          Paul Schilling <PaulS at Synapsis.com>
+#               5009       Unassigned
+telelpathstart  5010/udp    # TelepathStart
+telelpathstart  5010/tcp    # TelepathStart
+telelpathattack 5011/udp    # TelepathAttack
+telelpathattack 5011/tcp    # TelepathAttack
+#                          Helmuth Breitenfellner <hbreitenf at vnet.imb.com>
+#               5012-5019  Unassigned
+zenginkyo-1     5020/udp    # zenginkyo-1
+zenginkyo-1     5020/tcp    # zenginkyo-1
+zenginkyo-2     5021/udp    # zenginkyo-2
+zenginkyo-2     5021/tcp    # zenginkyo-2
+#                          Masashi Suzaki <susakim at noa.nttdata.jp>
+mice            5022/udp    # mice server
+mice            5022/tcp    # mice server
+#                          Alan Clifford <alan at clifford.ac>
+htuilsrv        5023/udp    # Htuil Server for PLD2
+htuilsrv        5023/tcp    # Htuil Server for PLD2
+#                          Dennis Reinhardt <DennisR at dair.com>
+scpi-telnet     5024/udp    # SCPI-TELNET
+scpi-telnet     5024/tcp    # SCPI-TELNET
+scpi-raw        5025/udp    # SCPI-RAW
+scpi-raw        5025/tcp    # SCPI-RAW
+#                          Ryan Columbus <IANA_Contact at Agilent.com> October 2002
+#               5026-5041  Unassigned
+asnaacceler8db  5042/udp    # asnaacceler8db
+asnaacceler8db  5042/tcp    # asnaacceler8db
+#                          Walter Goodwin <wpgoodwin at asna.com>
+#               5043-5049  Unassigned 
+mmcc            5050/udp    # multimedia conference control tool
+mmcc            5050/tcp    # multimedia conference control tool
+#                          Steve Casner <Casner at isi.edu>
+ita-agent       5051/udp    # ITA Agent
+ita-agent       5051/tcp    # ITA Agent
+ita-manager     5052/udp    # ITA Manager
+ita-manager     5052/tcp    # ITA Manager
+#                          Don Merrell <donmer at axent.com>
+#               5053-5054  Unassigned
+unot            5055/udp    # UNOT
+unot            5055/tcp    # UNOT
+#                          Gordon Mohr <gmohr at cmgisolutions.com>
+intecom-ps1     5056/udp    # Intecom PS 1
+intecom-ps1     5056/tcp    # Intecom PS 1
+intecom-ps2     5057/udp    # Intecom PS 2
+intecom-ps2     5057/tcp    # Intecom PS 2
+#                          David Meermans <dmeermans at intecom.com>
+#               5058-5059  Unassigned
+sip             5060/udp    # SIP
+sip             5060/tcp    # SIP
+sip-tls         5061/udp    # SIP-TLS
+sip-tls         5061/tcp    # SIP-TLS
+#                          Henning Schulzrinne <hgs at cs.columbia.edu>
+#               5062-5063  Unassigned
+ca-1            5064/udp    # Channel Access 1
+ca-1            5064/tcp    # Channel Access 1
+ca-2            5065/udp    # Channel Access 2
+ca-2            5065/tcp    # Channel Access 2
+#                          Jeffrey Hill <johill at lanl.gov> August 2002
+#               5066-5067  Unassigned
+stanag-5066     5066/udp    # STANAG-5066-SUBNET-INTF
+stanag-5066     5066/tcp    # STANAG-5066-SUBNET-INTF
+#                          Donald G. Kallgren
+#                          <Donald.Kallgren at nc3a.nato.int>      
+#               5062-5068  Unassigned
+i-net-2000-npr  5069/udp    # I/Net 2000-NPR
+i-net-2000-npr  5069/tcp    # I/Net 2000-NPR
+#                          Kenny Garrison <Kenny_Garrison at csicontrols.com>
+#               5070       Unassigned
+powerschool     5071/udp    # PowerSchool
+powerschool     5071/tcp    # PowerSchool
+#                          Greg Porter <gporter at powerschool.com>
+#               5072-5080  Unassigned
+sdl-ets         5081/udp    # SDL - Ent Trans Server
+sdl-ets         5081/tcp    # SDL - Ent Trans Server
+#                          Marc Morin <mmorin at sdlintl.com> April 2002
+#               5082-5092  Unassigned
+sentinel-lm     5093/udp    # Sentinel LM
+sentinel-lm     5093/tcp    # Sentinel LM
+#                          Derick Snyder <dsnyder at rainbow.com>
+#               5094-5098  Unassigned 
+sentlm-srv2srv  5099/udp    # SentLM Srv2Srv
+sentlm-srv2srv  5099/tcp    # SentLM Srv2Srv
+#                          Derick Snyder <dsnyder at rainbow.com>
+#               5100       Unassigned
+talarian-udp    5101/udp    # Talarian_UDP
+talarian-tcp    5101/tcp    # Talarian_TCP
+#                          Leo Martins <leo at talarian.com>
+#               5102-5136  Unassigned
+ctsd            5137/udp    # MyCTS server port
+ctsd            5137/tcp    # MyCTS server port
+#                          Jilles Oldenbeuving <ojilles at hotmail.com> June 2002
+#               5138-5144  Unassigned
+rmonitor_secure	5145/udp    # RMONITOR SECURE
+rmonitor_secure	5145/tcp    # RMONITOR SECURE
+#                          Kory Hamzeh <kory at ascend.com> 
+#               5146-5149  Unassigned
+atmp            5150/udp    # Ascend Tunnel Management Protocol
+atmp            5150/tcp    # Ascend Tunnel Management Protocol
+#                          Kory Hamzeh <kory at ascend.com>
+esri_sde        5151/udp    # ESRI SDE Remote Start
+esri_sde        5151/tcp    # ESRI SDE Instance
+sde-discovery   5152/udp    # ESRI SDE Instance Discovery
+sde-discovery   5152/tcp    # ESRI SDE Instance Discovery
+#                          Peter Aronson <paronson at esri.com> 
+#               5153-5164  Unassigned
+ife_icorp       5165/udp    # ife_1corp
+ife_icorp       5165/tcp    # ife_1corp
+#                          Paul Annala <paa at bull.se>
+#               5166-5189  Unassigned
+aol             5190/udp    # America-Online
+aol             5190/tcp    # America-Online
+#                          Marty Lyons <marty at aol.com>
+aol-1           5191/udp    # AmericaOnline1
+aol-1           5191/tcp    # AmericaOnline1
+aol-2           5192/udp    # AmericaOnline2
+aol-2           5192/tcp    # AmericaOnline2
+aol-3           5193/udp    # AmericaOnline3
+aol-3           5193/tcp    # AmericaOnline3
+#                          Bruce Mackey <BAMackey at aol.com>
+#               5194-5199  Unassigned
+targus-getdata  5200/udp    # TARGUS GetData  
+targus-getdata  5200/tcp    # TARGUS GetData 
+targus-getdata1 5201/udp    # TARGUS GetData 1
+targus-getdata1 5201/tcp    # TARGUS GetData 1
+targus-getdata2 5202/udp    # TARGUS GetData 2
+targus-getdata2 5202/tcp    # TARGUS GetData 2
+targus-getdata3 5203/udp    # TARGUS GetData 3
+targus-getdata3 5203/tcp    # TARGUS GetData 3 
+#			   John Keaveney <johnkeaveney at targusinfo.com>
+#               5204-5221  Unassigned
+jabber-client   5222/udp    # Jabber Client Connection
+jabber-client   5222/tcp    # Jabber Client Connection
+#                          David Waite <mass at akuma.org> February 2002 
+#               5223-5224  Unassigned
+hp-server       5225/udp    # HP Server
+hp-server       5225/tcp    # HP Server
+hp-status       5226/udp    # HP Status
+hp-status       5226/tcp    # HP Status
+#                          Brett Green <Brett_Green at HP.Com>
+#               5227-5235  Unassigned
+padl2sim	5236/udp # 
+padl2sim	5236/tcp # 
+#               5237-5249  Unassigned
+igateway        5250/udp    # iGateway
+igateway        5250/tcp    # iGateway
+#                          Greg Bodine <gregory.bodine at ca.com> February 2002
+#               5251-5263  Unassigned
+3com-njack-1    5264/udp    # 3Com Network Jack Port 1
+3com-njack-1    5264/tcp    # 3Com Network Jack Port 1 
+3com-njack-2    5265/udp    # 3Com Network Jack Port 2
+3com-njack-2    5265/tcp    # 3Com Network Jack Port 2
+#                          Abhay Rajaram <Abhay_Rajaram at 3Com.com> March 2003
+#               5266-5268  Unassigned
+jabber-server   5269/udp    # Jabber Server Connection
+jabber-server   5269/tcp    # Jabber Server Connection
+#                          David Waite <mass at akuma.org> February 2002
+#               5270-5271  Unassigned
+pk		5272/udp    # PK
+pk		5272/tcp    # PK
+#			   Patrick Kara <Patrick at EBA.NET>
+#               5273-5281  Unassigned
+transmit-port   5282/udp    # Marimba Transmitter Port
+transmit-port   5282/tcp    # Marimba Transmitter Port
+#                          Johan Eriksson <johan at marimba.com> April 2002
+#               5283-5299  Unassigned
+hacl-hb		5300/udp	 # # HA cluster heartbeat
+hacl-hb		5300/tcp         # # HA cluster heartbeat
+hacl-gs		5301/udp	 # # HA cluster general services
+hacl-gs		5301/tcp	 # # HA cluster general services
+hacl-cfg	5302/udp	 # # HA cluster configuration
+hacl-cfg	5302/tcp	 # # HA cluster configuration
+hacl-probe	5303/udp	 # # HA cluster probing
+hacl-probe	5303/tcp	 # # HA cluster probing
+hacl-local      5304/udp         # 
+hacl-local      5304/tcp         # # HA Cluster Commands
+hacl-test       5305/udp                             # 
+hacl-test       5305/tcp         # # HA Cluster Test                    
+#                               Eric Soderberg <seric at hposl102.cup.hp>
+#                               Edward Yim <eyim at hpmfas4.cup.hp.com>
+sun-mc-grp	5306/udp    # Sun MC Group
+sun-mc-grp	5306/tcp    # Sun MC Group
+#			   Michael DeMoney <demoney at eng.sun.com>
+sco-aip		5307/udp    # SCO AIP
+sco-aip		5307/tcp    # SCO AIP
+#			   Barrie Cooper <barrie at sco.com>
+cfengine	5308/udp    # CFengine
+cfengine 	5308/tcp    # CFengine
+#			   Mark Burgess <mark.burgess at iu.hioslo.no>
+jprinter  	5309/udp    # J Printer
+jprinter	5309/tcp    # J Printer
+#			   Ken Blackwell <kenb at bristol.com>
+outlaws		5310/udp    # Outlaws
+outlaws		5310/tcp    # Outlaws
+#			   Richard Fife <richardf at lucasarts.com>
+tmlogin		5311/udp    # TM Login
+tmlogin		5311/tcp    # TM Login
+#			   Eric Sharakan <eric.sharakan at east.sun.com>
+#               5312-5313  Unassigned
+opalis-rbt-ipc  5314/udp    # opalis-rbt-ipc
+opalis-rbt-ipc  5314/tcp    # opalis-rbt-ipc
+#                          Laurent Domenech <ldomenech at opalis.com>
+hacl-poll       5315/udp    # HA Cluster UDP Polling
+hacl-poll       5315/tcp    # HA Cluster UDP Polling
+#                          Hoa Nguyen <hoan at cup.hp.com>
+#               5316-5352  Unassigned
+mdns            5353/udp    # Multicast DNS
+mdns            5353/tcp    # Multicast DNS
+#                          Stuart Cheshire <cheshire at multicastdns.org>
+#     		5354-5399  Unassigned
+excerpt		5400/udp    # Excerpt Search
+excerpt		5400/tcp    # Excerpt Search
+excerpts	5401/udp    # Excerpt Search Secure
+excerpts	5401/tcp    # Excerpt Search Secure
+#			   John Hinsdale <hin at alma.com>
+mftp		5402/udp    # MFTP
+mftp		5402/tcp    # MFTP
+#			   Alan Rosenberg <arosen at starburstcom.com>
+hpoms-ci-lstn	5403/udp    # HPOMS-CI-LSTN
+hpoms-ci-lstn   5403/tcp    # HPOMS-CI-LSTN
+hpoms-dps-lstn  5404/udp    # HPOMS-DPS-LSTN
+hpoms-dps-lstn  5404/tcp    # HPOMS-DPS-LSTN
+#			   Harold Froehling <hrf at cup.hp.com>
+netsupport	5405/udp    # NetSupport
+netsupport	5405/tcp    # NetSupport
+#			   Paul Sanders <pe77 at dial.pipex.com>
+systemics-sox	5406/udp    # Systemics Sox
+systemics-sox	5406/tcp    # Systemics Sox
+#			   Gary Howland <gary at systemics.com>
+foresyte-clear  5407/udp    # Foresyte-Clear
+foresyte-clear  5407/tcp    # Foresyte-Clear
+foresyte-sec	5408/udp    # Foresyte-Sec
+foresyte-sec    5408/tcp    # Foresyte-Sec
+#			   Jorge Aldana <operator at foresyte.com>
+salient-dtasrv  5409/udp    # Salient Data Server
+salient-dtasrv  5409/tcp    # Salient Data Server
+salient-usrmgr  5410/udp    # Salient User Manager
+salient-usrmgr  5410/tcp    # Salient User Manager
+#                          Richard Farnham <rfarnham at salient.com> 
+actnet		5411/udp    # ActNet
+actnet		5411/tcp    # ActNet
+#			   Simon Robillard <RobillardS at actresearch.com>
+continuus	5412/udp    # Continuus
+continuus	5412/tcp    # Continuus
+#			   Steven Holtsberg <steveh at continuus.com>
+wwiotalk	5413/udp    # WWIOTALK
+wwiotalk	5413/tcp    # WWIOTALK
+#			   Roger Knobbe <RogerK at Wonderware.COM>
+statusd		5414/udp    # StatusD
+statusd		5414/tcp    # StatusD
+#			   Stephen Misel <steve at satelnet.org>
+ns-server	5415/udp    # NS Server
+ns-server	5415/tcp    # NS Server
+#			   Jeffrey Chiao <chiaoj at netsoft.com>
+sns-gateway	5416/udp    # SNS Gateway
+sns-gateway	5416/tcp    # SNS Gateway
+sns-agent	5417/udp    # SNS Agent
+sns-agent	5417/tcp    # SNS Agent
+#	    		   Mary Holstage <holstege at firstfloor.com>
+mcntp		5418/udp    # MCNTP
+mcntp		5418/tcp    # MCNTP
+#			   Heiko Rupp <hwr at pilhuhn.de>
+dj-ice		5419/udp    # DJ-ICE
+dj-ice		5419/tcp    # DJ-ICE
+#			   Don Tyson <don.tyson at cor.dowjones.com>
+cylink-c	5420/udp    # Cylink-C
+cylink-c	5420/tcp    # Cylink-C
+#			   John Jobe <jjobe at cylink.com>
+netsupport2	5421/udp    # Net Support 2
+netsupport2	5421/tcp    # Net Support 2
+#			   Paul Sanders <p.sanders at dial.pipex.com>
+salient-mux     5422/udp    # Salient MUX
+salient-mux     5422/tcp    # Salient MUX
+#                          Richard Farnham <rfarnham at salient.com>
+virtualuser     5423/udp    # VIRTUALUSER
+virtualuser     5423/tcp    # VIRTUALUSER
+#                          Chad Williams <chad at apple.com>
+#               5424-5425  Unassigned
+devbasic        5426/udp    # DEVBASIC
+devbasic        5426/tcp    # DEVBASIC
+#                          Curtis Smith <curtis.smith at vsin.com>
+sco-peer-tta    5427/udp    # SCO-PEER-TTA
+sco-peer-tta    5427/tcp    # SCO-PEER-TTA
+#                          Andrew Shire <sndrewsh at sco.com>
+telaconsole     5428/udp    # TELACONSOLE
+telaconsole     5428/tcp    # TELACONSOLE
+#                          Joseph M. Newcomer <newcomer at flounder.com>
+base            5429/udp    # Billing and Accounting System Exchange
+base            5429/tcp    # Billing and Accounting System Exchange
+#                          Odo Maletzki <Odo.Maletzki at ioag.de>
+radec-corp      5430/udp    # RADEC CORP
+radec-corp      5430/tcp    # RADEC CORP
+#                          David Chell <david at softlife.co.nz>
+park-agent      5431/udp    # PARK AGENT
+park-agent      5431/tcp    # PARK AGENT
+#                          John Clifford <John.Clifford at veritas.com>
+postgresql      5432/udp    # PostgreSQL Database
+postgresql      5432/tcp    # PostgreSQL Database
+#                          Tom Lane <tgl at sss.pgh.pa.us>
+#		5433-5434  Unassigned
+dttl            5435/udp    # Data Tunneling Transceiver Linking (DTTL)
+dttl            5435/tcp    # Data Tunneling Transceiver Linking (DTTL)
+#                          Richard Olsen <Olsen7 at liquefaction.com>
+#               5436-5453  Unassigned
+apc-5454        5454/udp    # APC 5454
+apc-5454        5454/tcp    # APC 5454
+apc-5455        5455/udp    # APC 5455
+apc-5455        5455/tcp    # APC 5455
+apc-5456        5456/udp    # APC 5456
+apc-5456        5456/tcp    # APC 5456
+#                          American Power Conversion <ports at apcc.com>
+#               5457-5460  Unassigned
+silkmeter       5461/udp    # SILKMETER
+silkmeter       5461/tcp    # SILKMETER
+#                          Alexander Kotopoulis <alexk at segue.com>
+ttl-publisher   5462/udp    # TTL Publisher
+ttl-publisher   5462/tcp    # TTL Publisher
+#                          Peter Jacobs <pjacobs at tullib.com>
+ttlpriceproxy   5463/udp    # TTL Price Proxy
+ttlpriceproxy   5463/tcp    # TTL Price Proxy
+#                          Peter Jacobs <pjacobs at tullib.com>
+#               5464       Unassigned
+netops-broker   5465/udp    # NETOPS-BROKER
+netops-broker   5465/tcp    # NETOPS-BROKER
+#                          John R. Deuel <kink at netops.com>
+#		5466-5499  Unassigned
+fcp-addr-srvr1  5500/udp    # fcp-addr-srvr1
+fcp-addr-srvr1  5500/tcp    # fcp-addr-srvr1
+fcp-addr-srvr2  5501/udp    # fcp-addr-srvr2
+fcp-addr-srvr2  5501/tcp    # fcp-addr-srvr2
+fcp-srvr-inst1  5502/udp    # fcp-srvr-inst1
+fcp-srvr-inst1  5502/tcp    # fcp-srvr-inst1
+fcp-srvr-inst2  5503/udp    # fcp-srvr-inst2
+fcp-srvr-inst2  5503/tcp    # fcp-srvr-inst2
+fcp-cics-gw1    5504/udp    # fcp-cics-gw1
+fcp-cics-gw1    5504/tcp    # fcp-cics-gw1
+#			   Mark Zeiss <mark.r.zeiss at ac.com>
+#               5505-5552  Unassigned
+sgi-eventmond   5553/udp    # SGI Eventmond Port
+sgi-eventmond   5553/tcp    # SGI Eventmond Port
+#                          Andrei Vilkotski <andreiv at sgi.com> June 2003
+sgi-esphttp     5554/udp    # SGI ESP HTTP
+sgi-esphttp     5554/tcp    # SGI ESP HTTP
+#                          Vladimir Legalov <legalov at sgi.com>
+############Port 5555 also used by HP Omniback#####################
+personal-agent  5555/udp    # Personal Agent
+personal-agent  5555/tcp    # Personal Agent
+#			   Jackie Wu <jackiew at infoseek.com>
+###################################################################
+#		5556-5565  Unassigned
+udpplus         5566/udp    # UDPPlus
+udpplus         5566/tcp    # UDPPlus
+#                          Cody Gibson <cody.gibson at intermec.com>
+#               5567-5598  Unassigned
+esinstall	5599/udp    # Enterprise Security Remote Install
+esinstall	5599/tcp    # Enterprise Security Remote Install
+esmmanager	5600/udp    # Enterprise Security Manager
+esmmanager	5600/tcp    # Enterprise Security Manager
+esmagent	5601/udp    # Enterprise Security Agent
+esmagent	5601/tcp    # Enterprise Security Agent
+#			   Kimberly Gibbs <kimgib at CCGATE-UT.AXENT.COM>
+a1-msc		5602/udp    # A1-MSC
+a1-msc		5602/tcp    # A1-MSC
+a1-bs		5603/udp    # A1-BS
+a1-bs		5603/tcp    # A1-BS
+a3-sdunode	5604/udp    # A3-SDUNode
+a3-sdunode	5604/tcp    # A3-SDUNode
+a4-sdunode	5605/udp    # A4-SDUNode
+a4-sdunode	5605/tcp    # A4-SDUNode
+#			   Mike Dolan <MDolan at ihcmail.ih.lucent.com>
+#               5606-5630  Unassigned
+pcanywheredata  5631/udp    # pcANYWHEREdata
+pcanywheredata  5631/tcp    # pcANYWHEREdata
+pcanywherestat  5632/udp    # pcANYWHEREstat
+pcanywherestat  5632/tcp    # pcANYWHEREstat
+#                          Jon Rosarky <JRosarky at symantec.com>
+#               5633-5672  Unassigned
+jms             5673/udp    # JACL Message Server
+jms             5673/tcp    # JACL Message Server
+#                          Stuart Allen <stuart at jacl.animats.net> February 2002
+hyperscsi-port  5674/udp    # HyperSCSI Port
+hyperscsi-port  5674/tcp    # HyperSCSI Port
+#                          Data Storage Institute, Singapore 
+#                          <Patrick at dsi.nus.edu.sg> February 2002
+v5ua            5675/udp    # V5UA application port
+v5ua            5675/tcp    # V5UA application port
+#                          Sanjay Rao <rsanjay at nortelnetworks.com> February 2002
+raadmin         5676/udp    # RA Administration
+raadmin         5676/tcp    # RA Administration
+#                          Sergei Zjaikin <serge at previo.ee> February 2002
+questdb2-lnchr  5677/udp    # Quest Central DB2 Launchr
+questdb2-lnchr  5677/tcp    # Quest Central DB2 Launchr
+#                          Robert M. Mackowiak <rmackowiak at quest.com> February 2002
+rrac            5678/udp    # Remote Replication Agent Connection  
+rrac            5678/tcp    # Remote Replication Agent Connection  
+dccm            5679/udp    # Direct Cable Connect Manager
+dccm            5679/tcp    # Direct Cable Connect Manager
+#                          Mark Miller <mmiller at MICROSOFT.com>
+#               5680-5687  Unassigned
+ggz             5688/udp    # GGZ Gaming Zone
+ggz             5688/tcp    # GGZ Gaming Zone
+#                          Josef Spillner <js177634 at inf.tu-dresden.de> January 2003  
+#               5689-5712  Unassigned
+proshareaudio   5713/udp    # proshare conf audio
+proshareaudio   5713/tcp    # proshare conf audio
+prosharevideo   5714/udp    # proshare conf video
+prosharevideo   5714/tcp    # proshare conf video
+prosharedata    5715/udp    # proshare conf data 
+prosharedata    5715/tcp    # proshare conf data 
+prosharerequest 5716/udp    # proshare conf request
+prosharerequest 5716/tcp    # proshare conf request
+prosharenotify  5717/udp    # proshare conf notify 
+prosharenotify  5717/tcp    # proshare conf notify 
+#                          <gunner at ibeam.intel.com>
+#               5718-5719  Unassigned
+ms-licensing    5720/udp    # MS-Licensing 
+ms-licensing    5720/tcp    # MS-Licensing
+#                          Thomas Lindeman <tlinde at microsoft.com> November 2002
+#               5721-5728  Unassigned
+openmail        5729/udp    # Openmail User Agent Layer
+openmail        5729/tcp    # Openmail User Agent Layer
+#                          OpenMail Encyclopedia <opencyc at hpopd.pwd.hp.com>
+#                          Don Loughry <DON_LOUGHRY at hp-cupertino-om4.om.hp.com>
+unieng          5730/udp    # Steltor's calendar access
+unieng          5730/tcp    # Steltor's calendar access
+#                          Bernard Desruisseaux <bernard at steltor.com>
+#               5731-5740  Unassigned           
+ida-discover1   5741/udp    # IDA Discover Port 1
+ida-discover1   5741/tcp    # IDA Discover Port 1
+ida-discover2   5742/udp    # IDA Discover Port 2
+ida-discover2   5742/tcp    # IDA Discover Port 2
+#                          MPITech Support <morten.christensen at I-DATA.COM>
+#               5743-5744  Unassigned
+fcopy-server    5745/udp    # fcopy-server
+fcopy-server    5745/tcp    # fcopy-server
+fcopys-server   5746/udp    # fcopys-server
+fcopys-server   5746/tcp    # fcopys-server
+#                          Moshe Leibovitch <moshe at softlinkusa.com
+#               5747-5754  Unassigned
+openmailg       5755/udp    # OpenMail Desk Gateway server
+openmailg       5755/tcp    # OpenMail Desk Gateway server
+x500ms          5757/udp    # OpenMail X.500 Directory Server
+x500ms          5757/tcp    # OpenMail X.500 Directory Server
+openmailns      5766/udp    # OpenMail NewMail Server
+openmailns      5766/tcp    # OpenMail NewMail Server
+s-openmail      5767/udp    # OpenMail Suer Agent Layer (Secure)
+s-openmail      5767/tcp    # OpenMail Suer Agent Layer (Secure)
+openmailpxy	5768/udp    # OpenMail CMTS Server
+openmailpxy	5768/tcp    # OpenMail CMTS Server
+#                          OpenMail Encyclopedia >opencyc at hpopd.pwd.hp.com>
+#                          Don Loughry <DON_LOUGHRY at hp-cupertino-om4.om.hp.com>
+#               5769-5770  Unassigned
+netagent	5771/udp    # NetAgent
+netagent	5771/tcp    # NetAgent
+#			   Bradley Birnbaum <bradley.birnbaum at eshare.com>
+#               5772-5812  Unassigned
+icmpd           5813/udp    # ICMPD
+icmpd           5813/tcp    # ICMPD
+#                          Shane O'Donnell <shane at opennms.org> 
+#               5814-5858  Unassigned 
+wherehoo        5859/udp    # WHEREHOO
+wherehoo        5859/tcp    # WHEREHOO
+#                          Jim Youll <jim at media.mit.edu>
+#               5860-5967  Unassigned 
+mppolicy-v5	5968/udp    # mppolicy-v5
+mppolicy-v5	5968/tcp    # mppolicy-v5
+mppolicy-mgr	5969/udp    # mppolicy-mgr
+mppolicy-mgr	5969/tcp    # mppolicy-mgr
+#			   Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+#               5970-5986  Unassigned
+wbem-rmi        5987/udp    # WBEM RMI
+wbem-rmi        5987/tcp    # WBEM RMI
+wbem-http       5988/udp    # WBEM HTTP
+wbem-http       5988/tcp    # WBEM HTTP
+#                          Jim Davis <james.d.davis at sun.com> 
+wbem-https      5989/udp    # WBEM HTTPS
+wbem-https      5989/tcp    # WBEM HTTPS
+#                          Jim Davis <james.d.davis at east.sun.com>
+#               5990       Unassigned (Removed 2003-02-26)
+nuxsl           5991/udp    # NUXSL
+nuxsl           5991/tcp    # NUXSL
+#                          Kai Kretschmann <K.Kretschmann at security-gui.de> March 2002
+#               5992-5998  Unassigned
+cvsup           5999/udp    # CVSup
+cvsup           5999/tcp    # CVSup
+#                          Randall Atkinson <rja at inet.org>
+#                          Stephen Gildea <gildea at lcs.mit.edu>
+ndl-ahp-svc     6064/udp    # NDL-AHP-SVC
+ndl-ahp-svc     6064/tcp    # NDL-AHP-SVC
+#                          John Richmond <john at ndl.co.uk>
+winpharaoh      6065/udp    # WinPharaoh
+winpharaoh      6065/tcp    # WinPharaoh
+#	                   Basil Lee <basil.lee at gnnettest.com>
+ewctsp          6066/udp    # EWCTSP
+ewctsp          6066/tcp    # EWCTSP
+#                          Mark Bailon <mark.bailon at ericsson.com>
+srb             6067/udp    # SRB
+srb             6067/tcp    # SRB
+#                          Heinz Naef <heinz.naef at nexos.com>         
+gsmp            6068/udp    # GSMP
+gsmp            6068/tcp    # GSMP
+#                          Avri Doria <avri.doria at nokia.com>
+trip            6069/udp    # TRIP
+trip            6069/tcp    # TRIP
+#                          Hussein F. Salama <hsalama at cisco.com>
+messageasap     6070/udp    # Messageasap
+messageasap     6070/tcp    # Messageasap
+#                          Murray Freeman <murray at officedomain.com>
+ssdtp           6071/udp    # SSDTP
+ssdtp           6071/tcp    # SSDTP
+#                          Michael Shearson <mikes at softsys-inc.com> 
+diagnose-proc   6072/udp    # DIAGNOSE-PROC
+diagnose-proc   6072/tcp    # DIAGNOSE-PROC
+#                          Allan Miller <amiller at handsfreenetworks.com>
+directplay8     6073/udp    # DirectPlay8
+directplay8     6073/tcp    # DirectPlay8
+#                          John Kane <johnkan at microsoft.com>
+#               6074-6084  Unassigned
+konspire2b      6085/udp    # konspire2b p2p network
+konspire2b      6085/tcp    # konspire2b p2p network
+#                          Jason Rohrer <rohrer at cse.ucsc.edu> October 2002
+#               6086-6099  Unassigned
+synchronet-db   6100/udp    # SynchroNet-db
+synchronet-db   6100/tcp    # SynchroNet-db
+synchronet-rtc  6101/udp    # SynchroNet-rtc
+synchronet-rtc  6101/tcp    # SynchroNet-rtc
+synchronet-upd  6102/udp    # SynchroNet-upd
+synchronet-upd  6102/tcp    # SynchroNet-upd
+#                          Arne Haugland <Arne.Haugland at parasoldev.com>    
+rets            6103/udp    # RETS
+rets            6103/tcp    # RETS
+#                          Bruce Toback <btoback at optc.com>
+dbdb            6104/udp    # DBDB
+dbdb            6104/tcp    # DBDB
+#                          Aaron Brick <aa at lithic.org>
+primaserver     6105/udp    # Prima Server
+primaserver     6105/tcp    # Prima Server
+mpsserver       6106/udp    # MPS Server
+mpsserver       6106/tcp    # MPS Server
+#                          Prima Designs Systems Ltd. <info at prima.com.hk>
+etc-control     6107/udp    # ETC Control
+etc-control     6107/tcp    # ETC Control
+#                          Steve Polishinski <spolishinski at etcconnect.com>  
+sercomm-scadmin 6108/udp    # Sercomm-SCAdmin
+sercomm-scadmin 6108/tcp    # Sercomm-SCAdmin
+#                          Melinda Tsao <melinda_tsao at mail.sercomm.com.tw>
+globecast-id    6109/udp    # GLOBECAST-ID
+globecast-id    6109/tcp    # GLOBECAST-ID
+#                          Piers Scannell <piers at globecastne.com>
+softcm          6110/udp    # HP SoftBench CM
+softcm          6110/tcp    # HP SoftBench CM
+spc             6111/udp    # HP SoftBench Sub-Process Control
+spc             6111/tcp    # HP SoftBench Sub-Process Control
+#                          Scott A. Kramer <sk at tleilaxu.sde.hp.com>
+dtspcd          6112/udp    # dtspcd   
+dtspcd          6112/tcp    # dtspcd
+#                          Doug Royer <Doug at Royer.com>
+#               6113-6122  Unassigned
+backup-express  6123/udp    # Backup Express
+backup-express  6123/tcp    # Backup Express
+#			   Chi Shih Chang <cchang at syncsort.com>
+#               6124-6140  Unassigned
+meta-corp       6141/udp    # Meta Corporation License Manager
+meta-corp       6141/tcp    # Meta Corporation License Manager
+#                          Osamu Masuda <--none--->
+aspentec-lm     6142/udp    # Aspen Technology License Manager
+aspentec-lm     6142/tcp    # Aspen Technology License Manager
+#                          Kevin Massey <massey at aspentec.com>
+watershed-lm    6143/udp    # Watershed License Manager
+watershed-lm    6143/tcp    # Watershed License Manager
+#                          David Ferrero <david at zion.com>
+statsci1-lm     6144/udp    # StatSci License Manager - 1
+statsci1-lm     6144/tcp    # StatSci License Manager - 1
+statsci2-lm     6145/udp    # StatSci License Manager - 2
+statsci2-lm     6145/tcp    # StatSci License Manager - 2
+#                          Scott Blachowicz <scott at statsci.com>
+lonewolf-lm     6146/udp    # Lone Wolf Systems License Manager
+lonewolf-lm     6146/tcp    # Lone Wolf Systems License Manager
+#                          Dan Klein <dvk at lonewolf.com>
+montage-lm      6147/udp    # Montage License Manager
+montage-lm      6147/tcp    # Montage License Manager
+#                          Michael Ubell <michael at montage.com>
+ricardo-lm      6148/udp    # Ricardo North America License Manager
+ricardo-lm      6148/tcp    # Ricardo North America License Manager
+#                          M Flemming <mflemming at aol.com>
+tal-pod         6149/udp    # tal-pod 
+tal-pod         6149/tcp    # tal-pod 
+#                          Steven Loomis <srl at taligent.com>
+#               6150-6252  Unassigned 
+crip            6253/udp    # CRIP
+crip            6253/tcp    # CRIP
+#                          Mike Rodbell <mrodbell at ciena.com> 
+#               6254-6299  Unassigned
+bmc-grx         6300/udp    # BMC GRX
+bmc-grx         6300/tcp    # BMC GRX
+#                          Ed Penak <ed_penak at bmc.com>
+#               6301-6320  Unassigned
+emp-server1     6321/udp    # Empress Software Connectivity Server 1   
+emp-server1     6321/tcp    # Empress Software Connectivity Server 1
+emp-server2     6322/udp    # Empress Software Connectivity Server 2  
+emp-server2     6322/tcp    # Empress Software Connectivity Server 2  
+#                          Srdjan Holovac <srdjan at empress.com>
+#               6323-6342  Unassigned
+sflow           6343/udp    # sFlow traffic monitoring
+sflow           6343/tcp    # sFlow traffic monitoring
+#                          Peter Phaal <peter.phaal at inmon.com> June 2003
+#               6344-6345  Unassigned
+gnutella-svc    6346/udp    # gnutella-svc
+gnutella-svc    6346/tcp    # gnutella-svc
+gnutella-rtr    6347/udp    # gnutella-rtr
+gnutella-rtr    6347/tcp    # gnutella-rtr
+#                          Serguei Osokine <osokin at paragraph.com>
+#               6348-6381  Unassigned
+metatude-mds    6382/udp    # Metatude Dialogue Server
+metatude-mds    6382/tcp    # Metatude Dialogue Server
+#                          Menno Zweistra <m.zweistra at metatude.com> 
+#               6383-6388  Unassigned
+clariion-evr01  6389/udp    # clariion-evr01
+clariion-evr01  6389/tcp    # clariion-evr01
+#                          Dave DesRoches <ddesroches at clariion.com>
+#               6390-6399  Unassigned
+# The following blocks are in use by Seagate Software 6400-6410 #
+# The previous ports are in use by Seagate Software 6400-6410 #
+# Contact for these ports is Wade Richards <Wade.Richards at Seagatesoftware.com>
+#               6411-6454  Unassigned 
+skip-cert-recv  6455/tcp    # SKIP Certificate Receive
+skip-cert-send  6456/tcp    # SKIP Certificate Send
+#                          Tom Markson <markson at osmosys.incog.com>
+#               6457-6470  Unassigned
+lvision-lm	6471/udp    # LVision License Manager
+lvision-lm	6471/tcp    # LVision License Manager
+#			   Brian McKinnon <bmk at lvision.com>
+#		6472-6499  Unassigned
+boks		6500/udp    # BoKS Master
+boks		6500/tcp    # BoKS Master
+boks_servc	6501/udp    # BoKS Servc
+boks_servc	6501/tcp    # BoKS Servc
+boks_servm	6502/udp    # BoKS Servm
+boks_servm	6502/tcp    # BoKS Servm
+boks_clntd	6503/udp    # BoKS Clntd
+boks_clntd	6503/tcp    # BoKS Clntd
+#                          Magnus Nystrom <magnus at dynas.se> 
+#		6504       Unassigned
+badm_priv	6505/udp    # BoKS Admin Private Port
+badm_priv	6505/tcp    # BoKS Admin Private Port
+badm_pub	6506/udp    # BoKS Admin Public Port
+badm_pub	6506/tcp    # BoKS Admin Public Port
+bdir_priv	6507/udp    # BoKS Dir Server, Private Port
+bdir_priv	6507/tcp    # BoKS Dir Server, Private Port
+bdir_pub	6508/udp    # BoKS Dir Server, Public Port
+bdir_pub	6508/tcp    # BoKS Dir Server, Public Port
+#			   Magnus Nystrom <magnus at dynas.se>
+mgcs-mfp-port   6509/udp    # MGCS-MFP Port
+mgcs-mfp-port   6509/tcp    # MGCS-MFP Port
+#                          Minoru Ozaki <Minoru.Ozaki at rdmg.mgcs.mei.co.jp>
+mcer-port       6510/udp    # MCER Port
+mcer-port       6510/tcp    # MCER Port
+#                          Ade Adebayo <ade at us.itmasters.com>
+#               6511-6542  Unassigned
+lds-distrib     6543/udp    # lds_distrib
+lds-distrib     6543/tcp    # lds_distrib
+#                          Jack Baker <Jack.Baker at L-3Com.com> June 2003
+#               6544-6546  Unassigned
+apc-6547        6547/udp    # APC 6547
+apc-6547        6547/tcp    # APC 6547
+apc-6548        6548/udp    # APC 6548
+apc-6548        6548/tcp    # APC 6548
+apc-6549        6549/udp    # APC 6549
+apc-6549        6549/tcp    # APC 6549
+#                          American Power Conversion <ports at apcc.com>
+fg-sysupdate	6550/udp    # fg-sysupdate
+fg-sysupdate	6550/tcp    # fg-sysupdate
+#			   Mark Beyer <mbeyer at freegate.com>
+#               6551-6557  Unassigned
+xdsxdm		6558/udp	 # 
+xdsxdm		6558/tcp	 # 
+#                          Brian Tackett <cym at acrux.net> possible contact
+#               6559-6565  Unassigned
+sane-port       6566/udp    # SANE Control Port
+sane-port       6566/tcp    # SANE Control Port
+#                          Henning Meier-Geinitz <henning at meier-geinitz.de> October 2002
+#               6567-6579  Unassigned
+parsec-master   6580/udp    # Parsec Masterserver
+parsec-master   6580/tcp    # Parsec Masterserver
+parsec-peer     6581/udp    # Parsec Peer-to-Peer
+parsec-peer     6581/tcp    # Parsec Peer-to-Peer
+parsec-game     6582/udp    # Parsec Gameserver
+parsec-game     6582/tcp    # Parsec Gameserver
+#                          Andreas Varga <sid at parsec.org>  
+#               6583-6587  Unassigned
+#               6588       Unassigned
+####Unofficial use of port 6588 by AnalogX and Microsoft####
+#               6589-6627  Unassigned
+afesc-mc        6628/udp    # AFE Stock Channel M/C
+afesc-mc        6628/tcp    # AFE Stock Channel M/C
+#                          Timothy Tam <ttam at hkcix.com> March 2003
+#               6629-6630  Unassigned
+mach            6631/udp    # Mitchell telecom host
+mach            6631/tcp    # Mitchell telecom host
+#                          Mark Derail <mderail at dmib.com> March 2003
+#               6632-6664  Unassigned
+#			   Brian Tackett <cym at acrux.net>
+vocaltec-gold   6670/udp    # Vocaltec Global Online Directory
+vocaltec-gold   6670/tcp    # Vocaltec Global Online Directory
+#                          Scott Petrack <Scott_Petrack at vocaltec.com>
+#               6671       Unassigned 
+vision_server   6672/udp    # vision_server
+vision_server   6672/tcp    # vision_server
+vision_elmd     6673/udp    # vision_elmd
+vision_elmd     6673/tcp    # vision_elmd
+#                          Chris Kramer <CKramer at gis.shl.com>
+#               6674-6700  Unassigned
+kti-icad-srvr	6701/udp    # KTI/ICAD Nameserver
+kti-icad-srvr	6701/tcp    # KTI/ICAD Nameserver
+#			   Stanley Knutson <Stanley.Knutson at KTIworld.com> 
+#               6702-6713  Unassigned
+ibprotocol      6714/udp    # Internet Backplane Protocol
+ibprotocol      6714/tcp    # Internet Backplane Protocol
+#                          Alessandro Bassi <abassi at cs.utk.edu>
+#               6715-6766  Unassigned
+bmc-perf-agent  6767/udp    # BMC PERFORM AGENT
+bmc-perf-agent  6767/tcp    # BMC PERFORM AGENT
+bmc-perf-mgrd   6768/udp    # BMC PERFORM MGRD
+bmc-perf-mgrd   6768/tcp    # BMC PERFORM MGRD   
+#                          Dima Seliverstov <Dima_Seliverstov at bmc.com>
+#               6769-6787  Unassigned  
+smc-http        6788/udp    # SMC-HTTP
+smc-http        6788/tcp    # SMC-HTTP
+#                          Ratnadeep Bhattacharjee <ratnadeep.bhattacharjee at sun.com> November 2002
+smc-https       6789/udp    # SMC-HTTPS
+smc-https       6789/tcp    # SMC-HTTPS
+#                          Ratnadeep Bhattacharjee <ratnadeep.bhattacharjee at sun.com> August 2002
+hnmp            6790/udp    # HNMP
+hnmp            6790/tcp    # HNMP
+#                          Jude George <jude at nas.nasa.gov>
+#               6791-6830  Unassigned
+ambit-lm        6831/udp    # ambit-lm
+ambit-lm        6831/tcp    # ambit-lm
+#                          Don Hejna <djhejna at ambit.com>
+#               6832-6840  Unassigned
+netmo-default	6841/udp    # Netmo Default
+netmo-default	6841/tcp    # Netmo Default
+netmo-http	6842/udp    # Netmo HTTP
+netmo-http	6842/tcp    # Netmo HTTP
+#			   Urs Bertschinger <urs at netmosphere.com>
+#               6843-6849  Unassigned 
+iccrushmore     6850/udp    # ICCRUSHMORE
+iccrushmore     6850/tcp    # ICCRUSHMORE
+#                          Dave Hubbard <dave at icc.net>
+#               6851-6887  Unassigned
+muse            6888/udp    # MUSE
+muse            6888/tcp    # MUSE
+#                          Muse Communications Corporation
+#                          <howard at muse3d.com>
+#               6889-6960  Unassigned                  
+jmact3		6961/udp    # JMACT3
+jmact3		6961/tcp    # JMACT3
+jmevt2		6962/udp    # jmevt2
+jmevt2		6962/tcp    # jmevt2
+swismgr1	6963/udp    # swismgr1
+swismgr1	6963/tcp    # swismgr1
+swismgr2	6964/udp    # swismgr2
+swismgr2	6964/tcp    # swismgr2
+swistrap	6965/udp    # swistrap
+swistrap	6965/tcp    # swistrap
+swispol		6966/udp    # swispol
+swispol		6966/tcp    # swispol
+#			   Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+#               6967-6968  Unassigned
+acmsoda         6969/udp    # acmsoda
+acmsoda         6969/tcp    # acmsoda
+#                          Daniel Simms <dsimms at acm.uiuc.edu>
+#               6970-6997  Unassigned
+iatp-highpri	6998/udp    # IATP-highPri
+iatp-highpri	6998/tcp    # IATP-highPri
+iatp-normalpri	6999/udp    # IATP-normalPri
+iatp-normalpri	6999/tcp    # IATP-normalPri
+#			   John Murphy <john.m.murphy at mci.com>
+afs3-fileserver 7000/udp    # file server itself
+afs3-fileserver 7000/tcp    # file server itself
+afs3-callback   7001/udp    # callbacks to cache managers
+afs3-callback   7001/tcp    # callbacks to cache managers
+afs3-prserver   7002/udp    # users & groups database
+afs3-prserver   7002/tcp    # users & groups database
+afs3-vlserver   7003/udp    # volume location database
+afs3-vlserver   7003/tcp    # volume location database
+afs3-kaserver   7004/udp    # AFS/Kerberos authentication service
+afs3-kaserver   7004/tcp    # AFS/Kerberos authentication service
+afs3-volser     7005/udp    # volume managment server
+afs3-volser     7005/tcp    # volume managment server
+afs3-errors     7006/udp    # error interpretation service
+afs3-errors     7006/tcp    # error interpretation service
+afs3-bos        7007/udp    # basic overseer process
+afs3-bos        7007/tcp    # basic overseer process
+afs3-update     7008/udp    # server-to-server updater
+afs3-update     7008/tcp    # server-to-server updater
+afs3-rmtsys     7009/udp    # remote cache manager service
+afs3-rmtsys     7009/tcp    # remote cache manager service
+#
+ups-onlinet     7010/udp    # onlinet uninterruptable power supplies
+ups-onlinet     7010/tcp    # onlinet uninterruptable power supplies
+#                          Brian Hammill <brianh at exide.com>
+talon-disc      7011/udp    # Talon Discovery Port
+talon-disc      7011/tcp    # Talon Discovery Port
+talon-engine    7012/udp    # Talon Engine
+talon-engine    7012/tcp    # Talon Engine
+microtalon-dis  7013/udp    # Microtalon Discovery
+microtalon-dis  7013/tcp    # Microtalon Discovery
+microtalon-com  7014/udp    # Microtalon Communications
+microtalon-com  7014/tcp    # Microtalon Communications
+talon-webserver 7015/udp    # Talon Webserver
+talon-webserver 7015/tcp    # Talon Webserver
+#                          Jack Curtin <curtinj at powerware.com>
+#               7016-7019  Unassigned
+dpserve         7020/udp    # DP Serve
+dpserve         7020/tcp    # DP Serve
+dpserveadmin    7021/udp    # DP Serve Admin
+dpserveadmin    7021/tcp    # DP Serve Admin
+#                          Allan Stanley <allan at hummingbird.com>
+#               7022-7029  Unassigned
+op-probe        7030/udp    # ObjectPlanet probe
+op-probe        7030/tcp    # ObjectPlanet probe
+#                          Bjorn Jarle Kvande <bjorn at objectplanet.com> April 2002
+#               7031-7069  Unassigned
+arcp            7070/udp    # ARCP
+arcp            7070/tcp    # ARCP
+#                          Jude George <jude at nas.nasa.gov>
+#               7071-7098  Unassigned
+lazy-ptop       7099/udp    # lazy-ptop
+lazy-ptop       7099/tcp    # lazy-ptop
+#                          Guy Keren <Guy_Keren at mail.stil.scitex.com>
+font-service    7100/udp    # X Font Service
+font-service    7100/tcp    # X Font Service
+#                          Stephen Gildea <gildea at lcs.mit.edu>
+#               7101-7120  Unassigned
+virprot-lm      7121/udp    # Virtual Prototypes License Manager
+virprot-lm      7121/tcp    # Virtual Prototypes License Manager
+#                          Victor Galis <galis at satchmo.virtualprototypes.ca>
+#               7122-7173  Unassigned
+clutild         7174/udp    # Clutild
+clutild         7174/tcp    # Clutild
+#                          Cheryl Stoutenburg <cstoutenburg at vnet.ibm.com>
+#               7175-7199  Unassigned
+fodms           7200/udp    # FODMS FLIP  
+fodms           7200/tcp    # FODMS FLIP  
+#                          David Anthony <anthony at power.amasd.anatcp.rockwell.com>
+dlip            7201/udp    # DLIP
+dlip            7201/tcp    # DLIP
+#                          Albert Manfredi <manfredi at engr05.comsys.rockwell.com>
+#               7202-7279  Unassigned
+itactionserver1 7280/udp    # ITACTIONSERVER 1
+itactionserver1 7280/tcp    # ITACTIONSERVER 1
+itactionserver2 7281/udp    # ITACTIONSERVER 2
+itactionserver2 7281/tcp    # ITACTIONSERVER 2
+#                          Brian Taylor <btaylor at imagetag.com>
+#               7282-7299  Unassigned
+#                          Edgar Blum <edgar.blum at swx.ch>
+mindfilesys     7391/udp    # mind-file system server
+mindfilesys     7391/tcp    # mind-file system server
+mrssrendezvous  7392/udp    # mrss-rendezvous server
+mrssrendezvous  7392/tcp    # mrss-rendezvous server
+#                          Dave Porter <porter at mango.com>   
+#               7393-7394  Unassigned
+winqedit        7395/udp    # winqedit
+winqedit        7395/tcp    # winqedit
+#                          David Greer <david_greer at robelle.com>
+#               7396-7425  Unassigned
+pmdmgr          7426/udp    # OpenView DM Postmaster Manager
+pmdmgr          7426/tcp    # OpenView DM Postmaster Manager
+oveadmgr        7427/udp    # OpenView DM Event Agent Manager
+oveadmgr        7427/tcp    # OpenView DM Event Agent Manager
+ovladmgr        7428/udp    # OpenView DM Log Agent Manager
+ovladmgr        7428/tcp    # OpenView DM Log Agent Manager
+opi-sock        7429/udp    # OpenView DM rqt communication
+opi-sock        7429/tcp    # OpenView DM rqt communication
+xmpv7           7430/udp    # OpenView DM xmpv7 api pipe
+xmpv7           7430/tcp    # OpenView DM xmpv7 api pipe
+pmd             7431/udp    # OpenView DM ovc/xmpv3 api pipe
+pmd             7431/tcp    # OpenView DM ovc/xmpv3 api pipe
+#                          Dave Lamb <rdl at rdl.cnd.hp.com>
+faximum         7437/udp    # Faximum
+faximum         7437/tcp    # Faximum
+#                          George Pajari <George.Pajari at faximum.com>
+#               7438-7490  Unassigned
+telops-lmd      7491/udp    # telops-lmd
+telops-lmd      7491/tcp    # telops-lmd
+#                          David Spencer <dspencer at telops.com>
+#               7492-7499  Unassigned
+#               7500       Unassigned       
+ovbus           7501/udp    # HP OpenView Bus Daemon
+ovbus           7501/tcp    # HP OpenView Bus Daemon
+#                          David M. Rhodes <davidrho at cnd.hp.com>
+#               7502-7509  Unassigned
+ovhpas          7510/udp    # HP OpenView Application Server
+ovhpas          7510/tcp    # HP OpenView Application Server
+#                          Jeff Conrad <jeff_conrad at hp.com>
+pafec-lm        7511/udp    # pafec-lm
+pafec-lm        7511/tcp    # pafec-lm
+#                          Billy Dhillon <bdsos at pafec.co.uk>
+#               7512-7543  Unassigned
+nta-ds          7544/udp    # FlowAnalyzer DisplayServer
+nta-ds          7544/tcp    # FlowAnalyzer DisplayServer
+nta-us          7545/udp    # FlowAnalyzer UtilityServer
+nta-us          7545/tcp    # FlowAnalyzer UtilityServer
+#                          Fred Messinger <fredm at cisco.com>
+#               7546-7565  Unassigned
+vsi-omega       7566/udp    # VSI Omega
+vsi-omega       7566/tcp    # VSI Omega	
+#                          Curtis Smith <curtis.smith at vsin.com>
+#               7567-7569   Unassigned
+aries-kfinder   7570/udp     # Aries Kfinder
+aries-kfinder   7570/tcp     # Aries Kfinder
+#                           James King, III <jking at ariessys.com>
+#               7571-7587   Unassigned
+sun-lm          7588/udp     # Sun License Manager
+sun-lm          7588/tcp     # Sun License Manager
+#                           Sophie Deng <Sophie.Deng at Eng.Sun.COM>
+#               7589-7623   Unassigned
+indi            7624/udp     # Instrument Neutral Distributed Interface
+indi            7624/tcp     # Instrument Neutral Distributed Interface
+#                           Elwood Downey <ecdowney at clearskyinstitute.com> April 2002
+#               7625-7632   Unassigned
+pmdfmgt         7633/udp     # PMDF Management
+pmdfmgt         7633/tcp     # PMDF Management
+#                           Hunter Goatley <goathunter at goatley.com>
+#               7634-7673   Unassigned
+imqtunnels      7674/udp     # iMQ SSL tunnel
+imqtunnels      7674/tcp     # iMQ SSL tunnel
+imqtunnel       7675/udp     # iMQ Tunnel
+imqtunnel       7675/tcp     # iMQ Tunnel
+#                           Shailesh S. Bavadekar <shailesh.bavadekar at sun.com> April 2002
+imqbrokerd      7676/udp     # iMQ Broker Rendezvous
+imqbrokerd      7676/tcp     # iMQ Broker Rendezvous
+#                           Joseph Di Pol <joe.dipol at sun.com> April 2002
+#               7677-7742   Unassigned
+sstp-1          7743/udp     # Sakura Script Transfer Protocol
+sstp-1          7743/tcp     # Sakura Script Transfer Protocol
+#                           Kouichi Takeda <KHBO5271 at nifty.com>
+#               7744-7776   Unassigned
+cbt             7777/udp     # cbt
+cbt             7777/tcp     # cbt
+#                           Tony Ballardie <A.Ballardie at cs.ucl.ac.uk>
+interwise       7778/udp     # Interwise
+interwise       7778/tcp     # Interwise
+#                           Joseph Gray <gray at interwise.co.il>
+vstat           7779/udp     # VSTAT
+vstat           7779/tcp     # VSTAT
+#                           Vinh Nguyn <vinh at sportvision.com>
+#               7780        Unassigned
+accu-lmgr       7781/udp     # accu-lmgr
+accu-lmgr       7781/tcp     # accu-lmgr
+#                           Moises E. Hernandez <moises at accugraph.com>
+#               7782-7785   Unassigned
+minivend        7786/udp     # MINIVEND
+minivend        7786/tcp     # MINIVEND
+#                           Mike Heins <mike at minivend.com>
+#               7787-7796   Unassigned
+pnet-conn       7797/udp     # Propel Connector port
+pnet-conn       7797/tcp     # Propel Connector port
+pnet-enc        7798/udp     # Propel Encoder port
+pnet-enc        7798/tcp     # Propel Encoder port
+#                           Leif Hedstrom <leif at propel.com> April 2002
+#               7799-7844   Unassigned
+apc-7845        7845/udp     # APC 7845
+apc-7845        7845/tcp     # APC 7845
+apc-7846        7846/udp     # APC 7846
+apc-7846        7846/tcp     # APC 7846
+#                           American Power Conversion <ports at apcc.com>
+#               7847-7912   Unassigned
+qo-secure       7913/udp     # QuickObjects secure port
+qo-secure       7913/tcp     # QuickObjects secure port
+#                           Jonas Bovin <jonas.bovin at quickobjects.com>  
+#               7914-7931   Unassigned
+t2-drm          7932/udp     # Tier 2 Data Resource Manager
+t2-drm          7932/tcp     # Tier 2 Data Resource Manager
+t2-brm          7933/udp     # Tier 2 Business Rules Manager
+t2-brm          7933/tcp     # Tier 2 Business Rules Manager
+#                           Peter Carlson <pcarlson at tier2.com>
+#               7934-7966   Unassigned
+supercell       7967/udp     # Supercell
+supercell       7967/tcp     # Supercell
+#                           Kevin Nakagawa <nakagawa at sigsci.com>
+#               7968-7978   Unassigned     
+micromuse-ncps  7979/udp     # Micromuse-ncps
+micromuse-ncps  7979/tcp     # Micromuse-ncps
+#                           Hing Wing To <wing.to at mircromuse.com>
+quest-vista     7980/udp     # Quest Vista
+quest-vista     7980/tcp     # Quest Vista
+#                           Preston Bannister <pbannister at quests.com>
+#               7981-7998   Unassigned
+irdmi2          7999/udp     # iRDMI2
+irdmi2          7999/tcp     # iRDMI2
+irdmi           8000/udp     # iRDMI
+irdmi           8000/tcp     # iRDMI
+#                           Gil Shafriri <shafriri at ilccm1.iil.intel.com>
+vcom-tunnel	8001/udp     # VCOM Tunnel
+vcom-tunnel	8001/tcp     # VCOM Tunnel
+#			    Mark Lewandowski <mlewan0 at us.ibm.com>
+teradataordbms	8002/udp     # Teradata ORDBMS
+teradataordbms	8002/tcp     # Teradata ORDBMS
+#			    Curt Ellmann <curt.ellmann at ncr.com>
+#               8003-8007   Unassigned 
+http-alt	8008/udp     # HTTP Alternate
+http-alt	8008/tcp     # HTTP Alternate
+#			    James Gettys <jg at w3.org>
+#               8009-8021   Unassigned
+oa-system       8022/udp     # oa-system 
+oa-system       8022/tcp     # oa-system
+#                           Denis Girault <Denis.Girault at evidian.com> 
+#               8023-8031   Unassigned
+pro-ed		8032/udp     # ProEd
+pro-ed		8032/tcp     # ProEd
+mindprint	8033/udp     # MindPrint
+mindprint	8033/tcp     # MindPrint
+#			    Larry Tusoni <larry at goldrush.com>
+#               8034-8079   Unassigned
+http-alt	8080/udp     # HTTP Alternate (see port 80)
+http-alt	8080/tcp     # HTTP Alternate (see port 80)
+#			    Stephen Casner <casner at precpt.com>
+#               8081-8087   Unassigned
+radan-http      8088/udp     # Radan HTTP
+radan-http      8088/tcp     # Radan HTTP
+#                           Steve Hay <Steve.Hay at uk.radan.com> April 2002
+#               8089-8099   Unassigned
+xprint-server   8100/udp     # Xprint Server
+xprint-server   8100/tcp     # Xprint Server
+#                           John McKernan <John.McKernan at sun.com>
+#               8101-8114   Unassigned
+mtl8000-matrix  8115/udp     # MTL8000 Matrix
+mtl8000-matrix  8115/tcp     # MTL8000 Matrix
+#                           David Pinch <dpinch at mtl-inst.com> April 2002
+cp-cluster      8116/udp     # Check Point Clustering
+cp-cluster      8116/tcp     # Check Point Clustering
+#                           Roni Moshitzky <rmosh at checkpoint.com>
+#               8117        Unassigned
+privoxy         8118/udp     # Privoxy HTTP proxy
+privoxy         8118/tcp     # Privoxy HTTP proxy
+#                           Andreas Oesterhelt <oes at privoxy.org> June 2002
+#               8119-8129   Unassigned
+indigo-vrmi     8130/udp     # INDIGO-VRMI
+indigo-vrmi     8130/tcp     # INDIGO-VRMI
+indigo-vbcp     8131/udp     # INDIGO-VBCP
+indigo-vbcp     8131/tcp     # INDIGO-VBCP
+#                           Colin Caughie <cfc at indigo-avs.com>
+dbabble	        8132/udp     # dbabble
+dbabble         8132/tcp     # dbabble
+#                           Chris Pugmire <chrisp at netwinsite.com>        
+#               8133-8159   Unassigned
+patrol		8160/udp     # Patrol
+patrol		8160/tcp     # Patrol
+patrol-snmp	8161/udp     # Patrol SNMP
+patrol-snmp	8161/tcp     # Patrol SNMP
+#			    Daisy Tam <Daisy_Tam at bmc.com>
+#               8162-8198   Unassigned
+vvr-data        8199/udp     # VVR DATA
+vvr-data        8199/tcp     # VVR DATA
+#                           Ming Xu <ming at veritas.com>
+trivnet1	8200/udp     # TRIVNET
+trivnet1	8200/tcp     # TRIVNET
+trivnet2	8201/udp     # TRIVNET
+trivnet2	8201/tcp     # TRIVNET
+#			    Saar Wilf <saar at trivnet.com>
+#               8202-8203   Unassigned
+lm-perfworks	8204/udp     # LM Perfworks
+lm-perfworks	8204/tcp     # LM Perfworks
+lm-instmgr	8205/udp     # LM Instmgr
+lm-instmgr	8205/tcp     # LM Instmgr
+lm-dta		8206/udp     # LM Dta
+lm-dta		8206/tcp     # LM Dta
+lm-sserver	8207/udp     # LM SServer
+lm-sserver	8207/tcp     # LM SServer
+lm-webwatcher	8208/udp     # LM Webwatcher
+lm-webwatcher	8208/tcp     # LM Webwatcher
+#			    Chris Flynn <cflynn at landmark.com>
+#               8209-8350   Unassigned
+server-find	8351/udp     # Server Find
+server-find	8351/tcp     # Server Find
+#			    Chris Brown <chrisb at chancery.com>
+#               8352-8375   Unassigned
+cruise-enum	8376/udp     # Cruise ENUM
+cruise-enum	8376/tcp     # Cruise ENUM
+cruise-swroute	8377/udp     # Cruise SWROUTE
+cruise-swroute	8377/tcp     # Cruise SWROUTE
+cruise-config	8378/udp     # Cruise CONFIG
+cruise-config	8378/tcp     # Cruise CONFIG
+cruise-diags	8379/udp     # Cruise DIAGS
+cruise-diags	8379/tcp     # Cruise DIAGS
+cruise-update	8380/udp     # Cruise UPDATE
+cruise-update	8380/tcp     # Cruise UPDATE
+#			    Steve Husak <portmaster at cruisetech.com>   
+#               8381-8399   Unassigned
+cvd		8400/udp     # cvd
+cvd		8400/tcp     # cvd
+sabarsd		8401/udp     # sabarsd
+sabarsd		8401/tcp     # sabarsd
+abarsd		8402/udp     # abarsd
+abarsd		8402/tcp     # abarsd
+admind		8403/udp     # admind
+admind		8403/tcp     # admind
+#			    Aaron Bilbrey <abilbrey at commvault.com>
+#               8404-8415   Unassigned
+espeech         8416/udp     # eSpeech Session Protocol
+espeech         8416/tcp     # eSpeech Session Protocol
+#                           Scott Tarone <starone at proactivethought.com> November 2002
+espeech-rtp     8417/udp    # eSpeech RTP Protocol
+espeech-rtp     8417/tcp    # eSpeech RTP Protocol
+#                          Scott Tarone <starone at proactivethought.com> April 2003
+#               8418-8442   Unassigned
+pcsync-https    8443/udp     # PCsync HTTPS
+pcsync-https    8443/tcp     # PCsync HTTPS
+pcsync-http     8444/udp     # PCsync HTTP
+pcsync-http     8444/tcp     # PCsync HTTP
+#                           Katy Lynn McCullough <KatyM at LapLink.com>
+#               8445-8449   Unassigned 
+npmp            8450/udp     # npmp
+npmp            8450/tcp     # npmp
+#                           Ian Chard <ian at tanagra.demon.co.uk>
+#               8451-8472   Unassigned
+vp2p            8473/udp     # Virtual Point to Point
+vp2p            8473/tcp     # Virtual Point to Point
+#                           Jerome Grimbert <jerome.grimbert at atosorigin.com>
+#               8474-8553   Unassigned
+rtsp-alt        8554/udp     # RTSP Alternate (see port 554)
+rtsp-alt        8554/tcp     # RTSP Alternate (see port 554)
+#                           Stephen Casner <casner at precept.com>
+d-fence         8555/udp     # SYMAX D-FENCE
+d-fence         8555/tcp     # SYMAX D-FENCE
+#                           Thomas Geisel <tgeisel at symax.de> January 2003
+#               8556-8667   Unassigned
+natd            8668/divert # Network Address Translation
+#               8669-8732   Unassigned
+ibus		8733/udp     # iBus
+ibus		8733/tcp     # iBus
+#			    Silvano Maffeis <maffeis at softwired.ch>
+#               8734-8762   Unassigned
+mc-appserver    8763/udp     # MC-APPSERVER
+mc-appserver    8763/tcp     # MC-APPSERVER
+#                           Romeo Kasanwidjojo <romeo at microcomgroup.com>       
+openqueue       8764/udp     # OPENQUEUE
+openqueue       8764/tcp     # OPENQUEUE
+#                           Matt Jensen <mattj at newsblip.com>                   
+ultraseek-http	8765/udp     # Ultraseek HTTP
+ultraseek-http	8765/tcp     # Ultraseek HTTP
+#			    Walter Underwood <wunder at infoseek.com>
+#               8766-8785   Unassigned
+msgclnt         8786/udp     # Message Client
+msgclnt         8786/tcp     # Message Client
+msgsrvr         8787/udp     # Message Server
+msgsrvr         8787/tcp     # Message Server
+#                           Michael O'Brien <mobrien02 at attbi.com> March 2003
+#               8788-8803   Unassigned
+truecm          8804/udp     # truecm
+truecm          8804/tcp     # truecm
+#                           Scott Kramer <scottk at truebluesoftware.com>
+#               8805-8879           
+cddbp-alt	8880/udp     # CDDBP
+cddbp-alt	8880/tcp     # CDDBP
+#			    Steve Scherf <steve at moonsoft.com>
+#               8881-8887   Unassigned
+ddi-udp-1       8888/udp     # NewsEDGE server UDP (UDP 1)
+ddi-tcp-1       8888/tcp     # NewsEDGE server TCP (TCP 1)
+ddi-udp-2       8889/udp     # NewsEDGE server broadcast
+ddi-tcp-2       8889/tcp     # Desktop Data TCP 1
+ddi-udp-3       8890/udp     # NewsEDGE client broadcast
+ddi-tcp-3       8890/tcp     # Desktop Data TCP 2
+ddi-udp-4       8891/udp     # Desktop Data UDP 3: NESS application
+ddi-tcp-4       8891/tcp     # Desktop Data TCP 3: NESS application
+ddi-udp-5       8892/udp     # Desktop Data UDP 4: FARM product
+ddi-tcp-5       8892/tcp     # Desktop Data TCP 4: FARM product
+ddi-udp-6       8893/udp     # Desktop Data UDP 5: NewsEDGE/Web application
+ddi-tcp-6       8893/tcp     # Desktop Data TCP 5: NewsEDGE/Web application
+ddi-udp-7       8894/udp     # Desktop Data UDP 6: COAL application
+ddi-tcp-7       8894/tcp     # Desktop Data TCP 6: COAL application
+#                           Fred Yao <Fred_Yao at DDIGATE2.desktopdata.com>
+#               8895-8899   Unassigned 
+jmb-cds1        8900/udp     # JMB-CDS 1
+jmb-cds1        8900/tcp     # JMB-CDS 1
+jmb-cds2        8901/udp     # JMB-CDS 2
+jmb-cds2        8901/tcp     # JMB-CDS 2
+#			    Curtis Bray <CurtisB at creativedesign.com>
+#               8902-8909   Unassigned
+manyone-http    8910/udp     # manyone-http
+manyone-http    8910/tcp     # manyone-http
+manyone-xml     8911/udp     # manyone-xml
+manyone-xml     8911/tcp     # manyone-xml
+#                           Matt King <m at manyone.net> April 2002
+#               8912-8953   Unassigned
+cumulus-admin   8954/udp     # Cumulus Admin Port
+cumulus-admin   8954/tcp     # Cumulus Admin Port
+#                           Thomas Schleu <tschleu at canto.de>
+#               8955-8998   Unassigned
+bctp            8999/udp     # Brodos Crypto Trade Protocol
+bctp            8999/tcp     # Brodos Crypto Trade Protocol
+#                           Alexander Sahler <alexander.sahler at brodos.de> February 2002
+cslistener      9000/udp     # CSlistener
+cslistener      9000/tcp     # CSlistener
+#                           David Jones <djones at cincom.com>
+etlservicemgr   9001/udp     # ETL Service Manager
+etlservicemgr   9001/tcp     # ETL Service Manager
+#                           Stephen McCrea <smccrea at etlelectronique.com> March 2002
+dynamid         9002/udp     # DynamID authentication
+dynamid         9002/tcp     # DynamID authentication
+#                           Jerome Dusautois <jdusautois at scrypto.fr> March 2002
+#               9003-9005   Unassigned
+#               9006        De-Commissioned Port 02/24/00, ms
+#               9007-9019   Unassigned
+tambora         9020/udp     # TAMBORA
+tambora         9020/tcp     # TAMBORA
+#                           Jason van Zyl <jvanzyl at zenplex.com> March 2002
+panagolin-ident 9021/udp     # Pangolin Identification
+panagolin-ident 9021/tcp     # Pangolin Identification
+#                           William Benner <bill at pangolin.com> March 2002
+paragent        9022/udp     # PrivateArk Remote Agent
+paragent        9022/tcp     # PrivateArk Remote Agent
+#                           Gal Cucuy <galc at cyber-ark.com> March 2002
+swa-1           9023/udp     # Secure Web Access - 1
+swa-1           9023/tcp     # Secure Web Access - 1
+swa-2           9024/udp     # Secure Web Access - 2
+swa-2           9024/tcp     # Secure Web Access - 2
+swa-3           9025/udp     # Secure Web Access - 3
+swa-3           9025/tcp     # Secure Web Access - 3
+swa-4           9026/udp     # Secure Web Access - 4
+swa-4           9026/tcp     # Secure Web Access - 4
+#                           Tim McGranaghan <tim_mcgranaghan at mech.disa.mil>
+#               9027-9079   Unassigned
+glrpc           9080/udp     # Groove GLRPC
+glrpc           9080/tcp     # Groove GLRPC
+#                           Adrian Popescu <Adrian_Popescu at groove.net> September 2002
+#               9081-9089   Unassigned
+websm           9090/udp     # WebSM
+websm           9090/tcp     # WebSM
+#                           I-Hsing Tsao <itsao at austin.ibm.com>
+xmltec-xmlmail  9091/udp     # xmltec-xmlmail
+xmltec-xmlmail  9091/tcp     # xmltec-xmlmail
+#                           Mitch Kaufman <mk at weconnectyou.com>
+#               9092-9099   Unassigned
+hp-pdl-datastr  9100/udp     # PDL Data Streaming Port
+hp-pdl-datastr  9100/tcp     # PDL Data Streaming Port
+#                           Shivaun Albright <shivaun_albright at hp.com> April 2002
+#### The protocol name "pdl-datastream" is primarily registered for use #### 
+#### in DNS SRV records (RFC 2782). DNS SRV records allow a protocol to run on ####
+#### any port number, but the default port for this protocol is 9100 ####.
+pdl-datastream  9100/udp     # Printer PDL Data Stream 
+pdl-datastream  9100/tcp     # Printer PDL Data Stream 
+bacula-dir      9101/udp     # Bacula Director
+bacula-dir      9101/tcp     # Bacula Director
+bacula-fd       9102/udp     # Bacula File Daemon
+bacula-fd       9102/tcp     # Bacula File Daemon  
+bacula-sd       9103/udp     # Bacula Storage Daemon
+bacula-sd       9103/tcp     # Bacula Storage Daemon
+#                           Kern Sibbald <kern at sibbald.com>  January 2002
+#               9104-9159   Unassigned
+netlock1	9160/udp     # NetLOCK1
+netlock1	9160/tcp     # NetLOCK1
+netlock2	9161/udp     # NetLOCK2
+netlock2	9161/tcp     # NetLOCK2
+netlock3	9162/udp     # NetLOCK3
+netlock3	9162/tcp     # NetLOCK3
+netlock4	9163/udp     # NetLOCK4
+netlock4	9163/tcp     # NetLOCK4
+netlock5	9164/udp     # NetLOCK5
+netlock5	9164/tcp     # NetLOCK5
+#			    Steven Sawkins <ssawkins at netlock.com>
+#               9165-9199   Unassigned
+wap-wsp		9200/udp     # WAP connectionless session service
+wap-wsp		9200/tcp     # WAP connectionless session service
+wap-wsp-wtp	9201/udp     # WAP session service
+wap-wsp-wtp	9201/tcp     # WAP session service
+wap-wsp-s	9202/udp     # WAP secure connectionless session service
+wap-wsp-s	9202/tcp     # WAP secure connectionless session service
+wap-wsp-wtp-s	9203/udp     # WAP secure session service
+wap-wsp-wtp-s	9203/tcp     # WAP secure session service
+wap-vcard	9204/udp     # WAP vCard
+wap-vcard	9204/tcp     # WAP vCard
+wap-vcal	9205/udp     # WAP vCal
+wap-vcal	9205/tcp     # WAP vCal
+wap-vcard-s	9206/udp     # WAP vCard Secure
+wap-vcard-s	9206/tcp     # WAP vCard Secure
+wap-vcal-s	9207/udp     # WAP vCal Secure
+wap-vcal-s	9207/tcp     # WAP vCal Secure
+#                           WAP Forum <wap-feedback at mail.wapforum.org>	
+#                           WAP Forum <pg at uplanet.com>
+#               9208-9209   Unassigned
+lif-mlp         9210/udp     # LIF Mobile Locn Protocol
+lif-mlp         9210/tcp     # LIF Mobile Locn Protocol
+lif-mlp-s       9211/udp     # LIF Mobile Locn Secure
+lif-mlp-s       9211/tcp     # LIF Mobile Locn Secure
+#                           Location Interoperability Forum
+#                           <greening at bigtribe.com> April 2002
+#               9212-9216   Unassigned
+fsc-port        9217/udp     # FSC Communication Port
+fsc-port        9217/tcp     # FSC Communication Port
+#                           Teijo Mustonen <Teijo.Mustonen at F-Secure.com> March 2002
+#               9218-9280   Unassigned
+swtp-port1      9281/udp     # SofaWare transport port 1
+swtp-port1      9281/tcp     # SofaWare transport port 1
+swtp-port2      9282/udp     # SofaWare transport port 2
+swtp-port2      9282/tcp     # SofaWare transport port 2
+#                           Amir Rapson <rapson at sofaware.com> February 2002
+callwaveiam     9283/udp     # CallWaveIAM
+callwaveiam     9283/tcp     # CallWaveIAM
+#                           Colin Kelley <cdk at callwave.com> 
+visd            9284/udp     # VERITAS Information Serve
+visd            9284/tcp     # VERITAS Information Serve
+#                           Ravi Tavakely <ravi.tavakley at veritas.com> February 2002
+n2h2server      9285/udp     # N2H2 Filter Service Port
+n2h2server      9285/tcp     # N2H2 Filter Service Port
+#                           Jim Irwin <jirwin at n2h2.com> February 2002
+#               9286        Unassigned
+cumulus		9287/udp     # Cumulus
+cumulus         9287/tcp     # Cumulus
+#                           Thomas Schleu <tschleu at canto.de>                  
+#               9288-9291   Unassigned
+armtechdaemon   9292/udp     # ArmTech Daemon
+armtechdaemon   9292/tcp     # ArmTech Daemon
+#                           Rohan Story <rohan at aurema.com>
+#               9293-9320   Unassigned 
+guibase		9321/udp     # guibase
+guibase		9321/tcp     # guibase
+#			    Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+#               9322-9342   Unassigned
+mpidcmgr	9343/udp     # MpIdcMgr
+mpidcmgr	9343/tcp     # MpIdcMgr
+mphlpdmc	9344/udp     # Mphlpdmc
+mphlpdmc	9344/tcp     # Mphlpdmc
+#			    Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+#               9345        Unassigned    
+ctechlicensing  9346/udp     # C Tech Licensing
+ctechlicensing  9346/tcp     # C Tech Licensing
+#                           Reed Copsey, Jr. <reedc at ctech.com>       
+#               9347-9373   Unassigned
+fjdmimgr	9374/udp     # fjdmimgr
+fjdmimgr	9374/tcp     # fjdmimgr
+#			    Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+#               9375-9395   Unassigned
+fjinvmgr	9396/udp     # fjinvmgr
+fjinvmgr	9396/tcp     # fjinvmgr
+mpidcagt	9397/udp     # MpIdcAgt
+mpidcagt	9397/tcp     # MpIdcAgt
+#			    Yutaka Ono <ono at saint.nm.fujitsu.co.jp>
+#               9398-9499   Unassigned
+ismserver	9500/udp     # ismserver
+ismserver	9500/tcp     # ismserver
+#			    Ian Gordon <iang at micromuse.co.uk>
+#               9501-9534   Unassigned
+mngsuite        9535/udp     # Management Suite Remote Control
+mngsuite        9535/tcp     # Management Suite Remote Control
+#                           Alan Butt <alan.butt at landesk.com>
+#               9536-9593   Unassigned
+msgsys          9594/udp     # Message System
+msgsys          9594/tcp     # Message System
+pds             9595/udp     # Ping Discovery Service
+pds             9595/tcp     # Ping Discovery Service
+#                           Alan Butt <alan.butt at landesk.com>
+#               9596-9599   Unassigned
+micromuse-ncpw  9600/udp     # MICROMUSE-NCPW
+micromuse-ncpw  9600/tcp     # MICROMUSE-NCPW
+#                           Hing Wing To <wing.to at micromuse.com>
+#               9601-9611   Unassigned
+streamcomm-ds	9612/udp     # StreamComm User Directory
+streamcomm-ds   9612/tcp     # StreamComm User Directory
+#                           Brian C. Wiles <brian at streamcomm.com>
+#               9613-9746   Unassigned
+l5nas-parchan   9747/udp     # L5NAS Parallel Channel
+l5nas-parchan   9747/tcp     # L5NAS Parallel Channel
+#                           Lawrence J. Dickson - Land-5 Corporation
+#                           <ldickson at land-5.com> March 2002             
+#               9748-9752   Unassigned
+rasadv		9753/udp     # rasadv
+rasadv		9753/tcp     # rasadv
+#			    Dave Thaler <dthaler at microsoft.com>
+#               9754-9799   Unassigned
+davsrc          9800/udp     # WebDav Source Port
+davsrc          9800/tcp     # WebDav Source Port
+#                           Ethan Fremen <mindlace at digicool.com>
+sstp-2          9801/udp     # Sakura Script Transfer Protocol-2
+sstp-2          9801/tcp     # Sakura Script Transfer Protocol-2
+#                           Kouichi Takeda <KHB05271 at nifty.com>
+#               9802-9874   Unassigned
+sapv1           9875/udp     # Session Announcement v1
+sapv1           9875/tcp     # Session Announcement v1
+#                           RFC 2974 <ftp://ftp.isi.edu/in-notes/rfc2974.txt>
+sd              9876/udp     # Session Director
+sd              9876/tcp     # Session Director
+#                           Van Jacobson <van at ee.lbl.gov>
+cyborg-systems	9888/udp     # CYBORG Systems
+cyborg-systems	9888/tcp     # CYBORG Systems
+#			    Malcolm Graham <Malcolm_Graham at CYBORG.COM>
+monkeycom	9898/udp     # MonkeyCom
+monkeycom	9898/tcp     # MonkeyCom
+#			    Yuji Kuwabara <HHG01200 at niftyserve.or.jp>
+sctp-tunneling  9899/udp     # SCTP TUNNELING
+sctp-tunneling  9899/tcp     # SCTP TUNNELING
+iua             9900/sctp    # IUA  
+iua             9900/udp     # IUA
+iua             9900/tcp     # IUA
+#                           Lyndon Ong <LyOng at ciena.com>
+#		9901-9908   Unassigned
+domaintime      9909/udp    # domaintime
+domaintime      9909/tcp    # domaintime
+#                          Jeffry Dwight <jeffryd at greyware.com>
+#               9910       Unassigned
+sype-transport  9911/udp    # SYPECom Transport Protocol
+sype-transport  9911/tcp    # SYPECom Transport Protocol
+#                          Sylvain Pedneault <sylvain at sypecom.qc.ca> March 2003    
+#               9912-9949  Unassigned
+apc-9950        9950/udp    # APC 9950
+apc-9950        9950/tcp    # APC 9950
+apc-9951        9951/udp    # APC 9951
+apc-9951        9951/tcp    # APC 9951 
+apc-9952        9952/udp    # APC 9952
+apc-9952        9952/tcp    # APC 9952
+#                          American Power Conversion <ports at apcc.com>
+#		9953-9991   Unassigned
+palace-1        9992/udp     # OnLive-1
+palace-1        9992/tcp     # OnLive-1
+palace-2        9993/udp     # OnLive-2
+palace-2        9993/tcp     # OnLive-2
+palace-3        9994/udp     # OnLive-3
+palace-3        9994/tcp     # OnLive-3
+palace-4        9995/udp     # Palace-4
+palace-4        9995/tcp     # Palace-4
+palace-5        9996/udp     # Palace-5
+palace-5        9996/tcp     # Palace-5
+palace-6	9997/udp     # Palace-6
+palace-6	9997/tcp     # Palace-6
+#			    Douglas Crockford <crock at communities.com>
+distinct32      9998/udp     # Distinct32
+distinct32      9998/tcp     # Distinct32
+distinct        9999/udp    # distinct
+distinct        9999/tcp    # distinct
+#                          Anoop Tewari <anoop at next.distinct.com>
+ndmp            10000/udp   # Network Data Management Protocol
+ndmp            10000/tcp   # Network Data Management Protocol
+#                          Brian Ehrmantraut <bae at netapp.com>
+scp-config      10001/udp   # SCP Configuration Port
+scp-config      10001/tcp   # SCP Configuration Port
+#                          Brad Strand <brad.strand at 3ware.com>
+#	        10002-10006 Unassigned
+mvs-capacity	10007/udp   # MVS Capacity
+mvs-capacity	10007/tcp   # MVS Capacity
+#                          Donna Dillenberger <engd at us.ibm.com>
+octopus         10008/udp   # Octopus Multiplexer
+octopus         10008/tcp   # Octopus Multiplexer
+#                          Chris Koeritz <fred at gruntose.com> October 2002
+#               10009-10079 Unassigned
+amanda          10080/udp   # Amanda 
+amanda          10080/tcp   # Amanda 
+#                          John Jackson <jrj at gandalf.cc.purdue.edu>
+#                          <amanda-core at amanda.org>
+#               10081-10100 Unassigned
+ezmeeting-2     10101/udp   # eZmeeting
+ezmeeting-2     10101/tcp   # eZmeeting
+ezproxy-2       10102/udp   # eZproxy
+ezproxy-2       10102/tcp   # eZproxy
+ezrelay         10103/udp   # eZrelay
+ezrelay         10103/tcp   # eZrelay
+#                          Albert C. Yang <albert.yang at eZmeeting.com> March 2002
+#               10104-10112 Unassigned
+netiq-endpoint  10113/udp   # NetIQ Endpoint
+netiq-endpoint  10113/tcp   # NetIQ Endpoint
+netiq-qcheck    10114/udp   # NetIQ Qcheck
+netiq-qcheck    10114/tcp   # NetIQ Qcheck
+#                          John Wood <John.Wood at netiq.com> 
+netiq-endpt	10115/udp   # NetIQ Endpoint
+netiq-endpt     10115/tcp   # NetIQ Endpoint
+#			   Gary Weichinger <gary.weichinger at netiq.com>
+netiq-voipa     10116/udp   # NetIQ VoIP Assessor
+netiq-voipa     10116/tcp   # NetIQ VoIP Assessor
+#                          Gary Weichinger <gary.weichinger at netiq.com>
+#		10117-10127 Unassigned
+bmc-perf-sd     10128/udp   # BMC-PERFORM-SERVICE DAEMON
+bmc-perf-sd     10128/tcp   # BMC-PERFORM-SERVICE DAEMON
+#                          Dima Seliverstov <Dima_Seliverstov at bmc.com> 
+#               10129-10259 Unassigned
+axis-wimp-port  10260/udp   # Axis WIMP Port
+axis-wimp-port  10260/tcp   # Axis WIMP Port
+#                          Stefan Eriksson <contact-iana at axis.com>
+#               10261-10287 Unassigned
+blocks		10288/udp   # Blocks 
+blocks		10288/tcp   # Blocks 
+#			   Carl Malamud
+#		10289-10989 Unassigned
+rmiaux          10990/udp   # Auxiliary RMI Port
+rmiaux          10990/tcp   # Auxiliary RMI Port
+#                          Eugen Bacic <eugen at texar.com>
+#               10991-10999 Unassigned
+irisa		11000/udp   # IRISA
+irisa		11000/tcp   # IRISA
+#			   Vladimir Brauner <vbrauner at datamedia.fr>
+metasys		11001/udp   # Metasys
+metasys		11001/tcp   # Metasys
+#			   Tobin Schuster <tobin.j.schuster at jci.com>
+#               11002-11110 Unassigned
+vce		11111/udp   # Viral Computing Environment (VCE)
+vce		11111/tcp   # Viral Computing Environment (VCE)
+#			   Fred Cohen <fc at all.net>
+#               11112-11200 Unassigned
+smsqp           11201/udp   # smsqp
+smsqp           11201/tcp   # smsqp
+#                          Andres Seco Hernandez <AndresSH at alamin.org>
+#               11202-11318 Unassigned
+imip            11319/udp    # IMIP
+imip            11319/tcp    # IMIP
+#                           IM Unified Coalition, Len Zuvela
+#                           <imu-comments at egroups.com>
+imip-channels   11320/udp    # IMIP Channels Port
+imip-channels   11320/tcp    # IMIP Channels Port
+#                           Len Zuvela <lenz at microsoft.com>
+arena-server    11321/udp    # Arena Server Listen
+arena-server    11321/tcp    # Arena Server Listen
+#                           Earl Brannigan <earl.brannigan at lindenhous.co.uk>
+#               11322-11366 Unassigned
+atm-uhas        11367/udp    # ATM UHAS
+atm-uhas        11367/tcp    # ATM UHAS
+#                           Todd Barker <toddba at attachmate.com>
+#               11368-11370 Unassigned
+hkp             11371/udp    # OpenPGP HTTP Keyserver
+hkp             11371/tcp    # OpenPGP HTTP Keyserver
+#                           David Shaw <dshaw at jabberwocky.com> May 2003 
+#               11372-11599 Unassigned
+tempest-port    11600/udp    # Tempest Protocol Port
+tempest-port    11600/tcp    # Tempest Protocol Port
+#                           Francis Cianfrocca <francis at tempest.com>
+#               11601-11719 Unassigned
+h323callsigalt  11720/udp    # h323 Call Signal Alternate
+h323callsigalt  11720/tcp    # h323 Call Signal Alternate
+#                           Chris White <cjwhite at cisco.com>
+#               11721-11750 Unassigned
+intrepid-ssl    11751/udp   # Intrepid SSL
+intrepid-ssl    11751/tcp   # Intrepid SSL
+#                          Robert Eden <reden at sieglertech.com> March 2003
+#               11752-11966 Unassigned 
+sysinfo-sp      11967/udp   # SysInfo Sercice Protocol
+sysinfo-sp      11967/tcp   # SysInfo Service Protocol
+#                          Mike Cooper <mcooper at magnicomp.com> March 2003
+#               11968-11999 Unassiged
+entextxid	12000/udp   # IBM Enterprise Extender SNA XID Exchange
+entextxid	12000/tcp   # IBM Enterprise Extender SNA XID Exchange
+entextnetwk	12001/udp   # IBM Enterprise Extender SNA COS Network Priority
+entextnetwk	12001/tcp   # IBM Enterprise Extender SNA COS Network Priority
+entexthigh	12002/udp   # IBM Enterprise Extender SNA COS High Priority
+entexthigh	12002/tcp   # IBM Enterprise Extender SNA COS High Priority
+entextmed	12003/udp   # IBM Enterprise Extender SNA COS Medium Priority
+entextmed	12003/tcp   # IBM Enterprise Extender SNA COS Medium Priority
+entextlow	12004/udp   # IBM Enterprise Extender SNA COS Low Priority
+entextlow	12004/tcp   # IBM Enterprise Extender SNA COS Low Priority
+#			   Eugene Cox <genecox at raleigh.ibm.com>
+dbisamserver1   12005/udp   # DBISAM Database Server - Regular
+dbisamserver1   12005/tcp   # DBISAM Database Server - Regular
+dbisamserver2   12006/udp   # DBISAM Database Server - Admin
+dbisamserver2   12006/tcp   # DBISAM Database Server - Admin
+#                          Tim Young <timyoung at elevatesoft.com> May 2002
+#               12007-12108 Unassigned
+rets-ssl        12109/udp   # RETS over SSL
+rets-ssl        12109/tcp   # RETS over SSL
+#                          Bruce Toback <btoback at optc.com> February 2003 
+#               12110-12171 Unassigned
+hivep		12172/udp   # HiveP
+hivep		12172/tcp   # HiveP
+#			   Dick Augustsson <dick at skenbe.net>
+#               12173-12344 Unassigned
+italk           12345/udp   # Italk Chat System
+italk           12345/tcp   # Italk Chat System
+#                          Takayuki Ito <yuki at euc.jp>
+#               12346-12752 Unassigned
+tsaf            12753/udp   # tsaf port   
+tsaf            12753/tcp   # tsaf port   
+#                          Andreas Fehr <100042.2070 at CompuServe.COM>
+#               12754-13159 Unassigned
+i-zipqd		13160/udp   # I-ZIPQD
+i-zipqd		13160/tcp   # I-ZIPQD
+#			   Chuck Runquist <crunquist at quarterdeck.com>
+#               13161-13222 Unassigned     
+powwow-client   13223/udp   # PowWow Client
+powwow-client   13223/tcp   # PowWow Client
+powwow-server   13224/udp   # PowWow Server
+powwow-server   13224/tcp   # PowWow Server
+#                          Paul K. Peterson <paul at tribal.com>
+#               13225-13719 Unassigned
+bprd		13720/udp   # BPRD Protocol (VERITAS NetBackup)
+bprd		13720/tcp   # BPRD Protocol (VERITAS NetBackup)
+bpdbm		13721/udp   # BPDBM Protocol (VERITAS NetBackup)
+bpdbm		13721/tcp   # BPDBM Protocol (VERITAS NetBackup)
+#			   Jeff Holmbeck <Jeff.Holmbeck at veritas.com>
+bpjava-msvc	13722/udp   # BP Java MSVC Protocol
+bpjava-msvc	13722/tcp   # BP Java MSVC Protocol
+#			   Tim Schmidt <Tim.Schmidt at veritas.com>
+#               13723      Unassigned
+vnetd           13724/udp   # Veritas Network Utility
+vnetd           13724/tcp   # Veritas Network Utility
+#                          Jeff Holmbeck <Jeff.Holmbeck at veritas.com> 
+#               13725-13781 Unassigned 
+bpcd		13782/udp   # VERITAS NetBackup
+bpcd		13782/tcp   # VERITAS NetBackup
+vopied		13783/udp   # VOPIED Protocol
+vopied		13783/tcp   # VOPIED Protocol
+#			   Jeff Holmbeck <Jeff.Holmbeck at veritas.com>
+#               13784-13817 Unassigned
+dsmcc-config	13818/udp   # DSMCC Config
+dsmcc-config    13818/tcp   # DSMCC Config
+dsmcc-session	13819/udp   # DSMCC Session Messages
+dsmcc-session	13819/tcp   # DSMCC Session Messages
+dsmcc-passthru	13820/udp   # DSMCC Pass-Thru Messages
+dsmcc-passthru	13820/tcp   # DSMCC Pass-Thru Messages
+dsmcc-download	13821/udp   # DSMCC Download Protocol
+dsmcc-download	13821/tcp   # DSMCC Download Protocol
+dsmcc-ccp	13822/udp   # DSMCC Channel Change Protocol
+dsmcc-ccp	13822/tcp   # DSMCC Channel Change Protocol
+#			   Tim Addington <Tim.Addington at sciatl.com>
+#			   ISO/IEC 13818-6 MPEG-2 DSM-CC
+#               13823-14000 Unassigned
+sua             14001/sctp  # SUA
+sua	        14001/udp   # De-Registered (2001 June 06)
+sua	        14001/tcp   # SUA
+#			   Miguel Angel Garcia <Miguel.A.Garcia at ericsson.com>
+#               14002-14032 Unassigned
+sage-best-com1  14033/udp   # sage Best! Config Server 1
+sage-best-com1  14033/tcp   # sage Best! Config Server 1
+sage-best-com2  14034/udp   # sage Best! Config Server 2
+sage-best-com2  14034/tcp   # sage Best! Config Server 2
+#                          Christian Rubach <Christian_Rubach at bestsoftware.com>
+#               14035-14140 Unassigned  
+vcs-app         14141/udp   # VCS Application
+vcs-app         14141/tcp   # VCS Application
+#                          Ming Xu <ming at veritas.com>
+#               14142-14144 Unassigned
+gcm-app         14145/udp   # GCM Application
+gcm-app         14145/tcp   # GCM Application
+#                          Ming Xu <ming at veritas.com>
+#               14146-14148 Unassigned
+vrts-tdd        14149/udp   # Veritas Traffic Director
+vrts-tdd        14149/tcp   # Veritas Traffic Director
+#                          Sameer Deokule <sameer.deokule at veritas.com> March 2002
+#               14150-14935 Unassigned
+hde-lcesrvr-1   14936/udp   # hde-lcesrvr-1
+hde-lcesrvr-1   14936/tcp   # hde-lcesrvr-1
+hde-lcesrvr-2   14937/udp   # hde-lcesrvr-2
+hde-lcesrvr-2   14937/tcp   # hde-lcesrvr-2
+#                          Horizon Digital Enterprise, Inc. <info at hde.co.jp>
+#               14938-14999 Unassigned
+hydap           15000/udp   # Hypack Data Aquisition
+hydap           15000/tcp   # Hypack Data Aquisition
+#                          Mircea Neacsu <mircea at videotron.ca>  
+#               15001-15344 Unassigned
+xpilot          15345/udp   # XPilot Contact Port
+xpilot          15345/tcp   # XPilot Contact Port
+#                          Bert Gijsbers <bert at xpilot.org> 
+#               15346-15362 Unassigned
+3link           15363/udp   # 3Link Negotiation
+3link           15363/tcp   # 3Link Negotiation
+#                          Brant Thomsen <brant_thomsen at 3com.com> January 2003
+#               15364-16359 Unassigned
+netserialext1	16360/udp   # netserialext1
+netserialext1	16360/tcp   # netserialext1
+netserialext2	16361/udp   # netserialext2
+netserialext2	16361/tcp   # netserialext2
+#                          Mike Hoy <mhoy at aquilagroup.com>
+#               16362-16366 Unassigned
+netserialext3	16367/udp   # netserialext3
+netserialext3	16367/tcp   # netserialext3
+netserialext4   16368/udp   # netserialext4
+netserialext4	16368/tcp   # netserialext4
+#			   Mike Hoy <mhoy at aquilagroup.com>
+#               16369-16990 Unassigned
+intel-rci-mp    16991/udp   # INTEL-RCI-MP
+intel-rci-mp    16991/tcp   # INTEL-RCI-MP
+#                          Jane Dashevsky <jane.dashevsky at intel.com> 
+#               16992-17006 Unassigned
+isode-dua	17007/udp # 
+isode-dua	17007/tcp # 
+#               17008-17184 Unassigned
+soundsvirtual   17185/udp   # Sounds Virtual
+soundsvirtual   17185/tcp   # Sounds Virtual
+#                          Richard Snider <rsnider at sounds.com>   
+#               17186-17218 Unassigned
+chipper		17219/udp   # Chipper
+chipper		17219/tcp   # Chipper
+#			   Ronald Jimmink <Ronald.Jimmink at chipper.nl>
+#               17220-17999 Unassigned
+biimenu         18000/udp   # Beckman Instruments, Inc.
+biimenu         18000/tcp   # Beckman Instruments, Inc.
+#                    R. L. Meyering <RLMEYERING at BIIVAX.DP.BECKMAN.COM>
+#               18001-18180 Unassigned
+opsec-cvp	18181/udp   # OPSEC CVP 
+opsec-cvp	18181/tcp   # OPSEC CVP 
+opsec-ufp	18182/udp   # OPSEC UFP
+opsec-ufp	18182/tcp   # OPSEC UFP
+#			   Alon Kantor <alonk at checkpoint.com>
+opsec-sam       18183/udp   # OPSEC SAM
+opsec-sam       18183/tcp   # OPSEC SAM
+opsec-lea       18184/udp   # OPSEC LEA
+opsec-lea       18184/tcp   # OPSEC LEA
+opsec-omi       18185/udp   # OPSEC OMI
+opsec-omi       18185/tcp   # OPSEC OMI
+#                          Alon Kantor <alonk at checkpoint.com>
+#               18186      Unassigned
+opsec-ela       18187/udp   # OPSEC ELA
+opsec-ela       18187/tcp   # OPSEC ELA
+#                          Alon Kantor <alonk at checkpoint.com>
+#               18188-18240 Unassigned
+checkpoint-rtm  18241/udp   # Check Point RTM
+checkpoint-rtm  18241/tcp   # Check Point RTM
+#                          Dudi Hazan <dudi at checkpoint.com>
+#               18242-18462 Unassigned
+ac-cluster	18463/udp   # AC Cluster
+ac-cluster	18463/tcp   # AC Cluster
+#			   Lisa Zhong <lzhong at cup.hp.com>
+#               18464-18768 Unassigned
+ique            18769/udp   # IQue Protocol
+ique            18769/tcp   # IQue Protocol
+#                          Avi Drissman <avi_drissman at baseview.com> July 2002
+#               18770-18887 Unassigned
+apc-necmp       18888/udp   # APCNECMP 
+apc-necmp       18888/tcp   # APCNECMP 
+#                          Michael Yip <Michael.Yip at alcatel.com>
+#               18889-19190 Unassigned
+opsec-uaa       19191/udp   # OPSEC UAA
+opsec-uaa       19191/tcp   # OPSEC UAA
+#                          Reuven Harrison  <rnd_ana at checkpoint.com> 
+#               19192-19193 Unassigned
+ua-secureagent  19194/udp   # UserAuthority SecureAgent
+ua-secureagent  19194/tcp   # UserAuthority SecureAgent
+#                          Reuven Harrison <rharrison at checkpoint.com> January 2003
+#               19195-19282 Unassigned
+keysrvr         19283/udp   # Key Server for SASSAFRAS
+keysrvr         19283/tcp   # Key Server for SASSAFRAS
+#                          Mark Valence <kurash at sassafras.com>
+#               19284-19314 Unassigned
+keyshadow       19315/udp   # Key Shadow for SASSAFRAS
+keyshadow       19315/tcp   # Key Shadow for SASSAFRAS
+#                          Mark Valence <kurash at sassafras.com>
+#               19316-19397 Unassigned
+mtrgtrans       19398/udp   # mtrgtrans
+mtrgtrans       19398/tcp   # mtrgtrans
+#                          Katsuhito Muroi <muroi at pfu.co.jp>
+#               19399-19409 Unassigned
+hp-sco		19410/udp   # hp-sco
+hp-sco		19410/tcp   # hp-sco 
+hp-sca		19411/udp   # hp-sca
+hp-sca		19411/tcp   # hp-sca
+#			   Larry Schwartz <lrs at cup.hp.com>
+hp-sessmon      19412/udp   # HP-SESSMON
+hp-sessmon      19412/tcp   # HP-SESSMON
+#                          Gita Murthy <gita at cup.hp.com> 
+#               19413-19539 Unassigned
+sxuptp          19540/udp   # SXUPTP
+sxuptp          19540/tcp   # SXUPTP
+#                          Keiji Okuma <okuma at silex.jp> August 2002
+jcp             19541/udp   # JCP Client
+jcp             19541/tcp   # JCP Client
+#                          Yuji Sasaki <sasaki at silex.jp>
+#               19542-19999 Unassigned
+dnp             20000/udp   # DNP
+dnp             20000/tcp   # DNP
+#                          Michael Thesing <michael.thesing at acsatlanta.com>
+#               20001-20201 Unassigned
+ipdtp-port      20202/udp   # IPD Tunneling Port
+ipdtp-port      20202/tcp   # IPD Tunneling Port
+#                          Vikki Yin Wei <vikki at ipdynamics.com> January 2003
+#               20203-20221 Unassigned
+ipulse-ics      20222/udp   # iPulse-ICS
+ipulse-ics      20222/tcp   # iPulse-ICS
+#                          Meggie Garica-Woodruff <ipulse at ericsson.com>
+#               20223-20669 Unassigned
+track		20670/udp   # Track
+track		20670/tcp   # Track
+#			   Michael Sweet <msweet at ctr.nawcad.navy.mil>	
+#               20671-20998 Unassigned
+athand-mmp      20999/udp   # AT Hand MMP
+athand-mmp      20999/tcp   # At Hand MMP
+#                          Stepan Riha <stepan.riha at hand.com> 
+#               20300-21589 Unassigned
+vofr-gateway	21590/udp   # VoFR Gateway
+vofr-gateway	21590/tcp   # VoFR Gateway
+#			   Marty Borden <mborden at tollbridgetech.com>
+#               21591-21799 Unassigned
+tvpm            21800/udp  # TVNC Pro Multiplexing
+tvpm            21800/tcp  # TVNC Pro Multiplexing
+#                         Brian Blevins <brian.blevins at tridia.com>
+#               21801-21844 Unassigned
+webphone        21845/udp  # webphone
+webphone        21845/tcp  # webphone
+netspeak-is     21846/udp  # NetSpeak Corp. Directory Services
+netspeak-is     21846/tcp  # NetSpeak Corp. Directory Services
+netspeak-cs     21847/udp  # NetSpeak Corp. Connection Services
+netspeak-cs     21847/tcp  # NetSpeak Corp. Connection Services
+netspeak-acd    21848/udp  # NetSpeak Corp. Automatic Call Distribution
+netspeak-acd    21848/tcp  # NetSpeak Corp. Automatic Call Distribution
+netspeak-cps    21849/udp  # NetSpeak Corp. Credit Processing System
+netspeak-cps    21849/tcp  # NetSpeak Corp. Credit Processing System
+#                         Toby Hosterman <root at netspeak.com>
+#               21850-21999 Unassigned  
+snapenetio	22000/udp  # SNAPenetIO
+snapenetio	22000/tcp  # SNAPenetIO
+optocontrol	22001/udp  # OptoControl
+optocontrol	22001/tcp  # OptoControl
+#			  Kevin Kuhns <kkuhns at opto22.com>
+#               22002-22272 Unassigned
+wnn6            22273/udp  # wnn6
+wnn6            22273/tcp  # wnn6
+#                         Yasunari Gon Yamasita <yamasita at omronsoft.co.jp
+#               22274-22554 Unassigned
+vocaltec-phone  22555/udp  # Vocaltec Internet Phone
+vocaltec-wconf  22555/tcp  # Vocaltec Web Conference
+#                         Scott Petrack >Scott_Petrack at vocaltec.com>
+#               22556-22799 Unassigned
+aws-brf         22800/udp  # Telerate Information Platform LAN
+aws-brf         22800/tcp  # Telerate Information Platform LAN
+#                         Timo Sivonen <timo.sivonen at ccmail.dowjones.com>
+#               22801-22950 Unassigned
+brf-gw          22951/udp  # Telerate Information Platform WAN
+brf-gw          22951/tcp  # Telerate Information Platform WAN
+#                         Timo Sivonen <timo.sivonen at ccmail.dowjones.com>
+#               22952-23999 Unassigned
+med-ltp		24000/udp  # med-ltp
+med-ltp		24000/tcp  # med-ltp
+med-fsp-rx	24001/udp  # med-fsp-rx
+med-fsp-rx	24001/tcp  # med-fsp-rx
+med-fsp-tx	24002/udp  # med-fsp-tx
+med-fsp-tx	24002/tcp  # med-fsp-tx
+med-supp	24003/udp  # med-supp
+med-supp	24003/tcp  # med-supp
+med-ovw		24004/udp  # med-ovw
+med-ovw		24004/tcp  # med-ovw
+med-ci		24005/udp  # med-ci
+med-ci		24005/tcp  # med-ci
+med-net-svc	24006/udp  # med-net-svc
+med-net-svc	24006/tcp  # med-net-svc
+#			  Juergen Fischbach <Juergen_Fischbach at agilent.com>
+#               24007-24241 Unassigned
+filesphere      24242/udp  # fileSphere
+filesphere      24242/tcp  # fileSphere
+#                         Carl Cedergren <asperon at home.se>
+#               24243-24248 Unassigned
+vista-4gl       24249/udp  # Vista 4GL
+vista-4gl       24249/tcp  # Vista 4GL
+#                         Mark Itzcovitz <mji at vistacomp.com>
+#               24250-24385 Unassigned
+intel_rci	24386/udp  # Intel RCI
+intel_rci	24386/tcp  # Intel RCI 
+#			  Mark Lewis <mark.h.lewis at intel.com> 
+#               24387-24553 Unassigned
+binkp           24554/udp  # BINKP
+binkp           24554/tcp  # BINKP
+#                         Max Masyutin <max at ritlabs.com>
+#               24554-34676 Unassigned
+flashfiler      24677/udp  # FlashFiler
+flashfiler      24677/tcp  # FlashFiler
+#                         Ben Oram <beno at turbopower.com>  
+proactivate     24678/udp  # Turbopower Proactivate
+proactivate     24678/tcp  # Turbopower Proactivate
+#                         Ben Oram <beno at turbopower.com>
+#               24679-24921 Unassigned
+snip            24922/udp  # Simple Net Ident Protocol
+snip            24922/tcp  # Simple Net Ident Protocol
+#                         Jean-Paul Moreaux 
+#                         <jean-paul.moreaux at airbus.dasa.de>
+#               24923-24999 Unassigned 
+icl-twobase1    25000/udp  # icl-twobase1
+icl-twobase1    25000/tcp  # icl-twobase1
+icl-twobase2    25001/udp  # icl-twobase2
+icl-twobase2    25001/tcp  # icl-twobase2
+icl-twobase3    25002/udp  # icl-twobase3
+icl-twobase3    25002/tcp  # icl-twobase3
+icl-twobase4    25003/udp  # icl-twobase4
+icl-twobase4    25003/tcp  # icl-twobase4
+icl-twobase5    25004/udp  # icl-twobase5
+icl-twobase5    25004/tcp  # icl-twobase5
+icl-twobase6    25005/udp  # icl-twobase6
+icl-twobase6    25005/tcp  # icl-twobase6
+icl-twobase7    25006/udp  # icl-twobase7
+icl-twobase7    25006/tcp  # icl-twobase7
+icl-twobase8    25007/udp  # icl-twobase8
+icl-twobase8    25007/tcp  # icl-twobase8
+icl-twobase9    25008/udp  # icl-twobase9
+icl-twobase9    25008/tcp  # icl-twobase9
+icl-twobase10   25009/udp  # icl-twobase10
+icl-twobase10   25009/tcp  # icl-twobase10
+#               J. A. (Tony) Sever <J.A.Sever at bra0119.wins.icl.co.uk>
+#               25010-25792 Unassigned 
+vocaltec-hos    25793/udp   # Vocaltec Address Server
+vocaltec-hos    25793/tcp   # Vocaltec Address Server      
+#                          Scott Petrack <Scott_Petrack at vocaltec.com>
+#               25794-25900 Unassigned
+niobserver      25901/udp   # NIObserver
+niobserver      25901/tcp   # NIObserver
+#                          Roman Oliynyk <romano at netinst.com>
+#               25902      Unassigned
+niprobe         25903/udp   # NIProbe
+niprobe         25903/tcp   # NIProbe
+#                          Roman Oliynyk <romano at netinst.com>
+#               25904-25999 Unassigned
+quake           26000/udp   # quake
+quake           26000/tcp   # quake
+#                          Yasunari Gon Yamasita <yamasita at omronsoft.co.jp>  
+#               26001-26207 Unassigned
+wnn6-ds         26208/udp   # wnn6-ds
+wnn6-ds         26208/tcp   # wnn6-ds
+#                          Yasunari Gon Yamasita <yamasita at omronsoft.co.jp>
+#               26209-26259 Unassigned
+ezproxy         26260/udp   # eZproxy
+ezproxy         26260/tcp   # eZproxy
+ezmeeting       26261/udp   # eZmeeting
+ezmeeting       26261/tcp   # eZmeeting
+#                          Albert C. Yang <albert.yang at eZmeeting.com>
+k3software-svr  26262/udp   # K3 Software-Server
+k3software-svr  26262/tcp   # K3 Software-Server
+k3software-cli  26263/udp   # K3 Software-Client
+k3software-cli  26263/tcp   # K3 Software-Client
+#                          Jim Baldridge <jimb at rpower.com>
+gserver         26264/udp   # Gserver
+gserver         26264/tcp   # Gserver 
+#                          Szanto Gabor <sgabor90 at hotmail.com> 
+#               26265-26999 Unassigned
+#			   Daniel Birns <daniel at globes.com>
+#               27010-27344 Unassigned
+imagepump       27345/udp   # ImagePump
+imagepump       27345/tcp   # ImagePump
+#                          Richard Minner <ports at xippix.com>
+#               27346-27503 Unassigned
+kopek-httphead  27504/udp   # Kopek HTTP Head Port
+kopek-httphead  27504/tcp   # Kopek HTTP Head Port
+#                          Sten H. Danielsen <shd at kopek.net> July 2002
+#               27505-27998 Unassigned
+tw-auth-key     27999/udp   # Attribute Certificate Services
+tw-auth-key     27999/tcp   # TW Authentication/Key Distribution and 
+#                          Alex Duncan <Alex.Duncan at sse.ie> 
+#               28000-30000 Unassigned
+pago-services1  30001/udp    # Pago Services 1
+pago-services1  30001/tcp    # Pago Services 1
+pago-services2  30002/udp    # Pago Services 2
+pago-services2  30002/tcp    # Pago Services 2
+#                           Balduin Mueller-Platz 
+#                           <balduin.mueller-platz at pago.de> March 2002
+#               30003-31415 Unassigned
+xqosd           31416/udp    # XQoS network monitor
+xqosd           31416/tcp    # XQoS network monitor
+#                           Joe Elliott <joe at inetd.com> June 2002
+#               31417-31619 Unassigned
+lm-mon          31620/udp    # lm mon
+lm-mon          31620/tcp    # lm mon
+#                           Mounir Hahad <mounir.hahad at eecad.com> June 2003
+#               31621-31764 Unassigned
+gamesmith-port  31765/udp    # GameSmith Port
+gamesmith-port  31765/tcp    # GameSmith Port
+#                           Randy Thompson <thompr at earthlink.net> August 2002
+#               31766-32767 Unassigned
+filenet-tms     32768/udp    # Filenet TMS
+filenet-tms     32768/tcp    # Filenet TMS
+filenet-rpc     32769/udp    # Filenet RPC
+filenet-rpc     32769/tcp    # Filenet RPC
+filenet-nch     32770/udp    # Filenet NCH
+filenet-nch     32770/tcp    # Filenet NCH
+#                           Daniel Whelan <dwhelan at filenet.com>	
+filenet-rmi     32771/udp    # FileNet RMI
+filenet-rmi     32771/tcp    # FileNET RMI
+#                           Chris Adkins <cadkins at filenet.com>
+filenet-pa      32772/udp    # FileNET Process Analyzer
+filenet-pa      32772/tcp    # FileNET Process Analyzer 
+#                           Chris Adkins <cadkins at filenet.com> January 2003
+#               32773-32895 Unassigned
+idmgratm        32896/udp    # Attachmate ID Manager
+idmgratm        32896/tcp    # Attachmate ID Manager
+#                           George Gianelos <GeorgeGi at Attachmate.com> March 2003
+#               32897-33330 Unassigned
+diamondport     33331/udp    # DiamondCentral Interface
+diamondport     33331/tcp    # DiamondCentral Interface
+#                           Edward Browdy <ebrowdy at cryptek.com> July 2002
+#               33332-33433 Unassigned
+traceroute      33434/udp    # traceroute use
+traceroute      33434/tcp    # traceroute use
+#                           IANA <iana at iana.org>
+#               33435-34248 Unassigned
+turbonote-2     34249/udp    # TurboNote Relay Server Default Port
+turbonote-2     34249/tcp    # TurboNote Relay Server Default Port
+#                           Peter Hyde <peter at spis.co.nz>
+#               34250-36864 Unassigned
+kastenxpipe     36865/udp    # KastenX Pipe
+kastenxpipe     36865/tcp    # KastenX Pipe
+#                           Guy Cheng <GCHE at kastenchase.com>
+#               36866-37474 Unassigned
+neckar          37475/udp    # science + computing's Venus Administration Port
+neckar          37475/tcp    # science + computing's Venus Administration Port
+#                           Ralf Allrutz <R.Allrutz at science-computing.de> February 2002
+#               37476-38200 Unassigned
+galaxy7-data    38201/udp    # Galaxy7 Data Tunnel
+galaxy7-data    38201/tcp    # Galaxy7 Data Tunnel
+#                           Tatham Oddie <tatham at e-oddie.com> September 2002
+#               38202-39680 Unassigned
+turbonote-1     39681/udp    # TurboNote Default Port
+turbonote-1     39681/tcp    # TurboNote Default Port
+#                           Peter Hyde <peter at spis.co.nz>
+#               39682-40840 Unassigned
+cscp            40841/udp    # CSCP
+cscp            40841/tcp    # CSCP
+#                           Michael Dodge <sarge at centerspan.com>      
+csccredir       40842/udp    # CSCCREDIR
+csccredir       40842/tcp    # CSCCREDIR
+csccfirewall    40843/udp    # CSCCFIREWALL
+csccfirewall    40843/tcp    # CSCCFIREWALL
+#                           Sudhir Menon <sudhir at centerspan.com>
+#               40844-41110 Unassigned
+fs-qos          41111/udp    # Foursticks QoS Protocol
+fs-qos          41111/tcp    # Foursticks QoS Protocol
+#                           Chee Kent Lam <cklam at foursticks.com> April 2002
+#               41112-41793 Unassigned
+crestron-cip    41794/udp    # Crestron Control Port
+crestron-cip    41794/tcp    # Crestron Control Port
+crestron-ctp    41795/udp    # Crestron Terminal Port
+crestron-ctp    41795/tcp    # Crestron Terminal Port
+#                           Ed Ranney <eranney at crestron.com> January 2003
+#               41796-43187 Unassigned
+reachout        43188/udp    # REACHOUT
+reachout        43188/tcp    # REACHOUT
+ndm-agent-port  43189/udp    # NDM-AGENT-PORT
+ndm-agent-port  43189/tcp    # NDM-AGENT-PORT
+ip-provision    43190/udp    # IP-PROVISION
+ip-provision    43190/tcp    # IP-PROVISION
+#                           Roman Kriis <roman at previo.ee>
+#               43191-44320 Unassigned
+pmcd            44321/udp    # PCP server (pmcd)
+pmcd            44321/tcp    # PCP server (pmcd)
+#                           Ken McDonell <kenmcd at sgi.com> June 2002
+#               44322-44817 Unassigned
+rockwell-encap  44818/udp    # Rockwell Encapsulation
+rockwell-encap  44818/tcp    # Rockwell Encapsulation
+#                           Brian Batke <babatke at ra.rockwell.com>
+#               44819-45053 Unassigned
+invision-ag     45054/udp    # InVision AG
+invision-ag     45054/tcp    # InVision AG 
+#                           Matthias Schroer <matthias.schroer at invision.de>
+#               45055-45677 Unassigned
+eba             45678/udp    # EBA PRISE
+eba             45678/tcp    # EBA PRISE
+#                           Patrick Kara <Patrick at EBA.NET>
+#               45679-45965 Unassigned
+ssr-servermgr   45966/udp    # SSRServerMgr
+ssr-servermgr   45966/tcp    # SSRServerMgr
+#                           Jeremy Gilliat <jeremy.gilliat at geac.com>
+#               45967-46999 Unassigned
+mbus            47000/udp    # Message Bus
+mbus            47000/tcp    # Message Bus
+#                           Dirk Kutscher <dku at informatik.uni-bremen.de> 
+#               47001-47556 Unassigned
+dbbrowse        47557/udp    # Databeam Corporation
+dbbrowse        47557/tcp    # Databeam Corporation
+#                           Cindy Martin <cmartin at databeam.com>
+#               47558-47623 Unassigned
+directplaysrvr  47624/udp    # Direct Play Server
+directplaysrvr  47624/tcp    # Direct Play Server
+#                           Ajay Jindal <ajayj at microsoft.com>
+#               47625-47805 Unassigned
+ap              47806/udp    # ALC Protocol
+ap              47806/tcp    # ALC Protocol
+#                           Andrew Newton <alnewton at automatedlogic.com>
+#               47807       Unassigned
+bacnet          47808/udp    # Building Automation and Control Networks
+bacnet          47808/tcp    # Building Automation and Control Networks
+#                           H. Michael Newman <hmn2 at cornell.edu>
+#               47809-47999 Unassigned
+nimcontroller   48000/udp    # Nimbus Controller
+nimcontroller   48000/tcp    # Nimbus Controller
+nimspooler      48001/udp    # Nimbus Spooler
+nimspooler      48001/tcp    # Nimbus Spooler
+nimhub          48002/udp    # Nimbus Hub
+nimhub          48002/tcp    # Nimbus Hub
+nimgtw          48003/udp    # Nimbus Gateway
+nimgtw          48003/tcp    # Nimbus Gateway
+#                           Carstein Seeberg <case at nimsoft.no>
+#               48004-48555 Unassigned
+com-bardac-dw   48556/udp    # com-bardac-dw
+com-bardac-dw   48556/tcp    # com-bardac-dw
+#                           Nicholas J Howes <nick at ghostwood.org>
+#               48557-49150 Unassigned 
+#               49151       IANA Reserved
diff --git a/test/data/types/sshkey/1 b/test/data/types/sshkey/1
new file mode 100644
index 0000000..840ed19
--- /dev/null
+++ b/test/data/types/sshkey/1
@@ -0,0 +1,21 @@
+hosting2.planetargon.com,64.34.164.77 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAy+f2t52cDMrYkgEKQ6juqfMf/a0nDFry3JAzl+SAWQ0gTklVxNcVbfHx2pkZk66EBGQfrK33Bx1BflZ/iEDyiCwmzVtNba0X9A6ELYjB9WSkWdIqZCfPlKZMu9N//aZ6+3SDVuz/BVFsAVmtqQ4Let2QjOFiSIKXrtPqWvVT/MM=
+kirby.madstop.com,192.168.0.5 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAw9iHuAa/wepHoUzWqsvhQvSkpE4K7agrdLOWHM9mvyRQ2X3HVq5GqzAvWu4J+f0FvcLPwA9tivpxt1oSt5MOtvDM6HoM+8m3P4daBp0nlNaYR8/vHCAmX6N3RyM8FWfp+VqWyux1SooQwxYxVFy86G78ApTqNsZ+p7cHmnBYqk0=
+fedora1,192.168.0.51 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAyz1rKcApU4//j8CHYKexq4qnq2WVqLPrZYGnlij1t7FscLiDVKvBuRHVkfyTNIjAM/t7tM1Dj+FuD4iWziCmf7RO9q4wI5y/1zgCiSUegnZVSmH2yxnWGMdHGpXOkN3NXcpy6jylxyBo0M7T22PSezCxyUVfMclesjOEO1jETd0=
+kirby ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAw9iHuAa/wepHoUzWqsvhQvSkpE4K7agrdLOWHM9mvyRQ2X3HVq5GqzAvWu4J+f0FvcLPwA9tivpxt1oSt5MOtvDM6HoM+8m3P4daBp0nlNaYR8/vHCAmX6N3RyM8FWfp+VqWyux1SooQwxYxVFy86G78ApTqNsZ+p7cHmnBYqk0=
+sol10b,192.168.0.50 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAs37kiDwKxWqi6EfSdKwRaZXBwh2doOARRqZzyitBaPwESy26DwTx+xdQ2rwB4V2k1WIec+1f3bgTS2ArH75dQSPyba2HKqxaSRBd3Zh4z23+uUxpupEyoRdW1HolMOvuoceheSMsruiuYcuiyct41d4c/Qmr51Dv04Doi00k6Ws=
+piratehaven.org,64.81.59.88 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA7TYRRkle0wDNohZ0TNZN6R1Zp0svxgX+GJ9umI5yNM1bMxUTgeNRh5nIvZg1HgD1WRXQ57dSxxLzbvRyAqc245g6S8eWWCtenvOFLl0rOF5D3VxbQuw79sOe8/Ac8TC+c8RuWB7aaxpwL5Rv9xfDeazOtoKXj7+uwQW1PUmTaEM=
+atalanta,192.168.0.10 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAysniuWiJH6OQLXl63XXcS1b/hP2lAgSz0IutjQ6ZUfBrt1BZ8udEgSh57w5QDLsZ1lNvND61u5cy6iDKXI5TIQY4DvUmsoFZhyr4iYJbtT/h6UJSyaZtEnA7ZMRjGhUIMOn+mjbj7Z3zmJMhxtImK3Xo3O2fJ1hnK4jsBwQPSLc=
+pixie,192.168.0.9 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAzDp588CvET6w11LB2s/vPjc4tX9+u46iYJgNFfhzxrXYMVv4GF7d30IXB5+Hwyi2FOQIG1+h0kUXVGWEv64rAFBT7pD2KMFX0lcDERV4avqT0TRDIIA5OqFOhq9Ff+kOmHS2cB7eFyR5vqbN4ujOnJGTmru9dcqyL+2AcFekvh0=
+culain,192.168.0.3 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvJ/IORhQMdAsJ7LB1sI2LlWUHc7HPTCDiEgJ96ij3jFvqaIiYieRFaNkxbbk75mPkj3vIqWIgAsAtHmKX4wDikNG/gyjs4WM4cWFKtl2jiVhqpoxqqCaVxs6Ex+vpKuKhQR6SzFBFDlBZYP9an6DPu1msTLT8/hZH2WwswVmpyU=
+cs312-server.een.orst.edu,128.193.40.66 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA+t3hsOiyp1mztt013bLdJqIAFCo8lxlz86MYEPz/mADHzWLs3Xv7xpAUv/E8pRbhEOzXo84EddORRBXz6DgVyMah8+v/u3IOkpXuZI0Iu1n5hZyf2l5DGEyGecr3oqqjUdMuM9HeXFLnqXJI3hDE7civBtqf5AJSol+TCcipeE8=
+freebsd1,192.168.0.52 ssh-dss AAAAB3NzaC1kc3MAAACBAJSiOyQhYlKAi0FDLKy42VzLDq6yJWXGXVCLSfgWyVx7QCq/3+W3C1dtHuAvjbypcjqqvsuGGITgQ1Y6B/+76n5d7FyQnj4SFZ5drOBn/TvslXhrS/Ok5KCcndfNAa+EyMnSZJ21jhoRjZftY4lmb4hy6fEF3RvjuOdf1qBN5FWpAAAAFQDcsWF0zELAW6YUlSjAyO0T0lfPbwAAAIAlOLdOd/WszzVaplCOnH5vF6LWfr6BosZKDkFi0mv6Ec636YGaj4AMxK8sRPusHv6sVByN17ntIJnLo2XD1SuoH28bZ0ZnPIdVnd0l1KqsOCuuow9LZYJUihezoUuYuTvij1jZdrwltuPNJTVLYtsZDnKE5plw+Tjzeb7ImjbXGwAAAIBT40olg3fxhRDiZECle0WK7GitgXCB3njs+4dba8VwveEJb9UuulMc1eR+zQiJR96IUBagC9NiLvUGS1IfiIHpT4FA8O/MK1W9SgxXB9d39Nk/9l8dH3U/fLnbC/hYVo8bN0or/mKxcxQMkdBwpPlWAbELRftod2BkkkvgfQdc+g==
+192.168.0.2 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCZ+qxpMMRJ3otGsjaYeKTKf6tuCZyK1cD+ns9Eu7V0ZJLJ/LLMxduu7n4H/ufGI5rGV5axzgx8yZhjDRzsrGjLAQYsqlomMkf901YQI6UuieSA4MZa5MDkq/Jt6Vx1kEGTpkgrfw9kRMX5BngECt1QKY4xTgC7Ex+WlFvZwk+tRUT3
+openbsd1,192.168.0.54 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAvgRVrtJk0fBg9YsLf7rWR1X32ZjFcva5XBvenDlHruObaHzuGXyyr6iOCAEOc7eCZjlPBYrGZ2potqyk8HlBOHXr1cCBf49t4yAt8KgKswtzWlgdbU1UEwllSRVOpzqULAT0smv/jfaIZdvRoN1rLriqtpn4bQL//ZOHiyXCwdlJ+di8Mza2L8KZ5T75hwIFBhrgL12xfymRp3v+Iy21MjjzsF3pROIkZ7icitNqQF55U9vsHaA37vG8FepVkO10bYYP7IHPZaBPBMPx7qPyRgRDJahEUGBnkIkzwJHEmA+7YMiNTZu6MigezD+CIqY1xOi/eXZwObLwLKXo7eRmpw==
+192.168.0.60 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAufcvE7s1eRwhUwMBfZ6uFNxkdSdzjSDEn3vjByOjG/eraNhnYAW3rxV7WIf2pEa6JSOMrE1mqsEL75xEtpXlzC949Ysz4+1OSHY52KonoFm/a+FbmbFp81TVuVPYaLoeWN27STiJh+puC5spkIZe0laqT1GU13M4gj6B+j3NLhU=
+rh3a,192.168.0.55 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAufcvE7s1eRwhUwMBfZ6uFNxkdSdzjSDEn3vjByOjG/eraNhnYAW3rxV7WIf2pEa6JSOMrE1mqsEL75xEtpXlzC949Ysz4+1OSHY52KonoFm/a+FbmbFp81TVuVPYaLoeWN27STiJh+puC5spkIZe0laqT1GU13M4gj6B+j3NLhU=
+tsetse,192.168.0.7 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAwCDGn82BEMSCfcE2LZKcwdAoyIBC+u2twVwWNRm3KzyrJMQ+RbTQo4AwGOdyr/QYh6KaxTKTSoDtiBLr132uenMQKwF47gCKMA1T47uiy+TBUehgOGwOxteSYP/pQRpKXFmhOppSPyDPQVq234XvANeJp0iT8ZKEhF2FsWTs6sM=
+config.sage.org,131.106.3.205 ssh-dss AAAAB3NzaC1kc3MAAACBAL2akEcIfQsfm3zCd2hD6PgH3kWA/tqX/qbrLhL/ipX7iqK/y282GMClZQSQjc1YNi9virvLzb6u/gdZxicZ8K5O3FaJrULQJOZaP62SOHk5CUSHVnvpMCaCnbwB6gEHa2LeMWStcEfWW+g1CC2hzPJw16/S5GISGXbyanO02MnXAAAAFQDomwx/OCjTmmQljMTU5rgNn2E4gwAAAIBmtMSfcs2Tq5iFFKK5cahluv047vVNfXqYIAkeJniceL0Et16MKfuzadpq0H9ocxQYW/5Ir9nUULrdxBUN9LxNKq15/uWkJC9QCSh8PysgvFnjVZeCODua/dn6eZTZnY9DZ3S6v1pT8CP6uWr5fmZJ8FKJGrC3gYX4y1V1ZTCVewAAAIB6e7RCST6vkTS5rgn5wGbrfLK5ad+PW+2i66k77Zv1pjtfRz+0oejBjwJDPNVSc2YNEl7X0nEEMNjo/a5x8Ls+nVqhzJA+NXIwS1e/moKbXFGewW5HAtxd79gtInC8dEIO7hmnWnqF1dBkRHXg1YffYkHrMVJBxpzagw7nYa0BBQ==
+rh3b,192.168.0.56 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAufcvE7s1eRwhUwMBfZ6uFNxkdSdzjSDEn3vjByOjG/eraNhnYAW3rxV7WIf2pEa6JSOMrE1mqsEL75xEtpXlzC949Ysz4+1OSHY52KonoFm/a+FbmbFp81TVuVPYaLoeWN27STiJh+puC5spkIZe0laqT1GU13M4gj6B+j3NLhU=
+centos1,192.168.0.57 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEA0DXqYF+3Lf68GkWBAjjKBb6UITNnzm4wiDi/AGjv5+DoVXqDcqHvZ8rZFAMgUe1dVob4pWT2ZWLHW0gicoJCdr4UQbPXlWz1F62z8fo2PRRPlG6KN1wmF7pnyml8jr0wBX8lQZJsMqi4InGozf7wFHLH/7DNGRK3MD6tSp3Z4is=
+doorstop.cafes.net,205.241.238.186 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEApJKeB9/bN5t55zLETHs0MVo/vEkfQ3EzY7178GKLI/yiOFmcn+NvUvUtCQK/xKpod813LBHCODxZPG1Kb0SjlaC/EkFEenb74LNu0o1qXa1GWh3wfaIm0JRNjXqPqxAWTlMs43O2HXwOwmLVhl7SSP3xtTw6h9gREbVKmfBaRdsRfzD0etfz1NCnmGh/1Sh9+j4eeS+IBtwoR5JVhZVhuofHCqs5HZ8gLDgfn8HXP7pMbLkx54cf1R/tmFmn9JGLdTPtEGcSIiu7414XSbfChSC83rGZCDPKHq7ZodiE8GpbWLBnyPXi2AYxTPM7aZMqitIHv3MWf5suV0q0WLGdnQ==
+host.domain.com,host1.domain.com,192.168.0.1 dss thisismykey1
diff --git a/test/data/types/yumrepos/fedora-devel.repo b/test/data/types/yumrepos/fedora-devel.repo
new file mode 100644
index 0000000..ebb150b
--- /dev/null
+++ b/test/data/types/yumrepos/fedora-devel.repo
@@ -0,0 +1,26 @@
+[development]
+# These packages are untested and still under development. This
+# repository is used for updates to test releases, and for
+# development of new releases.
+#
+# This repository can see significant daily turn over and can see major
+# functionality changes which cause unexpected problems with other
+# development packages. Please use these packages if you want to work
+# with the Fedora developers by testing these new development packages.
+#
+# fedora-test-list at redhat.com is available as a discussion forum for
+# testing and troubleshooting for development packages in conjunction
+# with new test releases.
+#
+# fedora-devel-list at redhat.com is available as a discussion forum for
+# testing and troubleshooting for development packages in conjunction
+# with developing new releases.
+#
+# Reportable issues should be filed at bugzilla.redhat.com
+# Product: Fedora Core
+# Version: devel
+name=Fedora Core $releasever - Development Tree
+#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/$basearch/
+mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-rawhide
+enabled=0
+gpgcheck=0
diff --git a/test/data/types/yumrepos/fedora.repo b/test/data/types/yumrepos/fedora.repo
new file mode 100644
index 0000000..995fa68
--- /dev/null
+++ b/test/data/types/yumrepos/fedora.repo
@@ -0,0 +1,9 @@
+[base]
+name=Fedora Core $releasever - $basearch - Base
+mirrorlist=http://fedora.redhat.com/download/mirrors/fedora-core-$releasever
+enabled=1
+gpgcheck=1
+gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora
+exclude=foo
+  bar
+  baz
diff --git a/test/executables/puppetbin.rb b/test/executables/puppetbin.rb
index 218787c..08329ef 100755
--- a/test/executables/puppetbin.rb
+++ b/test/executables/puppetbin.rb
@@ -83,5 +83,22 @@ class TestPuppetBin < Test::Unit::TestCase
 
         assert(FileTest.exists?(path), "Failed to create config'ed file")
     end
+
+    def test_parseonly
+        path = tempfile()
+        manifest = tempfile()
+        puppet = %x{which puppet}.chomp
+        if puppet == ""
+            Puppet.info "cannot find puppet; cannot test parseonly"
+            return
+        end
+        code = 'File <<| |>>
+        include nosuchclass'
+
+        assert_nothing_raised {
+            IO.popen("#{puppet} --parseonly", 'w') { |p| p.puts code }
+        }
+        assert($? == 0, "parseonly test exited with code %s" % $?.to_i)
+    end
 end
 
diff --git a/test/language/ast.rb b/test/language/ast.rb
index b31012d..8c0f31a 100755
--- a/test/language/ast.rb
+++ b/test/language/ast.rb
@@ -35,14 +35,14 @@ class TestAST < Test::Unit::TestCase
         # We initialized it to true, so we should get that first
         ret = nil
         assert_nothing_raised {
-            ret = astif.evaluate(:scope => "yay")
+            ret = astif.evaluate("yay")
         }
         assert_equal(:if, ret)
 
         # Now set it to false and check that
         faketest.evaluate = false
         assert_nothing_raised {
-            ret = astif.evaluate(:scope => "yay")
+            ret = astif.evaluate("yay")
         }
         assert_equal(:else, ret)
     end
@@ -57,10 +57,10 @@ class TestAST < Test::Unit::TestCase
         end
 
         Puppet::Parser::Resource.expects(:new).with { |o| o.is_a?(Hash) }.returns(:override)
-        scope.compile.expects(:store_override).with(:override)
+        scope.compiler.expects(:add_override).with(:override)
         ret = nil
         assert_nothing_raised do
-            ret = ref.evaluate :scope => scope
+            ret = ref.evaluate scope
         end
 
         assert_equal(:override, ret, "Did not return override")
@@ -74,7 +74,7 @@ class TestAST < Test::Unit::TestCase
         args = {:source => "/yay/ness", :group => "yayness"}
         assert_nothing_raised do
             obj = defaultobj "file", args
-            obj.evaluate :scope => scope
+            obj.evaluate scope
         end
 
         hash = nil
@@ -93,56 +93,6 @@ class TestAST < Test::Unit::TestCase
         end
     end
 
-    def test_node
-        scope = mkscope
-        parser = scope.compile.parser
-
-        # Define a base node
-        basenode = parser.newnode "basenode", :code => AST::ASTArray.new(:children => [
-            resourcedef("file", "/tmp/base", "owner" => "root")
-        ])
-
-        # Now define a subnode
-        nodes = parser.newnode ["mynode", "othernode"],
-            :code => AST::ASTArray.new(:children => [
-                resourcedef("file", "/tmp/mynode", "owner" => "root"),
-                resourcedef("file", "/tmp/basenode", "owner" => "daemon")
-        ])
-
-        assert_instance_of(Array, nodes)
-
-        # Make sure we can find them all.
-        %w{mynode othernode}.each do |node|
-            assert(parser.nodes[node], "Could not find %s" % node)
-        end
-        mynode = parser.nodes["mynode"]
-
-        # Now try evaluating the node
-        assert_nothing_raised do
-            mynode.evaluate :scope => scope, :resource => scope.resource
-        end
-
-        # Make sure that we can find each of the files
-        myfile = scope.findresource "File[/tmp/mynode]"
-        assert(myfile, "Could not find file from node")
-        assert_equal("root", myfile[:owner])
-
-        basefile = scope.findresource "File[/tmp/basenode]"
-        assert(basefile, "Could not find file from base node")
-        assert_equal("daemon", basefile[:owner])
-
-        # Now make sure we can evaluate nodes with parents
-        child = parser.newnode(%w{child}, :parent => "basenode").shift
-
-        newscope = mkscope :parser => parser
-        assert_nothing_raised do
-            child.evaluate :scope => newscope, :resource => scope.resource
-        end
-
-        assert(newscope.findresource("File[/tmp/base]"),
-            "Could not find base resource")
-    end
-
     def test_collection
         scope = mkscope
 
@@ -155,13 +105,13 @@ class TestAST < Test::Unit::TestCase
 
         ret = nil
         assert_nothing_raised do
-            ret = coll.evaluate :scope => scope
+            ret = coll.evaluate scope
         end
 
         assert_instance_of(Puppet::Parser::Collector, ret)
 
         # Now make sure we get it back from the scope
-        colls = scope.compile.instance_variable_get("@collections")
+        colls = scope.compiler.instance_variable_get("@collections")
         assert_equal([ret], colls, "Did not store collector in config's collection list")
     end
 
@@ -175,7 +125,7 @@ class TestAST < Test::Unit::TestCase
         run_collection_queries(:virtual) do |string, result, query|
             code = nil
             assert_nothing_raised do
-                str, code = query.evaluate :scope => scope
+                str, code = query.evaluate scope
             end
 
             assert_instance_of(Proc, code)
diff --git a/test/language/ast/casestatement.rb b/test/language/ast/casestatement.rb
index 0a744b6..d95d788 100755
--- a/test/language/ast/casestatement.rb
+++ b/test/language/ast/casestatement.rb
@@ -45,7 +45,7 @@ class TestCaseStatement < Test::Unit::TestCase
 
         result = nil
         assert_nothing_raised do
-            result = ast.evaluate :scope => scope
+            result = ast.evaluate scope
         end
         assert(result, "did not get valid result")
         assert_equal(["upper"], $evaluated, "Did not match case-sensitively")
@@ -56,7 +56,7 @@ class TestCaseStatement < Test::Unit::TestCase
         $evaluated.clear
         hash["MyParam"].reset
         assert_nothing_raised do
-            result = ast.evaluate :scope => scope
+            result = ast.evaluate scope
         end
         assert(result, "did not get valid result")
         assert_equal(["lower"], result, "Did not match case-insensitively")
@@ -92,7 +92,7 @@ class TestCaseStatement < Test::Unit::TestCase
                 scope = mkscope
                 scope.setvar("testparam", value)
                 assert_nothing_raised do
-                    result = ast.evaluate(:scope => scope)
+                    result = ast.evaluate(scope)
                 end
 
                 assert_equal(should, result, "Got incorrect result for %s" % value)
diff --git a/test/language/ast/definition.rb b/test/language/ast/definition.rb
deleted file mode 100755
index 2a71aaa..0000000
--- a/test/language/ast/definition.rb
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/env ruby
-#
-#  Created by Luke A. Kanies on 2006-02-20.
-#  Copyright (c) 2006. All rights reserved.
-
-require File.dirname(__FILE__) + '/../../lib/puppettest'
-
-require 'puppettest'
-require 'mocha'
-require 'puppettest/parsertesting'
-require 'puppettest/resourcetesting'
-
-class TestASTDefinition < Test::Unit::TestCase
-	include PuppetTest
-	include PuppetTest::ParserTesting
-    include PuppetTest::ResourceTesting
-	AST = Puppet::Parser::AST
-
-    def test_initialize
-        parser = mkparser
-
-        # Create a new definition
-        klass = parser.newdefine "yayness",
-            :arguments => [["owner", stringobj("nobody")], %w{mode}],
-            :code => AST::ASTArray.new(
-                :children => [resourcedef("file", "/tmp/$name",
-                        "owner" => varref("owner"), "mode" => varref("mode"))]
-            )
-
-        # Test validattr? a couple different ways
-        [:owner, "owner", :schedule, "schedule"].each do |var|
-            assert(klass.validattr?(var), "%s was not considered valid" % var.inspect)
-        end
-
-        [:random, "random"].each do |var|
-            assert(! klass.validattr?(var), "%s was considered valid" % var.inspect)
-        end
-
-    end
-
-    def test_evaluate
-        parser = mkparser
-        config = mkcompile
-        config.send(:evaluate_main)
-        scope = config.topscope
-        klass = parser.newdefine "yayness",
-            :arguments => [["owner", stringobj("nobody")], %w{mode}],
-            :code => AST::ASTArray.new(
-                :children => [resourcedef("file", "/tmp/$name",
-                        "owner" => varref("owner"), "mode" => varref("mode"))]
-            )
-
-        resource = Puppet::Parser::Resource.new(
-            :title => "first",
-            :type => "yayness",
-            :exported => false,
-            :virtual => false,
-            :scope => scope,
-            :source => scope.source
-        )
-        resource.send(:set_parameter, "name", "first")
-        resource.send(:set_parameter, "mode", "755")
-
-        resource.stubs(:title)
-        assert_nothing_raised do
-            klass.evaluate(:scope => scope, :resource => resource)
-        end
-
-        firstobj = config.findresource("File[/tmp/first]")
-        assert(firstobj, "Did not create /tmp/first obj")
-
-        assert_equal("File", firstobj.type)
-        assert_equal("/tmp/first", firstobj.title)
-        assert_equal("nobody", firstobj[:owner])
-        assert_equal("755", firstobj[:mode])
-
-        # Make sure we can't evaluate it with the same args
-        assert_raise(Puppet::ParseError) do
-            klass.evaluate(:scope => scope, :resource => resource)
-        end
-
-        # Now create another with different args
-        resource2 = Puppet::Parser::Resource.new(
-            :title => "second",
-            :type => "yayness",
-            :exported => false,
-            :virtual => false,
-            :scope => scope,
-            :source => scope.source
-        )
-        resource2.send(:set_parameter, "name", "second")
-        resource2.send(:set_parameter, "mode", "755")
-        resource2.send(:set_parameter, "owner", "daemon")
-
-        assert_nothing_raised do
-            klass.evaluate(:scope => scope, :resource => resource2)
-        end
-
-        secondobj = config.findresource("File[/tmp/second]")
-        assert(secondobj, "Did not create /tmp/second obj")
-
-        assert_equal("File", secondobj.type)
-        assert_equal("/tmp/second", secondobj.title)
-        assert_equal("daemon", secondobj[:owner])
-        assert_equal("755", secondobj[:mode])
-    end
-
-    # #539 - definitions should support both names and titles
-    def test_names_and_titles
-        parser = mkparser
-        scope = mkscope :parser => parser
-
-        [
-            {:name => "one", :title => "two"},
-            {:title => "mytitle"}
-        ].each_with_index do |hash, i|
-            # Create a definition that uses both name and title.  Put this
-            # inside the loop so the subscope expectations work.
-            klass = parser.newdefine "yayness%s" % i
-
-            resource = Puppet::Parser::Resource.new(
-                :title => hash[:title],
-                :type => "yayness%s" % i,
-                :exported => false,
-                :virtual => false,
-                :scope => scope,
-                :source => scope.source
-            )
-
-            subscope = klass.subscope(scope, resource)
-
-            klass.expects(:subscope).returns(subscope)
-
-            if hash[:name]
-                resource.stubs(:to_hash).returns({:name => hash[:name]})
-            end
-
-            assert_nothing_raised("Could not evaluate definition with %s" % hash.inspect) do
-                klass.evaluate(:scope => scope, :resource => resource)
-            end
-
-            name = hash[:name] || hash[:title]
-            title = hash[:title]
-
-            assert_equal(name, subscope.lookupvar("name"),
-                "Name did not get set correctly")
-            assert_equal(title, subscope.lookupvar("title"),
-                "title did not get set correctly")
-
-            [:name, :title].each do |param|
-                val = resource.send(param)
-                assert(subscope.tags.include?(val),
-                    "Scope was not tagged with %s '%s'" % [param, val])
-            end
-        end
-    end
-
-    # Testing the root cause of #615.  We should be using the fqname for the type, instead
-    # of just the short name.
-    def test_fully_qualified_types
-        parser = mkparser
-        klass = parser.newclass("one::two")
-
-        assert_equal("one::two", klass.classname, "Class did not get fully qualified class name")
-    end
-end
diff --git a/test/language/ast/hostclass.rb b/test/language/ast/hostclass.rb
deleted file mode 100755
index 80032f3..0000000
--- a/test/language/ast/hostclass.rb
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/env ruby
-#
-#  Created by Luke A. Kanies on 2006-02-20.
-#  Copyright (c) 2006. All rights reserved.
-
-require File.dirname(__FILE__) + '/../../lib/puppettest'
-
-require 'puppettest'
-require 'puppettest/parsertesting'
-require 'puppettest/resourcetesting'
-require 'mocha'
-
-class TestASTHostClass < Test::Unit::TestCase
-	include PuppetTest
-	include PuppetTest::ParserTesting
-    include PuppetTest::ResourceTesting
-	AST = Puppet::Parser::AST
-
-    def test_hostclass
-        scope = mkscope
-        parser = scope.compile.parser
-
-        # Create the class we're testing, first with no parent
-        klass = parser.newclass "first",
-            :code => AST::ASTArray.new(
-                :children => [resourcedef("file", "/tmp",
-                        "owner" => "nobody", "mode" => "755")]
-            )
-
-        resource = Puppet::Parser::Resource.new(:type => "class", :title => "first", :scope => scope)
-        assert_nothing_raised do
-            klass.evaluate(:scope => scope, :resource => resource)
-        end
-
-        # Then try it again
-        assert_nothing_raised do
-            klass.evaluate(:scope => scope, :resource => resource)
-        end
-
-        assert(scope.compile.class_scope(klass), "Class was not considered evaluated")
-
-        tmp = scope.findresource("File[/tmp]")
-        assert(tmp, "Could not find file /tmp")
-        assert_equal("nobody", tmp[:owner])
-        assert_equal("755", tmp[:mode])
-
-        # Now create a couple more classes.
-        newbase = parser.newclass "newbase",
-            :code => AST::ASTArray.new(
-                :children => [resourcedef("file", "/tmp/other",
-                        "owner" => "nobody", "mode" => "644")]
-            )
-
-        newsub = parser.newclass "newsub",
-            :parent => "newbase",
-            :code => AST::ASTArray.new(
-                :children => [resourcedef("file", "/tmp/yay",
-                        "owner" => "nobody", "mode" => "755"),
-                    resourceoverride("file", "/tmp/other",
-                            "owner" => "daemon")
-                ]
-            )
-
-        # Override a different variable in the top scope.
-        moresub = parser.newclass "moresub",
-            :parent => "newbase",
-            :code => AST::ASTArray.new(
-                :children => [resourceoverride("file", "/tmp/other",
-                            "mode" => "755")]
-            )
-
-        assert_nothing_raised do
-            newsub.evaluate(:scope => scope, :resource => resource)
-        end
-
-        assert_nothing_raised do
-            moresub.evaluate(:scope => scope, :resource => resource)
-        end
-
-        assert(scope.compile.class_scope(newbase), "Did not eval newbase")
-        assert(scope.compile.class_scope(newsub), "Did not eval newsub")
-
-        yay = scope.findresource("File[/tmp/yay]")
-        assert(yay, "Did not find file /tmp/yay")
-        assert_equal("nobody", yay[:owner])
-        assert_equal("755", yay[:mode])
-
-        other = scope.findresource("File[/tmp/other]")
-        assert(other, "Did not find file /tmp/other")
-        assert_equal("daemon", other[:owner])
-        assert_equal("755", other[:mode])
-    end
-
-    # Make sure that classes set their namespaces to themselves.  This
-    # way they start looking for definitions in their own namespace.
-    def test_hostclass_namespace
-        scope = mkscope
-        parser = scope.compile.parser
-
-        # Create a new class
-        klass = nil
-        assert_nothing_raised do
-            klass = parser.newclass "funtest"
-        end
-
-        # Now define a definition in that namespace
-
-        define = nil
-        assert_nothing_raised do
-            define = parser.newdefine "funtest::mydefine"
-        end
-
-        assert_equal("funtest", klass.namespace,
-            "component namespace was not set in the class")
-
-        assert_equal("funtest", define.namespace,
-            "component namespace was not set in the definition")
-
-        newscope = klass.subscope(scope, mock("resource"))
-
-        assert_equal(["funtest"], newscope.namespaces,
-            "Scope did not inherit namespace")
-
-        # Now make sure we can find the define
-        assert(newscope.finddefine("mydefine"),
-            "Could not find definition in my enclosing class")
-    end
-
-    # Make sure that our scope is a subscope of the parentclass's scope.
-    # At the same time, make sure definitions in the parent class can be
-    # found within the subclass (#517).
-    def test_parent_scope_from_parentclass
-        scope = mkscope
-        parser = scope.compile.parser
-
-        source = parser.newclass ""
-        parser.newclass("base")
-        fun = parser.newdefine("base::fun")
-        parser.newclass("middle", :parent => "base")
-        parser.newclass("sub", :parent => "middle")
-        scope = mkscope :parser => parser
-
-        ret = nil
-        assert_nothing_raised do
-            ret = scope.compile.evaluate_classes(["sub"], scope)
-        end
-        scope.compile.send(:evaluate_generators)
-
-        subscope = scope.compile.class_scope(scope.findclass("sub"))
-        assert(subscope, "could not find sub scope")
-        mscope = scope.compile.class_scope(scope.findclass("middle"))
-        assert(mscope, "could not find middle scope")
-        pscope = scope.compile.class_scope(scope.findclass("base"))
-        assert(pscope, "could not find parent scope")
-
-        assert(pscope == mscope.parent, "parent scope of middle was not set correctly")
-        assert(mscope == subscope.parent, "parent scope of sub was not set correctly")
-
-        result = mscope.finddefine("fun")
-        assert(result, "could not find parent-defined definition from middle")
-        assert(fun == result, "found incorrect parent-defined definition from middle")
-
-        result = subscope.finddefine("fun")
-        assert(result, "could not find parent-defined definition from sub")
-        assert(fun == result, "found incorrect parent-defined definition from sub")
-    end
-
-    # #795 - make sure the subclass's tags get set before we
-    # evaluate the parent class, so we can be sure that the parent
-    # class can switch based on the sub classes.
-    def test_tags_set_before_parent_is_evaluated
-        scope = mkscope
-        parser = scope.compile.parser
-        base = parser.newclass "base"
-        sub = parser.newclass "sub", :parent => "base"
-
-        base.expects(:safeevaluate).with do |args|
-            assert(scope.compile.catalog.tags.include?("sub"), "Did not tag with sub class name before evaluating base class")
-            base.evaluate(args)
-            true
-        end
-        sub.evaluate :scope => scope, :resource => scope.resource
-    end
-end
diff --git a/test/language/ast/resource.rb b/test/language/ast/resource.rb
index c99d98e..97541d9 100755
--- a/test/language/ast/resource.rb
+++ b/test/language/ast/resource.rb
@@ -16,8 +16,7 @@ class TestASTResource< Test::Unit::TestCase
     def setup
         super
         @scope = mkscope
-        @parser = @scope.compile.parser
-        @scope.compile.send(:evaluate_main)
+        @parser = @scope.compiler.parser
     end
 
     def newdef(type, title, params = nil)
@@ -36,24 +35,24 @@ class TestASTResource< Test::Unit::TestCase
         title = "title"
 
         # First try a qualified type
-        assert_equal("One::Two", newdef("two", title).evaluate(:scope => twoscope)[0].type,
+        assert_equal("One::Two", newdef("two", title).evaluate(twoscope)[0].type,
             "Defined type was not made fully qualified")
 
         # Then try a type that does not need to be qualified
-        assert_equal("One", newdef("one", title).evaluate(:scope => twoscope)[0].type,
+        assert_equal("One", newdef("one", title).evaluate(twoscope)[0].type,
             "Unqualified defined type was not handled correctly")
 
         # Then an unqualified type from within the one namespace
-        assert_equal("Three", newdef("three", title).evaluate(:scope => twoscope)[0].type,
+        assert_equal("Three", newdef("three", title).evaluate(twoscope)[0].type,
             "Defined type was not made fully qualified")
 
         # Then a builtin type
-        assert_equal("File", newdef("file", title).evaluate(:scope => twoscope)[0].type,
+        assert_equal("File", newdef("file", title).evaluate(twoscope)[0].type,
             "Builtin type was not handled correctly")
 
         # Now try a type that does not exist, which should throw an error.
         assert_raise(Puppet::ParseError, "Did not fail on a missing type in a resource reference") do
-            newdef("nosuchtype", title).evaluate(:scope => twoscope)
+            newdef("nosuchtype", title).evaluate(twoscope)
         end
     end
 end
diff --git a/test/language/ast/resource_reference.rb b/test/language/ast/resource_reference.rb
index c9fde07..1f554d9 100755
--- a/test/language/ast/resource_reference.rb
+++ b/test/language/ast/resource_reference.rb
@@ -20,7 +20,7 @@ class TestASTResourceReference < Test::Unit::TestCase
     def setup
         super
         @scope = mkscope
-        @parser = @scope.compile.parser
+        @parser = @scope.compiler.parser
     end
 
     def test_evaluate
@@ -31,7 +31,7 @@ class TestASTResourceReference < Test::Unit::TestCase
 
             evaled = nil
             assert_nothing_raised("Could not evaluate resource ref") do
-                evaled = ref.evaluate(:scope => @scope)
+                evaled = ref.evaluate(@scope)
             end
 
             assert_equal(type, evaled.type, "Type did not translate correctly")
@@ -44,7 +44,7 @@ class TestASTResourceReference < Test::Unit::TestCase
         ref = newref("Class", "one")
         evaled = nil
         assert_nothing_raised("Could not evaluate resource ref") do
-            evaled = ref.evaluate(:scope => @scope)
+            evaled = ref.evaluate(@scope)
         end
 
         assert_equal("Class", evaled.type, "Did not set type to 'class'")
@@ -61,24 +61,24 @@ class TestASTResourceReference < Test::Unit::TestCase
         title = "title"
 
         # First try a qualified type
-        assert_equal("One::Two", newref("two", title).evaluate(:scope => twoscope).type,
+        assert_equal("One::Two", newref("two", title).evaluate(twoscope).type,
             "Defined type was not made fully qualified")
 
         # Then try a type that does not need to be qualified
-        assert_equal("One", newref("one", title).evaluate(:scope => twoscope).type,
+        assert_equal("One", newref("one", title).evaluate(twoscope).type,
             "Unqualified defined type was not handled correctly")
 
         # Then an unqualified type from within the one namespace
-        assert_equal("Three", newref("three", title).evaluate(:scope => twoscope).type,
+        assert_equal("Three", newref("three", title).evaluate(twoscope).type,
             "Defined type was not made fully qualified")
 
         # Then a builtin type
-        assert_equal("File", newref("file", title).evaluate(:scope => twoscope).type,
+        assert_equal("File", newref("file", title).evaluate(twoscope).type,
             "Builtin type was not handled correctly")
 
         # Now try a type that does not exist, which should throw an error.
         assert_raise(Puppet::ParseError, "Did not fail on a missing type in a resource reference") do
-            newref("nosuchtype", title).evaluate(:scope => twoscope)
+            newref("nosuchtype", title).evaluate(twoscope)
         end
 
         # Now run the same tests, but with the classes
@@ -86,20 +86,20 @@ class TestASTResourceReference < Test::Unit::TestCase
         @parser.newclass "one::five"
 
         # First try an unqualified type
-        assert_equal("four", newref("class", "four").evaluate(:scope => twoscope).title,
+        assert_equal("four", newref("class", "four").evaluate(twoscope).title,
             "Unqualified class was not found")
 
         # Then a qualified class
-        assert_equal("one::five", newref("class", "five").evaluate(:scope => twoscope).title,
+        assert_equal("one::five", newref("class", "five").evaluate(twoscope).title,
             "Class was not made fully qualified")
 
         # Then try a type that does not need to be qualified
-        assert_equal("four", newref("class", "four").evaluate(:scope => twoscope).title,
+        assert_equal("four", newref("class", "four").evaluate(twoscope).title,
             "Unqualified class was not handled correctly")
 
         # Now try a type that does not exist, which should throw an error.
         assert_raise(Puppet::ParseError, "Did not fail on a missing type in a resource reference") do
-            newref("class", "nosuchclass").evaluate(:scope => twoscope)
+            newref("class", "nosuchclass").evaluate(twoscope)
         end
     end
 end
diff --git a/test/language/ast/selector.rb b/test/language/ast/selector.rb
index 535fcbf..6e923bd 100755
--- a/test/language/ast/selector.rb
+++ b/test/language/ast/selector.rb
@@ -37,7 +37,7 @@ class TestSelector < Test::Unit::TestCase
             params = maker.call()
             sel = AST::Selector.new(:param => param, :values => params.values)
             result = nil
-            assert_nothing_raised { result = sel.evaluate(:scope => scope) }
+            assert_nothing_raised { result = sel.evaluate(scope) }
             assert_equal(should[str], result, "did not case-sensitively match %s" % str)
         end
         
@@ -53,7 +53,7 @@ class TestSelector < Test::Unit::TestCase
             params.delete(:upper)
             sel = AST::Selector.new(:param => param, :values => params.values)
             result = nil
-            assert_nothing_raised { result = sel.evaluate(:scope => scope) }
+            assert_nothing_raised { result = sel.evaluate(scope) }
             assert_equal("lower", result, "did not case-insensitively match %s" % str)
         end
     end
diff --git a/test/language/ast/variable.rb b/test/language/ast/variable.rb
index 09122ce..bde397b 100755
--- a/test/language/ast/variable.rb
+++ b/test/language/ast/variable.rb
@@ -22,9 +22,9 @@ class TestVariable < Test::Unit::TestCase
     end
 
     def test_evaluate
-        assert_equal("", @var.evaluate(:scope => @scope), "did not return empty string on unset var")
+        assert_equal("", @var.evaluate(@scope), "did not return empty string on unset var")
         @scope.setvar(@name, "something")
-        assert_equal("something", @var.evaluate(:scope => @scope), "incorrect variable value")
+        assert_equal("something", @var.evaluate(@scope), "incorrect variable value")
     end
 end
 
diff --git a/test/language/compile.rb b/test/language/compile.rb
deleted file mode 100755
index 298493c..0000000
--- a/test/language/compile.rb
+++ /dev/null
@@ -1,569 +0,0 @@
-#!/usr/bin/env ruby
-
-require File.dirname(__FILE__) + '/../lib/puppettest'
-
-require 'mocha'
-require 'puppettest'
-require 'puppettest/parsertesting'
-require 'puppet/parser/compile'
-
-# Test our compile object.
-class TestCompile < Test::Unit::TestCase
-    include PuppetTest
-    include PuppetTest::ParserTesting
-
-    Compile = Puppet::Parser::Compile 
-    Scope = Puppet::Parser::Scope 
-    Node = Puppet::Network::Handler.handler(:node)
-    SimpleNode = Puppet::Node
-
-    def mknode(name = "foo")
-        @node = SimpleNode.new(name)
-    end
-
-    def mkparser
-        # This should mock an interpreter
-        @parser = stub 'parser', :version => "1.0", :nodes => {}
-    end
-
-    def mkcompile(options = {})
-        if node = options[:node]
-            options.delete(:node)
-        else
-            node = mknode
-        end
-        @compile = Compile.new(node, mkparser, options)
-    end
-
-    def test_initialize
-        compile = nil
-        node = stub 'node', :name => "foo"
-        parser = stub 'parser', :version => "1.0", :nodes => {}
-        assert_nothing_raised("Could not init compile with all required options") do
-            compile = Compile.new(node, parser)
-        end
-
-        assert_equal(node, compile.node, "Did not set node correctly")
-        assert_equal(parser, compile.parser, "Did not set parser correctly")
-
-        # We're not testing here whether we call initvars, because it's too difficult to
-        # mock.
-
-        # Now try it with some options
-        assert_nothing_raised("Could not init compile with extra options") do
-            compile = Compile.new(node, parser)
-        end
-
-        assert_equal(false, compile.ast_nodes?, "Did not set ast_nodes? correctly")
-    end
-
-    def test_initvars
-        compile = mkcompile
-        [:class_scopes, :resource_table, :exported_resources, :resource_overrides].each do |table|
-            assert_instance_of(Hash, compile.send(:instance_variable_get, "@#{table}"), "Did not set %s table correctly" % table)
-        end
-        assert_instance_of(Scope, compile.topscope, "Did not create a topscope")
-        graph = compile.instance_variable_get("@scope_graph")
-        assert_instance_of(GRATR::Digraph, graph, "Did not create scope graph")
-        assert(graph.vertex?(compile.topscope), "Did not add top scope as a vertex in the graph")
-    end
-
-    # Make sure we store and can retrieve references to classes and their scopes.
-    def test_class_set_and_class_scope
-        klass = mock 'ast_class'
-        klass.expects(:classname).returns("myname")
-
-        compile = mkcompile
-        compile.catalog.expects(:tag).with("myname")
-        
-        assert_nothing_raised("Could not set class") do
-            compile.class_set "myname", "myscope"
-        end
-        # First try to retrieve it by name.
-        assert_equal("myscope", compile.class_scope("myname"), "Could not retrieve class scope by name")
-
-        # Then by object
-        assert_equal("myscope", compile.class_scope(klass), "Could not retrieve class scope by object")
-    end
-    
-    def test_classlist
-        compile = mkcompile
-
-        compile.class_set "", "empty"
-        compile.class_set "one", "yep"
-        compile.class_set "two", "nope"
-
-        # Make sure our class list is correct
-        assert_equal(%w{one two}.sort, compile.classlist.sort, "Did not get correct class list")
-    end
-
-    # Make sure collections get added to our internal array
-    def test_add_collection
-        compile = mkcompile
-        assert_nothing_raised("Could not add collection") do
-            compile.add_collection "nope"
-        end
-        assert_equal(%w{nope}, compile.instance_variable_get("@collections"), "Did not add collection")
-    end
-
-    # Make sure we create a graph of scopes.
-    def test_newscope
-        compile = mkcompile
-        graph = compile.instance_variable_get("@scope_graph")
-        assert_instance_of(Scope, compile.topscope, "Did not create top scope")
-        assert_instance_of(GRATR::Digraph, graph, "Did not create graph")
-
-        assert(graph.vertex?(compile.topscope), "The top scope is not a vertex in the graph")
-
-        # Now that we've got the top scope, create a new, subscope
-        subscope = nil
-        assert_nothing_raised("Could not create subscope") do
-            subscope = compile.newscope(compile.topscope)
-        end
-        assert_instance_of(Scope, subscope, "Did not create subscope")
-        assert(graph.edge?(compile.topscope, subscope), "An edge between top scope and subscope was not added")
-
-        # Make sure a scope can find its parent.
-        assert(compile.parent(subscope), "Could not look up parent scope on compile")
-        assert_equal(compile.topscope.object_id, compile.parent(subscope).object_id, "Did not get correct parent scope from compile")
-        assert_equal(compile.topscope.object_id, subscope.parent.object_id, "Scope did not correctly retrieve its parent scope")
-
-        # Now create another, this time specifying options
-        another = nil
-        assert_nothing_raised("Could not create subscope") do
-            another = compile.newscope(subscope, :level => 5)
-        end
-        assert_equal(5, another.level, "did not set scope option correctly")
-        assert_instance_of(Scope, another, "Did not create second subscope")
-        assert(graph.edge?(subscope, another), "An edge between parent scope and second subscope was not added")
-
-        # Make sure it can find its parent.
-        assert(compile.parent(another), "Could not look up parent scope of second subscope on compile")
-        assert_equal(subscope.object_id, compile.parent(another).object_id, "Did not get correct parent scope of second subscope from compile")
-        assert_equal(subscope.object_id, another.parent.object_id, "Second subscope did not correctly retrieve its parent scope")
-
-        # And make sure both scopes show up in the right order in the search path
-        assert_equal([another.object_id, subscope.object_id, compile.topscope.object_id], another.scope_path.collect { |p| p.object_id },
-            "Did not get correct scope path")
-    end
-
-    # The heart of the action.
-    def test_compile
-        compile = mkcompile
-        [:set_node_parameters, :evaluate_main, :evaluate_ast_node, :evaluate_node_classes, :evaluate_generators, :fail_on_unevaluated, :finish].each do |method|
-            compile.expects(method)
-        end
-        assert_instance_of(Puppet::Node::Catalog, compile.compile, "Did not return the catalog")
-    end
-
-    # Test setting the node's parameters into the top scope.
-    def test_set_node_parameters
-        compile = mkcompile
-        @node.parameters = {"a" => "b", "c" => "d"}
-        scope = compile.topscope
-        @node.parameters.each do |param, value|
-            scope.expects(:setvar).with(param, value)
-        end
-
-        assert_nothing_raised("Could not call 'set_node_parameters'") do
-            compile.send(:set_node_parameters)
-        end
-    end
-
-    # Test that we can evaluate the main class, which is the one named "" in namespace
-    # "".
-    def test_evaluate_main
-        compile = mkcompile
-        main_class = mock 'main_class'
-        compile.topscope.expects(:source=).with(main_class)
-        @parser.expects(:findclass).with("", "").returns(main_class)
-
-        main_resource = mock 'main resource'
-        Puppet::Parser::Resource.expects(:new).with { |args| args[:title] == :main }.returns(main_resource)
-
-        main_resource.expects(:evaluate)
-
-        assert_nothing_raised("Could not call evaluate_main") do
-            compile.send(:evaluate_main)
-        end
-    end
-
-    def test_evaluate_node_classes
-        compile = mkcompile
-        @node.classes = %w{one two three four}
-        compile.expects(:evaluate_classes).with(%w{one two three four}, compile.topscope)
-        assert_nothing_raised("could not call evaluate_node_classes") do
-            compile.send(:evaluate_node_classes)
-        end
-    end
-
-    def test_evaluate_collections
-        compile = mkcompile
-
-        colls = []
-
-        # Make sure we return false when there's nothing there.
-        assert(! compile.send(:evaluate_collections), "Returned true when there were no collections")
-
-        # And when the collections fail to evaluate.
-        colls << mock("coll1-false")
-        colls << mock("coll2-false")
-        colls.each { |c| c.expects(:evaluate).returns(false) }
-
-        compile.instance_variable_set("@collections", colls)
-        assert(! compile.send(:evaluate_collections), "Returned true when collections both evaluated nothing")
-
-        # Now have one of the colls evaluate
-        colls.clear
-        colls << mock("coll1-one-true")
-        colls << mock("coll2-one-true")
-        colls[0].expects(:evaluate).returns(true)
-        colls[1].expects(:evaluate).returns(false)
-        assert(compile.send(:evaluate_collections), "Did not return true when one collection evaluated true")
-
-        # And have them both eval true
-        colls.clear
-        colls << mock("coll1-both-true")
-        colls << mock("coll2-both-true")
-        colls[0].expects(:evaluate).returns(true)
-        colls[1].expects(:evaluate).returns(true)
-        assert(compile.send(:evaluate_collections), "Did not return true when both collections evaluated true")
-    end
-
-    def test_unevaluated_resources
-        compile = mkcompile
-        resources = {}
-        compile.instance_variable_set("@resource_table", resources)
-
-        # First test it when the table is empty
-        assert_nil(compile.send(:unevaluated_resources), "Somehow found unevaluated resources in an empty table")
-
-        # Then add a builtin resources
-        resources["one"] = mock("builtin only")
-        resources["one"].expects(:builtin?).returns(true)
-        assert_nil(compile.send(:unevaluated_resources), "Considered a builtin resource unevaluated")
-
-        # And do both builtin and non-builtin but already evaluated
-        resources.clear
-        resources["one"] = mock("builtin (with eval)")
-        resources["one"].expects(:builtin?).returns(true)
-        resources["two"] = mock("evaled (with builtin)")
-        resources["two"].expects(:builtin?).returns(false)
-        resources["two"].expects(:evaluated?).returns(true)
-        assert_nil(compile.send(:unevaluated_resources), "Considered either a builtin or evaluated resource unevaluated")
-
-        # Now a single unevaluated resource.
-        resources.clear
-        resources["one"] = mock("unevaluated")
-        resources["one"].expects(:builtin?).returns(false)
-        resources["one"].expects(:evaluated?).returns(false)
-        assert_equal([resources["one"]], compile.send(:unevaluated_resources), "Did not find unevaluated resource")
-
-        # With two uneval'ed resources, and an eval'ed one thrown in
-        resources.clear
-        resources["one"] = mock("unevaluated one")
-        resources["one"].expects(:builtin?).returns(false)
-        resources["one"].expects(:evaluated?).returns(false)
-        resources["two"] = mock("unevaluated two")
-        resources["two"].expects(:builtin?).returns(false)
-        resources["two"].expects(:evaluated?).returns(false)
-        resources["three"] = mock("evaluated")
-        resources["three"].expects(:builtin?).returns(false)
-        resources["three"].expects(:evaluated?).returns(true)
-
-        result = compile.send(:unevaluated_resources)
-        %w{one two}.each do |name|
-            assert(result.include?(resources[name]), "Did not find %s in the unevaluated list" % name)
-        end
-    end
-
-    def test_evaluate_definitions
-        # First try the case where there's nothing to return
-        compile = mkcompile
-        compile.expects(:unevaluated_resources).returns(nil)
-
-        assert_nothing_raised("Could not test for unevaluated resources") do
-            assert(! compile.send(:evaluate_definitions), "evaluate_definitions returned true when no resources were evaluated")
-        end
-
-        # Now try it with resources left to evaluate
-        resources = []
-        res1 = mock("resource1")
-        res1.expects(:evaluate)
-        res2 = mock("resource2")
-        res2.expects(:evaluate)
-        resources << res1 << res2
-        compile = mkcompile
-        compile.expects(:unevaluated_resources).returns(resources)
-
-        assert_nothing_raised("Could not test for unevaluated resources") do
-            assert(compile.send(:evaluate_definitions), "evaluate_definitions returned false when resources were evaluated")
-        end
-    end
-
-    def test_evaluate_generators
-        # First try the case where we have nothing to do
-        compile = mkcompile
-        compile.expects(:evaluate_definitions).returns(false)
-        compile.expects(:evaluate_collections).returns(false)
-
-        assert_nothing_raised("Could not call :eval_iterate") do
-            compile.send(:evaluate_generators)
-        end
-
-        # FIXME I could not get this test to work, but the code is short
-        # enough that I'm ok with it.
-        # It's important that collections are evaluated before definitions,
-        # so make sure that's the case by verifying that collections get tested
-        # twice but definitions only once.
-        #compile = mkcompile
-        #compile.expects(:evaluate_collections).returns(true).returns(false)
-        #compile.expects(:evaluate_definitions).returns(false)
-        #compile.send(:eval_iterate)
-    end
-
-    def test_store
-        compile = mkcompile
-        Puppet.features.expects(:rails?).returns(true)
-        Puppet::Rails.expects(:connect)
-
-        node = mock 'node'
-        resource_table = mock 'resources'
-        resource_table.expects(:values).returns(:resources)
-        compile.instance_variable_set("@node", node)
-        compile.instance_variable_set("@resource_table", resource_table)
-        compile.expects(:store_to_active_record).with(node, :resources)
-        compile.send(:store)
-    end
-
-    def test_store_to_active_record
-        compile = mkcompile
-        node = mock 'node'
-        node.expects(:name).returns("myname")
-        Puppet::Rails::Host.stubs(:transaction).yields
-        Puppet::Rails::Host.expects(:store).with(node, :resources)
-        compile.send(:store_to_active_record, node, :resources)
-    end
-
-    # Make sure that 'finish' gets called on all of our resources.
-    def test_finish
-        compile = mkcompile
-        table = compile.instance_variable_get("@resource_table")
-
-        # Add a resource that does respond to :finish
-        yep = mock("finisher")
-        yep.expects(:respond_to?).with(:finish).returns(true)
-        yep.expects(:finish)
-        table["yep"] = yep
-
-        # And one that does not
-        dnf = mock("dnf")
-        dnf.expects(:respond_to?).with(:finish).returns(false)
-        table["dnf"] = dnf
-
-        compile.send(:finish)
-    end
-
-    def test_verify_uniqueness
-        compile = mkcompile
-
-        resources = compile.instance_variable_get("@resource_table")
-        resource = mock("noconflict")
-        resource.expects(:ref).returns("File[yay]")
-        assert_nothing_raised("Raised an exception when there should have been no conflict") do
-            compile.send(:verify_uniqueness, resource)
-        end
-
-        # Now try the case where our type is isomorphic
-        resources["thing"] = true
-
-        isoconflict = mock("isoconflict")
-        isoconflict.expects(:ref).returns("thing")
-        isoconflict.expects(:type).returns("testtype")
-        faketype = mock("faketype")
-        faketype.expects(:isomorphic?).returns(false)
-        faketype.expects(:name).returns("whatever")
-        Puppet::Type.expects(:type).with("testtype").returns(faketype)
-        assert_nothing_raised("Raised an exception when was a conflict in non-isomorphic types") do
-            compile.send(:verify_uniqueness, isoconflict)
-        end
-
-        # Now test for when we actually have an exception
-        initial = mock("initial")
-        resources["thing"] = initial
-        initial.expects(:file).returns(false)
-
-        conflict = mock("conflict")
-        conflict.expects(:ref).returns("thing").times(2)
-        conflict.expects(:type).returns("conflict")
-        conflict.expects(:file).returns(false)
-        conflict.expects(:line).returns(false)
-
-        faketype = mock("faketype")
-        faketype.expects(:isomorphic?).returns(true)
-        Puppet::Type.expects(:type).with("conflict").returns(faketype)
-        assert_raise(Puppet::ParseError, "Did not fail when two isomorphic resources conflicted") do
-            compile.send(:verify_uniqueness, conflict)
-        end
-    end
-
-    def test_store_resource
-        # Run once when there's no conflict
-        compile = mkcompile
-        table = compile.instance_variable_get("@resource_table")
-        resource = mock("resource")
-        resource.expects(:ref).returns("yay")
-        compile.expects(:verify_uniqueness).with(resource)
-        scope = stub("scope", :resource => mock('resource'))
-
-        compile.catalog.expects(:add_edge!).with(scope.resource, resource)
-
-        assert_nothing_raised("Could not store resource") do
-            compile.store_resource(scope, resource)
-        end
-        assert_equal(resource, table["yay"], "Did not store resource in table")
-
-        # Now for conflicts
-        compile = mkcompile
-        table = compile.instance_variable_get("@resource_table")
-        resource = mock("resource")
-        compile.expects(:verify_uniqueness).with(resource).raises(ArgumentError)
-
-        assert_raise(ArgumentError, "Did not raise uniqueness exception") do
-            compile.store_resource(scope, resource)
-        end
-        assert(table.empty?, "Conflicting resource was stored in table")
-    end
-
-    def test_fail_on_unevaluated
-        compile = mkcompile
-        compile.expects(:fail_on_unevaluated_overrides)
-        compile.expects(:fail_on_unevaluated_resource_collections)
-        compile.send :fail_on_unevaluated
-    end
-
-    def test_store_override
-        # First test the case when the resource is not present.
-        compile = mkcompile
-        overrides = compile.instance_variable_get("@resource_overrides")
-        override = Object.new
-        override.expects(:ref).returns(:myref).times(2)
-        override.expects(:override=).with(true)
-
-        assert_nothing_raised("Could not call store_override") do
-            compile.store_override(override)
-        end
-        assert_instance_of(Array, overrides[:myref], "Overrides table is not a hash of arrays")
-        assert_equal(override, overrides[:myref][0], "Did not store override in appropriately named array")
-
-        # And when the resource already exists.
-        resource = mock 'resource'
-        resources = compile.instance_variable_get("@resource_table")
-        resources[:resref] = resource
-
-        override = mock 'override'
-        resource.expects(:merge).with(override)
-        override.expects(:override=).with(true)
-        override.expects(:ref).returns(:resref)
-        assert_nothing_raised("Could not call store_override when the resource already exists.") do
-            compile.store_override(override)
-        end
-    end
-
-    def test_resource_overrides
-        compile = mkcompile
-        overrides = compile.instance_variable_get("@resource_overrides")
-        overrides[:test] = :yay
-        resource = mock 'resource'
-        resource.expects(:ref).returns(:test)
-
-        assert_equal(:yay, compile.resource_overrides(resource), "Did not return overrides from table")
-    end
-
-    def test_fail_on_unevaluated_resource_collections
-        compile = mkcompile
-        collections = compile.instance_variable_get("@collections")
-
-        # Make sure we're fine when the list is empty
-        assert_nothing_raised("Failed when no collections were present") do
-            compile.send :fail_on_unevaluated_resource_collections
-        end
-
-        # And that we're fine when we've got collections but with no resources
-        collections << mock('coll')
-        collections[0].expects(:resources).returns(nil)
-        assert_nothing_raised("Failed when no resource collections were present") do
-            compile.send :fail_on_unevaluated_resource_collections
-        end
-
-        # But that we do fail when we've got resource collections left.
-        collections.clear
-
-        # return both an array and a string, because that's tested internally
-        collections << mock('coll returns one')
-        collections[0].expects(:resources).returns(:something)
-
-        collections << mock('coll returns many')
-        collections[1].expects(:resources).returns([:one, :two])
-
-        assert_raise(Puppet::ParseError, "Did not fail on unevaluated resource collections") do
-            compile.send :fail_on_unevaluated_resource_collections
-        end
-    end
-
-    def test_fail_on_unevaluated_overrides
-        compile = mkcompile
-        overrides = compile.instance_variable_get("@resource_overrides")
-
-        # Make sure we're fine when the list is empty
-        assert_nothing_raised("Failed when no collections were present") do
-            compile.send :fail_on_unevaluated_overrides
-        end
-
-        # But that we fail if there are any overrides left in the table.
-        overrides[:yay] = []
-        overrides[:foo] = []
-        overrides[:bar] = [mock("override")]
-        overrides[:bar][0].expects(:ref).returns("yay")
-        assert_raise(Puppet::ParseError, "Failed to fail when overrides remain") do
-            compile.send :fail_on_unevaluated_overrides
-        end
-    end
-
-    def test_find_resource
-        compile = mkcompile
-        resources = compile.instance_variable_get("@resource_table")
-
-        assert_nothing_raised("Could not call findresource when the resource table was empty") do
-            assert_nil(compile.findresource("yay", "foo"), "Returned a non-existent resource")
-            assert_nil(compile.findresource("yay[foo]"), "Returned a non-existent resource")
-        end
-
-        resources["Foo[bar]"] = :yay
-        assert_nothing_raised("Could not call findresource when the resource table was not empty") do
-            assert_equal(:yay, compile.findresource("foo", "bar"), "Returned a non-existent resource")
-            assert_equal(:yay, compile.findresource("Foo[bar]"), "Returned a non-existent resource")
-        end
-    end
-
-    # #620 - Nodes and classes should conflict, else classes don't get evaluated
-    def test_nodes_and_classes_name_conflict
-        # Test node then class
-        compile = mkcompile
-        node = stub :nodescope? => true
-        klass = stub :nodescope? => false
-        compile.class_set("one", node)
-        assert_raise(Puppet::ParseError, "Did not fail when replacing node with class") do
-            compile.class_set("one", klass)
-        end
-
-        # and class then node
-        compile = mkcompile
-        node = stub :nodescope? => true
-        klass = stub :nodescope? => false
-        compile.class_set("two", klass)
-        assert_raise(Puppet::ParseError, "Did not fail when replacing node with class") do
-            compile.class_set("two", node)
-        end
-    end
-end
diff --git a/test/language/functions.rb b/test/language/functions.rb
index 132ee97..a5d52d7 100755
--- a/test/language/functions.rb
+++ b/test/language/functions.rb
@@ -41,7 +41,7 @@ class TestLangFunctions < Test::Unit::TestCase
         scope = mkscope
         val = nil
         assert_nothing_raised do
-            val = func.evaluate(:scope => scope)
+            val = func.evaluate(scope)
         end
 
         assert_equal("output avalue", val)
@@ -57,7 +57,7 @@ class TestLangFunctions < Test::Unit::TestCase
 
             val = nil
             assert_nothing_raised do
-                val = func.evaluate(:scope => scope)
+                val = func.evaluate(scope)
             end
 
             assert_equal(retval, val, "'tagged' returned %s for %s" % [val, tag])
@@ -66,7 +66,7 @@ class TestLangFunctions < Test::Unit::TestCase
         # Now make sure we correctly get tags.
         scope.resource.tag("resourcetag")
         assert(scope.function_tagged("resourcetag"), "tagged function did not catch resource tags")
-        scope.compile.catalog.tag("configtag")
+        scope.compiler.catalog.tag("configtag")
         assert(scope.function_tagged("configtag"), "tagged function did not catch catalog tags")
     end
 
@@ -86,7 +86,7 @@ class TestLangFunctions < Test::Unit::TestCase
         scope = mkscope
         val = nil
         assert_raise(Puppet::ParseError) do
-            val = func.evaluate(:scope => scope)
+            val = func.evaluate(scope)
         end
     end
 
@@ -117,16 +117,16 @@ class TestLangFunctions < Test::Unit::TestCase
 
         scope = mkscope
         assert_raise(Puppet::ParseError) do
-            ast.evaluate(:scope => scope)
+            ast.evaluate(scope)
         end
 
         scope.setvar("one", "One")
         assert_raise(Puppet::ParseError) do
-            ast.evaluate(:scope => scope)
+            ast.evaluate(scope)
         end
         scope.setvar("two", "Two")
         assert_nothing_raised do
-            ast.evaluate(:scope => scope)
+            ast.evaluate(scope)
         end
 
         assert_equal("template One\ntemplate Two\n", scope.lookupvar("output"),
@@ -155,13 +155,13 @@ class TestLangFunctions < Test::Unit::TestCase
 
         scope = mkscope
         assert_raise(Puppet::ParseError) do
-            ast.evaluate(:scope => scope)
+            ast.evaluate(scope)
         end
 
         scope.setvar("yayness", "this is yayness")
 
         assert_nothing_raised do
-            ast.evaluate(:scope => scope)
+            ast.evaluate(scope)
         end
 
         assert_equal("template this is yayness\n", scope.lookupvar("output"),
@@ -191,7 +191,7 @@ class TestLangFunctions < Test::Unit::TestCase
         scope = mkscope
         scope.setvar("myvar", "this is yayness")
         assert_raise(Puppet::ParseError) do
-            ast.evaluate(:scope => scope)
+            ast.evaluate(scope)
         end
     end
 
@@ -264,14 +264,14 @@ class TestLangFunctions < Test::Unit::TestCase
         }.each do |string, value|
             scope = mkscope
             assert_raise(Puppet::ParseError) do
-                ast.evaluate(:scope => scope)
+                ast.evaluate(scope)
             end
 
             scope.setvar("yayness", string)
             assert_equal(string, scope.lookupvar("yayness", false))
 
             assert_nothing_raised("An empty string was not a valid variable value") do
-                ast.evaluate(:scope => scope)
+                ast.evaluate(scope)
             end
 
             assert_equal("template #{value}\n", scope.lookupvar("output"),
@@ -308,7 +308,7 @@ class TestLangFunctions < Test::Unit::TestCase
 
     def test_realize
         scope = mkscope
-        parser = scope.compile.parser
+        parser = scope.compiler.parser
     
         # Make a definition
         parser.newdefine("mytype")
@@ -318,7 +318,7 @@ class TestLangFunctions < Test::Unit::TestCase
             virtual = mkresource(:type => type, :title => title,
                 :virtual => true, :params => {}, :scope => scope)
         
-            scope.compile.store_resource(scope, virtual)
+            scope.compiler.add_resource(scope, virtual)
 
             ref = Puppet::Parser::Resource::Reference.new(
                 :type => type, :title => title,
@@ -330,13 +330,13 @@ class TestLangFunctions < Test::Unit::TestCase
             end
 
             # Make sure it created a collection
-            assert_equal(1, scope.compile.collections.length,
+            assert_equal(1, scope.compiler.collections.length,
                 "Did not set collection")
 
             assert_nothing_raised do
-                scope.compile.collections.each do |coll| coll.evaluate end
+                scope.compiler.collections.each do |coll| coll.evaluate end
             end
-            scope.compile.collections.clear
+            scope.compiler.collections.clear
 
             # Now make sure the virtual resource is no longer virtual
             assert(! virtual.virtual?, "Did not make virtual resource real")
@@ -354,17 +354,17 @@ class TestLangFunctions < Test::Unit::TestCase
         end
 
         # Make sure it created a collection
-        assert_equal(1, scope.compile.collections.length,
+        assert_equal(1, scope.compiler.collections.length,
             "Did not set collection")
 
         # And the collection has our resource in it
-        assert_equal([none.to_s], scope.compile.collections[0].resources,
+        assert_equal([none.to_s], scope.compiler.collections[0].resources,
             "Did not set resources in collection")
     end
     
     def test_defined
         scope = mkscope
-        parser = scope.compile.parser
+        parser = scope.compiler.parser
         
         parser.newclass("yayness")
         parser.newdefine("rahness")
@@ -385,7 +385,7 @@ class TestLangFunctions < Test::Unit::TestCase
             "Multiple falses were somehow true")
         
         # Now make sure we can test resources
-        scope.compile.store_resource(scope, mkresource(:type => "file", :title => "/tmp/rahness",
+        scope.compiler.add_resource(scope, mkresource(:type => "file", :title => "/tmp/rahness",
             :scope => scope, :source => scope.source,
             :params => {:owner => "root"}))
         
@@ -420,7 +420,7 @@ class TestLangFunctions < Test::Unit::TestCase
 
     def test_include
         scope = mkscope
-        parser = scope.compile.parser
+        parser = scope.compiler.parser
 
         assert_raise(Puppet::ParseError, "did not throw error on missing class") do
             scope.function_include("nosuchclass")
@@ -428,7 +428,7 @@ class TestLangFunctions < Test::Unit::TestCase
 
         parser.newclass("myclass")
 
-        scope.compile.expects(:evaluate_classes).with(%w{myclass otherclass}, scope, false).returns(%w{myclass otherclass})
+        scope.compiler.expects(:evaluate_classes).with(%w{myclass otherclass}, scope, false).returns(%w{myclass otherclass})
 
         assert_nothing_raised do
             scope.function_include(["myclass", "otherclass"])
@@ -480,7 +480,7 @@ class TestLangFunctions < Test::Unit::TestCase
         assert_equal("yay-foo\n", %x{#{command} foo}, "command did not work")
 
         scope = mkscope
-        parser = scope.compile.parser
+        parser = scope.compiler.parser
 
         val = nil
         assert_nothing_raised("Could not call generator with no args") do
diff --git a/test/language/lexer.rb b/test/language/lexer.rb
deleted file mode 100755
index e09828d..0000000
--- a/test/language/lexer.rb
+++ /dev/null
@@ -1,276 +0,0 @@
-#!/usr/bin/env ruby
-
-require File.dirname(__FILE__) + '/../lib/puppettest'
-
-require 'puppet'
-require 'puppet/parser/lexer'
-require 'puppettest'
-
-#%q{service("telnet") = \{
-#    port => "23",
-#    protocol => "tcp",
-#    name => "telnet",
-#\}
-#} => [[:NAME, "service"], [:LPAREN, "("], [:DQUOTE, "\""], [:NAME, "telnet"], [:DQUOTE, "\""], [:RPAREN, ")"], [:EQUALS, "="], [:lbrace, "{"], [:NAME, "port"], [:FARROW, "=>"], [:DQUOTE, "\""], [:NAME, "23"], [:DQUOTE, "\""], [:COMMA, ","], [:NAME, "protocol"], [:FARROW, "=>"], [:DQUOTE, "\""], [:NAME, "tcp"], [:DQUOTE, "\""], [:COMMA, ","], [:NAME, "name"], [:FARROW, "=>"], [:DQUOTE, "\""], [:NAME, "telnet"], [:DQUOTE, "\""], [:COMMA, ","], [:RBRACE, "}"]]
-
-class TestLexer < Test::Unit::TestCase
-	include PuppetTest
-    def setup
-        super
-        mklexer
-    end
-
-    def mklexer
-        @lexer = Puppet::Parser::Lexer.new()
-    end
-
-    def test_simple_lex
-        strings = {
-%q{\\} => [[:BACKSLASH,"\\"],[false,false]],
-%q{simplest scanner test} => [[:NAME,"simplest"],[:NAME,"scanner"],[:NAME,"test"],[false,false]],
-%q{returned scanner test
-} => [[:NAME,"returned"],[:NAME,"scanner"],[:NAME,"test"],[false,false]]
-        }
-        strings.each { |str,ary|
-            @lexer.string = str
-            assert_equal(
-                ary,
-                @lexer.fullscan()
-            )
-        }
-    end
-
-    def test_quoted_strings
-        strings = {
-%q{a simple "scanner" test
-} => [[:NAME,"a"],[:NAME,"simple"],[:DQTEXT,"scanner"],[:NAME,"test"],[false,false]],
-%q{a simple 'single quote scanner' test
-} => [[:NAME,"a"],[:NAME,"simple"],[:SQTEXT,"single quote scanner"],[:NAME,"test"],[false,false]],
-%q{a harder 'a $b \c"'
-} => [[:NAME,"a"],[:NAME,"harder"],[:SQTEXT,'a $b \c"'],[false,false]],
-%q{a harder "scanner test"
-} => [[:NAME,"a"],[:NAME,"harder"],[:DQTEXT,"scanner test"],[false,false]],
-%q{a hardest "scanner \"test\""
-} => [[:NAME,"a"],[:NAME,"hardest"],[:DQTEXT,'scanner "test"'],[false,false]],
-%q{a hardestest "scanner \"test\"
-"
-} => [[:NAME,"a"],[:NAME,"hardestest"],[:DQTEXT,'scanner "test"
-'],[false,false]],
-%q{function("call")} => [[:NAME,"function"],[:LPAREN,"("],[:DQTEXT,'call'],[:RPAREN,")"],[false,false]]
-}
-        strings.each { |str,array|
-            @lexer.string = str
-            assert_equal(
-                array,
-                @lexer.fullscan()
-            )
-        }
-    end
-
-    def test_errors
-        strings = %w{
-            ^
-        }
-        strings.each { |str|
-            @lexer.string = str
-            assert_raise(RuntimeError) {
-                @lexer.fullscan()
-            }
-        }
-    end
-
-    def test_more_error
-        assert_raise(TypeError) {
-            @lexer.fullscan()
-        }
-    end
-
-    def test_files
-        textfiles() { |file|
-            lexer = Puppet::Parser::Lexer.new()
-            lexer.file = file
-            assert_nothing_raised("Failed to lex %s" % file) {
-                lexer.fullscan()
-            }
-            Puppet::Type.allclear
-        }
-    end
-
-    def test_strings
-        names = %w{this is a bunch of names}
-        types = %w{Many Different Words A Word}
-        words = %w{differently Cased words A a}
-
-        names.each { |t|
-            @lexer.string = t
-            assert_equal(
-                [[:NAME,t],[false,false]],
-                @lexer.fullscan
-            )
-        }
-        types.each { |t|
-            @lexer.string = t
-            assert_equal(
-                [[:CLASSREF,t],[false,false]],
-                @lexer.fullscan
-            )
-        }
-    end
-
-    def test_emptystring
-        bit = '$var = ""'
-
-        assert_nothing_raised {
-            @lexer.string = bit
-        }
-
-        assert_nothing_raised {
-            @lexer.fullscan
-        }
-    end
-
-    def test_collectlexing
-        {"@" => :AT, "<|" => :LCOLLECT, "|>" => :RCOLLECT}.each do |string, token|
-            assert_nothing_raised {
-                @lexer.string = string
-            }
-
-            ret = nil
-            assert_nothing_raised {
-                ret = @lexer.fullscan
-            }
-
-            assert_equal([[token, string],[false, false]], ret)
-        end
-    end
-
-    def test_collectabletype
-        string = "@type {"
-
-        assert_nothing_raised {
-            @lexer.string = string
-        }
-
-        ret = nil
-        assert_nothing_raised {
-            ret = @lexer.fullscan
-        }
-
-        assert_equal([[:AT, "@"], [:NAME, "type"], [:LBRACE, "{"], [false,false]],ret)
-    end
-
-    def test_namespace
-        @lexer.string = %{class myclass}
-
-        assert_nothing_raised {
-            @lexer.fullscan
-        }
-
-        assert_equal("myclass", @lexer.namespace)
-
-        assert_nothing_raised do
-            @lexer.namepop
-        end
-
-        assert_equal("", @lexer.namespace)
-
-        @lexer.string = "class base { class sub { class more"
-
-        assert_nothing_raised {
-            @lexer.fullscan
-        }
-
-        assert_equal("base::sub::more", @lexer.namespace)
-
-        assert_nothing_raised do
-            @lexer.namepop
-        end
-
-        assert_equal("base::sub", @lexer.namespace)
-
-        # Now try it with some fq names
-        mklexer
-
-        @lexer.string = "class base { class sub::more {"
-
-        assert_nothing_raised {
-            @lexer.fullscan
-        }
-
-        assert_equal("base::sub::more", @lexer.namespace)
-
-        assert_nothing_raised do
-            @lexer.namepop
-        end
-
-        assert_equal("base", @lexer.namespace)
-    end
-
-    def test_indefine
-        @lexer.string = %{define me}
-
-        assert_nothing_raised {
-            @lexer.scan { |t,s| }
-        }
-
-        assert(@lexer.indefine?, "Lexer not considered in define")
-
-        # Now make sure we throw an error when trying to nest defines.
-        assert_raise(Puppet::ParseError) do
-            @lexer.string = %{define another}
-            @lexer.scan { |t,s| }
-        end
-
-        assert_nothing_raised do
-            @lexer.indefine = false
-        end
-
-        assert(! @lexer.indefine?, "Lexer still considered in define")
-    end
-
-    # Make sure the different qualified variables work.
-    def test_variable
-        ["$variable", "$::variable", "$qualified::variable", "$further::qualified::variable"].each do |string|
-            @lexer.string = string
-
-            assert_nothing_raised("Could not lex %s" % string) do
-                @lexer.scan do |t, s|
-                    assert_equal(:VARIABLE, t, "did not get variable as token")
-                    assert_equal(string.sub(/^\$/, ''), s, "did not get correct string back")
-                    break
-                end
-            end
-        end
-    end
-
-    # Make sure the expected stack works as it should
-    def test_expected
-        @lexer.string = "[a{"
-        expected = @lexer.instance_variable_get("@expected")
-        @lexer.scan {}
-        assert_equal("}", @lexer.expected, "expected value is wrong")
-
-        @lexer.string = "}"
-        @lexer.scan {}
-        assert_equal("]", @lexer.expected, "expected value is wrong after pop")
-    end
-
-    # #774
-    def test_classref_token
-        string = ["Foo", "::Foo","Foo::Bar","::Foo::Bar"]
-
-        string.each do |foo|
-            assert_nothing_raised {
-                @lexer.string = foo
-            }
-
-            ret = nil
-            assert_nothing_raised {
-                ret = @lexer.fullscan
-            }
-
-            assert_equal([:CLASSREF, foo],ret[0], "Did not correctly tokenize '%s'" % foo)
-        end
-    end
-end
-
diff --git a/test/language/parser.rb b/test/language/parser.rb
index 9a2aed7..2a0e9c0 100755
--- a/test/language/parser.rb
+++ b/test/language/parser.rb
@@ -45,9 +45,9 @@ class TestParser < Test::Unit::TestCase
             assert_raise(Puppet::ParseError, "Did not fail while parsing %s" % file) {
                 parser.file = file
                 ast = parser.parse
-                config = mkcompile(parser)
+                config = mkcompiler(parser)
                 config.compile
-                #ast.classes[""].evaluate :scope => config.topscope
+                #ast.classes[""].evaluate config.topscope
             }
             Puppet::Type.allclear
         }
@@ -868,7 +868,7 @@ file { "/tmp/yayness":
 
     def test_newclass
         scope = mkscope
-        parser = scope.compile.parser
+        parser = scope.compiler.parser
 
         mkcode = proc do |ary|
             classes = ary.collect do |string|
@@ -891,7 +891,7 @@ file { "/tmp/yayness":
         assert(parser.classes["myclass"], "Could not find definition")
         assert_equal("myclass", parser.classes["myclass"].classname)
         assert_equal(%w{original code},
-             parser.classes["myclass"].code.evaluate(:scope => scope))
+             parser.classes["myclass"].code.evaluate(scope))
 
         # Newclass behaves differently than the others -- it just appends
         # the code to the existing class.
@@ -901,7 +901,7 @@ file { "/tmp/yayness":
         end
         assert(klass, "Did not return class when appending")
         assert_equal(%w{original code something new},
-            parser.classes["myclass"].code.evaluate(:scope => scope))
+            parser.classes["myclass"].code.evaluate(scope))
 
         # Now create the same class name in a different scope
         assert_nothing_raised {
@@ -914,7 +914,7 @@ file { "/tmp/yayness":
         assert_equal("other::myclass", other.classname)
         assert_equal("other::myclass", other.namespace)
         assert_equal(%w{something diff},
-             other.code.evaluate(:scope => scope))
+             other.code.evaluate(scope))
 
         # Make sure newclass deals correctly with nodes with no code
         klass = parser.newclass("nocode")
@@ -925,7 +925,7 @@ file { "/tmp/yayness":
         end
         assert(klass, "Did not return class with no code")
         assert_equal(%w{yay test},
-            parser.classes["nocode"].code.evaluate(:scope => scope))
+            parser.classes["nocode"].code.evaluate(scope))
 
         # Then try merging something into nothing
         parser.newclass("nocode2", :code => mkcode.call(%w{foo test}))
@@ -936,7 +936,7 @@ file { "/tmp/yayness":
         end
         assert(klass, "Did not return class with no code")
         assert_equal(%w{foo test},
-            parser.classes["nocode2"].code.evaluate(:scope => scope))
+            parser.classes["nocode2"].code.evaluate(scope))
 
         # And lastly, nothing and nothing
         klass = parser.newclass("nocode3")
@@ -1188,5 +1188,17 @@ file { "/tmp/yayness":
         assert_equal(result, parser.finddefine("", "fUntEst"),
             "%s was not matched" % "fUntEst")
     end
+
+    def test_manifests_with_multiple_environments
+        parser = mkparser :environment => "something"
+
+        # We use an exception to cut short the processing to simplify our stubbing
+        #Puppet::Module.expects(:find_manifests).with("test", {:cwd => ".", :environment => "something"}).raises(Puppet::ParseError)
+        Puppet::Module.expects(:find_manifests).with("test", {:cwd => ".", :environment => "something"}).returns([])
+
+        assert_raise(Puppet::ImportError) do
+            parser.import("test") 
+        end
+    end
 end
 
diff --git a/test/language/resource.rb b/test/language/resource.rb
index 84a30b0..b3eaf03 100755
--- a/test/language/resource.rb
+++ b/test/language/resource.rb
@@ -23,96 +23,6 @@ class TestResource < PuppetTest::TestCase
         mocha_verify
     end
 
-    def test_initialize
-        args = {:type => "resource", :title => "testing",
-            :scope => mkscope}
-        # Check our arg requirements
-        args.each do |name, value|
-            try = args.dup
-            try.delete(name)
-            assert_raise(ArgumentError, "Did not fail when %s was missing" % name) do
-                Parser::Resource.new(try)
-            end
-        end
-
-        res = nil
-        assert_nothing_raised do
-            res = Parser::Resource.new(args)
-        end
-
-        ref = res.instance_variable_get("@ref")
-        assert_equal("Resource", ref.type, "did not set resource type")
-        assert_equal("testing", ref.title, "did not set resource title")
-    end
-
-    def test_merge
-        res = mkresource
-        other = mkresource
-
-        # First try the case where the resource is not allowed to override
-        res.source = "source1"
-        other.source = "source2"
-        other.source.expects(:child_of?).with("source1").returns(false)
-        assert_raise(Puppet::ParseError, "Allowed unrelated resources to override") do
-            res.merge(other)
-        end
-
-        # Next try it when the sources are equal.
-        res.source = "source3"
-        other.source = res.source
-        other.source.expects(:child_of?).with("source3").never
-        params = {:a => :b, :c => :d}
-        other.expects(:params).returns(params)
-        res.expects(:override_parameter).with(:b)
-        res.expects(:override_parameter).with(:d)
-        res.merge(other)
-
-        # And then parentage is involved
-        other = mkresource
-        res.source = "source3"
-        other.source = "source4"
-        other.source.expects(:child_of?).with("source3").returns(true)
-        params = {:a => :b, :c => :d}
-        other.expects(:params).returns(params)
-        res.expects(:override_parameter).with(:b)
-        res.expects(:override_parameter).with(:d)
-        res.merge(other)
-    end
-
-    # the [] method
-    def test_array_accessors
-        res = mkresource
-        params = res.instance_variable_get("@params")
-        assert_nil(res[:missing], "Found a missing parameter somehow")
-        params[:something] = stub(:value => "yay")
-        assert_equal("yay", res[:something], "Did not correctly call value on the parameter")
-
-        res.expects(:title).returns(:mytitle)
-        assert_equal(:mytitle, res[:title], "Did not call title when asked for it as a param")
-    end
-
-    # Make sure any defaults stored in the scope get added to our resource.
-    def test_add_defaults
-        res = mkresource
-        params = res.instance_variable_get("@params")
-        params[:a] = :b
-        res.scope.expects(:lookupdefaults).with(res.type).returns(:a => :replaced, :c => :d)
-        res.expects(:debug)
-
-        res.send(:add_defaults)
-        assert_equal(:d, params[:c], "Did not set default")
-        assert_equal(:b, params[:a], "Replaced parameter with default")
-    end
-
-    def test_finish
-        res = mkresource
-        res.expects(:add_overrides)
-        res.expects(:add_defaults)
-        res.expects(:add_metaparams)
-        res.expects(:validate)
-        res.finish
-    end
-
     # Make sure we paramcheck our params
     def test_validate
         res = mkresource
@@ -124,43 +34,6 @@ class TestResource < PuppetTest::TestCase
         res.send(:validate)
     end
 
-    def test_override_parameter
-        res = mkresource
-        params = res.instance_variable_get("@params")
-
-        # There are three cases, with the second having two options:
-
-        # No existing parameter.
-        param = stub(:name => "myparam")
-        res.send(:override_parameter, param)
-        assert_equal(param, params["myparam"], "Override was not added to param list")
-
-        # An existing parameter that we can override.
-        source = stub(:child_of? => true)
-        # Start out without addition
-        params["param2"] = stub(:source => :whatever)
-        param = stub(:name => "param2", :source => source, :add => false)
-        res.send(:override_parameter, param)
-        assert_equal(param, params["param2"], "Override was not added to param list")
-
-        # Try with addition.
-        params["param2"] = stub(:value => :a, :source => :whatever)
-        param = stub(:name => "param2", :source => source, :add => true, :value => :b)
-        param.expects(:value=).with([:a, :b])
-        res.send(:override_parameter, param)
-        assert_equal(param, params["param2"], "Override was not added to param list")
-
-        # And finally, make sure we throw an exception when the sources aren't related
-        source = stub(:child_of? => false)
-        params["param2"] = stub(:source => :whatever, :file => :f, :line => :l)
-        old = params["param2"]
-        param = stub(:name => "param2", :source => source, :file => :f, :line => :l)
-        assert_raise(Puppet::ParseError, "Did not fail when params conflicted") do
-            res.send(:override_parameter, param)
-        end
-        assert_equal(old, params["param2"], "Param was replaced irrespective of conflict")
-    end
-
     def test_set_parameter
         res = mkresource
         params = res.instance_variable_get("@params")
@@ -266,48 +139,12 @@ class TestResource < PuppetTest::TestCase
         ref.expects(:definedtype).returns(type)
         res.expects(:finish)
         res.scope = mock("scope")
-        config = mock("config")
-        res.scope.expects(:compile).returns(config)
-        config.expects(:delete_resource).with(res)
 
-        args = {:scope => res.scope, :resource => res}
-        type.expects(:evaluate).with(args)
+        type.expects(:evaluate_code).with(res)
 
         res.evaluate
     end
 
-    def test_add_overrides
-        # Try it with nil
-        res = mkresource
-        res.scope = mock('scope')
-        config = mock("config")
-        res.scope.expects(:compile).returns(config)
-        config.expects(:resource_overrides).with(res).returns(nil)
-        res.expects(:merge).never
-        res.send(:add_overrides)
-
-        # And an empty array
-        res = mkresource
-        res.scope = mock('scope')
-        config = mock("config")
-        res.scope.expects(:compile).returns(config)
-        config.expects(:resource_overrides).with(res).returns([])
-        res.expects(:merge).never
-        res.send(:add_overrides)
-
-        # And with some overrides
-        res = mkresource
-        res.scope = mock('scope')
-        config = mock("config")
-        res.scope.expects(:compile).returns(config)
-        returns = %w{a b}
-        config.expects(:resource_overrides).with(res).returns(returns)
-        res.expects(:merge).with("a")
-        res.expects(:merge).with("b")
-        res.send(:add_overrides)
-        assert(returns.empty?, "Did not clear overrides")
-    end
-
     def test_proxymethods
         res = Parser::Resource.new :type => "evaltest", :title => "yay",
             :source => mock("source"), :scope => mkscope
@@ -378,7 +215,7 @@ class TestResource < PuppetTest::TestCase
         {:name => "one", :title => "two"},
         {:title => "three"},
         ].each do |hash|
-            config = mkcompile parser
+            config = mkcompiler parser
             args = {:type => "yayness", :title => hash[:title],
                 :source => klass, :scope => config.topscope}
             if hash[:name]
@@ -425,7 +262,7 @@ class TestResource < PuppetTest::TestCase
             :code => resourcedef("file", varref("name"),
                 "mode" => "644"))
 
-        config = mkcompile(parser)
+        config = mkcompiler(parser)
 
         res = mkresource :type => "yayness", :title => "foo", :params => {}, :scope => config.topscope
         res.virtual = true
@@ -457,37 +294,4 @@ class TestResource < PuppetTest::TestCase
         assert(newres.exported?, "Exported defined resource generated non-exported resources")
         assert(newres.virtual?, "Exported defined resource generated non-virtual resources")
     end
-
-    # Make sure tags behave appropriately.
-    def test_tags
-        scope_resource = stub 'scope_resource', :tags => %w{srone srtwo}
-        scope = stub 'scope', :resource => scope_resource
-        resource = Puppet::Parser::Resource.new(:type => "file", :title => "yay", :scope => scope, :source => mock('source'))
-
-        # Make sure we get the scope resource's tags, plus the type and title
-        %w{srone srtwo yay file}.each do |tag|
-            assert(resource.tags.include?(tag), "Did not tag resource with %s" % tag)
-        end
-
-        # make sure we can only set legal tags
-        ["an invalid tag", "-anotherinvalid", "bad*tag"].each do |tag|
-            assert_raise(Puppet::ParseError, "Tag #{tag} was considered valid") do
-                resource.tag tag
-            end
-        end
-
-        # make sure good tags make it through.
-        tags = %w{good-tag yaytag GoodTag another_tag a ab A}
-        tags.each do |tag|
-            assert_nothing_raised("Tag #{tag} was considered invalid") do
-                resource.tag tag
-            end
-        end
-
-        # make sure we get each of them.
-        ptags = resource.tags
-        tags.each do |tag|
-            assert(ptags.include?(tag.downcase), "missing #{tag}")
-        end
-    end
 end
diff --git a/test/language/scope.rb b/test/language/scope.rb
index ec11a86..c96581a 100755
--- a/test/language/scope.rb
+++ b/test/language/scope.rb
@@ -27,7 +27,7 @@ class TestScope < Test::Unit::TestCase
     end
 
     def test_variables
-        config = mkcompile
+        config = mkcompiler
         topscope = config.topscope
         midscope = config.newscope(topscope)
         botscope = config.newscope(midscope)
@@ -94,7 +94,7 @@ class TestScope < Test::Unit::TestCase
         classes = ["", "one", "one::two", "one::two::three"].each do |name|
             klass = parser.newclass(name)
             Puppet::Parser::Resource.new(:type => "class", :title => name, :scope => scope, :source => mock('source')).evaluate
-            scopes[name] = scope.compile.class_scope(klass)
+            scopes[name] = scope.compiler.class_scope(klass)
         end
 
         classes.each do |name|
@@ -125,7 +125,7 @@ class TestScope < Test::Unit::TestCase
     end
 
     def test_setdefaults
-        config = mkcompile
+        config = mkcompiler
 
         scope = config.topscope
 
@@ -151,7 +151,7 @@ class TestScope < Test::Unit::TestCase
     end
 
     def test_lookupdefaults
-        config = mkcompile
+        config = mkcompiler
         top = config.topscope
 
         # Make a subscope
@@ -179,7 +179,7 @@ class TestScope < Test::Unit::TestCase
     end
 
     def test_parent
-        config = mkcompile
+        config = mkcompiler
         top = config.topscope
 
         # Make a subscope
@@ -205,7 +205,7 @@ class TestScope < Test::Unit::TestCase
         %w{one one::two one::two::three}.each do |name|
             klass = parser.newclass(name)
             Puppet::Parser::Resource.new(:type => "class", :title => name, :scope => scope, :source => mock('source')).evaluate
-            scopes[name] = scope.compile.class_scope(klass)
+            scopes[name] = scope.compiler.class_scope(klass)
             scopes[name].setvar("test", "value-%s" % name.sub(/.+::/,''))
         end
 
@@ -284,13 +284,13 @@ class TestScope < Test::Unit::TestCase
         )
 
         assert_nothing_raised do
-            function.evaluate :scope => scope
+            function.evaluate scope
         end
 
-        scope.compile.send(:evaluate_generators)
+        scope.compiler.send(:evaluate_generators)
 
         [myclass, otherclass].each do |klass|
-            assert(scope.compile.class_scope(klass),
+            assert(scope.compiler.class_scope(klass),
                 "%s was not set" % klass.classname)
         end
     end
@@ -328,18 +328,17 @@ class TestScope < Test::Unit::TestCase
             "undef considered true")
     end
 
-    if defined? ActiveRecord
     # Verify that we recursively mark as exported the results of collectable
     # components.
-    def test_exportedcomponents
-        config = mkcompile
+    def test_virtual_definitions_do_not_get_evaluated
+        config = mkcompiler
         parser = config.parser
 
         # Create a default source
         config.topscope.source = parser.newclass "", ""
 
         # And a scope resource
-        scope_res = stub 'scope_resource', :virtual? => true, :exported? => false, :tags => []
+        scope_res = stub 'scope_resource', :virtual? => true, :exported? => false, :tags => [], :builtin? => true, :type => "eh", :title => "bee"
         config.topscope.resource = scope_res
 
         args = AST::ASTArray.new(
@@ -348,7 +347,7 @@ class TestScope < Test::Unit::TestCase
             :children => [nameobj("arg")]
         )
 
-        # Create a top-level component
+        # Create a top-level define
         parser.newdefine "one", :arguments => [%w{arg}],
             :code => AST::ASTArray.new(
                 :children => [
@@ -356,41 +355,26 @@ class TestScope < Test::Unit::TestCase
                 ]
             )
 
-        # And a component that calls it
-        parser.newdefine "two", :arguments => [%w{arg}],
-            :code => AST::ASTArray.new(
-                :children => [
-                    resourcedef("one", "ptest", {"arg" => varref("arg")})
-                ]
-            )
-
-        # And then a third component that calls the second
-        parser.newdefine "three", :arguments => [%w{arg}],
-            :code => AST::ASTArray.new(
-                :children => [
-                    resourcedef("two", "yay", {"arg" => varref("arg")})
-                ]
-            )
-
-        # lastly, create an object that calls our third component
-        obj = resourcedef("three", "boo", {"arg" => "parentfoo"})
+        # create a resource that calls our third define
+        obj = resourcedef("one", "boo", {"arg" => "parentfoo"})
 
-        # And mark it as exported
-        obj.exported = true
+        # And mark it as virtual
+        obj.virtual = true
 
         # And then evaluate it
-        obj.evaluate :scope => config.topscope
+        obj.evaluate config.topscope
 
         # And run the loop.
         config.send(:evaluate_generators)
 
         %w{File}.each do |type|
-            objects = config.resources.find_all { |r| r.type == type and r.exported }
+            objects = config.resources.find_all { |r| r.type == type and r.virtual }
 
-            assert(!objects.empty?, "Did not get an exported %s" % type)
+            assert(objects.empty?, "Virtual define got evaluated")
         end
     end
 
+    if defined? ActiveRecord
     # Verify that we can both store and collect an object in the same
     # run, whether it's in the same scope as a collection or a different
     # scope.
diff --git a/test/language/snippets.rb b/test/language/snippets.rb
index 2a4ba02..982ddfe 100755
--- a/test/language/snippets.rb
+++ b/test/language/snippets.rb
@@ -15,6 +15,8 @@ class TestSnippets < Test::Unit::TestCase
     def setup
         super
         @file = Puppet::Type.type(:file)
+        Facter.stubs(:to_hash).returns({})
+        Facter.stubs(:value).returns("whatever")
     end
 
     def self.snippetdir
@@ -422,6 +424,11 @@ class TestSnippets < Test::Unit::TestCase
         assert_file("/tmp/realize_defined_test2")
     end
 
+    def snippet_collection_within_virtual_definitions
+        assert_file("/tmp/collection_within_virtual_definitions1_foo.txt")
+        assert_file("/tmp/collection_within_virtual_definitions2_foo2.txt")
+    end
+
     def snippet_fqparents
         assert_file("/tmp/fqparent1", "Did not make file from parent class")
         assert_file("/tmp/fqparent2", "Did not make file from subclass")
diff --git a/test/lib/mocha/auto_verify.rb b/test/lib/mocha/auto_verify.rb
deleted file mode 100644
index dce877b..0000000
--- a/test/lib/mocha/auto_verify.rb
+++ /dev/null
@@ -1,113 +0,0 @@
-require 'mocha/mock'
-
-module Mocha # :nodoc:
-  
-  # Methods added to TestCase allowing creation of traditional mock objects.
-  #
-  # Mocks created this way will have their expectations automatically verified at the end of the test.
-  #
-  # See Mock for methods on mock objects.
-  module AutoVerify
-  
-    def mocks # :nodoc:
-      @mocks ||= []
-    end
-  
-    def reset_mocks # :nodoc:
-      @mocks = nil
-    end
-    
-    # :call-seq: mock(name) -> mock object
-    #            mock(expected_methods = {}) -> mock object
-    #            mock(name, expected_methods = {}) -> mock object
-    #
-    # Creates a mock object.
-    #
-    # +name+ is a +String+ identifier for the mock object.
-    #
-    # +expected_methods+ is a +Hash+ with expected method name symbols as keys and corresponding return values as values.
-    #
-    # Note that (contrary to expectations set up by #stub) these expectations <b>must</b> be fulfilled during the test.
-    #   def test_product
-    #     product = mock('ipod_product', :manufacturer => 'ipod', :price => 100)
-    #     assert_equal 'ipod', product.manufacturer
-    #     assert_equal 100, product.price
-    #     # an error will be raised unless both Product#manufacturer and Product#price have been called
-    #   end 
-    def mock(*args)
-      name, expectations = name_and_expectations_from_args(args)
-      build_mock_with_expectations(:expects, expectations, name)
-    end
-  
-    # :call-seq: stub(name) -> mock object
-    #            stub(stubbed_methods = {}) -> mock object
-    #            stub(name, stubbed_methods = {}) -> mock object
-    #
-    # Creates a mock object.
-    #
-    # +name+ is a +String+ identifier for the mock object.
-    #
-    # +stubbed_methods+ is a +Hash+ with stubbed method name symbols as keys and corresponding return values as values.
-    #
-    # Note that (contrary to expectations set up by #mock) these expectations <b>need not</b> be fulfilled during the test.
-    #   def test_product
-    #     product = stub('ipod_product', :manufacturer => 'ipod', :price => 100)
-    #     assert_equal 'ipod', product.manufacturer
-    #     assert_equal 100, product.price
-    #     # an error will not be raised even if Product#manufacturer and Product#price have not been called
-    #   end
-    def stub(*args)
-      name, expectations = name_and_expectations_from_args(args)
-      build_mock_with_expectations(:stubs, expectations, name)
-    end
-  
-    # :call-seq: stub_everything(name) -> mock object
-    #            stub_everything(stubbed_methods = {}) -> mock object
-    #            stub_everything(name, stubbed_methods = {}) -> mock object
-    #
-    # Creates a mock object that accepts calls to any method.
-    #
-    # By default it will return +nil+ for any method call.
-    #
-    # +name+ and +stubbed_methods+ work in the same way as for #stub.
-    #   def test_product
-    #     product = stub_everything('ipod_product', :price => 100)
-    #     assert_nil product.manufacturer
-    #     assert_nil product.any_old_method
-    #     assert_equal 100, product.price
-    #   end
-    def stub_everything(*args)
-      name, expectations = name_and_expectations_from_args(args)
-      build_mock_with_expectations(:stub_everything, expectations, name)
-    end
-    
-    def verify_mocks # :nodoc:
-      mocks.each { |mock| mock.verify { yield if block_given? } }
-    end
-
-    def teardown_mocks # :nodoc:
-      reset_mocks
-    end
-  
-    def build_mock_with_expectations(expectation_type = :expects, expectations = {}, name = nil) # :nodoc:
-      stub_everything = (expectation_type == :stub_everything)
-      expectation_type = :stubs if expectation_type == :stub_everything
-      mock = Mocha::Mock.new(stub_everything, name)
-      expectations.each do |method, result|
-        mock.__send__(expectation_type, method).returns(result)
-      end
-      mocks << mock
-      mock
-    end
-    
-  private
-
-    def name_and_expectations_from_args(args) # :nodoc:
-      name = args.first.is_a?(String) ? args.delete_at(0) : nil
-      expectations = args.first || {}
-      [name, expectations]
-    end
-  
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/central.rb b/test/lib/mocha/central.rb
deleted file mode 100644
index 3dde735..0000000
--- a/test/lib/mocha/central.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-module Mocha
-  
-  class Central
-  
-    attr_accessor :stubba_methods
-  
-    def initialize
-      self.stubba_methods = []
-    end
-   
-    def stub(method)
-      unless stubba_methods.include?(method)
-        method.stub 
-        stubba_methods.push method
-      end
-    end
-    
-    def verify_all(&block)
-      unique_mocks.each { |mock| mock.verify(&block) }
-    end
-    
-    def unique_mocks
-      stubba_methods.inject({}) { |mocks, method| mocks[method.mock.__id__] = method.mock; mocks }.values
-    end
-  
-    def unstub_all
-      while stubba_methods.size > 0
-        method = stubba_methods.pop
-        method.unstub
-      end
-    end
-
-  end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/class_method.rb b/test/lib/mocha/class_method.rb
deleted file mode 100644
index 915fe71..0000000
--- a/test/lib/mocha/class_method.rb
+++ /dev/null
@@ -1,62 +0,0 @@
-require 'mocha/metaclass'
-
-module Mocha
-
-  class ClassMethod
-  
-    attr_reader :stubbee, :method
-   
-    def initialize(stubbee, method)
-      @stubbee, @method = stubbee, method
-    end
-  
-    def stub
-      hide_original_method
-      define_new_method
-    end
-  
-    def unstub
-      remove_new_method
-      restore_original_method
-      stubbee.reset_mocha
-    end
-    
-    def mock
-      stubbee.mocha
-    end
-  
-    def hide_original_method
-      stubbee.__metaclass__.class_eval "alias_method :#{hidden_method}, :#{method}" if stubbee.__metaclass__.method_defined?(method)
-    end
-  
-    def define_new_method
-      stubbee.__metaclass__.class_eval "def #{method}(*args, &block); mocha.method_missing(:#{method}, *args, &block); end"
-    end
-  
-    def remove_new_method
-      stubbee.__metaclass__.class_eval "remove_method :#{method}"
-    end
-  
-    def restore_original_method
-      stubbee.__metaclass__.class_eval "alias_method :#{method}, :#{hidden_method}; remove_method :#{hidden_method}" if stubbee.__metaclass__.method_defined?(hidden_method)
-    end
-  
-    def hidden_method
-      method_name = method.to_s.gsub(/\W/) {|s| "_substituted_character_#{s[0]}_" }
-      "__stubba__#{method_name}__stubba__"
-    end  
-  
-    def eql?(other)
-      return false unless (other.class == self.class)
-      (stubbee == other.stubbee) and (method == other.method)
-    end
-  
-    alias_method :==, :eql?
-  
-    def to_s
-      "#{stubbee}.#{method}"
-    end
-
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/expectation.rb b/test/lib/mocha/expectation.rb
deleted file mode 100644
index 49b39be..0000000
--- a/test/lib/mocha/expectation.rb
+++ /dev/null
@@ -1,378 +0,0 @@
-require 'mocha/infinite_range'
-require 'mocha/pretty_parameters'
-require 'mocha/expectation_error'
-require 'mocha/return_values'
-require 'mocha/exception_raiser'
-require 'mocha/yield_parameters'
-require 'mocha/is_a'
-
-module Mocha # :nodoc:
-  
-  # Methods on expectations returned from Mock#expects, Mock#stubs, Object#expects and Object#stubs.
-  class Expectation
-  
-    # :stopdoc:
-    
-    class AlwaysEqual
-      def ==(other)
-        true
-      end
-    end
-  
-    attr_reader :method_name, :backtrace
-
-    def initialize(mock, method_name, backtrace = nil)
-      @mock, @method_name = mock, method_name
-      @expected_count = 1
-      @parameters, @parameter_block = AlwaysEqual.new, nil
-      @invoked_count, @return_values = 0, ReturnValues.new
-      @backtrace = backtrace || caller
-      @yield_parameters = YieldParameters.new
-    end
-    
-    def match?(method_name, *arguments)
-      return false unless @method_name == method_name
-      if @parameter_block then
-        return false unless @parameter_block.call(*arguments)
-      else
-        return false unless (@parameters == arguments)
-      end
-      if @expected_count.is_a?(Range) then
-        return false unless @invoked_count < @expected_count.last
-      else
-        return false unless @invoked_count < @expected_count
-      end
-      return true
-    end
-
-    # :startdoc:
-    
-    # :call-seq: times(range) -> expectation
-    #
-    # Modifies expectation so that the number of calls to the expected method must be within a specific +range+.
-    #
-    # +range+ can be specified as an exact integer or as a range of integers
-    #   object = mock()
-    #   object.expects(:expected_method).times(3)
-    #   3.times { object.expected_method }
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).times(3)
-    #   2.times { object.expected_method }
-    #   # => verify fails
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).times(2..4)
-    #   3.times { object.expected_method }
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).times(2..4)
-    #   object.expected_method
-    #   # => verify fails
-    def times(range)
-      @expected_count = range
-      self
-    end
-  
-    # :call-seq: once() -> expectation
-    #
-    # Modifies expectation so that the expected method must be called exactly once.
-    # Note that this is the default behaviour for an expectation, but you may wish to use it for clarity/emphasis.
-    #   object = mock()
-    #   object.expects(:expected_method).once
-    #   object.expected_method
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).once
-    #   object.expected_method
-    #   object.expected_method
-    #   # => verify fails
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).once
-    #   # => verify fails
-    def once()
-      times(1)
-      self
-    end
-  
-    # :call-seq: never() -> expectation
-    #
-    # Modifies expectation so that the expected method must never be called.
-    #   object = mock()
-    #   object.expects(:expected_method).never
-    #   object.expected_method
-    #   # => verify fails
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).never
-    #   object.expected_method
-    #   # => verify succeeds
-    def never
-      times(0)
-      self
-    end
-  
-    # :call-seq: at_least(minimum_number_of_times) -> expectation
-    #
-    # Modifies expectation so that the expected method must be called at least a +minimum_number_of_times+.
-    #   object = mock()
-    #   object.expects(:expected_method).at_least(2)
-    #   3.times { object.expected_method }
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).at_least(2)
-    #   object.expected_method
-    #   # => verify fails
-    def at_least(minimum_number_of_times)
-      times(Range.at_least(minimum_number_of_times))
-      self
-    end
-  
-    # :call-seq: at_least_once() -> expectation
-    #
-    # Modifies expectation so that the expected method must be called at least once.
-    #   object = mock()
-    #   object.expects(:expected_method).at_least_once
-    #   object.expected_method
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).at_least_once
-    #   # => verify fails
-    def at_least_once()
-      at_least(1)
-      self
-    end
-  
-    # :call-seq: at_most(maximum_number_of_times) -> expectation
-    #
-    # Modifies expectation so that the expected method must be called at most a +maximum_number_of_times+.
-    #   object = mock()
-    #   object.expects(:expected_method).at_most(2)
-    #   2.times { object.expected_method }
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).at_most(2)
-    #   3.times { object.expected_method }
-    #   # => verify fails
-    def at_most(maximum_number_of_times)
-      times(Range.at_most(maximum_number_of_times))
-      self
-    end
-  
-    # :call-seq: at_most_once() -> expectation
-    #
-    # Modifies expectation so that the expected method must be called at most once.
-    #   object = mock()
-    #   object.expects(:expected_method).at_most_once
-    #   object.expected_method
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).at_most_once
-    #   2.times { object.expected_method }
-    #   # => verify fails
-    def at_most_once()
-      at_most(1)
-      self
-    end
-  
-    # :call-seq: with(*arguments, &parameter_block) -> expectation
-    #
-    # Modifies expectation so that the expected method must be called with specified +arguments+.
-    #   object = mock()
-    #   object.expects(:expected_method).with(:param1, :param2)
-    #   object.expected_method(:param1, :param2)
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).with(:param1, :param2)
-    #   object.expected_method(:param3)
-    #   # => verify fails
-    # May be used with parameter matchers in Mocha::ParameterMatchers.
-    #
-    # If a +parameter_block+ is given, the block is called with the parameters passed to the expected method.
-    # The expectation is matched if the block evaluates to +true+.
-    #   object = mock()
-    #   object.expects(:expected_method).with() { |value| value % 4 == 0 }
-    #   object.expected_method(16)
-    #   # => verify succeeds
-    #
-    #   object = mock()
-    #   object.expects(:expected_method).with() { |value| value % 4 == 0 }
-    #   object.expected_method(17)
-    #   # => verify fails
-    def with(*arguments, &parameter_block)
-      @parameters, @parameter_block = arguments, parameter_block
-      class << @parameters; def to_s; join(', '); end; end
-      self
-    end
-  
-    # :call-seq: yields(*parameters) -> expectation
-    #
-    # Modifies expectation so that when the expected method is called, it yields with the specified +parameters+.
-    #   object = mock()
-    #   object.expects(:expected_method).yields('result')
-    #   yielded_value = nil
-    #   object.expected_method { |value| yielded_value = value }
-    #   yielded_value # => 'result'
-    # May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
-    #   object = mock()
-    #   object.stubs(:expected_method).yields(1).then.yields(2)
-    #   yielded_values_from_first_invocation = []
-    #   yielded_values_from_second_invocation = []
-    #   object.expected_method { |value| yielded_values_from_first_invocation << value } # first invocation
-    #   object.expected_method { |value| yielded_values_from_second_invocation << value } # second invocation
-    #   yielded_values_from_first_invocation # => [1]
-    #   yielded_values_from_second_invocation # => [2]
-    def yields(*parameters)
-      @yield_parameters.add(*parameters)
-      self
-    end
-    
-    # :call-seq: multiple_yields(*parameter_groups) -> expectation
-    #
-    # Modifies expectation so that when the expected method is called, it yields multiple times per invocation with the specified +parameter_groups+.
-    #   object = mock()
-    #   object.expects(:expected_method).multiple_yields(['result_1', 'result_2'], ['result_3'])
-    #   yielded_values = []
-    #   object.expected_method { |*values| yielded_values << values }
-    #   yielded_values # => [['result_1', 'result_2'], ['result_3]]
-    # May be called multiple times on the same expectation for consecutive invocations. Also see Expectation#then.
-    #   object = mock()
-    #   object.stubs(:expected_method).multiple_yields([1, 2], [3]).then.multiple_yields([4], [5, 6])
-    #   yielded_values_from_first_invocation = []
-    #   yielded_values_from_second_invocation = []
-    #   object.expected_method { |*values| yielded_values_from_first_invocation << values } # first invocation
-    #   object.expected_method { |*values| yielded_values_from_second_invocation << values } # second invocation
-    #   yielded_values_from_first_invocation # => [[1, 2], [3]]
-    #   yielded_values_from_second_invocation # => [[4], [5, 6]]
-    def multiple_yields(*parameter_groups)
-      @yield_parameters.multiple_add(*parameter_groups)
-      self
-    end
-    
-    # :call-seq: returns(value) -> expectation
-    # :call-seq: returns(*values) -> expectation
-    #
-    # Modifies expectation so that when the expected method is called, it returns the specified +value+.
-    #   object = mock()
-    #   object.stubs(:stubbed_method).returns('result')
-    #   object.stubbed_method # => 'result'
-    #   object.stubbed_method # => 'result'
-    # If multiple +values+ are given, these are returned in turn on consecutive calls to the method.
-    #   object = mock()
-    #   object.stubs(:stubbed_method).returns(1, 2)
-    #   object.stubbed_method # => 1
-    #   object.stubbed_method # => 2
-    # May be called multiple times on the same expectation. Also see Expectation#then.
-    #   object = mock()
-    #   object.stubs(:expected_method).returns(1, 2).then.returns(3)
-    #   object.expected_method # => 1
-    #   object.expected_method # => 2
-    #   object.expected_method # => 3
-    # May be called in conjunction with Expectation#raises on the same expectation.
-    #   object = mock()
-    #   object.stubs(:expected_method).returns(1, 2).then.raises(Exception)
-    #   object.expected_method # => 1
-    #   object.expected_method # => 2
-    #   object.expected_method # => raises exception of class Exception1
-    # If +value+ is a +Proc+, then the expected method will return the result of calling <tt>Proc#call</tt>.
-    #
-    # This usage is _deprecated_.
-    # Use explicit multiple return values and/or multiple expectations instead.
-    #
-    # A +Proc+ instance will be treated the same as any other value in a future release.
-    #   object = mock()
-    #   object.stubs(:stubbed_method).returns(lambda { rand(100) })
-    #   object.stubbed_method # => 41
-    #   object.stubbed_method # => 77
-    def returns(*values)
-      @return_values += ReturnValues.build(*values)
-      self
-    end
-  
-    # :call-seq: raises(exception = RuntimeError, message = nil) -> expectation
-    #
-    # Modifies expectation so that when the expected method is called, it raises the specified +exception+ with the specified +message+.
-    #   object = mock()
-    #   object.expects(:expected_method).raises(Exception, 'message')
-    #   object.expected_method # => raises exception of class Exception and with message 'message'
-    # May be called multiple times on the same expectation. Also see Expectation#then.
-    #   object = mock()
-    #   object.stubs(:expected_method).raises(Exception1).then.raises(Exception2)
-    #   object.expected_method # => raises exception of class Exception1
-    #   object.expected_method # => raises exception of class Exception2
-    # May be called in conjunction with Expectation#returns on the same expectation.
-    #   object = mock()
-    #   object.stubs(:expected_method).raises(Exception).then.returns(2, 3)
-    #   object.expected_method # => raises exception of class Exception1
-    #   object.expected_method # => 2
-    #   object.expected_method # => 3
-    def raises(exception = RuntimeError, message = nil)
-      @return_values += ReturnValues.new(ExceptionRaiser.new(exception, message))
-      self
-    end
-
-    # :call-seq: then() -> expectation
-    #
-    # Syntactic sugar to improve readability. Has no effect on state of the expectation.
-    #   object = mock()
-    #   object.stubs(:expected_method).returns(1, 2).then.raises(Exception).then.returns(4)
-    #   object.expected_method # => 1
-    #   object.expected_method # => 2
-    #   object.expected_method # => raises exception of class Exception
-    #   object.expected_method # => 4
-    def then
-      self
-    end
-    
-    # :stopdoc:
-    
-    def invoke
-      @invoked_count += 1
-      if block_given? then
-        @yield_parameters.next_invocation.each do |yield_parameters|
-          yield(*yield_parameters)
-        end
-      end
-      @return_values.next
-    end
-
-    def verify
-      yield(self) if block_given?
-      unless (@expected_count === @invoked_count) then
-        error = ExpectationError.new(error_message(@expected_count, @invoked_count))
-        error.set_backtrace(filtered_backtrace)
-        raise error
-      end
-    end
-    
-    def mocha_lib_directory
-      File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
-    end
-    
-    def filtered_backtrace
-      backtrace.reject { |location| Regexp.new(mocha_lib_directory).match(File.expand_path(location)) }
-    end
-  
-    def method_signature
-      return "#{method_name}" if @parameters.__is_a__(AlwaysEqual)
-      "#{@method_name}(#{PrettyParameters.new(@parameters).pretty})"
-    end
-    
-    def error_message(expected_count, actual_count)
-      "#{@mock.mocha_inspect}.#{method_signature} - expected calls: #{expected_count.mocha_inspect}, actual calls: #{actual_count}"
-    end
-  
-    # :startdoc:
-    
-  end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/expectation_error.rb b/test/lib/mocha/expectation_error.rb
deleted file mode 100644
index c01482e..0000000
--- a/test/lib/mocha/expectation_error.rb
+++ /dev/null
@@ -1,6 +0,0 @@
-module Mocha
-
-  class ExpectationError < StandardError
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/missing_expectation.rb b/test/lib/mocha/missing_expectation.rb
deleted file mode 100644
index f84227d..0000000
--- a/test/lib/mocha/missing_expectation.rb
+++ /dev/null
@@ -1,27 +0,0 @@
-require 'mocha/expectation'
-
-module Mocha # :nodoc:
-  
-  class MissingExpectation < Expectation # :nodoc:
-
-    def initialize(mock, method_name)
-      super
-      @invoked_count = true
-    end
-
-    def verify
-      msg = error_message(0, 1)
-      similar_expectations_list = similar_expectations.collect { |expectation| expectation.method_signature }.join("\n")
-      msg << "\nSimilar expectations:\n#{similar_expectations_list}" unless similar_expectations.empty?
-      error = ExpectationError.new(msg)
-      error.set_backtrace(filtered_backtrace)
-      raise error if @invoked_count
-    end
-
-    def similar_expectations
-      @mock.expectations.select { |expectation| expectation.method_name == self.method_name }
-    end
-
-  end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/mock.rb b/test/lib/mocha/mock.rb
deleted file mode 100644
index 18c23fe..0000000
--- a/test/lib/mocha/mock.rb
+++ /dev/null
@@ -1,207 +0,0 @@
-require 'mocha/expectation'
-require 'mocha/stub'
-require 'mocha/missing_expectation'
-require 'mocha/metaclass'
-
-module Mocha # :nodoc:
-
-  # Traditional mock object.
-  #
-  # Methods return an Expectation which can be further modified by methods on Expectation.
-  class Mock
-    
-    # :stopdoc:
-    
-    def initialize(stub_everything = false, name = nil)
-      @stub_everything = stub_everything
-      @mock_name = name
-      @expectations = []
-      @responder = nil
-    end
-
-    attr_reader :stub_everything, :expectations
-  
-    # :startdoc:
-
-    # :call-seq: expects(method_name) -> expectation
-    #            expects(method_names) -> last expectation
-    #
-    # Adds an expectation that a method identified by +method_name+ symbol must be called exactly once with any parameters.
-    # Returns the new expectation which can be further modified by methods on Expectation.
-    #   object = mock()
-    #   object.expects(:method1)
-    #   object.method1
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method1)
-    #   # error raised, because method1 not called exactly once
-    # If +method_names+ is a +Hash+, an expectation will be set up for each entry using the key as +method_name+ and value as +return_value+.
-    #   object = mock()
-    #   object.expects(:method1 => :result1, :method2 => :result2)
-    #
-    #   # exactly equivalent to
-    #
-    #   object = mock()
-    #   object.expects(:method1).returns(:result1)
-    #   object.expects(:method2).returns(:result2)
-    #
-    # Aliased by <tt>\_\_expects\_\_</tt>
-    def expects(method_name_or_hash, backtrace = nil)
-      if method_name_or_hash.is_a?(Hash) then
-        method_name_or_hash.each do |method_name, return_value|
-          add_expectation(Expectation.new(self, method_name, backtrace).returns(return_value))
-        end
-      else
-        add_expectation(Expectation.new(self, method_name_or_hash, backtrace))
-      end
-    end
-    
-    # :call-seq: stubs(method_name) -> expectation
-    #            stubs(method_names) -> last expectation
-    #
-    # Adds an expectation that a method identified by +method_name+ symbol may be called any number of times with any parameters.
-    # Returns the new expectation which can be further modified by methods on Expectation.
-    #   object = mock()
-    #   object.stubs(:method1)
-    #   object.method1
-    #   object.method1
-    #   # no error raised
-    # If +method_names+ is a +Hash+, an expectation will be set up for each entry using the key as +method_name+ and value as +return_value+.
-    #   object = mock()
-    #   object.stubs(:method1 => :result1, :method2 => :result2)
-    #
-    #   # exactly equivalent to
-    #
-    #   object = mock()
-    #   object.stubs(:method1).returns(:result1)
-    #   object.stubs(:method2).returns(:result2)
-    #
-    # Aliased by <tt>\_\_stubs\_\_</tt>
-    def stubs(method_name_or_hash, backtrace = nil)
-      if method_name_or_hash.is_a?(Hash) then
-        method_name_or_hash.each do |method_name, return_value|
-          add_expectation(Stub.new(self, method_name, backtrace).returns(return_value))
-        end
-      else
-        add_expectation(Stub.new(self, method_name_or_hash, backtrace))
-      end
-    end
-    
-    # :call-seq: responds_like(responder) -> mock
-    #
-    # Constrains the +mock+ so that it can only expect or stub methods to which +responder+ responds. The constraint is only applied at method invocation time.
-    #
-    # A +NoMethodError+ will be raised if the +responder+ does not <tt>respond_to?</tt> a method invocation (even if the method has been expected or stubbed).
-    #
-    # The +mock+ will delegate its <tt>respond_to?</tt> method to the +responder+.
-    #   class Sheep
-    #     def chew(grass); end
-    #     def self.number_of_legs; end
-    #   end
-    #
-    #   sheep = mock('sheep')
-    #   sheep.expects(:chew)
-    #   sheep.expects(:foo)
-    #   sheep.respond_to?(:chew) # => true
-    #   sheep.respond_to?(:foo) # => true
-    #   sheep.chew
-    #   sheep.foo
-    #   # no error raised
-    #
-    #   sheep = mock('sheep')
-    #   sheep.responds_like(Sheep.new)
-    #   sheep.expects(:chew)
-    #   sheep.expects(:foo)
-    #   sheep.respond_to?(:chew) # => true
-    #   sheep.respond_to?(:foo) # => false
-    #   sheep.chew
-    #   sheep.foo # => raises NoMethodError exception
-    #
-    #   sheep_class = mock('sheep_class')
-    #   sheep_class.responds_like(Sheep)
-    #   sheep_class.stubs(:number_of_legs).returns(4)
-    #   sheep_class.expects(:foo)
-    #   sheep_class.respond_to?(:number_of_legs) # => true
-    #   sheep_class.respond_to?(:foo) # => false
-    #   assert_equal 4, sheep_class.number_of_legs
-    #   sheep_class.foo # => raises NoMethodError exception
-    #
-    # Aliased by +quacks_like+
-    def responds_like(object)
-      @responder = object
-      self
-    end
-    
-    # :stopdoc:
-
-    alias_method :__expects__, :expects
-
-    alias_method :__stubs__, :stubs
-    
-    alias_method :quacks_like, :responds_like
-
-    def add_expectation(expectation)
-      @expectations << expectation
-      method_name = expectation.method_name
-      self.__metaclass__.send(:undef_method, method_name) if self.__metaclass__.method_defined?(method_name)
-      expectation
-    end
-
-    def method_missing(symbol, *arguments, &block)
-      if @responder and not @responder.respond_to?(symbol)
-        raise NoMethodError, "undefined method `#{symbol}' for #{self.mocha_inspect} which responds like #{@responder.mocha_inspect}"
-      end
-      matching_expectation = matching_expectation(symbol, *arguments)
-      if matching_expectation then
-        matching_expectation.invoke(&block)
-      elsif stub_everything then
-        return
-      else
-        begin
-          super_method_missing(symbol, *arguments, &block)
-    		rescue NoMethodError
-    			unexpected_method_called(symbol, *arguments)
-    		end
-  		end
-  	end
-  	
-  	def respond_to?(symbol)
-	    if @responder then
-	      @responder.respond_to?(symbol)
-      else
-    	  @expectations.any? { |expectation| expectation.method_name == symbol }
-  	  end
-	  end
-	
-  	def super_method_missing(symbol, *arguments, &block)
-  	  raise NoMethodError
-    end
-
-  	def unexpected_method_called(symbol, *arguments)
-      MissingExpectation.new(self, symbol).with(*arguments).verify
-    end
-	
-  	def matching_expectation(symbol, *arguments)
-      @expectations.reverse.detect { |expectation| expectation.match?(symbol, *arguments) }
-    end
-  
-    def verify(&block)
-      @expectations.each { |expectation| expectation.verify(&block) }
-    end
-  
-    def mocha_inspect
-      address = self.__id__ * 2
-      address += 0x100000000 if address < 0
-      @mock_name ? "#<Mock:#{@mock_name}>" : "#<Mock:0x#{'%x' % address}>"
-    end
-    
-    def inspect
-      mocha_inspect
-    end
-
-    # :startdoc:
-
-  end
-
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers.rb b/test/lib/mocha/parameter_matchers.rb
deleted file mode 100644
index 193f77d..0000000
--- a/test/lib/mocha/parameter_matchers.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-module Mocha
-  
-  # Used as parameters for Expectation#with to restrict the parameter values which will match the expectation.
-  module ParameterMatchers; end
-  
-end
-
-
-Dir[File.expand_path(File.join(File.dirname(__FILE__), 'parameter_matchers', "*.rb"))].each { |lib| require lib }
diff --git a/test/lib/mocha/parameter_matchers/all_of.rb b/test/lib/mocha/parameter_matchers/all_of.rb
deleted file mode 100644
index 343d9ee..0000000
--- a/test/lib/mocha/parameter_matchers/all_of.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: all_of -> parameter_matcher
-    #
-    # Matches if all +matchers+ match.
-    #   object = mock()
-    #   object.expects(:method_1).with(all_of(includes(1), includes(3)))
-    #   object.method_1([1, 3])
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method_1).with(all_of(includes(1), includes(3)))
-    #   object.method_1([1, 2])
-    #   # error raised, because method_1 was not called with object including 1 and 3
-    def all_of(*matchers)
-      AllOf.new(*matchers)
-    end
-    
-    class AllOf # :nodoc:
-      
-      def initialize(*matchers)
-        @matchers = matchers
-      end
-    
-      def ==(parameter)
-        @matchers.all? { |matcher| matcher == parameter }
-      end
-      
-      def mocha_inspect
-        "all_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
-      end
-      
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/any_of.rb b/test/lib/mocha/parameter_matchers/any_of.rb
deleted file mode 100644
index a1f8807..0000000
--- a/test/lib/mocha/parameter_matchers/any_of.rb
+++ /dev/null
@@ -1,44 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: any_of -> parameter_matcher
-    #
-    # Matches if any +matchers+ match.
-    #   object = mock()
-    #   object.expects(:method_1).with(any_of(1, 3))
-    #   object.method_1(1)
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method_1).with(any_of(1, 3))
-    #   object.method_1(3)
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method_1).with(any_of(1, 3))
-    #   object.method_1(2)
-    #   # error raised, because method_1 was not called with 1 or 3
-    def any_of(*matchers)
-      AnyOf.new(*matchers)
-    end
-    
-    class AnyOf # :nodoc:
-      
-      def initialize(*matchers)
-        @matchers = matchers
-      end
-    
-      def ==(parameter)
-        @matchers.any? { |matcher| matcher == parameter }
-      end
-      
-      def mocha_inspect
-        "any_of(#{@matchers.map { |matcher| matcher.mocha_inspect }.join(", ") })"
-      end
-      
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/anything.rb b/test/lib/mocha/parameter_matchers/anything.rb
deleted file mode 100644
index 57d0eea..0000000
--- a/test/lib/mocha/parameter_matchers/anything.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: anything -> parameter_matcher
-    #
-    # Matches any object.
-    #   object = mock()
-    #   object.expects(:method_1).with(anything)
-    #   object.method_1('foo')
-    #   # no error raised
-    def anything
-      Anything.new
-    end
-    
-    class Anything # :nodoc:
-    
-      def ==(parameter)
-        return true
-      end
-      
-      def mocha_inspect
-        "anything"
-      end
-      
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_entry.rb b/test/lib/mocha/parameter_matchers/has_entry.rb
deleted file mode 100644
index 3d7cac4..0000000
--- a/test/lib/mocha/parameter_matchers/has_entry.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: has_entry(key, value) -> parameter_matcher
-    #
-    # Matches +Hash+ containing entry with +key+ and +value+.
-    #   object = mock()
-    #   object.expects(:method_1).with(has_entry('key_1', 1))
-    #   object.method_1('key_1' => 1, 'key_2' => 2)
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method_1).with(has_entry('key_1', 1))
-    #   object.method_1('key_1' => 2, 'key_2' => 1)
-    #   # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
-    def has_entry(key, value)
-      HasEntry.new(key, value)
-    end
-
-    class HasEntry # :nodoc:
-      
-      def initialize(key, value)
-        @key, @value = key, value
-      end
-      
-      def ==(parameter)
-        parameter[@key] == @value
-      end
-      
-      def mocha_inspect
-        "has_entry(#{@key.mocha_inspect}, #{@value.mocha_inspect})"
-      end
-      
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_key.rb b/test/lib/mocha/parameter_matchers/has_key.rb
deleted file mode 100644
index 5a1fcd2..0000000
--- a/test/lib/mocha/parameter_matchers/has_key.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: has_key(key) -> parameter_matcher
-    #
-    # Matches +Hash+ containing +key+.
-    #   object = mock()
-    #   object.expects(:method_1).with(has_key('key_1'))
-    #   object.method_1('key_1' => 1, 'key_2' => 2)
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method_1).with(has_key('key_1'))
-    #   object.method_1('key_2' => 2)
-    #   # error raised, because method_1 was not called with Hash containing key: 'key_1'
-    def has_key(key)
-      HasKey.new(key)
-    end
-
-    class HasKey # :nodoc:
-      
-      def initialize(key)
-        @key = key
-      end
-      
-      def ==(parameter)
-        parameter.keys.include?(@key)
-      end
-      
-      def mocha_inspect
-        "has_key(#{@key.mocha_inspect})"
-      end
-      
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/has_value.rb b/test/lib/mocha/parameter_matchers/has_value.rb
deleted file mode 100644
index 742f842..0000000
--- a/test/lib/mocha/parameter_matchers/has_value.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: has_value(value) -> parameter_matcher
-    #
-    # Matches +Hash+ containing +value+.
-    #   object = mock()
-    #   object.expects(:method_1).with(has_value(1))
-    #   object.method_1('key_1' => 1, 'key_2' => 2)
-    #   # no error raised
-    #
-    #   object = mock()
-    #   object.expects(:method_1).with(has_value(1))
-    #   object.method_1('key_2' => 2)
-    #   # error raised, because method_1 was not called with Hash containing value: 1
-    def has_value(value)
-      HasValue.new(value)
-    end
-
-    class HasValue # :nodoc:
-      
-      def initialize(value)
-        @value = value
-      end
-      
-      def ==(parameter)
-        parameter.values.include?(@value)
-      end
-      
-      def mocha_inspect
-        "has_value(#{@value.mocha_inspect})"
-      end
-      
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/parameter_matchers/includes.rb b/test/lib/mocha/parameter_matchers/includes.rb
deleted file mode 100644
index 0e4fbe9..0000000
--- a/test/lib/mocha/parameter_matchers/includes.rb
+++ /dev/null
@@ -1,37 +0,0 @@
-module Mocha
-  
-  module ParameterMatchers
-
-    # :call-seq: includes(item) -> parameter_matcher
-    #
-    # Matches any object that responds true to include?(item)
-    #   object = mock()
-    #   object.expects(:method_1).with(includes('foo'))
-    #   object.method_1(['foo', 'bar'])
-    #   # no error raised
-    #
-    #   object.method_1(['baz'])
-    #   # error raised, because ['baz'] does not include 'foo'.
-    def includes(item)
-      Includes.new(item)
-    end
-
-    class Includes # :nodoc:
-
-      def initialize(item)
-        @item = item
-      end
-
-      def ==(parameter)
-        return parameter.include?(@item)
-      end
-
-      def mocha_inspect
-        "includes(#{@item.mocha_inspect})"
-      end
-
-    end
-
-  end
-  
-end
diff --git a/test/lib/mocha/pretty_parameters.rb b/test/lib/mocha/pretty_parameters.rb
deleted file mode 100644
index 6d3c165..0000000
--- a/test/lib/mocha/pretty_parameters.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-require 'mocha/inspect'
-
-module Mocha
-
-  class PrettyParameters
-  
-    def initialize(params)
-      @params = params
-      @params_string = params.mocha_inspect
-    end
-  
-    def pretty
-      remove_outer_array_braces!
-      remove_outer_hash_braces!
-      @params_string
-    end
-  
-    def remove_outer_array_braces!
-      @params_string = @params_string.gsub(/^\[|\]$/, '')
-    end
-  
-    def remove_outer_hash_braces!
-      @params_string = @params_string.gsub(/^\{|\}$/, '') if @params.size == 1
-    end
-  
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/return_values.rb b/test/lib/mocha/return_values.rb
deleted file mode 100644
index ea0fbbd..0000000
--- a/test/lib/mocha/return_values.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'mocha/single_return_value'
-
-module Mocha # :nodoc:
-  
-  class ReturnValues # :nodoc:
-    
-    def self.build(*values)
-      new(*values.map { |value| SingleReturnValue.new(value) })
-    end
-    
-    attr_accessor :values
-    
-    def initialize(*values)
-      @values = values
-    end
-    
-    def next
-      case @values.size
-      when 0: nil
-      when 1: @values.first.evaluate
-      else @values.shift.evaluate
-      end
-    end
-    
-    def +(other)
-      self.class.new(*(@values + other.values))
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/mocha/yield_parameters.rb b/test/lib/mocha/yield_parameters.rb
deleted file mode 100644
index b1623bf..0000000
--- a/test/lib/mocha/yield_parameters.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-require 'mocha/no_yields'
-require 'mocha/single_yield'
-require 'mocha/multiple_yields'
-
-module Mocha # :nodoc:
-  
-  class YieldParameters # :nodoc:
-    
-    def initialize
-      @parameter_groups = []
-    end
-    
-    def next_invocation
-      case @parameter_groups.size
-      when 0: NoYields.new
-      when 1: @parameter_groups.first
-      else @parameter_groups.shift
-      end
-    end
-    
-    def add(*parameters)
-      @parameter_groups << SingleYield.new(*parameters)
-    end
-    
-    def multiple_add(*parameter_groups)
-      @parameter_groups << MultipleYields.new(*parameter_groups)
-    end
-    
-  end
-  
-end
\ No newline at end of file
diff --git a/test/lib/puppettest.rb b/test/lib/puppettest.rb
index 76ae96e..e276bdf 100755
--- a/test/lib/puppettest.rb
+++ b/test/lib/puppettest.rb
@@ -6,6 +6,17 @@ mainlib = File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
 $LOAD_PATH.unshift(mainlib) unless $LOAD_PATH.include?(mainlib)
 
 require 'puppet'
+
+# include any gems in vendor/gems
+Dir["#{mainlib}/../vendor/gems/**"].each do |path| 
+    libpath = File.join(path, "lib")
+    if File.directory?(libpath)
+        $LOAD_PATH.unshift(libpath)
+    else
+        $LOAD_PATH.unshift(path)
+    end
+end
+
 require 'mocha'
 
 # Only load the test/unit class if we're not in the spec directory.
@@ -25,9 +36,9 @@ class Class
     def publicize_methods(*methods)
         saved_private_instance_methods = methods.empty? ? self.private_instance_methods : methods
 
-        self.class_eval { public *saved_private_instance_methods }
+        self.class_eval { public(*saved_private_instance_methods) }
         yield
-        self.class_eval { private *saved_private_instance_methods }
+        self.class_eval { private(*saved_private_instance_methods) }
     end
 end
 
@@ -187,7 +198,7 @@ module PuppetTest
 
         # If we're running under rake, then disable debugging and such.
         #if rake? or ! Puppet[:debug]
-        if defined?($puppet_debug) or ! rake?
+        #if defined?($puppet_debug) or ! rake?
             if textmate?
                 Puppet[:color] = false
             end
@@ -199,11 +210,11 @@ module PuppetTest
             end
             Puppet::Util::Log.level = :debug
             #$VERBOSE = 1
-        else    
-            Puppet::Util::Log.close
-            Puppet::Util::Log.newdestination(@logs)
-            Puppet[:httplog] = tempfile()
-        end
+        #else    
+        #    Puppet::Util::Log.close
+        #    Puppet::Util::Log.newdestination(@logs)
+        #    Puppet[:httplog] = tempfile()
+        #end
 
         Puppet[:ignoreschedules] = true
 
@@ -256,11 +267,7 @@ module PuppetTest
         @tmpdir
     end
 
-    def teardown
-        #@stop = Time.now
-        #File.open("/tmp/test_times.log", ::File::WRONLY|::File::CREAT|::File::APPEND) { |f| f.puts "%0.4f %s %s" % [@stop - @start, @method_name, self.class] }
-        @@cleaners.each { |cleaner| cleaner.call() }
-
+    def remove_tmp_files
         @@tmpfiles.each { |file|
             unless file =~ /tmp/
                 puts "Not deleting tmpfile %s" % file
@@ -272,6 +279,14 @@ module PuppetTest
             end
         }
         @@tmpfiles.clear
+    end
+
+    def teardown
+        #@stop = Time.now
+        #File.open("/tmp/test_times.log", ::File::WRONLY|::File::CREAT|::File::APPEND) { |f| f.puts "%0.4f %s %s" % [@stop - @start, @method_name, self.class] }
+        @@cleaners.each { |cleaner| cleaner.call() }
+
+        remove_tmp_files
 
         @@tmppids.each { |pid|
             %x{kill -INT #{pid} 2>/dev/null}
@@ -306,7 +321,6 @@ module PuppetTest
         rescue Timeout::Error
             # just move on
         end
-        mocha_verify
     end
 
     def logstore
diff --git a/test/lib/puppettest/parsertesting.rb b/test/lib/puppettest/parsertesting.rb
index 6fd6018..1a08ecb 100644
--- a/test/lib/puppettest/parsertesting.rb
+++ b/test/lib/puppettest/parsertesting.rb
@@ -5,7 +5,7 @@ module PuppetTest::ParserTesting
     include PuppetTest
     AST = Puppet::Parser::AST
 
-    Compile = Puppet::Parser::Compile
+    Compiler = Puppet::Parser::Compiler
 
     # A fake class that we can use for testing evaluation.
     class FakeAST
@@ -41,10 +41,10 @@ module PuppetTest::ParserTesting
         )
     end
 
-    def mkcompile(parser = nil)
+    def mkcompiler(parser = nil)
         parser ||= mkparser
         node = mknode
-        return Compile.new(node, parser)
+        return Compiler.new(node, parser)
     end
 
     def mknode(name = nil)
@@ -58,21 +58,21 @@ module PuppetTest::ParserTesting
         Puppet::Parser::Interpreter.new
     end
 
-    def mkparser
-        Puppet::Parser::Parser.new()
+    def mkparser(args = {})
+        Puppet::Parser::Parser.new(args)
     end
 
     def mkscope(hash = {})
         hash[:parser] ||= mkparser
-        compile ||= mkcompile(hash[:parser])
-        compile.topscope.source = (hash[:parser].findclass("", "") || hash[:parser].newclass(""))
+        compiler ||= mkcompiler(hash[:parser])
+        compiler.topscope.source = (hash[:parser].findclass("", "") || hash[:parser].newclass(""))
 
-        unless compile.topscope.source
+        unless compiler.topscope.source
             raise "Could not find source for scope"
         end
         # Make the 'main' stuff
-        compile.send(:evaluate_main)
-        compile.topscope
+        compiler.send(:evaluate_main)
+        compiler.topscope
     end
 
     def classobj(name, hash = {})
diff --git a/test/lib/puppettest/support/resources.rb b/test/lib/puppettest/support/resources.rb
index 384f61c..255c555 100755
--- a/test/lib/puppettest/support/resources.rb
+++ b/test/lib/puppettest/support/resources.rb
@@ -18,7 +18,7 @@ module PuppetTest::Support::Resources
             if resource.is_a?(String)
                 resource = tree_resource(resource)
             end
-            config.add_edge!(comp, resource)
+            config.add_edge(comp, resource)
             config.add_resource resource unless config.resource(resource.ref)
         end
         return comp
diff --git a/test/network/client/master.rb b/test/network/client/master.rb
index 696d08b..4179657 100755
--- a/test/network/client/master.rb
+++ b/test/network/client/master.rb
@@ -211,6 +211,16 @@ end
             "Lost value to hostname")
     end
 
+    # Make sure that setting environment by fact takes precedence to configuration
+    def test_setenvironmentwithfact
+        name = "environment"
+        value = "test_environment"
+
+        Facter.stubs(:to_hash).returns(name => value)
+
+        assert_equal(value, Puppet::Network::Client.master.facts[name])
+    end
+
     # Make sure we load all facts on startup.
     def test_loadfacts
         dirs = [tempfile(), tempfile()]
diff --git a/test/network/handler/fileserver.rb b/test/network/handler/fileserver.rb
index 233e705..a705dbf 100755
--- a/test/network/handler/fileserver.rb
+++ b/test/network/handler/fileserver.rb
@@ -109,13 +109,13 @@ class TestFileServer < Test::Unit::TestCase
         # and verify different iterations of 'root' return the same value
         list = nil
         assert_nothing_raised {
-            list = server.list("/test/", :ignore, true, false)
+            list = server.list("/test/", :manage, true, false)
         }
 
         assert(list =~ pattern)
 
         assert_nothing_raised {
-            list = server.list("/test", :ignore, true, false)
+            list = server.list("/test", :manage, true, false)
         }
         assert(list =~ pattern)
 
@@ -143,7 +143,7 @@ class TestFileServer < Test::Unit::TestCase
         list = nil
         sfile = "/test/tmpfile"
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false)
+            list = server.list(sfile, :manage, true, false)
         }
 
         assert_nothing_raised {
@@ -200,7 +200,7 @@ class TestFileServer < Test::Unit::TestCase
         list = nil
         sfile = "/test/"
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false)
+            list = server.list(sfile, :manage, true, false)
         }
 
         # create the new file
@@ -210,7 +210,7 @@ class TestFileServer < Test::Unit::TestCase
 
         newlist = nil
         assert_nothing_raised {
-            newlist = server.list(sfile, :ignore, true, false)
+            newlist = server.list(sfile, :manage, true, false)
         }
 
         # verify the list has changed
@@ -239,12 +239,12 @@ class TestFileServer < Test::Unit::TestCase
 
         list = nil
         assert_nothing_raised {
-            list = server.list("/root/" + testdir, :ignore, true, false)
+            list = server.list("/root/" + testdir, :manage, true, false)
         }
 
         assert(list =~ pattern)
         assert_nothing_raised {
-            list = server.list("/root" + testdir, :ignore, true, false)
+            list = server.list("/root" + testdir, :manage, true, false)
         }
 
         assert(list =~ pattern)
@@ -279,7 +279,7 @@ class TestFileServer < Test::Unit::TestCase
         # get our list
         list = nil
         assert_nothing_raised {
-            list = server.list("/test/with", :ignore, false, false)
+            list = server.list("/test/with", :manage, false, false)
         }
 
         # make sure we only got one line, since we're not recursing
@@ -288,7 +288,7 @@ class TestFileServer < Test::Unit::TestCase
         # for each level of recursion, make sure we get the right list
         [0, 1, 2].each { |num|
             assert_nothing_raised {
-                list = server.list("/test/with", :ignore, num, false)
+                list = server.list("/test/with", :manage, num, false)
             }
 
             count = 0
@@ -332,13 +332,13 @@ class TestFileServer < Test::Unit::TestCase
         list = nil
         # and then check a few dirs
         assert_nothing_raised {
-            list = server.list("/localhost/with", :ignore, false, false)
+            list = server.list("/localhost/with", :manage, false, false)
         }
 
         assert(list !~ /with/)
 
         assert_nothing_raised {
-            list = server.list("/localhost/with/some/sub", :ignore, true, false)
+            list = server.list("/localhost/with/some/sub", :manage, true, false)
         }
 
         assert(list !~ /sub/)
@@ -370,7 +370,7 @@ class TestFileServer < Test::Unit::TestCase
 
         list = nil
         assert_nothing_raised {
-            list = server.list("/localhost/", :ignore, 1, false)
+            list = server.list("/localhost/", :manage, 1, false)
         }
         assert_instance_of(String, list, "Server returned %s instead of string")
         list = list.split("\n")
@@ -402,7 +402,7 @@ class TestFileServer < Test::Unit::TestCase
         list = nil
         sfile = "/test/"
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false)
+            list = server.list(sfile, :manage, true, false)
         }
 
         # and describe each file in the list
@@ -492,7 +492,7 @@ class TestFileServer < Test::Unit::TestCase
         mounts.each { |mount, files|
             mount = "/#{mount}/"
             assert_nothing_raised {
-                list = server.list(mount, :ignore, true, false)
+                list = server.list(mount, :manage, true, false)
             }
 
             assert_nothing_raised {
@@ -544,12 +544,12 @@ class TestFileServer < Test::Unit::TestCase
                         assert_raise(Puppet::AuthorizationError,
                             "Host %s, ip %s, allowed %s" %
                             [host, ip, mount]) {
-                                list = server.list(mount, :ignore, true, false, host, ip)
+                                list = server.list(mount, :manage, true, false, host, ip)
                         }
                     when :allow:
                         assert_nothing_raised("Host %s, ip %s, denied %s" %
                             [host, ip, mount]) {
-                                list = server.list(mount, :ignore, true, false, host, ip)
+                                list = server.list(mount, :manage, true, false, host, ip)
                         }
                     end
                 }
@@ -602,7 +602,7 @@ class TestFileServer < Test::Unit::TestCase
 
             assert_raise(Puppet::Network::Handler::FileServerError,
                 "Invalid mount was mounted") {
-                    server.list(mount, :ignore)
+                    server.list(mount, :manage)
             }
         }
 
@@ -654,13 +654,13 @@ class TestFileServer < Test::Unit::TestCase
 
         list = nil
         assert_nothing_raised {
-            list = server.list("/thing/", :ignore, false, false,
+            list = server.list("/thing/", :manage, false, false,
                 "test1.domain.com", "127.0.0.1")
         }
         assert(list != "", "List returned nothing in rereard test")
 
         assert_raise(Puppet::AuthorizationError, "List allowed invalid host") {
-            list = server.list("/thing/", :ignore, false, false,
+            list = server.list("/thing/", :manage, false, false,
                 "test2.domain.com", "127.0.0.1")
         }
 
@@ -675,12 +675,12 @@ class TestFileServer < Test::Unit::TestCase
         }
         
         assert_raise(Puppet::AuthorizationError, "List allowed invalid host") {
-            list = server.list("/thing/", :ignore, false, false,
+            list = server.list("/thing/", :manage, false, false,
                 "test1.domain.com", "127.0.0.1")
         }
 
         assert_nothing_raised {
-            list = server.list("/thing/", :ignore, false, false,
+            list = server.list("/thing/", :manage, false, false,
                 "test2.domain.com", "127.0.0.1")
         }
 
@@ -735,7 +735,7 @@ class TestFileServer < Test::Unit::TestCase
         # Then not
         results = {}
         assert_nothing_raised {
-            server.describe("/mount/link", :ignore).split("\t").zip(
+            server.describe("/mount/link", :manage).split("\t").zip(
                 Puppet::Network::Handler.fileserver::CHECKPARAMS
             ).each { |v,p| results[p] = v }
         }
@@ -801,28 +801,28 @@ allow *
         list = nil
         sfile = "/host/file.txt"
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false, client1, ip)
+            list = server.list(sfile, :manage, true, false, client1, ip)
         }
         assert_equal("/\tfile", list)
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false, client2, ip)
+            list = server.list(sfile, :manage, true, false, client2, ip)
         }
         assert_equal("", list)
 
         sfile = "/fqdn/file.txt"
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false, client1, ip)
+            list = server.list(sfile, :manage, true, false, client1, ip)
         }
         assert_equal("", list)
         assert_nothing_raised {
-            list = server.list(sfile, :ignore, true, false, client2, ip)
+            list = server.list(sfile, :manage, true, false, client2, ip)
         }
         assert_equal("/\tfile", list)
 
         # check describe
         sfile = "/host/file.txt"
         assert_nothing_raised {
-            list = server.describe(sfile, :ignore, client1, ip).split("\t")
+            list = server.describe(sfile, :manage, client1, ip).split("\t")
         }
         assert_equal(5, list.size)
         assert_equal("file", list[1])
@@ -830,18 +830,18 @@ allow *
         assert_equal("{md5}#{md5}", list[4])
 
         assert_nothing_raised {
-            list = server.describe(sfile, :ignore, client2, ip).split("\t")
+            list = server.describe(sfile, :manage, client2, ip).split("\t")
         }
         assert_equal([], list)
 
         sfile = "/fqdn/file.txt"
         assert_nothing_raised {
-            list = server.describe(sfile, :ignore, client1, ip).split("\t")
+            list = server.describe(sfile, :manage, client1, ip).split("\t")
         }
         assert_equal([], list)
 
         assert_nothing_raised {
-            list = server.describe(sfile, :ignore, client2, ip).split("\t")
+            list = server.describe(sfile, :manage, client2, ip).split("\t")
         }
         assert_equal(5, list.size)
         assert_equal("file", list[1])
@@ -851,23 +851,23 @@ allow *
         # Check retrieve
         sfile = "/host/file.txt"
         assert_nothing_raised {
-            list = server.retrieve(sfile, :ignore, client1, ip).chomp
+            list = server.retrieve(sfile, :manage, client1, ip).chomp
         }
         assert_equal(contents[client1_hostdir].chomp, list)
 
         assert_nothing_raised {
-            list = server.retrieve(sfile, :ignore, client2, ip).chomp
+            list = server.retrieve(sfile, :manage, client2, ip).chomp
         }
         assert_equal("", list)
 
         sfile = "/fqdn/file.txt"
         assert_nothing_raised {
-            list = server.retrieve(sfile, :ignore, client1, ip).chomp
+            list = server.retrieve(sfile, :manage, client1, ip).chomp
         }
         assert_equal("", list)
 
         assert_nothing_raised {
-            list = server.retrieve(sfile, :ignore, client2, ip).chomp
+            list = server.retrieve(sfile, :manage, client2, ip).chomp
         }
         assert_equal(contents[client2_fqdndir].chomp, list)
     end
@@ -945,12 +945,14 @@ allow *
         # Now, check that they use Facter info 
         Puppet.notice "The following messages are normal"
         client = nil
-        local = Facter["hostname"].value
-        domain = Facter["domain"].value
-        fqdn = [local, domain].join(".")
-        {"%h" => local, # Short name
-         "%H" => fqdn, # Full name
-         "%d" => domain, # domain
+        Facter.stubs(:value).with(:ipaddress).returns("127.0.0.1")
+        Facter.stubs(:value).with { |v| v.to_s == "hostname" }.returns("myhost")
+        Facter.stubs(:value).with { |v| v.to_s == "domain" }.returns("mydomain.com")
+        Facter.stubs(:value).with(:domain).returns("mydomain.com")
+
+        {"%h" => "myhost", # Short name
+         "%H" => "myhost.mydomain.com", # Full name
+         "%d" => "mydomain.com", # domain
          "%%" => "%", # escape
          "%o" => "%o" # other
          }.each do |pat, repl|
@@ -993,18 +995,18 @@ allow *
 
             ret = nil
             assert_nothing_raised do
-                ret = server.list("/name", :ignore, false, false, host, ip)
+                ret = server.list("/name", :manage, false, false, host, ip)
             end
 
             assert_equal("/\tfile", ret)
 
             assert_nothing_raised do
-                ret = server.describe("/name", :ignore, host, ip)
+                ret = server.describe("/name", :manage, host, ip)
             end
-            assert(ret =~ /\tfile\t/, "Did not get valid a description")
+            assert(ret =~ /\tfile\t/, "Did not get valid a description (#{ret.inspect})")
 
             assert_nothing_raised do
-                ret = server.retrieve("/name", :ignore, host, ip)
+                ret = server.retrieve("/name", :manage, host, ip)
             end
 
             assert_equal(ret, File.read(file))
@@ -1050,7 +1052,7 @@ allow *
             mount = "/#{mod.name}/"
             list = nil
             assert_nothing_raised {
-                list = server.list(mount, :ignore, true, false)
+                list = server.list(mount, :manage, true, false)
             }
             list = list.split("\n")
             if mod.name == "green"
@@ -1063,7 +1065,7 @@ allow *
             end
 
             assert_nothing_raised("Host 'allow' denied #{mount}") {
-                server.list(mount, :ignore, true, false,
+                server.list(mount, :manage, true, false,
                             'allow.example.com', "192.168.0.1")
             }
         end
@@ -1106,7 +1108,7 @@ allow *
         list = nil
         mount = "/#{mod.name}/"
         assert_nothing_raised {
-            list = server.list(mount, :ignore, true, false)
+            list = server.list(mount, :manage, true, false)
         }
 
         assert_nothing_raised {
@@ -1121,11 +1123,11 @@ allow *
         # now let's check that things are being correctly forbidden
         assert_raise(Puppet::AuthorizationError,
                      "Host 'deny' allowed #{mount}") {
-            server.list(mount, :ignore, true, false,
+            server.list(mount, :manage, true, false,
                         'deny.example.com', "192.168.1.1")
         }
         assert_nothing_raised("Host 'allow' denied #{mount}") {
-            server.list(mount, :ignore, true, false,
+            server.list(mount, :manage, true, false,
                         'allow.example.com', "192.168.0.1")
         }
     end
diff --git a/test/network/server/webrick.rb b/test/network/server/webrick.rb
index d3408c1..fe6d69a 100755
--- a/test/network/server/webrick.rb
+++ b/test/network/server/webrick.rb
@@ -95,7 +95,7 @@ class TestWebrickServer < Test::Unit::TestCase
         # the client starts its connection immediately, thus throwing
         # the error.
         assert_raise(OpenSSL::SSL::SSLError) {
-            client = Puppet::Network::Client.status.new(:Server => "localhost", :Port => @@port)
+            Puppet::Network::HttpPool.http_instance("localhost", @@port).start
         }
     end
     
diff --git a/test/other/dsl.rb b/test/other/dsl.rb
index b4dd065..45b5198 100755
--- a/test/other/dsl.rb
+++ b/test/other/dsl.rb
@@ -12,7 +12,7 @@ class TestDSL < Test::Unit::TestCase
 
     def teardown
         super
-        Puppet::Aspect.clear
+        Puppet::DSL::Aspect.clear
     end
 
     def test_aspect
@@ -22,7 +22,7 @@ class TestDSL < Test::Unit::TestCase
             end
         end
 
-        assert_equal(a, Puppet::Aspect[:yaytest])
+        assert_equal(a, Puppet::DSL::Aspect[:yaytest])
 
         # Now make a child aspect
         b = nil
@@ -154,8 +154,7 @@ class TestDSL < Test::Unit::TestCase
 
         resource = nil
         assert_nothing_raised do
-            resource = a.newresource filetype, path,
-                :content => "yay", :mode => "640"
+            resource = a.newresource filetype, path, :content => "yay", :mode => "640"
         end
 
         assert_instance_of(Puppet::Parser::Resource, resource)
diff --git a/test/other/transactions.rb b/test/other/transactions.rb
index 79971a2..ce2d0d5 100755
--- a/test/other/transactions.rb
+++ b/test/other/transactions.rb
@@ -6,10 +6,12 @@ require 'puppet'
 require 'puppettest'
 require 'mocha'
 require 'puppettest/support/resources'
+require 'puppettest/support/utils'
 
 class TestTransactions < Test::Unit::TestCase
     include PuppetTest::FileTesting
     include PuppetTest::Support::Resources
+    include PuppetTest::Support::Utils
     class Fakeprop <Puppet::Property
         attr_accessor :path, :is, :should, :name
         def should_to_s(value)
@@ -348,12 +350,12 @@ class TestTransactions < Test::Unit::TestCase
         fcomp = Puppet::Type.type(:component).create(:name => "file")
         config.add_resource fcomp
         config.add_resource file
-        config.add_edge!(fcomp, file)
+        config.add_edge(fcomp, file)
 
         ecomp = Puppet::Type.type(:component).create(:name => "exec")
         config.add_resource ecomp
         config.add_resource exec
-        config.add_edge!(ecomp, exec)
+        config.add_edge(ecomp, exec)
 
         # 'subscribe' expects an array of arrays
         #component[:require] = [[file.class.name,file.name]]
@@ -828,10 +830,10 @@ class TestTransactions < Test::Unit::TestCase
         c = trigger.new(:c)
         nope = Puppet::Relationship.new(a, b)
         yep = Puppet::Relationship.new(a, c, {:callback => :refresh})
-        graph.add_edge!(nope)
+        graph.add_edge(nope)
 
         # And a triggering one.
-        graph.add_edge!(yep)
+        graph.add_edge(yep)
 
         # Create our transaction
         trans = Puppet::Transaction.new(graph)
diff --git a/test/rails/ast.rb b/test/rails/ast.rb
index e51fa6c..1deaec0 100755
--- a/test/rails/ast.rb
+++ b/test/rails/ast.rb
@@ -44,12 +44,12 @@ class TestRailsAST < PuppetTest::TestCase
             # And if it is, make sure we throw an error.
             if bad
                 assert_raise(Puppet::ParseError, "Evaluated '#{string}'") do
-                    str, code = query.evaluate :scope => @scope
+                    str, code = query.evaluate @scope
                 end
                 next
             else
                 assert_nothing_raised("Could not evaluate '#{string}'") do
-                    str, code = query.evaluate :scope => @scope
+                    str, code = query.evaluate @scope
                 end
             end
             assert_nothing_raised("Could not find resource") do
diff --git a/test/rails/configuration.rb b/test/rails/configuration.rb
index 9e2ddfe..a878d13 100755
--- a/test/rails/configuration.rb
+++ b/test/rails/configuration.rb
@@ -24,7 +24,7 @@ class ConfigurationRailsTests < PuppetTest::TestCase
     # We need to make sure finished objects are stored in the db.
     def test_finish_before_store
         railsinit
-        compile = mkcompile
+        compile = mkcompiler
         parser = compile.parser
 
         node = parser.newnode [compile.node.name], :code => AST::ASTArray.new(:children => [
diff --git a/test/rails/railsparameter.rb b/test/rails/railsparameter.rb
index d83115b..7c99ac3 100755
--- a/test/rails/railsparameter.rb
+++ b/test/rails/railsparameter.rb
@@ -25,6 +25,8 @@ class TestRailsParameter < Test::Unit::TestCase
         source = parser.newclass "myclass"
 
         host = Puppet::Rails::Host.new(:name => "myhost")
+
+        host.save
         
         resource = host.resources.create(
             :title => "/tmp/to_resource", 
diff --git a/test/rails/railsresource.rb b/test/rails/railsresource.rb
index 5805847..3df5001 100755
--- a/test/rails/railsresource.rb
+++ b/test/rails/railsresource.rb
@@ -29,6 +29,7 @@ class TestRailsResource < Test::Unit::TestCase
     def mktest_resource
         # We need a host for resources
         host = Puppet::Rails::Host.new(:name => "myhost")
+        host.save
 
         # Now build a resource
         resource = host.resources.create(
diff --git a/test/ral/manager/type.rb b/test/ral/manager/type.rb
index 6a04468..324550a 100755
--- a/test/ral/manager/type.rb
+++ b/test/ral/manager/type.rb
@@ -574,8 +574,8 @@ class TestType < Test::Unit::TestCase
         assert_equal(greater, type.defaultprovider)
     end
 
-    # Make sure that we can have multiple isomorphic objects with the same name,
-    # but not with non-isomorphic objects.
+    # Make sure that we can have multiple non-isomorphic objects with the same name,
+    # but not with isomorphic objects.
     def test_isomorphic_names
         # First do execs, since they're not isomorphic.
         echo = Puppet::Util.binary "echo"
@@ -708,7 +708,7 @@ class TestType < Test::Unit::TestCase
             res = type.create(hash)
             config.add_resource res
             if parent
-                config.add_edge!(parent, res)
+                config.add_edge(parent, res)
             end
             res
         end
@@ -741,7 +741,7 @@ class TestType < Test::Unit::TestCase
         
         newcomp = Puppet::Type.newcomponent :type => "yay", :name => "Good[bad]"
         config.add_resource newcomp
-        config.add_edge! comp, newcomp
+        config.add_edge comp, newcomp
         exec = mk.call(6, :parent => newcomp)
         assert_equal("//Good[bad]/Exec[exec6]", exec.path)
     end
diff --git a/test/ral/providers/cron/crontab.rb b/test/ral/providers/cron/crontab.rb
index 2da4b1b..1ff1e34 100755
--- a/test/ral/providers/cron/crontab.rb
+++ b/test/ral/providers/cron/crontab.rb
@@ -344,7 +344,9 @@ class TestCronParsedProvider < Test::Unit::TestCase
         end
     end
 
-    # Make sure we can create a cron in an empty tab
+    # Make sure we can create a cron in an empty tab.
+    # LAK:FIXME This actually modifies the user's crontab,
+    # which is pretty heinous.
     def test_mkcron_if_empty
         setme
         @provider.filetype = @oldfiletype
diff --git a/test/ral/providers/package.rb b/test/ral/providers/package.rb
index 90c8621..f2d28d0 100755
--- a/test/ral/providers/package.rb
+++ b/test/ral/providers/package.rb
@@ -46,7 +46,7 @@ class TestPackageProvider < Test::Unit::TestCase
         end
         facts = {}
         Facter.to_hash.each do |fact, value|
-            facts[fact.downcase.intern] = value.downcase.intern
+            facts[fact.to_s.downcase.intern] = value.to_s.downcase.intern
         end
         list.find_all { |hash| # First find the matching providers
             hash.include?(:provider) and providers.include?(hash[:provider])
diff --git a/test/ral/types/basic.rb b/test/ral/type/basic.rb
similarity index 96%
rename from test/ral/types/basic.rb
rename to test/ral/type/basic.rb
index 7bbadc5..3c5faee 100755
--- a/test/ral/types/basic.rb
+++ b/test/ral/type/basic.rb
@@ -36,8 +36,8 @@ class TestBasic < Test::Unit::TestCase
             )
         }
         @config = mk_catalog(@component, @configfile, @command)
-        @config.add_edge! @component, @configfile
-        @config.add_edge! @component, @command
+        @config.add_edge @component, @configfile
+        @config.add_edge @component, @command
     end
 
     def teardown
diff --git a/test/ral/types/cron.rb b/test/ral/type/cron.rb
similarity index 100%
rename from test/ral/types/cron.rb
rename to test/ral/type/cron.rb
diff --git a/test/ral/types/exec.rb b/test/ral/type/exec.rb
similarity index 95%
rename from test/ral/types/exec.rb
rename to test/ral/type/exec.rb
index f718f94..e2a3dd9 100755
--- a/test/ral/types/exec.rb
+++ b/test/ral/type/exec.rb
@@ -394,8 +394,8 @@ class TestExec < Test::Unit::TestCase
         assert_apply(exec)
 
         assert_nothing_raised {
-            exec[:command] = "echo logoutput is warning"
-            exec[:logoutput] = "warning"
+            exec[:command] = "echo logoutput is on_failure"
+            exec[:logoutput] = "on_failure"
         }
 
         assert_apply(exec)
@@ -587,6 +587,46 @@ and stuff"
         assert_equal("A B\n", output)
     end
     
+    def test_environmentparam
+        exec = Puppet::Type.newexec(
+            :command => "echo $environmenttest",
+            :path => ENV["PATH"],
+            :environment => "environmenttest=yayness"
+        )
+
+        assert(exec, "Could not make exec")
+
+        output = status = nil
+        assert_nothing_raised {
+            output, status = exec.run("echo $environmenttest")
+        }
+
+        assert_equal("yayness\n", output)
+
+        # Now check whether we can do multiline settings
+        assert_nothing_raised do
+            exec[:environment] = "environmenttest=a list of things
+and stuff"
+        end
+
+        output = status = nil
+        assert_nothing_raised {
+            output, status = exec.run('echo "$environmenttest"')
+        }
+        assert_equal("a list of things\nand stuff\n", output)
+
+        # Now test arrays
+        assert_nothing_raised do
+            exec[:environment] = ["funtest=A", "yaytest=B"]
+        end
+
+        output = status = nil
+        assert_nothing_raised {
+            output, status = exec.run('echo "$funtest" "$yaytest"')
+        }
+        assert_equal("A B\n", output)
+    end
+
     def test_timeout
         exec = Puppet::Type.type(:exec).create(:command => "sleep 1", :path => ENV["PATH"], :timeout => "0.2")
         time = Time.now
diff --git a/test/ral/types/file.rb b/test/ral/type/file.rb
similarity index 95%
rename from test/ral/types/file.rb
rename to test/ral/type/file.rb
index a3a0c57..5cf989a 100755
--- a/test/ral/types/file.rb
+++ b/test/ral/type/file.rb
@@ -9,9 +9,7 @@ require 'fileutils'
 class TestFile < Test::Unit::TestCase
     include PuppetTest::Support::Utils
     include PuppetTest::FileTesting
-    # hmmm
-    # this is complicated, because we store references to the created
-    # objects in a central store
+
     def mkfile(hash)
         file = nil
         assert_nothing_raised {
@@ -21,8 +19,6 @@ class TestFile < Test::Unit::TestCase
     end
 
     def mktestfile
-        # because luke's home directory is on nfs, it can't be used for testing
-        # as root
         tmpfile = tempfile()
         File.open(tmpfile, "w") { |f| f.puts rand(100) }
         @@tmpfiles.push tmpfile
@@ -181,7 +177,7 @@ class TestFile < Test::Unit::TestCase
             assert_equal(inituser, File.stat(file).uid)
 
             obj.delete(:owner)
-            obj[:links] = :ignore
+            obj[:links] = :follow
 
             # And then test 'group'
             group = nonrootgroup
@@ -189,12 +185,6 @@ class TestFile < Test::Unit::TestCase
             initgroup = File.stat(file).gid
             obj[:group] = group.name
 
-            assert_events([:file_changed], obj)
-            assert_equal(initgroup, File.stat(file).gid)
-            assert_equal(group.gid, File.lstat(link).gid)
-            File.chown(nil, initgroup, file)
-            File.lchown(nil, initgroup, link)
-
             obj[:links] = :follow
             assert_events([:file_changed], obj)
             assert_equal(group.gid, File.stat(file).gid)
@@ -407,8 +397,7 @@ class TestFile < Test::Unit::TestCase
 
                 assert(events)
 
-                assert(! events.include?(:file_changed),
-                    "File incorrectly changed")
+                assert(! events.include?(:file_changed), "File incorrectly changed")
                 assert_events([], file)
 
                 # We have to sleep because the time resolution of the time-based
@@ -1046,66 +1035,6 @@ class TestFile < Test::Unit::TestCase
             "directory mode is incorrect")
     end
 
-    def test_followlinks
-        File.umask(0022)
-      
-        basedir = tempfile()
-        Dir.mkdir(basedir)
-        file = File.join(basedir, "file")
-        link = File.join(basedir, "link")
-
-        File.open(file, "w", 0644) { |f| f.puts "yayness"; f.flush }
-        File.symlink(file, link)
-
-        obj = nil
-        assert_nothing_raised {
-            obj = Puppet.type(:file).create(
-                :path => link,
-                :mode => "755"
-            )
-        }
-        obj.retrieve
-
-        assert_events([], obj)
-
-        # Assert that we default to not following links
-        assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
-
-        # Assert that we can manage the link directly, but modes still don't change
-        obj[:links] = :manage
-        assert_events([], obj)
-
-        assert_equal("%o" % 0644, "%o" % (File.stat(file).mode & 007777))
-
-        obj[:links] = :follow
-        assert_events([:file_changed], obj)
-
-        assert_equal("%o" % 0755, "%o" % (File.stat(file).mode & 007777))
-
-        # Now verify that content and checksum don't update, either
-        obj.delete(:mode)
-        obj[:checksum] = "md5"
-        obj[:links] = :ignore
-
-        assert_events([], obj)
-        File.open(file, "w") { |f| f.puts "more text" }
-        assert_events([], obj)
-        obj[:links] = :follow
-        assert_events([], obj)
-        File.open(file, "w") { |f| f.puts "even more text" }
-        assert_events([:file_changed], obj)
-
-        obj.delete(:checksum)
-        obj[:content] = "this is some content"
-        obj[:links] = :ignore
-
-        assert_events([], obj)
-        File.open(file, "w") { |f| f.puts "more text" }
-        assert_events([], obj)
-        obj[:links] = :follow
-        assert_events([:file_changed], obj)
-    end
-
     # If both 'ensure' and 'content' are used, make sure that all of the other
     # properties are handled correctly.
     def test_contentwithmode
@@ -1292,6 +1221,7 @@ class TestFile < Test::Unit::TestCase
             :title => "localfile",
             :path => localfile,
             :content => "rahtest",
+            :ensure => :file,
             :backup => false
         )
 
@@ -1304,8 +1234,8 @@ class TestFile < Test::Unit::TestCase
         config.apply
 
         assert(FileTest.exists?(dsourcefile), "File did not get copied")
-        assert(FileTest.exists?(localfile), "File did not get created")
-        assert(FileTest.exists?(purgee), "File got prematurely purged")
+        assert(FileTest.exists?(localfile), "Local file did not get created")
+        assert(FileTest.exists?(purgee), "Purge target got prematurely purged")
 
         assert_nothing_raised { destobj[:purge] = true }
         config.apply
@@ -1387,8 +1317,7 @@ class TestFile < Test::Unit::TestCase
         File.symlink(dir, link)
         File.open(file, "w") { |f| f.puts "" }
         assert_equal(dir, File.readlink(link))
-        obj = Puppet::Type.newfile :path => link, :ensure => :link,
-            :target => file, :recurse => false, :backup => "main"
+        obj = Puppet::Type.newfile :path => link, :ensure => :link, :target => file, :recurse => false, :backup => "main"
 
         assert_apply(obj)
 
@@ -1817,5 +1746,31 @@ class TestFile < Test::Unit::TestCase
         changes = obj.evaluate
         assert(changes.empty?, "Missing file with no ensure resulted in changes")
     end
-end
 
+    def test_root_dir_is_named_correctly
+        obj = Puppet::Type.newfile(:path => '/', :mode => 0755)
+        assert_equal("/", obj.title, "/ directory was changed to empty string")
+    end
+
+    # #1010 and #1037 -- write should fail if the written checksum does not
+    # match the file we thought we were writing.
+    def test_write_validates_checksum
+        file = tempfile
+        inst = Puppet::Type.newfile(:path => file, :content => "something")
+
+        tmpfile = file + ".puppettmp"
+
+        wh = mock 'writehandle', :print => nil
+        rh = mock 'readhandle'
+        rh.expects(:read).with(512).times(2).returns("other").then.returns(nil)
+        File.expects(:open).with { |*args| args[0] == tmpfile and args[1] != "r" }.yields(wh)
+        File.expects(:open).with { |*args| args[0] == tmpfile and args[1] == "r" }.yields(rh)
+
+        File.stubs(:rename)
+        FileTest.stubs(:exist?).returns(true)
+        FileTest.stubs(:file?).returns(true)
+
+        inst.expects(:fail)
+        inst.write("something", :whatever)
+    end
+end
diff --git a/test/ral/types/file/target.rb b/test/ral/type/file/target.rb
similarity index 100%
rename from test/ral/types/file/target.rb
rename to test/ral/type/file/target.rb
diff --git a/test/ral/types/filebucket.rb b/test/ral/type/filebucket.rb
similarity index 100%
rename from test/ral/types/filebucket.rb
rename to test/ral/type/filebucket.rb
diff --git a/test/ral/types/fileignoresource.rb b/test/ral/type/fileignoresource.rb
similarity index 100%
rename from test/ral/types/fileignoresource.rb
rename to test/ral/type/fileignoresource.rb
diff --git a/test/ral/types/filesources.rb b/test/ral/type/filesources.rb
similarity index 97%
rename from test/ral/types/filesources.rb
rename to test/ral/type/filesources.rb
index 02bf8a5..a7bb6fe 100755
--- a/test/ral/types/filesources.rb
+++ b/test/ral/type/filesources.rb
@@ -84,8 +84,7 @@ class TestFileSources < Test::Unit::TestCase
         source = tempfile()
         dest = tempfile()
         
-        file = Puppet::Type.newfile :path => dest, :source => source,
-            :title => "copier"
+        file = Puppet::Type.newfile :path => dest, :source => source, :title => "copier"
         
         property = file.property(:source)
         
@@ -124,17 +123,10 @@ class TestFileSources < Test::Unit::TestCase
         File.open(target, "w") { |f| f.puts "yay" }
         File.symlink(target, source)
         
-        file[:links] = :ignore
-        assert_nil(property.describe(source),
-            "Links were not ignored")
-        
         file[:links] = :manage
-        # We can't manage links at this point
-        assert_raise(Puppet::Network::Handler::FileServerError) do
-            property.describe(source)
-        end
+        assert_equal("link", property.describe(source)[:type])
         
-        # And then make sure links get followed, otherwise
+        # And then make sure links get followed
         file[:links] = :follow
         assert_equal("file", property.describe(source)[:type])
     end
@@ -753,29 +745,18 @@ class TestFileSources < Test::Unit::TestCase
         assert_nothing_raised {
             file = Puppet.type(:file).create(
                 :name => dest,
-                :source => link
+                :source => link,
+                :links => :follow
             )
         }
 
-        # Default to skipping links
-        assert_events([], file)
-        assert(! FileTest.exists?(dest), "Created link")
-
-        # Now follow the links
-        file[:links] = :follow
         assert_events([:file_created], file)
         assert(FileTest.file?(dest), "Destination is not a file")
 
         # Now copy the links
-        #assert_raise(Puppet::Network::Handler::FileServerError) {
-        trans = nil
-        assert_nothing_raised {
-            file[:links] = :manage
-            comp = mk_catalog(file)
-            trans = comp.apply
-        }
-
-        assert(trans.failed?(file), "Object did not fail to copy links")
+        file[:links] = :manage
+        assert_events([:link_created], file)
+        assert(FileTest.symlink?(dest), "Destination is not a link")
     end
 
     def test_changes
diff --git a/test/ral/types/group.rb b/test/ral/type/group.rb
similarity index 100%
rename from test/ral/types/group.rb
rename to test/ral/type/group.rb
diff --git a/test/ral/types/host.rb b/test/ral/type/host.rb
similarity index 93%
rename from test/ral/types/host.rb
rename to test/ral/type/host.rb
index 088f93c..a5d645b 100755
--- a/test/ral/types/host.rb
+++ b/test/ral/type/host.rb
@@ -138,8 +138,24 @@ class TestHost < Test::Unit::TestCase
         host[:ensure] = :absent
         assert_events([:host_removed], host)
     end
+ 
+    def test_invalid_ipaddress
+        host = mkhost()
+
+        assert_raise(Puppet::Error) {
+            host[:ip] = "abc.def.ghi.jkl"
+        }
+    end
+
+    def test_invalid_hostname
+        host = mkhost()
+
+        assert_raise(Puppet::Error) {
+            host[:name] = "!invalid.hostname.$$$"
+        }
     end
 
+    end  
     def test_aliasisproperty
         assert_equal(:property, @hosttype.attrtype(:alias))
     end
diff --git a/test/ral/types/mailalias.rb b/test/ral/type/mailalias.rb
similarity index 100%
rename from test/ral/types/mailalias.rb
rename to test/ral/type/mailalias.rb
diff --git a/test/ral/types/parameter.rb b/test/ral/type/parameter.rb
similarity index 100%
rename from test/ral/types/parameter.rb
rename to test/ral/type/parameter.rb
diff --git a/test/ral/types/port.rb b/test/ral/type/port.rb
similarity index 100%
rename from test/ral/types/port.rb
rename to test/ral/type/port.rb
diff --git a/test/ral/types/property.rb b/test/ral/type/property.rb
similarity index 100%
rename from test/ral/types/property.rb
rename to test/ral/type/property.rb
diff --git a/test/ral/types/resources.rb b/test/ral/type/resources.rb
similarity index 100%
rename from test/ral/types/resources.rb
rename to test/ral/type/resources.rb
diff --git a/test/ral/types/service.rb b/test/ral/type/service.rb
similarity index 100%
rename from test/ral/types/service.rb
rename to test/ral/type/service.rb
diff --git a/test/ral/types/sshkey.rb b/test/ral/type/sshkey.rb
similarity index 100%
rename from test/ral/types/sshkey.rb
rename to test/ral/type/sshkey.rb
diff --git a/test/ral/types/tidy.rb b/test/ral/type/tidy.rb
similarity index 100%
rename from test/ral/types/tidy.rb
rename to test/ral/type/tidy.rb
index 60fad65..17f98df 100755
--- a/test/ral/types/tidy.rb
+++ b/test/ral/type/tidy.rb
@@ -4,6 +4,7 @@ require File.dirname(__FILE__) + '/../../lib/puppettest'
 
 require 'puppettest'
 require 'puppettest/support/utils'
+require 'puppet/type/tidy'
 
 class TestTidy < Test::Unit::TestCase
     include PuppetTest::Support::Utils
diff --git a/test/ral/types/user.rb b/test/ral/type/user.rb
similarity index 100%
rename from test/ral/types/user.rb
rename to test/ral/type/user.rb
diff --git a/test/ral/types/yumrepo.rb b/test/ral/type/yumrepo.rb
similarity index 100%
rename from test/ral/types/yumrepo.rb
rename to test/ral/type/yumrepo.rb
diff --git a/test/ral/types/zone.rb b/test/ral/type/zone.rb
similarity index 100%
rename from test/ral/types/zone.rb
rename to test/ral/type/zone.rb
diff --git a/test/test b/test/test
new file mode 100755
index 0000000..a8efd50
--- /dev/null
+++ b/test/test
@@ -0,0 +1,241 @@
+#!/usr/bin/env ruby
+
+#
+# = Synopsis
+#
+# Run unit tests, usually with the goal of resolving some conflict
+# between tests.
+#
+# = Usage
+#
+#   test [-d|--debug] [-f|--files] [-h|--help] [-n method] [-v|--verbose] <file> [file] ...
+#
+# = Description
+#
+# This script is useful for running a specific subset of unit tests, especially
+# when attempting to find a conflict between tests.  By default, it will take
+# the first argument you pass it and run that test or test directory with each
+# test directory in turn, looking for a failure.  If any tests fail, then
+# the script will drill into that test directory, looking for the specific conflict.
+#
+# In this way, when you have deduced you have two conflicting unit tests (tests which
+# pass in isolation but fail when run together), you can tell this script where
+# the failure is and leave it alone to find the conflict.
+#
+# This script is different from the Rakefile because it will run all tests in
+# a single process, whereas if you ask the Rakefile to run multiple tests, it will
+# run them in separate processes thus making it impossible to find conflicts.
+#
+# = Examples
+#
+# Attempt to resolve a conflict between a single test suite that could be anywhere:
+#
+#   ./test ral/providers/user.rb
+#
+# Determine whether two individual files conflict:
+#
+#   ./test --files language/functions.rb ral/providers/provider.rb
+#
+# Run the same test, but only run a specific unit test:
+#
+#   ./test -d -n test_search --files language/functions.rb ral/providers/provider.rb
+#
+# = Options
+#
+# debug::
+#   Enable full debugging.
+#
+# files::
+#   Specify exactly which files to test.
+#
+# help::
+#   Print this help message
+#
+# n::
+#   Specify a single unit test to run.  You can still specify as many files
+#   as you want.
+#
+# verbose::
+#   Print extra information.
+#
+# = Example
+#
+#   puppet -l /tmp/script.log script.pp
+#
+# = Author
+#
+# Luke Kanies
+#
+# = Copyright
+#
+# Copyright (c) 2005 Reductive Labs, LLC
+# Licensed under the GNU Public License
+
+require 'find'
+require 'getoptlong'
+include Find
+
+result = GetoptLong.new(
+    [ "--debug",	"-d",			GetoptLong::NO_ARGUMENT ],
+    [ "--verbose",	"-v",			GetoptLong::NO_ARGUMENT ],
+    [ "-n",			                GetoptLong::REQUIRED_ARGUMENT ],
+    [ "--files",    "-f",           GetoptLong::NO_ARGUMENT ],
+    [ "--help",		"-h",			GetoptLong::NO_ARGUMENT ]
+)
+
+usage = "USAGE: %s [--help] suite" % $0
+
+$options = {}
+keep = []
+
+result.each { |opt,arg|
+    case opt
+    when "--verbose"
+        $options[:verbose] = true
+    when "--files"
+        $options[:files] = true
+    when "--debug"
+        $options[:debug] = true
+        $options[:verbose] = true
+    when "--help"
+        puts usage
+        exit
+    else
+        keep << opt
+        keep << arg if arg
+    end
+}
+
+def dirs
+    Dir.glob("*").find_all { |d| FileTest.directory?(d) }.reject { |d|
+        ["lib", "data"].include?(d)
+    }
+end
+
+def rake(*args)
+    print "trying %s..." % args.join(" ")
+    output = %x{rake %s} % args.join(" ")
+
+    if $?.exitstatus == 0
+        puts "succeeded"
+        return true
+    else
+        puts "failed"
+        return false
+    end
+end
+
+def resolve(dir)
+    dirs = dirs()
+
+    # If the passed dir is a subdir or file, put the basedir last
+    if dir.include?(File::SEPARATOR)
+        basedir = dir.split(File::SEPARATOR)[0]
+        if dirs.include?(basedir)
+            dirs.delete(basedir) 
+            dirs << basedir
+        end
+    end
+
+    failed = nil
+    dirs.each do |d|
+        next if d == dir
+        unless run([d, dir])
+            failed = d
+            break
+        end
+    end
+    puts "%s failed" % failed
+
+    files = ruby_files(failed)
+
+    files.each do |file|
+        unless run([file, dir])
+            puts file
+            exit(0)
+        end
+    end
+
+    exit(1)
+end
+
+def ruby_files(dir)
+    files = []
+    # First collect the entire file list.
+    begin
+        find(dir) { |f| files << f if f =~ /\.rb$/ }
+    rescue => detail
+        puts "could not find on %s: %s" % [dir.inspect, detail]
+    end
+    files
+end
+
+def run(files, flags = nil)
+    args = %w{ruby}
+    args << "-Ilib:../lib"
+    args << "lib/rake/puppet_test_loader.rb"
+    if flags
+        args += flags
+    end
+    args += ARGV
+
+    print files.join(" ") + "... "
+    $stdout.flush
+
+    files.each do |file|
+        case File.stat(file).ftype
+        when "file": args << file
+        when "directory": args += ruby_files(file)
+        else
+            $stderr.puts "Skipping %s; can't handle %s" %
+                [file, File.stat(file).ftype]
+        end
+    end
+    args = args.join(" ")
+    if $options[:verbose]
+        p args
+    end
+    output = %x{#{args} 2>&1}
+    if $options[:debug]
+        print output
+    end
+
+    if $?.exitstatus == 0
+        puts "succeeded"
+        return true
+    else
+        puts "failed"
+        puts output
+        return false
+    end
+end
+
+if $options[:files]
+    run(ARGV, keep)
+else
+    dir = ARGV.shift
+
+    unless dir
+        $stderr.puts usage
+        exit(1)
+    end
+    resolve(dir)
+end
+#
+#
+#files = []
+#
+#args.each do |test|
+#    if FileTest.directory?(test)
+#        files += ruby_files(test)
+#    end
+#end
+
+## Now load all of our files.
+#files.each do |file|
+#    load file unless file =~ /^-/
+#end
+#
+#runner = Test::Unit::AutoRunner.new(false) 
+#runner.process_args
+#runner.run
diff --git a/test/util/autoload.rb b/test/util/autoload.rb
index 6babed7..de503ab 100755
--- a/test/util/autoload.rb
+++ b/test/util/autoload.rb
@@ -103,10 +103,10 @@ TestAutoload.newthing(:#{name.to_s})
         assert(loader.send(:searchpath).include?(dir), "searchpath does not include the libdir")
     end
 
-    # This causes very strange behaviour in the tests.  We need to make sure we
-    # require the same path that a user would use, otherwise we'll result in
-    # a reload of the 
-    def test_require_does_not_cause_reload
+    # This tests #1027, which was caused by using the unqualified
+    # path for requires, which was initially done so that the kernel
+    # would keep track of which files got loaded.
+    def test_require_uses_full_path
         loadname = "testing"
         loader = Puppet::Util::Autoload.new(self.class, loadname)
 
@@ -120,7 +120,26 @@ TestAutoload.newthing(:#{name.to_s})
 
         Dir.expects(:glob).with("#{dir}/*.rb").returns(file)
 
-        Kernel.expects(:require).with(File.join(loadname, subname))
+        Kernel.expects(:require).with(file)
         loader.loadall
     end
+
+    def test_searchpath_includes_plugin_dirs
+        moddir = "/what/ever"
+        libdir = "/other/dir"
+        Puppet.settings.stubs(:value).with(:modulepath).returns(moddir)
+        Puppet.settings.stubs(:value).with(:libdir).returns(libdir)
+
+        loadname = "testing"
+        loader = Puppet::Util::Autoload.new(self.class, loadname)
+
+        # Currently, include both plugins and libs.
+        paths = %w{plugins lib}.inject({}) { |hash, d| hash[d] = File.join(moddir, "testing", d); FileTest.stubs(:directory?).with(hash[d]).returns(true); hash  }
+        Dir.expects(:glob).with("#{moddir}/*/{plugins,lib}").returns(paths.values)
+
+        searchpath = loader.searchpath
+        paths.each do |dir, path|
+            assert(searchpath.include?(path), "search path did not include path for %s" % dir)
+        end
+    end
 end

-- 
Puppet packaging for Debian



More information about the Pkg-puppet-devel mailing list