diff --git a/KEYS b/KEYS
new file mode 100644
index 0000000..8369607
--- /dev/null
+++ b/KEYS
@@ -0,0 +1,102 @@
+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/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000..6b0b127
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,203 @@
+
+                                 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/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..675e7de
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,33 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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
+
+#Distribute these directories:
+DIST_SUBDIRS = src/main 
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = cms.pc
+
+ACLOCAL_AMFLAGS = -I m4
+
+include doxygen-include.am
+
+EXTRA_DIST=autogen.sh $(DX_CONFIG) doc/html
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..5690868
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,67 @@
+--------------------------------------------------------------------------
+C++ Messaging Service (CMS) API
+--------------------------------------------------------------------------
+
+CMS is a JMS-like messaging API for C++ applications.  This API is
+vendor-independent to encourage the adoption of a standard API
+for messaging in C++ applications.
+
+
+1 Dependencies
+--------------------------------------------------------------------------
+
+
+1.1 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
+
+This should be run the first time and anytime you change configure.ac or 
+any of the Makefile.am files.
+    
+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 can build and 
+install the code into the system directories with the command:
+
+  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
+
+
diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt
new file mode 100644
index 0000000..0f56917
--- /dev/null
+++ b/RELEASE_NOTES.txt
@@ -0,0 +1,13 @@
+=========================================================================
+==  Release Notes for CMS 1.0                                          ==
+=========================================================================
+
+== Overview ==
+
+This is the first official release of the C++ Messaging Service (CMS)
+API.  It is designed to closely mirror the JMS API.  CMS has evolved 
+under the activemq-cpp project and is now being extracted as it's own 
+tag and source bundle so that it may be used independently of 
+activemq-cpp.  The hope is that this will encourage more C++ 
+implementations and eventually the adoption of a standard API for 
+messaging from C++ applications.
\ No newline at end of file
diff --git a/autogen.sh b/autogen.sh
new file mode 100644
index 0000000..57ea46d
--- /dev/null
+++ b/autogen.sh
@@ -0,0 +1,19 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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/cms.pc.in b/cms.pc.in
new file mode 100644
index 0000000..3ba2aed
--- /dev/null
+++ b/cms.pc.in
@@ -0,0 +1,10 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@
+
+Name: CMS API
+Description: Messaging API for C++.
+Version: @VERSION@
+Libs: -L${libdir} -l@CMS_LIBRARY_NAME@-@CMS_API_VERSION@ -ldl
+Cflags: -I${includedir}/@CMS_LIBRARY_NAME@-@CMSAPI_VERSION@ -I${libdir}/@CMS_LIBRARY_NAME@-@CMS_API_VERSION@/include
diff --git a/configure.ac b/configure.ac
new file mode 100644
index 0000000..943dd68
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,96 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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(cms, 1, dev@activemq.apache.org)
+AC_CONFIG_AUX_DIR(config)
+AC_CONFIG_SRCDIR(src/main/cms/BytesMessage.h)
+
+## -----------------------------------------------
+## Define the Version variables
+## -----------------------------------------------
+CMS_LIBRARY_NAME=cms
+CMS_VERSION=1.0
+CMS_LIBRARY_VERSION=0:0:0
+CMS_RELEASE=0.0
+CMS_API_VERSION=${CMS_VERSION}
+
+AC_SUBST(CMS_LIBRARY_NAME)
+AC_SUBST(CMS_VERSION)
+AC_SUBST(CMS_LIBRARY_VERSION)
+AC_SUBST(CMS_RELEASE)
+AC_SUBST(CMS_API_VERSION)
+
+PACKAGE=$CMS_LIBRARY_NAME
+VERSION=$CMS_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
+## Uncomment to use libtool for shared libs
+## AM_PROG_LIBTOOL
+AC_PROG_RANLIB
+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)
+
+CXXFLAGS="$CXXFLAGS -ansi -pedantic -W -Wall"
+LIBS="$LIBS"
+
+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(cms, doxygen.cfg, doc)
+
+
+## -----------------------------------------------------
+## configuration
+## Generates Makefile's, configuration files and scripts
+## -----------------------------------------------------
+
+AC_CONFIG_FILES(Makefile)
+AC_CONFIG_FILES(cms.pc)
+AC_CONFIG_FILES(src/main/Makefile)
+
+AC_OUTPUT
diff --git a/doxygen-include.am b/doxygen-include.am
new file mode 100644
index 0000000..ab87a45
--- /dev/null
+++ b/doxygen-include.am
@@ -0,0 +1,203 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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/doxygen.cfg b/doxygen.cfg
new file mode 100644
index 0000000..eba1104
--- /dev/null
+++ b/doxygen.cfg
@@ -0,0 +1,212 @@
+# Doxyfile 1.3.7
+
+#---------------------------------------------------------------------------
+# 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/m4/ac_doxygen.m4 b/m4/ac_doxygen.m4
new file mode 100644
index 0000000..5248d71
--- /dev/null
+++ b/m4/ac_doxygen.m4
@@ -0,0 +1,324 @@
+#
+# 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/main/Makefile.am b/src/main/Makefile.am
new file mode 100644
index 0000000..608f300
--- /dev/null
+++ b/src/main/Makefile.am
@@ -0,0 +1,63 @@
+# ---------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+# http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT 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 = 
+
+h_sources = cms/DeliveryMode.h \
+    cms/TemporaryQueue.h \
+    cms/MapMessage.h \
+    cms/Destination.h \
+    cms/Connection.h \
+    cms/TemporaryTopic.h \
+    cms/Stoppable.h \
+    cms/Topic.h \
+    cms/BytesMessage.h \
+    cms/CMSException.h \
+    cms/Session.h \
+    cms/Startable.h \
+    cms/Closeable.h \
+    cms/MessageListener.h \
+    cms/ObjectMessage.h \
+    cms/TextMessage.h \
+    cms/ExceptionListener.h \
+    cms/Queue.h \
+    cms/ConnectionFactory.h \
+    cms/MessageProducer.h \
+    cms/Message.h \
+    cms/MessageConsumer.h
+
+##
+## Compiler / Linker Info
+##
+
+lib_LIBRARIES=libcms.a
+libcms_a_SOURCES= $(h_sources) $(cc_sources)
+
+##
+## Uncomment to build a shared lib
+##
+##lib_LTLIBRARIES= libactivemq-cpp.la
+##libcms_la_SOURCES= $(h_sources) $(cc_sources)
+##libcms_la_LDFLAGS= -version-info $(CMS_LIBRARY_VERSION) -release $(CMS_VERSION)
+##libcms_la_LIBADD=-ldl
+
+
+##
+## Packaging Info
+##
+library_includedir=$(includedir)/$(CMS_LIBRARY_NAME)-$(CMS_VERSION)
+nobase_library_include_HEADERS = $(h_sources)
diff --git a/src/main/cms/BytesMessage.h b/src/main/cms/BytesMessage.h
new file mode 100644
index 0000000..2da93a3
--- /dev/null
+++ b/src/main/cms/BytesMessage.h
@@ -0,0 +1,294 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_BYTESMESSAGE_H_
+#define _CMS_BYTESMESSAGE_H_
+ 
+#include <cms/Message.h>
+
+namespace cms{
+   
+    class BytesMessage : public Message{
+      
+    public:
+   
+        virtual ~BytesMessage(){}
+
+        /**
+         * sets the bytes given to the message body.  
+         * @param Byte Buffer to copy
+         * @param Number of bytes in Buffer to copy
+         * @throws CMSException
+         */
+        virtual void setBodyBytes( 
+            const unsigned char* buffer, std::size_t numBytes ) 
+                throw( CMSException ) = 0;
+            
+        /**
+         * Gets the bytes that are contained in this message, user should
+         * copy this data into a user allocated buffer.  Call 
+         * <code>getBodyLength</code> to determine the number of bytes
+         * to expect.
+         * @return const pointer to a byte buffer
+         */
+        virtual const unsigned char* getBodyBytes() const = 0;
+      
+        /**
+         * Returns the number of bytes contained in the body of this message.
+         * @return number of bytes.
+         */
+        virtual std::size_t getBodyLength() const = 0;
+        
+        /**
+         * Puts the message body in read-only mode and repositions the stream 
+         * of bytes to the beginning.
+         * @throws CMSException
+         */
+        virtual void reset() throw ( cms::CMSException ) = 0;
+        
+        /**
+         * Reads a Boolean from the Bytes message stream
+         * @returns boolean value from stream
+         * @throws CMSException
+         */
+        virtual bool readBoolean() throw ( cms::CMSException ) = 0;
+        
+        /**
+         * Writes a boolean to the bytes message stream as a 1-byte value. 
+         * The value true is written as the value (byte)1; the value false 
+         * is written as the value (byte)0.
+         * @param value - boolean to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeBoolean( bool value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a Byte from the Bytes message stream
+         * @returns unsigned char value from stream
+         * @throws CMSException
+         */
+        virtual unsigned char readByte() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a byte to the bytes message stream as a 1-byte value
+         * @param value - byte to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeByte( unsigned char value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a byte array from the bytes message stream.
+         *
+         * If the length of vector value is less than the number of bytes
+         * remaining to be read from the stream, the vector should be filled. A 
+         * subsequent call reads the next increment, and so on.
+         *
+         * If the number of bytes remaining in the stream is less than the 
+         * length of vector value, the bytes should be read into the vector. The 
+         * return value of the total number of bytes read will be less than the
+         * length of the vector, indicating that there are no more bytes left to 
+         * be read from the stream. The next read of the stream returns -1.
+         * 
+         * @param value - buffer to place data in
+         * @returns the total number of bytes read into the buffer, or -1 if 
+         *          there is no more data because the end of the stream has 
+         *          been reached
+         * @throws CMSException if an error occurs.
+         */
+        virtual std::size_t readBytes( std::vector<unsigned char>& value ) 
+            throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a byte array to the bytes message stream using the vector
+         * size as the number of bytes to write.
+         * @param value - bytes to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeBytes( const std::vector<unsigned char>& value ) 
+            throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a portion of the bytes message stream.
+         * 
+         * If the length of array value is less than the number of bytes 
+         * remaining to be read from the stream, the array should be filled. A 
+         * subsequent call reads the next increment, and so on.
+         * 
+         * If the number of bytes remaining in the stream is less than the 
+         * length of array value, the bytes should be read into the array. The 
+         * return value of the total number of bytes read will be less than the 
+         * length of the array, indicating that there are no more bytes left to 
+         * be read from the stream. The next read of the stream returns -1.
+         * 
+         * If length is negative, or length is greater than the length of the 
+         * array value, then an IndexOutOfBoundsException is thrown. No bytes 
+         * will be read from the stream for this exception case.
+         * 
+         * @param value - the buffer into which the data is read
+         * @param length - the number of bytes to read; must be less than or 
+         *                 equal to value.length
+         * @returns the total number of bytes read into the buffer, or -1 if 
+         *          there is no more data because the end of the stream has 
+         *          been reached
+         * @throws CMSException
+         */
+        virtual std::size_t readBytes( unsigned char*& buffer, std::size_t length ) 
+            throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a portion of a byte array to the bytes message stream.
+         * size as the number of bytes to write.
+         * @param value - bytes to write to the stream
+         * @param offset - the initial offset within the byte array
+         * @param length - the number of bytes to use
+         * @throws CMSException
+         */
+        virtual void writeBytes( const unsigned char* value,
+                                 std::size_t offset,
+                                 std::size_t length ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a Char from the Bytes message stream
+         * @returns char value from stream
+         * @throws CMSException
+         */
+        virtual char readChar() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a char to the bytes message stream as a 1-byte value
+         * @param value - char to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeChar( char value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a 32 bit float from the Bytes message stream
+         * @returns double value from stream
+         * @throws CMSException
+         */
+        virtual float readFloat() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a float to the bytes message stream as a 4 byte value
+         * @param value - float to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeFloat( float value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a 64 bit double from the Bytes message stream
+         * @returns double value from stream
+         * @throws CMSException
+         */
+        virtual double readDouble() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a double to the bytes message stream as a 8 byte value
+         * @param value - double to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeDouble( double value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a 16 bit signed short from the Bytes message stream
+         * @returns short value from stream
+         * @throws CMSException
+         */
+        virtual short readShort() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a signed short to the bytes message stream as a 2 byte value
+         * @param value - signed short to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeShort( short value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a 16 bit unsigned short from the Bytes message stream
+         * @returns unsigned short value from stream
+         * @throws CMSException
+         */
+        virtual unsigned short readUnsignedShort() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a unsigned short to the bytes message stream as a 2 byte value
+         * @param value - unsigned short to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeUnsignedShort( unsigned short value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a 32 bit signed intger from the Bytes message stream
+         * @returns int value from stream
+         * @throws CMSException
+         */
+        virtual int readInt() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a signed int to the bytes message stream as a 4 byte value
+         * @param value - signed int to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeInt( int value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads a 64 bit long from the Bytes message stream
+         * @returns long long value from stream
+         * @throws CMSException
+         */
+        virtual long long readLong() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes a long long to the bytes message stream as a 8 byte value
+         * @param value - signed long long to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeLong( long long value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads an ASCII String from the Bytes message stream
+         * @returns String from stream
+         * @throws CMSException
+         */
+        virtual std::string readString() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes an ASCII String to the Bytes message stream
+         * @param value - String to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeString( const std::string& value ) throw ( cms::CMSException ) = 0;
+
+        /**
+         * Reads an UTF String from the BytesMessage stream
+         * @returns String from stream
+         * @throws CMSException
+         */
+        virtual std::string readUTF() throw ( cms::CMSException ) = 0;
+
+        /**
+         * Writes an UTF String to the BytesMessage stream
+         * @param value - String to write to the stream
+         * @throws CMSException
+         */
+        virtual void writeUTF( const std::string& value ) throw ( cms::CMSException ) = 0;
+
+        virtual BytesMessage* clone() const = 0;
+   };
+}
+
+#endif /*_CMS_BYTESMESSAGE_H_*/
diff --git a/src/main/cms/CMSException.h b/src/main/cms/CMSException.h
new file mode 100644
index 0000000..7b8067b
--- /dev/null
+++ b/src/main/cms/CMSException.h
@@ -0,0 +1,90 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 CMS_CMSEXCEPTION_H
+#define CMS_CMSEXCEPTION_H
+ 
+// Includes
+#include <string>
+#include <vector>
+#include <iostream>
+#include <exception>
+
+namespace cms{
+    
+    /**
+     * This class represents an error that has occurred in 
+     * cms.
+     */
+    class CMSException : public std::exception {
+        
+    public:
+        
+        CMSException() throw() {}
+        
+        virtual ~CMSException() 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 CMSException* 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 /*CMS_CMSEXCEPTION_H*/
diff --git a/src/main/cms/Closeable.h b/src/main/cms/Closeable.h
new file mode 100644
index 0000000..eb60b07
--- /dev/null
+++ b/src/main/cms/Closeable.h
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 CMS_CLOSEABLE_H
+#define CMS_CLOSEABLE_H
+ 
+#include <cms/CMSException.h>
+
+namespace cms{
+    
+    /**
+     * Interface for a class that implements the close method.
+     */
+    class 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( CMSException ) = 0;
+
+    };
+}
+
+#endif /*CMS_CLOSEABLE_H*/
diff --git a/src/main/cms/Connection.h b/src/main/cms/Connection.h
new file mode 100644
index 0000000..21d48ff
--- /dev/null
+++ b/src/main/cms/Connection.h
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_CONNECTION_H_
+#define _CMS_CONNECTION_H_
+
+#include <cms/Startable.h>
+#include <cms/Stoppable.h>
+#include <cms/Closeable.h>
+#include <cms/Session.h>
+
+namespace cms
+{
+    class ExceptionListener;
+   
+    class Connection :
+        public Startable,
+        public Stoppable,
+        public Closeable
+    {
+    public:
+
+        virtual ~Connection() {}
+
+        /**
+         * Closes this connection as well as any Sessions 
+         * created from it (and those Sessions' consumers and
+         * producers).
+         * @throws CMSException
+         */
+        virtual void close() throw( CMSException ) = 0;
+
+		/**
+         * Creates an AUTO_ACKNOWLEDGE Session.
+         * @throws CMSException
+         */
+        virtual Session* createSession() throw ( CMSException ) = 0;
+				
+        /**
+         * Creates a new Session to work for this Connection using the
+         * specified acknowledgment mode
+         * @param the Acknowledgement Mode to use.
+         * @throws CMSException
+         */
+        virtual Session* createSession( Session::AcknowledgeMode ackMode ) 
+            throw ( CMSException ) = 0;
+
+        /**
+         * Get the Client Id for this session
+         * @return Client Id String
+         */
+        virtual std::string getClientID() const = 0;      
+
+        /**
+         * Gets the registered Exception Listener for this connection
+         * @return pointer to an exception listnener or NULL
+         */
+        virtual ExceptionListener* getExceptionListener() const = 0;
+
+        /**
+         * Sets the registed Exception Listener for this connection
+         * @param pointer to and <code>ExceptionListener</code>
+         */
+        virtual void setExceptionListener( ExceptionListener* listener ) = 0;
+
+    };
+
+}
+
+#endif /*_CMS_CONNECTION_H_*/
diff --git a/src/main/cms/ConnectionFactory.h b/src/main/cms/ConnectionFactory.h
new file mode 100644
index 0000000..f68c0a0
--- /dev/null
+++ b/src/main/cms/ConnectionFactory.h
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_CONNECTIONFACTORY_H_
+#define _CMS_CONNECTIONFACTORY_H_
+
+#include <cms/Connection.h>
+#include <cms/CMSException.h>
+
+#include <string>
+
+namespace cms
+{
+
+    /**
+     * Defines the interface for a factory that creates connection objects
+     */
+    class ConnectionFactory
+    {
+    public:
+
+        virtual ~ConnectionFactory() {}
+
+        /**
+         * Creates a connection with the default user identity. The
+         * connection is created in stopped mode. No messages will be
+         * delivered until the Connection.start method is explicitly
+         * called.
+         * @return Pointer to a connection object, caller owns the pointer
+         * @throws CMSException
+         */
+        virtual Connection* createConnection() throw ( CMSException ) = 0;
+
+        /**
+         * Creates a connection with the default specified identity. The
+         * connection is created in stopped mode. No messages will be
+         * delivered until the Connection.start method is explicitly
+         * called.  The username and password values passed here do not
+         * change the defaults, subsequent calls to the parameterless
+         * createConnection will continue to use the default values that
+         * were set in the Constructor.
+         * @param username to authenticate with
+         * @param password to authenticate with
+         * @returns a Connection Pointer
+         * @throws CMSException
+         */
+        virtual cms::Connection* createConnection( const std::string& username,
+                                                   const std::string& password )
+            throw ( cms::CMSException ) = 0;
+
+        /**
+         * Creates a connection with the specified user identity. The
+         * connection is created in stopped mode. No messages will be
+         * delivered until the Connection.start method is explicitly
+         * called.  The username and password values passed here do not
+         * change the defaults, subsequent calls to the parameterless
+         * createConnection will continue to use the default values that
+         * were set in the Constructor.
+         * @param username to authenticate with
+         * @param password to authenticate with
+         * @param clientId to assign to connection if "" then a random cleint
+         *        Id is created for this connection.
+         * @returns a Connection Pointer
+         * @throws CMSException
+         */
+        virtual cms::Connection* createConnection( const std::string& username,
+                                                   const std::string& password,
+                                                   const std::string& clientId )
+            throw ( cms::CMSException ) = 0;
+
+    };
+
+}
+
+#endif /*_CMS_CONNECTIONFACTORY_H_*/
diff --git a/src/main/cms/DeliveryMode.h b/src/main/cms/DeliveryMode.h
new file mode 100644
index 0000000..01286a6
--- /dev/null
+++ b/src/main/cms/DeliveryMode.h
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_DELIVERYMODE_H_
+#define _CMS_DELIVERYMODE_H_
+
+namespace cms
+{
+
+    /**
+     * This is an Abstract class whose purpose is to provide a container
+     * for the delivery mode enumeration for CMS messages.  
+     */
+    class DeliveryMode
+    {
+    public:
+    
+        virtual ~DeliveryMode() {}
+        
+        /**
+         * Enumeration values for Message Delivery Mode   
+         */
+        static const int PERSISTENT = 0;
+        static const int NON_PERSISTENT = 1;
+
+    };
+
+}
+
+#endif /*DELIVERYMODE_H_*/
diff --git a/src/main/cms/Destination.h b/src/main/cms/Destination.h
new file mode 100644
index 0000000..e8036e4
--- /dev/null
+++ b/src/main/cms/Destination.h
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_DESTINATION_H_
+#define _CMS_DESTINATION_H_
+
+#include <activemq/util/Properties.h>
+
+#include <string>
+
+namespace cms{
+	
+    /**
+     * A Destination object encapsulates a provider-specific address. 
+     */
+    class Destination{
+    public:
+   
+        enum DestinationType
+        {
+            TOPIC,
+            QUEUE,
+            TEMPORARY_TOPIC,
+            TEMPORARY_QUEUE
+        };
+		
+	public:
+
+        /**
+         * Destructor
+         */	
+        virtual ~Destination(){}
+      
+        /**
+         * Retrieve the Destination Type for this Destination
+         * @return The Destination Type
+         */
+        virtual DestinationType getDestinationType() const = 0;
+
+        /**
+         * Converts the Destination to a String value representing the
+         * Provider specific name for this destination.  This name must
+         * uniquely identify a particular destination.  For example, a topic
+         * and a queue both named "FOO" must not have equivalent provider
+         * strings.
+         * @return Provider specific Name
+         */
+        virtual std::string toProviderString() const = 0;
+        
+        /**
+         * Creates a new instance of this destination type that is a
+         * copy of this one, and returns it.
+         * @returns cloned copy of this object
+         */
+        virtual cms::Destination* clone() const = 0;
+      
+        /**
+         * Copies the contents of the given Destinastion object to this one.
+         * @param source The source Destination object.
+         */
+        virtual void copy( const cms::Destination& source ) = 0;
+
+        /**
+         * Retrieve any properties that might be part of the destination
+         * that was specified.  This is a deviation from the JMS spec
+         * but necessary due to C++ restrictions.  
+         * @return const reference to a properties object.
+         */
+        virtual const activemq::util::Properties& getProperties() const = 0;
+        
+    };
+}
+
+#endif /*_CMS_DESTINATION_H_*/
diff --git a/src/main/cms/ExceptionListener.h b/src/main/cms/ExceptionListener.h
new file mode 100644
index 0000000..613ffe3
--- /dev/null
+++ b/src/main/cms/ExceptionListener.h
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_EXCEPTIONLISTENER_H_
+#define _CMS_EXCEPTIONLISTENER_H_
+
+#include <cms/CMSException.h>
+
+namespace cms{
+
+    class ExceptionListener
+    {
+    public:
+   
+        virtual ~ExceptionListener() {}
+   
+        /**
+         * Called when an exception occurs.  Once notified of an exception
+         * the caller should no longer use the resource that generated the
+         * exception.
+         * @param Exception Object that occurred.
+         */
+        virtual void onException( const cms::CMSException& ex ) = 0;
+      
+    };
+
+}
+
+#endif /*_CMS_EXCEPTIONLISTENER_H_*/
diff --git a/src/main/cms/MapMessage.h b/src/main/cms/MapMessage.h
new file mode 100644
index 0000000..e926b89
--- /dev/null
+++ b/src/main/cms/MapMessage.h
@@ -0,0 +1,237 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_MAPMESSAGE_H_
+#define _CMS_MAPMESSAGE_H_
+
+#include <cms/Message.h>
+
+namespace cms
+{
+
+    /**
+     * A MapMessage object is used to send a set of name-value pairs. The 
+     * names are String objects, and the values are primitive data types in 
+     * the Java programming language. The names must have a value that is 
+     * not null, and not an empty string. The entries can be accessed 
+     * sequentially or randomly by name. The order of the entries is 
+     * undefined. MapMessage inherits from the Message interface and adds 
+     * a message body that contains a Map.
+     * 
+     * When a client receives a MapMessage, it is in read-only mode. If a 
+     * client attempts to write to the message at this point, a 
+     * CMSException is thrown.
+     */
+    class MapMessage : public Message
+    {
+    public:
+
+        virtual ~MapMessage() {}
+        
+        /**
+         * Returns an Enumeration of all the names in the MapMessage 
+         * object.
+         * @return STL Vector of String values, each of which is the 
+         *         name of an item in the MapMessage
+         * @throws CMSException
+         */
+        virtual std::vector< std::string > getMapNames() const = 0;
+
+        /**
+         * Indicates whether an item exists in this MapMessage object.
+         * @param name - String name of the Object in question
+         * @return boolean value indicating if the name is in the map
+         */
+        virtual bool itemExists( const std::string& name ) const = 0;
+        
+        /**
+         * Returns the Boolean value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual bool getBoolean( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a boolean value with the specified name into the Map.
+         * @param name - the name of the boolean
+         * @param value - the boolean value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setBoolean( const std::string& name,
+                                 bool value ) throw( CMSException ) = 0;
+
+        /**
+         * Returns the Byte value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual unsigned char getByte( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Byte value with the specified name into the Map.
+         * @param name - the name of the Byte
+         * @param value - the Byte value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setByte( const std::string& name,
+                              unsigned char value ) throw( CMSException ) = 0;
+
+        /**
+         * Returns the Bytes value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual std::vector<unsigned char> getBytes( const std::string& name ) const
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Bytes value with the specified name into the Map.
+         * @param name - the name of the Bytes
+         * @param value - the Bytes value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setBytes( const std::string& name,
+                               const std::vector<unsigned char>& value ) 
+                                    throw( CMSException ) = 0;
+
+        /**
+         * Returns the Char value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual char getChar( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Char value with the specified name into the Map.
+         * @param name - the name of the Char
+         * @param value - the Char value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setChar( const std::string& name, char value ) 
+            throw( CMSException ) = 0;
+
+        /**
+         * Returns the Double value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual double getDouble( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Double value with the specified name into the Map.
+         * @param name - the name of the Double
+         * @param value - the Double value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setDouble( const std::string& name,
+                                double value ) throw( CMSException ) = 0;
+
+        /**
+         * Returns the Float value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual float getFloat( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Float value with the specified name into the Map.
+         * @param name - the name of the Float
+         * @param value - the Float value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setFloat( const std::string& name, float value ) 
+            throw( CMSException ) = 0;
+
+        /**
+         * Returns the Int value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual int getInt( const std::string& name ) const
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Int value with the specified name into the Map.
+         * @param name - the name of the Int
+         * @param value - the Int value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setInt( const std::string& name, int value ) 
+            throw( CMSException ) = 0;
+
+        /**
+         * Returns the Long value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual long long getLong( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Long value with the specified name into the Map.
+         * @param name - the name of the Long
+         * @param value - the Long value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setLong( const std::string& name, long long value ) 
+            throw( CMSException ) = 0;
+
+        /**
+         * Returns the Short value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual short getShort( const std::string& name ) const
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a Short value with the specified name into the Map.
+         * @param name - the name of the Short
+         * @param value - the Short value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setShort( const std::string& name, short value ) 
+            throw( CMSException ) = 0;
+
+        /**
+         * Returns the String value of the Specified name
+         * @param name of the value to fetch from the map
+         * @throws CMSException
+         */
+        virtual std::string getString( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /** 
+         * Sets a String value with the specified name into the Map.
+         * @param name - the name of the String
+         * @param value - the String value to set in the Map
+         * @throws CMSException
+         */
+        virtual void setString( const std::string& name, 
+                                const std::string& value ) 
+                                    throw( CMSException ) = 0;
+
+    };
+
+}
+
+#endif /*_CMS_MAPMESSAGE_H_*/
diff --git a/src/main/cms/Message.h b/src/main/cms/Message.h
new file mode 100644
index 0000000..866889c
--- /dev/null
+++ b/src/main/cms/Message.h
@@ -0,0 +1,571 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_MESSAGE_H_
+#define _CMS_MESSAGE_H_
+
+#include <activemq/util/Properties.h>
+
+#include <cms/Destination.h>
+#include <cms/CMSException.h>
+#include <cms/DeliveryMode.h>
+
+namespace cms{
+   
+    /**
+     * Root of all messages.  As in JMS, a message is comprised of
+     * 3 parts: CMS-specific headers, user-defined properties, and
+     * the body.
+     * 
+     * @see JMS API
+     */
+    class Message
+    {         
+    public:
+   
+        virtual ~Message(){}
+      
+        /**
+         * Clone this message exactly, returns a new instance that the
+         * caller is required to delete.
+         * @return new copy of this message
+         */
+        virtual Message* clone() const = 0;                
+        
+        /**
+         * Acknowledges all consumed messages of the session of this consumed 
+         * message.
+         * 
+         * All consumed CMS messages support the acknowledge method for use 
+         * when a client has specified that its CMS session's consumed messages 
+         * are to be explicitly acknowledged. By invoking acknowledge on a 
+         * consumed message, a client acknowledges all messages consumed by the 
+         * session that the message was delivered to.
+         * 
+         * Calls to acknowledge are ignored for both transacted sessions and 
+         * sessions specified to use implicit acknowledgement modes.
+         * 
+         * A client may individually acknowledge each message as it is consumed, 
+         * or it may choose to acknowledge messages as an application-defined 
+         * group (which is done by calling acknowledge on the last received 
+         * message of the group, thereby acknowledging all messages consumed by 
+         * the session.)
+         * 
+         * Messages that have been received but not acknowledged may be 
+         * redelivered.
+         */
+        virtual void acknowledge() const throw( CMSException ) = 0;
+      
+        /**
+         * Clears out the body of the message.  This does not clear the
+         * headers or properties.
+         */
+        virtual void clearBody() = 0;
+        
+        /**
+         * Clears out the message body. Clearing a message's body does not clear 
+         * its header values or property entries.
+         * 
+         * If this message body was read-only, calling this method leaves the 
+         * message body in the same state as an empty body in a newly created 
+         * message.
+         */
+        virtual void clearProperties() = 0;
+        
+        /**
+         * Retrieves the propery names.
+         * @return The complete set of property names currently in this
+         * message.
+         */
+        virtual std::vector<std::string> getPropertyNames() const = 0;
+        
+        /**
+         * Indicates whether or not a given property exists.
+         * @param name The name of the property to look up.
+         * @return True if the property exists in this message.
+         */
+        virtual bool propertyExists( const std::string& name ) const = 0;
+        
+        /**
+         * Gets a boolean property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual bool getBooleanProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a byte property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual unsigned char getByteProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a double property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual double getDoubleProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a float property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual float getFloatProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a int property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual int getIntProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a long property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual long long getLongProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a short property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual short getShortProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+            
+        /**
+         * Gets a string property.
+         * @param name The name of the property to retrieve.
+         * @return The value for the named property.
+         * @throws CMSException if the property does not exist.
+         */
+        virtual std::string getStringProperty( const std::string& name ) const 
+            throw( CMSException ) = 0;
+        
+        /**
+         * Sets a boolean property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setBooleanProperty( const std::string& name,
+            bool value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a byte property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setByteProperty( const std::string& name,
+            unsigned char value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a double property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setDoubleProperty( const std::string& name,
+            double value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a float property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setFloatProperty( const std::string& name,
+            float value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a int property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setIntProperty( const std::string& name,
+            int value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a long property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setLongProperty( const std::string& name,
+            long long value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a short property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setShortProperty( const std::string& name,
+            short value ) throw( CMSException ) = 0;
+            
+        /**
+         * Sets a string property.
+         * @param name The name of the property to retrieve.
+         * @param value The value for the named property.
+         * @throws CMSException
+         */
+        virtual void setStringProperty( const std::string& name,
+            const std::string& value ) throw( CMSException ) = 0;
+      
+        /**
+         * Gets the correlation ID for the message.
+         * 
+         * This method is used to return correlation ID values that are either 
+         * provider-specific message IDs or application-specific String values.
+         * 
+         * @return string representation of the correlation Id
+         */
+        virtual std::string getCMSCorrelationID() const = 0;
+
+        /**
+         * Sets the correlation ID for the message.
+         * 
+         * A client can use the CMSCorrelationID header field to link one 
+         * message with another. A typical use is to link a response message 
+         * with its request message.
+         * 
+         * CMSCorrelationID can hold one of the following:
+         * 
+         *  - A provider-specific message ID
+         *  - An application-specific String
+         *  - A provider-native byte[] value 
+         * 
+         * Since each message sent by a CMS provider is assigned a message ID 
+         * value, it is convenient to link messages via message ID. All message 
+         * ID values must start with the 'ID:' prefix.
+         * 
+         * In some cases, an application (made up of several clients) needs to 
+         * use an application-specific value for linking messages. For instance, 
+         * an application may use CMSCorrelationID to hold a value referencing 
+         * some external information. Application-specified values must not 
+         * start with the 'ID:' prefix; this is reserved for provider-generated 
+         * message ID values.
+         * 
+         * If a provider supports the native concept of correlation ID, a CMS 
+         * client may need to assign specific CMSCorrelationID values to match 
+         * those expected by clients that do not use the CMS API. A byte[] value 
+         * is used for this purpose. CMS providers without native correlation ID 
+         * values are not required to support byte[] values. The use of a byte[] 
+         * value for CMSCorrelationID is non-portable.
+         * 
+         * @param correlationId - the message ID of a message being referred to.
+         */
+        virtual void setCMSCorrelationID( const std::string& correlationId ) = 0;
+
+        /**
+         * Gets the DeliveryMode for this message
+         * @return DeliveryMode enumerated value.
+         */
+        virtual int getCMSDeliveryMode() const = 0;
+
+        /**
+         * Sets the DeliveryMode for this message
+         * 
+         * CMS providers set this field when a message is sent. This method can 
+         * be used to change the value for a message that has been received.
+         * 
+         * @param mode - DeliveryMode enumerated value.
+         */
+        virtual void setCMSDeliveryMode( int mode ) = 0;
+      
+        /**
+         * Gets the Destination object for this message.
+         * 
+         * The CMSDestination header field contains the destination to which the 
+         * message is being sent.
+         * 
+         * When a message is sent, this field is ignored. After completion of 
+         * the send or publish method, the field holds the destination specified 
+         * by the method.
+         * 
+         * When a message is received, its CMSDestination value must be 
+         * equivalent to the value assigned when it was sent.
+         * 
+         * @return Destination object
+         */
+        virtual const Destination* getCMSDestination() const = 0;
+      
+        /**
+         * Sets the Destination object for this message.
+         * 
+         * CMS providers set this field when a message is sent. This method can 
+         * be used to change the value for a message that has been received.
+         * 
+         * @param destination - Destination Object
+         */
+        virtual void setCMSDestination( const Destination* destination ) = 0;
+      
+        /**
+         * Gets the message's expiration value.
+         * 
+         * When a message is sent, the CMSExpiration header field is left 
+         * unassigned. After completion of the send or publish method, it holds 
+         * the expiration time of the message. This is the sum of the 
+         * time-to-live value specified by the client and the GMT at the time 
+         * of the send or publish.
+         * 
+         * If the time-to-live is specified as zero, CMSExpiration is set to 
+         * zero to indicate that the message does not expire.
+         * 
+         * When a message's expiration time is reached, a provider should 
+         * discard it. The CMS API does not define any form of notification of 
+         * message expiration.
+         * 
+         * Clients should not receive messages that have expired; however, the 
+         * CMS API does not guarantee that this will not happen.
+         * 
+         * @return the time the message expires, which is the sum of the 
+         * time-to-live value specified by the client and the GMT at the time 
+         * of the send
+         */
+        virtual long long getCMSExpiration() const = 0;
+      
+        /**
+         * Sets the message's expiration value.
+         * 
+         * CMS providers set this field when a message is sent. This method can 
+         * be used to change the value for a message that has been received.
+         * 
+         * @param expireTime the message's expiration time
+         */
+        virtual void setCMSExpiration( long long expireTime ) = 0;
+      
+        /**
+         * The CMSMessageID header field contains a value that uniquely 
+         * identifies each message sent by a provider. 
+         * 
+         * When a message is sent, CMSMessageID can be ignored. When the 
+         * send or publish method returns, it contains a provider-assigned 
+         * value.
+         * 
+         * A CMSMessageID is a String value that should function as a unique 
+         * key for identifying messages in a historical repository. The exact 
+         * scope of uniqueness is provider-defined. It should at least cover 
+         * all messages for a specific installation of a provider, where an 
+         * installation is some connected set of message routers.
+         * 
+         * All CMSMessageID values must start with the prefix 'ID:'. Uniqueness 
+         * of message ID values across different providers is not required.
+         * 
+         * Since message IDs take some effort to create and increase a 
+         * message's size, some CMS providers may be able to optimize message 
+         * overhead if they are given a hint that the message ID is not used by 
+         * an application. By calling the MessageProducer.setDisableMessageID 
+         * method, a CMS client enables this potential optimization for all 
+         * messages sent by that message producer. If the CMS provider accepts 
+         * this hint, these messages must have the message ID set to null; if 
+         * the provider ignores the hint, the message ID must be set to its 
+         * normal unique value.
+         * 
+         * @return provider-assigned message id
+         */
+        virtual std::string getCMSMessageID() const = 0;
+        
+        /**
+         * Sets the message ID.
+         * 
+         * CMS providers set this field when a message is sent. This method can 
+         * be used to change the vaue for a message that has been received.
+         * 
+         * @param id - the ID of the message
+         */
+        virtual void setCMSMessageID( const std::string& id ) = 0;
+      
+        /**
+         * Gets the message priority level.
+         * 
+         * The CMS API defines ten levels of priority value, with 0 as the 
+         * lowest priority and 9 as the highest. In addition, clients should 
+         * consider priorities 0-4 as gradations of normal priority and 
+         * priorities 5-9 as gradations of expedited priority.
+         * 
+         * The CMS API does not require that a provider strictly implement 
+         * priority ordering of messages; however, it should do its best to 
+         * deliver expedited messages ahead of normal messages.
+         * 
+         * @return priority value
+         */
+        virtual int getCMSPriority() const = 0;
+      
+        /**
+         * Sets the Priority Value for this message
+         * 
+         * CMS providers set this field when a message is sent. This method can 
+         * be used to change the value for a message that has been received.
+         * 
+         * @param priority - priority value for this message
+         */
+        virtual void setCMSPriority( int priority ) = 0;
+
+        /**
+         * Gets an indication of whether this message is being redelivered.
+         * 
+         * If a client receives a message with the CMSRedelivered field set, it 
+         * is likely, but not guaranteed, that this message was delivered 
+         * earlier but that its receipt was not acknowledged at that time.
+         * 
+         * @return true if this message is being redelivered
+         */
+        virtual bool getCMSRedelivered() const = 0;
+      
+        /**
+         * Specifies whether this message is being redelivered.
+         * 
+         * This field is set at the time the message is delivered. This method 
+         * can be used to change the value for a message that has been received.
+         * 
+         * @param redelivered - boolean redelivered value
+         */
+        virtual void setCMSRedelivered( bool redelivered ) = 0;
+
+        /**
+         * Gets the Destination object to which a reply to this message should 
+         * be sent.
+         * 
+         * @return Destination to which to send a response to this message
+         */
+        virtual const cms::Destination* getCMSReplyTo() const = 0;
+      
+        /**
+         * Sets the Destination object to which a reply to this message should 
+         * be sent.
+         * 
+         * The CMSReplyTo header field contains the destination where a reply 
+         * to the current message should be sent. If it is null, no reply is 
+         * expected. The destination may be either a Queue object or a Topic 
+         * object.
+         * 
+         * Messages sent with a null CMSReplyTo value may be a notification of 
+         * some event, or they may just be some data the sender thinks is of 
+         * interest.
+         * 
+         * Messages with a CMSReplyTo value typically expect a response. A 
+         * response is optional; it is up to the client to decide. These 
+         * messages are called requests. A message sent in response to a 
+         * request is called a reply.
+         * 
+         * In some cases a client may wish to match a request it sent earlier 
+         * with a reply it has just received. The client can use the 
+         * CMSCorrelationID header field for this purpose.
+         * 
+         * @param destination - Destination to which to send a response to this 
+         * message
+         */
+        virtual void setCMSReplyTo( const cms::Destination* destination ) = 0;
+
+        /**
+         * Gets the message timestamp.
+         * 
+         * The CMSTimestamp header field contains the time a message was handed 
+         * off to a provider to be sent. It is not the time the message was 
+         * actually transmitted, because the actual send may occur later due to 
+         * transactions or other client-side queueing of messages.
+         * 
+         * When a message is sent, CMSTimestamp is ignored. When the send or 
+         * publish method returns, it contains a time value somewhere in the 
+         * interval between the call and the return. The value is in the format 
+         * of a normal millis time value in the Java programming language.
+         * 
+         * Since timestamps take some effort to create and increase a message's 
+         * size, some CMS providers may be able to optimize message overhead if 
+         * they are given a hint that the timestamp is not used by an 
+         * application. By calling the MessageProducer.setDisableMessageTimestamp 
+         * method, a CMS client enables this potential optimization for all 
+         * messages sent by that message producer. If the CMS provider accepts 
+         * this hint, these messages must have the timestamp set to zero; if the 
+         * provider ignores the hint, the timestamp must be set to its normal 
+         * value.
+         * 
+         * @return the message timestamp
+         */
+        virtual long long getCMSTimestamp() const = 0;
+      
+        /**
+         * Sets the message timestamp.
+         * 
+         * CMS providers set this field when a message is sent. This method can 
+         * be used to change the value for a message that has been received.
+         * 
+         * @param timeStamp - integer time stamp value
+         */
+        virtual void setCMSTimestamp( long long timeStamp ) = 0;
+
+        /**
+         * Gets the message type identifier supplied by the client when the 
+         * message was sent.
+         * 
+         * @return the message type
+         * @see setCMSType
+         */
+        virtual std::string getCMSType() const = 0;
+      
+        /**
+         * Sets the message type.
+         * 
+         * Some CMS providers use a message repository that contains the 
+         * definitions of messages sent by applications. The CMSType header 
+         * field may reference a message's definition in the provider's 
+         * repository.
+         * 
+         * The CMS API does not define a standard message definition repository, 
+         * nor does it define a naming policy for the definitions it contains.
+         * 
+         * Some messaging systems require that a message type definition for 
+         * each application message be created and that each message specify its 
+         * type. In order to work with such CMS providers, CMS clients should 
+         * assign a value to CMSType, whether the application makes use of it or 
+         * not. This ensures that the field is properly set for those providers 
+         * that require it.
+         * 
+         * To ensure portability, CMS clients should use symbolic values for 
+         * CMSType that can be configured at installation time to the values 
+         * defined in the current provider's message repository. If string 
+         * literals are used, they may not be valid type names for some CMS 
+         * providers.
+         * 
+         * @param type the message type
+         * @see getCMSType
+         */
+        virtual void setCMSType( const std::string& type ) = 0;
+        
+    };
+}
+
+#endif /*_CMS_MESSAGE_H_*/
diff --git a/src/main/cms/MessageConsumer.h b/src/main/cms/MessageConsumer.h
new file mode 100644
index 0000000..a8402fd
--- /dev/null
+++ b/src/main/cms/MessageConsumer.h
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_MESSAGECONSUMER_H_
+#define _CMS_MESSAGECONSUMER_H_
+
+#include <cms/MessageListener.h>
+#include <cms/Message.h>
+#include <cms/Closeable.h>
+
+namespace cms
+{
+
+    class MessageConsumer : public Closeable
+    {
+    public:
+
+        virtual ~MessageConsumer() {}
+      
+        /**
+         * Synchronously Receive a Message
+         * @return new message
+         * @throws CMSException
+         */
+        virtual Message* receive() throw ( CMSException ) = 0;
+
+        /**
+         * Synchronously Receive a Message, time out after defined interval.
+         * Returns null if nothing read.
+         * @return new message
+         * @throws CMSException
+         */
+        virtual Message* receive( int millisecs ) throw ( CMSException ) = 0;
+
+        /**
+         * Receive a Message, does not wait if there isn't a new message
+         * to read, returns NULL if nothing read.
+         * @return new message
+         * @throws CMSException
+         */
+        virtual Message* receiveNoWait() throw ( CMSException ) = 0;
+
+        /**
+         * Sets the MessageListener that this class will send notifs on
+         * @param MessageListener interface pointer
+         */
+        virtual void setMessageListener( MessageListener* listener ) = 0;
+      
+        /**
+         * Gets the MessageListener that this class will send notifs on
+         * @param MessageListener interface pointer
+         */
+        virtual MessageListener* getMessageListener() const = 0;
+      
+        /**
+         * Gets this message consumer's message selector expression.
+         * @return This Consumer's selector expression or "".
+         * @throws cms::CMSException
+         */
+        virtual std::string getMessageSelector() const 
+            throw ( cms::CMSException ) = 0;
+            
+    };
+
+}
+
+#endif /*_CMS_MESSAGECONSUMER_H_*/
diff --git a/src/main/cms/MessageListener.h b/src/main/cms/MessageListener.h
new file mode 100644
index 0000000..4f74892
--- /dev/null
+++ b/src/main/cms/MessageListener.h
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_MESSAGELISTENER_H_
+#define _CMS_MESSAGELISTENER_H_
+ 
+namespace cms{
+    
+    class Message;
+    
+    class MessageListener{
+    public:
+    
+        virtual ~MessageListener(){}
+        
+        /**
+         * Called asynchronously when a new message is received, the message
+         * reference can be to any othe Message types. a dynamic cast is used
+         * to find out what type of message this is.  The lifetime of this
+         * object is only guaranteed to be for life of the onMessage function
+         * after this returns the message may no longer exists.  User should
+         * copy the data or clone the message if they wish to keep something
+         * around about this message.
+         * 
+         * It is considered a programming error for this method to throw an
+         * exception.
+         * 
+         * @param Message object const pointer recipient does not own.
+         */
+        virtual void onMessage( const Message* message ) = 0;
+
+    };
+    
+}
+
+#endif /*_CMS_MESSAGELISTENER_H_*/
diff --git a/src/main/cms/MessageProducer.h b/src/main/cms/MessageProducer.h
new file mode 100644
index 0000000..ebaaad8
--- /dev/null
+++ b/src/main/cms/MessageProducer.h
@@ -0,0 +1,154 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_MESSAGEPRODUCER_H_
+#define _CMS_MESSAGEPRODUCER_H_
+
+#include <cms/Message.h>
+#include <cms/Destination.h>
+#include <cms/Closeable.h>
+#include <cms/CMSException.h>
+#include <cms/DeliveryMode.h>
+
+namespace cms
+{
+    /** 
+     * defines the <code>MessageProducer</code> interface that is used
+     * by all MessageProducer derivations.  This class defines the JMS
+     * spec'd interface for a MessageProducer.
+     */
+    class MessageProducer : public Closeable
+    {
+    public:
+
+        virtual ~MessageProducer() {}
+      
+        /**
+         * Sends the message to the default producer destination, but does
+         * not take ownership of the message, caller must still destroy it.
+         * Uses default values for deliveryMode, priority, and time to live.
+         * @param message - a Message Object Pointer
+         * @throws CMSException
+         */
+        virtual void send( Message* message ) throw ( CMSException ) = 0;             
+
+        /**
+         * Sends the message to the default producer destination, but does
+         * not take ownership of the message, caller must still destroy it.
+         * @param message - a Message Object Pointer
+         * @param deliverMode The delivery mode to be used.
+         * @param priority The priority for this message.
+         * @param timeToLive The time to live value for this message in
+         * milliseconds.
+         * @throws CMSException
+         */
+        virtual void send( Message* message, int deliveryMode, int priority, 
+            long long timeToLive) throw ( CMSException ) = 0;
+            
+        /**
+         * Sends the message to the designated destination, but does
+         * not take ownership of the message, caller must still destroy it.
+         * Uses default values for deliveryMode, priority, and time to live.
+         * @param destination - a Message Object Pointer
+         * @param message - the message to send to the destination
+         * @throws CMSException
+         */
+        virtual void send( const Destination* destination,
+                           Message* message ) throw ( CMSException ) = 0;
+                           
+        /**
+         * Sends the message to the designated destination, but does
+         * not take ownership of the message, caller must still destroy it.
+         * @param destination - a Message Object Pointer
+         * @param message - a Message Object Pointer
+         * @param deliverMode The delivery mode to be used.
+         * @param priority The priority for this message.
+         * @param timeToLive The time to live value for this message in
+         * milliseconds.
+         * @throws CMSException
+         */     
+        virtual void send( const Destination* destination,
+            Message* message, int deliveryMode, int priority, 
+            long long timeToLive) throw ( CMSException ) = 0;
+            
+        /** 
+         * Sets the delivery mode for this Producer
+         * @param mode - The DeliveryMode
+         */
+        virtual void setDeliveryMode( int mode ) = 0;
+      
+        /** 
+         * Gets the delivery mode for this Producer
+         * @return The DeliveryMode
+         */
+        virtual int getDeliveryMode() const = 0;
+      
+        /**
+         * Sets if Message Ids are disbled for this Producer
+         * @param value - boolean indicating enable / disable (true / false)
+         */
+        virtual void setDisableMessageID( bool value ) = 0;
+      
+        /**
+         * Gets if Message Ids are disbled for this Producer
+         * @return boolean indicating enable / disable (true / false)
+         */
+        virtual bool getDisableMessageID() const = 0;
+
+        /**
+         * Sets if Message Time Stamps are disbled for this Producer
+         * @param value - boolean indicating enable / disable (true / false)
+         */
+        virtual void setDisableMessageTimeStamp( bool value ) = 0;
+      
+        /**
+         * Gets if Message Time Stamps are disbled for this Producer
+         * @return boolean indicating enable / disable (true / false)
+         */
+        virtual bool getDisableMessageTimeStamp() const = 0;
+      
+        /**
+         * Sets the Priority that this Producers sends messages at
+         * @param priority - int value for Priority level
+         */
+        virtual void setPriority( int priority ) = 0;
+      
+        /**
+         * Gets the Priority level that this producer sends messages at
+         * @return int based priority level
+         */
+        virtual int getPriority() const = 0;
+      
+        /**
+         * Sets the Time to Live that this Producers sends messages with.  This
+         * value will be used if the time to live is not specified via the
+         * send method.
+         * @param time - default time to live value in milliseconds
+         */
+        virtual void setTimeToLive( long long time ) = 0;
+      
+        /**
+         * Gets the Time to Live that this producer sends messages with
+         * @return Time to live value in milliseconds
+         */
+        virtual long long getTimeToLive() const = 0;
+      
+    };
+
+}
+
+#endif /*_CMS_MESSAGEPRODUCER_H_*/
diff --git a/src/main/cms/ObjectMessage.h b/src/main/cms/ObjectMessage.h
new file mode 100644
index 0000000..7451114
--- /dev/null
+++ b/src/main/cms/ObjectMessage.h
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_OBJECTMESSAGE_H_
+#define _CMS_OBJECTMESSAGE_H_
+
+#include <cms/Message.h>
+
+namespace cms{
+
+    class ObjectMessage : Message
+    {
+    public:
+    
+        virtual ~ObjectMessage() {}
+
+    };
+
+}
+
+#endif /*_CMS_OBJECTMESSAGE_H_*/
diff --git a/src/main/cms/Queue.h b/src/main/cms/Queue.h
new file mode 100644
index 0000000..d2960c7
--- /dev/null
+++ b/src/main/cms/Queue.h
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_QUEUE_H_
+#define _CMS_QUEUE_H_
+ 
+#include <cms/Destination.h>
+#include <cms/CMSException.h>
+
+namespace cms{
+    
+    /**
+     * An interface encapsulating a provider-specific queue name.
+     */
+    class Queue : public Destination{
+        
+    public:
+    
+        virtual ~Queue(){}
+        
+        /**
+         * Gets the name of this queue.
+         * @return The queue name.
+         */
+        virtual std::string getQueueName() const 
+            throw( CMSException ) = 0;
+
+    };
+
+}
+
+#endif /*_CMS_QUEUE_H_*/
diff --git a/src/main/cms/Session.h b/src/main/cms/Session.h
new file mode 100644
index 0000000..d92b660
--- /dev/null
+++ b/src/main/cms/Session.h
@@ -0,0 +1,282 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*     http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT 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 _CMS_SESSION_H_
+#define _CMS_SESSION_H_
+
+#include <cms/Closeable.h>
+#include <cms/Message.h>
+#include <cms/TextMessage.h>
+#include <cms/BytesMessage.h>
+#include <cms/MapMessage.h>
+#include <cms/MessageProducer.h>
+#include <cms/MessageConsumer.h>
+#include <cms/Topic.h>
+#include <cms/Queue.h>
+#include <cms/TemporaryTopic.h>
+#include <cms/TemporaryQueue.h>
+#include <cms/CMSException.h>
+
+namespace cms
+{
+
+    class Session : public Closeable
+    {
+    public:
+
+        enum AcknowledgeMode
+        {
+            /**
+             * With this acknowledgment mode, the session automatically
+             * acknowledges a client's receipt of a message either when
+             * the session has successfully returned from a call to receive
+             * or when the message listener the session has called to
+             * process the message successfully returns.
+             */
+            AUTO_ACKNOWLEDGE,
+
+            /**
+             * With this acknowledgment mode, the session automatically
+             * acknowledges a client's receipt of a message either when
+             * the session has successfully returned from a call to receive
+             * or when the message listener the session has called to
+             * process the message successfully returns.  Acknowlegements
+             * may be delayed in this mode to increase performance at
+             * the cost of the message being redelivered this client fails.
+             */
+            DUPS_OK_ACKNOWLEDGE,
+
+            /**
+             * With this acknowledgment mode, the client acknowledges a
+             * consumed message by calling the message's acknowledge method.
+             */
+            CLIENT_ACKNOWLEDGE,
+
+            /**
+             * Messages will be consumed when the transaction commits.
+             */
+            SESSION_TRANSACTED
+                     
+        };
+
+    public:
+
+        virtual ~Session() {}
+
+        /**
+         * Closes this session as well as any active child consumers or
+         * producers.
+         * @throws CMSException
+         */
+        virtual void close() throw( CMSException ) = 0;
+        
+        /**
+         * Commits all messages done in this transaction and releases any 
+         * locks currently held.
+         * @throws CMSException
+         */
+        virtual void commit() throw ( CMSException ) = 0;
+
+        /**
+         * Rollsback all messages done in this transaction and releases any 
+         * locks currently held.
+         * @throws CMSException
+         */
+        virtual void rollback() throw ( CMSException ) = 0;
+
+        /**
+         * Creates a MessageConsumer for the specified destination.
+         * @param the Destination that this consumer receiving messages for.
+         * @return pointer to a new MessageConsumer that is owned by the 
+         *         caller ( caller deletes )
+         * @throws CMSException
+         */
+        virtual MessageConsumer* createConsumer(
+            const Destination* destination )
+                throw ( CMSException ) = 0;
+
+        /**
+         * Creates a MessageConsumer for the specified destination, using a 
+         * message selector.
+         * @param the Destination that this consumer receiving messages for.
+         * @param the Message Selector to use
+         * @return pointer to a new MessageConsumer that is owned by the 
+         *         caller ( caller deletes )
+         * @throws CMSException
+         */
+        virtual MessageConsumer* createConsumer( 
+            const Destination* destination,
+            const std::string& selector )
+                throw ( CMSException ) = 0;
+
+        /**
+         * Creates a MessageConsumer for the specified destination, using a 
+         * message selector.
+         * @param the Destination that this consumer receiving messages for.
+         * @param the Message Selector to use
+         * @param if true, and the destination is a topic, inhibits the 
+         * delivery of messages published by its own connection. The behavior 
+         * for NoLocal is not specified if the destination is a queue. 
+         * @return pointer to a new MessageConsumer that is owned by the 
+         *         caller ( caller deletes )
+         * @throws CMSException
+         */
+        virtual MessageConsumer* createConsumer( 
+            const Destination* destination,
+            const std::string& selector,
+            bool noLocal )
+                throw ( CMSException ) = 0;
+
+        /**
+         * Creates a durable subscriber to the specified topic, using a 
+         * message selector
+         * @param the topic to subscribe to
+         * @param name used to identify the subscription
+         * @param only messages matching the selector are received
+         * @return pointer to a new durable MessageConsumer that is owned by 
+         *         the caller ( caller deletes )
+         * @throws CMSException
+         */
+        virtual MessageConsumer* createDurableConsumer(
+            const Topic* destination,
+            const std::string& name,
+            const std::string& selector,
+            bool noLocal = false )
+                throw ( CMSException ) = 0;
+
+        /**
+         * Creates a MessageProducer to send messages to the specified 
+         * destination.
+         * @param the Destination to publish on
+         * @return New MessageProducer that is owned by the caller.
+         * @throws CMSException
+         */
+        virtual MessageProducer* createProducer( const Destination* destination )
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a queue identity given a Queue name.
+         * @param the name of the new Queue
+         * @return new Queue pointer that is owned by the caller.
+         * @throws CMSException
+         */
+        virtual Queue* createQueue( const std::string& queueName )
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a topic identity given a Queue name.
+         * @param the name of the new Topic
+         * @return new Topic pointer that is owned by the caller.
+         * @throws CMSException
+         */
+        virtual Topic* createTopic( const std::string& topicName )
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a TemporaryQueue object.
+         * @return new TemporaryQueue pointer that is owned by the caller.
+         * @throws CMSException
+         */
+        virtual TemporaryQueue* createTemporaryQueue()
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a TemporaryTopic object.
+         * @throws CMSException
+         */
+        virtual TemporaryTopic* createTemporaryTopic()
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a new Message
+         * @throws CMSException
+         */
+        virtual Message* createMessage() 
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a BytesMessage
+         * @throws CMSException
+         */
+        virtual BytesMessage* createBytesMessage() 
+            throw ( CMSException) = 0;
+
+        /**
+         * Creates a BytesMessage and sets the paylod to the passed value
+         * @param an array of bytes to set in the message
+         * @param the size of the bytes array, or number of bytes to use
+         * @throws CMSException
+         */
+        virtual BytesMessage* createBytesMessage(
+            const unsigned char* bytes,
+            std::size_t bytesSize ) 
+                throw ( CMSException) = 0;
+
+        /**
+         * Creates a new TextMessage
+         * @throws CMSException
+         */
+        virtual TextMessage* createTextMessage() 
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a new TextMessage and set the text to the value given
+         * @param the initial text for the message
+         * @throws CMSException
+         */
+        virtual TextMessage* createTextMessage( const std::string& text ) 
+            throw ( CMSException ) = 0;
+
+        /**
+         * Creates a new MapMessage
+         * @throws CMSException
+         */
+        virtual MapMessage* createMapMessage() 
+            throw ( CMSException ) = 0;
+
+        /**
+         * Returns the acknowledgement mode of the session.
+         * @return the Sessions Acknowledge Mode
+         */
+        virtual AcknowledgeMode getAcknowledgeMode() const = 0;
+
+        /**
+         * Gets if the Sessions is a Transacted Session
+         * @return transacted true - false.
+         */
+        virtual bool isTransacted() const = 0;
+        
+        /**
+         * Unsubscribes a durable subscription that has been created by a 
+         * client.
+         * 
+         * This method deletes the state being maintained on behalf of the 
+         * subscriber by its provider.  It is erroneous for a client to delete a 
+         * durable subscription while there is an active MessageConsumer or 
+         * Subscriber for the subscription, or while a consumed message is 
+         * part of a pending transaction or has not been acknowledged in the 
+         * session.
+         * @param name the name used to identify this subscription
+         * @throws CMSException
+         */
+        virtual void unsubscribe( const std::string& name ) 
+            throw ( CMSException ) = 0;
+
+    };
+
+}
+
+#endif /*_CMS_SESSION_H_*/
diff --git a/src/main/cms/Startable.h b/src/main/cms/Startable.h
new file mode 100644
index 0000000..233b169
--- /dev/null
+++ b/src/main/cms/Startable.h
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 CMS_STARTABLE_H
+#define CMS_STARTABLE_H
+ 
+#include <cms/CMSException.h>
+
+namespace cms{
+    
+    /**
+     * Interface for a class that implements the start method.
+     */
+    class Startable{
+        
+    public:
+    
+        virtual ~Startable(){}
+        
+        /**
+         * Starts the service.
+         */
+        virtual void start() throw( CMSException ) = 0;
+        
+    };
+}
+
+#endif /*CMS_STARTABLE_H*/
diff --git a/src/main/cms/Stoppable.h b/src/main/cms/Stoppable.h
new file mode 100644
index 0000000..3d08e3c
--- /dev/null
+++ b/src/main/cms/Stoppable.h
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 CMS_STOPPABLE_H
+#define CMS_STOPPABLE_H
+ 
+#include <cms/CMSException.h>
+
+namespace cms{
+    
+    /**
+     * Interface for a class that implements the stop method.
+     */
+    class Stoppable{
+        
+    public:
+    
+        virtual ~Stoppable(){}
+        
+        /**
+         * Stops this service.
+         */
+        virtual void stop() throw( CMSException ) = 0;
+        
+    };
+}
+
+#endif /*CMS_STOPPABLE_H*/
diff --git a/src/main/cms/TemporaryQueue.h b/src/main/cms/TemporaryQueue.h
new file mode 100644
index 0000000..af63d94
--- /dev/null
+++ b/src/main/cms/TemporaryQueue.h
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_TEMPORARYQUEUE_H_
+#define _CMS_TEMPORARYQUEUE_H_
+
+#include <cms/Destination.h>
+#include <cms/CMSException.h>
+
+namespace cms{
+
+    /**
+     * An interface encapsulating a provider-specific queue name.
+     */
+    class TemporaryQueue : public Destination
+    {
+    public:
+
+        virtual ~TemporaryQueue() {}
+
+        /**
+         * Gets the name of this queue.
+         * @return The queue name.
+         */
+        virtual std::string getQueueName() const
+            throw( CMSException ) = 0;
+
+        /**
+         * Destroy's the Temp Destination at the Broker
+         * @throws CMSException
+         */
+        virtual void destroy() throw ( CMSException ) = 0;
+
+   };
+
+}
+
+#endif /*_CMS_TEMPORARYQUEUE_H_*/
diff --git a/src/main/cms/TemporaryTopic.h b/src/main/cms/TemporaryTopic.h
new file mode 100644
index 0000000..c8d1642
--- /dev/null
+++ b/src/main/cms/TemporaryTopic.h
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_TEMPORARYTOPIC_H_
+#define _CMS_TEMPORARYTOPIC_H_
+
+#include <cms/Destination.h>
+#include <cms/CMSException.h>
+
+namespace cms{
+
+    /**
+     * An interface encapsulating a provider-specific topic name.
+     */
+    class TemporaryTopic : public Destination
+    {
+    public:
+
+        virtual ~TemporaryTopic() {}
+
+        /**
+         * Gets the name of this topic.
+         * @return The topic name.
+         */
+        virtual std::string getTopicName()
+            const throw( CMSException ) = 0;
+
+        /**
+         * Destroy's the Temp Destination at the Broker
+         * @throws CMSException
+         */
+        virtual void destroy() throw ( CMSException ) = 0;
+
+   };
+
+}
+
+#endif /*_CMS_TEMPORARYTOPIC_H_*/
diff --git a/src/main/cms/TextMessage.h b/src/main/cms/TextMessage.h
new file mode 100644
index 0000000..90eb0fd
--- /dev/null
+++ b/src/main/cms/TextMessage.h
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_TEXTMESSAGE_H_
+#define _CMS_TEXTMESSAGE_H_
+ 
+#include <cms/Message.h>
+#include <cms/CMSException.h>
+
+namespace cms{
+    
+    /**
+     * Interface for a text message.
+     */
+    class TextMessage : public Message{
+
+    public:
+
+        virtual ~TextMessage(){}
+
+        /**
+         * Gets the message character buffer.
+         * @return The message character buffer.
+         */
+        virtual std::string getText() const throw( CMSException ) = 0;
+
+        /**
+         * Sets the message contents, does not take ownership of the passed
+         * char*, but copies it instead.  
+         * @param msg The message buffer.
+         */
+        virtual void setText( const char* msg ) throw( CMSException ) = 0;
+
+        /**
+         * Sets the message contents
+         * @param msg The message buffer.
+         */
+        virtual void setText( const std::string& msg ) throw( CMSException ) = 0;
+
+    };
+}
+
+#endif /*_CMS_TEXTMESSAGE_H_*/
diff --git a/src/main/cms/Topic.h b/src/main/cms/Topic.h
new file mode 100644
index 0000000..8a8ee30
--- /dev/null
+++ b/src/main/cms/Topic.h
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT 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 _CMS_TOPIC_
+#define _CMS_TOPIC_
+ 
+#include <cms/Destination.h>
+#include <cms/CMSException.h>
+
+namespace cms{
+    
+    /**
+     * An interface encapsulating a provider-specific topic name.
+     */
+    class Topic : public Destination{
+        
+    public:
+    
+        virtual ~Topic() {}
+        
+        /**
+         * Gets the name of this topic.
+         * @return The topic name.
+         */
+        virtual std::string getTopicName() 
+            const throw( CMSException ) = 0;
+            
+    };
+
+}
+
+#endif /*_CMS_TOPIC_*/
