diff --git a/src/decaf/KEYS b/src/decaf/KEYS
deleted file mode 100644
index 8369607..0000000
--- a/src/decaf/KEYS
+++ /dev/null
@@ -1,102 +0,0 @@
-pub   1024D/CCD6F801 2006-11-15
-uid                  Nathan Mittler <nathan.mittler@gmail.com>
-sig 3        CCD6F801 2006-11-15  Nathan Mittler <nathan.mittler@gmail.com>
-sub   2048g/F5B8EA6A 2006-11-15
-sig          CCD6F801 2006-11-15  Nathan Mittler <nathan.mittler@gmail.com>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.4.2.2 (FreeBSD)
-
-mQGiBEVbpV0RBADJcRJLaDaspQfYql0ok3H/8FKeosZ5zuy37QLICwB9wpqXkeGI
-QEemsKV+6Y0Tv9KVVyBDvMOYu8ZKdqTOkodf6Qd85ZcyMPXQpavcdhKnSnux8d4K
-CoPJtNRogomxi1G/haGJnXl5s1WlZ4ME5ijnaF2UbPYP+5flIW2iv0movwCgzOOl
-ImfG9K9kxmHDXyKrmr8stCUD/3z8cyrkhQ47twFwhBzMuSKhfhsZR78L/tfVajjl
-BSDzu4MUORnm7nx/cnMge9b1Kt0bFWpcalIbUQP/iGLQSyG49S77JrKEaxonQhQF
-Z7zXZMPkm1Y54t9KSPtpgRrV0GSObKj9slQ5FYabhoE/6RW+zwPvTDgJftmyCSIQ
-znlMA/4uhhuXoYJo0Jus3o2rqbQfj9dcEdL502BqKz2kITCKr+2U8DBAaY5xVGUW
-ETUmueKHSrZSXDqPkL5QeVMuASJVas7VmTheLXk5Kr+kc5/X5Sl10oCZoqSgx6Lq
-81bjcbMrHvFWLOmQG/E0zM10EOWw6fEVaFZQUz504UStZm7JqrQpTmF0aGFuIE1p
-dHRsZXIgPG5hdGhhbi5taXR0bGVyQGdtYWlsLmNvbT6IYAQTEQIAIAUCRVulXQIb
-AwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEMGEfSvM1vgBX+AAnRQbwrVjW+P+
-6ERiJ1ezS8EjJsgXAJ97jIS7CVD+DKp5u4gS4SfidmsxNLkCDQRFW6ViEAgA7ytH
-Cl5uvL7SMuOdt9YRZyR7QkhfgBkkJhIUk2MyKqZ/zXhTS9Qgx/D7ulS4auUjdRNe
-YzzuiFhv5qQS/KQB4Bi+FbvxisaR8fh9Yt+8cHZdUiDHhI49c/qhxyJea1ByJ3AP
-Clyr2aCEYLRb+475rYzp43rQLb7SqboWG4ajVmeEQTPqWwM77XqnTTOyTs4MZEJs
-ZO5by+ud23VOG7EF5VL5l8kgNzN8+HHk0q8KU9G0Cir4XMi8vtMtPqXsDSDTsyQU
-Lu9pEdMznY4m4ozFdnT1vxvy5bfoXtfhYNG+161MZbikuEwcLVknXB5fzyfZNZeq
-LHEDbMo4McR/Y/da7wADBQf9GAm5486yFNc1VeMtUs7JUgJVdMdK1hxtgyMpy6i3
-xKdgReV7Nw6Vk1vKhKD53rLXfy5fk8PycSLKC63A/vhO1mHydW6pXtumILOtYdZw
-9FUNRfZIUTPyqnbPx+PZi3jmkK63qIfu8DFzfjxV9RxjhmRVgrzuBvEKqo5dAHM0
-9JOMwumE8nmYM0jrUt40IAozkLorWxnZZVZx1zsZGsLj4+0V7IurWMEYmWnmd/iF
-nDZi6CggW9om4NJJ72rNAYiEgZjLL9xBBjYplhqMQBHR+pZ8Jl56i78ZA8DfPejx
-LM/E931dZyTMAakFsTnFmRf4+DN+PKF4zd3lQuFhxk17QYhJBBgRAgAJBQJFW6Vi
-AhsMAAoJEMGEfSvM1vgBuWgAnjqmxSJjNF84pGejBbEAgPHYOlWyAJ4vpBTlolF0
-1tcyAF4QTEDQbKvJwg==
-=ssQm
------END PGP PUBLIC KEY BLOCK-----
-pub   1024D/5E4119DD 2007-04-06
-uid                  Timothy Bish <tabish121@gmail.com>
-sig 3        5E4119DD 2007-04-06  Timothy Bish <tabish121@gmail.com>
-sub   2048g/5D0D0993 2007-04-06
-sig          5E4119DD 2007-04-06  Timothy Bish <tabish121@gmail.com>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.4.7 (GNU/Linux)
-
-mQGiBEYWrAMRBADIah561RTKg4Fcp9DRzLLz2lPZekB1QefjaJMpuA5hrs5otN+I
-N3DOa4eM1q2Tq4GDoo14qMWv1Xxrp3MQskYIXzFwiju6JUQ92I76BG0qutr4eJPv
-ySIIOUElo96Y+7ye9iWRmBKDjM3mFNpCZsJ+eXJyuYeJ3bPDGR3EE+jkUwCgwjCC
-IUTdsAv2osu0ddJdTgTeicMEAJphtRFabJy5+5B/idMCWQW4RldF4Dus7N+wnWR3
-zkAw77DxQfno4Y29HKFo6omvMM5rM35ZXX58oGwYAhkTUUp47zglmKBCvptKDxOK
-zr+F1lDpulEfP/bOtXE4SkPCVI+FBBSrRPEBOq9JSgZnaJcL9RRVZtIn/hFDHm/h
-DXsKA/9sRQWz6UBfKncju7co+TIqE0hf3SSfCfkFqzhZSmJl/oLR4rbC5xuSppXx
-tQP6YEZahU+6iHbbJeIIkthIO6zqXeK0QThmc6EV5cuhA2PMHUuF/w4XikA38ZSA
-jP5EBLLSTGxQHPfhdUBnV4t8yvooFR1cDjPA5a2dlnw1sX04MrQiVGltb3RoeSBC
-aXNoIDx0YWJpc2gxMjFAZ21haWwuY29tPohgBBMRAgAgBQJGFqwDAhsDBgsJCAcD
-AgQVAggDBBYCAwECHgECF4AACgkQ2iSmy15BGd09RwCffbz/I4fIKFEvnzNV1eXc
-iWIVcAEAn32HrMifDJn1ZC1msgf6gw8gCMwbuQINBEYWrAMQCADwuFOY2t5pClQm
-dNBYG8YsvaRb80FUsNmGxx32EnPv0DljWSzpLtt+JdV0Nm2RVEDXkrqV1fzVMK0v
-Ei2KR0gOwus7E/AmFFG27legqSnlMjqtB+IQyx1VUxtfQIhAR6GZt3chTtgtjSPJ
-uCksKllz9fljIc3nqem4EP63m/w6LkAWuku9zEbBmBeeT9Ac06lxCXBXNlraciRD
-MUpbCraB6zmns2C1/DaiYbK5CHhHYwzHt+M3MZOf7olRBNdl/2I6NCJY0sZwUTrp
-QqYtCSZMOC6pSrsYq0KR5Y+yUTa/VpN3DV8wzTpJbvaBuSc4zz8pQtcS6WoJlrOJ
-Jvx89WCzAAMFCAC/SkYlTw+NVqbhisi8GNqT+Jq9y2q81jpQWVBz/ELaM5mzkBlr
-tVBLLJuB5dazlGMZV5JQ5/COHQ1Z3iw5KIqnRZAnxhn8D0xDsOaT3b2voCWyM9Dp
-BqY1WPvWsTD8oFJPm9y8Wvv8iACzTUIVysG7xCig73a5KbOuNF8cYmYrHqpb6H6U
-oAUFbm0ybwagAIw6eiQuxUPWhlKpx22Le4hS9jmlDO3CQXQCqkqpEIiIsrMeiS4L
-EkaTgGy8AvkLcbzmTF5mbB3nKfiHInTY1rVXhdGM8LLnfKJazhH6AbQwrptJCsnf
-gYpsSlm9oNW4fAvB852SN+zJrly0Jl/+tsdciEkEGBECAAkFAkYWrAMCGwwACgkQ
-2iSmy15BGd0F6QCeLKexEs2tW7uJK5FkSD4c+JGzhdEAoIUj6K6rjNNbbd4gq4L7
-dnc+3S9/
-=ASER
------END PGP PUBLIC KEY BLOCK-----
-pub   1024D/70AE7D08 2007-04-04
-uid                  Nathan Mittler <nathan.mittler@gmail.com>
-sig 3        70AE7D08 2007-04-04  Nathan Mittler <nathan.mittler@gmail.com>
-sub   1024g/A1255264 2007-04-04
-sig          70AE7D08 2007-04-04  Nathan Mittler <nathan.mittler@gmail.com>
-
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: GnuPG v1.4.7 (Darwin)
-
-mQGiBEYTksURBADfn9FYnPKtlRhC0o6ScnPJLePomEpd22F2b8uuC+q+0A6YwvLz
-aDz9k0pEnvFFHdWjTZPUzDXEb4CjRjnoGz5hnZUNG8bJxgkwKt1nUawjYnOgy17b
-ekYmhLtyS2T6jtHx2qIHw/B9Xu0TfHZTBht1H8kFPliteJf46PTxXX3k6wCg9Dls
-YoKoV4cPodpJUiN8AmaKdh8EAKqfQEn4mkwUkBw4Th4KxIl3/YfnNeH4kL1ejp/m
-Pwdf3u7EhEcyCc2i9iNDgvjaUO0SZVD0cJShWq3Us8PT6vAB+WYvk4LWywc6tSTe
-G80Ma0KWX6CXuvFKjlS0K17PqS2G4kb8kUjgSJto/NqC6TBY7/R+X1rrXcx6NtWA
-a/cNBADAGSMJTJGUpPFXBrcncBAlfBLtXVfGGknplyjlfewi7FXopy3K3+otYune
-VHk6V/A/xULLRuGgx+GwytJRTGcNc84tuIDm2iiI4JT4E+a6Ghi5A+xucUpLLi2f
-6OMYDz2QH6IAbLXjSLUcSwW/YNg+1wFotQCKkQR5dmZgghM2PLQpTmF0aGFuIE1p
-dHRsZXIgPG5hdGhhbi5taXR0bGVyQGdtYWlsLmNvbT6IYAQTEQIAIAUCRhOSxQIb
-IwYLCQgHAwIEFQIIAwQWAgMBAh4BAheAAAoJEII00zVwrn0IlEgAoN+ULhiUYtPx
-MhMGj+i9NOtJqOKoAKDmic8ZTi3HDUpyEsOvV/FeUaBrIbkBDQRGE5LFEAQAt2cH
-aKxpQyewpsCupoC24FIdtPOxtK0fr1pM4n7zyCcjiEFVM5RzylyZg00IRcDxHE6N
-E6n6ydshZ3oM+UabvgltLpeEdJI02p0YccE7FA6iQ80ChMm4bjLUwsBW1Lw2zKza
-oDk0A8PNlmgjwHJi9yrw2nje8QH+aTvvtMj+WucAAwcD/05X6+YplQb4NPjUP7uG
-LzXuGOOS7msDBtqi3zOMzFbfY7H7OtF/SZmDzWDsZiQwq/nlTfernHCKe+/kUHTt
-9pJ7+5cGKFy5chgzVmCbYW6s8+IiaZVFLc5iWASqGhd/a9tEItughEK3pOt3kjud
-o0WcDTFOe9+YGbFAZg8kuMsbiEkEGBECAAkFAkYTksUCGwwACgkQgjTTNXCufQjL
-qQCeKZi8Gs8h9qS511FdlWnV0J6C2U4An0p+wQBKYckIUy5Fif3uWaHsSpa1
-=uYcU
------END PGP PUBLIC KEY BLOCK-----
diff --git a/src/decaf/LICENSE.txt b/src/decaf/LICENSE.txt
deleted file mode 100755
index 6b0b127..0000000
--- a/src/decaf/LICENSE.txt
+++ /dev/null
@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/src/decaf/Makefile.am b/src/decaf/Makefile.am
deleted file mode 100644
index 52e34b5..0000000
--- a/src/decaf/Makefile.am
+++ /dev/null
@@ -1,39 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-# Since we don't strictly follow the GNU standard of having 'NEWS README AUTHORS ChangeLog' files
-AUTOMAKE_OPTIONS = foreign
-
-SUBDIRS = src/main src/examples
-if BUILD_CPPUNIT_TESTS
-  SUBDIRS += src/test
-  SUBDIRS += src/test-benchmarks
-endif
-
-#Distribute these directories:
-DIST_SUBDIRS = src/main
-
-bin_SCRIPTS = decaf-config
-
-pkgconfigdir = $(libdir)/pkgconfig
-pkgconfig_DATA = decaf.pc
-
-ACLOCAL_AMFLAGS = -I m4
-
-include doxygen-include.am
-
-EXTRA_DIST=autogen.sh $(DX_CONFIG) doc/html
diff --git a/src/decaf/NOTICE.txt b/src/decaf/NOTICE.txt
deleted file mode 100644
index 9c0a44e..0000000
--- a/src/decaf/NOTICE.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-=========================================================================
-==  NOTICE file corresponding to the section 4 d of                    ==
-==  the Apache License, Version 2.0,                                   ==
-==  in this case for the Apache ActiveMQ distribution.                 ==
-=========================================================================
-
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
-
-=========================================================================
-==  Doxygen Automake Macro Notice                                      ==
-=========================================================================
-
-This product includes software developed by the Oren Ben-Kiki
-http://ben-kiki.org/oren/doxample/
diff --git a/src/decaf/README.txt b/src/decaf/README.txt
deleted file mode 100644
index 0cc54b9..0000000
--- a/src/decaf/README.txt
+++ /dev/null
@@ -1,197 +0,0 @@
---------------------------------------------------------------------------
-DECAF CPP Library
---------------------------------------------------------------------------
-
-Decaf is a CPP based SDK that provides classes simmilar to that of the
-Java SDK.
-
-
-1 Dependencies
---------------------------------------------------------------------------
-
-1.1 libuuid
---------------------------------------------------------------------------
-
-The build requires the *libuuid* library that is part of the e2fsprogs
-package and is available from http://e2fsprogs.sourceforge.net/ which is
-not always installed by default.
-
-On Fedora, type the following:
-
-  sudo yum install e2fsprogs-devel
-
-On Debian/Ubuntu, type the following:
-
-  sudo apt-get install uuid-dev
-
-
-1.2 CppUnit
---------------------------------------------------------------------------
-
-The package contains a complete set of CppUnit tests.  In order for you to
-build an run the tests, you will need to download and install the CppUnit
-suite.  See http://cppunit.sourceforge.net/cppunit-wiki
-
-On Fedora, type the following:
-
-  sudo yum install cppunit
-
-On Debian/Ubuntu, type the following:
-
-  sudo apt-get install libcppunit-dev
-
-Make sure that the paths to the installed CppUnit library and includes are
-visible in your current shell before you try building the tests.
-
-Windows users will need to build the CppUnit library using the CPPUnit
-MSVC project files. A discussion of the build process can be found
-on the CPPUnit wiki under
-http://cppunit.sourceforge.net/cppunit-wiki/BuildingCppUnit1 this covers
-both MSVC along with many other platforms and tool suites.
-
-
-1.3 GNU Build System (for building on Unix/Linux/OS X/Cygwin)
---------------------------------------------------------------------------
-
-To Generate the ./configure script use to create the Makefiles, you need
-the following software installed:
-
-Tool        Recommended Version
--------------------------------
-autoconf    >= 2.59
-automake    >= 1.9.6
-libtool     >= 1.5.22
-
-On Debian/Ubuntu, multiple versions of autoconf and automake are available
-in separate packages. If you have multiple versions of autoconf or automake
-installed on your system, you may have to configure the versions to use
-using /usr/sbin/update-alternatives.
-
-2 Building on Unix/Linux/OS X/Cygwin
---------------------------------------------------------------------------
-
-This assumes you have all of the project dependencies installed.  We're
-now ready to create the configure script.  To do this, run:
-
-  ./autogen.sh
-
-    -----------------------------------------------------------------------
-    |NOTE: You may see the following warnings when running this command:  |
-    |                                                                     |
-    |  src/test-integration/Makefile.am:44: `CXXFLAGS' is a user variable,|
-    |you should not override it;                                          |
-    |  src/test-integration/Makefile.am:44: use `AM_CXXFLAGS' instead.    |
-    |  src/test/Makefile.am:104: `CXXFLAGS' is a user variable, you       |
-    |should not override it;                                              |
-    |  src/test/Makefile.am:104: use `AM_CXXFLAGS' instead.               |
-    |                                                                     |
-    |These can be ignored.  We override CXXFLAGS in the makefiles for     |
-    |the unit and integration tests in order to suppress compiler         |
-    |warnings.                                                            |
-    -----------------------------------------------------------------------
-
-This should be run the first time and anytime you change configure.ac or
-any of the Makefile.am files.
-
-    -----------------------------------------------------------------------
-    |Solaris 10 Note:  CppUnit might not build until you correct the file |
-    |  libstdc++.la to contain the correct data, see this discussion:     |
-    |  http://forum.sun.com/jive/thread.jspa?threadID=73150               |
-    -----------------------------------------------------------------------
-
-The configure script will customize the way the software is built and
-installed into your system along with detecting the available libraries
-that have been installed.  To use the default configuration just run:
-
-  ./configure
-
-For more help on how to customize the build configuration, run:
-
-  ./configure --help
-
-Once the configure script has run successfully, you are ready to build.
-Run:
-
-  make
-
-This will build all of the core ActiveMQ CPP source code.  To build and
-install the code into the system directories, run:
-
-  make install
-
-You will have to become the superuser in order to be able to install the
-files.
-
-3 Doxygen
---------------------------------------------------------------------------
-
-To generate the doxygen documentation for the project, just run:
-
-  make doxygen-run
-
-
-4 Running Tests
---------------------------------------------------------------------------
-
-4.1 Unit Tests
---------------------------------------------------------------------------
-In order to build and run the suite of unit tests, run:
-
-  make check
-
-This will verify that the library is functioning correctly on the target
-platform. In addition, it will generate the integration tests binary.
-
-4.2 Integration Tests
---------------------------------------------------------------------------
-The library also contains a set of tests that are run against a real AMQ
-broker.  These allow you to validate this distribution of ActiveMQ CPP
-against your broker.  Running these without a broker will result in failed
-tests.  The tests currently hard-code the broker url to be
-tcp://localhost:61613 for stomp and tcp://localhost:61616 for openwire.
-
-The integration tests are built via "make check".  To run them, first
-start a broker and then
-
-  cd src/test-integration
-  ./activemq-test-integration
-
-This will take quite some time to complete, so be patient.
-
-5 Example
---------------------------------------------------------------------------
-There is an example application that ships with the distribution in
-src/examples.   The example is compiled by default with the "make"
-command, but can easily be compiled manually using the command:
-
-  g++ -o main -pthread -I ../main main.cpp ../../out/libactivemq-cpp-2_0.a -luuid
-
-6 Notes for Windows users
---------------------------------------------------------------------------
-We support using the GNU compiler on Windows, using the Cygwin package.
-However we also support using the MSVC compiler on Windows.
-
-There are a couple or things that you will need to setup to ensure that
-the MSVC compile succeeds.
-
-* You need to download and install the Platform SDK if you don't have it
-  installed already.
-
-* Ensure that the path to you MSVC install is set in the PATH env variable.
-  You can test this by typing cl.exe at the command line, if you get an
-  error complaining that its not found, then you'll need to fix your PATH.
-* Set the INCLUDE env variable to include the path to your MSVC includes,
-  and the platform SDK includes. For example:
-
-    INCLUDE = D:\Program Files\Microsoft Visual Studio 8\VC\include;D:\Program Files\Microsoft Platform SDK\Include\*
-
-* Set the LIB env variable to include the path to your MSVC libs, and the
-  Platform SDK libs. For example:
-
-    LIB = D:\Program Files\Microsoft Visual Studio 8\VC\lib;D:\Program Files\Microsoft Platform SDK\Lib
-
-* The Project files reference the CPPUnit libraries for the Integration and
-  Unit tests builds. In order for these to build correctly you must
-  either place the CPPUnit libraries in a directory listed in the project
-  settings, or add a new location for your install of CPPUnit.
-
diff --git a/src/decaf/RELEASE_NOTES.txt b/src/decaf/RELEASE_NOTES.txt
deleted file mode 100644
index 868e340..0000000
--- a/src/decaf/RELEASE_NOTES.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-=========================================================================
-==  Release Notes for DECAF 1.0                                        ==
-=========================================================================
-
-== Overview ==
-== Issues Resolved ==
-
diff --git a/src/decaf/autogen.sh b/src/decaf/autogen.sh
deleted file mode 100755
index 57ea46d..0000000
--- a/src/decaf/autogen.sh
+++ /dev/null
@@ -1,19 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-#!/bin/sh
-autoreconf --force --install -I config -I m4
diff --git a/src/decaf/configure.ac b/src/decaf/configure.ac
deleted file mode 100644
index c69f5f6..0000000
--- a/src/decaf/configure.ac
+++ /dev/null
@@ -1,171 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-## --------------------------------
-## Initialization macros.
-## --------------------------------
-AC_INIT(decaf, 1, activemq-dev@geronimo.apache.org)
-AC_CONFIG_AUX_DIR(config)
-AC_CONFIG_SRCDIR(src/main/decaf/lang/Thread.cpp)
-
-## -----------------------------------------------
-## Define the Version variables
-## -----------------------------------------------
-DECAF_LIBRARY_NAME=decaf
-DECAF_VERSION=1.0-SNAPSHOT
-DECAF_LIBRARY_VERSION=1:0:0
-DECAF_RELEASE=1.0
-DECAF_API_VERSION=${DECAF_VERSION}
-
-AC_SUBST(DECAF_LIBRARY_NAME)
-AC_SUBST(DECAF_VERSION)
-AC_SUBST(DECAF_LIBRARY_VERSION)
-AC_SUBST(DECAF_RELEASE)
-AC_SUBST(DECAF_API_VERSION)
-
-PACKAGE=$DECAF_LIBRARY_NAME
-VERSION=$DECAF_VERSION
-
-AM_INIT_AUTOMAKE($PACKAGE, $VERSION, no-define)
-AM_CONFIG_HEADER(config.h)
-
-# Gives us access to the host_os environment variable
-AC_CANONICAL_HOST
-
-## -----------------------------------------------
-## Checks for programs.
-## -----------------------------------------------
-
-AC_PROG_CC
-AC_PROG_CXX
-AC_LIBTOOL_WIN32_DLL
-AC_PROG_LIBTOOL
-AC_SUBST([LIBTOOL_DEPS])
-
-AM_SANITY_CHECK
-AC_LANG_CPLUSPLUS
-
-AC_C_BIGENDIAN
-AC_CHECK_SIZEOF(short)
-AC_CHECK_SIZEOF(int)
-AC_CHECK_SIZEOF(long)
-
-AC_CHECK_SIZEOF(char, 1)
-AC_CHECK_SIZEOF(short, 2)
-AC_CHECK_SIZEOF(int, 4)
-AC_CHECK_SIZEOF(long long, 8)
-AC_CHECK_SIZEOF(float, 4)
-AC_CHECK_SIZEOF(double, 8)
-
-AC_CHECK_HEADERS([uuid.h uuid/uuid.h], [AC_DEFINE([HAVE_UUID_T], [1], [Define if uuid_t exists.])])
-AC_CHECK_HEADERS([objbase.h])
-AC_CHECK_HEADERS([repcdce.h])
-AC_CHECK_HEADERS([sys/filio.h])
-AC_CHECK_HEADERS([sys/ioctl.h])
-AC_CHECK_HEADERS([sys/select.h])
-AC_CHECK_HEADERS([sys/time.h])
-AC_CHECK_HEADERS([sys/timeb.h])
-AC_CHECK_HEADERS([pthread.h])
-
-AC_CHECK_FUNCS([ioctl select gettimeofday time ftime])
-
-AM_PATH_CPPUNIT(1.10.2, cppunit=yes, cppunit=no; AC_MSG_RESULT([no. Unit and Integration tests disabled]))
-AM_CONDITIONAL(BUILD_CPPUNIT_TESTS, test x$cppunit = xyes)
-
-## find and configure the APR, and ARP Utils
-DECAF_CONFIGURE_APR
-
-PLAT_CXXFLAGS=
-PLAT_LIBS=
-
-case "${host_os}" in
-
-  *darwin* ) ## Mac OS X configuration
-    PLAT_CXXFLAGS="-ansi -pedantic"
-    ;;
-
-  *cygwin* ) ## Cygwin configuration
-    PLAT_CXXFLAGS="-Wno-uninitialized"
-    PLAT_LIBS="-lm -lpthread -luuid -lrpcrt4"
-    ;;
-
-  *solaris* ) ## Solaris configuration
-    AC_CHECK_LIB(pthread, pthread_create,[have_pthread="yes"],
-                AC_MSG_ERROR([libpthread not found!]))
-
-    PLAT_CXXFLAGS="-ansi -pedantic"
-    PLAT_LIBS="-lm -lpthread -luuid -lsocket -lrt"
-    ;;
-
-  *) ## Unix configuration
-
-    AC_CHECK_LIB(pthread, pthread_create,[have_pthread="yes"],
-                AC_MSG_ERROR([libpthread not found!]))
-
-    PLAT_CXXFLAGS="-ansi -pedantic"
-    PLAT_LIBS="-lm -lpthread -luuid"
-esac
-
-## Flags for building the decaf cpp library
-AC_SUBST([DECAF_CXXFLAGS])
-AC_SUBST([DECAF_LIBS])
-DECAF_CXXFLAGS="$PLAT_CXXFLAGS -W -Wall -fPIC -fstrict-aliasing -Wstrict-aliasing=2 -Wno-long-long"
-DECAF_LIBS="$PLAT_LIBS"
-
-## Flags for building the test applications.
-AC_SUBST([DECAF_TEST_CXXFLAGS])
-AC_SUBST([DECAF_TEST_LIBS])
-DECAF_TEST_CXXFLAGS="$DECAF_CXXFLAGS -Wno-non-virtual-dtor -Wno-unused-parameter -Wno-uninitialized"
-DECAF_TEST_LIBS="../main/libdecaf.la"
-
-# Check to see if the compiler supports the visibility flags.
-# If so, define HAVE_VISIBILITY_OPTIONS
-CHECK_VISIBILITY()
-
-## Not all platforms define addrinfo and related functions.  If this platform
-## supports addrinfo, defines HAVE_STRUCT_ADDRINFO.
-CHECK_ADDRINFO()
-
-## Execute Doxygen macros
-DX_HTML_FEATURE(ON)
-DX_CHM_FEATURE(OFF)
-DX_CHI_FEATURE(OFF)
-DX_MAN_FEATURE(OFF)
-DX_RTF_FEATURE(OFF)
-DX_XML_FEATURE(OFF)
-DX_PDF_FEATURE(OFF)
-DX_PS_FEATURE(OFF)
-DX_INIT_DOXYGEN(decaf, doxygen.cfg, doc)
-
-## -----------------------------------------------------
-## configuration
-## Generates Makefile's, configuration files and scripts
-## -----------------------------------------------------
-
-AC_CONFIG_FILES(Makefile)
-AC_CONFIG_FILES(decaf.pc)
-AC_CONFIG_FILES(src/main/Makefile)
-AC_CONFIG_FILES(src/examples/Makefile)
-AC_CONFIG_FILES(decaf-config)
-
-if test x$cppunit = xyes
-then
-  AC_CONFIG_FILES(src/test/Makefile)
-  AC_CONFIG_FILES(src/test-benchmarks/Makefile)
-fi
-
-AC_OUTPUT
diff --git a/src/decaf/decaf-config.in b/src/decaf/decaf-config.in
deleted file mode 100644
index befe745..0000000
--- a/src/decaf/decaf-config.in
+++ /dev/null
@@ -1,115 +0,0 @@
-#!/bin/sh
-
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-exec_prefix_set=no
-includedir=@includedir@
-
-usage()
-{
-    cat <<EOF
-Usage: decaf-config [OPTION] ...
-
-Generic options
-  --version	output Decaf version information.
-  --help	display this help and exit.
-
-Compilation support options
-  --cflags	print pre-processor and compiler flags
-  --libs	print library linking information
-
-Install directories Decaf Library was configured to
-  --prefix[=DIR]
-  --exec-prefix[=DIR]
-
-EOF
-    exit $1
-}
-
-if test $# -eq 0; then
-    usage 1 1>&2
-fi
-
-while test $# -gt 0; do
-  case "$1" in
-  -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
-  *) optarg= ;;
-  esac
-
-  case $1 in
-    --prefix=*)
-      prefix=$optarg
-      if test $exec_prefix_set = no ; then
-        exec_prefix=$optarg
-      fi
-      ;;
-    --prefix)
-      echo_prefix=yes
-      ;;
-    --exec-prefix=*)
-      exec_prefix=$optarg
-      exec_prefix_set=yes
-      ;;
-    --exec-prefix)
-      echo_exec_prefix=yes
-      ;;
-    --version)
-      echo @DECAF_VERSION@
-      ;;
-    --help)
-      usage 0
-      ;;
-    --cflags)
-      echo_cflags=yes
-      ;;
-    --libs)
-      echo_libs=yes
-      ;;
-    *)
-      usage 1 1>&2
-      ;;
-  esac
-  shift
-done
-
-if test "$echo_prefix" = "yes"; then
-    echo $prefix
-fi
-
-if test "$echo_exec_prefix" = "yes"; then
-    echo $exec_prefix
-fi
-
-if test "$echo_cflags" = "yes"; then
-      if test "$includedir" != "/usr/include" ; then
-            echo -I$includedir
-      fi
-fi
-
-if test "$echo_libs" = "yes"; then
-      if test @libdir@ != /usr/lib ; then
-            my_linker_flags="-L@libdir@"
-      fi
-      echo ${my_linker_flags} -ldecaf
-fi
-
-
-
-
diff --git a/src/decaf/decaf.pc.in b/src/decaf/decaf.pc.in
deleted file mode 100644
index 2227142..0000000
--- a/src/decaf/decaf.pc.in
+++ /dev/null
@@ -1,27 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-libdir=@libdir@
-includedir=@includedir@
-
-Name: Decaf C++ Library
-Description: Decaf C++ Java-like API library.
-Version: @VERSION@
-Libs: -L${libdir} -l@DECAF_LIBRARY_NAME@-@DECAF_API_VERSION@ -lpthread -ldl -luuid
-Cflags: -I${includedir}/@DECAF_LIBRARY_NAME@-@DECAF_API_VERSION@ -I${libdir}/@DECAF_LIBRARY_NAME@-@DECAF_API_VERSION@/include
diff --git a/src/decaf/doxygen-include.am b/src/decaf/doxygen-include.am
deleted file mode 100644
index ab87a45..0000000
--- a/src/decaf/doxygen-include.am
+++ /dev/null
@@ -1,203 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-# Copyright (C) 2004 Oren Ben-Kiki
-# This file is distributed under the same terms as the Automake macro files.
-
-# Generate automatic documentation using Doxygen. Goals and variables values
-# are controlled by the various DX_COND_??? conditionals set by autoconf.
-#
-# The provided goals are:
-# doxygen-doc: Generate all doxygen documentation.
-# doxygen-run: Run doxygen, which will generate some of the documentation
-#              (HTML, CHM, CHI, MAN, RTF, XML) but will not do the post
-#              processing required for the rest of it (PS, PDF, and some MAN).
-# doxygen-man: Rename some doxygen generated man pages.
-# doxygen-ps: Generate doxygen PostScript documentation.
-# doxygen-pdf: Generate doxygen PDF documentation.
-#
-# Note that by default these are not integrated into the automake goals. If
-# doxygen is used to generate man pages, you can achieve this integration by
-# setting man3_MANS to the list of man pages generated and then adding the
-# dependency:
-#
-#   $(man3_MANS): doxygen-doc
-#
-# This will cause make to run doxygen and generate all the documentation.
-#
-# The following variable is intended for use in Makefile.am:
-#
-# DX_CLEANFILES = everything to clean.
-#
-# This is usually added to MOSTLYCLEANFILES.
-
-## --------------------------------- ##
-## Format-independent Doxygen rules. ##
-## --------------------------------- ##
-
-if DX_COND_doc
-
-## ------------------------------- ##
-## Rules specific for HTML output. ##
-## ------------------------------- ##
-
-if DX_COND_html
-
-DX_CLEAN_HTML = @DX_DOCDIR@/html
-
-endif DX_COND_html
-
-## ------------------------------ ##
-## Rules specific for CHM output. ##
-## ------------------------------ ##
-
-if DX_COND_chm
-
-DX_CLEAN_CHM = @DX_DOCDIR@/chm
-
-if DX_COND_chi
-
-DX_CLEAN_CHI = @DX_DOCDIR@/@PACKAGE@.chi
-
-endif DX_COND_chi
-
-endif DX_COND_chm
-
-## ------------------------------ ##
-## Rules specific for MAN output. ##
-## ------------------------------ ##
-
-if DX_COND_man
-
-DX_CLEAN_MAN = @DX_DOCDIR@/man
-
-endif DX_COND_man
-
-## ------------------------------ ##
-## Rules specific for RTF output. ##
-## ------------------------------ ##
-
-if DX_COND_rtf
-
-DX_CLEAN_RTF = @DX_DOCDIR@/rtf
-
-endif DX_COND_rtf
-
-## ------------------------------ ##
-## Rules specific for XML output. ##
-## ------------------------------ ##
-
-if DX_COND_xml
-
-DX_CLEAN_XML = @DX_DOCDIR@/xml
-
-endif DX_COND_xml
-
-## ----------------------------- ##
-## Rules specific for PS output. ##
-## ----------------------------- ##
-
-if DX_COND_ps
-
-DX_CLEAN_PS = @DX_DOCDIR@/@PACKAGE@.ps
-
-DX_PS_GOAL = doxygen-ps
-
-doxygen-ps: @DX_DOCDIR@/@PACKAGE@.ps
-
-@DX_DOCDIR@/@PACKAGE@.ps: @DX_DOCDIR@/@PACKAGE@.tag
-	cd @DX_DOCDIR@/latex; \
-	rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
-	$(DX_LATEX) refman.tex; \
-	$(MAKEINDEX_PATH) refman.idx; \
-	$(DX_LATEX) refman.tex; \
-	countdown=5; \
-	while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
-	                  refman.log > /dev/null 2>&1 \
-	   && test $$countdown -gt 0; do \
-	    $(DX_LATEX) refman.tex; \
-	    countdown=`expr $$countdown - 1`; \
-	done; \
-	$(DX_DVIPS) -o ../@PACKAGE@.ps refman.dvi
-
-endif DX_COND_ps
-
-## ------------------------------ ##
-## Rules specific for PDF output. ##
-## ------------------------------ ##
-
-if DX_COND_pdf
-
-DX_CLEAN_PDF = @DX_DOCDIR@/@PACKAGE@.pdf
-
-DX_PDF_GOAL = doxygen-pdf
-
-doxygen-pdf: @DX_DOCDIR@/@PACKAGE@.pdf
-
-@DX_DOCDIR@/@PACKAGE@.pdf: @DX_DOCDIR@/@PACKAGE@.tag
-	cd @DX_DOCDIR@/latex; \
-	rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \
-	$(DX_PDFLATEX) refman.tex; \
-	$(DX_MAKEINDEX) refman.idx; \
-	$(DX_PDFLATEX) refman.tex; \
-	countdown=5; \
-	while $(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \
-	                  refman.log > /dev/null 2>&1 \
-	   && test $$countdown -gt 0; do \
-	    $(DX_PDFLATEX) refman.tex; \
-	    countdown=`expr $$countdown - 1`; \
-	done; \
-	mv refman.pdf ../@PACKAGE@.pdf
-
-endif DX_COND_pdf
-
-## ------------------------------------------------- ##
-## Rules specific for LaTeX (shared for PS and PDF). ##
-## ------------------------------------------------- ##
-
-if DX_COND_latex
-
-DX_CLEAN_LATEX = @DX_DOCDIR@/latex
-
-endif DX_COND_latex
-
-.PHONY: doxygen-run doxygen-doc $(DX_PS_GOAL) $(DX_PDF_GOAL)
-
-.INTERMEDIATE: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
-
-doxygen-run: @DX_DOCDIR@/@PACKAGE@.tag
-
-doxygen-doc: doxygen-run $(DX_PS_GOAL) $(DX_PDF_GOAL)
-
-@DX_DOCDIR@/@PACKAGE@.tag: $(DX_CONFIG) $(pkginclude_HEADERS)
-	rm -rf @DX_DOCDIR@
-	$(DX_ENV) $(DX_DOXYGEN) $(srcdir)/$(DX_CONFIG)
-
-DX_CLEANFILES = \
-    @DX_DOCDIR@/@PACKAGE@.tag \
-    -r \
-    $(DX_CLEAN_HTML) \
-    $(DX_CLEAN_CHM) \
-    $(DX_CLEAN_CHI) \
-    $(DX_CLEAN_MAN) \
-    $(DX_CLEAN_RTF) \
-    $(DX_CLEAN_XML) \
-    $(DX_CLEAN_PS) \
-    $(DX_CLEAN_PDF) \
-    $(DX_CLEAN_LATEX)
-
-endif DX_COND_doc
diff --git a/src/decaf/doxygen.cfg b/src/decaf/doxygen.cfg
deleted file mode 100644
index c7b526a..0000000
--- a/src/decaf/doxygen.cfg
+++ /dev/null
@@ -1,228 +0,0 @@
-# Doxyfile 1.3.7
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-PROJECT_NAME           = $(PROJECT)-$(VERSION)
-PROJECT_NUMBER         =
-OUTPUT_DIRECTORY       = $(DOCDIR)
-CREATE_SUBDIRS         = NO
-OUTPUT_LANGUAGE        = English
-USE_WINDOWS_ENCODING   = NO
-BRIEF_MEMBER_DESC      = YES
-REPEAT_BRIEF           = YES
-ABBREVIATE_BRIEF       =
-ALWAYS_DETAILED_SEC    = NO
-INLINE_INHERITED_MEMB  = NO
-STRIP_FROM_INC_PATH    = $(SRCDIR)
-FULL_PATH_NAMES        = YES
-STRIP_FROM_PATH        = $(SRCDIR)
-SHORT_NAMES            = NO
-JAVADOC_AUTOBRIEF      = YES
-MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP         = YES
-INHERIT_DOCS           = YES
-DISTRIBUTE_GROUP_DOC   = NO
-TAB_SIZE               = 8
-ALIASES                =
-OPTIMIZE_OUTPUT_FOR_C  = YES
-OPTIMIZE_OUTPUT_JAVA   = NO
-SUBGROUPING            = YES
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-EXTRACT_ALL            = YES
-EXTRACT_PRIVATE        = NO
-EXTRACT_STATIC         = NO
-EXTRACT_LOCAL_CLASSES  = YES
-EXTRACT_LOCAL_METHODS  = NO
-HIDE_UNDOC_MEMBERS     = NO
-HIDE_UNDOC_CLASSES     = NO
-HIDE_FRIEND_COMPOUNDS  = NO
-HIDE_IN_BODY_DOCS      = NO
-INTERNAL_DOCS          = NO
-CASE_SENSE_NAMES       = NO
-HIDE_SCOPE_NAMES       = NO
-SHOW_INCLUDE_FILES     = YES
-INLINE_INFO            = YES
-SORT_MEMBER_DOCS       = YES
-SORT_BRIEF_DOCS        = NO
-SORT_BY_SCOPE_NAME     = NO
-GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
-GENERATE_DEPRECATEDLIST= YES
-ENABLED_SECTIONS       =
-MAX_INITIALIZER_LINES  = 30
-SHOW_USED_FILES        = YES
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-QUIET                  = YES
-WARNINGS               = YES
-WARN_IF_UNDOCUMENTED   = YES
-WARN_IF_DOC_ERROR      = YES
-WARN_FORMAT            = "$file:$line: $text"
-WARN_LOGFILE           =
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-INPUT                  = $(SRCDIR)
-FILE_PATTERNS          = *.c *.h
-RECURSIVE              = YES
-EXCLUDE                =
-EXCLUDE_SYMLINKS       = NO
-EXCLUDE_PATTERNS       =
-EXAMPLE_PATH           = $(SRCDIR)
-EXAMPLE_PATTERNS       =
-EXAMPLE_RECURSIVE      = NO
-IMAGE_PATH             =
-INPUT_FILTER           =
-FILTER_SOURCE_FILES    = NO
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-SOURCE_BROWSER         = NO
-INLINE_SOURCES         = NO
-STRIP_CODE_COMMENTS    = YES
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION    = YES
-VERBATIM_HEADERS       = YES
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-ALPHABETICAL_INDEX     = NO
-COLS_IN_ALPHA_INDEX    = 5
-IGNORE_PREFIX          =
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-GENERATE_HTML          = $(GENERATE_HTML)
-HTML_OUTPUT            = html
-HTML_FILE_EXTENSION    = .html
-HTML_HEADER            =
-HTML_FOOTER            =
-HTML_STYLESHEET        =
-HTML_ALIGN_MEMBERS     = YES
-GENERATE_HTMLHELP      = $(GENERATE_CHM)
-CHM_FILE               = ../$(PROJECT).chm
-HHC_LOCATION           = $(HHC_PATH)
-GENERATE_CHI           = $(GENERATE_CHI)
-BINARY_TOC             = NO
-TOC_EXPAND             = NO
-DISABLE_INDEX          = NO
-ENUM_VALUES_PER_LINE   = 4
-GENERATE_TREEVIEW      = YES
-TREEVIEW_WIDTH         = 250
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-GENERATE_LATEX         = $(GENERATE_LATEX)
-LATEX_OUTPUT           = latex
-LATEX_CMD_NAME         = latex
-MAKEINDEX_CMD_NAME     = makeindex
-COMPACT_LATEX          = NO
-PAPER_TYPE             = $(PAPER_SIZE)
-EXTRA_PACKAGES         =
-LATEX_HEADER           =
-PDF_HYPERLINKS         = NO
-USE_PDFLATEX           = NO
-LATEX_BATCHMODE        = YES
-LATEX_HIDE_INDICES     = NO
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-GENERATE_RTF           = $(GENERATE_RTF)
-RTF_OUTPUT             = rtf
-COMPACT_RTF            = NO
-RTF_HYPERLINKS         = NO
-RTF_STYLESHEET_FILE    =
-RTF_EXTENSIONS_FILE    =
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-GENERATE_MAN           = $(GENERATE_MAN)
-MAN_OUTPUT             = man
-MAN_EXTENSION          = .1
-MAN_LINKS              = NO
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML           = $(GENERATE_XML)
-XML_OUTPUT             = xml
-XML_SCHEMA             =
-XML_DTD                =
-XML_PROGRAMLISTING     = YES
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-GENERATE_AUTOGEN_DEF   = NO
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-GENERATE_PERLMOD       = NO
-PERLMOD_LATEX          = NO
-PERLMOD_PRETTY         = YES
-PERLMOD_MAKEVAR_PREFIX =
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-ENABLE_PREPROCESSING   = YES
-MACRO_EXPANSION        = NO
-EXPAND_ONLY_PREDEF     = NO
-SEARCH_INCLUDES        = YES
-INCLUDE_PATH           =
-INCLUDE_FILE_PATTERNS  =
-PREDEFINED             =
-EXPAND_AS_DEFINED      =
-SKIP_FUNCTION_MACROS   = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-TAGFILES               =
-GENERATE_TAGFILE       = $(DOCDIR)/$(PROJECT).tag
-ALLEXTERNALS           = NO
-EXTERNAL_GROUPS        = YES
-PERL_PATH              = $(PERL_PATH)
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-CLASS_DIAGRAMS         = YES
-HIDE_UNDOC_RELATIONS   = YES
-HAVE_DOT               = $(HAVE_DOT)
-CLASS_GRAPH            = YES
-COLLABORATION_GRAPH    = YES
-UML_LOOK               = NO
-TEMPLATE_RELATIONS     = NO
-INCLUDE_GRAPH          = YES
-INCLUDED_BY_GRAPH      = YES
-CALL_GRAPH             = NO
-GRAPHICAL_HIERARCHY    = YES
-DOT_IMAGE_FORMAT       = png
-DOT_PATH               = $(DOT_PATH)
-DOTFILE_DIRS           =
-MAX_DOT_GRAPH_WIDTH    = 1024
-MAX_DOT_GRAPH_HEIGHT   = 1024
-MAX_DOT_GRAPH_DEPTH    = 0
-GENERATE_LEGEND        = YES
-DOT_CLEANUP            = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-SEARCHENGINE           = NO
diff --git a/src/decaf/m4/ac_doxygen.m4 b/src/decaf/m4/ac_doxygen.m4
deleted file mode 100644
index 5248d71..0000000
--- a/src/decaf/m4/ac_doxygen.m4
+++ /dev/null
@@ -1,324 +0,0 @@
-#
-# Copyright 2007 Oren Ben-Kiki
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-# implied.  See the License for the specific language governing
-# permissions and limitations under the License.
-#
-
-
-# Generate automatic documentation using Doxygen. Works in concert with the
-# aminclude.m4 file and a compatible doxygen configuration file. Defines the
-# following public macros:
-#
-# DX_???_FEATURE(ON|OFF) - control the default setting fo a Doxygen feature.
-# Supported features are 'DOXYGEN' itself, 'DOT' for generating graphics,
-# 'HTML' for plain HTML, 'CHM' for compressed HTML help (for MS users), 'CHI'
-# for generating a seperate .chi file by the .chm file, and 'MAN', 'RTF',
-# 'XML', 'PDF' and 'PS' for the appropriate output formats. The environment
-# variable DOXYGEN_PAPER_SIZE may be specified to override the default 'a4wide'
-# paper size.
-#
-# By default, HTML, PDF and PS documentation is generated as this seems to be
-# the most popular and portable combination. MAN pages created by Doxygen are
-# usually problematic, though by picking an appropriate subset and doing some
-# massaging they might be better than nothing. CHM and RTF are specific for MS
-# (note that you can't generate both HTML and CHM at the same time). The XML is
-# rather useless unless you apply specialized post-processing to it.
-#
-# The macro mainly controls the default state of the feature. The use can
-# override the default by specifying --enable or --disable. The macros ensure
-# that contradictory flags are not given (e.g., --enable-doxygen-html and
-# --enable-doxygen-chm, --enable-doxygen-anything with --disable-doxygen, etc.)
-# Finally, each feature will be automatically disabled (with a warning) if the
-# required programs are missing.
-#
-# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN with
-# the following parameters: a one-word name for the project for use as a
-# filename base etc., an optional configuration file name (the default is
-# 'Doxyfile', the same as Doxygen's default), and an optional output directory
-# name (the default is 'doxygen-doc').
-
-## ----------##
-## Defaults. ##
-## ----------##
-
-DX_ENV=""
-AC_DEFUN([DX_FEATURE_doc],  ON)
-AC_DEFUN([DX_FEATURE_dot],  ON)
-AC_DEFUN([DX_FEATURE_man],  OFF)
-AC_DEFUN([DX_FEATURE_html], ON)
-AC_DEFUN([DX_FEATURE_chm],  OFF)
-AC_DEFUN([DX_FEATURE_chi],  OFF)
-AC_DEFUN([DX_FEATURE_rtf],  OFF)
-AC_DEFUN([DX_FEATURE_xml],  OFF)
-AC_DEFUN([DX_FEATURE_pdf],  ON)
-AC_DEFUN([DX_FEATURE_ps],   ON)
-
-## --------------- ##
-## Private macros. ##
-## --------------- ##
-
-# DX_ENV_APPEND(VARIABLE, VALUE)
-# ------------------------------
-# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen.
-AC_DEFUN([DX_ENV_APPEND], [AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])])
-
-# DX_DIRNAME_EXPR
-# ---------------
-# Expand into a shell expression prints the directory part of a path.
-AC_DEFUN([DX_DIRNAME_EXPR],
-         [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']])
-
-# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF)
-# -------------------------------------
-# Expands according to the M4 (static) status of the feature.
-AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])])
-
-# DX_REQUIRE_PROG(VARIABLE, PROGRAM)
-# ----------------------------------
-# Require the specified program to be found for the DX_CURRENT_FEATURE to work.
-AC_DEFUN([DX_REQUIRE_PROG], [
-AC_PATH_TOOL([$1], [$2])
-if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then
-    AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
-    AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0)
-fi
-])
-
-# DX_TEST_FEATURE(FEATURE)
-# ------------------------
-# Expand to a shell expression testing whether the feature is active.
-AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1])
-
-# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE)
-# -------------------------------------------------
-# Verify that a required features has the right state before trying to turn on
-# the DX_CURRENT_FEATURE.
-AC_DEFUN([DX_CHECK_DEPEND], [
-test "$DX_FLAG_$1" = "$2" \
-|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1,
-                            requires, contradicts) doxygen-DX_CURRENT_FEATURE])
-])
-
-# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE)
-# ----------------------------------------------------------
-# Turn off the DX_CURRENT_FEATURE if the required feature is off.
-AC_DEFUN([DX_CLEAR_DEPEND], [
-test "$DX_FLAG_$1" = "$2" || AC_SUBST([DX_FLAG_[]DX_CURRENT_FEATURE], 0)
-])
-
-# DX_FEATURE_ARG(FEATURE, DESCRIPTION,
-#                CHECK_DEPEND, CLEAR_DEPEND,
-#                REQUIRE, DO-IF-ON, DO-IF-OFF)
-# --------------------------------------------
-# Parse the command-line option controlling a feature. CHECK_DEPEND is called
-# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND),
-# otherwise CLEAR_DEPEND is called to turn off the default state if a required
-# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional
-# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and
-# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature.
-AC_DEFUN([DX_ARG_ABLE], [
-    AC_DEFUN([DX_CURRENT_FEATURE], [$1])
-    AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2])
-    AC_ARG_ENABLE(doxygen-$1,
-                  [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1],
-                                                      [--enable-doxygen-$1]),
-                                  DX_IF_FEATURE([$1], [don't $2], [$2]))],
-                  [
-case "$enableval" in
-#(
-y|Y|yes|Yes|YES)
-    AC_SUBST([DX_FLAG_$1], 1)
-    $3
-;; #(
-n|N|no|No|NO)
-    AC_SUBST([DX_FLAG_$1], 0)
-;; #(
-*)
-    AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1])
-;;
-esac
-], [
-AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)])
-$4
-])
-if DX_TEST_FEATURE([$1]); then
-    $5
-    :
-fi
-if DX_TEST_FEATURE([$1]); then
-    AM_CONDITIONAL(DX_COND_$1, :)
-    $6
-    :
-else
-    AM_CONDITIONAL(DX_COND_$1, false)
-    $7
-    :
-fi
-])
-
-## -------------- ##
-## Public macros. ##
-## -------------- ##
-
-# DX_XXX_FEATURE(DEFAULT_STATE)
-# -----------------------------
-AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc],  [$1])])
-AC_DEFUN([DX_MAN_FEATURE],     [AC_DEFUN([DX_FEATURE_man],  [$1])])
-AC_DEFUN([DX_HTML_FEATURE],    [AC_DEFUN([DX_FEATURE_html], [$1])])
-AC_DEFUN([DX_CHM_FEATURE],     [AC_DEFUN([DX_FEATURE_chm],  [$1])])
-AC_DEFUN([DX_CHI_FEATURE],     [AC_DEFUN([DX_FEATURE_chi],  [$1])])
-AC_DEFUN([DX_RTF_FEATURE],     [AC_DEFUN([DX_FEATURE_rtf],  [$1])])
-AC_DEFUN([DX_XML_FEATURE],     [AC_DEFUN([DX_FEATURE_xml],  [$1])])
-AC_DEFUN([DX_XML_FEATURE],     [AC_DEFUN([DX_FEATURE_xml],  [$1])])
-AC_DEFUN([DX_PDF_FEATURE],     [AC_DEFUN([DX_FEATURE_pdf],  [$1])])
-AC_DEFUN([DX_PS_FEATURE],      [AC_DEFUN([DX_FEATURE_ps],   [$1])])
-
-# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR])
-# ---------------------------------------------------------
-# PROJECT also serves as the base name for the documentation files.
-# The default CONFIG-FILE is "Doxyfile" and OUTPUT-DOC-DIR is "doxygen-doc".
-AC_DEFUN([DX_INIT_DOXYGEN], [
-
-# Files:
-AC_SUBST([DX_PROJECT], [$1])
-AC_SUBST([DX_CONFIG], [ifelse([$2], [], Doxyfile, [$2])])
-AC_SUBST([DX_DOCDIR], [ifelse([$3], [], doxygen-doc, [$3])])
-
-# Environment variables used inside doxygen.cfg:
-DX_ENV_APPEND(SRCDIR, $srcdir)
-DX_ENV_APPEND(PROJECT, $DX_PROJECT)
-DX_ENV_APPEND(DOCDIR, $DX_DOCDIR)
-DX_ENV_APPEND(VERSION, $PACKAGE_VERSION)
-
-# Doxygen itself:
-DX_ARG_ABLE(doc, [generate any doxygen documentation],
-            [],
-            [],
-            [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen)
-             DX_REQUIRE_PROG([DX_PERL], perl)],
-            [DX_ENV_APPEND(PERL_PATH, $DX_PERL)])
-
-# Dot for graphics:
-DX_ARG_ABLE(dot, [generate graphics for doxygen documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_DOT], dot)],
-            [DX_ENV_APPEND(HAVE_DOT, YES)
-             DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])],
-            [DX_ENV_APPEND(HAVE_DOT, NO)])
-
-# Man pages generation:
-DX_ARG_ABLE(man, [generate doxygen manual pages],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_MAN, YES)],
-            [DX_ENV_APPEND(GENERATE_MAN, NO)])
-
-# RTF file generation:
-DX_ARG_ABLE(rtf, [generate doxygen RTF documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_RTF, YES)],
-            [DX_ENV_APPEND(GENERATE_RTF, NO)])
-
-# XML file generation:
-DX_ARG_ABLE(xml, [generate doxygen XML documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_XML, YES)],
-            [DX_ENV_APPEND(GENERATE_XML, NO)])
-
-# (Compressed) HTML help generation:
-DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_HHC], hhc)],
-            [DX_ENV_APPEND(HHC_PATH, $DX_HHC)
-             DX_ENV_APPEND(GENERATE_HTML, YES)
-             DX_ENV_APPEND(GENERATE_HTMLHELP, YES)],
-            [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)])
-
-# Seperate CHI file generation.
-DX_ARG_ABLE(chi, [generate doxygen seperate compressed HTML help index file],
-            [DX_CHECK_DEPEND(chm, 1)],
-            [DX_CLEAR_DEPEND(chm, 1)],
-            [],
-            [DX_ENV_APPEND(GENERATE_CHI, YES)],
-            [DX_ENV_APPEND(GENERATE_CHI, NO)])
-
-# Plain HTML pages generation:
-DX_ARG_ABLE(html, [generate doxygen plain HTML documentation],
-            [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)],
-            [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)],
-            [],
-            [DX_ENV_APPEND(GENERATE_HTML, YES)],
-            [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)])
-
-# PostScript file generation:
-DX_ARG_ABLE(ps, [generate doxygen PostScript documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_LATEX], latex)
-             DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
-             DX_REQUIRE_PROG([DX_DVIPS], dvips)
-             DX_REQUIRE_PROG([DX_EGREP], egrep)])
-
-# PDF file generation:
-DX_ARG_ABLE(pdf, [generate doxygen PDF documentation],
-            [DX_CHECK_DEPEND(doc, 1)],
-            [DX_CLEAR_DEPEND(doc, 1)],
-            [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex)
-             DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
-             DX_REQUIRE_PROG([DX_EGREP], egrep)])
-
-# LaTeX generation for PS and/or PDF:
-if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then
-    AM_CONDITIONAL(DX_COND_latex, :)
-    DX_ENV_APPEND(GENERATE_LATEX, YES)
-else
-    AM_CONDITIONAL(DX_COND_latex, false)
-    DX_ENV_APPEND(GENERATE_LATEX, NO)
-fi
-
-# Paper size for PS and/or PDF:
-AC_ARG_VAR(DOXYGEN_PAPER_SIZE,
-           [a4wide (default), a4, letter, legal or executive])
-case "$DOXYGEN_PAPER_SIZE" in
-#(
-"")
-    AC_SUBST(DOXYGEN_PAPER_SIZE, "")
-;; #(
-a4wide|a4|letter|legal|executive)
-    DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE)
-;; #(
-*)
-    AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'])
-;;
-esac
-
-#For debugging:
-#echo DX_FLAG_doc=$DX_FLAG_doc
-#echo DX_FLAG_dot=$DX_FLAG_dot
-#echo DX_FLAG_man=$DX_FLAG_man
-#echo DX_FLAG_html=$DX_FLAG_html
-#echo DX_FLAG_chm=$DX_FLAG_chm
-#echo DX_FLAG_chi=$DX_FLAG_chi
-#echo DX_FLAG_rtf=$DX_FLAG_rtf
-#echo DX_FLAG_xml=$DX_FLAG_xml
-#echo DX_FLAG_pdf=$DX_FLAG_pdf
-#echo DX_FLAG_ps=$DX_FLAG_ps
-#echo DX_ENV=$DX_ENV
-])
diff --git a/src/decaf/m4/apr_tools.m4 b/src/decaf/m4/apr_tools.m4
deleted file mode 100644
index c0aeedb..0000000
--- a/src/decaf/m4/apr_tools.m4
+++ /dev/null
@@ -1,96 +0,0 @@
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl Licensed to the Apache Software Foundation (ASF) under one or more
-dnl contributor license agreements.  See the NOTICE file distributed with
-dnl this work for additional information regarding copyright ownership.
-dnl The ASF licenses this file to You under the Apache License, Version 2.0
-dnl (the "License"); you may not use this file except in compliance with
-dnl the License.  You may obtain a copy of the License at
-dnl
-dnl     http://www.apache.org/licenses/LICENSE-2.0
-dnl
-dnl Unless required by applicable law or agreed to in writing, software
-dnl distributed under the License is distributed on an "AS IS" BASIS,
-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-dnl See the License for the specific language governing permissions and
-dnl limitations under the License.
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl
-dnl  This Macro File defines functions that help to manage the libraries
-dnl  dependance on the Apache Portable Runtime.
-dnl
-dnl  DECAF_CONFIGURE_APR()
-dnl
-dnl  Check configure options and assign variables related to
-dnl  the Apache Portable Runtime (APR) library.
-dnl
-
-AC_DEFUN([DECAF_CONFIGURE_APR],
-[
-  AC_MSG_NOTICE([Apache Portable Runtime (APR) library configuration])
-  APR_FIND_APR([], [], 1, [0 1])
-  APR_FIND_APU([], [], 1, [0 1])
-
-  if test $apr_found = "no"; then
-    AC_MSG_WARN([APR not found])
-    DECAF_DOWNLOAD_APR
-  fi
-
-  if test $apu_found = "no"; then
-    AC_MSG_WARN([APR Utils not found])
-    DECAF_DOWNLOAD_APU
-  fi
-
-  dnl Get build information from APR
-
-  CPPFLAGS="$CPPFLAGS `$apr_config --cppflags --includes`"
-  if test $? -ne 0; then
-    AC_MSG_ERROR([apr-config --cppflags failed])
-  fi
-
-  CFLAGS="$CFLAGS `$apr_config --cflags --includes`"
-  if test $? -ne 0; then
-    AC_MSG_ERROR([apr-config --cflags failed])
-  fi
-
-  LDFLAGS="$LDFLAGS `$apr_config --ldflags`"
-  if test $? -ne 0; then
-    AC_MSG_ERROR([apr-config --ldflags failed])
-  fi
-  LDFLAGS="$LDFLAGS `$apu_config --ldflags`"
-  if test $? -ne 0; then
-    AC_MSG_ERROR([apu-config --ldflags failed])
-  fi
-
-  APR_LIBS="`$apr_config --link-libtool --libs`"
-  if test $? -ne 0; then
-    AC_MSG_ERROR([apr-config --link-libtool --libs failed])
-  fi
-  APR_LIBS="`$apu_config --link-libtool --libs`"
-  if test $? -ne 0; then
-    AC_MSG_ERROR([apu-config --link-libtool --libs failed])
-  fi
-
-  AC_SUBST([APR_LIBS])
-])
-
-dnl DECAF_DOWNLOAD_APR()
-dnl no apr found, print out a message telling the user what to do
-AC_DEFUN([DECAF_DOWNLOAD_APR],
-[
-  echo "The Apache Portable Runtime (APR) library cannot be found."
-  echo "Please install APR on this system and supply the appropriate"
-  echo "--with-apr option to 'configure'"
-
-  AC_MSG_ERROR([no suitable APR found])
-])
-
-dnl DECAF_DOWNLOAD_APU()
-dnl no apr-utils found, print out a message telling the user what to do
-AC_DEFUN([DECAF_DOWNLOAD_APU],
-[
-  echo "The Apache Portable Runtime (APR) Utils library cannot be found."
-  echo "Please install APR Utils on this system and supply the appropriate"
-  echo "--with-apr option to 'configure'"
-
-  AC_MSG_ERROR([no suitable APR Utils found])
-])
diff --git a/src/decaf/m4/check_addrinfo.m4 b/src/decaf/m4/check_addrinfo.m4
deleted file mode 100644
index 13eb272..0000000
--- a/src/decaf/m4/check_addrinfo.m4
+++ /dev/null
@@ -1,48 +0,0 @@
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl Licensed to the Apache Software Foundation (ASF) under one or more
-dnl contributor license agreements.  See the NOTICE file distributed with
-dnl this work for additional information regarding copyright ownership.
-dnl The ASF licenses this file to You under the Apache License, Version 2.0
-dnl (the "License"); you may not use this file except in compliance with
-dnl the License.  You may obtain a copy of the License at
-dnl
-dnl     http://www.apache.org/licenses/LICENSE-2.0
-dnl
-dnl Unless required by applicable law or agreed to in writing, software
-dnl distributed under the License is distributed on an "AS IS" BASIS,
-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-dnl See the License for the specific language governing permissions and
-dnl limitations under the License.
-
-dnl
-dnl check_addrinfo.m4 - checks support for addrinfo structure
-dnl
-dnl This macro determines if the platform supports the addrinfo structure.
-dnl If this platform supports addrinfo, defines HAVE_STRUCT_ADDRINFO.
-dnl
-
-AC_DEFUN([CHECK_ADDRINFO], [
-    AC_MSG_CHECKING([whether struct addrinfo is defined])
-    AC_TRY_COMPILE(
-      [ #include <stdio.h>
-        #ifdef HAVE_UNISTD_H
-        # include <unistd.h>
-        #endif
-        #include <sys/types.h>
-        #include <sys/socket.h>
-        #include <netdb.h>
-      ],
-      [
-        do {
-          struct addrinfo a;
-          (void) a.ai_flags;
-        } while(0)
-      ],
-      [
-        AC_MSG_RESULT(yes)
-        AC_DEFINE(HAVE_STRUCT_ADDRINFO,, [define if you have struct addrinfo])
-      ],
-      [
-        AC_MSG_RESULT(no)
-      ])
-])
diff --git a/src/decaf/m4/check_visibility.m4 b/src/decaf/m4/check_visibility.m4
deleted file mode 100644
index dd1c3b3..0000000
--- a/src/decaf/m4/check_visibility.m4
+++ /dev/null
@@ -1,45 +0,0 @@
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl Licensed to the Apache Software Foundation (ASF) under one or more
-dnl contributor license agreements.  See the NOTICE file distributed with
-dnl this work for additional information regarding copyright ownership.
-dnl The ASF licenses this file to You under the Apache License, Version 2.0
-dnl (the "License"); you may not use this file except in compliance with
-dnl the License.  You may obtain a copy of the License at
-dnl
-dnl     http://www.apache.org/licenses/LICENSE-2.0
-dnl
-dnl Unless required by applicable law or agreed to in writing, software
-dnl distributed under the License is distributed on an "AS IS" BASIS,
-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-dnl See the License for the specific language governing permissions and
-dnl limitations under the License.
-
-dnl
-dnl check_visibility.m4 - checks support for visibility family of CXX flags
-dnl
-dnl This macro determines whether or not the CXX flags -fvisibility and 
-dnl -fvisibility-inlines-hidden are allowed with the compiler.  
-dnl
-dnl If so, the result is "yes" and HAVE_VISIBILITY_OPTIONS is defined.  Else, the
-dnl result is "no". 
-dnl
-
-AC_DEFUN([CHECK_VISIBILITY], [
-    AC_MSG_CHECKING([whether -fvisibility flags work])
-           
-    OLDCXXFLAGS="$CXXFLAGS"
-    CXXFLAGS="$CXXFLAGS -Werror -fvisibility=hidden -fvisibility-inlines-hidden"
-    
-    AC_TRY_COMPILE([],
-      [
-      ],
-      [
-        AC_MSG_RESULT(yes)
-        AC_DEFINE([HAVE_VISIBILITY_OPTIONS],[], [define if you have -fvisibility options])
-      ],
-      [
-        AC_MSG_RESULT(no)
-      ])
-      
-    CXXFLAGS="$OLDCXXFLAGS"
-])
diff --git a/src/decaf/m4/find_apr.m4 b/src/decaf/m4/find_apr.m4
deleted file mode 100644
index e437534..0000000
--- a/src/decaf/m4/find_apr.m4
+++ /dev/null
@@ -1,167 +0,0 @@
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl Licensed to the Apache Software Foundation (ASF) under one or more
-dnl contributor license agreements.  See the NOTICE file distributed with
-dnl this work for additional information regarding copyright ownership.
-dnl The ASF licenses this file to You under the Apache License, Version 2.0
-dnl (the "License"); you may not use this file except in compliance with
-dnl the License.  You may obtain a copy of the License at
-dnl
-dnl     http://www.apache.org/licenses/LICENSE-2.0
-dnl
-dnl Unless required by applicable law or agreed to in writing, software
-dnl distributed under the License is distributed on an "AS IS" BASIS,
-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-dnl See the License for the specific language governing permissions and
-dnl limitations under the License.
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl
-dnl find_apr.m4 : locate the APR include files and libraries
-dnl
-dnl This macro file can be used by applications to find and use the APR
-dnl library. It provides a standardized mechanism for using APR. It supports
-dnl embedding APR into the application source, or locating an installed
-dnl copy of APR.
-dnl
-dnl APR_FIND_APR(srcdir, builddir, implicit-install-check, acceptable-majors)
-dnl
-dnl   where srcdir is the location of the bundled APR source directory, or
-dnl   empty if source is not bundled.
-dnl
-dnl   where builddir is the location where the bundled APR will will be built,
-dnl   or empty if the build will occur in the srcdir.
-dnl
-dnl   where implicit-install-check set to 1 indicates if there is no
-dnl   --with-apr option specified, we will look for installed copies.
-dnl
-dnl   where acceptable-majors is a space separated list of acceptable major
-dnl   version numbers. Often only a single major version will be acceptable.
-dnl   If multiple versions are specified, and --with-apr=PREFIX or the
-dnl   implicit installed search are used, then the first (leftmost) version
-dnl   in the list that is found will be used.  Currently defaults to [0 1].
-dnl
-dnl Sets the following variables on exit:
-dnl
-dnl   apr_found : "yes", "no", "reconfig"
-dnl
-dnl   apr_config : If the apr-config tool exists, this refers to it. If
-dnl                apr_found is "reconfig", then the bundled directory
-dnl                should be reconfigured *before* using apr_config.
-dnl
-dnl Note: this macro file assumes that apr-config has been installed; it
-dnl       is normally considered a required part of an APR installation.
-dnl
-dnl If a bundled source directory is available and needs to be (re)configured,
-dnl then apr_found is set to "reconfig". The caller should reconfigure the
-dnl (passed-in) source directory, placing the result in the build directory,
-dnl as appropriate.
-dnl
-dnl If apr_found is "yes" or "reconfig", then the caller should use the
-dnl value of apr_config to fetch any necessary build/link information.
-dnl
-
-AC_DEFUN([APR_FIND_APR], [
-  apr_found="no"
-
-  if test "$target_os" = "os2-emx"; then
-    # Scripts don't pass test -x on OS/2
-    TEST_X="test -f"
-  else
-    TEST_X="test -x"
-  fi
-
-  ifelse([$4], [], [
-         ifdef(AC_WARNING,AC_WARNING([$0: missing argument 4 (acceptable-majors): Defaulting to APR 0.x then APR 1.x]))
-         acceptable_majors="0 1"],
-         [acceptable_majors="$4"])
-
-  apr_temp_acceptable_apr_config=""
-  for apr_temp_major in $acceptable_majors
-  do
-    case $apr_temp_major in
-      0)
-      apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-config"
-      ;;
-      *)
-      apr_temp_acceptable_apr_config="$apr_temp_acceptable_apr_config apr-$apr_temp_major-config"
-      ;;
-    esac
-  done
-
-  AC_MSG_CHECKING(for APR)
-  AC_ARG_WITH(apr,
-  [  --with-apr=PATH         prefix for installed APR, path to APR build tree,
-                          or the full path to apr-config],
-  [
-    if test "$withval" = "no" || test "$withval" = "yes"; then
-      AC_MSG_ERROR([--with-apr requires a directory or file to be provided])
-    fi
-
-    for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
-    do
-      for lookdir in "$withval/bin" "$withval"
-      do
-        if $TEST_X "$lookdir/$apr_temp_apr_config_file"; then
-          apr_found="yes"
-          apr_config="$lookdir/$apr_temp_apr_config_file"
-          break 2
-        fi
-      done
-    done
-
-    if test "$apr_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
-      apr_found="yes"
-      apr_config="$withval"
-    fi
-
-    dnl if --with-apr is used, it is a fatal error for its argument
-    dnl to be invalid
-    if test "$apr_found" != "yes"; then
-      AC_MSG_ERROR([the --with-apr parameter is incorrect. It must specify an install prefix, a build directory, or an apr-config file.])
-    fi
-  ],[
-    dnl If we allow installed copies, check those before using bundled copy.
-    if test -n "$3" && test "$3" = "1"; then
-      for apr_temp_apr_config_file in $apr_temp_acceptable_apr_config
-      do
-        if $apr_temp_apr_config_file --help > /dev/null 2>&1 ; then
-          apr_found="yes"
-          apr_config="$apr_temp_apr_config_file"
-          break
-        else
-          dnl look in some standard places
-          for lookdir in /usr /usr/local /usr/local/apr /opt/apr; do
-            if $TEST_X "$lookdir/bin/$apr_temp_apr_config_file"; then
-              apr_found="yes"
-              apr_config="$lookdir/bin/$apr_temp_apr_config_file"
-              break 2
-            fi
-          done
-        fi
-      done
-    fi
-    dnl if we have not found anything yet and have bundled source, use that
-    if test "$apr_found" = "no" && test -d "$1"; then
-      apr_temp_abs_srcdir="`cd $1 && pwd`"
-      apr_found="reconfig"
-      apr_bundled_major="`sed -n '/#define.*APR_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apr_version.h\"`"
-      case $apr_bundled_major in
-        "")
-          AC_MSG_ERROR([failed to find major version of bundled APR])
-        ;;
-        0)
-          apr_temp_apr_config_file="apr-config"
-        ;;
-        *)
-          apr_temp_apr_config_file="apr-$apr_bundled_major-config"
-        ;;
-      esac
-      if test -n "$2"; then
-        apr_config="$2/$apr_temp_apr_config_file"
-      else
-        apr_config="$1/$apr_temp_apr_config_file"
-      fi
-    fi
-  ])
-
-  AC_MSG_RESULT($apr_found)
-])
diff --git a/src/decaf/m4/find_apu.m4 b/src/decaf/m4/find_apu.m4
deleted file mode 100644
index e29bc60..0000000
--- a/src/decaf/m4/find_apu.m4
+++ /dev/null
@@ -1,176 +0,0 @@
-dnl -------------------------------------------------------- -*- autoconf -*-
-dnl Copyright 2002-2005 The Apache Software Foundation or its licensors, as
-dnl applicable.
-dnl
-dnl Licensed under the Apache License, Version 2.0 (the "License");
-dnl you may not use this file except in compliance with the License.
-dnl You may obtain a copy of the License at
-dnl
-dnl     http://www.apache.org/licenses/LICENSE-2.0
-dnl
-dnl Unless required by applicable law or agreed to in writing, software
-dnl distributed under the License is distributed on an "AS IS" BASIS,
-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-dnl See the License for the specific language governing permissions and
-dnl limitations under the License.
-
-dnl
-dnl find_apu.m4 : locate the APR-util (APU) include files and libraries
-dnl
-dnl This macro file can be used by applications to find and use the APU
-dnl library. It provides a standardized mechanism for using APU. It supports
-dnl embedding APU into the application source, or locating an installed
-dnl copy of APU.
-dnl
-dnl APR_FIND_APU(srcdir, builddir, implicit-install-check, acceptable-majors)
-dnl
-dnl   where srcdir is the location of the bundled APU source directory, or
-dnl   empty if source is not bundled.
-dnl
-dnl   where builddir is the location where the bundled APU will be built,
-dnl   or empty if the build will occur in the srcdir.
-dnl
-dnl   where implicit-install-check set to 1 indicates if there is no
-dnl   --with-apr-util option specified, we will look for installed copies.
-dnl
-dnl   where acceptable-majors is a space separated list of acceptable major
-dnl   version numbers. Often only a single major version will be acceptable.
-dnl   If multiple versions are specified, and --with-apr-util=PREFIX or the
-dnl   implicit installed search are used, then the first (leftmost) version
-dnl   in the list that is found will be used.  Currently defaults to [0 1].
-dnl
-dnl Sets the following variables on exit:
-dnl
-dnl   apu_found : "yes", "no", "reconfig"
-dnl
-dnl   apu_config : If the apu-config tool exists, this refers to it.  If
-dnl                apu_found is "reconfig", then the bundled directory
-dnl                should be reconfigured *before* using apu_config.
-dnl
-dnl Note: this macro file assumes that apr-config has been installed; it
-dnl       is normally considered a required part of an APR installation.
-dnl
-dnl Note: At this time, we cannot find *both* a source dir and a build dir.
-dnl       If both are available, the build directory should be passed to
-dnl       the --with-apr-util switch.
-dnl
-dnl Note: the installation layout is presumed to follow the standard
-dnl       PREFIX/lib and PREFIX/include pattern. If the APU config file
-dnl       is available (and can be found), then non-standard layouts are
-dnl       possible, since it will be described in the config file.
-dnl
-dnl If a bundled source directory is available and needs to be (re)configured,
-dnl then apu_found is set to "reconfig". The caller should reconfigure the
-dnl (passed-in) source directory, placing the result in the build directory,
-dnl as appropriate.
-dnl
-dnl If apu_found is "yes" or "reconfig", then the caller should use the
-dnl value of apu_config to fetch any necessary build/link information.
-dnl
-
-AC_DEFUN([APR_FIND_APU], [
-  apu_found="no"
-
-  if test "$target_os" = "os2-emx"; then
-    # Scripts don't pass test -x on OS/2
-    TEST_X="test -f"
-  else
-    TEST_X="test -x"
-  fi
-
-  ifelse([$4], [],
-  [
-    ifdef(AC_WARNING,([$0: missing argument 4 (acceptable-majors): Defaulting to APU 0.x then APU 1.x]))
-    acceptable_majors="0 1"
-  ], [acceptable_majors="$4"])
-
-  apu_temp_acceptable_apu_config=""
-  for apu_temp_major in $acceptable_majors
-  do
-    case $apu_temp_major in
-      0)
-      apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-config"
-      ;;
-      *)
-      apu_temp_acceptable_apu_config="$apu_temp_acceptable_apu_config apu-$apu_temp_major-config"
-      ;;
-    esac
-  done
-
-  AC_MSG_CHECKING(for APR-util)
-  AC_ARG_WITH(apr-util,
-  [  --with-apr-util=PATH    prefix for installed APU, path to APU build tree,
-                          or the full path to apu-config],
-  [
-    if test "$withval" = "no" || test "$withval" = "yes"; then
-      AC_MSG_ERROR([--with-apr-util requires a directory or file to be provided])
-    fi
-
-    for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
-    do
-      for lookdir in "$withval/bin" "$withval"
-      do
-        if $TEST_X "$lookdir/$apu_temp_apu_config_file"; then
-          apu_found="yes"
-          apu_config="$lookdir/$apu_temp_apu_config_file"
-          break 2
-        fi
-      done
-    done
-
-    if test "$apu_found" != "yes" && $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then
-      apu_found="yes"
-      apu_config="$withval"
-    fi
-
-    dnl if --with-apr-util is used, it is a fatal error for its argument
-    dnl to be invalid
-    if test "$apu_found" != "yes"; then
-      AC_MSG_ERROR([the --with-apr-util parameter is incorrect. It must specify an install prefix, a build directory, or an apu-config file.])
-    fi
-  ],[
-    if test -n "$3" && test "$3" = "1"; then
-      for apu_temp_apu_config_file in $apu_temp_acceptable_apu_config
-      do
-        if $apu_temp_apu_config_file --help > /dev/null 2>&1 ; then
-          apu_found="yes"
-          apu_config="$apu_temp_apu_config_file"
-          break
-        else
-          dnl look in some standard places (apparently not in builtin/default)
-          for lookdir in /usr /usr/local /usr/local/apr /opt/apr /usr/local/apache2 ; do
-            if $TEST_X "$lookdir/bin/$apu_temp_apu_config_file"; then
-              apu_found="yes"
-              apu_config="$lookdir/bin/$apu_temp_apu_config_file"
-              break 2
-            fi
-          done
-        fi
-      done
-    fi
-    dnl if we have not found anything yet and have bundled source, use that
-    if test "$apu_found" = "no" && test -d "$1"; then
-      apu_temp_abs_srcdir="`cd $1 && pwd`"
-      apu_found="reconfig"
-      apu_bundled_major="`sed -n '/#define.*APU_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p' \"$1/include/apu_version.h\"`"
-      case $apu_bundled_major in
-        "")
-          AC_MSG_ERROR([failed to find major version of bundled APU])
-        ;;
-        0)
-          apu_temp_apu_config_file="apu-config"
-        ;;
-        *)
-          apu_temp_apu_config_file="apu-$apu_bundled_major-config"
-        ;;
-      esac
-      if test -n "$2"; then
-        apu_config="$2/$apu_temp_apu_config_file"
-      else
-        apu_config="$1/$apu_temp_apu_config_file"
-      fi
-    fi
-  ])
-
-  AC_MSG_RESULT($apu_found)
-])
diff --git a/src/decaf/src/examples/Makefile.am b/src/decaf/src/examples/Makefile.am
deleted file mode 100644
index e8ce980..0000000
--- a/src/decaf/src/examples/Makefile.am
+++ /dev/null
@@ -1,29 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-cc_sources = main.cpp
-
-##
-## Compiler / Linker Info
-##
-
-INCLUDES = -I$(srcdir)/../main
-
-bin_PROGRAMS = example
-example_SOURCES = $(cc_sources)
-
-example_LDADD= ../main/libdecaf.la
diff --git a/src/decaf/src/examples/main.cpp b/src/decaf/src/examples/main.cpp
deleted file mode 100644
index d357bdb..0000000
--- a/src/decaf/src/examples/main.cpp
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// START SNIPPET: demo
-
-#include <decaf/lang/Thread.h>
-#include <decaf/lang/Runnable.h>
-#include <decaf/lang/Integer.h>
-#include <decaf/util/concurrent/CountDownLatch.h>
-#include <decaf/util/Config.h>
-#include <decaf/io/ByteArrayInputStream.h>
-#include <decaf/io/ByteArrayOutputStream.h>
-#include <decaf/io/DataInputStream.h>
-#include <decaf/io/DataOutputStream.h>
-#include <decaf/util/Date.h>
-
-#include <stdlib.h>
-#include <iostream>
-
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-using namespace std;
-
-////////////////////////////////////////////////////////////////////////////////
-void testDataInputStream() {
-
-    std::cout << "-----------------------------------------------------\n";
-    std::cout << "Testing performance of the DataInputStream:" << std::endl;
-    std::cout << "-----------------------------------------------------\n";
-
-    const int bufferSize = 1024 * 2000;
-    const int totalRuns = 100;
-
-    unsigned char* buffer = new unsigned char[bufferSize];
-
-    // init to full String Buffer
-    for( int ix = 0; ix < bufferSize - 1; ++ix ) {
-        buffer[ix] = 'z';
-    }
-    buffer[bufferSize-1] = '\0';
-
-    long long startTime = 0LL;
-    long long endTime = 0LL;
-    long long totalDelta = 0LL;
-    long long average = 0LL;
-    std::vector<long long> deltaTs;
-
-    ByteArrayInputStream bis( buffer, bufferSize );
-    DataInputStream dis( &bis );
-
-    for( int i = 0; i < totalRuns; ++i ) {
-
-        startTime = Date::getCurrentTimeMilliseconds();
-
-        long long result = 0;
-        for( size_t iy = 0; iy < bufferSize / sizeof( result ); ++iy ){
-            result = dis.readLong();
-        }
-
-        endTime = Date::getCurrentTimeMilliseconds();
-
-        // Save the result
-        deltaTs.push_back( endTime - startTime );
-
-        bis.reset();
-    }
-
-    // Sum the Time Deltas for all runs.
-    for( int j = 0; j < totalRuns; ++j ) {
-        totalDelta += deltaTs[j];
-    }
-
-    average = totalDelta / totalRuns;
-
-    std::cout << "Averqage time of competion was: "
-              << average << " Milliseconds." << std::endl;
-
-    delete [] buffer;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void testDataOutputStream() {
-
-    std::cout << "-----------------------------------------------------\n";
-    std::cout << "Testing performance of the DataOutputStream:" << std::endl;
-    std::cout << "-----------------------------------------------------\n";
-
-    long long totalRuns = 2000LL;
-    long long startTime = 0LL;
-    long long endTime = 0LL;
-    long long totalDelta = 0LL;
-    long long average = 0LL;
-    std::vector<long long> deltaTs;
-    std::vector<unsigned char> outputBuffer;
-
-    std::string testString;
-    for( size_t i = 0; i < totalRuns * 10; ++i ) {
-        testString += 'a';
-    }
-
-    ByteArrayOutputStream bos( outputBuffer );
-    DataOutputStream dos( &bos );
-
-    for( int i = 0; i < totalRuns; ++i ) {
-
-        startTime = Date::getCurrentTimeMilliseconds();
-
-        for( int iy = 0; iy < totalRuns * 10; ++iy ){
-            dos.writeLong( 0xFF00FF00FF00FF00LL );
-        }
-        for( int iy = 0; iy < totalRuns * 10; ++iy ){
-            dos.writeInt( 312568 );
-        }
-        for( int iy = 0; iy < totalRuns * 10; ++iy ){
-            dos.writeShort( 12568 );
-        }
-        for( int iy = 0; iy < totalRuns * 10; ++iy ){
-            dos.writeUnsignedShort( 12568 );
-        }
-        for( int iy = 0; iy < totalRuns * 10; ++iy ){
-            dos.writeBoolean( true );
-        }
-        for( int iy = 0; iy < totalRuns * 10; ++iy ){
-            dos.writeDouble( 10.34235234 );
-        }
-        for( int iy = 0; iy < totalRuns; ++iy ){
-            dos.writeFloat( 32.4f );
-        }
-
-        dos.writeChars( testString );
-        dos.writeBytes( testString );
-        dos.writeUTF( testString );
-
-        endTime = Date::getCurrentTimeMilliseconds();
-
-        // Save the result
-        deltaTs.push_back( endTime - startTime );
-
-        outputBuffer.clear();
-    }
-
-    // Sum the Time Deltas for all runs.
-    for( int j = 0; j < totalRuns; ++j ) {
-        totalDelta += deltaTs[j];
-    }
-
-    average = totalDelta / totalRuns;
-
-    std::cout << "Averqage time of competion was: "
-              << average << " Milliseconds." << std::endl;
-}
-
-int main(int argc DECAF_UNUSED, char* argv[] DECAF_UNUSED) {
-
-    std::cout << "=====================================================\n";
-    std::cout << "Starting the example:" << std::endl;
-    std::cout << "-----------------------------------------------------\n";
-
-    //testDataInputStream();
-    testDataOutputStream();
-
-    std::cout << "-----------------------------------------------------\n";
-    std::cout << "Finished with the example\n";
-    std::cout << "=====================================================\n";
-}
-
-// END SNIPPET: demo
diff --git a/src/decaf/src/main/Makefile.am b/src/decaf/src/main/Makefile.am
deleted file mode 100644
index e11f284..0000000
--- a/src/decaf/src/main/Makefile.am
+++ /dev/null
@@ -1,194 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-cc_sources = \
-   decaf/net/ServerSocket.cpp \
-   decaf/net/SocketOutputStream.cpp \
-   decaf/net/BufferedSocket.cpp \
-   decaf/net/SocketInputStream.cpp \
-   decaf/net/SocketError.cpp \
-   decaf/net/TcpSocket.cpp \
-   decaf/net/SocketFactory.cpp \
-   decaf/net/URI.cpp \
-   decaf/net/URL.cpp \
-   decaf/net/URLEncoder.cpp \
-   decaf/net/URLDecoder.cpp \
-   decaf/lang/Exception.cpp \
-   decaf/lang/Thread.cpp \
-   decaf/lang/Byte.cpp \
-   decaf/lang/Character.cpp \
-   decaf/lang/Boolean.cpp \
-   decaf/lang/Short.cpp \
-   decaf/lang/Integer.cpp \
-   decaf/lang/Long.cpp \
-   decaf/lang/Float.cpp \
-   decaf/lang/Double.cpp \
-   decaf/lang/Math.cpp \
-   decaf/lang/System.cpp \
-   decaf/io/BufferedOutputStream.cpp \
-   decaf/io/BufferedInputStream.cpp \
-   decaf/io/ByteArrayInputStream.cpp \
-   decaf/io/DataInputStream.cpp \
-   decaf/io/DataOutputStream.cpp \
-   decaf/io/ByteArrayOutputStream.cpp \
-   decaf/io/BlockingByteArrayInputStream.cpp \
-   decaf/util/concurrent/Mutex.cpp \
-   decaf/util/concurrent/CountDownLatch.cpp \
-   decaf/util/concurrent/PooledThread.cpp \
-   decaf/util/concurrent/ThreadPool.cpp \
-   decaf/util/Date.cpp \
-   decaf/util/UUID.cpp \
-   decaf/util/StringTokenizer.cpp \
-   decaf/util/Random.cpp \
-   decaf/util/logging/LoggerHierarchy.cpp \
-   decaf/util/logging/Logger.cpp \
-   decaf/util/logging/LogWriter.cpp \
-   decaf/util/logging/SimpleLogger.cpp \
-   decaf/util/logging/LogManager.cpp \
-   decaf/util/Config.cpp \
-   decaf/internal/AprPool.cpp \
-   decaf/internal/util/BigInt.cpp \
-   decaf/internal/util/BitOps.cpp \
-   decaf/internal/util/NumberConverter.cpp \
-   decaf/internal/util/FloatingPointParser.cpp \
-   decaf/internal/util/HexStringParser.cpp
-
-h_sources = \
-   decaf/net/BindException.h \
-   decaf/net/ConnectException.h \
-   decaf/net/HttpRetryException.h \
-   decaf/net/MalformedURLException.h \
-   decaf/net/NoRouteToHostException.h \
-   decaf/net/PortUnreachableException.h \
-   decaf/net/ProtocolException.h \
-   decaf/net/SocketException.h \
-   decaf/net/SocketTimeoutException.h \
-   decaf/net/UnknownHostException.h \
-   decaf/net/UnknownServiceException.h \
-   decaf/net/URISyntaxException.h \
-   decaf/net/BufferedSocket.h \
-   decaf/net/TcpSocket.h \
-   decaf/net/SocketError.h \
-   decaf/net/SocketOutputStream.h \
-   decaf/net/Socket.h \
-   decaf/net/SocketInputStream.h \
-   decaf/net/ServerSocket.h \
-   decaf/net/SocketFactory.h \
-   decaf/net/URI.h \
-   decaf/net/URL.h \
-   decaf/net/URLEncoder.h \
-   decaf/net/URLDecoder.h \
-   decaf/lang/Throwable.h \
-   decaf/lang/Exception.h \
-   decaf/lang/Byte.h \
-   decaf/lang/Character.h \
-   decaf/lang/Short.h \
-   decaf/lang/Integer.h \
-   decaf/lang/Long.h \
-   decaf/lang/Float.h \
-   decaf/lang/Double.h \
-   decaf/lang/Thread.h \
-   decaf/lang/Number.h \
-   decaf/lang/Runnable.h \
-   decaf/lang/Math.h \
-   decaf/lang/System.h \
-   decaf/lang/exceptions/NoSuchElementException.h \
-   decaf/lang/exceptions/RuntimeException.h \
-   decaf/lang/exceptions/IndexOutOfBoundsException.h \
-   decaf/lang/exceptions/NullPointerException.h \
-   decaf/lang/exceptions/IllegalStateException.h \
-   decaf/lang/exceptions/IllegalMonitorStateException.h \
-   decaf/lang/exceptions/InvalidStateException.h \
-   decaf/lang/exceptions/ExceptionDefines.h \
-   decaf/lang/exceptions/IllegalArgumentException.h \
-   decaf/lang/exceptions/UnsupportedOperationException.h \
-   decaf/lang/exceptions/InterruptedException.h \
-   decaf/io/BufferedOutputStream.h \
-   decaf/io/StandardErrorOutputStream.h \
-   decaf/io/OutputStream.h \
-   decaf/io/Writer.h \
-   decaf/io/ByteArrayOutputStream.h \
-   decaf/io/Closeable.h \
-   decaf/io/DataOutputStream.h \
-   decaf/io/ByteArrayInputStream.h \
-   decaf/io/FilterInputStream.h \
-   decaf/io/Reader.h \
-   decaf/io/BlockingByteArrayInputStream.h \
-   decaf/io/DataInputStream.h \
-   decaf/io/EOFException.h \
-   decaf/io/FilterOutputStream.h \
-   decaf/io/BufferedInputStream.h \
-   decaf/io/InputStream.h \
-   decaf/io/IOException.h \
-   decaf/io/InterruptedIOException.h \
-   decaf/util/concurrent/Lock.h \
-   decaf/util/concurrent/Concurrent.h \
-   decaf/util/concurrent/CountDownLatch.h \
-   decaf/util/concurrent/Synchronizable.h \
-   decaf/util/concurrent/Mutex.h \
-   decaf/util/concurrent/PooledThread.h \
-   decaf/util/concurrent/PooledThreadListener.h \
-   decaf/util/concurrent/TaskListener.h \
-   decaf/util/concurrent/ThreadPool.h \
-   decaf/util/Date.h \
-   decaf/util/UUID.h \
-   decaf/util/Iterator.h \
-   decaf/util/Collection.h \
-   decaf/util/Comparator.h \
-   decaf/util/Map.h \
-   decaf/util/Properties.h \
-   decaf/util/Queue.h \
-   decaf/util/Set.h \
-   decaf/util/Random.h \
-   decaf/util/StringTokenizer.h \
-   decaf/util/logging/Handler.h \
-   decaf/util/logging/Logger.h \
-   decaf/util/logging/LoggerCommon.h \
-   decaf/util/logging/ConsoleHandler.h \
-   decaf/util/logging/SimpleFormatter.h \
-   decaf/util/logging/Formatter.h \
-   decaf/util/logging/LoggerHierarchy.h \
-   decaf/util/logging/LogManager.h \
-   decaf/util/logging/MarkBlockLogger.h \
-   decaf/util/logging/StreamHandler.h \
-   decaf/util/logging/LoggerDefines.h \
-   decaf/util/logging/Filter.h \
-   decaf/util/logging/LogRecord.h \
-   decaf/util/logging/LogWriter.h \
-   decaf/util/logging/SimpleLogger.h \
-   decaf/util/logging/PropertiesChangeListener.h \
-   decaf/internal/AprPool.h \
-   decaf/internal/util/NumberConverter.h \
-   decaf/internal/util/FloatingPointParser.h \
-   decaf/internal/util/HexStringParser.h \
-   decaf/internal/util/BitOps.h \
-   decaf/internal/util/BigInt.h
-
-##
-## LibTool build step
-##
-lib_LTLIBRARIES= libdecaf.la
-libdecaf_la_SOURCES= $(h_sources) $(cc_sources)
-libdecaf_la_CXXFLAGS= $(DECAF_CXXFLAGS)
-libdecaf_la_LDFLAGS= -version-info $(DECAF_LIBRARY_VERSION) -release $(DECAF_VERSION)
-libdecaf_la_LIBADD= $(DECAF_LIBS) $(APR_LIBS)
-
-##
-## Packaging Info
-##
-library_includedir=$(includedir)/$(DECAF_LIBRARY_NAME)-$(DECAF_VERSION)
-nobase_library_include_HEADERS = $(h_sources)
diff --git a/src/decaf/src/main/decaf/internal/AprPool.cpp b/src/decaf/src/main/decaf/internal/AprPool.cpp
deleted file mode 100644
index 656e9de..0000000
--- a/src/decaf/src/main/decaf/internal/AprPool.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "AprPool.h"
-
-using namespace decaf;
-using namespace decaf::internal;
-
-////////////////////////////////////////////////////////////////////////////////
-AprPool::AprPool() {
-    apr_pool_create( &aprPool, NULL );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-AprPool::~AprPool() {
-    apr_pool_destroy( aprPool );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void AprPool::cleanup() {
-    apr_pool_clear( aprPool );
-}
diff --git a/src/decaf/src/main/decaf/internal/AprPool.h b/src/decaf/src/main/decaf/internal/AprPool.h
deleted file mode 100644
index 069d03f..0000000
--- a/src/decaf/src/main/decaf/internal/AprPool.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_APRPOOL_H_
-#define _DECAF_INTERNAL_APRPOOL_H_
-
-#include <decaf/util/Config.h>
-#include <apr_pools.h>
-
-namespace decaf{
-namespace internal{
-
-    /**
-     * Wraps an APR pool object so that classes in decaf can create a static
-     * member for use in static methods where apr function calls that need a pool
-     * are made.
-     */
-    class AprPool {
-    private:
-
-        apr_pool_t* aprPool;
-
-    public:
-
-        AprPool();
-        virtual ~AprPool();
-
-        /**
-         * Gets the internal APR Pool.
-         * @returns the internal APR pool
-         */
-        apr_pool_t* getAprPool() const {
-            return aprPool;
-        }
-
-        /**
-         * Clears data that was allocated by this pool.  Users should call this
-         * after getting the data from the APR functions and copying it to
-         * someplace safe.
-         */
-        void cleanup();
-
-    };
-
-}}
-
-#endif /*_DECAF_INTERNAL_APRPOOL_H_*/
diff --git a/src/decaf/src/main/decaf/internal/net/URIEncoderDecoder.cpp b/src/decaf/src/main/decaf/internal/net/URIEncoderDecoder.cpp
deleted file mode 100644
index 451aeb6..0000000
--- a/src/decaf/src/main/decaf/internal/net/URIEncoderDecoder.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URIEncoderDecoder.h"
-
-#include <decaf/lang/Character.h>
-
-using namespace decaf;
-using namespace decaf::internal;
-using namespace decaf::internal::net
-
-////////////////////////////////////////////////////////////////////////////////
-const std::string URIEncoderDecoder::digits = "0123456789ABCDEF";
-
-////////////////////////////////////////////////////////////////////////////////
-URIEncoderDecoder::URIEncoderDecoder() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URIEncoderDecoder::validate( const std::string& s, const std::string& legal)
-    throw ( URISyntaxException ) {
-
-    std::string::const_iterator itr = s.begin();
-
-    for( int i = 0; itr != s.end(); ++i, ++iter ) {
-
-        if( ch == '%' ) {
-            if( i + 2 >= s.length() ) {
-                throw URISyntaxException(
-                    __FILE__, __LINE__, s,
-                    "invalid Encoded data", i );
-            }
-
-            int d1 = Character::digit( *(++iter), 16 );
-            int d2 = Character::digit( *(++iter), 16 );
-
-            if( d1 == -1 || d2 == -1 ) {
-                throw URISyntaxException(
-                    __FILE__, __LINE__, s,
-                    "Invalid Hex Digit in char", i );
-            }
-
-            i += 2;
-
-            continue;
-        }
-
-        if( !Charactor::isLetterOrDigit( *itr ) &&
-            !Character::isSpaceChar( *itr ) &&
-            !Character::isISOControl( *itr ) ) {
-
-            throw URISyntaxException(
-                __FILE__, __LINE__, s,
-                "string contains Invalid Character", i );
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URIEncoderDecoder::validateSimple( const std::string& s,
-                                        const std::string& legal )
-    throw ( URISyntaxException ) {
-
-    std::string::const_iterator itr = s.begin();
-
-    for( int i = 0; itr != s.end(); ++i, ++itr ) {
-        if( !Character::isLetterOrDigit( *itr ) ||
-            !legal.find_first_of( *itr ) > std::string::npos ) {
-
-            throw URISyntaxException(
-                __FILE__, __LINE__, s,
-                "string contains invalid ASCII chars", i );
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URIEncoderDecoder::quoteIllegal( const std::string& s,
-                                             const std::string& legal );
-
-    std::string buf = "";
-    std::string::const_iterator iter = s.begin();
-
-    for( ; iter != s.end(); ++iter ) {
-
-        char ch = *iter;
-
-        if( Character::isLetterOrDigit( ch ) ||
-            legal.find( ch ) > string::npos ||
-            ( (unsigned char)ch > 127 &&
-              !Character.isSpaceChar(ch) &&
-              !Character.isISOControl(ch) ) ) {
-
-            buf.append(ch);
-        } else {
-            buf.append('%');
-            buf.append( digits.at( ( ch & 0xf0 ) >> 4 ) );
-            buf.append( digits.at( bytes[j] & 0xf ) );
-        }
-    }
-
-    return buf;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URIEncoderDecoder::encodeOthers( const std::string& s ) {
-    std::string buf = "";
-    for( int i = 0; i < s.length(); i++ ) {
-        char ch = s.at(i);
-        if( ch <= 127 ) {
-            buf.append( ch );
-        } else {
-            buf.append('%');
-            buf.append( digits.at( ( ch & 0xf0 ) >> 4 ) );
-            buf.append( digits.at( ch & 0xf ) );
-        }
-    }
-    return buf;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URIEncoderDecoder::decode( const std::string& s ) {
-
-    std::string result = "";
-    for( int i = 0; i < s.length(); ) {
-        char c = s.charAt(i);
-        if( c == '%' ) {
-
-            do {
-                if( i + 2 >= s.length() ) {
-                    throw IllegalArgumentException(
-                        __FILE__, __LINE__,
-                        "String has invalid encoding: %s", s.c_str() );
-                }
-
-                int d1 = Character.digit( s.at(i + 1), 16);
-                int d2 = Character.digit( s.at(i + 2), 16);
-
-                if( d1 == -1 || d2 == -1 ) {
-                    throw IllegalArgumentException(
-                        __FILE__, __LINE__,
-                        "URIEncoderDecoder::decode - Bad hex encoding in: ",
-                        s.c_str() );
-                }
-
-                result.append( (unsigned char)( ( d1 << 4 ) + d2 ) );
-                i += 3;
-
-            } while( i < s.length() && s.at(i) == '%' );
-
-            continue;
-        }
-
-        result.append(c);
-        i++;
-    }
-
-    return result;
-}
diff --git a/src/decaf/src/main/decaf/internal/net/URIEncoderDecoder.h b/src/decaf/src/main/decaf/internal/net/URIEncoderDecoder.h
deleted file mode 100644
index 24bf982..0000000
--- a/src/decaf/src/main/decaf/internal/net/URIEncoderDecoder.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_NET_URIENCODERDECODER_H_
-#define _DECAF_INTERNAL_NET_URIENCODERDECODER_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/net/URISyntaxException>
-#include <string>
-
-namespace decaf{
-namespace internal{
-namespace net{
-
-    class URIEncoderDecoder {
-    private:
-
-        static const std::string digits;
-
-    public:
-
-        URIEncoderDecoder();
-        virtual ~URIEncoderDecoder() {}
-
-        /**
-         * Validate a string by checking if it contains any characters other than:
-         *
-         * 1. letters ('a'..'z', 'A'..'Z')
-         * 2. numbers ('0'..'9')
-         * 3. characters in the legalset parameter
-         * 4. characters that are not ISO Control or are not ISO Space characters)
-         *
-         * @param s - the string to be validated
-         * @param legal - the characters allowed in the string s
-         */
-        static void validate( const std::string& s, const std::string& legal )
-            throw ( URISyntaxException );
-
-        /**
-         * Validate a string by checking if it contains any characters other than:
-         *
-         * 1. letters ('a'..'z', 'A'..'Z')
-         * 2. numbers ('0'..'9')
-         * 3. characters in the legalset parameter
-         *
-         * @param s - the string to be validated
-         * @param legal - the characters allowed in the string s
-         */
-        static void validateSimple( const std::string& s, const std::string& legal )
-            throw ( URISyntaxException );
-
-        /**
-         * All characters except letters ('a'..'z', 'A'..'Z') and numbers ('0'..'9')
-         * and legal characters are converted into their hexidecimal value prepended
-         * by '%'.
-         * <p>
-         * For example: '#' -> %23
-         * <p>
-         * Other characters, which are chars that are not US-ASCII, and are
-         * not ISO Control or are not ISO Space chars, are preserved.
-         * @param s - the string to be converted
-         * @param legal - the characters allowed to be preserved in the string s
-         * @return converted string
-         */
-        static std::string quoteIllegal( const std::string& s,
-                                         const std::string& legal );
-
-        /**
-         * Other characters, which are chars that are not US-ASCII, and are
-         * not ISO Control or are not ISO Space chars are not preserved. They are
-         * converted into their hexidecimal value prepended by '%'.
-         * <p>
-         * For example: Euro currency symbol -> "%E2%82%AC".
-         * @param s - the string to be converted
-         * @return the converted string
-         */
-        static std::string encodeOthers( const std::string& s );
-
-        /**
-         * Decodes the string argument which is assumed to be encoded in the
-         * <code>x-www-form-urlencoded</code> MIME content type using the UTF-8
-         * encoding scheme.
-         * <p>
-         * '%' and two following hex digit characters are converted to the
-         * equivalent byte value. All other characters are passed through
-         * unmodified.
-         * <p>
-         * e.g. "A%20B%20C %24%25" -> "A B C $%"
-         * @param s - The encoded string.
-         * @return The decoded version.
-         */
-        static std::string decode( const std::string& s );
-
-    };
-
-}}}
-
-#endif /*_DECAF_INTERNAL_NET_URIENCODERDECODER_H_*/
diff --git a/src/decaf/src/main/decaf/internal/util/BigInt.cpp b/src/decaf/src/main/decaf/internal/util/BigInt.cpp
deleted file mode 100644
index 6e6d2cd..0000000
--- a/src/decaf/src/main/decaf/internal/util/BigInt.cpp
+++ /dev/null
@@ -1,756 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#include "BigInt.h"
-
-#include <decaf/lang/Double.h>
-#include <decaf/lang/Float.h>
-#include <decaf/internal/util/BitOps.h>
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::internal;
-using namespace decaf::internal::util;
-
-////////////////////////////////////////////////////////////////////////////////
-BigInt::BigInt() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BigInt::multiplyHighPrecision( unsigned long long* arg1,
-                                    int length1,
-                                    unsigned long long* arg2,
-                                    int length2,
-                                    unsigned long long* result,
-                                    int length ) {
-
-    // assumes result is large enough to hold product
-    unsigned long long *temp;
-    unsigned int *resultIn32;
-    int count, index;
-
-    if( length1 < length2 ) {
-        temp = arg1;
-        arg1 = arg2;
-        arg2 = temp;
-        count = length1;
-        length1 = length2;
-        length2 = count;
-    }
-
-    memset( result, 0, sizeof(unsigned long long) * length );
-
-    // length1 > length2
-    resultIn32 = (unsigned int*)result;
-    index = -1;
-    for( count = 0; count < length2; ++count ) {
-        simpleMultiplyAddHighPrecision( arg1, length1,
-                                        arg2[count] & BitOps::LONG_LO_MASK,
-                                        resultIn32 + (++index) );
-        simpleMultiplyAddHighPrecision( arg1, length1,
-                                        ( arg2[count] >> 32 ),
-                                        resultIn32 + (++index) );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned int BigInt::simpleAppendDecimalDigitHighPrecision(
-    unsigned long long* arg1, int length, unsigned long long digit ) {
-
-    // assumes digit is less than 32 bits
-    unsigned long long arg = 0;
-    int index = 0;
-
-    digit <<= 32;
-    do {
-
-        arg = arg1[index] & BitOps::LONG_LO_MASK;
-        digit = ( digit >> 32 ) + BitOps::TIMES_TEN( arg );
-        arg1[index] = ( arg1[index] & BitOps::LONG_LO_MASK ) |
-                      ( digit & BitOps::LONG_LO_MASK );
-
-        arg = arg1[index] >> 32;
-        digit = ( digit >> 32 ) + BitOps::TIMES_TEN( arg );
-        arg1[index] = ( arg1[index] & BitOps::LONG_HI_MASK ) |
-                      ( digit & BitOps::LONG_LO_MASK );
-
-    } while( ++index < length );
-
-    return digit >> 32;
-}
-
-/*
-U_32 simpleAppendDecimalDigitHighPrecision (U_64 * arg1, IDATA length, U_64 digit)
-{
-  // assumes digit is less than 32 bits
-  U_64 arg;
-  IDATA index = 0;
-
-  digit <<= 32;
-  do
-    {
-      arg = LOW_IN_U64 (arg1[index]);
-      digit = HIGH_IN_U64 (digit) + TIMES_TEN (arg);
-      LOW_U32_FROM_PTR (arg1 + index) = LOW_U32_FROM_VAR (digit);
-
-      arg = HIGH_IN_U64 (arg1[index]);
-      digit = HIGH_IN_U64 (digit) + TIMES_TEN (arg);
-      HIGH_U32_FROM_PTR (arg1 + index) = LOW_U32_FROM_VAR (digit);
-    }
-  while (++index < length);
-
-  return HIGH_U32_FROM_VAR (digit);
-}
-*/
-////////////////////////////////////////////////////////////////////////////////
-double BigInt::toDoubleHighPrecision( unsigned long long* arg, int length ) {
-
-    int highBit;
-    unsigned long long mantissa = 0;
-    unsigned long long test64 = 0;
-    unsigned int test;
-    long long result;
-
-    while( length > 0 && arg[length - 1] == 0 ) {
-        --length;
-    }
-
-    if( length == 0 ) {
-        return 0.0;
-    } else if( length > 16 ) {
-        result = BitOps::EXPONENT_MASK;
-    } else if( length == 1 ) {
-
-        highBit = highestSetBit (arg);
-        if( highBit <= 53 ) {
-            highBit = 53 - highBit;
-            mantissa = *arg << highBit;
-            result = BitOps::CREATE_DOUBLE_BITS( mantissa, -highBit );
-        } else {
-            highBit -= 53;
-            mantissa = *arg >> highBit;
-            result = BitOps::CREATE_DOUBLE_BITS( mantissa, highBit );
-
-            // perform rounding, round to even in case of tie
-            test = ( BitOps::LOW_U32_FROM_LONG64_PTR( arg ) << ( 11 - highBit ) ) & 0x7FF;
-            if( test > 0x400 || ((test == 0x400) && (mantissa & 1)) ) {
-                result = result + 1;
-            }
-        }
-    } else {
-        highBit = highestSetBit (arg + (--length));
-        if( highBit <= 53 ) {
-            highBit = 53 - highBit;
-            if( highBit > 0 ) {
-                mantissa = (arg[length] << highBit) |
-                           (arg[length - 1] >> (64 - highBit));
-            } else {
-                mantissa = arg[length];
-            }
-            result = BitOps::CREATE_DOUBLE_BITS( mantissa, length * 64 - highBit );
-
-            // perform rounding, round to even in case of tie
-            test64 = arg[--length] << highBit;
-            if( test64 > BitOps::SIGN_MASK || ((test64 == BitOps::SIGN_MASK) && (mantissa & 1)) ) {
-                result = result + 1;
-            } else if( test64 == BitOps::SIGN_MASK ) {
-                while( --length >= 0 ) {
-                    if( arg[length] != 0 ) {
-                        result = result + 1;
-                        break;
-                    }
-                }
-            }
-        } else {
-            highBit -= 53;
-            mantissa = arg[length] >> highBit;
-            result = BitOps::CREATE_DOUBLE_BITS( mantissa, length * 64 + highBit );
-
-            // perform rounding, round to even in case of tie
-            test = ( BitOps::LOW_U32_FROM_LONG64_PTR( arg + length ) << ( 11 - highBit ) ) & 0x7FF;
-            if( test > 0x400 || ((test == 0x400) && (mantissa & 1)) ) {
-                result = result + 1;
-            } else if( test == 0x400 ) {
-                do {
-                    if( arg[--length] != 0 ) {
-                        result = result + 1;
-                        break;
-                    }
-                } while( length > 0 );
-            }
-        }
-    }
-
-    return Double::longBitsToDouble( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::tenToTheEHighPrecision( unsigned long long * result,
-                                    int length, int e ) {
-
-    // size test
-    if( length < ((e / 19) + 1) ) {
-        return 0;
-    }
-
-    memset( result, 0, length * sizeof(unsigned long long) );
-    *result = 1;
-
-    if( e == 0 ) {
-        return 1;
-    }
-
-    length = 1;
-    length = timesTenToTheEHighPrecision( result, length, e );
-
-    return length;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned long long BigInt::doubleMantissa( double z ) {
-
-      unsigned long long m = Double::doubleToLongBits( z );
-
-      if ((m & BitOps::EXPONENT_MASK) != 0)
-        m = (m & BitOps::MANTISSA_MASK) | BitOps::NORMAL_MASK;
-      else
-        m = (m & BitOps::MANTISSA_MASK);
-
-      return m;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::compareHighPrecision( unsigned long long* arg1,
-                                  int length1,
-                                  unsigned long long* arg2,
-                                  int length2 ) {
-
-    while( --length1 >= 0 && arg1[length1] == 0 );
-    while( --length2 >= 0 && arg2[length2] == 0 );
-
-    if( length1 > length2 ) {
-        return 1;
-    } else if( length1 < length2 ) {
-        return -1;
-    } else if( length1 > -1 ) {
-        do {
-            if( arg1[length1] > arg2[length1] ) {
-                return 1;
-            } else if( arg1[length1] < arg2[length1] ) {
-                return -1;
-            }
-        } while( --length1 >= 0 );
-    }
-
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::highestSetBitHighPrecision( unsigned long long* arg, int length ) {
-
-    int highBit;
-
-    while( --length >= 0 ) {
-        highBit = highestSetBit( arg + length );
-        if( highBit ) {
-            return highBit + 64 * length;
-        }
-    }
-
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BigInt::subtractHighPrecision( unsigned long long* arg1,
-                                    int length1,
-                                    unsigned long long* arg2,
-                                    int length2 ) {
-
-    // assumes arg1 > arg2
-    for( int index = 0; index < length1; ++index ) {
-        arg1[index] = ~arg1[index];
-    }
-
-    simpleAddHighPrecision( arg1, length1, 1 );
-
-    while( length2 > 0 && arg2[length2 - 1] == 0 ) {
-        --length2;
-    }
-
-    addHighPrecision( arg1, length1, arg2, length2 );
-
-    for( int index = 0; index < length1; ++index ) {
-        arg1[index] = ~arg1[index];
-    }
-
-    simpleAddHighPrecision( arg1, length1, 1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::doubleExponent( double z ) {
-
-    // assumes positive double
-    int k = ( (unsigned long long )Double::doubleToLongBits( z ) >> 52 );
-
-    if( k ) {
-        k -= BitOps::E_OFFSET;
-    } else {
-        k = 1 - BitOps::E_OFFSET;
-    }
-
-    return k;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned int BigInt::simpleMultiplyHighPrecision(
-    unsigned long long* arg1, int length, unsigned long long arg2 ) {
-
-    // assumes arg2 only holds 32 bits of information
-    unsigned long long product = 0;
-    int index = 0;
-
-    do {
-
-        product = ( product >> 32 ) + arg2 * BitOps::LOW_U32_FROM_LONG64_PTR( arg1 + index );
-        BitOps::LOW_U32_FROM_LONG64_PTR( arg1 + index ) = BitOps::LOW_U32_FROM_LONG64( product );
-
-        product = ( product >> 32 ) + arg2 * BitOps::HIGH_U32_FROM_LONG64_PTR( arg1 + index );
-        BitOps::HIGH_U32_FROM_LONG64_PTR( arg1 + index ) = BitOps::LOW_U32_FROM_LONG64( product );
-
-    } while( ++index < length );
-
-    return ( product >> 32 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::addHighPrecision( unsigned long long* arg1,
-                              int length1,
-                              unsigned long long* arg2,
-                              int length2 ) {
-
-    // addition is limited by length of arg1 as it this function is
-    // storing the result in arg1
-    //
-    // fix for cc (GCC) 3.2 20020903 (Red Hat Linux 8.0 3.2-7): code generated does not
-    // do the temp1 + temp2 + carry addition correct.  carry is 64 bit because gcc has
-    // subtle issues when you mix 64 / 32 bit maths.
-    unsigned long long temp1, temp2, temp3;     /* temporary variables to help the SH-4, and gcc */
-    unsigned long long carry;
-    int index;
-
-    if( length1 == 0 || length2 == 0 ) {
-        return 0;
-    } else if( length1 < length2 ) {
-        length2 = length1;
-    }
-
-    carry = 0;
-    index = 0;
-
-    do {
-
-        temp1 = arg1[index];
-        temp2 = arg2[index];
-        temp3 = temp1 + temp2;
-        arg1[index] = temp3 + carry;
-
-        if( arg2[index] < arg1[index] ) {
-            carry = 0;
-        } else if( arg2[index] != arg1[index] ) {
-            carry = 1;
-        }
-
-    } while( ++index < length2 );
-
-    if( !carry ) {
-        return 0;
-    } else if( index == length1 ) {
-        return 1;
-    }
-
-    while( ++arg1[index] == 0 && ++index < length1 );
-
-    return (int)( index == length1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::lowestSetBit( unsigned long long* y ) {
-
-    unsigned int x;
-    int result;
-
-    if( *y == 0 ) {
-        return 0;
-    }
-
-    if( *y & 0x00000000FFFFFFFFULL ) {
-      x = BitOps::LOW_U32_FROM_LONG64_PTR( y );
-      result = 0;
-    } else {
-      x = BitOps::HIGH_U32_FROM_LONG64_PTR( y );
-      result = 32;
-    }
-
-    if( !( x & 0xFFFF ) ) {
-      x = BitOps::bitSection( x, 0xFFFF0000, 16 );
-      result += 16;
-    }
-
-    if( !( x & 0xFF) ) {
-      x = BitOps::bitSection( x, 0xFF00, 8 );
-      result += 8;
-    }
-    if( !( x & 0xF ) ) {
-      x = BitOps::bitSection( x, 0xF0, 4 );
-      result += 4;
-    }
-
-    if( x & 0x1 ) {
-        return result + 1;
-    } else if( x & 0x2 ) {
-        return result + 2;
-    } else if( x & 0x4 ) {
-        return result + 3;
-    }
-
-    return result + 4;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::timesTenToTheEHighPrecision(
-    unsigned long long* result, int length, int e ) {
-
-    // assumes result can hold value
-    unsigned long long overflow;
-    int exp10 = e;
-
-    if( e == 0 ) {
-        return length;
-    }
-
-    // Replace the current implementaion which performs a
-    // "multiplication" by 10 e number of times with an actual
-    // mulitplication. 10e19 is the largest exponent to the power of ten
-    // that will fit in a 64-bit integer, and 10e9 is the largest exponent to
-    // the power of ten that will fit in a 64-bit integer. Not sure where the
-    // break-even point is between an actual multiplication and a
-    // simpleAappendDecimalDigit() so just pick 10e3 as that point for
-    // now.
-    while( exp10 >= 19 ) {
-        overflow = simpleMultiplyHighPrecision64( result, length, BitOps::TEN_E19 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-        exp10 -= 19;
-    }
-
-    while( exp10 >= 9 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E9 );
-        if( overflow ) {
-              result[length++] = overflow;
-        }
-        exp10 -= 9;
-    }
-
-    if( exp10 == 0 ) {
-        return length;
-    } else if( exp10 == 1 ) {
-        overflow = simpleAppendDecimalDigitHighPrecision( result, length, 0 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 2 ) {
-        overflow = simpleAppendDecimalDigitHighPrecision( result, length, 0 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-        overflow = simpleAppendDecimalDigitHighPrecision( result, length, 0 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 3 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E3 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 4 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E4 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 5 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E5 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 6 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E6);
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 7 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E7 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    } else if( exp10 == 8 ) {
-        overflow = simpleMultiplyHighPrecision( result, length, BitOps::TEN_E8 );
-        if( overflow ) {
-            result[length++] = overflow;
-        }
-    }
-
-    return length;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BigInt::simpleMultiplyAddHighPrecision(
-    unsigned long long* arg1, int length,
-    unsigned long long arg2, unsigned int* result ) {
-
-    // Assumes result can hold the product and arg2 only holds 32 bits
-    // of information
-    unsigned long long product = 0;
-    int index = 0;
-    int resultIndex = 0;
-
-    do {
-
-        product =
-            ( product >> 32 ) + result[BitOps::at( resultIndex )] +
-            arg2 * BitOps::LOW_U32_FROM_LONG64_PTR( arg1 + index );
-        result[BitOps::at( resultIndex )] = BitOps::LOW_U32_FROM_LONG64( product );
-        ++resultIndex;
-
-        product =
-            ( product >> 32 ) + result[BitOps::at( resultIndex )] +
-            arg2 * BitOps::HIGH_U32_FROM_LONG64_PTR( arg1 + index );
-        result[BitOps::at( resultIndex )] = BitOps::LOW_U32_FROM_LONG64( product );
-        ++resultIndex;
-
-    } while( ++index < length );
-
-    result[BitOps::at( resultIndex )] += BitOps::HIGH_U32_FROM_LONG64( product );
-    if( result[BitOps::at( resultIndex )] < BitOps::HIGH_U32_FROM_LONG64( product ) ) {
-        // must be careful with ++ operator and macro expansion
-        ++resultIndex;
-        while( ++result[BitOps::at( resultIndex )] == 0 ) {
-            ++resultIndex;
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::highestSetBit(unsigned long long* y ) {
-
-    unsigned int x = 0;
-    int result = 0;
-
-    if( *y == 0 ) {
-        return 0;
-    }
-
-    if( *y & 0xFFFFFFFF00000000LL ) {
-        x = BitOps::HIGH_U32_FROM_LONG64_PTR(y);
-        result = 32;
-    } else {
-        x = BitOps::LOW_U32_FROM_LONG64_PTR(y);
-        result = 0;
-    }
-
-    if( x & 0xFFFF0000 )
-    {
-        x = BitOps::bitSection( x, 0xFFFF0000, 16 );
-        result += 16;
-    }
-
-    if( x & 0xFF00 ) {
-        x = BitOps::bitSection( x, 0xFF00, 8 );
-        result += 8;
-    }
-
-    if( x & 0xF0 ) {
-        x = BitOps::bitSection( x, 0xF0, 4 );
-        result += 4;
-    }
-
-    if( x > 0x7 ) {
-        return result + 4;
-    } else if( x > 0x3 ) {
-        return result + 3;
-    } else if( x > 0x1 ) {
-        return result + 2;
-    } else {
-        return result + 1;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::lowestSetBitHighPrecision( unsigned long long* arg, int length ) {
-
-    int lowBit, index = -1;
-
-    while( ++index < length ) {
-        lowBit = lowestSetBit( arg + index );
-        if( lowBit ) {
-            return lowBit + 64 * index;
-        }
-    }
-
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BigInt::simpleShiftLeftHighPrecision( unsigned long long* arg1,
-                                           int length, int arg2 ) {
-
-    // assumes length > 0
-    int index, offset = 0;
-
-    if( arg2 >= 64 ) {
-
-        offset = arg2 >> 6;
-        index = length;
-
-        while( --index - offset >= 0 ) {
-            arg1[index] = arg1[index - offset];
-        }
-
-        do {
-            arg1[index] = 0;
-        } while (--index >= 0);
-
-        arg2 &= 0x3F;
-    }
-
-    if( arg2 == 0 ) {
-        return;
-    }
-
-    while( --length > 0 ) {
-        arg1[length] = arg1[length] << arg2 | arg1[length - 1] >> (64 - arg2);
-    }
-
-    *arg1 <<= arg2;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned int BigInt::floatMantissa( float z ) {
-
-    unsigned int m = (unsigned int)Float::floatToIntBits( z );
-
-    if( ( m & BitOps::FLOAT_EXPONENT_MASK ) != 0 )
-        m = ( m & BitOps::FLOAT_MANTISSA_MASK ) | BitOps::FLOAT_NORMAL_MASK;
-    else
-        m = ( m & BitOps::FLOAT_MANTISSA_MASK );
-
-    return m;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned long long BigInt::simpleMultiplyHighPrecision64(
-    unsigned long long* arg1, int length, unsigned long long arg2 ) {
-
-    unsigned long long intermediate = 0;
-    unsigned long long* pArg1 = NULL;
-    unsigned long long carry1 = 0;
-    unsigned long long carry2 = 0;
-    unsigned long long prod1 = 0;
-    unsigned long long prod2 = 0;
-    unsigned long long sum = 0;
-    int index = 0;
-    unsigned int buf32 = 0;
-
-    // set the starting position
-    pArg1 = &( arg1[index] );
-
-    do {
-
-        if( (*pArg1 != 0) || (intermediate != 0) ) {
-
-            prod1 = (unsigned long long)BitOps::LOW_U32_FROM_LONG64(arg2) *
-                    (unsigned long long)BitOps::LOW_U32_FROM_LONG64_PTR(pArg1);
-
-            sum = intermediate + prod1;
-            if( (sum < prod1) || (sum < intermediate) ) {
-                carry1 = 1;
-            } else {
-                carry1 = 0;
-            }
-
-            prod1 = (unsigned long long)BitOps::LOW_U32_FROM_LONG64(arg2) *
-                    (unsigned long long)BitOps::HIGH_U32_FROM_LONG64_PTR(pArg1);
-            prod2 = (unsigned long long)BitOps::HIGH_U32_FROM_LONG64(arg2) *
-                    (unsigned long long)BitOps::LOW_U32_FROM_LONG64_PTR(pArg1);
-
-            intermediate = carry2 + ( sum >> 32 ) + prod1 + prod2;
-
-            if( (intermediate < prod1) || (intermediate < prod2) ) {
-                carry2 = 1;
-            } else {
-                carry2 = 0;
-            }
-
-            BitOps::LOW_U32_FROM_LONG64_PTR(pArg1) = BitOps::LOW_U32_FROM_LONG64(sum);
-            buf32 = BitOps::HIGH_U32_FROM_LONG64_PTR (pArg1);
-            BitOps::HIGH_U32_FROM_LONG64_PTR(pArg1) = BitOps::LOW_U32_FROM_LONG64(intermediate);
-            intermediate = carry1 + ( intermediate >> 32 ) +
-                           (unsigned long long)BitOps::HIGH_U32_FROM_LONG64 (arg2) *
-                           (unsigned long long)buf32;
-        }
-
-        pArg1++;
-
-    } while( ++index < length );
-
-    return intermediate;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::simpleAddHighPrecision( unsigned long long* arg1,
-                                    int length,
-                                    unsigned long long arg2 ) {
-
-    // assumes length > 0
-    int index = 1;
-
-    *arg1 += arg2;
-    if( arg2 <= *arg1 ) {
-        return 0;
-    } else if (length == 1) {
-        return 1;
-    }
-
-    while( ++arg1[index] == 0 && ++index < length );
-
-    return (int)( index == length );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BigInt::floatExponent( float z ) {
-
-    // assumes positive float
-    int k = Float::floatToIntBits( z ) >> 23;
-
-    if( k ) {
-        k -= BitOps::FLOAT_E_OFFSET;
-    } else {
-        k = 1 - BitOps::FLOAT_E_OFFSET;
-    }
-
-    return k;
-}
diff --git a/src/decaf/src/main/decaf/internal/util/BigInt.h b/src/decaf/src/main/decaf/internal/util/BigInt.h
deleted file mode 100644
index bdcbb72..0000000
--- a/src/decaf/src/main/decaf/internal/util/BigInt.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_UTIL_BIGINT_H_
-#define _DECAF_INTERNAL_UTIL_BIGINT_H_
-
-#include <decaf/util/Config.h>
-#include <apr.h>
-
-namespace decaf{
-namespace internal{
-namespace util{
-
-    class BigInt {
-    public:
-
-        BigInt();
-        virtual ~BigInt() {}
-
-        static void multiplyHighPrecision( unsigned long long* arg1,
-                                           int length1,
-                                           unsigned long long* arg2,
-                                           int length2,
-                                           unsigned long long* result,
-                                           int length );
-
-        static unsigned int simpleAppendDecimalDigitHighPrecision(
-                unsigned long long* arg1, int length, unsigned long long digit );
-
-        static double toDoubleHighPrecision( unsigned long long* arg, int length );
-
-        static int tenToTheEHighPrecision( unsigned long long * result,
-                                           int length,
-                                           int e );
-
-        static unsigned long long doubleMantissa( double z );
-
-        static int compareHighPrecision( unsigned long long* arg1,
-                                         int length1,
-                                         unsigned long long* arg2,
-                                         int length2 );
-
-        static int highestSetBitHighPrecision( unsigned long long* arg, int length );
-
-        static void subtractHighPrecision( unsigned long long* arg1,
-                                           int length1,
-                                           unsigned long long* arg2,
-                                           int length2 );
-
-        static int doubleExponent( double z );
-
-        static unsigned int simpleMultiplyHighPrecision(
-            unsigned long long* arg1, int length, unsigned long long arg2 );
-
-        static int addHighPrecision( unsigned long long* arg1,
-                                     int length1,
-                                     unsigned long long* arg2,
-                                     int length2 );
-
-        static int lowestSetBit( unsigned long long* y );
-
-        static int timesTenToTheEHighPrecision(
-            unsigned long long* result, int length, int e );
-
-        static void simpleMultiplyAddHighPrecision(
-            unsigned long long* arg1, int length,
-            unsigned long long arg2, unsigned int* result );
-
-        static int highestSetBit( unsigned long long* y );
-
-        static int lowestSetBitHighPrecision( unsigned long long* arg, int length );
-
-        static void simpleShiftLeftHighPrecision( unsigned long long* arg1,
-                                                  int length, int arg2 );
-
-        static unsigned int floatMantissa( float z );
-
-        static unsigned long long simpleMultiplyHighPrecision64(
-            unsigned long long* arg1, int length, unsigned long long arg2 );
-
-        static int simpleAddHighPrecision( unsigned long long* arg1,
-                                           int length,
-                                           unsigned long long arg2 );
-
-        static int floatExponent( float z );
-
-    };
-
-}}}
-
-#endif /*_DECAF_INTERNAL_UTIL_BIGINT_H_*/
diff --git a/src/decaf/src/main/decaf/internal/util/BitOps.cpp b/src/decaf/src/main/decaf/internal/util/BitOps.cpp
deleted file mode 100644
index d4ecc47..0000000
--- a/src/decaf/src/main/decaf/internal/util/BitOps.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#include "BitOps.h"
-
-using namespace decaf;
-using namespace decaf::internal;
-using namespace decaf::internal::util;
-
-////////////////////////////////////////////////////////////////////////////////
-BitOps::BitOps() {
-}
diff --git a/src/decaf/src/main/decaf/internal/util/BitOps.h b/src/decaf/src/main/decaf/internal/util/BitOps.h
deleted file mode 100644
index 318042e..0000000
--- a/src/decaf/src/main/decaf/internal/util/BitOps.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_UTIL_BITOPS_H_
-#define _DECAF_INTERNAL_UTIL_BITOPS_H_
-
-#include <decaf/util/Config.h>
-#include <apr.h>
-
-namespace decaf{
-namespace internal{
-namespace util{
-
-    /**
-     * Class with static methods for operation on values in bit patterns.
-     */
-    class BitOps {
-    public:
-
-        // Used to make masking easier
-        typedef union {
-            unsigned long long longValue;
-            unsigned int intValue[2];
-            int sintValue[2];
-            double doubleValue;
-        } LONG_UNION;
-
-        #ifdef APR_IS_BIGENDIAN
-            static const int HiWord = 0;
-            static const int LoWord = 1;
-        #else
-            static const int HiWord = 1;
-            static const int LoWord = 0;
-        #endif
-
-        static const unsigned long long LONG_HI_MASK = 0xFFFFFFFF00000000ULL;
-        static const unsigned long long LONG_LO_MASK = 0x00000000FFFFFFFFULL;
-        static const long long TEN_E1 = 0xALL;
-        static const long long TEN_E2 = 0x64LL;
-        static const long long TEN_E3 = 0x3E8LL;
-        static const long long TEN_E4 = 0x2710LL;
-        static const long long TEN_E5 = 0x186A0LL;
-        static const long long TEN_E6 = 0xF4240LL;
-        static const long long TEN_E7 = 0x989680LL;
-        static const long long TEN_E8 = 0x5F5E100LL;
-        static const long long TEN_E9 = 0x3B9ACA00LL;
-        static const long long TEN_E19 = 0x8AC7230489E80000LL;
-
-        static const int E_OFFSET = 1075;
-
-        static const long long INFINITE_LONGBITS = 0x7FF0000000000000LL;
-        static const int INFINITE_INTBITS = 0x7F800000;
-        static const int MINIMUM_INTBITS = 1;
-
-        static const unsigned int DOUBLE_SIGN_MASK_HI = 0x80000000;
-        static const unsigned int DOUBLE_EXPONENT_MASK_HI = 0x7FF00000;
-        static const unsigned int DOUBLE_MANTISSA_MASK_LO = 0xFFFFFFFF;
-        static const unsigned int DOUBLE_MANTISSA_MASK_HI = 0x000FFFFF;
-        static const unsigned int SINGLE_SIGN_MASK = 0x80000000;
-        static const unsigned int SINGLE_EXPONENT_MASK	= 0x7F800000;
-        static const unsigned int SINGLE_MANTISSA_MASK	= 0x007FFFFF;
-        static const unsigned int SINGLE_NAN_BITS = (SINGLE_EXPONENT_MASK | 0x00400000);
-
-        static const unsigned long long MANTISSA_MASK = 0x000FFFFFFFFFFFFFULL;
-        static const unsigned long long EXPONENT_MASK = 0x7FF0000000000000ULL;
-        static const unsigned long long NORMAL_MASK = 0x0010000000000000ULL;
-        static const unsigned long long SIGN_MASK = 0x8000000000000000ULL;
-        static const unsigned int FLOAT_MANTISSA_MASK = 0x007FFFFF;
-        static const unsigned int FLOAT_EXPONENT_MASK = 0x7F800000;
-        static const unsigned int FLOAT_NORMAL_MASK = 0x00800000;
-        static const unsigned int FLOAT_E_OFFSET = 150;
-
-    public:
-
-        BitOps();
-        virtual ~BitOps() {}
-
-    public:  // Statics
-
-        static unsigned int TIMES_TEN( unsigned int x ) {
-            return ((x) << 3) + ((x) << 1);
-        }
-
-        static unsigned long long TIMES_TEN( unsigned long long x ) {
-            return ((x) << 3) + ((x) << 1);
-        }
-
-        static unsigned long long CREATE_DOUBLE_BITS(
-            unsigned long long normalizedM, unsigned long long e ) {
-
-            return ( normalizedM & MANTISSA_MASK ) | ( ( e + E_OFFSET ) << 52 );
-        }
-
-        static unsigned long long CREATE_DOUBLE_BITS(
-            unsigned long long* normalizedM, int index, unsigned long long e ) {
-
-            return ( normalizedM[index] & MANTISSA_MASK ) | ( ( e + E_OFFSET ) << 52 );
-        }
-
-        static unsigned long long bitSection(
-            unsigned long long x, unsigned long long mask, int shift ) {
-
-            return ( x & mask ) >> shift;
-        }
-        static unsigned int bitSection(
-            unsigned int x, unsigned int mask, int shift ) {
-
-            return ( x & mask ) >> shift;
-        }
-
-        static unsigned int& LOW_U32_FROM_LONG64( unsigned long long long64 ) {
-            return LOW_U32_FROM_LONG64_PTR( &long64 );
-        }
-
-        static unsigned int& HIGH_U32_FROM_LONG64( unsigned long long long64 ) {
-            return HIGH_U32_FROM_LONG64_PTR( &long64 );
-        }
-
-        static int& LOW_I32_FROM_LONG64( unsigned long long long64 ) {
-            return LOW_I32_FROM_LONG64_PTR( &long64 );
-        }
-
-        static int& HIGH_I32_FROM_LONG64( unsigned long long long64 ) {
-            return HIGH_I32_FROM_LONG64_PTR( &long64 );
-        }
-
-        static unsigned int& LOW_U32_FROM_LONG64_PTR( unsigned long long* long64ptr ) {
-            return ( (LONG_UNION*)long64ptr )->intValue[LoWord];
-        }
-
-        static unsigned int& HIGH_U32_FROM_LONG64_PTR( unsigned long long* long64ptr ) {
-            return ( (LONG_UNION*)long64ptr )->intValue[HiWord];
-        }
-
-        static int& LOW_I32_FROM_LONG64_PTR( unsigned long long* long64ptr ) {
-            return ( (LONG_UNION*)long64ptr )->sintValue[LoWord];
-        }
-
-        static int& HIGH_I32_FROM_LONG64_PTR( unsigned long long* long64ptr ) {
-            return ( (LONG_UNION*)long64ptr )->sintValue[HiWord];
-        }
-
-        static bool IS_DENORMAL_DBL( double dbl ) {
-            return IS_DENORMAL_DBL_PTR( &dbl );
-        }
-
-        static bool IS_DENORMAL_DBL_PTR(double* dblptr ) {
-            return (((HIGH_U32_FROM_DBL_PTR(dblptr) & DOUBLE_EXPONENT_MASK_HI) == 0) &&
-                    ((HIGH_U32_FROM_DBL_PTR(dblptr) & DOUBLE_MANTISSA_MASK_HI) != 0 ||
-                    (LOW_U32_FROM_DBL_PTR(dblptr) != 0)));
-        }
-
-        static unsigned int& LOW_U32_FROM_DBL_PTR( double* dblptr ) {
-            return ( ( (LONG_UNION*)dblptr )->intValue[LoWord] );
-        }
-
-        static unsigned int& HIGH_U32_FROM_DBL_PTR( double* dblptr ) {
-            return ( ( (LONG_UNION*)dblptr )->intValue[HiWord] );
-        }
-
-        static int& LOW_I32_FROM_DBL_PTR( double* dblptr ) {
-            return ( ( (LONG_UNION*)dblptr )->sintValue[LoWord] );
-        }
-
-        static int& HIGH_I32_FROM_DBL_PTR( double* dblptr ) {
-            return ( ( (LONG_UNION*)dblptr )->sintValue[HiWord] );
-        }
-
-        static unsigned int& LOW_U32_FROM_DBL( double dbl ) {
-            return LOW_U32_FROM_DBL_PTR( &dbl );
-        }
-
-        static unsigned int& HIGH_U32_FROM_DBL( double dbl ) {
-            return HIGH_U32_FROM_DBL_PTR( &dbl );
-        }
-
-        static int& LOW_I32_FROM_DBL( double dbl ) {
-            return LOW_I32_FROM_DBL_PTR( &dbl );
-        }
-
-        static int& HIGH_I32_FROM_DBL( double dbl ) {
-            return HIGH_I32_FROM_DBL_PTR( &dbl );
-        }
-
-        static unsigned int at( unsigned int i ) {
-            #ifdef APR_IS_BIGENDIAN
-                return i^1;
-            #else
-                return i;
-            #endif
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_INTERNAL_UTIL_BITOPS_H_*/
diff --git a/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp b/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp
deleted file mode 100644
index c720d86..0000000
--- a/src/decaf/src/main/decaf/internal/util/FloatingPointParser.cpp
+++ /dev/null
@@ -1,846 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#include "FloatingPointParser.h"
-#include <decaf/lang/Math.h>
-#include <decaf/lang/Integer.h>
-#include <decaf/lang/Long.h>
-#include <decaf/lang/Float.h>
-#include <decaf/lang/Double.h>
-#include <decaf/lang/Character.h>
-#include <decaf/internal/util/HexStringParser.h>
-#include <decaf/internal/util/BigInt.h>
-#include <decaf/internal/util/BitOps.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <apr_lib.h>
-#include <errno.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::internal;
-using namespace decaf::internal::util;
-
-////////////////////////////////////////////////////////////////////////////////
-const int FloatingPointParser::tens[11] = {
-  0x3f800000,
-  0x41200000,
-  0x42c80000,
-  0x447a0000,
-  0x461c4000,
-  0x47c35000,
-  0x49742400,
-  0x4b189680,
-  0x4cbebc20,
-  0x4e6e6b28,
-  0x501502f9                    /* 10 ^ 10 in float */
-};
-
-////////////////////////////////////////////////////////////////////////////////
-double FloatingPointParser::parseDblImpl( const std::string& value, int exp )
-    throw ( exceptions::NumberFormatException ) {
-
-    // assumes s is a null terminated string with at least one
-    // character in it
-    unsigned long long def[17] = {0};
-    unsigned long long defBackup[17] = {0};
-    unsigned long long* f = def;
-    unsigned long long* fNoOverflow = defBackup;
-    unsigned long long* tempBackup = NULL;
-    unsigned int overflow = 0;
-    unsigned long long result = 0;
-    int index = 1;
-    int unprocessedDigits = 0;
-    std::string::const_iterator valItr = value.begin();
-
-    do {
-
-        if( Character::isDigit( *valItr ) ) {
-
-            // Make a back up of f before appending, so that we can
-            // back out of it if there is no more room, i.e. index >
-            // MAX_ACCURACY_WIDTH.
-
-            memcpy( fNoOverflow, f, sizeof(unsigned long long) * index );
-            overflow = BigInt::simpleAppendDecimalDigitHighPrecision(
-                    f, index, *valItr - '0' );
-
-            if( overflow ) {
-                f[index++] = overflow;
-                /* There is an overflow, but there is no more room
-                 * to store the result. We really only need the top 52
-                 * bits anyway, so we must back out of the overflow,
-                 * and ignore the rest of the string.
-                 */
-                if( index >= MAX_ACCURACY_WIDTH ) {
-                    index--;
-                    memcpy( f, fNoOverflow, sizeof(unsigned long long) * index);
-                    break;
-                }
-
-                if( tempBackup ) {
-                    fNoOverflow = tempBackup;
-                }
-            }
-        } else {
-            // Bad chars in the string
-            BitOps::LOW_I32_FROM_LONG64( result ) = -1;
-            BitOps::HIGH_I32_FROM_LONG64( result ) = -1;
-            return Double::longBitsToDouble( result );
-        }
-
-    } while( ++valItr != value.end() );
-
-    // We've broken out of the parse loop either because we've reached
-    // the end of the string or we've overflowed the maximum accuracy
-    // limit of a double. If we still have unprocessed digits in the
-    // given string, then there are three possible results:
-    //   1. (unprocessed digits + e) == 0, in which case we simply
-    //      convert the existing bits that are already parsed
-    //   2. (unprocessed digits + e) < 0, in which case we simply
-    //      convert the existing bits that are already parsed along
-    //      with the given e
-    //   3. (unprocessed digits + e) > 0 indicates that the value is
-    //      simply too big to be stored as a double, so return Infinity
-    if( ( unprocessedDigits = value.length() ) > 0 ) {
-
-        exp += unprocessedDigits;
-        if( exp == 0 ) {
-            return BigInt::toDoubleHighPrecision( f, index );
-        } else if( exp < 0 ) {
-            return BitOps::CREATE_DOUBLE_BITS( f, index, exp );
-        } else {
-            result = BitOps::INFINITE_LONGBITS;
-        }
-
-    } else {
-
-        if( exp == 0 ) {
-            return BigInt::toDoubleHighPrecision( f, index );
-        } else {
-            return BitOps::CREATE_DOUBLE_BITS( f, index, exp );
-        }
-    }
-
-    return Double::longBitsToDouble( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float FloatingPointParser::parseFltImpl( const std::string& value, int exp )
-    throw ( exceptions::NumberFormatException ) {
-
-    float result = FloatingPointParser::createFloat( value, exp );
-
-std::cout << std::endl
-          << "DEBUG - FloatingPointParser::parseFltImpl - "
-          << "createFloat returned = " << result << std::endl;
-
-    if( Float::floatToIntBits( result ) >= 0 ) {
-        return result;
-    } else if( Float::floatToIntBits( result ) == -1 ) {
-      throw exceptions::NumberFormatException(
-          __FILE__, __LINE__,
-          "FloatingPointParser::parseFltImpl - Not a valid float string",
-          value.c_str() );
-    }
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-FloatingPointParser::StringExponentPair FloatingPointParser::initialParse(
-    const std::string& value, int length ) throw ( exceptions::NumberFormatException ){
-
-    std::string newValue = value;
-    bool negative = false;
-    char c;
-    int start = 0;
-    int end = 0;
-    int decimal = 0;
-    int e = 0;
-
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::initialParse - Invalid zero length string");
-    }
-
-    c = newValue[length - 1];
-    if( c == 'D' || c == 'd' || c == 'F' || c == 'f') {
-        length--;
-        if( length == 0 ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "FloatingPointParser::initialParse - Invalid zero length string");
-        }
-    }
-
-    end = Math::max( (int)newValue.find_first_of( 'E' ),
-                     (int)newValue.find_first_of( 'e' ) );
-
-    if( (std::size_t)end != string::npos ) {
-
-        if( end + 1 == length ) {
-            if( length == 0 ) {
-                throw exceptions::NumberFormatException(
-                    __FILE__, __LINE__,
-                    "FloatingPointParser::initialParse - Invalid no data after e",
-                    newValue.c_str() );
-            }
-        }
-
-        int exponent_offset = end + 1;
-
-        if( newValue[exponent_offset] == '+' ) {
-            if( newValue[exponent_offset + 1] == '-' ) {
-                if( length == 0 ) {
-                    throw exceptions::NumberFormatException(
-                        __FILE__, __LINE__,
-                        "FloatingPointParser::initialParse - "
-                        "Invalid length string");
-                }
-            }
-            exponent_offset++; // skip the plus sign
-        }
-
-        try {
-            e = Integer::parseInt( newValue.substr( exponent_offset, length ) );
-        } catch( exceptions::NumberFormatException ex ) {
-            // ex contains the exponent substring only so throw a
-            // new exception with the correct string
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "FloatingPointParser::initialParse - "
-                "exponent string is not valid" );
-        }
-
-    } else {
-        end = length;
-    }
-
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::initialParse - "
-            "invalid length string", newValue.c_str() );
-    }
-
-    c = newValue[start];
-
-    if( c == '-') {
-        ++start;
-        --length;
-        negative = true;
-    } else if( c == '+' ) {
-        ++start;
-        --length;
-    }
-
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::initialParse - "
-            "invalid length string", newValue.c_str() );
-    }
-
-    decimal = newValue.find_first_of( '.' );
-    if( decimal > -1 ) {
-        e -= end - decimal - 1;
-        newValue = newValue.substr( start, decimal ) + newValue.substr( decimal + 1, end );
-    } else {
-        newValue = newValue.substr( start, end );
-    }
-
-    if( ( length = newValue.length() ) == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::initialParse - "
-            "invalid length string", newValue.c_str() );
-    }
-
-    end = length;
-    while( end > 1 && newValue[end - 1] == '0' ) {
-        --end;
-    }
-
-    start = 0;
-    while( start < end - 1 && newValue[start] == '0' ) {
-        start++;
-    }
-
-    if( end != length || start != 0 ) {
-        e += length - end;
-        newValue = newValue.substr( start, end );
-    }
-
-    return StringExponentPair( newValue, e, negative );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double FloatingPointParser::parseDblName(
-    const std::string& namedDouble, int length )
-        throw( exceptions::NumberFormatException ) {
-
-    // Valid strings are only +Nan, NaN, -Nan, +Infinity, Infinity,
-    // -Infinity.
-    if( (length != 3) && ( length != 4) && ( length != 8) && ( length != 9 ) ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::parseDblName - "
-            "invalid name string", namedDouble.c_str() );
-    }
-
-    bool negative = namedDouble.at(0) == '-' ? true : false;
-
-    if( namedDouble.find( "Infinity" ) != string::npos ) {
-        return negative ? Double::NEGATIVE_INFINITY : Float::POSITIVE_INFINITY;
-    }
-
-    if( namedDouble.find( "NaN" ) != string::npos ) {
-        return Double::NaN;
-    }
-
-    throw exceptions::NumberFormatException(
-        __FILE__, __LINE__,
-        "FloatingPointParser::parseDblName - "
-        "invalid name string", namedDouble.c_str() );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float FloatingPointParser::parseFltName(
-    const std::string& namedFloat, int length )
-        throw( exceptions::NumberFormatException ) {
-
-    // Valid strings are only +Nan, NaN, -Nan, +Infinity, Infinity,
-    // -Infinity.
-    if( ( length != 3 ) && ( length != 4 ) && ( length != 8 ) && ( length != 9 ) ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::parseFltName - "
-            "invalid name string", namedFloat.c_str() );
-    }
-
-    bool negative = namedFloat.at(0) == '-' ? true : false;
-
-    if( namedFloat.find( "Infinitiy" ) != string::npos ) {
-        return negative ? Float::NEGATIVE_INFINITY : Float::POSITIVE_INFINITY;
-    }
-
-    if( namedFloat.find( "NaN" ) != string::npos ) {
-        return Float::NaN;
-    }
-
-    throw exceptions::NumberFormatException(
-        __FILE__, __LINE__,
-        "FloatingPointParser::parseFltName - "
-        "invalid name string", namedFloat.c_str() );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double FloatingPointParser::parseDouble( const std::string& value )
-    throw( exceptions::NumberFormatException ) {
-
-    std::string newValue = value;
-    FloatingPointParser::trim( newValue );
-    int length = newValue.length();
-
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::parseDouble - "
-            "invalid length string", value.c_str() );
-    }
-
-    // See if this could be a named double
-    char last = newValue[length - 1];
-
-    if( (last == 'y') || (last == 'N') ) {
-        return parseDblName( newValue, length );
-    }
-
-    // See if it could be a hexadecimal representation
-    if( toLowerCase( newValue ).find( "0x" ) != string::npos ) {
-        return HexStringParser::parseDouble(value);
-    }
-
-    StringExponentPair info = initialParse(value, length);
-
-    double result = parseDblImpl( info.value, info.exp );
-
-    if( info.negative ) {
-        result = -result;
-    }
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float FloatingPointParser::parseFloat( const std::string& value )
-    throw( exceptions::NumberFormatException ) {
-
-    std::string newValue = value;
-    FloatingPointParser::trim( newValue );
-
-    int length = newValue.length();
-
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "FloatingPointParser::parseFloat - "
-            "invalid length string", value.c_str() );
-    }
-
-    // See if this could be a named float
-    char last = newValue[length - 1];
-    if( (last == 'y') || (last == 'N') ) {
-        return parseFltName( value, length );
-    }
-
-    // See if it could be a hexadecimal representation
-    if( toLowerCase( newValue ).find( "0x" ) != string::npos ) {
-        return HexStringParser::parseFloat( newValue );
-    }
-
-    StringExponentPair info = initialParse( newValue, length );
-
-std::cout << std::endl
-          << "DEBUG - FloatingPointParser::parseFloat - "
-          << "newValue = " << newValue << ", length = " << length;
-
-    float result = parseFltImpl( info.value, info.exp );
-    if( info.negative ) {
-        result = -result;
-    }
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string& FloatingPointParser::trim( std::string& value ) {
-
-    // trim leading whitespace
-    string::size_type notwhite = value.find_first_not_of( " \t\r\n" );
-    value.erase( 0, notwhite );
-
-    // trim trailing whitespace
-    notwhite = value.find_last_not_of( " \t\r\n" );
-    value.erase( notwhite+1 );
-
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string& FloatingPointParser::toLowerCase( std::string& value ) {
-
-    string::size_type index = 0;
-
-    for( ; index < value.size(); ++index ) {
-        if( Character::isLetter( value[index] ) ) {
-            value[index] = apr_tolower( value[index] );
-        }
-    }
-
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float FloatingPointParser::createFloat( const std::string&s, int exp ) {
-
-    // assumes s is a null terminated string with at least one
-    // character in it
-    unsigned long long def[DEFAULT_WIDTH] = {0};
-    unsigned long long defBackup[DEFAULT_WIDTH] = {0};
-    unsigned long long* f = def;
-    unsigned long long* fNoOverflow = defBackup;
-    unsigned long long* tempBackup = NULL;
-    unsigned int overflow = 0;
-    unsigned int result = 0;
-    int index = 1;
-    int unprocessedDigits = 0;
-    std::string::const_iterator sIter = s.begin();
-
-    do {
-
-        if( Character::isDigit( *sIter ) ) {
-
-std::cout << std::endl
-          << "DEBUG - FloatingPointParser::createFloat - "
-          << "current digint ASCII = " << *sIter
-          << ", value = " << *sIter - '0';
-
-            // Make a back up of f before appending, so that we can
-            // back out of it if there is no more room, i.e. index >
-            // MAX_ACCURACY_WIDTH.
-            memcpy( fNoOverflow, f, sizeof(unsigned long long) * index );
-            overflow = BigInt::simpleAppendDecimalDigitHighPrecision(
-                    f, index, *sIter - '0' );
-
-std::cout << std::endl
-          << "DEBUG - FloatingPointParser::createFloat - "
-          << "f[index] = " << f[index]
-          << ", overflow ? = " << overflow;
-
-            if( overflow ) {
-
-                f[index++] = overflow;
-
-                // There is an overflow, but there is no more room
-                // to store the result. We really only need the top 52
-                // bits anyway, so we must back out of the overflow,
-                // and ignore the rest of the string.
-                if( index >= MAX_ACCURACY_WIDTH ) {
-                    index--;
-                    memcpy( f, fNoOverflow, sizeof(unsigned long long)* index );
-                    break;
-                }
-
-                if( tempBackup ) {
-                  fNoOverflow = tempBackup;
-                }
-            }
-        } else {
-            // String contained invalid characters
-            return -1;
-        }
-    } while( ++sIter != s.end() );
-
-    // We've broken out of the parse loop either because we've reached
-    // the end of the string or we've overflowed the maximum accuracy
-    // limit of a double. If we still have unprocessed digits in the
-    // given string, then there are three possible results:
-    //   1. (unprocessed digits + e) == 0, in which case we simply
-    //      convert the existing bits that are already parsed
-    //   2. (unprocessed digits + e) < 0, in which case we simply
-    //      convert the existing bits that are already parsed along
-    //      with the given e
-    //   3. (unprocessed digits + e) > 0 indicates that the value is
-    //      simply too big to be stored as a double, so return Infinity
-    if( ( unprocessedDigits = std::distance( sIter, s.end() ) ) > 0 ) {
-
-        exp += unprocessedDigits;
-
-        if( exp <= 0 ) {
-            return createFloat1( f, index, exp );
-        } else {
-            result = BitOps::INFINITE_INTBITS;
-        }
-
-    } else {
-        return createFloat1( f, index, exp );
-    }
-
-    return Float::intBitsToFloat( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float FloatingPointParser::createFloat1( unsigned long long* f, int length, int exp ) {
-
-    int numBits = BigInt::highestSetBitHighPrecision( f, length ) + 1;
-    double dresult = 0.0;
-    int result = 0;
-
-    numBits -= BigInt::lowestSetBitHighPrecision( f, length );
-
-    if( numBits < 25 && exp >= 0 && exp < LOG5_OF_TWO_TO_THE_N ) {
-        return Float::intBitsToFloat( BitOps::LOW_I32_FROM_LONG64_PTR( f ) ) *
-               Float::intBitsToFloat( tenToTheE( exp ) );
-    } else if( numBits < 25 && exp < 0 && (-exp) < LOG5_OF_TWO_TO_THE_N ) {
-        return Float::intBitsToFloat( BitOps::LOW_I32_FROM_LONG64_PTR( f ) ) *
-               Float::intBitsToFloat( tenToTheE( -exp ) );
-    } else if (exp >= 0 && exp < 39) {
-        result = Float::floatToIntBits(
-            (float)( BigInt::toDoubleHighPrecision( f, length ) * Math::pow( 10.0, exp ) ) );
-    } else if( exp >= 39 ) {
-        // Convert the partial result to make sure that the
-        // non-exponential part is not zero. This check fixes the case
-        // where the user enters 0.0e309!
-        dresult = BigInt::toDoubleHighPrecision( f, length );
-
-        if( dresult == 0.0 ) {
-            result = BitOps::MINIMUM_INTBITS;
-        } else {
-            result = BitOps::INFINITE_INTBITS;
-        }
-
-    } else if( exp > -309 ) {
-
-        int dexp;
-        unsigned int fmant, fovfl;
-        unsigned long long dmant;
-        dresult = BigInt::toDoubleHighPrecision( f, length ) / Math::pow( 10.0, -exp );
-
-        if( BitOps::IS_DENORMAL_DBL( dresult ) ) {
-            return 0.0f;
-        }
-
-        dexp = BigInt::doubleExponent( dresult ) + 51;
-        dmant = BigInt::doubleMantissa( dresult );
-
-        // Is it too small to be represented by a single-precision
-        // float?
-        if( dexp <= -155 ) {
-            return 0.0f;
-        }
-
-        // Is it a denormalized single-precision float?
-        if( (dexp <= -127) && (dexp > -155) ) {
-
-            // Only interested in 24 msb bits of the 53-bit double mantissa
-            fmant = (unsigned int) (dmant >> 29);
-            fovfl = ((unsigned int) (dmant & 0x1FFFFFFF)) << 3;
-
-            while( (dexp < -127) && ((fmant | fovfl) != 0) ) {
-                if( (fmant & 1) != 0 ) {
-                    fovfl |= 0x80000000;
-                }
-                fovfl >>= 1;
-                fmant >>= 1;
-                dexp++;
-            }
-
-            if( (fovfl & 0x80000000) != 0) {
-                if( (fovfl & 0x7FFFFFFC) != 0 ) {
-                    fmant++;
-                } else if( (fmant & 1) != 0 ) {
-                    fmant++;
-                }
-            } else if( (fovfl & 0x40000000) != 0 ) {
-
-                if( (fovfl & 0x3FFFFFFC) != 0 ) {
-                    fmant++;
-                }
-            }
-
-            result = fmant;
-        } else {
-            result = Float::floatToIntBits( (float)dresult );
-        }
-    }
-
-    // Don't go straight to zero as the fact that x*0 = 0 independent
-    // of x might cause the algorithm to produce an incorrect result.
-    // Instead try the min  value first and let it fall to zero if need be.
-    if( exp <= -309 || result == 0 ) {
-        result = BitOps::MINIMUM_INTBITS;
-    }
-
-    return floatAlgorithm( f, length, exp, Float::intBitsToFloat( result ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float FloatingPointParser::floatAlgorithm(
-    unsigned long long* f, int length, int exp, float z ) {
-
-    unsigned long long m = 0;
-    int k = 0;
-    int comparison = 0;
-    int comparison2 = 0;
-    unsigned long long* x = NULL;
-    unsigned long long* y = NULL;
-    unsigned long long* D = NULL;
-    unsigned long long* D2 = NULL;
-    int xLength = 0;
-    int yLength = 0;
-    int DLength = 0;
-    int D2Length = 0;
-    int decApproxCount = 0;
-    int incApproxCount = 0;
-    int result = Float::floatToIntBits( z );
-
-    do {
-
-        m = BigInt::floatMantissa( z );
-        k = BigInt::floatExponent( z );
-
-        if( exp >= 0 && k >= 0 ) {
-
-            xLength = sizeOfTenToTheE( exp ) + length;
-            x = new unsigned long long[xLength];
-            memset( x + length, 0, sizeof(unsigned long long) * (xLength - length) );
-            memcpy( x, f, sizeof(unsigned long long) * length );
-            BigInt::timesTenToTheEHighPrecision( x, xLength, exp );
-
-            yLength = (k >> 6) + 2;
-            y = new unsigned long long[yLength];
-            memset( y + 1, 0, sizeof(unsigned long long) * (yLength - 1) );
-            *y = m;
-            BigInt::simpleShiftLeftHighPrecision (y, yLength, k);
-
-        } else if( exp >= 0 ) {
-
-            xLength = sizeOfTenToTheE (exp) + length + ((-k) >> 6) + 1;
-            x = new unsigned long long[xLength];
-            memset( x + length, 0, sizeof(unsigned long long) * (xLength - length) );
-            memcpy( x, f, sizeof(unsigned long long) * length );
-            BigInt::timesTenToTheEHighPrecision( x, xLength, exp );
-            BigInt::simpleShiftLeftHighPrecision( x, xLength, -k );
-
-            yLength = 1;
-            y = new unsigned long long[yLength];
-            *y = m;
-
-        } else if( k >= 0 ) {
-
-            xLength = length;
-            x = f;
-
-            yLength = sizeOfTenToTheE( -exp ) + 2 + ( k >> 6 );
-            y = new unsigned long long[yLength];
-            memset( y + 1, 0, sizeof(unsigned long long) * (yLength - 1)) ;
-            *y = m;
-            BigInt::timesTenToTheEHighPrecision( y, yLength, -exp );
-            BigInt::simpleShiftLeftHighPrecision( y, yLength, k );
-
-        } else {
-
-            xLength = length + ((-k) >> 6) + 1;
-            x = new unsigned long long[xLength];
-            memset( x + length, 0, sizeof(unsigned long long) * (xLength - length) );
-            memcpy( x, f, sizeof(unsigned long long) * length );
-            BigInt::simpleShiftLeftHighPrecision( x, xLength, -k );
-
-            yLength = sizeOfTenToTheE( -exp ) + 1;
-            y = new unsigned long long[yLength];
-            memset( y + 1, 0, sizeof(unsigned long long) * (yLength - 1) );
-            *y = m;
-            BigInt::timesTenToTheEHighPrecision( y, yLength, -exp );
-        }
-
-        comparison = BigInt::compareHighPrecision( x, xLength, y, yLength );
-        if( comparison > 0 ) {
-            // x > y
-            DLength = xLength;
-            D = new unsigned long long[DLength];
-            memcpy( D, x, DLength * sizeof(unsigned long long) );
-            BigInt::subtractHighPrecision( D, DLength, y, yLength );
-        } else if( comparison ) {
-            // y > x
-            DLength = yLength;
-            D = new unsigned long long[DLength];
-            memcpy (D, y, DLength * sizeof (unsigned long long));
-            BigInt::subtractHighPrecision( D, DLength, x, xLength );
-        } else {
-            /* y == x */
-            DLength = 1;
-            D = new unsigned long long[DLength];
-            *D = 0;
-        }
-
-        D2Length = DLength + 1;
-        D = new unsigned long long[DLength];
-        m <<= 1;
-        BigInt::multiplyHighPrecision( D, DLength, &m, 1, D2, D2Length );
-        m >>= 1;
-
-        comparison2 = BigInt::compareHighPrecision( D2, D2Length, y, yLength );
-        if( comparison2 < 0 ) {
-            if( comparison < 0 && m == BitOps::NORMAL_MASK ) {
-
-                BigInt::simpleShiftLeftHighPrecision( D2, D2Length, 1 );
-                if( BigInt::compareHighPrecision( D2, D2Length, y, yLength) > 0 ) {
-                    --result;
-                    decApproxCount++;
-                    if( ( incApproxCount > 2 ) && ( decApproxCount > 2 ) ) {
-                        if( decApproxCount > incApproxCount ) {
-                            result += decApproxCount - incApproxCount;
-                        } else if( incApproxCount > decApproxCount ) {
-                            result -= incApproxCount - decApproxCount;
-                        }
-                        break;
-                    }
-                } else {
-                    break;
-                }
-            } else {
-                break;
-            }
-        } else if( comparison2 == 0 ) {
-
-            if( (m & 1) == 0 ) {
-                if( comparison < 0 && m == BitOps::NORMAL_MASK ) {
-                    --result;
-                    decApproxCount++;
-                    if( ( incApproxCount > 2 ) && ( decApproxCount > 2 ) ) {
-                        if( decApproxCount > incApproxCount ) {
-                            result += decApproxCount - incApproxCount;
-                        } else if( incApproxCount > decApproxCount ) {
-                            result -= incApproxCount - decApproxCount;
-                        }
-                        break;
-                    }
-                } else {
-                    break;
-                }
-            } else if( comparison < 0 ) {
-                --result;
-                decApproxCount++;
-                if( ( incApproxCount > 2 ) && ( decApproxCount > 2 ) ) {
-                    if( decApproxCount > incApproxCount ) {
-                        result += decApproxCount - incApproxCount;
-                    } else if( incApproxCount > decApproxCount ) {
-                        result -= incApproxCount - decApproxCount;
-                    }
-                    break;
-                }
-                break;
-            } else {
-                ++result;
-                incApproxCount++;
-                if( ( incApproxCount > 2 ) && ( decApproxCount > 2 ) ) {
-                    if( decApproxCount > incApproxCount ) {
-                        result += decApproxCount - incApproxCount;
-                    } else if( incApproxCount > decApproxCount ) {
-                        result -= incApproxCount - decApproxCount;
-                    }
-                }
-                break;
-            }
-        } else if( comparison < 0 ) {
-            --result;
-            decApproxCount++;
-            if( ( incApproxCount > 2 ) && ( decApproxCount > 2 ) ) {
-                if( decApproxCount > incApproxCount ) {
-                    result += decApproxCount - incApproxCount;
-                } else if( incApproxCount > decApproxCount ) {
-                    result -= incApproxCount - decApproxCount;
-                }
-                break;
-            }
-        } else {
-              if( (unsigned int)result == BitOps::FLOAT_EXPONENT_MASK ) {
-                  break;
-              }
-
-              if( ( incApproxCount > 2 ) && ( decApproxCount > 2 ) ) {
-                  if( decApproxCount > incApproxCount ) {
-                      result += decApproxCount - incApproxCount;
-                  } else if( incApproxCount > decApproxCount ) {
-                      result -= incApproxCount - decApproxCount;
-                  }
-                  break;
-              }
-        }
-    }
-    while( true );
-
-    delete x;
-    delete y;
-    delete D;
-    delete D2;
-
-    return Float::intBitsToFloat( result );
-}
diff --git a/src/decaf/src/main/decaf/internal/util/FloatingPointParser.h b/src/decaf/src/main/decaf/internal/util/FloatingPointParser.h
deleted file mode 100644
index f30d5ad..0000000
--- a/src/decaf/src/main/decaf/internal/util/FloatingPointParser.h
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_UTIL_FLOATINGPOINTPARSER_H_
-#define _DECAF_INTERNAL_UTIL_FLOATINGPOINTPARSER_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <string>
-
-namespace decaf{
-namespace internal{
-namespace util{
-
-    /**
-     * Used to parse a string and return either a single or double precision
-     * floating point number.
-     */
-    class FloatingPointParser {
-    private:
-
-        class StringExponentPair {
-        public:
-
-            std::string value;
-            int exp;
-            bool negative;
-
-            StringExponentPair( const std::string value, int exp, bool negative ) {
-                this->value = value;
-                this->exp = exp;
-                this->negative = negative;
-            }
-        };
-
-        static const int MAX_ACCURACY_WIDTH = 17;
-        static const int DEFAULT_WIDTH = MAX_ACCURACY_WIDTH;
-        static const int LOG5_OF_TWO_TO_THE_N = 11;
-
-        static const int tens[11];
-
-    public:
-
-        virtual ~FloatingPointParser() {}
-
-    public:
-
-        /**
-         * Returns the closest double value to the real number in the string.
-         * @param value - the String that will be parsed to a floating point
-         * @return the double closest to the real number
-         * @exception NumberFormatException if value is not a valid Number
-         */
-        static double parseDouble( const std::string& value )
-            throw ( lang::exceptions::NumberFormatException );
-
-        /**
-         * Returns the closest float value to the real number in the string.
-         * @param value - the String that will be parsed to a floating point
-         * @return the float closest to the real number
-         * @exception NumberFormatException if value is not a valid Number
-         */
-        static float parseFloat( const std::string& value )
-            throw ( lang::exceptions::NumberFormatException );
-
-    private:
-
-        static int sizeOfTenToTheE( int e) {
-            return ( e / 19 ) + 1;
-        }
-
-        /**
-         * Takes a String and an integer exponent. The String should hold a positive
-         * integer value (or zero). The exponent will be used to calculate the
-         * floating point number by taking the positive integer the String
-         * represents and multiplying by 10 raised to the power of the of the
-         * exponent. Returns the closest double value to the real number
-         * @param value - the String that will be parsed to a floating point
-         * @param exp - an int represent the 10 to part
-         * @return the double closest to the real number
-         * @exception NumberFormatException if string isn't a valid number
-         */
-        static double parseDblImpl( const std::string& value, int exp )
-            throw ( lang::exceptions::NumberFormatException );
-
-        /**
-         * Takes a String and an integer exponent. The String should hold a positive
-         * integer value (or zero). The exponent will be used to calculate the
-         * floating point number by taking the positive integer the String
-         * represents and multiplying by 10 raised to the power of the of the
-         * exponent. Returns the closest float value to the real number
-         * @param value - the String that will be parsed to a floating point
-         * @param exp - an int represent the 10 to part
-         * @return the float closest to the real number
-         * @exception NumberFormatException fi the string is not a valid number
-         */
-        static float parseFltImpl( const std::string& value, int exp )
-            throw ( lang::exceptions::NumberFormatException );
-
-        /**
-         * Takes a String and does some initial parsing. Should return a
-         * StringExponentPair containing a String with no leading or trailing white
-         * space and trailing zeroes eliminated. The exponent of the
-         * StringExponentPair will be used to calculate the floating point number by
-         * taking the positive integer the String represents and multiplying by 10
-         * raised to the power of the of the exponent.
-         * @param value - the String that will be parsed to a floating point
-         * @param length - the length of s
-         * @return a StringExponentPair with necessary values
-         * @exception NumberFormatException
-         */
-        static StringExponentPair initialParse( const std::string& value, int length )
-            throw ( lang::exceptions::NumberFormatException );
-
-        /*
-         * Assumes the string is trimmed.
-         * @param value - the String that will be parsed to a floating point
-         * @param length - the length of s
-         * @return the parsed double
-         * @exception NumberFormatException
-         */
-        static double parseDblName( const std::string& namedDouble, int length )
-            throw ( lang::exceptions::NumberFormatException );
-
-        /*
-         * Assumes the string is trimmed.
-         * @param value - the String that will be parsed to a floating point
-         * @param length - the length of s
-         * @return the parsed double
-         * @exception NumberFormatException
-         */
-        static float parseFltName( const std::string& namedFloat, int length )
-            throw ( lang::exceptions::NumberFormatException );
-
-        /**
-         * Trims the leading and trailing whitespace from a string
-         * @param value - reference to the string to trim
-         * @param returns a reference to the string passed for chaining
-         */
-        static std::string& trim( std::string& value );
-
-        /**
-         * Turns all letters in the string into lowercase.
-         * @param value - reference to the string to trim
-         * @param returns a reference to the string passed for chaining
-         */
-        static std::string& toLowerCase( std::string& value );
-
-        /**
-         * Create a float from the given string and exponent
-         */
-        static float createFloat( const std::string& s, int exp );
-
-        /**
-         * Create a float from the given long long array and exponent
-         */
-        static float createFloat1( unsigned long long* f, int length, int exp );
-
-        /**
-         * The algorithm for the function floatAlgorithm() below can be found
-         * in:
-         *
-         *      "How to Read Floating-Point Numbers Accurately", William D.
-         *      Clinger, Proceedings of the ACM SIGPLAN '90 Conference on
-         *      Programming Language Design and Implementation, June 20-22,
-         *      1990, pp. 92-101.
-         *
-         * There is a possibility that the function will end up in an endless
-         * loop if the given approximating floating-point number (a very small
-         * floating-point whose value is very close to zero) straddles between
-         * two approximating integer values. We modified the algorithm slightly
-         * to detect the case where it oscillates back and forth between
-         * incrementing and decrementing the floating-point approximation. It
-         * is currently set such that if the oscillation occurs more than twice
-         * then return the original approximation.
-         * @returns a newly parse float.
-         */
-        static float floatAlgorithm( unsigned long long* f, int length,
-                                     int e, float z );
-
-        static int tenToTheE( int exp ) {
-            return *(tens + exp);
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_INTERNAL_UTIL_FLOATINGPOINTPARSER_H_*/
diff --git a/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp b/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp
deleted file mode 100644
index 66fe9de..0000000
--- a/src/decaf/src/main/decaf/internal/util/HexStringParser.cpp
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#include "HexStringParser.h"
-
-#include <decaf/lang/Character.h>
-#include <decaf/lang/Integer.h>
-#include <decaf/lang/Long.h>
-#include <decaf/lang/Double.h>
-#include <decaf/lang/Float.h>
-#include <decaf/util/StringTokenizer.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <apr_pools.h>
-#include <apr_strmatch.h>
-
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-using namespace decaf::internal;
-using namespace decaf::internal::util;
-
-////////////////////////////////////////////////////////////////////////////////
-const std::string HexStringParser::HEX_SIGNIFICANT =
-    "0[xX](\\p{XDigit}+\\.?|\\p{XDigit}*\\.\\p{XDigit}+)";
-const std::string HexStringParser::BINARY_EXPONENT =
-    "[pP]([+-]?\\d+)";
-const std::string HexStringParser::FLOAT_TYPE_SUFFIX =
-    "[fFdD]?";
-const std::string HexStringParser::HEX_PATTERN =
-    "[\\x00-\\x20]*([+-]?)" + HEX_SIGNIFICANT + BINARY_EXPONENT + FLOAT_TYPE_SUFFIX + "[\\x00-\\x20]*";
-
-////////////////////////////////////////////////////////////////////////////////
-HexStringParser::HexStringParser( int exponentWidth, int mantissaWidth ) {
-
-    this->EXPONENT_WIDTH = exponentWidth;
-    this->MANTISSA_WIDTH = mantissaWidth;
-
-    this->EXPONENT_BASE = ~( -1 << (exponentWidth - 1) );
-    this->MAX_EXPONENT = ~( -1 << exponentWidth );
-    this->MIN_EXPONENT = -( MANTISSA_WIDTH + 1 );
-    this->MANTISSA_MASK = ~( -1 << mantissaWidth );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double HexStringParser::parseDouble( const std::string& hexString ) {
-
-    HexStringParser parser( DOUBLE_EXPONENT_WIDTH, DOUBLE_MANTISSA_WIDTH );
-    long long result = parser.parse( hexString );
-    return Double::longBitsToDouble( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float HexStringParser::parseFloat( const std::string& hexString ) {
-
-    HexStringParser parser( FLOAT_EXPONENT_WIDTH, FLOAT_MANTISSA_WIDTH );
-    int result = (int)parser.parse( hexString );
-    return Float::intBitsToFloat( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long HexStringParser::parse( const std::string& hexString ) {
-
-    std::string* hexSegments = getSegmentsFromHexString( hexString );
-    std::string signStr = hexSegments[0];
-    std::string significantStr = hexSegments[1];
-    std::string exponentStr = hexSegments[2];
-    delete hexSegments;
-
-    parseHexSign( signStr );
-    parseExponent( exponentStr );
-    parseMantissa( significantStr );
-
-    sign <<= ( MANTISSA_WIDTH + EXPONENT_WIDTH );
-    exponent <<= MANTISSA_WIDTH;
-    return sign | exponent | mantissa;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string* HexStringParser::getSegmentsFromHexString( const std::string& hexString ) {
-
-//    apr_pool_t* thePool = NULL;
-//    apr_pool_create( &thePool, NULL );
-//    apr_strmatch_pattern* pattern =
-//        apr_strmatch_precompile( thePool, HEX_PATTERN.c_str(), 0 );
-//
-//    std::vector<std::string> hexSegments;
-//
-
-
-    // TODO
-//    Matcher matcher = PATTERN.matcher(hexString);
-//    if( !matcher.matches() ) {
-//        throw NumberFormatException(
-//            __FILE__, __LINE__,
-//            "HexStringParser::getSegmentsFromHexString"
-//            "Invalid hex string:", hexString.c_str() );
-//    }
-//
-//    std::string* hexSegments = new std::string[3];
-//    hexSegments[0] = matcher.group(1);
-//    hexSegments[1] = matcher.group(2);
-//    hexSegments[2] = matcher.group(3);
-//
-//    return hexSegments;
-
-    return NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::parseExponent(const std::string& exponentStr) {
-
-    std::string newExponentStr = exponentStr;
-
-    char leadingChar = newExponentStr.at(0);
-    int expSign = ( leadingChar == '-' ? -1 : 1 );
-    if( !Character::isDigit( leadingChar ) ) {
-        newExponentStr = newExponentStr.substr( 1, newExponentStr.size() );
-    }
-
-    try {
-        exponent = expSign * Long::parseLong( exponentStr );
-        checkedAddExponent( EXPONENT_BASE );
-    } catch( exceptions::NumberFormatException& e ) {
-        exponent = expSign * Long::MAX_VALUE;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::parseMantissa(const std::string& significantStr) {
-
-    StringTokenizer tokenizer( significantStr, "\\." );
-    std::vector<std::string> strings;
-
-    tokenizer.toArray( strings );
-
-    std::string strIntegerPart = strings[0];
-    std::string strDecimalPart = strings.size() > 1 ? strings[1] : "";
-
-    std::string significand =
-        getNormalizedSignificand( strIntegerPart, strDecimalPart) ;
-
-    if( significand == "0" ) {
-        setZero();
-        return;
-    }
-
-    int offset = getOffset( strIntegerPart, strDecimalPart );
-    checkedAddExponent( offset );
-
-    if( exponent >= MAX_EXPONENT ) {
-        setInfinite();
-        return;
-    }
-
-    if( exponent <= MIN_EXPONENT ) {
-        setZero();
-        return;
-    }
-
-    if( significand.length() > MAX_SIGNIFICANT_LENGTH ) {
-        abandonedNumber = significand.substr( MAX_SIGNIFICANT_LENGTH );
-        significand = significand.substr( 0, MAX_SIGNIFICANT_LENGTH );
-    }
-
-    mantissa = Long::parseLong( significand, HEX_RADIX );
-
-    if( exponent >= 1 ) {
-        processNormalNumber();
-    } else{
-        processSubNormalNumber();
-    }
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::checkedAddExponent( long long offset ) {
-
-    long long result = exponent + offset;
-    int expSign = Long::signum( exponent );
-
-    if( expSign * Long::signum( offset ) > 0 &&
-        expSign * Long::signum( result ) < 0 ) {
-
-        exponent = expSign * Long::MAX_VALUE;
-    } else {
-        exponent = result;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::processNormalNumber() {
-    int desiredWidth = MANTISSA_WIDTH + 2;
-    fitMantissaInDesiredWidth( desiredWidth );
-    round();
-    mantissa = mantissa & MANTISSA_MASK;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::processSubNormalNumber() {
-    int desiredWidth = MANTISSA_WIDTH + 1;
-    desiredWidth += (int)exponent;//lends bit from mantissa to exponent
-    exponent = 0;
-    fitMantissaInDesiredWidth( desiredWidth );
-    round();
-    mantissa = mantissa & MANTISSA_MASK;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::fitMantissaInDesiredWidth(int desiredWidth){
-    int bitLength = countBitsLength( mantissa );
-    if( bitLength > desiredWidth ) {
-        discardTrailingBits( bitLength - desiredWidth );
-    } else {
-        mantissa <<= ( desiredWidth - bitLength );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::discardTrailingBits( long long num ) {
-    long long mask = ~( -1L << num );
-    abandonedNumber += ( mantissa & mask );
-    mantissa >>= num;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void HexStringParser::round() {
-
-    std::string result = abandonedNumber;
-    replaceAll( result, "0+", "" );
-
-    bool moreThanZero = ( result.length() > 0 ? true : false );
-
-    int lastDiscardedBit = (int)( mantissa & 1L );
-    mantissa >>= 1;
-    int tailBitInMantissa = (int)( mantissa & 1L );
-
-    if( lastDiscardedBit == 1 && ( moreThanZero || tailBitInMantissa == 1 ) ) {
-
-        int oldLength = countBitsLength( mantissa );
-        mantissa += 1L;
-        int newLength = countBitsLength( mantissa );
-
-        //Rounds up to exponent when whole bits of mantissa are one-bits.
-        if( oldLength >= MANTISSA_WIDTH && newLength > oldLength ) {
-            checkedAddExponent( 1 );
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string HexStringParser::getNormalizedSignificand(
-    const std::string& strIntegerPart, const std::string& strDecimalPart ) {
-
-    std::string significand = strIntegerPart + strDecimalPart;
-
-    replaceFirst( significand, "^0x", "" );
-
-    if( significand.length() == 0 ) {
-        significand = "0";
-    }
-    return significand;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int HexStringParser::getOffset(
-    const std::string& strIntegerPart, const std::string& strDecimalPart ) {
-
-    std::string strIntegerPart2 = strIntegerPart;
-
-    replaceFirst( strIntegerPart2, "^0+", "" );
-
-    //If the Interger part is a nonzero number.
-    if( strIntegerPart.length() != 0 ) {
-        std::string leadingNumber = strIntegerPart.substr( 0, 1 );
-        return ( strIntegerPart.length() - 1) * 4 +
-               countBitsLength(Long::parseLong( leadingNumber,HEX_RADIX ) ) - 1;
-    }
-
-    //If the Interger part is a zero number.
-    int i;
-    for( i = 0; (std::size_t)i < strDecimalPart.length() && strDecimalPart.at(i) == '0'; i++ );
-
-    if( (std::size_t)i == strDecimalPart.length() ) {
-        return 0;
-    }
-
-    std::string leadingNumber = strDecimalPart.substr( i,i + 1 );
-
-    return (-i - 1) * 4 +
-        countBitsLength( Long::parseLong( leadingNumber, HEX_RADIX) ) - 1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int HexStringParser::countBitsLength(long long value) {
-    int leadingZeros = Long::numberOfLeadingZeros( value );
-    return Long::SIZE - leadingZeros;
-}
diff --git a/src/decaf/src/main/decaf/internal/util/HexStringParser.h b/src/decaf/src/main/decaf/internal/util/HexStringParser.h
deleted file mode 100644
index cfbe648..0000000
--- a/src/decaf/src/main/decaf/internal/util/HexStringParser.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_UTIL_HEXSTRINGPARSER_H_
-#define _DECAF_INTERNAL_UTIL_HEXSTRINGPARSER_H_
-
-#include <decaf/util/Config.h>
-#include <string>
-
-namespace decaf{
-namespace internal{
-namespace util{
-
-    class HexStringParser {
-    private:
-
-        static const unsigned int DOUBLE_EXPONENT_WIDTH = 11;
-        static const unsigned int DOUBLE_MANTISSA_WIDTH = 52;
-        static const unsigned int FLOAT_EXPONENT_WIDTH = 8;
-        static const unsigned int FLOAT_MANTISSA_WIDTH = 23;
-        static const unsigned int HEX_RADIX = 16;
-        static const unsigned int MAX_SIGNIFICANT_LENGTH = 15;
-
-        static const std::string HEX_SIGNIFICANT;
-        static const std::string BINARY_EXPONENT;
-        static const std::string FLOAT_TYPE_SUFFIX;
-        static const std::string HEX_PATTERN;
-
-        // TODO
-        //static final Pattern PATTERN = Pattern.compile(HEX_PATTERN);
-
-    private:
-
-        int EXPONENT_WIDTH;
-        int MANTISSA_WIDTH;
-        long EXPONENT_BASE;
-        long MAX_EXPONENT;
-        long MIN_EXPONENT;
-        long MANTISSA_MASK;
-        long sign;
-        long exponent;
-        long mantissa;
-        std::string abandonedNumber;
-
-    public:
-
-        /**
-         * Create a new HexParser
-         * @param exponentWidth - Width of the exponent for the type to parse
-         * @param mantissaWidth - Width of the mantissa for the type to parse
-         */
-        HexStringParser( int exponentWidth, int mantissaWidth );
-
-        virtual ~HexStringParser() {}
-
-        /**
-         * Parses a hex string using the specs given in the constructor
-         * and returns a long long with the bits of the parsed string, the
-         * caller can then convert those to a float or doulbe as needed.
-         * @param hexString - string to parse
-         * @returns the bits parsed from the string
-         */
-        long long parse( const std::string& hexString );
-
-    private:
-
-        /*
-         * Parses the sign field.
-         * @param sign string to parse
-         */
-        void parseHexSign( const std::string& signStr ) {
-            this->sign = signStr.compare("-") == 0 ? 1 : 0;
-        }
-
-        /*
-         * Parses the exponent field.
-         * @param exponent string to parse
-         */
-        void parseExponent( const std::string& exponentStr );
-
-        /*
-         * Parses the mantissa field.
-         * @param mantissa string to parse
-         */
-        void parseMantissa( const std::string& significantStr );
-
-        void setInfinite() {
-            exponent = MAX_EXPONENT;
-            mantissa = 0;
-        }
-
-        void setZero() {
-            exponent = 0;
-            mantissa = 0;
-        }
-
-        /*
-         * Sets the exponent variable to Long::MAX_VALUE or -Long::MAX_VALUE if
-         * overflow or underflow happens.
-         * @param the offset to set
-         */
-        void checkedAddExponent( long long offset );
-
-        void processNormalNumber();
-        void processSubNormalNumber();
-        int countBitsLength( long long value );
-
-        /*
-         * Adjusts the mantissa to desired width for further analysis.
-         */
-        void fitMantissaInDesiredWidth( int desiredWidth );
-
-        /*
-         * Stores the discarded bits to abandonedNumber.
-         */
-        void discardTrailingBits( long long num );
-
-        /*
-         * The value is rounded up or down to the nearest infinitely precise result.
-         * If the value is exactly halfway between two infinitely precise results,
-         * then it should be rounded up to the nearest infinitely precise even.
-         */
-        void round();
-
-        /*
-         * Returns the normalized significand after removing the leading zeros.
-         */
-        std::string getNormalizedSignificand( const std::string& strIntegerPart,
-                                              const std::string& strDecimalPart );
-
-        /*
-         * Calculates the offset between the normalized number and unnormalized
-         * number. In a normalized representation, significand is represented by the
-         * characters "0x1." followed by a lowercase hexadecimal representation of
-         * the rest of the significand as a fraction.
-         */
-        int getOffset( const std::string& strIntegerPart,
-                       const std::string& strDecimalPart );
-
-    public:  // Statics
-
-        /*
-         * Parses the hex string to a double number.
-         * @param hexString - string to parse
-         * @returns the parsed double value
-         */
-        static double parseDouble( const std::string& hexString );
-
-        /*
-         * Parses the hex string to a float number.
-         * @param hexString - string to parse
-         * @returns the parsed float value
-         */
-        static float parseFloat( const std::string& hexString );
-
-
-    private:  // Static
-
-        /*
-         * Analyzes the hex string and extracts the sign and digit segments.
-         * @param hexString - string to parse
-         * @returns array of three strings holding the segments caller owns
-         */
-        static std::string* getSegmentsFromHexString( const std::string& hexString );
-
-        std::string& replaceFirst( std::string& target,
-                                   const std::string& find,
-                                   const std::string& replace ) {
-
-            std::string::size_type pos = std::string::npos;
-
-            if( ( pos = target.find_first_of( find, 0 ) ) != std::string::npos ) {
-                return target.replace( pos, find.length(), replace );
-            }
-
-            return target;
-        }
-
-        std::string& replaceAll( std::string& target,
-                                 const std::string& find,
-                                 const std::string& replace ) {
-
-            std::string::size_type pos = std::string::npos;
-            while( ( pos = target.find( find ) ) != std::string::npos ) {
-                target.replace( pos, find.length(), replace );
-            }
-
-            return target;
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_INTERNAL_UTIL_HEXSTRINGPARSER_H_*/
diff --git a/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp b/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp
deleted file mode 100644
index 21580ff..0000000
--- a/src/decaf/src/main/decaf/internal/util/NumberConverter.cpp
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#include "NumberConverter.h"
-
-#include <decaf/lang/Math.h>
-#include <decaf/lang/Float.h>
-#include <decaf/lang/Double.h>
-#include <decaf/lang/Integer.h>
-
-#include <decaf/internal/util/BigInt.h>
-#include <decaf/internal/util/BitOps.h>
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::internal;
-using namespace decaf::internal::util;
-
-////////////////////////////////////////////////////////////////////////////////
-const double NumberConverter::invLogOfTenBaseTwo =
-    Math::log(2.0) / Math::log(10.0);
-NumberConverter::StaticInitializer NumberConverter::init;
-std::vector<long long> NumberConverter::TEN_TO_THE;
-
-////////////////////////////////////////////////////////////////////////////////
-NumberConverter::StaticInitializer::StaticInitializer() {
-
-    NumberConverter::TEN_TO_THE.resize(20);
-    NumberConverter::TEN_TO_THE[0] = 1L;
-
-    for( std::size_t i = 1; i < TEN_TO_THE.size(); ++i ) {
-        long long previous = TEN_TO_THE[i - 1];
-        TEN_TO_THE[i] = ( previous << 1 ) + ( previous << 3 );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-NumberConverter::NumberConverter() {
-
-    this->getCount = 0;
-    this->setCount = 0;
-    this->firstK = 0;
-    this->uArray.resize(64);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string NumberConverter::convertD( double value ) {
-
-    unsigned int p = 1023 + 52; // the power offset (precision)
-
-    // the mask to get the sign of the number
-    unsigned long long signMask = 0x8000000000000000ULL;
-    // the mask to get the power bits
-    unsigned long long eMask = 0x7FF0000000000000ULL;
-    // the mask to get the significand bits
-    unsigned long long fMask = 0x000FFFFFFFFFFFFFULL;
-
-    unsigned long long inputNumberBits = Double::doubleToLongBits( value );
-    // the value of the sign... 0 is positive, ~0 is negative
-    std::string signString = ( inputNumberBits & signMask ) == 0 ? "" : "-";
-    // the value of the 'power bits' of the value
-    unsigned int e = (int)(( inputNumberBits & eMask ) >> 52 );
-    // the value of the 'significand bits' of the value
-    unsigned long long f = inputNumberBits & fMask;
-    bool mantissaIsZero = (f == 0);
-    int pow = 0, numBits = 52;
-
-    if( e == 2047 ) {
-        return mantissaIsZero ? signString + "Infinity" : "NaN";
-    }
-
-    if( e == 0 ) {
-
-        if( mantissaIsZero ) {
-            return signString + "0.0";
-        }
-
-        if( f == 1 ) {
-            // special case to increase precision even though 2 *
-            // Double::MIN_VALUE is 1.0e-323
-            return signString + "4.9E-324";
-        }
-
-        pow = 1 - p; // a denormalized number
-        long long ff = f;
-        while( (ff & 0x0010000000000000ULL ) == 0 ) {
-            ff = ff << 1;
-            numBits--;
-        }
-    } else {
-        // 0 < e < 2047
-        // a "normalized" number
-        f = f | 0x0010000000000000ULL;
-        pow = e - p;
-    }
-
-    if( -59 < pow && pow < 6 || (pow == -59 && !mantissaIsZero) ) {
-        longDigitGenerator( f, pow, e == 0, mantissaIsZero, numBits );
-    } else {
-        bigIntDigitGeneratorInstImpl( f, pow, e == 0, mantissaIsZero, numBits );
-    }
-
-    if( value >= 1e7 || value <= -1e7 ||
-        ( value > -1e-3 && value < 1e-3 ) ) {
-        return signString + freeFormatExponential();
-    }
-
-    return signString + freeFormat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string NumberConverter::convertF(float value) {
-
-    unsigned int p = 127 + 23; // the power offset (precision)
-    unsigned int signMask = 0x80000000; // the mask to get the sign of the number
-    unsigned int eMask = 0x7F800000; // the mask to get the power bits
-    unsigned int fMask = 0x007FFFFF; // the mask to get the significand bits
-
-    unsigned int inputNumberBits = Float::floatToIntBits(value);
-    // the value of the sign... 0 is positive, ~0 is negative
-    std::string signString = (inputNumberBits & signMask) == 0 ? "" : "-";
-    // the value of the 'power bits' of the value
-    unsigned int e = (inputNumberBits & eMask) >> 23;
-    // the value of the 'significand bits' of the value
-    unsigned int f = inputNumberBits & fMask;
-    bool mantissaIsZero = ( f == 0 );
-    int pow = 0, numBits = 23;
-
-    if( e == 255 ) {
-        return mantissaIsZero ? signString + "Infinity" : "NaN";
-    }
-
-    if( e == 0 ) {
-
-        if( mantissaIsZero ) {
-            return signString + "0.0";
-        }
-
-        pow = 1 - p; // a denormalized number
-        if( f < 8 ) { // want more precision with smallest values
-            f = f << 2;
-            pow -= 2;
-        }
-        int ff = f;
-        while( (ff & 0x00800000) == 0) {
-            ff = ff << 1;
-            numBits--;
-        }
-    } else {
-        // 0 < e < 255
-        // a "normalized" number
-        f = f | 0x00800000;
-        pow = e - p;
-    }
-
-    if( -59 < pow && pow < 35 || (pow == -59 && !mantissaIsZero) ) {
-        longDigitGenerator( f, pow, e == 0, mantissaIsZero, numBits );
-    } else {
-        bigIntDigitGeneratorInstImpl( f, pow, e == 0, mantissaIsZero, numBits);
-    }
-
-    if( value >= 1e7f || value <= -1e7f ||
-        ( value > -1e-3f && value < 1e-3f ) ) {
-        return signString + freeFormatExponential();
-    }
-
-    return signString + freeFormat();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string NumberConverter::freeFormatExponential() {
-
-    // corresponds to process "Free-Format Exponential"
-    char formattedDecimal[25] = {0};
-    formattedDecimal[0] = (char)( '0' + uArray[getCount++] );
-    formattedDecimal[1] = '.';
-    // the position the next character is to be inserted into
-    // formattedDecimal
-    int charPos = 2;
-
-    int k = firstK;
-    int expt = k;
-    while( true ) {
-        k--;
-        if( getCount >= setCount) {
-            break;
-        }
-
-        formattedDecimal[charPos++] = (char)( '0' + uArray[getCount++] );
-    }
-
-    if( k == expt - 1 ) {
-        formattedDecimal[charPos++] = '0';
-    }
-    formattedDecimal[charPos++] = 'E';
-
-    return std::string( formattedDecimal, 0, charPos ) + Integer::toString( expt );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string NumberConverter::freeFormat() {
-
-    // corresponds to process "Free-Format"
-    char formattedDecimal[25] = {0};
-    // the position the next character is to be inserted into
-    // formattedDecimal
-    int charPos = 0;
-    int k = firstK;
-    if( k < 0 ) {
-        formattedDecimal[0] = '0';
-        formattedDecimal[1] = '.';
-        charPos += 2;
-        for( int i = k + 1; i < 0; i++ ) {
-            formattedDecimal[charPos++] = '0';
-        }
-    }
-
-    int U = uArray[getCount++];
-    do{
-        if( U != -1 ) {
-            formattedDecimal[charPos++] = (char) ('0' + U);
-        } else if (k >= -1) {
-            formattedDecimal[charPos++] = '0';
-        }
-
-        if( k == 0 ) {
-            formattedDecimal[charPos++] = '.';
-        }
-
-        k--;
-        U = getCount < setCount ? uArray[getCount++] : -1;
-
-    } while( U != -1 || k >= -1 );
-
-    return std::string( formattedDecimal, 0, charPos );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void NumberConverter::bigIntDigitGeneratorInstImpl(
-    long long f, int e, bool isDenormalized, bool mantissaIsZero, int p ) {
-
-    static const std::size_t RM_SIZE = 21;
-    static const std::size_t STemp_SIZE = 22;
-
-    unsigned int RLength, SLength, TempLength, mplus_Length, mminus_Length;
-    int high, low, i;
-    int k, U;
-
-    unsigned long long R[RM_SIZE] = {0};
-    unsigned long long S[STemp_SIZE] = {0};
-    unsigned long long mplus[RM_SIZE] = {0};
-    unsigned long long mminus[RM_SIZE] = {0};
-    unsigned long long Temp[STemp_SIZE] = {0};
-
-    if( e >= 0 ) {
-
-        *R = f;
-        *mplus = *mminus = 1;
-        BigInt::simpleShiftLeftHighPrecision( mminus, RM_SIZE, e );
-
-        if( f != (2 << (p - 1)) ) {
-
-            BigInt::simpleShiftLeftHighPrecision( R, RM_SIZE, e + 1 );
-            *S = 2;
-
-            /*
-             * m+ = m+ << e results in 1.0e23 to be printed as
-             * 0.9999999999999999E23
-             * m+ = m+ << e+1 results in 1.0e23 to be printed as
-             * 1.0e23 (caused too much rounding)
-             *      470fffffffffffff = 2.0769187434139308E34
-             *      4710000000000000 = 2.076918743413931E34
-             */
-            BigInt::simpleShiftLeftHighPrecision(mplus, RM_SIZE, e);
-
-        } else {
-
-            BigInt::simpleShiftLeftHighPrecision( R, RM_SIZE, e + 2 );
-            *S = 4;
-            BigInt::simpleShiftLeftHighPrecision( mplus, RM_SIZE, e + 1 );
-        }
-
-    } else {
-
-        if( isDenormalized || (f != (2 << (p - 1))) ) {
-
-            *R = f << 1;
-            *S = 1;
-            BigInt::simpleShiftLeftHighPrecision( S, STemp_SIZE, 1 - e );
-            *mplus = *mminus = 1;
-
-        } else {
-
-            *R = f << 2;
-            *S = 1;
-            BigInt::simpleShiftLeftHighPrecision( S, STemp_SIZE, 2 - e );
-            *mplus = 2;
-            *mminus = 1;
-        }
-    }
-
-    k = (int)Math::ceil( (e + p - 1) * invLogOfTenBaseTwo - 1e-10 );
-
-    if( k > 0 ) {
-        BigInt::timesTenToTheEHighPrecision( S, STemp_SIZE, k );
-    } else {
-        BigInt::timesTenToTheEHighPrecision( R, RM_SIZE, -k );
-        BigInt::timesTenToTheEHighPrecision( mplus, RM_SIZE, -k );
-        BigInt::timesTenToTheEHighPrecision( mminus, RM_SIZE, -k );
-    }
-
-    RLength = mplus_Length = mminus_Length = RM_SIZE;
-    SLength = TempLength = STemp_SIZE;
-
-    memset( Temp + RM_SIZE, 0, (STemp_SIZE - RM_SIZE) * sizeof (unsigned long long) );
-    memcpy( Temp, R, RM_SIZE * sizeof (unsigned long long) );
-
-    while( RLength > 1 && R[RLength - 1] == 0 ) {
-        --RLength;
-    }
-    while( mplus_Length > 1 && mplus[mplus_Length - 1] == 0 ) {
-        --mplus_Length;
-    }
-    while( mminus_Length > 1 && mminus[mminus_Length - 1] == 0 ) {
-        --mminus_Length;
-    }
-    while( SLength > 1 && S[SLength - 1] == 0 ) {
-        --SLength;
-    }
-
-    TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
-    BigInt::addHighPrecision( Temp, TempLength, mplus, mplus_Length );
-
-    if( BigInt::compareHighPrecision (Temp, TempLength, S, SLength) >= 0 ) {
-        firstK = k;
-    } else {
-
-        firstK = k - 1;
-        BigInt::simpleAppendDecimalDigitHighPrecision( R, ++RLength, 0 );
-        BigInt::simpleAppendDecimalDigitHighPrecision( mplus, ++mplus_Length, 0 );
-        BigInt::simpleAppendDecimalDigitHighPrecision( mminus, ++mminus_Length, 0 );
-        while( RLength > 1 && R[RLength - 1] == 0 ) {
-            --RLength;
-        }
-        while( mplus_Length > 1 && mplus[mplus_Length - 1] == 0 ) {
-            --mplus_Length;
-        }
-        while( mminus_Length > 1 && mminus[mminus_Length - 1] == 0 ) {
-            --mminus_Length;
-        }
-    }
-
-    getCount = setCount = 0;
-    do{
-
-        U = 0;
-        for( i = 3; i >= 0; --i ) {
-            TempLength = SLength + 1;
-            Temp[SLength] = 0;
-            memcpy( Temp, S, SLength * sizeof(unsigned long long) );
-            BigInt::simpleShiftLeftHighPrecision( Temp, TempLength, i );
-            if( BigInt::compareHighPrecision( R, RLength, Temp, TempLength ) >= 0 ) {
-                BigInt::subtractHighPrecision( R, RLength, Temp, TempLength );
-                U += 1 << i;
-            }
-        }
-
-        low = BigInt::compareHighPrecision( R, RLength, mminus, mminus_Length ) <= 0;
-
-        memset( Temp + RLength, 0, (STemp_SIZE - RLength) * sizeof(unsigned long long) );
-        memcpy( Temp, R, RLength * sizeof(unsigned long long) );
-        TempLength = (RLength > mplus_Length ? RLength : mplus_Length) + 1;
-        BigInt::addHighPrecision( Temp, TempLength, mplus, mplus_Length );
-
-        high = BigInt::compareHighPrecision( Temp, TempLength, S, SLength ) >= 0;
-
-        if( low || high ) {
-            break;
-        }
-
-        BigInt::simpleAppendDecimalDigitHighPrecision( R, ++RLength, 0 );
-        BigInt::simpleAppendDecimalDigitHighPrecision( mplus, ++mplus_Length, 0 );
-        BigInt::simpleAppendDecimalDigitHighPrecision( mminus, ++mminus_Length, 0 );
-        while( RLength > 1 && R[RLength - 1] == 0 ) {
-            --RLength;
-        }
-        while( mplus_Length > 1 && mplus[mplus_Length - 1] == 0 ) {
-            --mplus_Length;
-        }
-        while( mminus_Length > 1 && mminus[mminus_Length - 1] == 0 ) {
-            --mminus_Length;
-        }
-        uArray[setCount++] = U;
-    }
-    while( true );
-
-    BigInt::simpleShiftLeftHighPrecision( R, ++RLength, 1 );
-
-    if( low && !high ) {
-        uArray[setCount++] = U;
-    } else if( high && !low ) {
-        uArray[setCount++] = U + 1;
-    } else if( BigInt::compareHighPrecision( R, RLength, S, SLength) < 0 ) {
-        uArray[setCount++] = U;
-    } else {
-        uArray[setCount++] = U + 1;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void NumberConverter::longDigitGenerator(
-    long long f, int e, bool isDenormalized, bool mantissaIsZero, int p ) {
-
-    unsigned long long R, S, M;
-
-    if( e >= 0 ) {
-        M = 1l << e;
-        if( !mantissaIsZero ) {
-            R = f << (e + 1);
-            S = 2;
-        } else {
-            R = f << (e + 2);
-            S = 4;
-        }
-    } else {
-        M = 1;
-        if( isDenormalized || !mantissaIsZero ) {
-            R = f << 1;
-            S = 1l << (1 - e);
-        } else {
-            R = f << 2;
-            S = 1l << (2 - e);
-        }
-    }
-
-    int k = (int)Math::ceil( (e + p - 1) * invLogOfTenBaseTwo - 1e-10 );
-
-    if( k > 0 ) {
-        S = S * TEN_TO_THE[k];
-    } else if( k < 0 ) {
-        long long scale = TEN_TO_THE[-k];
-        R = R * scale;
-        M = M == 1 ? scale : M * scale;
-    }
-
-    if( R + M > S ) { // was M_plus
-        firstK = k;
-    } else {
-        firstK = k - 1;
-        R = R * 10;
-        M = M * 10;
-    }
-
-    getCount = setCount = 0; // reset indices
-    bool low, high;
-    int U;
-    long long Si[4] = { S, S << 1, S << 2, S << 3 };
-    while( true ) {
-        // set U to be floor (R / S) and R to be the remainder
-        // using a kind of "binary search" to find the answer.
-        // It's a lot quicker than actually dividing since we know
-        // the answer will be between 0 and 10
-        U = 0;
-        long long remainder;
-        for( int i = 3; i >= 0; i-- ) {
-            remainder = R - Si[i];
-            if( remainder >= 0 ) {
-                R = remainder;
-                U += 1 << i;
-            }
-        }
-
-        low = R < M; // was M_minus
-        high = R + M > S; // was M_plus
-
-        if( low || high ) {
-            break;
-        }
-
-        R = R * 10;
-        M = M * 10;
-        uArray[setCount++] = U;
-    }
-
-    if( low && !high ) {
-        uArray[setCount++] = U;
-    } else if( high && !low ) {
-        uArray[setCount++] = U + 1;
-    } else if( ( R << 1 ) < S ) {
-        uArray[setCount++] = U;
-    } else {
-        uArray[setCount++] = U + 1;
-    }
-}
diff --git a/src/decaf/src/main/decaf/internal/util/NumberConverter.h b/src/decaf/src/main/decaf/internal/util/NumberConverter.h
deleted file mode 100644
index 05a6fd8..0000000
--- a/src/decaf/src/main/decaf/internal/util/NumberConverter.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one or more
- *  contributor license agreements.  See the NOTICE file distributed with
- *  this work for additional information regarding copyright ownership.
- *  The ASF licenses this file to You under the Apache License, Version 2.0
- *  (the "License"); you may not use this file except in compliance with
- *  the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-
-#ifndef _DECAF_INTERNAL_UTIL_NUMBERCONVERTER_H_
-#define _DECAF_INTERNAL_UTIL_NUMBERCONVERTER_H_
-
-#include <decaf/util/Config.h>
-#include <vector>
-#include <string>
-
-namespace decaf{
-namespace internal{
-namespace util{
-
-    class NumberConverter {
-    private:
-
-        int setCount;
-        int getCount;
-        int firstK;
-        std::vector<int> uArray;
-
-        static std::vector<long long> TEN_TO_THE;
-        static const double invLogOfTenBaseTwo;
-
-        // Internal class used to init static arrays
-        struct StaticInitializer {
-            StaticInitializer();
-        };
-
-        static StaticInitializer init;
-
-    public:
-
-        NumberConverter();
-        virtual ~NumberConverter() {}
-
-        /**
-         * @param value - the double to convert
-         * @returns the string representation of value
-         */
-        std::string convertD( double value );
-
-        /**
-         * @param value - the float to convert
-         * @returns the string representation of value
-         */
-        std::string convertF( float value );
-
-    public:   // Statics
-
-        /**
-         * @param value to convert to a string
-         * @returns the value converted to a string
-         */
-        static std::string convert( double value ) {
-            return NumberConverter().convertD( value );
-        }
-
-        /**
-         * @param value to convert to a string
-         * @returns the value converted to a string
-         */
-        static std::string convert( float value ) {
-            return NumberConverter().convertF( value );
-        }
-
-    private:
-
-        std::string freeFormatExponential();
-        std::string freeFormat();
-
-        void bigIntDigitGeneratorInstImpl(
-            long long f, int e, bool isDenormalized, bool mantissaIsZero, int p );
-        void longDigitGenerator(
-            long long f, int e, bool isDenormalized, bool mantissaIsZero, int p );
-
-    };
-
-}}}
-
-#endif /*_DECAF_INTERNAL_UTIL_NUMBERCONVERTER_H_*/
diff --git a/src/decaf/src/main/decaf/io/BlockingByteArrayInputStream.cpp b/src/decaf/src/main/decaf/io/BlockingByteArrayInputStream.cpp
deleted file mode 100644
index c7c2475..0000000
--- a/src/decaf/src/main/decaf/io/BlockingByteArrayInputStream.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BlockingByteArrayInputStream.h"
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-BlockingByteArrayInputStream::BlockingByteArrayInputStream(){
-    pos = buffer.end();
-    closing = false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BlockingByteArrayInputStream::BlockingByteArrayInputStream(
-    const unsigned char* buffer,
-    std::size_t bufferSize ){
-
-    closing = false;
-    setByteArray( buffer, bufferSize );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BlockingByteArrayInputStream::~BlockingByteArrayInputStream(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BlockingByteArrayInputStream::setByteArray( const unsigned char* lbuffer,
-                                                 std::size_t lbufferSize ){
-    synchronized( this ){
-
-        // Remove old data
-        buffer.clear();
-        buffer.reserve( lbufferSize );
-
-        // Copy data to internal buffer.
-        std::back_insert_iterator< std::vector<unsigned char> > iter( buffer );
-        std::copy( lbuffer, lbuffer + lbufferSize, iter );
-
-        // Begin at the Beginning.
-        pos = this->buffer.begin();
-
-        // Notify any listening threds that there is now data available.
-        notifyAll();
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BlockingByteArrayInputStream::close() throw ( lang::Exception ){
-
-    synchronized( this ){
-
-        // Indicate that we're shutting down.
-        closing = true;
-
-        // Clear out the buffer.
-        buffer.clear();
-
-        // Notify that this stream is shutting down.
-        notifyAll();
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char BlockingByteArrayInputStream::read() throw ( IOException ){
-
-    synchronized( this ){
-
-        while( !closing ){
-
-            if( pos != buffer.end() ){
-                return *(pos++);
-            }
-
-            // Wait for more data
-            wait();
-        }
-
-        throw IOException( __FILE__, __LINE__, "close occurred during read" );
-    }
-
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BlockingByteArrayInputStream::read( unsigned char* buffer,
-                                        std::size_t bufferSize )
-                                            throw ( IOException ){
-    synchronized( this ){
-
-        std::size_t ix = 0;
-
-        for( ; ix < bufferSize && !closing; ++ix, ++pos)
-        {
-            if(pos == this->buffer.end())
-            {
-                // Wait for more data to come in.
-                wait();
-            }
-
-            if( !closing ){
-                buffer[ix] = *(pos);
-            }
-        }
-
-        if( closing ){
-            throw IOException(
-                __FILE__, __LINE__, "close occurred during read" );
-        }
-
-        return ix;
-    }
-
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::size_t BlockingByteArrayInputStream::skip( std::size_t num )
-    throw ( io::IOException, lang::exceptions::UnsupportedOperationException ){
-
-    std::size_t ix = 0;
-
-    synchronized( this ){
-
-        // Increment the pos until we'v skipped the desired num
-        // or we've hit the end of the buffer.
-        for( ; ix < num && !closing && pos != buffer.end(); ++ix, ++pos) {}
-    }
-
-    return ix;
-}
-
-
diff --git a/src/decaf/src/main/decaf/io/BlockingByteArrayInputStream.h b/src/decaf/src/main/decaf/io/BlockingByteArrayInputStream.h
deleted file mode 100644
index c4ca129..0000000
--- a/src/decaf/src/main/decaf/io/BlockingByteArrayInputStream.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BLOCKINGBYTEARRAYINPUTSTREAM_H_
-#define _DECAF_IO_BLOCKINGBYTEARRAYINPUTSTREAM_H_
-
-#include <decaf/io/InputStream.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <vector>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * This is a blocking version of a byte buffer stream.  Read operations
-     * block until the requested data becomes available in the internal
-     * buffer via a call to setByteArray.
-     */
-    class DECAF_API BlockingByteArrayInputStream : public InputStream
-    {
-    private:
-
-        /**
-         * Default buffer to use, if none provided.
-         */
-        std::vector<unsigned char> buffer;
-
-        /**
-         * iterator to current position in buffer.
-         */
-        std::vector<unsigned char>::const_iterator pos;
-
-        /**
-         * Synchronization object.
-         */
-        util::concurrent::Mutex mutex;
-
-        /**
-         * Indicates that this stream is in the process of shutting
-         * down.
-         */
-        bool closing;
-
-    public:
-
-        /**
-         * Default Constructor - uses a default internal buffer
-         */
-        BlockingByteArrayInputStream();
-
-        /**
-         * Constructor that initializes the internal buffer.
-         * @see setByteArray.
-         */
-        BlockingByteArrayInputStream( const unsigned char* buffer,
-                                      std::size_t bufferSize );
-
-        /**
-         * Destructor
-         */
-        virtual ~BlockingByteArrayInputStream();
-
-        /**
-         * Sets the data that this reader uses.  Replaces any existing
-         * data and resets the read index to the beginning of the buffer.
-         * When this method is called, it notifies any other threads that
-         * data is now available to be read.
-         * @param buffer The new data to be copied to the internal buffer.
-         * @param bufferSize The size of the new buffer.
-         */
-        virtual void setByteArray( const unsigned char* buffer,
-            std::size_t bufferSize );
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
-            mutex.wait(millisecs);
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-        /**
-         * Indicates the number of bytes available to be read without
-         * blocking.
-         * @return the data available in the internal buffer.
-         * @throws IOException if an error occurs.
-         */
-        virtual std::size_t available() const throw ( IOException ){
-            return std::distance( pos, buffer.end() );
-        }
-
-        /**
-         * Reads a single byte from the buffer.  This operation will
-         * block until data has been added to the buffer via a call
-         * to setByteArray.
-         * @return the next byte.
-         * @throws IOException if an error occurs.
-         */
-        virtual unsigned char read() throw ( IOException );
-
-        /**
-         * Reads an array of bytes from the buffer.  If the desired amount
-         * of data is not currently available, this operation
-         * will block until the appropriate amount of data is available
-         * in the buffer via a call to setByteArray.
-         * @param buffer (out) the target buffer
-         * @param bufferSize the size of the output buffer.
-         * @return the number of bytes read. or -1 if EOF
-         * @throws IOException f an error occurs.
-         */
-        virtual int read( unsigned char* buffer, std::size_t bufferSize )
-            throw ( IOException );
-
-        /**
-         * Closes the target input stream.
-         * @throws IOException if an error occurs.
-         */
-        virtual void close() throw ( lang::Exception );
-
-        /**
-         * Skips over and discards n bytes of data from this input stream. The
-         * skip method may, for a variety of reasons, end up skipping over some
-         * smaller number of bytes, possibly 0. This may result from any of a
-         * number of conditions; reaching end of file before n bytes have been
-         * skipped is only one possibility. The actual number of bytes skipped
-         * is returned. If n is negative, no bytes are skipped.
-         * <p>
-         * The skip method of InputStream creates a byte array and then
-         * repeatedly reads into it until n bytes have been read or the end
-         * of the stream has been reached. Subclasses are encouraged to
-         * provide a more efficient implementation of this method.
-         * @param num - the number of bytes to skip
-         * @returns total butes skipped
-         * @throws IOException if an error occurs
-         */
-        virtual std::size_t skip( std::size_t num )
-            throw ( io::IOException, lang::exceptions::UnsupportedOperationException );
-
-   };
-
-}}
-
-#endif /*_DECAF_IO_BLOCKINGBYTEARRAYINPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/BufferedInputStream.cpp b/src/decaf/src/main/decaf/io/BufferedInputStream.cpp
deleted file mode 100644
index 349eb53..0000000
--- a/src/decaf/src/main/decaf/io/BufferedInputStream.cpp
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BufferedInputStream.h"
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedInputStream::BufferedInputStream( InputStream* stream, bool own )
-: FilterInputStream( stream, own )
-{
-    // Default to a 1k buffer.
-    init( 1024 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedInputStream::BufferedInputStream( InputStream* stream,
-    std::size_t bufferSize,
-    bool own )
-: FilterInputStream( stream, own )
-{
-    init( bufferSize );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedInputStream::~BufferedInputStream()
-{
-    // Destroy the buffer.
-    if( buffer != NULL ){
-        delete [] buffer;
-        buffer = NULL;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedInputStream::init( std::size_t bufferSize ){
-
-    this->bufferSize = bufferSize;
-
-    // Create the buffer and initialize the head and tail positions.
-    buffer = new unsigned char[bufferSize];
-    head = 0;
-    tail = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char BufferedInputStream::read() throw ( IOException ){
-
-    try{
-        // If there's no data left, reset to pointers to the beginning of the
-        // buffer.
-        normalizeBuffer();
-
-        // If we don't have any data buffered yet - read as much as
-        // we can.
-        if( isEmpty() ){
-
-            // If we hit EOF without getting any Data, then throw IOException
-            if( bufferData() == -1 ){
-                throw IOException(
-                    __FILE__, __LINE__,
-                    "BufferedInputStream::read - EOF has been Reached");
-            }
-        }
-
-        // Get the next character.
-        char returnValue = buffer[head++];
-
-        return returnValue;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BufferedInputStream::read( unsigned char* targetBuffer,
-                               std::size_t targetBufferSize ) throw ( IOException ){
-
-    try{
-
-        // For zero, do nothing
-        if( targetBufferSize == 0 ) {
-            return 0;
-        }
-
-        // If there's no data left, reset to pointers to the beginning of the
-        // buffer.
-        normalizeBuffer();
-
-        // If we still haven't filled the output buffer AND there is data
-        // on the input stream to be read, read a buffer's worth from the stream.
-        std::size_t totalRead = 0;
-        while( totalRead < targetBufferSize ){
-
-            // Get the remaining bytes to copy.
-            std::size_t bytesToCopy = min( tail-head, (targetBufferSize-totalRead) );
-
-            // Copy the data to the output buffer.
-            memcpy( targetBuffer+totalRead, this->buffer+head, bytesToCopy );
-
-            // Increment the total bytes read.
-            totalRead += bytesToCopy;
-
-            // Increment the head position.
-            head += bytesToCopy;
-
-            // If the buffer is now empty, reset the positions to the
-            // head of the buffer.
-            normalizeBuffer();
-
-            // If we still haven't satisified the request,
-            // read more data.
-            if( totalRead < targetBufferSize ){
-
-                // Buffer as much data as we can, return EOF if we hit it.
-                if( bufferData() == -1 ) {
-                    return -1;
-                }
-            }
-        }
-
-        // Return the total number of bytes read.
-        return totalRead;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::size_t BufferedInputStream::skip( std::size_t num )
-    throw ( IOException, lang::exceptions::UnsupportedOperationException ){
-
-    try{
-        // If there's no data left, reset to pointers to the beginning of the
-        // buffer.
-        normalizeBuffer();
-
-        // loop until we've skipped the desired number of bytes
-        std::size_t totalSkipped = 0;
-        while( totalSkipped < num ){
-
-            // Get the remaining bytes to copy.
-            std::size_t bytesToSkip = min( tail-head, num-totalSkipped );
-
-            // Increment the head position.
-            head += bytesToSkip;
-
-            // If the buffer is now empty, reset the positions to the
-            // head of the buffer.
-            normalizeBuffer();
-
-            // If we still haven't satisified the request,
-            // read more data.
-            if( totalSkipped < num ){
-
-                // Buffer as much data as we can.
-                bufferData();
-            }
-        }
-
-        // Return the total number of bytes read.
-        return totalSkipped;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int BufferedInputStream::bufferData() throw ( IOException ){
-
-    try{
-        if( getUnusedBytes() == 0 ){
-            throw IOException( __FILE__, __LINE__,
-                "BufferedInputStream::bufferData - buffer full" );
-        }
-
-        // Get the number of bytes currently available on the input stream
-        // that could be read without blocking.
-        std::size_t available = inputStream->available();
-
-        // Calculate the number of bytes that we can read.  Always >= 1 byte!
-        std::size_t bytesToRead = max( (std::size_t)1, min( available, getUnusedBytes() ) );
-
-        // Read the bytes from the input stream.
-        int bytesRead = inputStream->read( getTail(), bytesToRead );
-        if( bytesRead == 0 ){
-            throw IOException( __FILE__, __LINE__,
-                "BufferedInputStream::read() - failed reading bytes from stream");
-        }
-
-        // Dont add -1 to tail if we hit EOF
-        if( bytesRead == -1 ) {
-            return bytesRead;
-        }
-
-        // Increment the tail to the new end position.
-        tail += bytesRead;
-
-        return bytesRead;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
diff --git a/src/decaf/src/main/decaf/io/BufferedInputStream.h b/src/decaf/src/main/decaf/io/BufferedInputStream.h
deleted file mode 100644
index c840a50..0000000
--- a/src/decaf/src/main/decaf/io/BufferedInputStream.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BUFFEREDINPUTSTREAM_H_
-#define _DECAF_IO_BUFFEREDINPUTSTREAM_H_
-
-#include <decaf/io/FilterInputStream.h>
-#include <assert.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * A wrapper around another input stream that performs
-     * a buffered read, where it reads more data than it needs
-     * in order to reduce the number of io operations on the
-     * input stream.
-     */
-    class DECAF_API BufferedInputStream : public FilterInputStream
-    {
-    private:
-
-        /**
-         * The internal buffer.
-         */
-        unsigned char* buffer;
-
-        /**
-         * The buffer size.
-         */
-        std::size_t bufferSize;
-
-        /**
-         * The current head of the buffer.
-         */
-        std::size_t head;
-
-        /**
-         * The current tail of the buffer.
-         */
-        std::size_t tail;
-
-    public:
-
-        /**
-         * Constructor
-         * @param stream The target input stream.
-         * @param own indicates if we own the stream object, defaults to false
-         */
-        BufferedInputStream( InputStream* stream, bool own = false );
-
-        /**
-         * Constructor
-         * @param stream the target input stream
-         * @param bufferSize the size for the internal buffer.
-         * @param own indicates if we own the stream object, defaults to false.
-         */
-        BufferedInputStream( InputStream* stream,
-                             std::size_t bufferSize,
-                             bool own = false);
-
-        virtual ~BufferedInputStream();
-
-        /**
-         * Indcates the number of bytes avaialable.
-         * @return the sum of the amount of data avalable
-         * in the buffer and the data available on the target
-         * input stream.
-         */
-        virtual std::size_t available() const throw ( IOException ) {
-            return ( tail - head ) + inputStream->available();
-        }
-
-        /**
-         * Reads a single byte from the buffer.  Blocks until
-         * the data is available.
-         * @return The next byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual unsigned char read() throw ( IOException );
-
-        /**
-         * Reads an array of bytes from the buffer.  Blocks
-         * until the requested number of bytes are available.
-         * @param buffer (out) the target buffer.
-         * @param bufferSize the size of the output buffer.
-         * @return The number of bytes read or -1 if EOF
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual int read( unsigned char* buffer, std::size_t bufferSize )
-            throw ( IOException );
-
-        /**
-         * Skips over and discards n bytes of data from this input stream. The
-         * skip method may, for a variety of reasons, end up skipping over some
-         * smaller number of bytes, possibly 0. This may result from any of a
-         * number of conditions; reaching end of file before n bytes have been
-         * skipped is only one possibility. The actual number of bytes skipped
-         * is returned. If n is negative, no bytes are skipped.
-         * <p>
-         * The skip method of InputStream creates a byte array and then
-         * repeatedly reads into it until n bytes have been read or the end
-         * of the stream has been reached. Subclasses are encouraged to
-         * provide a more efficient implementation of this method.
-         * @param num - the number of bytes to skip
-         * @returns total butes skipped
-         * @throws IOException if an error occurs
-         */
-        virtual std::size_t skip( std::size_t num )
-            throw ( io::IOException, lang::exceptions::UnsupportedOperationException );
-
-    private:
-
-        /**
-         * Initializes the internal structures.
-         * @param size of buffer to allocate
-         */
-        void init( std::size_t bufferSize );
-
-        /**
-         * Populates the buffer with as much data as possible
-         * from the target input stream.
-         * @returns total bytes read, or -1 if EOF.
-         * @throws CMSException
-         */
-        int bufferData() throw ( IOException );
-
-        /**
-         * Returns the number of bytes that are currently unused
-         * in the buffer.
-         */
-        std::size_t getUnusedBytes() const{
-            return bufferSize - tail;
-        }
-
-        /**
-         * Returns the current tail position of the buffer.
-         */
-        unsigned char* getTail(){
-            return buffer + tail;
-        }
-
-        /**
-         * Initializes the head and tail indicies to the beginning
-         * of the buffer.
-         */
-        void clear(){
-            head = tail = 0;
-        }
-
-        /**
-         * Inidicates whether or not the buffer is empty.
-         */
-        bool isEmpty() const{
-            return head == tail;
-        }
-
-        /**
-         * Clears the buffer if there is no data remaining.
-         */
-        void normalizeBuffer(){
-            if( isEmpty() ){
-                clear();
-            }
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_BUFFEREDINPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/BufferedOutputStream.cpp b/src/decaf/src/main/decaf/io/BufferedOutputStream.cpp
deleted file mode 100644
index 741ccde..0000000
--- a/src/decaf/src/main/decaf/io/BufferedOutputStream.cpp
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BufferedOutputStream.h"
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedOutputStream::BufferedOutputStream( OutputStream* stream, bool own )
-: FilterOutputStream( stream, own )
-{
-    // Default to 1k buffer.
-    init( 1024 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedOutputStream::BufferedOutputStream( OutputStream* stream,
-    std::size_t bufSize,
-    bool own )
-: FilterOutputStream( stream, own )
-{
-    init( bufSize );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedOutputStream::~BufferedOutputStream()
-{
-    // Destroy the buffer.
-    if( buffer != NULL ){
-        delete [] buffer;
-        buffer = NULL;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedOutputStream::init( std::size_t bufSize ){
-
-    this->bufferSize = bufSize;
-
-    buffer = new unsigned char[bufSize];
-    head = tail = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedOutputStream::close() throw( lang::Exception ){
-
-    // Flush this stream.
-    flush();
-
-    // Close the delegate stream.
-    outputStream->close();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedOutputStream::emptyBuffer() throw ( IOException ){
-
-    if( head != tail ){
-        outputStream->write( buffer+head, tail-head );
-    }
-    head = tail = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedOutputStream::flush() throw ( IOException ){
-
-    // Empty the contents of the buffer to the output stream.
-    emptyBuffer();
-
-    // Flush the output stream.
-    outputStream->flush();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedOutputStream::write( const unsigned char c ) throw ( IOException ){
-
-    if( tail >= bufferSize ){
-        emptyBuffer();
-    }
-
-    buffer[tail++] = c;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedOutputStream::write( const unsigned char* buffer, std::size_t len )
-    throw ( IOException )
-{
-    // Iterate until all the data is written.
-    for( std::size_t pos=0; pos < len; ){
-
-        if( tail >= bufferSize ){
-            emptyBuffer();
-        }
-
-        // Get the number of bytes left to write.
-        std::size_t bytesToWrite = min( (int)bufferSize-tail, len-pos );
-
-        // Copy the data.
-        memcpy( this->buffer+tail, buffer+pos, bytesToWrite );
-
-        // Increase the tail position.
-        tail += bytesToWrite;
-
-        // Decrease the number of bytes to write.
-        pos += bytesToWrite;
-    }
-}
diff --git a/src/decaf/src/main/decaf/io/BufferedOutputStream.h b/src/decaf/src/main/decaf/io/BufferedOutputStream.h
deleted file mode 100644
index 07e6b66..0000000
--- a/src/decaf/src/main/decaf/io/BufferedOutputStream.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BUFFEREDOUTPUTSTREAM_H_
-#define _DECAF_IO_BUFFEREDOUTPUTSTREAM_H_
-
-#include <decaf/io/FilterOutputStream.h>
-#include <assert.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * Wrapper around another output stream that buffers
-     * output before writing to the target output stream.
-     */
-    class DECAF_API BufferedOutputStream : public FilterOutputStream
-    {
-    private:
-
-        /**
-         * The internal buffer.
-         */
-        unsigned char* buffer;
-
-        /**
-         * The size of the internal buffer.
-         */
-        std::size_t bufferSize;
-
-        /**
-         * The current head of the buffer.
-         */
-        std::size_t head;
-
-        /**
-         * The current tail of the buffer.
-         */
-        std::size_t tail;
-
-    public:
-
-        /**
-         * Constructor.
-         * @param stream the target output stream.
-         */
-        BufferedOutputStream( OutputStream* stream, bool own = false );
-
-        /**
-         * Constructor
-         * @param stream the target output stream.
-         * @param bufSize the size for the internal buffer.
-         */
-        BufferedOutputStream( OutputStream* stream,
-                              std::size_t bufSize,
-                              bool own = false);
-
-        virtual ~BufferedOutputStream();
-
-        /**
-         * Writes a single byte to the output stream.
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c ) throw ( IOException );
-
-        /**
-         * Writes an array of bytes to the output stream.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer, std::size_t len )
-            throw ( IOException );
-
-        /**
-         * Invokes flush on the target output stream.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void flush() throw ( IOException );
-
-        /**
-         * Invokes close on the target output stream.
-         * @throws CMSException thrown if an error occurs.
-         */
-        void close() throw( lang::Exception );
-
-   private:
-
-        /**
-         * Initializes the internal structures.
-         */
-        void init( std::size_t bufSize );
-
-        /**
-         * Writes the contents of the buffer to the output stream.
-         */
-        void emptyBuffer() throw ( IOException );
-
-   };
-
-}}
-
-#endif /*_DECAF_IO_BUFFEREDOUTPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/ByteArrayInputStream.cpp b/src/decaf/src/main/decaf/io/ByteArrayInputStream.cpp
deleted file mode 100644
index ca2e035..0000000
--- a/src/decaf/src/main/decaf/io/ByteArrayInputStream.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ByteArrayInputStream.h"
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-ByteArrayInputStream::ByteArrayInputStream(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ByteArrayInputStream::ByteArrayInputStream( const vector<unsigned char>& buffer ){
-    setBuffer(buffer);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ByteArrayInputStream::ByteArrayInputStream( const unsigned char* buffer,
-                                            std::size_t bufferSize ){
-    setByteArray( buffer, bufferSize );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ByteArrayInputStream::~ByteArrayInputStream(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayInputStream::setBuffer( const vector<unsigned char>& buffer ){
-
-    // We're using the default buffer.
-    activeBuffer = &buffer;
-
-    // Begin at the Beginning.
-    reset();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayInputStream::setByteArray( const unsigned char* lbuffer,
-                                         std::size_t lbufferSize ){
-    // We're using the default buffer.
-    activeBuffer = &defaultBuffer;
-
-    // Remove old data
-    defaultBuffer.clear();
-    defaultBuffer.reserve( lbufferSize );
-
-    // Copy data to internal buffer.
-    std::back_insert_iterator< std::vector<unsigned char> > iter( defaultBuffer );
-    std::copy( lbuffer, lbuffer + lbufferSize, iter );
-
-    // Begin at the Beginning.
-    reset();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayInputStream::reset() throw ( lang::Exception){
-    if( activeBuffer == NULL ){
-        throw IOException( __FILE__, __LINE__, "Buffer has not been initialized" );
-    }
-
-    // Begin at the Beginning.
-    pos = activeBuffer->begin();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char ByteArrayInputStream::read() throw ( IOException ){
-    if( pos == activeBuffer->end() ){
-        throw IOException( __FILE__, __LINE__, "Buffer is empty" );
-    }
-
-    return *(pos++);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int ByteArrayInputStream::read( unsigned char* buffer,
-                                std::size_t bufferSize )
-                                   throw ( IOException ){
-    std::size_t ix = 0;
-
-    if( pos == activeBuffer->end() ) {
-        return -1;
-    }
-
-    // How far are we from end
-    std::size_t remaining = (std::size_t)distance( pos, activeBuffer->end() );
-
-    // We only read as much as is left if the amount remaining is less than
-    // the amount of data asked for.
-    bufferSize = remaining < bufferSize ? remaining : bufferSize;
-
-    for( ; ix < bufferSize; ++ix, ++pos) {
-        buffer[ix] = *(pos);
-    }
-
-    return ix;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::size_t ByteArrayInputStream::skip( std::size_t num )
-    throw ( IOException, lang::exceptions::UnsupportedOperationException ){
-
-    std::size_t ix = 0;
-
-    // Increment the position until we've skipped the desired number
-    // or we've hit the end of the buffer.
-    for( ; ix < num && pos != activeBuffer->end(); ++ix, ++pos) {}
-
-    return ix;
-}
diff --git a/src/decaf/src/main/decaf/io/ByteArrayInputStream.h b/src/decaf/src/main/decaf/io/ByteArrayInputStream.h
deleted file mode 100644
index e735bab..0000000
--- a/src/decaf/src/main/decaf/io/ByteArrayInputStream.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BYTEARRAYINPUTSTREAM_H_
-#define _DECAF_IO_BYTEARRAYINPUTSTREAM_H_
-
-#include <decaf/io/InputStream.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <vector>
-#include <algorithm>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * Simple implementation of InputStream that wraps around
-     * a std::vector<unsigned char>.
-     */
-    class DECAF_API ByteArrayInputStream : public InputStream
-    {
-    private:
-
-        /**
-         * Default buffer to use, if none provided.
-         */
-        std::vector<unsigned char> defaultBuffer;
-
-        /**
-         * Reference to the buffer being used by this stream.
-         */
-        const std::vector<unsigned char>* activeBuffer;
-
-        /**
-         * iterator to current position in buffer.
-         */
-        std::vector<unsigned char>::const_iterator pos;
-
-        /**
-         * Synchronization object.
-         */
-        util::concurrent::Mutex mutex;
-
-    public:
-
-        /**
-         * Default Constructor
-         */
-        ByteArrayInputStream();
-
-        /**
-         * Creates the input stream and calls setBuffer with the
-         * specified buffer object.
-         * @param buffer The buffer to be used.
-         */
-        ByteArrayInputStream( const std::vector<unsigned char>& buffer );
-
-        /**
-         * Constructor
-         * @param buffer initial byte array to use to read from
-         * @param bufferSize the size of the buffer
-         */
-        ByteArrayInputStream( const unsigned char* buffer,
-                              std::size_t bufferSize );
-
-        virtual ~ByteArrayInputStream();
-
-        /**
-         * Sets the internal buffer.  The input stream will wrap around
-         * this buffer and will perform all read operations on it.  The
-         * position will be reinitialized to the beginning of the specified
-         * buffer.  This class will not own the given buffer - it is the
-         * caller's responsibility to free the memory of the given buffer
-         * as appropriate.
-         * @param buffer The buffer to be used.
-         */
-        virtual void setBuffer( const std::vector<unsigned char>& buffer );
-
-        /**
-         * Sets the data that this reader uses, replaces any existing
-         * data and resets to beginning of the buffer.
-         * @param buffer initial byte array to use to read from
-         * @param bufferSize the size of the buffer
-         */
-        virtual void setByteArray( const unsigned char* buffer,
-                                   std::size_t bufferSize );
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in millisecsonds to wait, or
-         * WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
-            mutex.wait(millisecs);
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-        /**
-         * Indcates the number of bytes avaialable.
-         * @return The number of bytes until the end of the internal buffer.
-         */
-        virtual std::size_t available() const throw ( IOException ) {
-            if( activeBuffer == NULL ){
-                throw IOException(
-                    __FILE__, __LINE__,
-                    "buffer has not been initialized");
-            }
-
-            return std::distance( pos, activeBuffer->end() );
-        }
-
-        /**
-         * Reads a single byte from the buffer.
-         * @return The next byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual unsigned char read() throw ( IOException );
-
-        /**
-         * Reads an array of bytes from the buffer.
-         * @param buffer (out) the target buffer.
-         * @param bufferSize the size of the output buffer.
-         * @return The number of bytes read.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual int read( unsigned char* buffer, std::size_t bufferSize )
-            throw ( IOException );
-
-        /**
-         * Closes the target input stream.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void close() throw( lang::Exception ){ /* do nothing */ }
-
-        /**
-         * Resets the read index to the beginning of the byte
-         * array.
-         */
-        virtual void reset() throw ( lang::Exception);
-
-        /**
-         * Skips over and discards n bytes of data from this input stream. The
-         * skip method may, for a variety of reasons, end up skipping over some
-         * smaller number of bytes, possibly 0. This may result from any of a
-         * number of conditions; reaching end of file before n bytes have been
-         * skipped is only one possibility. The actual number of bytes skipped
-         * is returned. If n is negative, no bytes are skipped.
-         * <p>
-         * The skip method of InputStream creates a byte array and then
-         * repeatedly reads into it until n bytes have been read or the end
-         * of the stream has been reached. Subclasses are encouraged to
-         * provide a more efficient implementation of this method.
-         * @param num - the number of bytes to skip
-         * @returns total butes skipped
-         * @throws IOException if an error occurs
-         */
-        virtual std::size_t skip( std::size_t num )
-            throw ( io::IOException, lang::exceptions::UnsupportedOperationException );
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_BYTEARRAYINPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/ByteArrayOutputStream.cpp b/src/decaf/src/main/decaf/io/ByteArrayOutputStream.cpp
deleted file mode 100644
index 0be3354..0000000
--- a/src/decaf/src/main/decaf/io/ByteArrayOutputStream.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ByteArrayOutputStream.h"
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-ByteArrayOutputStream::ByteArrayOutputStream()
-{
-    activeBuffer = &defaultBuffer;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ByteArrayOutputStream::ByteArrayOutputStream( vector<unsigned char>& buffer)
-{
-    setBuffer( buffer );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayOutputStream::setBuffer( vector<unsigned char>& buffer)
-{
-    activeBuffer = &buffer;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayOutputStream::clear() throw ( IOException )
-{
-    // Empty the contents of the buffer to the output stream.
-    activeBuffer->clear();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayOutputStream::write( unsigned char c )
-   throw ( IOException )
-{
-    activeBuffer->push_back( c );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteArrayOutputStream::write( const unsigned char* buffer,
-                                   std::size_t len )
-   throw ( IOException )
-{
-    std::back_insert_iterator< std::vector<unsigned char> > iter( *activeBuffer );
-    std::copy( buffer, buffer + len, iter );
-}
-
diff --git a/src/decaf/src/main/decaf/io/ByteArrayOutputStream.h b/src/decaf/src/main/decaf/io/ByteArrayOutputStream.h
deleted file mode 100644
index a8ae484..0000000
--- a/src/decaf/src/main/decaf/io/ByteArrayOutputStream.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BYTEARRAYOUTPUTSTREAM_H_
-#define _DECAF_IO_BYTEARRAYOUTPUTSTREAM_H_
-
-#include <decaf/io/OutputStream.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <vector>
-
-namespace decaf{
-namespace io{
-
-    class DECAF_API ByteArrayOutputStream : public OutputStream
-    {
-    private:
-
-        /**
-         * Default buffer to use, if none provided.
-         */
-        std::vector<unsigned char> defaultBuffer;
-
-        /**
-         * Reference to the buffer being used by this stream.
-         */
-        std::vector<unsigned char>* activeBuffer;
-
-        /**
-         * Synchronization object.
-         */
-        util::concurrent::Mutex mutex;
-
-    public:
-
-        /**
-         * Default Constructor - uses a default internal buffer
-         */
-        ByteArrayOutputStream();
-
-        /**
-         * Uses the given buffer as the target.  Calls setBuffer.
-         * @param buffer the target buffer.
-         */
-        ByteArrayOutputStream( std::vector<unsigned char>& buffer );
-
-        /**
-         * Destructor
-         */
-        virtual ~ByteArrayOutputStream() {};
-
-        /**
-         * Sets the internal buffer.  This input stream will wrap around
-         * the given buffer and all writes will be performed directly on
-         * the buffer.  This object does not retain control of the buffer's
-         * lifetime however - this is the job of the caller.
-         * @param buffer The target buffer.
-         */
-        virtual void setBuffer( std::vector<unsigned char>& buffer );
-
-        /**
-         * Get a snapshot of the data
-         * @return pointer to the data
-         */
-        virtual const unsigned char* getByteArray() const {
-            if( activeBuffer->size() == 0 ){
-                return NULL;
-            }
-
-            return &(*activeBuffer)[0];
-        }
-
-        /**
-         * Get the Size of the Internal Buffer
-         * @return size of the internal buffer
-         */
-        virtual std::size_t getByteArraySize() const {
-            return activeBuffer->size();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
-            mutex.wait(millisecs);
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-        /**
-         * Writes a single byte to the output stream.
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c )
-           throw ( IOException );
-
-        /**
-         * Writes an array of bytes to the output stream.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer, std::size_t len )
-            throw ( IOException );
-
-        /**
-         * Invokes flush on the target output stream, has no affect.
-         * @throws IOException
-         */
-        virtual void flush() throw ( IOException ){ /* do nothing */ }
-
-        /**
-         * Clear current Stream contents
-         * @throws IOException
-         */
-        virtual void clear() throw ( IOException );
-
-        /**
-         * Invokes close on the target output stream.
-         * @throws CMSException
-         */
-        void close() throw( lang::Exception ){ /* do nothing */ }
-
-   };
-
-}}
-
-#endif /*_DECAF_IO_BYTEARRAYOUTPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/Closeable.h b/src/decaf/src/main/decaf/io/Closeable.h
deleted file mode 100644
index f3e8d3e..0000000
--- a/src/decaf/src/main/decaf/io/Closeable.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_CLOSEABLE_H_
-#define _DECAF_IO_CLOSEABLE_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * Interface for a class that implements the close method.
-     */
-    class DECAF_API Closeable{
-
-    public:
-
-        virtual ~Closeable(){}
-
-        /**
-         * Closes this object and deallocates the appropriate resources.
-         * The object is generally no longer usable after calling close.
-         * @throws CMSException
-         */
-        virtual void close() throw( lang::Exception ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_CLOSEABLE_H_*/
diff --git a/src/decaf/src/main/decaf/io/DataInputStream.cpp b/src/decaf/src/main/decaf/io/DataInputStream.cpp
deleted file mode 100644
index e0ebc10..0000000
--- a/src/decaf/src/main/decaf/io/DataInputStream.cpp
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/io/DataInputStream.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-using namespace decaf::util;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-DataInputStream::DataInputStream( InputStream* inputStream, bool own )
- : FilterInputStream( inputStream, own ) {}
-
-////////////////////////////////////////////////////////////////////////////////
-DataInputStream::~DataInputStream() {}
-
-////////////////////////////////////////////////////////////////////////////////
-int DataInputStream::read( std::vector<unsigned char>& buffer )
-    throw ( io::IOException ) {
-
-    try {
-        return this->read( &buffer[0], 0, buffer.size() );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int DataInputStream::read( unsigned char* buffer,
-                           std::size_t offset,
-                           std::size_t length )
-    throw ( IOException, IndexOutOfBoundsException, NullPointerException ) {
-
-    try {
-
-        if( buffer == NULL ) {
-            throw NullPointerException(
-                __FILE__, __LINE__,
-                "DataInputStream::read - Buffer is null" );
-        }
-
-        return inputStream->read( &buffer[offset], length );
-    }
-    DECAF_CATCH_RETHROW( IndexOutOfBoundsException )
-    DECAF_CATCH_RETHROW( NullPointerException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool DataInputStream::readBoolean()
-    throw( IOException, EOFException ) {
-
-    try {
-        unsigned char value = 0;
-        readAllData( &value, sizeof(value) );
-        return (bool)( value != 0 );
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-char DataInputStream::readByte()
-    throw ( IOException, EOFException ) {
-
-    try {
-        unsigned char value = 0;
-        readAllData( &value, sizeof(value) );
-        return (char)( value );
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char DataInputStream::readUnsignedByte()
-    throw ( IOException, EOFException ) {
-
-    try {
-        unsigned char value = 0;
-        readAllData( &value, sizeof(value) );
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-char DataInputStream::readChar() throw ( IOException, EOFException ) {
-    try {
-        unsigned char value = 0;
-        readAllData( &value, sizeof(value) );
-        return (char)( value );
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-short DataInputStream::readShort() throw ( io::IOException, io::EOFException ) {
-    try {
-        short value = 0;
-        unsigned char buffer[sizeof(value)] = {0};
-        readAllData( buffer, sizeof(value) );
-        value |= (buffer[0] << 8 | buffer[1] << 0);
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned short DataInputStream::readUnsignedShort()
-    throw ( io::IOException, io::EOFException ) {
-    try {
-        unsigned short value = 0;
-        unsigned char buffer[sizeof(value)] = {0};
-        readAllData( buffer, sizeof(value) );
-        value |= (buffer[0] << 8 | buffer[1] << 0);
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int DataInputStream::readInt() throw ( io::IOException, io::EOFException ) {
-    try {
-        unsigned int value = 0;
-        unsigned char buffer[sizeof(value)] = {0};
-        readAllData( buffer, sizeof(value) );
-        value |= (buffer[0] << 24 | buffer[1] << 16 |
-                  buffer[2] << 8 | buffer[3] << 0);
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double DataInputStream::readDouble() throw ( io::IOException, io::EOFException ) {
-    try {
-        unsigned long long lvalue = this->readLong();
-        double value = 0.0;
-        memcpy( &value, &lvalue, sizeof( unsigned long long ) );
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float DataInputStream::readFloat() throw ( io::IOException, io::EOFException ) {
-    try {
-        unsigned int lvalue = this->readInt();
-        float value = 0.0f;
-        memcpy( &value, &lvalue, sizeof( unsigned int ) );
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long DataInputStream::readLong()
-    throw ( io::IOException, io::EOFException ) {
-    try {
-        unsigned long long value = 0;
-        unsigned char buffer[sizeof(value)] = {0};
-        readAllData( buffer, sizeof(value) );
-
-        // Have to do it this way because on Solaris and Cygwin we get all
-        // kinds of warnings when shifting a byte up into a long long.
-        unsigned long long byte1 = buffer[0] & 0x00000000000000FFULL;
-        unsigned long long byte2 = buffer[1] & 0x00000000000000FFULL;
-        unsigned long long byte3 = buffer[2] & 0x00000000000000FFULL;
-        unsigned long long byte4 = buffer[3] & 0x00000000000000FFULL;
-        unsigned long long byte5 = buffer[4] & 0x00000000000000FFULL;
-        unsigned long long byte6 = buffer[5] & 0x00000000000000FFULL;
-        unsigned long long byte7 = buffer[6] & 0x00000000000000FFULL;
-        unsigned long long byte8 = buffer[7] & 0x00000000000000FFULL;
-
-        value = ( byte1 << 56 | byte2 << 48 | byte3 << 40 | byte4 << 32 |
-                  byte5 << 24 | byte6 << 16 | byte7 << 8  | byte8 << 0 );
-
-        return value;
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string DataInputStream::readString()
-    throw ( io::IOException, io::EOFException ) {
-    try {
-        size_t size = 1024;
-        std::vector<char> buffer;
-        buffer.resize( size );
-        size_t pos = 0;
-
-        while( true ) {
-
-            if( inputStream->read( (unsigned char*)( &buffer[pos] ), 1 ) == -1 ) {
-                throw EOFException(
-                    __FILE__, __LINE__,
-                    "DataInputStream::readString - Reached EOF" );
-            }
-
-            // if null is found we are done
-            if( buffer[pos] == '\0' ){
-                break;
-            }
-
-            // Resize to hold more if we exceed current size
-            if( ++pos > size ) {
-                buffer.resize( (size *= 2) );
-            }
-        }
-
-        return &buffer[0];
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string DataInputStream::readUTF()
-    throw ( io::IOException, io::EOFException ) {
-    try {
-        std::vector<unsigned char> buffer;
-        unsigned short length = readUnsignedShort();
-        buffer.resize(length + 1);  // Add one for a null charactor.
-
-        std::size_t n = 0;
-        while( n < length ) {
-            int count = inputStream->read( &buffer[n], (length - n) );
-            if( count == -1 ) {
-                throw EOFException(
-                    __FILE__, __LINE__,
-                    "DataInputStream::readUTF - Reached EOF" );
-            }
-            n += count;
-        }
-
-        return (char*)&buffer[0];
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataInputStream::readFully( std::vector< unsigned char >& buffer )
-    throw ( io::IOException, io::EOFException ) {
-    try {
-        if( buffer.empty() ) {
-            return;
-        }
-        this->readFully( &buffer[0], 0, buffer.size() );
-    }
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataInputStream::readFully( unsigned char* buffer,
-                                 std::size_t offset,
-                                 std::size_t length )
-    throw ( io::IOException,
-            io::EOFException,
-            lang::exceptions::IndexOutOfBoundsException,
-            lang::exceptions::NullPointerException )
-{
-    try {
-
-        if( buffer == NULL ) {
-            throw NullPointerException(
-                __FILE__, __LINE__,
-                "DataInputStream::readFully - Buffer is null" );
-        }
-
-        std::size_t n = 0;
-        while( n < length ) {
-            int count = inputStream->read( &buffer[offset + n], (length - n) );
-            if( count == -1 ) {
-                throw EOFException(
-                    __FILE__, __LINE__,
-                    "DataInputStream::readFully - Reached EOF" );
-            }
-            n += count;
-        }
-    }
-    DECAF_CATCH_RETHROW( IndexOutOfBoundsException )
-    DECAF_CATCH_RETHROW( NullPointerException )
-    DECAF_CATCH_RETHROW( EOFException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::size_t DataInputStream::skip( std::size_t num )
-    throw( io::IOException, lang::exceptions::UnsupportedOperationException ) {
-    try {
-        std::size_t total = 0;
-        std::size_t cur = 0;
-
-        while( ( total < num ) &&
-               ( ( cur = inputStream->skip( num-total ) ) > 0 ) ) {
-            total += cur;
-        }
-
-        return total;
-    }
-    DECAF_CATCH_RETHROW( UnsupportedOperationException )
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
diff --git a/src/decaf/src/main/decaf/io/DataInputStream.h b/src/decaf/src/main/decaf/io/DataInputStream.h
deleted file mode 100644
index 8f58898..0000000
--- a/src/decaf/src/main/decaf/io/DataInputStream.h
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_DATAINPUTSTREAM_H_
-#define _DECAF_IO_DATAINPUTSTREAM_H_
-
-#include <decaf/io/FilterInputStream.h>
-#include <decaf/io/IOException.h>
-#include <decaf/io/EOFException.h>
-#include <decaf/lang/exceptions/NullPointerException.h>
-#include <decaf/lang/exceptions/IndexOutOfBoundsException.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * A data input stream lets an application read primitive Java data
-     * types from an underlying input stream in a machine-independent way.
-     * An application uses a data output stream to write data that can
-     * later be read by a data input stream.
-     *
-     * Due to the lack of garbage collection in C++ a design decision was
-     * made to add a boolean parameter to the constructor indicating if the
-     * wrapped <code>InputStream</code> is owned by this object.  That way
-     * creation of the underlying stream can occur in a Java like way. Ex:
-     *
-     *  DataInputStream os = new DataInputStream( new InputStream(), true )
-     */
-    class DECAF_API DataInputStream : public FilterInputStream
-    {
-    public:
-
-        /**
-         * Creates a DataInputStream that uses the specified underlying
-         * InputStream.
-         * @param inputStream the InputStream instance to wrap.
-         * @param own, indicates if this class owns the wrapped string
-         * defaults to false.
-         */
-        DataInputStream( InputStream* inputStream, bool own = false );
-
-        virtual ~DataInputStream();
-
-        /**
-         * Reads some number of bytes from the contained input stream and
-         * stores them into the buffer array b. The number of bytes actually
-         * read is returned as an integer. This method blocks until input
-         * data is available, end of file is detected, or an exception is
-         * thrown.
-         * <p>
-         * If the length of buffer is zero, then no bytes are read and 0 is
-         * returned; otherwise, there is an attempt to read at least one
-         * byte. If no byte is available because the stream is at end of
-         * file, the value -1 is returned; otherwise, at least one byte is
-         * read and stored into buffer.
-         * <p>
-         * The first byte read is stored into element buffer[0], the next one
-         * into buffer[1], and so on. The number of bytes read is, at most,
-         * equal to the length of buffer. Let k be the number of bytes actually
-         * read; these bytes will be stored in elements b[0] through b[k-1],
-         * leaving elements buffer[k] through buffer[buffer.length-1]
-         * unaffected.
-         * <p>
-         * If the first byte cannot be read for any reason other than end
-         * of file, then an IOException is thrown. In particular, an
-         * IOException is thrown if the input stream has been closed.
-         * <p>
-         * The read( buffer ) method has the same effect as:
-         *      read( buffer, 0, b.length )
-         * @param buffer - byte array to insert read data into
-         * @returns the total number of bytes read, or -1 if there is no
-         *          more data because the stream is EOF.
-         * @throws IOException
-         */
-        virtual int read( std::vector< unsigned char >& buffer )
-            throw ( io::IOException );
-
-        /**
-         * Reads up to len bytes of data from the contained input stream
-         * into an array of bytes. An attempt is made to read as many as
-         * len bytes, but a smaller number may be read, possibly zero. The
-         * number of bytes actually read is returned as an integer.
-         * <p>
-         * This method blocks until input data is available, end of file is
-         * detected, or an exception is thrown.
-         * <p>
-         * If buffer is null, a NullPointerException is thrown.
-         * <p>
-         * If off is negative, or len is negative then an
-         * IndexOutOfBoundsException is thrown, if off + len is greater that
-         * the allocated length of the array, an IOException will result
-         * depending on the platform and compiler settings.
-         * <p>
-         * If len is zero, then no bytes are read and 0 is returned;
-         * otherwise, there is an attempt to read at least one byte. If no
-         * byte is available because the stream is at end of file, the
-         * value -1 is returned; otherwise, at least one byte is read and
-         * stored into buffer.
-         * <p>
-         * The first byte read is stored into element b[off], the next one
-         * into buffer[off+1], and so on. The number of bytes read is, at most,
-         * equal to len. Let k be the number of bytes actually read; these
-         * bytes will be stored in elements buffer[off] through buffer[off+k-1],
-         * leaving elements buffer[off+k] through buffer[off+len-1] unaffected.
-         * <p>
-         * In every case, elements buffer[0] through buffer[off] and elements
-         * buffer[off+len] through buffer[buffer.length-1] are unaffected.
-         * <p>
-         * If the first byte cannot be read for any reason other than end of
-         * file, then an IOException is thrown. In particular, an IOException
-         * is thrown if the input stream has been closed.
-         * @param buffer - byte array to insert read data into
-         * @param offset - location in buffer to start writing
-         * @param length - number of bytes to read
-         * @returns the total number of bytes read, or -1 if there is no
-         *          more data because the stream is EOF.
-         * @throws IOException
-         */
-        virtual int read( unsigned char* buffer,
-                          std::size_t offset,
-                          std::size_t length )
-            throw ( io::IOException,
-                    lang::exceptions::IndexOutOfBoundsException,
-                    lang::exceptions::NullPointerException );
-
-        /**
-         * Reads one input byte and returns true if that byte is nonzero,
-         * false if that byte is zero.
-         * @returns the boolean value read.
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual bool readBoolean()
-            throw( io::IOException, io::EOFException );
-
-        /**
-         * Reads and returns one input byte. The byte is treated as a
-         * signed value in the range -128 through 127, inclusive.
-         * @returns the 8-bit value read.
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual char readByte()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads one input byte, zero-extends it to type int, and returns
-         * the result, which is therefore in the range 0  through 255.
-         * @returns the 8 bit unsigned value read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual unsigned char readUnsignedByte()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads an input char and returns the char value. A ascii char
-         * is made up of one bytes.  This returns the same result as
-         * <code>readByte</code>
-         * @returns the 8 bit char read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual char readChar() throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads eight input bytes and returns a double value. It does this
-         * by first constructing a long long  value in exactly the manner of
-         * the readlong  method, then converting this long  value to a double
-         * in exactly the manner of the method Double.longBitsToDouble.
-         * @returns the double value read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual double readDouble()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads four input bytes and returns a float value. It does this
-         * by first constructing an int  value in exactly the manner of the
-         * readInt  method, then converting this int  value to a float in
-         * exactly the manner of the method Float.intBitsToFloat.
-         * @returns the float value read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual float readFloat() throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads four input bytes and returns an int value. Let a  be the
-         * first byte read, b be the second byte, c be the third byte, and
-         * d be the fourth byte. The value returned is: <p>
-         *  (((a & 0xff) << 24) | ((b & 0xff) << 16) |
-         *   ((c & 0xff) << 8) | (d & 0xff))
-         * @returns the int value read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual int readInt() throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads eight input bytes and returns a long value. Let a  be the
-         * first byte read, b be the second byte, c be the third byte, d
-         * be the fourth byte, e be the fifth byte, f  be the sixth byte,
-         * g be the seventh byte, and h be the eighth byte. The value
-         * returned is:
-         *  (((long)(a & 0xff) << 56) |
-         *   ((long)(b & 0xff) << 48) |
-         *   ((long)(c & 0xff) << 40) |
-         *   ((long)(d & 0xff) << 32) |
-         *   ((long)(e & 0xff) << 24) |
-         *   ((long)(f & 0xff) << 16) |
-         *   ((long)(g & 0xff) <<  8) |
-         *   ((long)(h & 0xff)))
-         * @returns the 64 bit long long read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual long long readLong()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads two input bytes and returns a short value. Let a  be the
-         * first byte read and b  be the second byte. The value returned is:
-         *   (short)((a << 8) | (b & 0xff))
-         * @returns the 16 bit short value read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual short readShort() throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads two input bytes and returns an int value in the range 0
-         * through 65535. Let a  be the first byte read and b  be the
-         * second byte. The value returned is:
-         *   (((a & 0xff) << 8) | (b & 0xff))
-         * @returns the 16 bit unsigned short read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual unsigned short readUnsignedShort()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads an null terminated ASCII string to the stream and returns the
-         * string to the caller.
-         * @returns string object containing the string read.
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual std::string readString()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads a UTF8 encoded string in ASCII format and returns it, this is
-         * only useful if you know for sure that the string that is to be read
-         * was a string that contained all ascii values, and not uncide chars.
-         * @returns string read from stream.
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual std::string readUTF()
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads some bytes from an input stream and stores them into the
-         * buffer array buffer. The number of bytes read is equal to the length
-         * of buffer.<p>
-         * This method blocks until one of the following conditions occurs:
-         *    * buffer.size() bytes of input data are available, in which case
-         *      a normal return is made.
-         *    * End of file is detected, in which case an EOFException is
-         *      thrown.
-         *    * An I/O error occurs, in which case an IOException other than
-         *      EOFException is thrown.
-         * <p>
-         * If buffer.size() is zero, then no bytes are read. Otherwise, the
-         * first byte read is stored into element b[0], the next one into
-         * buffer[1], and so on. If an exception is thrown from this method,
-         * then it may be that some but not all bytes of buffer have been
-         * updated with data from the input stream.
-         * @param buffer - vector of char that is read to its size()
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual void readFully( std::vector< unsigned char >& buffer )
-            throw ( io::IOException, io::EOFException );
-
-        /**
-         * Reads length bytes from an input stream.
-         * <p>
-         * This method blocks until one of the following conditions occurs:
-         *    * length bytes of input data are available, in which case a
-         *      normal return is made.
-         *    * End of file is detected, in which case an EOFException is
-         *      thrown.
-         *    * An I/O error occurs, in which case an IOException other
-         *      than EOFException is thrown.
-         * <p>
-         * If buffer is null, a NullPointerException is thrown. If offset is
-         * negative, or len is negative, or offset+length is greater than the
-         * length of the array buffer, then an IndexOutOfBoundsException is
-         * thrown. If len is zero, then no bytes are read. Otherwise, the
-         * first byte read is stored into element buffer[off], the next one into
-         * buffer[offset+1], and so on. The number of bytes read is, at most,
-         * equal to len.
-         * @param buffer - byte array to insert read data into
-         * @param offset - location in buffer to start writing
-         * @param length - number of bytes to read
-         * @throws IOException
-         * @throws EOFException
-         */
-        virtual void readFully( unsigned char* buffer,
-                                std::size_t offset,
-                                std::size_t length )
-            throw ( io::IOException,
-                    io::EOFException,
-                    lang::exceptions::IndexOutOfBoundsException,
-                    lang::exceptions::NullPointerException );
-
-        /**
-         * Makes an attempt to skip over n bytes of data from the input
-         * stream, discarding the skipped bytes. However, it may skip over
-         * some smaller number of bytes, possibly zero. This may result from
-         * any of a number of conditions; reaching end of file before n
-         * bytes have been skipped is only one possibility. This method
-         * never throws an EOFException. The actual number of bytes skipped
-         * is returned.
-         * @param num - number of bytes to skip
-         * @return the total number of bytes skipped
-         */
-        virtual std::size_t skip( std::size_t num )
-            throw( io::IOException,
-                   lang::exceptions::UnsupportedOperationException );
-
-    private:
-
-        // Used internally to reliable get data from the underlying stream
-        inline void readAllData( unsigned char* buffer,
-                                 std::size_t length )
-            throw ( io::IOException,
-                    io::EOFException ) {
-
-            std::size_t n = 0;
-            do{
-                int count = inputStream->read( &buffer[n], length - n );
-                if( count == -1 ) {
-                    throw EOFException(
-                        __FILE__, __LINE__,
-                        "DataInputStream::readLong - Reached EOF" );
-                }
-                n += count;
-            } while( n < length );
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_DATAINPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/DataOutputStream.cpp b/src/decaf/src/main/decaf/io/DataOutputStream.cpp
deleted file mode 100644
index cc3a31b..0000000
--- a/src/decaf/src/main/decaf/io/DataOutputStream.cpp
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/io/DataOutputStream.h>
-#include <decaf/util/Config.h>
-
-using namespace decaf;
-using namespace decaf::io;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-DataOutputStream::DataOutputStream( OutputStream* outputStream, bool own )
- : FilterOutputStream( outputStream, own )
-{
-    // Init the written count
-    written = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-DataOutputStream::~DataOutputStream()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::write( const unsigned char c ) throw ( IOException ) {
-    try {
-        outputStream->write( c );
-        written++;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::write( const std::vector<unsigned char>& buffer )
-    throw ( IOException ) {
-
-    try {
-
-        if( buffer.size() == 0 ){
-            // nothing to write.
-            return;
-        }
-
-        outputStream->write( &buffer[0], buffer.size() );
-        written += buffer.size();
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::write( const unsigned char* buffer, std::size_t len )
-    throw ( IOException ) {
-
-    try {
-        outputStream->write( buffer, len );
-        written += len;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::write( const unsigned char* buffer,
-                              std::size_t offset,
-                              std::size_t len ) throw ( IOException )
-{
-
-    try {
-        outputStream->write( buffer+offset, len );
-        written += len;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeBoolean( bool value ) throw ( IOException ) {
-    try {
-        unsigned char ivalue = 0;
-        value == true ? ivalue = 1 : ivalue = 0;
-
-        outputStream->write( ivalue );
-        written++;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeByte( unsigned char value ) throw ( IOException ) {
-    try {
-        outputStream->write( value );
-        written++;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeChar( char value ) throw ( IOException ) {
-    try {
-        outputStream->write( value );
-        written++;
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeShort( short value ) throw ( IOException ) {
-    try {
-        unsigned char buffer[sizeof(value)];
-
-        buffer[0] = (value & 0xFF00) >> 8;
-        buffer[1] = (value & 0x00FF) >> 0;
-
-        outputStream->write( buffer, sizeof(value) );
-        written += sizeof( value );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeUnsignedShort( unsigned short value )
-    throw ( IOException )
-{
-    try {
-        unsigned char buffer[sizeof(value)];
-
-        buffer[0] = (value & 0xFF00) >> 8;
-        buffer[1] = (value & 0x00FF) >> 0;
-
-        outputStream->write( buffer, sizeof(value) );
-        written += sizeof( value );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeInt( int value ) throw ( IOException ) {
-    try {
-        unsigned char buffer[sizeof(value)];
-
-        buffer[0] = (value & 0xFF000000) >> 24;
-        buffer[1] = (value & 0x00FF0000) >> 16;
-        buffer[2] = (value & 0x0000FF00) >> 8;
-        buffer[3] = (value & 0x000000FF) >> 0;
-
-        outputStream->write( buffer, sizeof(value) );
-        written += sizeof( value );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeLong( long long value ) throw ( IOException ) {
-    try {
-        unsigned char buffer[sizeof(value)];
-
-        buffer[0] = (unsigned char)((value & 0xFF00000000000000ULL) >> 56);
-        buffer[1] = (unsigned char)((value & 0x00FF000000000000ULL) >> 48);
-        buffer[2] = (unsigned char)((value & 0x0000FF0000000000ULL) >> 40);
-        buffer[3] = (unsigned char)((value & 0x000000FF00000000ULL) >> 32);
-        buffer[4] = (unsigned char)((value & 0x00000000FF000000ULL) >> 24);
-        buffer[5] = (unsigned char)((value & 0x0000000000FF0000ULL) >> 16);
-        buffer[6] = (unsigned char)((value & 0x000000000000FF00ULL) >> 8);
-        buffer[7] = (unsigned char)((value & 0x00000000000000FFULL) >> 0);
-
-        outputStream->write( buffer, sizeof(value) );
-        written += sizeof( value );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeFloat( float value ) throw ( IOException ) {
-    try {
-        unsigned int lvalue = 0;
-        memcpy( &lvalue, &value, sizeof( float ) );
-        this->writeInt( lvalue );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeDouble( double value ) throw ( IOException ) {
-    try {
-        unsigned long long lvalue = 0;
-        memcpy( &lvalue, &value, sizeof( double ) );
-        this->writeLong( lvalue );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeBytes( const std::string& value ) throw ( IOException ) {
-    try {
-        // do not add one so that we don't write the NULL
-        this->write( (const unsigned char*)value.c_str(), value.length() );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeChars( const std::string& value ) throw ( IOException ) {
-    try {
-        // add one so that we write the NULL
-        this->write( (const unsigned char*)value.c_str(), value.length() + 1 );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStream::writeUTF( const std::string& value ) throw ( IOException ) {
-    try {
-        this->writeUnsignedShort( (unsigned short)value.length() );
-        this->write( (const unsigned char*)value.c_str(), value.length() );
-    }
-    DECAF_CATCH_RETHROW( IOException )
-    DECAF_CATCHALL_THROW( IOException )
-}
diff --git a/src/decaf/src/main/decaf/io/DataOutputStream.h b/src/decaf/src/main/decaf/io/DataOutputStream.h
deleted file mode 100644
index e6e7f3c..0000000
--- a/src/decaf/src/main/decaf/io/DataOutputStream.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_DATAOUTPUTSTREAM_H_
-#define _DECAF_IO_DATAOUTPUTSTREAM_H_
-
-#include <decaf/io/FilterOutputStream.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * A data output stream lets an application write primitive Java data
-     * types to an output stream in a portable way. An application can then
-     * use a data input stream to read the data back in.
-     */
-    class DECAF_API DataOutputStream : public FilterOutputStream
-    {
-    protected:
-
-        // The number of bytes written to the data output stream so far.
-        std::size_t written;
-
-    public:
-
-        /**
-         * Creates a new data output stream to write data to the specified
-         * underlying output stream.
-         * @param outputStream a stream to wrap with this one.
-         * @param own true if this objects owns the stream that it wraps.
-         */
-        DataOutputStream( OutputStream* outputStream, bool own = false );
-
-        virtual ~DataOutputStream();
-
-        /**
-         * Returns the current value of the counter written, the number of
-         * bytes written to this data output stream so far. If the counter
-         * overflows, it will be wrapped to Integer.MAX_VALUE.
-         * @return the value of the written field.
-         */
-        virtual std::size_t size() const {
-            return written;
-        }
-
-        /**
-         * Writes a single byte to the output stream.  If no exception is
-         * thrown, the counter written is incremented by 1.
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c ) throw ( IOException );
-
-        /**
-         * Writes an array of bytes to the output stream.  the counter
-         * written is incremented by len.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer, std::size_t len )
-            throw ( IOException );
-
-        /**
-         * Writes an array of bytes to the output stream.  the counter
-         * written is incremented by len.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer,
-                            std::size_t offset,
-                            std::size_t len ) throw ( IOException );
-
-        /**
-         * Writes an array of bytes to the output stream.
-         * @param buffer The bytes to write.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const std::vector<unsigned char>& buffer )
-            throw ( IOException );
-
-        /**
-         * Writes a boolean to the underlying output stream as a 1-byte value. The
-         * value true is written out as the value (byte)1; the value false
-         * is written out as the value (byte)0. If no exception is thrown,
-         * the counter written is incremented by 1.
-         * @param value the boolean to write.
-         * @throws IOException
-         *
-         */
-        virtual void writeBoolean( bool value ) throw ( IOException );
-
-        /**
-         * Writes out a byte to the underlying output stream as a 1-byte
-         * value. If no exception is thrown, the counter written is
-         * incremented by 1.
-         * @param value the unsigned char value to write.
-         * @throws IOException
-         */
-        virtual void writeByte( unsigned char value ) throw ( IOException );
-
-        /**
-         * Writes a short to the underlying output stream as two bytes, high
-         * byte first. If no exception is thrown, the counter written is
-         * incremented by 2.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeShort( short value ) throw ( IOException );
-
-        /**
-         * Writes a unsigned short to the bytes message stream as a 2 byte value
-         * @param value - unsigned short to write to the stream
-         * @throws IOException
-         */
-        virtual void writeUnsignedShort( unsigned short value ) throw ( IOException );
-
-        /**
-         * Writes out a char to the underlying output stream as a one byte
-         * value If no exception is thrown, the counter written is
-         * incremented by 1.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeChar( char value ) throw ( IOException );
-
-        /**
-         * Writes an int to the underlying output stream as four bytes, high
-         * byte first. If no exception is thrown, the counter written is
-         * incremented by 4.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeInt( int value ) throw ( IOException );
-
-        /**
-         * Writes an 64 bit long to the underlying output stream as eight
-         * bytes, high byte first. If no exception is thrown, the counter
-         * written is incremented by 8.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeLong( long long value ) throw ( IOException );
-
-        /**
-         * Converts the float argument to an int using the floatToIntBits
-         * method in class Float, and then writes that int value to the
-         * underlying output stream as a 4-byte quantity, high byte first.
-         * If no exception is thrown, the counter written is incremented
-         * by 4.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeFloat( float value ) throw ( IOException );
-
-        /**
-         * Converts the double argument to a long using the doubleToLongBits
-         * method in class Double, and then writes that long value to the
-         * underlying output stream as an 8-byte quantity, high byte first.
-         * If no exception is thrown, the counter written is incremented
-         * by 8.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeDouble( double value ) throw ( IOException );
-
-        /**
-         * Writes out the string to the underlying output stream as a
-         * sequence of bytes. Each character in the string is written out,
-         * in sequence, by discarding its high eight bits. If no exception
-         * is thrown, the counter written is incremented by the length of
-         * value.  The value written does not include a trailing null as that
-         * is not part of the sequence of bytes, if the null is needed, then use
-         * the writeChars method.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeBytes( const std::string& value ) throw ( IOException );
-
-        /**
-         * Writes a string to the underlying output stream as a sequence of
-         * characters. Each character is written to the data output stream
-         * as if by the writeChar method. If no exception is thrown, the
-         * counter written is incremented by the length of value.  The trailing
-         * NULL charactor is written by this method.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeChars( const std::string& value ) throw ( IOException );
-
-        /**
-         * Writes out the string to the underlying output stream as a
-         * unsigned short indicating its length followed by the rest of
-         * the string.
-         * @param value the value to write.
-         * @throws IOException
-         */
-        virtual void writeUTF( const std::string& value ) throw ( IOException );
-    };
-
-}}
-
-#endif /*_DECAF_IO_DATAOUTPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/EOFException.h b/src/decaf/src/main/decaf/io/EOFException.h
deleted file mode 100644
index 736f1a1..0000000
--- a/src/decaf/src/main/decaf/io/EOFException.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_EOFEXCEPTION_H
-#define _DECAF_IO_EOFEXCEPTION_H
-
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace io{
-
-    /*
-     * Signals that an End of File exception has occurred.
-     */
-    class DECAF_API EOFException : public io::IOException
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        EOFException() throw(){}
-
-        /**
-         * Copy Constructor
-         * @param ex the exception to copy
-         */
-        EOFException( const lang::Exception& ex ) throw()
-        : IOException()
-        {
-            *(lang::Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         * @param ex the exception to copy, which is an instance of this type
-         */
-        EOFException( const EOFException& ex ) throw()
-        : IOException()
-        {
-            *(lang::Exception*)this = ex;
-        }
-
-        /**
-         * Consturctor
-         * @param file name of the file were the exception occured.
-         * @param lineNumber line where the exception occured
-         * @param msg the message that was generated
-         */
-        EOFException( const char* file, const int lineNumber,
-                      const char* msg, ... ) throw()
-        : IOException()
-        {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual EOFException* clone() const{
-            return new EOFException( *this );
-        }
-
-        virtual ~EOFException() throw(){}
-
-    };
-
-}}
-
-#endif /*_DECAF*/
diff --git a/src/decaf/src/main/decaf/io/FilterInputStream.h b/src/decaf/src/main/decaf/io/FilterInputStream.h
deleted file mode 100644
index 4929f41..0000000
--- a/src/decaf/src/main/decaf/io/FilterInputStream.h
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_FILTERINPUTSTREAM_H_
-#define _DECAF_IO_FILTERINPUTSTREAM_H_
-
-#include <decaf/io/InputStream.h>
-#include <decaf/io/IOException.h>
-#include <decaf/util/concurrent/Mutex.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * A FilterInputStream contains some other input stream, which it uses
-     * as its basic source of data, possibly transforming the data along the
-     * way or providing additional functionality. The class FilterInputStream
-     * itself simply overrides all methods of InputStream with versions
-     * that pass all requests to the contained input stream. Subclasses of
-     * FilterInputStream  may further override some of these methods and may
-     * also provide additional methods and fields.
-     */
-    class DECAF_API FilterInputStream : public InputStream
-    {
-    protected:
-
-        // The input stream to wrap
-        InputStream* inputStream;
-
-        // Synchronization object.
-        util::concurrent::Mutex mutex;
-
-        // Indicates if we own the wrapped stream
-        bool own;
-
-    public:
-
-        /**
-         * Constructor to create a wrapped InputStream
-         * @param inputStream the stream to wrap and filter
-         * @param own indicates if we own the stream object, defaults to false
-         */
-        FilterInputStream( InputStream* inputStream, bool own = false ) {
-            this->inputStream = inputStream;
-            this->own = own;
-        }
-
-        virtual ~FilterInputStream() {
-            try {
-                if( own == true ) delete inputStream;
-            }
-            DECAF_CATCH_NOTHROW( IOException )
-            DECAF_CATCHALL_NOTHROW( )
-        }
-
-        /**
-         * Returns the number of bytes that can be read from this input stream
-         * without blocking.  This method simply performs in.available() and
-         * returns the result.
-         * @return the number of bytes available without blocking.
-         */
-        virtual std::size_t available() const throw ( IOException ) {
-            try {
-                return inputStream->available();
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Reads the next byte of data from this input stream. The value byte
-         * is returned as an unsigned char in the range 0 to 255. If no byte is
-         * available because the end of the stream has been reached, the value
-         * -1 is returned. This method blocks until input data is available,
-         * the end of the stream is detected, or an exception is thrown.
-         * This method simply performs in.read() and returns the result.
-         * @return The next byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual unsigned char read() throw ( IOException ) {
-            try {
-                return inputStream->read();
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Reads up to len bytes of data from this input stream into an array
-         * of bytes. This method blocks until some input is available.
-         * This method simply performs in.read(b, len) and returns the result.
-         * @param buffer (out) the target buffer.
-         * @param bufferSize the size of the output buffer.
-         * @return The number of bytes read or -1 if EOF is detected
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual int read( unsigned char* buffer, std::size_t bufferSize )
-            throw ( IOException )
-        {
-            try {
-                return inputStream->read( buffer, bufferSize );
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Close the Stream, the FilterOutputStream simply calls the close
-         * method of the underlying stream
-         * @throws Exception
-         */
-        virtual void close() throw ( lang::Exception ) {
-            try {
-                inputStream->close();
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Skips over and discards n bytes of data from this input stream. The
-         * skip method may, for a variety of reasons, end up skipping over some
-         * smaller number of bytes, possibly 0. This may result from any of a
-         * number of conditions; reaching end of file before n bytes have been
-         * skipped is only one possibility. The actual number of bytes skipped
-         * is returned. If n is negative, no bytes are skipped.
-         * <p>
-         * The skip method of InputStream creates a byte array and then
-         * repeatedly reads into it until n bytes have been read or the end
-         * of the stream has been reached. Subclasses are encouraged to
-         * provide a more efficient implementation of this method.
-         * @param num - the number of bytes to skip
-         * @returns total butes skipped
-         * @throws IOException if an error occurs
-         */
-        virtual std::size_t skip( std::size_t num ) throw ( io::IOException, lang::exceptions::UnsupportedOperationException ) {
-            try {
-                return inputStream->skip(num);
-            }
-            DECAF_CATCH_RETHROW( lang::exceptions::UnsupportedOperationException )
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-    public:  // Synchronizable
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
-            mutex.wait(millisecs);
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_FILTERINPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/FilterOutputStream.h b/src/decaf/src/main/decaf/io/FilterOutputStream.h
deleted file mode 100644
index 3dd2651..0000000
--- a/src/decaf/src/main/decaf/io/FilterOutputStream.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_FILTEROUTPUTSTREAM_H_
-#define _DECAF_IO_FILTEROUTPUTSTREAM_H_
-
-#include <decaf/io/OutputStream.h>
-#include <decaf/io/IOException.h>
-#include <decaf/util/concurrent/Mutex.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * This class is the superclass of all classes that filter output
-     * streams. These streams sit on top of an already existing output
-     * stream (the underlying output stream) which it uses as its basic
-     * sink of data, but possibly transforming the data along the way or
-     * providing additional functionality.
-     *
-     * The class FilterOutputStream itself simply overrides all methods of
-     * OutputStream with versions that pass all requests to the underlying
-     * output stream. Subclasses of FilterOutputStream may further override
-     * some of these methods as well as provide additional methods and
-     * fields.
-     *
-     * Due to the lack of garbage collection in C++ a design decision was
-     * made to add a boolean parameter to the constructor indicating if the
-     * wrapped <code>InputStream</code> is owned by this object.  That way
-     * creation of the underlying stream can occur in a Java like way. Ex:
-     *
-     *  DataOutputStream os = new DataOutputStream( new OutputStream(), true )
-     */
-    class DECAF_API FilterOutputStream : public OutputStream
-    {
-    protected:
-
-        // The output Stream to wrap
-        OutputStream* outputStream;
-
-        // Synchronization object.
-        util::concurrent::Mutex mutex;
-
-        // Indicates if we own the wrapped stream
-        bool own;
-
-    public:
-
-        /**
-         * Constructor, creates a wrapped output stream
-         * @param outputStream the OutputStream to wrap
-         * @param own If true, this object will control the lifetime of the
-         * output stream that it encapsulates.
-         */
-        FilterOutputStream( OutputStream* outputStream, bool own = false ){
-            this->outputStream = outputStream;
-            this->own = own;
-        }
-
-        virtual ~FilterOutputStream() {
-            try {
-                if( own == true ) delete outputStream;
-            }
-            DECAF_CATCH_NOTHROW( IOException )
-            DECAF_CATCHALL_NOTHROW( )
-        }
-
-        /**
-         * Writes a single byte to the output stream.  The write method of
-         * FilterOutputStream calls the write method of its underlying output
-         * stream, that is, it performs out.write(b).
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c ) throw ( IOException ) {
-            try {
-                outputStream->write( c );
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Writes an array of bytes to the output stream.  The write method of
-         * FilterOutputStream calls the write method of one argument on each
-         * byte to output.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer, std::size_t len ) throw ( IOException ) {
-            try {
-                for( std::size_t ix = 0; ix < len; ++ix )
-                {
-                    outputStream->write( buffer[ix] );
-                }
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Flushes any pending writes in this output stream.
-         * The flush method of FilterOutputStream calls the flush method
-         * of its underlying output stream
-         * @throws IOException
-         */
-        virtual void flush() throw ( IOException ) {
-            try {
-                outputStream->flush();
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-        /**
-         * Close the Stream, the FilterOutputStream simply calls the close
-         * method of the underlying stream
-         * @throws CMSException
-         */
-        virtual void close() throw ( lang::Exception ) {
-            try {
-                outputStream->close();
-            }
-            DECAF_CATCH_RETHROW( IOException )
-            DECAF_CATCHALL_THROW( IOException )
-        }
-
-    public:  // Synchronizable
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
-            mutex.wait( millisecs );
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_FILTEROUTPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/IOException.h b/src/decaf/src/main/decaf/io/IOException.h
deleted file mode 100644
index 24e553a..0000000
--- a/src/decaf/src/main/decaf/io/IOException.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_IO_IOEXCEPTION_H
-#define _DECAF_IO_IOEXCEPTION_H
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace io{
-
-    /*
-     * Signals that an I/O exception of some sort has occurred.
-     */
-    class DECAF_API IOException : public lang::Exception {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        IOException() throw() {}
-
-        /**
-         * Copy Constructor
-         * @param ex the exception to copy
-         */
-        IOException( const lang::Exception& ex ) throw()
-        : lang::Exception() {
-            *(lang::Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         * @param ex the exception to copy, which is an instance of this type
-         */
-        IOException( const IOException& ex ) throw()
-        : lang::Exception() {
-            *(lang::Exception*)this = ex;
-        }
-
-        /**
-         * Consturctor
-         * @param file name of the file were the exception occured.
-         * @param lineNumber line where the exception occured
-         * @param msg the message that was generated
-         */
-        IOException( const char* file, const int lineNumber,
-                     const char* msg, ... ) throw()
-        : lang::Exception() {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual IOException* clone() const {
-            return new IOException( *this );
-        }
-
-        virtual ~IOException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_IOEXCEPTION_H*/
diff --git a/src/decaf/src/main/decaf/io/InputStream.h b/src/decaf/src/main/decaf/io/InputStream.h
deleted file mode 100644
index e560b52..0000000
--- a/src/decaf/src/main/decaf/io/InputStream.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_INPUTSTREAM_H_
-#define _DECAF_IO_INPUTSTREAM_H_
-
-#include <decaf/io/IOException.h>
-#include <decaf/io/Closeable.h>
-#include <decaf/util/concurrent/Synchronizable.h>
-#include <decaf/lang/exceptions/UnsupportedOperationException.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * Base interface for an input stream.
-     */
-    class DECAF_API InputStream : public Closeable,
-                                  public util::concurrent::Synchronizable
-    {
-    public:
-
-        virtual ~InputStream(){}
-
-        /**
-         * Indcates the number of bytes avaialable.
-         * @return the number of bytes available on this input stream.
-         * @throws IOException if an error occurs.
-         */
-        virtual std::size_t available() const throw ( IOException ) = 0;
-
-        /**
-         * Reads a single byte from the buffer.  Blocks until
-         * data is available.
-         * @return The next byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual unsigned char read() throw ( IOException ) = 0;
-
-        /**
-         * Reads an array of bytes from the buffer.  Blocks until
-         * the requested number of bytes are available.
-         * @param buffer (out) the target buffer.
-         * @param bufferSize the size of the output buffer.
-         * @return The number of bytes read or -1 if EOF is detected
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual int read( unsigned char* buffer, std::size_t bufferSize )
-            throw ( IOException ) = 0;
-
-        /**
-         * Skips over and discards n bytes of data from this input stream. The
-         * skip method may, for a variety of reasons, end up skipping over some
-         * smaller number of bytes, possibly 0. This may result from any of a
-         * number of conditions; reaching end of file before n bytes have been
-         * skipped is only one possibility. The actual number of bytes skipped
-         * is returned. If n is negative, no bytes are skipped.
-         * <p>
-         * The skip method of InputStream creates a byte array and then
-         * repeatedly reads into it until n bytes have been read or the end
-         * of the stream has been reached. Subclasses are encouraged to
-         * provide a more efficient implementation of this method.
-         * @param num - the number of bytes to skip
-         * @returns total butes skipped
-         * @throws IOException if an error occurs
-         */
-        virtual std::size_t skip( std::size_t num )
-            throw ( io::IOException, lang::exceptions::UnsupportedOperationException ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_INPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/InterruptedIOException.h b/src/decaf/src/main/decaf/io/InterruptedIOException.h
deleted file mode 100644
index f891822..0000000
--- a/src/decaf/src/main/decaf/io/InterruptedIOException.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_IO_INTERRUPTEDIOEXCEPTION_H
-#define _DECAF_IO_INTERRUPTEDIOEXCEPTION_H
-
-#include <decaf/lang/Exception.h>
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace io{
-
-    /*
-     * Signals that an I/O exception of some sort has occurred.
-     */
-    class DECAF_API InterruptedIOException : public io::IOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        InterruptedIOException() throw() {}
-
-        /**
-         * Copy Constructor
-         * @param ex the exception to copy
-         */
-        InterruptedIOException( const lang::Exception& ex ) throw()
-        : IOException() {
-            *(lang::Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         * @param ex the exception to copy, which is an instance of this type
-         */
-        InterruptedIOException( const InterruptedIOException& ex ) throw()
-        : IOException() {
-            *(lang::Exception*)this = ex;
-        }
-
-        /**
-         * Consturctor
-         * @param file name of the file were the exception occured.
-         * @param lineNumber line where the exception occured
-         * @param msg the message that was generated
-         */
-        InterruptedIOException( const char* file, const int lineNumber,
-                                const char* msg, ... ) throw()
-        : IOException() {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual InterruptedIOException* clone() const {
-            return new IOException( *this );
-        }
-
-        virtual ~InterruptedIOException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_INTERRUPTEDIOEXCEPTION_H*/
diff --git a/src/decaf/src/main/decaf/io/OutputStream.h b/src/decaf/src/main/decaf/io/OutputStream.h
deleted file mode 100644
index 08d14bc..0000000
--- a/src/decaf/src/main/decaf/io/OutputStream.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_OUTPUTSTREAM_H
-#define _DECAF_IO_OUTPUTSTREAM_H
-
-#include <decaf/io/Closeable.h>
-#include <decaf/io/IOException.h>
-#include <decaf/util/concurrent/Synchronizable.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace io{
-
-    /**
-     * Base interface for an output stream.
-     */
-    class DECAF_API OutputStream : public Closeable,
-                                   public util::concurrent::Synchronizable
-    {
-    public:
-
-        virtual ~OutputStream(){}
-
-        /**
-         * Writes a single byte to the output stream.
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c ) throw ( IOException ) = 0;
-
-        /**
-         * Writes an array of bytes to the output stream.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer, std::size_t len )
-            throw ( IOException ) = 0;
-
-        /**
-         * Flushes any pending writes in this output stream.
-         * @throws IOException
-         */
-        virtual void flush() throw ( IOException ) = 0;
-    };
-
-}}
-
-#endif /*_DECAF_IO_OUTPUTSTREAM_H*/
diff --git a/src/decaf/src/main/decaf/io/Reader.h b/src/decaf/src/main/decaf/io/Reader.h
deleted file mode 100644
index 10b365a..0000000
--- a/src/decaf/src/main/decaf/io/Reader.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_IO_READER_H
-#define _DECAF_IO_READER_H
-
-#include <string>
-#include <decaf/io/IOException.h>
-#include <decaf/io/InputStream.h>
-
-namespace decaf{
-namespace io{
-
-    /*
-     * Reader interface that wraps around an input stream and provides
-     * an interface for extracting the data from the input stream.
-     */
-    class DECAF_API Reader
-    {
-    public:
-
-        virtual ~Reader(){};
-
-        /**
-         * Sets the target input stream.
-         */
-        virtual void setInputStream( InputStream* is ) = 0;
-
-        /**
-         * Gets the target input stream.
-         */
-        virtual InputStream* getInputStream() = 0;
-
-        /**
-         * Attempts to read an array of bytes from the stream.
-         * @param buffer The target byte buffer.
-         * @param count The number of bytes to read.
-         * @return The number of bytes read.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual std::size_t read( unsigned char* buffer, std::size_t count )
-            throw( IOException ) = 0;
-
-        /**
-         * Attempts to read a byte from the input stream
-         * @return The byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual unsigned char readByte() throw( IOException ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_READER_H*/
diff --git a/src/decaf/src/main/decaf/io/StandardErrorOutputStream.h b/src/decaf/src/main/decaf/io/StandardErrorOutputStream.h
deleted file mode 100644
index 57e9bdb..0000000
--- a/src/decaf/src/main/decaf/io/StandardErrorOutputStream.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_IO_STANDARDERROROUTPUTSTREAM_H_
-#define _DECAF_IO_STANDARDERROROUTPUTSTREAM_H_
-
-#include <decaf/io/OutputStream.h>
-#include <decaf/util/concurrent/Mutex.h>
-
-#include <iostream>
-
-namespace decaf{
-namespace io{
-
-    class DECAF_API StandardErrorOutputStream : public OutputStream
-    {
-    private:
-
-        /**
-         * Synchronization object.
-         */
-        util::concurrent::Mutex mutex;
-
-    public:
-
-        /**
-         * Default Constructor
-         */
-        StandardErrorOutputStream(void) {}
-
-        virtual ~StandardErrorOutputStream(void) {}
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void lock() throw( Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs ) throw( lang::Exception ){
-            mutex.wait( millisecs );
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-        /**
-         * Writes a single byte to the output stream.
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c )
-            throw ( IOException )
-        {
-           std::cerr << c;
-        }
-
-        /**
-         * Writes an array of bytes to the output stream.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer, int len )
-            throw ( IOException )
-        {
-            for(int i = 0; i < len; ++i)
-            {
-                std::cerr << buffer[i];
-            }
-        }
-
-        /**
-         * Invokes flush on the target output stream.
-         * throws IOException if an error occurs
-         */
-        virtual void flush() throw ( IOException ){
-            std::cerr.flush();
-        }
-
-        /**
-         * Invokes close on the target output stream.
-         * throws CMSException if an error occurs
-         */
-        void close() throw( lang::Exception ){
-            std::cerr.flush();
-        }
-
-    };
-
-}
-
-#endif /*_DECAF_IO_STANDARDERROROUTPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/io/Writer.h b/src/decaf/src/main/decaf/io/Writer.h
deleted file mode 100644
index b691093..0000000
--- a/src/decaf/src/main/decaf/io/Writer.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_IO_WRITER_H
-#define _DECAF_IO_WRITER_H
-
-#include <string>
-#include <decaf/io/IOException.h>
-#include <decaf/io/OutputStream.h>
-
-namespace decaf{
-namespace io{
-
-    /*
-     * Writer interface for an object that wraps around an output
-     * stream
-     */
-    class DECAF_API Writer
-    {
-    public:
-
-        virtual ~Writer(){};
-
-        /**
-         * Sets the target output stream.
-         * @param Outputstream to use
-         */
-        virtual void setOutputStream( OutputStream* os ) = 0;
-
-        /**
-         * Gets the target output stream.
-         * @returns the output stream currently being used
-         */
-        virtual OutputStream* getOutputStream() = 0;
-
-        /**
-         * Writes a byte array to the output stream.
-         * @param buffer a byte array
-         * @param count the number of bytes in the array to write.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer,
-                            std::size_t count ) throw( IOException ) = 0;
-
-         /**
-          * Writes a byte to the output stream.
-          * @param v The value to be written.
-          * @throws IOException thrown if an error occurs.
-          */
-         virtual void writeByte( unsigned char v ) throw( IOException ) = 0;
-    };
-
-}}
-
-#endif /*_DECAF_IO_WRITER_H*/
diff --git a/src/decaf/src/main/decaf/lang/Boolean.cpp b/src/decaf/src/main/decaf/lang/Boolean.cpp
deleted file mode 100644
index 79c7cf2..0000000
--- a/src/decaf/src/main/decaf/lang/Boolean.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Boolean.h"
-#include <sstream>
-
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-const Boolean Boolean::_FALSE( false );
-const Boolean Boolean::_TRUE( true );
-
-////////////////////////////////////////////////////////////////////////////////
-Boolean::Boolean( bool value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Boolean::Boolean( const std::string& value ) {
-    this->value = parseBoolean( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Boolean::compareTo( const Boolean& b ) const {
-    if( this->value == b.value ) {
-        return 0;
-    } else if( this->value && !b.value ) {
-        return 1;
-    } else {
-        return -1;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Boolean::operator==( const Boolean& b ) const {
-    return this->value == b.value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Boolean::operator<( const Boolean& b ) const {
-    return this->value < b.value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Boolean::compareTo( const bool& b ) const {
-    if( this->value == b ) {
-        return 0;
-    } else if( this->value && !b ) {
-        return 1;
-    } else {
-        return -1;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Boolean::operator==( const bool& b ) const {
-    return this->value == b;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Boolean::operator<( const bool& b ) const {
-    return this->value < b;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Boolean::toString() const {
-    return this->value ? "true" : "false";
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Boolean Boolean::valueOf( const std::string& value ) {
-    return Boolean( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Boolean Boolean::valueOf( bool value ) {
-    return Boolean( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Boolean::parseBoolean( const std::string& value ) {
-    bool ret = 0;
-    std::istringstream istream( value );
-    istream.clear();
-    istream >> std::boolalpha >> ret;
-    return ret;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Boolean::toString( bool value ) {
-    return value ? "true" : "false";
-}
diff --git a/src/decaf/src/main/decaf/lang/Boolean.h b/src/decaf/src/main/decaf/lang/Boolean.h
deleted file mode 100644
index a989dec..0000000
--- a/src/decaf/src/main/decaf/lang/Boolean.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_BOOLEAN_H_
-#define _DECAF_LANG_BOOLEAN_H_
-
-#include <string>
-#include <decaf/lang/Comparable.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Boolean : public Comparable<Boolean>,
-                              public Comparable<bool> {
-    private:
-
-        // This objects boolean value
-        bool value;
-
-    public:
-
-        /**
-         * The Class object representing the primitive false boolean.
-         */
-        static const Boolean _FALSE;
-
-        /**
-         * The Class object representing the primitive type boolean.
-         */
-        static const Boolean _TRUE;
-
-    public:
-
-        /**
-         * @param value - primitive boolean to wrap.
-         */
-        Boolean( bool value );
-
-        /**
-         * @param value - String value to convert to a boolean.
-         */
-        Boolean( const std::string& value );
-
-        virtual ~Boolean() {}
-
-        /**
-         * @returns the primitive boolean value of this object
-         */
-        bool booleanValue() const {
-            return value;
-        }
-
-        /**
-         * @returns the string representation of this Booleans value.
-         */
-        std::string toString() const;
-
-        /**
-         * Compares this Boolean instance with another.
-         * @param b - the Boolean instance to be compared
-         * @return zero if this object represents the same boolean value as the
-         * argument; a positive value if this object represents true and the
-         * argument represents false; and a negative value if this object
-         * represents false and the argument represents true
-         */
-        virtual int compareTo( const Boolean& b ) const;
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Boolean& value ) const;
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Boolean& value ) const;
-
-        /**
-         * @returns true if the two Boolean Objects have the same value.
-         */
-        bool equals( const Boolean& b ) const {
-            return this->value == b.value;
-        }
-
-        /**
-         * Compares this Boolean instance with another.
-         * @param b - the Boolean instance to be compared
-         * @return zero if this object represents the same boolean value as the
-         * argument; a positive value if this object represents true and the
-         * argument represents false; and a negative value if this object
-         * represents false and the argument represents true
-         */
-        virtual int compareTo( const bool& b ) const;
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const bool& value ) const;
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const bool& value ) const;
-
-        /**
-         * @returns true if the two Boolean Objects have the same value.
-         */
-        bool equals( const bool& b ) const {
-            return this->value == b;
-        }
-
-    public:  // Statics
-
-        /**
-         * @returns a Boolean instance of the primitive boolean value
-         */
-        static Boolean valueOf( bool value );
-
-        /**
-         * @returns a Boolean instance of the string value
-         */
-        static Boolean valueOf( const std::string& value );
-
-        /**
-         * Parses the String passed and extracts an bool.
-         * @param String to parse
-         * @return bool value
-         */
-        static bool parseBoolean( const std::string& value );
-
-        /**
-         * Converts the bool to a String representation
-         * @param bool to convert
-         * @return string representation
-         */
-        static std::string toString( bool value );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_BOOLEAN_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Byte.cpp b/src/decaf/src/main/decaf/lang/Byte.cpp
deleted file mode 100644
index addd8be..0000000
--- a/src/decaf/src/main/decaf/lang/Byte.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Byte.h"
-#include <decaf/lang/Integer.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-Byte::Byte( unsigned char value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Byte::Byte( const std::string& value ) throw( exceptions::NumberFormatException ) {
-    this->value = parseByte( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Byte::toString() const {
-    return string( 1, this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Byte::toString( unsigned char value ) {
-    return Integer::toString( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char Byte::parseByte( const std::string& s, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    int intValue = Integer::parseInt( s, radix );
-    unsigned char result = (unsigned char)intValue;
-    if( result != intValue ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Byte::parseByte - Not a valid unsigned char encoded string.");
-    }
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char Byte::parseByte( const std::string& s )
-    throw ( exceptions::NumberFormatException ) {
-
-    return parseByte( s, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Byte Byte::decode( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    int intValue = Integer::decode( value ).intValue();
-    unsigned char result = (unsigned char)intValue;
-    if( result != intValue ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Byte::decode - Not a valid unsigned char encoded string.");
-    }
-
-    return Byte( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Byte Byte::valueOf( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Byte( parseByte( value, 10 ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Byte Byte::valueOf( const std::string& value, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Byte( parseByte( value, radix ) );
-}
diff --git a/src/decaf/src/main/decaf/lang/Byte.h b/src/decaf/src/main/decaf/lang/Byte.h
deleted file mode 100644
index 9762bf5..0000000
--- a/src/decaf/src/main/decaf/lang/Byte.h
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_BYTE_H_
-#define _DECAF_LANG_BYTE_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Number.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Byte : public Number,
-                           public Comparable<Byte>,
-                           public Comparable<unsigned char> {
-    private:
-
-        unsigned char value;
-
-    public:
-
-        /** The minimum value that a unsigned char can take on. */
-        static const unsigned char MIN_VALUE = 0x7F;
-
-        /** The maximum value that a unsigned char can take on. */
-        static const unsigned char MAX_VALUE = 0x80;
-
-        /** The size of the primitive charactor in bits. */
-        static const int SIZE = 8;
-
-    public:
-
-        /**
-         * @param value - the primitive value to wrap
-         */
-        Byte( unsigned char value );
-
-        /**
-         * @param value - the string to convert to an unsigned char
-         * @throws NumberFormatException
-         */
-        Byte( const std::string& value ) throw( exceptions::NumberFormatException );
-
-        virtual ~Byte() {}
-
-        /**
-         * Compares this Byte instance with another.
-         * @param c - the Byte instance to be compared
-         * @return zero if this object represents the same char value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Byte& c ) const {
-            return this->value < c.value ? -1 : (this->value > c.value) ? 1 : 0;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Byte& c ) const {
-            return this->value == c.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Byte& c ) const {
-            return this->value < c.value;
-        }
-
-        /**
-         * Compares this Byte instance with a char type.
-         * @param c - the char instance to be compared
-         * @return zero if this object represents the same char value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const unsigned char& c ) const {
-            return this->value < c ? -1 : (this->value > c) ? 1 : 0;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const unsigned char& c ) const {
-            return this->value == c;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const unsigned char& c ) const {
-            return this->value < c;
-        }
-
-        /**
-         * @returns true if the two Byte Objects have the same value.
-         */
-        bool equals( const Byte& c ) const {
-            return this->value == c.value;
-        }
-
-        /**
-         * @returns true if the two Bytes have the same value.
-         */
-        bool equals( const unsigned char& c ) const {
-            return this->value == c;
-        }
-
-        /**
-         * @returns this Byte Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return (double)this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return (float)this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return byte the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return short the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return (short)this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return (int)this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return (long long)this->value;
-        }
-
-    public:    // statics
-
-        /**
-         * @returns a string representing the primitive value as Base 10
-         */
-        static std::string toString( unsigned char value );
-
-        /**
-         * Decodes a String into a Byte. Accepts decimal, hexadecimal, and octal
-         * numbers given by the following grammar:
-         *
-         * The sequence of characters following an (optional) negative sign and/or
-         * radix specifier ("0x", "0X", "#", or leading zero) is parsed as by the
-         * Byte::parseByte method with the indicated radix (10, 16, or 8). This
-         * sequence of characters must represent a positive value or a
-         * NumberFormatException will be thrown. The result is negated if first
-         * character of the specified String is the minus sign. No whitespace
-         * characters are permitted in the string.
-         * @param value - The string to decode
-         * @returns a Byte object containing the decoded value
-         * @throws NumberFomatException if the string is not formatted correctly.
-         */
-        static Byte decode( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Parses the string argument as a signed unsigned char in the radix specified by
-         * the second argument. The characters in the string must all be digits,
-         * of the specified radix (as determined by whether
-         * Character.digit(char, int) returns a nonnegative value) except that the
-         * first character may be an ASCII minus sign '-'  ('\u002D') to indicate
-         * a negative value. The resulting byte value is returned.
-         *
-         * An exception of type NumberFormatException is thrown if any of the
-         * following situations occurs:
-         *  * The first argument is null or is a string of length zero.
-         *  * The radix is either smaller than Character.MIN_RADIX or larger than
-         *    Character::MAX_RADIX.
-         *  * Any character of the string is not a digit of the specified radix,
-         *    except that the first character may be a minus sign '-' provided
-         *    that the string is longer than length 1.
-         *  * The value represented by the string is not a value of type unsigned char.
-         *
-         * @param s - the String containing the unsigned char to be parsed
-         * @param radix - the radix to be used while parsing s
-         * @return the unsigned char represented by the string argument in the
-         * 	       specified radix.
-         * @throws NumberFormatException - If String does not contain a parsable
-         *         unsigned char.
-         */
-        static unsigned char parseByte( const std::string& s, int radix )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Parses the string argument as a signed decimal unsigned char. The
-         * characters in the string must all be decimal digits, except that the
-         * first character may be an ASCII minus sign '-' ('\u002D') to indicate a
-         * negative value. The resulting unsigned char value is returned, exactly as
-         * if the argument and the radix 10 were given as arguments to the
-         * parseByte( const std::string, int ) method.
-         * @param s - String to convert to a unsigned char
-         * @returns the converted unsigned char value
-         * @throws NumberFormatException if the string is not a unsigned char.
-         */
-        static unsigned char parseByte( const std::string& s )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Character instance representing the specified char value.
-         * @param value - the primitive char to wrap.
-         * @returns a new Charactor instance that wraps this value.
-         */
-        static Byte valueOf( unsigned char value ) {
-            return Byte( value );
-        }
-
-        /**
-         * Returns a Byte object holding the value given by the specified std::string.
-         * The argument is interpreted as representing a signed decimal unsigned char,
-         * exactly as if the argument were given to the parseByte( std::string )
-         * method. The result is a Byte object that represents the unsigned char value
-         * specified by the string.
-         * @param value - std::string to parse as base 10
-         * @return new Byte Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a decimal unsigned char.
-         */
-        static Byte valueOf( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Byte object holding the value extracted from the specified
-         * std::string when parsed with the radix given by the second argument.
-         * The first argument is interpreted as representing a signed unsigned char
-         * in the radix specified by the second argument, exactly as if the argument
-         * were given to the parseByte( std::string, int ) method. The result is a
-         * Byte object that represents the unsigned char value specified by the
-         * string.
-         * @param value - std::string to parse as base ( radix )
-         * @param radix - base of the string to parse.
-         * @return new Byte Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a valid unsigned char.
-         */
-        static Byte valueOf( const std::string& value, int radix )
-            throw ( exceptions::NumberFormatException );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_BYTE_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Character.cpp b/src/decaf/src/main/decaf/lang/Character.cpp
deleted file mode 100644
index e387808..0000000
--- a/src/decaf/src/main/decaf/lang/Character.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/lang/Character.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-Character::Character( char value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Character::toString() const {
-    return string( 1, this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Character::digit( char c, int radix ) {
-    if( radix >= MIN_RADIX && radix <= MAX_RADIX ) {
-        int result = -1;
-        if( '0' <= c && c <= '9' ) {
-            result = c - '0';
-        } else if( 'a' <= c && c <= 'z' ) {
-            result = c - ('a' - 10);
-        } else if( 'A' <= c && c <= 'Z' ) {
-            result = c - ('A' - 10);
-        }
-        return result < radix ? result : -1;
-    }
-    return -1;
-}
diff --git a/src/decaf/src/main/decaf/lang/Character.h b/src/decaf/src/main/decaf/lang/Character.h
deleted file mode 100644
index f39e611..0000000
--- a/src/decaf/src/main/decaf/lang/Character.h
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_CHARACTER_H_
-#define _DECAF_LANG_CHARACTER_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Number.h>
-#include <decaf/lang/Comparable.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Character : public Number,
-                                public Comparable<Character>,
-                                public Comparable<char> {
-    private:
-
-        // The primitive Char value
-        char value;
-
-    public:
-
-        /** The minimum radix available for conversion to and from strings. */
-        static const int MIN_RADIX = 2;
-
-        /** The maximum radix available for conversion to and from strings. */
-        static const int MAX_RADIX = 36;
-
-        /** The minimum value that a signed char can take on. */
-        static const char MIN_VALUE = (char)0x7F;
-
-        /** The maximum value that a signed char can take on. */
-        static const char MAX_VALUE = (char)0x80;
-
-        /** The size of the primitive charactor in bits. */
-        static const int SIZE = 8;
-
-    public:
-
-        /**
-         * @param value - char to wrap.
-         */
-        Character( char value );
-
-        /**
-         * Compares this Character instance with another.
-         * @param c - the Character instance to be compared
-         * @return zero if this object represents the same char value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Character& c ) const {
-            return this->value < c.value ? -1 : (this->value > c.value) ? 1 : 0;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Character& c ) const {
-            return this->value == c.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Character& c ) const {
-            return this->value < c.value;
-        }
-
-        /**
-         * Compares this Character instance with a char type.
-         * @param c - the char instance to be compared
-         * @return zero if this object represents the same char value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const char& c ) const {
-            return this->value < c ? -1 : (this->value > c) ? 1 : 0;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const char& c ) const {
-            return this->value == c;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param c - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const char& c ) const {
-            return this->value < c;
-        }
-
-        /**
-         * @returns true if the two Character Objects have the same value.
-         */
-        bool equals( const Character& c ) const {
-            return this->value == c.value;
-        }
-
-        /**
-         * @returns true if the two Characters have the same value.
-         */
-        bool equals( const char& c ) const {
-            return this->value == c;
-        }
-
-        /**
-         * @returns this Character Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return (double)this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return (float)this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return (short)this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return (int)this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return (long long)this->value;
-        }
-
-    public:    // statics
-
-        /**
-         * Returns a Character instance representing the specified char value.
-         * @param value - the primitive char to wrap.
-         * @returns a new Charactor instance that wraps this value.
-         */
-        static Character valueOf( char value ) {
-            return Character( value );
-        }
-
-        /**
-         * Indicates whether or not the given character is considered
-         * whitespace.
-         */
-        static bool isWhitespace( char c ){
-            switch ( c )
-            {
-                case '\n':
-                case '\t':
-                case '\r':
-                case '\f':
-                case ' ':
-                    return true;
-            }
-
-            return false;
-        }
-
-        /**
-         * Indicates whether or not the given character is
-         * a digit.
-         */
-        static bool isDigit( char c ){
-            return c >= '0' && c <= '9';
-        }
-
-        /**
-         * Indicates whether or not the given character is
-         * a lower case character.
-         */
-        static bool isLowerCase( char c ){
-            return c >= 'a' && c <= 'z';
-        }
-
-        /**
-         * Indicates whether or not the given character is
-         * a upper case character.
-         */
-        static bool isUpperCase( char c ){
-            return c >= 'A' && c <= 'Z';
-        }
-
-        /**
-         * Indicates whether or not the given character is
-         * a letter.
-         */
-        static bool isLetter( char c ){
-            return isUpperCase(c) || isLowerCase(c);
-        }
-
-        /**
-         * Indicates whether or not the given character is
-         * either a letter or a digit.
-         */
-        static bool isLetterOrDigit( char c ){
-            return isLetter(c) || isDigit(c);
-        }
-
-        /**
-         * Answers whether the character is an ISO control character, which
-         * is a char that lays in the range of 0 to 1f and 7f to 9f
-         * @param c - the character, including supplementary characters
-         * @return true if the char is an ISO control character
-         */
-        static bool isISOControl( char c ) {
-            return ( c >= 0 && c <= 0x1f ) ||
-                   ( (unsigned char)c >= 0x7f && (unsigned char)c <= 0x9f );
-        }
-
-        /**
-         * Returns the numeric value of the character ch in the specified radix.
-         *
-         * If the radix is not in the range MIN_RADIX <= radix <= MAX_RADIX or if
-         * the value of ch is not a valid digit in the specified radix, -1 is
-         * returned. A character is a valid digit if at least one of the following
-         * is true:
-         *
-         *    * The method isDigit is true of the character and the single-character
-         *      decomposition is less than the specified radix. In this case the
-         *      decimal digit value is returned.
-         *    * The character is one of the uppercase Latin letters 'A' through 'Z'
-         *      and its code is less than radix + 'A' - 10. In this case,
-         *      ch - 'A' + 10 is returned.
-         *    * The character is one of the lowercase Latin letters 'a' through 'z'
-         *      and its code is less than radix + 'a' - 10. In this case,
-         *      ch - 'a' + 10 is returned.
-         *
-         * @param c - the char to be converted
-         * @param radix - the radix of the number
-         * @returns the numeric value of the number represented in the given radix
-         */
-        static int digit( char c, int radix );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_CHARACTER_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Comparable.h b/src/decaf/src/main/decaf/lang/Comparable.h
deleted file mode 100644
index 3ccfc76..0000000
--- a/src/decaf/src/main/decaf/lang/Comparable.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_COMPARABLE_H_
-#define _DECAF_LANG_COMPARABLE_H_
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * This interface imposes a total ordering on the objects of each class that
-     * implements it. This ordering is referred to as the class's natural
-     * ordering, and the class's compareTo method is referred to as its natural
-     * comparison method.
-     */
-    template< typename T >
-    class Comparable{
-    public:
-
-        virtual ~Comparable() {}
-
-        /**
-         * Compares this object with the specified object for order. Returns a
-         * negative integer, zero, or a positive integer as this object is less
-         * than, equal to, or greater than the specified object.
-         *
-         * In the foregoing description, the notation sgn(expression) designates
-         * the mathematical signum function, which is defined to return one of
-         * -1, 0, or 1 according to whether the value of expression  is negative,
-         * zero or positive. The implementor must ensure sgn(x.compareTo(y)) ==
-         * -sgn(y.compareTo(x)) for all x and y. (This implies that x.compareTo(y)
-         * must throw an exception iff y.compareTo(x) throws an exception.)
-         *
-         * The implementor must also ensure that the relation is transitive:
-         * (x.compareTo(y)>0 && y.compareTo(z)>0) implies x.compareTo(z)>0.
-         *
-         * Finally, the implementer must ensure that x.compareTo(y)==0 implies
-         * that sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for all z.
-         *
-         * It is strongly recommended, but not strictly required that
-         * (x.compareTo(y)==0) == (x.equals(y)). Generally speaking, any class
-         * that implements the Comparable interface and violates this condition
-         * should clearly indicate this fact. The recommended language is
-         * "Note: this class has a natural ordering that is inconsistent with
-         * equals."
-         * @param value - the Object to be compared.
-         * @returns a negative integer, zero, or a positive integer as this
-         * object is less than, equal to, or greater than the specified object.
-         */
-        virtual int compareTo( const T& value ) const = 0;
-
-        /**
-         * @return true if this value is considered equal to the passed value.
-         */
-        virtual bool equals( const T& value ) const = 0;
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const T& value ) const = 0;
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const T& value ) const = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_COMPARABLE_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Double.cpp b/src/decaf/src/main/decaf/lang/Double.cpp
deleted file mode 100644
index c0f6a4b..0000000
--- a/src/decaf/src/main/decaf/lang/Double.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Double.h"
-#include <decaf/lang/Long.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-const double Double::MAX_VALUE = 1.7976931348623157e+308;
-const double Double::MIN_VALUE = 5e-324;
-const double Double::NaN = 0.0f / 0.0f;
-const double Double::POSITIVE_INFINITY = 1.0f / 0.0f;
-const double Double::NEGATIVE_INFINITY = -1.0f / 0.0f;
-
-////////////////////////////////////////////////////////////////////////////////
-Double::Double( double value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Double::Double( const std::string& value ) throw( exceptions::NumberFormatException ) {
-    this->value = Double::parseDouble( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Double::compareTo( const Double& d ) const {
-    return Double::compare( this->value, d.value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Double::compareTo( const double& d ) const {
-    return Double::compare( this->value, d );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Double::toString() const {
-    return Double::toString( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Double::isInfinite() const {
-    return Double::isInfinite( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Double::isNaN() const {
-    return Double::isNaN( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Double::compare( double d1, double d2 ) {
-
-    long long l1, l2 = 0;
-    long NaNbits = Double::doubleToLongBits( Double::NaN );
-
-    if( ( l1 = Double::doubleToLongBits( d1 ) ) == NaNbits ) {
-        if( Double::doubleToLongBits( d2 ) == NaNbits ) {
-            return 0;
-        }
-        return 1;
-    }
-
-    if( ( l2 = Double::doubleToLongBits( d2 ) ) == NaNbits ) {
-        return -1;
-    }
-
-    if( d1 == d2 ) {
-        if( l1 == l2 ) {
-            return 0;
-        }
-
-        // check for -0
-        return l1 > l2 ? 1 : -1;
-    }
-
-    return d1 > d2 ? 1 : -1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Double::doubleToLongBits( double value ) {
-
-    long long longValue = 0;
-    memcpy( &longValue, &value, sizeof( double ) );
-
-    if( ( longValue & DOUBLE_EXPONENT_MASK ) == DOUBLE_EXPONENT_MASK ) {
-        if( longValue & DOUBLE_MANTISSA_MASK ) {
-            return DOUBLE_NAN_BITS;
-        }
-    }
-
-    return longValue;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Double::doubleToRawLongBits( double value ) {
-
-    long long longValue = 0;
-    memcpy( &longValue, &value, sizeof( double ) );
-    return longValue;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Double::isInfinite( double value ) {
-    return ( value == POSITIVE_INFINITY ) || ( value == NEGATIVE_INFINITY );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Double::isNaN( double value ) {
-    return value != value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Double::longBitsToDouble( long long bits ) {
-    double result = 0;
-    memcpy( &result, &bits, sizeof( long long ) );
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Double::parseDouble( const std::string value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return 0; // TODO
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Double::toHexString( double value ) {
-    /*
-     * Reference: http://en.wikipedia.org/wiki/IEEE_754
-     */
-    if( value != value ) {
-        return "NaN";
-    }
-    if( value == POSITIVE_INFINITY ) {
-        return "Infinity";
-    }
-    if( value == NEGATIVE_INFINITY ) {
-        return "-Infinity";
-    }
-
-    unsigned long long bitValue = Double::doubleToLongBits( value );
-
-    bool negative = ( bitValue & 0x8000000000000000LL ) != 0;
-    // mask exponent bits and shift down
-    unsigned long long exponent = ( bitValue & 0x7FF0000000000000LL ) >> 52;
-    // mask significand bits and shift up
-    unsigned long long significand = bitValue & 0x000FFFFFFFFFFFFFLL;
-
-    if( exponent == 0 && significand == 0 ) {
-        return ( negative ? "-0x0.0p0" : "0x0.0p0" );
-    }
-
-    // Start with sign and hex indicator
-    std::string hexString( negative ? "-0x" : "0x" );
-
-    if( exponent == 0 ) {
-        // denormal (subnormal) value
-        hexString.append("0.");
-        // significand is 52-bits, so there can be 13 hex digits
-        unsigned int fractionDigits = 13;
-        // remove trailing hex zeros, so Integer.toHexString() won't print
-        // them
-        while( ( significand != 0 ) && ( ( significand & 0xF ) == 0 ) ) {
-            significand >>= 4;
-            fractionDigits--;
-        }
-        // this assumes Integer.toHexString() returns lowercase characters
-        std::string hexSignificand = Long::toHexString( significand );
-
-        // if there are digits left, then insert some '0' chars first
-        if( significand != 0 && fractionDigits > hexSignificand.length() ) {
-            int digitDiff = fractionDigits - hexSignificand.length();
-            while( digitDiff-- != 0 ) {
-                hexString.append( "0" );
-            }
-        }
-
-        hexString.append( hexSignificand );
-        hexString.append( "p-1022" );
-    } else {
-        // normal value
-        hexString.append( "1." );
-        // significand is 52-bits, so there can be 13 hex digits
-        unsigned int fractionDigits = 13;
-        // remove trailing hex zeros, so Integer.toHexString() won't print
-        // them
-        while( (significand != 0 ) && ( ( significand & 0xF ) == 0 ) ) {
-            significand >>= 4;
-            fractionDigits--;
-        }
-        // this assumes Integer.toHexString() returns lowercase characters
-        std::string hexSignificand = Long::toHexString( significand );
-
-        // if there are digits left, then insert some '0' chars first
-        if( significand != 0 && fractionDigits > hexSignificand.length() ) {
-            int digitDiff = fractionDigits - hexSignificand.length();
-            while( digitDiff-- != 0 ) {
-                hexString.append( "0" );
-            }
-        }
-
-        hexString.append( hexSignificand );
-        hexString.append( "p" );
-        // remove exponent's 'bias' and convert to a string
-        hexString.append( Long::toString( exponent - 1023 ) );
-    }
-
-    return hexString;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Double::toString( double value ) {
-    return ""; //TODO
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Double Double::valueOf( double value ) {
-    return Double( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Double Double::valueOf( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return valueOf( parseDouble( value ) );
-}
diff --git a/src/decaf/src/main/decaf/lang/Double.h b/src/decaf/src/main/decaf/lang/Double.h
deleted file mode 100644
index 39b8b21..0000000
--- a/src/decaf/src/main/decaf/lang/Double.h
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_DOUBLE_H_
-#define _DECAF_LANG_DOUBLE_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/Number.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Double : public Number,
-                             public Comparable<Double>,
-                             public Comparable<double> {
-    private:
-
-        double value;
-
-    public:
-
-        /** The size in bits of the primitive int type */
-        static const int SIZE = 64;
-
-        /** The maximum value that the primitive type can hold */
-        static const double MAX_VALUE;
-
-        /** The minimum value that the primitive type can hold */
-        static const double MIN_VALUE;
-
-        /** Constant for the Not a Number Value */
-        static const double NaN;
-
-        /** Constant for Positive Infinity */
-        static const double POSITIVE_INFINITY;
-
-        /** Constant for Negative Infinitiy */
-        static const double NEGATIVE_INFINITY;
-
-    public:
-
-        /**
-         * @param value - the primitve type to wrap
-         */
-        Double( double value );
-
-        /**
-         * @param value - the string to convert to a primitve type to wrap
-         */
-        Double( const std::string& value ) throw( exceptions::NumberFormatException );
-
-        virtual ~Double() {}
-
-        /**
-         * Compares this Double instance with another.
-         * @param d - the Double instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Double& d ) const;
-
-        /**
-         * @param d - the Double object to compare against.
-         * @returns true if the two Double Objects have the same value.
-         */
-        bool equals( const Double& d ) const {
-            return this->value == d.value;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param d - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Double& d ) const {
-            return this->value == d.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param d - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Double& d ) const {
-            return this->value < d.value;
-        }
-
-        /**
-         * Compares this Double instance with another.
-         * @param d - the Double instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const double& d ) const;
-
-        /**
-         * @param d - the Double object to compare against.
-         * @returns true if the two Double Objects have the same value.
-         */
-        bool equals( const double& d ) const {
-            return this->value == d;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param d - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const double& d ) const {
-            return this->value == d;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param d - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const double& d ) const {
-            return this->value < d;
-        }
-
-        /**
-         * @returns this Double Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return (float)this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return byte the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return short the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return (short)this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return (int)this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return (long long)this->value;
-        }
-
-        /**
-         * @returns true if the double is equal to positive infinity.
-         */
-        bool isInfinite() const;
-
-        /**
-         * @returns true if the double is equal to NaN.
-         */
-        bool isNaN() const;
-
-    public:  // Statics
-
-        /**
-         * Compares the two specified double values. The sign of the integer value
-         * returned is the same as that of the integer that would be returned by the
-         * call:
-         *        new Double(d1).compareTo(new Double(d2))
-         * @param d1 - the first double to compare
-         * @param d2 - the second double to compare
-         * @returns the value 0 if d1 is numerically equal to d2; a value less than
-         * 0 if d1 is numerically less than d2; and a value greater than 0  if d1 is
-         * numerically greater than d2.
-         */
-        static int compare( double d1, double d2 );
-
-        /**
-         * Returns a representation of the specified floating-point value according
-         * to the IEEE 754 floating-point "double format" bit layout.
-         *
-         * Bit 63 (the bit that is selected by the mask 0x8000000000000000L)
-         * represents the sign of the floating-point number. Bits 62-52 (the bits
-         * that are selected by the mask 0x7ff0000000000000L) represent the exponent.
-         * Bits 51-0 (the bits that are selected by the mask 0x000fffffffffffffL)
-         * represent the significand (sometimes called the mantissa) of the
-         * floating-point number.
-         *
-         * If the argument is positive infinity, the result is 0x7ff0000000000000L.
-         * If the argument is negative infinity, the result is 0xfff0000000000000L.
-         * If the argument is NaN, the result is 0x7ff8000000000000L.
-         *
-         * In all cases, the result is a long integer that, when given to the
-         * longBitsToDouble(long) method, will produce a floating-point value the
-         * same as the argument to doubleToLongBits (except all NaN values are
-         * collapsed to a single "canonical" NaN value).
-         * @param value - double to be converted
-         * @returns the long long bits that make up the double
-         */
-        static long long doubleToLongBits( double value );
-
-        /**
-         * Returns a representation of the specified floating-point value according
-         * to the IEEE 754 floating-point "double format" bit layout, preserving
-         * Not-a-Number (NaN) values.
-         *
-         * Bit 63 (the bit that is selected by the mask 0x8000000000000000LL)
-         * represents the sign of the floating-point number. Bits 62-52 (the bits
-         * that are selected by the mask 0x7ff0000000000000L) represent the exponent.
-         * Bits 51-0 (the bits that are selected by the mask 0x000fffffffffffffL)
-         * represent the significand (sometimes called the mantissa) of the
-         * floating-point number.
-         *
-         * If the argument is positive infinity, the result is 0x7ff0000000000000LL.
-         * If the argument is negative infinity, the result is 0xfff0000000000000LL.
-         * If the argument is NaN, the result is the long integer representing the
-         * actual NaN value. Unlike the doubleToLongBits method, doubleToRawLongBits
-         * does not collapse all the bit patterns encoding a NaN to a single
-         * "canonical" NaN value.
-         *
-         * In all cases, the result is a long integer that, when given to the
-         * longBitsToDouble(long) method, will produce a floating-point value the
-         * same as the argument to doubleToRawLongBits.
-         * @param value - double to be converted
-         * @returns the long long bits that make up the double
-         */
-        static long long doubleToRawLongBits( double value );
-
-        /**
-         * @param value - The double to check.
-         * @returns true if the double is equal to infinity.
-         */
-        static bool isInfinite( double value );
-
-        /**
-         * @param value - The double to check.
-         * @returns true if the double is equal to NaN.
-         */
-        static bool isNaN( double value );
-
-        /**
-         * Returns the double value corresponding to a given bit representation.
-         * The argument is considered to be a representation of a floating-point
-         * value according to the IEEE 754 floating-point "double format" bit layout.
-         *
-         * If the argument is 0x7ff0000000000000L, the result is positive infinity.
-         * If the argument is 0xfff0000000000000L, the result is negative infinity.
-         * If the argument is any value in the range 0x7ff0000000000001L through
-         * 0x7fffffffffffffffL or in the range 0xfff0000000000001L through
-         * 0xffffffffffffffffL, the result is a NaN. No IEEE 754 floating-point
-         * operation provided by C++ can distinguish between two NaN values of the
-         * same type with different bit patterns. Distinct values of NaN are only
-         * distinguishable by use of the Double.doubleToRawLongBits method.
-         * @param bits - the long long bits to convert to double
-         * @return the double converted from the bits
-         */
-        static double longBitsToDouble( long long bits );
-
-        /**
-         * Returns a new double initialized to the value represented by the
-         * specified string, as performed by the valueOf method of class Double.
-         * @param value - The string to parse to an double
-         * @returns a double parsed from the passed string
-         * @throws NumberFormatException
-         */
-        static double parseDouble( const std::string value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a hexadecimal string representation of the double argument. All
-         * characters mentioned below are ASCII characters.
-         *
-         *  * If the argument is NaN, the result is the string "NaN".
-         *  * Otherwise, the result is a string that represents the sign and magnitude
-         *    (absolute value) of the argument. If the sign is negative, the first
-         *    character of the result is '-'; if the sign is positive, no sign
-         *    character appears in the result. As for the magnitude m:
-         *      o If m is infinity, it is represented by the string "Infinity"; thus,
-         *        positive infinity produces the result "Infinity" and negative
-         *        infinity produces the result "-Infinity".
-         *      o If m is zero, it is represented by the string "0x0.0p0"; thus,
-         *        negative zero produces the result "-0x0.0p0" and positive zero
-         *        produces the result "0x0.0p0".
-         *      o If m is a double value with a normalized representation, substrings
-         *        are used to represent the significand and exponent fields. The
-         *        significand is represented by the characters "0x1." followed by a
-         *        lowercase hexadecimal representation of the rest of the
-         *        significand as a fraction. Trailing zeros in the hexadecimal
-         *        representation are removed unless all the digits are zero, in which
-         *        case a single zero is used. Next, the exponent is represented by
-         *        "p" followed by a decimal string of the unbiased exponent as if
-         *        produced by a call to Integer.toString on the exponent value.
-         *      o If m is a double value with a subnormal representation, the
-         *        significand is represented by the characters "0x0." followed by a
-         *        hexadecimal representation of the rest of the significand as a
-         *        fraction. Trailing zeros in the hexadecimal representation are
-         *        removed. Next, the exponent is represented by "p-126". Note that
-         *        there must be at least one nonzero digit in a subnormal significand.
-         *
-         * @param value - The double to convert to a string
-         * @returns the Hex formatted double string.
-         */
-        static std::string toHexString( double value );
-
-        /**
-         * Returns a string representation of the double argument. All characters
-         * mentioned below are ASCII characters.
-         *
-         * If the argument is NaN, the result is the string "NaN".
-         * Otherwise, the result is a string that represents the sign and magnitude
-         * (absolute value) of the argument. If the sign is negative, the first
-         * character of the result is '-'; if the sign is positive, no
-         * sign character appears in the result. As for the magnitude m:
-         *  o If m is infinity, it is represented by the characters "Infinity"; thus,
-         *    positive infinity produces the result "Infinity" and negative infinity
-         *    produces the result "-Infinity".
-         *  o If m is zero, it is represented by the characters "0.0"; thus, negative
-         *    zero produces the result "-0.0" and positive zero produces the result
-         *    "0.0".
-         *  o If m is greater than or equal to 10-3 but less than 107, then it is
-         *    represented as the integer part of m, in decimal form with no leading
-         *    zeroes, followed by '.', followed by one or more decimal digits
-         *    representing the fractional part of m.
-         *  o If m is less than 10-3 or greater than or equal to 107, then it is
-         *    represented in so-called "computerized scientific notation." Let n be
-         *    the unique integer such that 10n <= m < 10n+1; then let a be the
-         *    mathematically exact quotient of m and 10n so that 1 <= a < 10.
-         *    The magnitude is then represented as the integer part of a, as a
-         *    single decimal digit, followed by '.', followed by decimal digits
-         *    representing the fractional part of a, followed by the letter 'E',
-         *    followed by a representation of n as a decimal integer, as produced
-         *    by the method Integer.toString(int).
-         * @param value - The double to convert to a string
-         * @returns the formatted double string.
-         */
-        static std::string toString( double value );
-
-        /**
-         * Returns a Double instance representing the specified double value.
-         * @param value - double to wrap
-         * @returns new Double instance wrapping the primitive value
-         */
-        static Double valueOf( double value );
-
-        /**
-         * Returns a Double instance that wraps a primtive double which is parsed
-         * from the string value passed.
-         * @param value - the string to parse
-         * @returns a new Double instance wrapping the double parsed from value
-         * @throws NumberFormatException on error.
-         */
-        static Double valueOf( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-    private:
-
-        static const long long DOUBLE_SIGN_MASK = 0x8000000000000000LL;
-        static const long long DOUBLE_EXPONENT_MASK = 0x7FF0000000000000LL;
-        static const long long DOUBLE_MANTISSA_MASK = 0x000FFFFFFFFFFFFFLL;
-        static const long long DOUBLE_NAN_BITS =
-            DOUBLE_EXPONENT_MASK | 0x0008000000000000LL;
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_DOUBLE_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Exception.cpp b/src/decaf/src/main/decaf/lang/Exception.cpp
deleted file mode 100644
index b4d3974..0000000
--- a/src/decaf/src/main/decaf/lang/Exception.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <stdio.h>
-#include "Exception.h"
-#include <decaf/util/logging/LoggerDefines.h>
-#include <sstream>
-
-#include <apr_pools.h>
-#include <apr_strings.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::util::logging;
-
-////////////////////////////////////////////////////////////////////////////////
-Exception::Exception() throw(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Exception::Exception( const Exception& ex ) throw() : Throwable() {
-    *this = ex;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Exception::Exception( const char* file, const int lineNumber,
-                      const char* msg, ... ) throw() {
-    va_list vargs;
-    va_start( vargs, msg ) ;
-    buildMessage( msg, vargs );
-
-    // Set the first mark for this exception.
-    setMark( file, lineNumber );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Exception::~Exception() throw(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Exception::setMessage( const char* msg, ... ){
-    va_list vargs;
-    va_start( vargs, msg );
-    buildMessage( msg, vargs );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Exception::buildMessage( const char* format, va_list& vargs ) {
-
-    // Allocate buffer with a guess of it's size
-    apr_pool_t* pool = NULL;
-    apr_pool_create( &pool, NULL );
-
-    // Allocate a buffer of the specified size.
-    char* buffer = apr_pvsprintf( pool, format, vargs );
-
-    // Guessed size was enough. Assign the string.
-    message.assign( buffer, strlen( buffer ) );
-
-    // assign isn't passing ownership, just copying, delete
-    // the allocated buffer.
-    apr_pool_destroy( pool );
-
-    //decaf::util::logger::SimpleLogger logger("com.yadda1");
-    //logger.log( message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Exception::setMark( const char* file, const int lineNumber ) {
-
-    // Add this mark to the end of the stack trace.
-    stackTrace.push_back( std::make_pair( (std::string)file, (int)lineNumber ) );
-
-    std::ostringstream stream;
-    stream << "\tFILE: " << stackTrace[stackTrace.size()-1].first;
-    stream << ", LINE: " << stackTrace[stackTrace.size()-1].second;
-
-    //decaf::util::logger::SimpleLogger logger("com.yadda2");
-    //logger.log( stream.str() );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Exception* Exception::clone() const {
-    return new Exception( *this );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::vector< std::pair< std::string, int> > Exception::getStackTrace() const {
-    return stackTrace;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Exception::printStackTrace() const {
-    printStackTrace( std::cerr );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Exception::printStackTrace( std::ostream& stream ) const {
-    stream << getStackTraceString();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Exception::getStackTraceString() const {
-
-    // Create the output stream.
-    std::ostringstream stream;
-
-    // Write the message and each stack entry.
-    stream << message << std::endl;
-    for( unsigned int ix=0; ix<stackTrace.size(); ++ix ){
-        stream << "\tFILE: " << stackTrace[ix].first;
-        stream << ", LINE: " << stackTrace[ix].second;
-        stream << std::endl;
-    }
-
-    // Return the string from the output stream.
-    return stream.str();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Exception& Exception::operator =( const Exception& ex ){
-    this->message = ex.message;
-    this->stackTrace = ex.stackTrace;
-    return *this;
-}
diff --git a/src/decaf/src/main/decaf/lang/Exception.h b/src/decaf/src/main/decaf/lang/Exception.h
deleted file mode 100644
index ac567c6..0000000
--- a/src/decaf/src/main/decaf/lang/Exception.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTION_EXCEPTION_H_
-#define _DECAF_LANG_EXCEPTION_EXCEPTION_H_
-
-#include <decaf/lang/Throwable.h>
-#include <decaf/lang/exceptions/ExceptionDefines.h>
-#include <decaf/util/Config.h>
-#include <stdarg.h>
-#include <sstream>
-
-namespace decaf{
-namespace lang{
-
-    /*
-     * Base class for all exceptions.
-     */
-    class DECAF_API Exception : public Throwable
-    {
-    private:
-
-        /**
-         * The cause of this exception.
-         */
-        std::string message;
-
-        /**
-         * The stack trace.
-         */
-        std::vector< std::pair< std::string, int> > stackTrace;
-
-    public:
-
-        /**
-         * Default Constructor
-         */
-        Exception() throw();
-
-        /**
-         * Copy Constructor
-         */
-        Exception( const Exception& ex ) throw();
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        Exception( const char* file, const int lineNumber,
-                   const char* msg, ... ) throw();
-
-        virtual ~Exception() throw();
-
-        /**
-         * Gets the message for this exception.
-         * @return Text formatted error message
-         */
-        virtual std::string getMessage() const{
-            return message;
-        }
-
-        /**
-         * Implement method from std::exception
-         * @return the const char* of <code>getMessage()</code>.
-         */
-        virtual const char* what() const throw (){
-            return message.c_str();
-        }
-
-        /**
-         * Sets the cause for this exception.
-         * @param msg the format string for the msg.
-         * @param variable - params to format into the string
-         */
-        virtual void setMessage( const char* msg, ... );
-
-        /**
-         * Adds a file/line number to the stack trace.
-         * @param file The name of the file calling this method (use __FILE__).
-         * @param lineNumber The line number in the calling file (use __LINE__).
-         */
-        virtual void setMark( const char* file, const int lineNumber );
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         * @return Copy of this Exception object
-         */
-        virtual Exception* clone() const;
-
-        /**
-         * Provides the stack trace for every point where
-         * this exception was caught, marked, and rethrown.  The first
-         * item in the returned vector is the first point where the mark
-         * was set (e.g. where the exception was created).
-         * @return the stack trace.
-         */
-        virtual std::vector< std::pair< std::string, int> > getStackTrace() const;
-
-        /**
-         * Prints the stack trace to std::err
-         */
-        virtual void printStackTrace() const;
-
-        /**
-         * Prints the stack trace to the given output stream.
-         * @param stream the target output stream.
-         */
-        virtual void printStackTrace( std::ostream& stream ) const;
-
-        /**
-         * Gets the stack trace as one contiguous string.
-         * @return string with formatted stack trace data
-         */
-        virtual std::string getStackTraceString() const;
-
-        /**
-         * Assignment operator.
-         * @param const reference to another Exception
-         */
-        virtual Exception& operator =( const Exception& ex );
-
-    protected:
-
-        virtual void buildMessage( const char* format, va_list& vargs );
-
-   };
-
-}}
-
-#endif /*_DECAF_LANG_EXCEPTION_EXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Float.cpp b/src/decaf/src/main/decaf/lang/Float.cpp
deleted file mode 100644
index aa13ade..0000000
--- a/src/decaf/src/main/decaf/lang/Float.cpp
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Float.h"
-#include <decaf/lang/Integer.h>
-#include <decaf/internal/util/FloatingPointParser.h>
-#include <decaf/internal/util/NumberConverter.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-const float Float::MAX_VALUE = 3.40282346638528860e+38f;
-const float Float::MIN_VALUE = 1.40129846432481707e-45f;
-const float Float::NaN = 0.0f / 0.0f;
-const float Float::POSITIVE_INFINITY = 1.0f / 0.0f;
-const float Float::NEGATIVE_INFINITY = -1.0f / 0.0f;
-
-////////////////////////////////////////////////////////////////////////////////
-Float::Float( float value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Float::Float( double value ) {
-    this->value = (float)value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Float::Float( const std::string& value ) throw( exceptions::NumberFormatException ) {
-    this->value = Float::parseFloat( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Float::compareTo( const Float& f ) const {
-    return Float::compare( this->value, f.value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Float::compareTo( const float& f ) const {
-    return Float::compare( this->value, f );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Float::toString() const {
-    return Float::toString( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Float::isInfinite() const {
-    return Float::isInfinite( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Float::isNaN() const {
-    return Float::isNaN( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Float::compare( float f1, float f2 ) {
-
-    int i1, i2 = 0;
-    long NaNbits = Float::floatToIntBits( Float::NaN );
-
-    if( ( i1 = Float::floatToIntBits( f1 ) ) == NaNbits ) {
-        if( Float::floatToIntBits( f2 ) == NaNbits ) {
-            return 0;
-        }
-        return 1;
-    }
-
-    if( ( i2 = Float::floatToIntBits( f2 ) ) == NaNbits ) {
-        return -1;
-    }
-
-    if( f1 == f2 ) {
-        if( i1 == i2 ) {
-            return 0;
-        }
-
-        // check for -0
-        return i1 > i2 ? 1 : -1;
-    }
-
-    return f1 > f2 ? 1 : -1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Float::floatToIntBits( float value ) {
-
-    int intValue = 0;
-    memcpy( &intValue, &value, sizeof( float ) );
-
-    if( ( intValue & SINGLE_EXPONENT_MASK ) == SINGLE_EXPONENT_MASK )
-    {
-        if( intValue & SINGLE_MANTISSA_MASK )
-        {
-            return SINGLE_NAN_BITS;
-        }
-    }
-
-    return intValue;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Float::floatToRawIntBits( float value ) {
-
-    int intValue = 0;
-    memcpy( &intValue, &value, sizeof( float ) );
-    return intValue;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Float::intBitsToFloat( int bits ) {
-
-    float floatValue = 0;
-    memcpy( &floatValue, &bits, sizeof( int ) );
-    return floatValue;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Float::isInfinite( float value ) {
-    return ( value == POSITIVE_INFINITY ) || ( value == NEGATIVE_INFINITY );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Float::isNaN( float value ) {
-    return value != value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Float::parseFloat( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return internal::util::FloatingPointParser::parseFloat( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Float::toHexString( float value ) {
-    /*
-     * Reference: http://en.wikipedia.org/wiki/IEEE_754
-     */
-    if( value != value ) {
-        return "NaN";
-    }
-    if( value == POSITIVE_INFINITY ) {
-        return "Infinity";
-    }
-    if( value == NEGATIVE_INFINITY ) {
-        return "-Infinity";
-    }
-
-    unsigned int bitValue = Float::floatToIntBits( value );
-
-    bool negative = ( bitValue & 0x80000000 ) != 0;
-    // mask exponent bits and shift down
-    unsigned int exponent = ( bitValue & 0x7f800000 ) >> 23;
-    // mask significand bits and shift up
-    // significand is 23-bits, so we shift to treat it like 24-bits
-    unsigned int significand = ( bitValue & 0x007FFFFF ) << 1;
-
-    if( exponent == 0 && significand == 0 ) {
-        return ( negative ? "-0x0.0p0" : "0x0.0p0" );
-    }
-
-    // Start with the correct sign and Hex indicator
-    std::string hexString( negative ? "-0x" : "0x" );
-
-    if( exponent == 0 ) {
-        // denormal (subnormal) value
-        hexString.append( "0." );
-        // significand is 23-bits, so there can be 6 hex digits
-        unsigned int fractionDigits = 6;
-        // remove trailing hex zeros, so Integer.toHexString() won't print
-        // them
-        while( ( significand != 0 ) && ( ( significand & 0xF ) == 0 ) ) {
-            significand >>= 4;
-            fractionDigits--;
-        }
-        // this assumes Integer.toHexString() returns lowercase characters
-        std::string hexSignificand = Integer::toHexString( significand );
-
-        // if there are digits left, then insert some '0' chars first
-        if( significand != 0 && fractionDigits > hexSignificand.length() ) {
-            unsigned int digitDiff = fractionDigits - hexSignificand.length();
-            while( digitDiff-- != 0 ) {
-                hexString.append( "0" );
-            }
-        }
-        hexString.append( hexSignificand );
-        hexString.append( "p-126" );
-    } else {
-        // normal value
-        hexString.append( "1." );
-        // significand is 23-bits, so there can be 6 hex digits
-        unsigned int fractionDigits = 6;
-        // remove trailing hex zeros, so Integer.toHexString() won't print
-        // them
-        while( (significand != 0) && ((significand & 0xF ) == 0 ) ) {
-            significand >>= 4;
-            fractionDigits--;
-        }
-        // this assumes Integer.toHexString() returns lowercase characters
-        std::string hexSignificand = Integer::toHexString( significand );
-
-        // if there are digits left, then insert some '0' chars first
-        if( significand != 0 && fractionDigits > hexSignificand.length() ) {
-            unsigned int digitDiff = fractionDigits - hexSignificand.length();
-            while( digitDiff-- != 0 ) {
-                hexString.append( "0" );
-            }
-        }
-        hexString.append( hexSignificand );
-        hexString.append( "p" );
-        // remove exponent's 'bias' and convert to a string
-        hexString.append( Integer::toString( exponent - 127 ) );
-    }
-
-    return hexString;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Float::toString( float value ) {
-    return internal::util::NumberConverter::convert( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Float Float::valueOf( float value ) {
-    return Float( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Float Float::valueOf( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return valueOf( parseFloat( value ) );
-}
diff --git a/src/decaf/src/main/decaf/lang/Float.h b/src/decaf/src/main/decaf/lang/Float.h
deleted file mode 100644
index 0abd8ed..0000000
--- a/src/decaf/src/main/decaf/lang/Float.h
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_FLOAT_H_
-#define _DECAF_LANG_FLOAT_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Number.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Float : public Number,
-                            public Comparable<Float>,
-                            public Comparable<float> {
-    private:
-
-        float value;
-
-    public:
-
-        /** The size in bits of the primitive int type */
-        static const int SIZE = 32;
-
-        /** The maximum value that the primitive type can hold */
-        static const float MAX_VALUE;
-
-        /** The minimum value that the primitive type can hold */
-        static const float MIN_VALUE;
-
-        /** Constant for the Not a Number Value */
-        static const float NaN;
-
-        /** Constant for Positive Infinity */
-        static const float POSITIVE_INFINITY;
-
-        /** Constant for Negative Infinitiy */
-        static const float NEGATIVE_INFINITY;
-
-    public:
-
-        /**
-         * @param value - the primitve type to wrap
-         */
-        Float( float value );
-
-        /**
-         * @param value - the primitve type to wrap
-         */
-        Float( double value );
-
-        /**
-         * @param value - the string to convert to a primitve type to wrap
-         */
-        Float( const std::string& value ) throw( exceptions::NumberFormatException );
-
-        virtual ~Float() {}
-
-        /**
-         * Compares this Float instance with another.
-         * @param f - the Float instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Float& f ) const;
-
-        /**
-         * @param f - the Float object to compare against.
-         * @returns true if the two Float Objects have the same value.
-         */
-        bool equals( const Float& f ) const {
-            return this->value == f.value;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param f - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Float& f ) const {
-            return this->value == f.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param f - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Float& f ) const {
-            return this->value < f.value;
-        }
-
-        /**
-         * Compares this Float instance with another.
-         * @param f - the Float instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const float& f ) const;
-
-        /**
-         * @param f - the Float object to compare against.
-         * @returns true if the two Float Objects have the same value.
-         */
-        bool equals( const float& f ) const {
-            return this->value == f;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param f - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const float& f ) const {
-            return this->value == f;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param f - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const float& f ) const {
-            return this->value < f;
-        }
-
-        /**
-         * @returns this Float Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return (double)this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return byte the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return short the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return (short)this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return (int)this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return (long long)this->value;
-        }
-
-        /**
-         * @returns true if the float is equal to positive infinity.
-         */
-        bool isInfinite() const;
-
-        /**
-         * @returns true if the float is equal to NaN.
-         */
-        bool isNaN() const;
-
-    public:   // Statics
-
-        /**
-         * Compares the two specified double values. The sign of the integer value
-         * returned is the same as that of the integer that would be returned by the
-         * call: Float( f1 ).compareTo( Float( f2) )
-         * @param f1 - the first double to compare
-         * @param f2 - the second double to compare
-         * @returns the value 0 if d1 is numerically equal to f2; a value less than
-         * 0 if f1 is numerically less than f2; and a value greater than 0  if f1 is
-         * numerically greater than f2.
-         */
-        static int compare( float f1, float f2 );
-
-        /**
-         * Returns a representation of the specified floating-point value according
-         * to the IEEE 754 floating-point "single format" bit layout.
-         *
-         * Bit 31 (the bit that is selected by the mask 0x80000000) represents the
-         * sign of the floating-point number. Bits 30-23 (the bits that are selected
-         * by the mask 0x7f800000) represent the exponent. Bits 22-0 (the bits that
-         * are selected by the mask 0x007fffff) represent the significand (sometimes
-         * called the mantissa) of the floating-point number.
-         *
-         * If the argument is positive infinity, the result is 0x7f800000.
-         * If the argument is negative infinity, the result is 0xff800000.
-         * If the argument is NaN, the result is 0x7fc00000.
-         *
-         * In all cases, the result is an integer that, when given to the
-         * intBitsToFloat(int) method, will produce a floating-point value the
-         * same as the argument to floatToIntBits (except all NaN values are
-         * collapsed to a single "canonical" NaN value).
-         * @param value - the float to convert to int bits
-         * @returns the int that holds the float's value
-         */
-        static int floatToIntBits( float value );
-
-        /**
-         * Returns a representation of the specified floating-point value according
-         * to the IEEE 754 floating-point "single format" bit layout, preserving
-         * Not-a-Number (NaN) values.
-         *
-         * Bit 31 (the bit that is selected by the mask 0x80000000) represents the
-         * sign of the floating-point number. Bits 30-23 (the bits that are selected
-         * by the mask 0x7f800000) represent the exponent. Bits 22-0 (the bits that
-         * are selected by the mask 0x007fffff) represent the significand (sometimes
-         * called the mantissa) of the floating-point number.
-         *
-         * If the argument is positive infinity, the result is 0x7f800000.
-         * If the argument is negative infinity, the result is 0xff800000.
-         * If the argument is NaN, the result is the integer representing the
-         * actual NaN value. Unlike the floatToIntBits method, intToRawIntBits
-         * does not collapse all the bit patterns encoding a NaN to a single
-         * "canonical" NaN value.
-         *
-         * In all cases, the result is an integer that, when given to the
-         * intBitsToFloat(int) method, will produce a floating-point value the same
-         * as the argument to floatToRawIntBits.
-         * @param the float to convert to a raw int
-         * @returns the raw int value of the float
-         */
-        static int floatToRawIntBits( float value );
-
-        /**
-         * Returns the float value corresponding to a given bit representation. The
-         * argument is considered to be a representation of a floating-point value
-         * according to the IEEE 754 floating-point "single format" bit layout.
-         *
-         * If the argument is 0x7f800000, the result is positive infinity.
-         * If the argument is 0xff800000, the result is negative infinity.
-         * If the argument is any value in the range 0x7f800001 through 0x7fffffff
-         * or in the range 0xff800001 through 0xffffffff, the result is a NaN. No
-         * IEEE 754 floating-point operation provided by C++ can distinguish
-         * between two NaN values of the same type with different bit patterns.
-         * Distinct values of NaN are only distinguishable by use of the
-         * Float::floatToRawIntBits method.
-         *
-         * @param bits - the bits of the float encoded as a float
-         * @return a new float created from the int bits.
-         */
-        static float intBitsToFloat( int bits );
-
-        /**
-         * @param value - The float to check.
-         * @returns true if the float is equal to infinity.
-         */
-        static bool isInfinite( float value );
-
-        /**
-         * @param value - The float to check.
-         * @returns true if the float is equal to NaN.
-         */
-        static bool isNaN( float value );
-
-        /**
-         * Returns a new float initialized to the value represented by the
-         * specified string, as performed by the valueOf method of class Float.
-         * @param value - the string to parse
-         * @returns a float parsed from the string
-         * @throw NumberFormatException
-         */
-        static float parseFloat( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a hexadecimal string representation of the float argument. All
-         * characters mentioned below are ASCII characters.
-         *
-         *  * If the argument is NaN, the result is the string "NaN".
-         *  * Otherwise, the result is a string that represents the sign and magnitude
-         *    (absolute value) of the argument. If the sign is negative, the first
-         *    character of the result is '-'; if the sign is positive, no sign
-         *    character appears in the result. As for the magnitude m:
-         *      o If m is infinity, it is represented by the string "Infinity"; thus,
-         *        positive infinity produces the result "Infinity" and negative
-         *        infinity produces the result "-Infinity".
-         *      o If m is zero, it is represented by the string "0x0.0p0"; thus,
-         *        negative zero produces the result "-0x0.0p0" and positive zero
-         *        produces the result "0x0.0p0".
-         *      o If m is a float value with a normalized representation, substrings
-         *        are used to represent the significand and exponent fields. The
-         *        significand is represented by the characters "0x1." followed by a
-         *        lowercase hexadecimal representation of the rest of the
-         *        significand as a fraction. Trailing zeros in the hexadecimal
-         *        representation are removed unless all the digits are zero, in which
-         *        case a single zero is used. Next, the exponent is represented by
-         *        "p" followed by a decimal string of the unbiased exponent as if
-         *        produced by a call to Integer.toString on the exponent value.
-         *      o If m is a float value with a subnormal representation, the
-         *        significand is represented by the characters "0x0." followed by a
-         *        hexadecimal representation of the rest of the significand as a
-         *        fraction. Trailing zeros in the hexadecimal representation are
-         *        removed. Next, the exponent is represented by "p-126". Note that
-         *        there must be at least one nonzero digit in a subnormal significand.
-         *
-         * @param value - The float to convert to a string
-         * @returns the Hex formatted float string.
-         */
-        static std::string toHexString( float value );
-
-        /**
-         * Returns a string representation of the float  argument. All characters
-         * mentioned below are ASCII characters.
-         *
-         * If the argument is NaN, the result is the string "NaN".
-         * Otherwise, the result is a string that represents the sign and magnitude
-         * (absolute value) of the argument. If the sign is negative, the first
-         * character of the result is '-'; if the sign is positive, no
-         * sign character appears in the result. As for the magnitude m:
-         *  o If m is infinity, it is represented by the characters "Infinity"; thus,
-         *    positive infinity produces the result "Infinity" and negative infinity
-         *    produces the result "-Infinity".
-         *  o If m is zero, it is represented by the characters "0.0"; thus, negative
-         *    zero produces the result "-0.0" and positive zero produces the result
-         *    "0.0".
-         *  o If m is greater than or equal to 10-3 but less than 107, then it is
-         *    represented as the integer part of m, in decimal form with no leading
-         *    zeroes, followed by '.', followed by one or more decimal digits
-         *    representing the fractional part of m.
-         *  o If m is less than 10-3 or greater than or equal to 107, then it is
-         *    represented in so-called "computerized scientific notation." Let n be
-         *    the unique integer such that 10n <= m < 10n+1; then let a be the
-         *    mathematically exact quotient of m and 10n so that 1 <= a < 10.
-         *    The magnitude is then represented as the integer part of a, as a
-         *    single decimal digit, followed by '.', followed by decimal digits
-         *    representing the fractional part of a, followed by the letter 'E',
-         *    followed by a representation of n as a decimal integer, as produced
-         *    by the method Integer.toString(int).
-         * @param value - The float to convert to a string
-         * @returns the formatted float string.
-         */
-        static std::string toString( float value );
-
-        /**
-         * Returns a Float instance representing the specified float value.
-         * @param value - float to wrap
-         * @returns new Float instance wrapping the primitive value
-         */
-        static Float valueOf( float value );
-
-        /**
-         * Returns a Float instance that wraps a primtive float which is parsed
-         * from the string value passed.
-         *
-         * @param value - the string to parse
-         * @returns a new Float instance wrapping the float parsed from value
-         * @throws NumberFormatException on error.
-         */
-        static Float valueOf( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-    private:
-
-        static const unsigned int SINGLE_EXPONENT_MASK = 0x7F800000;
-        static const unsigned int SINGLE_MANTISSA_MASK = 0x007FFFFF;
-        static const unsigned int SINGLE_NAN_BITS = (SINGLE_EXPONENT_MASK | 0x00400000);
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_FLOAT_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Integer.cpp b/src/decaf/src/main/decaf/lang/Integer.cpp
deleted file mode 100644
index 439d2b0..0000000
--- a/src/decaf/src/main/decaf/lang/Integer.cpp
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/lang/Integer.h>
-#include <decaf/lang/Character.h>
-#include <sstream>
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-Integer::Integer( int value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Integer::Integer( const std::string& value ) throw( exceptions::NumberFormatException ) {
-    this->value = parseInt( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::compareTo( const Integer& i ) const {
-    return this->value < i.value ? -1 : this->value == i.value ? 0 : 1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::compareTo( const int& i ) const {
-    return this->value < i ? -1 : this->value == i ? 0 : 1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::bitCount( int value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-
-    // 32-bit recursive reduction using SWAR...
-    // but first step is mapping 2-bit values
-    // into sum of 2 1-bit values in sneaky way
-    uvalue -= ((uvalue >> 1) & 0x55555555);
-    uvalue = (((uvalue >> 2) & 0x33333333) + (uvalue & 0x33333333));
-    uvalue = (((uvalue >> 4) + uvalue) & 0x0F0F0F0F);
-    uvalue += (uvalue >> 8);
-    uvalue += (uvalue >> 16);
-    return(uvalue & 0x0000003F);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::reverseBytes( int value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-
-    unsigned int b3 = uvalue >> 24;
-    unsigned int b2 = (uvalue >> 8) & 0xFF00;
-    unsigned int b1 = (uvalue & 0xFF00) << 8;
-    unsigned int b0 = uvalue << 24;
-    return (b0 | b1 | b2 | b3);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::reverse( int value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-
-    uvalue = (((uvalue & 0xAAAAAAAA) >> 1) | ((uvalue & 0x55555555) << 1));
-    uvalue = (((uvalue & 0xCCCCCCCC) >> 2) | ((uvalue & 0x33333333) << 2));
-    uvalue = (((uvalue & 0xF0F0F0F0) >> 4) | ((uvalue & 0x0F0F0F0F) << 4));
-    uvalue = (((uvalue & 0xFF00FF00) >> 8) | ((uvalue & 0x00FF00FF) << 8));
-    return ((uvalue >> 16) | (uvalue << 16));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Integer::toString() const {
-    return Integer::toString( this->value, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Integer::toString( int value ) {
-    return Integer::toString( value, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Integer::toString( int value, int radix ) {
-
-    if( radix < Character::MIN_RADIX || radix > Character::MAX_RADIX ) {
-        radix = 10;
-    }
-
-    if( value == 0 ) {
-        return "0";
-    }
-
-    int count = 2, j = value;
-    bool negative = value < 0;
-    if( !negative ) {
-        count = 1;
-        j = -value;
-    }
-
-    while( (value /= radix) != 0 ) {
-        count++;
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        int ch = 0 - ( j % radix );
-        if( ch > 9 ) {
-            ch = ch - 10 + 'a';
-        } else {
-            ch += '0';
-        }
-        buffer[--count] = (char)ch;
-    } while( (j /= radix) != 0 );
-
-    if( negative ) {
-        buffer[0] = '-';
-    }
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Integer::toBinaryString( int value ) {
-
-    int count = 1;
-    int j = value;
-
-    if( value < 0 ) {
-        count = 32;
-    } else {
-        while ( (j >>= 1) != 0) {
-            count++;
-        }
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        buffer[--count] = (char)( (value & 1) + '0' );
-        value >>= 1;
-    } while( count > 0 );
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Integer::toOctalString( int value ) {
-
-    int count = 1, j = value;
-
-    if( value < 0 ) {
-        count = 11;
-    } else {
-        while ( (j >>= 3) != 0 ) {
-            count++;
-        }
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        buffer[--count] = (char)( (value & 7) + '0' );
-        value >>= 3;
-    } while( count > 0 );
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Integer::toHexString( int value ) {
-
-    int count = 1;
-    int j = value;
-
-    if( value < 0 ) {
-        count = 8;
-    } else {
-        while( (j >>= 4) != 0 ) {
-            count++;
-        }
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        int t = value & 15;
-        if( t > 9 ) {
-            t = t - 10 + 'a';
-        } else {
-            t += '0';
-        }
-        buffer[--count] = (char)t;
-        value >>= 4;
-    } while( count > 0 );
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::parseInt( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Integer::parseInt( value, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::parseInt( const std::string& value, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    if( radix < Character::MIN_RADIX ||
-        radix > Character::MAX_RADIX ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Integer:decode - Invalid radix" );
-    }
-
-    int length = value.length(), i = 0;
-    if( length == 0 ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Integer:decode - Invalid: zero length string");
-    }
-
-    bool negative = value[i] == '-';
-    if( negative && ++i == length ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Integer:decode - Invalid only a minus sign given");
-    }
-
-    return Integer::parse( value, i, radix, negative );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Integer Integer::valueOf( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Integer( Integer::parseInt( value ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Integer Integer::valueOf( const std::string& value, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Integer( Integer::parseInt( value, radix ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Integer Integer::decode( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    int length = value.length(), i = 0;
-    if( length == 0 ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Integer:decode - Invalid zero size string");
-    }
-
-    char firstDigit = value[i];
-    bool negative = firstDigit == '-';
-    if( negative ) {
-        if( length == 1 ) {
-            throw NumberFormatException(
-                __FILE__, __LINE__,
-                "Integer:decode - Invalid zero string, minus only");
-        }
-
-        firstDigit = value[++i];
-    }
-
-    int base = 10;
-    if( firstDigit == '0' ) {
-        if( ++i == length ) {
-            return valueOf( 0 );
-        }
-
-        if( ( firstDigit = value[i] ) == 'x' || firstDigit == 'X' ) {
-            if( i == length ) {
-                throw NumberFormatException(
-                    __FILE__, __LINE__,
-                    "Integer:decode - Invalid zero string, minus only");
-            }
-            i++;
-            base = 16;
-        } else {
-            base = 8;
-        }
-    } else if( firstDigit == '#' ) {
-        if( i == length ) {
-            throw NumberFormatException(
-                __FILE__, __LINE__,
-                "Integer:decode - Invalid zero string, minus only");
-        }
-        i++;
-        base = 16;
-    }
-
-    int result = parse( value, i, base, negative );
-    return valueOf( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::parse( const std::string& value, int offset,
-                    int radix, bool negative )
-    throw ( exceptions::NumberFormatException ) {
-
-    int max = Integer::MIN_VALUE / radix;
-    int result = 0, length = value.size();
-
-    while( offset < length ) {
-        int digit = Character::digit( value[offset++], radix );
-        if( digit == -1 ) {
-            throw NumberFormatException(
-                __FILE__, __LINE__,
-                "Integer::parse - number string is invalid: ",
-                value.c_str() );
-        }
-        if( max > result ) {
-            throw NumberFormatException(
-                __FILE__, __LINE__,
-                "Integer::parse - number string is invalid: ",
-                value.c_str() );
-        }
-        int next = result * radix - digit;
-        if( next > result ) {
-            throw NumberFormatException(
-                __FILE__, __LINE__,
-                "Integer::parse - number string is invalid: ",
-                value.c_str() );
-        }
-        result = next;
-    }
-    if( !negative ) {
-        result = -result;
-        if( result < 0 ) {
-            throw NumberFormatException(
-                __FILE__, __LINE__,
-                "Integer::parse - number string is invalid: ",
-                value.c_str() );
-        }
-    }
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::highestOneBit( int value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-
-    uvalue |= (uvalue >> 1);
-    uvalue |= (uvalue >> 2);
-    uvalue |= (uvalue >> 4);
-    uvalue |= (uvalue >> 8);
-    uvalue |= (uvalue >> 16);
-    return ( uvalue & ~(uvalue >> 1));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::lowestOneBit( int value ) {
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-    return ( uvalue & (-uvalue) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::numberOfLeadingZeros( int value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-
-    value |= value >> 1;
-    value |= value >> 2;
-    value |= value >> 4;
-    value |= value >> 8;
-    value |= value >> 16;
-    return Integer::bitCount( ~uvalue );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::numberOfTrailingZeros( int value ) {
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned int uvalue = (unsigned int)value;
-    return bitCount( (uvalue & -uvalue) - 1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::rotateLeft( int value, int distance ) {
-    unsigned int i = (unsigned int)value;
-    int j = distance & 0x1F;
-    return ( i << j ) | ( i >> (-j & 0x1F ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::rotateRight( int value, int distance ) {
-    unsigned int i = (unsigned int)value;
-    int j = distance & 0x1F;
-    return ( i >> j ) | ( i << (-j & 0x1F ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Integer::signum( int value ) {
-    return ( value == 0 ? 0 : ( value < 0 ? -1 : 1 ) );
-}
diff --git a/src/decaf/src/main/decaf/lang/Integer.h b/src/decaf/src/main/decaf/lang/Integer.h
deleted file mode 100644
index 77c8edc..0000000
--- a/src/decaf/src/main/decaf/lang/Integer.h
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_INTEGER_H_
-#define _DECAF_LANG_INTEGER_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Number.h>
-#include <decaf/lang/Comparable.h>
-#include <string>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Integer : public Number,
-                              public Comparable<Integer>,
-                              public Comparable<int> {
-    private:
-
-        // The primitve Integer value.
-        int value;
-
-    public:
-
-        /** The size in bits of the primitive int type */
-        static const int SIZE = 32;
-
-        /** The maximum value that the primitive type can hold */
-        static const int MAX_VALUE = (int)0x7FFFFFFF;
-
-        /** The minimum value that the primitive type can hold */
-        static const int MIN_VALUE = (int)0x80000000;
-
-    public:
-
-        /**
-         * @param the primitive value to wrap
-         */
-        Integer( int value );
-
-        /**
-         * @param the base 10 encoded string to decode to sn int and wrap.
-         * @throws NumberFormatException
-         */
-        Integer( const std::string& value ) throw( exceptions::NumberFormatException );
-
-        virtual ~Integer() {}
-
-        /**
-         * Compares this Integer instance with another.
-         * @param i - the Integer instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Integer& i ) const;
-
-        /**
-         * @param i - the Integer object to compare against.
-         * @returns true if the two Integer Objects have the same value.
-         */
-        bool equals( const Integer& i ) const {
-            return this->value == i.value;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param i - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Integer& i ) const {
-            return this->value == i.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param i - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Integer& i ) const {
-            return this->value < i.value;
-        }
-
-        /**
-         * Compares this Integer instance with another.
-         * @param i - the Integer instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const int& i ) const;
-
-        /**
-         * @param i - the Integer object to compare against.
-         * @returns true if the two Integer Objects have the same value.
-         */
-        bool equals( const int& i ) const {
-            return this->value == i;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param i - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const int& i ) const {
-            return this->value == i;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param i - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const int& i ) const {
-            return this->value < i;
-        }
-
-        /**
-         * @returns this Interger Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return (double)this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return (float)this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return (short)this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return (long long)this->value;
-        }
-
-    public:  // Statics
-
-        /**
-         * Decodes a String into a Integer. Accepts decimal, hexadecimal, and octal
-         * numbers given by the following grammar:
-         *
-         * The sequence of characters following an (optional) negative sign and/or
-         * radix specifier ("0x", "0X", "#", or leading zero) is parsed as by the
-         * Integer.parseInteger method with the indicated radix (10, 16, or 8). This
-         * sequence of characters must represent a positive value or a
-         * NumberFormatException will be thrown. The result is negated if first
-         * character of the specified String is the minus sign. No whitespace
-         * characters are permitted in the string.
-         * @param value - The string to decode
-         * @returns a Integer object containing the decoded value
-         * @throws NumberFomatException if the string is not formatted correctly.
-         */
-        static Integer decode( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns the value obtained by reversing the order of the bytes in the
-         * two's complement representation of the specified int value.
-         * @param value - the int whose bytes we are to reverse
-         * @return the reversed int.
-         */
-        static int reverseBytes( int value );
-
-        /**
-         * Returns the value obtained by reversing the order of the bits in the
-         * two's complement binary representation of the specified int  value.
-         * @param value - the value whose bits are to be reversed
-         * @returns the reversed bits int.
-         */
-        static int reverse( int value );
-
-        /**
-         * Parses the string argument as a signed int in the radix specified by
-         * the second argument. The characters in the string must all be digits,
-         * of the specified radix (as determined by whether
-         * Character.digit(char, int) returns a nonnegative value) except that the
-         * first character may be an ASCII minus sign '-' to indicate a negative
-         * value. The resulting byte value is returned.
-         *
-         * An exception of type NumberFormatException is thrown if any of the
-         * following situations occurs:
-         *  * The first argument is null or is a string of length zero.
-         *  * The radix is either smaller than Character.MIN_RADIX or larger than
-         *    Character.MAX_RADIX.
-         *  * Any character of the string is not a digit of the specified radix,
-         *    except that the first character may be a minus sign '-' ('\u002D')
-         *    provided that the string is longer than length 1.
-         *  * The value represented by the string is not a value of type int.
-         *
-         * @param s - the String containing the int representation to be parsed
-         * @param radix - the radix to be used while parsing s
-         * @return the int represented by the string argument in the specified radix.
-         * @throws NumberFormatException - If String does not contain a parsable int.
-         */
-        static int parseInt( const std::string& s, int radix )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Parses the string argument as a signed decimal int. The characters
-         * in the string must all be decimal digits, except that the first
-         * character may be an ASCII minus sign '-' ('\u002D') to indicate a
-         * negative value. The resulting int value is returned, exactly as if
-         * the argument and the radix 10 were given as arguments to the
-         * parseInteger( const std::string, int ) method.
-         * @param s - String to convert to a int
-         * @returns the converted int value
-         * @throws NumberFormatException if the string is not a int.
-         */
-        static int parseInt( const std::string& s )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Integer instance representing the specified int value.
-         * @param value - the int to wrap
-         * @return the new Integer object wrapping value.
-         */
-        static Integer valueOf( int value ) {
-            return Integer( value );
-        }
-
-        /**
-         * Returns a Integer object holding the value given by the specified
-         * std::string.  The argument is interpreted as representing a signed
-         * decimal int, exactly as if the argument were given to the
-         * parseInt( std::string ) method. The result is a Integer object that
-         * represents the int value specified by the string.
-         * @param value - std::string to parse as base 10
-         * @return new Integer Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a decimal int.
-         */
-        static Integer valueOf( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Integer object holding the value extracted from the specified
-         * std::string when parsed with the radix given by the second argument.
-         * The first argument is interpreted as representing a signed int in the
-         * radix specified by the second argument, exactly as if the argument were
-         * given to the parseInt( std::string, int ) method. The result is a
-         * Integer object that represents the int value specified by the string.
-         * @param value - std::string to parse as base ( radix )
-         * @param radix - base of the string to parse.
-         * @return new Integer Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a valid int.
-         */
-        static Integer valueOf( const std::string& value, int radix )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns the number of one-bits in the two's complement binary
-         * representation of the specified int value. This function is sometimes
-         * referred to as the population count.
-         * @param value - the int to count
-         * @return the number of one-bits in the two's complement binary
-         * representation of the specified int value.
-         */
-        static int bitCount( int value );
-
-        /**
-         * Converts the int to a String representation
-         * @param int to convert
-         * @return string representation
-         */
-        static std::string toString( int value );
-
-        /**
-         * Returns a string representation of the first argument in the radix
-         * specified by the second argument.
-         *
-         * If the radix is smaller than Character.MIN_RADIX or larger than
-         * Character.MAX_RADIX, then the radix 10 is used instead.
-         *
-         * If the first argument is negative, the first element of the result is
-         * the ASCII minus character '-'. If the first argument is not
-         * negative, no sign character appears in the result.
-         *
-         * The remaining characters of the result represent the magnitude of the
-         * first argument. If the magnitude is zero, it is represented by a single
-         *  zero character '0'; otherwise, the first character of the
-         * representation of the magnitude will not be the zero character. The
-         * following ASCII characters are used as digits:
-         *
-         *    0123456789abcdefghijklmnopqrstuvwxyz
-         *
-         * @param value - the int to convert to a string
-         * @param radix - the radix to format the string in
-         * @returns an int formatted to the string value of the radix given.
-         */
-        static std::string toString( int value, int radix );
-
-        /**
-         * Returns a string representation of the integer argument as an unsigned
-         * integer in base 16.
-         *
-         * The unsigned integer value is the argument plus 2^32 if the argument is
-         * negative; otherwise, it is equal to the argument. This value is converted
-         * to a string of ASCII digits in hexadecimal (base 16) with no extra leading
-         * 0s. If the unsigned magnitude is zero, it is represented by a single zero
-         * character '0'; otherwise, the first character of the representation of the
-         * unsigned magnitude will not be the zero character. The following characters
-         * are used as hexadecimal digits:
-         *
-         * 		0123456789abcdef
-         *
-         * If uppercase letters are desired, the toUpperCase() method may be called
-         * on the result:
-         * @param value - the int to be translated to an Octal string
-         * @returns the unsigned int value as a Octal string
-         */
-        static std::string toHexString( int value );
-
-        /**
-         * Returns a string representation of the integer argument as an unsigned
-         * integer in base 8.
-         *
-         * The unsigned integer value is the argument plus 2^32 if the argument is
-         * negative; otherwise, it is equal to the argument. This value is converted
-         * to a string of ASCII digits in octal (base 8) with no extra leading 0s.
-         *
-         * If the unsigned magnitude is zero, it is represented by a single zero
-         * character '0'; otherwise, the first character of the representation
-         * of the unsigned magnitude will not be the zero character. The following
-         * characters are used as octal digits:
-         *
-         *      01234567
-         *
-         * @param value - the int to be translated to an Octal string
-         * @returns the unsigned int value as a Octal string
-         */
-        static std::string toOctalString( int value );
-
-        /**
-         * Returns a string representation of the integer argument as an unsigned
-         * integer in base 2.
-         *
-         * The unsigned integer value is the argument plus 2^32 if the argument is
-         * negative; otherwise it is equal to the argument. This value is converted
-         * to a string of ASCII digits in binary (base 2) with no extra leading 0s.
-         * If the unsigned magnitude is zero, it is represented by a single zero
-         * character '0' ('\u0030'); otherwise, the first character of the
-         * representation of the unsigned magnitude will not be the zero character.
-         * The characters '0' ('\u0030') and '1' ('\u0031') are used as binary
-         * digits.
-         * @param value - the int to be translated to a binary string
-         * @returns the unsigned int value as a binary string
-         */
-        static std::string toBinaryString( int value );
-
-        /**
-         * Returns an int value with at most a single one-bit, in the position of
-         * the highest-order ("leftmost") one-bit in the specified int value.
-         * Returns zero if the specified value has no one-bits in its two's
-         * complement binary representation, that is, if it is equal to zero.
-         * @param value - the int to be inspected
-         * @return an int value with a single one-bit, in the position of the
-         * highest-order one-bit in the specified value, or zero if the specified
-         * value is itself equal to zero.
-         */
-        static int highestOneBit( int value );
-
-        /**
-         * Returns an int value with at most a single one-bit, in the position of
-         * the lowest-order ("rightmost") one-bit in the specified int value.
-         * Returns zero if the specified value has no one-bits in its two's
-         * complement binary representation, that is, if it is equal to zero.
-         * @param value - the int to be inspected
-         * @return an int value with a single one-bit, in the position of the
-         * lowest-order one-bit in the specified value, or zero if the specified
-         * value is itself equal to zero.
-         */
-        static int lowestOneBit( int value );
-
-        /**
-         * Returns the number of zero bits preceding the highest-order ("leftmost")
-         * one-bit in the two's complement binary representation of the specified
-         * int value. Returns 32 if the specified value has no one-bits in its two's
-         * complement representation, in other words if it is equal to zero.
-         *
-         * Note that this method is closely related to the logarithm base 2. For
-         * all positive int values x:
-         *
-         *     * floor( log2(x)) = 31 - numberOfLeadingZeros(x)
-         *     * ceil( log2(x)) = 32 - numberOfLeadingZeros(x - 1)
-         *
-         * @param value - the int to be inspected
-         * @return the number of zero bits preceding the highest-order ("leftmost")
-         * one-bit in the two's complement binary representation of the specified
-         * int value, or 32 if the value is equal to zero.
-         */
-        static int numberOfLeadingZeros( int value );
-
-        /**
-         * Returns the number of zero bits following the lowest-order ("rightmost")
-         * one-bit in the two's complement binary representation of the specified
-         * int value. Returns 32 if the specified value has no one-bits in its
-         * two's complement representation, in other words if it is equal to zero.
-         * @param value - the int to be inspected
-         * @return the number of zero bits following the lowest-order ("rightmost")
-         * one-bit in the two's complement binary representation of the specified
-         * int value, or 32 if the value is equal to zero.
-         */
-        static int numberOfTrailingZeros( int value );
-
-        /**
-         * Returns the value obtained by rotating the two's complement binary
-         * representation of the specified int value left by the specified number
-         * of bits. (Bits shifted out of the left hand, or high-order, side reenter
-         * on the right, or low-order.)
-         *
-         * Note that left rotation with a negative distance is equivalent to right
-         * rotation: rotateLeft(val, -distance) == rotateRight(val, distance). Note
-         * also that rotation by any multiple of 32 is a no-op, so all but the last
-         * five bits of the rotation distance can be ignored, even if the distance
-         * is negative: rotateLeft(val, distance) == rotateLeft(val, distance & 0x1F).
-         * @param value - the int to be inspected
-         * @param distance - the number of bits to rotate
-         * @return the value obtained by rotating the two's complement binary
-         * representation of the specified int value left by the specified number
-         * of bits.
-         */
-        static int rotateLeft( int value, int distance );
-
-        /**
-         * Returns the value obtained by rotating the two's complement binary
-         * representation of the specified int value right by the specified number
-         * of bits. (Bits shifted out of the right hand, or low-order, side reenter
-         * on the left, or high-order.)
-         *
-         * Note that right rotation with a negative distance is equivalent to left
-         * rotation: rotateRight(val, -distance) == rotateLeft(val, distance). Note
-         * also that rotation by any multiple of 32 is a no-op, so all but the last
-         * five bits of the rotation distance can be ignored, even if the distance is
-         * negative: rotateRight(val, distance) == rotateRight(val, distance & 0x1F).
-         * @param value - the int to be inspected
-         * @param distance - the number of bits to rotate
-         * @return the value obtained by rotating the two's complement binary
-         * representation of the specified int value right by the specified number
-         * of bits.
-         */
-        static int rotateRight( int value, int distance );
-
-        /**
-         * Returns the signum function of the specified int value. (The return value
-         * is -1 if the specified value is negative; 0 if the specified value is zero;
-         * and 1 if the specified value is positive.)
-         * @param value - the int to be inspected
-         * @return the signum function of the specified int value.
-         */
-        static int signum( int value );
-
-    private:
-
-        static int parse( const std::string& value, int offset,
-                          int radix, bool negative )
-            throw ( exceptions::NumberFormatException );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_INTEGER_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Iterable.h b/src/decaf/src/main/decaf/lang/Iterable.h
deleted file mode 100644
index e602117..0000000
--- a/src/decaf/src/main/decaf/lang/Iterable.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_ITERABLE_H_
-#define _DECAF_LANG_ITERABLE_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * Implementing this interface allows an object to be cast to an Iterable
-     * type for generic collections API calls.
-     */
-    template< typename T >
-    class DECAF_API Iterable {
-    public:
-
-        virtual ~Iterable() {}
-
-        /**
-         * @returns an iterator over a set of elements of type T.
-         */
-        T iterator() = 0;
-        const T iterator() = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_ITERABLE_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Long.cpp b/src/decaf/src/main/decaf/lang/Long.cpp
deleted file mode 100644
index 0dba951..0000000
--- a/src/decaf/src/main/decaf/lang/Long.cpp
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Long.h"
-#include <decaf/lang/Character.h>
-#include <sstream>
-
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-Long::Long( long long value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Long::Long( const std::string& value ) throw( exceptions::NumberFormatException ) {
-    this->value = parseLong( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Long::compareTo( const Long& l ) const {
-    return this->value < l.value ? -1 : this->value == l.value ? 0 : 1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Long::compareTo( const long long& l ) const {
-    return this->value < l ? -1 : this->value == l ? 0 : 1;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Long::bitCount( long long value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-
-    uvalue = (uvalue & 0x5555555555555555LL) + ((uvalue >> 1) & 0x5555555555555555LL);
-    uvalue = (uvalue & 0x3333333333333333LL) + ((uvalue >> 2) & 0x3333333333333333LL);
-    // adjust for 64-bit integer
-    unsigned int i = (unsigned int)( (uvalue >> 32) + uvalue );
-    i = (i & 0x0F0F0F0F) + ((i >> 4) & 0x0F0F0F0F);
-    i = (i & 0x00FF00FF) + ((i >> 8) & 0x00FF00FF);
-    i = (i & 0x0000FFFF) + ((i >> 16) & 0x0000FFFF);
-    return i;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Long Long::decode( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    int length = value.length(), i = 0;
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "Long::decode - Zero length string given." );
-    }
-
-    char firstDigit = value[i];
-    bool negative = firstDigit == '-';
-    if( negative ) {
-        if( length == 1 ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "Long::decode - Invalid length string given.",
-                value.c_str() );
-        }
-        firstDigit = value[++i];
-    }
-
-    int base = 10;
-    if( firstDigit == '0' ) {
-        if( ++i == length ) {
-            return valueOf( 0LL );
-        }
-        if( ( firstDigit = value[i] ) == 'x' || firstDigit == 'X' ) {
-            if ( i == length ) {
-                throw exceptions::NumberFormatException(
-                    __FILE__, __LINE__,
-                    "Long::decode - Invalid length string given.",
-                    value.c_str() );
-            }
-            i++;
-            base = 16;
-        } else {
-            base = 8;
-        }
-    } else if( firstDigit == '#' ) {
-        if( i == length ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "Long::decode - Invalid length string given.",
-                value.c_str() );
-        }
-        i++;
-        base = 16;
-    }
-
-    long long result = parse( value, i, base, negative );
-    return valueOf( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::highestOneBit( long long value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-
-    uvalue |= (uvalue >> 1);
-    uvalue |= (uvalue >> 2);
-    uvalue |= (uvalue >> 4);
-    uvalue |= (uvalue >> 8);
-    uvalue |= (uvalue >> 16);
-    uvalue |= (uvalue >> 32);
-    return ( uvalue & ~( uvalue >> 1 ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::lowestOneBit( long long value ) {
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-    return ( uvalue & (-uvalue) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Long::numberOfLeadingZeros( long long value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-
-    value |= value >> 1;
-    value |= value >> 2;
-    value |= value >> 4;
-    value |= value >> 8;
-    value |= value >> 16;
-    value |= value >> 32;
-    return Long::bitCount( ~uvalue );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Long::numberOfTrailingZeros( long long value ) {
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-    return Long::bitCount( (uvalue & -uvalue) - 1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::parseLong( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Long::parseLong( value, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::parseLong( const std::string& value, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    if( radix < Character::MIN_RADIX ||
-        radix > Character::MAX_RADIX ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "Long::parseLong - Given Radix is out of range." );
-    }
-
-    int length = value.length();
-    int i = 0;
-
-    if( length == 0 ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "Long::parseLong - Zero length string is illegal." );
-    }
-
-    bool negative = value[i] == '-';
-    if( negative && ++i == length ) {
-        throw exceptions::NumberFormatException(
-            __FILE__, __LINE__,
-            "Long::parseLong - Only a minus given, string is invalid." );
-    }
-
-    return Long::parse( value, i, radix, negative );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::parse( const std::string& value, int offset,
-                       int radix, bool negative )
-    throw ( exceptions::NumberFormatException ) {
-
-    long long max = Long::MIN_VALUE / radix;
-    long long result = 0;
-    long long length = value.length();
-
-    while( offset < length ) {
-        int digit = Character::digit( value[offset++], radix );
-
-        if( digit == -1 ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "Long::parseLong - String contains no digit characters." );
-        }
-
-        if( max > result ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "Long::parseLong - Parsed value greater than max for radix." );
-        }
-
-        long long next = result * radix - digit;
-
-        if( next > result ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "Long::parseLong - Only a minus given, string is invalid." );
-        }
-
-        result = next;
-    }
-
-    if( !negative ) {
-        result = -result;
-        if( result < 0 ) {
-            throw exceptions::NumberFormatException(
-                __FILE__, __LINE__,
-                "Long::parseLong - Value less than zero, but no minus sign." );
-        }
-    }
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::reverseBytes( long long value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-
-    long long b7 = (uvalue >> 56);
-    long long b6 = (uvalue >> 40) & 0xFF00ULL;
-    long long b5 = (uvalue >> 24) & 0xFF0000ULL;
-    long long b4 = (uvalue >> 8) & 0xFF000000ULL;
-    long long b3 = (uvalue & 0xFF000000ULL) << 8;
-    long long b2 = (uvalue & 0xFF0000ULL) << 24;
-    long long b1 = (uvalue & 0xFF00ULL) << 40;
-    long long b0 = (uvalue << 56);
-    return ( b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::reverse( long long value ) {
-
-    if( value == 0 ) {
-        return 0;
-    }
-
-    unsigned long long uvalue = (unsigned long long)value;
-
-    // From Hacker's Delight, 7-1, Figure 7-1
-    uvalue = ( uvalue & 0x5555555555555555ULL ) << 1 | (uvalue >> 1) &
-             0x5555555555555555ULL;
-    uvalue = ( uvalue & 0x3333333333333333ULL ) << 2 | (uvalue >> 2) &
-             0x3333333333333333ULL;
-    uvalue = ( uvalue & 0x0F0F0F0F0F0F0F0FULL ) << 4 | (uvalue >> 4) &
-             0x0F0F0F0F0F0F0F0FULL;
-
-    return reverseBytes( uvalue );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::rotateLeft( long long value, int distance ) {
-    unsigned long long i = (unsigned long long)value;
-    int j = distance & 0x1F;
-    return ( i << j ) | ( i >> (-j & 0x1F ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Long::rotateRight( long long value, int distance ) {
-    unsigned long long i = (unsigned long long)value;
-    int j = distance & 0x1F;
-    return ( i >> j ) | ( i << (-j & 0x1F ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Long::signum( long long value ) {
-    return ( value == 0 ? 0 : ( value < 0 ? -1 : 1 ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Long::toString() const {
-    return Long::toString( this->value, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Long::toString( long long value ) {
-    return Long::toString( value, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Long::toString( long long value, int radix ) {
-
-    if( radix < Character::MIN_RADIX || radix > Character::MAX_RADIX ) {
-        radix = 10;
-    }
-
-    if( value == 0 ) {
-        return "0";
-    }
-
-    int count = 2;
-    long long j = value;
-    bool negative = value < 0;
-
-    if( !negative ) {
-        count = 1;
-        j = -value;
-    }
-
-    while( (value /= radix) != 0 ) {
-        count++;
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        int ch = 0 - ( j % radix );
-        if( ch > 9 ) {
-            ch = ch - 10 + 'a';
-        } else {
-            ch += '0';
-        }
-        buffer[--count] = (char)ch;
-    } while( (j /= radix) != 0 );
-
-    if( negative ) {
-        buffer[0] = '-';
-    }
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Long::toBinaryString( long long value ) {
-
-    int count = 1;
-    long long j = value;
-
-    if( value < 0 ) {
-        count = 32;
-    } else {
-        while ( (j >>= 1) != 0) {
-            count++;
-        }
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        buffer[--count] = (char)( (value & 1) + '0' );
-        value >>= 1;
-    } while( count > 0 );
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Long::toOctalString( long long value ) {
-
-    int count = 1;
-    long long j = value;
-
-    if( value < 0 ) {
-        count = 11;
-    } else {
-        while ( (j >>= 3) != 0 ) {
-            count++;
-        }
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        buffer[--count] = (char)( (value & 7) + '0' );
-        value >>= 3;
-    } while( count > 0 );
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Long::toHexString( long long value ) {
-
-    int count = 1;
-    long long j = value;
-
-    if( value < 0 ) {
-        count = 8;
-    } else {
-        while( (j >>= 4) != 0 ) {
-            count++;
-        }
-    }
-
-    // Save length and allocate a new buffer for the string, add one
-    // more for the null character.
-    int length = count;
-    char* buffer = new char[length + 1];
-
-    do {
-        int t = value & 15;
-        if( t > 9 ) {
-            t = t - 10 + 'a';
-        } else {
-            t += '0';
-        }
-        buffer[--count] = (char)t;
-        value >>= 4;
-    } while( count > 0 );
-
-    // Ensure there's a null
-    buffer[length] = 0;
-    std::string result( &buffer[0] );
-    delete [] buffer;
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Long Long::valueOf( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Long( Long::parseLong( value ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Long Long::valueOf( const std::string& value, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Long( Long::parseLong( value, radix ) );
-}
diff --git a/src/decaf/src/main/decaf/lang/Long.h b/src/decaf/src/main/decaf/lang/Long.h
deleted file mode 100644
index a715cd1..0000000
--- a/src/decaf/src/main/decaf/lang/Long.h
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_LONG_H_
-#define _DECAF_LANG_LONG_H_
-
-#include <decaf/lang/Number.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API Long : public Number,
-                           public Comparable<Long>,
-                           public Comparable<long long> {
-    private:
-
-        // The primitive long long value
-        long long value;
-
-    public:
-
-        /** The size in bits of the primitive long long type */
-        static const int SIZE = 64;
-
-        /** The maximum value that the primitive type can hold */
-        static const long long MAX_VALUE = (long long)0x7FFFFFFFFFFFFFFFLL;
-
-        /** The minimum value that the primitive type can hold */
-        static const long long MIN_VALUE = (long long)0x8000000000000000LL;
-
-    public:
-
-        /**
-         * @param value - the primitive long long to wrap
-         */
-        Long( long long value );
-
-        /**
-         * @param value - the long long formated string to wrap
-         * @thorw NumberFormatException
-         */
-        Long( const std::string& value ) throw( exceptions::NumberFormatException );
-
-        virtual ~Long() {}
-
-        /**
-         * Compares this Long instance with another.
-         * @param l - the Long instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Long& l ) const;
-
-        /**
-         * @param l - the Long object to compare against.
-         * @returns true if the two Integer Objects have the same value.
-         */
-        bool equals( const Long& l ) const {
-            return this->value == l.value;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param l - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Long& l ) const {
-            return this->value == l.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param l - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Long& l ) const {
-            return this->value < l.value;
-        }
-
-        /**
-         * Compares this Long instance with another.
-         * @param l - the Integer instance to be compared
-         * @return zero if this object represents the same integer value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const long long& l ) const;
-
-        /**
-         * @param l - the Long object to compare against.
-         * @returns true if the two Integer Objects have the same value.
-         */
-        bool equals( const long long& l ) const {
-            return this->value == l;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param l - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const long long& l ) const {
-            return this->value == l;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param l - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const long long& l ) const {
-            return this->value < l;
-        }
-
-        /**
-         * @returns this Long Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return (double)this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return (float)this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return (short)this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return (int)this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return this->value;
-        }
-
-    public:
-
-        /**
-         * Returns the number of one-bits in the two's complement binary
-         * representation of the specified int value. This function is sometimes
-         * referred to as the population count.
-         * @param value - the long long to count
-         * @return the number of one-bits in the two's complement binary
-         * representation of the specified long long value.
-         */
-        static int bitCount( long long value );
-
-        /**
-         * Decodes a String into a Long. Accepts decimal, hexadecimal, and octal
-         * numbers given by the following grammar:
-         *
-         * The sequence of characters following an (optional) negative sign and/or
-         * radix specifier ("0x", "0X", "#", or leading zero) is parsed as by the
-         * Integer.parseInteger method with the indicated radix (10, 16, or 8). This
-         * sequence of characters must represent a positive value or a
-         * NumberFormatException will be thrown. The result is negated if first
-         * character of the specified String is the minus sign. No whitespace
-         * characters are permitted in the string.
-         * @param value - The string to decode
-         * @returns a Long object containing the decoded value
-         * @throws NumberFomatException if the string is not formatted correctly.
-         */
-        static Long decode( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns an long long value with at most a single one-bit, in the position
-         * of the highest-order ("leftmost") one-bit in the specified int value.
-         * Returns zero if the specified value has no one-bits in its two's
-         * complement binary representation, that is, if it is equal to zero.
-         * @param value - the long long to be inspected
-         * @return an long long value with a single one-bit, in the position of the
-         * highest-order one-bit in the specified value, or zero if the specified
-         * value is itself equal to zero.
-         */
-        static long long highestOneBit( long long value );
-
-        /**
-         * Returns an long long value with at most a single one-bit, in the position
-         * of the lowest-order ("rightmost") one-bit in the specified int value.
-         * Returns zero if the specified value has no one-bits in its two's
-         * complement binary representation, that is, if it is equal to zero.
-         * @param value - the long long to be inspected
-         * @return an long long value with a single one-bit, in the position of the
-         * lowest-order one-bit in the specified value, or zero if the specified
-         * value is itself equal to zero.
-         */
-        static long long lowestOneBit( long long value );
-
-        /**
-         * Returns the number of zero bits preceding the highest-order ("leftmost")
-         * one-bit in the two's complement binary representation of the specified
-         * long long value. Returns 64 if the specified value has no one-bits in its
-         * two's complement representation, in other words if it is equal to zero.
-         *
-         * Note that this method is closely related to the logarithm base 2. For
-         * all positive int values x:
-         *
-         *     * floor( log2(x)) = 63 - numberOfLeadingZeros(x)
-         *     * ceil( log2(x)) = 64 - numberOfLeadingZeros(x - 1)
-         *
-         * @param value - the long long to be inspected
-         * @return the number of zero bits preceding the highest-order ("leftmost")
-         * one-bit in the two's complement binary representation of the specified
-         * long long value, or 64 if the value is equal to zero.
-         */
-        static int numberOfLeadingZeros( long long value );
-
-        /**
-         * Returns the number of zero bits following the lowest-order ("rightmost")
-         * one-bit in the two's complement binary representation of the specified
-         * long long value. Returns 64 if the specified value has no one-bits in its
-         * two's complement representation, in other words if it is equal to zero.
-         * @param value - the int to be inspected
-         * @return the number of zero bits following the lowest-order ("rightmost")
-         * one-bit in the two's complement binary representation of the specified
-         * long long value, or 64 if the value is equal to zero.
-         */
-        static int numberOfTrailingZeros( long long value );
-
-        /**
-         * Parses the string argument as a signed decimal long. The characters in the
-         * string must all be decimal digits, except that the first character may be
-         * an ASCII minus sign '-' to indicate a negative value. The resulting long
-         * value is returned, exactly as if the argument and the radix 10 were given
-         * as arguments to the parseLong(java.lang.String, int) method.
-         *
-         * Note that the characters LL or ULL are not permitted to appear at the end
-         * of this string as would normally be permitted in a C++ program.
-         * @param value - String to parse
-         * @return long long value
-         * @throws NumberFormatException on invalid string value
-         */
-        static long long parseLong( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Long object holding the value extracted from the specified
-         * string when parsed with the radix given by the second argument. The
-         * first argument is interpreted as representing a signed long in the radix
-         * specified by the second argument, exactly as if the arguments were
-         * given to the parseLong(std::string, int) method. The result is a
-         * Long object that represents the long long value specified by the string.
-         * @param value - String to parse
-         * @param radix - the base encoding of the string
-         * @return long long value
-         * @throws NumberFormatException on invalid string value
-         */
-        static long long parseLong( const std::string& value, int radix )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns the value obtained by reversing the order of the bytes in the
-         * two's complement representation of the specified long long value.
-         * @param value - the long long whose bytes we are to reverse
-         * @return the reversed long long.
-         */
-        static long long reverseBytes( long long value );
-
-        /**
-         * Returns the value obtained by reversing the order of the bits in the
-         * two's complement binary representation of the specified long long value.
-         * @param value - the value whose bits are to be reversed
-         * @returns the reversed bits long long.
-         */
-        static long long reverse( long long value );
-
-        /**
-         * Returns the value obtained by rotating the two's complement binary
-         * representation of the specified value left by the specified number
-         * of bits. (Bits shifted out of the left hand, or high-order, side reenter
-         * on the right, or low-order.)
-         *
-         * Note that left rotation with a negative distance is equivalent to right
-         * rotation: rotateLeft(val, -distance) == rotateRight(val, distance). Note
-         * also that rotation by any multiple of 32 is a no-op, so all but the last
-         * five bits of the rotation distance can be ignored, even if the distance
-         * is negative: rotateLeft(val, distance) == rotateLeft(val, distance & 0x1F).
-         * @param value - the long long to be inspected
-         * @param distance - the number of bits to rotate
-         * @return the value obtained by rotating the two's complement binary
-         * representation of the specified value left by the specified number
-         * of bits.
-         */
-        static long long rotateLeft( long long value, int distance );
-
-        /**
-         * Returns the value obtained by rotating the two's complement binary
-         * representation of the specified value right by the specified number
-         * of bits. (Bits shifted out of the right hand, or low-order, side reenter
-         * on the left, or high-order.)
-         *
-         * Note that right rotation with a negative distance is equivalent to left
-         * rotation: rotateRight(val, -distance) == rotateLeft(val, distance). Note
-         * also that rotation by any multiple of 32 is a no-op, so all but the last
-         * five bits of the rotation distance can be ignored, even if the distance is
-         * negative: rotateRight(val, distance) == rotateRight(val, distance & 0x1F).
-         * @param value - the long long to be inspected
-         * @param distance - the number of bits to rotate
-         * @return the value obtained by rotating the two's complement binary
-         * representation of the specified value right by the specified number
-         * of bits.
-         */
-        static long long rotateRight( long long value, int distance );
-
-        /**
-         * Returns the signum function of the specified value. (The return value
-         * is -1 if the specified value is negative; 0 if the specified value is zero;
-         * and 1 if the specified value is positive.)
-         * @param value - the long long to be inspected
-         * @return the signum function of the specified long long value.
-         */
-        static int signum( long long value );
-
-        /**
-         * Converts the long to a String representation
-         * @param long to convert
-         * @return string representation
-         */
-        static std::string toString( long long value );
-
-        /*
-         * Returns a string representation of the first argument in the radix
-         * specified by the second argument.
-         *
-         * If the radix is smaller than Character.MIN_RADIX or larger than
-         * Character.MAX_RADIX, then the radix 10 is used instead.
-         *
-         * If the first argument is negative, the first element of the result is
-         * the ASCII minus character '-'. If the first argument is not
-         * negative, no sign character appears in the result.
-         *
-         * The remaining characters of the result represent the magnitude of the
-         * first argument. If the magnitude is zero, it is represented by a single
-         *  zero character '0'; otherwise, the first character of the
-         * representation of the magnitude will not be the zero character. The
-         * following ASCII characters are used as digits:
-         *
-         *    0123456789abcdefghijklmnopqrstuvwxyz
-         *
-         * @param value - the long long to convert to a string
-         * @param radix - the radix to format the string in
-         * @returns an long long formatted to the string value of the radix given.
-         */
-        static std::string toString( long long value, int radix );
-
-        /**
-         * Returns a string representation of the integer argument as an unsigned
-         * integer in base 16.
-         *
-         * The unsigned integer value is the argument plus 2^32 if the argument is
-         * negative; otherwise, it is equal to the argument. This value is converted
-         * to a string of ASCII digits in hexadecimal (base 16) with no extra leading
-         * 0s. If the unsigned magnitude is zero, it is represented by a single zero
-         * character '0'; otherwise, the first character of the representation of the
-         * unsigned magnitude will not be the zero character. The following characters
-         * are used as hexadecimal digits:
-         *
-         * 		0123456789abcdef
-         *
-         * If uppercase letters are desired, the toUpperCase() method may be called
-         * on the result:
-         * @param value - the long long to be translated to an Octal string
-         * @returns the unsigned long long value as a Octal string
-         */
-        static std::string toHexString( long long value );
-
-        /**
-         * Returns a string representation of the long long argument as an unsigned
-         * long long in base 8.
-         *
-         * The unsigned long long value is the argument plus 2^32 if the argument is
-         * negative; otherwise, it is equal to the argument. This value is converted
-         * to a string of ASCII digits in octal (base 8) with no extra leading 0s.
-         *
-         * If the unsigned magnitude is zero, it is represented by a single zero
-         * character '0'; otherwise, the first character of the representation
-         * of the unsigned magnitude will not be the zero character. The following
-         * characters are used as octal digits:
-         *
-         *      01234567
-         *
-         * @param value - the long long to be translated to an Octal string
-         * @returns the unsigned long long value as a Octal string
-         */
-        static std::string toOctalString( long long value );
-
-        /**
-         * Returns a string representation of the long long argument as an unsigned
-         * long long in base 2.
-         *
-         * The unsigned long long value is the argument plus 2^32 if the argument is
-         * negative; otherwise it is equal to the argument. This value is converted
-         * to a string of ASCII digits in binary (base 2) with no extra leading 0s.
-         * If the unsigned magnitude is zero, it is represented by a single zero
-         * character '0'; otherwise, the first character of the
-         * representation of the unsigned magnitude will not be the zero character.
-         * The characters '0' and '1' are used as binary
-         * digits.
-         * @param value - the long long to be translated to a binary string
-         * @returns the unsigned long long value as a binary string
-         */
-        static std::string toBinaryString( long long value );
-
-        /**
-         * Returns a Long instance representing the specified int value.
-         * @param value - the long long to wrap
-         * @return the new Integer object wrapping value.
-         */
-        static Long valueOf( long long value ) {
-            return Long( value );
-        }
-
-        /**
-         * Returns a Long object holding the value given by the specified
-         * std::string.  The argument is interpreted as representing a signed
-         * decimal long long, exactly as if the argument were given to the
-         * parseLong( std::string ) method. The result is a Integer object that
-         * represents the long long value specified by the string.
-         * @param value - std::string to parse as base 10
-         * @return new Long Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a decimal long long.
-         */
-        static Long valueOf( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Long object holding the value extracted from the specified
-         * std::string when parsed with the radix given by the second argument.
-         * The first argument is interpreted as representing a signed long long in the
-         * radix specified by the second argument, exactly as if the argument were
-         * given to the parseLong( std::string, int ) method. The result is a
-         * Long object that represents the long long value specified by the string.
-         * @param value - std::string to parse as base ( radix )
-         * @param radix - base of the string to parse.
-         * @return new Long Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a valid long long.
-         */
-        static Long valueOf( const std::string& value, int radix )
-            throw ( exceptions::NumberFormatException );
-
-    private:
-
-        static long long parse( const std::string& value, int offset,
-                                int radix, bool negative )
-            throw ( exceptions::NumberFormatException );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_LONG_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Math.cpp b/src/decaf/src/main/decaf/lang/Math.cpp
deleted file mode 100644
index 0e0f978..0000000
--- a/src/decaf/src/main/decaf/lang/Math.cpp
+++ /dev/null
@@ -1,502 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/lang/Math.h>
-#include <decaf/lang/Double.h>
-#include <decaf/lang/Float.h>
-#include <decaf/lang/Integer.h>
-#include <decaf/lang/Long.h>
-#include <decaf/util/Random.h>
-
-using namespace decaf;
-using namespace decaf::lang;
-
-#include <cmath>
-#include <cstdlib>
-
-////////////////////////////////////////////////////////////////////////////////
-const double Math::E = 2.718281828459045;
-const double Math::PI = 3.141592653589793;
-
-////////////////////////////////////////////////////////////////////////////////
-float Math::abs( float value ) {
-    return Float::intBitsToFloat( Float::floatToIntBits( value ) & 0x7FFFFFFF );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::abs( double value ) {
-    return Double::longBitsToDouble( Double::doubleToLongBits( value ) & 0x7FFFFFFFFFFFFFFFULL );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::acos( double value ) {
-    return std::acos( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::asin( double value ) {
-    return std::asin( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::atan( double value ) {
-    return std::atan( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::atan2( double x, double y ) {
-    return std::atan2( x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::random() {
-    static util::Random random;
-    return random.nextDouble();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::cbrt( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( Double::isInfinite( value ) ) {
-        return value;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    }
-
-    return ::cbrt( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::cos( double value ) {
-
-    if( Double::isNaN( value ) || Double::isInfinite( value ) ) {
-        return Double::NaN;
-    }
-
-    return std::cos( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::cosh( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( Double::isInfinite( value ) ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( value == 0.0 ) {
-        return 1.0;
-    }
-
-    return std::cosh( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::sin( double value ) {
-
-    if( Double::isNaN( value ) || Double::isInfinite( value ) ) {
-        return Double::NaN;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    }
-
-    return std::sin( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::sinh( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( Double::isInfinite( value ) ) {
-        return value;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    }
-
-    return std::sinh( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::tan( double value ) {
-
-    if( Double::isNaN( value ) || value < -1.0 ) {
-        return Double::NaN;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    }
-
-    return std::tan( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::tanh( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return 1.0;
-    } else if( value == Double::NEGATIVE_INFINITY ) {
-        return -1.0;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    }
-
-    return std::tanh( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::sqrt( double value ) {
-
-    if( Double::isNaN( value ) || value < 0.0 ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( value == 0.0 || value == -0.0 ) {
-        return Double::NEGATIVE_INFINITY;
-    }
-
-    return std::sqrt( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::rint( double value ) {
-
-    if( Double::isNaN( value ) || Double::isInfinite( value ) ) {
-        return value;
-    } else if( value == 0.0 || value == -0.0 ) {
-        return value;
-    }
-
-    return ::rint( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::exp( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( value == Double::NEGATIVE_INFINITY ) {
-        return 0.0;
-    }
-
-    return std::exp( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::expm1( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( value == Double::NEGATIVE_INFINITY ) {
-        return -1.0;
-    } else if( !( value > 0 || value < 0 ) ) {
-        return value;
-    }
-
-    return ::expm1( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Math::min( float a, float b ) {
-
-    if( a > b ) {
-        return b;
-    } else if( a < b ) {
-        return a;
-    }
-
-    // if either arg is NaN, return NaN
-    if( a != b ) {
-        return Float::NaN;
-    }
-
-    // min( +0.0,-0.0) == -0.0
-    if( a == 0.0f &&
-        ( (Float::floatToIntBits( a ) | Float::floatToIntBits( b )) & 0x80000000) != 0) {
-
-        return 0.0f * (-1.0f);
-    }
-
-    return a;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::min( double a, double b ) {
-
-    if( a > b ) {
-        return b;
-    } else if( a < b ) {
-        return a;
-    }
-
-    // if either arg is NaN, return NaN
-    if( a != b ) {
-        return Double::NaN;
-    }
-
-    // min( +0.0,-0.0) == -0.0
-    if( a == 0.0 &&
-        ( (Double::doubleToLongBits( a ) | Double::doubleToLongBits( b )) & 0x8000000000000000ULL) != 0 ) {
-        return 0.0 * (-1.0);
-    }
-
-    return a;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Math::max( float a, float b ) {
-
-    if( a > b ) {
-        return a;
-    } else if( a < b ) {
-        return b;
-    }
-
-    // if either arg is NaN, return NaN
-    if( a != b ) {
-        return Float::NaN;
-    }
-    // max( +0.0,-0.0) == +0.0
-    if( a == 0.0f &&
-        ( (Float::floatToIntBits( a ) & Float::floatToIntBits( b ) ) & 0x80000000 ) == 0 ) {
-
-        return 0.0f;
-    }
-
-    return a;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::max( double a, double b ) {
-
-    if( a > b ) {
-        return a;
-    } else if( a < b ) {
-        return b;
-    }
-
-    // if either arg is NaN, return NaN
-    if( a != b ) {
-        return Double::NaN;
-    }
-    // max( +0.0,-0.0) == +0.0
-    if( a == 0.0f &&
-        ( (Double::doubleToLongBits( a ) & Double::doubleToLongBits( b ) ) & 0x80000000 ) == 0 ) {
-
-        return 0.0f;
-    }
-
-    return a;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::log( double value ) {
-
-    if( Double::isNaN( value ) || value < 0.0 ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return Double::NEGATIVE_INFINITY;
-    }
-
-    return std::log( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::log10( double value ) {
-
-    if( Double::isNaN( value ) || value < 0 ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return Double::NEGATIVE_INFINITY;
-    }
-
-    return std::log10( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::log1p( double value ) {
-
-    if( Double::isNaN( value ) || value < -1.0 ) {
-        return Double::NaN;
-    } else if( value == Double::POSITIVE_INFINITY ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( value == -1.0 ) {
-        return Double::NEGATIVE_INFINITY;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    }
-
-    return ::log1p( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::ceil( double value ) {
-
-    if( Double::isNaN( value ) || Double::isInfinite( value ) ) {
-        return value;
-    } else if( !( value < 0 || value > 0 ) ) {
-        return value;
-    } else if( value > -1.0 && value < 0.0 ) {
-        return -0.0;
-    }
-
-    return std::ceil( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::floor( double value ) {
-
-    if( Double::isNaN( value ) || Double::isInfinite( value ) ) {
-        return value;
-    } else if( value > 0 || value < 0 ) {
-        return std::floor( value );
-    }
-
-    // +-0.0
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Math::round( float value ) {
-
-    if( Float::isNaN( value ) ) {
-        return 0;
-    }
-
-    return (int)Math::floor( value + 0.5f );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Math::round( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return 0;
-    }
-
-    return (long long)Math::floor( value + 0.5 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::IEEEremainder( double f1, double f2 ) {
-
-    if( Double::isNaN( f1 ) || Double::isNaN( f2 ) ||
-        Double::isInfinite( f1 ) || !( f2 < 0 || f2 > 0 ) ) {
-        return Double::NaN;
-    } else if( Double::isInfinite( f2 ) ) {
-        return f1;
-    }
-
-    return ::remainder( f1, f2 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Math::signum( float value ) {
-
-    if( Float::isNaN( value ) ) {
-        return Float::NaN;
-    } else if( value > 0 ) {
-        return 1.0;
-    } else if( value < 0 ) {
-        return -1.0;
-    }
-
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::signum( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( value > 0 ) {
-        return 1.0;
-    } else if( value < 0 ) {
-        return -1.0;
-    }
-
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::hypot( double x, double y ) {
-
-    if( Double::isInfinite( x ) || Double::isInfinite( y ) ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( Double::isNaN( x ) || Double::isNaN( y ) ) {
-        return Double::NaN;
-    }
-
-    return ::hypot( x, y );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::pow( double base, double exp ) {
-
-    if( !( exp < 0 || exp > 0 ) ) {
-        return 1.0;
-    } else if( Double::isNaN( exp ) ) {
-        return Double::NaN;
-    } else if( Double::isNaN( base ) && ( exp < 0 || exp > 0 ) ) {
-        return Double::NaN;
-    }
-
-    return std::pow( base, exp );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Math::ulp( float value ) {
-
-    if( Float::isNaN( value ) ) {
-        return Float::NaN;
-    } else if( Float::isInfinite( value ) ) {
-        return Float::POSITIVE_INFINITY;
-    } else if( value == Float::MAX_VALUE || value == -Float::MAX_VALUE ) {
-        return (float)pow( 2, 104 );
-    } else if( !( value < 0 || value > 0 ) ) {
-        return Float::MIN_VALUE;
-    }
-
-    value = abs( value );
-    return ::nextafterf( value, Float::MAX_VALUE ) - value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Math::ulp( double value ) {
-
-    if( Double::isNaN( value ) ) {
-        return Double::NaN;
-    } else if( Double::isInfinite( value ) ) {
-        return Double::POSITIVE_INFINITY;
-    } else if( value == Double::MAX_VALUE || value == -Double::MAX_VALUE ) {
-        return pow( 2, 971 );
-    } else if( !( value < 0 || value > 0 ) ) {
-        return Double::MIN_VALUE;
-    }
-
-    value = abs( value );
-    return ::nextafter( value, Double::MAX_VALUE ) - value;
-}
diff --git a/src/decaf/src/main/decaf/lang/Math.h b/src/decaf/src/main/decaf/lang/Math.h
deleted file mode 100644
index 744a53d..0000000
--- a/src/decaf/src/main/decaf/lang/Math.h
+++ /dev/null
@@ -1,761 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_MATH_H_
-#define _DECAF_LANG_MATH_H_
-
-#include <decaf/util/Config.h>
-
-// On some systems there is a min and max macro defined.
-#undef min
-#undef max
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * The class <code>Math</code> contains methods for performing basic
-     * numeric operations such as the elementary exponential, logarithm,
-     * square root, and trigonometric functions.
-     */
-    class DECAF_API Math {
-    public:
-
-        static const double E;
-        static const double PI;
-
-    public:
-
-        Math() {}
-        virtual ~Math() {}
-
-    public:
-
-        /**
-         * Returns the absolute value of an int value. If the argument is not
-         * negative, the argument is returned. If the argument is negative, the
-         * negation of the argument is returned.
-         * @param value - the value to return the abs of
-         * @returns the value if positive, otherwise the negative of value
-         */
-        static int abs( int value ) {
-            return value < 0 ? -value : value;
-        }
-
-        /**
-         * Returns the absolute value of an long long value. If the argument is not
-         * negative, the argument is returned. If the argument is negative, the
-         * negation of the argument is returned.
-         * @param value - the value to return the abs of
-         * @returns the value if positive, otherwise the negative of value
-         */
-        static long long abs( long long value ) {
-            return value < 0 ? -value : value;
-        }
-
-        /**
-         * Returns the absolute value of a float value. If the argument is not
-         * negative, the argument is returned. If the argument is negative,
-         * the negation of the argument is returned. Special cases:
-         *
-         * o If the argument is positive zero or negative zero, the result is
-         *   positive zero.
-         * o If the argument is infinite, the result is positive infinity.
-         * o If the argument is NaN, the result is NaN.
-         *
-         * In other words, the result is the same as the value of the expression:
-         *    Float::intBitsToFloat( 0x7fffffff & Float::floatToIntBits( value ) )
-         *
-         * @param value - the value to return the abs of
-         * @returns the value if positive, otherwise the negative of value
-         */
-        static float abs( float value );
-
-        /**
-         * Returns the absolute value of a double value. If the argument is not
-         * negative, the argument is returned. If the argument is negative,
-         * the negation of the argument is returned. Special cases:
-         *
-         * o If the argument is positive zero or negative zero, the result is
-         *   positive zero.
-         * o If the argument is infinite, the result is positive infinity.
-         * o If the argument is NaN, the result is NaN.
-         *
-         * In other words, the result is the same as the value of the expression:
-         *    Double::longBitsToDouble( 0x7fffffffffffffffULL &
-         *                              Double::doubleToLongBits( value ) )
-         *
-         * @param value - the value to return the abs of
-         * @returns the value if positive, otherwise the negative of value
-         */
-        static double abs( double value );
-
-        /**
-         * Returns the arc cosine of an angle, in the range of 0.0 through pi.
-         * Special case:
-         *
-         *  o If the argument is NaN or its absolute value is greater than 1, then
-         *    the result is NaN.
-         *
-         * @param value - the value to return the arc cosine of.
-         * @returns arc cosine of value in radians.
-         */
-        static double acos( double value );
-
-        /**
-         * Returns the arc sine of an angle, in the range of -pi/2 through pi/2.
-         * Special cases:
-         *
-         *  o If the argument is NaN or its absolute value is greater than 1, then
-         *    the result is NaN.
-         *  o If the argument is zero, then the result is a zero with the same sign
-         *    as the argument.
-         *
-         * @param value - the value to return the arc cosine of.
-         * @returns arc cosine of value in radians.
-         */
-        static double asin( double value );
-
-        /**
-         * Returns the arc tangent of an angle, in the range of -pi/2 through pi/2.
-         * Special cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is zero, then the result is a zero with the same sign
-         *    as the argument.
-         *
-         * @param value - the value to return the arc cosine of.
-         * @returns arc tangent of value in radians.
-         */
-        static double atan( double value );
-
-        /**
-         * Converts rectangular coordinates (x, y) to polar (r, theta). This method
-         * computes the phase theta by computing an arc tangent of y/x in the range
-         * of -pi to pi. Special cases:
-         *
-         *  o If either argument is NaN, then the result is NaN.
-         *  o If the first argument is positive zero and the second argument is
-         *    positive, or the first argument is positive and finite and the second
-         *    argument is positive infinity, then the result is positive zero.
-         *  o If the first argument is negative zero and the second argument is
-         *    positive, or the first argument is negative and finite and the second
-         *    argument is positive infinity, then the result is negative zero.
-         *  o If the first argument is positive zero and the second argument is
-         *    negative, or the first argument is positive and finite and the second
-         *    argument is negative infinity, then the result is the double value
-         *    closest to pi.
-         *  o If the first argument is negative zero and the second argument is
-         *    negative, or the first argument is negative and finite and the second
-         *    argument is negative infinity, then the result is the double value
-         *    closest to -pi.
-         *  o If the first argument is positive and the second argument is positive
-         *    zero or negative zero, or the first argument is positive infinity and
-         *    the second argument is finite, then the result is the double value
-         *    closest to pi/2.
-         *  o If the first argument is negative and the second argument is positive
-         *    zero or negative zero, or the first argument is negative infinity and
-         *    the second argument is finite, then the result is the double value
-         *    closest to -pi/2.
-         *  o If both arguments are positive infinity, then the result is the double
-         *    value closest to pi/4.
-         *  o If the first argument is positive infinity and the second argument is
-         *    negative infinity, then the result is the double value closest to 3*pi/4.
-         *  o If the first argument is negative infinity and the second argument is
-         *    positive infinity, then the result is the double value closest to -pi/4.
-         *  o If both arguments are negative infinity, then the result is the double
-         *    value closest to -3*pi/4.
-         *
-         * @param y - the ordinate coordinate
-         * @param x - the abscissa coordinate
-         * @returns the theta component of the point (r, theta) in polar coordinates
-         * that corresponds to the point (x, y) in Cartesian coordinates.
-         */
-        static double atan2( double x, double y );
-
-        /**
-         * Returns the cube root of a double value. For positive finite x,
-         * cbrt(-x) == -cbrt(x); that is, the cube root of a negative value is the
-         * negative of the cube root of that value's magnitude. Special cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is infinite, then the result is an infinity with the
-         *    same sign as the argument.
-         *  o If the argument is zero, then the result is a zero with the same sign
-         *    as the argument.
-         *
-         * @param value - the double to compute the cube root of
-         * @returns the cube root of value
-         */
-        static double cbrt( double value );
-
-        /**
-         * Returns the trigonometric cosine of an angle. Special cases:
-         *
-         *   o If the argument is NaN or an infinity, then the result is NaN.
-         *
-         * @param value - an value in radians
-         * @returns the cosine of the argument.
-         */
-        static double cos( double value );
-
-        /**
-         * Returns the hyperbolic cosine of a double value. The hyperbolic cosine
-         * of x is defined to be (ex + e-x)/2 where e is Euler's number.
-         * Special cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is infinite, then the result is positive infinity.
-         *  o If the argument is zero, then the result is 1.0.
-         *
-         * @param value - the number whose hyperbolic cosine is to be found
-         * @return the hyperbolic cosine of value
-         */
-        static double cosh( double value );
-
-        /**
-         * Returns the trigonometric sine of an angle. Special case:
-         *
-         *  o If the argument is NaN or an infinity, then the result is NaN.
-         *  o If the argument is zero, then the result is a zero with the same sign
-         *    as the argument.
-         *
-         * @param value - the number whose sin is to be found
-         * @return the sine of value
-         */
-        static double sin( double value );
-
-        /**
-         * Returns the hyperbolic sine of a double value. The hyperbolic sine of x
-         * is defined to be (ex - e-x)/2 where e is Euler's number.
-         * Special cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is infinite, then the result is an infinity with
-         *    the same sign as the argument.
-         *  o If the argument is zero, then the result is a zero with the same
-         *    sign as the argument.
-         *
-         * @param value - the number whose hyperbolic sin is to be found
-         * @return the hyperbolic sine of value
-         */
-        static double sinh( double value );
-
-        /**
-         * Returns the trigonometric tangent of an angle. Special cases:
-         *
-         *  o If the argument is NaN or an infinity, then the result is NaN.
-         *  o If the argument is zero, then the result is a zero with the same
-         *    sign as the argument.
-         *
-         * @param value - the number whose tangent is to be found
-         * @return the tangent of value
-         */
-        static double tan( double value );
-
-        /**
-         * Returns the hyperbolic tangent of a double value. The hyperbolic
-         * tangent of x is defined to be (ex - e-x)/(ex + e-x), in other words,
-         * sinh(x)/cosh(x). Note that the absolute value of the exact tanh is
-         * always less than 1. Special cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is zero, then the result is a zero with the same
-         *    sign as the argument.
-         *  o If the argument is positive infinity, then the result is +1.0.
-         *  o If the argument is negative infinity, then the result is -1.0.
-         *
-         * @param value - the number whose hyperbolic tangent is to be found
-         * @return the hyperbolic cosine of value
-         */
-        static double tanh( double value );
-
-        /**
-         * Returns the correctly rounded positive square root of a double value.
-         * Special cases:
-         *
-         *  o If the argument is NaN or less than zero, then the result is NaN.
-         *  o If the argument is positive infinity, then the result is positive infinity.
-         *  o If the argument is positive zero or negative zero, then the result is
-         *    the same as the argument.
-         *
-         * Otherwise, the result is the double value closest to the true mathematical
-         * square root of the argument value.
-         * @param value - the value to find the square root of
-         * @param the square root of the argument.
-         */
-        static double sqrt( double value );
-
-        /**
-         * Returns the value of the first argument raised to the power of the second
-         * argument. Special cases:
-         *
-         *  o If the second argument is positive or negative zero, then the result
-         *    is 1.0.
-         *  o If the second argument is 1.0, then the result is the same as the first
-         *    argument.
-         *  o If the second argument is NaN, then the result is NaN.
-         *  o If the first argument is NaN and the second argument is nonzero,
-         *    then the result is NaN.
-         *
-         * @param base - the base
-         * @param exp - the exponent
-         * @return the base raised to the power of exp.
-         */
-        static double pow( double base, double exp );
-
-        /**
-         * Returns the double value that is closest in value to the argument and
-         * is equal to a mathematical integer. If two double values that are
-         * mathematical integers are equally close, the result is the integer
-         * value that is even. Special cases:
-         *
-         *  o If the argument value is already equal to a mathematical integer,
-         *    then the result is the same as the argument.
-         *  o If the argument is NaN or an infinity or positive zero or negative
-         *    zero, then the result is the same as the argument.
-         *
-         * @param value - the value to round to the nearest integer
-         * @returns the rounded value
-         */
-        static double rint( double value );
-
-        /**
-         * Returns the smaller of two <code>short</code> values. That is,
-         * the result the argument closer to the value of
-         * <code>Short::MIN_VALUE</code>.  If the arguments have the same
-         * value, the result is that same value.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the smaller of <code>a</code> and <code>b</code>.
-         */
-        static short min( short a, short b ) {
-            return ( a <= b ? a : b );
-        }
-
-        /**
-         * Returns the smaller of two <code>int</code> values. That is,
-         * the result the argument closer to the value of
-         * <code>Integer::MIN_VALUE</code>.  If the arguments have the same
-         * value, the result is that same value.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the smaller of <code>a</code> and <code>b</code>.
-         */
-        static int min( int a, int b ) {
-            return ( a <= b ? a : b );
-        }
-
-        /**
-         * Returns the smaller of two <code>long long</code> values. That is,
-         * the result the argument closer to the value of
-         * <code>Long::MIN_VALUE</code>.  If the arguments have the same
-         * value, the result is that same value.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the smaller of <code>a</code> and <code>b</code>.
-         */
-        static long long min( long long a, long long b ) {
-            return ( a <= b ? a : b );
-        }
-
-        /**
-         * Returns the smaller of two float values. That is, the result is the
-         * value closer to negative infinity. If the arguments have the same value,
-         * the result is that same value. If either value is NaN, then the result
-         * is NaN. Unlike the numerical comparison operators, this method considers
-         * negative zero to be strictly smaller than positive zero. If one argument
-         * is positive zero and the other is negative zero, the result is negative
-         * zero.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the smaller of <code>a</code> and <code>b</code>.
-         */
-        static float min( float a, float b );
-
-        /**
-         * Returns the smaller of two double values. That is, the result is the
-         * value closer to negative infinity. If the arguments have the same value,
-         * the result is that same value. If either value is NaN, then the result
-         * is NaN. Unlike the numerical comparison operators, this method considers
-         * negative zero to be strictly smaller than positive zero. If one argument
-         * is positive zero and the other is negative zero, the result is negative
-         * zero.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the smaller of <code>a</code> and <code>b</code>.
-         */
-        static double min( double a, double b );
-
-        /**
-         * Returns the larger of two <code>short</code> values. That is,
-         * the result the argument closer to the value of
-         * <code>Short::MAX_VALUE</code>.  If the arguments have the same
-         * value, the result is that same value.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the larger of <code>a</code> and <code>b</code>.
-         */
-        static short max( short a, short b ) {
-            return ( a >= b ? a : b );
-        }
-
-        /**
-         * Returns the larger of two <code>int</code> values. That is,
-         * the result the argument closer to the value of
-         * <code>Integer::MAX_VALUE</code>.  If the arguments have the same
-         * value, the result is that same value.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the larger of <code>a</code> and <code>b</code>.
-         */
-        static int max( int a, int b ) {
-            return ( a >= b ? a : b );
-        }
-
-        /**
-         * Returns the larger of two <code>long long</code> values. That is,
-         * the result the argument closer to the value of
-         * <code>Long::MAX_VALUE</code>.  If the arguments have the same
-         * value, the result is that same value.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the larger of <code>a</code> and <code>b</code>.
-         */
-        static long long max( long long a, long long b ) {
-            return ( a >= b ? a : b );
-        }
-
-        /**
-         * Returns the greater of two float values. That is, the result is the
-         * argument closer to positive infinity. If the arguments have the same
-         * value, the result is that same value. If either value is NaN, then the
-         * result is NaN. Unlike the numerical comparison operators, this method
-         * considers negative zero to be strictly smaller than positive zero. If
-         * one argument is positive zero and the other negative zero, the result
-         * is positive zero.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the larger of <code>a</code> and <code>b</code>.
-         */
-        static float max( float a, float b );
-
-        /**
-         * Returns the greater of two double values. That is, the result is the
-         * argument closer to positive infinity. If the arguments have the same value,
-         * the result is that same value. If either value is NaN, then the result is
-         * NaN. Unlike the numerical comparison operators, this method considers
-         * negative zero to be strictly smaller than positive zero. If one argument
-         * is positive zero and the other negative zero, the result is positive zero.
-         * @param a - an argument.
-         * @param b - another argument.
-         * @return the larger of <code>a</code> and <code>b</code>.
-         */
-        static double max( double a, double b );
-
-        /**
-         * Returns the natural logarithm (base e) of a double  value. Special cases:
-         *
-         *  o If the argument is NaN or less than zero, then the result is NaN.
-         *  o If the argument is positive infinity, then the result is
-         *    positive infinity.
-         *  o If the argument is positive zero or negative zero, then the result
-         *    is negative infinity.
-         *
-         * @param value the value to compute the natural log of.
-         * @returns the natural log of value.
-         */
-        static double log( double value );
-
-        /**
-         * Returns the base 10 logarithm of a double value. Special cases:
-         *
-         *   o If the argument is NaN or less than zero, then the result is NaN.
-         *   o If the argument is positive infinity, then the result is positive
-         *     infinity.
-         *   o If the argument is positive zero or negative zero, then the result is
-         *     negative infinity.
-         *   o If the argument is equal to 10n for integer n, then the result is n.
-         *
-         * @param value - the value to operate on
-         * @returns the long base 10 of value
-         */
-        static double log10( double value );
-
-        /**
-         * Returns the natural logarithm of the sum of the argument and 1. Note that
-         * for small values x, the result of log1p(x) is much closer to the true
-         * result of ln(1 + x) than the floating-point evaluation of log(1.0+x).
-         *
-         * Special cases:
-         *
-         *   o If the argument is NaN or less than -1, then the result is NaN.
-         *   o If the argument is positive infinity, then the result is positive
-         *     infinity.
-         *   o If the argument is negative one, then the result is negative infinity.
-         *   o If the argument is zero, then the result is a zero with the same sign
-         *     as the argument.
-         *
-         * @param value - the value to operate on
-         * @returns the the value ln(x + 1), the natural log of x + 1
-         */
-        static double log1p( double value );
-
-        /**
-         * Returns the smallest (closest to negative infinity) double value that is
-         * greater than or equal to the argument and is equal to a mathematical
-         * integer. Special cases:
-         *
-         *   o If the argument value is already equal to a mathematical integer,
-         *     then the result is the same as the argument.
-         *   o If the argument is NaN or an infinity or positive zero or negative
-         *     zero, then the result is the same as the argument.
-         *   o If the argument value is less than zero but greater than -1.0, then
-         *     the result is negative zero.
-         *
-         * Note that the value of Math.ceil(x) is exactly the value of -Math.floor(-x).
-         * @param value - the value to find the ceiling of
-         * @returns the smallest (closest to negative infinity) floating-point value
-         * that is greater than or equal to the argument and is equal to a
-         * mathematical integer.
-         */
-        static double ceil( double value );
-
-        /**
-         * Returns the largest (closest to positive infinity) double value that is
-         * less than or equal to the argument and is equal to a mathematical integer.
-         * Special cases:
-         *
-         *    o If the argument value is already equal to a mathematical integer,
-         *      then the result is the same as the argument.
-         *    o If the argument is NaN or an infinity or positive zero or negative
-         *      zero, then the result is the same as the argument.
-         *
-         * @param value - the value to find the floor of
-         * @returns the largest (closest to positive infinity) floating-point value
-         * that less than or equal to the argument and is equal to a mathematical
-         * integer.
-         */
-        static double floor( double value );
-
-        /**
-         * Returns the closest int to the argument. The result is rounded to an
-         * integer by adding 1/2, taking the floor of the result, and casting the
-         * result to type int. In other words, the result is equal to the value
-         * of the expression:  (int)Math.floor( a + 0.5f )
-         *
-         *   o If the argument is NaN, the result is 0.
-         *   o If the argument is negative infinity or any value less than or equal
-         *     to the value of Integer::MIN_VALUE, the result is equal to the value of
-         *     Integer::MIN_VALUE.
-         *   o If the argument is positive infinity or any value greater than or equal
-         *     to the value of Integer::MAX_VALUE, the result is equal to the value of
-         *     Integer::MAX_VALUE.
-         *
-         * @param value - the value to round
-         * @returns the value of the argument rounded to the nearest integral value.
-         */
-        static int round( float value );
-
-        /**
-         * Returns the closest long long to the argument. The result is rounded to
-         * an integer by adding 1/2, taking the floor of the result, and casting the
-         * result to type long long. In other words, the result is equal to the value
-         * of the expression:  (long long)Math.floor(a + 0.5d)
-         *
-         *   o If the argument is NaN, the result is 0.
-         *   o If the argument is negative infinity or any value less than or equal
-         *     to the value of Long::MIN_VALUE, the result is equal to the value of
-         *     Long::MIN_VALUE.
-         *   o If the argument is positive infinity or any value greater than or equal
-         *     to the value of Long::MAX_VALUE, the result is equal to the value of
-         *     Long::MAX_VALUE.
-         *
-         * @param value - the value to round
-         * @returns the value of the argument rounded to the nearest integral value.
-         */
-        static long long round( double value );
-
-        /**
-         * Computes the remainder operation on two arguments as prescribed by the
-         * IEEE 754 standard. The remainder value is mathematically equal to
-         * f1 - f2 × n, where n is the mathematical integer closest to the exact
-         * mathematical value of the quotient f1/f2, and if two mathematical
-         * integers are equally close to f1/f2, then n is the integer that is even.
-         * If the remainder is zero, its sign is the same as the sign of the first
-         * argument. Special cases:
-         *
-         *  o If either argument is NaN, or the first argument is infinite, or the
-         *    second argument is positive zero or negative zero, then the result is
-         *    NaN.
-         *  o If the first argument is finite and the second argument is infinite,
-         *    then the result is the same as the first argument.
-         *
-         * @param f1 - the dividend.
-         * @param f2 - the divisor
-         * @return the IEEE remainder of value
-         */
-        static double IEEEremainder( double f1, double f2 );
-
-        /**
-         * Returns a double value with a positive sign, greater than or equal to 0.0
-         * and less than 1.0. Returned values are chosen pseudorandomly with
-         * (approximately) uniform distribution from that range.
-         *
-         * When this method is first called, it creates a single new pseudorandom-number
-         * generator; This new pseudorandom-number generator is used thereafter for all
-         * calls to this method and is used nowhere else.
-         *
-         * This method is properly synchronized to allow correct use by more than
-         * one thread. However, if many threads need to generate pseudorandom numbers
-         * at a great rate, it may reduce contention for each thread to have its
-         * own pseudorandom-number generator.
-         * @returns a pseudorandom double greater than or equal to 0.0 and
-         * less than 1.0.
-         */
-        static double random();
-
-        /**
-         * Returns Euler's number e raised to the power of a double value.
-         * Special cases:
-         *
-         *  o If the argument is NaN, the result is NaN.
-         *  o If the argument is positive infinity, then the result is positive infinity.
-         *  o If the argument is negative infinity, then the result is positive zero.
-         *
-         * @param value - the exponent to raise e to
-         * @returns the value e^a, where e is the base of the natural logarithms.
-         */
-        static double exp( double value );
-
-        /**
-         * Returns e^x - 1. Note that for values of x near 0, the exact sum of
-         * expm1(x) + 1 is much closer to the true result of ex than exp(x).
-         * Special cases:
-         *
-         *  o If the argument is NaN, the result is NaN.
-         *  o If the argument is positive infinity, then the result is positive infinity.
-         *  o If the argument is negative infinity, then the result is -1.0.
-         *  o If the argument is zero, then the result is a zero with the same sign as
-         *    the argument.
-         *
-         * @param the value to raise e^x - 1
-         * @returns the value ex - 1.
-         */
-        static double expm1( double value );
-
-        /**
-         * Returns sqrt(x^2 + y^2) without intermediate overflow or underflow.
-         * Special cases:
-         *
-         * If either argument is infinite, then the result is positive infinity.
-         * If either argument is NaN and neither argument is infinite, then the
-         * result is NaN.
-         *
-         * @param x - an argument
-         * @param y - another argument
-         * @returns the sqrt(x^2 + y^2) without intermediate overflow or underflow
-         */
-        static double hypot( double x, double y );
-
-        /**
-         * Returns the signum function of the argument; zero if the argument is zero,
-         * 1.0f if the argument is greater than zero, -1.0f if the argument is less
-         * than zero.  Special Cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is positive zero or negative zero, then the result is
-         *    the same as the argument.
-         *
-         * @param value - the floating-point value whose signum is to be returned
-         * @returns the signum function of the argument
-         */
-        static float signum( float value );
-
-        /**
-         * Returns the signum function of the argument; zero if the argument is zero,
-         * 1.0f if the argument is greater than zero, -1.0f if the argument is less
-         * than zero.  Special Cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is positive zero or negative zero, then the result is
-         *    the same as the argument.
-         *
-         * @param value - the floating-point value whose signum is to be returned
-         * @returns the signum function of the argument
-         */
-        static double signum( double value );
-
-        /**
-         * Returns the measure in radians of the supplied degree angle
-         * @param angdeg - an angle in degrees
-         * @return the radian measure of the angle.
-         */
-        static double toRadians( double angdeg ) {
-            return angdeg / 180 * PI;
-        }
-
-        /**
-         * Returns the measure in degrees of the supplied radian angle
-         * @param angrad -  an angle in radians
-         * @return the degree measure of the angle.
-         */
-        static double toDegrees( double angrad ) {
-            return angrad * 180 / PI;
-        }
-
-        /**
-         * Returns the size of an ulp of the argument. An ulp of a float value is
-         * the positive distance between this floating-point value and the float
-         * value next larger in magnitude. Note that for non-NaN x, ulp(-x) == ulp(x).
-         * Special Cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is positive or negative infinity, then the result is
-         *    positive infinity.
-         *  o If the argument is positive or negative zero, then the result is
-         *    Float::MIN_VALUE.
-         *  o If the argument is ±Float::MAX_VALUE, then the result is equal to 2^104.
-         *
-         * @param value - the floating-point value whose ulp is to be returned
-         * @returns the size of an ulp of the argument
-         */
-        static float ulp( float value );
-
-        /**
-         * Returns the size of an ulp of the argument. An ulp of a double value is
-         * the positive distance between this floating-point value and the double
-         * value next larger in magnitude. Note that for non-NaN x, ulp(-x) == ulp(x).
-         * Special Cases:
-         *
-         *  o If the argument is NaN, then the result is NaN.
-         *  o If the argument is positive or negative infinity, then the result is
-         *    positive infinity.
-         *  o If the argument is positive or negative zero, then the result is
-         *    Double::MIN_VALUE.
-         *  o If the argument is ±Float::MAX_VALUE, then the result is equal to 2^971.
-         *
-         * @param value - the floating-point value whose ulp is to be returned
-         * @returns the size of an ulp of the argument
-         */
-        static double ulp( double value );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_MATH_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Number.h b/src/decaf/src/main/decaf/lang/Number.h
deleted file mode 100644
index e50d850..0000000
--- a/src/decaf/src/main/decaf/lang/Number.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_NUMBER_H_
-#define _DECAF_LANG_NUMBER_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * The abstract class Number is the superclass of classes Byte, Double,
-     * Float, Integer, Long, and Short.
-     *
-     * Subclasses of Number must provide methods to convert the represented
-     * numeric value to byte, double, float, int, long, and short.
-     */
-    class DECAF_API Number {
-    public:
-
-        virtual ~Number() {}
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return byte the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)intValue();
-        }
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const = 0;
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const = 0;
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const = 0;
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long long the value of the receiver.
-         */
-        virtual long long longValue() const = 0;
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return short the value of the receiver.
-         */
-        virtual short shortValue()  const {
-            return (short) intValue();
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_NUMBER_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Runnable.h b/src/decaf/src/main/decaf/lang/Runnable.h
deleted file mode 100644
index ebc5613..0000000
--- a/src/decaf/src/main/decaf/lang/Runnable.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_RUNNABLE_H_
-#define _DECAF_LANG_RUNNABLE_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * Interface for a runnable object - defines a task
-     * that can be run by a thread.
-     */
-    class DECAF_API Runnable{
-    public:
-
-        virtual ~Runnable(){}
-
-        /**
-         * Run method - called by the Thread class in the context
-         * of the thread.
-         */
-        virtual void run() = 0;
-    };
-
-}}
-
-#endif /*_DECAF_LANG_RUNNABLE_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Short.cpp b/src/decaf/src/main/decaf/lang/Short.cpp
deleted file mode 100644
index c0cc798..0000000
--- a/src/decaf/src/main/decaf/lang/Short.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Short.h"
-#include "Integer.h"
-
-#include <sstream>
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-Short::Short( short value ) {
-    this->value = value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Short::Short( const std::string& value ) throw( exceptions::NumberFormatException ) {
-    this->value = value.size(); //Short::parseShort( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Short::compareTo( const Short& s ) const {
-    return value == s.value ? 0 : ( value > s.value ? 1 : -1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Short::compareTo( const short& s ) const {
-    return value == s ? 0 : ( value > s ? 1 : -1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Short::toString() const {
-    return Integer::toString( this->value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string Short::toString( short value ) {
-    return Integer::toString( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-short Short::parseShort( const std::string& s, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    int intValue = Integer::parseInt( s, radix );
-    short result = (short)intValue;
-    if( result != intValue ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Short::parseShort - Not a valid short encoded string.");
-    }
-
-    return result;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-short Short::parseShort( const std::string& s )
-    throw ( exceptions::NumberFormatException ) {
-    return parseShort( s, 10 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Short Short::decode( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    int intValue = Integer::decode( value ).intValue();
-    short result = (short)intValue;
-    if( result != intValue ) {
-        throw NumberFormatException(
-            __FILE__, __LINE__,
-            "Short::decode - Not a valid short encoded string.");
-    }
-
-    return Short( result );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-short Short::reverseBytes( short value ) {
-    unsigned short temp = value;
-    temp = ( ( temp & 0xFF00 ) >> 8 ) | ( ( temp & 0x00FF ) << 8 );
-    return temp;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Short Short::valueOf( short value ) {
-    return Short( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Short Short::valueOf( const std::string& value )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Short( parseShort( value, 10 ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Short Short::valueOf( const std::string& value, int radix )
-    throw ( exceptions::NumberFormatException ) {
-
-    return Short( parseShort( value, radix ) );
-}
diff --git a/src/decaf/src/main/decaf/lang/Short.h b/src/decaf/src/main/decaf/lang/Short.h
deleted file mode 100644
index 43e84bf..0000000
--- a/src/decaf/src/main/decaf/lang/Short.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_SHORT_H_
-#define _DECAF_LANG_SHORT_H_
-
-#include <decaf/lang/Number.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/exceptions/NumberFormatException.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class Short : public Number,
-                  public Comparable<Short>,
-                  public Comparable<short> {
-    private:
-
-        // The short value
-        short value;
-
-    public:
-
-        /** Size of this objects primitive type in bits */
-        static const int SIZE = 16;
-
-        /** Max Value for this Object's primitive type */
-        static const short MAX_VALUE = (short)0x7FFF;
-
-        /** Max Value for this Object's primitive type */
-        static const short MIN_VALUE = (short)0x8000;
-
-    public:
-
-        /**
-         * @param value - short to wrap
-         */
-        Short( short value );
-
-        /**
-         * @param value - string value to convert to short and wrap
-         * @throws NumberFormatException
-         */
-        Short( const std::string& value ) throw( exceptions::NumberFormatException );
-
-        virtual ~Short() {}
-
-        /**
-         * Compares this Short instance with another.
-         * @param s - the Short instance to be compared
-         * @return zero if this object represents the same short value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const Short& s ) const;
-
-        /**
-         * @returns true if the two Short Objects have the same value.
-         */
-        bool equals( const Short& s ) const {
-            return this->value == s.value;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param s - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const Short& s ) const {
-            return this->value == s.value;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param s - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const Short& s ) const {
-            return this->value < s.value;
-        }
-
-        /**
-         * Compares this Short instance with another.
-         * @param s - the Short instance to be compared
-         * @return zero if this object represents the same short value as the
-         * argument; a positive value if this object represents a value greater
-         * than the passed in value, and -1 if this object repesents a value
-         * less than the passed in value.
-         */
-        virtual int compareTo( const short& s ) const;
-
-        /**
-         * @returns true if the two Short Objects have the same value.
-         */
-        bool equals( const short& s ) const {
-            return this->value == s;
-        }
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param s - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const short& s ) const {
-            return this->value == s;
-        }
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param s - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const short& s ) const {
-            return this->value < s;
-        }
-
-        /**
-         * @returns this Short Object as a String Representation
-         */
-        std::string toString() const;
-
-        /**
-         * Answers the double value which the receiver represents
-         * @return double the value of the receiver.
-         */
-        virtual double doubleValue() const {
-            return (double)this->value;
-        }
-
-        /**
-         * Answers the float value which the receiver represents
-         * @return float the value of the receiver.
-         */
-        virtual float floatValue() const {
-            return (float)this->value;
-        }
-
-        /**
-         * Answers the byte value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual unsigned char byteValue() const {
-            return (unsigned char)this->value;
-        }
-
-        /**
-         * Answers the short value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual short shortValue() const {
-            return this->value;
-        }
-
-        /**
-         * Answers the int value which the receiver represents
-         * @return int the value of the receiver.
-         */
-        virtual int intValue() const {
-            return (int)this->value;
-        }
-
-        /**
-         * Answers the long value which the receiver represents
-         * @return long the value of the receiver.
-         */
-        virtual long long longValue() const {
-            return (long long)this->value;
-        }
-
-    public:   // statics
-
-        /**
-         * @returns a string representing the primitive value as Base 10
-         */
-        static std::string toString( short value );
-
-        /**
-         * Decodes a String into a Short. Accepts decimal, hexadecimal, and octal
-         * numbers given by the following grammar:
-         *
-         * The sequence of characters following an (optional) negative sign and/or
-         * radix specifier ("0x", "0X", "#", or leading zero) is parsed as by the
-         * Short.parseShort method with the indicated radix (10, 16, or 8). This
-         * sequence of characters must represent a positive value or a
-         * NumberFormatException will be thrown. The result is negated if first
-         * character of the specified String is the minus sign. No whitespace
-         * characters are permitted in the string.
-         * @param value - The string to decode
-         * @returns a Short object containing the decoded value
-         * @throws NumberFomatException if the string is not formatted correctly.
-         */
-        static Short decode( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns the value obtained by reversing the order of the bytes in the
-         * two's complement representation of the specified short value.
-         * @param value - the short whose bytes we are to reverse
-         * @return the reversed short.
-         */
-        static short reverseBytes( short value );
-
-        /**
-         * Parses the string argument as a signed short in the radix specified by
-         * the second argument. The characters in the string must all be digits,
-         * of the specified radix (as determined by whether
-         * Character.digit(char, int) returns a nonnegative value) except that the
-         * first character may be an ASCII minus sign '-'  ('\u002D') to indicate
-         * a negative value. The resulting byte value is returned.
-         *
-         * An exception of type NumberFormatException is thrown if any of the
-         * following situations occurs:
-         *  * The first argument is null or is a string of length zero.
-         *  * The radix is either smaller than Character.MIN_RADIX or larger than
-         *    Character.MAX_RADIX.
-         *  * Any character of the string is not a digit of the specified radix,
-         *    except that the first character may be a minus sign '-' ('\u002D')
-         *    provided that the string is longer than length 1.
-         *  * The value represented by the string is not a value of type short.
-         *
-         * @param s - the String containing the short representation to be parsed
-         * @param radix - the radix to be used while parsing s
-         * @return the short represented by the string argument in the specified radix.
-         * @throws NumberFormatException - If String does not contain a parsable short.
-         */
-        static short parseShort( const std::string& s, int radix )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Parses the string argument as a signed decimal short. The characters
-         * in the string must all be decimal digits, except that the first
-         * character may be an ASCII minus sign '-' ('\u002D') to indicate a
-         * negative value. The resulting short value is returned, exactly as if
-         * the argument and the radix 10 were given as arguments to the
-         * parseShort( const std::string, int ) method.
-         * @param s - String to convert to a short
-         * @returns the converted short value
-         * @throws NumberFormatException if the string is not a short.
-         */
-        static short parseShort( const std::string& s )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Short instance representing the specified short value.
-         * @param value - the short to wrap
-         * @return the new Short object wrapping value.
-         */
-        static Short valueOf( short value );
-
-        /**
-         * Returns a Short object holding the value given by the specified std::string.
-         * The argument is interpreted as representing a signed decimal short,
-         * exactly as if the argument were given to the parseShort( std::string )
-         * method. The result is a Short object that represents the short value
-         * specified by the string.
-         * @param value - std::string to parse as base 10
-         * @return new Short Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a decimal short.
-         */
-        static Short valueOf( const std::string& value )
-            throw ( exceptions::NumberFormatException );
-
-        /**
-         * Returns a Short object holding the value extracted from the specified
-         * std::string when parsed with the radix given by the second argument.
-         * The first argument is interpreted as representing a signed short in the
-         * radix specified by the second argument, exactly as if the argument were
-         * given to the parseShort( std::string, int ) method. The result is a
-         * Short object that represents the short value specified by the string.
-         * @param value - std::string to parse as base ( radix )
-         * @param radix - base of the string to parse.
-         * @return new Short Object wrapping the primitive
-         * @throws NumberFormatException if the string is not a valid short.
-         */
-        static Short valueOf( const std::string& value, int radix )
-            throw ( exceptions::NumberFormatException );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_SHORT_H_*/
diff --git a/src/decaf/src/main/decaf/lang/System.cpp b/src/decaf/src/main/decaf/lang/System.cpp
deleted file mode 100644
index 00e6615..0000000
--- a/src/decaf/src/main/decaf/lang/System.cpp
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "System.h"
-
-#include <decaf/lang/exceptions/NullPointerException.h>
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-#include <decaf/lang/exceptions/RuntimeException.h>
-#include <decaf/util/Date.h>
-#include <decaf/util/StringTokenizer.h>
-#include <apr.h>
-#include <apr_errno.h>
-#include <apr_env.h>
-
-#ifdef APR_HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#include <cstdlib>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::util;
-using namespace decaf::internal;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-AprPool System::aprPool;
-
-////////////////////////////////////////////////////////////////////////////////
-System::System() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void System::unsetenv( const std::string& name ) throw ( lang::Exception ) {
-
-    apr_status_t result = APR_SUCCESS;
-
-    // Clear the value, errors are thrown out as an exception
-    result = apr_env_delete( name.c_str(), aprPool.getAprPool() );
-    aprPool.cleanup();
-
-    if( result != APR_SUCCESS ) {
-
-        char buffer[256] = {0};
-
-        throw NullPointerException(
-            __FILE__, __LINE__,
-            "System::getenv - ",
-            apr_strerror( result, buffer, 255 ) );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string System::getenv( const std::string& name ) throw ( Exception ) {
-
-    char* value = NULL;
-    apr_status_t result = APR_SUCCESS;
-
-    // Read the value, errors are thrown out as an exception
-    result = apr_env_get( &value, name.c_str(), aprPool.getAprPool() );
-
-    if( result != APR_SUCCESS ) {
-
-        char buffer[256] = {0};
-
-        throw NullPointerException(
-            __FILE__, __LINE__,
-            "System::getenv - ",
-            apr_strerror( result, buffer, 255 ) );
-    }
-
-    // Copy and cleanup
-    if( value == NULL ) {
-        return "";
-    }
-
-    std::string envVal( value );
-    aprPool.cleanup();
-
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void System::setenv( const std::string& name, const std::string& value )
-    throw ( lang::Exception ) {
-
-    apr_status_t result = APR_SUCCESS;
-
-    // Write the value, errors are thrown out as an exception
-    result = apr_env_set( name.c_str(), value.c_str(), aprPool.getAprPool() );
-    aprPool.cleanup();
-
-    if( result != APR_SUCCESS ) {
-
-        char buffer[256] = {0};
-
-        throw NullPointerException(
-            __FILE__, __LINE__,
-            "System::getenv - ",
-            apr_strerror( result, buffer, 255 ) );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long System::currentTimeMillis() {
-    return Date::getCurrentTimeMilliseconds();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Map<string, string> System::getenv() throw ( Exception ) {
-
-    Map<string, string> values;
-    StringTokenizer tokenizer( "" );
-    string key = "";
-    string value = "";
-    int tokens = 0;
-    std::vector<std::string> env = getEnvArray();
-
-    for( std::size_t i = 0; i < env.size(); i++ ){
-        tokenizer.reset( env[i], "=" );
-
-        tokens = tokenizer.countTokens();
-
-        if( tokens == 1 ) {
-            // special case, no value set, store empty string as value
-            key = tokenizer.nextToken();
-            value = string("");
-        } else if( tokens > 2 ) {
-            // special case: first equals delimits the key value, the rest are
-            // part of the variable
-            int pos = env[i].find( "=" );
-            key = env[i].substr( 0, pos );
-            value = env[i].substr( pos + 1, string::npos );
-        } else if( tokens == 0 ) {
-            // Odd case, got a string with no equals sign.
-            throw IllegalArgumentException(
-                __FILE__, __LINE__,
-                "System::getenv - Invalid env string. %s",
-                env[i].c_str() );
-        } else {
-            // Normal case.
-            key = tokenizer.nextToken();
-            value = tokenizer.nextToken();
-        }
-
-        // Store the env var
-        values.setValue( key, value );
-    }
-
-    return values;
-}
-
-#if defined(_WIN32)
-
-#include <windows.h>
-
-////////////////////////////////////////////////////////////////////////////////
-std::vector<std::string> System::getEnvArray() {
-
-    std::vector<std::string> buffer;
-    int count = 0;
-    LPTSTR lpszVars;
-    LPVOID lpvEnv;
-
-    lpvEnv = GetEnvironmentStrings();
-    if( NULL == lpvEnv ){
-        return NULL;
-    }
-
-    lpszVars = (LPTSTR)lpvEnv;
-    while( *lpszVars != NULL ) {
-        count++;
-        lpszVars += strlen(lpszVars)+1;
-    }
-
-    lpszVars = (LPTSTR)lpvEnv;
-    int index = 0;
-    while( *lpszVars != NULL ) {
-        buffer.push_back( lpszVars );
-        lpszVars += strlen(lpszVars)+1;
-    }
-
-    FreeEnvironmentStrings( (LPTCH)lpvEnv );
-    return buffer;
-}
-
-#else
-
-////////////////////////////////////////////////////////////////////////////////
-extern char** environ;
-
-////////////////////////////////////////////////////////////////////////////////
-std::vector<std::string> System::getEnvArray() {
-
-    std::vector<std::string> buffer;
-    int count = 0;
-
-    for( int i = 0; *(environ + i); i++ ){
-        count++;
-    }
-
-    for( int i = 0; *(environ + i); i++ ){
-        buffer.push_back( environ[i] );
-    }
-
-    return buffer;
-}
-
-#endif
diff --git a/src/decaf/src/main/decaf/lang/System.h b/src/decaf/src/main/decaf/lang/System.h
deleted file mode 100644
index 4e48dd8..0000000
--- a/src/decaf/src/main/decaf/lang/System.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_SYSTEM_H_
-#define _DECAF_LANG_SYSTEM_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/util/Map.h>
-#include <decaf/lang/Exception.h>
-#include <decaf/internal/AprPool.h>
-#include <string>
-
-namespace decaf{
-namespace lang{
-
-    class DECAF_API System {
-    private:
-
-        static internal::AprPool aprPool;
-
-    public:
-
-        System();
-        virtual ~System() {}
-
-    public:  // Static Methods
-
-        /**
-         * Enumerates the system environment and returns a map of env variable
-         * names to the string values they hold.
-         * @return A Map of all environment variables.
-         * @throw Exception if an error occurs
-         */
-        static util::Map<std::string, std::string> getenv()
-            throw ( lang::Exception );
-
-        /**
-         * Reads an environment value from the system and returns it as a
-         * string object
-         * @param name - the env var to read
-         * @return a string with the value from the var or ""
-         * @throws an Exception if an error occurs while reading the Env.
-         */
-        static std::string getenv( const std::string& name )
-            throw ( lang::Exception );
-
-        /**
-         * Clears a set env value if one is set.
-         * @param name - the env var to clear
-         * @throws an Exception if an error occurs while reading the Env.
-         */
-        static void unsetenv( const std::string& name )
-            throw ( lang::Exception );
-
-        /**
-         * Sets the specified system property to the value given
-         * @param name - name of the env val to set
-         * @param value - value to assign to name
-         * @throws an Exception if an error occurs
-         */
-        static void setenv( const std::string& name, const std::string& value )
-            throw ( lang::Exception );
-
-        /**
-         * @returns the current system time in Milliseconds
-         */
-        static long long currentTimeMillis();
-
-    private:
-
-        /**
-         * Enumerates the environment and return an array of strings
-         * with the values.  Caller owns the array.  The array is terminated
-         * by an element that holds the value NULL
-         * @returns a vector of env name=value paris.
-         */
-        static std::vector< std::string > getEnvArray();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_SYSTEM_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Thread.cpp b/src/decaf/src/main/decaf/lang/Thread.cpp
deleted file mode 100644
index 978f077..0000000
--- a/src/decaf/src/main/decaf/lang/Thread.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Thread.h"
-
-#include <apr_time.h>
-#include <apr_portable.h>
-
-#include <decaf/lang/Exception.h>
-#include <decaf/lang/exceptions/RuntimeException.h>
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-Thread::Thread() {
-    this->task = this;
-    this->started = false;
-    this->joined = false;
-    this->pool = NULL;
-    this->threadHandle = NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Thread::Thread( Runnable* task ) {
-    this->task = task;
-    this->started = false;
-    this->joined = false;
-    this->pool = NULL;
-    this->threadHandle = NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Thread::~Thread(){
-    if( pool != NULL ) {
-        apr_pool_destroy( pool );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Thread::start() throw ( Exception )
-{
-    if( this->started ) {
-        throw Exception(
-            __FILE__, __LINE__,
-            "Thread::start - Thread already started");
-    }
-
-    apr_pool_create( &pool, NULL );
-    apr_status_t err = apr_thread_create(
-        &this->threadHandle,
-        NULL,
-        runCallback,
-        this,
-        pool );
-
-    if( err != APR_SUCCESS ) {
-        throw Exception(
-            __FILE__, __LINE__,
-            "Thread::start - Coud not start thread");
-    }
-
-    // Mark the thread as started.
-    started = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Thread::join() throw( Exception )
-{
-    if( !this->started ) {
-        throw Exception( __FILE__, __LINE__,
-            "Thread::join() called without having called Thread::start()");
-    }
-
-    if( !this->joined ) {
-        apr_status_t threadReturn;
-        if( apr_thread_join( &threadReturn, this->threadHandle ) != APR_SUCCESS ) {
-            throw Exception( __FILE__, __LINE__,
-                "Thread::join() - Failed to Join the Thread");
-        }
-    }
-    this->joined = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Thread::sleep( int millisecs ) {
-    apr_sleep( (apr_interval_time_t)(millisecs * 1000) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned long Thread::getId() {
-    return (long)( apr_os_thread_current() );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void* APR_THREAD_FUNC Thread::runCallback( apr_thread_t* self, void* param ) {
-
-    // Get the instance.
-    Thread* thread = (Thread*)param;
-
-    // Invoke run on the task.
-    try{
-        thread->task->run();
-    } catch( ... ){
-        RuntimeException ex(
-            __FILE__, __LINE__,
-            "unhandled exception bubbled up to Thread::run");
-        ex.printStackTrace();
-    }
-
-    // Indicate we are done.
-    apr_thread_exit( self, APR_SUCCESS );
-    return NULL;
-}
diff --git a/src/decaf/src/main/decaf/lang/Thread.h b/src/decaf/src/main/decaf/lang/Thread.h
deleted file mode 100644
index fcbcbf7..0000000
--- a/src/decaf/src/main/decaf/lang/Thread.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_THREAD_H_
-#define _DECAF_LANG_THREAD_H_
-
-#include <decaf/lang/Exception.h>
-#include <decaf/lang/Runnable.h>
-#include <decaf/util/Config.h>
-#include <stdexcept>
-#include <assert.h>
-
-#include <apr_pools.h>
-#include <apr_thread_proc.h>
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * Basic thread class - mimics the Java Thread.  Derived classes may
-     * implement the run method, or this class can be used as is with
-     * a provided Runnable delegate.
-     */
-    class DECAF_API Thread : public Runnable
-    {
-    private:
-
-        /**
-         * The task to be run by this thread, defaults to
-         * this thread object.
-         */
-        Runnable* task;
-
-        /**
-         * APR Pool to allocate thread from
-         */
-        apr_pool_t* pool;
-
-        /**
-         * APR Thread Handle
-         */
-        apr_thread_t* threadHandle;
-
-        /**
-         * Started state of this thread.
-         */
-        bool started;
-
-        /**
-         * Indicates whether the thread has already been
-         * joined.
-         */
-        bool joined;
-
-    public:
-
-        /**
-         * default Constructor
-         */
-        Thread();
-
-        /**
-         * Constructor
-         * @param task the Runnable that this thread manages
-         */
-        Thread( Runnable* task );
-
-        virtual ~Thread();
-
-        /**
-         * Creates a system thread and starts it in a joinable mode.
-         * Upon creation, the
-         * run() method of either this object or the provided Runnable
-         * object will be invoked in the context of this thread.
-         * @exception runtime_error is thrown if the system could
-         * not start the thread.
-         */
-        virtual void start() throw ( Exception );
-
-        /**
-         * Wait til the thread exits. This is when the run()
-         * method has returned or has thrown an exception.
-         */
-        virtual void join() throw ( Exception );
-
-        /**
-         * Default implementation of the run method - does nothing.
-         */
-        virtual void run(){};
-
-    public:
-
-        /**
-         * Halts execution of the calling thread for a specified no of millisec.
-         *
-         * Note that this method is a static method that applies to the
-         * calling thread and not to the thread object.
-         * @param millisecs time in milliseconds to sleep
-         */
-        static void sleep( int millisecs );
-
-        /**
-         * Obtains the Thread Id of the current thread
-         * @return Thread Id
-         */
-        static unsigned long getId();
-
-    private:
-
-        // Internal thread handling
-        static void* APR_THREAD_FUNC runCallback( apr_thread_t* self, void* param );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_THREAD_H_*/
diff --git a/src/decaf/src/main/decaf/lang/Throwable.h b/src/decaf/src/main/decaf/lang/Throwable.h
deleted file mode 100644
index b22a8d7..0000000
--- a/src/decaf/src/main/decaf/lang/Throwable.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_THROWABLE_H_
-#define _DECAF_LANG_THROWABLE_H_
-
-// Includes
-#include <string>
-#include <vector>
-#include <iostream>
-#include <exception>
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace lang{
-
-    /**
-     * This class represents an error that has occurred.
-     */
-    class DECAF_API Throwable : public std::exception {
-
-    public:
-
-        Throwable() throw() {}
-
-        virtual ~Throwable() throw() {}
-
-        /**
-         * Gets the cause of the error.
-         * @return string errors message
-         */
-        virtual std::string getMessage() const = 0;
-
-        /**
-         * Adds a file/line number to the stack trace.
-         * @param file The name of the file calling this method (use __FILE__).
-         * @param lineNumber The line number in the calling file (use __LINE__).
-         */
-        virtual void setMark( const char* file, const int lineNumber ) = 0;
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         * @return Copy of this Exception object
-         */
-        virtual Throwable* clone() const = 0;
-
-        /**
-         * Provides the stack trace for every point where
-         * this exception was caught, marked, and rethrown.
-         * @return vector containing stack trace strings
-         */
-        virtual std::vector< std::pair< std::string, int> > getStackTrace() const = 0;
-
-        /**
-         * Prints the stack trace to std::err
-         */
-        virtual void printStackTrace() const = 0;
-
-        /**
-         * Prints the stack trace to the given output stream.
-         * @param stream the target output stream.
-         */
-        virtual void printStackTrace( std::ostream& stream ) const = 0;
-
-        /**
-         * Gets the stack trace as one contiguous string.
-         * @return string with formatted stack trace data
-         */
-        virtual std::string getStackTraceString() const = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_THROWABLE_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/ExceptionDefines.h b/src/decaf/src/main/decaf/lang/exceptions/ExceptionDefines.h
deleted file mode 100644
index f82fd2a..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/ExceptionDefines.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_EXCEPTIONS_EXCEPTIONDEFINES_H_
-#define _DECAF_LANG_EXCEPTIONS_EXCEPTIONDEFINES_H_
-
-/**
- * Macro for catching and rethrowing an exception of
- * a given type.
- * @param type The type of the exception to throw
- * (e.g. Exception ).
- */
-#define DECAF_CATCH_RETHROW( type ) \
-    catch( type& ex ){ \
-        ex.setMark( __FILE__, __LINE__ ); \
-        throw ex; \
-    }
-
-/**
- * Macro for catching an exception of one type and then rethrowing
- * as another type.
- * @param sourceType the type of the exception to be caught.
- * @param targetType the type of the exception to be thrown.
- */
-#define DECAF_CATCH_EXCEPTION_CONVERT( sourceType, targetType ) \
-    catch( sourceType& ex ){ \
-        targetType target( ex ); \
-        target.setMark( __FILE__, __LINE__ ); \
-        throw target; \
-    }
-
-/**
- * A catch-all that throws a known exception.
- * @param type the type of exception to be thrown.
- */
-#define DECAF_CATCHALL_THROW( type ) \
-    catch( ... ){ \
-        type ex( __FILE__, __LINE__, \
-            "caught unknown exception" ); \
-        throw ex; \
-    }
-
-/**
- * A catch-all that does not throw an exception, one use would
- * be to catch any exception in a destructor and mark it, but not
- * throw so that cleanup would continue as normal.
- */
-#define DECAF_CATCHALL_NOTHROW( ) \
-    catch( ... ){ \
-        lang::Exception ex( __FILE__, __LINE__, \
-            "caught unknown exception, not rethrowing" ); \
-    }
-
-/**
- * Macro for catching and rethrowing an exception of
- * a given type.
- * @param type The type of the exception to throw
- * (e.g. Exception ).
- */
-#define DECAF_CATCH_NOTHROW( type ) \
-    catch( type& ex ){ \
-        ex.setMark( __FILE__, __LINE__ ); \
-    }
-
-#endif /*_DECAF_LANG_EXCEPTIONS_EXCEPTIONDEFINES_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/IllegalArgumentException.h b/src/decaf/src/main/decaf/lang/exceptions/IllegalArgumentException.h
deleted file mode 100644
index bc95f1b..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/IllegalArgumentException.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_ILLEGALARGUMENTEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_ILLEGALARGUMENTEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an illegal argument was passed into a method.
-     */
-    class DECAF_API IllegalArgumentException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        IllegalArgumentException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        IllegalArgumentException( const Exception& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        IllegalArgumentException( const IllegalArgumentException& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        IllegalArgumentException(const char* file, const int lineNumber,
-            const char* msg, ...) throw()
-        : Exception()
-        {
-            va_list vargs ;
-            va_start(vargs, msg) ;
-            buildMessage(msg, vargs) ;
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual Exception* clone() const{
-            return new IllegalArgumentException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~IllegalArgumentException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_ILLEGALARGUMENTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/IllegalMonitorStateException.h b/src/decaf/src/main/decaf/lang/exceptions/IllegalMonitorStateException.h
deleted file mode 100644
index bbdb4a2..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/IllegalMonitorStateException.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_ILLEGALMONITORSTATEEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_ILLEGALMONITORSTATEEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an error occurs from calling a method from syncronizable
-     * and the caller doesn't hold a lock on the object.
-     */
-    class DECAF_API IllegalMonitorStateException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        IllegalMonitorStateException() throw() {};
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        IllegalMonitorStateException(const Exception& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        IllegalMonitorStateException(const IllegalMonitorStateException& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        IllegalMonitorStateException( const char* file,
-                                      const int lineNumber,
-                                      const char* msg, ...) throw()
-        {
-            va_list vargs;
-            va_start(vargs, msg);
-            buildMessage(msg, vargs);
-
-            // Set the first mark for this exception.
-            setMark(file, lineNumber);
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual IllegalMonitorStateException* clone() const{
-            return new IllegalMonitorStateException(*this);
-        }
-
-        virtual ~IllegalMonitorStateException() throw() {}
-
-   };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_ILLEGALMONITORSTATEEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/IllegalStateException.h b/src/decaf/src/main/decaf/lang/exceptions/IllegalStateException.h
deleted file mode 100644
index 810e2eb..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/IllegalStateException.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_ILLEGALSTATEEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_ILLEGALSTATEEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an error occurs from calling a method from syncronizable
-     * and the caller doesn't hold a lock on the object.
-     */
-    class DECAF_API IllegalStateException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        IllegalStateException() throw() {};
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        IllegalStateException(const Exception& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        IllegalStateException(const IllegalStateException& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        IllegalStateException( const char* file,
-                               const int lineNumber,
-                               const char* msg, ...) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start(vargs, msg);
-            buildMessage(msg, vargs);
-
-            // Set the first mark for this exception.
-            setMark(file, lineNumber);
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual IllegalStateException* clone() const{
-            return new IllegalStateException(*this);
-        }
-
-        virtual ~IllegalStateException() throw() {}
-
-   };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_ILLEGALSTATEEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/IndexOutOfBoundsException.h b/src/decaf/src/main/decaf/lang/exceptions/IndexOutOfBoundsException.h
deleted file mode 100644
index 1e7a61b..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/IndexOutOfBoundsException.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_INDEXOUTOFBOUNDSEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_INDEXOUTOFBOUNDSEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an illegal argument was passed into a method.
-     */
-    class DECAF_API IndexOutOfBoundsException : public Exception
-    {
-    public:
-
-      /**
-       * Default Constructor
-       */
-      IndexOutOfBoundsException() throw() {}
-
-      /**
-       * Conversion Constructor from some other Exception
-       * @param An exception that should become this type of Exception
-       */
-      IndexOutOfBoundsException( const Exception& ex ) throw()
-      : Exception()
-      {
-         *(Exception*)this = ex;
-      }
-
-      /**
-       * Copy Constructor
-       */
-      IndexOutOfBoundsException( const IndexOutOfBoundsException& ex ) throw()
-      : Exception()
-      {
-         *(Exception*)this = ex;
-      }
-
-      /**
-       * Constructor - Initializes the file name and line number where
-       * this message occured.  Sets the message to report, using an
-       * optional list of arguments to parse into the message
-       * @param file name where exception occurs
-       * @param line number where the exception occurred.
-       * @param message to report
-       * @param list of primitives that are formatted into the message
-       */
-      IndexOutOfBoundsException(const char* file, const int lineNumber,
-         const char* msg, ...) throw()
-      : Exception()
-      {
-         va_list vargs ;
-         va_start(vargs, msg) ;
-         buildMessage(msg, vargs) ;
-
-         // Set the first mark for this exception.
-         setMark( file, lineNumber );
-      }
-
-      /**
-       * Clones this exception.  This is useful for cases where you need
-       * to preserve the type of the original exception as well as the message.
-       * All subclasses should override.
-       */
-      virtual IndexOutOfBoundsException* clone() const{
-         return new IndexOutOfBoundsException( *this );
-      }
-
-      /**
-       * Destructor
-       */
-      virtual ~IndexOutOfBoundsException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_INDEXOUTOFBOUNDSEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/InterruptedException.h b/src/decaf/src/main/decaf/lang/exceptions/InterruptedException.h
deleted file mode 100644
index 7818933..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/InterruptedException.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_INTERRUPTEDENTEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_INTERRUPTEDENTEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an Thread is interrupted during a wait.
-     */
-    class DECAF_API InterruptedException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        InterruptedException() throw() {};
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        InterruptedException(const Exception& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        InterruptedException(const InterruptedException& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        InterruptedException( const char* file,
-                              const int lineNumber,
-                              const char* msg, ... ) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start(vargs, msg);
-            buildMessage(msg, vargs);
-
-            // Set the first mark for this exception.
-            setMark(file, lineNumber);
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual InterruptedException* clone() const{
-            return new InterruptedException(*this);
-        }
-
-        virtual ~InterruptedException() throw() {}
-
-   };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_INTERRUPTEDENTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/InvalidStateException.h b/src/decaf/src/main/decaf/lang/exceptions/InvalidStateException.h
deleted file mode 100644
index 3e64469..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/InvalidStateException.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_INVALIDSTATEEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_INVALIDSTATEEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an operation is requested, but the state of the object
-     * servicing the request is not correct for that request.
-     */
-    class DECAF_API InvalidStateException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        InvalidStateException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        InvalidStateException(const Exception& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        InvalidStateException( const InvalidStateException& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        InvalidStateException( const char* file,
-                               const int lineNumber,
-                               const char* msg, ... ) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual InvalidStateException* clone() const{
-            return new InvalidStateException(*this);
-        }
-
-        virtual ~InvalidStateException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_INVALIDSTATEEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/NoSuchElementException.h b/src/decaf/src/main/decaf/lang/exceptions/NoSuchElementException.h
deleted file mode 100644
index 5dcc04d..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/NoSuchElementException.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_NOSUCHELEMENTEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_NOSUCHELEMENTEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown from an operation that attempts to access some element that does
-     * not exist.
-     */
-    class DECAF_API NoSuchElementException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        NoSuchElementException() throw() {};
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        NoSuchElementException( const Exception& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        NoSuchElementException( const NoSuchElementException& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        NoSuchElementException( const char* file,
-                                const int lineNumber,
-                                const char* msg, ... ) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual NoSuchElementException* clone() const{
-            return new NoSuchElementException(*this);
-        }
-
-        virtual ~NoSuchElementException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_NOSUCHELEMENTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/NullPointerException.h b/src/decaf/src/main/decaf/lang/exceptions/NullPointerException.h
deleted file mode 100644
index ce97fc5..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/NullPointerException.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_EXCEPTIONS_NULLPOINTERENTEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_NULLPOINTERENTEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an error occurs that involves a pointer being NULL
-     */
-    class DECAF_API NullPointerException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        NullPointerException() throw() {};
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        NullPointerException( const Exception& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        NullPointerException(const NullPointerException& ex) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        NullPointerException( const char* file,
-                              const int lineNumber,
-                              const char* msg, ... ) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual NullPointerException* clone() const{
-            return new NullPointerException( *this );
-        }
-
-        virtual ~NullPointerException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_NULLPOINTERENTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/NumberFormatException.h b/src/decaf/src/main/decaf/lang/exceptions/NumberFormatException.h
deleted file mode 100644
index 56d9bfd..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/NumberFormatException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_EXCEPTIONS_NUMBERFORMATEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_NUMBERFORMATEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an error occurs that involves a conversion to a Number from
-     * a string and the string is not a valid number.
-     */
-    class NumberFormatException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        NumberFormatException() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        NumberFormatException( const Exception& ex ) throw()
-        : Exception() {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        NumberFormatException(const NumberFormatException& ex) throw()
-        : Exception() {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        NumberFormatException( const char* file,
-                               const int lineNumber,
-                               const char* msg, ... ) throw()
-        : Exception() {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual NumberFormatException* clone() const {
-            return new NumberFormatException( *this );
-        }
-
-        virtual ~NumberFormatException() throw () {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_NUMBERFORMATEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/RuntimeException.h b/src/decaf/src/main/decaf/lang/exceptions/RuntimeException.h
deleted file mode 100644
index 7c24f7b..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/RuntimeException.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_RUNTIMEENTEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_RUNTIMEENTEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an error occurs that involves something in the run time
-     * This could be a memory allocation exception or some other generally
-     * unrecoverable exception.
-     */
-    class DECAF_API RuntimeException : public Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        RuntimeException() throw() {};
-
-        /**
-         * Conversion Constructor from some other ActiveMQException
-         * @param An exception that should become this type of Exception
-         */
-        RuntimeException( const Exception& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        RuntimeException( const RuntimeException& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        RuntimeException( const char* file,
-                          const int lineNumber,
-                          const char* msg, ... ) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start(vargs, msg);
-            buildMessage(msg, vargs);
-
-            // Set the first mark for this exception.
-            setMark(file, lineNumber);
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual RuntimeException* clone() const{
-            return new RuntimeException( *this );
-        }
-
-        virtual ~RuntimeException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_RUNTIMEENTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/lang/exceptions/UnsupportedOperationException.h b/src/decaf/src/main/decaf/lang/exceptions/UnsupportedOperationException.h
deleted file mode 100644
index 0ce3831..0000000
--- a/src/decaf/src/main/decaf/lang/exceptions/UnsupportedOperationException.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_LANG_EXCEPTIONS_UNSUPPORTEDOPERATIONEXCEPTION_H_
-#define _DECAF_LANG_EXCEPTIONS_UNSUPPORTEDOPERATIONEXCEPTION_H_
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace lang{
-namespace exceptions{
-
-    /*
-     * Thrown when an unsupported method is called.
-     */
-    class DECAF_API UnsupportedOperationException : public lang::Exception
-    {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        UnsupportedOperationException() throw() {};
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        UnsupportedOperationException( const Exception& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        UnsupportedOperationException( const UnsupportedOperationException& ex ) throw()
-        : Exception()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        UnsupportedOperationException( const char* file,
-                                       const int lineNumber,
-                                       const char* msg, ... ) throw()
-        : Exception()
-        {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual UnsupportedOperationException* clone() const{
-            return new UnsupportedOperationException( *this );
-        }
-
-        virtual ~UnsupportedOperationException() throw() {}
-
-    };
-
-}}}
-
-#endif /*_DECAF_LANG_EXCEPTIONS_UNSUPPORTEDOPERATIONEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/BindException.h b/src/decaf/src/main/decaf/net/BindException.h
deleted file mode 100644
index a1fa5e9..0000000
--- a/src/decaf/src/main/decaf/net/BindException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_BINDEXCEPTION_H_
-#define _DECAF_NET_BINDEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/net/SocketException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API BindException : public SocketException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        BindException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        BindException( const Exception& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        BindException( const BindException& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        BindException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : SocketException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual BindException* clone() const {
-            return new BindException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~BindException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_BINDEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/BufferedSocket.cpp b/src/decaf/src/main/decaf/net/BufferedSocket.cpp
deleted file mode 100644
index 8f0f7a0..0000000
--- a/src/decaf/src/main/decaf/net/BufferedSocket.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BufferedSocket.h"
-
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::io;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedSocket::BufferedSocket( Socket* socket,
-                                int inputBufferSize,
-                                int outputBufferSize,
-                                bool own ) :
-    socket(NULL),
-    own(false),
-    inputStream(NULL),
-    outputStream(NULL),
-    inputBufferSize(0),
-    outputBufferSize(0)
-{
-    if(inputBufferSize < 0 || outputBufferSize < 0 ) {
-        throw IllegalArgumentException(
-            __FILE__, __LINE__,
-            "BufferedSocket::BufferedSocket - buffer sizes must be >=0! "
-            "Given input buffer size: %d, Given output buffer size: %d",
-            inputBufferSize,
-            outputBufferSize );
-    }
-
-    if(socket == NULL) {
-        throw IllegalArgumentException(
-            __FILE__, __LINE__,
-            "BufferedSocket::BufferedSocket - Constructed with NULL Socket");
-    }
-
-    this->socket = socket;
-    this->inputBufferSize = inputBufferSize;
-    this->outputBufferSize = outputBufferSize;
-    this->own = own;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-BufferedSocket::~BufferedSocket() {
-    try {
-        close();
-    }
-    DECAF_CATCH_NOTHROW( Exception )
-    DECAF_CATCHALL_NOTHROW()
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedSocket::connect( const char* host, int port )
-    throw( SocketException ) {
-
-    try {
-
-        if( socket->isConnected() ) {
-            throw SocketException( __FILE__, __LINE__,
-                 "BufferedSocket::connect() - socket already connected" );
-        }
-
-        // Connect the socket.
-        socket->connect( host, port );
-
-        // Now create the buffered streams that wrap around the socket.
-        inputStream = new BufferedInputStream(
-            socket->getInputStream(), (std::size_t)inputBufferSize );
-        outputStream = new BufferedOutputStream(
-            socket->getOutputStream(), (std::size_t)outputBufferSize );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCH_EXCEPTION_CONVERT( Exception, SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BufferedSocket::close() throw( lang::Exception ) {
-
-    try {
-
-        if( outputStream != NULL ) {
-            // Ensure all data is written
-            outputStream->flush();
-
-            delete outputStream;
-            outputStream = NULL;
-        }
-
-        if( inputStream != NULL ){
-            delete inputStream;
-            inputStream = NULL;
-        }
-
-        if( socket != NULL ){
-            // Close the socket
-            try{
-                socket->close();
-            } catch( lang::Exception& ex ){ /* Absorb */ }
-
-            // if we own it, delete it.
-            if( own ) {
-                delete socket;
-            }
-            socket = NULL;
-        }
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCH_EXCEPTION_CONVERT( Exception, SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
diff --git a/src/decaf/src/main/decaf/net/BufferedSocket.h b/src/decaf/src/main/decaf/net/BufferedSocket.h
deleted file mode 100644
index 313b79c..0000000
--- a/src/decaf/src/main/decaf/net/BufferedSocket.h
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_NET_BUFFEREDSOCKET_H_
-#define _DECAF_NET_BUFFEREDSOCKET_H_
-
-#include <decaf/net/Socket.h>
-#include <decaf/net/SocketException.h>
-#include <decaf/io/BufferedInputStream.h>
-#include <decaf/io/BufferedOutputStream.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * Buffered Socket class that wraps a <code>Socket</code> derived
-     * object and provides Buffered input and Output Streams to improce
-     * the efficiency of the reads and writes.
-     */
-    class DECAF_API BufferedSocket : public Socket
-    {
-    private:
-
-        // Socket that this class wraps to provide buffering
-        Socket* socket;
-
-        // Indicates if the lifetime of the Socket is controlled by this
-        // class.  If true Socket is deleted at destruction.
-        bool own;
-
-        // Buffered Input stream to wrap the Socket input stream
-        io::BufferedInputStream* inputStream;
-
-        // Buffered Output stream to wrap the Socket input stream
-        io::BufferedOutputStream* outputStream;
-
-        // Sizes for the Buffered Streams
-        int inputBufferSize;
-        int outputBufferSize;
-
-    public:
-
-        /**
-         * Constructs a new Buffered socket object
-         * @param socket the socket to buffer
-         * @param inputBufferSize size of the input buffer
-         * @param outputBufferSize size of the output buffer
-         * @param own does this object own the passed socket
-         */
-        BufferedSocket( Socket* socket,
-                        int inputBufferSize = 1000,
-                        int outputBufferSize = 1000,
-                        bool own = true );
-
-        virtual ~BufferedSocket();
-
-        /**
-         * Connects to the specified destination. Closes this socket if
-         * connected to another destination.
-         * @param host The host of the server to connect to.
-         * @param port The port of the server to connect to.
-         * @throws IOException Thrown if a failure occurred in the connect.
-         */
-        virtual void connect( const char* host, int port )
-            throw( SocketException );
-
-        /**
-         * Closes this object and deallocates the appropriate resources.
-         * @throws CMSException
-         */
-        virtual void close() throw( lang::Exception );
-
-        /**
-         * Indicates whether or not this socket is connected to a destination.
-         * @return true if connected
-         */
-        virtual bool isConnected() const{
-            if( socket == NULL ){
-                return false;
-            }
-
-            return socket->isConnected();
-        }
-
-        /**
-         * Gets the InputStream for this socket.
-         * @return The InputStream for this socket. NULL if not connected.
-         */
-        virtual io::InputStream* getInputStream(){
-            return inputStream;
-        }
-
-        /**
-         * Gets the OutputStream for this socket.
-         * @return the OutputStream for this socket.  NULL if not connected.
-         */
-        virtual io::OutputStream* getOutputStream(){
-            return outputStream;
-        }
-
-        /**
-         * Gets the linger time.
-         * @return The linger time in seconds.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getSoLinger() const throw( SocketException ){
-            checkSocket();
-            return socket->getSoLinger();
-        }
-
-        /**
-         * Sets the linger time.
-         * @param linger The linger time in seconds.  If 0, linger is off.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setSoLinger( int linger ) throw( SocketException ){
-            checkSocket();
-            socket->setSoLinger( linger );
-        }
-
-        /**
-         * Gets the keep alive flag.
-         * @return True if keep alive is enabled.
-         * @throws SocketException if the operation fails.
-         */
-        virtual bool getKeepAlive() const throw( SocketException ){
-            checkSocket();
-            return socket->getKeepAlive();
-        }
-
-        /**
-         * Enables/disables the keep alive flag.
-         * @param keepAlive If true, enables the flag.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setKeepAlive( bool keepAlive ) throw( SocketException ){
-            checkSocket();
-            socket->setKeepAlive( keepAlive );
-        }
-
-        /**
-         * Gets the receive buffer size.
-         * @return the receive buffer size in bytes.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getReceiveBufferSize() const throw( SocketException ){
-            checkSocket();
-            return socket->getReceiveBufferSize();
-        }
-
-        /**
-         * Sets the recieve buffer size.
-         * @param size Number of bytes to set the receive buffer to.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setReceiveBufferSize( int size ) throw( SocketException ){
-            checkSocket();
-            socket->setReceiveBufferSize( size );
-        }
-
-        /**
-         * Gets the reuse address flag.
-         * @return True if the address can be reused.
-         * @throws SocketException if the operation fails.
-         */
-        virtual bool getReuseAddress() const throw( SocketException ){
-            checkSocket();
-            return socket->getReuseAddress();
-        }
-
-        /**
-         * Sets the reuse address flag.
-         * @param reuse If true, sets the flag.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setReuseAddress( bool reuse ) throw( SocketException ){
-            checkSocket();
-            socket->setReuseAddress( reuse );
-        }
-
-        /**
-         * Gets the send buffer size.
-         * @return the size in bytes of the send buffer.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getSendBufferSize() const throw( SocketException ){
-            checkSocket();
-            return socket->getSendBufferSize();
-        }
-
-        /**
-         * Sets the send buffer size.
-         * @param size The number of bytes to set the send buffer to.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setSendBufferSize( int size ) throw( SocketException ){
-            checkSocket();
-            socket->setSendBufferSize( size );
-        }
-
-        /**
-         * Gets the timeout for socket operations.
-         * @return The timeout in milliseconds for socket operations.
-         * @throws SocketException Thrown if unable to retrieve the information.
-         */
-        virtual int getSoTimeout() const throw( SocketException ){
-            checkSocket();
-            return socket->getSoTimeout();
-        }
-
-        /**
-         * Sets the timeout for socket operations.
-         * @param timeout The timeout in milliseconds for socket operations.<p>
-         * @throws SocketException Thrown if unable to set the information.
-         */
-        virtual void setSoTimeout( int timeout ) throw( SocketException ){
-            checkSocket();
-            socket->setSoTimeout( timeout );
-        }
-
-    private:
-
-        void checkSocket() const throw ( SocketException ) {
-            if( socket == NULL ) {
-                throw SocketException( __FILE__, __LINE__, "socket is NULL" );
-            }
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_BUFFEREDSOCKET_H_*/
diff --git a/src/decaf/src/main/decaf/net/ConnectException.h b/src/decaf/src/main/decaf/net/ConnectException.h
deleted file mode 100644
index e6f87ea..0000000
--- a/src/decaf/src/main/decaf/net/ConnectException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_CONNECTEXCEPTION_H_
-#define _DECAF_NET_CONNECTEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/net/SocketException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API ConnectException : public SocketException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        ConnectException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        ConnectException( const Exception& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        ConnectException( const ConnectException& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        ConnectException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : SocketException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual ConnectException* clone() const {
-            return new ConnectException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~ConnectException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_CONNECTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/HttpRetryException.h b/src/decaf/src/main/decaf/net/HttpRetryException.h
deleted file mode 100644
index 0074cbc..0000000
--- a/src/decaf/src/main/decaf/net/HttpRetryException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_HTTPRETRYEXCEPTION_H_
-#define _DECAF_NET_HTTPRETRYEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API HttpRetryException : public io::IOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        HttpRetryException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        HttpRetryException( const Exception& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        HttpRetryException( const HttpRetryException& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        HttpRetryException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : io::IOException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual HttpRetryException* clone() const {
-            return new HttpRetryException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~HttpRetryException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_HTTPRETRYEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/MalformedURLException.h b/src/decaf/src/main/decaf/net/MalformedURLException.h
deleted file mode 100644
index e24acd4..0000000
--- a/src/decaf/src/main/decaf/net/MalformedURLException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_MALFORMEDURLEXCEPTION_H_
-#define _DECAF_NET_MALFORMEDURLEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API MalformedURLException  : public io::IOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        MalformedURLException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        MalformedURLException( const Exception& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        MalformedURLException( const MalformedURLException& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        MalformedURLException( const char* file, const int lineNumber,
-                               const char* msg, ... ) throw ()
-        : io::IOException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual MalformedURLException* clone() const {
-            return new MalformedURLException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~MalformedURLException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_MALFORMEDURLEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/NoRouteToHostException.h b/src/decaf/src/main/decaf/net/NoRouteToHostException.h
deleted file mode 100644
index e8b2b85..0000000
--- a/src/decaf/src/main/decaf/net/NoRouteToHostException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_NOROUTETOHOSTEXCEPTION_H_
-#define _DECAF_NET_NOROUTETOHOSTEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/net/SocketException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API NoRouteToHostException : public SocketException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        NoRouteToHostException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        NoRouteToHostException( const Exception& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        NoRouteToHostException( const NoRouteToHostException& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        NoRouteToHostException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : SocketException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual NoRouteToHostException* clone() const {
-            return new NoRouteToHostException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~NoRouteToHostException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_NOROUTETOHOSTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/PortUnreachableException.h b/src/decaf/src/main/decaf/net/PortUnreachableException.h
deleted file mode 100644
index 937e842..0000000
--- a/src/decaf/src/main/decaf/net/PortUnreachableException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_PORTUNREACHABLEEXCEPTION_H_
-#define _DECAF_NET_PORTUNREACHABLEEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/net/SocketException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API PortUnreachableException : public SocketException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        PortUnreachableException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        PortUnreachableException( const Exception& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        PortUnreachableException( const PortUnreachableException& ex ) throw()
-        : SocketException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        PortUnreachableException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : SocketException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual PortUnreachableException* clone() const {
-            return new PortUnreachableException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~PortUnreachableException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_PORTUNREACHABLEEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/ProtocolException.h b/src/decaf/src/main/decaf/net/ProtocolException.h
deleted file mode 100644
index d422bc8..0000000
--- a/src/decaf/src/main/decaf/net/ProtocolException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_PROTOCOLEXCEPTION_H_
-#define _DECAF_NET_PROTOCOLEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API ProtocolException : public io::IOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        ProtocolException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        ProtocolException( const Exception& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        ProtocolException( const ProtocolException& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        ProtocolException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : io::IOException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual ProtocolException* clone() const {
-            return new ProtocolException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~ProtocolException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_PROTOCOLEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/ServerSocket.cpp b/src/decaf/src/main/decaf/net/ServerSocket.cpp
deleted file mode 100644
index 23511fa..0000000
--- a/src/decaf/src/main/decaf/net/ServerSocket.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ServerSocket.h"
-#include "SocketError.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <sys/types.h>
-#include <assert.h>
-#include <string>
-
-using namespace decaf;
-using namespace decaf::net;
-
-////////////////////////////////////////////////////////////////////////////////
-ServerSocket::ServerSocket() {
-    socketHandle = (apr_socket_t*)Socket::INVALID_SOCKET_HANDLE;
-    apr_pool_create( &apr_pool, NULL );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ServerSocket::~ServerSocket() {
-    // No shutdown, just close - dont want blocking destructor.
-    close();
-
-    // Free up the APR pool, this will release any remaining data we
-    // allocated but have deallocated.
-    apr_pool_destroy( apr_pool );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ServerSocket::bind( const char* host, int port ) throw ( SocketException ) {
-    this->bind( host, port, SOMAXCONN );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ServerSocket::bind( const char* host,
-                         int port,
-                         int backlog ) throw ( SocketException ) {
-
-    apr_status_t result = APR_SUCCESS;
-
-    if( isBound() ) {
-        throw SocketException ( __FILE__, __LINE__,
-            "ServerSocket::bind - Socket already bound" );
-    }
-
-    // Verify the port value.
-    if( port <= 0 || port > 65535 ) {
-        throw SocketException(
-            __FILE__, __LINE__,
-            "ServerSocket::bind - Port out of range: %d", port );
-    }
-
-    // Create the Address Info for the Socket
-    result = apr_sockaddr_info_get(
-        &socketAddress, host, APR_INET, port, 0, apr_pool );
-
-    if( result != APR_SUCCESS ) {
-        socketHandle = (apr_socket_t*)Socket::INVALID_SOCKET_HANDLE;
-        throw SocketException(
-              __FILE__, __LINE__,
-              SocketError::getErrorString().c_str() );
-    }
-
-    // Create the socket.
-    result = apr_socket_create(
-        &socketHandle, APR_INET, SOCK_STREAM, APR_PROTO_TCP, apr_pool );
-
-    if( result != APR_SUCCESS ) {
-        socketHandle = (apr_socket_t*)Socket::INVALID_SOCKET_HANDLE;
-        throw SocketException(
-              __FILE__, __LINE__,
-              SocketError::getErrorString().c_str() );
-    }
-
-    // Set the socket to reuse the address and default as blocking
-    apr_socket_opt_set( socketHandle, APR_SO_REUSEADDR, 1 );
-    apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0);
-    apr_socket_timeout_set( socketHandle, -1 );
-
-    // Bind to the Socket, this may be where we find out if the port is in use.
-    result = apr_socket_bind( socketHandle, socketAddress );
-
-    if( result != APR_SUCCESS ) {
-        close();
-        throw SocketException(
-              __FILE__, __LINE__,
-              "ServerSocket::bind - %s",
-              SocketError::getErrorString().c_str() );
-    }
-
-    // Setup the listen for incoming connection requests
-    result = apr_socket_listen( socketHandle, backlog );
-
-    if( result != APR_SUCCESS ) {
-        close();
-        throw SocketException(
-              __FILE__, __LINE__,
-              "ServerSocket::bind - %s",
-              SocketError::getErrorString().c_str() );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ServerSocket::close() throw ( lang::Exception ){
-
-    if( isBound() ) {
-        apr_socket_close( socketHandle );
-        socketHandle = (apr_socket_t*)Socket::INVALID_SOCKET_HANDLE;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool ServerSocket::isBound() const {
-    return this->socketHandle != (apr_socket_t*)Socket::INVALID_SOCKET_HANDLE;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Socket* ServerSocket::accept() throw (SocketException)
-{
-    SocketHandle incoming = NULL;
-    apr_status_t result = APR_SUCCESS;
-
-    // Loop to ignore any signal interruptions that occur during the operation.
-    do {
-        result = apr_socket_accept( &incoming, socketHandle, apr_pool );
-    } while( result == APR_EINTR );
-
-    if( result != APR_SUCCESS ) {
-        std::cout << "Failed to accept New Connection:" << std::endl;
-        throw SocketException(
-              __FILE__, __LINE__,
-              "ServerSocket::accept - %s",
-              SocketError::getErrorString().c_str() );
-    }
-
-    return new TcpSocket( incoming );
-}
diff --git a/src/decaf/src/main/decaf/net/ServerSocket.h b/src/decaf/src/main/decaf/net/ServerSocket.h
deleted file mode 100644
index ccff54e..0000000
--- a/src/decaf/src/main/decaf/net/ServerSocket.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_NET_SERVERSOCKETIMPL_H_
-#define _DECAF_NET_SERVERSOCKETIMPL_H_
-
-#include <decaf/net/TcpSocket.h>
-#include <decaf/net/SocketException.h>
-#include <decaf/util/Config.h>
-
-#include <apr_pools.h>
-#include <apr_network_io.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * A server socket class (for testing purposes).
-     */
-    class DECAF_API ServerSocket
-    {
-    public:
-
-        typedef apr_socket_t* SocketHandle;
-        typedef apr_sockaddr_t* SocketAddress;
-
-    private:
-
-        SocketHandle socketHandle;
-        SocketAddress socketAddress;
-        apr_pool_t* apr_pool;
-
-    public:
-
-        /**
-         * Constructor.
-         * Creates a non-bound server socket.
-         */
-        ServerSocket();
-
-        /**
-         * Destructor.
-         * Releases socket handle if close() hasn't been called.
-         */
-        virtual ~ServerSocket();
-
-    public:
-
-        /**
-         * Bind and listen to given IP/dns and port.
-         * @param host IP address or host name.
-         * @param port TCP port between 1..655535
-         */
-        virtual void bind( const char* host, int port ) throw ( SocketException );
-
-        /**
-         * Bind and listen to given IP/dns and port.
-         * @param host IP address or host name.
-         * @param port TCP port between 1..655535
-         * @param backlog Size of listen backlog.
-         */
-        virtual void bind( const char* host,
-                           int port,
-                           int backlog ) throw ( SocketException );
-
-        /**
-         * Blocks until a client connects to the bound socket.
-         * @return new socket. Never returns NULL.
-         */
-        virtual Socket* accept () throw ( SocketException );
-
-        /**
-         * Closes the server socket.
-         */
-        virtual void close() throw( lang::Exception );
-
-        /**
-         * @return true of the server socket is bound.
-         */
-        virtual bool isBound() const;
-
-   };
-
-}}
-
-#endif // _DECAF_NET_SERVERSOCKETIMPL_H_
-
diff --git a/src/decaf/src/main/decaf/net/Socket.h b/src/decaf/src/main/decaf/net/Socket.h
deleted file mode 100644
index 106428d..0000000
--- a/src/decaf/src/main/decaf/net/Socket.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_NET_SOCKET_H_
-#define _DECAF_NET_SOCKET_H_
-
-#include <decaf/net/SocketException.h>
-#include <decaf/io/InputStream.h>
-#include <decaf/io/OutputStream.h>
-#include <decaf/io/Closeable.h>
-#include <decaf/util/Config.h>
-
-#include <apr_network_io.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API Socket : public decaf::io::Closeable
-    {
-    public:
-
-        /**
-         * Define the SocketHandle type.
-         */
-        typedef apr_socket_t* SocketHandle;
-
-        /**
-         * Define the SocketAddress type
-         */
-        typedef apr_sockaddr_t* SocketAddress;
-
-        /**
-         * Defines a constant for an invalid socket handle.
-         */
-        static const int INVALID_SOCKET_HANDLE = 0;
-
-    public:
-
-        virtual ~Socket() {}
-
-        /**
-         * Connects to the specified destination. Closes this socket if
-         * connected to another destination.
-         * @param host The host of the server to connect to.
-         * @param port The port of the server to connect to.
-         * @throws IOException Thrown if a failure occurred in the connect.
-         */
-        virtual void connect( const char* host, int port )
-            throw(SocketException) = 0;
-
-        /**
-         * Indicates whether or not this socket is connected to a destination.
-         * @returns true if connected
-         */
-        virtual bool isConnected() const = 0;
-
-        /**
-         * Gets the InputStream for this socket.
-         * @return The InputStream for this socket. NULL if not connected.
-         */
-        virtual io::InputStream* getInputStream() = 0;
-
-        /**
-         * Gets the OutputStream for this socket.
-         * @return the OutputStream for this socket.  NULL if not connected.
-         */
-        virtual io::OutputStream* getOutputStream() = 0;
-
-        /**
-         * Gets the linger time.
-         * @return The linger time in seconds.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getSoLinger() const throw( SocketException ) = 0;
-
-        /**
-         * Sets the linger time.
-         * @param linger The linger time in seconds.  If 0, linger is off.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setSoLinger( int linger ) throw( SocketException ) = 0;
-
-        /**
-         * Gets the keep alive flag.
-         * @return True if keep alive is enabled.
-         * @throws SocketException if the operation fails.
-         */
-        virtual bool getKeepAlive() const throw( SocketException ) = 0;
-
-        /**
-         * Enables/disables the keep alive flag.
-         * @param keepAlive If true, enables the flag.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setKeepAlive( bool keepAlive ) throw( SocketException ) = 0;
-
-        /**
-         * Gets the receive buffer size.
-         * @return the receive buffer size in bytes.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getReceiveBufferSize() const throw( SocketException ) = 0;
-
-        /**
-         * Sets the recieve buffer size.
-         * @param size Number of bytes to set the receive buffer to.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setReceiveBufferSize( int size ) throw( SocketException ) = 0;
-
-        /**
-         * Gets the reuse address flag.
-         * @return True if the address can be reused.
-         * @throws SocketException if the operation fails.
-         */
-        virtual bool getReuseAddress() const throw( SocketException ) = 0;
-
-        /**
-         * Sets the reuse address flag.
-         * @param reuse If true, sets the flag.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setReuseAddress( bool reuse ) throw( SocketException ) = 0;
-
-        /**
-         * Gets the send buffer size.
-         * @return the size in bytes of the send buffer.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getSendBufferSize() const throw( SocketException ) = 0;
-
-        /**
-         * Sets the send buffer size.
-         * @param size The number of bytes to set the send buffer to.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setSendBufferSize( int size ) throw( SocketException ) = 0;
-
-        /**
-         * Gets the timeout for socket operations.
-         * @return The timeout in milliseconds for socket operations.
-         * @throws SocketException Thrown if unable to retrieve the information.
-         */
-        virtual int getSoTimeout() const throw( SocketException ) = 0;
-
-        /**
-         * Sets the timeout for socket operations.
-         * @param timeout The timeout in milliseconds for socket operations.<p>
-         * @throws SocketException Thrown if unable to set the information.
-         */
-        virtual void setSoTimeout( int timeout ) throw( SocketException ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKET_H_*/
diff --git a/src/decaf/src/main/decaf/net/SocketError.cpp b/src/decaf/src/main/decaf/net/SocketError.cpp
deleted file mode 100644
index e601b0d..0000000
--- a/src/decaf/src/main/decaf/net/SocketError.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SocketError.h"
-#include <decaf/util/Config.h>
-
-using namespace decaf;
-using namespace decaf::net;
-
-////////////////////////////////////////////////////////////////////////////////
-int SocketError::getErrorCode() {
-    return apr_get_netos_error();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string SocketError::getErrorString() {
-
-    std::string returnValue;
-
-    // Get the error code.
-    apr_status_t errorCode = apr_get_netos_error();
-
-    // Create a buffer and get the error
-    char buffer[256];
-    return apr_strerror( errorCode, buffer, sizeof( buffer ) );
-}
diff --git a/src/decaf/src/main/decaf/net/SocketError.h b/src/decaf/src/main/decaf/net/SocketError.h
deleted file mode 100644
index e9152aa..0000000
--- a/src/decaf/src/main/decaf/net/SocketError.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_SOCKETERROR_H_
-#define _DECAF_NET_SOCKETERROR_H_
-
-#include <string>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * Static utility class to simplify handling of error codes
-     * for socket operations.
-     */
-    class DECAF_API SocketError {
-    public:
-
-        /**
-         * Gets the last error appropriate for the platform.
-         */
-        static int getErrorCode();
-
-        /**
-         * Gets the string description for the last error.
-         */
-        static std::string getErrorString();
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETERROR_H_*/
diff --git a/src/decaf/src/main/decaf/net/SocketException.h b/src/decaf/src/main/decaf/net/SocketException.h
deleted file mode 100644
index 8933f31..0000000
--- a/src/decaf/src/main/decaf/net/SocketException.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_NET_SOCKETEXCEPTION_H_
-#define _DECAF_NET_SOCKETEXCEPTION_H_
-
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * Exception for errors when manipulating sockets.
-     */
-    class DECAF_API SocketException : public io::IOException
-    {
-    public:
-
-        SocketException() throw() {}
-
-        SocketException( const lang::Exception& ex ) throw()
-        : io::IOException() {
-            *(lang::Exception*)this = ex;
-        }
-
-        SocketException( const SocketException& ex ) throw()
-        : io::IOException() {
-            *(lang::Exception*)this = ex;
-        }
-
-        SocketException( const char* file, const int lineNumber,
-                         const char* msg, ...) throw()
-        : io::IOException() {
-            va_list vargs;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual SocketException* clone() const {
-            return new SocketException( *this );
-        }
-
-        virtual ~SocketException() throw() {}
-
-    };
-
-}}
-
-
-#endif // _DECAF_NET_SOCKETEXCEPTION_H_
-
diff --git a/src/decaf/src/main/decaf/net/SocketFactory.cpp b/src/decaf/src/main/decaf/net/SocketFactory.cpp
deleted file mode 100644
index c00d320..0000000
--- a/src/decaf/src/main/decaf/net/SocketFactory.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <decaf/net/SocketFactory.h>
-#include <decaf/net/BufferedSocket.h>
-#include <decaf/net/TcpSocket.h>
-#include <decaf/util/Properties.h>
-#include <stdio.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::net;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-Socket* SocketFactory::createSocket(
-    const std::string& uri,
-    const Properties& properties)
-        throw ( SocketException ) {
-
-    try {
-
-        // Ensure something is actually passed in for the URI
-        if( uri == "" ) {
-            throw SocketException( __FILE__, __LINE__,
-                "SocketTransport::start() - uri not provided" );
-        }
-
-        string dummy = uri;
-
-        // Extract the port.
-        std::size_t portIx = dummy.find( ':' );
-        if( portIx == string::npos ) {
-            throw SocketException( __FILE__, __LINE__,
-                "SocketTransport::start() - uri malformed - port not specified: %s", uri.c_str() );
-        }
-        string host = dummy.substr( 0, portIx );
-        string portString = dummy.substr( portIx + 1 );
-        int port;
-        if( sscanf( portString.c_str(), "%d", &port) != 1 ) {
-            throw SocketException( __FILE__, __LINE__,
-               "SocketTransport::start() - unable to extract port from uri: %s", uri.c_str() );
-        }
-
-        // Get the read buffer size.
-        int inputBufferSize = 10000;
-        dummy = properties.getProperty( "inputBufferSize", "10000" );
-        sscanf( dummy.c_str(), "%d", &inputBufferSize );
-
-        // Get the write buffer size.
-        int outputBufferSize = 10000;
-        dummy = properties.getProperty( "outputBufferSize", "10000" );
-        sscanf( dummy.c_str(), "%d", &outputBufferSize );
-
-        // Get the linger flag.
-        int soLinger = 0;
-        dummy = properties.getProperty( "soLinger", "0" );
-        sscanf( dummy.c_str(), "%d", &soLinger );
-
-        // Get the keepAlive flag.
-        bool soKeepAlive =
-            properties.getProperty( "soKeepAlive", "false" ) == "true";
-
-        // Get the socket receive buffer size.
-        int soReceiveBufferSize = -1;
-        dummy = properties.getProperty( "soReceiveBufferSize", "-1" );
-        sscanf( dummy.c_str(), "%d", &soReceiveBufferSize );
-
-        // Get the socket send buffer size.
-        int soSendBufferSize = -1;
-        dummy = properties.getProperty( "soSendBufferSize", "-1" );
-        sscanf( dummy.c_str(), "%d", &soSendBufferSize );
-
-        // Get the socket TCP_NODELAY flag.
-        bool tcpNoDelay =
-            properties.getProperty( "tcpNoDelay", "true" ) == "true";
-
-        // Now that we have all the elements that we wanted - let's do it!
-        // Create a TCP Socket and then Wrap it in a buffered socket
-        // so that users get the benefit of buffered reads and writes.
-        // The buffered socket will own the TcpSocket instance, and will
-        // clean it up when it is cleaned up.
-        TcpSocket* tcpSocket = new TcpSocket();
-
-        try {
-
-            // Connect the socket.
-            tcpSocket->connect( host.c_str(), port );
-
-            // Set the socket options.
-            tcpSocket->setSoLinger( soLinger );
-            tcpSocket->setKeepAlive( soKeepAlive );
-            tcpSocket->setTcpNoDelay( tcpNoDelay );
-
-            if( soReceiveBufferSize > 0 ){
-                tcpSocket->setReceiveBufferSize( soReceiveBufferSize );
-            }
-
-            if( soSendBufferSize > 0 ){
-                tcpSocket->setSendBufferSize( soSendBufferSize );
-            }
-        } catch ( SocketException& ex ) {
-            ex.setMark( __FILE__, __LINE__ );
-            try{
-                delete tcpSocket;
-            } catch( SocketException& ex2 ){ /* Absorb */ }
-
-            throw ex;
-        }
-
-        return tcpSocket;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCH_EXCEPTION_CONVERT( Exception, SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
diff --git a/src/decaf/src/main/decaf/net/SocketFactory.h b/src/decaf/src/main/decaf/net/SocketFactory.h
deleted file mode 100644
index ce5c5e3..0000000
--- a/src/decaf/src/main/decaf/net/SocketFactory.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_NET_SOCKETFACTORY_H_
-#define _DECAF_NET_SOCKETFACTORY_H_
-
-#include <decaf/net/SocketException.h>
-#include <decaf/util/Properties.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace net{
-
-    class Socket;
-
-    /**
-     * Socket Factory implementation for use in Creating Sockets
-     * <p>
-     * <p>
-     * Property Options: <p>
-     * Name                  Value <p>
-     * ------------------------------------- <p>
-     * inputBufferSize       size in bytes of the buffered input stream buffer.  Defaults to 10000.<p>
-     * outputBufferSize      size in bytes of the buffered output stream buffer. Defaults to 10000.<p>
-     * soLinger              linger time for the socket (in microseconds). Defaults to 0.<p>
-     * soKeepAlive           keep alive flag for the socket (true/false). Defaults to false.<p>
-     * soReceiveBufferSize   The size of the socket receive buffer (in bytes). Defaults to 2MB.<p>
-     * soSendBufferSize      The size of the socket send buffer (in bytes). Defaults to 2MB.<p>
-     * soTimeout             The timeout of socket IO operations (in microseconds). Defaults to 10000<p>
-     *
-     * @see <code>Socket</code>
-     */
-    class DECAF_API SocketFactory
-    {
-    public:
-
-        virtual ~SocketFactory();
-
-        /**
-         * Creates and returns a Socket dervied Object based on the values
-         * defined in the Properties Object that is passed in.
-         * @param the URI for the Socket Connection.
-         * @param properties a IProperties pointer.
-         * @throws SocketException.
-         */
-        static Socket* createSocket( const std::string& uri,
-                                     const util::Properties& properties )
-            throw ( SocketException );
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETFACTORY_H_*/
diff --git a/src/decaf/src/main/decaf/net/SocketInputStream.cpp b/src/decaf/src/main/decaf/net/SocketInputStream.cpp
deleted file mode 100644
index 9219768..0000000
--- a/src/decaf/src/main/decaf/net/SocketInputStream.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/util/Config.h>
-
-#if !defined(HAVE_WINSOCK2_H)
-    #include <sys/select.h>
-    #include <sys/socket.h>
-#else
-    #include <Winsock2.h>
-#endif
-
-#ifdef HAVE_SYS_IOCTL_H
-#define BSD_COMP /* Get FIONREAD on Solaris2. */
-#include <sys/ioctl.h>
-#endif
-
-// Pick up FIONREAD on Solaris 2.5.
-#ifdef HAVE_SYS_FILIO_H
-#include <sys/filio.h>
-#endif
-
-#include <decaf/net/SocketInputStream.h>
-#include <decaf/net/SocketError.h>
-#include <decaf/io/IOException.h>
-#include <decaf/lang/Character.h>
-#include <decaf/lang/exceptions/UnsupportedOperationException.h>
-#include <stdlib.h>
-#include <string>
-#include <stdio.h>
-#include <iostream>
-
-#include <apr_portable.h>
-
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::io;
-using namespace decaf::util;
-using namespace decaf::lang;
-using namespace std;
-
-////////////////////////////////////////////////////////////////////////////////
-SocketInputStream::SocketInputStream( net::Socket::SocketHandle socket ) {
-    this->socket = socket;
-    this->closed = false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-SocketInputStream::~SocketInputStream(){}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketInputStream::close() throw( lang::Exception ){
-    this->closed = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::size_t SocketInputStream::available() const throw ( io::IOException ){
-
-    // Convert to an OS level socket.
-    apr_os_sock_t* oss = NULL;
-    apr_os_sock_get( oss, socket );
-
-// The windows version
-#if defined(HAVE_WINSOCK2_H)
-
-    unsigned long numBytes = 0;
-
-    if( ::ioctlsocket( *oss, FIONREAD, &numBytes ) == SOCKET_ERROR ){
-        throw SocketException( __FILE__, __LINE__, "ioctlsocket failed" );
-    }
-
-    return (std::size_t)numBytes;
-
-#else // !defined(HAVE_WINSOCK2_H)
-
-    // If FIONREAD is defined - use ioctl to find out how many bytes
-    // are available.
-    #if defined(FIONREAD)
-
-        std::size_t numBytes = 0;
-        if( ::ioctl( *oss, FIONREAD, &numBytes ) != -1 ){
-            return numBytes;
-        }
-
-    #endif
-
-    // If we didn't get anything we can use select.  This is a little
-    // less functional.  We will poll on the socket - if there is data
-    // available, we'll return 1, otherwise we'll return zero.
-    #if defined(HAVE_SELECT)
-
-        fd_set rd;
-        FD_ZERO(&rd);
-        FD_SET( *oss, &rd );
-        struct timeval tv;
-        tv.tv_sec = 0;
-        tv.tv_usec = 0;
-        int returnCode = ::select( *oss+1, &rd, NULL, NULL, &tv );
-        if( returnCode == -1 ){
-            throw IOException(
-                __FILE__, __LINE__,
-                SocketError::getErrorString().c_str() );
-        }
-        return (returnCode == 0) ? 0 : 1;
-
-    #else
-
-        return 0;
-
-    #endif /* HAVE_SELECT */
-
-#endif // !defined(HAVE_WINSOCK2_H)
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char SocketInputStream::read() throw ( IOException ){
-
-    apr_status_t result = APR_SUCCESS;
-    char c;
-    apr_size_t size = 1;
-
-    result = apr_socket_recv( socket, &c, &size );
-
-    if( ( size != sizeof(c) && !closed ) || result != APR_SUCCESS ){
-        throw IOException( __FILE__, __LINE__,
-            "activemq::io::SocketInputStream::read - failed reading a byte");
-    }
-
-    return c;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int SocketInputStream::read( unsigned char* buffer,
-                             std::size_t bufferSize ) throw ( IOException )
-{
-    apr_size_t size = (apr_size_t)bufferSize;
-    apr_status_t result = APR_SUCCESS;
-
-    // Read data from the socket, size on input is size of buffer, when done
-    // size is the number of bytes actually read, can be <= bufferSize.
-    result = apr_socket_recv( socket, (char*)buffer, &size );
-
-    // Check for EOF, on windows we only get size==0 so check that to, if we
-    // were closed though then we throw an IOException so the caller knows we
-    // aren't usable anymore.
-    if( ( APR_STATUS_IS_EOF( result ) || size == 0 ) && !closed ) {
-        return -1;
-    }
-
-    // Check for a closed call from socket class, if closed then this read fails.
-    if( closed ){
-        throw IOException(
-            __FILE__, __LINE__,
-            "activemq::io::SocketInputStream::read - The connection is broken" );
-    }
-
-    // Check for error.
-    if( result != APR_SUCCESS ){
-        throw IOException(
-            __FILE__, __LINE__,
-            "decaf::net::SocketInputStream::read - %s",
-            SocketError::getErrorString().c_str() );
-    }
-
-    return size;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::size_t SocketInputStream::skip( std::size_t num DECAF_UNUSED )
-    throw ( io::IOException, lang::exceptions::UnsupportedOperationException ) {
-
-    throw lang::exceptions::UnsupportedOperationException(
-        __FILE__, __LINE__,
-        "SocketInputStream::skip() method is not supported");
-}
-
diff --git a/src/decaf/src/main/decaf/net/SocketInputStream.h b/src/decaf/src/main/decaf/net/SocketInputStream.h
deleted file mode 100644
index ae3bbd0..0000000
--- a/src/decaf/src/main/decaf/net/SocketInputStream.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_SOCKETINPUTSTREAM_H_
-#define _DECAF_NET_SOCKETINPUTSTREAM_H_
-
-#include <decaf/io/InputStream.h>
-#include <decaf/net/Socket.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * Input stream for performing reads on a socket.  This
-     * class will only work properly for blocking sockets.
-     */
-    class DECAF_API SocketInputStream : public io::InputStream {
-    private:
-
-        // The socket handle.
-        Socket::SocketHandle socket;
-        util::concurrent::Mutex mutex;
-        bool closed;
-
-    public:
-
-        /**
-         * Constructor.
-         * @param socket the socket handle.
-         */
-        SocketInputStream( Socket::SocketHandle socket );
-
-        /**
-         * Destructor.
-         */
-        virtual ~SocketInputStream();
-
-        /**
-         * Locks the object.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs )
-            throw( lang::Exception ) {
-
-            mutex.wait( millisecs );
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-        /**
-         * Returns the number of bytes available on the socket to
-         * be read right now.
-         * @return The number of bytes currently available to
-         * be read on the socket.
-         */
-        virtual std::size_t available() const throw ( io::IOException );
-
-        /**
-         * Reads a single byte from the buffer.  If no data
-         * is available, blocks until their is.
-         * @return The next byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual unsigned char read() throw ( io::IOException );
-
-        /**
-         * Reads an array of bytes from the buffer.  If no data
-         * is available, blocks until there is.
-         * @param buffer (out) the target buffer.
-         * @param bufferSize the size of the output buffer.
-         * @return The number of bytes read.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual int read( unsigned char* buffer,
-                          std::size_t bufferSize )
-            throw ( io::IOException );
-
-        /**
-         * Close - does nothing.  It is the responsibility of the owner
-         * of the socket object to close it.
-         * @throws CMSException
-         */
-        virtual void close() throw( lang::Exception );
-
-        /**
-         * Not supported.
-         * @throws an UnsupportedOperationException.
-         */
-        virtual std::size_t skip( std::size_t num )
-            throw ( io::IOException,
-                    lang::exceptions::UnsupportedOperationException );
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETINPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/net/SocketOutputStream.cpp b/src/decaf/src/main/decaf/net/SocketOutputStream.cpp
deleted file mode 100644
index fde0aa1..0000000
--- a/src/decaf/src/main/decaf/net/SocketOutputStream.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SocketOutputStream.h"
-#include <decaf/util/Config.h>
-#include <decaf/lang/Character.h>
-#include "SocketError.h"
-
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::io;
-using namespace decaf::util;
-using namespace std;
-
-////////////////////////////////////////////////////////////////////////////////
-SocketOutputStream::SocketOutputStream( Socket::SocketHandle socket ) {
-    this->socket = socket;
-    this->closed = false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-SocketOutputStream::~SocketOutputStream() {
-    close();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketOutputStream::close() throw( lang::Exception ) {
-    this->closed = true;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketOutputStream::write( unsigned char c ) throw ( IOException ) {
-    write( &c, 1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketOutputStream::write( const unsigned char* buffer, std::size_t len )
-    throw ( IOException ) {
-
-    apr_size_t remaining = (apr_size_t)len;
-    apr_status_t result = APR_SUCCESS;
-
-    while( remaining > 0 && !closed ) {
-        // On input remaining is the bytes to send, after return remaining
-        // is the amount actually sent.
-        result = apr_socket_send( socket, (const char*)buffer, &remaining );
-
-        if( result != APR_SUCCESS || closed ) {
-            throw IOException(
-                __FILE__, __LINE__,
-                "decaf::net::SocketOutputStream::write - %s",
-                SocketError::getErrorString().c_str() );
-        }
-
-        // move us to next position to write, or maybe end.
-        buffer += remaining;
-        remaining = len - remaining;
-    }
-}
diff --git a/src/decaf/src/main/decaf/net/SocketOutputStream.h b/src/decaf/src/main/decaf/net/SocketOutputStream.h
deleted file mode 100644
index 49e1e2d..0000000
--- a/src/decaf/src/main/decaf/net/SocketOutputStream.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_SOCKETOUTPUTSTREAM_H_
-#define _DECAF_NET_SOCKETOUTPUTSTREAM_H_
-
-#include <decaf/io/OutputStream.h>
-#include <decaf/net/Socket.h>
-#include <decaf/util/concurrent/Mutex.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * Output stream for performing write operations
-     * on a socket.
-     */
-    class DECAF_API SocketOutputStream : public io::OutputStream {
-    private:
-
-        // The socket.
-        Socket::SocketHandle socket;
-        util::concurrent::Mutex mutex;
-        bool closed;
-
-    public:
-
-        /**
-         * Constructor.
-         * @param socket the socket handle.
-         */
-        SocketOutputStream( Socket::SocketHandle socket );
-
-        virtual ~SocketOutputStream();
-
-        /**
-         * Locks the object.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs time in millisecsonds to wait, or WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs )
-            throw( lang::Exception ) {
-
-            mutex.wait( millisecs );
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-         }
-
-        /**
-         * Writes a single byte to the output stream.
-         * @param c the byte.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( unsigned char c ) throw ( io::IOException );
-
-        /**
-         * Writes an array of bytes to the output stream.
-         * @param buffer The array of bytes to write.
-         * @param len The number of bytes from the buffer to be written.
-         * @throws IOException thrown if an error occurs.
-         */
-        virtual void write( const unsigned char* buffer,
-                            std::size_t len ) throw ( io::IOException );
-
-        /**
-         * Flush - does nothing.
-         * @throws IOException
-         */
-        virtual void flush() throw ( io::IOException ){};
-
-        /**
-         * Close - does nothing.  It is the responsibility of the owner
-         * of the socket object to close it.
-         * @throws CMSException
-         */
-        virtual void close() throw( lang::Exception );
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETOUTPUTSTREAM_H_*/
diff --git a/src/decaf/src/main/decaf/net/SocketTimeoutException.h b/src/decaf/src/main/decaf/net/SocketTimeoutException.h
deleted file mode 100644
index 16e23b2..0000000
--- a/src/decaf/src/main/decaf/net/SocketTimeoutException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_SOCKETTIMEOUTEXCEPTION_H_
-#define _DECAF_NET_SOCKETTIMEOUTEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/io/InterruptedIOException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API SocketTimeoutException : public io::InterruptedIOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        SocketTimeoutException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        SocketTimeoutException( const Exception& ex ) throw()
-        : io::InterruptedIOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        SocketTimeoutException( const SocketTimeoutException& ex ) throw()
-        : io::InterruptedIOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        SocketTimeoutException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : io::InterruptedIOException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual SocketTimeoutException* clone() const {
-            return new SocketTimeoutException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~SocketTimeoutException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETTIMEOUTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/TcpSocket.cpp b/src/decaf/src/main/decaf/net/TcpSocket.cpp
deleted file mode 100644
index 9eb0195..0000000
--- a/src/decaf/src/main/decaf/net/TcpSocket.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <decaf/util/Config.h>
-
-#include "TcpSocket.h"
-#include "SocketInputStream.h"
-#include "SocketOutputStream.h"
-#include "SocketError.h"
-
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::io;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-TcpSocket::TcpSocket() throw ( SocketException )
-  : apr_pool( NULL ),
-    socketHandle( INVALID_SOCKET_HANDLE ),
-    inputStream( NULL ),
-    outputStream( NULL ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-TcpSocket::TcpSocket( SocketHandle socketHandle )
- :  apr_pool( NULL ),
-    socketHandle( INVALID_SOCKET_HANDLE ),
-    inputStream( NULL ),
-    outputStream( NULL ) {
-
-    try {
-
-        this->socketHandle = socketHandle;
-        this->inputStream = new SocketInputStream( socketHandle );
-        this->outputStream = new SocketOutputStream( socketHandle );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-TcpSocket::~TcpSocket() {
-    // No shutdown, just close - dont want blocking destructor.
-    close();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-InputStream* TcpSocket::getInputStream(){
-    return inputStream;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-OutputStream* TcpSocket::getOutputStream(){
-    return outputStream;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::connect(const char* host, int port) throw ( SocketException ) {
-
-    try{
-
-        if( isConnected() ) {
-            throw SocketException( __FILE__, __LINE__,
-                "Socket::connect - Socket already connected.  host: %s, port: %d", host, port );
-        }
-
-        // Create the APR Pool
-        apr_pool_create( &apr_pool, NULL );
-
-        // Create the Address data
-        checkResult( apr_sockaddr_info_get(
-            &socketAddress, host, APR_INET, port, 0, apr_pool ) );
-
-        // Create the actual socket.
-        checkResult( apr_socket_create(
-            &socketHandle, socketAddress->family, SOCK_STREAM, APR_PROTO_TCP, apr_pool ) );
-
-        // it is a good idea to specify socket options explicitly. in this
-        // case, we make a blocking socket with system timeout, this should allow us
-        // the time needed to connect to the socket before returning, but not
-        // block us forever waiting if there isn't anyone there.  Some poeple
-        // say that you shouldn't use this mode as its an OS timeout that is not
-        // controllable, if this becomes an issue, we should decide on what a
-        // reasonable timeout should be and set it here.
-        apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 );
-        apr_socket_timeout_set( socketHandle, -1 );
-
-        checkResult( apr_socket_connect( socketHandle, socketAddress ) );
-
-        // Now that we are connected, we want to set ourself up as a blocking
-        // socket by default.
-        apr_socket_opt_set( socketHandle, APR_SO_NONBLOCK, 0 );
-        apr_socket_timeout_set( socketHandle, -1 );
-
-        // Create an input/output stream for this socket.
-        inputStream = new SocketInputStream( socketHandle );
-        outputStream = new SocketOutputStream( socketHandle );
-
-    } catch( SocketException& ex ) {
-        ex.setMark( __FILE__, __LINE__);
-        try{ close(); } catch( lang::Exception& cx){ /* Absorb */ }
-        throw ex;
-    } catch( ... ) {
-        try{ close(); } catch( lang::Exception& cx){ /* Absorb */ }
-        throw SocketException(
-            __FILE__, __LINE__,
-            "TcpSocket::connect() - caught unknown exception" );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::close() throw( lang::Exception )
-{
-    // Destroy the input stream.
-    if( inputStream != NULL ){
-        delete inputStream;
-        inputStream = NULL;
-    }
-
-    // Destroy the output stream.
-    if( outputStream != NULL ){
-        delete outputStream;
-        outputStream = NULL;
-    }
-
-    // When connected we first shutdown, which breaks our reads and writes
-    // then we close to free APR resources.
-    if( isConnected() ) {
-        apr_socket_close( socketHandle );
-        socketHandle = INVALID_SOCKET_HANDLE;
-    }
-
-    // Destroy the APR Pool
-    if( apr_pool != NULL ) {
-        apr_pool_destroy( apr_pool );
-        apr_pool = NULL;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int TcpSocket::getSoLinger() const throw( SocketException ){
-
-   try{
-        int value = 0;
-        checkResult( apr_socket_opt_get( socketHandle, APR_SO_LINGER, &value ) );
-        return value;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setSoLinger( int dolinger ) throw( SocketException ){
-
-    try{
-        checkResult( apr_socket_opt_set( socketHandle, APR_SO_LINGER, dolinger ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool TcpSocket::getKeepAlive() const throw( SocketException ){
-
-    try{
-        int value = 0;
-        checkResult( apr_socket_opt_get( socketHandle, APR_SO_KEEPALIVE, &value ) );
-        return value != 0;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setKeepAlive( const bool keepAlive ) throw( SocketException ){
-
-    try{
-        int value = keepAlive ? 1 : 0;
-        checkResult( apr_socket_opt_set( socketHandle, APR_SO_KEEPALIVE, value ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int TcpSocket::getReceiveBufferSize() const throw( SocketException ){
-
-    try{
-        int value;
-        checkResult( apr_socket_opt_get( socketHandle, APR_SO_RCVBUF, &value ) );
-        return value;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setReceiveBufferSize( int size ) throw( SocketException ){
-
-    try{
-        checkResult( apr_socket_opt_set( socketHandle, APR_SO_RCVBUF, size ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool TcpSocket::getReuseAddress() const throw( SocketException ){
-
-    try{
-        int value;
-        checkResult( apr_socket_opt_get( socketHandle, APR_SO_REUSEADDR, &value ) );
-        return value != 0;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setReuseAddress( bool reuse ) throw( SocketException ){
-
-    try{
-        int value = reuse ? 1 : 0;
-        checkResult( apr_socket_opt_set( socketHandle, APR_SO_REUSEADDR, value ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int TcpSocket::getSendBufferSize() const throw( SocketException ){
-
-    try{
-        int value;
-        checkResult( apr_socket_opt_get( socketHandle, APR_SO_SNDBUF, &value ) );
-        return value;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setSendBufferSize( int size ) throw( SocketException ){
-
-    try{
-        checkResult( apr_socket_opt_set( socketHandle, APR_SO_SNDBUF, size ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setSoTimeout ( const int millisecs ) throw ( SocketException )
-{
-    try{
-        // Time is in microseconds so multiply by 1000.
-        checkResult( apr_socket_timeout_set( socketHandle, millisecs * 1000 ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int TcpSocket::getSoTimeout() const throw( SocketException )
-{
-    try{
-        // Time is in microseconds so divide by 1000.
-        apr_interval_time_t value = 0;
-        checkResult( apr_socket_timeout_get( socketHandle, &value ) );
-        return value / 1000;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool TcpSocket::getTcpNoDelay() const throw ( lang::Exception ) {
-
-    try{
-        int value;
-        checkResult( apr_socket_opt_get( socketHandle, APR_TCP_NODELAY, &value ) );
-        return value != 0;
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::setTcpNoDelay( bool value ) throw ( lang::Exception ) {
-
-    try{
-        int ivalue = value ? 1 : 0;
-        checkResult( apr_socket_opt_set( socketHandle, APR_TCP_NODELAY, ivalue ) );
-    }
-    DECAF_CATCH_RETHROW( SocketException )
-    DECAF_CATCHALL_THROW( SocketException )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void TcpSocket::checkResult( apr_status_t value ) const throw (SocketException) {
-
-    if( value != APR_SUCCESS ){
-        throw SocketException(
-            __FILE__, __LINE__,
-            SocketError::getErrorString().c_str() );
-    }
-}
diff --git a/src/decaf/src/main/decaf/net/TcpSocket.h b/src/decaf/src/main/decaf/net/TcpSocket.h
deleted file mode 100644
index 0c35988..0000000
--- a/src/decaf/src/main/decaf/net/TcpSocket.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_NET_TCPSOCKET_H_
-#define _DECAF_NET_TCPSOCKET_H_
-
-#include <decaf/net/SocketException.h>
-#include <decaf/net/Socket.h>
-#include <decaf/io/InputStream.h>
-#include <decaf/io/OutputStream.h>
-#include <decaf/util/Config.h>
-
-#include <apr_pools.h>
-
-namespace decaf{
-namespace net{
-
-    // Forward declarations
-    class SocketInputStream;
-    class SocketOutputStream;
-
-    /**
-     * Platform-independent implementation of the socket interface.
-     */
-    class DECAF_API TcpSocket : public Socket {
-    private:
-
-        /**
-         * APR Socket Pool to allocate from
-         */
-        apr_pool_t* apr_pool;
-
-        /**
-         * The handle for this socket.
-         */
-        SocketHandle socketHandle;
-
-        /**
-         * The Address info for this Socket
-         */
-        SocketAddress socketAddress;
-
-        /**
-         * The input stream for reading this socket.
-         */
-        SocketInputStream* inputStream;
-
-        /**
-         * The output stream for writing to this socket.
-         */
-        SocketOutputStream* outputStream;
-
-    public:
-
-        /**
-         * Construct a non-connected socket.
-         * @throws SocketException thrown one windows if the static initialization
-         * call to WSAStartup was not successful.
-         */
-        TcpSocket() throw ( SocketException );
-
-        /**
-         * Construct a connected or bound socket based on given
-         * socket handle.
-         * @param socketHandle a socket handle to wrap in the object
-         */
-        TcpSocket( SocketHandle socketHandle );
-
-        /**
-         * Destruct.
-         * Releases the socket handle but not
-         * gracefully shut down the connection.
-         */
-        virtual ~TcpSocket();
-
-        /**
-         * Gets the handle for the socket.
-         * @return SocketHabler for this Socket, can be NULL
-         */
-        SocketHandle getSocketHandle () {
-            return socketHandle;
-        }
-
-        /**
-         * Connects to the specified destination. Closes this socket if
-         * connected to another destination.
-         * @param host The host of the server to connect to.
-         * @param port The port of the server to connect to.
-         * @throws IOException Thrown if a failure occurred in the connect.
-         */
-        virtual void connect( const char* host, int port ) throw( SocketException );
-
-        /**
-         * Indicates whether or not this socket is connected to a destination.
-         * @return true if connected
-         */
-        virtual bool isConnected() const{
-            return socketHandle != INVALID_SOCKET_HANDLE;
-        }
-
-        /**
-         * Gets the InputStream for this socket.
-         * @return The InputStream for this socket. NULL if not connected.
-         */
-        virtual io::InputStream* getInputStream();
-
-        /**
-         * Gets the OutputStream for this socket.
-         * @return the OutputStream for this socket.  NULL if not connected.
-         */
-        virtual io::OutputStream* getOutputStream();
-
-        /**
-         * Gets the linger time.
-         * @return The linger time in seconds.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getSoLinger() const throw( SocketException );
-
-        /**
-         * Sets the linger time.
-         * @param linger The linger time in seconds.  If 0, linger is off.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setSoLinger( int linger ) throw( SocketException );
-
-        /**
-         * Gets the keep alive flag.
-         * @return True if keep alive is enabled.
-         * @throws SocketException if the operation fails.
-         */
-        virtual bool getKeepAlive() const throw( SocketException );
-
-        /**
-         * Enables/disables the keep alive flag.
-         * @param keepAlive If true, enables the flag.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setKeepAlive( bool keepAlive ) throw( SocketException );
-
-        /**
-         * Gets the receive buffer size.
-         * @return the receive buffer size in bytes.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getReceiveBufferSize() const throw( SocketException );
-
-        /**
-         * Sets the recieve buffer size.
-         * @param size Number of bytes to set the receive buffer to.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setReceiveBufferSize( int size ) throw( SocketException );
-
-        /**
-         * Gets the reuse address flag.
-         * @return True if the address can be reused.
-         * @throws SocketException if the operation fails.
-         */
-        virtual bool getReuseAddress() const throw( SocketException );
-
-        /**
-         * Sets the reuse address flag.
-         * @param reuse If true, sets the flag.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setReuseAddress( bool reuse ) throw( SocketException );
-
-        /**
-         * Gets the send buffer size.
-         * @return the size in bytes of the send buffer.
-         * @throws SocketException if the operation fails.
-         */
-        virtual int getSendBufferSize() const throw( SocketException );
-
-        /**
-         * Sets the send buffer size.
-         * @param size The number of bytes to set the send buffer to.
-         * @throws SocketException if the operation fails.
-         */
-        virtual void setSendBufferSize( int size ) throw( SocketException );
-
-        /**
-         * Gets the timeout for socket operations.
-         * @return The timeout in milliseconds for socket operations.
-         * @throws SocketException Thrown if unable to retrieve the information.
-         */
-        virtual int getSoTimeout() const throw( SocketException );
-
-        /**
-         * Sets the timeout for socket operations.
-         * @param timeout The timeout in milliseconds for socket operations.<p>
-         * @throws SocketException Thrown if unable to set the information.
-         */
-        virtual void setSoTimeout( int timeout ) throw(SocketException);
-
-        /**
-         * Closes this object and deallocates the appropriate resources.
-         * @throws CMSException
-         */
-        virtual void close() throw( lang::Exception );
-
-    public:
-
-        /**
-         * Gets the Status of the TCP_NODELAY param for this socket as a Bool
-         * @returns true if TCP_NODELAY is enabled
-         * @throws CMSException
-         */
-        virtual bool getTcpNoDelay() const throw ( lang::Exception );
-
-        /**
-         * Sets the Status of the TCP_NODELAY param for this socket as a Bool
-         * @param value - true if TCP_NODELAY is to be enabled
-         * @throws CMSException
-         */
-        virtual void setTcpNoDelay( bool value ) throw ( lang::Exception );
-
-    protected:
-
-        void checkResult( apr_status_t value ) const throw (SocketException);
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_TCPSOCKET_H_*/
diff --git a/src/decaf/src/main/decaf/net/URI.cpp b/src/decaf/src/main/decaf/net/URI.cpp
deleted file mode 100644
index 9293027..0000000
--- a/src/decaf/src/main/decaf/net/URI.cpp
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URI.h"
-
-#include <apr_strings.h>
-#include <decaf/lang/Integer.h>
-
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-const std::string URI::unreserved = "_-!.~\'()*";
-const std::string URI::punct = ",;:$&+=";
-const std::string URI::reserved = punct + "?/[]@";
-const std::string URI::someLegal = unreserved + punct;
-const std::string URI::allLegal = unreserved + reserved;
-
-////////////////////////////////////////////////////////////////////////////////
-URI::URI( const std::string& uri ) throw ( URISyntaxException) {
-
-    this->uriString = NULL;
-    this->parseURI( uri );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URI::URI( const std::string& scheme,
-          const std::string& ssp,
-          const std::string& fragment ) throw ( URISyntaxException ) {
-
-    std::string uri = "";
-
-    if( scheme != "" ) {
-        uri.append( scheme );
-        uri.append( ":" );
-    }
-
-    if( ssp != "" ) {
-        // QUOTE ILLEGAL CHARACTERS
-        uri.append( quoteComponent( ssp, allLegal ) );
-    }
-
-    if( fragment != "" ) {
-        uri.append( "#" );
-        // QUOTE ILLEGAL CHARACTERS
-        uri.append( quoteComponent( fragment, allLegal ) );
-    }
-
-    // Now hand of to the main parse function.
-    this->parseURI( uri );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URI::URI( const std::string& scheme, const std::string& userInfo,
-          const std::string& host, int port,
-          const std::string& path, const std::string& query,
-          const std::string& fragment ) throw ( URISyntaxException ) {
-
-    this->uriString = NULL;
-
-    if( scheme == "" && userInfo == "" && host == "" &&
-        path == "" && query == "" && fragment == "" ) {
-
-        this->uri.path = "";
-        return;
-    }
-
-    if( scheme != "" && path.length() > 0 && path.at(0) != '/') {
-
-        throw URISyntaxException(
-            __FILE__, __LINE__, path,
-            "URI::URI - Path string: %s starts with invalid char '/'" );
-    }
-
-    std::string uri = "";
-    if( scheme != "" ) {
-        uri.append( scheme );
-        uri.append( ":" );
-    }
-
-    if( userInfo != "" || host != "" || port != -1 ) {
-        uri.append( "//" );
-    }
-
-    if( userInfo != "" ) {
-        // QUOTE ILLEGAL CHARACTERS in userinfo
-        uri.append(quoteComponent( userInfo, someLegal ) );
-        uri.append( "@" );
-    }
-
-    if( host != "" ) {
-        std::string newHost = host;
-
-        // check for ipv6 addresses that hasn't been enclosed
-        // in square brackets
-        if( host.find( ":" ) != std::string::npos &&
-            host.find( "]" ) == std::string::npos &&
-            host.find( "[" ) == std::string::npos ) {
-
-            newHost = std::string( "[" ) + host + "]";
-        }
-
-        uri.append( newHost );
-    }
-
-    if( port != -1 ) {
-        uri.append( ":" );
-        uri.append( Integer::toString( port ) );
-    }
-
-    if( path != "" ) {
-        // QUOTE ILLEGAL CHARS
-        uri.append( quoteComponent( path, "/@" + someLegal ) );
-    }
-
-    if( query != "" ) {
-        uri.append( "?" );
-        // QUOTE ILLEGAL CHARS
-        uri.append( quoteComponent( query, allLegal ) );
-    }
-
-    if( fragment != "" ) {
-        // QUOTE ILLEGAL CHARS
-        uri.append( "#" );
-        uri.append( quoteComponent( fragment, allLegal ) );
-    }
-
-    this->parseURI( uri );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URI::URI( const std::string& scheme, const std::string& host,
-          const std::string& path, const std::string& fragment )
-            throw ( URISyntaxException ) {
-
-    this->uriString = NULL;
-
-    URI::URI( scheme, "", host, -1, path, "", fragment );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URI::URI( const std::string& scheme, const std::string& authority,
-          const std::string& path, const std::string& query,
-          const std::string& fragment ) throw ( URISyntaxException ) {
-
-    this->uriString = NULL;
-
-    if( scheme != "" && path.length() > 0 && path.at(0) != '/' ) {
-         throw URISyntaxException(
-            __FILE__, __LINE__, path,
-            "URI::URI - Path String %s must start with a '/'" );
-     }
-
-     std::string uri = "";
-     if( scheme != "" ) {
-         uri.append( scheme );
-         uri.append( ":" );
-     }
-     if( authority != "" ) {
-         uri.append("//");
-         // QUOTE ILLEGAL CHARS
-         uri.append( quoteComponent( authority, "@[]" + someLegal ) );
-     }
-
-     if( path != "" ) {
-         // QUOTE ILLEGAL CHARS
-         uri.append( quoteComponent( path, "/@" + someLegal ) );
-     }
-     if( query != "" ) {
-         // QUOTE ILLEGAL CHARS
-         uri.append( "?" );
-         uri.append( quoteComponent( query, allLegal ) );
-     }
-     if( fragment != "" ) {
-         // QUOTE ILLEGAL CHARS
-         uri.append( "#" );
-         uri.append( quoteComponent( fragment, allLegal ) );
-     }
-
-     this->parseURI( uri );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URI::parseURI( const std::string& uri ) throw ( URISyntaxException ) {
-
-    // Use APR to perform the main parse.
-    apr_status_t result = apr_uri_parse( pool.getAprPool(),
-        uri.c_str(), &this->uri );
-
-    if( result != APR_SUCCESS ) {
-        throw URISyntaxException(
-            __FILE__, __LINE__, uri,
-            "URI::praseURI - URI String %s invalid." );
-    }
-
-    std::cout << "\n";
-    std::cout << "Original URI String: " << uri << std::endl;
-    std::cout << "\n";
-    std::cout << "Scheme: "
-              << ( this->uri.scheme ? this->uri.scheme : "" ) << std::endl;
-    std::cout << "Host: "
-              << ( this->uri.hostinfo ? this->uri.hostinfo : "" ) << std::endl;
-    std::cout << "User: "
-              << ( this->uri.user ? this->uri.user : "" ) << std::endl;
-    std::cout << "Passwrod: "
-              << ( this->uri.password ? this->uri.password : "" ) << std::endl;
-    std::cout << "Host Name: "
-              << ( this->uri.hostname ? this->uri.hostname : "" ) << std::endl;
-    std::cout << "Port Str: "
-              << ( this->uri.port_str ? this->uri.port_str : "" ) << std::endl;
-    std::cout << "Path: "
-              << ( this->uri.path ? this->uri.path : "" ) << std::endl;
-    std::cout << "Query: "
-              << ( this->uri.query ? this->uri.query : "" ) << std::endl;
-    std::cout << "Fragment: "
-              << ( this->uri.fragment ? this->uri.fragment : "" ) << std::endl;
-    std::cout << "Port: " << this->uri.port << std::endl;
-    std::cout << "Is Initialized: " << this->uri.is_initialized << std::endl;
-    std::cout << "DNS Looked Up: " << this->uri.dns_looked_up << std::endl;
-    std::cout << "DNS Resolved: " << this->uri.dns_resolved << std::endl;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int URI::compareTo( const URI& value ) const {
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool URI::equals( const URI& value ) const {
-    return compareTo( value ) == 0 ? true : false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool URI::operator==( const URI& value ) const {
-    return compareTo( value ) == 0 ? true : false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool URI::operator<( const URI& value ) const {
-    return compareTo( value ) == -1 ? true : false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-URI URI::create( const std::string uri )
-    throw ( lang::exceptions::IllegalArgumentException ) {
-
-    try {
-        return URI( uri );
-    } catch( URISyntaxException& e ) {
-        throw IllegalArgumentException( e );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string URI::quoteComponent( const std::string& component,
-                                 const std::string& legalset ) {
-//    try {
-        /*
-         * Use a different encoder than URLEncoder since: 1. chars like "/",
-         * "#", "@" etc needs to be preserved instead of being encoded, 2.
-         * UTF-8 char set needs to be used for encoding instead of default
-         * platform one
-         */
-//        return URIEncoderDecoder.quoteIllegal(component, legalset);
-//    } catch( UnsupportedEncodingException e ) {
-//        throw RuntimeException( e );
-//    }
-}
diff --git a/src/decaf/src/main/decaf/net/URI.h b/src/decaf/src/main/decaf/net/URI.h
deleted file mode 100644
index cbc3114..0000000
--- a/src/decaf/src/main/decaf/net/URI.h
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URI_H_
-#define _DECAF_NET_URI_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-#include <decaf/net/URISyntaxException.h>
-#include <decaf/net/MalformedURLException.h>
-#include <decaf/net/URL.h>
-#include <string>
-#include <apr_uri.h>
-#include <decaf/internal/AprPool.h>
-
-namespace decaf{
-namespace net{
-
-    /**
-     * This class represents an instance of a URI as defined by RFC 2396.
-     */
-    class DECAF_API URI : public lang::Comparable<URI> {
-    private:
-
-        // Apr Data for parsing the uri.
-        apr_uri_t uri;
-        internal::AprPool pool;
-
-        // The original string entered from URI( string ), empty if not set.
-        const char* uriString;
-
-        static const std::string unreserved;
-        static const std::string punct;
-        static const std::string reserved;
-        static const std::string someLegal;
-        static const std::string allLegal;
-
-    public:
-
-        /**
-         * Constructs a URI from the given string
-         * @param uri - string uri to parse.
-         */
-        URI( const std::string& uri ) throw ( URISyntaxException );
-
-        /**
-         * Constructs a URI from the given components.
-         * @param scheme - the uri scheme
-         * @param ssp - Scheme specific part
-         * @param fragment - Fragment
-         */
-        URI( const std::string& scheme,
-             const std::string& ssp,
-             const std::string& fragment) throw ( URISyntaxException );
-
-        /**
-         * Constructs a URI from the given components.
-         * @param scheme - Scheme name
-         * @param userInfo - User name and authorization information
-         * @param host - Host name
-         * @param port - Port number
-         * @param path - Path
-         * @param query - Query
-         * @param fragment - Fragment
-         */
-        URI( const std::string& scheme, const std::string& userInfo,
-             const std::string& host, int port,
-             const std::string& path, const std::string& query,
-             const std::string& fragment ) throw ( URISyntaxException );
-
-        /**
-         * Constructs a URI from the given components.
-         * @param scheme - Scheme name
-         * @param host - Host name
-         * @param path - Path
-         * @param fragment - Fragment
-         */
-        URI( const std::string& scheme, const std::string& host,
-             const std::string& path, const std::string& fragment )
-                 throw ( URISyntaxException );
-
-        /**
-         * Constructs a URI from the given components.
-         * @param scheme - Scheme name
-         * @param authority - Authority
-         * @param path - Path
-         * @param query - Query
-         * @param fragment - Fragment
-         */
-        URI( const std::string& scheme, const std::string& authority,
-             const std::string& path, const std::string& query,
-             const std::string& fragment ) throw ( URISyntaxException);
-
-        virtual ~URI() {}
-
-        /**
-         * Compares this object with the specified object for order. Returns a
-         * negative integer, zero, or a positive integer as this object is less
-         * than, equal to, or greater than the specified object.
-         * @param value - the value to compare to this one.
-         * @returns zero if equal minus one if less than and one if greater than.
-         */
-        virtual int compareTo( const URI& value ) const;
-
-        /**
-         * @return true if this value is considered equal to the passed value.
-         */
-        virtual bool equals( const URI& value ) const;
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const URI& value ) const;
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const URI& value ) const;
-
-        /**
-         * @eturns the decoded authority component of this URI.
-         */
-        std::string getAuthority() const;
-
-        /**
-         * @returns the decoded fragment component of this URI.
-         */
-        std::string getFragment() const;
-
-        /**
-         * @returns the host component of this URI.
-         */
-        std::string getHost() const;
-
-        /**
-         * @returns the path component of this URI.
-         */
-        std::string getPath() const;
-
-        /**
-         * @returns the port component of this URI.
-         */
-        int getPort() const;
-
-        /**
-         * @returns the query component of this URI.
-         */
-        std::string getQuery() const;
-
-        /**
-         * @returns the scheme component of this URI
-         */
-        std::string getScheme() const;
-
-        /**
-         * @returns the user info component of this URI
-         */
-        std::string getUserInfo() const;
-
-        /**
-         * Returns the raw authority component of this URI.
-         *
-         * The authority component of a URI, if defined, only contains the
-         * commercial-at character ('@') and characters in the unreserved, punct,
-         * escaped, and other categories. If the authority is server-based then
-         * it is further constrained to have valid user-information, host, and
-         * port components.
-         * @returns the raw authority component of the URI
-         */
-        std::string getRawAuthority() const;
-
-        /**
-         * Returns the raw fragment component of this URI.
-         *
-         * The fragment component of a URI, if defined, only contains legal URI
-         * characters.
-         * @returns the raw fragment component of this URI
-         */
-        std::string getRawFragment() const;
-
-        /**
-         * Returns the raw path component of this URI.
-         *
-         * The path component of a URI, if defined, only contains the slash
-         * character ('/'), the commercial-at character ('@'), and characters
-         * in the unreserved, punct, escaped, and other categories.
-         * @returns the raw path component of this URI
-         */
-        std::string getRawPath() const;
-
-        /**
-         * Returns the raw query component of this URI.
-         * The query component of a URI, if defined, only contains legal URI characters.
-         * @returns the raw query component of the URI.
-         */
-        std::string getRawQuery() const;
-
-        /**
-         * Returns the raw scheme-specific part of this URI. The scheme-specific
-         * part is never undefined, though it may be empty.
-         * The scheme-specific part of a URI only contains legal URI characters.
-         * @returns the raw scheme special part of the uri
-         */
-        std::string getRawSchemeSpecificPart() const;
-
-        /**
-         * Returns the decoded scheme-specific part of this URI.
-         * The string returned by this method is equal to that returned by the
-         * getRawSchemeSpecificPart method except that all sequences of escaped
-         * octets are decoded.
-         * @returns the raw scheme specific part of the uri.
-         */
-        std::string getSchemeSpecificPart() const;
-
-        /**
-         * Returns the raw user-information component of this URI.
-         * The user-information component of a URI, if defined, only contains
-         * characters in the unreserved, punct, escaped, and other categories.
-         * @returns the raw user-information component of the URI
-         */
-        std::string getRawUserInfo() const;
-
-        /**
-         * Tells whether or not this URI is absolute.  A URI is absolute if,
-         * and only if, it has a scheme component.
-         * @returns true if, and only if, this URI is absolute
-         */
-        bool isAbsolute() const;
-
-        /**
-         * Tells whether or not this URI is opaque.  A URI is opaque if, and only
-         * if, it is absolute and its scheme-specific part does not begin with a
-         * slash character ('/'). An opaque URI has a scheme, a scheme-specific
-         * part, and possibly a fragment; all other components are undefined.
-         * @returns true if, and only if, this URI is opaque
-         */
-        bool isOpaque() const;
-
-        /**
-         * Normalizes this URI's path.  If this URI is opaque, or if its path is
-         * already in normal form, then this URI is returned. Otherwise a new URI
-         * is constructed that is identical to this URI except that its path is
-         * computed by normalizing this URI's path in a manner consistent with
-         * RFC 2396, section 5.2, step 6, sub-steps c through f; that is:
-         *
-         *  1. All "." segments are removed.
-         *  2. If a ".." segment is preceded by a non-".." segment then both of t
-         *     hese segments are removed. This step is repeated until it is no
-         *     longer applicable.
-         *  3. If the path is relative, and if its first segment contains a colon
-         *     character (':'), then a "." segment is prepended. This prevents a
-         *     relative URI with a path such as "a:b/c/d" from later being re-parsed
-         *     as an opaque URI with a scheme of "a" and a scheme-specific part of
-         *     "b/c/d". (Deviation from RFC 2396)
-         *
-         * A normalized path will begin with one or more ".." segments if there were
-         * insufficient non-".." segments preceding them to allow their removal. A
-         * normalized path will begin with a "." segment if one was inserted by step
-         * 3 above. Otherwise, a normalized path will not contain any "." or ".."
-         * segments.
-         * @returns A URI equivalent to this URI, but whose path is in normal form
-         */
-        URI normalize() const;
-
-        /**
-         * Attempts to parse this URI's authority component, if defined, into
-         * user-information, host, and port components.
-         *
-         * If this URI's authority component has already been recognized as being
-         * server-based then it will already have been parsed into user-information,
-         * host, and port components. In this case, or if this URI has no authority
-         * component, this method simply returns this URI.
-         *
-         * Otherwise this method attempts once more to parse the authority component
-         * into user-information, host, and port components, and throws an exception
-         * describing why the authority component could not be parsed in that way.
-         * @returns A URI whose authority field has been parsed as a server-based
-         * authority
-         * @throws URISyntaxException - If the authority component of this URI is
-         * defined but cannot be parsed as a server-based authority.
-         */
-        URI parseServerAuthority() const throw ( URISyntaxException );
-
-        /**
-         * Relativizes the given URI against this URI.  The relativization of the
-         * given URI against this URI is computed as follows:
-         *
-         *  1. If either this URI or the given URI are opaque, or if the scheme and
-         *     authority components of the two URIs are not identical, or if the path
-         *     of this URI is not a prefix of the path of the given URI, then the
-         *     given URI is returned.
-         *  2. Otherwise a new relative hierarchical URI is constructed with query
-         *     and fragment components taken from the given URI and with a path
-         *     component computed by removing this URI's path from the beginning of
-         *     the given URI's path.
-         *
-         * @param uri - The URI to be relativized against this URI
-         * @returns The resulting URI
-         */
-        URI relativize( const URI& uri ) const;
-
-        /**
-         * Constructs a new URI by parsing the given string and then resolving it
-         * against this URI.
-         *
-         * This convenience method works as if invoking it were equivalent to
-         * evaluating the expression resolve( URI::create( str ) ).
-         * @param str - The string to be parsed into a URI
-         * @returns The resulting URI
-         * @throws IllegalArgumentException - If the given string violates RFC 2396
-         */
-        URI resolve( const std::string& str )
-            throw ( lang::exceptions::IllegalArgumentException );
-
-        /**
-         * Resolves the given URI against this URI.
-         *
-         * If the given URI is already absolute, or if this URI is opaque, then a
-         * copy of the given URI is returned.
-         *
-         * If the given URI's fragment component is defined, its path component is
-         * empty, and its scheme, authority, and query components are undefined, then
-         * a URI with the given fragment but with all other components equal to those
-         * of this URI is returned. This allows a URI representing a standalone
-         * fragment reference, such as "#foo", to be usefully resolved against a base
-         * URI.
-         *
-         * Otherwise this method constructs a new hierarchical URI in a manner
-         * consistent with RFC 2396, section 5.2; that is:
-         *
-         *  1. A new URI is constructed with this URI's scheme and the given URI's
-         *     query and fragment components.
-         *  2. If the given URI has an authority component then the new URI's authority
-         *     and path are taken from the given URI.
-         *  3. Otherwise the new URI's authority component is copied from this URI,
-         *     and its path is computed as follows:
-         *
-         *     1. If the given URI's path is absolute then the new URI's path is
-         *        taken from the given URI.
-         *     2. Otherwise the given URI's path is relative, and so the new URI's
-         *        path is computed by resolving the path of the given URI against the
-         *        path of this URI. This is done by concatenating all but the last
-         *        segment of this URI's path, if any, with the given URI's path and
-         *        then normalizing the result as if by invoking the normalize method.
-         *
-         * The result of this method is absolute if, and only if, either this URI is
-         * absolute or the given URI is absolute.
-         * @param uri - The URI to be resolved against this URI
-         * @returns The resulting URI
-         */
-        URI resolve( const URI& uri );
-
-        /**
-         * Returns the content of this URI as a string.
-         *
-         * If this URI was created by invoking one of the constructors in this class
-         * then a string equivalent to the original input string, or to the string
-         * computed from the originally-given components, as appropriate, is returned.
-         * Otherwise this URI was created by normalization, resolution, or
-         * relativization, and so a string is constructed from this URI's components
-         * according to the rules specified in RFC 2396, section 5.2, step 7.
-         * @returns the string form of this URI
-         */
-        std::string toString() const;
-
-        /**
-         * Constructs a URL from this URI.
-         *
-         * This convenience method works as if invoking it were equivalent to
-         * evaluating the expression new URL(this.toString()) after first checking
-         * that this URI is absolute.
-         * @returns A URL constructed from this URI
-         * @throws IllegalArgumentException - If this URL is not absolute
-         * @throws MalformedURLException - If a protocol handler for the URL could not
-         * be found, or if some other error occurred while constructing the URL
-         */
-        URL toURL() const
-            throw ( MalformedURLException, lang::exceptions::IllegalArgumentException );
-
-    public:   // Static Methods
-
-        /**
-         * Creates a URI by parsing the given string.
-         * This convenience factory method works as if by invoking the URI(string)
-         * constructor; any URISyntaxException thrown by the constructor is caught
-         * and wrapped in a new IllegalArgumentException object, which is then thrown.
-         * @param uri - URI string to parse
-         * @throws IllegalArgumentException
-         */
-        static URI create( const std::string uri )
-            throw ( lang::exceptions::IllegalArgumentException );
-
-    private:
-
-        // Parses a URI string and fills in the member data, throws a
-        // URISyntaxException if things fail
-        void parseURI( const std::string& uri ) throw ( URISyntaxException );
-
-        /*
-         * Quote illegal chars for each component, but not the others
-         *
-         * @param component java.lang.String the component to be converted @param
-         * legalset java.lang.String the legal character set allowed in the
-         * component s @return java.lang.String the converted string
-         */
-        std::string quoteComponent( const std::string& component,
-                                    const std::string& legalset );
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_URI_H_*/
diff --git a/src/decaf/src/main/decaf/net/URISyntaxException.h b/src/decaf/src/main/decaf/net/URISyntaxException.h
deleted file mode 100644
index f50e9c6..0000000
--- a/src/decaf/src/main/decaf/net/URISyntaxException.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URISYNTAXEXCEPTION_H_
-#define _DECAF_NET_URISYNTAXEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API URISyntaxException : public lang::Exception {
-    private:
-
-        std::string reason;
-        std::string input;
-        int index;
-
-    public:
-
-        /**
-         * Default Constructor
-         */
-        URISyntaxException() throw() {
-            this->reason = "";
-            this->input = "";
-            this->index = -1;
-        }
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        URISyntaxException( const Exception& ex ) throw() : Exception() {
-
-            *(Exception*)this = ex;
-            this->reason = "";
-            this->input = "";
-            this->index = -1;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        URISyntaxException( const URISyntaxException& ex ) throw() : Exception() {
-
-            *(Exception*)this = ex;
-            this->reason = ex.getReason();
-            this->input = ex.getInput();
-            this->index = ex.getIndex();
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the input string that caused the error
-         * and the reason for the error.
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param input uri string
-         * @param reason string for the failure.
-         * @param list of primitives that are formatted into the message
-         */
-        URISyntaxException( const char* file, const int lineNumber,
-                            const std::string& input,
-                            const std::string& reason ) throw () : Exception() {
-
-            this->reason = reason;
-            this->input = input;
-            this->index = -1;
-
-            const char * message = "Input: %s, Reason it failed: %s";
-            this->setMessage( message, input.c_str(), reason.c_str() );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the input string that caused the error
-         * and the reason for the error.
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param input uri string
-         * @param reason string for the failure.
-         * @param index in the uri string where the error occured.
-         */
-        URISyntaxException( const char* file, const int lineNumber,
-                            const std::string& input,
-                            const std::string& reason,
-                            int index ) throw () : Exception() {
-
-            this->reason = reason;
-            this->input = input;
-            this->index = index;
-
-            const char * message = "Input: %s, Index %d resulted in this error: %s";
-            this->setMessage( message, input.c_str(), index, reason.c_str() );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual URISyntaxException* clone() const {
-            return new URISyntaxException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~URISyntaxException() throw() {}
-
-        /**
-         * @returns the Input string that cause this exception or ""
-         */
-        std::string getInput() const {
-            return input;
-        }
-
-        /**
-         * @returns the Reason given for this failure, or ""
-         */
-        std::string getReason() const {
-            return reason;
-        }
-
-        /**
-         * @returns the index in the input string where the error occured or -1
-         */
-        int getIndex() const {
-            return index;
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_URISYNTAXEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/URL.cpp b/src/decaf/src/main/decaf/net/URL.cpp
deleted file mode 100644
index f1595fe..0000000
--- a/src/decaf/src/main/decaf/net/URL.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URL.h"
-
-using namespace decaf;
-using namespace decaf::net;
-
-////////////////////////////////////////////////////////////////////////////////
-URL::URL() {
-}
diff --git a/src/decaf/src/main/decaf/net/URL.h b/src/decaf/src/main/decaf/net/URL.h
deleted file mode 100644
index fb4b0d9..0000000
--- a/src/decaf/src/main/decaf/net/URL.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URL_H_
-#define _DECAF_NET_URL_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API URL {
-    public:
-
-        URL();
-        virtual ~URL() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_URL_H_*/
diff --git a/src/decaf/src/main/decaf/net/URLDecoder.cpp b/src/decaf/src/main/decaf/net/URLDecoder.cpp
deleted file mode 100644
index edb0d8c..0000000
--- a/src/decaf/src/main/decaf/net/URLDecoder.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URLDecoder.h"
-
-using namespace decaf;
-using namespace decaf::net;
-
-////////////////////////////////////////////////////////////////////////////////
-URLDecoder::URLDecoder() {
-}
diff --git a/src/decaf/src/main/decaf/net/URLDecoder.h b/src/decaf/src/main/decaf/net/URLDecoder.h
deleted file mode 100644
index 5ef665e..0000000
--- a/src/decaf/src/main/decaf/net/URLDecoder.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URLDECODER_H_
-#define _DECAF_NET_URLDECODER_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API URLDecoder {
-    public:
-
-        URLDecoder();
-        virtual ~URLDecoder() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_URLDECODER_H_*/
diff --git a/src/decaf/src/main/decaf/net/URLEncoder.cpp b/src/decaf/src/main/decaf/net/URLEncoder.cpp
deleted file mode 100644
index 5bd0654..0000000
--- a/src/decaf/src/main/decaf/net/URLEncoder.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URLEncoder.h"
-
-using namespace decaf;
-using namespace decaf::net;
-
-////////////////////////////////////////////////////////////////////////////////
-URLEncoder::URLEncoder() {
-}
diff --git a/src/decaf/src/main/decaf/net/URLEncoder.h b/src/decaf/src/main/decaf/net/URLEncoder.h
deleted file mode 100644
index fa7e0b0..0000000
--- a/src/decaf/src/main/decaf/net/URLEncoder.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URLENCODER_H_
-#define _DECAF_NET_URLENCODER_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API URLEncoder {
-    public:
-
-        URLEncoder();
-        virtual ~URLEncoder() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_URLENCODER_H_*/
diff --git a/src/decaf/src/main/decaf/net/UnknownHostException.h b/src/decaf/src/main/decaf/net/UnknownHostException.h
deleted file mode 100644
index 40e9e23..0000000
--- a/src/decaf/src/main/decaf/net/UnknownHostException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_UNKNOWNHOSTEXCEPTION_H_
-#define _DECAF_NET_UNKNOWNHOSTEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API UnknownHostException : public io::IOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        UnknownHostException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        UnknownHostException( const Exception& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        UnknownHostException( const UnknownHostException& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        UnknownHostException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : io::IOException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual UnknownHostException* clone() const {
-            return new UnknownHostException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~UnknownHostException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_UNKNOWNHOSTEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/net/UnknownServiceException.h b/src/decaf/src/main/decaf/net/UnknownServiceException.h
deleted file mode 100644
index a97d0fe..0000000
--- a/src/decaf/src/main/decaf/net/UnknownServiceException.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_UNKNOWNSERVICEEXCEPTION_H_
-#define _DECAF_NET_UNKNOWNSERVICEEXCEPTION_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/io/IOException.h>
-
-namespace decaf{
-namespace net{
-
-    class DECAF_API UnknownServiceException : public io::IOException {
-    public:
-
-        /**
-         * Default Constructor
-         */
-        UnknownServiceException() throw() {}
-
-        /**
-         * Conversion Constructor from some other Exception
-         * @param An exception that should become this type of Exception
-         */
-        UnknownServiceException( const Exception& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Copy Constructor
-         */
-        UnknownServiceException( const UnknownServiceException& ex ) throw()
-        : io::IOException()
-        {
-            *(Exception*)this = ex;
-        }
-
-        /**
-         * Constructor - Initializes the file name and line number where
-         * this message occured.  Sets the message to report, using an
-         * optional list of arguments to parse into the message
-         * @param file name where exception occurs
-         * @param line number where the exception occurred.
-         * @param message to report
-         * @param list of primitives that are formatted into the message
-         */
-        UnknownServiceException( const char* file, const int lineNumber,
-                            const char* msg, ... ) throw ()
-        : io::IOException()
-        {
-            va_list vargs ;
-            va_start( vargs, msg );
-            buildMessage( msg, vargs );
-
-            // Set the first mark for this exception.
-            setMark( file, lineNumber );
-        }
-
-        /**
-         * Clones this exception.  This is useful for cases where you need
-         * to preserve the type of the original exception as well as the message.
-         * All subclasses should override.
-         */
-        virtual UnknownServiceException* clone() const {
-            return new UnknownServiceException( *this );
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~UnknownServiceException() throw() {}
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_UNKNOWNSERVICEEXCEPTION_H_*/
diff --git a/src/decaf/src/main/decaf/util/Collection.h b/src/decaf/src/main/decaf/util/Collection.h
deleted file mode 100644
index 7562a62..0000000
--- a/src/decaf/src/main/decaf/util/Collection.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_COLLECTION_H_
-#define _DECAF_UTIL_COLLECTION_H_
-
-#include <decaf/util/Config.h>
-#include <devaf/lang/exceptions/UnsupportedOperationException.h>
-#include <devaf/lang/exceptions/NullPointerException.h>
-#include <devaf/lang/exceptions/IllegalArgumentException.h>
-#include <decaf/util/Iterator.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * The root interface in the collection hierarchy. A collection represents
-     * a group of objects, known as its elements. Some collections allow
-     * duplicate elements and others do not. Some are ordered and others
-     * unordered. This interface is typically used to pass collections
-     * around and manipulate them where maximum generality is desired.
-     *
-     * All general-purpose Collection implementation classes (which typically
-     * implement Collection indirectly through one of its subinterfaces) should
-     * provide two "standard" constructors: a void (no arguments) constructor,
-     * which creates an empty collection, and a constructor with a single argument
-     * of type Collection, which creates a new collection with the same elements
-     * as its argument. In effect, the latter constructor allows the user to copy
-     * any collection, producing an equivalent collection of the desired
-     * implementation type. There is no way to enforce this convention
-     * (as interfaces cannot contain constructors) but all of the general-purpose
-     * Collection implementations in the Decaf platform libraries comply.
-     *
-     * The "destructive" methods contained in this interface, that is, the methods
-     * that modify the collection on which they operate, are specified to throw
-     * UnsupportedOperationException if this collection does not support the
-     * operation. If this is the case, these methods may, but are not required
-     * to, throw an UnsupportedOperationException if the invocation would have
-     * no effect on the collection. For example, invoking the addAll(Collection)
-     * method on an unmodifiable collection may, but is not required to, throw
-     * the exception if the collection to be added is empty.
-     *
-     * Many methods in Collections Framework interfaces are defined in terms of
-     * the equals method. For example, the specification for the
-     * contains(Object o) method says: "returns true if and only if this
-     * collection contains at least one element e such that
-     * (o==null ? e==null : o.equals(e))."
-     *
-     * @since 1.0
-     */
-    template< typename T >
-    class DECAF_API Collection
-    {
-    public:
-
-        virtual ~Collection() {}
-
-        /**
-         * Returns the number of elements in this collection. If this collection
-         * contains more than Integer.MAX_VALUE elements, returns Integer.MAX_VALUE.
-         * @returns the number of elements in this collection
-         */
-        virtual int size() = 0;
-
-        /**
-         * @returns true if this collection contains no elements.
-         */
-        virtual bool isEmpty() = 0;
-
-        /**
-         * Returns true if this collection contains the specified element. More
-         * formally, returns true if and only if this collection contains at
-         * least one element e such that (o==null ? e==null : o.equals(e)).
-         * @param value - value to check for presence in the collection
-         * @returns true if there is at least one of the elements in the collection
-         * @thorws NullPointerException
-         */
-        virtual bool contains( const E& value )
-            throw ( lang::exceptions::NullPointerException ) = 0;
-
-        /**
-         * Returns an iterator over the elements in this collection. There are
-         * no guarantees concerning the order in which the elements are
-         * returned (unless this collection is an instance of some class that
-         * provides a guarantee).
-         * @returns an Iterator over the elements in this collection
-         */
-        virtual Iterator<E>* iterator() = 0;
-
-        /**
-         * Returns an array containing all of the elements in this collection. If
-         * the collection makes any guarantees as to what order its elements are
-         * returned by its iterator, this method must return the elements in the
-         * same order.
-         *
-         * This method acts as bridge between array-based and collection-based APIs.
-         * @returns an array of the elements in this collection.
-         */
-        virtual std::vector<E> toArray() = 0;
-
-        /**
-         * Returns true if this collection changed as a result of the call.
-         * (Returns false if this collection does not permit duplicates and
-         * already contains the specified element.)
-         *
-         * Collections that support this operation may place limitations on
-         * what elements may be added to this collection. In particular,
-         * some collections will refuse to add null elements, and others
-         * will impose restrictions on the type of elements that may be
-         * added. Collection classes should clearly specify in their
-         * documentation any restrictions on what elements may be added.
-         *
-         * If a collection refuses to add a particular element for any
-         * reason other than that it already contains the element, it must
-         * throw an exception (rather than returning false). This preserves
-         * the invariant that a collection always contains the specified
-         * element after this call returns.
-         *
-         * For non-pointer values, i.e. class instances or string's the object
-         * will be copied into the collection, thus the object must support
-         * being copied, must not hide the copy constructor and assignment
-         * operator.
-         *
-         * @param value - reference to the element to add.
-         * @returns true if the element was added
-         * @throw UnsupportedOperationException
-         * @throw NullPointerException
-         * @throw IllegalArgumentException
-         */
-        virtual bool add( const E& value )
-            throw ( lang::exceptions::UnsupportedOperationException,
-                    lang::exceptions::NullPointerException,
-                    lang::exceptions::IllegalArgumentException ) = 0;
-
-        /**
-         * Removes a single instance of the specified element from the
-         * collection.  More formally, removes an element e such that
-         * (o==null ? e==null : o.equals(e)), if this collection contains one
-         * or more such elements. Returns true if this collection contained
-         * the specified element (or equivalently, if this collection changed
-         * as a result of the call).
-         * @param value - reference to the element to remove.
-         * @returns true if the collection was changed
-         * @throw UnsupportedOperationException
-         * @throw NullPointerException
-         */
-        virtual bool remove( const E& value )
-            throw ( lang::exceptions::UnsupportedOperationException,
-                    lang::exceptions::NullPointerException ) = 0;
-
-        /**
-         * Returns true if this collection contains all of the elements in
-         * the specified collection.
-         * @param source - Collection to compare to this one.
-         * @thorw Exception
-         */
-        virtual bool containsAll( const Collection<E>& source )
-            throw ( lang::Exception ) = 0;
-
-        /**
-         * Adds all of the elements in the specified collection to this
-         * collection. The behavior of this operation is undefined if the
-         * specified collection is modified while the operation is in progress.
-         * (This implies that the behavior of this call is undefined if the
-         * specified collection is this collection, and this collection is
-         * nonempty.)
-         * @param source - Collection whose elements are added to this one.
-         * @return true if this collection changed as a result of the call
-         * @throw UnsupportedOperationException
-         * @throw NullPointerException
-         * @throw IllegalArgumentException
-         */
-        virtual bool addAll( const Collection<E>& source )
-            throw ( lang::exceptions::UnsupportedOperationException,
-                    lang::exceptions::NullPointerException,
-                    lang::exceptions::IllegalArgumentException ) = 0;
-
-        /**
-         * Removes all this collection's elements that are also contained in
-         * the specified collection (optional operation). After this call returns,
-         * this collection will contain no elements in common with the specified
-         * collection.
-         * @param value - The Collection whose elements are to be removed
-         * @returns true if the collection changed as a result of this call
-         * @throw UnsupportedOperationException
-         * @throw NullPointerException
-         * @throw IllegalArgumentException
-         */
-        virtual bool removeAll( const Collection<E>& value )
-            throw ( lang::exceptions::UnsupportedOperationException,
-                    lang::exceptions::NullPointerException,
-                    lang::exceptions::IllegalArgumentException ) = 0;
-
-        /**
-         * Retains only the elements in this collection that are contained in the
-         * specified collection (optional operation). In other words, removes from
-         * this collection all of its elements that are not contained in the
-         * specified collection.
-         * @param value - The Collection whose elements are to be retained
-         * @returns true if the collection changed as a result of this call
-         * @throw UnsupportedOperationException
-         * @throw NullPointerException
-         * @throw IllegalArgumentException
-         */
-        virtual bool retainAll( const Collection<E> value )
-            throw ( lang::exceptions::UnsupportedOperationException,
-                    lang::exceptions::NullPointerException,
-                    lang::exceptions::IllegalArgumentException ) = 0;
-
-        /**
-         * Removes all of the elements from this collection (optional operation).
-         * This collection will be empty after this method returns unless it throws
-         * an exception.
-         * @throw UnsupportedOperationException
-         */
-        virtual void clear()
-            throw ( lang::exceptions::UnsupportedOperationException ) = 0;
-
-        /**
-         * Compares the passed collection to this one, if they contain the
-         * same elements, i.e. all their elements are equivalent, then it
-         * returns true.
-         * @returns true if the Collections contain the same elements.
-         */
-        virtual bool equals( const Collection<E>& value ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_COLLECTION_H_*/
diff --git a/src/decaf/src/main/decaf/util/Comparator.h b/src/decaf/src/main/decaf/util/Comparator.h
deleted file mode 100644
index 3701966..0000000
--- a/src/decaf/src/main/decaf/util/Comparator.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_COMPARATOR_H_
-#define _DECAF_UTIL_COMPARATOR_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * A comparison function, which imposes a total ordering on some collection
-     * of objects. Comparators can be passed to a sort method (such as
-     * Collections.sort) to allow precise control over the sort order. Comparators
-     * can also be used to control the order of certain data structures.
-     *
-     * The ordering imposed by a Comparator c on a set of elements S is said to
-     * be consistent with equals if and only if
-     * ( compare( e1, e2) == 0 ) has the same boolean value as ( e1 == e2 ) for
-     * every e1 and e2 in S.
-     */
-    template<typename T>
-    class DECAF_API Comparator
-    {
-    public:
-
-        virtual ~Comparator() {}
-
-        /**
-         * Compares its two arguments for order. Returns a negative integer, zero,
-         * or a positive integer as the first argument is less than, equal to, or
-         * greater than the second.
-         *
-         * The implementor must ensure that
-         * sgn( compare(x, y)) == -sgn(compare(y, x) ) for all x and y.
-         * (This implies that compare(x, y) must throw an exception if and only
-         * if compare(y, x) throws an exception.)
-         *
-         * The implementor must also ensure that the relation is transitive:
-         * ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0.
-         *
-         * Finally, the implementer must ensure that compare(x, y)==0 implies
-         * that sgn(compare(x, z))==sgn(compare(y, z)) for all z.
-         *
-         * It is generally the case, but not strictly required that
-         * (compare(x, y)==0) == ( x == y) ). Generally speaking, any comparator
-         * that violates this condition should clearly indicate this fact. The
-         * recommended language is "Note: this comparator imposes orderings that
-         * are inconsistent with equals."
-         * @param o1 - the first object to be compared
-         * @param o2 - the second object to be compared
-         * @returns a negative integer, zero, or a positive integer as the first
-         * argument is less than, equal to, or greater than the second.
-         */
-        virtual int compare( const E& o1, const E& o2 ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_COMPARATOR_H_*/
diff --git a/src/decaf/src/main/decaf/util/Config.cpp b/src/decaf/src/main/decaf/util/Config.cpp
deleted file mode 100644
index 191aa53..0000000
--- a/src/decaf/src/main/decaf/util/Config.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/util/Config.h>
-
-_APR_LIBRARY _APR_LIBRARY::self;
diff --git a/src/decaf/src/main/decaf/util/Config.h b/src/decaf/src/main/decaf/util/Config.h
deleted file mode 100644
index 7ca005a..0000000
--- a/src/decaf/src/main/decaf/util/Config.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_CONFIG_H_
-#define _DECAF_UTIL_CONFIG_H_
-
-#ifdef DECAF_DLL
-#ifdef DECAF_EXPORTS
-#define DECAF_API __declspec(dllexport)
-#else
-#define DECAF_API __declspec(dllimport)
-#endif
-#else
-#define DECAF_API
-#endif
-
-//
-// The purpose of this header is to try to detect the supported headers
-// of the platform when the ./configure script is not being used to generate
-// the config.h file.
-//
-#if defined(HAVE_CONFIG_H)
-
-    // config.h is generated by the ./configure script and it only
-    // used by unix like systems (including cygwin)
-    #include <config.h>
-
-#else /* !defined(HAVE_CONFIG_H) */
-
-    // Not using ./configure script and make system.. chances are your using the native build tools
-    // of Windows or OS X to do this build
-
-    #if defined(_WIN32)
-        #ifndef HAVE_OBJBASE_H
-            #define HAVE_OBJBASE_H
-        #endif
-        #ifndef HAVE_RPCDCE_H
-            #define HAVE_RPCDCE_H
-        #endif
-        #ifndef HAVE_WINSOCK2_H
-            #define HAVE_WINSOCK2_H
-        #endif
-        #ifndef HAVE_STRUCT_ADDRINFO
-            #define HAVE_STRUCT_ADDRINFO
-        #endif
-        #ifndef HAVE_SYS_TIMEB_H
-            #define HAVE_SYS_TIMEB_H
-        #endif
-        #ifndef HAVE_FTIME
-            #define HAVE_FTIME
-        #endif
-        #ifndef HAVE_WINDOWS_H
-            #define HAVE_WINDOWS_H
-        #endif
-    #else
-        #ifndef HAVE_UUID_UUID_H
-            #define HAVE_UUID_UUID_H
-        #endif
-        #ifndef HAVE_UUID_T
-            #define HAVE_UUID_T
-        #endif
-        #ifndef HAVE_PTHREAD_H
-            #define HAVE_PTHREAD_H
-        #endif
-    #endif
-
-#endif /* !defined(HAVE_CONFIG_H) */
-
-// Macro to mark attributes as unused
-#ifdef __GNUC__
-   #define DECAF_UNUSED __attribute__ ((__unused__))
-#else
-   #define DECAF_UNUSED
-#endif
-
-
-// Define a class to hanlde APR initialization and termination, then declare a global
-// static instance that will cause the library to only be initialized once.
-#include <apr.h>
-#include <apr_general.h>
-#include <apr_pools.h>
-
-class _APR_LIBRARY {
-public:
-
-    _APR_LIBRARY() {
-        apr_initialize();
-    }
-
-    ~_APR_LIBRARY() {
-        apr_terminate();
-    }
-
-private:
-
-    static _APR_LIBRARY self;
-
-};
-
-#endif /*_DECAF_UTIL_CONFIG_H_*/
diff --git a/src/decaf/src/main/decaf/util/Date.cpp b/src/decaf/src/main/decaf/util/Date.cpp
deleted file mode 100644
index 9eb6ea9..0000000
--- a/src/decaf/src/main/decaf/util/Date.cpp
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/util/Date.h>
-#include <decaf/util/Config.h>
-#include <decaf/lang/exceptions/UnsupportedOperationException.h>
-
-#include <apr_time.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-long long Date::getCurrentTimeMilliseconds(){
-    return apr_time_now() / 1000;
-}
diff --git a/src/decaf/src/main/decaf/util/Date.h b/src/decaf/src/main/decaf/util/Date.h
deleted file mode 100644
index 54c8f4e..0000000
--- a/src/decaf/src/main/decaf/util/Date.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_DATE_H_
-#define _DECAF_UTIL_DATE_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * Wrapper class around a time value in milliseconds.  This
-     * class is comparable to Java's java.util.Date class.
-     */
-    class DECAF_API Date
-    {
-    private:
-
-        /**
-         * The underlying time value in milliseconds�
-         */
-        long long time;
-
-    public:
-
-        /**
-         * Default constructor - sets time to now.
-         */
-        Date(){
-            time = getCurrentTimeMilliseconds();
-        }
-
-        /**
-         * Constructs the date with a given time value.
-         * @param milliseconds The time in milliseconds;
-         */
-        Date( long long milliseconds ){
-            this->time = milliseconds;
-        }
-
-        /**
-         * Copy constructor.
-         */
-        Date( const Date& source ){
-            (*this) = source;
-        }
-
-        virtual ~Date(){}
-
-        /**
-         * Gets the underlying time.
-         * @return The underlying time value in milliseconds.
-         */
-        long long getTime() const{
-            return time;
-        }
-
-        /**
-         * Sets the underlying time.
-         * @param milliseconds The underlying time value in
-         * milliseconds.
-         */
-        void setTime( long long milliseconds ){
-            this->time = milliseconds;
-        }
-
-        /**
-         * Determines wether or not this date falls after the
-         * specified time.
-         * @param when The date to compare
-         * @return true if this date falls after when.
-         */
-        bool after( Date& when ) const{
-            return time > when.time;
-        }
-
-        /**
-         * Determines wether or not this date falls before the
-         * specified time.
-         * @param when The date to compare
-         * @return true if this date falls before when.
-         */
-        bool before( Date& when ) const{
-            return time < when.time;
-        }
-
-        /**
-         * Determines wether or not this date is equal to the
-         * specified time.
-         * @param when The date to compare
-         * @return true if this date is equal to when.
-         */
-        bool equals( Date& when ) const{
-            return time == when.time;
-        }
-
-        /**
-         * Assignment operator.
-         */
-        Date& operator =( const Date& source ){
-            this->time = source.time;
-            return *this;
-        }
-
-        /**
-         * Returns the current time in milliseconds.  Comparable
-         * to Java's System.currentTimeMillis method.
-         * @return The current time in milliseconds.
-         */
-        static long long getCurrentTimeMilliseconds();
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_DATE_H_*/
diff --git a/src/decaf/src/main/decaf/util/Iterator.h b/src/decaf/src/main/decaf/util/Iterator.h
deleted file mode 100644
index 3409697..0000000
--- a/src/decaf/src/main/decaf/util/Iterator.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_ITERATOR_H_
-#define _DECAF_UTIL_ITERATOR_H_
-
-#include <decaf/lang/exceptions/NoSuchElementException.h>
-#include <decaf/lang/exceptions/IllegalStateException.h>
-#include <decaf/lang/exceptions/UnsupportedOperationException.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * Defines an object that can be used to iterate over the elements of a
-     * collection.  The iterator provides a way to access and remove elements
-     * with well defined semantics.
-     */
-    template< typename T>
-    class DECAF_API Iterator {
-    public:
-
-        virtual ~Iterator() {}
-
-        /**
-         * Returns the next element in the iteration. Calling this method
-         * repeatedly until the hasNext() method returns false will return
-         * each element in the underlying collection exactly once.
-         * @returns next element in the iteration of elements
-         * @throws NoSuchElementException - iteration has no more elements.
-         */
-        virtual T next() throw( lang::exceptions::NoSuchElementException ) = 0;
-
-        /**
-         * Returns true if the iteration has more elements.  Returns false if
-         * the next call to next would result in an NoSuchElementException to
-         * be thrown.
-         */
-        virtual bool hasNext() const = 0;
-
-        /**
-         * Removes from the underlying collection the last element returned
-         * by the iterator (optional operation). This method can be called
-         * only once per call to next. The behavior of an iterator is
-         * unspecified if the underlying collection is modified while the
-         * iteration is in progress in any way other than by calling this
-         * method.
-         * @throws UnsupportedOperationException - if the remove  operation
-         *         is not supported by this Iterator.
-         * @throws IllegalStateException - if the next method has not yet been
-         *         called, or the remove method has already been called after
-         *         the last call to the next  method.
-         */
-        virtual void remove() throw ( lang::exceptions::IllegalStateException,
-                                      lang::exceptions::UnsupportedOperationException ) = 0;
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_ITERATOR_H_*/
diff --git a/src/decaf/src/main/decaf/util/Map.h b/src/decaf/src/main/decaf/util/Map.h
deleted file mode 100644
index 7575d4c..0000000
--- a/src/decaf/src/main/decaf/util/Map.h
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_MAP_H_
-#define _DECAF_UTIL_MAP_H_
-
-#include <map>
-#include <vector>
-#include <decaf/lang/exceptions/NoSuchElementException.h>
-#include <decaf/util/concurrent/Synchronizable.h>
-#include <decaf/util/concurrent/Mutex.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * Map template that wraps around a std::map to provide
-     * a more user-friendly interface and to provide common
-     * functions that do not exist in std::map.
-     */
-    template <typename K, typename V> class DECAF_API Map : public concurrent::Synchronizable
-    {
-    private:
-
-        std::map<K,V> valueMap;
-        concurrent::Mutex mutex;
-
-    public:
-
-        /**
-         * Default constructor - does nothing.
-         */
-        Map() {}
-
-        /**
-         * Copy constructor - copies the content of the given map into this
-         * one.
-         * @param source The source map.
-         */
-        Map( const Map& source ) : concurrent::Synchronizable() {
-            copy( source );
-        }
-
-        virtual ~Map() {}
-
-        /**
-         * Comparison, equality is dependant on the method of determining
-         * if the element are equal.
-         * @param source - Map to compare to this one.
-         * @returns true if the Map passed is equal in value to this one.
-         */
-        virtual bool equals( const Map& source ) const {
-            return this->valueMap == source.valueMap;
-        }
-
-        /**
-         * Copies the content of the source map into this map.  Erases
-         * all existing data in this map.
-         * @param source The source object to copy from.
-         */
-        virtual void copy( const Map& source ) {
-
-            // Erase the content of this object, and copy from the source
-            // all the elements.  We access source's private map since we
-            // are also a Map, this saves us a lot of time.
-            valueMap.clear();
-            valueMap.insert( source.valueMap.begin(), source.valueMap.end() );
-        }
-
-        /**
-         * Removes all keys and values from this map.
-         */
-        virtual void clear() {
-            valueMap.clear();
-        }
-
-        /**
-         * Indicates whether or this map contains a value for the
-         * given key.
-         * @param key The key to look up.
-         * @return true if this map contains the value, otherwise false.
-         */
-        virtual bool containsKey( const K& key ) const {
-            typename std::map<K,V>::const_iterator iter;
-            iter = valueMap.find(key);
-            return iter != valueMap.end();
-        }
-
-        /**
-         * Indicates whether or this map contains a value for the
-         * given value, i.e. they are equal, this is done by operator==
-         * so the types must pass equivalence testing in this manner.
-         * @param value The Value to look up.
-         * @return true if this map contains the value, otherwise false.
-         */
-        virtual bool containsValue( const V& value ) const {
-
-            if( valueMap.empty() ){
-                return false;
-            }
-
-            typename std::map<K,V>::const_iterator iter = valueMap.begin();
-            for( ; iter != valueMap.end(); ++iter ){
-                if( (*iter).second == value ) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        /**
-         * @return if the Map contains any element or not, TRUE or FALSE
-         */
-        virtual bool isEmpty() const {
-            return valueMap.empty();
-        }
-
-        /**
-         * @return The number of elements (key/value pairs) in this map.
-         */
-        virtual std::size_t size() const {
-            return valueMap.size();
-        }
-
-        /**
-         * Gets the value for the specified key.
-         * @param key The search key.
-         * @return The value for the given key.
-         * @throws activemq::exceptions::NoSuchElementException
-         */
-        virtual V getValue( const K& key ) const
-            throw( lang::exceptions::NoSuchElementException ) {
-
-            typename std::map<K,V>::const_iterator iter;
-            iter = valueMap.find(key);
-            if( iter == valueMap.end() ){
-                throw lang::exceptions::NoSuchElementException( __FILE__,
-                    __LINE__,
-                    "Key does not exist in map" );
-            }
-
-            return iter->second;
-        }
-
-        /**
-         * Sets the value for the specified key.
-         * @param key The target key.
-         * @param value The value to be set.
-         */
-        virtual void setValue( const K& key, V value ) {
-            valueMap[key] = value;
-        }
-
-        /**
-         * Removes the value (key/value pair) for the specified key from
-         * the map.
-         * @param key The search key.
-         */
-        virtual void remove( const K& key ) {
-            valueMap.erase( key );
-        }
-
-        /**
-         * @return the entire set of keys in this map as a std::vector.
-         */
-        virtual std::vector<K> getKeys() const{
-            std::vector<K> keys( valueMap.size() );
-
-            typename std::map<K,V>::const_iterator iter;
-            iter=valueMap.begin();
-            for( int ix=0; iter != valueMap.end(); ++iter, ++ix ){
-                keys[ix] = iter->first;
-            }
-
-            return keys;
-        }
-
-        /**
-         * @return the entire set of values in this map as a std::vector.
-         */
-        virtual std::vector<V> getValues() const {
-            std::vector<V> values( valueMap.size() );
-
-            typename std::map<K,V>::const_iterator iter;
-            iter=valueMap.begin();
-            for( int ix=0; iter != valueMap.end(); ++iter, ++ix ){
-                values[ix] = iter->second;
-            }
-
-            return values;
-        }
-
-    public:     // Methods from Synchronizable
-
-        /**
-         * Locks the object.
-         * @throws ActiveMQException
-         */
-        virtual void lock() throw( lang::Exception ) {
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws ActiveMQException
-         */
-        virtual void unlock() throw( lang::Exception ) {
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws ActiveMQException
-         */
-        virtual void wait() throw( lang::Exception ) {
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in millisecsonds to wait, or
-         * WAIT_INIFINITE
-         * @throws ActiveMQException
-         */
-        virtual void wait( unsigned long millisecs )
-            throw( lang::Exception ) {
-            mutex.wait(millisecs);
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws ActiveMQException
-         */
-        virtual void notify() throw( lang::Exception ) {
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws ActiveMQException
-         */
-        virtual void notifyAll() throw( lang::Exception ) {
-            mutex.notifyAll();
-        }
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_MAP_H_*/
diff --git a/src/decaf/src/main/decaf/util/Properties.h b/src/decaf/src/main/decaf/util/Properties.h
deleted file mode 100644
index 0993aef..0000000
--- a/src/decaf/src/main/decaf/util/Properties.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_PROPERTIES_H_
-#define _DECAF_UTIL_PROPERTIES_H_
-
-#include <map>
-#include <vector>
-#include <string>
-#include <sstream>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * Java-like properties class for mapping string names to string values.
-     */
-    class DECAF_API Properties{
-    private:
-
-        std::map< std::string, std::string > properties;
-
-    public:
-
-        virtual ~Properties(){}
-
-        /**
-         * Returns true if the properties object is empty
-         * @return true if empty
-         */
-        virtual bool isEmpty() const {
-            return properties.empty();
-        }
-
-        /**
-         * Looks up the value for the given property.
-         * @param name The name of the property to be looked up.
-         * @return the value of the property with the given name, if it
-         * exists.  If it does not exist, returns NULL.
-         */
-        virtual const char* getProperty( const std::string& name ) const{
-
-            std::map< std::string, std::string >::const_iterator iter =
-            properties.find( name );
-            if( iter == properties.end() ){
-                return NULL;
-            }
-
-            return iter->second.c_str();
-        }
-
-        /**
-         * Looks up the value for the given property.
-         * @param name the name of the property to be looked up.
-         * @param defaultValue The value to be returned if the given
-         * property does not exist.
-         * @return The value of the property specified by <code>name</code>, if it
-         * exists, otherwise the <code>defaultValue</code>.
-         */
-        virtual std::string getProperty( const std::string& name,
-                                         const std::string& defaultValue ) const {
-
-            std::map< std::string, std::string >::const_iterator iter =
-            properties.find( name );
-            if( iter == properties.end() ){
-                return defaultValue;
-            }
-
-            return iter->second;
-        }
-
-        /**
-         * Sets the value for a given property.  If the property already
-         * exists, overwrites the value.
-         * @param name The name of the value to be written.
-         * @param value The value to be written.
-         */
-        virtual void setProperty( const std::string& name,
-                                  const std::string& value ){
-            properties[name] = value;
-            //properties.insert( std::make_pair( name, value ) );
-        }
-
-        /**
-         * Check to see if the Property exists in the set
-         * @param name - property name to check for in this properties set.
-         * @return true if property exists, false otherwise.
-         */
-        virtual bool hasProperty( const std::string& name ) const
-        {
-            if(properties.find(name) != properties.end())
-            {
-                return true;
-            }
-
-            return false;
-        }
-
-        /**
-         * Removes the property with the given name.
-         * @param name the name of the property to remove.
-         */
-        virtual void remove( const std::string& name ){
-            properties.erase( name );
-        }
-
-        /**
-         * Method that serializes the contents of the property map to
-         * an arryay.
-         * @return list of pairs where the first is the name and the second
-         * is the value.
-         */
-        virtual std::vector< std::pair< std::string, std::string > > toArray() const{
-
-            // Create a vector big enough to hold all the elements in the map.
-            std::vector< std::pair<std::string, std::string> > vec(
-                    properties.begin(), properties.end() );
-
-            return vec;
-        }
-
-        /**
-         * Copies the contents of the given properties object to this one.
-         * @param source The source properties object.
-         */
-        virtual void copy( const Properties* source ){
-
-            clear();
-            this->properties = source->properties;
-        }
-
-        /**
-         * Clones this object.
-         * @returns a replica of this object.
-         */
-        virtual Properties* clone() const{
-
-            Properties* props = new Properties();
-
-            props->properties = properties;
-
-            return props;
-        }
-
-        /**
-         * Clears all properties from the map.
-         */
-        virtual void clear(){
-            properties.clear();
-        }
-
-        /**
-         * Formats the contents of the Properties Object into a string
-         * that can be logged, etc.
-         * @returns string value of this object.
-         */
-        virtual std::string toString() const {
-
-            std::ostringstream stream;
-            std::map< std::string, std::string >::const_iterator iter;
-
-            stream << "Begin Class activemq::util::Properties:" << std::endl;
-
-            for( iter = properties.begin(); iter != properties.end(); ++iter ){
-                stream << " properties[" << iter->first << "] = "
-                       << iter->second << std::endl;
-            }
-
-            stream << "End Class activemq::util::Properties:" << std::endl;
-
-            return stream.str();
-        }
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_PROPERTIES_H_*/
diff --git a/src/decaf/src/main/decaf/util/Queue.h b/src/decaf/src/main/decaf/util/Queue.h
deleted file mode 100644
index 294cf74..0000000
--- a/src/decaf/src/main/decaf/util/Queue.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_QUEUE_H_
-#define _DECAF_UTIL_QUEUE_H_
-
-#include <list>
-#include <vector>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * The Queue class accepts messages with an psuh(m) command
-     * where m is the message to be queued.  It destructively
-     * returns the message with pop().  pop() returns messages in
-     * the order they were enqueued.
-     *
-     * Queue is implemented with an instance of the STL queue object.
-     * The interface is essentially the same as that of the STL queue
-     * except that the pop method actually reaturns a reference to the
-     * element popped.  This frees the app from having to call the
-     * <code>front</code> method before calling pop.
-     *
-     *  Queue<string> sq;     // make a queue to hold string messages
-     *  sq.push(s);           // enqueues a message m
-     *  string s = sq.pop();  // dequeues a message
-     *
-     * = DESIGN CONSIDERATIONS
-     *
-     * The Queue class inherits from the Synchronizable interface and
-     * provides methods for locking and unlocking this queue as well as
-     * waiting on this queue.  In a multi-threaded app this can allow
-     * for multiple threads to be reading from and writing to the same
-     * Queue.
-     *
-     * Clients should consider that in a multiple threaded app it is
-     * possible that items could be placed on the queue faster than
-     * you are taking them off, so protection should be placed in your
-     * polling loop to ensure that you don't get stuck there.
-     */
-
-    template <typename T> class DECAF_API Queue : public concurrent::Synchronizable {
-    public:
-
-        Queue() {}
-        virtual ~Queue() {}
-
-        /**
-         * Empties this queue.
-         */
-        void clear() {
-            queue.clear();
-        }
-
-        /**
-         * Returns a Reference to the element at the head of the queue
-         * @return reference to a queue type object or (safe)
-         */
-        T& front() {
-            if( queue.empty() ) {
-                return safe;
-            }
-
-            return queue.front();
-        }
-
-        /**
-         * Returns a Reference to the element at the head of the queue
-         * @return reference to a queue type object or (safe)
-         */
-        const T& front() const {
-            if( queue.empty() ) {
-                return safe;
-            }
-
-            return queue.front();
-        }
-
-        /**
-         * Returns a Reference to the element at the tail of the queue
-         * @return reference to a queue type object or (safe)
-         */
-        T& back() {
-            if( queue.empty() ) {
-                return safe;
-            }
-
-            return queue.back();
-        }
-
-        /**
-         * Returns a Reference to the element at the tail of the queue
-         * @return reference to a queue type object or (safe)
-         */
-        const T& back() const {
-            if( queue.empty() ) {
-                return safe;
-            }
-
-            return queue.back();
-        }
-
-        /**
-         * Places a new Object at the Tail of the queue
-         * @param t - Queue Object Type reference.
-         */
-        void push( const T &t ) {
-            queue.push_back( t );
-        }
-
-        /**
-         * Places a new Object at the front of the queue
-         * @param t - Queue Object Type reference.
-         */
-        void enqueueFront( const T &t ) {
-            queue.push_front( t );
-        }
-
-        /**
-         * Removes and returns the element that is at the Head of the queue
-         * @return reference to a queue type object or (safe)
-         */
-        T pop() {
-            if( queue.empty() ) {
-                return safe;
-            }
-
-            // Pop the element into a temp, since we need to remain locked.
-            // this means getting front and then popping.
-            T temp = queue.front();
-            queue.pop_front();
-
-            return temp;
-        }
-
-        /**
-         * Gets the Number of elements currently in the Queue
-         * @return Queue Size
-         */
-        size_t size() const{
-            return queue.size();
-        }
-
-        /**
-         * Checks if this Queue is currently empty
-         * @return boolean indicating queue emptiness
-         */
-        bool empty() const {
-            return queue.empty();
-        }
-
-        /**
-         * @return the all values in this queue as a std::vector.
-         */
-        virtual std::vector<T> toArray() const {
-            std::vector<T> valueArray( queue.begin(), queue.end() );
-            return valueArray;
-        }
-
-        /**
-         * Reverses the order of the contents of this queue and stores them
-         * in the target queue.
-         * @param target - The target queue that will receive the contents of
-         * this queue in reverse order.
-         */
-        void reverse( Queue<T>& target ) const {
-            target.queue.insert( target.queue.end(), queue.rbegin(), queue.rend() );
-        }
-
-        /**
-         * Locks the object.
-         */
-        virtual void lock() throw( lang::Exception ){
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         */
-        virtual void unlock() throw( lang::Exception ){
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         */
-        virtual void wait() throw( lang::Exception ){
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs time to wait, or WAIT_INIFINITE
-         * @throws ActiveMQException
-         */
-        virtual void wait( unsigned long millisecs )
-            throw( lang::Exception ) {
-
-            mutex.wait(millisecs);
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         */
-        virtual void notify() throw( lang::Exception ){
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         */
-        virtual void notifyAll() throw( lang::Exception ){
-            mutex.notifyAll();
-        }
-
-    public:   // Statics
-
-        /**
-         * Fetch a reference to the safe value this object will return
-         * when there is nothing to fetch from the queue.
-         * @return Reference to this Queues safe object
-         */
-        static const T& getSafeValue() { return safe; }
-
-    private:
-
-        // The real queue
-        std::list<T> queue;
-
-        // Object used for sync
-        util::concurrent::Mutex mutex;
-
-        // Safe value used when pop, front or back are
-        // called and the queue is empty.
-        static T safe;
-
-    };
-
-    //-----{ Static Init }----------------------------------------------------//
-    template <typename T> T Queue<T>::safe;
-
-}}
-
-#endif /*_DECAF_UTIL_QUEUE_H_*/
diff --git a/src/decaf/src/main/decaf/util/Random.cpp b/src/decaf/src/main/decaf/util/Random.cpp
deleted file mode 100644
index 0df6574..0000000
--- a/src/decaf/src/main/decaf/util/Random.cpp
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Random.h"
-
-#include <decaf/util/Date.h>
-
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-unsigned long long Random::multiplier = 0x5deece66dLL;
-
-////////////////////////////////////////////////////////////////////////////////
-Random::Random() {
-    setSeed(Date::getCurrentTimeMilliseconds());
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Random::Random( unsigned long long seed ) {
-    setSeed(seed);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Random::nextBoolean() {
-    return next(1) != 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Random::nextBytes( std::vector<unsigned char>& buf ) {
-    int rand = 0;
-    std::size_t count = 0, loop = 0;
-    while (count < buf.size()) {
-        if (loop == 0) {
-            rand = nextInt();
-            loop = 3;
-        } else {
-            loop--;
-        }
-        buf[count++] = (unsigned char) rand;
-        rand >>= 8;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Random::nextDouble() {
-    // was: return ((((long long) next(26) << 27) + next(27)) / (double) (1L << 53));
-    long long divisor = 1LL;
-    divisor <<= 31;
-    divisor <<= 22;
-    return ((((long long) next(26) << 27) + next(27)) / (double) divisor);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Random::nextFloat() {
-    return (next(24) / 16777216.0f);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Random::nextGaussian() {
-    if (haveNextNextGaussian) {
-        // if X1 has been returned, return the second Gaussian
-        haveNextNextGaussian = false;
-        return nextNextGaussian;
-    }
-
-    double v1, v2, s;
-    do {
-        // Generates two independent random variables U1, U2
-        v1 = 2 * nextDouble() - 1;
-        v2 = 2 * nextDouble() - 1;
-        s = v1 * v1 + v2 * v2;
-    } while (s >= 1);
-    double norm = std::sqrt(-2 * std::log(s) / s);
-    // should that not be norm instead of multiplier ?
-    nextNextGaussian = v2 * norm;
-    haveNextNextGaussian = true;
-    // should that not be norm instead of multiplier ?
-    return v1 * norm;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Random::nextInt() {
-    return next(32);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Random::nextInt( int n ) throw( exceptions::IllegalArgumentException ) {
-    if (n > 0) {
-        if ((n & -n) == n) {
-            return (int) ((n * (long long) next(31)) >> 31);
-        }
-        int bits, val;
-        do {
-            bits = next(31);
-            val = bits % n;
-        } while (bits - val + (n - 1) < 0);
-        return val;
-    }
-    throw exceptions::IllegalArgumentException();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long Random::nextLong() {
-    return ((long long) next(32) << 32) + next(32);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Random::setSeed( unsigned long long seed ) {
-    // was this->seed = (seed ^ multiplier) & ((1L << 48) - 1);
-    unsigned long long mask = 1ULL;
-    mask <<= 31;
-    mask <<= 17;
-    this->seed = (seed ^ multiplier) & (mask - 1);
-    haveNextNextGaussian = false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int Random::next( int bits ) {
-    // was: seed = (seed * multiplier + 0xbL) & ((1L << 48) - 1);
-    long long mask = 1L;
-    mask <<= 31;
-    mask <<= 17;
-    seed = (seed * multiplier + 0xbL) & (mask - 1);
-    // was: return (int) (seed >>> (48 - bits));
-    return (int) (seed >> (48 - bits));
-}
diff --git a/src/decaf/src/main/decaf/util/Random.h b/src/decaf/src/main/decaf/util/Random.h
deleted file mode 100644
index 0ea456b..0000000
--- a/src/decaf/src/main/decaf/util/Random.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_RANDOM_H_
-#define _DECAF_UTIL_RANDOM_H_
-
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-#include <decaf/util/Config.h>
-#include <vector>
-#include <cmath>
-
-namespace decaf{
-namespace util{
-
-    class DECAF_API Random
-    {
-    public:
-
-        /**
-         * Construct a random generator with the current time of day in
-         * milliseconds as the initial state.
-         *
-         * @see #setSeed
-         */
-        Random();
-
-        /**
-         * Construct a random generator with the given <code>seed</code>
-         * as the initial state.
-         *
-         * @param seed the seed that will determine the initial state of
-         * this random number generator
-         *
-         * @see #setSeed
-         */
-        Random( unsigned long long seed );
-
-        /**
-         * Answers the next pseudo-random, uniformly distributed boolean
-         * value generated by this generator.
-         *
-         * @return boolean a pseudo-random, uniformly distributed boolean
-         * value
-         */
-        bool nextBoolean();
-
-        /**
-         * Modifies the byte array by a random sequence of bytes generated
-         * by this random number generator.
-         *
-         * @param buf non-null array to contain the new random bytes
-         *
-         * @see #next
-         */
-        void nextBytes( std::vector<unsigned char>& buf );
-
-        /**
-         * Generates a normally distributed random double number between
-         * 0.0 inclusively and 1.0 exclusively.
-         *
-         * @return double
-         *
-         * @see #nextFloat
-         */
-        double nextDouble();
-
-        /**
-         * Generates a normally distributed random float number between
-         * 0.0 inclusively and 1.0 exclusively.
-         *
-         * @return float a random float number between 0.0 and 1.0
-         *
-         * @see #nextDouble
-         */
-        float nextFloat();
-
-        /**
-         * Pseudo-randomly generates (approximately) a normally
-         * distributed <code>double</code> value with mean 0.0 and a
-         * standard deviation value of <code>1.0</code> using the <i>polar
-         * method<i> of G. E. P. Box, M.  E. Muller, and G. Marsaglia, as
-         * described by Donald E. Knuth in <i>The Art of Computer
-         * Programming, Volume 2: Seminumerical Algorithms</i>, section
-         * 3.4.1, subsection C, algorithm P
-         *
-         * @return double
-         *
-         * @see #nextDouble
-         */
-        double nextGaussian();
-
-        /**
-         * Generates a uniformly distributed 32-bit <code>int</code> value
-         * from the this random number sequence.
-         *
-         * @return int uniformly distributed <code>int</code> value
-         *
-         * @see #next
-         * @see #nextLong
-         */
-        int nextInt();
-
-        /**
-         * Returns to the caller a new pseudo-random integer value which
-         * is uniformly distributed between 0 (inclusively) and the value
-         * of <code>n</code> (exclusively).
-         *
-         * @return int
-         * @param n int
-         *
-         * @throws IllegalArgumentException
-         */
-        int nextInt( int n ) throw( lang::exceptions::IllegalArgumentException );
-
-        /**
-         * Generates a uniformly distributed 64-bit <code>int</code> value
-         * from the this random number sequence.
-         *
-         * @return 64-bit <code>int</code> random number
-         *
-         * @see #next
-         * @see #nextInt()
-         * @see #nextInt(int)
-         */
-        long long nextLong();
-
-        /**
-         * Modifies the seed using linear congruential formula presented
-         * in <i>The Art of Computer Programming, Volume 2</i>, Section
-         * 3.2.1.
-         *
-         * @param seed the seed that alters the state of the random number
-         * generator
-         *
-         * @see #next
-         * @see #Random()
-         * @see #Random(long)
-         */
-        void setSeed( unsigned long long seed );
-
-    protected:
-
-        /**
-         * Answers a pseudo-random uniformly distributed <code>int</code>
-         * value of the number of bits specified by the argument
-         * <code>bits</code> as described by Donald E. Knuth in <i>The Art
-         * of Computer Programming, Volume 2: Seminumerical
-         * Algorithms</i>, section 3.2.1.
-         *
-         * @return int a pseudo-random generated int number
-         * @param bits number of bits of the returned value
-         *
-         * @see #nextBytes
-         * @see #nextDouble
-         * @see #nextFloat
-         * @see #nextInt()
-         * @see #nextInt(int)
-         * @see #nextGaussian
-         * @see #nextLong
-         */
-        int next( int bits );
-
-    private:
-
-        static unsigned long long multiplier;
-
-        /**
-         * The boolean value indicating if the second Gaussian number is available.
-         */
-        bool haveNextNextGaussian;
-
-        /**
-         * It is associated with the internal state of this generator.
-         */
-        unsigned long long seed;
-
-        /**
-         * The second Gaussian generated number.
-         */
-        double nextNextGaussian;
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_RANDOM_H_*/
diff --git a/src/decaf/src/main/decaf/util/Set.h b/src/decaf/src/main/decaf/util/Set.h
deleted file mode 100644
index a6ae16a..0000000
--- a/src/decaf/src/main/decaf/util/Set.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_SET_H_
-#define _DECAF_UTIL_SET_H_
-
-#include <set>
-#include <vector>
-#include <decaf/lang/exceptions/NoSuchElementException.h>
-#include <decaf/util/concurrent/Synchronizable.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Iterator.h>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * Map template that wraps around a std::map to provide
-     * a more user-friendly interface and to provide common
-     * functions that do not exist in std::map.
-     */
-    template <typename E> class DECAF_API Set : public util::concurrent::Synchronizable
-    {
-    private:
-
-        std::set<E> values;
-        util::concurrent::Mutex mutex;
-
-    private:
-
-        class SetIterator : public Iterator<E> {
-        private:
-
-            typename std::set<E>::iterator current;
-            typename std::set<E>::iterator previous;
-            typename std::set<E>* set;
-
-        public:
-
-            SetIterator( typename std::set<E>* set ) {
-                this->current = set->begin();
-                this->previous = set->end();
-                this->set = set;
-            }
-            virtual ~SetIterator() {}
-
-            virtual E next() throw( lang::exceptions::NoSuchElementException ){
-                if( this->current == set->end() ) {
-                    throw lang::exceptions::NoSuchElementException(
-                        __FILE__, __LINE__,
-                        "Set::Iterator::next - No more elements to return" );
-                }
-
-                this->previous = this->current;
-                return *( this->current++ );
-            }
-
-            virtual bool hasNext() const {
-                return ( this->current != set->end() );
-            }
-
-            virtual void remove() throw ( lang::exceptions::IllegalStateException,
-                                          lang::exceptions::UnsupportedOperationException ){
-                if( this->previous == set->end() ) {
-                    throw lang::exceptions::IllegalStateException(
-                        __FILE__, __LINE__,
-                        "Set::Iterator::remove - Invalid State to call remove" );
-                }
-
-                this->set->erase( this->previous );
-                this->previous = this->set->end();
-            }
-        };
-
-    public:
-
-        /**
-         * Default constructor - does nothing.
-         */
-        Set(){}
-
-        /**
-         * Copy constructor - copies the content of the given set into this
-         * one.
-         * @param source The source set.
-         */
-        Set( const Set& source ){
-            copy( source );
-        }
-
-        virtual ~Set(){}
-
-        /**
-         * Returns an iterator for this collection.  The order of Iteration
-         * is in no particular order other than the natural ording of the
-         * elements in the Set class.
-         * @returns Iterator<E> for this collection
-         */
-        Iterator<E>* iterator() {
-            return new SetIterator( &values );
-        }
-
-        /**
-         * Copies the content of the source set into this set.  Erases
-         * all existing data in this st.
-         * @param source The source object to copy from.
-         */
-        virtual void copy( const Set& source ) {
-            // Add all of the entries to this map.
-            values = source.values;
-        }
-
-        /**
-         * Removes all values from this set.
-         */
-        virtual void clear() {
-            values.clear();
-        }
-
-        /**
-         * Indicates whether or this set contains the given value.
-         * @param value The value to look up.
-         * @return true if this set contains the value, otherwise false.
-         */
-        virtual bool contains( const E& value ) const {
-            typename std::set<E>::const_iterator iter;
-            iter = values.find( value );
-            return iter != values.end();
-        }
-
-        /**
-         * @return if the set contains any element or not, TRUE or FALSE
-         */
-        virtual bool isEmpty() const {
-            return values.empty();
-        }
-
-        /**
-         * @return The number of elements in this set.
-         */
-        virtual std::size_t size() const {
-            return values.size();
-        }
-
-        /**
-         * Adds the given value to the set.
-         * @param value The value to add.
-         */
-        virtual void add( const E& value ) {
-            values.insert( value );
-        }
-
-        /**
-         * Removes the value from the set.
-         * @param value The value to be removed.
-         */
-        virtual void remove( const E& value ) {
-            values.erase( value );
-        }
-
-        /**
-         * @return the all values in this set as a std::vector.
-         */
-        virtual std::vector<E> toArray() const {
-            std::vector<E> valueArray( values.size() );
-
-            typename std::set<E>::const_iterator iter;
-            iter=values.begin();
-            for( int ix=0; iter != values.end(); ++iter, ++ix ){
-                valueArray[ix] = *iter;
-            }
-
-            return valueArray;
-        }
-
-    public:     // Methods from Synchronizable
-
-        /**
-         * Locks the object.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ) {
-            mutex.lock();
-        }
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ) {
-            mutex.unlock();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ) {
-            mutex.wait();
-        }
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in millisecsonds to wait, or
-         * WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait( unsigned long millisecs )
-            throw( lang::Exception ) {
-            mutex.wait( millisecs );
-        }
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw(  lang::Exception  ) {
-            mutex.notify();
-        }
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw(  lang::Exception  ) {
-            mutex.notifyAll();
-        }
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_SET_H_*/
diff --git a/src/decaf/src/main/decaf/util/StringTokenizer.cpp b/src/decaf/src/main/decaf/util/StringTokenizer.cpp
deleted file mode 100644
index a65834a..0000000
--- a/src/decaf/src/main/decaf/util/StringTokenizer.cpp
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "StringTokenizer.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-StringTokenizer::StringTokenizer( const std::string& str,
-                                  const std::string& delim,
-                                  bool returnDelims ) {
-    // store off the data
-    this->str = str;
-    this->delim = delim;
-    this->returnDelims = returnDelims;
-
-    // Start and the beginning
-    pos = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-StringTokenizer::~StringTokenizer(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int StringTokenizer::countTokens() const
-{
-    int count = 0;
-    string::size_type localPos = pos;
-    string::size_type lastPos = pos;
-
-    while( localPos != string::npos ) {
-
-        if( returnDelims && str.find_first_of( delim, localPos ) == localPos ) {
-            count += 1;
-            localPos += 1;
-            continue;
-        }
-
-        // Find first token by spanning the fist non-delimiter, to the
-        // next delimiter, skipping any delimiters that are at the curret
-        // location.
-        lastPos = str.find_first_not_of( delim, localPos );
-        localPos = str.find_first_of( delim, lastPos );
-
-        if( lastPos != string::npos ) {
-            count++;
-        }
-    }
-
-    return count;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool StringTokenizer::hasMoreTokens() const
-{
-    string::size_type nextpos =
-        returnDelims ? str.find_first_of( delim, pos ) :
-                       str.find_first_not_of( delim, pos );
-
-    return ( nextpos != string::npos );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string StringTokenizer::nextToken()
-   throw ( lang::exceptions::NoSuchElementException )
-{
-    if( pos == string::npos ) {
-        throw NoSuchElementException(
-            __FILE__, __LINE__,
-            "StringTokenizer::nextToken - No more Tokens available");
-    }
-
-    if( returnDelims ) {
-        // if char at current pos is a delim return it and advance pos
-        if( str.find_first_of( delim, pos ) == pos ) {
-            return str.substr( pos++, 1 );
-        }
-    }
-
-    // Skip delimiters at beginning.
-    string::size_type lastPos = str.find_first_not_of( delim, pos );
-
-    // Find the next delimiter in the string, the charactors in between
-    // will be the token to return.  If this returns string::npos then
-    // there are no more delimiters in the string.
-    pos = str.find_first_of( delim, lastPos );
-
-    if( string::npos != lastPos ) {
-        // Found a token, count it, if the pos of the next delim is npos
-        // then we set length to copy to npos so that all the remianing
-        // portion of the string is copied, otherwise we set it to the
-        return str.substr( lastPos,
-                           pos == string::npos ? pos : pos-lastPos );
-    } else {
-        throw NoSuchElementException(
-            __FILE__, __LINE__,
-            "StringTokenizer::nextToken - No more Tokens available" );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string StringTokenizer::nextToken( const std::string& delim )
-    throw ( lang::exceptions::NoSuchElementException ) {
-
-    this->delim = delim;
-    return nextToken();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned int StringTokenizer::toArray( std::vector<std::string>& array )
-{
-    int count = 0;
-
-    while( hasMoreTokens() ) {
-        array.push_back( nextToken() );
-        count++;
-    }
-
-    return count;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void StringTokenizer::reset( const std::string& str,
-                             const std::string& delim,
-                             bool returnDelims )
-{
-    if( str != "" ) {
-        this->str = str;
-    }
-
-    if( delim != "" ) {
-        this->delim = delim;
-    }
-
-    this->returnDelims = returnDelims;
-
-    // Begin at the Beginning
-    this->pos = 0;
-}
diff --git a/src/decaf/src/main/decaf/util/StringTokenizer.h b/src/decaf/src/main/decaf/util/StringTokenizer.h
deleted file mode 100644
index 7ae75b2..0000000
--- a/src/decaf/src/main/decaf/util/StringTokenizer.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_STRINGTOKENIZER_H_
-#define _DECAF_UTIL_STRINGTOKENIZER_H_
-
-#include <decaf/lang/exceptions/NoSuchElementException.h>
-#include <decaf/util/Config.h>
-#include <string>
-
-namespace decaf{
-namespace util{
-
-    class DECAF_API StringTokenizer
-    {
-    private:
-
-        // String to tokenize
-        std::string str;
-
-        // The delimiter string
-        std::string delim;
-
-        // The current pos in the string
-        std::string::size_type pos;
-
-        // Are we returning delimiters
-        bool returnDelims;
-
-    public:
-
-        /**
-         * Constructs a string tokenizer for the specified string. All
-         * characters in the delim argument are the delimiters for separating
-         * tokens.
-         *
-         * If the returnDelims flag is true, then the delimiter characters are
-         * also returned as tokens. Each delimiter is returned as a string of
-         * length one. If the flag is false, the delimiter characters are
-         * skipped and only serve as separators between tokens.
-         *
-         * Note that if delim is "", this constructor does not throw an
-         * exception. However, trying to invoke other methods on the resulting
-         * StringTokenizer may result in an Exception.
-         * @param string to tokenize
-         * @param String containing the delimiters
-         * @param boolean indicating if the delimiters are returned as tokens
-         */
-        StringTokenizer( const std::string& str,
-                         const std::string& delim = " \t\n\r\f",
-                         bool returnDelims = false);
-
-        virtual ~StringTokenizer();
-
-        /**
-         * Calculates the number of times that this tokenizer's nextToken
-         * method can be called before it generates an exception. The current
-         * position is not advanced.
-         * @return Count of remaining tokens
-         */
-        virtual int countTokens() const;
-
-        /**
-         * Tests if there are more tokens available from this tokenizer's
-         * string.
-         * @return true if there are more tokens remaining
-         */
-        virtual bool hasMoreTokens() const;
-
-        /**
-         * Returns the next token from this string tokenizer.
-         * @return string value of next token
-         * @thorws NoSuchElementException
-         */
-        virtual std::string nextToken()
-            throw ( lang::exceptions::NoSuchElementException );
-
-        /**
-         * Returns the next token in this string tokenizer's string. First,
-         * the set of characters considered to be delimiters by this
-         * StringTokenizer object is changed to be the characters in the
-         * string delim. Then the next token in the string after the current
-         * position is returned. The current position is advanced beyond the
-         * recognized token. The new delimiter set remains the default after
-         * this call.
-         * @param string containing the new set of delimiters
-         * @return next string in the token list
-         * @throw NoSuchElementException
-         */
-        virtual std::string nextToken( const std::string& delim )
-            throw ( lang::exceptions::NoSuchElementException );
-
-        /**
-         * Grab all remaining tokens in the String and return them
-         * in the vector that is passed in by reference.
-         * @param vector to place token strings in
-         * @return number of string placed into the vector
-         */
-        virtual unsigned int toArray( std::vector< std::string >& array );
-
-        /**
-         * Resets the Tokenizer's position in the String to the Beginning
-         * calls to countToken and nextToken now start back at the beginning.
-         * This allows this object to be reused, the caller need not create
-         * a new instance every time a String needs tokenizing.
-         * If set the string param will reset the string that this Tokenizer
-         * is working on.  If set to "" no change is made.
-         * If set the delim param will reset the string that this Tokenizer
-         * is using to tokenizer the string.  If set to "", no change is made
-         * If set the return Delims will set if this Tokenizer will return
-         * delimiters as tokens. Defaults to false.
-         * @param New String to tokenize or "", defaults to ""
-         * @param New Delimiter String to use or "", defaults to ""
-         * @param Should the Tokenizer return delimiters as Tokens, default false
-         */
-        virtual void reset( const std::string& str = "",
-                            const std::string& delim = "",
-                            bool returnDelims = false );
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_STRINGTOKENIZER_H_*/
diff --git a/src/decaf/src/main/decaf/util/UUID.cpp b/src/decaf/src/main/decaf/util/UUID.cpp
deleted file mode 100644
index e460910..0000000
--- a/src/decaf/src/main/decaf/util/UUID.cpp
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "UUID.h"
-#include <apr_strings.h>
-#include <apr_md5.h>
-#include <decaf/lang/exceptions/RuntimeException.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-UUID::UUID( long long mostSigBits, long long leastSigBits ) {
-
-    memcpy( &apr_uuid.data[0], &mostSigBits, sizeof( long long ) );
-    memcpy( &apr_uuid.data[sizeof(long long)], &leastSigBits, sizeof(long long ) );
-
-    this->mostSigBits = mostSigBits;
-    this->leastSigBits = leastSigBits;
-
-    // Version indicator, set when a UUID is generated
-    this->uuidVersion = (int)( mostSigBits & 0x000000000000F000LL ) >> 12;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-UUID::~UUID() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int UUID::compareTo( const UUID& value ) const {
-    return apr_strnatcmp( (const char*)this->apr_uuid.data,
-                          (const char*)value.apr_uuid.data );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool UUID::equals( const UUID& value ) const {
-    return apr_strnatcmp( (const char*)this->apr_uuid.data,
-                          (const char*)value.apr_uuid.data ) == 0 ? true : false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool UUID::operator==( const UUID& value ) const {
-    return this->equals( value );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool UUID::operator<( const UUID& value ) const {
-    return this->compareTo( value ) == -1 ? true : false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-std::string UUID::toString() const {
-    char buffer[APR_UUID_FORMATTED_LENGTH+1] = {0};
-    apr_uuid_format( &buffer[0], &apr_uuid );
-    return &buffer[0];
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long UUID::getLeastSignificantBits() const {
-    return this->leastSigBits;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long UUID::getMostSignificantBits() const {
-    long long result = 0;
-    memcpy( &result, &this->apr_uuid.data[sizeof(long long)], sizeof(long long) );
-    return this->mostSigBits;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long UUID::node() throw ( lang::exceptions::UnsupportedOperationException ) {
-
-    if( this->version() != 1 ) {
-        throw exceptions::UnsupportedOperationException(
-            __FILE__, __LINE__,
-            "UUID::node - Only a Version 1 UUID supports this operation." );
-    }
-
-    return ( this->leastSigBits & 0x0000FFFFFFFFFFFFULL );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long UUID::timestamp() throw ( lang::exceptions::UnsupportedOperationException ) {
-
-    if( this->version() != 1 ) {
-        throw exceptions::UnsupportedOperationException(
-            __FILE__, __LINE__,
-            "UUID::node - Only a Version 1 UUID supports this operation." );
-    }
-
-    // Mask out the version and shift values around to make time.
-    long long timeLow  = ( mostSigBits & 0xFFFFFFFF00000000ULL) >> 32;
-    long long timeMid  = ( mostSigBits & 0x00000000FFFF0000ULL) << 16;
-    long long timeHigh = ( mostSigBits & 0x0000000000000FFFULL) << 48;
-
-    return timeLow | timeMid | timeHigh;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int UUID::clockSequence() throw ( lang::exceptions::UnsupportedOperationException ) {
-
-    if( this->version() != 1 ) {
-        throw exceptions::UnsupportedOperationException(
-            __FILE__, __LINE__,
-            "UUID::node - Only a Version 1 UUID supports this operation." );
-    }
-
-    return (int)( ( this->leastSigBits & 0x3FFF000000000000ULL ) >> 48 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int UUID::variant() throw ( lang::exceptions::UnsupportedOperationException ) {
-
-    // determine variant field
-    if( ( this->leastSigBits & 0x8000000000000000ULL ) == 0 ) {
-        // MSB0 not set, NCS backwards compatibility variant
-        return 0;
-    } else if( ( this->leastSigBits & 0x4000000000000000ULL ) != 0 ) {
-        // MSB1 set, either MS reserved or future reserved
-        return (int)( ( this->leastSigBits & 0xE000000000000000ULL ) >> 61 );
-    }
-
-    // MSB1 not set, RFC 4122 variant
-    return 2;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int UUID::version() throw ( lang::exceptions::UnsupportedOperationException ) {
-    return this->uuidVersion;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-UUID UUID::randomUUID() {
-
-    apr_uuid_t temp;
-    // Generate some random bytes.
-    apr_uuid_get( &temp );
-
-    long long msb = 0;
-    long long lsb = 0;
-
-    msb = (temp.data[0] & 0xFFLL) << 56;
-    msb |= (temp.data[1] & 0xFFLL) << 48;
-    msb |= (temp.data[2] & 0xFFLL) << 40;
-    msb |= (temp.data[3] & 0xFFLL) << 32;
-    msb |= (temp.data[4] & 0xFFLL) << 24;
-    msb |= (temp.data[5] & 0xFFLL) << 16;
-    msb |= (temp.data[6] & 0x0FLL) << 8;
-    msb |= (0x4LL << 12); // set the version to 4
-    msb |= (temp.data[7] & 0xFFLL);
-
-    lsb = (temp.data[8] & 0x3FLL) << 56;
-    lsb |= (0x2LL << 62); // set the variant to bits 01
-    lsb |= (temp.data[9] & 0xFFLL) << 48;
-    lsb |= (temp.data[10] & 0xFFLL) << 40;
-    lsb |= (temp.data[11] & 0xFFLL) << 32;
-    lsb |= (temp.data[12] & 0xFFLL) << 24;
-    lsb |= (temp.data[13] & 0xFFLL) << 16;
-    lsb |= (temp.data[14] & 0xFFLL) << 8;
-    lsb |= (temp.data[15] & 0xFFLL);
-
-    return UUID( msb, lsb );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-UUID UUID::nameUUIDFromBytes( const std::vector<char>& name ) {
-    return UUID::nameUUIDFromBytes( &name[0], name.size() );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-UUID UUID::nameUUIDFromBytes( const char* name, std::size_t size ) {
-
-    apr_uuid_t temp;
-
-    if( apr_md5( &temp.data[0], name, size ) != APR_SUCCESS ) {
-        throw exceptions::RuntimeException(
-            __FILE__, __LINE__,
-            "UUID::nameUUIDFromBytes - Failed to run MD5 encoder." );
-    }
-
-    long long msb = 0;
-    long long lsb = 0;
-
-    msb = (temp.data[0] & 0xFFLL) << 56;
-    msb |= (temp.data[1] & 0xFFLL) << 48;
-    msb |= (temp.data[2] & 0xFFLL) << 40;
-    msb |= (temp.data[3] & 0xFFLL) << 32;
-    msb |= (temp.data[4] & 0xFFLL) << 24;
-    msb |= (temp.data[5] & 0xFFLL) << 16;
-    msb |= (temp.data[6] & 0x0FLL) << 8;
-    msb |= (0x3LL << 12); // set the version to 3
-    msb |= (temp.data[7] & 0xFFLL);
-
-    lsb = (temp.data[8] & 0x3FLL) << 56;
-    lsb |= (0x2LL << 62); // set the variant to bits 01
-    lsb |= (temp.data[9] & 0xFFLL) << 48;
-    lsb |= (temp.data[10] & 0xFFLL) << 40;
-    lsb |= (temp.data[11] & 0xFFLL) << 32;
-    lsb |= (temp.data[12] & 0xFFLL) << 24;
-    lsb |= (temp.data[13] & 0xFFLL) << 16;
-    lsb |= (temp.data[14] & 0xFFLL) << 8;
-    lsb |= (temp.data[15] & 0xFFLL);
-
-    return UUID( msb, lsb );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-UUID UUID::fromString( const std::string& name )
-    throw ( lang::exceptions::IllegalArgumentException ){
-
-    apr_uuid_t temp;
-
-    if( apr_uuid_parse( &temp, name.c_str() ) != APR_SUCCESS ) {
-        throw lang::exceptions::IllegalArgumentException(
-            __FILE__, __LINE__,
-            "UUID::fromString - Invalid UUID String: ",
-            name.c_str() );
-    }
-
-    long long mostSigBits = 0;
-    long long leastSigBits = 0;
-
-    // Extract to data from the uuid data
-    memcpy( &mostSigBits, &temp.data[0], sizeof(long long) );
-    memcpy( &leastSigBits, &temp.data[sizeof(long long)], sizeof(long long) );
-
-    return UUID( mostSigBits, leastSigBits );
-}
diff --git a/src/decaf/src/main/decaf/util/UUID.h b/src/decaf/src/main/decaf/util/UUID.h
deleted file mode 100644
index 753c137..0000000
--- a/src/decaf/src/main/decaf/util/UUID.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_UUID_H_
-#define _DECAF_UTIL_UUID_H_
-
-#include <decaf/util/Config.h>
-#include <decaf/lang/Comparable.h>
-#include <decaf/lang/exceptions/UnsupportedOperationException.h>
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-#include <apr_uuid.h>
-#include <string>
-
-namespace decaf{
-namespace util{
-
-    /**
-     * A class that represents an immutable universally unique identifier (UUID).
-     * A UUID represents a 128-bit value.
-     *
-     * There exist different variants of these global identifiers. The methods of
-     * this class are for manipulating the Leach-Salz variant, although the
-     * constructors allow the creation of any variant of UUID (described below).
-     *
-     * The layout of a variant 2 (Leach-Salz) UUID is as follows: The most
-     * significant long consists of the following unsigned fields:
-     *
-     *  0xFFFFFFFF00000000 time_low
-     *  0x00000000FFFF0000 time_mid
-     *  0x000000000000F000 version
-     *  0x0000000000000FFF time_hi
-     *
-     * The least significant long consists of the following unsigned fields:
-     *
-     *  0xC000000000000000 variant
-     *  0x3FFF000000000000 clock_seq
-     *  0x0000FFFFFFFFFFFF node
-     *
-     * The variant field contains a value which identifies the layout of the UUID.
-     * The bit layout described above is valid only for a UUID with a variant value
-     * of 2, which indicates the Leach-Salz variant.
-     *
-     * The version field holds a value that describes the type of this UUID. There
-     * are four different basic types of UUIDs: time-based, DCE security, name-based,
-     * and randomly generated UUIDs. These types have a version value of 1, 2, 3 and
-     * 4, respectively.
-     *
-     * For more information including algorithms used to create UUIDs, see the
-     * Internet-Draft UUIDs and GUIDs or the standards body definition at
-     * ISO/IEC 11578:1996.
-     */
-    class UUID : public lang::Comparable<UUID> {
-    private:
-
-        // APR Uuid Type
-        apr_uuid_t apr_uuid;
-
-        // Copy of the High part of the data
-        unsigned long long mostSigBits;
-
-        // Copy of the Low part of the data
-        unsigned long long leastSigBits;
-
-        // Version indicator, set when a UUID is generated
-        int uuidVersion;
-
-    public:
-
-        /**
-         * Static factory to retrieve a type 4 (pseudo randomly generated) UUID.
-         * The UUID is generated using a cryptographically strong pseudo random
-         * number generator.
-         * @return type 4 UUID
-         */
-        static UUID randomUUID();
-
-        /**
-         * Static factory to retrieve a type 3 (name based) UUID based on the
-         * specified byte array.
-         * @param name - a byte array to be used to construct a UUID.
-         * @return type 3 UUID
-         */
-        static UUID nameUUIDFromBytes( const std::vector<char>& name );
-
-        /**
-         * Static factory to retrieve a type 3 (name based) UUID based on the
-         * specified byte array.
-         * @param name - a byte array to be used to construct a UUID.
-         * @param size - the size of the byte array, or number of bytes to use.
-         * @return type 3 UUID
-         */
-        static UUID nameUUIDFromBytes( const char* name, std::size_t size );
-
-        /**
-         * Creates a UUID from the string standard representation as described
-         * in the toString() method.
-         * @param name - a string to be used to construct a UUID.
-         * @return type 3 UUID
-         */
-        static UUID fromString( const std::string& name )
-            throw ( lang::exceptions::IllegalArgumentException );
-
-    public:
-
-        /**
-         * Constructs a new UUID using the specified data. mostSigBits is used
-         * for the most significant 64 bits of the UUID and leastSigBits becomes
-         * the least significant 64 bits of the UUID.
-         * @param mostSigBits
-         * @param leastSigBits
-         */
-        UUID( long long mostSigBits, long long leastSigBits );
-
-        virtual ~UUID();
-
-        /**
-         * Compare the given UUID to this one
-         * @param value - the UUID to compare to
-         */
-        virtual int compareTo( const UUID& value ) const;
-
-        /**
-         * Compares this UUID to the one given, returns true if they are
-         * equal
-         * @param value - the UUID to compare to.
-         * @return true if UUIDs are the same.
-         */
-        virtual bool equals( const UUID& value ) const;
-
-        /**
-         * Compares equality between this object and the one passed.
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator==( const UUID& value ) const;
-
-        /**
-         * Compares this object to another and returns true if this object
-         * is considered to be less than the one passed.  This
-         * @param value - the value to be compared to this one.
-         * @return true if this object is equal to the one passed.
-         */
-        virtual bool operator<( const UUID& value ) const;
-
-        /**
-         * Returns a String object representing this UUID.  UUID's are formatted
-         * as: 00112233-4455-6677-8899-AABBCCDDEEFF whose length is 36.
-         * @returns formatted string for this UUID
-         */
-        virtual std::string toString() const;
-
-        /**
-         * @returns the most significant 64 bits of this UUID's 128 bit value.
-         */
-        virtual long long getLeastSignificantBits() const;
-
-        /**
-         * @returns the most significant 64 bits of this UUID's 128 bit value.
-         */
-        virtual long long getMostSignificantBits() const;
-
-        /**
-         * The node value associated with this UUID.
-         *
-         * The 48 bit node value is constructed from the node field of this UUID.
-         * This field is intended to hold the IEEE 802 address of the machine that
-         * generated this UUID to guarantee spatial uniqueness.
-         *
-         * The node value is only meaningful in a time-based UUID, which has
-         * version type 1. If this UUID is not a time-based UUID then this method
-         * throws UnsupportedOperationException.
-         * @returns the node value of this UUID
-         * @throws UnsupportedOperationException
-         */
-        virtual long long node()
-            throw ( lang::exceptions::UnsupportedOperationException );
-
-        /**
-         * The timestamp value associated with this UUID.
-         *
-         * The 60 bit timestamp value is constructed from the time_low, time_mid,
-         * and time_hi fields of this UUID. The resulting timestamp is measured in
-         * 100-nanosecond units since midnight, October 15, 1582 UTC.
-         *
-         * The timestamp value is only meaningful in a time-based UUID, which has
-         * version type 1. If this UUID is not a time-based UUID then this method
-         * throws UnsupportedOperationException.
-         * @returns the timestamp associated with a V1 UUID
-         * @throws UnsupportedOperationException
-         */
-        virtual long long timestamp()
-            throw ( lang::exceptions::UnsupportedOperationException );
-
-        /**
-         * The clock sequence value associated with this UUID.
-         *
-         * The 14 bit clock sequence value is constructed from the clock sequence
-         * field of this UUID. The clock sequence field is used to guarantee temporal
-         * uniqueness in a time-based UUID.
-         *
-         * The clockSequence value is only meaningful in a time-based UUID, which
-         * has version type 1. If this UUID is not a time-based UUID then this
-         * method throws UnsupportedOperationException.
-         * @returns the clockSequeunce associated with a V1 UUID
-         * @throws UnsupportedOperationException
-         */
-        virtual int clockSequence()
-            throw ( lang::exceptions::UnsupportedOperationException );
-
-        /**
-         * The variant number associated with this UUID. The variant number describes
-         * the layout of the UUID. The variant number has the following meaning:
-         *
-         *     * 0 Reserved for NCS backward compatibility
-         *     * 2 The Leach-Salz variant (used by this class)
-         *     * 6 Reserved, Microsoft Corporation backward compatibility
-         *     * 7 Reserved for future definition
-         *
-         * @returns the variant associated with a V1 UUID
-         * @throws UnsupportedOperationException
-         */
-        virtual int variant()
-            throw ( lang::exceptions::UnsupportedOperationException );
-
-        /**
-         * The version number associated with this UUID. The version number describes
-         * how this UUID was generated. The version number has the following meaning:
-         *
-         *     * 1 Time-based UUID
-         *     * 2 DCE security UUID
-         *     * 3 Name-based UUID
-         *     * 4 Randomly generated UUID
-         *
-         * @returns the version associated with a V1 UUID
-         * @throws UnsupportedOperationException
-         */
-        virtual int version()
-            throw ( lang::exceptions::UnsupportedOperationException );
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_UUID_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/Concurrent.h b/src/decaf/src/main/decaf/util/concurrent/Concurrent.h
deleted file mode 100644
index 70b5be9..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/Concurrent.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_CONCURRENT_CONCURRENT_H_
-#define _DECAF_UTIL_CONCURRENT_CONCURRENT_H_
-
-#include <decaf/util/concurrent/Lock.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-/**
- * The synchronized macro defines a mechanism for snycronizing
- * a scetion of code.  The macro must be passed an object that
- * implements the Syncronizable interface.
- *
- * The macro works by creating a for loop that will loop exactly
- * once, creating a Lock object that is scoped to the loop.  Once
- * the loop conpletes and exits the Lock object goes out of scope
- * releasing the lock on object W.  For added safety the if else
- * is used because not all compiles restrict the lifetime of
- * loop variables to the loop, they will however restrict them
- * to the scope of the else.
- *
- * The macro would be used as follows.
- *
- * <Syncronizable> X;
- *
- * somefunction()
- * {
- *    syncronized(X)
- *    {
- *       // Do something that needs syncronizing.
- *    }
- * }
- */
-
-#define WAIT_INFINITE  0xFFFFFFFF
-
-#define synchronized(W)                                               \
-        if(false){}                                                   \
-        else                                                          \
-        for( decaf::util::concurrent::Lock lock_W(W);                 \
-             lock_W.isLocked(); lock_W.unlock() )
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_CONCURRENT_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/CountDownLatch.cpp b/src/decaf/src/main/decaf/util/concurrent/CountDownLatch.cpp
deleted file mode 100644
index 6de53c9..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/CountDownLatch.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "CountDownLatch.h"
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-////////////////////////////////////////////////////////////////////////////////
-CountDownLatch::CountDownLatch( int count )
-{
-    this->count = count;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-CountDownLatch::~CountDownLatch()
-{
-    try {
-
-        synchronized( &mutex ) {
-            mutex.notifyAll();
-        }
-    }
-    DECAF_CATCHALL_NOTHROW()
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CountDownLatch::await() throw ( lang::Exception ) {
-
-    try {
-
-        synchronized( &mutex ) {
-            if( count == 0 ){
-                return;
-            }
-
-            mutex.wait();
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool CountDownLatch::await( unsigned long timeOut ) throw ( lang::Exception ) {
-    try {
-
-        synchronized( &mutex ) {
-            if( count == 0 ){
-                return true;
-            }
-
-            mutex.wait( timeOut );
-
-            return count == 0;
-        }
-
-        return true;
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CountDownLatch::countDown() {
-    try {
-
-        if( count == 0 ) {
-            return;
-        }
-
-        synchronized( &mutex ) {
-            count--;
-
-            // Signal when done.
-            if( count == 0 ){
-                mutex.notifyAll();
-            }
-        }
-    }
-    DECAF_CATCHALL_NOTHROW()
-}
diff --git a/src/decaf/src/main/decaf/util/concurrent/CountDownLatch.h b/src/decaf/src/main/decaf/util/concurrent/CountDownLatch.h
deleted file mode 100644
index 0936f68..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/CountDownLatch.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_CONCURRENT_COUNTDOWNLATCH_H_
-#define _DECAF_CONCURRENT_COUNTDOWNLATCH_H_
-
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Config.h>
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class DECAF_API CountDownLatch
-    {
-    private:
-
-        /**
-         * number to count down to
-         */
-        int count;
-
-        /**
-         * Mutex to protect the counts, and wait on.
-         */
-        Mutex mutex;
-
-    public:
-
-        /**
-         * Constructor
-         * @param count - number to count down from.
-         */
-        CountDownLatch( int count );
-
-        virtual ~CountDownLatch();
-
-        /**
-         * Waits for the Count to be zero, and then returns
-         * @throws CMSException
-         */
-        virtual void await() throw ( lang::Exception );
-
-        /**
-         * Waits for the Count to hit zero, or a timeout.
-         * @param timeOut - time in milliseconds to wait.
-         * @returns true if the wait made it to count zero, otherwise false
-         */
-        virtual bool await( unsigned long timeOut )  throw ( lang::Exception );
-
-        /**
-         * Counts down the latch, releasing all waiting threads when
-         * the count hits zero.
-         */
-        virtual void countDown();
-
-        /**
-         * Gets the current count
-         * @returns int count value
-         */
-        virtual int getCount() const {
-            return this->count;
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_CONCURRENT_COUNTDOWNLATCH_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/Lock.h b/src/decaf/src/main/decaf/util/concurrent/Lock.h
deleted file mode 100644
index 9973253..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/Lock.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_CONCURRENT_LOCK_H_
-#define _DECAF_UTIL_CONCURRENT_LOCK_H_
-
-#include <decaf/lang/Exception.h>
-#include <decaf/util/concurrent/Synchronizable.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    /**
-     * A wrapper class around a given synchronization mechanism that
-     * provides automatic release upon destruction.
-     * @author  Nathan Mittler
-     */
-    class Lock
-    {
-    private:
-
-        /**
-         * Flag to indicate whether or not this object has locked the
-         * sync object.
-         */
-        bool locked;
-
-        /**
-         * The synchronizable object to lock/unlock.
-         */
-        Synchronizable* syncObject;
-
-    public:
-
-        /**
-         * Constructor - initializes the object member and locks
-         * the object if desired.
-         * @param   object   The sync object to control
-         * @param   intiallyLocked  If true, the object will automatically
-         * be locked.
-         */
-        Lock( Synchronizable* object, const bool intiallyLocked = true )
-        {
-            try{
-                syncObject = object;
-                locked = false;
-
-                if( intiallyLocked )
-                {
-                    lock();
-                }
-            }
-            DECAF_CATCH_RETHROW( lang::Exception )
-            DECAF_CATCHALL_THROW( lang::Exception )
-        }
-
-        /**
-         * Destructor - Unlocks the object if it is locked.
-         */
-        virtual ~Lock()
-        {
-            try{
-                if( locked )
-                {
-                  syncObject->unlock();
-                }
-            }
-            DECAF_CATCH_RETHROW( lang::Exception )
-            DECAF_CATCHALL_THROW( lang::Exception )
-        }
-
-        /**
-         * Locks the object.
-         */
-        void lock()
-        {
-            try{
-                syncObject->lock();
-                locked = true;
-            }
-            DECAF_CATCH_RETHROW( lang::Exception )
-            DECAF_CATCHALL_THROW( lang::Exception )
-        }
-
-        /**
-         * Unlocks the object.
-         */
-        void unlock()
-        {
-            try{
-                 if(locked)
-                 {
-                     syncObject->unlock();
-                     locked = false;
-                 }
-            }
-            DECAF_CATCH_RETHROW( lang::Exception )
-            DECAF_CATCHALL_THROW( lang::Exception )
-        }
-
-        /**
-         * Indicates whether or not the object is locked.
-         * @return  true if the object is locked, otherwise false.
-         */
-        bool isLocked() const{ return locked; }
-    };
-
-}}}
-
-#endif // _DECAF_UTIL_CONCURRENT_LOCK_H_
diff --git a/src/decaf/src/main/decaf/util/concurrent/Mutex.cpp b/src/decaf/src/main/decaf/util/concurrent/Mutex.cpp
deleted file mode 100644
index 9a0b65f..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/Mutex.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/util/concurrent/Mutex.h>
-
-#include <apr_errno.h>
-#include <apr_time.h>
-
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-////////////////////////////////////////////////////////////////////////////////
-Mutex::Mutex() {
-
-    apr_pool_create( &pool, NULL );
-    apr_thread_mutex_create( &mutex, APR_THREAD_MUTEX_NESTED, pool );
-    this->lock_owner = 0;
-    this->lock_count = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Mutex::~Mutex() {
-
-    // Unlock the mutex.
-    unlock();
-
-    apr_thread_mutex_destroy( mutex );
-    apr_pool_destroy( pool );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Mutex::lock() throw( lang::Exception ) {
-
-    unsigned long threadId = lang::Thread::getId();
-
-    if( threadId == lock_owner ) {
-        lock_count++;
-    } else {
-        apr_thread_mutex_lock( mutex );
-        lock_owner = threadId;
-        lock_count = 1;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Mutex::unlock() throw( lang::Exception ) {
-
-    if( lock_owner == 0 ) {
-        return;
-    }
-
-    if( !isLockOwner() ) {
-        throw lang::Exception(
-            __FILE__, __LINE__,
-            "Mutex::unlock - Failed, not Lock Owner!" );
-    }
-
-    lock_count--;
-
-    if(lock_count == 0) {
-        lock_owner = 0;
-        apr_thread_mutex_unlock( mutex );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Mutex::wait() throw( lang::Exception )
-{
-    // Delegate to the timed version
-    wait( WAIT_INFINITE );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Mutex::wait( unsigned long millisecs )
-    throw( lang::Exception )
-{
-    if( !isLockOwner() ) {
-        throw lang::Exception(
-            __FILE__, __LINE__,
-            "Mutex::wait - Failed, not Lock Owner!");
-    }
-
-    // Save the current owner as we are going to unlock and release for
-    // someone else to lock on potentially.  When we come back and
-    // re-lock we want to restore to the state we were in before.
-    unsigned long lock_owner = this->lock_owner;
-    unsigned long lock_count = this->lock_count;
-
-    this->lock_owner = 0;
-    this->lock_count = 0;
-
-    // Create this threads wait event
-    apr_thread_cond_t* waitEvent = NULL;
-    apr_thread_cond_create( &waitEvent, pool );
-
-    // Store the event in the queue so that a notify can
-    // call it and wake up the thread.
-    eventQ.push_back( waitEvent );
-
-    if( millisecs != WAIT_INFINITE ) {
-        apr_interval_time_t wait = millisecs * 1000;
-        apr_thread_cond_timedwait( waitEvent, mutex, wait );
-    } else {
-        apr_thread_cond_wait( waitEvent, mutex );
-    }
-
-    // Be Sure that the event is now removed
-    eventQ.remove( waitEvent );
-
-    // Destroy our wait event now, the notify method will have removed it
-    // from the event queue.
-    apr_thread_cond_destroy( waitEvent );
-
-    // restore the owner
-    this->lock_owner = lock_owner;
-    this->lock_count = lock_count;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Mutex::notify() throw( lang::Exception )
-{
-    if( !isLockOwner() ) {
-        throw lang::Exception(
-            __FILE__, __LINE__,
-            "Mutex::Notify - Failed, not Lock Owner!" );
-    }
-
-    if( !eventQ.empty() ) {
-        apr_thread_cond_t* event = eventQ.front();
-        eventQ.remove( event );
-        apr_thread_cond_signal( event );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Mutex::notifyAll() throw( lang::Exception )
-{
-    if( !isLockOwner() ) {
-        throw lang::Exception(
-            __FILE__, __LINE__,
-            "Mutex::NotifyAll - Failed, not Lock Owner!" );
-    }
-
-    while( !eventQ.empty() ) {
-        apr_thread_cond_t* event = eventQ.front();
-        eventQ.remove( event );
-        apr_thread_cond_signal( event );
-    }
-}
diff --git a/src/decaf/src/main/decaf/util/concurrent/Mutex.h b/src/decaf/src/main/decaf/util/concurrent/Mutex.h
deleted file mode 100644
index 1d1ab7b..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/Mutex.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_CONCURRENT_MUTEX_H_
-#define _DECAF_CONCURRENT_MUTEX_H_
-
-#include <decaf/util/concurrent/Synchronizable.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/lang/Thread.h>
-#include <decaf/util/Config.h>
-
-#include <apr_pools.h>
-#include <apr_thread_mutex.h>
-#include <apr_thread_cond.h>
-
-#include <list>
-#include <assert.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    /**
-     * Creates a pthread_mutex_t object. The object is created
-     * such that successive locks from the same thread is allowed
-     * and will be successful.
-     * @see  pthread_mutex_t
-     */
-    class DECAF_API Mutex : public Synchronizable {
-    private:
-
-        // APR Pool Allocator
-        apr_pool_t* pool;
-
-        // The mutex object.
-        apr_thread_mutex_t* mutex;
-
-        // List of waiting threads
-        std::list<apr_thread_cond_t*> eventQ;
-
-        // Lock Status Members
-        volatile unsigned long lock_owner;
-        volatile unsigned long lock_count;
-
-    public:
-
-        /**
-         * Constructor - creates and initializes the mutex.
-         */
-        Mutex();
-
-        /**
-         * Destructor - destroys the mutex object.
-         */
-        virtual ~Mutex();
-
-        /**
-         * Locks the object.
-         * @throws ActiveMQException
-         */
-        virtual void lock() throw( lang::Exception );
-
-        /**
-         * Unlocks the object.
-         * @throws ActiveMQException
-         */
-        virtual void unlock() throw( lang::Exception );
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.
-         * @throws ActiveMQException
-         */
-        virtual void wait() throw( lang::Exception );
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in milliseconds to wait.
-         * @throws ActiveMQException
-         */
-        virtual void wait( unsigned long millisecs )
-            throw( lang::Exception );
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.
-         * @throws ActiveMQException
-         */
-        virtual void notify() throw( lang::Exception );
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.
-         * @throws ActiveMQException
-         */
-        virtual void notifyAll() throw( lang::Exception );
-
-    private:
-
-        /**
-         * Check if the calling thread is the Lock Owner
-         * @retun true if the caller is the lock owner
-         */
-        bool isLockOwner(){
-            return lock_owner == lang::Thread::getId();
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_CONCURRENT_MUTEX_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/PooledThread.cpp b/src/decaf/src/main/decaf/util/concurrent/PooledThread.cpp
deleted file mode 100644
index dc6daef..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/PooledThread.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <decaf/util/concurrent/PooledThread.h>
-#include <decaf/util/concurrent/ThreadPool.h>
-#include <decaf/util/concurrent/TaskListener.h>
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-
-#include <iostream>
-
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-////////////////////////////////////////////////////////////////////////////////
-LOGDECAF_INITIALIZE(logger, PooledThread, "com.activemq.concurrent.PooledThread")
-
-////////////////////////////////////////////////////////////////////////////////
-PooledThread::PooledThread(ThreadPool* pool)
-{
-    if(pool == NULL)
-    {
-        throw IllegalArgumentException( __FILE__, __LINE__,
-            "PooledThread::PooledThread");
-    }
-
-    busy = false;
-    done = false;
-
-    listener = NULL;
-
-    // Store our Pool.
-    this->pool = pool;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-PooledThread::~PooledThread()
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void PooledThread::run(void)
-{
-    ThreadPool::Task task;
-
-    try
-    {
-        while(!done)
-        {
-            //LOGCMS_DEBUG(logger, "PooledThread::run - Entering deQ");
-
-            // Blocks until there something to be done
-            task = pool->deQueueTask();
-
-            //LOGCMS_DEBUG(logger, "PooledThread::run - Exited deQ");
-
-            // Check if the Done Flag is set, in case it happened while we
-            // were waiting for a task
-            if(done)
-            {
-                break;
-            }
-
-            // If we got here and the runnable was null then something
-            // bad must have happened.  Throw an Exception and bail.
-            if(!task.first)
-            {
-                throw Exception( __FILE__, __LINE__,
-                    "PooledThread::run - Retrieive NULL task from Pool.");
-            }
-
-            // Got some work to do, so set flag to busy
-            busy = true;
-
-            // Inform a listener that we are going to start
-            if(listener)
-            {
-                /*LOGCMS_DEBUG(logger,
-                   "PooledThread::run - Inform Listener we are starting");*/
-                listener->onTaskStarted(this);
-            }
-
-            // Perform the work
-            task.first->run();
-
-            /*LOGCMS_DEBUG(logger,
-                "PooledThread::run - Inform Task Listener we are done");*/
-
-            // Notify the Task listener that we are done
-            task.second->onTaskComplete(task.first);
-
-            // Inform a listener that we are going to stop and wait
-            // for a new task
-            if(listener)
-            {
-                /*LOGCMS_DEBUG(logger,
-                    "PooledThread::run - Inform Listener we are done");*/
-                listener->onTaskCompleted(this);
-            }
-
-            // Set flag to inactive, we will wait for work
-            busy = false;
-        }
-    }
-    catch( Exception& ex )
-    {
-        ex.setMark( __FILE__, __LINE__ );
-
-        // Notify the Task owner
-        if(task.first && task.second)
-        {
-            task.second->onTaskException(task.first, ex);
-        }
-
-        busy = false;
-
-        // Notify the PooledThreadListener
-        if(listener)
-        {
-            listener->onTaskException(this, ex);
-        }
-    }
-    catch(...)
-    {
-        Exception ex(
-            __FILE__, __LINE__,
-            "PooledThread::run - Caught Unknown Exception");
-
-        // Notify the Task owner
-        if(task.first && task.second)
-        {
-            task.second->onTaskException(task.first, ex);
-        }
-
-        busy = false;
-
-        // Notify the PooledThreadListener
-        if(listener)
-        {
-            listener->onTaskException(this, ex);
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void PooledThread::stop(void) throw ( Exception )
-{
-    done = true;
-}
diff --git a/src/decaf/src/main/decaf/util/concurrent/PooledThread.h b/src/decaf/src/main/decaf/util/concurrent/PooledThread.h
deleted file mode 100644
index d1d4fff..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/PooledThread.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_CONCURRENT_POOLEDTHREAD_H_
-#define _DECAF_UTIL_CONCURRENT_POOLEDTHREAD_H_
-
-#include <decaf/lang/Thread.h>
-#include <decaf/util/concurrent/PooledThreadListener.h>
-#include <decaf/util/logging/LoggerDefines.h>
-#include <decaf/util/Config.h>
-
-#include <decaf/lang/Exception.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class ThreadPool;
-
-    class DECAF_API PooledThread : public lang::Thread
-    {
-    private:
-
-        // Is this thread currently processing something
-        bool busy;
-
-        // Boolean flag indicating thread should stop
-        bool done;
-
-        // Listener for Task related events
-        PooledThreadListener* listener;
-
-        // The thread pool this Pooled Thread is Servicing
-        ThreadPool* pool;
-
-        // Logger Init
-        LOGDECAF_DECLARE(logger)
-
-     public:
-
-        /**
-         * Constructor
-         * @param pool the parant ThreadPool object
-         */
-        PooledThread( ThreadPool* pool );
-
-        virtual ~PooledThread();
-
-        /**
-         * Run Method for this object waits for something to be
-         * enqueued on the ThreadPool and then grabs it and calls
-         * its run method.
-         */
-        virtual void run();
-
-        /**
-         * Stops the Thread, thread will complete its task if currently
-         * running one, and then die.  Does not block.
-         * @throws Exception
-         */
-        virtual void stop() throw ( lang::Exception );
-
-        /**
-         * Checks to see if the thread is busy, if busy it means
-         * that this thread has taken a task from the ThreadPool's
-         * queue and is processing it.
-         * @returns true if the Thread is busy
-         */
-        virtual bool isBusy() { return busy; }
-
-        /**
-         * Adds a listener to this <code>PooledThread</code> to be
-         * notified when this thread starts and completes a task.
-         * @param listener the listener to send notifications to.
-         */
-        virtual void setPooledThreadListener( PooledThreadListener* listener )
-        {
-            this->listener = listener;
-        }
-
-        /**
-         * Removes a listener for this <code>PooledThread</code> to be
-         * notified when this thread starts and completes a task.
-         * @return a pointer to this thread's listener or NULL
-         */
-        virtual PooledThreadListener* getPooledThreadListener()
-        {
-            return this->listener;
-        }
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_POOLEDTHREAD_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/PooledThreadListener.h b/src/decaf/src/main/decaf/util/concurrent/PooledThreadListener.h
deleted file mode 100644
index c818757..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/PooledThreadListener.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_CONCURRENT_POOLEDTHREADLISTENER_H_
-#define _DECAF_UTIL_CONCURRENT_POOLEDTHREADLISTENER_H_
-
-#include <decaf/lang/Exception.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class PooledThread;
-
-    class DECAF_API PooledThreadListener
-    {
-    public:
-
-        /**
-         * Destructor
-         */
-        virtual ~PooledThreadListener() {}
-
-        /**
-         * Called by a pooled thread when it is about to begin
-         * executing a new task.
-         * @param Pointer to the Pooled Thread that is making this call
-         */
-        virtual void onTaskStarted( PooledThread* thread ) = 0;
-
-        /**
-         * Called by a pooled thread when it has completed a task
-         * and is going back to waiting for another task to run
-         * @param Pointer the the Pooled Thread that is making this call.
-         */
-        virtual void onTaskCompleted( PooledThread* thread ) = 0;
-
-        /**
-         * Called by a pooled thread when it has encountered an exception
-         * while running a user task, after receiving this notification
-         * the callee should assume that the PooledThread is now no longer
-         * running.
-         * @param Pointer to the Pooled Thread that is making this call
-         * @param The Exception that occured.
-         */
-        virtual void onTaskException( PooledThread* thread,
-                                      lang::Exception& ex) = 0;
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_POOLEDTHREADLISTENER_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/Synchronizable.h b/src/decaf/src/main/decaf/util/concurrent/Synchronizable.h
deleted file mode 100644
index 0918bb7..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/Synchronizable.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_CONCURRENT_SYNCHRONIZABLE_H_
-#define _DECAF_UTIL_CONCURRENT_SYNCHRONIZABLE_H_
-
-#include <decaf/lang/Exception.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    /**
-     * The interface for all synchronizable objects (that is, objects
-     * that can be locked and unlocked).
-     */
-    class DECAF_API Synchronizable
-    {
-    public:
-
-        virtual ~Synchronizable(){}
-
-        /**
-         * Locks the object.
-         * @throws Exception
-         */
-        virtual void lock() throw( lang::Exception ) = 0;
-
-        /**
-         * Unlocks the object.
-         * @throws Exception
-         */
-        virtual void unlock() throw( lang::Exception ) = 0;
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void wait() throw( lang::Exception ) = 0;
-
-        /**
-         * Waits on a signal from this object, which is generated
-         * by a call to Notify.  Must have this object locked before
-         * calling.  This wait will timeout after the specified time
-         * interval.
-         * @param millisecs the time in millisecsonds to wait, or
-         * WAIT_INIFINITE
-         * @throws Exception
-         */
-        virtual void wait(unsigned long millisecs)
-            throw( lang::Exception ) = 0;
-
-        /**
-         * Signals a waiter on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notify() throw( lang::Exception ) = 0;
-
-        /**
-         * Signals the waiters on this object that it can now wake
-         * up and continue.  Must have this object locked before
-         * calling.
-         * @throws Exception
-         */
-        virtual void notifyAll() throw( lang::Exception ) = 0;
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_SYNCHRONIZABLE_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/TaskListener.h b/src/decaf/src/main/decaf/util/concurrent/TaskListener.h
deleted file mode 100644
index af22c9e..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/TaskListener.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_CONCURRENT_TASKLISTENER_H_
-#define _DECAF_UTIL_CONCURRENT_TASKLISTENER_H_
-
-#include <decaf/lang/Runnable.h>
-#include <decaf/lang/Exception.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class DECAF_API TaskListener
-    {
-    public:
-
-        virtual ~TaskListener() {}
-
-        /**
-         * Called when a queued task has completed, the task that
-         * finished is passed along for user consumption
-         * @param task Runnable Pointer to the task that finished
-         */
-        virtual void onTaskComplete( lang::Runnable* task ) = 0;
-
-        /**
-         * Called when a queued task has thrown an exception while
-         * being run.  The Callee should assume that this was an
-         * unrecoverable exeption and that this task is now defunct.
-         * @param task Runnable Pointer to the task
-         * @param ex The ActiveMQException that was thrown.
-         */
-        virtual void onTaskException( lang::Runnable* task,
-                                      lang::Exception& ex ) = 0;
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_TASKLISTENER_H_*/
diff --git a/src/decaf/src/main/decaf/util/concurrent/ThreadPool.cpp b/src/decaf/src/main/decaf/util/concurrent/ThreadPool.cpp
deleted file mode 100644
index 66b6d3c..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/ThreadPool.cpp
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include <decaf/util/concurrent/ThreadPool.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-#include <decaf/util/Config.h>
-
-#ifdef min
-#undef min
-#endif
-
-#include <algorithm>
-#include <iostream>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-////////////////////////////////////////////////////////////////////////////////
-LOGDECAF_INITIALIZE(logger, ThreadPool, "com.activemq.concurrent.ThreadPool")
-LOGDECAF_INITIALIZE(marker, ThreadPool, "com.activemq.concurrent.ThreadPool.Marker")
-
-////////////////////////////////////////////////////////////////////////////////
-ThreadPool ThreadPool::instance;
-
-////////////////////////////////////////////////////////////////////////////////
-ThreadPool::ThreadPool()
-{
-    maxThreads  = DEFAULT_MAX_POOL_SIZE;
-    blockSize   = DEFAULT_MAX_BLOCK_SIZE;
-    freeThreads = 0;
-
-    shutdown = false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ThreadPool::~ThreadPool()
-{
-    try
-    {
-        std::vector<PooledThread*>::iterator itr = pool.begin();
-
-        // Stop all the threads
-        for(; itr != pool.end(); ++itr)
-        {
-            (*itr)->stop();
-        }
-
-        // Set the shutdown flag so that the DeQueue methods all quit
-        // when we interrupt them.
-        shutdown = true;
-
-        synchronized(&queue)
-        {
-            // Signal the Queue so that all waiters are notified
-            queue.notifyAll();
-        }
-
-        // Wait for everyone to die
-        for(itr = pool.begin(); itr != pool.end(); ++itr)
-        {
-            (*itr)->join();
-
-            // Destroy the threads
-            delete *itr;
-        }
-
-        pool.clear();
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::queueTask( ThreadPool::Task task )
-   throw ( lang::Exception )
-{
-    try
-    {
-        if( !task.first || !task.second )
-        {
-            throw exceptions::IllegalArgumentException( __FILE__, __LINE__,
-                "ThreadPool::QueueTask - Invalid args for Task");
-        }
-
-        //LOGCMS_DEBUG(logger, "ThreadPool::QueueTask - syncing on queue");
-
-        synchronized(&queue)
-        {
-            //LOGCMS_DEBUG(logger, "ThreadPool::QueueTask - sync'd, synching pool");
-
-            // If there's nobody open to do work, then create some more
-            // threads to handle the work.
-            if(freeThreads == 0)
-            {
-                AllocateThreads(blockSize);
-            }
-
-            //LOGCMS_DEBUG(logger, "ThreadPool::QueueTask - pushing task");
-
-            // queue the new work.
-            queue.push(task);
-
-            //LOGCMS_DEBUG(logger, "ThreadPool::QueueTask - calling notify");
-
-            // Inform waiters that we put some work on the queue.
-            queue.notify();
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-ThreadPool::Task ThreadPool::deQueueTask()
-   throw ( lang::Exception )
-{
-    try
-    {
-        //LOGCMS_DEBUG(logger, "ThreadPool::DeQueueTask - syncing on queue");
-
-        synchronized(&queue)
-        {
-            /*LOGCMS_DEBUG(logger,
-                "ThreadPool::DeQueueTask - sync'd checking queue empty");*/
-
-           // Wait for work, wait in a while loop since another thread could
-           // be waiting for a lock and get the work before we get woken up
-           // from our wait.
-           while(queue.empty() && !shutdown)
-           {
-               //LOGCMS_DEBUG(logger, "ThreadPool::DeQueueTask - Q empty, waiting");
-
-               queue.wait();
-
-               //LOGCMS_DEBUG(logger, "ThreadPool::DeQueueTask - done waiting");
-           }
-
-           // Don't give more work if we are closing down
-           if(shutdown)
-           {
-               return Task();
-           }
-
-           // check size again.
-           if(queue.empty())
-           {
-               throw lang::Exception( __FILE__, __LINE__,
-                   "ThreadPool::DeQueueUserWorkItem - Empty Taskn, not in shutdown.");
-           }
-
-           //LOGCMS_DEBUG(logger, "ThreadPool::DeQueueTask - popping task");
-
-           // not empty so get the new work to do
-           return queue.pop();
-        }
-
-        return Task();
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::reserve( std::size_t size )
-{
-    try
-    {
-        synchronized(&poolLock)
-        {
-            if(size < pool.size() || pool.size() == maxThreads)
-            {
-                return;
-            }
-
-            // How many do we reserve
-            std::size_t allocCount = size - pool.size();
-
-            // Allocate the new Threads
-            AllocateThreads(allocCount);
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::setMaxThreads( std::size_t maxThreads )
-{
-    try
-    {
-        synchronized(&poolLock)
-        {
-            if(maxThreads == 0)
-            {
-                // Caller tried to do something stupid, ignore them.
-                return;
-            }
-
-            this->maxThreads = maxThreads;
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::setBlockSize( std::size_t blockSize )
-{
-    try
-    {
-        if(blockSize <= 0)
-        {
-            // User tried something dumb, protect them from themselves
-            return;
-        }
-
-        synchronized(&poolLock)
-        {
-            this->blockSize = blockSize;
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::AllocateThreads( std::size_t count )
-{
-    try
-    {
-        if(pool.size() >= maxThreads)
-        {
-            return;
-        }
-
-        synchronized(&poolLock)
-        {
-            // Take the min of alloc size of maxThreads since we don't
-            // want anybody sneaking eaxtra threads in, greedy bastards.
-            count = std::min(count, maxThreads - pool.size());
-
-            // Each time we create a thread we increment the free Threads
-            // counter, but before we call start so that the Thread doesn't
-            // get ahead of us.
-            for(std::size_t i = 0; i < count; ++i)
-            {
-                pool.push_back(new PooledThread(this));
-                pool.back()->setPooledThreadListener(this);
-                freeThreads++;
-                pool.back()->start();
-            }
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::onTaskStarted( PooledThread* thread DECAF_UNUSED )
-{
-    try
-    {
-        synchronized(&poolLock)
-        {
-            freeThreads--;
-
-            // Now that this callback has decremented the free threads coutner
-            // let check if there is any outstanding work to be done and no
-            // threads to handle it.  This could happen if the QueueTask
-            // method was called successively without any of the PooledThreads
-            // having a chance to wake up and service the queue.  This would
-            // cause the number of Task to exceed the number of free threads
-            // once the Threads got a chance to wake up and service the queue
-            if( freeThreads == 0 && !queue.empty() )
-            {
-                // Allocate a new block of threads
-                AllocateThreads( blockSize );
-            }
-        }
-
-        //LOGCMS_DEBUG(logger, "ThreadPool::onTaskStarted:");
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::onTaskCompleted( PooledThread* thread DECAF_UNUSED)
-{
-    try
-    {
-        synchronized(&poolLock)
-        {
-            freeThreads++;
-        }
-
-        //LOGCMS_DEBUG(logger, "ThreadPool::onTaskCompleted: ");
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ThreadPool::onTaskException(
-   PooledThread* thread,
-   lang::Exception& ex DECAF_UNUSED )
-{
-    //LOGCMS_DEBUG(logger, "ThreadPool::onTaskException: ");
-
-    try
-    {
-        synchronized(&poolLock)
-        {
-            // Delete the thread that had the exception and start a new
-            // one to take its place.
-            freeThreads--;
-
-            std::vector<PooledThread*>::iterator itr =
-                std::find(pool.begin(), pool.end(), thread);
-
-            if(itr != pool.end())
-            {
-                pool.erase(itr);
-            }
-
-            // Bye-Bye Thread Object
-            delete thread;
-
-            // Now allocate a replacement
-            AllocateThreads(1);
-        }
-    }
-    DECAF_CATCH_RETHROW( lang::Exception )
-    DECAF_CATCHALL_THROW( lang::Exception )
-}
-
diff --git a/src/decaf/src/main/decaf/util/concurrent/ThreadPool.h b/src/decaf/src/main/decaf/util/concurrent/ThreadPool.h
deleted file mode 100644
index ebf6329..0000000
--- a/src/decaf/src/main/decaf/util/concurrent/ThreadPool.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_CONCURRENT_THREADPOOL_H_
-#define _DECAF_UTIL_CONCURRENT_THREADPOOL_H_
-
-#include <decaf/lang/Runnable.h>
-#include <decaf/util/concurrent/PooledThread.h>
-#include <decaf/util/concurrent/PooledThreadListener.h>
-#include <decaf/util/concurrent/TaskListener.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Queue.h>
-#include <decaf/util/logging/LoggerDefines.h>
-#include <decaf/util/Config.h>
-
-#include <vector>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    /**
-     * Defines a Thread Pool object that implements the functionality
-     * of pooling threads to perform user tasks.  The Thread Poll has
-     * max size that it will grow to.  The thread pool allocates threads
-     * in blocks.  When there are no waiting worker threads and a task
-     * is queued then a new batch is allocated.  The user can specify
-     * the size of the blocks, otherwise a default value is used.
-     * <P>
-     * When the user queues a task they must also queue a listner to
-     * be notified when the task has completed, this provides the user
-     * with a mechanism to know when a task object can be freed.
-     * <P>
-     * To have the Thread Pool perform a task, the user enqueue's an
-     * object that implements the <code>Runnable</code> insterface and
-     * one of the worker threads will executing it in its thread context.
-     */
-    class DECAF_API ThreadPool : public PooledThreadListener
-    {
-    public:
-
-        // Constants
-        static const size_t DEFAULT_MAX_POOL_SIZE  = 10;
-        static const size_t DEFAULT_MAX_BLOCK_SIZE = 3;
-
-        // Types
-        typedef std::pair<lang::Runnable*, TaskListener*> Task;
-
-    private:
-
-        // Vector of threads that this object has created for its pool.
-        std::vector< PooledThread* > pool;
-
-        // Queue of Task that are in need of completion
-        util::Queue<Task> queue;
-
-        // Max number of Threads this Pool can contian
-        std::size_t maxThreads;
-
-        // Max number of tasks that can be allocated at a time
-        std::size_t blockSize;
-
-        // boolean flag use to indocate that this object is shutting down.
-        bool shutdown;
-
-        // Count of threads that are currently free to perfom some work.
-        std::size_t freeThreads;
-
-        // Mutex for locking operations that affect the pool.
-        Mutex poolLock;
-
-        // Logger Init
-        LOGDECAF_DECLARE(logger)
-        LOGDECAF_DECLARE(marker)
-
-    private:   // Statics
-
-        // The singleton instance of this class
-        static ThreadPool instance;
-
-    public:
-
-        ThreadPool();
-        virtual ~ThreadPool();
-
-        /**
-         * Queue a task to be completed by one of the Pooled Threads.
-         * tasks are serviced as soon as a <code>PooledThread</code>
-         * is available to run it.
-         * @param task object that derives from Runnable
-         * @throws ActiveMQException
-         */
-        virtual void queueTask( Task task )
-            throw ( lang::Exception );
-
-        /**
-         * DeQueue a task to be completed by one of the Pooled Threads.
-         * A caller of this method will block until there is something
-         * in the tasks queue, therefore care must be taken when calling
-         * this function.  Normally clients of ThreadPool don't use
-         * this, only the <code>PooledThread</code> objects owned by
-         * this ThreadPool.
-         * @return object that derives from Runnable
-         * @throws ActiveMQException
-         */
-        virtual Task deQueueTask()
-            throw ( lang::Exception );
-
-        /**
-         * Returns the current number of Threads in the Pool, this is
-         * how many there are now, not how many are active or the max
-         * number that might exist.
-         * @return integer number of threads in existance.
-         */
-        virtual std::size_t getPoolSize() const { return pool.size(); }
-
-        /**
-         * Returns the current backlog of items in the tasks queue, this
-         * is how much work is still waiting to get done.
-         * @return number of outstanding tasks.
-         */
-        virtual std::size_t getBacklog() const { return queue.size(); }
-
-        /**
-         * Ensures that there is at least the specified number of Threads
-         * allocated to the pool.  If the size is greater than the MAX
-         * number of threads in the pool, then only MAX threads are
-         * reservved.  If the size is smaller than the number of threads
-         * currently in the pool, than nothing is done.
-         * @param size the number of threads to reserve.
-         */
-        virtual void reserve( std::size_t size );
-
-        /**
-         * Get the Max Number of Threads this Pool can contain
-         * @return max size
-         */
-        virtual std::size_t getMaxThreads() const { return maxThreads; }
-
-        /**
-         * Sets the Max number of threads this pool can contian.
-         * if this value is smaller than the current size of the
-         * pool nothing is done.
-         * @param maxThreads total number of threads that can be pooled
-         */
-        virtual void setMaxThreads( std::size_t maxThreads );
-
-        /**
-         * Gets the Max number of threads that can be allocated at a time
-         * when new threads are needed.
-         * @return max Thread Block Size
-         */
-        virtual std::size_t getBlockSize() const { return blockSize; }
-
-        /**
-         * Sets the Max number of Threads that can be allocated at a time
-         * when the Thread Pool determines that more Threads are needed.
-         * @param blockSize Max Thread Block Size
-         */
-        virtual void setBlockSize( std::size_t blockSize );
-
-        /**
-         * Returns the current number of available threads in the pool, threads
-         * that are performing a user task are considered unavailable.  This value
-         * could change immeadiately after calling as Threads could finish right
-         * after and be available again.  This is informational only.
-         * @return totoal free threads
-         */
-        virtual std::size_t getFreeThreadCount() const {
-            return freeThreads;
-        }
-
-    public: // PooledThreadListener Callbacks
-
-        /**
-         * Called by a pooled thread when it is about to begin
-         * executing a new task.  This will decrement the available
-         * threads counter so that this object knows when there are
-         * no more free threads and must create new ones.
-         * @param thread Pointer to the Pooled Thread that is making this call
-         */
-        virtual void onTaskStarted( PooledThread* thread );
-
-        /**
-         * Called by a pooled thread when it has completed a task
-         * and is going back to waiting for another task to run,
-         * this will increment the free threads counter.
-         * @param thread Pointer the the Pooled Thread that is making this call.
-         */
-        virtual void onTaskCompleted( PooledThread* thread );
-
-        /**
-         * Called by a pooled thread when it has encountered an exception
-         * while running a user task, after receiving this notification
-         * the callee should assume that the PooledThread is now no longer
-         * running.
-         * @param thread Pointer to the Pooled Thread that is making this call
-         * @param ex The Exception that occured.
-         */
-        virtual void onTaskException( PooledThread* thread,
-                                      lang::Exception& ex );
-
-    public:   // Statics
-
-        /**
-         * Return the one and only Thread Pool instance.
-         * @return The Thread Pool Pointer
-         */
-        static ThreadPool* getInstance() {
-            return &instance;
-        }
-
-    private:
-
-        /**
-         * Allocates the requested ammount of Threads, won't exceed
-         * <code>maxThreads</code>.
-         * @param count the number of threads to create
-         */
-        void AllocateThreads( std::size_t count );
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_THREADPOOL_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/ConsoleHandler.h b/src/decaf/src/main/decaf/util/logging/ConsoleHandler.h
deleted file mode 100644
index 09f97d1..0000000
--- a/src/decaf/src/main/decaf/util/logging/ConsoleHandler.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_CONSOLEHANDLER_H_
-#define _DECAF_UTIL_LOGGING_CONSOLEHANDLER_H_
-
-#include <decaf/util/logging/StreamHandler.h>
-#include <decaf/io/StandardErrorOutputStream.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    /**
-     * This Handler publishes log records to System.err. By default the
-     * SimpleFormatter is used to generate brief summaries.
-     *
-     * Configuration: By default each ConsoleHandler is initialized using
-     * the following LogManager configuration properties. If properties are
-     * not defined (or have invalid values) then the specified default
-     * values are used.
-     *
-     * ConsoleHandler.level specifies the default level for the Handler
-     *  (defaults to Level.INFO).
-     * ConsoleHandler.filter specifies the name of a Filter class to use
-     *  (defaults to no Filter).
-     * ConsoleHandler.formatter specifies the name of a Formatter class to
-     *  use (defaults to SimpleFormatter).
-     */
-    class DECAF_API ConsoleHandler : public StreamHandler {
-    private:
-
-        // The Standard Error Stream to log to
-        io::StandardErrorOutputStream stream;
-
-        // The default Simple Formatter
-        SimpleFormatter formatter;
-
-    public:
-
-        ConsoleHandler() : StreamHandler( &stream, &formatter ) {
-
-            // Defaults level to Info
-            setLevel( Level.INFO );
-        }
-
-        virtual ~ConsoleHandler() {}
-
-        /**
-         * Close the current output stream.
-         * <p>
-         * Override the StreamHandler close to flush the Std Err stream
-         * but doesn't close.
-         * @throw CMSException
-         */
-        virtual void close() throw ( cms::CMSException )
-        {
-            if( getOutputStream() ) {
-                getOutputStream->flush();
-            }
-        }
-
-    };
-
-}})
-
-#endif /*_DECAF_UTIL_LOGGING_CONSOLEHANDLER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/Filter.h b/src/decaf/src/main/decaf/util/logging/Filter.h
deleted file mode 100644
index c1132b8..0000000
--- a/src/decaf/src/main/decaf/util/logging/Filter.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_FILTER_H_
-#define _DECAF_UTIL_LOGGING_FILTER_H_
-
-#include <decaf/util/logging/LogRecord.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    /**
-     * A Filter can be used to provide fine grain control over what is
-     * logged, beyond the control provided by log levels.
-     *
-     * Each Logger and each Handler can have a filter associated with it.
-     * The Logger or Handler will call the isLoggable method to check if a
-     * given LogRecord should be published. If isLoggable returns false,
-     * the LogRecord will be discarded.
-     */
-    class DECAF_API Filter {
-    public:
-
-        virtual ~Filter() {}
-
-        /**
-         * Check if a given log record should be published.
-         * @param record the <code>LogRecord</code> to check.
-         * @returns true if the record is loggable.
-         */
-        virtual bool isLoggable( const LogRecord& record ) const = 0;
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_FILTER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/Formatter.h b/src/decaf/src/main/decaf/util/logging/Formatter.h
deleted file mode 100644
index 18f5799..0000000
--- a/src/decaf/src/main/decaf/util/logging/Formatter.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_FORMATTER_H_
-#define _DECAF_UTIL_LOGGING_FORMATTER_H_
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    /**
-     * A Formatter provides support for formatting LogRecords.
-     *
-     * Typically each logging Handler will have a Formatter associated with
-     * it. The Formatter takes a LogRecord and converts it to a string.
-     *
-     * Some formatters (such as the XMLFormatter) need to wrap head and
-     * tail strings around a set of formatted records. The getHeader and
-     * getTail methods can be used to obtain these strings.
-     */
-    class DECAF_API Formatter {
-    public:
-
-        virtual ~Formatter() {}
-
-        /**
-         * Format the given log record and return the formatted string.
-         * @param record The Log Record to Format
-         * @returns the formatted record.
-         */
-        virtual std::string format( const LogRecord& record ) const = 0;
-
-        /**
-         * Format the message string from a log record.
-         * @param record The Log Record to Format
-         * @returns the formatted message
-         */
-        virtual std::string formatMessage( const LogRecord& record ) const = 0;
-
-        /**
-         * Return the header string for a set of formatted records.  In the
-         * default implementation this method should return empty string
-         * @param handler the target handler, can be null
-         * @return the head string
-         */
-        virtual std::string getHead( const Handler* handler ) = 0;
-
-        /**
-         * Return the tail string for a set of formatted records.  In the
-         * default implementation this method should return empty string
-         * @param handler the target handler, can be null
-         * @return the tail string
-         */
-        virtual std::string getTail( const Handler* handler ) = 0;
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_FORMATTER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/Handler.h b/src/decaf/src/main/decaf/util/logging/Handler.h
deleted file mode 100644
index bef829b..0000000
--- a/src/decaf/src/main/decaf/util/logging/Handler.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_HANDLER_H_
-#define _DECAF_UTIL_LOGGING_HANDLER_H_
-
-#include <decaf/io/Closeable.h>
-#include <decaf/util/logging/LogRecord.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    class Filter;
-    class Formatter;
-
-    /**
-     * A Handler object takes log messages from a Logger and exports them.
-     * It might for example, write them to a console or write them to a file,
-     * or send them to a network logging service, or forward them to an OS
-     * log, or whatever.
-     *
-     * A Handler can be disabled by doing a setLevel(Level.OFF) and can be
-     * re-enabled by doing a setLevel with an appropriate level.
-     *
-     * Handler classes typically use LogManager properties to set default
-     * values for the Handler's Filter, Formatter, and Level. See the
-     * specific documentation for each concrete Handler class.
-     */
-    class DECAF_API Handler : public io::Closeable {
-    public:
-
-        virtual ~Handler() {}
-
-        /**
-         * Flush the Handler's output, clears any buffers.
-         */
-        virtual void flush() = 0;
-
-        /**
-         * Publish the Log Record to this Handler
-         * @param record The Log Record to Publish
-         */
-        virtual void publish( const LogRecord& record ) = 0;
-
-        /**
-         * Check if this Handler would actually log a given LogRecord.
-         * <p>
-         * This method checks if the LogRecord has an appropriate Level and
-         * whether it satisfies any Filter. It also may make other Handler
-         * specific checks that might prevent a handler from logging the
-         * LogRecord.
-         * @param record <code>LogRecord</code> to check
-         */
-        virtual void isLoggable( const LogRecord& record ) = 0;
-
-        /**
-         * Sets the Filter that this Handler uses to filter Log Records
-         * <p>
-         * For each call of publish the Handler will call this Filter (if it
-         * is non-null) to check if the LogRecord should be published or
-         * discarded.
-         * @param filter <code>Filter</code> derived instance
-         */
-        virtual void setFilter( const Filter* filter ) = 0;
-
-        /**
-         * Gets the Filter that this Handler uses to filter Log Records
-         * @returns <code>Filter</code> derived instance
-         */
-        virtual const Filter* getFilter() = 0;
-
-        /**
-         * Set the log level specifying which message levels will be logged
-         * by this Handler.
-         * <p>
-         * The intention is to allow developers to turn on voluminous logging,
-         * but to limit the messages that are sent to certain Handlers.
-         * @param value Level enumeration value
-         */
-        virtual void setLevel( Level value ) = 0;
-
-        /**
-         * Get the log level specifying which message levels will be logged
-         * by this Handler.
-         * @returns Level enumeration value
-         */
-        virtual Level getLevel() = 0;
-
-        /**
-         * Sets the <code>Formatter</code> used by this Handler
-         * <p>
-         * Some Handlers may not use Formatters, in which case the
-         * Formatter will be remembered, but not used.
-         * @param formatter <code>Filter</code> derived instance
-         */
-        virtual void setFormatter( const Formatter* formatter ) = 0;
-
-        /**
-         * Gets the <code>Formatter</code> used by this Handler
-         * @returns <code>Filter</code> derived instance
-         */
-        virtual const Formatter* getFormatter() = 0;
-
-   };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_HANDLER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/LogManager.cpp b/src/decaf/src/main/decaf/util/logging/LogManager.cpp
deleted file mode 100644
index f4cc21d..0000000
--- a/src/decaf/src/main/decaf/util/logging/LogManager.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#include "LogManager.h"
-
-#include <decaf/util/logging/PropertiesChangeListener.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/util/Config.h>
-
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::util::logging;
-
-////////////////////////////////////////////////////////////////////////////////
-concurrent::Mutex LogManager::mutex;
-LogManager* LogManager::instance = NULL;
-unsigned int LogManager::refCount = 0;
-
-////////////////////////////////////////////////////////////////////////////////
-LogManager::~LogManager()
-{
-    // TODO - Delete all the loggers.
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogManager::setProperties( const Properties* properties )
-{
-    // Copy the properties
-    this->properties.copy(properties);
-
-    // Update the configuration of the loggers.
-    // TODO
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogManager::addPropertyChangeListener(
-    PropertyChangeListener* listener )
-{
-    if( find(listeners.begin(), listeners.end(), listener) == listeners.end() ) {
-        listeners.push_back( listener );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogManager::removePropertyChangeListener(
-    PropertyChangeListener* listener )
-{
-    listeners.remove( listener );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Logger* LogManager::getLogger( const std::string& name DECAF_UNUSED ) {
-    return NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-int LogManager::getLoggerNames( const std::vector<std::string>& names  DECAF_UNUSED ) {
-    return 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-LogManager* LogManager::getInstance() {
-
-    synchronized( &mutex ) {
-        if( instance == NULL ) {
-            instance = new LogManager();
-        }
-
-        refCount++;
-
-        return instance;
-    }
-
-    return NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogManager::returnInstance() {
-
-    synchronized( &mutex ) {
-        if( refCount == 0 ) {
-            return ;
-        }
-
-        refCount--;
-
-        if( refCount == 0 ) {
-            delete instance;
-            instance = NULL;
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogManager::destroy()
-{
-    if( instance != NULL ) {
-
-        synchronized( &mutex ) {
-            delete instance;
-            instance = NULL;
-            refCount = 0;
-        }
-    }
-}
diff --git a/src/decaf/src/main/decaf/util/logging/LogManager.h b/src/decaf/src/main/decaf/util/logging/LogManager.h
deleted file mode 100644
index 194ba55..0000000
--- a/src/decaf/src/main/decaf/util/logging/LogManager.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#ifndef _DECAF_UTIL_LOGGING_LOGMANAGER_H_
-#define _DECAF_UTIL_LOGGING_LOGMANAGER_H_
-
-#include <map>
-#include <list>
-#include <string>
-#include <vector>
-
-#include <decaf/util/Properties.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    class Logger;
-    class PropertyChangeListener;
-
-    /**
-     * There is a single global LogManager object that is used to maintain
-     * a set of shared state about Loggers and log services.
-     *
-     * This LogManager object:
-     *
-     *   * Manages a hierarchical namespace of Logger objects. All named
-     *     Loggers are stored in this namespace.
-     *   * Manages a set of logging control properties. These are simple
-     *     key-value pairs that can be used by Handlers and other logging
-     *     objects to configure themselves.
-     *
-     * The global LogManager object can be retrieved using
-     * LogManager.getLogManager(). The LogManager object is created during
-     * class initialization and cannot subsequently be changed.
-     *
-     * ***TODO****
-     * By default, the LogManager reads its initial configuration from a
-     * properties file "lib/logging.properties" in the JRE directory. If
-     * you edit that property file you can change the default logging
-     * configuration for all uses of that JRE.
-     *
-     * In addition, the LogManager uses two optional system properties that
-     * allow more control over reading the initial configuration:
-     *
-     *    * "decaf.logger.config.class"
-     *    * "decaf.logger.config.file"
-     *
-     * These two properties may be set via the Preferences API, or as
-     * command line property definitions to the "java" command, or as
-     * system property definitions passed to JNI_CreateJavaVM.
-     *
-     * If the "java.util.logging.config.class" property is set, then the
-     * property value is treated as a class name. The given class will be
-     * loaded, an object will be instantiated, and that object's constructor
-     * is responsible for reading in the initial configuration. (That object
-     * may use other system properties to control its configuration.) The
-     * alternate configuration class can use readConfiguration(InputStream)
-     * to define properties in the LogManager.
-     *
-     * If "java.util.logging.config.class" property is not set, then the
-     * "java.util.logging.config.file" system property can be used to specify
-     * a properties file (in java.util.Properties format). The initial
-     * logging configuration will be read from this file.
-     *
-     * If neither of these properties is defined then, as described above,
-     * the LogManager will read its initial configuration from a properties
-     * file "lib/logging.properties" in the JRE directory.
-     *
-     * The properties for loggers and Handlers will have names starting with
-     * the dot-separated name for the handler or logger.
-     * ***TODO****
-     *
-     * The global logging properties may include:
-     *
-     *    * A property "handlers". This defines a whitespace separated
-     *      list of class names for handler classes to load and register as
-     *      handlers on the root Logger (the Logger named ""). Each class
-     *      name must be for a Handler class which has a default constructor.
-     *      Note that these Handlers may be created lazily, when they are
-     *      first used.
-     *    * A property "<logger>.handlers". This defines a whitespace or
-     *      comma separated list of class names for handlers classes to load
-     *      and register as handlers to the specified logger. Each class name
-     *      must be for a Handler class which has a default constructor. Note
-     *      that these Handlers may be created lazily, when they are first
-     *      used.
-     *    * A property "<logger>.useParentHandlers". This defines a boolean
-     *      value. By default every logger calls its parent in addition to
-     *      handling the logging message itself, this often result in
-     *      messages being handled by the root logger as well. When setting
-     *      this property to false a Handler needs to be configured for this
-     *      logger otherwise no logging messages are delivered.
-     *    * A property "config". This property is intended to allow arbitrary
-     *      configuration code to be run. The property defines a whitespace
-     *      separated list of class names. A new instance will be created for
-     *      each named class. The default constructor of each class may
-     *      execute arbitrary code to update the logging configuration, such
-     *      as setting logger levels, adding handlers, adding filters, etc.
-     *
-     * Loggers are organized into a naming hierarchy based on their dot
-     * separated names. Thus "a.b.c" is a child of "a.b", but "a.b1" and
-     * a.b2" are peers.
-     *
-     * All properties whose names end with ".level" are assumed to define
-     * log levels for Loggers. Thus "foo.level" defines a log level for
-     * the logger called "foo" and (recursively) for any of its children
-     * in the naming hierarchy. Log Levels are applied in the order they
-     * are defined in the properties file. Thus level settings for child
-     * nodes in the tree should come after settings for their parents. The
-     * property name ".level" can be used to set the level for the root of
-     * the tree.
-     *
-     * All methods on the LogManager object are multi-thread safe.
-     */
-    class DECAF_API LogManager {
-    private:
-
-        // Change listener on this class's Properties
-        std::list<PropertyChangeListener*> listeners;
-
-        // Properties of the Log Manager
-        util::Properties properties;
-
-    public:
-
-        virtual ~LogManager();
-
-        /**
-         * Sets the Properties this LogManager should use to configure
-         * its loggers.  Once set a properties change event is fired.
-         * @param properties Pointer to read the configuration from
-         */
-        virtual void setProperties( const util::Properties* properties );
-
-        /**
-         * Gets a reference to the Logging Properties used by this
-         * logger.
-         * @returns The Logger Properties Pointer
-         */
-        virtual const util::Properties& getProperties() const {
-            return properties;
-        }
-
-        /**
-         * Gets the value of a named property of this LogManager
-         * @param name of the Property to retrieve
-         * @return the value of the property
-         */
-        virtual std::string getProperty( const std::string& name ) {
-            return properties.getProperty( name );
-        }
-
-        /**
-         * Adds a change listener for LogManager Properties, adding the same
-         * instance of a change event listener does nothing.
-         * @param listener a PropertyChangeListener
-         */
-        virtual void addPropertyChangeListener(
-            PropertyChangeListener* listener );
-
-        /**
-         * Removes a properties change listener from the LogManager.
-         * @param listener a PropertyChangeListener
-         */
-        virtual void removePropertyChangeListener(
-            PropertyChangeListener* listener );
-
-        /**
-         * Retrieves or creates a new Logger using the name specified
-         * a new logger inherits the configuration of the logger's
-         * parent if there is no configuration data for the logger.
-         * @param name The name of the Logger.
-         */
-        virtual Logger* getLogger( const std::string& name );
-
-        /**
-         * Gets a list of known Logger Names from this Manager
-         * @param names STL Vector to hold string logger names
-         * @return names count of how many loggers were inserted
-         */
-        virtual int getLoggerNames( const std::vector<std::string>& names );
-
-    public:     // Static Singleton Methods.
-
-        /**
-         * Get the singleton instance
-         * @return Pointer to an instance of the Log Manager
-         */
-        static LogManager* getInstance();
-
-        /**
-         * Returns a Checked out instance of this Manager
-         */
-        static void returnInstance();
-
-        /**
-         * Forcefully Delete the Instance of this LogManager
-         * even if there are outstanding references.
-         */
-        static void destroy();
-
-    protected:
-
-        /**
-         * Constructor, hidden to protect against direct instantiation
-         */
-        LogManager() {}
-
-        /**
-         * Copy Constructo
-         * @param manager the Manager to copy
-         */
-        LogManager( const LogManager& manager );
-
-        /**
-         * Assignment operator
-         * @param manager the manager to assign from
-         */
-        void operator=( const LogManager& manager );
-
-    private:
-
-        // Static mutex to protect the singleton methods
-        static concurrent::Mutex mutex;
-
-        // Static pointer to the one and only instance.
-        static LogManager* instance;
-
-        // Static counter for number of outstanding references
-        static unsigned int refCount;
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_LOGMANAGER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/LogRecord.h b/src/decaf/src/main/decaf/util/logging/LogRecord.h
deleted file mode 100644
index 942f586..0000000
--- a/src/decaf/src/main/decaf/util/logging/LogRecord.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_LOGRECORD_H_
-#define _DECAF_UTIL_LOGGING_LOGRECORD_H_
-
-#include <decaf/util/logging/LoggerCommon.h>
-#include <decaf/util/Config.h>
-
-#include <string>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    class DECAF_API LogRecord
-    {
-    private:
-
-        // Level of this Record
-        Level level;
-
-        // Name of the source Logger
-        std::string loggerName;
-
-        // Name of the File that originated the Log
-        std::string sourceFile;
-
-        // Line in the source file where log occured
-        unsigned long sourceLine;
-
-        // The message to Log.
-        std::string message;
-
-        // The function Name where the log occured
-        std::string functionName;
-
-        // Time in Mills since UTC that this Record was logged
-        unsigned long timeStamp;
-
-        // Thread Id of the Thread that logged this Record
-        unsigned long threadId;
-
-    public:
-
-        LogRecord() {}
-        virtual ~LogRecord() {}
-
-        /**
-         * Get Level of this log record
-         * @return Level enumeration value.
-         */
-        Level getLevel() const {
-            return level;
-        };
-
-        /**
-         * Set the Level of this Log Record
-         * @param value Level Enumeration Value
-         */
-        void setLevel( Level value ) {
-            level = value;
-        };
-
-        /**
-         * Gets the Source Logger's Name
-         * @return the source loggers name
-         */
-        const std::string& getLoggerName() const {
-            return loggerName;
-        };
-
-        /**
-         * Sets the Source Logger's Name
-         * @param loggerName the source loggers name
-         */
-        void setLoggerName( const std::string& loggerName ) {
-            this->loggerName = loggerName;
-        };
-
-        /**
-         * Gets the Source Log File name
-         * @return the source loggers name
-         */
-        const std::string& getSourceFile() const {
-            return sourceFile;
-        };
-
-        /**
-         * Sets the Source Log File Name
-         * @param loggerName the source loggers name
-         */
-        void setSourceFile( const std::string& sourceFile ) {
-            this->sourceFile = sourceFile;
-        };
-
-        /**
-         * Gets the Source Log line number
-         * @return the source loggers line number
-         */
-        unsigned long getSourceLine() const {
-            return sourceLine;
-        };
-
-        /**
-         * Sets the Source Log line number
-         * @param sourceLine the source logger's line number
-         */
-        void setSourceLine( long sourceLine ) {
-            this->sourceLine = sourceLine;
-        };
-
-        /**
-         * Gets the Message to be Logged
-         * @return the source logger's message
-         */
-        const std::string& getMessage() const {
-            return message;
-        };
-
-        /**
-         * Sets the Message to be Logged
-         * @param message the source loggers message
-         */
-        void setMessage( const std::string& message ) {
-            this->message = message;
-        };
-
-        /**
-         * Gets the name of the function where this log was logged
-         * @return the source logger's message
-         */
-        const std::string& getSourceFunction() const {
-            return functionName;
-         };
-
-        /**
-         * Sets the name of the function where this log was logged
-         * @param functionName the source of the log
-         */
-        void setSourceFunction( const std::string& functionName ) {
-            this->functionName = functionName;
-        };
-
-        /**
-         * Gets the time in mills that this message was logged.
-         * @return UTC time in milliseconds
-         */
-        unsigned long getTimestamp() const { return timeStamp; };
-
-        /**
-         * Sets the time in mills that this message was logged.
-         * @param timeStamp UTC Time in Milliseconds.
-         */
-        void setTimestamp( long timeStamp ) {
-            this->timeStamp = timeStamp;
-        };
-
-        /**
-         * Gets the Thread Id where this Log was created
-         * @return the source loggers line number
-         */
-        unsigned long getTreadId() const {
-            return threadId;
-        };
-
-        /**
-         * Sets the Thread Id where this Log was created
-         * @param threadId the source logger's line number
-         */
-        void setTreadId( long threadId ) {
-            this->threadId = threadId;
-        };
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_LOGRECORD_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/LogWriter.cpp b/src/decaf/src/main/decaf/util/logging/LogWriter.cpp
deleted file mode 100644
index 1bb649e..0000000
--- a/src/decaf/src/main/decaf/util/logging/LogWriter.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "LogWriter.h"
-
-#include <iostream>
-#include <decaf/lang/Thread.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Config.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-using namespace decaf::util::logging;
-
-////////////////////////////////////////////////////////////////////////////////
-concurrent::Mutex LogWriter::mutex;
-
-////////////////////////////////////////////////////////////////////////////////
-LogWriter::LogWriter(void)
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-LogWriter::~LogWriter(void)
-{
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogWriter::log(const std::string& file DECAF_UNUSED,
-                    const int          line DECAF_UNUSED,
-                    const std::string& prefix,
-                    const std::string& message)
-{
-   synchronized(&mutex)
-   {
-      cout << prefix  << " "
-           << message << " - tid: " << Thread::getId() << endl;
-   }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LogWriter::log(const std::string& message)
-{
-   synchronized(&mutex)
-   {
-      cout << message << " - tid: " << Thread::getId() << endl;
-   }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-LogWriter& LogWriter::getInstance(void)
-{
-    // This one instance
-    static LogWriter instance;
-
-    return instance;
-}
-
diff --git a/src/decaf/src/main/decaf/util/logging/LogWriter.h b/src/decaf/src/main/decaf/util/logging/LogWriter.h
deleted file mode 100644
index 676a339..0000000
--- a/src/decaf/src/main/decaf/util/logging/LogWriter.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_LOGWRITER_H_
-#define _DECAF_UTIL_LOGGING_LOGWRITER_H_
-
-#include <decaf/util/concurrent/Mutex.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-   class DECAF_API LogWriter
-   {
-   public:
-
-      LogWriter(void);
-      virtual ~LogWriter(void);
-
-      /**
-       * Writes a message to the output destination
-       * @param file
-       * @param line
-       * @param prefix
-       * @param message
-       */
-      virtual void log(const std::string& file,
-                       const int          line,
-                       const std::string& prefix,
-                       const std::string& message);
-
-      /**
-       * Writes a message to the output destination
-       * @param message
-       */
-      virtual void log(const std::string& message);
-
-   public:    // Static methods
-
-      /**
-       * Get the singleton instance
-       */
-      static LogWriter& getInstance();
-
-      /**
-       * Returns a Checked out instance of this Writer
-       */
-      static void returnInstance();
-
-      /**
-       * Forcefully Delete the Instance of this LogWriter
-       * even if there are outstanding references.
-       */
-      static void destroy();
-
-   private:
-
-      // Syncronization mutex
-      static concurrent::Mutex mutex;
-
-   };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_LOGWRITER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/Logger.cpp b/src/decaf/src/main/decaf/util/logging/Logger.cpp
deleted file mode 100644
index 6c54cb2..0000000
--- a/src/decaf/src/main/decaf/util/logging/Logger.cpp
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "Logger.h"
-
-#include <decaf/util/logging/Handler.h>
-#include <decaf/util/Config.h>
-#include <algorithm>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-using namespace decaf::util::logging;
-
-////////////////////////////////////////////////////////////////////////////////
-Logger::Logger( const std::string& name DECAF_UNUSED,
-                Logger* parent DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Logger::~Logger() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::addHandler( Handler* handler ) throw ( IllegalArgumentException ) {
-
-    if( handler == NULL )
-    {
-        IllegalArgumentException(
-            __FILE__, __LINE__,
-            "Logger::addHandler - HAndler cannot be null");
-    }
-
-    if( find( handlers.begin(), handlers.end(), handler) != handlers.end() )
-    {
-        handlers.push_back( handler );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::removeHandler( Handler* handler ) {
-
-    list<Handler*>::iterator itr =
-        find( handlers.begin(), handlers.end(), handler );
-
-    if( itr != handlers.end() ) {
-
-        delete *itr;
-        handlers.erase(itr);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::setFilter( Filter* filter DECAF_UNUSED ){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-bool Logger::isLoggable( Level level DECAF_UNUSED ) const{
-    return false;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::entry( const std::string& blockName DECAF_UNUSED,
-                    const std::string& file DECAF_UNUSED,
-                    const int line DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::exit(const std::string& blockName DECAF_UNUSED,
-                  const std::string& file DECAF_UNUSED,
-                  const int line DECAF_UNUSED) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::debug( const std::string& file DECAF_UNUSED,
-                    const int line DECAF_UNUSED,
-                    const std::string fnctionName DECAF_UNUSED,
-                    const std::string& message DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::info( const std::string& file DECAF_UNUSED,
-                   const int line DECAF_UNUSED,
-                   const std::string fnctionName DECAF_UNUSED,
-                   const std::string& message DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::error( const std::string& file DECAF_UNUSED,
-                    const int line DECAF_UNUSED,
-                    const std::string fnctionName DECAF_UNUSED,
-                    const std::string& message DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::warn( const std::string& file DECAF_UNUSED,
-                   const int line DECAF_UNUSED,
-                   const std::string fnctionName DECAF_UNUSED,
-                   const std::string& message DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::fatal( const std::string& file DECAF_UNUSED,
-                    const int line DECAF_UNUSED,
-                    const std::string fnctionName DECAF_UNUSED,
-                    const std::string& message DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::log( Level level DECAF_UNUSED,
-                  const std::string& message DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::log( Level level DECAF_UNUSED,
-                  const std::string& file DECAF_UNUSED,
-                  const int line DECAF_UNUSED,
-                  const std::string& message DECAF_UNUSED,
-                  lang::Exception& ex DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::log( Level level DECAF_UNUSED,
-                  const std::string& file DECAF_UNUSED,
-                  const int line DECAF_UNUSED,
-                  const std::string& message DECAF_UNUSED, ... ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void Logger::log( LogRecord& record DECAF_UNUSED ) {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Logger* Logger::getLogger( const std::string& name DECAF_UNUSED ) {
-    return NULL;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-Logger* Logger::getAnonymousLogger() {
-    return NULL;
-}
diff --git a/src/decaf/src/main/decaf/util/logging/Logger.h b/src/decaf/src/main/decaf/util/logging/Logger.h
deleted file mode 100644
index 9d46c7c..0000000
--- a/src/decaf/src/main/decaf/util/logging/Logger.h
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_LOGGER_H_
-#define _DECAF_UTIL_LOGGING_LOGGER_H_
-
-#include <decaf/util/logging/LoggerCommon.h>
-#include <decaf/util/logging/LogRecord.h>
-#include <decaf/lang/exceptions/IllegalArgumentException.h>
-#include <decaf/util/Config.h>
-
-#include <list>
-#include <string>
-#include <stdarg.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    class Handler;
-    class Filter;
-
-    class DECAF_API Logger
-    {
-    private:
-
-        // The name of this Logger
-        std::string name;
-
-        // The Parent of this Logger
-        Logger* parent;
-
-        // list of Handlers owned by this logger
-        std::list<Handler*> handlers;
-
-        // Filter used by this Logger
-        Filter* filter;
-
-        // The Log Level of this Logger
-        Level level;
-
-        // Using Parent Handlers?
-        bool useParentHandlers;
-
-    public:
-
-        /**
-         * Creates a new instance of the Logger with the given name
-         * and assign it the given parent logger.
-         * <p>
-         * The logger will be initially configured with a null Level
-         * and with useParentHandlers true.
-         * @param name - A name for the logger. This should be a
-         * dot-separated name and should normally be based on the package
-         * name or class name of the subsystem, such as java.net or
-         * javax.swing. It may be null for anonymous Loggers.
-         * @param parent logger that is this one's parent
-         */
-        Logger( const std::string& name, Logger* parent );
-
-        virtual ~Logger();
-
-        /**
-         * Gets the name of this Logger
-         * @return logger name
-         */
-        virtual const std::string& getName(void) const {
-            return name;
-        }
-
-        /**
-         * Add a log Handler to receive logging messages.
-         * <p>
-         * By default, Loggers also send their output to their parent logger.
-         * Typically the root Logger is configured with a set of Handlers
-         * that essentially act as default handlers for all loggers.
-         *
-         * @param handler A Logging Handler
-         * #throws IllegalArgumentException
-         */
-        virtual void addHandler( Handler* handler )
-            throw ( lang::exceptions::IllegalArgumentException );
-
-        /**
-         * Removes the specified Handler and destroys it
-         * <p>
-         * Returns silently if the given Handler is not found.
-         * @param handler The Handler to remove
-         */
-        virtual void removeHandler( Handler* handler );
-
-        /**
-         * Gets a vector containing all the handlers that this class
-         * has been assigned to use.
-         * @returns a list of handlers that are used by this logger
-         */
-        // virtual const std::list<Handler*>& getHandlers(void) const;
-
-        /**
-         * Set a filter to control output on this Logger.
-         * <p>
-         * After passing the initial "level" check, the Logger will call
-         * this Filter to check if a log record should really be published.
-         * <p>
-         * The caller releases ownership of this filter to this logger
-         * @param filter to use, can be null
-         */
-        virtual void setFilter( Filter* filter );
-
-        /**
-         * Gets the Filter object that this class is using.
-         * @return the Filter in use, can be null
-         */
-        virtual const Filter* getFilter() const {
-            return filter;
-        }
-
-        /**
-         * Get the log Level that has been specified for this Logger. The
-         * result may be the Null level, which means that this logger's
-         * effective level will be inherited from its parent.
-         * @return the level that is currently set
-         */
-        virtual Level getLevel() const {
-            return level;
-        }
-
-        /**
-         * Set the log level specifying which message levels will be logged
-         * by this logger. Message levels lower than this value will be
-         * discarded. The level value Level.OFF can be used to turn off
-         * logging.
-         * <p>
-         * If the new level is the Null Level, it means that this node
-         * should inherit its level from its nearest ancestor with a
-         * specific (non-null) level value.
-         * @param level new Level value
-         */
-        virtual void setLevel( Level level ) {
-            this->level = level;
-        }
-
-        /**
-         * Discover whether or not this logger is sending its output to
-         * its parent logger.
-         * @return true if using Parent Handlers
-         */
-        virtual bool getUseParentHandlers() const {
-            return useParentHandlers;
-        }
-
-        /**
-         * pecify whether or not this logger should send its output to it's
-         * parent Logger. This means that any LogRecords will also be
-         * written to the parent's Handlers, and potentially to its parent,
-         * recursively up the namespace.
-         * @param value True is output is to be writen to the parent
-         */
-        virtual void setUseParentHandlers( bool value ) {
-            this->useParentHandlers = value;
-        }
-
-        /**
-         * Logs an Block Enter message
-         * <p>
-         * This is a convenience method that is used to tag a block enter, a
-         * log record with the class name function name and the string
-         * Entering is logged at the DEBUG log level.
-         * @param blockName source block name
-         * @param file source file name
-         * @param line source line name
-         */
-        virtual void entry( const std::string& blockName,
-                            const std::string& file,
-                            const int line );
-
-        /**
-         * Logs an Block Exit message
-         * <p>
-         * This is a convenience method that is used to tag a block exit, a
-         * log record with the class name function name and the string
-         * Exiting is logged at the DEBUG log level.
-         * @param blockName source block name
-         * @param file source file name
-         * @param line source line name
-         */
-        virtual void exit( const std::string& blockName,
-                           const std::string& file,
-                           const int line );
-
-        /**
-         * Log a Debug Level Log
-         * <p>
-         * If the logger is currently enabled for the DEBUG message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects.
-         * @param file the file name where the log was generated
-         * @param line the line number where the log was generated
-         * @param functionName name of the function that logged this
-         * @param message the message to log
-         */
-        virtual void debug( const std::string& file,
-                            const int line,
-                            const std::string functionName,
-                            const std::string& message );
-
-        /**
-         * Log a info Level Log
-         * <p>
-         * If the logger is currently enabled for the info message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects.
-         *
-         * @param file the file name where the log was generated
-         * @param line the line number where the log was generated
-         * @param functionName name of the function that logged this
-         * @param message the message to log
-         */
-        virtual void info( const std::string& file,
-                           const int line,
-                           const std::string functionName,
-                           const std::string& message );
-
-        /**
-         * Log a warn Level Log
-         * <p>
-         * If the logger is currently enabled for the warn message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects.
-         * @param file the file name where the log was generated
-         * @param line the line number where the log was generated
-         * @param functionName name of the function that logged this
-         * @param message the message to log
-         */
-        virtual void warn( const std::string& file,
-                           const int line,
-                           const std::string functionName,
-                           const std::string& message );
-
-        /**
-         * Log a error Level Log
-         * <p>
-         * If the logger is currently enabled for the error message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects.
-         * @param file the file name where the log was generated
-         * @param line the line number where the log was generated
-         * @param fnctionName name of the function that logged this
-         * @param message the message to log
-         */
-        virtual void error( const std::string& file,
-                            const int line,
-                            const std::string fnctionName,
-                            const std::string& message );
-
-        /**
-         * Log a fatal Level Log
-         * <p>
-         * If the logger is currently enabled for the fatal message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects.
-         * @param file the file name where the log was generated
-         * @param line the line number where the log was generated
-         * @param fnctionName name of the function that logged this
-         * @param message the message to log
-         */
-        virtual void fatal( const std::string& file,
-                            const int line,
-                            const std::string functionName,
-                            const std::string& message );
-
-        /**
-         * Log a Throw Message
-         * <p>
-         * If the logger is currently enabled for the Throwing message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects.
-         * @param file the file name where the log was generated
-         * @param line the line number where the log was generated
-         * @param fnctionName name of the function that logged this
-         * @param message the message to log
-        virtual void throwing( const std::string& file,
-                               const int line,
-                               const std::string fnctionName,
-                               const std::string& message );
-         */
-
-        /**
-         * Check if a message of the given level would actually be logged
-         * by this logger. This check is based on the Loggers effective
-         * level, which may be inherited from its parent.
-         * @param level - a message logging level
-         * @returns true if the given message level is currently being logged.
-         */
-        virtual bool isLoggable( Level level ) const;
-
-        /**
-         * Log a LogRecord.
-         * All the other logging methods in this class call through this
-         * method to actually perform any logging. Subclasses can override
-         * this single method to capture all log activity.
-         * @param record - the LogRecord to be published
-         */
-        virtual void log( LogRecord& record );
-
-        /**
-         * Log a message, with no arguments.
-         * <p>
-         * If the logger is currently enabled for the given message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects
-         * @param level the Level to log at
-         * @param message the message to log
-         */
-        virtual void log( Level level, const std::string& message );
-
-        /**
-         * Log a message, with the list of params that is formatted into
-         * the message string.
-         * <p>
-         * If the logger is currently enabled for the given message level
-         * then the given message is forwarded to all the registered output
-         * Handler objects
-         * @param level the Level to log at
-         * @param file the message to log
-         * @param line the line in the file
-         * @param variable length arguement to format the message string.
-         */
-        virtual void log( Level level,
-                          const std::string& file,
-                          const int line,
-                          const std::string& message, ... );
-
-        /**
-         * Log a message, with associated Throwable information.
-         * If the logger is currently enabled for the given message level
-         * then the given arguments are stored in a LogRecord which is
-         * forwarded to all registered output handlers.
-         * Note that the thrown argument is stored in the LogRecord thrown
-         * property, rather than the LogRecord parameters property. Thus is
-         * it processed specially by output Formatters and is not treated
-         * as a formatting parameter to the LogRecord message property.
-         * @param level the Level to log at
-         * @param file File that the message was logged in
-         * @param line the line number where the message was logged at.
-         * @param ex the Exception to log
-         */
-        virtual void log( Level level,
-                          const std::string& file,
-                          const int line,
-                          const std::string& message,
-                          lang::Exception& ex );
-
-    public:
-
-        /**
-         * Creates an anonymous logger
-         * <p>
-         * The newly created Logger is not registered in the LogManager
-         * namespace. There will be no access checks on updates to the
-         * logger.
-         * Even although the new logger is anonymous, it is configured to
-         * have the root logger ("") as its parent. This means that by
-         * default it inherits its effective level and handlers from the
-         * root logger.
-         * <p>
-         * The caller is responsible for destroying the returned logger.
-         * @return Newly created anonymous logger
-         */
-        static Logger* getAnonymousLogger();
-
-        /**
-         * Find or create a logger for a named subsystem. If a logger has
-         * already been created with the given name it is returned.
-         * Otherwise a new logger is created.
-         * <p>
-         * If a new logger is created its log level will be configured based
-         * on the LogManager and it will configured to also send logging
-         * output to its parent loggers Handlers. It will be registered in
-         * the LogManager global namespace.
-         * @param name - A name for the logger. This should be a
-         * dot-separated name and should normally be based on the package
-         * name or class name of the subsystem, such as cms or
-         * activemq.core.ActiveMQConnection
-         * @return a suitable logger.
-         */
-        static Logger* getLogger( const std::string& name );
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_LOGGER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/LoggerCommon.h b/src/decaf/src/main/decaf/util/logging/LoggerCommon.h
deleted file mode 100644
index a660e8b..0000000
--- a/src/decaf/src/main/decaf/util/logging/LoggerCommon.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_LOGGERCOMMON_H_
-#define _DECAF_UTIL_LOGGING_LOGGERCOMMON_H_
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    /**
-     * Defines an enumeration for logging levels
-     */
-    enum Level
-    {
-        Off,
-        Null,
-        Markblock,
-        Debug,
-        Info,
-        Warn,
-        Error,
-        Fatal,
-        Throwing
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_LOGGERCOMMON_H_ */
diff --git a/src/decaf/src/main/decaf/util/logging/LoggerDefines.h b/src/decaf/src/main/decaf/util/logging/LoggerDefines.h
deleted file mode 100644
index 83d7047..0000000
--- a/src/decaf/src/main/decaf/util/logging/LoggerDefines.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_LOGGERDEFINES_H_
-#define _DECAF_UTIL_LOGGING_LOGGERDEFINES_H_
-
-#include <decaf/util/logging/SimpleLogger.h>
-#include <sstream>
-
-#define LOGDECAF_DECLARE(loggerName)                                  \
-   static decaf::util::logging::SimpleLogger loggerName;
-
-#define LOGDECAF_INITIALIZE(loggerName, className, loggerFamily)      \
-   decaf::util::logging::SimpleLogger className::loggerName(loggerFamily);
-
-#define LOGDECAF_DECLARE_LOCAL(loggerName)                            \
-   decaf::util::logging::Logger loggerName;
-
-#define LOGDECAF_DEBUG(logger, message)                               \
-   logger.debug(__FILE__, __LINE__, message);
-
-#define LOGDECAF_DEBUG_1(logger, message, value);                     \
-   {                                                                  \
-      std::ostringstream ostream;                                     \
-      ostream << message << value;                                    \
-      logger.debug(__FILE__, __LINE__, ostream.str());                \
-   }
-
-#define LOGDECAF_INFO(logger, message)                                \
-   logger.info(__FILE__, __LINE__, message);
-
-#define LOGDECAF_ERROR(logger, message)                               \
-   logger.error(__FILE__, __LINE__, message);
-
-#define LOGDECAF_WARN(logger, message)                                \
-   logger.warn(__FILE__, __LINE__, message);
-
-#define LOGDECAF_FATAL(logger, message)                               \
-   logger.fatal(__FILE__, __LINE__, message);
-
-
-#endif
diff --git a/src/decaf/src/main/decaf/util/logging/LoggerHierarchy.cpp b/src/decaf/src/main/decaf/util/logging/LoggerHierarchy.cpp
deleted file mode 100644
index e1c5a59..0000000
--- a/src/decaf/src/main/decaf/util/logging/LoggerHierarchy.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-
-#include "LoggerHierarchy.h"
-
-using namespace decaf::util::logging;
-
-////////////////////////////////////////////////////////////////////////////////
-LoggerHierarchy::LoggerHierarchy(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-LoggerHierarchy::~LoggerHierarchy(){
-}
-
diff --git a/src/decaf/src/main/decaf/util/logging/LoggerHierarchy.h b/src/decaf/src/main/decaf/util/logging/LoggerHierarchy.h
deleted file mode 100644
index b63353d..0000000
--- a/src/decaf/src/main/decaf/util/logging/LoggerHierarchy.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements.  See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-#ifndef _DECAF_UTIL_LOGGING_LOGGERHIERARCHY_H_
-#define _DECAF_UTIL_LOGGING_LOGGERHIERARCHY_H_
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    class LoggerHierarchy
-    {
-    public:
-
-        LoggerHierarchy();
-        virtual ~LoggerHierarchy();
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_LOGGERHIERARCHY_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/MarkBlockLogger.h b/src/decaf/src/main/decaf/util/logging/MarkBlockLogger.h
deleted file mode 100644
index ea304b2..0000000
--- a/src/decaf/src/main/decaf/util/logging/MarkBlockLogger.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_MARKBLOCKLOGGER_H_
-#define _DECAF_UTIL_LOGGING_MARKBLOCKLOGGER_H_
-
-#include <decaf/util/logging/Logger.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    /**
-     * Defines a class that can be used to mark the entry and exit from
-     * scoped blocks.
-     * <p>
-     * Create an instance of this class at the start of a scoped block,
-     * passing it the logger to use and the name of the block.  The block
-     * entry and exit will be marked using the scope name, logger to the
-     * logger at the MARKBLOCK log level.
-     */
-    class DECAF_API MarkBlockLogger
-    {
-    private:
-
-        // Pointer to the Logger to use for Logging
-        Logger* logger;
-
-        // Block Name to Log
-        std::string blockName;
-
-    public:
-
-        /**
-         * Constructor - Marks Block entry
-         * @param logger Logger to use
-         * @param blockName Block name
-         */
-        MarkBlockLogger(Logger* logger, const std::string& blockName)
-        {
-            this->logger = logger;
-            this->blockName = blockName;
-
-            logger.mark(blockName + " - Entered");
-        }
-
-        virtual ~MarkBlockLogger(void)
-        {
-            logger->mark(blockName + " - Exited");
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_MARKBLOCKLOGGER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/PropertiesChangeListener.h b/src/decaf/src/main/decaf/util/logging/PropertiesChangeListener.h
deleted file mode 100644
index 2997431..0000000
--- a/src/decaf/src/main/decaf/util/logging/PropertiesChangeListener.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_PROPERTIESCHANGELISTENER_H_
-#define _DECAF_UTIL_LOGGING_PROPERTIESCHANGELISTENER_H_
-
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-   /**
-    * Defines the interface that classes can use to listen for change
-    * events on Properties.
-    */
-   class DECAF_API PropertiesChangeListener
-   {
-   public:
-
-      virtual ~PropertiesChangeListener() {}
-
-      /**
-       * Change Event, called when a property is changed
-       * @param name - Name of the Property
-       * @param oldValue - Old Value of the Property
-       * @param newValue - New Value of the Property
-       */
-      virtual void onPropertyChanged( const std::string& name,
-                                      const std::string& oldValue,
-                                      const std::string& newValue ) = 0;
-
-   };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_PROPERTIESCHANGELISTENER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/SimpleFormatter.h b/src/decaf/src/main/decaf/util/logging/SimpleFormatter.h
deleted file mode 100644
index e7513a9..0000000
--- a/src/decaf/src/main/decaf/util/logging/SimpleFormatter.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_SIMPLEFORMATTER_H_
-#define _DECAF_UTIL_LOGGING_SIMPLEFORMATTER_H_
-
-#include <decaf/util/logging/formatter.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    /**
-     * Print a brief summary of the LogRecord in a human readable format.
-     * The summary will typically be 1 or 2 lines.
-     */
-    class DECAF_API SimpleFormatter : public Formatter {
-    public:
-
-        SimpleFormatter() {}
-        virtual ~SimpleFormatter() {}
-
-        /**
-         * Format the given log record and return the formatted string.
-         * @param record The Log Record to Format
-         */
-        virtual std::string format( const LogRecord& record ) const {
-            return "";
-        }
-
-        /**
-         * Format the message string from a log record.
-         * @param record The Log Record to Format
-         */
-         virtual std::string formatMessage( const LogRecord& record ) const{
-            return record.getMessage();
-        }
-
-        /**
-         * Return the header string for a set of formatted records.  In the
-         * default implementation this method should return empty string
-         * @param handler the target handler, can be null
-         * @return empty string
-         */
-        virtual std::string getHead( const Handler* handler ) {
-            return "";
-        }
-
-        /**
-         * Return the tail string for a set of formatted records.  In the
-         * default implementation this method should return empty string
-         * @param handler the target handler, can be null
-         * @return empty string
-         */
-        virtual std::string getTail( const Handler* handler ) {
-            return "";
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_SIMPLEFORMATTER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/SimpleLogger.cpp b/src/decaf/src/main/decaf/util/logging/SimpleLogger.cpp
deleted file mode 100644
index 1fc0840..0000000
--- a/src/decaf/src/main/decaf/util/logging/SimpleLogger.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#include "SimpleLogger.h"
-
-#include <iostream>
-#include <decaf/util/logging/LogWriter.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util::concurrent;
-using namespace decaf::util::logging;
-
-////////////////////////////////////////////////////////////////////////////////
-SimpleLogger::SimpleLogger( const std::string& name )
-{
-    this->name = name;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-SimpleLogger::~SimpleLogger()
-{}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::mark( const std::string& message ) {
-    LogWriter::getInstance().log( "", 0, "", message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::debug( const std::string& file,
-                          const int          line,
-                          const std::string& message ) {
-    LogWriter::getInstance().log( file, line, "DEBUG:", message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::info( const std::string& file,
-                         const int          line,
-                         const std::string& message ) {
-    LogWriter::getInstance().log( file, line, "INFO:", message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::warn( const std::string& file,
-                         const int          line,
-                         const std::string& message ) {
-    LogWriter::getInstance().log( file, line, "WARNING:", message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::error( const std::string& file,
-                          const int          line,
-                          const std::string& message ) {
-    LogWriter::getInstance().log( file, line, "ERROR:", message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::fatal( const std::string& file,
-                          const int          line,
-                          const std::string& message ) {
-    LogWriter::getInstance().log( file, line, "FATAL:", message );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SimpleLogger::log(const std::string& message ) {
-    LogWriter::getInstance().log( message );
-}
diff --git a/src/decaf/src/main/decaf/util/logging/SimpleLogger.h b/src/decaf/src/main/decaf/util/logging/SimpleLogger.h
deleted file mode 100644
index 2ef0d89..0000000
--- a/src/decaf/src/main/decaf/util/logging/SimpleLogger.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_SIMPLELOGGER_H_
-#define _DECAF_UTIL_LOGGING_SIMPLELOGGER_H_
-
-#include <string>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-   class DECAF_API SimpleLogger
-   {
-   public:
-
-      /**
-       * Constructor
-       */
-      SimpleLogger( const std::string& name );
-
-      /**
-       * Destructor
-       */
-      virtual ~SimpleLogger();
-
-      /**
-       * Log a Mark Block Level Log
-       */
-      virtual void mark(const std::string& message);
-
-      /**
-       * Log a Debug Level Log
-       */
-      virtual void debug(const std::string& file,
-                         const int          line,
-                         const std::string& message);
-
-      /**
-       * Log a Informational Level Log
-       */
-      virtual void info(const std::string& file,
-                        const int          line,
-                        const std::string& message);
-
-      /**
-       * Log a Warning Level Log
-       */
-      virtual void warn(const std::string& file,
-                        const int          line,
-                        const std::string& message);
-
-      /**
-       * Log a Error Level Log
-       */
-      virtual void error(const std::string& file,
-                         const int          line,
-                         const std::string& message);
-
-      /**
-       * Log a Fatal Level Log
-       */
-      virtual void fatal(const std::string& file,
-                         const int          line,
-                         const std::string& message);
-
-      /**
-       * No-frills log.
-       */
-      virtual void log(const std::string& message);
-
-   private:
-
-      // Name of this Logger
-      std::string name;
-
-   };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_SIMPLELOGGER_H_*/
diff --git a/src/decaf/src/main/decaf/util/logging/StreamHandler.h b/src/decaf/src/main/decaf/util/logging/StreamHandler.h
deleted file mode 100644
index b03087c..0000000
--- a/src/decaf/src/main/decaf/util/logging/StreamHandler.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_LOGGING_STREAMHANDLER_H_
-#define _DECAF_UTIL_LOGGING_STREAMHANDLER_H_
-
-#include <decaf/util/logging/LoggerCommon.h>
-#include <decaf/util/logging/Handler.h>
-#include <decaf/util/logging/Formatter.h>
-#include <decaf/util/logging/Filter.h>
-#include <decaf/io/OutputStream.h>
-#include <decaf/kang/exceptions/NullPointerException.h>
-#include <decaf/lang/exceptions/InvalidStateException.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace logging{
-
-    class DECAF_API StreamHandler : public Handler {
-    private:
-
-        // OutputStream to write to
-        io::OutputStream* stream;
-
-        // Formats this Handlers output
-        Formatter* formatter;
-
-        // Filter object for Log Filtering
-        Filter* filter;
-
-    public:
-
-        /**
-         * Create a StreamHandler, with no current output stream.
-         */
-        StreamHandler() {
-            this->stream = NULL;
-            this->formatter = NULL;
-            this->filter = NULL;
-
-            this->level = Level::FATAL;  // We take everything by default
-        }
-
-        /**
-         * Create a StreamHandler, with no current output stream.
-         */
-        StreamHandler( io::OutputStream* stream, Formatter* formatter )
-        {
-            this->stream = stream;
-            this->formatter = formatter;
-            this->filter = NULL;
-
-           this->level = Level::Fatal;  // We take everything by default
-        }
-
-        /**
-         * Destructor
-         */
-        virtual ~StreamHandler() {
-            try {
-                this->close();
-            }
-            AMQ_CATCH_NOTHROW( lang::Exception)
-            AMQ_CATCALL_NOTHROW()
-        }
-
-        /**
-         * Close the current output stream.
-         * <p>
-         * The close method will perform a flush and then close the Handler.
-         * After close has been called this Handler  should no longer be used.
-         * Method calls may either be silently ignored or may throw runtime
-         * exceptions.
-         * @throw CMSException
-         */
-        virtual void close() throw ( cms::CMSException ) {
-            if( stream ) {
-                stream.flush();
-                stream.close();
-            }
-        }
-
-        /**
-         * Flush the Handler's output, clears any buffers.
-         */
-        virtual void flush() {
-            if(stream) {
-                stream->flush();
-            }
-        }
-
-        /**
-         * Publish the Log Record to this Handler
-         * @param The Log Record to Publish
-         */
-        virtual void publish( const LogRecord& record ) {
-
-            try {
-
-                if( !stream ) {
-                    throw lang::exceptions::NullPointerException(
-                        __FILE__, __LINE__,
-                        "StreamHandler::publish - Stream not set.");
-                }
-
-                // Check if we should log this record
-                if(isLoggable( record) ) {
-
-                    std::string log = formatter->format(record);
-
-                    synchronized(stream) {
-                        // Write the data to the stream
-                        stream->write(log.c_str(), log.length());
-                    }
-                }
-            }
-            AMQ_CATCH_RETHROW( lang::Exception )
-            AMQ_CATCHALL_THROW( lang::Exception )
-        }
-
-        /**
-         * Check if this Handler would actually log a given LogRecord.
-         * <p>
-         * @param <code>LogRecord</code> to check
-         */
-        virtual void isLoggable( const LogRecord& record ) {
-
-            if( filter ) {
-                // Allow for some filtering to occurr
-                return filter->isLoggable( record );
-            }
-
-            // By default we want everything that is greater than or
-            // equal to the set level of this Handler.
-            return record.level >= level;
-        }
-
-        /**
-         * Sets the Filter that this Handler uses to filter Log Records
-         * @param <code>Filter</code> derived instance
-         */
-        virtual void setFilter( const Filter* filter ){
-            this->filter = filter;
-        }
-
-        /**
-         * Gets the Filter that this Handler uses to filter Log Records
-         * @param <code>Filter</code> derived instance
-         */
-        virtual const Filter* getFilter(){
-            return filter;
-        }
-
-        /**
-         * Set the log level specifying which message levels will be logged
-         * by this Handler.
-         * <p>
-         * The intention is to allow developers to turn on voluminous logging,
-         * but to limit the messages that are sent to certain Handlers.
-         * @param Level enumeration value
-         */
-        virtual void setLevel( Level level ){
-            this->level = level;
-        }
-
-        /**
-         * Get the log level specifying which message levels will be logged
-         * by this Handler.
-         * @param Level enumeration value
-         */
-        virtual Level getLevel(){
-            return level;
-        }
-
-        /**
-         * Sets the <code>Formatter</code> used by this Handler
-         * @param <code>Filter</code> derived instance
-         */
-        virtual void setFormatter( const Formatter* formatter ){
-            this->formatter = formatter;
-        }
-
-        /**
-         * Gets the <code>Formatter</code> used by this Handler
-         * @param <code>Filter</code> derived instance
-         */
-        virtual const Formatter* getFormatter(){
-            return formatter;
-        }
-
-        /**
-         * Gets the output Stream that this Handler is using
-         * @return OuputStream pointer
-         */
-        virtual io::OutputStream* getOutputStream() const(
-            return stream;
-        }
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_LOGGING_STREAMHANDLER_H_*/
diff --git a/src/decaf/src/test-benchmarks/Makefile.am b/src/decaf/src/test-benchmarks/Makefile.am
deleted file mode 100644
index d5f203a..0000000
--- a/src/decaf/src/test-benchmarks/Makefile.am
+++ /dev/null
@@ -1,50 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-cc_sources = \
-  decaf/lang/BooleanBenchmark.cpp \
-  decaf/util/PropertiesBenchmark.cpp \
-  decaf/util/QueueBenchmark.cpp \
-  decaf/util/SetBenchmark.cpp \
-  decaf/util/MapBenchmark.cpp \
-  decaf/io/DataInputStreamBenchmark.cpp \
-  decaf/io/DataOutputStreamBenchmark.cpp \
-  benchmark/PerformanceTimer.cpp \
-  testRegistry.cpp \
-  main.cpp
-
-hh_sources = \
-  decaf/lang/BooleanBenchmark.h \
-  decaf/util/PropertiesBenchmark.h \
-  decaf/util/QueueBenchmark.h \
-  decaf/util/SetBenchmark.h \
-  decaf/util/MapBenchmark.h \
-  decaf/io/DataInputStreamBenchmark.h \
-  decaf/io/DataOutputStreamBenchmark.h \
-  benchmark/BenchmarkBase.h \
-  benchmark/PerformanceTimer.h
-
-## Compile this as part of make check
-check_PROGRAMS = decaf-test-benchmarks
-
-## 
-## Compiler/Linker Options
-##
-decaf_test_benchmarks_SOURCES = $(cc_sources)
-decaf_test_benchmarks_CXXFLAGS = $(DECAF_TEST_CXXFLAGS) -I$(srcdir)/../main @CPPUNIT_CFLAGS@
-decaf_test_benchmarks_LDADD= $(DECAF_TEST_LIBS) @CPPUNIT_LIBS@
-
diff --git a/src/decaf/src/test-benchmarks/benchmark/BenchmarkBase.h b/src/decaf/src/test-benchmarks/benchmark/BenchmarkBase.h
deleted file mode 100644
index 946b805..0000000
--- a/src/decaf/src/test-benchmarks/benchmark/BenchmarkBase.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _BENCHMARK_BENCHMARKBASE_H_
-#define _BENCHMARK_BENCHMARKBASE_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-#include <decaf/lang/Runnable.h>
-#include <benchmark/PerformanceTimer.h>
-#include <string>
-
-namespace benchmark{
-
-    template < class NAME, class TARGET, int ITERATIONS = 100 >
-    class BenchmarkBase : public decaf::lang::Runnable,
-                          public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( NAME );
-        CPPUNIT_TEST( runBenchmark );
-        CPPUNIT_TEST_SUITE_END();
-
-    private:
-
-        PerformanceTimer timer;
-
-    public:
-
-        virtual ~BenchmarkBase() {}
-
-        int getIterations() const {
-            return ITERATIONS;
-        }
-
-        void runBenchmark(){
-
-            for( int i = 0; i < ITERATIONS; ++i ){
-                timer.start();
-                this->run();
-                timer.stop();
-            }
-
-            std::cout << typeid( TARGET ).name() << " Benchmark Time = "
-                      << timer.getAverageTime() << " Millisecs"
-                      << std::endl;
-        }
-
-    };
-
-}
-
-#endif /*_BENCHMARK_BENCHMARKBASE_H_*/
diff --git a/src/decaf/src/test-benchmarks/benchmark/PerformanceTimer.cpp b/src/decaf/src/test-benchmarks/benchmark/PerformanceTimer.cpp
deleted file mode 100644
index a21cbb5..0000000
--- a/src/decaf/src/test-benchmarks/benchmark/PerformanceTimer.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "PerformanceTimer.h"
-
-#include <decaf/util/Date.h>
-
-using namespace std;
-using namespace benchmark;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-PerformanceTimer::PerformanceTimer(){
-    this->numberOfRuns = 0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-PerformanceTimer::~PerformanceTimer(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void PerformanceTimer::start(){
-    this->startTime = Date::getCurrentTimeMilliseconds();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void PerformanceTimer::stop(){
-
-    this->endTime = Date::getCurrentTimeMilliseconds();
-    times.push_back( endTime - startTime );
-    numberOfRuns++;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void PerformanceTimer::reset(){
-    this->startTime = 0;
-    this->endTime = 0;
-    this->times.clear();
-}
-
-////////////////////////////////////////////////////////////////////////////////
-long long PerformanceTimer::getAverageTime() const{
-
-    std::vector<long long>::const_iterator iter = times.begin();
-    long long totalTime = 0;
-
-    do{
-        totalTime += *iter;
-    } while( ++iter != times.end() );
-
-    if( totalTime == 0 || numberOfRuns == 0 ) {
-        return 0;
-    }
-
-    return totalTime / numberOfRuns;
-}
diff --git a/src/decaf/src/test-benchmarks/benchmark/PerformanceTimer.h b/src/decaf/src/test-benchmarks/benchmark/PerformanceTimer.h
deleted file mode 100644
index 0af0ff6..0000000
--- a/src/decaf/src/test-benchmarks/benchmark/PerformanceTimer.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _BENCHMARK_PERFORMANCETIMER_H_
-#define _BENCHMARK_PERFORMANCETIMER_H_
-
-#include <decaf/util/Config.h>
-#include <vector>
-
-namespace benchmark{
-
-    /**
-     * This class is used to aid in testing the performace of code.  This class
-     * maintains a running list of performance numbers for successive calls to
-     * the method start and stop.  Once the desired number of tests has been run,
-     * the user can call getAverageTime to find out the average time it took for
-     * all start / stop cycles.
-     */
-    class PerformanceTimer {
-    private:
-
-        long long numberOfRuns;
-        std::vector<long long> times;
-        long long startTime;
-        long long endTime;
-
-    public:
-
-        PerformanceTimer();
-        virtual ~PerformanceTimer();
-
-        /**
-         * Starts the timer, time is from the call to start until a call
-         * to stop is made.
-         */
-        void start();
-
-        /**
-         * Stops the timer and records the latest time.
-         */
-        void stop();
-
-        /**
-         * Resets the Timer to an unused state all data is thrown out.
-         */
-        void reset();
-
-        /**
-         * Gets the number of runs made so far
-         * @returns unsigned int that counts the number of runs
-         */
-        unsigned int getNumberOfRuns() const {
-            return numberOfRuns;
-        }
-
-        /**
-         * Gets the overall average time that the count has recoreded
-         * for all start / stop cycles.
-         * @returns the average time for all the runs times / numberOfRuns
-         */
-        long long getAverageTime() const;
-
-    };
-
-}
-
-#endif /*_PERFORMANCETIMER_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/io/DataInputStreamBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/io/DataInputStreamBenchmark.cpp
deleted file mode 100644
index d5ebf2f..0000000
--- a/src/decaf/src/test-benchmarks/decaf/io/DataInputStreamBenchmark.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "DataInputStreamBenchmark.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-
-////////////////////////////////////////////////////////////////////////////////
-DataInputStreamBenchmark::DataInputStreamBenchmark(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataInputStreamBenchmark::setUp(){
-
-    buffer = new unsigned char[bufferSize];
-
-    // init to full String Buffer
-    for( int ix = 0; ix < bufferSize - 1; ++ix ) {
-        buffer[ix] = 65;
-    }
-    buffer[bufferSize-1] = 0;
-    bis.setByteArray( buffer, bufferSize );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataInputStreamBenchmark::tearDown(){
-
-    delete buffer;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataInputStreamBenchmark::run(){
-
-    DataInputStream dis( &bis );
-
-    bool boolResult = 0;
-    char charResult = 0;
-    unsigned char byteResult = 0;
-    unsigned short ushortResult = 0;
-    short shortResult = 0;
-    int intResult = 0;
-    long long longResult = 0;
-    double doubleResult = 0.0;
-    float floatResult = 0.0f;
-    std::string stringResult = "";
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( boolResult ); ++iy ){
-        boolResult = dis.readBoolean();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( charResult ); ++iy ){
-        charResult = dis.readChar();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( byteResult ); ++iy ){
-        byteResult = dis.readByte();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( ushortResult ); ++iy ){
-        ushortResult = dis.readUnsignedShort();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( shortResult ); ++iy ){
-        shortResult = dis.readShort();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( intResult ); ++iy ){
-        intResult = dis.readInt();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( longResult ); ++iy ){
-        longResult = dis.readLong();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( floatResult ); ++iy ){
-        floatResult = dis.readFloat();
-    }
-    bis.reset();
-
-    for( size_t iy = 0; iy < bufferSize / sizeof( doubleResult ); ++iy ){
-        doubleResult = dis.readDouble();
-    }
-    bis.reset();
-
-    for( int i = 0; i < 5; ++i ) {
-        stringResult = dis.readString();
-        bis.reset();
-    }
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/io/DataInputStreamBenchmark.h b/src/decaf/src/test-benchmarks/decaf/io/DataInputStreamBenchmark.h
deleted file mode 100644
index b166895..0000000
--- a/src/decaf/src/test-benchmarks/decaf/io/DataInputStreamBenchmark.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_DATAINPUTSTREAMBENCHMARK_H_
-#define _DECAF_IO_DATAINPUTSTREAMBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-#include <decaf/io/DataInputStream.h>
-#include <decaf/io/ByteArrayInputStream.h>
-
-namespace decaf{
-namespace io{
-
-    class DataInputStreamBenchmark :
-        public benchmark::BenchmarkBase<
-            decaf::io::DataInputStreamBenchmark, DataInputStream >
-    {
-    private:
-
-        unsigned char* buffer;
-        static const int bufferSize = 200000;
-        ByteArrayInputStream bis;
-
-    public:
-
-        DataInputStreamBenchmark();
-        virtual ~DataInputStreamBenchmark() {}
-
-        virtual void setUp();
-        virtual void tearDown();
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_IO_DATAINPUTSTREAMBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/io/DataOutputStreamBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/io/DataOutputStreamBenchmark.cpp
deleted file mode 100644
index 1116b38..0000000
--- a/src/decaf/src/test-benchmarks/decaf/io/DataOutputStreamBenchmark.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "DataOutputStreamBenchmark.h"
-#include <decaf/io/ByteArrayOutputStream.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::io;
-
-////////////////////////////////////////////////////////////////////////////////
-DataOutputStreamBenchmark::DataOutputStreamBenchmark(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStreamBenchmark::setUp(){
-
-    for( size_t i = 0; i < 8096; ++i ) {
-        testString += 'a';
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DataOutputStreamBenchmark::run(){
-
-    std::vector<unsigned char> outputBuffer;
-    int numRuns = 500;
-
-    ByteArrayOutputStream bos( outputBuffer );
-    DataOutputStream dos( &bos );
-
-    for( int iy = 0; iy < numRuns * 40; ++iy ){
-        dos.writeLong( 0xFF00FF00FF00FF00LL );
-    }
-    for( int iy = 0; iy < numRuns * 40; ++iy ){
-        dos.writeInt( 312568 );
-    }
-    for( int iy = 0; iy < numRuns * 40; ++iy ){
-        dos.writeShort( 12568 );
-    }
-    for( int iy = 0; iy < numRuns * 40; ++iy ){
-        dos.writeUnsignedShort( 12568 );
-    }
-    for( int iy = 0; iy < numRuns * 40; ++iy ){
-        dos.writeBoolean( true );
-    }
-    for( int iy = 0; iy < numRuns * 40; ++iy ){
-        dos.writeDouble( 10.34235234 );
-    }
-    for( int iy = 0; iy < numRuns + 40; ++iy ){
-        dos.writeFloat( 32.4f );
-    }
-
-    outputBuffer.clear();
-
-    for( int iy = 0; iy < numRuns; ++iy ){
-        dos.writeChars( testString );
-        outputBuffer.clear();
-    }
-    for( int iy = 0; iy < numRuns; ++iy ){
-        dos.writeBytes( testString );
-        outputBuffer.clear();
-    }
-    for( int iy = 0; iy < numRuns; ++iy ){
-        dos.writeUTF( testString );
-        outputBuffer.clear();
-    }
-
-    outputBuffer.clear();
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/io/DataOutputStreamBenchmark.h b/src/decaf/src/test-benchmarks/decaf/io/DataOutputStreamBenchmark.h
deleted file mode 100644
index cc9d07d..0000000
--- a/src/decaf/src/test-benchmarks/decaf/io/DataOutputStreamBenchmark.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_DATAOUTPUTSTREAMBENCHMARK_H_
-#define _DECAF_IO_DATAOUTPUTSTREAMBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-#include <decaf/io/DataOutputStream.h>
-
-namespace decaf{
-namespace io{
-
-    class DataOutputStreamBenchmark :
-        public benchmark::BenchmarkBase<
-        decaf::io::DataOutputStreamBenchmark, DataOutputStream >
-    {
-    private:
-
-        std::string testString;
-
-    public:
-
-        DataOutputStreamBenchmark();
-        virtual ~DataOutputStreamBenchmark() {}
-
-        virtual void setUp();
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_IO_DATAOUTPUTSTREAMBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/lang/BooleanBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/lang/BooleanBenchmark.cpp
deleted file mode 100644
index c547bcd..0000000
--- a/src/decaf/src/test-benchmarks/decaf/lang/BooleanBenchmark.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BooleanBenchmark.h"
-
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-BooleanBenchmark::BooleanBenchmark() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void BooleanBenchmark::run(){
-
-    int numRuns = 1000;
-    Boolean boolean( false );
-
-    std::string value = "";
-
-    for( int i = 0; i < numRuns; ++i ) {
-        value = boolean.toString();
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        value = boolean.toString( false );
-        value = boolean.toString( true );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        bool value1 = Boolean::parseBoolean( "false" );
-        bool value2 = Boolean::parseBoolean( "true" );
-
-        value = Boolean::valueOf( value1 ).toString();
-        value = Boolean::valueOf( value2 ).toString();
-    }
-
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/lang/BooleanBenchmark.h b/src/decaf/src/test-benchmarks/decaf/lang/BooleanBenchmark.h
deleted file mode 100644
index ba3097c..0000000
--- a/src/decaf/src/test-benchmarks/decaf/lang/BooleanBenchmark.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_BOOLEANBENCHMARK_H_
-#define _DECAF_LANG_BOOLEANBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-#include <decaf/lang/Boolean.h>
-
-namespace decaf{
-namespace lang{
-
-    class BooleanBenchmark :
-        public benchmark::BenchmarkBase< decaf::lang::BooleanBenchmark, Boolean >
-    {
-    public:
-
-        BooleanBenchmark();
-        virtual ~BooleanBenchmark() {}
-
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_LANG_BOOLEANBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/util/MapBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/util/MapBenchmark.cpp
deleted file mode 100644
index 9f3155c..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/MapBenchmark.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MapBenchmark.h"
-#include <decaf/lang/Integer.h>
-
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-MapBenchmark::MapBenchmark() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapBenchmark::run() {
-
-    int numRuns = 500;
-    std::string test = "test";
-    std::string resultStr = "";
-    Map<std::string, std::string> stringCopy;
-    Map<int, int> intCopy;
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringMap.setValue( test + Integer::toString(i), test + Integer::toString(i) );
-        intMap.setValue( 100 + i, 100 + i );
-        stringMap.containsKey( test + Integer::toString(i) );
-        intMap.containsKey( 100 + i );
-        stringMap.containsValue( test + Integer::toString(i) );
-        intMap.containsValue( 100 + i );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringMap.remove( test + Integer::toString(i) );
-        intMap.remove( 100 + i );
-        stringMap.containsKey( test + Integer::toString(i) );
-        intMap.containsKey( 100 + i );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringMap.setValue( test + Integer::toString(i), test + Integer::toString(i) );
-        intMap.setValue( 100 + i, 100 + i );
-    }
-
-    std::vector<std::string> stringVec;
-    std::vector<int> intVec;
-
-    for( int i = 0; i < numRuns / 2; ++i ) {
-        stringVec = stringMap.getKeys();
-        stringVec = stringMap.getValues();
-        intVec = intMap.getKeys();
-        intVec = intMap.getValues();
-    }
-
-    for( int i = 0; i < numRuns / 2; ++i ) {
-        stringCopy.copy( stringMap );
-        stringCopy.clear();
-        intCopy.copy( intMap );
-        intCopy.clear();
-    }
-
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/util/MapBenchmark.h b/src/decaf/src/test-benchmarks/decaf/util/MapBenchmark.h
deleted file mode 100644
index 847034b..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/MapBenchmark.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_MAPBENCHMARK_H_
-#define _DECAF_UTIL_MAPBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-#include <decaf/util/Map.h>
-
-namespace decaf{
-namespace util{
-
-    class MapBenchmark :
-        public benchmark::BenchmarkBase<
-            decaf::util::MapBenchmark, Map<int, int> >
-    {
-    private:
-
-        Map< std::string, std::string> stringMap;
-        Map<int, int> intMap;
-
-    public:
-
-        MapBenchmark();
-        virtual ~MapBenchmark() {}
-
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_MAPBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/util/PropertiesBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/util/PropertiesBenchmark.cpp
deleted file mode 100644
index efb8a25..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/PropertiesBenchmark.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "PropertiesBenchmark.h"
-
-#include <decaf/lang/Integer.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-PropertiesBenchmark::PropertiesBenchmark() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void PropertiesBenchmark::run() {
-
-    int numRuns = 250;
-    std::string result = "";
-    bool hasIt = false;
-    Properties copy;
-
-    for( int i = 0; i < numRuns; ++i ) {
-        properties.setProperty( "test", "value" );
-        hasIt = properties.hasProperty( "test" );
-        result = properties.getProperty( "test" );
-        properties.remove( "test" );
-    }
-
-    std::vector< std::pair< std::string, std::string > > array;
-
-    std::string prefix = "test";
-    for( int i = 0; i < numRuns; ++i ) {
-        properties.setProperty(
-            prefix + Integer::toString(i), prefix + Integer::toString(i) );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        array = properties.toArray();
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        copy.copy( &properties );
-        copy.clear();
-    }
-
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/util/PropertiesBenchmark.h b/src/decaf/src/test-benchmarks/decaf/util/PropertiesBenchmark.h
deleted file mode 100644
index 3e7ffbc..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/PropertiesBenchmark.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_PROPERTIESBENCHMARK_H_
-#define _DECAF_UTIL_PROPERTIESBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-
-#include <decaf/util/Properties.h>
-
-namespace decaf{
-namespace util{
-
-    class PropertiesBenchmark :
-        public benchmark::BenchmarkBase<
-            decaf::util::PropertiesBenchmark, Properties >
-    {
-    private:
-
-        Properties properties;
-
-    public:
-
-        PropertiesBenchmark();
-        virtual ~PropertiesBenchmark() {}
-
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_PROPERTIESBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/util/QueueBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/util/QueueBenchmark.cpp
deleted file mode 100644
index a8d8967..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/QueueBenchmark.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "QueueBenchmark.h"
-
-#include <decaf/lang/Integer.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-QueueBenchmark::QueueBenchmark(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void QueueBenchmark::run(){
-
-    int numRuns = 300;
-    std::string test = "test";
-    std::string resultStr = "";
-    int resultInt = 0;
-    Queue<std::string> stringQCopy;
-    Queue<int> intQCopy;
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringQ.push( test );
-        intQ.push( 65536 );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringQ.pop();
-        intQ.pop();
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringQ.enqueueFront( test );
-        intQ.enqueueFront( 1024 );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringQ.reverse( stringQCopy );
-        intQ.reverse( intQCopy );
-    }
-
-    std::vector<std::string> stringVec;
-    std::vector<int> intVec;
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringVec = stringQ.toArray();
-        intVec = intQ.toArray();
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        resultStr = stringQ.front();
-        resultStr = stringQ.back();
-        resultInt = intQ.front();
-        resultInt = intQ.back();
-        stringQ.pop();
-        intQ.pop();
-    }
-
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/util/QueueBenchmark.h b/src/decaf/src/test-benchmarks/decaf/util/QueueBenchmark.h
deleted file mode 100644
index be07b67..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/QueueBenchmark.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_QUEUE_QUEUEBENCHMARK_H_
-#define _DECAF_QUEUE_QUEUEBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-#include <decaf/util/Queue.h>
-
-namespace decaf{
-namespace util{
-
-    class QueueBenchmark :
-        public benchmark::BenchmarkBase<
-            decaf::util::QueueBenchmark, Queue<int> >
-    {
-    private:
-
-        Queue<std::string> stringQ;
-        Queue<int> intQ;
-
-    public:
-
-        QueueBenchmark();
-        virtual ~QueueBenchmark() {}
-
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_QUEUE_QUEUEBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/decaf/util/SetBenchmark.cpp b/src/decaf/src/test-benchmarks/decaf/util/SetBenchmark.cpp
deleted file mode 100644
index 835cf3b..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/SetBenchmark.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SetBenchmark.h"
-
-#include <decaf/lang/Integer.h>
-#include <decaf/util/Iterator.h>
-
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-SetBenchmark::SetBenchmark(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetBenchmark::run(){
-
-    int numRuns = 500;
-    std::string test = "test";
-    std::string resultStr = "";
-    Set<std::string> stringCopy;
-    Set<int> intCopy;
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringSet.add( test + Integer::toString(i) );
-        intSet.add( 100 + i );
-        stringSet.contains( test + Integer::toString(i) );
-        intSet.contains( 100 + i );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringSet.remove( test + Integer::toString(i) );
-        intSet.remove( 100 + i );
-        stringSet.contains( test + Integer::toString(i) );
-        intSet.contains( 100 + i );
-    }
-
-    for( int i = 0; i < numRuns; ++i ) {
-        stringSet.add( test + Integer::toString(i) );
-        intSet.add( 100 + i );
-    }
-
-    std::vector<std::string> stringVec;
-    std::vector<int> intVec;
-
-    for( int i = 0; i < numRuns / 2; ++i ) {
-        stringVec = stringSet.toArray();
-        intVec = intSet.toArray();
-    }
-
-    std::string tempStr = "";
-    int tempInt = 0;
-
-    for( int i = 0; i < numRuns / 2; ++i ) {
-
-        Iterator<std::string>* strIter = stringSet.iterator();
-        Iterator<int>* intIter = intSet.iterator();
-
-        while( strIter->hasNext() ){
-            tempStr = strIter->next();
-        }
-
-        while( intIter->hasNext() ){
-            tempInt = intIter->next();
-        }
-
-        delete strIter;
-        delete intIter;
-    }
-
-    for( int i = 0; i < numRuns / 2; ++i ) {
-        stringCopy.copy( stringSet );
-        stringCopy.clear();
-        intCopy.copy( intSet );
-        intCopy.clear();
-    }
-
-}
diff --git a/src/decaf/src/test-benchmarks/decaf/util/SetBenchmark.h b/src/decaf/src/test-benchmarks/decaf/util/SetBenchmark.h
deleted file mode 100644
index 7c57ef9..0000000
--- a/src/decaf/src/test-benchmarks/decaf/util/SetBenchmark.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_SETBENCHMARK_H_
-#define _DECAF_UTIL_SETBENCHMARK_H_
-
-#include <benchmark/BenchmarkBase.h>
-#include <decaf/util/Set.h>
-
-namespace decaf{
-namespace util{
-
-    class SetBenchmark :
-        public benchmark::BenchmarkBase<
-            decaf::util::SetBenchmark, Set<int> >
-    {
-    private:
-
-        Set<int> intSet;
-        Set<std::string> stringSet;
-
-    public:
-
-        SetBenchmark();
-        virtual ~SetBenchmark() {}
-
-        virtual void run();
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_SETBENCHMARK_H_*/
diff --git a/src/decaf/src/test-benchmarks/main.cpp b/src/decaf/src/test-benchmarks/main.cpp
deleted file mode 100644
index ae67c6c..0000000
--- a/src/decaf/src/test-benchmarks/main.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-#include <cppunit/TestResult.h>
-#include <decaf/util/Config.h>
-#include <iostream>
-
-int main( int argc DECAF_UNUSED, char **argv DECAF_UNUSED ) {
-    try {
-        CppUnit::TextUi::TestRunner runner;
-        CppUnit::TestFactoryRegistry &registry =
-            CppUnit::TestFactoryRegistry::getRegistry();
-        runner.addTest( registry.makeTest() );
-
-        std::cout << "=====================================================\n";
-        std::cout << "Starting the Benchmarks:" << std::endl;
-        std::cout << "-----------------------------------------------------\n";
-
-        bool wasSuccessful = runner.run( "", false );
-
-        std::cout << "-----------------------------------------------------\n";
-        std::cout << "Finished with the Benchmarks." << std::endl;
-        std::cout << "=====================================================\n";
-
-        return !wasSuccessful;
-    } catch(...) {
-        std::cout << "----------------------------------------" << std::endl;
-        std::cout << "- AN ERROR HAS OCCURED:                -" << std::endl;
-        std::cout << "----------------------------------------" << std::endl;
-    }
-}
diff --git a/src/decaf/src/test-benchmarks/testRegistry.cpp b/src/decaf/src/test-benchmarks/testRegistry.cpp
deleted file mode 100644
index 31af405..0000000
--- a/src/decaf/src/test-benchmarks/testRegistry.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <decaf/lang/BooleanBenchmark.h>
-
-#include <decaf/util/PropertiesBenchmark.h>
-#include <decaf/util/QueueBenchmark.h>
-#include <decaf/util/SetBenchmark.h>
-#include <decaf/util/MapBenchmark.h>
-
-#include <decaf/io/DataInputStreamBenchmark.h>
-#include <decaf/io/DataOutputStreamBenchmark.h>
-
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::BooleanBenchmark );
-
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::PropertiesBenchmark );
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::QueueBenchmark );
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::SetBenchmark );
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::MapBenchmark );
-
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::DataInputStreamBenchmark );
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::DataOutputStreamBenchmark );
diff --git a/src/decaf/src/test/Makefile.am b/src/decaf/src/test/Makefile.am
deleted file mode 100644
index ce264fa..0000000
--- a/src/decaf/src/test/Makefile.am
+++ /dev/null
@@ -1,100 +0,0 @@
-# ---------------------------------------------------------------------------
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-# 
-# http://www.apache.org/licenses/LICENSE-2.0
-# 
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-# ---------------------------------------------------------------------------
-
-cc_sources = \
-  decaf/lang/ByteTest.cpp \
-  decaf/lang/CharacterTest.cpp \
-  decaf/lang/BooleanTest.cpp \
-  decaf/lang/ShortTest.cpp \
-  decaf/lang/IntegerTest.cpp \
-  decaf/lang/LongTest.cpp \
-  decaf/lang/FloatTest.cpp \
-  decaf/lang/DoubleTest.cpp \
-  decaf/lang/ThreadTest.cpp \
-  decaf/lang/ExceptionTest.cpp \
-  decaf/lang/MathTest.cpp \
-  decaf/lang/SystemTest.cpp \
-  decaf/io/BufferedInputStreamTest.cpp \
-  decaf/io/BufferedOutputStreamTest.cpp \
-  decaf/io/ByteArrayInputStreamTest.cpp \
-  decaf/io/ByteArrayOutputStreamTest.cpp \
-  decaf/io/DataInputStreamTest.cpp \
-  decaf/io/DataOutputStreamTest.cpp \
-  decaf/net/SocketFactoryTest.cpp \
-  decaf/net/SocketTest.cpp \
-  decaf/net/URITest.cpp \
-  decaf/net/URISyntaxExceptionTest.cpp \
-  decaf/util/StringTokenizerTest.cpp \
-  decaf/util/Endian.cpp \
-  decaf/util/DateTest.cpp \
-  decaf/util/UUIDTest.cpp \
-  decaf/util/RandomTest.cpp \
-  decaf/util/MapTest.cpp \
-  decaf/util/QueueTest.cpp \
-  decaf/util/SetTest.cpp \
-  decaf/util/concurrent/CountDownLatchTest.cpp \
-  decaf/util/concurrent/MutexTest.cpp \
-  decaf/util/concurrent/ThreadPoolTest.cpp \
-  testRegistry.cpp \
-  main.cpp
-
-h_sources = \
-  decaf/lang/ByteTest.h \
-  decaf/lang/CharacterTest.h \
-  decaf/lang/BooleanTest.h \
-  decaf/lang/ShortTest.h \
-  decaf/lang/IntegerTest.h \
-  decaf/lang/LongTest.h \
-  decaf/lang/FloatTest.h \
-  decaf/lang/DoubleTest.h \
-  decaf/lang/ThreadTest.h \
-  decaf/lang/ExceptionTest.h \
-  decaf/lang/MathTest.h \
-  decaf/lang/SystemTest.h \
-  decaf/io/BufferedInputStreamTest.h \
-  decaf/io/BufferedOutputStreamTest.h \
-  decaf/io/ByteArrayInputStreamTest.h \
-  decaf/io/ByteArrayOutputStreamTest.h \
-  decaf/io/DataInputStreamTest.h \
-  decaf/io/DataOutputStreamTest.h \
-  decaf/net/SocketFactoryTest.h \
-  decaf/net/SocketTest.h \
-  decaf/net/URITest.h \
-  decaf/net/URISyntaxExceptionTest.h \
-  decaf/util/StringTokenizerTest.h \
-  decaf/util/Endian.h \
-  decaf/util/DateTest.h \
-  decaf/util/UUIDTest.h \
-  decaf/util/RandomTest.h \
-  decaf/util/MapTest.h \
-  decaf/util/QueueTest.h \
-  decaf/util/SetTest.h \
-  decaf/util/concurrent/CountDownLatchTest.h \
-  decaf/util/concurrent/MutexTest.h \
-  decaf/util/concurrent/ThreadPoolTest.h
-
-## Compile this as part of make check
-check_PROGRAMS = decaf-test
-## Also run the tests as part of make check
-## TESTS = $(check_PROGRAMS)
-
-## 
-## Compiler/Linker Options
-##
-decaf_test_SOURCES = $(cc_sources)
-decaf_test_CXXFLAGS = $(DECAF_TEST_CXXFLAGS) -I$(srcdir)/../main @CPPUNIT_CFLAGS@
-decaf_test_LDADD= $(DECAF_TEST_LIBS) @CPPUNIT_LIBS@ 
diff --git a/src/decaf/src/test/decaf/io/BufferedInputStreamTest.cpp b/src/decaf/src/test/decaf/io/BufferedInputStreamTest.cpp
deleted file mode 100644
index 13286db..0000000
--- a/src/decaf/src/test/decaf/io/BufferedInputStreamTest.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BufferedInputStreamTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-
-void BufferedInputStreamTest::testSmallerBuffer(){
-
-    std::string testStr = "TEST12345678910";
-    MyInputStream myStream( testStr );
-    BufferedInputStream bufStream( &myStream, (std::size_t)1 );
-
-    std::size_t available = bufStream.available();
-    CPPUNIT_ASSERT( available == testStr.length() );
-
-    unsigned char dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'T' );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == (testStr.length() - 1) );
-
-    dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'E' );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == (testStr.length() - 2 ) );
-
-    dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'S' );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == (testStr.length() - 3 ) );
-
-    dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'T' );
-
-    unsigned char dummyBuf[20];
-    memset( dummyBuf, 0, 20 );
-    std::size_t numRead = bufStream.read( dummyBuf, 10 );
-    CPPUNIT_ASSERT( numRead == 10 );
-    CPPUNIT_ASSERT( strcmp( (char*)dummyBuf, "1234567891" ) == 0 );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == 1 );
-}
-
-void BufferedInputStreamTest::testBiggerBuffer(){
-
-    std::string testStr = "TEST12345678910";
-    MyInputStream myStream( testStr );
-    BufferedInputStream bufStream( &myStream, (std::size_t)10 );
-
-    std::size_t available = bufStream.available();
-    CPPUNIT_ASSERT( available == testStr.length() );
-
-    unsigned char dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'T' );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == (testStr.length() - 1 ) );
-
-    dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'E' );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == (testStr.length() - 2 ) );
-
-    dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'S' );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == (testStr.length() - 3 ) );
-
-    dummy = bufStream.read();
-    CPPUNIT_ASSERT( dummy == 'T' );
-
-    unsigned char dummyBuf[20];
-    memset( dummyBuf, 0, 20 );
-    std::size_t numRead = bufStream.read( dummyBuf, 10 );
-    CPPUNIT_ASSERT( numRead == 10 );
-    CPPUNIT_ASSERT( strcmp( (char*)dummyBuf, "1234567891" ) == 0 );
-
-    available = bufStream.available();
-    CPPUNIT_ASSERT( available == 1 );
-}
diff --git a/src/decaf/src/test/decaf/io/BufferedInputStreamTest.h b/src/decaf/src/test/decaf/io/BufferedInputStreamTest.h
deleted file mode 100644
index 0664a4b..0000000
--- a/src/decaf/src/test/decaf/io/BufferedInputStreamTest.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BUFFEREDINPUTSTREAMTEST_H_
-#define _DECAF_IO_BUFFEREDINPUTSTREAMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/io/BufferedInputStream.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace io{
-
-    class BufferedInputStreamTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( BufferedInputStreamTest );
-        CPPUNIT_TEST( testSmallerBuffer );
-        CPPUNIT_TEST( testBiggerBuffer );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        class MyInputStream : public InputStream{
-        private:
-            std::string data;
-            std::size_t pos;
-        public:
-
-            MyInputStream( const std::string& data ){
-                this->data = data;
-                pos = 0;
-            }
-            virtual ~MyInputStream(){}
-
-            virtual std::size_t available() const throw (IOException){
-                std::size_t len = data.length();
-                return len - pos;
-            }
-            virtual unsigned char read() throw (IOException){
-                if( pos >= data.length() ){
-                    throw IOException();
-                }
-
-                return data.c_str()[pos++];
-            }
-            virtual int read( unsigned char* buffer, std::size_t bufferSize ) throw (IOException){
-                std::size_t numToRead = std::min( bufferSize, available() );
-
-                const char* str = data.c_str();
-                for( std::size_t ix=0; ix<numToRead; ++ix ){
-                    buffer[ix] = str[pos+ix];
-                }
-
-                pos += numToRead;
-
-                return numToRead;
-            }
-
-            virtual void close() throw(lang::Exception){
-                // do nothing.
-            }
-            virtual std::size_t skip( std::size_t num DECAF_UNUSED) throw ( io::IOException, lang::exceptions::UnsupportedOperationException ) {
-                return 0;
-            }
-
-            virtual void lock() throw(lang::Exception){
-            }
-            virtual void unlock() throw(lang::Exception){
-            }
-            virtual void wait() throw(lang::Exception){
-            }
-            virtual void wait(unsigned long millisecs DECAF_UNUSED) throw(lang::Exception){
-            }
-            virtual void notify() throw(lang::Exception){
-            }
-            virtual void notifyAll() throw(lang::Exception){
-            }
-        };
-
-    public:
-
-        virtual ~BufferedInputStreamTest(){}
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void testSmallerBuffer();
-        void testBiggerBuffer();
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_BUFFEREDINPUTSTREAMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/io/BufferedOutputStreamTest.cpp b/src/decaf/src/test/decaf/io/BufferedOutputStreamTest.cpp
deleted file mode 100644
index 406ff30..0000000
--- a/src/decaf/src/test/decaf/io/BufferedOutputStreamTest.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BufferedOutputStreamTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-
-void BufferedOutputStreamTest::testSmallerBuffer(){
-
-    MyOutputStream myStream;
-    BufferedOutputStream bufStream( &myStream, (std::size_t)1 );
-
-    const char* buffer = myStream.getBuffer();
-
-    bufStream.write( (unsigned char)'T' );
-    // Should not be written yet.
-    CPPUNIT_ASSERT( strcmp( buffer, "" ) == 0 );
-
-    bufStream.write( (unsigned char)'E' );
-    // This time the T should have been written.
-    CPPUNIT_ASSERT( strcmp( buffer, "T" ) == 0 );
-
-    bufStream.write( (unsigned char*)"ST", 2 );
-    // This time the ES should have been written.
-    CPPUNIT_ASSERT( strcmp( buffer, "TES" ) == 0 );
-
-    bufStream.flush();
-    CPPUNIT_ASSERT( strcmp( buffer, "TEST" ) == 0 );
-}
-
-void BufferedOutputStreamTest::testBiggerBuffer(){
-
-    MyOutputStream myStream;
-    BufferedOutputStream bufStream( &myStream, (std::size_t)10 );
-
-    const char* buffer = myStream.getBuffer();
-
-    bufStream.write( (unsigned char*)"TEST", 4 );
-
-    // Should not be written yet.
-    CPPUNIT_ASSERT( strcmp( buffer, "" ) == 0 );
-
-    bufStream.flush();
-    CPPUNIT_ASSERT( strcmp( buffer, "TEST" ) == 0 );
-
-    bufStream.write( (unsigned char*)"TEST", 4 );
-    bufStream.write( (unsigned char*)"12345678910", 11);
-
-    CPPUNIT_ASSERT( strcmp( buffer, "TESTTEST123456" ) == 0 );
-
-    bufStream.flush();
-    CPPUNIT_ASSERT( strcmp( buffer, "TESTTEST12345678910" ) == 0 );
-
-}
diff --git a/src/decaf/src/test/decaf/io/BufferedOutputStreamTest.h b/src/decaf/src/test/decaf/io/BufferedOutputStreamTest.h
deleted file mode 100644
index a4b5cfd..0000000
--- a/src/decaf/src/test/decaf/io/BufferedOutputStreamTest.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BUFFEREDOUTPUTSTREAMTEST_H_
-#define _DECAF_IO_BUFFEREDOUTPUTSTREAMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/io/BufferedOutputStream.h>
-#include <decaf/util/Config.h>
-#include <string.h>
-
-namespace decaf{
-namespace io{
-
-    class BufferedOutputStreamTest : public CppUnit::TestFixture {
-
-      CPPUNIT_TEST_SUITE( BufferedOutputStreamTest );
-      CPPUNIT_TEST( testSmallerBuffer );
-      CPPUNIT_TEST( testBiggerBuffer );
-      CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        class MyOutputStream : public OutputStream{
-        private:
-            char buffer[100];
-            std::size_t pos;
-        public:
-
-            MyOutputStream(){
-                pos = 0;
-                memset( buffer, 0, 100 );
-            }
-            virtual ~MyOutputStream(){}
-
-            const char* getBuffer() const{ return buffer; }
-
-            virtual void write( unsigned char c ) throw (IOException){
-                if( pos >= 100 ){
-                    throw IOException();
-                }
-
-                buffer[pos++] = c;
-            }
-
-            virtual void write( const unsigned char* buffer, std::size_t len ) throw (IOException){
-
-                if( (pos + len) > 100 ){
-                    throw IOException();
-                }
-
-                memcpy( this->buffer + pos, buffer, len );
-
-                pos += len;
-            }
-
-            virtual void flush() throw (IOException){
-            }
-
-            virtual void close() throw(lang::Exception){
-                // do nothing.
-            }
-
-            virtual void lock() throw(lang::Exception){
-            }
-            virtual void unlock() throw(lang::Exception){
-            }
-            virtual void wait() throw(lang::Exception){
-            }
-            virtual void wait(unsigned long millisecs DECAF_UNUSED) throw(lang::Exception){
-            }
-            virtual void notify() throw(lang::Exception){
-            }
-            virtual void notifyAll() throw(lang::Exception){
-            }
-        };
-
-    public:
-
-        virtual ~BufferedOutputStreamTest(){}
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void testSmallerBuffer();
-        void testBiggerBuffer();
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_BUFFEREDOUTPUTSTREAMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/io/ByteArrayInputStreamTest.cpp b/src/decaf/src/test/decaf/io/ByteArrayInputStreamTest.cpp
deleted file mode 100644
index 51ef27e..0000000
--- a/src/decaf/src/test/decaf/io/ByteArrayInputStreamTest.cpp
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ByteArrayInputStreamTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-
-void ByteArrayInputStreamTest::testStream()
-{
-    std::vector<unsigned char> testBuffer;
-
-    testBuffer.push_back('t');
-    testBuffer.push_back('e');
-    testBuffer.push_back('s');
-    testBuffer.push_back('t');
-
-    ByteArrayInputStream stream_a(&testBuffer[0], testBuffer.size());
-
-    CPPUNIT_ASSERT( stream_a.available() == 4 );
-
-    char a = stream_a.read();
-    char b = stream_a.read();
-    char c = stream_a.read();
-    char d = stream_a.read();
-
-    CPPUNIT_ASSERT( a == 't' && b == 'e' && c == 's' && d == 't' );
-    CPPUNIT_ASSERT( stream_a.available() == 0 );
-
-    testBuffer.push_back('e');
-
-    stream_a.setByteArray(&testBuffer[0], testBuffer.size());
-
-    CPPUNIT_ASSERT( stream_a.available() == 5 );
-
-    unsigned char* buffer = new unsigned char[6];
-
-    buffer[5] = '\0';
-
-    CPPUNIT_ASSERT( stream_a.read(buffer, 5) == 5 );
-    CPPUNIT_ASSERT( std::string((const char*)buffer) == std::string("teste") );
-    CPPUNIT_ASSERT( stream_a.available() == 0 );
-
-    stream_a.setByteArray(&testBuffer[0], testBuffer.size());
-
-    memset(buffer, 0, 6);
-
-    CPPUNIT_ASSERT( stream_a.read(buffer, 3) == 3 );
-    CPPUNIT_ASSERT( stream_a.read(&buffer[3], 2) == 2 );
-    CPPUNIT_ASSERT( std::string((const char*)buffer) == std::string("teste") );
-
-    stream_a.close();
-
-    delete [] buffer;
-}
diff --git a/src/decaf/src/test/decaf/io/ByteArrayInputStreamTest.h b/src/decaf/src/test/decaf/io/ByteArrayInputStreamTest.h
deleted file mode 100644
index 0a68cb0..0000000
--- a/src/decaf/src/test/decaf/io/ByteArrayInputStreamTest.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BYTEARRAYINPUTSTREAMTEST_H_
-#define _DECAF_IO_BYTEARRAYINPUTSTREAMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/io/ByteArrayInputStream.h>
-
-namespace decaf{
-namespace io{
-
-   class ByteArrayInputStreamTest : public CppUnit::TestFixture
-   {
-       CPPUNIT_TEST_SUITE( ByteArrayInputStreamTest );
-       CPPUNIT_TEST( testStream );
-       CPPUNIT_TEST_SUITE_END();
-
-   public:
-
-       ByteArrayInputStreamTest() {}
-       virtual ~ByteArrayInputStreamTest() {}
-
-       void testStream();
-
-   };
-
-}}
-
-#endif /*_DECAF_IO_BYTEARRAYINPUTSTREAMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/io/ByteArrayOutputStreamTest.cpp b/src/decaf/src/test/decaf/io/ByteArrayOutputStreamTest.cpp
deleted file mode 100644
index 6a843c1..0000000
--- a/src/decaf/src/test/decaf/io/ByteArrayOutputStreamTest.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ByteArrayOutputStreamTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-
-void ByteArrayOutputStreamTest::testStream()
-{
-    ByteArrayOutputStream stream_a;
-
-    stream_a.write('a');
-    stream_a.write(60);
-    stream_a.write('c');
-
-    CPPUNIT_ASSERT( stream_a.getByteArraySize() == 3 );
-
-    stream_a.clear();
-
-    CPPUNIT_ASSERT( stream_a.getByteArraySize() == 0 );
-
-    stream_a.write((const unsigned char*)("abc"), 3);
-
-    CPPUNIT_ASSERT( stream_a.getByteArraySize() == 3 );
-
-    stream_a.clear();
-
-    CPPUNIT_ASSERT( stream_a.getByteArraySize() == 0 );
-
-    stream_a.write((const unsigned char*)("abc"), 3);
-
-    unsigned char buffer[4];
-
-    memset(buffer, 0, 4);
-    memcpy(buffer, stream_a.getByteArray(), stream_a.getByteArraySize());
-
-    CPPUNIT_ASSERT( std::string((const char*)buffer) == std::string("abc") );
-}
diff --git a/src/decaf/src/test/decaf/io/ByteArrayOutputStreamTest.h b/src/decaf/src/test/decaf/io/ByteArrayOutputStreamTest.h
deleted file mode 100644
index e467afa..0000000
--- a/src/decaf/src/test/decaf/io/ByteArrayOutputStreamTest.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_BYTEARRAYOUTPUTSTREAMTEST_H_
-#define _DECAF_IO_BYTEARRAYOUTPUTSTREAMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/io/ByteArrayOutputStream.h>
-
-namespace decaf{
-namespace io{
-
-    class ByteArrayOutputStreamTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( ByteArrayOutputStreamTest );
-        CPPUNIT_TEST( testStream );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        ByteArrayOutputStreamTest() {}
-        virtual ~ByteArrayOutputStreamTest() {}
-
-        void testStream();
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_BYTEARRAYOUTPUTSTREAMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/io/DataInputStreamTest.cpp b/src/decaf/src/test/decaf/io/DataInputStreamTest.cpp
deleted file mode 100644
index a5d61a3..0000000
--- a/src/decaf/src/test/decaf/io/DataInputStreamTest.cpp
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "DataInputStreamTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-
-void DataInputStreamTest::test(){
-
-    unsigned char buffer[30];
-    int ix = 0;
-
-    unsigned char byteVal = (unsigned char)'T';
-    unsigned short shortVal = 5;
-    unsigned int intVal = 10000;
-    unsigned long long longVal = 1000000000;
-    float floatVal = 10.0f;
-    double doubleVal = 100.0;
-    unsigned char arrayVal[3] = {
-        'a', 'b', 'c'
-    };
-
-    int size = sizeof(char);
-    memcpy( (char*)(buffer+ix), (char*)&byteVal, size );
-    ix += size;
-
-    size = sizeof(unsigned short);
-    unsigned short tempShort = util::Endian::byteSwap(shortVal);
-    memcpy( (char*)(buffer+ix), (char*)&tempShort, size );
-    ix += size;
-
-    size = sizeof(unsigned int);
-    unsigned int tempInt = util::Endian::byteSwap(intVal);
-    memcpy( (char*)(buffer+ix), (char*)&tempInt, size );
-    ix += size;
-
-    size = sizeof(unsigned long long);
-    unsigned long long tempLong = util::Endian::byteSwap(longVal);
-    memcpy( (char*)(buffer+ix), (char*)&tempLong, size );
-    ix += size;
-
-    size = sizeof(float);
-    float tempFloat = util::Endian::byteSwap(floatVal);
-    memcpy( (char*)(buffer+ix), (char*)&tempFloat, size );
-    ix += size;
-
-    size = sizeof(double);
-    double tempDouble = util::Endian::byteSwap(doubleVal);
-    memcpy( (char*)(buffer+ix), (char*)&tempDouble, size );
-    ix += size;
-
-    size = 3;
-    memcpy( (char*)(buffer+ix), (char*)&arrayVal, size );
-    ix += size;
-
-    // Create the stream with the buffer we just wrote to.
-    ByteArrayInputStream myStream( buffer, 30 );
-    DataInputStream reader( &myStream );
-
-    byteVal = reader.readByte();
-    //std::cout << "Byte Value = " << byteVal << std::endl;
-    CPPUNIT_ASSERT( byteVal == (unsigned char)'T' );
-
-    shortVal = reader.readShort();
-    //std::cout << "short Value = " << shortVal << std::endl;
-    CPPUNIT_ASSERT( shortVal == 5 );
-
-    intVal = reader.readInt();
-    //std::cout << "int Value = " << intVal << std::endl;
-    CPPUNIT_ASSERT( intVal == 10000 );
-
-    longVal = reader.readLong();
-    //std::cout << "long long Value = " << longVal << std::endl;
-    CPPUNIT_ASSERT( longVal == 1000000000 );
-
-    floatVal = reader.readFloat();
-    //std::cout << "float Value = " << floatVal << std::endl;
-    CPPUNIT_ASSERT( floatVal == 10.0f );
-
-    doubleVal = reader.readDouble();
-    //std::cout << "double Value = " << doubleVal << std::endl;
-    CPPUNIT_ASSERT( doubleVal == 100.0 );
-
-    reader.read( arrayVal, 0, 3 );
-    //std::cout << "char[0] Value = " << (int)arrayVal[0] << std::endl;
-    CPPUNIT_ASSERT( arrayVal[0] == 'a' );
-    //std::cout << "char[1] Value = " << (int)arrayVal[1] << std::endl;
-    CPPUNIT_ASSERT( arrayVal[1] == 'b' );
-    //std::cout << "char[2] Value = " << (int)arrayVal[2] << std::endl;
-    CPPUNIT_ASSERT( arrayVal[2] == 'c' );
-}
-
-void DataInputStreamTest::testString() {
-
-    std::string data1 = "This is a Test";
-    std::string data2 = "of the readString method";
-    std::string data3 = "This one should fail";
-
-    std::vector<unsigned char> buffer;
-
-    buffer.insert( buffer.begin(), data1.begin(), data1.end() );
-    buffer.push_back( '\0' );
-    buffer.insert( buffer.end(), data2.begin(), data2.end() );
-    buffer.push_back( '\0' );
-    buffer.insert( buffer.end(), data3.begin(), data3.end() );
-
-    // Create the stream with the buffer we just wrote to.
-    ByteArrayInputStream myStream( buffer );
-    DataInputStream reader( &myStream );
-
-    std::string result1 = reader.readString();
-    std::string result2 = reader.readString();
-
-    CPPUNIT_ASSERT( result1 == data1 );
-    CPPUNIT_ASSERT( result2 == data2 );
-
-    try{
-        std::string result3 = reader.readString();
-        CPPUNIT_ASSERT( false );
-    } catch(...){
-        CPPUNIT_ASSERT( true );
-    }
-
-    try{
-        std::vector<unsigned char> buffer2;
-        reader.readFully( buffer2 );
-    } catch(...){
-        CPPUNIT_ASSERT( false );
-    }
-}
-
-void DataInputStreamTest::testUTF() {
-
-    std::string data1 = "This is a Test";
-    std::string data2 = "of the readString method";
-    std::string data3 = "This one should fail";
-
-    char sizeData[sizeof(short)] = {0};
-    short tempShort = 0;
-
-    std::vector<unsigned char> buffer;
-
-    tempShort = util::Endian::byteSwap( ((unsigned short)data1.size()) );
-    memcpy( sizeData, (char*)&tempShort, sizeof( short ) );
-    buffer.insert( buffer.end(), sizeData, sizeData + sizeof(short) );
-    buffer.insert( buffer.end(), data1.begin(), data1.end() );
-
-    tempShort = util::Endian::byteSwap( ((unsigned short)data2.size()) );
-    memcpy( sizeData, (char*)&tempShort, sizeof( short ) );
-    buffer.insert( buffer.end(), sizeData, sizeData + sizeof(short) );
-    buffer.insert( buffer.end(), data2.begin(), data2.end() );
-
-    tempShort = util::Endian::byteSwap( (unsigned short)(data3.size() + 10 ) );
-    memcpy( sizeData, (char*)&tempShort, sizeof( short ) );
-    buffer.insert( buffer.end(), sizeData, sizeData + sizeof(short) );
-    buffer.insert( buffer.end(), data3.begin(), data3.end() );
-
-    // Create the stream with the buffer we just wrote to.
-    ByteArrayInputStream myStream( buffer );
-    DataInputStream reader( &myStream );
-
-    std::string result1 = reader.readUTF();
-    std::string result2 = reader.readUTF();
-
-    CPPUNIT_ASSERT( result1 == data1 );
-    CPPUNIT_ASSERT( result2 == data2 );
-
-    try{
-        std::string result3 = reader.readUTF();
-        CPPUNIT_ASSERT( false );
-    } catch(...){
-        CPPUNIT_ASSERT( true );
-    }
-}
diff --git a/src/decaf/src/test/decaf/io/DataInputStreamTest.h b/src/decaf/src/test/decaf/io/DataInputStreamTest.h
deleted file mode 100644
index 07f3411..0000000
--- a/src/decaf/src/test/decaf/io/DataInputStreamTest.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_DATAINPUTSTREAMTEST_H_
-#define _DECAF_IO_DATAINPUTSTREAMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/util/Endian.h>
-#include <decaf/lang/Exception.h>
-#include <decaf/io/BufferedInputStream.h>
-#include <decaf/io/ByteArrayInputStream.h>
-#include <decaf/io/DataInputStream.h>
-
-#ifdef min
-#undef min
-#endif
-
-#include <algorithm>
-
-namespace decaf{
-namespace io{
-
-    class DataInputStreamTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( DataInputStreamTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST( testString );
-        CPPUNIT_TEST( testUTF );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        virtual ~DataInputStreamTest(){}
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void test();
-        void testString();
-        void testUTF();
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_DATAINPUTSTREAMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/io/DataOutputStreamTest.cpp b/src/decaf/src/test/decaf/io/DataOutputStreamTest.cpp
deleted file mode 100644
index da6b7e2..0000000
--- a/src/decaf/src/test/decaf/io/DataOutputStreamTest.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "DataOutputStreamTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::io;
-using namespace decaf::util;
-
-void DataOutputStreamTest::test(){
-
-    unsigned char byteVal = (unsigned char)'T';
-    unsigned short shortVal = 5;
-    unsigned int intVal = 10000;
-    unsigned long long longVal = 1000000000;
-    float floatVal = 10.0f;
-    double doubleVal = 100.0;
-    unsigned char arrayVal[3] = {
-        'a', 'b', 'c'
-    };
-
-    // Create the stream with the buffer we just wrote to.
-    ByteArrayOutputStream myStream;
-    DataOutputStream writer( &myStream );
-
-    writer.writeByte( byteVal );
-    writer.writeShort( shortVal );
-    writer.writeInt( intVal );
-    writer.writeLong( longVal );
-    writer.writeFloat( floatVal );
-    writer.writeDouble( doubleVal );
-    writer.write( arrayVal, 3 );
-
-    const unsigned char* buffer = myStream.getByteArray();
-    int ix = 0;
-
-    unsigned char tempByte = buffer[ix];
-    CPPUNIT_ASSERT( tempByte == byteVal );
-    ix += sizeof( tempByte );
-
-    unsigned short tempShort = 0;
-    memcpy( &tempShort, buffer+ix, sizeof( unsigned short ) );
-    tempShort = util::Endian::byteSwap( tempShort );
-    CPPUNIT_ASSERT( tempShort == shortVal );
-    ix += sizeof( tempShort );
-
-    unsigned int tempInt = 0;
-    memcpy( &tempInt, buffer+ix, sizeof( unsigned int ) );
-    tempInt = util::Endian::byteSwap( tempInt );
-    CPPUNIT_ASSERT( tempInt == intVal );
-    ix += sizeof( tempInt );
-
-    unsigned long long tempLong = 0;
-    memcpy( &tempLong, buffer+ix, sizeof( unsigned long long ) );
-    tempLong = util::Endian::byteSwap( tempLong );
-    CPPUNIT_ASSERT( tempLong == longVal );
-    ix += sizeof( tempLong );
-
-    float tempFloat = 0;
-    memcpy( &tempFloat, buffer+ix, sizeof( float ) );
-    tempFloat = util::Endian::byteSwap( tempFloat );
-    CPPUNIT_ASSERT( tempFloat == floatVal );
-    ix += sizeof( tempFloat );
-
-    double tempDouble = 0;
-    memcpy( &tempDouble, buffer+ix, sizeof( double ) );
-    tempDouble = util::Endian::byteSwap( tempDouble );
-    CPPUNIT_ASSERT( tempDouble == doubleVal );
-    ix += sizeof( tempDouble );
-}
diff --git a/src/decaf/src/test/decaf/io/DataOutputStreamTest.h b/src/decaf/src/test/decaf/io/DataOutputStreamTest.h
deleted file mode 100644
index a31f573..0000000
--- a/src/decaf/src/test/decaf/io/DataOutputStreamTest.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_IO_DATAOUTPUTSTREAMTEST_H_
-#define _DECAF_IO_DATAOUTPUTSTREAMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/util/Endian.h>
-#include <decaf/io/DataOutputStream.h>
-#include <decaf/io/ByteArrayOutputStream.h>
-
-namespace decaf{
-namespace io{
-
-    class DataOutputStreamTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( DataOutputStreamTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        virtual ~DataOutputStreamTest(){}
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void test();
-
-    };
-
-}}
-
-#endif /*_DECAF_IO_DATAOUTPUTSTREAMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/BooleanTest.cpp b/src/decaf/src/test/decaf/lang/BooleanTest.cpp
deleted file mode 100644
index 679552f..0000000
--- a/src/decaf/src/test/decaf/lang/BooleanTest.cpp
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "BooleanTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-void BooleanTest::test(void)
-{
-    bool x = Boolean::parseBoolean("false");
-    bool y = Boolean::parseBoolean("true");
-    bool z = Boolean::parseBoolean("false");
-
-    CPPUNIT_ASSERT( x == false );
-    CPPUNIT_ASSERT( y == true );
-    CPPUNIT_ASSERT( z == false );
-
-    std::string x1 = Boolean::toString( x );
-    std::string y1 = Boolean::toString( y );
-    std::string z1 = Boolean::toString( z );
-
-    CPPUNIT_ASSERT( x1 == "false" );
-    CPPUNIT_ASSERT( y1 == "true" );
-    CPPUNIT_ASSERT( z1 == "false" );
-
-    Boolean b( true );
-    CPPUNIT_ASSERT( b.booleanValue() == true );
-
-}
diff --git a/src/decaf/src/test/decaf/lang/BooleanTest.h b/src/decaf/src/test/decaf/lang/BooleanTest.h
deleted file mode 100644
index fd9050e..0000000
--- a/src/decaf/src/test/decaf/lang/BooleanTest.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_BOOLEANTEST_H_
-#define _DECAF_LANG_BOOLEANTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Boolean.h>
-
-namespace decaf{
-namespace lang{
-
-    class BooleanTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( BooleanTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        BooleanTest() {}
-        virtual ~BooleanTest() {}
-
-        virtual void test(void);
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_BOOLEANTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/ByteTest.cpp b/src/decaf/src/test/decaf/lang/ByteTest.cpp
deleted file mode 100644
index 8be8dc5..0000000
--- a/src/decaf/src/test/decaf/lang/ByteTest.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ByteTest.h"
-
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-ByteTest::ByteTest(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ByteTest::test() {
-
-    Byte ubyte( 'b' );
-
-    CPPUNIT_ASSERT( ubyte < 'a' == false );
-    CPPUNIT_ASSERT( ubyte.compareTo( 'a' ) == 1 );
-    CPPUNIT_ASSERT( ubyte.compareTo( 'b' ) == 0 );
-    CPPUNIT_ASSERT( ubyte.compareTo( 'c' ) == -1 );
-
-    CPPUNIT_ASSERT( ubyte.parseByte( "60" ) == 60 );
-    CPPUNIT_ASSERT( ubyte.parseByte( "ff", 16 ) == 255 );
-
-    CPPUNIT_ASSERT( ubyte.toString( 60 ) == "60" );
-    CPPUNIT_ASSERT( ubyte.toString( 255 ) == "255" );
-
-    CPPUNIT_ASSERT( ubyte.decode( "0xFF" ) == 255 );
-    CPPUNIT_ASSERT( ubyte.decode( "255" ) == 255 );
-
-}
diff --git a/src/decaf/src/test/decaf/lang/ByteTest.h b/src/decaf/src/test/decaf/lang/ByteTest.h
deleted file mode 100644
index 5e62c59..0000000
--- a/src/decaf/src/test/decaf/lang/ByteTest.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_BYTETEST_H_
-#define _DECAF_LANG_BYTETEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Byte.h>
-
-namespace decaf{
-namespace lang{
-
-    class ByteTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( ByteTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        ByteTest();
-        virtual ~ByteTest() {}
-
-        virtual void test();
-    };
-
-}}
-
-#endif /*_DECAF_LANG_BYTETEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/CharacterTest.cpp b/src/decaf/src/test/decaf/lang/CharacterTest.cpp
deleted file mode 100644
index 63e50e4..0000000
--- a/src/decaf/src/test/decaf/lang/CharacterTest.cpp
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "CharacterTest.h"
-
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-CharacterTest::CharacterTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CharacterTest::test() {
-
-    Character character( 'b' );
-
-    CPPUNIT_ASSERT( character < 'a' == false );
-    CPPUNIT_ASSERT( character.compareTo( 'a' ) == 1 );
-    CPPUNIT_ASSERT( character.compareTo( 'b' ) == 0 );
-    CPPUNIT_ASSERT( character.compareTo( 'c' ) == -1 );
-
-    CPPUNIT_ASSERT( Character::isDigit('a') == false );
-    CPPUNIT_ASSERT( Character::isDigit('7') == true );
-    CPPUNIT_ASSERT( Character::isLowerCase('a') == true );
-    CPPUNIT_ASSERT( Character::isLowerCase('A') == false );
-    CPPUNIT_ASSERT( Character::isUpperCase('a') == false );
-    CPPUNIT_ASSERT( Character::isUpperCase('A') == true );
-    CPPUNIT_ASSERT( Character::isLetter('a') == true );
-    CPPUNIT_ASSERT( Character::isLetter('8') == false );
-    CPPUNIT_ASSERT( Character::isLetterOrDigit('a') == true );
-    CPPUNIT_ASSERT( Character::isLetterOrDigit('&') == false );
-    CPPUNIT_ASSERT( Character::digit( '9', 10 ) == 9 );
-
-}
-
diff --git a/src/decaf/src/test/decaf/lang/CharacterTest.h b/src/decaf/src/test/decaf/lang/CharacterTest.h
deleted file mode 100644
index 1624208..0000000
--- a/src/decaf/src/test/decaf/lang/CharacterTest.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_CHARACTERTEST_H_
-#define _DECAF_LANG_CHARACTERTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Character.h>
-
-namespace decaf{
-namespace lang{
-
-    class CharacterTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( CharacterTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        CharacterTest();
-        virtual ~CharacterTest() {}
-
-        virtual void test();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_CHARACTERTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/DoubleTest.cpp b/src/decaf/src/test/decaf/lang/DoubleTest.cpp
deleted file mode 100644
index 823f756..0000000
--- a/src/decaf/src/test/decaf/lang/DoubleTest.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "DoubleTest.h"
-
-#include <decaf/lang/Double.h>
-#include <string>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-DoubleTest::DoubleTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void DoubleTest::test() {
-}
diff --git a/src/decaf/src/test/decaf/lang/DoubleTest.h b/src/decaf/src/test/decaf/lang/DoubleTest.h
deleted file mode 100644
index c8af6df..0000000
--- a/src/decaf/src/test/decaf/lang/DoubleTest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_DOUBLETEST_H_
-#define _DECAF_LANG_DOUBLETEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace lang{
-
-    class DoubleTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( DoubleTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        DoubleTest();
-        virtual ~DoubleTest() {}
-
-        virtual void test();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_DOUBLETEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/ExceptionTest.cpp b/src/decaf/src/test/decaf/lang/ExceptionTest.cpp
deleted file mode 100644
index 96e5113..0000000
--- a/src/decaf/src/test/decaf/lang/ExceptionTest.cpp
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ExceptionTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-void ExceptionTest::testMessage0(){
-      char* text = "This is a test";
-      Exception ex( __FILE__, __LINE__, text );
-      CPPUNIT_ASSERT( strcmp( ex.getMessage().c_str(), text ) == 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ExceptionTest::testMessage3(){
-    Exception ex( __FILE__, __LINE__,
-        "This is a test %d %d %d", 1, 100, 1000 );
-    CPPUNIT_ASSERT( strcmp( ex.getMessage().c_str(),
-                    "This is a test 1 100 1000" ) == 0 );
-}
diff --git a/src/decaf/src/test/decaf/lang/ExceptionTest.h b/src/decaf/src/test/decaf/lang/ExceptionTest.h
deleted file mode 100644
index b21bc24..0000000
--- a/src/decaf/src/test/decaf/lang/ExceptionTest.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_EXCEPTIONTEST_H_
-#define _DECAF_LANG_EXCEPTIONTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Exception.h>
-#include <string.h>
-
-namespace decaf{
-namespace lang{
-
-    class ExceptionTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( ExceptionTest );
-        CPPUNIT_TEST( testMessage0 );
-        CPPUNIT_TEST( testMessage3 );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        virtual ~ExceptionTest(){}
-
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void testMessage0();
-        void testMessage3();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_EXCEPTIONTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/FloatTest.cpp b/src/decaf/src/test/decaf/lang/FloatTest.cpp
deleted file mode 100644
index f28133b..0000000
--- a/src/decaf/src/test/decaf/lang/FloatTest.cpp
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "FloatTest.h"
-
-#include <decaf/lang/Float.h>
-#include <decaf/lang/Integer.h>
-#include <decaf/lang/Long.h>
-#include <decaf/lang/Math.h>
-#include <string>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-const int FloatTest::rawBitsFor3_4eN38To38[] = {
-    0x1394470, 0x2e7958c, 0x490bd77, 0x634ecd5,
-    0x7e2280b, 0x98d5907, 0xb30af48, 0xcdcdb1a, 0xe8a08f0, 0x102c8b2d, 0x11d7adf8,
-    0x1386ccbb, 0x15287fe9, 0x16d29fe4, 0x1883a3ee, 0x1a248cea, 0x1bcdb025, 0x1d808e17,
-    0x1f20b19d, 0x20c8de04, 0x227b1585, 0x241ced73, 0x25c428d0, 0x27753303, 0x29193fe2,
-    0x2abf8fdb, 0x2c6f73d1, 0x2e15a863, 0x2fbb127c, 0x3169d71a, 0x33122671, 0x34b6b00d,
-    0x36645c10, 0x380eb98a, 0x39b267ec, 0x3b5f01e8, 0x3d0b6131, 0x3eae397d, 0x4059c7dc,
-    0x42081cea, 0x43aa2424, 0x4554ad2d, 0x4704ec3c, 0x48a6274b, 0x4a4fb11e, 0x4c01ceb3,
-    0x4da2425f, 0x4f4ad2f7, 0x50fd87b5, 0x529e74d1, 0x54461205, 0x55f79687, 0x579abe14,
-    0x59416d99, 0x5af1c900, 0x5c971da0, 0x5e3ce508, 0x5fec1e4a, 0x619392ee, 0x633877a9,
-    0x64e69594, 0x66901d7c, 0x683424dc, 0x69e12e12, 0x6b8cbccb, 0x6d2febfe, 0x6edbe6fe,
-    0x7089705f, 0x722bcc76, 0x73d6bf94, 0x758637bc, 0x7727c5ac, 0x78d1b717, 0x7a83126e,
-    0x7c23d70a, 0x7dcccccc, 0x7f7fffff };
-
-////////////////////////////////////////////////////////////////////////////////
-const std::string FloatTest::expectedStringFor3_4eN38To38[] = {
-    "3.4028235E-38", "3.4028235E-37",
-    "3.4028233E-36", "3.4028234E-35", "3.4028236E-34", "3.4028236E-33",
-    "3.4028234E-32", "3.4028234E-31", "3.4028233E-30", "3.4028236E-29",
-    "3.4028235E-28", "3.4028235E-27", "3.4028233E-26", "3.4028235E-25",
-    "3.4028233E-24", "3.4028235E-23", "3.4028236E-22", "3.4028235E-21",
-    "3.4028236E-20", "3.4028236E-19", "3.4028236E-18", "3.4028235E-17",
-    "3.4028236E-16", "3.4028234E-15", "3.4028234E-14", "3.4028235E-13",
-    "3.4028234E-12", "3.4028235E-11", "3.4028236E-10", "3.4028234E-9", "3.4028236E-8",
-    "3.4028236E-7", "3.4028235E-6", "3.4028235E-5", "3.4028233E-4", "0.0034028236",
-    "0.034028236", "0.34028235", "3.4028234", "34.028236", "340.28235", "3402.8235",
-    "34028.234", "340282.34", "3402823.5", "3.4028236E7", "3.40282336E8",
-    "3.40282342E9", "3.40282348E10", "3.40282343E11", "3.40282337E12", "3.40282353E13",
-    "3.4028234E14", "3.4028234E15", "3.40282356E16", "3.40282356E17", "3.40282356E18",
-    "3.4028236E19", "3.4028235E20", "3.4028233E21", "3.4028235E22", "3.4028233E23",
-    "3.4028236E24", "3.4028234E25", "3.4028233E26", "3.4028234E27", "3.4028235E28",
-    "3.4028236E29", "3.4028233E30", "3.4028235E31", "3.4028233E32", "3.4028236E33",
-    "3.4028236E34", "3.4028234E35", "3.4028236E36", "3.4028235E37", "3.4028235E38" };
-
-////////////////////////////////////////////////////////////////////////////////
-const int FloatTest::rawBitsFor1_17eN38To38[] = {
-    0x80800000, 0x82200000, 0x83c80000,
-    0x857a0000, 0x871c4000, 0x88c35000, 0x8a742400, 0x8c189680, 0x8dbebc20, 0x8f6e6b28,
-    0x911502f9, 0x92ba43b7, 0x9468d4a5, 0x961184e7, 0x97b5e621, 0x99635fa9, 0x9b0e1bca,
-    0x9cb1a2bc, 0x9e5e0b6b, 0xa00ac723, 0xa1ad78ec, 0xa358d727, 0xa5078678, 0xa6a96816,
-    0xa853c21c, 0xaa045951, 0xaba56fa6, 0xad4ecb8f, 0xaf013f39, 0xb0a18f08, 0xb249f2ca,
-    0xb3fc6f7c, 0xb59dc5ae, 0xb7453719, 0xb8f684df, 0xba9a130c, 0xbc4097ce, 0xbdf0bdc2,
-    0xbf967699, 0xc13c1440, 0xc2eb1950, 0xc492efd2, 0xc637abc6, 0xc7e596b8, 0xc98f7e33,
-    0xcb335dc0, 0xcce0352f, 0xce8c213e, 0xd02f298d, 0xd1daf3f0, 0xd388d876, 0xd52b0e94,
-    0xd6d5d239, 0xd885a363, 0xda270c3c, 0xdbd0cf4b, 0xdd82818f, 0xdf2321f3, 0xe0cbea70,
-    0xe27ee50b, 0xe41f4f27, 0xe5c722f1, 0xe778ebad, 0xe91b934c, 0xeac2781f, 0xec731627,
-    0xee17edd8, 0xefbde94f, 0xf16d63a2, 0xf3145e45, 0xf4b975d7, 0xf667d34c, 0xf810e410,
-    0xf9b51d14, 0xfb626459, 0xfd0d7eb7, 0xfeb0de65 };
-
-////////////////////////////////////////////////////////////////////////////////
-const std::string FloatTest::expectedStringFor1_17eN38To38[] = {
-    "-1.17549435E-38",
-    "-1.1754944E-37", "-1.17549435E-36", "-1.17549435E-35", "-1.1754944E-34",
-    "-1.17549435E-33", "-1.17549435E-32", "-1.1754944E-31", "-1.17549435E-30",
-    "-1.17549435E-29", "-1.1754944E-28", "-1.1754943E-27", "-1.17549435E-26",
-    "-1.1754943E-25", "-1.1754944E-24", "-1.1754943E-23", "-1.1754944E-22",
-    "-1.1754943E-21", "-1.1754943E-20", "-1.1754943E-19", "-1.1754944E-18",
-    "-1.1754944E-17", "-1.1754943E-16", "-1.1754943E-15", "-1.1754944E-14",
-    "-1.1754943E-13", "-1.1754944E-12", "-1.1754943E-11", "-1.1754943E-10",
-    "-1.1754944E-9", "-1.1754944E-8", "-1.1754943E-7", "-1.1754944E-6",
-    "-1.1754943E-5", "-1.1754943E-4", "-0.0011754944", "-0.011754943", "-0.117549434",
-    "-1.1754943", "-11.754944", "-117.54944", "-1175.4944", "-11754.943", "-117549.44",
-    "-1175494.4", "-1.1754944E7", "-1.17549432E8", "-1.1754944E9", "-1.17549435E10",
-    "-1.17549433E11", "-1.17549433E12", "-1.17549438E13", "-1.17549438E14",
-    "-1.1754943E15", "-1.17549432E16", "-1.17549432E17", "-1.17549434E18",
-    "-1.1754944E19", "-1.1754944E20", "-1.1754943E21", "-1.1754943E22",
-    "-1.1754944E23", "-1.17549434E24", "-1.1754943E25", "-1.1754943E26",
-    "-1.17549434E27", "-1.1754943E28", "-1.1754944E29", "-1.1754943E30",
-    "-1.1754943E31", "-1.1754944E32", "-1.1754943E33", "-1.1754944E34",
-    "-1.1754944E35", "-1.1754944E36", "-1.1754943E37", "-1.1754943E38" };
-
-////////////////////////////////////////////////////////////////////////////////
-FloatTest::FloatTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::doTestCompareRawBits( const std::string& originalFloatString,
-                                      int expectedRawBits,
-                                      const std::string& expectedString ) {
-
-    int rawBits;
-    float result = Float::parseFloat( originalFloatString );
-    rawBits = Float::floatToIntBits( result );
-    CPPUNIT_ASSERT_MESSAGE(
-        std::string( "Original float(" ) + originalFloatString +
-        ") Converted float(" + Float::toString( result ) +
-        ") Expecting:" + Integer::toHexString( expectedRawBits ) +
-        " Got: " + Integer::toHexString( rawBits ),
-        expectedRawBits == rawBits );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_ConstructorF() {
-    // Test for method decaf.lang.Float(float)
-    Float f( 900.89f );
-    CPPUNIT_ASSERT_MESSAGE( "Created incorrect float", f.floatValue() == 900.89f );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_ConstructorString() {
-    // Test for method decaf.lang.Float(decaf.lang.String)
-    Float f( "900.89" );
-    CPPUNIT_ASSERT_MESSAGE("Created incorrect Float", f.floatValue() == 900.89f);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_byteValue() {
-    // Test for method byte decaf.lang.Float::byteValue()
-    Float f( 0.46874f );
-    Float f2( 90.8f );
-
-    CPPUNIT_ASSERT_MESSAGE( "Returned incorrect byte value",
-                            f.byteValue() == 0 && f2.byteValue() == 90 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_compare() {
-
-    float values[] = { Float::NEGATIVE_INFINITY,
-                       -Float::MAX_VALUE,
-                       -2.0f,
-                       -Float::MIN_VALUE,
-                       -0.0f, 0.0f,
-                       Float::MIN_VALUE,
-                       2.0f,
-                       Float::MAX_VALUE,
-                       Float::POSITIVE_INFINITY,
-                       Float::NaN };
-
-    for( std::size_t i = 0; i < sizeof(values) / sizeof(float); i++ ) {
-
-        float f1 = values[i];
-        CPPUNIT_ASSERT_MESSAGE( "compare() should be equal:",
-                                Float::compare( f1, f1 ) == 0 );
-        Float F1( f1 );
-        CPPUNIT_ASSERT_MESSAGE( "compareTo() should be equal: ",
-                                F1.compareTo( F1 ) == 0);
-
-        for( std::size_t j = i + 1; j < sizeof(values) / sizeof(float); j++ ) {
-            float f2 = values[j];
-            CPPUNIT_ASSERT_MESSAGE( "compare() should be less ",
-                    Float::compare(f1, f2) == -1 );
-            CPPUNIT_ASSERT_MESSAGE( "compare() should be greater ",
-                    Float::compare(f2, f1) == 1 );
-            Float F2(f2);
-            CPPUNIT_ASSERT_MESSAGE( "compareTo() should be less ",
-                                    F1.compareTo(F2) == -1 );
-            CPPUNIT_ASSERT_MESSAGE( "compareTo() should be greater ",
-                                    F2.compareTo(F1) == 1 );
-        }
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_doubleValue() {
-    // Test for method double decaf.lang.Float::doubleValue()
-    CPPUNIT_ASSERT_MESSAGE(
-        "Incorrect double value returned",
-        Math::abs( Float( 999999.999f ).doubleValue() - 999999.999 ) < 1 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_floatToIntBitsF() {
-    float f = 9876.2345f;
-    int bits = Float::floatToIntBits( f );
-    float r = Float::intBitsToFloat( bits );
-    CPPUNIT_ASSERT_MESSAGE("Incorrect intBits returned", f == r);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_floatToRawIntBitsF() {
-    int i = 0x7fc004d2;
-    float f = Float::intBitsToFloat( i );
-    CPPUNIT_ASSERT_MESSAGE( "Wrong raw bits", Float::floatToRawIntBits(f) == i );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_floatValue() {
-    // Test for method float decaf.lang.Float::floatValue()
-    Float f( 87.657f );
-    Float f2( -0.876f );
-    CPPUNIT_ASSERT_MESSAGE( "Returned incorrect floatValue",
-                            f.floatValue() == 87.657f &&
-                            ( f2.floatValue() == -0.876f ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_intBitsToFloatI() {
-    float f = 9876.2345f;
-    int bits = Float::floatToIntBits(f);
-    float r = Float::intBitsToFloat(bits);
-    CPPUNIT_ASSERT_MESSAGE("Incorrect intBits returned", f == r );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_intValue() {
-    // Test for method int decaf.lang.Float::intValue()
-    Float f( 0.46874f );
-    Float f2( 90.8f );
-    CPPUNIT_ASSERT_MESSAGE( "Returned incorrect int value",
-                            f.intValue() == 0 && f2.intValue() == 90 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_isInfinite() {
-    // Test for method boolean decaf.lang.Float::isInfinite()
-    CPPUNIT_ASSERT_MESSAGE("Infinity check failed",
-            Float( Float::POSITIVE_INFINITY ).isInfinite() &&
-            Float( Float::NEGATIVE_INFINITY ).isInfinite() &&
-            !(Float( 0.13131414f ).isInfinite() ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_isInfiniteF() {
-    // Test for method boolean decaf.lang.Float::isInfinite(float)
-
-    CPPUNIT_ASSERT_MESSAGE( "Infinity check failed",
-        Float::isInfinite( Float::POSITIVE_INFINITY ) &&
-        (Float::isInfinite( Float::NEGATIVE_INFINITY) ) &&
-         !( Float::isInfinite( 1.0f ) ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_isNaN() {
-    // Test for method boolean decaf.lang.Float::isNaN()
-    CPPUNIT_ASSERT_MESSAGE( "NAN check failed",
-        Float( Float::NaN ).isNaN() && !( Float( 1.0f ).isNaN() ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_isNaNF() {
-    // Test for method boolean decaf.lang.Float::isNaN(float)
-    CPPUNIT_ASSERT_MESSAGE( "NaN check failed",
-        Float::isNaN( Float::NaN ) && !( Float::isNaN( 12.09f ) ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_longValue() {
-    // Test for method long decaf.lang.Float::longValue()
-    Float f( 0.46874f );
-    Float f2( 90.8f );
-    CPPUNIT_ASSERT_MESSAGE( "Returned incorrect long value",
-        f.longValue() == 0 && f2.longValue() == 90 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void FloatTest::test_parseFloatLDecaf_lang_String() {
-
-    CPPUNIT_ASSERT_MESSAGE( "Incorrect float returned, expected zero.",
-            0.0 == Float::parseFloat("7.0064923216240853546186479164495e-46"));
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float returned, expected minimum float.",
-            Float::MIN_VALUE ==
-            Float::parseFloat("7.0064923216240853546186479164496e-46") );
-
-//    doTestCompareRawBits(
-//            "0.000000000000000000000000000000000000011754942807573642917278829910357665133228589927589904276829631184250030649651730385585324256680905818939208984375",
-//            0x800000, "1.17549435E-38");
-//    doTestCompareRawBits(
-//            "0.00000000000000000000000000000000000001175494280757364291727882991035766513322858992758990427682963118425003064965173038558532425668090581893920898437499999f",
-//            0x7fffff, "1.1754942E-38");
-//
-//    /* Test a set of regular floats with exponents from -38 to +38 */
-//    for (int i = 38; i > 3; i--) {
-//        std::string testString;
-//        testString = "3.4028234663852886e-" + i;
-//        doTestCompareRawBits(testString, rawBitsFor3_4eN38To38[38 - i],
-//                expectedStringFor3_4eN38To38[38 - i]);
-//    }
-//    doTestCompareRawBits("3.4028234663852886e-3", rawBitsFor3_4eN38To38[38 - 3],
-//            expectedStringFor3_4eN38To38[38 - 3]);
-//    doTestCompareRawBits("3.4028234663852886e-2", rawBitsFor3_4eN38To38[38 - 2],
-//            expectedStringFor3_4eN38To38[38 - 2]);
-//    doTestCompareRawBits("3.4028234663852886e-1", rawBitsFor3_4eN38To38[38 - 1],
-//            expectedStringFor3_4eN38To38[38 - 1]);
-//    doTestCompareRawBits("3.4028234663852886e-0", rawBitsFor3_4eN38To38[38 - 0],
-//            expectedStringFor3_4eN38To38[38 - 0]);
-//    doTestCompareRawBits("3.4028234663852886e+1", rawBitsFor3_4eN38To38[38 + 1],
-//            expectedStringFor3_4eN38To38[38 + 1]);
-//    doTestCompareRawBits("3.4028234663852886e+2", rawBitsFor3_4eN38To38[38 + 2],
-//            expectedStringFor3_4eN38To38[38 + 2]);
-//    doTestCompareRawBits("3.4028234663852886e+3", rawBitsFor3_4eN38To38[38 + 3],
-//            expectedStringFor3_4eN38To38[38 + 3]);
-//    doTestCompareRawBits("3.4028234663852886e+4", rawBitsFor3_4eN38To38[38 + 4],
-//            expectedStringFor3_4eN38To38[38 + 4]);
-//    doTestCompareRawBits("3.4028234663852886e+5", rawBitsFor3_4eN38To38[38 + 5],
-//            expectedStringFor3_4eN38To38[38 + 5]);
-//    doTestCompareRawBits("3.4028234663852886e+6", rawBitsFor3_4eN38To38[38 + 6],
-//            expectedStringFor3_4eN38To38[38 + 6]);
-//
-//    for (int i = 7; i < 39; i++) {
-//        std::string testString;
-//        testString = "3.4028234663852886e+" + i;
-//        doTestCompareRawBits(testString, rawBitsFor3_4eN38To38[38 + i],
-//                expectedStringFor3_4eN38To38[38 + i]);
-//    }
-//
-//    /* Test another set of regular floats with exponents from -38 to +38 */
-//    for (int i = 38; i > 3; i--) {
-//        std::string testString;
-//        testString = "-1.1754943508222875e-" + i;
-//        doTestCompareRawBits(testString, rawBitsFor1_17eN38To38[38 - i],
-//                expectedStringFor1_17eN38To38[38 - i]);
-//    }
-//    doTestCompareRawBits("-1.1754943508222875e-3", rawBitsFor1_17eN38To38[38 - 3],
-//            expectedStringFor1_17eN38To38[38 - 3]);
-//    doTestCompareRawBits("-1.1754943508222875e-2", rawBitsFor1_17eN38To38[38 - 2],
-//            expectedStringFor1_17eN38To38[38 - 2]);
-//    doTestCompareRawBits("-1.1754943508222875e-1", rawBitsFor1_17eN38To38[38 - 1],
-//            expectedStringFor1_17eN38To38[38 - 1]);
-//    doTestCompareRawBits("-1.1754943508222875e-0", rawBitsFor1_17eN38To38[38 - 0],
-//            expectedStringFor1_17eN38To38[38 - 0]);
-//    doTestCompareRawBits("-1.1754943508222875e+1", rawBitsFor1_17eN38To38[38 + 1],
-//            expectedStringFor1_17eN38To38[38 + 1]);
-//    doTestCompareRawBits("-1.1754943508222875e+2", rawBitsFor1_17eN38To38[38 + 2],
-//            expectedStringFor1_17eN38To38[38 + 2]);
-//    doTestCompareRawBits("-1.1754943508222875e+3", rawBitsFor1_17eN38To38[38 + 3],
-//            expectedStringFor1_17eN38To38[38 + 3]);
-//    doTestCompareRawBits("-1.1754943508222875e+4", rawBitsFor1_17eN38To38[38 + 4],
-//            expectedStringFor1_17eN38To38[38 + 4]);
-//    doTestCompareRawBits("-1.1754943508222875e+5", rawBitsFor1_17eN38To38[38 + 5],
-//            expectedStringFor1_17eN38To38[38 + 5]);
-//    doTestCompareRawBits("-1.1754943508222875e+6", rawBitsFor1_17eN38To38[38 + 6],
-//            expectedStringFor1_17eN38To38[38 + 6]);
-
-//    for( int i = 7; i < 39; i++ ) {
-//        std::string testString;
-//        testString = "-1.1754943508222875e+" + Integer::toString( i );
-//        doTestCompareRawBits( testString,
-//                              rawBitsFor1_17eN38To38[38 + i],
-//                              expectedStringFor1_17eN38To38[38 + i] );
-//    }
-
-    // Test denormalized floats (floats with exponents <= -38
-    doTestCompareRawBits("1.1012984643248170E-45", 1, "1.4E-45");
-    doTestCompareRawBits("-1.1012984643248170E-45", 0x80000001, "-1.4E-45");
-    doTestCompareRawBits("1.0E-45", 1, "1.4E-45");
-    doTestCompareRawBits("-1.0E-45", 0x80000001, "-1.4E-45");
-    doTestCompareRawBits("0.9E-45", 1, "1.4E-45");
-    doTestCompareRawBits("-0.9E-45", 0x80000001, "-1.4E-45");
-    doTestCompareRawBits("4.203895392974451e-45", 3, "4.2E-45");
-    doTestCompareRawBits("-4.203895392974451e-45", 0x80000003, "-4.2E-45");
-    doTestCompareRawBits("0.004E-45", 0, "0.0");
-    doTestCompareRawBits("-0.004E-45", 0x80000000, "-0.0");
-
-    // Test for large floats close to and greater than 3.4028235E38 and
-    // -3.4028235E38
-    doTestCompareRawBits("1.2E+38", 0x7eb48e52, "1.2E38");
-    doTestCompareRawBits("-1.2E+38", 0xfeb48e52, "-1.2E38");
-    doTestCompareRawBits("3.2E+38", 0x7f70bdc2, "3.2E38");
-    doTestCompareRawBits("-3.2E+38", 0xff70bdc2, "-3.2E38");
-    doTestCompareRawBits("3.4E+38", 0x7f7fc99e, "3.4E38");
-    doTestCompareRawBits("-3.4E+38", 0xff7fc99e, "-3.4E38");
-    doTestCompareRawBits("3.4028234663852886E+38", 0x7f7fffff, "3.4028235E38");
-    doTestCompareRawBits("-3.4028234663852886E+38", 0xff7fffff, "-3.4028235E38");
-    doTestCompareRawBits("3.405E+38", 0x7f800000, "Infinity");
-    doTestCompareRawBits("-3.405E+38", 0xff800000, "-Infinity");
-    doTestCompareRawBits("3.41E+38", 0x7f800000, "Infinity");
-    doTestCompareRawBits("-3.41E+38", 0xff800000, "-Infinity");
-    doTestCompareRawBits("3.42E+38", 0x7f800000, "Infinity");
-    doTestCompareRawBits("-3.42E+38", 0xff800000, "-Infinity");
-    doTestCompareRawBits("1.0E+39", 0x7f800000, "Infinity");
-    doTestCompareRawBits("-1.0E+39", 0xff800000, "-Infinity");
-}
diff --git a/src/decaf/src/test/decaf/lang/FloatTest.h b/src/decaf/src/test/decaf/lang/FloatTest.h
deleted file mode 100644
index 95bf288..0000000
--- a/src/decaf/src/test/decaf/lang/FloatTest.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_FLOATTEST_H_
-#define _DECAF_LANG_FLOATTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace lang{
-
-    class FloatTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( FloatTest );
-        CPPUNIT_TEST( test_ConstructorF );
-        CPPUNIT_TEST( test_ConstructorString );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_compare );
-//        CPPUNIT_TEST( test_doubleValue );
-//        CPPUNIT_TEST( test_floatToIntBitsF );
-//        CPPUNIT_TEST( test_floatToRawIntBitsF );
-//        CPPUNIT_TEST( test_floatValue );
-//        CPPUNIT_TEST( test_intBitsToFloatI );
-//        CPPUNIT_TEST( test_intValue );
-//        CPPUNIT_TEST( test_isInfinite );
-//        CPPUNIT_TEST( test_isInfiniteF );
-//        CPPUNIT_TEST( test_isNaN );
-//        CPPUNIT_TEST( test_isNaNF );
-//        CPPUNIT_TEST( test_longValue );
-//        CPPUNIT_TEST( test_parseFloatLDecaf_lang_String );
-
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-//        CPPUNIT_TEST( test_byteValue );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        static const int rawBitsFor3_4eN38To38[];
-        static const std::string expectedStringFor3_4eN38To38[];
-        static const int rawBitsFor1_17eN38To38[];
-        static const std::string expectedStringFor1_17eN38To38[];
-
-        FloatTest();
-        virtual ~FloatTest() {}
-
-        void test_ConstructorF();
-        void test_ConstructorString();
-        void test_byteValue();
-        void test_compare();
-        void test_doubleValue();
-        void test_floatToIntBitsF();
-        void test_floatToRawIntBitsF();
-        void test_floatValue();
-        void test_intBitsToFloatI();
-        void test_intValue();
-        void test_isInfinite();
-        void test_isInfiniteF();
-        void test_isNaN();
-        void test_isNaNF();
-        void test_longValue();
-        void test_parseFloatLDecaf_lang_String();
-
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-//        void test_byteValue();
-
-    private:
-
-        void doTestCompareRawBits( const std::string& originalFloatString,
-                                   int expectedRawBits,
-                                   const std::string& expectedString );
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_FLOATTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/IntegerTest.cpp b/src/decaf/src/test/decaf/lang/IntegerTest.cpp
deleted file mode 100644
index b843cba..0000000
--- a/src/decaf/src/test/decaf/lang/IntegerTest.cpp
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "IntegerTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-void IntegerTest::test(void)
-{
-    int x = Integer::parseInt("12");
-    int y = Integer::parseInt("FF", 16);
-    int z = Integer::parseInt("42");
-
-    CPPUNIT_ASSERT( x == 12 );
-    CPPUNIT_ASSERT( y == 255 );
-    CPPUNIT_ASSERT( z == 42 );
-
-    std::string x1 = Integer::toString( x );
-    std::string y1 = Integer::toString( y );
-    std::string z1 = Integer::toString( z );
-
-    CPPUNIT_ASSERT( x1 == "12" );
-    CPPUNIT_ASSERT( y1 == "255" );
-    CPPUNIT_ASSERT( z1 == "42" );
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void IntegerTest::test2() {
-    Integer integer( 255 );
-
-    // Test cast functions
-    CPPUNIT_ASSERT( integer.byteValue() == 255 );
-    CPPUNIT_ASSERT( integer.shortValue() ==  255 );
-    CPPUNIT_ASSERT( integer.intValue() == 255 );
-    CPPUNIT_ASSERT( integer.longValue() == 255 );
-    CPPUNIT_ASSERT( integer.floatValue() == 255.0f );
-    CPPUNIT_ASSERT( integer.doubleValue() == 255.0 );
-
-    // Comparison functions
-    CPPUNIT_ASSERT( integer.compareTo( 256 ) == -1 );
-    CPPUNIT_ASSERT( integer.compareTo( 255 ) == 0 );
-    CPPUNIT_ASSERT( integer.compareTo( 254 ) == 1 );
-    CPPUNIT_ASSERT( integer.equals( Integer( 255 ) ) == true );
-    CPPUNIT_ASSERT( integer.compareTo( Integer( 255 ) ) == 0 );
-    CPPUNIT_ASSERT( integer == Integer( 255 ) );
-
-    // decode
-    CPPUNIT_ASSERT( integer == Integer::decode( "255" ) );
-    CPPUNIT_ASSERT( integer == Integer::decode( "0xFF" ) );
-    CPPUNIT_ASSERT( integer == Integer::decode( "255" ) );
-    CPPUNIT_ASSERT( Integer::decode( "-255" ) == -255 );
-
-    // reverseBytes
-    CPPUNIT_ASSERT( (int)0xFF000000 == Integer::reverseBytes( 255 ) );
-
-    // reverse
-    CPPUNIT_ASSERT( Integer::reverse( Integer::reverse( 255 ) ) == 255 );
-
-    // parseInt
-    CPPUNIT_ASSERT( Integer::parseInt( "255") == 255 );
-    CPPUNIT_ASSERT( Integer::parseInt( "255", 10 ) == 255 );
-    CPPUNIT_ASSERT( Integer::parseInt( "255", 11 ) != 255 );
-    CPPUNIT_ASSERT( Integer::parseInt( "FF", 16 ) == 255 );
-
-    // valueOf
-    CPPUNIT_ASSERT( Integer::valueOf( 255 ) == 255 );
-    CPPUNIT_ASSERT( Integer::valueOf( "255" ) == 255 );
-    CPPUNIT_ASSERT( Integer::valueOf( "255", 10 ) == 255 );
-    CPPUNIT_ASSERT( (Integer::valueOf( "255", 11 )).intValue() != 255 );
-    CPPUNIT_ASSERT( Integer::valueOf( "FF", 16 ) == 255 );
-
-    // bitCount
-    CPPUNIT_ASSERT( Integer::bitCount( 255 ) == 8 );
-    CPPUNIT_ASSERT( Integer::bitCount( 0xFFFFFFFF ) == 32 );
-
-    //toXXXString
-    CPPUNIT_ASSERT( Integer::toString( 255 ) == "255" );
-    CPPUNIT_ASSERT( Integer::toString( 255, 16 ) == "ff" );
-    CPPUNIT_ASSERT( Integer::toHexString( 255 ) == "ff" );
-    CPPUNIT_ASSERT( Integer::toOctalString( 255 ) == "377" );
-    CPPUNIT_ASSERT( Integer::toBinaryString( 255 ) == "11111111" );
-    CPPUNIT_ASSERT( Integer::toString( 255255 ) == "255255" );
-
-    // highestOneBit
-    CPPUNIT_ASSERT( Integer::highestOneBit( 255 ) == 128 );
-    CPPUNIT_ASSERT( Integer::highestOneBit( 0xFF000000 ) == (int)0x80000000 );
-
-    // lowestOneBit
-    CPPUNIT_ASSERT( Integer::lowestOneBit( 255 ) == 1 );
-    CPPUNIT_ASSERT( Integer::lowestOneBit( 0xFF000000 ) == (int)0x01000000 );
-}
diff --git a/src/decaf/src/test/decaf/lang/IntegerTest.h b/src/decaf/src/test/decaf/lang/IntegerTest.h
deleted file mode 100644
index 881b723..0000000
--- a/src/decaf/src/test/decaf/lang/IntegerTest.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_INTEGERTEST_H_
-#define _DECAF_LANG_INTEGERTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Integer.h>
-
-namespace decaf{
-namespace lang{
-
-    class IntegerTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( IntegerTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST( test2 );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        IntegerTest(void) {}
-        virtual ~IntegerTest(void) {}
-
-        virtual void test();
-        virtual void test2();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_INTEGERTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/LongTest.cpp b/src/decaf/src/test/decaf/lang/LongTest.cpp
deleted file mode 100644
index d745579..0000000
--- a/src/decaf/src/test/decaf/lang/LongTest.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "LongTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-void LongTest::test() {
-
-    long long x = Long::parseLong("12");
-    long long y = Long::parseLong("FF", 16);
-    long long z = Long::parseLong("42");
-
-    CPPUNIT_ASSERT( x == 12 );
-    CPPUNIT_ASSERT( y == 255 );
-    CPPUNIT_ASSERT( z == 42 );
-
-    std::string x1 = Long::toString( x );
-    std::string y1 = Long::toString( y );
-    std::string z1 = Long::toString( z );
-
-    CPPUNIT_ASSERT( x1 == "12" );
-    CPPUNIT_ASSERT( y1 == "255" );
-    CPPUNIT_ASSERT( z1 == "42" );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void LongTest::test2() {
-
-    Long llong( 255 );
-
-    // Test cast functions
-    CPPUNIT_ASSERT( llong.byteValue() == 255 );
-    CPPUNIT_ASSERT( llong.shortValue() ==  255 );
-    CPPUNIT_ASSERT( llong.intValue() == 255 );
-    CPPUNIT_ASSERT( llong.longValue() == 255 );
-    CPPUNIT_ASSERT( llong.floatValue() == 255.0f );
-    CPPUNIT_ASSERT( llong.doubleValue() == 255.0 );
-
-    // Comparison functions
-    CPPUNIT_ASSERT( llong.compareTo( 256 ) == -1 );
-    CPPUNIT_ASSERT( llong.compareTo( 255 ) == 0 );
-    CPPUNIT_ASSERT( llong.compareTo( 254 ) == 1 );
-    CPPUNIT_ASSERT( llong.equals( Long( 255 ) ) == true );
-    CPPUNIT_ASSERT( llong.compareTo( Long( 255 ) ) == 0 );
-    CPPUNIT_ASSERT( llong == Long( 255 ) );
-
-    // decode
-    CPPUNIT_ASSERT( llong == Long::decode( "255" ) );
-    CPPUNIT_ASSERT( llong == Long::decode( "0xFF" ) );
-    CPPUNIT_ASSERT( llong == Long::decode( "255" ) );
-    CPPUNIT_ASSERT( Long::decode( "-255" ) == -255 );
-
-    // reverseBytes
-    CPPUNIT_ASSERT( (long long)0xFF00000000000000LL == Long::reverseBytes( 255 ) );
-
-    // reverse
-    CPPUNIT_ASSERT( Long::reverse( Long::reverse( 255 ) ) == 255 );
-
-    // parseInt
-    CPPUNIT_ASSERT( Long::parseLong( "255") == 255 );
-    CPPUNIT_ASSERT( Long::parseLong( "255", 10 ) == 255 );
-    CPPUNIT_ASSERT( Long::parseLong( "255", 11 ) != 255 );
-    CPPUNIT_ASSERT( Long::parseLong( "FF", 16 ) == 255 );
-
-    // valueOf
-    CPPUNIT_ASSERT( Long::valueOf( 255 ) == 255 );
-    CPPUNIT_ASSERT( Long::valueOf( "255" ) == 255 );
-    CPPUNIT_ASSERT( Long::valueOf( "255", 10 ) == 255 );
-    CPPUNIT_ASSERT( (Long::valueOf( "255", 11 )).intValue() != 255 );
-    CPPUNIT_ASSERT( Long::valueOf( "FF", 16 ) == 255 );
-
-    // bitCount
-    CPPUNIT_ASSERT( Long::bitCount( 255 ) == 8 );
-    CPPUNIT_ASSERT( Long::bitCount( 0xFFFFFFFF ) == 32 );
-
-    //toXXXString
-    CPPUNIT_ASSERT( Long::toString( 255 ) == "255" );
-    CPPUNIT_ASSERT( Long::toString( 255, 16 ) == "ff" );
-    CPPUNIT_ASSERT( Long::toHexString( 255 ) == "ff" );
-    CPPUNIT_ASSERT( Long::toOctalString( 255 ) == "377" );
-    CPPUNIT_ASSERT( Long::toBinaryString( 255 ) == "11111111" );
-    CPPUNIT_ASSERT( Long::toString( 255255 ) == "255255" );
-
-    // highestOneBit
-    CPPUNIT_ASSERT( Long::highestOneBit( 255 ) == 128 );
-    CPPUNIT_ASSERT( Long::highestOneBit( 0xFF000000 ) == (long long)0x80000000 );
-
-    // lowestOneBit
-    CPPUNIT_ASSERT( Long::lowestOneBit( 255 ) == 1 );
-    CPPUNIT_ASSERT( Long::lowestOneBit( 0xFF000000 ) == (long long)0x01000000 );
-
-}
diff --git a/src/decaf/src/test/decaf/lang/LongTest.h b/src/decaf/src/test/decaf/lang/LongTest.h
deleted file mode 100644
index 29d62d1..0000000
--- a/src/decaf/src/test/decaf/lang/LongTest.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_LONGTEST_H_
-#define _DECAF_LANG_LONGTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Long.h>
-
-namespace decaf{
-namespace lang{
-
-    class LongTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( LongTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST( test2 );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        LongTest() {}
-        virtual ~LongTest() {}
-
-        virtual void test();
-        virtual void test2();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_LONGTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/MathTest.cpp b/src/decaf/src/test/decaf/lang/MathTest.cpp
deleted file mode 100644
index f4b16cb..0000000
--- a/src/decaf/src/test/decaf/lang/MathTest.cpp
+++ /dev/null
@@ -1,687 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MathTest.h"
-
-#include <decaf/lang/Math.h>
-#include <decaf/lang/Double.h>
-#include <decaf/lang/Float.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-MathTest::MathTest() {
-    this->HYP = Math::sqrt( 2.0 );
-    this->OPP = 1.0;
-    this->ADJ = 1.0;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_absD() {
-    // Test for method double decaf.lang.Math.abs(double)
-
-    CPPUNIT_ASSERT_MESSAGE( "Incorrect double abs value",
-            ( Math::abs(-1908.8976) == 1908.8976));
-    CPPUNIT_ASSERT_MESSAGE( "Incorrect double abs value",
-            ( Math::abs(1908.8976) == 1908.8976));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_absF() {
-    // Test for method float decaf.lang.Math::abs(float)
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float abs value",
-            (Math::abs(-1908.8976f) == 1908.8976f));
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float abs value",
-            (Math::abs(1908.8976f) == 1908.8976f));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_absI() {
-    // Test for method int decaf.lang.Math::abs(int)
-    CPPUNIT_ASSERT_MESSAGE("Incorrect int abs value", (Math::abs(-1908897) == 1908897));
-    CPPUNIT_ASSERT_MESSAGE("Incorrect int abs value", (Math::abs(1908897) == 1908897));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_absJ() {
-    // Test for method long decaf.lang.Math::abs(long)
-    CPPUNIT_ASSERT_MESSAGE("Incorrect long abs value",
-            (Math::abs(-19088976000089LL) == 19088976000089LL));
-    CPPUNIT_ASSERT_MESSAGE("Incorrect long abs value",
-            (Math::abs(19088976000089LL) == 19088976000089LL));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_acosD() {
-    // Test for method double decaf.lang.Math::acos(double)
-    double r = Math::cos(Math::acos(ADJ / HYP));
-    long long lr = Double::doubleToLongBits(r);
-    long long t = Double::doubleToLongBits(ADJ / HYP);
-    CPPUNIT_ASSERT_MESSAGE("Returned incorrect arc cosine", lr == t || (lr + 1) == t
-            || (lr - 1) == t);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_asinD() {
-    // Test for method double decaf.lang.Math::asin(double)
-    double r = Math::sin(Math::asin(OPP / HYP));
-    long long lr = Double::doubleToLongBits(r);
-    long long t = Double::doubleToLongBits(OPP / HYP);
-    CPPUNIT_ASSERT_MESSAGE("Returned incorrect arc sine", lr == t || (lr + 1) == t
-            || (lr - 1) == t);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_atanD() {
-    // Test for method double decaf.lang.Math::atan(double)
-    double answer = Math::tan(Math::atan(1.0));
-    CPPUNIT_ASSERT_MESSAGE("Returned incorrect arc tangent: ",
-            answer <= 1.0 && answer >= 9.9999999999999983E-1);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_atan2DD() {
-    // Test for method double decaf.lang.Math::atan2(double, double)
-    double answer = Math::atan(Math::tan(1.0));
-    CPPUNIT_ASSERT_MESSAGE("Returned incorrect arc tangent: ",
-            answer <= 1.0 && answer >= 9.9999999999999983E-1);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_cbrt_D() {
-    //Test for special situations
-    CPPUNIT_ASSERT_MESSAGE("Should return Double::NaN",
-            Double::isNaN(Math::cbrt(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return Double::POSITIVE_INFINITY",
-            Math::cbrt(Double::POSITIVE_INFINITY), Double::POSITIVE_INFINITY );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return Double::NEGATIVE_INFINITY",
-            Math::cbrt(Double::NEGATIVE_INFINITY), Double::NEGATIVE_INFINITY);
-    CPPUNIT_ASSERT_EQUAL(
-            Double::doubleToLongBits(0.0),
-            Double::doubleToLongBits(Math::cbrt(0.0)));
-    CPPUNIT_ASSERT_EQUAL( Double::doubleToLongBits(+0.0),
-                          Double::doubleToLongBits(Math::cbrt(+0.0)));
-    CPPUNIT_ASSERT_EQUAL( Double::doubleToLongBits(-0.0),
-                          Double::doubleToLongBits(Math::cbrt(-0.0)));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 3.0", Math::cbrt(27.0), 3.0);
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 5.643803094122362E102",
-            5.643803094122362E102, Math::cbrt(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 0.01", 0.01, Math::cbrt(0.000001));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -3.0", -3.0, Math::cbrt(-27.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.7031839360032603E-108",
-            1.7031839360032603E-108, Math::cbrt(Double::MIN_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -0.01", -0.01, Math::cbrt(-0.000001));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_ceilD() {
-    // Test for method double decaf.lang.Math::ceil(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE( "Incorrect ceiling for double",
-                                  79.0, Math::ceil(78.89) );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect ceiling for double",
-                         -78.0, Math::ceil(-78.89) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_cosD() {
-    // Test for method double decaf.lang.Math::cos(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect answer", 1.0, Math::cos(0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect answer", 0.5403023058681398, Math::cos(1));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_cosh_D() {
-    // Test for special situations
-    CPPUNIT_ASSERT(Double::isNaN(Math::cosh(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::cosh(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::cosh(Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0", 1.0, Math::cosh(+0.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0", 1.0, Math::cosh(-0.0));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::cosh(1234.56));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::cosh(-1234.56));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0000000000005",
-            1.0000000000005, Math::cosh(0.000001));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0000000000005",
-            1.0000000000005, Math::cosh(-0.000001));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 5.212214351945598",
-            5.212214351945598, Math::cosh(2.33482));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::cosh(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0",
-            1.0, Math::cosh(Double::MIN_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_expD() {
-    // Test for method double decaf.lang.Math::exp(double)
-    CPPUNIT_ASSERT_MESSAGE("Incorrect answer returned for simple power",
-            Math::abs(Math::exp(4.0) -
-            Math::E * Math::E * Math::E * Math::E) < 0.1 );
-    CPPUNIT_ASSERT_MESSAGE("Incorrect answer returned for larger power",
-            Math::log( Math::abs( Math::exp(5.5) ) - 5.5) < 10.0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_expm1_D() {
-    // Test for special cases
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Double::isNaN(Math::expm1(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::expm1(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -1.0", -1.0,
-            Math::expm1(Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL( Double::doubleToLongBits(0.0),
-                          Double::doubleToLongBits(Math::expm1(0.0)) );
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(+0.0),
-            Double::doubleToLongBits(Math::expm1(+0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(-0.0),
-            Double::doubleToLongBits(Math::expm1(-0.0)));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -9.999950000166666E-6",
-            -9.999950000166666E-6, Math::expm1(-0.00001));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0145103074469635E60",
-            1.0145103074469635E60, Math::expm1(138.16951162));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY,
-            Math::expm1(123456789123456789123456789.4521584223));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::expm1(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return MIN_VALUE", Double::MIN_VALUE,
-            Math::expm1(Double::MIN_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_floorD() {
-    // Test for method double decaf.lang.Math::floor(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect floor for double",
-                         78.0, Math::floor(78.89));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect floor for double",
-                         -79.0, Math::floor(-78.89));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_hypot_DD() {
-    // Test for special cases
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::hypot(Double::POSITIVE_INFINITY,
-                    1.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::hypot(Double::NEGATIVE_INFINITY,
-                    123.324));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY,
-            Math::hypot(-758.2587,Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY,
-            Math::hypot(5687.21, Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::hypot(Double::POSITIVE_INFINITY,
-                    Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::hypot(Double::NEGATIVE_INFINITY,
-                    Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_MESSAGE("Should be NaN", Double::isNaN(Math::hypot(Double::NaN,
-            2342301.89843)));
-    CPPUNIT_ASSERT_MESSAGE("Should be NaN", Double::isNaN(Math::hypot(-345.2680,
-            Double::NaN)));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 2396424.905416697",
-            2396424.905416697, Math::hypot(12322.12, -2396393.2258));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 138.16958070558556", 138.16958070558556,
-            Math::hypot(-138.16951162, 0.13817035864));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.7976931348623157E308",
-            1.7976931348623157E308, Math::hypot(Double::MAX_VALUE, 211370.35));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 5413.7185", 5413.7185, Math::hypot(
-            -5413.7185, Double::MIN_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_IEEEremainderDD() {
-    // Test for method double decaf.lang.Math::IEEEremainder(double, double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect remainder returned",
-            0.0, Math::IEEEremainder(1.0, 1.0));
-    CPPUNIT_ASSERT_MESSAGE("Incorrect remainder returned",
-            Math::IEEEremainder(1.32,89.765) >= 1.4705063220631647E-2 ||
-            Math::IEEEremainder(1.32, 89.765) >= 1.4705063220631649E-2);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_logD() {
-    // Test for method double decaf.lang.Math::log(double)
-    for( double d = 10; d >= -10; d -= 0.5 ) {
-        double answer = Math::log( Math::exp(d) );
-
-        std::cout << "d: " << d << std::endl;
-        std::cout << "answer: " << answer << std::endl;
-
-        CPPUNIT_ASSERT_MESSAGE(
-                "Answer does not equal expected answer for d",
-                Math::abs( answer - d ) <= Math::abs(d * 0.00000001) );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_log10_D() {
-    // Test for special cases
-    CPPUNIT_ASSERT(Double::isNaN(Math::log10(Double::NaN)));
-    CPPUNIT_ASSERT(Double::isNaN(Math::log10(-2541.05745687234187532)));
-    CPPUNIT_ASSERT(Double::isNaN(Math::log10(-0.1)));
-    CPPUNIT_ASSERT_EQUAL(Double::POSITIVE_INFINITY, Math::log10(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL(Double::NEGATIVE_INFINITY, Math::log10(0.0));
-    CPPUNIT_ASSERT_EQUAL(Double::NEGATIVE_INFINITY, Math::log10(+0.0));
-    CPPUNIT_ASSERT_EQUAL(Double::NEGATIVE_INFINITY, Math::log10(-0.0));
-
-    CPPUNIT_ASSERT_EQUAL(3.0, Math::log10(1000.0));
-    CPPUNIT_ASSERT_EQUAL(14.0, Math::log10(Math::pow(10, 14)));
-    CPPUNIT_ASSERT_EQUAL(3.7389561269540406, Math::log10(5482.2158));
-    CPPUNIT_ASSERT_EQUAL(14.661551142893833, Math::log10(458723662312872.125782332587));
-    CPPUNIT_ASSERT_EQUAL(-0.9083828622192334, Math::log10(0.12348583358871));
-    CPPUNIT_ASSERT_EQUAL(308.25471555991675, Math::log10(Double::MAX_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_log1p_D() {
-    // Test for special cases
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Double::isNaN(Math::log1p(Double::NaN)));
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Double::isNaN(Math::log1p(-32.0482175)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::log1p(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL( Double::doubleToLongBits(0.0),
-                          Double::doubleToLongBits(Math::log1p(0.0)));
-    CPPUNIT_ASSERT_EQUAL( Double::doubleToLongBits(+0.0),
-                          Double::doubleToLongBits(Math::log1p(+0.0)));
-    CPPUNIT_ASSERT_EQUAL( Double::doubleToLongBits(-0.0),
-                          Double::doubleToLongBits(Math::log1p(-0.0)));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -0.2941782295312541", -0.2941782295312541,
-            Math::log1p(-0.254856327));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 7.368050685564151", 7.368050685564151,
-            Math::log1p(1583.542));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 0.4633708685409921", 0.4633708685409921,
-            Math::log1p(0.5894227));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 709.782712893384", 709.782712893384,
-            Math::log1p(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return Double::MIN_VALUE", Double::MIN_VALUE,
-            Math::log1p(Double::MIN_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_maxDD() {
-    // Test for method double decaf.lang.Math::max(double, double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect double max value", 1908897.6000089,
-            Math::max(-1908897.6000089, 1908897.6000089));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect double max value",
-            1908897.6000089, Math::max(2.0, 1908897.6000089));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect double max value", -2.0,
-            Math::max(-2.0, -1908897.6000089));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_maxFF() {
-    // Test for method float decaf.lang.Math::max(float, float)
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float max value", Math::max(-1908897.600f,
-            1908897.600f) == 1908897.600f);
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float max value",
-            Math::max(2.0f, 1908897.600f) == 1908897.600f);
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float max value",
-            Math::max(-2.0f, -1908897.600f) == -2.0f);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_maxII() {
-    // Test for method int decaf.lang.Math::max(int, int)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect int max value",
-            19088976, Math::max(-19088976, 19088976));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect int max value",
-            19088976, Math::max(20, 19088976));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect int max value", -20, Math::max(-20, -19088976));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_maxJJ() {
-    // Test for method long long decaf.lang.Math::max(long long, long long)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect long max value",
-            19088976000089LL, Math::max(-19088976000089LL, 19088976000089LL));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect long max value",
-            19088976000089LL, Math::max(20LL, 19088976000089LL));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect long max value",
-            -20LL, Math::max(-20LL, -19088976000089LL));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_minDD() {
-    // Test for method double decaf.lang.Math::min(double, double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect double min value",
-            -1908897.6000089, Math::min(-1908897.6000089, 1908897.6000089));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect double min value",
-            2.0, Math::min(2.0, 1908897.6000089));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect double min value",
-            -1908897.6000089, Math::min(-2.0,-1908897.6000089));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_minFF() {
-    // Test for method float decaf.lang.Math::min(float, float)
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float min value", Math::min(-1908897.600f,
-            1908897.600f) == -1908897.600f);
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float min value",
-            Math::min(2.0f, 1908897.600f) == 2.0f);
-    CPPUNIT_ASSERT_MESSAGE("Incorrect float min value",
-            Math::min(-2.0f, -1908897.600f) == -1908897.600f);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_minII() {
-    // Test for method int decaf.lang.Math::min(int, int)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect int min value",
-            -19088976, Math::min(-19088976, 19088976));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect int min value", 20, Math::min(20, 19088976));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect int min value",
-            -19088976, Math::min(-20, -19088976));
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_minJJ() {
-    // Test for method long long decaf.lang.Math::min(long long, long long)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect long min value",
-            -19088976000089LL, Math::min(-19088976000089LL, 19088976000089LL));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect long min value",
-            20LL, Math::min(20LL, 19088976000089LL));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect long min value",
-            -19088976000089LL, Math::min(-20LL, -19088976000089LL));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_powDD() {
-    // Test for method double decaf.lang.Math::pow(double, double)
-    CPPUNIT_ASSERT_MESSAGE("pow returned incorrect value",
-            (long) Math::pow(2, 8) == 256l);
-    CPPUNIT_ASSERT_MESSAGE("pow returned incorrect value",
-            Math::pow(2, -8) == 0.00390625);
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect root returned1",
-                         2.0, Math::sqrt(Math::pow(Math::sqrt(2), 4)));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_rintD() {
-    // Test for method double decaf.lang.Math::rint(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to round properly - up to odd",
-            3.0, Math::rint(2.9));
-    CPPUNIT_ASSERT_MESSAGE("Failed to round properly - NaN",
-            Double::isNaN(Math::rint(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Failed to round properly down to even",
-            2.0, Math::rint(2.1));
-    CPPUNIT_ASSERT_MESSAGE("Failed to round properly to even",
-            Math::rint(2.5) == 2.0);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_roundD() {
-    // Test for method long decaf.lang.Math::round(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect rounding of a float",
-            -91LL, Math::round(-90.89));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_roundF() {
-    // Test for method int decaf.lang.Math::round(float)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect rounding of a float",
-            -91, Math::round(-90.89f));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_signum_D() {
-    CPPUNIT_ASSERT(Double::isNaN(Math::signum(Double::NaN)));
-    CPPUNIT_ASSERT(Double::isNaN(Math::signum(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(0.0),
-            Double::doubleToLongBits(Math::signum(0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(+0.0),
-            Double::doubleToLongBits(Math::signum(+0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(-0.0),
-            Double::doubleToLongBits(Math::signum(-0.0)));
-
-    CPPUNIT_ASSERT_EQUAL(1.0, Math::signum(253681.2187962));
-    CPPUNIT_ASSERT_EQUAL(-1.0, Math::signum(-125874693.56));
-    CPPUNIT_ASSERT_EQUAL(1.0, Math::signum(1.2587E-308));
-    CPPUNIT_ASSERT_EQUAL(-1.0, Math::signum(-1.2587E-308));
-
-    CPPUNIT_ASSERT_EQUAL(1.0, Math::signum(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL(1.0, Math::signum(Double::MIN_VALUE));
-    CPPUNIT_ASSERT_EQUAL(-1.0, Math::signum(-Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL(-1.0, Math::signum(-Double::MIN_VALUE));
-    CPPUNIT_ASSERT_EQUAL(1.0, Math::signum(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL(-1.0, Math::signum(Double::NEGATIVE_INFINITY));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_signum_F() {
-    CPPUNIT_ASSERT(Float::isNaN(Math::signum(Float::NaN)));
-    CPPUNIT_ASSERT_EQUAL(Float::floatToIntBits(0.0f),
-            Float::floatToIntBits(Math::signum(0.0f)));
-    CPPUNIT_ASSERT_EQUAL(Float::floatToIntBits(+0.0f),
-            Float::floatToIntBits(Math::signum(+0.0f)));
-    CPPUNIT_ASSERT_EQUAL(Float::floatToIntBits(-0.0f),
-            Float::floatToIntBits(Math::signum(-0.0f)));
-
-    CPPUNIT_ASSERT_EQUAL(1.0f, Math::signum(253681.2187962f));
-    CPPUNIT_ASSERT_EQUAL(-1.0f, Math::signum(-125874693.56f));
-    CPPUNIT_ASSERT_EQUAL(1.0f, Math::signum(1.2587E-11f));
-    CPPUNIT_ASSERT_EQUAL(-1.0f, Math::signum(-1.2587E-11f));
-
-    CPPUNIT_ASSERT_EQUAL(1.0f, Math::signum(Float::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL(1.0f, Math::signum(Float::MIN_VALUE));
-    CPPUNIT_ASSERT_EQUAL(-1.0f, Math::signum(-Float::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL(-1.0f, Math::signum(-Float::MIN_VALUE));
-    CPPUNIT_ASSERT_EQUAL(1.0f, Math::signum(Float::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL(-1.0f, Math::signum(Float::NEGATIVE_INFINITY));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_sinD() {
-    // Test for method double decaf.lang.Math::sin(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect answer",
-        0.0, Math::sin(0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect answer",
-        0.8414709848078965, Math::sin(1));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_sinh_D() {
-    // Test for special situations
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Double::isNaN(Math::sinh(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::sinh(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return NEGATIVE_INFINITY",
-            Double::NEGATIVE_INFINITY, Math::sinh(Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(0.0),
-            Double::doubleToLongBits(Math::sinh(0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(+0.0),
-            Double::doubleToLongBits(Math::sinh(+0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(-0.0),
-            Double::doubleToLongBits(Math::sinh(-0.0)));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::sinh(1234.56));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return NEGATIVE_INFINITY",
-            Double::NEGATIVE_INFINITY, Math::sinh(-1234.56));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0000000000001666E-6",
-            1.0000000000001666E-6, Math::sinh(0.000001));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -1.0000000000001666E-6",
-            -1.0000000000001666E-6, Math::sinh(-0.000001));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 5.11538644196386",
-             5.11538644196386, Math::sinh( 2.33482 ) );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return POSITIVE_INFINITY",
-            Double::POSITIVE_INFINITY, Math::sinh(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 4.9E-324", 4.9E-324,
-            Math::sinh(Double::MIN_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_sqrtD() {
-    // Test for method double decaf.lang.Math::sqrt(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE(
-        "Incorrect root returned2", 7.0, Math::sqrt(49.0) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_tanD() {
-    // Test for method double decaf.lang.Math::tan(double)
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect answer",
-            0.0, Math::tan(0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Incorrect answer",
-            1.5574077246549023, Math::tan(1));
-
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_tanh_D() {
-    // Test for special situations
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Double::isNaN(Math::tanh(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return +1.0", +1.0,
-            Math::tanh(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -1.0", -1.0,
-            Math::tanh(Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(0.0),
-            Double::doubleToLongBits(Math::tanh(0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(+0.0),
-            Double::doubleToLongBits(Math::tanh(+0.0)));
-    CPPUNIT_ASSERT_EQUAL(Double::doubleToLongBits(-0.0),
-            Double::doubleToLongBits(Math::tanh(-0.0)));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0", 1.0, Math::tanh(1234.56));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return -1.0", -1.0, Math::tanh(-1234.56));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 9.999999999996666E-7",
-            9.999999999996666E-7, Math::tanh(0.000001));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 0.981422884124941", 0.981422884124941,
-            Math::tanh(2.33482));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 1.0",
-            1.0, Math::tanh(Double::MAX_VALUE));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Should return 4.9E-324", 4.9E-324,
-            Math::tanh(Double::MIN_VALUE));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_random() {
-    // There isn't a place for these tests so just stick them here
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong value E",
-        4613303445314885481LL, Double::doubleToLongBits(Math::E));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Wrong value PI",
-        4614256656552045848LL, Double::doubleToLongBits(Math::PI));
-
-    for (int i = 500; i >= 0; i--) {
-        double d = Math::random();
-        CPPUNIT_ASSERT_MESSAGE("Generated number is out of range: ",
-                d >= 0.0 && d < 1.0);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_toRadiansD() {
-    for (double d = 500; d >= 0; d -= 1.0) {
-        double converted = Math::toDegrees(Math::toRadians(d));
-        CPPUNIT_ASSERT_MESSAGE("Converted number not equal to original. d ",
-                converted >= d * 0.99999999 && converted <= d * 1.00000001);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_toDegreesD() {
-    for (double d = 500; d >= 0; d -= 1.0) {
-        double converted = Math::toRadians(Math::toDegrees(d));
-        CPPUNIT_ASSERT_MESSAGE("Converted number not equal to original. d ",
-                converted >= d * 0.99999999 && converted <= d * 1.00000001);
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_ulp_D() {
-    // Test for special cases
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Double::isNaN(Math::ulp(Double::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Double::POSITIVE_INFINITY,
-            Math::ulp(Double::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Double::POSITIVE_INFINITY,
-            Math::ulp(Double::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Double::MIN_VALUE, Math::ulp(0.0) );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Double::MIN_VALUE,
-            Math::ulp(+0.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Double::MIN_VALUE,
-            Math::ulp(-0.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Math::pow(2, 971),
-            Math::ulp(Double::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Math::pow(2, 971),
-            Math::ulp(-Double::MAX_VALUE));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Double::MIN_VALUE, Math::ulp(Double::MIN_VALUE) );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Double::MIN_VALUE, Math::ulp(-Double::MIN_VALUE) );
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", 2.220446049250313E-16,
-            Math::ulp(1.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", 2.220446049250313E-16,
-            Math::ulp(-1.0));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", 2.2737367544323206E-13,
-            Math::ulp(1153.0));
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MathTest::test_ulp_f() {
-
-    // Test for special cases
-    CPPUNIT_ASSERT_MESSAGE("Should return NaN", Float::isNaN(Math::ulp(Float::NaN)));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Float::POSITIVE_INFINITY, Math::ulp(Float::POSITIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Float::POSITIVE_INFINITY, Math::ulp(Float::NEGATIVE_INFINITY));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Float::MIN_VALUE, Math::ulp(0.0f));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", Float::MIN_VALUE, Math
-            ::ulp(+0.0f));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            Math::ulp(-0.0f), Float::MIN_VALUE );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            2.028241E31f, Math::ulp(Float::MAX_VALUE));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            2.028241E31f, Math::ulp(-Float::MAX_VALUE));
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            1.4E-45f, Math::ulp( Float::MIN_VALUE ) );
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            1.4E-45f, Math::ulp( -Float::MIN_VALUE ) );
-
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            1.1920929E-7f, Math::ulp(1.0f));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value", 1.1920929E-7f,
-            Math::ulp(-1.0f));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            1.2207031E-4f, Math::ulp(1153.0f));
-    CPPUNIT_ASSERT_EQUAL_MESSAGE("Returned incorrect value",
-            5.6E-45f, Math::ulp(9.403954E-38f) );
-}
-
diff --git a/src/decaf/src/test/decaf/lang/MathTest.h b/src/decaf/src/test/decaf/lang/MathTest.h
deleted file mode 100644
index 9edf228..0000000
--- a/src/decaf/src/test/decaf/lang/MathTest.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_MATHTEST_H_
-#define _DECAF_LANG_MATHTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace lang{
-
-    class MathTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( MathTest );
-        CPPUNIT_TEST( test_absD );
-        CPPUNIT_TEST( test_absF );
-        CPPUNIT_TEST( test_absI );
-        CPPUNIT_TEST( test_absJ );
-        CPPUNIT_TEST( test_acosD );
-        CPPUNIT_TEST( test_asinD );
-        CPPUNIT_TEST( test_atanD );
-        CPPUNIT_TEST( test_atan2DD );
-        CPPUNIT_TEST( test_cbrt_D );
-        CPPUNIT_TEST( test_ceilD );
-        CPPUNIT_TEST( test_cosD );
-        CPPUNIT_TEST( test_cosh_D );
-        CPPUNIT_TEST( test_expD );
-        CPPUNIT_TEST( test_expm1_D );
-        CPPUNIT_TEST( test_floorD );
-        CPPUNIT_TEST( test_hypot_DD );
-        CPPUNIT_TEST( test_IEEEremainderDD );
-        CPPUNIT_TEST( test_logD );
-        CPPUNIT_TEST( test_log10_D );
-        CPPUNIT_TEST( test_log1p_D );
-        CPPUNIT_TEST( test_maxDD );
-        CPPUNIT_TEST( test_maxFF );
-        CPPUNIT_TEST( test_maxII );
-        CPPUNIT_TEST( test_maxJJ );
-        CPPUNIT_TEST( test_minDD );
-        CPPUNIT_TEST( test_minFF );
-        CPPUNIT_TEST( test_minII );
-        CPPUNIT_TEST( test_minJJ );
-        CPPUNIT_TEST( test_powDD );
-        CPPUNIT_TEST( test_rintD );
-        CPPUNIT_TEST( test_roundD );
-        CPPUNIT_TEST( test_roundF );
-        CPPUNIT_TEST( test_signum_D );
-        CPPUNIT_TEST( test_signum_F );
-        CPPUNIT_TEST( test_sinD );
-        CPPUNIT_TEST( test_sinh_D );
-        CPPUNIT_TEST( test_sqrtD );
-        CPPUNIT_TEST( test_tanD );
-        CPPUNIT_TEST( test_tanh_D );
-        CPPUNIT_TEST( test_random );
-        CPPUNIT_TEST( test_toRadiansD );
-        CPPUNIT_TEST( test_toDegreesD );
-        CPPUNIT_TEST( test_ulp_D );
-        CPPUNIT_TEST( test_ulp_f );
-        CPPUNIT_TEST_SUITE_END();
-
-    private:
-
-        double HYP;
-        double OPP;
-        double ADJ;
-
-    public:
-
-        MathTest();
-        virtual ~MathTest() {}
-
-        virtual void test_absD();
-        virtual void test_absF();
-        virtual void test_absI();
-        virtual void test_absJ();
-        virtual void test_acosD();
-        virtual void test_asinD();
-        virtual void test_atanD();
-        virtual void test_atan2DD();
-        virtual void test_cbrt_D();
-        virtual void test_ceilD();
-        virtual void test_cosD();
-        virtual void test_cosh_D();
-        virtual void test_expD();
-        virtual void test_expm1_D();
-        virtual void test_floorD();
-        virtual void test_hypot_DD();
-        virtual void test_IEEEremainderDD();
-        virtual void test_logD();
-        virtual void test_log10_D();
-        virtual void test_log1p_D();
-        virtual void test_maxDD();
-        virtual void test_maxFF();
-        virtual void test_maxII();
-        virtual void test_maxJJ();
-        virtual void test_minDD();
-        virtual void test_minFF();
-        virtual void test_minII();
-        virtual void test_minJJ();
-        virtual void test_powDD();
-        virtual void test_rintD();
-        virtual void test_roundD();
-        virtual void test_roundF();
-        virtual void test_signum_D();
-        virtual void test_signum_F();
-        virtual void test_sinD();
-        virtual void test_sinh_D();
-        virtual void test_sqrtD();
-        virtual void test_tanD();
-        virtual void test_tanh_D();
-        virtual void test_random();
-        virtual void test_toRadiansD();
-        virtual void test_toDegreesD();
-        virtual void test_ulp_D();
-        virtual void test_ulp_f();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_MATHTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/ShortTest.cpp b/src/decaf/src/test/decaf/lang/ShortTest.cpp
deleted file mode 100644
index f43669c..0000000
--- a/src/decaf/src/test/decaf/lang/ShortTest.cpp
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ShortTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-ShortTest::ShortTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void ShortTest::test() {
-
-    Short short1( 65 );
-
-    CPPUNIT_ASSERT( short1.byteValue() == 65 );
-    CPPUNIT_ASSERT( short1.shortValue() == 65 );
-    CPPUNIT_ASSERT( short1.intValue() == 65 );
-    CPPUNIT_ASSERT( short1.longValue() == 65 );
-    CPPUNIT_ASSERT( short1.floatValue() == 65.0f );
-    CPPUNIT_ASSERT( short1.doubleValue() == 65.0 );
-
-    CPPUNIT_ASSERT( short1.toString() == "65" );
-    CPPUNIT_ASSERT( short1.toString( 99 ) == "99" );
-
-    CPPUNIT_ASSERT( Short::reverseBytes( (short)0xFF00 ) == (short)0x00FF );
-    CPPUNIT_ASSERT( Short::reverseBytes( (short)0x0F00 ) == (short)0x000F );
-    CPPUNIT_ASSERT( Short::reverseBytes( (short)0xDE00 ) == (short)0x00DE );
-    CPPUNIT_ASSERT( Short::reverseBytes( (short)0x00AB ) == (short)0xAB00 );
-
-    Short short2( 255 );
-
-    // Comparison functions
-    CPPUNIT_ASSERT( short2.compareTo( 256 ) == -1 );
-    CPPUNIT_ASSERT( short2.compareTo( 255 ) == 0 );
-    CPPUNIT_ASSERT( short2.compareTo( 254 ) == 1 );
-    CPPUNIT_ASSERT( short2.equals( Short( 255 ) ) == true );
-    CPPUNIT_ASSERT( short2.compareTo( Short( 255 ) ) == 0 );
-    CPPUNIT_ASSERT( short2 == Short( 255 ) );
-
-    // decode
-    CPPUNIT_ASSERT( short2 == Short::decode( "255" ) );
-    CPPUNIT_ASSERT( short2 == Short::decode( "0xFF" ) );
-    CPPUNIT_ASSERT( short2 == Short::decode( "255" ) );
-    CPPUNIT_ASSERT( Short::decode( "-255" ) == -255 );
-
-    // parseInt
-    CPPUNIT_ASSERT( Short::parseShort( "255") == 255 );
-    CPPUNIT_ASSERT( Short::parseShort( "255", 10 ) == 255 );
-    CPPUNIT_ASSERT( Short::parseShort( "255", 11 ) != 255 );
-    CPPUNIT_ASSERT( Short::parseShort( "FF", 16 ) == 255 );
-
-    // valueOf
-    CPPUNIT_ASSERT( Short::valueOf( 255 ) == 255 );
-    CPPUNIT_ASSERT( Short::valueOf( "255" ) == 255 );
-    CPPUNIT_ASSERT( Short::valueOf( "255", 10 ) == 255 );
-    CPPUNIT_ASSERT( (Short::valueOf( "255", 11 )).shortValue() != 255 );
-    CPPUNIT_ASSERT( Short::valueOf( "FF", 16 ) == 255 );
-
-    CPPUNIT_ASSERT( Short::toString( 255 ) == "255" );
-
-}
-
diff --git a/src/decaf/src/test/decaf/lang/ShortTest.h b/src/decaf/src/test/decaf/lang/ShortTest.h
deleted file mode 100644
index c9dba63..0000000
--- a/src/decaf/src/test/decaf/lang/ShortTest.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_SHORTTEST_H_
-#define _DECAF_LANG_SHORTTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Short.h>
-
-namespace decaf{
-namespace lang{
-
-    class ShortTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( ShortTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        ShortTest();
-        virtual ~ShortTest() {}
-
-        void test();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_SHORTTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/SystemTest.cpp b/src/decaf/src/test/decaf/lang/SystemTest.cpp
deleted file mode 100644
index 258dc52..0000000
--- a/src/decaf/src/test/decaf/lang/SystemTest.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SystemTest.h"
-
-#include <decaf/lang/System.h>
-#include <decaf/util/Map.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-SystemTest::SystemTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SystemTest::test_getenv() {
-
-    CPPUNIT_ASSERT( System::getenv( "PATH" ) != "" );
-
-    try {
-        System::getenv( "PATH_ASDFGHJKL" );
-        CPPUNIT_ASSERT( false );
-    } catch (...) {
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SystemTest::test_getenv2() {
-
-    Map<std::string, std::string> values = System::getenv();
-
-    CPPUNIT_ASSERT( values.size() != 0 );
-    CPPUNIT_ASSERT( values.containsKey( "PATH" ) );
-    CPPUNIT_ASSERT( !values.containsKey( "PATH_ASDFGHJKL" ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SystemTest::test_setenv() {
-
-    Map<std::string, std::string> values1 = System::getenv();
-    CPPUNIT_ASSERT( !values1.containsKey( "PATH_ASDFGHJKL" ) );
-    System::setenv( "PATH_ASDFGHJKL", "test" );
-    Map<std::string, std::string> values2 = System::getenv();
-    CPPUNIT_ASSERT( values2.containsKey( "PATH_ASDFGHJKL" ) );
-    System::unsetenv( "PATH_ASDFGHJKL" );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SystemTest::test_unsetenv() {
-
-    Map<std::string, std::string> values1 = System::getenv();
-    CPPUNIT_ASSERT( !values1.containsKey( "PATH_ASDFGHJKL" ) );
-    System::setenv( "PATH_ASDFGHJKL", "test" );
-    Map<std::string, std::string> values2 = System::getenv();
-    CPPUNIT_ASSERT( values2.containsKey( "PATH_ASDFGHJKL" ) );
-    System::unsetenv( "PATH_ASDFGHJKL" );
-    Map<std::string, std::string> values3 = System::getenv();
-    CPPUNIT_ASSERT( !values3.containsKey( "PATH_ASDFGHJKL" ) );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SystemTest::test_currentTimeMillis() {
-    CPPUNIT_ASSERT( System::currentTimeMillis() != 0 );
-}
diff --git a/src/decaf/src/test/decaf/lang/SystemTest.h b/src/decaf/src/test/decaf/lang/SystemTest.h
deleted file mode 100644
index b0c03b8..0000000
--- a/src/decaf/src/test/decaf/lang/SystemTest.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_SYSTEMTEST_H_
-#define _DECAF_LANG_SYSTEMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace lang{
-
-    class SystemTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( SystemTest );
-        CPPUNIT_TEST( test_getenv );
-        CPPUNIT_TEST( test_getenv2 );
-        CPPUNIT_TEST( test_setenv );
-        CPPUNIT_TEST( test_unsetenv );
-        CPPUNIT_TEST( test_currentTimeMillis );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        SystemTest();
-        virtual ~SystemTest() {}
-
-        void test_getenv();
-        void test_getenv2();
-        void test_setenv();
-        void test_unsetenv();
-        void test_currentTimeMillis();
-
-    };
-
-}}
-
-#endif /*_DECAF_LANG_SYSTEMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/lang/ThreadTest.cpp b/src/decaf/src/test/decaf/lang/ThreadTest.cpp
deleted file mode 100644
index 2a5e0d5..0000000
--- a/src/decaf/src/test/decaf/lang/ThreadTest.cpp
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ThreadTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-
-void ThreadTest::testDelegate(){
-
-      Delegate test;
-      int initialValue = test.getStuff();
-
-      Thread thread( &test );
-      thread.start();
-      thread.join();
-
-      int finalValue = test.getStuff();
-
-      // The values should be different - this proves
-      // that the runnable was run.
-      CPPUNIT_ASSERT( finalValue != initialValue );
-}
-
-void ThreadTest::testDerived(){
-
-      Derived test;
-      int initialValue = test.getStuff();
-
-      test.start();
-      test.join();
-
-      int finalValue = test.getStuff();
-
-      // The values should be different - this proves
-      // that the runnable was run.
-      CPPUNIT_ASSERT( finalValue != initialValue );
-}
-
-void ThreadTest::testJoin(){
-
-      JoinTest test;
-
-      time_t startTime = time( NULL );
-      test.start();
-      test.join();
-      time_t endTime = time( NULL );
-
-      time_t delta = endTime - startTime;
-
-      // Should be about 5 seconds that elapsed.
-      CPPUNIT_ASSERT( delta >= 1 && delta <= 3 );
-}
diff --git a/src/decaf/src/test/decaf/lang/ThreadTest.h b/src/decaf/src/test/decaf/lang/ThreadTest.h
deleted file mode 100644
index b91f688..0000000
--- a/src/decaf/src/test/decaf/lang/ThreadTest.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_LANG_THREADTEST_H_
-#define _DECAF_LANG_THREADTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Thread.h>
-#include <time.h>
-
-namespace decaf{
-namespace lang{
-
-    class ThreadTest : public CppUnit::TestFixture {
-
-      CPPUNIT_TEST_SUITE( ThreadTest );
-      CPPUNIT_TEST( testDelegate );
-      CPPUNIT_TEST( testDerived );
-      CPPUNIT_TEST( testJoin );
-      CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        class Delegate : public Runnable{
-        private:
-
-            int stuff;
-
-        public:
-
-            Delegate(){ stuff = 0; }
-            virtual ~Delegate(){}
-
-            int getStuff(){
-                return stuff;
-            }
-
-            virtual void run(){
-                stuff = 1;
-            }
-
-        };
-
-        class Derived : public Thread{
-        private:
-
-            int stuff;
-
-        public:
-
-            Derived(){ stuff = 0; }
-            virtual ~Derived(){}
-
-            int getStuff(){
-                return stuff;
-            }
-
-            virtual void run(){
-                stuff = 1;
-            }
-
-        };
-
-        class JoinTest : public Thread{
-        public:
-
-            JoinTest(){}
-            virtual ~JoinTest(){}
-
-            virtual void run(){
-
-                // Sleep for 2 seconds.
-                Thread::sleep( 2000 );
-            }
-
-        };
-
-    public:
-
-        virtual ~ThreadTest(){}
-
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void testDelegate();
-        void testDerived();
-        void testJoin();
-    };
-
-}}
-
-#endif /*_DECAF_LANG_THREADTEST_H_*/
diff --git a/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp b/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp
deleted file mode 100644
index 883fb78..0000000
--- a/src/decaf/src/test/decaf/net/SocketFactoryTest.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SocketFactoryTest.h"
-
-#include <decaf/util/Properties.h>
-#include <decaf/net/SocketFactory.h>
-#include <decaf/net/TcpSocket.h>
-
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::util;
-using namespace decaf::lang;
-using namespace decaf::util::concurrent;
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketFactoryTest::test()
-{
-    try
-    {
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 500 );
-
-        util::Properties properties;
-
-        std::ostringstream ostream;
-
-        ostream << "127.0.0.1:" << port;
-
-        properties.setProperty("soLinger", "false");
-
-        Socket* client = SocketFactory::createSocket(
-            ostream.str(), properties );
-
-        synchronized(&serverThread.mutex)
-        {
-            if(serverThread.getNumClients() != 1)
-            {
-                serverThread.mutex.wait(10000);
-            }
-        }
-
-        CPPUNIT_ASSERT( client->isConnected() );
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        client->close();
-
-        synchronized(&serverThread.mutex)
-        {
-            if(serverThread.getNumClients() != 0)
-            {
-                serverThread.mutex.wait(10000);
-            }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
-
-        serverThread.stop();
-        serverThread.join();
-
-        delete client;
-    }
-    catch(lang::Exception ex)
-    {
-        std::cout << "SocketFactoryTest::test - Caught Exception." << std::endl;
-        ex.printStackTrace();
-        CPPUNIT_ASSERT( false );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketFactoryTest::testNoDelay()
-{
-    try
-    {
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 40 );
-
-        util::Properties properties;
-
-        std::ostringstream ostream;
-
-        ostream << "127.0.0.1:" << port;
-
-        properties.setProperty( "soLinger", "false" );
-        properties.setProperty( "tcpNoDelay", "true" );
-
-        Socket* client = SocketFactory::createSocket(
-            ostream.str(), properties );
-
-        TcpSocket* tcpSock = dynamic_cast<TcpSocket*>( client );
-        CPPUNIT_ASSERT( tcpSock != NULL );
-        CPPUNIT_ASSERT( tcpSock->getTcpNoDelay() == true );
-
-        synchronized(&serverThread.mutex)
-        {
-            if(serverThread.getNumClients() != 1)
-            {
-                serverThread.mutex.wait(1000);
-            }
-        }
-
-        CPPUNIT_ASSERT( client->isConnected() );
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        client->close();
-
-        synchronized(&serverThread.mutex)
-        {
-            if(serverThread.getNumClients() != 0)
-            {
-                serverThread.mutex.wait(1000);
-            }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
-
-        serverThread.stop();
-        serverThread.join();
-
-        delete client;
-    }
-    catch(lang::Exception ex)
-    {
-        CPPUNIT_ASSERT( false );
-    }
-}
diff --git a/src/decaf/src/test/decaf/net/SocketFactoryTest.h b/src/decaf/src/test/decaf/net/SocketFactoryTest.h
deleted file mode 100644
index 8562bfb..0000000
--- a/src/decaf/src/test/decaf/net/SocketFactoryTest.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_SOCKETFACTORYTEST_H_
-#define _DECAF_NET_SOCKETFACTORYTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/net/Socket.h>
-#include <decaf/net/ServerSocket.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/lang/Thread.h>
-
-#include <sstream>
-
-namespace decaf{
-namespace net{
-
-    class SocketFactoryTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( SocketFactoryTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST( testNoDelay );
-        CPPUNIT_TEST_SUITE_END();
-
-        static const int port = 23232;
-
-        class MyServerThread : public lang::Thread{
-        private:
-
-            bool done;
-            int numClients;
-            std::string lastMessage;
-
-        public:
-
-            util::concurrent::Mutex mutex;
-
-        public:
-
-            MyServerThread(){
-                done = false;
-                numClients = 0;
-            }
-            virtual ~MyServerThread(){
-                stop();
-            }
-
-            std::string getLastMessage(){
-                return lastMessage;
-            }
-
-            int getNumClients(){
-                return numClients;
-            }
-
-            virtual void stop(){
-                done = true;
-            }
-
-            virtual void run(){
-                try{
-                    unsigned char buf[1000];
-
-                    ServerSocket server;
-                    server.bind( "127.0.0.1", port );
-
-                    net::Socket* socket = server.accept();
-                    server.close();
-
-                    socket->setSoLinger( false );
-
-                    synchronized(&mutex)
-                    {
-                        numClients++;
-                        mutex.notifyAll();
-                    }
-
-                    while( !done && socket != NULL ){
-
-                        io::InputStream* stream = socket->getInputStream();
-                        memset( buf, 0, 1000 );
-                        try{
-                            if( stream->read( buf, 1000 ) == -1 ) {
-                                done = true;
-                                continue;
-                            }
-
-                            lastMessage = (char*)buf;
-
-                            if( strcmp( (char*)buf, "reply" ) == 0 ){
-                                io::OutputStream* output = socket->getOutputStream();
-                                output->write( (unsigned char*)"hello", strlen("hello" ) );
-                            }
-
-                        }catch( io::IOException& ex ){
-                            done = true;
-                        }
-                    }
-
-                    socket->close();
-                    delete socket;
-
-                    numClients--;
-
-                    synchronized(&mutex)
-                    {
-                        mutex.notifyAll();
-                    }
-
-                }catch( io::IOException& ex ){
-                    printf("%s\n", ex.getMessage().c_str() );
-                    CPPUNIT_ASSERT( false );
-                }catch( ... ){
-                    CPPUNIT_ASSERT( false );
-                }
-            }
-        };
-
-    public:
-
-        SocketFactoryTest() {}
-        virtual ~SocketFactoryTest() {}
-
-        void test();
-        void testNoDelay();
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETFACTORYTEST_H_*/
diff --git a/src/decaf/src/test/decaf/net/SocketTest.cpp b/src/decaf/src/test/decaf/net/SocketTest.cpp
deleted file mode 100644
index 97122bf..0000000
--- a/src/decaf/src/test/decaf/net/SocketTest.cpp
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SocketTest.h"
-
-#include <decaf/net/TcpSocket.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketTest::testConnect() {
-
-    try{
-
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 40 );
-
-        TcpSocket client;
-
-        client.connect("127.0.0.1", port);
-        client.setSoLinger( false );
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 1)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        client.close();
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 0)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
-
-        serverThread.stop();
-        serverThread.join();
-
-    }catch( io::IOException& ex ){
-        printf( "%s\n", ex.getMessage().c_str() );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketTest::testTx() {
-
-    try{
-
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 10 );
-
-        TcpSocket client;
-
-        client.connect("127.0.0.1", port);
-        client.setSoLinger( false );
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 1)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        io::OutputStream* stream = client.getOutputStream();
-
-        std::string msg = "don't reply";
-        stream->write( (unsigned char*)msg.c_str(), msg.length() );
-
-        Thread::sleep( 10 );
-
-        CPPUNIT_ASSERT( serverThread.getLastMessage() == msg );
-
-        client.close();
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 0)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
-
-        serverThread.stop();
-        serverThread.join();
-
-    }catch( io::IOException& ex ){
-        printf( "%s\n", ex.getMessage().c_str() );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketTest::testTrx() {
-
-    try{
-
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 10 );
-
-        TcpSocket client;
-
-        client.connect("127.0.0.1", port);
-        client.setSoLinger(false);
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 1)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        io::OutputStream* stream = client.getOutputStream();
-
-        std::string msg = "reply";
-        stream->write( (unsigned char*)msg.c_str(), msg.length() );
-
-        synchronized(&serverThread.mutex)
-        {
-           serverThread.mutex.wait(300);
-        }
-
-        unsigned char buf[500];
-        memset( buf, 0, 500 );
-        io::InputStream* istream = client.getInputStream();
-        std::size_t numRead = istream->read( buf, 500 );
-        CPPUNIT_ASSERT( numRead == 5 );
-        CPPUNIT_ASSERT( strcmp( (char*)buf, "hello" ) == 0 );
-
-        client.close();
-
-        serverThread.stop();
-        serverThread.join();
-
-    }catch( io::IOException& ex ){
-        printf( "%s\n", ex.getMessage().c_str() );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketTest::testRxFail() {
-
-    try{
-
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 10 );
-
-        TcpSocket client;
-
-        client.connect("127.0.0.1", port);
-        client.setSoLinger( false );
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 1)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        // Give it a chance to get to its read call
-        Thread::sleep( 100 );
-
-        client.close();
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 0)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 0 );
-
-        serverThread.stop();
-        serverThread.join();
-
-    }catch( io::IOException& ex ){
-        printf( "%s\n", ex.getMessage().c_str() );
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SocketTest::testTrxNoDelay() {
-
-    try{
-
-        MyServerThread serverThread;
-        serverThread.start();
-
-        Thread::sleep( 10 );
-
-        TcpSocket client;
-
-        client.connect("127.0.0.1", port);
-        client.setSoLinger(false);
-        client.setTcpNoDelay(true);
-
-        CPPUNIT_ASSERT( client.getTcpNoDelay() == true );
-
-        synchronized(&serverThread.mutex)
-        {
-           if(serverThread.getNumClients() != 1)
-           {
-              serverThread.mutex.wait(1000);
-           }
-        }
-
-        CPPUNIT_ASSERT( serverThread.getNumClients() == 1 );
-
-        io::OutputStream* stream = client.getOutputStream();
-
-        std::string msg = "reply";
-        stream->write( (unsigned char*)msg.c_str(), msg.length() );
-
-        synchronized(&serverThread.mutex)
-        {
-           serverThread.mutex.wait(300);
-        }
-
-        unsigned char buf[500];
-        memset( buf, 0, 500 );
-        io::InputStream* istream = client.getInputStream();
-        std::size_t numRead = istream->read( buf, 500 );
-        CPPUNIT_ASSERT( numRead == 5 );
-        CPPUNIT_ASSERT( strcmp( (char*)buf, "hello" ) == 0 );
-
-        client.close();
-
-        serverThread.stop();
-        serverThread.join();
-
-    }catch( io::IOException& ex ){
-        printf( "%s\n", ex.getMessage().c_str() );
-    }
-}
diff --git a/src/decaf/src/test/decaf/net/SocketTest.h b/src/decaf/src/test/decaf/net/SocketTest.h
deleted file mode 100644
index b9bba61..0000000
--- a/src/decaf/src/test/decaf/net/SocketTest.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_SOCKETTEST_H_
-#define _DECAF_NET_SOCKETTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/net/ServerSocket.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/lang/Thread.h>
-#include <list>
-#include <string.h>
-
-namespace decaf{
-namespace net{
-
-    class SocketTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( SocketTest );
-        CPPUNIT_TEST( testConnect );
-        CPPUNIT_TEST( testTx );
-        CPPUNIT_TEST( testTrx );
-        CPPUNIT_TEST( testTrxNoDelay );
-        CPPUNIT_TEST( testRxFail );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        static const int port = 23232;
-
-        class MyServerThread : public lang::Thread{
-        private:
-
-            bool done;
-            int numClients;
-            std::string lastMessage;
-
-        public:
-
-            util::concurrent::Mutex mutex;
-
-        public:
-
-            MyServerThread(){
-                done = false;
-                numClients = 0;
-            }
-
-            virtual ~MyServerThread(){
-                stop();
-            }
-
-            std::string getLastMessage(){
-                return lastMessage;
-            }
-
-            int getNumClients(){
-                return numClients;
-            }
-
-            virtual void stop(){
-                done = true;
-            }
-
-            virtual void run(){
-                try{
-                    unsigned char buf[1000];
-
-                    ServerSocket server;
-                    server.bind( "127.0.0.1", port );
-
-                    Socket* socket = server.accept();
-                    server.close();
-
-                    //socket->setSoTimeout( 10 );
-                    socket->setSoLinger( false );
-                    numClients++;
-
-                    synchronized(&mutex)
-                    {
-                       mutex.notifyAll();
-                    }
-
-                    while( !done && socket != NULL ){
-
-                        io::InputStream* stream = socket->getInputStream();
-
-                        memset( buf, 0, 1000 );
-                        try{
-
-                            if( stream->read( buf, 1000 ) == -1 ) {
-                                done = true;
-                                continue;
-                            }
-
-                            lastMessage = (char*)buf;
-
-                            if( strcmp( (char*)buf, "reply" ) == 0 ){
-                                io::OutputStream* output = socket->getOutputStream();
-                                output->write( (unsigned char*)"hello", strlen("hello" ) );
-
-                                  synchronized(&mutex)
-                                  {
-                                     mutex.notifyAll();
-                                  }
-                            }
-
-                        }catch( io::IOException& ex ){
-                            done = true;
-                        }
-                    }
-
-                    socket->close();
-                    delete socket;
-
-                    numClients--;
-
-                    synchronized(&mutex)
-                    {
-                        mutex.notifyAll();
-                    }
-
-                }catch( io::IOException& ex ){
-                    printf("%s\n", ex.getMessage().c_str() );
-                    CPPUNIT_ASSERT( false );
-                }catch( ... ){
-                    CPPUNIT_ASSERT( false );
-                }
-            }
-
-        };
-
-    public:
-
-        virtual ~SocketTest() {}
-
-        void testConnect();
-        void testTx();
-        void testTrx();
-        void testRxFail();
-        void testTrxNoDelay();
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_SOCKETTEST_H_*/
diff --git a/src/decaf/src/test/decaf/net/URISyntaxExceptionTest.cpp b/src/decaf/src/test/decaf/net/URISyntaxExceptionTest.cpp
deleted file mode 100644
index 191f769..0000000
--- a/src/decaf/src/test/decaf/net/URISyntaxExceptionTest.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URISyntaxExceptionTest.h"
-
-#include <decaf/net/URISyntaxException.h>
-
-using namespace decaf;
-using namespace decaf::net;
-
-////////////////////////////////////////////////////////////////////////////////
-URISyntaxExceptionTest::URISyntaxExceptionTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URISyntaxExceptionTest::test() {
-
-    URISyntaxException e1( __FILE__, __LINE__, "str", "problem", 2);
-    CPPUNIT_ASSERT_MESSAGE("returned incorrect reason",
-                           e1.getReason() == "problem" );
-    CPPUNIT_ASSERT_MESSAGE("returned incorrect input", e1.getInput() == "str" );
-    CPPUNIT_ASSERT_MESSAGE("returned incorrect index", 2 == e1.getIndex());
-
-    URISyntaxException e2( __FILE__, __LINE__, "str", "problem");
-    CPPUNIT_ASSERT_MESSAGE("returned incorrect reason", e2.getReason() == "problem" );
-    CPPUNIT_ASSERT_MESSAGE("returned incorrect input", e2.getInput() == "str" );
-    CPPUNIT_ASSERT_MESSAGE("returned incorrect index", -1 == e2.getIndex());
-}
diff --git a/src/decaf/src/test/decaf/net/URISyntaxExceptionTest.h b/src/decaf/src/test/decaf/net/URISyntaxExceptionTest.h
deleted file mode 100644
index a2df0fe..0000000
--- a/src/decaf/src/test/decaf/net/URISyntaxExceptionTest.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URISYNTAXEXCEPTIONTEST_H_
-#define _DECAF_NET_URISYNTAXEXCEPTIONTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace net{
-
-    class URISyntaxExceptionTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( URISyntaxExceptionTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        URISyntaxExceptionTest();
-        virtual ~URISyntaxExceptionTest() {}
-
-        void test();
-    };
-
-}}
-
-#endif /*_DECAF_NET_URISYNTAXEXCEPTIONTEST_H_*/
diff --git a/src/decaf/src/test/decaf/net/URITest.cpp b/src/decaf/src/test/decaf/net/URITest.cpp
deleted file mode 100644
index 6c89315..0000000
--- a/src/decaf/src/test/decaf/net/URITest.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "URITest.h"
-
-#include <decaf/net/URI.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::net;
-using namespace decaf::lang;
-using namespace decaf::lang::exceptions;
-
-////////////////////////////////////////////////////////////////////////////////
-URITest::URITest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void URITest::test_Constructor_String() {
-
-//    const std::string constructorTests[27] = {
-//        "http://user@www.google.com:45/search?q=helpinfo#somefragment",
-//        // http with authority, query and fragment
-//        "ftp://ftp.is.co.za/rfc/rfc1808.txt", // ftp
-//        "gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles",
-//        // gopher
-//        "mailto:mduerst@ifi.unizh.ch", // mailto
-//        "news:comp.infosystems.www.servers.unix", // news
-//        "telnet://melvyl.ucop.edu/", // telnet
-//        "http://123.24.17.98/test", // IPv4 authority
-//        "http://www.google.com:80/test",// domain name authority
-//        "http://joe@[3ffe:2a00:100:7031::1]:80/test",
-//        // IPv6 authority, with userinfo and port
-//        "/relative", // relative starting with /
-//        "//relative", // relative starting with //
-//        "relative", // relative with no /
-//        "#fragment",// relative just with fragment
-//        "http://user@host:80", // UI, host,port
-//        "http://user@host", // ui, host
-//        "http://host", // host
-//        "http://host:80", // host,port
-//        "http://joe@:80", // ui, port (becomes registry-based)
-//        "file:///foo/bar", // empty authority, non empty path
-//        "ht?tp://hoe@host:80", // miscellaneous tests
-//        "mai/lto:hey?joe#man", "http://host/a%20path#frag",
-//        // path with an escaped octet for space char
-//        "http://host/a%E2%82%ACpath#frag",
-//        // path with escaped octet for unicode char, not USASCII
-//        "http://host/a\u20ACpath#frag",
-//        // path with unicode char, not USASCII equivalent to
-//        // = "http://host/a\u0080path#frag",
-//        "http://host%20name/", // escaped octets in host (becomes
-//        // registry based)
-//        "http://host\u00DFname/", // unicodechar in host (becomes
-//        // registry based)
-//        // equivalent to = "http://host\u00dfname/",
-//        "ht123-+tp://www.google.com:80/test", // legal chars in scheme
-//    };
-//
-//    for( int i = 0; i < 27; i++ ) {
-//        try {
-//            new URI(constructorTests[i]);
-//        } catch ( URISyntaxException e ) {
-//            CPPUNIT_FAIL( string( "Failed to construct URI for: " ) +
-//                          constructorTests[i] + " : " +
-//                          e.getMessage() );
-//        }
-//    }
-
-    std::vector<const char*> constructorTestsInvalid;
-    // space char in path, not in escaped
-    constructorTestsInvalid.push_back( "http:///a path#frag" );
-    // octet form, with no host
-    constructorTestsInvalid.push_back( "http://host/a[path#frag" );
-    // an illegal char, not in escaped octet form, should throw an exception
-    // invalid escape sequence in path
-    constructorTestsInvalid.push_back( "http://host/a%path#frag" );
-    // incomplete escape sequence in path
-    constructorTestsInvalid.push_back( "http://host/a%#frag" );
-    // space char in fragment, not in
-    constructorTestsInvalid.push_back( "http://host#a frag" );
-    // escaped octet form, no path
-    // illegal char in fragment
-    constructorTestsInvalid.push_back( "http://host/a#fr#ag" );
-    // invalid escape sequence in fragment,
-    constructorTestsInvalid.push_back( "http:///path#fr%ag" );
-    // with no host
-    // incomplete escape sequence in fragment
-    constructorTestsInvalid.push_back( "http://host/path#frag%" );
-    // space char in query, not in escaped octet form
-    constructorTestsInvalid.push_back( "http://host/path?a query#frag" );
-    // invalid escape sequence in query, no path
-    constructorTestsInvalid.push_back( "http://host?query%ag" );
-    // incomplete escape sequence in query, with no host
-    constructorTestsInvalid.push_back( "http:///path?query%" );
-    // invalid char in scheme specific part
-    constructorTestsInvalid.push_back( "mailto:user^name@fklkf.com"  );
-
-//    for( size_t i = 0; i < constructorTestsInvalid.size(); i++ ) {
-//        try {
-//            new URI( constructorTestsInvalid[i] );
-//            CPPUNIT_FAIL( string( "Failed to throw URISyntaxException for: " ) +
-//                          constructorTestsInvalid[i] );
-//        } catch( URISyntaxException e ) {}
-//    }
-
-//    std::string invalid2[18] = {
-//        // authority validation
-//        "http://user@[3ffe:2x00:100:7031::1]:80/test", // malformed
-//        // IPv6 authority
-//        "http://[ipv6address]/apath#frag", // malformed ipv6 address
-//        "http://[ipv6address/apath#frag", // malformed ipv6 address
-//        "http://ipv6address]/apath#frag", // illegal char in host name
-//        "http://ipv6[address/apath#frag",
-//        "http://ipv6addr]ess/apath#frag",
-//        "http://ipv6address[]/apath#frag",
-//        // illegal char in username...
-//        "http://us[]er@host/path?query#frag", "http://host name/path", // illegal
-//        // char
-//        // in
-//        // authority
-//        "http://host^name#fragment", // illegal char in authority
-//        "telnet://us er@hostname/", // illegal char in authority
-//        // missing components
-//        "//", // Authority expected
-//        "ascheme://", // Authority expected
-//        "ascheme:", // Scheme-specific part expected
-//        // scheme validation
-//        "a scheme://reg/", // illegal char
-//        "1scheme://reg/", // non alpha char as 1st char
-//        "asche\u00dfme:ssp", // unicode char , not USASCII
-//        "asc%20heme:ssp" // escape octets
-//    };
-//
-//    for( int i = 0; i < 18; i++ ) {
-//        try {
-//            new URI( invalid2[i] );
-//            CPPUNIT_FAIL(
-//                string( "Failed to throw URISyntaxException for: " ) + invalid2[i] );
-//        } catch( URISyntaxException e ) {}
-//    }
-}
diff --git a/src/decaf/src/test/decaf/net/URITest.h b/src/decaf/src/test/decaf/net/URITest.h
deleted file mode 100644
index 5cf0628..0000000
--- a/src/decaf/src/test/decaf/net/URITest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_NET_URITEST_H_
-#define _DECAF_NET_URITEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace net{
-
-    class URITest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( URITest );
-        CPPUNIT_TEST( test_Constructor_String );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        URITest();
-        virtual ~URITest() {}
-
-        void test_Constructor_String();
-
-    };
-
-}}
-
-#endif /*_DECAF_NET_URITEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/DateTest.cpp b/src/decaf/src/test/decaf/util/DateTest.cpp
deleted file mode 100644
index 7d06df1..0000000
--- a/src/decaf/src/test/decaf/util/DateTest.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "DateTest.h"
-
-#include <decaf/util/Date.h>
-#include <decaf/lang/Thread.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::lang;
-
-void DateTest::test(){
-
-    Date date1;
-    CPPUNIT_ASSERT( date1.getTime() != 0 );
-
-    decaf::lang::Thread::sleep(55);
-
-    Date date2;
-
-    CPPUNIT_ASSERT( date1.before(date2) == true );
-    CPPUNIT_ASSERT( date1.after(date2) == false );
-
-    Date date3 = date1;
-    CPPUNIT_ASSERT( date1.equals( date3 ) == true );
-}
diff --git a/src/decaf/src/test/decaf/util/DateTest.h b/src/decaf/src/test/decaf/util/DateTest.h
deleted file mode 100644
index bd37140..0000000
--- a/src/decaf/src/test/decaf/util/DateTest.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_DATETEST_H_
-#define _DECAF_UTIL_DATETEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace util{
-
-    class DateTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( DateTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-        DateTest(){};
-        virtual ~DateTest(){};
-
-        void test();
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_DATETEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/Endian.cpp b/src/decaf/src/test/decaf/util/Endian.cpp
deleted file mode 100644
index af11202..0000000
--- a/src/decaf/src/test/decaf/util/Endian.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "Endian.h"
-#include <decaf/util/Config.h>
-#include <string.h>
-
-using namespace decaf;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-void Endian::byteSwap(unsigned char* data, int dataLength) {
-
-    #ifdef WORDS_BIGENDIAN
-        return;
-    #endif
-
-    for (int i = 0; i<dataLength/2; i++) {
-        unsigned char temp = data[i];
-        data[i] = data[dataLength-1-i];
-        data[dataLength-1-i] = temp;
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned char Endian::byteSwap( unsigned char value ){
-
-    #ifdef WORDS_BIGENDIAN
-        return value;
-    #endif
-
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned short Endian::byteSwap( unsigned short value ){
-
-    #ifdef WORDS_BIGENDIAN
-        return value;
-    #endif
-
-    return (((unsigned short)value & 0xFF00 ) >> 8 ) |
-           (((unsigned short)value & 0x00FF ) << 8 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned int Endian::byteSwap( unsigned int value ){
-
-    #ifdef WORDS_BIGENDIAN
-        return value;
-    #endif
-
-    return (((unsigned int)value & 0xFF000000 ) >> 24 ) |
-           (((unsigned int)value & 0x00FF0000 ) >> 8 )  |
-           (((unsigned int)value & 0x0000FF00 ) << 8 )  |
-           (((unsigned int)value & 0x000000FF ) << 24 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-unsigned long long Endian::byteSwap( unsigned long long value ){
-
-    #ifdef WORDS_BIGENDIAN
-        return value;
-    #endif
-
-    return (((unsigned long long)value & 0xFF00000000000000ULL ) >> 56 ) |
-           (((unsigned long long)value & 0x00FF000000000000ULL ) >> 40 ) |
-           (((unsigned long long)value & 0x0000FF0000000000ULL ) >> 24 ) |
-           (((unsigned long long)value & 0x000000FF00000000ULL ) >> 8 )  |
-           (((unsigned long long)value & 0x00000000FF000000ULL ) << 8 )  |
-           (((unsigned long long)value & 0x0000000000FF0000ULL ) << 24 ) |
-           (((unsigned long long)value & 0x000000000000FF00ULL ) << 40 ) |
-           (((unsigned long long)value & 0x00000000000000FFULL ) << 56 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-float Endian::byteSwap( float value ){
-
-    #ifdef WORDS_BIGENDIAN
-        return value;
-    #endif
-
-    unsigned int lvalue = 0;
-    memcpy( &lvalue, &value, sizeof( float ) );
-    lvalue = byteSwap( lvalue );
-    memcpy( &value, &lvalue, sizeof( unsigned int ) );
-    return value;
-}
-
-////////////////////////////////////////////////////////////////////////////////
-double Endian::byteSwap( double value ){
-
-    #ifdef WORDS_BIGENDIAN
-        return value;
-    #endif
-
-    unsigned long long lvalue = 0;
-    memcpy( &lvalue, &value, sizeof( double ) );
-    lvalue = byteSwap( lvalue );
-    memcpy( &value, &lvalue, sizeof( unsigned long long ) );
-    return value;
-}
-
diff --git a/src/decaf/src/test/decaf/util/Endian.h b/src/decaf/src/test/decaf/util/Endian.h
deleted file mode 100644
index 6c4eb58..0000000
--- a/src/decaf/src/test/decaf/util/Endian.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef _DECAF_UTIL_ENDIAN_H
-#define _DECAF_UTIL_ENDIAN_H
-
-namespace decaf{
-namespace util{
-
-    class Endian{
-    public:
-
-        static void byteSwap(unsigned char* data, int dataLength);
-
-        static unsigned char byteSwap( unsigned char value );
-
-        static unsigned short byteSwap( unsigned short value );
-
-        static unsigned int byteSwap( unsigned int value );
-
-        static unsigned long long byteSwap( unsigned long long value );
-
-        static float byteSwap( float value );
-
-        static double byteSwap( double value );
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_ENDIAN_H*/
diff --git a/src/decaf/src/test/decaf/util/MapTest.cpp b/src/decaf/src/test/decaf/util/MapTest.cpp
deleted file mode 100644
index f42b850..0000000
--- a/src/decaf/src/test/decaf/util/MapTest.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MapTest.h"
-#include <string>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-MapTest::MapTest(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-MapTest::~MapTest(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testContainsKey(){
-
-    Map<string, bool> boolMap;
-    CPPUNIT_ASSERT(boolMap.containsKey("bob") == false);
-
-    boolMap.setValue( "bob", true );
-
-    CPPUNIT_ASSERT(boolMap.containsKey("bob") == true );
-    CPPUNIT_ASSERT(boolMap.containsKey("fred") == false );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testClear(){
-
-    Map<string, bool> boolMap;
-    boolMap.setValue( "bob", true );
-    boolMap.setValue( "fred", true );
-
-    CPPUNIT_ASSERT(boolMap.size() == 2 );
-    boolMap.clear();
-    CPPUNIT_ASSERT(boolMap.size() == 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testIsEmpty(){
-
-    Map<string, bool> boolMap;
-    boolMap.setValue( "bob", true );
-    boolMap.setValue( "fred", true );
-
-    CPPUNIT_ASSERT(boolMap.isEmpty() == false );
-    boolMap.clear();
-    CPPUNIT_ASSERT(boolMap.isEmpty() == true );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testSize(){
-
-    Map<string, bool> boolMap;
-
-    CPPUNIT_ASSERT(boolMap.size() == 0 );
-    boolMap.setValue( "bob", true );
-    CPPUNIT_ASSERT(boolMap.size() == 1 );
-    boolMap.setValue( "fred", true );
-    CPPUNIT_ASSERT(boolMap.size() == 2 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testValue(){
-
-    Map<string, bool> boolMap;
-
-    boolMap.setValue( "fred", true );
-    CPPUNIT_ASSERT( boolMap.getValue("fred") == true );
-
-    boolMap.setValue( "bob", false );
-    CPPUNIT_ASSERT( boolMap.getValue("bob") == false );
-    CPPUNIT_ASSERT( boolMap.getValue("fred") == true );
-
-    try{
-        boolMap.getValue( "mike" );
-        CPPUNIT_ASSERT(false);
-    } catch( decaf::lang::exceptions::NoSuchElementException& e ){
-    }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testRemove(){
-    Map<string, bool> boolMap;
-
-    boolMap.setValue( "fred", true );
-    CPPUNIT_ASSERT( boolMap.containsKey("fred") == true );
-    boolMap.remove( "fred" );
-    CPPUNIT_ASSERT( boolMap.containsKey("fred") == false );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void MapTest::testContiansValue(){
-    Map<string, bool> boolMap;
-
-    boolMap.setValue( "fred", true );
-    boolMap.setValue( "fred1", false );
-    CPPUNIT_ASSERT( boolMap.containsValue(true) == true );
-    boolMap.remove( "fred" );
-    CPPUNIT_ASSERT( boolMap.containsValue(true) == false );
-}
diff --git a/src/decaf/src/test/decaf/util/MapTest.h b/src/decaf/src/test/decaf/util/MapTest.h
deleted file mode 100644
index ed57f73..0000000
--- a/src/decaf/src/test/decaf/util/MapTest.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_MAPTEST_H_
-#define _DECAF_UTIL_MAPTEST_H_
-
-#include <decaf/util/Map.h>
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace util{
-    
-    class MapTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( MapTest );
-        CPPUNIT_TEST( testContainsKey );
-        CPPUNIT_TEST( testClear );
-        CPPUNIT_TEST( testSize );
-        CPPUNIT_TEST( testValue );
-        CPPUNIT_TEST( testRemove );
-        CPPUNIT_TEST( testContiansValue );
-        CPPUNIT_TEST( testIsEmpty );
-        CPPUNIT_TEST_SUITE_END();
-        
-    public:
-    	MapTest();
-    	virtual ~MapTest();
-        
-        void testContainsKey();
-        void testClear();
-        void testSize();
-        void testValue();
-        void testRemove();
-        void testContiansValue();
-        void testIsEmpty();
-        
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_MAPTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/QueueTest.cpp b/src/decaf/src/test/decaf/util/QueueTest.cpp
deleted file mode 100644
index f0a7fda..0000000
--- a/src/decaf/src/test/decaf/util/QueueTest.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "QueueTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-void QueueTest::test()
-{
-   Queue<char> q;
-
-   CPPUNIT_ASSERT( q.empty() == true );
-   CPPUNIT_ASSERT( q.size() == 0 );
-
-   q.push('a');
-
-   CPPUNIT_ASSERT( q.front() == 'a' );
-
-   q.pop();
-
-   CPPUNIT_ASSERT( q.empty() == true );
-
-   q.push('b');
-   q.push('c');
-
-   CPPUNIT_ASSERT( q.size() == 2 );
-
-   CPPUNIT_ASSERT( q.front() == 'b' );
-   CPPUNIT_ASSERT( q.back() == 'c' );
-}
diff --git a/src/decaf/src/test/decaf/util/QueueTest.h b/src/decaf/src/test/decaf/util/QueueTest.h
deleted file mode 100644
index a57ce40..0000000
--- a/src/decaf/src/test/decaf/util/QueueTest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_QUEUETEST_H_
-#define _DECAF_UTIL_QUEUETEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/util/Queue.h>
-
-namespace decaf{
-namespace util{
-
-   class QueueTest : public CppUnit::TestFixture {
-
-       CPPUNIT_TEST_SUITE( QueueTest );
-       CPPUNIT_TEST( test );
-       CPPUNIT_TEST_SUITE_END();
-
-   public:
-
-       virtual ~QueueTest() {}
-
-       void test();
-   };
-
-}}
-
-#endif /*_DECAF_UTIL_QUEUETEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/RandomTest.cpp b/src/decaf/src/test/decaf/util/RandomTest.cpp
deleted file mode 100644
index 79e5383..0000000
--- a/src/decaf/src/test/decaf/util/RandomTest.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "RandomTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-
-void RandomTest::test(){
-
-    Random rand(122760);
-    CPPUNIT_ASSERT_EQUAL(-1524104671, rand.nextInt());
-    CPPUNIT_ASSERT_EQUAL(2785759620113032781LL, rand.nextLong());
-    CPPUNIT_ASSERT_EQUAL(rand.nextDouble(), 0.8173322904425151);
-    CPPUNIT_ASSERT_EQUAL(rand.nextFloat(), 0.8239248f);
-
-    std::vector<unsigned char> b(0);
-    rand.nextBytes(b);
-    CPPUNIT_ASSERT_EQUAL(-899478426, rand.nextInt());
-
-    rand = Random(122760);
-    rand.nextInt();
-    rand.nextLong();
-    rand.nextDouble();
-    rand.nextFloat();
-    b = std::vector<unsigned char>(3);
-    rand.nextBytes(b);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)102, b[0]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)12, b[1]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)99, b[2]);
-    CPPUNIT_ASSERT_EQUAL(-1550323395, rand.nextInt());
-
-    rand = Random(122760);
-    rand.nextInt();
-    rand.nextLong();
-    rand.nextDouble();
-    rand.nextFloat();
-    b = std::vector<unsigned char>(4);
-    rand.nextBytes(b);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)102, b[0]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)12, b[1]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)99, b[2]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)-54, b[3]);
-    CPPUNIT_ASSERT_EQUAL(-1550323395, rand.nextInt());
-
-    rand = Random(122760);
-    rand.nextInt();
-    rand.nextLong();
-    rand.nextDouble();
-    rand.nextFloat();
-    b = std::vector<unsigned char>(5);
-    rand.nextBytes(b);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)102, b[0]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)12, b[1]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)99, b[2]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)-54, b[3]);
-    CPPUNIT_ASSERT_EQUAL((unsigned char)61, b[4]);
-    CPPUNIT_ASSERT_EQUAL(-270809961, rand.nextInt());
-
-    bool ok = true;
-    rand = Random(0);
-    for (int i=0; i < 1000000; ++i) {
-        int x = rand.nextInt(1000);
-        if (x < 0 || x >= 1000) {
-            ok = false;
-        }
-    }
-    CPPUNIT_ASSERT(ok);
-}
diff --git a/src/decaf/src/test/decaf/util/RandomTest.h b/src/decaf/src/test/decaf/util/RandomTest.h
deleted file mode 100644
index 10c6acd..0000000
--- a/src/decaf/src/test/decaf/util/RandomTest.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_RANDOMTEST_H_
-#define _DECAF_UTIL_RANDOMTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/util/Random.h>
-
-namespace decaf{
-namespace util{
-
-    class RandomTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( RandomTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        RandomTest(){}
-        virtual ~RandomTest(){}
-
-        void test();
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_RANDOMTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/SetTest.cpp b/src/decaf/src/test/decaf/util/SetTest.cpp
deleted file mode 100644
index a841d0f..0000000
--- a/src/decaf/src/test/decaf/util/SetTest.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "SetTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-SetTest::SetTest(){
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testContains(){
-
-    Set<string> set;
-    CPPUNIT_ASSERT( set.contains( "bob" ) == false);
-
-    set.add( "bob" );
-
-    CPPUNIT_ASSERT(set.contains( "bob" ) == true );
-    CPPUNIT_ASSERT(set.contains( "fred" ) == false );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testClear(){
-
-    Set<string> set;
-    set.add( "bob" );
-    set.add( "fred" );
-
-    CPPUNIT_ASSERT( set.size() == 2 );
-    set.clear();
-    CPPUNIT_ASSERT( set.size() == 0 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testIsEmpty(){
-
-    Set<string> set;
-    set.add( "bob" );
-    set.add( "fred" );
-
-    CPPUNIT_ASSERT(set.isEmpty() == false );
-    set.clear();
-    CPPUNIT_ASSERT(set.isEmpty() == true );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testSize(){
-
-    Set<string> set;
-
-    CPPUNIT_ASSERT( set.size() == 0 );
-    set.add( "bob" );
-    CPPUNIT_ASSERT( set.size() == 1 );
-    set.add( "fred" );
-    CPPUNIT_ASSERT( set.size() == 2 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testAdd(){
-    Set<string> set;
-
-    set.add( "fred" );
-    set.add( "fred" );
-    set.add( "fred" );
-    CPPUNIT_ASSERT( set.contains("fred") == true );
-    CPPUNIT_ASSERT( set.size() == 1 );
-    set.remove( "fred" );
-    CPPUNIT_ASSERT( set.contains("fred") == false );
-    CPPUNIT_ASSERT( set.isEmpty() );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testRemove(){
-    Set<string> set;
-
-    set.add( "fred" );
-    CPPUNIT_ASSERT( set.contains( "fred" ) == true );
-    set.remove( "fred" );
-    CPPUNIT_ASSERT( set.contains( "fred" ) == false );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testToArray(){
-
-    Set<string> set;
-
-    set.add( "fred1" );
-    set.add( "fred2" );
-    set.add( "fred3" );
-    CPPUNIT_ASSERT( set.size() == 3 );
-
-    std::vector<std::string> array = set.toArray();
-
-    CPPUNIT_ASSERT( array.size() == 3 );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void SetTest::testIterator(){
-
-    Set<string> set;
-
-    set.add( "fred1" );
-    set.add( "fred2" );
-    set.add( "fred3" );
-
-    Iterator<string>* iterator1 = set.iterator();
-    CPPUNIT_ASSERT( iterator1 != NULL );
-    CPPUNIT_ASSERT( iterator1->hasNext() == true );
-
-    size_t count = 0;
-    while( iterator1->hasNext() ) {
-        iterator1->next();
-        ++count;
-    }
-
-    CPPUNIT_ASSERT( count == set.size() );
-
-    Iterator<string>* iterator2 = set.iterator();
-
-    while( iterator2->hasNext() ) {
-        iterator2->next();
-        iterator2->remove();
-    }
-
-    CPPUNIT_ASSERT( set.isEmpty() );
-
-    delete iterator1;
-    delete iterator2;
-}
diff --git a/src/decaf/src/test/decaf/util/SetTest.h b/src/decaf/src/test/decaf/util/SetTest.h
deleted file mode 100644
index dd2e0d8..0000000
--- a/src/decaf/src/test/decaf/util/SetTest.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_SETTEST_H_
-#define _DECAF_UTIL_SETTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/util/Set.h>
-#include <decaf/util/Iterator.h>
-
-namespace decaf{
-namespace util{
-
-    class SetTest : public CppUnit::TestFixture
-    {
-        CPPUNIT_TEST_SUITE( SetTest );
-        CPPUNIT_TEST( testContains );
-        CPPUNIT_TEST( testClear );
-        CPPUNIT_TEST( testSize );
-        CPPUNIT_TEST( testAdd );
-        CPPUNIT_TEST( testRemove );
-        CPPUNIT_TEST( testIsEmpty );
-        CPPUNIT_TEST( testToArray );
-        CPPUNIT_TEST( testIterator );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        SetTest();
-        virtual ~SetTest() {}
-
-        void testContains();
-        void testClear();
-        void testSize();
-        void testAdd();
-        void testRemove();
-        void testIsEmpty();
-        void testToArray();
-        void testIterator();
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_SETTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/StringTokenizerTest.cpp b/src/decaf/src/test/decaf/util/StringTokenizerTest.cpp
deleted file mode 100644
index 89930f4..0000000
--- a/src/decaf/src/test/decaf/util/StringTokenizerTest.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "StringTokenizerTest.h"
-#include <decaf/util/StringTokenizer.h>
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-void StringTokenizerTest::test()
-{
-    StringTokenizer tokenizer("stomp://127.0.0.1:23232", "://");
-    CPPUNIT_ASSERT( tokenizer.countTokens() == 3 );
-    CPPUNIT_ASSERT( tokenizer.nextToken() == "stomp" );
-    CPPUNIT_ASSERT( tokenizer.nextToken() == "127.0.0.1" );
-    CPPUNIT_ASSERT( tokenizer.nextToken() == "23232" );
-
-    StringTokenizer tokenizer1("::://stomp://127.0.0.1:23232:", ":/");
-    CPPUNIT_ASSERT( tokenizer1.countTokens() == 3 );
-    CPPUNIT_ASSERT( tokenizer1.nextToken() == "stomp" );
-    CPPUNIT_ASSERT( tokenizer1.nextToken() == "127.0.0.1" );
-    CPPUNIT_ASSERT( tokenizer1.nextToken() == "23232" );
-
-    StringTokenizer tokenizer2("test");
-    CPPUNIT_ASSERT( tokenizer2.countTokens() == 1 );
-    CPPUNIT_ASSERT( tokenizer2.hasMoreTokens() == true );
-    CPPUNIT_ASSERT( tokenizer2.nextToken() == "test" );
-    CPPUNIT_ASSERT( tokenizer2.hasMoreTokens() == false );
-
-    StringTokenizer tokenizer3(":", ":");
-    CPPUNIT_ASSERT( tokenizer3.countTokens() == 0 );
-    CPPUNIT_ASSERT( tokenizer3.hasMoreTokens() == false );
-    CPPUNIT_ASSERT( tokenizer3.nextToken(" ") == ":" );
-
-    try
-    {
-       tokenizer3.nextToken();
-       CPPUNIT_ASSERT( false );
-    }
-    catch(lang::exceptions::NoSuchElementException ex)
-    {
-       CPPUNIT_ASSERT( true );
-    }
-
-    StringTokenizer tokenizer4("the quick brown fox");
-    CPPUNIT_ASSERT( tokenizer4.countTokens() == 4 );
-    CPPUNIT_ASSERT( tokenizer4.hasMoreTokens() == true );
-    CPPUNIT_ASSERT( tokenizer4.nextToken() == "the" );
-    CPPUNIT_ASSERT( tokenizer4.nextToken() == "quick" );
-    CPPUNIT_ASSERT( tokenizer4.nextToken() == "brown" );
-    CPPUNIT_ASSERT( tokenizer4.nextToken() == "fox" );
-    CPPUNIT_ASSERT( tokenizer4.countTokens() == 0 );
-    CPPUNIT_ASSERT( tokenizer4.hasMoreTokens() == false );
-
-    StringTokenizer tokenizer5("the:quick:brown:fox", ":", true);
-    CPPUNIT_ASSERT( tokenizer5.countTokens() == 7 );
-    CPPUNIT_ASSERT( tokenizer5.hasMoreTokens() == true );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == "the" );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == ":" );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == "quick" );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == ":" );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == "brown" );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == ":" );
-    CPPUNIT_ASSERT( tokenizer5.nextToken() == "fox" );
-    CPPUNIT_ASSERT( tokenizer5.countTokens() == 0 );
-    CPPUNIT_ASSERT( tokenizer5.hasMoreTokens() == false );
-
-    std::vector<std::string> myArray;
-    StringTokenizer tokenizer6("the:quick:brown:fox", ":");
-    CPPUNIT_ASSERT( tokenizer6.countTokens() == 4 );
-    CPPUNIT_ASSERT( tokenizer6.toArray(myArray) == 4 );
-    CPPUNIT_ASSERT( tokenizer6.countTokens() == 0 );
-    tokenizer6.reset();
-    CPPUNIT_ASSERT( tokenizer6.countTokens() == 4 );
-    tokenizer6.reset("the:quick:brown:fox", "$");
-    CPPUNIT_ASSERT( tokenizer6.countTokens() == 1 );
-    tokenizer6.reset("this$is$a$test");
-    CPPUNIT_ASSERT( tokenizer6.countTokens() == 4 );
-    tokenizer6.reset("this$is$a$test", "$", true);
-        CPPUNIT_ASSERT( tokenizer6.countTokens() == 7 );
-}
diff --git a/src/decaf/src/test/decaf/util/StringTokenizerTest.h b/src/decaf/src/test/decaf/util/StringTokenizerTest.h
deleted file mode 100644
index 66d8776..0000000
--- a/src/decaf/src/test/decaf/util/StringTokenizerTest.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_STRINGTOKENIZERTEST_H_
-#define _DECAF_UTIL_STRINGTOKENIZERTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace util{
-
-   class StringTokenizerTest : public CppUnit::TestFixture {
-
-       CPPUNIT_TEST_SUITE( StringTokenizerTest );
-       CPPUNIT_TEST( test );
-       CPPUNIT_TEST_SUITE_END();
-
-   public:
-
-        virtual ~StringTokenizerTest() {}
-
-        void test();
-
-   };
-
-}}
-
-#endif /*_DECAF_UTIL_STRINGTOKENIZERTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/UUIDTest.cpp b/src/decaf/src/test/decaf/util/UUIDTest.cpp
deleted file mode 100644
index e2f5c5e..0000000
--- a/src/decaf/src/test/decaf/util/UUIDTest.cpp
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "UUIDTest.h"
-
-#include <decaf/util/UUID.h>
-
-using namespace decaf;
-using namespace decaf::util;
-
-////////////////////////////////////////////////////////////////////////////////
-UUIDTest::UUIDTest() {
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void UUIDTest::test() {
-
-    std::string bytes = "ASDASFSADGSDGSDASFA";
-
-    UUID randId = UUID::randomUUID();
-    UUID bytesId = UUID::nameUUIDFromBytes( bytes.c_str(), bytes.size() );
-
-    CPPUNIT_ASSERT( !( randId == bytesId ) );
-    CPPUNIT_ASSERT( !( randId.equals( bytesId ) ) );
-    CPPUNIT_ASSERT( randId.compareTo( bytesId ) != 0 );
-
-    std::string uuidStr = randId.toString();
-
-    UUID strId = UUID::fromString( uuidStr );
-
-    CPPUNIT_ASSERT( randId == strId );
-
-    CPPUNIT_ASSERT( randId.variant() == 2 );
-
-    UUID fromBits( randId.getMostSignificantBits(),
-                   randId.getLeastSignificantBits() );
-
-    CPPUNIT_ASSERT( randId.compareTo( fromBits) == 0 );
-}
diff --git a/src/decaf/src/test/decaf/util/UUIDTest.h b/src/decaf/src/test/decaf/util/UUIDTest.h
deleted file mode 100644
index ba7d188..0000000
--- a/src/decaf/src/test/decaf/util/UUIDTest.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_UUIDTEST_H_
-#define _DECAF_UTIL_UUIDTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-namespace decaf{
-namespace util{
-
-    class UUIDTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( UUIDTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        UUIDTest();
-        virtual ~UUIDTest() {}
-
-        virtual void test();
-
-    };
-
-}}
-
-#endif /*_DECAF_UTIL_UUIDTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/concurrent/CountDownLatchTest.cpp b/src/decaf/src/test/decaf/util/concurrent/CountDownLatchTest.cpp
deleted file mode 100644
index 10d2f43..0000000
--- a/src/decaf/src/test/decaf/util/concurrent/CountDownLatchTest.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "CountDownLatchTest.h"
-
-using namespace decaf;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-////////////////////////////////////////////////////////////////////////////////
-void CountDownLatchTest::test()
-{
-    CountDownLatch latch( 50 );
-
-    CPPUNIT_ASSERT( latch.getCount() == 50 );
-
-    MyThread thread;
-    thread.latch = &latch;
-    thread.start();
-
-    latch.await();
-
-    CPPUNIT_ASSERT( latch.getCount() == 0 );
-
-    thread.join();
-
-    CPPUNIT_ASSERT( true );
-}
-
-////////////////////////////////////////////////////////////////////////////////
-void CountDownLatchTest::test2()
-{
-    CountDownLatch latch( 75 );
-
-    CPPUNIT_ASSERT( latch.getCount() == 75 );
-
-    MyThread thread;
-    thread.latch = &latch;
-    thread.start();
-
-    CPPUNIT_ASSERT( latch.await( 2 ) == false );
-
-    latch.await();
-
-    CPPUNIT_ASSERT( latch.getCount() == 0 );
-
-    thread.join();
-
-    CPPUNIT_ASSERT( true );
-}
diff --git a/src/decaf/src/test/decaf/util/concurrent/CountDownLatchTest.h b/src/decaf/src/test/decaf/util/concurrent/CountDownLatchTest.h
deleted file mode 100644
index 048a813..0000000
--- a/src/decaf/src/test/decaf/util/concurrent/CountDownLatchTest.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_CONCURRENT_COUNTDOWNLATCHTEST_H_
-#define _DECAF_UTIL_CONCURRENT_COUNTDOWNLATCHTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Thread.h>
-#include <decaf/util/concurrent/CountDownLatch.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class CountDownLatchTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( CountDownLatchTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST( test2 );
-        CPPUNIT_TEST_SUITE_END();
-
-    protected:
-
-        class MyThread : public lang::Thread
-        {
-        public:
-
-            CountDownLatch* latch;
-
-        public:
-
-            MyThread(){}
-            virtual ~MyThread(){}
-
-            virtual void run(){
-
-                while( latch->getCount() > 0 ) {
-                    latch->countDown();
-
-                    lang::Thread::sleep( 20 );
-                }
-            }
-
-        };
-
-    public:
-
-        CountDownLatchTest() {}
-        virtual ~CountDownLatchTest() {}
-
-        virtual void test();
-        virtual void test2();
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_COUNTDOWNLATCHTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/concurrent/MutexTest.cpp b/src/decaf/src/test/decaf/util/concurrent/MutexTest.cpp
deleted file mode 100644
index 2eac067..0000000
--- a/src/decaf/src/test/decaf/util/concurrent/MutexTest.cpp
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "MutexTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-///////////////////////////////////////////////////////////////////////////////
-void MutexTest::testTimedWait(){
-
-    try
-    {
-        MyTimedWaitingThread test;
-        time_t startTime = time( NULL );
-        test.start();
-        test.join();
-        time_t endTime = time( NULL );
-
-        time_t delta = endTime - startTime;
-
-        CPPUNIT_ASSERT( delta >= 1 && delta <= 3 );
-    }
-    catch(lang::Exception& ex)
-    {
-        std::cout << ex.getMessage() << std::endl;
-    }
-}
-
-void MutexTest::testWait(){
-
-    try
-    {
-        MyWaitingThread test;
-        test.start();
-
-        Thread::sleep( 1000 );
-
-        synchronized( &test )
-        {
-            for( int ix=0; ix<100; ix++ ){
-                test.value += 1;
-            }
-
-            test.notify();
-        }
-
-        test.join();
-
-        CPPUNIT_ASSERT( test.value == 2500 );
-    } catch( lang::Exception& ex ) {
-        ex.setMark( __FILE__, __LINE__ );
-    }
-}
-
-void MutexTest::test()
-{
-    MyThread test;
-
-    synchronized(&test){
-
-        test.start();
-
-        for( int ix=0; ix<100; ix++ ){
-            test.value += 1;
-        }
-    }
-
-    test.join();
-
-    CPPUNIT_ASSERT( test.value == 2500 );
-}
-
-void MutexTest::testNotify()
-{
-    try{
-        Mutex mutex;
-        Mutex started;
-        Mutex completed;
-
-        const int numThreads = 30;
-        MyNotifiedThread* threads[numThreads];
-
-        // Create and start all the threads.
-        for( int ix=0; ix<numThreads; ++ix ){
-            threads[ix] = new MyNotifiedThread( &mutex, &started, &completed );
-            threads[ix]->start();
-        }
-
-        synchronized( &started )
-        {
-            int count = 0;
-
-            while( count < ( numThreads ) )
-            {
-                started.wait( 30 );
-                count++;
-            }
-        }
-
-        synchronized(&mutex)
-        {
-            mutex.notify();
-        }
-
-        Thread::sleep( 1000 );
-
-        int counter = 0;
-        for( int ix=0; ix<numThreads; ++ix ){
-            if( threads[ix]->done ){
-                counter++;
-            }
-        }
-
-        // Make sure only 1 thread was notified.
-        CPPUNIT_ASSERT( counter == 1 );
-
-        synchronized(&mutex)
-        {
-            // Notify all threads.
-            for( int ix=0; ix<numThreads-1; ++ix ){
-                mutex.notify();
-            }
-        }
-
-        synchronized( &started )
-        {
-            int count = 0;
-
-            while( count < ( numThreads ) )
-            {
-                started.wait( 30 );
-                count++;
-            }
-        }
-
-        int numComplete = 0;
-        for( int ix=0; ix<numThreads; ++ix ){
-            if( threads[ix]->done ){
-                numComplete++;
-            }
-        }
-        CPPUNIT_ASSERT( numComplete == numThreads );
-
-        synchronized( &mutex )
-        {
-            mutex.wait( 5 );
-        }
-
-        synchronized( &mutex )
-        {
-            mutex.notifyAll();
-        }
-
-        // Delete all the threads.
-        for( int ix=0; ix<numThreads; ++ix ){
-            delete threads[ix];
-        }
-
-    }catch( lang::Exception& ex ){
-        ex.setMark( __FILE__, __LINE__ );
-    }
-}
-
-void MutexTest::testNotifyAll()
-{
-    try{
-        Mutex mutex;
-        Mutex started;
-        Mutex completed;
-
-        const int numThreads = 100;
-        MyNotifiedThread* threads[numThreads];
-
-        // Create and start all the threads.
-        for( int ix=0; ix<numThreads; ++ix ){
-            threads[ix] = new MyNotifiedThread( &mutex, &started, &completed );
-            threads[ix]->start();
-        }
-
-        synchronized( &started )
-        {
-            int count = 0;
-
-            while( count < ( numThreads ) )
-            {
-                started.wait( 30 );
-                count++;
-            }
-        }
-
-        for( int ix=0; ix<numThreads; ++ix )
-        {
-            if( threads[ix]->done == true ){
-                printf("threads[%d] is done prematurely\n", ix );
-            }
-            CPPUNIT_ASSERT( threads[ix]->done == false );
-        }
-
-        // Notify all threads.
-        synchronized( &mutex ){
-           mutex.notifyAll();
-        }
-
-        synchronized( &completed )
-        {
-            int count = 0;
-
-            while( count < ( numThreads ) )
-            {
-                completed.wait( 30 );
-                count++;
-            }
-        }
-
-        int numComplete = 0;
-        for( int ix=0; ix<numThreads; ++ix ){
-            if( threads[ix]->done ){
-                numComplete++;
-            }
-        }
-        //printf("numComplete: %d, numThreads: %d\n", numComplete, numThreads );
-        CPPUNIT_ASSERT( numComplete == numThreads );
-
-        // Delete all the threads.
-        for( int ix=0; ix<numThreads; ++ix ){
-            threads[ix]->join();
-            delete threads[ix];
-        }
-
-    }catch( lang::Exception& ex ){
-        ex.setMark( __FILE__, __LINE__ );
-    }
-}
-
-void MutexTest::testRecursiveLock()
-{
-    try{
-        Mutex mutex;
-
-        const int numThreads = 30;
-        MyRecursiveLockThread* threads[numThreads];
-
-        // Create and start all the threads.
-        for( int ix=0; ix<numThreads; ++ix ){
-            threads[ix] = new MyRecursiveLockThread( &mutex );
-            threads[ix]->start();
-        }
-
-        // Sleep so all the threads can get to the wait.
-        Thread::sleep( 1000 );
-
-        for( int ix=0; ix<numThreads; ++ix ){
-            if( threads[ix]->done == true ){
-                std::cout << "threads[" << ix
-                          << "] is done prematurely\n";
-            }
-            CPPUNIT_ASSERT( threads[ix]->done == false );
-        }
-
-        // Notify all threads.
-        synchronized( &mutex )
-        {
-            synchronized( &mutex )
-            {
-                mutex.notifyAll();
-            }
-        }
-
-        // Sleep to give the threads time to wake up.
-        Thread::sleep( 1000 );
-
-        for( int ix=0; ix<numThreads; ++ix ){
-            if( threads[ix]->done != true ){
-                std::cout<< "threads[" << ix << "] is not done\n";
-            }
-            CPPUNIT_ASSERT( threads[ix]->done == true );
-        }
-
-        // Delete all the threads.
-        for( int ix=0; ix<numThreads; ++ix ){
-            delete threads[ix];
-        }
-
-    }catch( lang::Exception& ex ){
-        ex.setMark( __FILE__, __LINE__ );
-    }
-}
-
-void MutexTest::testDoubleLock()
-{
-    try{
-        Mutex mutex1;
-        Mutex mutex2;
-
-        MyDoubleLockThread thread(&mutex1, &mutex2);
-
-        thread.start();
-
-        // Let the thread get both locks
-        Thread::sleep( 200 );
-
-        // Lock mutex 2, thread is waiting on it
-        synchronized(&mutex2)
-        {
-           mutex2.notify();
-        }
-
-        // Let the thread die
-        thread.join();
-
-        CPPUNIT_ASSERT( thread.done );
-    }catch( lang::Exception& ex ){
-        ex.setMark( __FILE__, __LINE__ );
-    }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-void MutexTest::testStressMutex(){
-    MyStoppableThread tester;
-
-    tester.start();
-
-    CPPUNIT_ASSERT( tester.isStarted() );
-
-    for( int i = 0; i < 100; ++i ) {
-        tester.stop();
-        tester.start();
-    }
-
-    CPPUNIT_ASSERT( true );
-}
diff --git a/src/decaf/src/test/decaf/util/concurrent/MutexTest.h b/src/decaf/src/test/decaf/util/concurrent/MutexTest.h
deleted file mode 100644
index af62da4..0000000
--- a/src/decaf/src/test/decaf/util/concurrent/MutexTest.h
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_CONCURRENT_MUTEXTEST_H_
-#define _DECAF_UTIL_CONCURRENT_MUTEXTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/lang/Thread.h>
-#include <decaf/lang/Runnable.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Random.h>
-#include <time.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class MutexTest : public CppUnit::TestFixture {
-
-        CPPUNIT_TEST_SUITE( MutexTest );
-        CPPUNIT_TEST( test );
-        CPPUNIT_TEST( testWait );
-        CPPUNIT_TEST( testTimedWait );
-        CPPUNIT_TEST( testNotify );
-        CPPUNIT_TEST( testNotifyAll );
-        CPPUNIT_TEST( testRecursiveLock );
-        CPPUNIT_TEST( testDoubleLock );
-        CPPUNIT_TEST( testStressMutex );
-        CPPUNIT_TEST_SUITE_END();
-
-    public:
-
-        class MyThread
-        :
-            public lang::Thread,
-            public Synchronizable{
-
-        private:
-
-            Mutex mutex;
-
-        public:
-
-            int value;
-            MyThread(){ value = 0;}
-            virtual ~MyThread(){}
-
-            virtual void lock() throw(lang::Exception){
-                mutex.lock();
-            }
-            virtual void unlock() throw(lang::Exception){
-                mutex.unlock();
-            }
-            virtual void wait() throw(lang::Exception){
-                mutex.wait();
-            }
-            virtual void wait(unsigned long millisecs) throw(lang::Exception){
-                mutex.wait( millisecs );
-            }
-            virtual void notify() throw(lang::Exception){
-                mutex.notify();
-            }
-            virtual void notifyAll() throw(lang::Exception){
-                mutex.notifyAll();
-            }
-
-            virtual void run(){
-
-                {
-                    Lock lock (this);
-
-                    value = value * 25;
-                }
-            }
-
-        };
-
-        class MyWaitingThread
-        :
-            public lang::Thread,
-            public Synchronizable{
-
-        private:
-
-            Mutex mutex;
-
-        public:
-
-            int value;
-            MyWaitingThread(){ value = 0;}
-            virtual ~MyWaitingThread(){}
-            virtual void lock() throw(lang::Exception){
-                mutex.lock();
-            }
-            virtual void unlock() throw(lang::Exception){
-                mutex.unlock();
-            }
-            virtual void wait() throw(lang::Exception){
-                mutex.wait();
-            }
-            virtual void wait(unsigned long millisecs) throw(lang::Exception){
-                mutex.wait( millisecs );
-            }
-            virtual void notify() throw(lang::Exception){
-                mutex.notify();
-            }
-            virtual void notifyAll() throw(lang::Exception){
-                mutex.notifyAll();
-            }
-
-            virtual void run(){
-
-                try
-                {
-                    synchronized(this)
-                    {
-                        this->wait();
-
-                        std::cout.flush();
-
-                        value = value * 25;
-                    }
-                }
-                catch(lang::Exception& ex)
-                {
-                    ex.setMark( __FILE__, __LINE__ );
-                }
-            }
-      };
-
-      class MyTimedWaitingThread
-      :
-         public lang::Thread,
-         public Synchronizable{
-
-      private:
-
-         Mutex mutex;
-
-      public:
-
-         int value;
-         MyTimedWaitingThread(){ value = 0;}
-         virtual ~MyTimedWaitingThread(){}
-         virtual void lock() throw(lang::Exception){
-             mutex.lock();
-         }
-         virtual void unlock() throw(lang::Exception){
-             mutex.unlock();
-         }
-         virtual void wait() throw(lang::Exception){
-             mutex.wait();
-         }
-         virtual void wait(unsigned long millisecs) throw(lang::Exception){
-             mutex.wait( millisecs );
-         }
-         virtual void notify() throw(lang::Exception){
-             mutex.notify();
-         }
-         virtual void notifyAll() throw(lang::Exception){
-             mutex.notifyAll();
-         }
-
-         virtual void run(){
-
-            try
-            {
-               synchronized(this)
-               {
-                  this->wait(2000);
-
-                  value = 666;
-               }
-            }
-            catch(lang::Exception& ex)
-            {
-                ex.setMark( __FILE__, __LINE__ );
-            }
-         }
-      };
-
-      class MyNotifiedThread
-      :
-         public lang::Thread,
-         public Synchronizable{
-
-      public:
-
-         bool done;
-         Mutex* mutex;
-         Mutex* started;
-         Mutex* completed;
-
-      public:
-
-         int value;
-         MyNotifiedThread(Mutex* mutex, Mutex* started, Mutex* completed ){
-            this->mutex = mutex;
-            this->started = started;
-            this->completed = completed;
-            this->done = false;
-         }
-         virtual ~MyNotifiedThread(){}
-         virtual void lock() throw(lang::Exception){
-             mutex->lock();
-         }
-         virtual void unlock() throw(lang::Exception){
-             mutex->unlock();
-         }
-         virtual void wait() throw(lang::Exception){
-             mutex->wait();
-         }
-         virtual void wait(unsigned long millisecs) throw(lang::Exception){
-             mutex->wait( millisecs );
-         }
-         virtual void notify() throw(lang::Exception){
-             mutex->notify();
-         }
-         virtual void notifyAll() throw(lang::Exception){
-             mutex->notifyAll();
-         }
-
-         virtual void run(){
-
-            try
-            {
-               done = false;
-               synchronized(this)
-               {
-                  synchronized( started )
-                  {
-                     started->notify();
-                  }
-
-                  this->wait();
-                  done = true;
-
-                  synchronized( completed )
-                  {
-                     completed->notify();
-                  }
-               }
-            }
-            catch(lang::Exception& ex)
-            {
-               ex.setMark( __FILE__, __LINE__ );
-            }
-         }
-      };
-
-      class MyRecursiveLockThread
-      :
-         public lang::Thread,
-         public Synchronizable{
-
-      public:
-
-         bool done;
-         Mutex* mutex;
-
-      public:
-
-         int value;
-         MyRecursiveLockThread(Mutex* mutex){ this->mutex = mutex; done = false; }
-         virtual ~MyRecursiveLockThread(){}
-         virtual void lock() throw(lang::Exception){
-             mutex->lock();
-         }
-         virtual void unlock() throw(lang::Exception){
-             mutex->unlock();
-         }
-         virtual void wait() throw(lang::Exception){
-             mutex->wait();
-         }
-         virtual void wait(unsigned long millisecs) throw(lang::Exception){
-             mutex->wait( millisecs );
-         }
-         virtual void notify() throw(lang::Exception){
-             mutex->notify();
-         }
-         virtual void notifyAll() throw(lang::Exception){
-             mutex->notifyAll();
-         }
-
-         virtual void run(){
-
-            try
-            {
-               done = false;
-               synchronized(this)
-               {
-                  synchronized(this)
-                  {
-                     this->wait();
-                     done = true;
-                  }
-               }
-            }
-            catch(lang::Exception& ex)
-            {
-               ex.setMark( __FILE__, __LINE__ );
-            }
-         }
-      };
-
-      class MyDoubleLockThread
-      :
-         public lang::Thread
-      {
-
-      public:
-
-         bool done;
-         Mutex* mutex1;
-         Mutex* mutex2;
-
-      public:
-
-         int value;
-         MyDoubleLockThread(Mutex* mutex1, Mutex* mutex2)
-         {
-            this->mutex1 = mutex1;
-            this->mutex2 = mutex2;
-            done = false;
-         }
-
-         virtual ~MyDoubleLockThread(){}
-
-         virtual void run(){
-
-            try
-            {
-               done = false;
-               synchronized(mutex1)
-               {
-                  synchronized(mutex2)
-                  {
-                     mutex2->wait();
-                     done = true;
-                  }
-               }
-            }
-            catch(lang::Exception& ex)
-            {
-               ex.setMark( __FILE__, __LINE__ );
-            }
-         }
-      };
-
-      class MyStoppableThread : public lang::Runnable
-      {
-      public:
-
-          bool started;
-          bool closed;
-          Mutex mutex;
-          lang::Thread* thread;
-          util::Random rand;
-
-      public:
-
-          MyStoppableThread() {
-              this->started = false;
-              this->closed = false;
-              this->thread = NULL;
-          }
-
-          virtual ~MyStoppableThread(){ close(); }
-
-          virtual void start(){
-              synchronized( &mutex ) {
-
-                  if( closed || started ) {
-                      return;
-                  }
-
-                  started = true;
-
-                  // Don't create the thread unless we need to.
-                  if( thread == NULL ) {
-                      thread = new lang::Thread( this );
-                      thread->start();
-                  }
-
-                  mutex.notifyAll();
-              }
-          }
-
-          virtual void stop() {
-              synchronized( &mutex ) {
-
-                  if( closed || !started ) {
-                      return;
-                  }
-
-                  // Set the state to stopped.
-                  started = false;
-
-                  // Wakeup the thread so that it can acknowledge the stop request.
-                  mutex.notifyAll();
-
-                  // Wait for the thread to notify us that it has acknowledged
-                  // the stop request.
-                  mutex.wait();
-              }
-          }
-
-          virtual void close() {
-              synchronized( &mutex ) {
-
-                  closed = true;
-                  mutex.notifyAll();
-              }
-
-              if( thread != NULL ) {
-                  thread->join();
-                  delete thread;
-                  thread = NULL;
-              }
-          }
-
-          virtual bool isStarted() const {
-              return started;
-          }
-
-          virtual void run(){
-              try {
-
-                  while( true ) {
-
-                      lang::Thread::sleep( rand.nextInt( 100 ) );
-
-                      synchronized( &mutex ) {
-
-                          // If we're closing down, exit the thread.
-                          if( closed ) {
-                              return;
-                          }
-
-                          // When told to stop, the calling thread will wait for a
-                          // responding notification, indicating that we have acknowledged
-                          // the stop command.
-                          if( !isStarted() ) {
-                              mutex.notifyAll();
-
-                              // Wait for more data or to be woken up.
-                              mutex.wait();
-                          }
-                      }
-                  }
-              } catch(...) {
-                  CPPUNIT_ASSERT( false );
-              }
-          }
-      };
-
-    public:
-
-        virtual ~MutexTest(){}
-        virtual void setUp(){}
-        virtual void tearDown(){}
-
-        void testTimedWait();
-        void testWait();
-        void test();
-        void testNotify();
-        void testNotifyAll();
-        void testRecursiveLock();
-        void testDoubleLock();
-        void testStressMutex();
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_MUTEXTEST_H_*/
diff --git a/src/decaf/src/test/decaf/util/concurrent/ThreadPoolTest.cpp b/src/decaf/src/test/decaf/util/concurrent/ThreadPoolTest.cpp
deleted file mode 100644
index e0ae705..0000000
--- a/src/decaf/src/test/decaf/util/concurrent/ThreadPoolTest.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "ThreadPoolTest.h"
-
-using namespace std;
-using namespace decaf;
-using namespace decaf::lang;
-using namespace decaf::util;
-using namespace decaf::util::concurrent;
-
-///////////////////////////////////////////////////////////////////////////////
-void ThreadPoolTest::test1()
-{
-    CountDownLatch myLatch( 3 );
-    this->latch = &myLatch;
-
-    MyTask task1( 1 );
-    MyTask task2( 2 );
-    MyTask task3( 3 );
-
-    this->complete = 0;
-    this->tasksToComplete = 3;
-
-    ThreadPool* pool = ThreadPool::getInstance();
-
-    pool->queueTask( ThreadPool::Task( &task1, this ) );
-    pool->queueTask( ThreadPool::Task( &task2, this ) );
-    pool->queueTask( ThreadPool::Task( &task3, this ) );
-
-    // Wait for them to finish, if we can't do this in 30 seconds then
-    // there's probably something really wrong.
-    myLatch.await( 30000 );
-
-    CPPUNIT_ASSERT( this->complete == this->tasksToComplete );
-
-    CPPUNIT_ASSERT( task1.value == 101 );
-    CPPUNIT_ASSERT( task2.value == 102 );
-    CPPUNIT_ASSERT( task3.value == 103 );
-
-    CPPUNIT_ASSERT( pool->getPoolSize() > 0 );
-    CPPUNIT_ASSERT( pool->getBacklog() == 0 );
-
-    CPPUNIT_ASSERT( pool->getMaxThreads() == ThreadPool::DEFAULT_MAX_POOL_SIZE );
-    CPPUNIT_ASSERT( pool->getBlockSize() == ThreadPool::DEFAULT_MAX_BLOCK_SIZE );
-
-    pool->setMaxThreads(50);
-    pool->setBlockSize(50);
-
-    CPPUNIT_ASSERT( pool->getMaxThreads() == 50 );
-    CPPUNIT_ASSERT( pool->getBlockSize() == 50 );
-
-    // Give it a little time to create all those threads.
-    for( int i = 0; i < 1000; ++i ) {
-        if( pool->getFreeThreadCount() == pool->getPoolSize() ) {
-            break;
-        }
-
-        Thread::sleep( 100 );
-    }
-
-    CPPUNIT_ASSERT( pool->getFreeThreadCount() == pool->getPoolSize() );
-    CPPUNIT_ASSERT( this->caughtEx == false );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-void ThreadPoolTest::test2() {
-
-    try
-    {
-        ThreadPool pool;
-        Mutex myMutex;
-
-        CPPUNIT_ASSERT( pool.getMaxThreads() == ThreadPool::DEFAULT_MAX_POOL_SIZE );
-        CPPUNIT_ASSERT( pool.getBlockSize() == ThreadPool::DEFAULT_MAX_BLOCK_SIZE );
-        pool.setMaxThreads(3);
-        pool.setBlockSize(1);
-        CPPUNIT_ASSERT( pool.getMaxThreads() == 3 );
-        CPPUNIT_ASSERT( pool.getBlockSize() == 1 );
-        CPPUNIT_ASSERT( pool.getPoolSize() == 0 );
-        pool.reserve( 4 );
-        CPPUNIT_ASSERT( pool.getPoolSize() == 3 );
-        CPPUNIT_ASSERT( pool.getFreeThreadCount() == 3 );
-
-        CountDownLatch startedLatch1(3);  // First three should go right away
-        CountDownLatch startedLatch2(1);  // The fourth one goes after others finish
-        CountDownLatch doneLatch(4);      // All should be done when we are at the end.
-
-        this->latch = &doneLatch;
-
-        MyWaitingTask task1( &myMutex, &startedLatch1 );
-        MyWaitingTask task2( &myMutex, &startedLatch1 );
-        MyWaitingTask task3( &myMutex, &startedLatch1 );
-        MyWaitingTask task4( &myMutex, &startedLatch2 );
-
-        this->complete = 0;
-        this->tasksToComplete = 4;
-
-        pool.queueTask( ThreadPool::Task( &task1, this ) );
-        pool.queueTask( ThreadPool::Task( &task2, this ) );
-        pool.queueTask( ThreadPool::Task( &task3, this ) );
-        pool.queueTask( ThreadPool::Task( &task4, this ) );
-
-        // Wait 30 seconds, then we let it fail because something is
-        // probably very wrong.
-        startedLatch1.await( 30000 );
-
-        CPPUNIT_ASSERT( pool.getFreeThreadCount() == 0 );
-        CPPUNIT_ASSERT( pool.getBacklog() == 1 );
-
-        // Wake up the tasks.
-        synchronized(&myMutex) {
-            myMutex.notifyAll();
-        }
-
-        // Wait 30 seconds, then we let it fail because something is
-        // probably very wrong.
-        startedLatch2.await( 30000 );
-
-        // Wake up the last task.
-        synchronized(&myMutex) {
-            myMutex.notifyAll();
-        }
-
-        // Wait for them to finish, if it takes longer than 30 seconds
-        // something is not right.
-        doneLatch.await( 30000 );
-
-        CPPUNIT_ASSERT( this->complete == this->tasksToComplete );
-        CPPUNIT_ASSERT( this->caughtEx == false );
-    }
-    catch( lang::Exception& ex ) {
-        ex.setMark( __FILE__, __LINE__ );
-    }
-}
diff --git a/src/decaf/src/test/decaf/util/concurrent/ThreadPoolTest.h b/src/decaf/src/test/decaf/util/concurrent/ThreadPoolTest.h
deleted file mode 100644
index 298eaba..0000000
--- a/src/decaf/src/test/decaf/util/concurrent/ThreadPoolTest.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef _DECAF_UTIL_CONCURRENT_THREADPOOLTEST_H_
-#define _DECAF_UTIL_CONCURRENT_THREADPOOLTEST_H_
-
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-
-#include <decaf/util/concurrent/CountDownLatch.h>
-#include <decaf/util/concurrent/Concurrent.h>
-#include <decaf/lang/Thread.h>
-#include <decaf/util/concurrent/ThreadPool.h>
-#include <decaf/util/concurrent/TaskListener.h>
-#include <decaf/util/concurrent/Mutex.h>
-#include <decaf/util/Config.h>
-
-namespace decaf{
-namespace util{
-namespace concurrent{
-
-    class ThreadPoolTest :
-        public CppUnit::TestFixture,
-        public TaskListener
-    {
-        CPPUNIT_TEST_SUITE( ThreadPoolTest );
-        CPPUNIT_TEST( test1 );
-        CPPUNIT_TEST( test2 );
-        CPPUNIT_TEST_SUITE_END();
-
-        int tasksToComplete;
-        int complete;
-        Mutex mutex;
-        bool caughtEx;
-        CountDownLatch* latch;
-
-    public:
-
-        ThreadPoolTest() {
-            complete = 0;
-            tasksToComplete = 0;
-            caughtEx = false;
-            latch = NULL;
-        }
-
-        virtual ~ThreadPoolTest() {}
-
-        virtual void onTaskComplete( lang::Runnable* task DECAF_UNUSED)
-        {
-            try{
-
-                complete++;
-
-                if( latch != NULL ) {
-                    latch->countDown();
-                }
-            }catch( lang::Exception& ex ){
-                ex.setMark( __FILE__, __LINE__ );
-            }
-        }
-
-        virtual void onTaskException(
-            lang::Runnable* task DECAF_UNUSED,
-            lang::Exception& ex DECAF_UNUSED) {
-            caughtEx = true;
-        }
-
-    public:
-
-        class MyTask : public lang::Runnable
-        {
-        public:
-
-            int value;
-
-            MyTask( int x ) {
-                value = x;
-            }
-
-            virtual ~MyTask() {};
-
-            virtual void run(void) {
-                value += 100;
-            }
-        };
-
-        class MyWaitingTask : public lang::Runnable
-        {
-        public:
-
-            Mutex* mutex;
-            CountDownLatch* startedLatch;
-
-            MyWaitingTask( Mutex* mutex, CountDownLatch* startedLatch ) {
-                this->mutex = mutex;
-                this->startedLatch = startedLatch;
-            }
-
-            virtual ~MyWaitingTask() {};
-
-            virtual void run(void) {
-                try
-                {
-                    synchronized(mutex) {
-                        startedLatch->countDown();
-                        mutex->wait();
-                    }
-                }
-                catch( lang::Exception& ex ) {
-                    ex.setMark( __FILE__, __LINE__ );
-                }
-            }
-        };
-
-    public:
-
-        virtual void test1();
-        virtual void test2();
-
-    };
-
-}}}
-
-#endif /*_DECAF_UTIL_CONCURRENT_THREADPOOLTEST_H_*/
diff --git a/src/decaf/src/test/main.cpp b/src/decaf/src/test/main.cpp
deleted file mode 100644
index d2ac513..0000000
--- a/src/decaf/src/test/main.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <cppunit/extensions/TestFactoryRegistry.h>
-#include <cppunit/ui/text/TestRunner.h>
-#include <cppunit/BriefTestProgressListener.h>
-#include <cppunit/TestResult.h>
-#include <decaf/util/Config.h>
-
-int main( int argc DECAF_UNUSED, char **argv DECAF_UNUSED )
-{
-    CppUnit::TextUi::TestRunner runner;
-    CppUnit::TestFactoryRegistry &registry = CppUnit::TestFactoryRegistry::getRegistry();
-    runner.addTest( registry.makeTest() );
-
-    // Shows a message as each test starts
-    CppUnit::BriefTestProgressListener listener;
-    runner.eventManager().addListener( &listener );
-
-    bool wasSuccessful = runner.run( "", false );
-    return !wasSuccessful;
-}
diff --git a/src/decaf/src/test/testRegistry.cpp b/src/decaf/src/test/testRegistry.cpp
deleted file mode 100644
index 216d185..0000000
--- a/src/decaf/src/test/testRegistry.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-// All CPP Unit tests are registered in here so we can disable them and
-// enable them easily in one place.
-
-//#include <decaf/io/BufferedInputStreamTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::BufferedInputStreamTest );
-//#include <decaf/io/BufferedOutputStreamTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::BufferedOutputStreamTest );
-//#include <decaf/io/ByteArrayInputStreamTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::ByteArrayInputStreamTest );
-//#include <decaf/io/ByteArrayOutputStreamTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::ByteArrayOutputStreamTest );
-//#include <decaf/io/DataInputStreamTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::DataInputStreamTest );
-//#include <decaf/io/DataOutputStreamTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::io::DataOutputStreamTest );
-
-//#include <decaf/lang/MathTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::MathTest );
-//#include <decaf/lang/ByteTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::ByteTest );
-//#include <decaf/lang/CharacterTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::CharacterTest );
-//#include <decaf/lang/BooleanTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::BooleanTest );
-//#include <decaf/lang/ShortTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::ShortTest );
-//#include <decaf/lang/IntegerTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::IntegerTest );
-//#include <decaf/lang/LongTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::LongTest );
-//#include <decaf/lang/FloatTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::FloatTest );
-//#include <decaf/lang/DoubleTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::DoubleTest );
-//#include <decaf/lang/ExceptionTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::ExceptionTest );
-//#include <decaf/lang/ThreadTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::ThreadTest );
-//#include <decaf/lang/SystemTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::lang::SystemTest );
-//
-//#include <decaf/net/SocketFactoryTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketFactoryTest );
-//#include <decaf/net/SocketTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::SocketTest );
-#include <decaf/net/URITest.h>
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::URITest );
-#include <decaf/net/URISyntaxExceptionTest.h>
-CPPUNIT_TEST_SUITE_REGISTRATION( decaf::net::URISyntaxExceptionTest );
-//
-//#include <decaf/util/concurrent/CountDownLatchTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::concurrent::CountDownLatchTest );
-//#include <decaf/util/concurrent/MutexTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::concurrent::MutexTest );
-//#include <decaf/util/concurrent/ThreadPoolTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::concurrent::ThreadPoolTest );
-//
-//#include <decaf/util/DateTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::DateTest );
-//#include <decaf/util/UUIDTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::UUIDTest );
-//#include <decaf/util/MapTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::MapTest );
-//#include <decaf/util/QueueTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::QueueTest );
-//#include <decaf/util/RandomTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::RandomTest );
-//#include <decaf/util/SetTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::SetTest );
-//#include <decaf/util/StringTokenizerTest.h>
-//CPPUNIT_TEST_SUITE_REGISTRATION( decaf::util::StringTokenizerTest );
diff --git a/src/decaf/vs2005-build/vs2005-decaf-example.vcproj b/src/decaf/vs2005-build/vs2005-decaf-example.vcproj
deleted file mode 100644
index 3215efd..0000000
--- a/src/decaf/vs2005-build/vs2005-decaf-example.vcproj
+++ /dev/null
@@ -1,379 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="vs2005-decaf-example"
-	ProjectGUID="{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}"
-	RootNamespace="vs2005decafexample"
-	Keyword="Win32Proj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-				DisableSpecificWarnings="4290, 4101"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunitd.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="2"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="2"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunit.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="ReleaseDLL|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;DECAF_DLL"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="2"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunit.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="DebugDLL|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;DECAF_DLL"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-				DisableSpecificWarnings="4290, 4101"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunitd.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="2"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<File
-			RelativePath="..\src\examples\main.cpp"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/src/decaf/vs2005-build/vs2005-decaf-unittests.vcproj b/src/decaf/vs2005-build/vs2005-decaf-unittests.vcproj
deleted file mode 100644
index ebd02ee..0000000
--- a/src/decaf/vs2005-build/vs2005-decaf-unittests.vcproj
+++ /dev/null
@@ -1,535 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="vs2005-decaf-unittests"
-	ProjectGUID="{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}"
-	RootNamespace="vs2005decafunittests"
-	Keyword="Win32Proj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-				DisableSpecificWarnings="4290, 4101"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunitd.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="2"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="2"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunit.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="ReleaseDLL|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;DECAF_DLL"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="2"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunit.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="1"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				OptimizeReferences="2"
-				EnableCOMDATFolding="2"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="DebugDLL|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="1"
-			CharacterSet="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\src\test;..\src\main;&quot;C:\Program Files\CPPUnit\include&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;C:\Apps\cppunit-1.11.6\include&quot;;&quot;E:\dev\cppunit-1.11.6\include&quot;"
-				PreprocessorDefinitions="WIN32;WIN32_LEAN_AND_MEAN;_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;DECAF_DLL"
-				MinimalRebuild="true"
-				BasicRuntimeChecks="3"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="4"
-				DisableSpecificWarnings="4290, 4101"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib cppunitd.lib"
-				OutputFile="$(OutDir)\$(ProjectName).exe"
-				LinkIncremental="2"
-				AdditionalLibraryDirectories="&quot;C:\Program Files\CPPUnit\lib&quot;;&quot;C:\Apps\cppunit-1.11.6\lib&quot;;&quot;E:\dev\cppunit-1.11.6\lib&quot;;&quot;C:\Program Files\Microsoft Platform SDK\Lib&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Lib&quot;"
-				ManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).intermediate.manifest"
-				GenerateDebugInformation="true"
-				SubSystem="1"
-				TargetMachine="1"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-				OutputManifestFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest"
-				ManifestResourceFile="$(IntDir)\$(ProjectName)\$(TargetFileName).embed.manifest.res"
-				DependencyInformationFile="$(IntDir)\$(ProjectName)\mt.dep"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="decaf"
-			>
-			<Filter
-				Name="io"
-				>
-				<File
-					RelativePath="..\src\test\decaf\io\BufferedInputStreamTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\BufferedInputStreamTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\BufferedOutputStreamTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\BufferedOutputStreamTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\ByteArrayInputStreamTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\ByteArrayInputStreamTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\ByteArrayOutputStreamTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\ByteArrayOutputStreamTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\DataInputStreamTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\DataInputStreamTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\DataOutputStreamTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\io\DataOutputStreamTest.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="lang"
-				>
-				<File
-					RelativePath="..\src\test\decaf\lang\BooleanTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\BooleanTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\IntegerTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\IntegerTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\LongTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\LongTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\ThreadTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\lang\ThreadTest.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="util"
-				>
-				<File
-					RelativePath="..\src\test\decaf\util\DateTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\DateTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\Endian.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\Endian.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\GuidTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\GuidTest.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\StringTokenizerTest.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\test\decaf\util\StringTokenizerTest.h"
-					>
-				</File>
-				<Filter
-					Name="concurrent"
-					>
-					<File
-						RelativePath="..\src\test\decaf\util\concurrent\CountDownLatchTest.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\test\decaf\util\concurrent\CountDownLatchTest.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\test\decaf\util\concurrent\MutexTest.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\test\decaf\util\concurrent\MutexTest.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\test\decaf\util\concurrent\ThreadPoolTest.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\test\decaf\util\concurrent\ThreadPoolTest.h"
-						>
-					</File>
-				</Filter>
-			</Filter>
-		</Filter>
-		<File
-			RelativePath="..\src\test\main.cpp"
-			>
-		</File>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
diff --git a/src/decaf/vs2005-build/vs2005-decaf.sln b/src/decaf/vs2005-build/vs2005-decaf.sln
deleted file mode 100644
index e76b9f6..0000000
--- a/src/decaf/vs2005-build/vs2005-decaf.sln
+++ /dev/null
@@ -1,51 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 9.00
-# Visual C++ Express 2005
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vs2005-decaf", "vs2005-decaf.vcproj", "{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vs2005-decaf-unittests", "vs2005-decaf-unittests.vcproj", "{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}"
-	ProjectSection(ProjectDependencies) = postProject
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399} = {D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}
-	EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vs2005-decaf-example", "vs2005-decaf-example.vcproj", "{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}"
-	ProjectSection(ProjectDependencies) = postProject
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399} = {D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}
-	EndProjectSection
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|Win32 = Debug|Win32
-		DebugDLL|Win32 = DebugDLL|Win32
-		Release|Win32 = Release|Win32
-		ReleaseDLL|Win32 = ReleaseDLL|Win32
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.Debug|Win32.ActiveCfg = Debug|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.Debug|Win32.Build.0 = Debug|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.DebugDLL|Win32.Build.0 = DebugDLL|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.Release|Win32.ActiveCfg = Release|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.Release|Win32.Build.0 = Release|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32
-		{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.Debug|Win32.ActiveCfg = Debug|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.Debug|Win32.Build.0 = Debug|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.DebugDLL|Win32.Build.0 = DebugDLL|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.Release|Win32.ActiveCfg = Release|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.Release|Win32.Build.0 = Release|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32
-		{71582D83-8CC9-4C85-83BF-2E272B6DAE8A}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.Debug|Win32.ActiveCfg = Debug|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.Debug|Win32.Build.0 = Debug|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.DebugDLL|Win32.Build.0 = DebugDLL|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.Release|Win32.ActiveCfg = Release|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.Release|Win32.Build.0 = Release|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32
-		{3F0BD46A-0AD3-4FAE-9962-F3A252E53498}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/src/decaf/vs2005-build/vs2005-decaf.vcproj b/src/decaf/vs2005-build/vs2005-decaf.vcproj
deleted file mode 100644
index c5653a6..0000000
--- a/src/decaf/vs2005-build/vs2005-decaf.vcproj
+++ /dev/null
@@ -1,794 +0,0 @@
-<?xml version="1.0" encoding="Windows-1252"?>
-<VisualStudioProject
-	ProjectType="Visual C++"
-	Version="8.00"
-	Name="vs2005-decaf"
-	ProjectGUID="{D85BD1AB-82E9-4012-BEBE-67AD5CE2E399}"
-	RootNamespace="vs2005decaf"
-	Keyword="Win32Proj"
-	>
-	<Platforms>
-		<Platform
-			Name="Win32"
-		/>
-	</Platforms>
-	<ToolFiles>
-	</ToolFiles>
-	<Configurations>
-		<Configuration
-			Name="Debug|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)\$(ProjectName)"
-			ConfigurationType="4"
-			CharacterSet="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				UseUnicodeResponseFiles="false"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\src\main;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;$(NOINHERIT)"
-				KeepComments="false"
-				MinimalRebuild="false"
-				ExceptionHandling="1"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-				DisableSpecificWarnings="4290;4101"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-				OutputFile="$(OutDir)\libdecafd.lib"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="Release|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)\$(ProjectName)"
-			ConfigurationType="4"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				UseUnicodeResponseFiles="false"
-				AdditionalIncludeDirectories="..\src\main;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;$(NOINHERIT)"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="2"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLibrarianTool"
-				OutputFile="$(OutDir)\libdecaf.lib"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="ReleaseDLL|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="1"
-			WholeProgramOptimization="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				UseUnicodeResponseFiles="false"
-				AdditionalIncludeDirectories="..\src\main;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;_WINDOWS;_USRDLL;DECAF_DLL;DECAF_EXPORTS;$(NOINHERIT)"
-				RuntimeLibrary="2"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="2"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-				DisableSpecificWarnings="4251"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib"
-				OutputFile="$(OutDir)\decaf.dll"
-				GenerateDebugInformation="true"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-		<Configuration
-			Name="DebugDLL|Win32"
-			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
-			IntermediateDirectory="$(ConfigurationName)"
-			ConfigurationType="2"
-			CharacterSet="1"
-			BuildLogFile="$(IntDir)\$(ProjectName)\BuildLog.htm"
-			>
-			<Tool
-				Name="VCPreBuildEventTool"
-			/>
-			<Tool
-				Name="VCCustomBuildTool"
-			/>
-			<Tool
-				Name="VCXMLDataGeneratorTool"
-			/>
-			<Tool
-				Name="VCWebServiceProxyGeneratorTool"
-			/>
-			<Tool
-				Name="VCMIDLTool"
-			/>
-			<Tool
-				Name="VCCLCompilerTool"
-				UseUnicodeResponseFiles="false"
-				Optimization="0"
-				AdditionalIncludeDirectories="..\src\main;&quot;C:\Program Files\Microsoft Platform SDK\Include&quot;;&quot;D:\Program Files\Microsoft Platform SDK\Include&quot;"
-				PreprocessorDefinitions="WIN32;NDEBUG;_LIB;WIN32_LEAN_AND_MEAN;_CRT_SECURE_NO_DEPRECATE;NOMINMAX;_WINDOWS;_USRDLL;DECAF_DLL;DECAF_EXPORTS;$(NOINHERIT)"
-				KeepComments="false"
-				MinimalRebuild="false"
-				ExceptionHandling="1"
-				BasicRuntimeChecks="0"
-				RuntimeLibrary="3"
-				UsePrecompiledHeader="0"
-				ObjectFile="$(IntDir)\$(ProjectName)\"
-				ProgramDataBaseFileName="$(IntDir)\$(ProjectName)\vc80.pdb"
-				XMLDocumentationFileName="$(IntDir)\$(ProjectName)\"
-				WarningLevel="3"
-				Detect64BitPortabilityProblems="true"
-				DebugInformationFormat="3"
-				DisableSpecificWarnings="4290;4101;4251"
-			/>
-			<Tool
-				Name="VCManagedResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCResourceCompilerTool"
-			/>
-			<Tool
-				Name="VCPreLinkEventTool"
-			/>
-			<Tool
-				Name="VCLinkerTool"
-				AdditionalDependencies="ws2_32.lib rpcrt4.lib"
-				OutputFile="$(OutDir)\decafd.dll"
-				GenerateDebugInformation="true"
-			/>
-			<Tool
-				Name="VCALinkTool"
-			/>
-			<Tool
-				Name="VCManifestTool"
-			/>
-			<Tool
-				Name="VCXDCMakeTool"
-			/>
-			<Tool
-				Name="VCBscMakeTool"
-			/>
-			<Tool
-				Name="VCFxCopTool"
-			/>
-			<Tool
-				Name="VCAppVerifierTool"
-			/>
-			<Tool
-				Name="VCWebDeploymentTool"
-			/>
-			<Tool
-				Name="VCPostBuildEventTool"
-			/>
-		</Configuration>
-	</Configurations>
-	<References>
-	</References>
-	<Files>
-		<Filter
-			Name="decaf"
-			>
-			<Filter
-				Name="io"
-				>
-				<File
-					RelativePath="..\src\main\decaf\io\BlockingByteArrayInputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\BlockingByteArrayInputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\BufferedInputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\BufferedInputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\BufferedOutputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\BufferedOutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\ByteArrayInputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\ByteArrayInputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\ByteArrayOutputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\ByteArrayOutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\Closeable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\DataInputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\DataInputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\DataOutputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\DataOutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\EOFException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\FilterInputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\FilterOutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\InputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\IOException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\OutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\Reader.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\StandardErrorOutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\io\Writer.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="lang"
-				>
-				<File
-					RelativePath="..\src\main\decaf\lang\Boolean.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Boolean.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Character.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Exception.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Exception.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Integer.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Integer.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Long.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Long.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Math.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Number.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Runnable.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Thread.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Thread.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\lang\Throwable.h"
-					>
-				</File>
-				<Filter
-					Name="exceptions"
-					>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\ExceptionDefines.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\IllegalArgumentException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\IllegalMonitorStateException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\IllegalStateException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\IndexOutOfBoundsException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\InterruptedException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\InvalidStateException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\NoSuchElementException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\NullPointerException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\RuntimeException.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\lang\exceptions\UnsupportedOperationException.h"
-						>
-					</File>
-				</Filter>
-			</Filter>
-			<Filter
-				Name="net"
-				>
-				<File
-					RelativePath="..\src\main\decaf\net\BufferedSocket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\BufferedSocket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\ServerSocket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\ServerSocket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\Socket.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketError.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketError.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketException.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketInputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketInputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketOutputStream.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\SocketOutputStream.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\TcpSocket.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\net\TcpSocket.h"
-					>
-				</File>
-			</Filter>
-			<Filter
-				Name="util"
-				>
-				<File
-					RelativePath="..\src\main\decaf\util\Config.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Date.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Date.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Guid.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Guid.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Map.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Properties.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Queue.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\Set.h"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\StringTokenizer.cpp"
-					>
-				</File>
-				<File
-					RelativePath="..\src\main\decaf\util\StringTokenizer.h"
-					>
-				</File>
-				<Filter
-					Name="logging"
-					>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\ConsoleHandler.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\Filter.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\Formatter.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\Handler.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\Logger.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\Logger.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LoggerCommon.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LoggerDefines.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LoggerHierarchy.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LoggerHierarchy.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LogManager.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LogManager.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LogRecord.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LogWriter.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\LogWriter.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\MarkBlockLogger.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\PropertiesChangeListener.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\SimpleFormatter.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\SimpleLogger.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\SimpleLogger.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\logging\StreamHandler.h"
-						>
-					</File>
-				</Filter>
-				<Filter
-					Name="concurrent"
-					>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\Concurrent.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\CountDownLatch.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\CountDownLatch.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\Lock.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\Mutex.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\Mutex.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\PooledThread.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\PooledThread.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\PooledThreadListener.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\Synchronizable.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\TaskListener.h"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\ThreadPool.cpp"
-						>
-					</File>
-					<File
-						RelativePath="..\src\main\decaf\util\concurrent\ThreadPool.h"
-						>
-					</File>
-				</Filter>
-			</Filter>
-		</Filter>
-	</Files>
-	<Globals>
-	</Globals>
-</VisualStudioProject>
