diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml
new file mode 100644
index 0000000..9e5eb1e
--- /dev/null
+++ b/.github/workflows/linux.yml
@@ -0,0 +1,29 @@
+name: linux
+
+on:
+  - push
+  - pull_request
+
+jobs:
+  perl:
+    runs-on: ubuntu-latest
+    strategy:
+      matrix:
+        perl-version:
+          - '5.10'
+          - '5.30'
+          - '5.32'
+          - '5.34'
+    container:
+      image: perl:${{ matrix.perl-version }}
+    steps:
+      - uses: actions/checkout@v2
+      - name: Install Dependencies
+        run: |
+          curl -sL https://cpanmin.us/ | perl - -n --installdeps .
+      - name: Build
+        run: |
+          perl Build.PL
+          ./Build
+      - name: Run test
+        run: ./Build test
diff --git a/.gitignore b/.gitignore
index 67d22ea..25d7d08 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,8 +7,6 @@ MessagePack.o
 MessagePack.c
 blib/
 inc/
-include/
-t/std/
 *.o
 pm_to_blib
 MANIFEST
@@ -18,4 +16,8 @@ xshelper.h
 *.swp
 *~
 *.bak
-
+/Data-MessagePack-*
+/Build
+/Build.bat
+/_build/
+/lib/Data/MessagePack.xs
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index f3a9054..0000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "msgpack-c"]
-	path = msgpack-c
-	url = git://github.com/msgpack/msgpack-c.git
diff --git a/.shipit b/.shipit
deleted file mode 100644
index 3a66936..0000000
--- a/.shipit
+++ /dev/null
@@ -1,4 +0,0 @@
-steps = FindVersion, ChangeVersion, CheckChangeLog, DistTest, Commit, Tag, MakeDist, UploadCPAN
-MakeDist.destination=~/.shipit-dist/
-git.tagpattern = perl-%v
-git.push_to = origin
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 12b8c1f..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-sudo: false
-language: perl
-install: cpanm --installdeps --notest --verbose .
-before_install:
-  - perlbrew install-cpanm -f
-  - cpanm --notest Module::Install Module::Install::XSUtil Module::Install::AuthorTests
-perl:
-  - "5.20"
-  - "5.22"
diff --git a/Build.PL b/Build.PL
new file mode 100644
index 0000000..0aa0db3
--- /dev/null
+++ b/Build.PL
@@ -0,0 +1,72 @@
+# =========================================================================
+# THIS FILE IS AUTOMATICALLY GENERATED BY MINILLA.
+# DO NOT EDIT DIRECTLY.
+# =========================================================================
+
+use 5.008_001;
+
+use strict;
+use warnings;
+use utf8;
+
+BEGIN { push @INC, '.' }
+use builder::MyBuilder;
+use File::Basename;
+use File::Spec;
+
+my %args = (
+    license              => 'perl_5',
+    dynamic_config       => 0,
+
+    configure_requires => {
+        'Module::Build' => '0.4005',
+    },
+
+    requires => {
+        'Math::BigInt' => '1.89',
+        'perl' => '5.008001',
+    },
+
+    recommends => {
+    },
+
+    suggests => {
+    },
+
+    build_requires => {
+    },
+
+    test_requires => {
+        'Test::More' => '0.98',
+        'Test::Requires' => '0',
+    },
+
+    name            => 'Data-MessagePack',
+    module_name     => 'Data::MessagePack',
+    allow_pureperl => 1,
+
+    script_files => [glob('script/*'), glob('bin/*')],
+    PL_files => {},
+
+    test_files           => ((-d '.git' || $ENV{RELEASE_TESTING}) && -d 'xt') ? 't/ xt/' : 't/',
+    recursive_test_files => 1,
+
+
+);
+if (-d 'share') {
+    $args{share_dir} = 'share';
+}
+
+my $builder = builder::MyBuilder->subclass(
+    class => 'MyBuilder',
+    code => q{
+        sub ACTION_distmeta {
+            die "Do not run distmeta. Install Minilla and `minil install` instead.\n";
+        }
+        sub ACTION_installdeps {
+            die "Do not run installdeps. Run `cpanm --installdeps .` instead.\n";
+        }
+    }
+)->new(%args);
+$builder->create_build_script();
+
diff --git a/Changes b/Changes
index 771e6a2..49cf9c5 100644
--- a/Changes
+++ b/Changes
@@ -1,3 +1,15 @@
+Revision history for Perl extension Data-MessagePack
+
+{{$NEXT}}
+
+1.02 2022-03-11T14:27:47Z
+    - Fix test for usequadmath Perl
+
+1.01 2020-03-17T17:06:53Z
+
+    - Switch to Minilla from Module::Install
+    - Fix test for newer Windows Perl
+
 1.00 2016-08-21 15:30:00+0900
 
     - Update major version for MessagePack versioning rule
diff --git a/MANIFEST.SKIP b/MANIFEST.SKIP
deleted file mode 100644
index cfa42ec..0000000
--- a/MANIFEST.SKIP
+++ /dev/null
@@ -1,33 +0,0 @@
-\bRCS\b
-\bCVS\b
-^MANIFEST\.
-^Makefile$
-^MYMETA\.(?:yml|json)$
-~$
-^#
-\.old$
-\.swp$
-\.bak$
-^blib/
-^pm_to_blib
-^MakeMaker-\d
-\.gz$
-\.cvsignore
-^t/9\d_.*\.t
-^t/perlcritic
-^tools/
-\.svn/
-^[^/]+\.yaml$
-^[^/]+\.pl$
-^\.shipit$
-^\.git/
-\.sw[pon]$
-^\.gitignore$
-\.o$
-\.bs$
-^Data-MessagePack-[0-9.]+/
-^\.testenv/test_pp.pl
-^ppport.h$
-^msgpack
-MessagePack\.c$
-
diff --git a/META.json b/META.json
new file mode 100644
index 0000000..db67e8d
--- /dev/null
+++ b/META.json
@@ -0,0 +1,138 @@
+{
+   "abstract" : "MessagePack serializing/deserializing",
+   "author" : [
+      "Tokuhiro Matsuno"
+   ],
+   "dynamic_config" : 0,
+   "generated_by" : "Minilla/v3.1.15, CPAN::Meta::Converter version 2.150010",
+   "license" : [
+      "perl_5"
+   ],
+   "meta-spec" : {
+      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+      "version" : 2
+   },
+   "name" : "Data-MessagePack",
+   "no_index" : {
+      "directory" : [
+         "t",
+         "xt",
+         "inc",
+         "share",
+         "eg",
+         "examples",
+         "author",
+         "builder"
+      ]
+   },
+   "prereqs" : {
+      "configure" : {
+         "requires" : {
+            "Devel::PPPort" : "3.42",
+            "Module::Build" : "0.4005",
+            "Module::Build::XSUtil" : "0"
+         }
+      },
+      "develop" : {
+         "requires" : {
+            "Test::CPAN::Meta" : "0",
+            "Test::LeakTrace" : "0",
+            "Test::MinimumVersion::Fast" : "0.04",
+            "Test::PAUSE::Permissions" : "0.07",
+            "Test::Pod" : "1.41",
+            "Test::Spellunker" : "v0.2.7"
+         }
+      },
+      "runtime" : {
+         "requires" : {
+            "Math::BigInt" : "1.89",
+            "perl" : "5.008001"
+         }
+      },
+      "test" : {
+         "requires" : {
+            "Test::More" : "0.98",
+            "Test::Requires" : "0"
+         }
+      }
+   },
+   "release_status" : "unstable",
+   "resources" : {
+      "bugtracker" : {
+         "web" : "https://github.com/msgpack/msgpack-perl/issues"
+      },
+      "homepage" : "https://github.com/msgpack/msgpack-perl",
+      "repository" : {
+         "type" : "git",
+         "url" : "https://github.com/msgpack/msgpack-perl.git",
+         "web" : "https://github.com/msgpack/msgpack-perl"
+      }
+   },
+   "version" : "1.02",
+   "x_authority" : "cpan:TOKUHIROM",
+   "x_contributors" : [
+      "Brian Ketelsen <bketelsen@gmail.com>",
+      "David Steinbrunner <dsteinbrunner@pobox.com>",
+      "FUJI Goro (gfx) <gfuji@cpan.org>",
+      "FURUHASHI Sadayuki <frsyuki@users.sourceforge.jp>",
+      "Fuji Goro <fuji.goro@dena.jp>",
+      "Fuji, Goro <g.psy.va@gmail.com>",
+      "Fuji, Goro <goro-fuji@cookpad.com>",
+      "Hideyuki TAKEI <takehide22@gmail.com>",
+      "Hideyuki Tanaka <hideyuki@hideyuki-vbox.(none)>",
+      "Hideyuki Tanaka <tanaka.hideyuki@gmail.com>",
+      "Hideyuki Tanaka <tanakh@tanakh-VirtualBox.(none)>",
+      "Hideyuki Tanaka <tanakh@tanakh-desktop.(none)>",
+      "INADA Naoki <songofacandy@gmail.com>",
+      "Kazuho Oku <kazuhooku@gmail.com>",
+      "Kazuki Ohta <kazuki.ohta@gmail.com>",
+      "Kazuki Ohta <kzk@il.is.s.u-tokyo.ac.jp>",
+      "Kazuki Oikawa <k@oikw.org>",
+      "Keiji Muraishi <keiji.muraishi@gmail.com>",
+      "Masahiro Nakagawa <repeatedly@gmail.com>",
+      "Moriyoshi Koizumi <mozo@mozo.jp>",
+      "Muga Nishizawa <muga.nishizawa@gmail.com>",
+      "Muga Nishizawa <muga@f11vm.(none)>",
+      "Naoki INADA <inada-n@eagle>",
+      "Naoki INADA <inada-n@gear>",
+      "Naoki INADA <inada-n@klab.jp>",
+      "Naoki INADA <inada-n@koala>",
+      "Naoki INADA <omoikane@sourceforge.jp>",
+      "Nicolas Despres <nicolas.despres@gmail.com>",
+      "Nikolay Mishin <mi@ya.ru>",
+      "Perlover <perlover@perlover.com>",
+      "Reini Urban <rurban@cpanel.net>",
+      "Robin Smidsrød <robin@smidsrod.no>",
+      "Shohei YOSHIDA <shohei.yoshida@dena.com>",
+      "Shohei YOSHIDA <syohex@gmail.com>",
+      "Shoichi Kaji <skaji@cpan.org>",
+      "Taro L. Saito <leo@xerial.org>",
+      "Tokuhiro Matsuno <tokuhirom@gmail.com>",
+      "UENISHI Kota <kuenishi+github@gmail.com>",
+      "UENISHI Kota <kuenishi@gmail.com>",
+      "Vasily Titskiy <Vasiliy.Titskiy@bioscrypt.com>",
+      "Vincent de Phily <vincent.dephily@gmail.com>",
+      "Watabiki Naoya <watabiki.naoya@gmail.com>",
+      "Yuto Hayamizu <y.hayamizu@gmail.com>",
+      "advect <advect@gmail.com>",
+      "cho45 <cho45@lowreal.net>",
+      "egtra <valp_ab@yahoo.co.jp>",
+      "firewood <karamaki@gmail.com>",
+      "frsyuki (none) <frsyuki@vcore.>",
+      "frsyuki <frsyuki@5a5092ae-2292-43ba-b2d5-dcab9c1a2731>",
+      "frsyuki <frsyuki@vcore.(none)>",
+      "gfx <gfx@gfx-desktop.(none)>",
+      "inada-n <inada-n@hornet.(none)>",
+      "inada-n <inada-n@sag16.klab.org>",
+      "inada-n <omoikane@users.sourceforge.jp>",
+      "makamaka <makamaka.donzoko@gmail.com>",
+      "moaikids <moaikids@10.0.2.1>",
+      "mzp <mzpppp@gmail.com>",
+      "tailhook <pc@gafol.net>",
+      "takeshita <takeshita@geishatokyo.com>",
+      "tokuhirom <tokuhirom@users.sourceforge.jp>",
+      "xanxys <xanxys@gmail.com>"
+   ],
+   "x_serialization_backend" : "JSON::PP version 4.07",
+   "x_static_install" : 0
+}
diff --git a/Makefile.PL b/Makefile.PL
deleted file mode 100644
index c796dd7..0000000
--- a/Makefile.PL
+++ /dev/null
@@ -1,156 +0,0 @@
-# Usage: Makefile.PL --pp # disable XS
-#        Makefile.PL -g   # add -g to the compiler and disable optimization flags
-use inc::Module::Install;
-use Module::Install::XSUtil 0.44;
-use Module::Install::AuthorTests;
-
-name 'Data-MessagePack';
-all_from 'lib/Data/MessagePack.pm';
-
-configure_requires('File::Copy::Recursive');
-
-test_requires('Test::More' => 0.94); # done_testing
-test_requires('Test::Requires');
-
-tests 't/*.t';
-recursive_author_tests('xt');
-
-if ($Module::Install::AUTHOR) {
-    init_msgpack();
-}
-
-my $use_xs = 0;
-if ( $] >= 5.008005 and want_xs() ) {
-    my $has_c99 = c99_available(); # msgpack C library requires C99.
-
-    if ( $has_c99 ) {
-        requires_c99();
-        use_xshelper();
-        cc_warnings;
-        cc_include_paths('include');
-        cc_src_paths('xs-src');
-	postamble (qq{
-xs-src/pack.o : xshelper.h include/msgpack/pack_define.h include/msgpack/pack_template.h include/msgpack/sysdep.h
-xs-src/unpack.o : xshelper.h include/msgpack/unpack_define.h include/msgpack/unpack_template.h include/msgpack/sysdep.h
-});
-
-        if($Module::Install::AUTHOR) {
-            postamble qq{test :: test_pp\n\n};
-        }
-        $use_xs = 1;
-    }
-    else {
-        print <<NOT_SUPPORT_C99;
-
-This distribution requires a C99 compiler, but yours seems not to support C99.
-Instead of XS, configure PP version.
-
-NOT_SUPPORT_C99
-
-    }
-}
-
-if(!$use_xs) {
-    print "configure PP version\n\n";
-    requires 'Math::BigInt' => 1.89; # old versions of BigInt were broken
-}
-
-test_with_env( test_pp => PERL_DATA_MESSAGEPACK => 'pp' );
-
-repository('https://github.com/msgpack/msgpack-perl');
-bugtracker('https://github.com/msgpack/msgpack-perl/issues');
-
-clean_files qw{
-    *.stackdump
-    *.gcov *.gcda *.gcno
-    *.out
-    nytprof
-    cover_db
-};
-
-WriteAll;
-
-# copied from Makefile.PL in Text::Xslate.
-sub test_with_env {
-    my($name, %env) = @_;
-
-    my $dir = '.testenv';
-    if(not -e $dir) {
-        mkdir $dir or die "Cannot mkdir '.testenv': $!";
-    }
-    clean_files($dir);
-
-    {
-        open my $out, '>', "$dir/$name.pl"
-            or die "Cannot open '$dir/$name.pl' for writing: $!";
-       print $out "# This file sets the env for 'make $name', \n";
-       print $out "# generated by $0 at ", scalar(localtime), ".\n";
-       print $out "# DO NOT EDIT THIS FILE DIRECTLY.\n";
-       print $out "\n";
-
-        while(my($name, $value) = each %env) {
-            printf $out '$ENV{q{%s}} = q{%s};'."\n", $name, $value;
-        }
-    }
-
-    # repeat testing for pure Perl mode
-    # see also ExtUtils::MM_Any::test_via_harness()
-
-    my $t =  q{$(FULLPERLRUN) -MExtUtils::Command::MM -e}
-            .q{ "do q[%s]; test_harness($(TEST_VERBOSE), '$(INST_LIB)', '$(INST_ARCHLIB)')"}
-            .q{ $(TEST_FILES)};
-
-    postamble qq{$name :: pure_all\n}
-            . qq{\t} . q{$(NOECHO) $(ECHO) TESTING: } . $name . qq{\n}
-            . qq{\t} . sprintf($t, "$dir/$name.pl") . qq{\n\n}
-
-            . qq{testall :: $name\n\n};
-    return;
-}
-
-sub init_msgpack {
-    print "AuthorMode: copy modules\n";
-    if(not -d 'include') {
-        system 'git', 'submodule', 'init';
-        system 'git', 'submodule', 'update';
-    }
-    else {
-        system 'git', 'submodule', 'sync';
-    }
-
-    require File::Path;
-    require File::Copy;
-    require File::Copy::Recursive;
-
-    File::Path::rmtree([qw(include t/std)]);
-
-    my %msgpack_header = (
-        'include'                => ['msgpack-c/include/msgpack.h'],
-        'include/msgpack'        => [<msgpack-c/include/msgpack/pack*.h>,
-                                     <msgpack-c/include/msgpack/unpack*.h>,
-                                     'msgpack-c/include/msgpack/sysdep.h',
-                                     'msgpack-c/include/msgpack/predef.h'],
-        'include/msgpack/predef' => ['msgpack-c/include/msgpack/predef'],
-    );
-
-    while (my ($dest, $srcs) = each %msgpack_header) {
-        File::Path::mkpath([$dest]);
-
-        for my $src (@{$srcs}) {
-            next if $src =~ m/^\.\.?$/;
-            print "AuthorMode: copy $src to $dest\n";
-
-            if (-d $src) {
-                File::Copy::Recursive::dircopy($src, "$dest/") or die "copy failed: $!";
-            } else {
-                File::Copy::copy($src, $dest) or die "copy failed: $!";
-            }
-        }
-    }
-
-    File::Path::mkpath([qw(t/std)]);
-    for my $src(<msgpack-c/test/*.mpac>) {
-        print "AuthorMode: copy $src to t/std/\n";
-        File::Copy::copy($src, 't/std') or die "copy failed: $!";
-    }
-}
diff --git a/README b/README
deleted file mode 100644
index 53e7d9f..0000000
--- a/README
+++ /dev/null
@@ -1,177 +0,0 @@
-NAME
-    Data::MessagePack - MessagePack serializing/deserializing
-
-SYNOPSIS
-        use Data::MessagePack;
-
-        my $mp = Data::MessagePack->new();
-        $mp->canonical->utf8->prefer_integer if $needed;
-
-        my $packed   = $mp->pack($dat);
-        my $unpacked = $mp->unpack($dat);
-
-DESCRIPTION
-    This module converts Perl data structures to MessagePack and vice versa.
-
-ABOUT MESSAGEPACK FORMAT
-    MessagePack is a binary-based efficient object serialization format. It
-    enables to exchange structured objects between many languages like JSON.
-    But unlike JSON, it is very fast and small.
-
-  ADVANTAGES
-    PORTABLE
-        The MessagePack format does not depend on language nor byte order.
-
-    SMALL IN SIZE
-            say length(JSON::XS::encode_json({a=>1, b=>2}));   # => 13
-            say length(Storable::nfreeze({a=>1, b=>2}));       # => 21
-            say length(Data::MessagePack->pack({a=>1, b=>2})); # => 7
-
-        The MessagePack format saves memory than JSON and Storable format.
-
-    STREAMING DESERIALIZER
-        MessagePack supports streaming deserializer. It is useful for
-        networking such as RPC. See Data::MessagePack::Unpacker for details.
-
-    If you want to get more information about the MessagePack format, please
-    visit to <http://msgpack.org/>.
-
-METHODS
-    "my $packed = Data::MessagePack->pack($data[, $max_depth]);"
-        Pack the $data to messagepack format string.
-
-        This method throws an exception when the perl structure is nested
-        more than $max_depth levels(default: 512) in order to detect
-        circular references.
-
-        Data::MessagePack->pack() throws an exception when encountering a
-        blessed perl object, because MessagePack is a language-independent
-        format.
-
-    "my $unpacked = Data::MessagePack->unpack($msgpackstr);"
-        unpack the $msgpackstr to a MessagePack format string.
-
-    "my $mp = Data::MesssagePack->new()"
-        Creates a new MessagePack instance.
-
-    "$mp = $mp->prefer_integer([ $enable ])"
-    "$enabled = $mp->get_prefer_integer()"
-        If *$enable* is true (or missing), then the "pack" method tries a
-        string as an integer if the string looks like an integer.
-
-    "$mp = $mp->canonical([ $enable ])"
-    "$enabled = $mp->get_canonical()"
-        If *$enable* is true (or missing), then the "pack" method will
-        output packed data by sorting their keys. This is adding a
-        comparatively high overhead.
-
-    "$mp = $mp->utf8([ $enable ])"
-    "$enabled = $mp->get_utf8()"
-        If *$enable* is true (or missing), then the "pack" method will apply
-        "utf8::encode()" to all the string values.
-
-        In other words, this property tell $mp to deal with text strings.
-        See perlunifaq for the meaning of text string.
-
-    "$packed = $mp->pack($data)"
-    "$packed = $mp->encode($data)"
-        Same as "Data::MessagePack->pack()", but properties are respected.
-
-    "$data = $mp->unpack($data)"
-    "$data = $mp->decode($data)"
-        Same as "Data::MessagePack->unpack()", but properties are respected.
-
-Configuration Variables (DEPRECATED)
-    $Data::MessagePack::PreferInteger
-        Packs a string as an integer, when it looks like an integer.
-
-        This variable is deprecated. Use "$msgpack->prefer_integer" property
-        instead.
-
-SPEED
-    This is a result of benchmark/serialize.pl and benchmark/deserialize.pl
-    on my SC440(Linux 2.6.32-23-server #37-Ubuntu SMP). (You should
-    benchmark them with your data if the speed matters, of course.)
-
-        -- serialize
-        JSON::XS: 2.3
-        Data::MessagePack: 0.24
-        Storable: 2.21
-        Benchmark: running json, mp, storable for at least 1 CPU seconds...
-              json:  1 wallclock secs ( 1.00 usr +  0.01 sys =  1.01 CPU) @ 141939.60/s (n=143359)
-                mp:  1 wallclock secs ( 1.06 usr +  0.00 sys =  1.06 CPU) @ 355500.94/s (n=376831)
-          storable:  1 wallclock secs ( 1.12 usr +  0.00 sys =  1.12 CPU) @ 38399.11/s (n=43007)
-                     Rate storable     json       mp
-        storable  38399/s       --     -73%     -89%
-        json     141940/s     270%       --     -60%
-        mp       355501/s     826%     150%       --
-
-        -- deserialize
-        JSON::XS: 2.3
-        Data::MessagePack: 0.24
-        Storable: 2.21
-        Benchmark: running json, mp, storable for at least 1 CPU seconds...
-              json:  0 wallclock secs ( 1.05 usr +  0.00 sys =  1.05 CPU) @ 179442.86/s (n=188415)
-                mp:  0 wallclock secs ( 1.01 usr +  0.00 sys =  1.01 CPU) @ 212909.90/s (n=215039)
-          storable:  2 wallclock secs ( 1.14 usr +  0.00 sys =  1.14 CPU) @ 114974.56/s (n=131071)
-                     Rate storable     json       mp
-        storable 114975/s       --     -36%     -46%
-        json     179443/s      56%       --     -16%
-        mp       212910/s      85%      19%       --
-
-CAVEAT
-  Unpacking 64 bit integers
-    This module can unpack 64 bit integers even if your perl does not
-    support them (i.e. where "perl -V:ivsize" is 4), but you cannot
-    calculate these values unless you use "Math::BigInt".
-
-TODO
-    Error handling
-        MessagePack cannot deal with complex scalars such as object
-        references, filehandles, and code references. We should report the
-        errors more kindly.
-
-    Streaming deserializer
-        The current implementation of the streaming deserializer does not
-        have internal buffers while some other bindings (such as Ruby
-        binding) does. This limitation will astonish those who try to unpack
-        byte streams with an arbitrary buffer size (e.g.
-        "while(read($socket, $buffer, $arbitrary_buffer_size)) { ... }"). We
-        should implement the internal buffer for the unpacker.
-
-FAQ
-    Why does Data::MessagePack have pure perl implementations?
-        msgpack C library uses C99 feature, VC++6 does not support C99. So
-        pure perl version is needed for VC++ users.
-
-AUTHORS
-    Tokuhiro Matsuno
-
-    Makamaka Hannyaharamitu
-
-    gfx
-
-THANKS TO
-    Jun Kuriyama
-
-    Dan Kogai
-
-    FURUHASHI Sadayuki
-
-    hanekomu
-
-    Kazuho Oku
-
-    shohex
-
-LICENSE
-    This library is free software; you can redistribute it and/or modify it
-    under the same terms as Perl itself.
-
-SEE ALSO
-    <http://msgpack.org/> is the official web site for the MessagePack
-    format.
-
-    Data::MessagePack::Unpacker
-
-    AnyEvent::MPRPC
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e3a15d5
--- /dev/null
+++ b/README.md
@@ -0,0 +1,206 @@
+[![Build Status](https://travis-ci.org/msgpack/msgpack-perl.svg?branch=master)](https://travis-ci.org/msgpack/msgpack-perl)
+# NAME
+
+Data::MessagePack - MessagePack serializing/deserializing
+
+# SYNOPSIS
+
+    use Data::MessagePack;
+
+    my $mp = Data::MessagePack->new();
+    $mp->canonical->utf8->prefer_integer if $needed;
+
+    my $packed   = $mp->pack($dat);
+    my $unpacked = $mp->unpack($dat);
+
+# DESCRIPTION
+
+This module converts Perl data structures to MessagePack and vice versa.
+
+# ABOUT MESSAGEPACK FORMAT
+
+MessagePack is a binary-based efficient object serialization format.
+It enables to exchange structured objects between many languages like
+JSON.  But unlike JSON, it is very fast and small.
+
+## ADVANTAGES
+
+- PORTABLE
+
+    The MessagePack format does not depend on language nor byte order.
+
+- SMALL IN SIZE
+
+        say length(JSON::XS::encode_json({a=>1, b=>2}));   # => 13
+        say length(Storable::nfreeze({a=>1, b=>2}));       # => 21
+        say length(Data::MessagePack->pack({a=>1, b=>2})); # => 7
+
+    The MessagePack format saves memory than JSON and Storable format.
+
+- STREAMING DESERIALIZER
+
+    MessagePack supports streaming deserializer. It is useful for
+    networking such as RPC.  See [Data::MessagePack::Unpacker](https://metacpan.org/pod/Data%3A%3AMessagePack%3A%3AUnpacker) for
+    details.
+
+If you want to get more information about the MessagePack format,
+please visit to [http://msgpack.org/](http://msgpack.org/).
+
+# METHODS
+
+- `my $packed = Data::MessagePack->pack($data[, $max_depth]);`
+
+    Pack the $data to messagepack format string.
+
+    This method throws an exception when the perl structure is nested more
+    than $max\_depth levels(default: 512) in order to detect circular
+    references.
+
+    Data::MessagePack->pack() throws an exception when encountering a
+    blessed perl object, because MessagePack is a language-independent
+    format.
+
+- `my $unpacked = Data::MessagePack->unpack($msgpackstr);`
+
+    unpack the $msgpackstr to a MessagePack format string.
+
+- `my $mp = Data::MesssagePack->new()`
+
+    Creates a new MessagePack instance.
+
+- `$mp = $mp->prefer_integer([ $enable ])`
+- `$enabled = $mp->get_prefer_integer()`
+
+    If _$enable_ is true (or missing), then the `pack` method tries a
+    string as an integer if the string looks like an integer.
+
+- `$mp = $mp->canonical([ $enable ])`
+- `$enabled = $mp->get_canonical()`
+
+    If _$enable_ is true (or missing), then the `pack` method will output
+    packed data by sorting their keys. This is adding a comparatively high
+    overhead.
+
+- `$mp = $mp->utf8([ $enable ])`
+- `$enabled = $mp->get_utf8()`
+
+    If _$enable_ is true (or missing), then the `pack` method will
+    apply `utf8::encode()` to all the string values.
+
+    In other words, this property tell `$mp` to deal with **text strings**.
+    See [perlunifaq](https://metacpan.org/pod/perlunifaq) for the meaning of **text string**.
+
+- `$packed = $mp->pack($data)`
+- `$packed = $mp->encode($data)`
+
+    Same as `Data::MessagePack->pack()`, but properties are respected.
+
+- `$data = $mp->unpack($data)`
+- `$data = $mp->decode($data)`
+
+    Same as `Data::MessagePack->unpack()`, but properties are respected.
+
+# Configuration Variables (DEPRECATED)
+
+- $Data::MessagePack::PreferInteger
+
+    Packs a string as an integer, when it looks like an integer.
+
+    This variable is **deprecated**.
+    Use `$msgpack->prefer_integer` property instead.
+
+# SPEED
+
+This is a result of `benchmark/serialize.pl` and `benchmark/deserialize.pl`
+on my SC440(Linux 2.6.32-23-server #37-Ubuntu SMP).
+(You should benchmark them with **your** data if the speed matters, of course.)
+
+    -- serialize
+    JSON::XS: 2.3
+    Data::MessagePack: 0.24
+    Storable: 2.21
+    Benchmark: running json, mp, storable for at least 1 CPU seconds...
+          json:  1 wallclock secs ( 1.00 usr +  0.01 sys =  1.01 CPU) @ 141939.60/s (n=143359)
+            mp:  1 wallclock secs ( 1.06 usr +  0.00 sys =  1.06 CPU) @ 355500.94/s (n=376831)
+      storable:  1 wallclock secs ( 1.12 usr +  0.00 sys =  1.12 CPU) @ 38399.11/s (n=43007)
+                 Rate storable     json       mp
+    storable  38399/s       --     -73%     -89%
+    json     141940/s     270%       --     -60%
+    mp       355501/s     826%     150%       --
+
+    -- deserialize
+    JSON::XS: 2.3
+    Data::MessagePack: 0.24
+    Storable: 2.21
+    Benchmark: running json, mp, storable for at least 1 CPU seconds...
+          json:  0 wallclock secs ( 1.05 usr +  0.00 sys =  1.05 CPU) @ 179442.86/s (n=188415)
+            mp:  0 wallclock secs ( 1.01 usr +  0.00 sys =  1.01 CPU) @ 212909.90/s (n=215039)
+      storable:  2 wallclock secs ( 1.14 usr +  0.00 sys =  1.14 CPU) @ 114974.56/s (n=131071)
+                 Rate storable     json       mp
+    storable 114975/s       --     -36%     -46%
+    json     179443/s      56%       --     -16%
+    mp       212910/s      85%      19%       --
+
+# CAVEAT
+
+## Unpacking 64 bit integers
+
+This module can unpack 64 bit integers even if your perl does not support them
+(i.e. where `perl -V:ivsize` is 4), but you cannot calculate these values
+unless you use `Math::BigInt`.
+
+# TODO
+
+- Error handling
+
+    MessagePack cannot deal with complex scalars such as object references,
+    filehandles, and code references. We should report the errors more kindly.
+
+- Streaming deserializer
+
+    The current implementation of the streaming deserializer does not have internal
+    buffers while some other bindings (such as Ruby binding) does. This limitation
+    will astonish those who try to unpack byte streams with an arbitrary buffer size
+    (e.g. `while(read($socket, $buffer, $arbitrary_buffer_size)) { ... }`).
+    We should implement the internal buffer for the unpacker.
+
+# FAQ
+
+- Why does Data::MessagePack have pure perl implementations?
+
+    msgpack C library uses C99 feature, VC++6 does not support C99. So pure perl version is needed for VC++ users.
+
+# AUTHORS
+
+Tokuhiro Matsuno
+
+Makamaka Hannyaharamitu
+
+gfx
+
+# THANKS TO
+
+Jun Kuriyama
+
+Dan Kogai
+
+FURUHASHI Sadayuki
+
+hanekomu
+
+Kazuho Oku
+
+syohex
+
+# LICENSE
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+# SEE ALSO
+
+[http://msgpack.org/](http://msgpack.org/) is the official web site for the  MessagePack format.
+
+[Data::MessagePack::Unpacker](https://metacpan.org/pod/Data%3A%3AMessagePack%3A%3AUnpacker)
+
+[AnyEvent::MPRPC](https://metacpan.org/pod/AnyEvent%3A%3AMPRPC)
diff --git a/author/update-msgpack-c.pl b/author/update-msgpack-c.pl
new file mode 100644
index 0000000..02cee4b
--- /dev/null
+++ b/author/update-msgpack-c.pl
@@ -0,0 +1,52 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+
+use HTTP::Tiny;
+use IO::Socket::SSL;
+use Path::Tiny;
+
+use FindBin;
+chdir "$FindBin::Bin/..";
+
+my $version = shift or die "Usage: $0 VERSION\n";
+my $url = "https://github.com/msgpack/msgpack-c/releases/download/cpp-$version/msgpack-$version.tar.gz";
+
+my $tempdir = Path::Tiny->tempdir;
+
+warn "Downloading $url\n";
+my $res = HTTP::Tiny->new(veriry_SSL => 1)->mirror($url => "$tempdir/msgpack-$version.tar.gz");
+die "$res->{status} $res->{reason}, $url\n" if !$res->{success};
+
+warn "Unpacking msgpack-$version.tar.gz\n";
+!system "tar", "xf", "$tempdir/msgpack-$version.tar.gz", "-C", "$tempdir" or die;
+
+path($_)->remove_tree for grep -d, 'include', 't/std';
+
+warn "Copying include/*.h\n";
+path("$tempdir/msgpack-$version/include/msgpack")->visit(
+    sub {
+        my $path = shift;
+        return if !$path->is_file;
+        return if $path->stringify !~ /\.h$/;
+        my $relative = $path->relative("$tempdir/msgpack-$version");
+        $relative->parent->mkpath if !$relative->parent->exists;
+        $path->copy($relative);
+    },
+    { recurse => 1 },
+);
+
+warn "Copying test/*.mapc\n";
+path("t/std")->mkpath;
+path("$tempdir/msgpack-$version/test")->visit(
+    sub {
+        my $path = shift;
+        return if !$path->is_file;
+        return if $path->stringify !~ /\.mpac$/;
+        my $relative = $path->relative("$tempdir/msgpack-$version/test");
+        $path->copy("t/std/$relative");
+    },
+);
+
+warn "Writing include/msgpack-c-version\n";
+path("include/msgpack-c-version")->spew("$version\n");
diff --git a/builder/MyBuilder.pm b/builder/MyBuilder.pm
new file mode 100644
index 0000000..fd9fd90
--- /dev/null
+++ b/builder/MyBuilder.pm
@@ -0,0 +1,39 @@
+package builder::MyBuilder;
+use strict;
+use warnings;
+use base 'Module::Build::XSUtil';
+
+sub new {
+    my ($class, %args) = @_;
+
+    my $self = $class->SUPER::new(
+        %args,
+        c_source => ['xs-src'],
+        cc_warnings => 1,
+        generate_ppport_h => 'xs-src/ppport.h',
+        generate_xshelper_h => 'xs-src/xshelper.h',
+        include_dirs => ['include'],
+        needs_compiler_c99 => 1,
+        xs_files => { 'xs-src/MessagePack.xs' => 'lib/Data/MessagePack.xs' },
+    );
+    $self->c_source([]) if $self->pureperl_only; # for Module::Build 0.4224 or below
+    $self;
+}
+
+sub ACTION_test {
+    my $self = shift;
+
+    {
+        local $ENV{PERL_ONLY} = 1;
+        $self->log_info("pp tests\n");
+        $self->SUPER::ACTION_test(@_);
+    }
+
+    if (!$self->pureperl_only) {
+        local $ENV{PERL_DATA_MESSAGEPACK} = "xs";
+        $self->log_info("xs tests\n");
+        $self->SUPER::ACTION_test(@_);
+    }
+}
+
+1;
diff --git a/cpanfile b/cpanfile
new file mode 100644
index 0000000..285dfc6
--- /dev/null
+++ b/cpanfile
@@ -0,0 +1,17 @@
+requires 'perl', '5.008001';
+
+requires 'Math::BigInt', 1.89; # old versions of BigInt were broken
+
+on configure => sub {
+    requires 'Module::Build::XSUtil';
+    requires 'Devel::PPPort', '3.42';
+};
+
+on test => sub {
+    requires 'Test::More', '0.98';
+    requires 'Test::Requires';
+};
+
+on develop => sub {
+    requires 'Test::LeakTrace';
+};
diff --git a/include/msgpack-c-version b/include/msgpack-c-version
new file mode 100644
index 0000000..88c5fb8
--- /dev/null
+++ b/include/msgpack-c-version
@@ -0,0 +1 @@
+1.4.0
diff --git a/include/msgpack/fbuffer.h b/include/msgpack/fbuffer.h
new file mode 100644
index 0000000..d478008
--- /dev/null
+++ b/include/msgpack/fbuffer.h
@@ -0,0 +1,38 @@
+/*
+ * MessagePack for C FILE* buffer adaptor
+ *
+ * Copyright (C) 2013 Vladimir Volodko
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_FBUFFER_H
+#define MSGPACK_FBUFFER_H
+
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_fbuffer FILE* buffer
+ * @ingroup msgpack_buffer
+ * @{
+ */
+
+static inline int msgpack_fbuffer_write(void* data, const char* buf, size_t len)
+{
+    return (1 == fwrite(buf, len, 1, (FILE *)data)) ? 0 : -1;
+}
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/fbuffer.h */
diff --git a/include/msgpack/gcc_atomic.h b/include/msgpack/gcc_atomic.h
new file mode 100644
index 0000000..6b1b1a7
--- /dev/null
+++ b/include/msgpack/gcc_atomic.h
@@ -0,0 +1,25 @@
+/*
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef MSGPACK_GCC_ATOMIC_H
+#define MSGPACK_GCC_ATOMIC_H
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef int _msgpack_atomic_counter_t;
+
+int _msgpack_sync_decr_and_fetch(volatile _msgpack_atomic_counter_t* ptr);
+int _msgpack_sync_incr_and_fetch(volatile _msgpack_atomic_counter_t* ptr);
+
+
+#if defined(__cplusplus)
+}
+#endif
+
+
+#endif // MSGPACK_GCC_ATOMIC_H
diff --git a/include/msgpack/object.h b/include/msgpack/object.h
new file mode 100644
index 0000000..666f828
--- /dev/null
+++ b/include/msgpack/object.h
@@ -0,0 +1,111 @@
+/*
+ * MessagePack for C dynamic typing routine
+ *
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_OBJECT_H
+#define MSGPACK_OBJECT_H
+
+#include "zone.h"
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_object Dynamically typed object
+ * @ingroup msgpack
+ * @{
+ */
+
+typedef enum {
+    MSGPACK_OBJECT_NIL                  = 0x00,
+    MSGPACK_OBJECT_BOOLEAN              = 0x01,
+    MSGPACK_OBJECT_POSITIVE_INTEGER     = 0x02,
+    MSGPACK_OBJECT_NEGATIVE_INTEGER     = 0x03,
+    MSGPACK_OBJECT_FLOAT                = 0x04,
+#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
+    MSGPACK_OBJECT_DOUBLE               = MSGPACK_OBJECT_FLOAT, /* obsolete */
+#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
+    MSGPACK_OBJECT_STR                  = 0x05,
+    MSGPACK_OBJECT_ARRAY                = 0x06,
+    MSGPACK_OBJECT_MAP                  = 0x07,
+    MSGPACK_OBJECT_BIN                  = 0x08,
+    MSGPACK_OBJECT_EXT                  = 0x09
+} msgpack_object_type;
+
+
+struct msgpack_object;
+struct msgpack_object_kv;
+
+typedef struct {
+    uint32_t size;
+    struct msgpack_object* ptr;
+} msgpack_object_array;
+
+typedef struct {
+    uint32_t size;
+    struct msgpack_object_kv* ptr;
+} msgpack_object_map;
+
+typedef struct {
+    uint32_t size;
+    const char* ptr;
+} msgpack_object_str;
+
+typedef struct {
+    uint32_t size;
+    const char* ptr;
+} msgpack_object_bin;
+
+typedef struct {
+    int8_t type;
+    uint32_t size;
+    const char* ptr;
+} msgpack_object_ext;
+
+typedef union {
+    bool boolean;
+    uint64_t u64;
+    int64_t  i64;
+#if defined(MSGPACK_USE_LEGACY_NAME_AS_FLOAT)
+    double   dec; /* obsolete*/
+#endif /* MSGPACK_USE_LEGACY_NAME_AS_FLOAT */
+    double   f64;
+    msgpack_object_array array;
+    msgpack_object_map map;
+    msgpack_object_str str;
+    msgpack_object_bin bin;
+    msgpack_object_ext ext;
+} msgpack_object_union;
+
+typedef struct msgpack_object {
+    msgpack_object_type type;
+    msgpack_object_union via;
+} msgpack_object;
+
+typedef struct msgpack_object_kv {
+    msgpack_object key;
+    msgpack_object val;
+} msgpack_object_kv;
+
+MSGPACK_DLLEXPORT
+void msgpack_object_print(FILE* out, msgpack_object o);
+
+MSGPACK_DLLEXPORT
+bool msgpack_object_equal(const msgpack_object x, const msgpack_object y);
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/object.h */
diff --git a/include/msgpack/pack.h b/include/msgpack/pack.h
new file mode 100644
index 0000000..2c7120f
--- /dev/null
+++ b/include/msgpack/pack.h
@@ -0,0 +1,147 @@
+/*
+ * MessagePack for C packing routine
+ *
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_PACK_H
+#define MSGPACK_PACK_H
+
+#include "pack_define.h"
+#include "object.h"
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_buffer Buffers
+ * @ingroup msgpack
+ * @{
+ * @}
+ */
+
+/**
+ * @defgroup msgpack_pack Serializer
+ * @ingroup msgpack
+ * @{
+ */
+
+typedef int (*msgpack_packer_write)(void* data, const char* buf, size_t len);
+
+typedef struct msgpack_packer {
+    void* data;
+    msgpack_packer_write callback;
+} msgpack_packer;
+
+static void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback);
+
+static msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback);
+static void msgpack_packer_free(msgpack_packer* pk);
+
+static int msgpack_pack_char(msgpack_packer* pk, char d);
+
+static int msgpack_pack_signed_char(msgpack_packer* pk, signed char d);
+static int msgpack_pack_short(msgpack_packer* pk, short d);
+static int msgpack_pack_int(msgpack_packer* pk, int d);
+static int msgpack_pack_long(msgpack_packer* pk, long d);
+static int msgpack_pack_long_long(msgpack_packer* pk, long long d);
+static int msgpack_pack_unsigned_char(msgpack_packer* pk, unsigned char d);
+static int msgpack_pack_unsigned_short(msgpack_packer* pk, unsigned short d);
+static int msgpack_pack_unsigned_int(msgpack_packer* pk, unsigned int d);
+static int msgpack_pack_unsigned_long(msgpack_packer* pk, unsigned long d);
+static int msgpack_pack_unsigned_long_long(msgpack_packer* pk, unsigned long long d);
+
+static int msgpack_pack_uint8(msgpack_packer* pk, uint8_t d);
+static int msgpack_pack_uint16(msgpack_packer* pk, uint16_t d);
+static int msgpack_pack_uint32(msgpack_packer* pk, uint32_t d);
+static int msgpack_pack_uint64(msgpack_packer* pk, uint64_t d);
+static int msgpack_pack_int8(msgpack_packer* pk, int8_t d);
+static int msgpack_pack_int16(msgpack_packer* pk, int16_t d);
+static int msgpack_pack_int32(msgpack_packer* pk, int32_t d);
+static int msgpack_pack_int64(msgpack_packer* pk, int64_t d);
+
+static int msgpack_pack_fix_uint8(msgpack_packer* pk, uint8_t d);
+static int msgpack_pack_fix_uint16(msgpack_packer* pk, uint16_t d);
+static int msgpack_pack_fix_uint32(msgpack_packer* pk, uint32_t d);
+static int msgpack_pack_fix_uint64(msgpack_packer* pk, uint64_t d);
+static int msgpack_pack_fix_int8(msgpack_packer* pk, int8_t d);
+static int msgpack_pack_fix_int16(msgpack_packer* pk, int16_t d);
+static int msgpack_pack_fix_int32(msgpack_packer* pk, int32_t d);
+static int msgpack_pack_fix_int64(msgpack_packer* pk, int64_t d);
+
+static int msgpack_pack_float(msgpack_packer* pk, float d);
+static int msgpack_pack_double(msgpack_packer* pk, double d);
+
+static int msgpack_pack_nil(msgpack_packer* pk);
+static int msgpack_pack_true(msgpack_packer* pk);
+static int msgpack_pack_false(msgpack_packer* pk);
+
+static int msgpack_pack_array(msgpack_packer* pk, size_t n);
+
+static int msgpack_pack_map(msgpack_packer* pk, size_t n);
+
+static int msgpack_pack_str(msgpack_packer* pk, size_t l);
+static int msgpack_pack_str_body(msgpack_packer* pk, const void* b, size_t l);
+
+static int msgpack_pack_v4raw(msgpack_packer* pk, size_t l);
+static int msgpack_pack_v4raw_body(msgpack_packer* pk, const void* b, size_t l);
+
+static int msgpack_pack_bin(msgpack_packer* pk, size_t l);
+static int msgpack_pack_bin_body(msgpack_packer* pk, const void* b, size_t l);
+
+static int msgpack_pack_ext(msgpack_packer* pk, size_t l, int8_t type);
+static int msgpack_pack_ext_body(msgpack_packer* pk, const void* b, size_t l);
+
+int msgpack_pack_object(msgpack_packer* pk, msgpack_object d);
+
+
+/** @} */
+
+
+#define msgpack_pack_inline_func(name) \
+    inline int msgpack_pack ## name
+
+#define msgpack_pack_inline_func_cint(name) \
+    inline int msgpack_pack ## name
+
+#define msgpack_pack_inline_func_fixint(name) \
+    inline int msgpack_pack_fix ## name
+
+#define msgpack_pack_user msgpack_packer*
+
+#define msgpack_pack_append_buffer(user, buf, len) \
+    return (*(user)->callback)((user)->data, (const char*)buf, len)
+
+#include "pack_template.h"
+
+inline void msgpack_packer_init(msgpack_packer* pk, void* data, msgpack_packer_write callback)
+{
+    pk->data = data;
+    pk->callback = callback;
+}
+
+inline msgpack_packer* msgpack_packer_new(void* data, msgpack_packer_write callback)
+{
+    msgpack_packer* pk = (msgpack_packer*)calloc(1, sizeof(msgpack_packer));
+    if(!pk) { return NULL; }
+    msgpack_packer_init(pk, data, callback);
+    return pk;
+}
+
+inline void msgpack_packer_free(msgpack_packer* pk)
+{
+    free(pk);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/pack.h */
diff --git a/include/msgpack/pack_define.h b/include/msgpack/pack_define.h
new file mode 100644
index 0000000..ce98b67
--- /dev/null
+++ b/include/msgpack/pack_define.h
@@ -0,0 +1,18 @@
+/*
+ * MessagePack unpacking routine template
+ *
+ * Copyright (C) 2008-2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_PACK_DEFINE_H
+#define MSGPACK_PACK_DEFINE_H
+
+#include "msgpack/sysdep.h"
+#include <limits.h>
+#include <string.h>
+
+#endif /* msgpack/pack_define.h */
+
diff --git a/include/msgpack/pack_template.h b/include/msgpack/pack_template.h
new file mode 100644
index 0000000..17abb52
--- /dev/null
+++ b/include/msgpack/pack_template.h
@@ -0,0 +1,909 @@
+/*
+ * MessagePack packing routine template
+ *
+ * Copyright (C) 2008-2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#if MSGPACK_ENDIAN_LITTLE_BYTE
+#define TAKE8_8(d)  ((uint8_t*)&d)[0]
+#define TAKE8_16(d) ((uint8_t*)&d)[0]
+#define TAKE8_32(d) ((uint8_t*)&d)[0]
+#define TAKE8_64(d) ((uint8_t*)&d)[0]
+#elif MSGPACK_ENDIAN_BIG_BYTE
+#define TAKE8_8(d)  ((uint8_t*)&d)[0]
+#define TAKE8_16(d) ((uint8_t*)&d)[1]
+#define TAKE8_32(d) ((uint8_t*)&d)[3]
+#define TAKE8_64(d) ((uint8_t*)&d)[7]
+#else
+#error msgpack-c supports only big endian and little endian
+#endif
+
+#ifndef msgpack_pack_inline_func
+#error msgpack_pack_inline_func template is not defined
+#endif
+
+#ifndef msgpack_pack_user
+#error msgpack_pack_user type is not defined
+#endif
+
+#ifndef msgpack_pack_append_buffer
+#error msgpack_pack_append_buffer callback is not defined
+#endif
+
+
+/*
+ * Integer
+ */
+
+#define msgpack_pack_real_uint8(x, d) \
+do { \
+    if(d < (1<<7)) { \
+        /* fixnum */ \
+        msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \
+    } else { \
+        /* unsigned 8 */ \
+        unsigned char buf[2] = {0xcc, TAKE8_8(d)}; \
+        msgpack_pack_append_buffer(x, buf, 2); \
+    } \
+} while(0)
+
+#define msgpack_pack_real_uint16(x, d) \
+do { \
+    if(d < (1<<7)) { \
+        /* fixnum */ \
+        msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \
+    } else if(d < (1<<8)) { \
+        /* unsigned 8 */ \
+        unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \
+        msgpack_pack_append_buffer(x, buf, 2); \
+    } else { \
+        /* unsigned 16 */ \
+        unsigned char buf[3]; \
+        buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
+        msgpack_pack_append_buffer(x, buf, 3); \
+    } \
+} while(0)
+
+#define msgpack_pack_real_uint32(x, d) \
+do { \
+    if(d < (1<<8)) { \
+        if(d < (1<<7)) { \
+            /* fixnum */ \
+            msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \
+        } else { \
+            /* unsigned 8 */ \
+            unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \
+            msgpack_pack_append_buffer(x, buf, 2); \
+        } \
+    } else { \
+        if(d < (1<<16)) { \
+            /* unsigned 16 */ \
+            unsigned char buf[3]; \
+            buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
+            msgpack_pack_append_buffer(x, buf, 3); \
+        } else { \
+            /* unsigned 32 */ \
+            unsigned char buf[5]; \
+            buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
+            msgpack_pack_append_buffer(x, buf, 5); \
+        } \
+    } \
+} while(0)
+
+#define msgpack_pack_real_uint64(x, d) \
+do { \
+    if(d < (1ULL<<8)) { \
+        if(d < (1ULL<<7)) { \
+            /* fixnum */ \
+            msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \
+        } else { \
+            /* unsigned 8 */ \
+            unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \
+            msgpack_pack_append_buffer(x, buf, 2); \
+        } \
+    } else { \
+        if(d < (1ULL<<16)) { \
+            /* unsigned 16 */ \
+            unsigned char buf[3]; \
+            buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
+            msgpack_pack_append_buffer(x, buf, 3); \
+        } else if(d < (1ULL<<32)) { \
+            /* unsigned 32 */ \
+            unsigned char buf[5]; \
+            buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
+            msgpack_pack_append_buffer(x, buf, 5); \
+        } else { \
+            /* unsigned 64 */ \
+            unsigned char buf[9]; \
+            buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
+            msgpack_pack_append_buffer(x, buf, 9); \
+        } \
+    } \
+} while(0)
+
+#define msgpack_pack_real_int8(x, d) \
+do { \
+    if(d < -(1<<5)) { \
+        /* signed 8 */ \
+        unsigned char buf[2] = {0xd0, TAKE8_8(d)}; \
+        msgpack_pack_append_buffer(x, buf, 2); \
+    } else { \
+        /* fixnum */ \
+        msgpack_pack_append_buffer(x, &TAKE8_8(d), 1); \
+    } \
+} while(0)
+
+#define msgpack_pack_real_int16(x, d) \
+do { \
+    if(d < -(1<<5)) { \
+        if(d < -(1<<7)) { \
+            /* signed 16 */ \
+            unsigned char buf[3]; \
+            buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
+            msgpack_pack_append_buffer(x, buf, 3); \
+        } else { \
+            /* signed 8 */ \
+            unsigned char buf[2] = {0xd0, TAKE8_16(d)}; \
+            msgpack_pack_append_buffer(x, buf, 2); \
+        } \
+    } else if(d < (1<<7)) { \
+        /* fixnum */ \
+        msgpack_pack_append_buffer(x, &TAKE8_16(d), 1); \
+    } else { \
+        if(d < (1<<8)) { \
+            /* unsigned 8 */ \
+            unsigned char buf[2] = {0xcc, TAKE8_16(d)}; \
+            msgpack_pack_append_buffer(x, buf, 2); \
+        } else { \
+            /* unsigned 16 */ \
+            unsigned char buf[3]; \
+            buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
+            msgpack_pack_append_buffer(x, buf, 3); \
+        } \
+    } \
+} while(0)
+
+#define msgpack_pack_real_int32(x, d) \
+do { \
+    if(d < -(1<<5)) { \
+        if(d < -(1<<15)) { \
+            /* signed 32 */ \
+            unsigned char buf[5]; \
+            buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
+            msgpack_pack_append_buffer(x, buf, 5); \
+        } else if(d < -(1<<7)) { \
+            /* signed 16 */ \
+            unsigned char buf[3]; \
+            buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
+            msgpack_pack_append_buffer(x, buf, 3); \
+        } else { \
+            /* signed 8 */ \
+            unsigned char buf[2] = {0xd0, TAKE8_32(d)}; \
+            msgpack_pack_append_buffer(x, buf, 2); \
+        } \
+    } else if(d < (1<<7)) { \
+        /* fixnum */ \
+        msgpack_pack_append_buffer(x, &TAKE8_32(d), 1); \
+    } else { \
+        if(d < (1<<8)) { \
+            /* unsigned 8 */ \
+            unsigned char buf[2] = {0xcc, TAKE8_32(d)}; \
+            msgpack_pack_append_buffer(x, buf, 2); \
+        } else if(d < (1<<16)) { \
+            /* unsigned 16 */ \
+            unsigned char buf[3]; \
+            buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
+            msgpack_pack_append_buffer(x, buf, 3); \
+        } else { \
+            /* unsigned 32 */ \
+            unsigned char buf[5]; \
+            buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
+            msgpack_pack_append_buffer(x, buf, 5); \
+        } \
+    } \
+} while(0)
+
+#define msgpack_pack_real_int64(x, d) \
+do { \
+    if(d < -(1LL<<5)) { \
+        if(d < -(1LL<<15)) { \
+            if(d < -(1LL<<31)) { \
+                /* signed 64 */ \
+                unsigned char buf[9]; \
+                buf[0] = 0xd3; _msgpack_store64(&buf[1], d); \
+                msgpack_pack_append_buffer(x, buf, 9); \
+            } else { \
+                /* signed 32 */ \
+                unsigned char buf[5]; \
+                buf[0] = 0xd2; _msgpack_store32(&buf[1], (int32_t)d); \
+                msgpack_pack_append_buffer(x, buf, 5); \
+            } \
+        } else { \
+            if(d < -(1<<7)) { \
+                /* signed 16 */ \
+                unsigned char buf[3]; \
+                buf[0] = 0xd1; _msgpack_store16(&buf[1], (int16_t)d); \
+                msgpack_pack_append_buffer(x, buf, 3); \
+            } else { \
+                /* signed 8 */ \
+                unsigned char buf[2] = {0xd0, TAKE8_64(d)}; \
+                msgpack_pack_append_buffer(x, buf, 2); \
+            } \
+        } \
+    } else if(d < (1<<7)) { \
+        /* fixnum */ \
+        msgpack_pack_append_buffer(x, &TAKE8_64(d), 1); \
+    } else { \
+        if(d < (1LL<<16)) { \
+            if(d < (1<<8)) { \
+                /* unsigned 8 */ \
+                unsigned char buf[2] = {0xcc, TAKE8_64(d)}; \
+                msgpack_pack_append_buffer(x, buf, 2); \
+            } else { \
+                /* unsigned 16 */ \
+                unsigned char buf[3]; \
+                buf[0] = 0xcd; _msgpack_store16(&buf[1], (uint16_t)d); \
+                msgpack_pack_append_buffer(x, buf, 3); \
+            } \
+        } else { \
+            if(d < (1LL<<32)) { \
+                /* unsigned 32 */ \
+                unsigned char buf[5]; \
+                buf[0] = 0xce; _msgpack_store32(&buf[1], (uint32_t)d); \
+                msgpack_pack_append_buffer(x, buf, 5); \
+            } else { \
+                /* unsigned 64 */ \
+                unsigned char buf[9]; \
+                buf[0] = 0xcf; _msgpack_store64(&buf[1], d); \
+                msgpack_pack_append_buffer(x, buf, 9); \
+            } \
+        } \
+    } \
+} while(0)
+
+
+#ifdef msgpack_pack_inline_func_fixint
+
+msgpack_pack_inline_func_fixint(_uint8)(msgpack_pack_user x, uint8_t d)
+{
+    unsigned char buf[2] = {0xcc, TAKE8_8(d)};
+    msgpack_pack_append_buffer(x, buf, 2);
+}
+
+msgpack_pack_inline_func_fixint(_uint16)(msgpack_pack_user x, uint16_t d)
+{
+    unsigned char buf[3];
+    buf[0] = 0xcd; _msgpack_store16(&buf[1], d);
+    msgpack_pack_append_buffer(x, buf, 3);
+}
+
+msgpack_pack_inline_func_fixint(_uint32)(msgpack_pack_user x, uint32_t d)
+{
+    unsigned char buf[5];
+    buf[0] = 0xce; _msgpack_store32(&buf[1], d);
+    msgpack_pack_append_buffer(x, buf, 5);
+}
+
+msgpack_pack_inline_func_fixint(_uint64)(msgpack_pack_user x, uint64_t d)
+{
+    unsigned char buf[9];
+    buf[0] = 0xcf; _msgpack_store64(&buf[1], d);
+    msgpack_pack_append_buffer(x, buf, 9);
+}
+
+msgpack_pack_inline_func_fixint(_int8)(msgpack_pack_user x, int8_t d)
+{
+    unsigned char buf[2] = {0xd0, TAKE8_8(d)};
+    msgpack_pack_append_buffer(x, buf, 2);
+}
+
+msgpack_pack_inline_func_fixint(_int16)(msgpack_pack_user x, int16_t d)
+{
+    unsigned char buf[3];
+    buf[0] = 0xd1; _msgpack_store16(&buf[1], d);
+    msgpack_pack_append_buffer(x, buf, 3);
+}
+
+msgpack_pack_inline_func_fixint(_int32)(msgpack_pack_user x, int32_t d)
+{
+    unsigned char buf[5];
+    buf[0] = 0xd2; _msgpack_store32(&buf[1], d);
+    msgpack_pack_append_buffer(x, buf, 5);
+}
+
+msgpack_pack_inline_func_fixint(_int64)(msgpack_pack_user x, int64_t d)
+{
+    unsigned char buf[9];
+    buf[0] = 0xd3; _msgpack_store64(&buf[1], d);
+    msgpack_pack_append_buffer(x, buf, 9);
+}
+
+#undef msgpack_pack_inline_func_fixint
+#endif
+
+
+msgpack_pack_inline_func(_uint8)(msgpack_pack_user x, uint8_t d)
+{
+    msgpack_pack_real_uint8(x, d);
+}
+
+msgpack_pack_inline_func(_uint16)(msgpack_pack_user x, uint16_t d)
+{
+    msgpack_pack_real_uint16(x, d);
+}
+
+msgpack_pack_inline_func(_uint32)(msgpack_pack_user x, uint32_t d)
+{
+    msgpack_pack_real_uint32(x, d);
+}
+
+msgpack_pack_inline_func(_uint64)(msgpack_pack_user x, uint64_t d)
+{
+    msgpack_pack_real_uint64(x, d);
+}
+
+msgpack_pack_inline_func(_int8)(msgpack_pack_user x, int8_t d)
+{
+    msgpack_pack_real_int8(x, d);
+}
+
+msgpack_pack_inline_func(_int16)(msgpack_pack_user x, int16_t d)
+{
+    msgpack_pack_real_int16(x, d);
+}
+
+msgpack_pack_inline_func(_int32)(msgpack_pack_user x, int32_t d)
+{
+    msgpack_pack_real_int32(x, d);
+}
+
+msgpack_pack_inline_func(_int64)(msgpack_pack_user x, int64_t d)
+{
+    msgpack_pack_real_int64(x, d);
+}
+
+msgpack_pack_inline_func(_char)(msgpack_pack_user x, char d)
+{
+#if defined(CHAR_MIN)
+#if CHAR_MIN < 0
+        msgpack_pack_real_int8(x, d);
+#else
+        msgpack_pack_real_uint8(x, d);
+#endif
+#else
+#error CHAR_MIN is not defined
+#endif
+}
+
+msgpack_pack_inline_func(_signed_char)(msgpack_pack_user x, signed char d)
+{
+    msgpack_pack_real_int8(x, d);
+}
+
+msgpack_pack_inline_func(_unsigned_char)(msgpack_pack_user x, unsigned char d)
+{
+    msgpack_pack_real_uint8(x, d);
+}
+
+#ifdef msgpack_pack_inline_func_cint
+
+msgpack_pack_inline_func_cint(_short)(msgpack_pack_user x, short d)
+{
+#if defined(SIZEOF_SHORT)
+#if SIZEOF_SHORT == 2
+    msgpack_pack_real_int16(x, d);
+#elif SIZEOF_SHORT == 4
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#elif defined(SHRT_MAX)
+#if SHRT_MAX == 0x7fff
+    msgpack_pack_real_int16(x, d);
+#elif SHRT_MAX == 0x7fffffff
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#else
+if(sizeof(short) == 2) {
+    msgpack_pack_real_int16(x, d);
+} else if(sizeof(short) == 4) {
+    msgpack_pack_real_int32(x, d);
+} else {
+    msgpack_pack_real_int64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_int)(msgpack_pack_user x, int d)
+{
+#if defined(SIZEOF_INT)
+#if SIZEOF_INT == 2
+    msgpack_pack_real_int16(x, d);
+#elif SIZEOF_INT == 4
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#elif defined(INT_MAX)
+#if INT_MAX == 0x7fff
+    msgpack_pack_real_int16(x, d);
+#elif INT_MAX == 0x7fffffff
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#else
+if(sizeof(int) == 2) {
+    msgpack_pack_real_int16(x, d);
+} else if(sizeof(int) == 4) {
+    msgpack_pack_real_int32(x, d);
+} else {
+    msgpack_pack_real_int64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_long)(msgpack_pack_user x, long d)
+{
+#if defined(SIZEOF_LONG)
+#if SIZEOF_LONG == 2
+    msgpack_pack_real_int16(x, d);
+#elif SIZEOF_LONG == 4
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#elif defined(LONG_MAX)
+#if LONG_MAX == 0x7fffL
+    msgpack_pack_real_int16(x, d);
+#elif LONG_MAX == 0x7fffffffL
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#else
+if(sizeof(long) == 2) {
+    msgpack_pack_real_int16(x, d);
+} else if(sizeof(long) == 4) {
+    msgpack_pack_real_int32(x, d);
+} else {
+    msgpack_pack_real_int64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_long_long)(msgpack_pack_user x, long long d)
+{
+#if defined(SIZEOF_LONG_LONG)
+#if SIZEOF_LONG_LONG == 2
+    msgpack_pack_real_int16(x, d);
+#elif SIZEOF_LONG_LONG == 4
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#elif defined(LLONG_MAX)
+#if LLONG_MAX == 0x7fffL
+    msgpack_pack_real_int16(x, d);
+#elif LLONG_MAX == 0x7fffffffL
+    msgpack_pack_real_int32(x, d);
+#else
+    msgpack_pack_real_int64(x, d);
+#endif
+
+#else
+if(sizeof(long long) == 2) {
+    msgpack_pack_real_int16(x, d);
+} else if(sizeof(long long) == 4) {
+    msgpack_pack_real_int32(x, d);
+} else {
+    msgpack_pack_real_int64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_unsigned_short)(msgpack_pack_user x, unsigned short d)
+{
+#if defined(SIZEOF_SHORT)
+#if SIZEOF_SHORT == 2
+    msgpack_pack_real_uint16(x, d);
+#elif SIZEOF_SHORT == 4
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#elif defined(USHRT_MAX)
+#if USHRT_MAX == 0xffffU
+    msgpack_pack_real_uint16(x, d);
+#elif USHRT_MAX == 0xffffffffU
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#else
+if(sizeof(unsigned short) == 2) {
+    msgpack_pack_real_uint16(x, d);
+} else if(sizeof(unsigned short) == 4) {
+    msgpack_pack_real_uint32(x, d);
+} else {
+    msgpack_pack_real_uint64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_unsigned_int)(msgpack_pack_user x, unsigned int d)
+{
+#if defined(SIZEOF_INT)
+#if SIZEOF_INT == 2
+    msgpack_pack_real_uint16(x, d);
+#elif SIZEOF_INT == 4
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#elif defined(UINT_MAX)
+#if UINT_MAX == 0xffffU
+    msgpack_pack_real_uint16(x, d);
+#elif UINT_MAX == 0xffffffffU
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#else
+if(sizeof(unsigned int) == 2) {
+    msgpack_pack_real_uint16(x, d);
+} else if(sizeof(unsigned int) == 4) {
+    msgpack_pack_real_uint32(x, d);
+} else {
+    msgpack_pack_real_uint64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_unsigned_long)(msgpack_pack_user x, unsigned long d)
+{
+#if defined(SIZEOF_LONG)
+#if SIZEOF_LONG == 2
+    msgpack_pack_real_uint16(x, d);
+#elif SIZEOF_LONG == 4
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#elif defined(ULONG_MAX)
+#if ULONG_MAX == 0xffffUL
+    msgpack_pack_real_uint16(x, d);
+#elif ULONG_MAX == 0xffffffffUL
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#else
+if(sizeof(unsigned long) == 2) {
+    msgpack_pack_real_uint16(x, d);
+} else if(sizeof(unsigned long) == 4) {
+    msgpack_pack_real_uint32(x, d);
+} else {
+    msgpack_pack_real_uint64(x, d);
+}
+#endif
+}
+
+msgpack_pack_inline_func_cint(_unsigned_long_long)(msgpack_pack_user x, unsigned long long d)
+{
+#if defined(SIZEOF_LONG_LONG)
+#if SIZEOF_LONG_LONG == 2
+    msgpack_pack_real_uint16(x, d);
+#elif SIZEOF_LONG_LONG == 4
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#elif defined(ULLONG_MAX)
+#if ULLONG_MAX == 0xffffUL
+    msgpack_pack_real_uint16(x, d);
+#elif ULLONG_MAX == 0xffffffffUL
+    msgpack_pack_real_uint32(x, d);
+#else
+    msgpack_pack_real_uint64(x, d);
+#endif
+
+#else
+if(sizeof(unsigned long long) == 2) {
+    msgpack_pack_real_uint16(x, d);
+} else if(sizeof(unsigned long long) == 4) {
+    msgpack_pack_real_uint32(x, d);
+} else {
+    msgpack_pack_real_uint64(x, d);
+}
+#endif
+}
+
+#undef msgpack_pack_inline_func_cint
+#endif
+
+
+
+/*
+ * Float
+ */
+
+msgpack_pack_inline_func(_float)(msgpack_pack_user x, float d)
+{
+    unsigned char buf[5];
+    union { float f; uint32_t i; } mem;
+    mem.f = d;
+    buf[0] = 0xca; _msgpack_store32(&buf[1], mem.i);
+    msgpack_pack_append_buffer(x, buf, 5);
+}
+
+msgpack_pack_inline_func(_double)(msgpack_pack_user x, double d)
+{
+    unsigned char buf[9];
+    union { double f; uint64_t i; } mem;
+    mem.f = d;
+    buf[0] = 0xcb;
+#if defined(TARGET_OS_IPHONE)
+    // ok
+#elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
+    // https://github.com/msgpack/msgpack-perl/pull/1
+    mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
+#endif
+    _msgpack_store64(&buf[1], mem.i);
+    msgpack_pack_append_buffer(x, buf, 9);
+}
+
+
+/*
+ * Nil
+ */
+
+msgpack_pack_inline_func(_nil)(msgpack_pack_user x)
+{
+    static const unsigned char d = 0xc0;
+    msgpack_pack_append_buffer(x, &d, 1);
+}
+
+
+/*
+ * Boolean
+ */
+
+msgpack_pack_inline_func(_true)(msgpack_pack_user x)
+{
+    static const unsigned char d = 0xc3;
+    msgpack_pack_append_buffer(x, &d, 1);
+}
+
+msgpack_pack_inline_func(_false)(msgpack_pack_user x)
+{
+    static const unsigned char d = 0xc2;
+    msgpack_pack_append_buffer(x, &d, 1);
+}
+
+
+/*
+ * Array
+ */
+
+msgpack_pack_inline_func(_array)(msgpack_pack_user x, size_t n)
+{
+    if(n < 16) {
+        unsigned char d = 0x90 | (uint8_t)n;
+        msgpack_pack_append_buffer(x, &d, 1);
+    } else if(n < 65536) {
+        unsigned char buf[3];
+        buf[0] = 0xdc; _msgpack_store16(&buf[1], (uint16_t)n);
+        msgpack_pack_append_buffer(x, buf, 3);
+    } else {
+        unsigned char buf[5];
+        buf[0] = 0xdd; _msgpack_store32(&buf[1], (uint32_t)n);
+        msgpack_pack_append_buffer(x, buf, 5);
+    }
+}
+
+
+/*
+ * Map
+ */
+
+msgpack_pack_inline_func(_map)(msgpack_pack_user x, size_t n)
+{
+    if(n < 16) {
+        unsigned char d = 0x80 | (uint8_t)n;
+        msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
+    } else if(n < 65536) {
+        unsigned char buf[3];
+        buf[0] = 0xde; _msgpack_store16(&buf[1], (uint16_t)n);
+        msgpack_pack_append_buffer(x, buf, 3);
+    } else {
+        unsigned char buf[5];
+        buf[0] = 0xdf; _msgpack_store32(&buf[1], (uint32_t)n);
+        msgpack_pack_append_buffer(x, buf, 5);
+    }
+}
+
+
+/*
+ * Str
+ */
+
+msgpack_pack_inline_func(_str)(msgpack_pack_user x, size_t l)
+{
+    if(l < 32) {
+        unsigned char d = 0xa0 | (uint8_t)l;
+        msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
+    } else if(l < 256) {
+        unsigned char buf[2];
+        buf[0] = 0xd9; buf[1] = (uint8_t)l;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } else if(l < 65536) {
+        unsigned char buf[3];
+        buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
+        msgpack_pack_append_buffer(x, buf, 3);
+    } else {
+        unsigned char buf[5];
+        buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
+        msgpack_pack_append_buffer(x, buf, 5);
+    }
+}
+
+msgpack_pack_inline_func(_str_body)(msgpack_pack_user x, const void* b, size_t l)
+{
+    msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
+}
+
+/*
+ * Raw (V4)
+ */
+
+msgpack_pack_inline_func(_v4raw)(msgpack_pack_user x, size_t l)
+{
+    if(l < 32) {
+        unsigned char d = 0xa0 | (uint8_t)l;
+        msgpack_pack_append_buffer(x, &TAKE8_8(d), 1);
+    } else if(l < 65536) {
+        unsigned char buf[3];
+        buf[0] = 0xda; _msgpack_store16(&buf[1], (uint16_t)l);
+        msgpack_pack_append_buffer(x, buf, 3);
+    } else {
+        unsigned char buf[5];
+        buf[0] = 0xdb; _msgpack_store32(&buf[1], (uint32_t)l);
+        msgpack_pack_append_buffer(x, buf, 5);
+    }
+}
+
+msgpack_pack_inline_func(_v4raw_body)(msgpack_pack_user x, const void* b, size_t l)
+{
+    msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
+}
+
+/*
+ * Bin
+ */
+
+msgpack_pack_inline_func(_bin)(msgpack_pack_user x, size_t l)
+{
+    if(l < 256) {
+        unsigned char buf[2];
+        buf[0] = 0xc4; buf[1] = (uint8_t)l;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } else if(l < 65536) {
+        unsigned char buf[3];
+        buf[0] = 0xc5; _msgpack_store16(&buf[1], (uint16_t)l);
+        msgpack_pack_append_buffer(x, buf, 3);
+    } else {
+        unsigned char buf[5];
+        buf[0] = 0xc6; _msgpack_store32(&buf[1], (uint32_t)l);
+        msgpack_pack_append_buffer(x, buf, 5);
+    }
+}
+
+msgpack_pack_inline_func(_bin_body)(msgpack_pack_user x, const void* b, size_t l)
+{
+    msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
+}
+
+/*
+ * Ext
+ */
+
+msgpack_pack_inline_func(_ext)(msgpack_pack_user x, size_t l, int8_t type)
+{
+    switch(l) {
+    case 1: {
+        unsigned char buf[2];
+        buf[0] = 0xd4;
+        buf[1] = type;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } break;
+    case 2: {
+        unsigned char buf[2];
+        buf[0] = 0xd5;
+        buf[1] = type;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } break;
+    case 4: {
+        unsigned char buf[2];
+        buf[0] = 0xd6;
+        buf[1] = type;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } break;
+    case 8: {
+        unsigned char buf[2];
+        buf[0] = 0xd7;
+        buf[1] = type;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } break;
+    case 16: {
+        unsigned char buf[2];
+        buf[0] = 0xd8;
+        buf[1] = type;
+        msgpack_pack_append_buffer(x, buf, 2);
+    } break;
+    default:
+        if(l < 256) {
+            unsigned char buf[3];
+            buf[0] = 0xc7;
+            buf[1] = (unsigned char)l;
+            buf[2] = type;
+            msgpack_pack_append_buffer(x, buf, 3);
+        } else if(l < 65536) {
+            unsigned char buf[4];
+            buf[0] = 0xc8;
+            _msgpack_store16(&buf[1], l);
+            buf[3] = type;
+            msgpack_pack_append_buffer(x, buf, 4);
+        } else {
+            unsigned char buf[6];
+            buf[0] = 0xc9;
+            _msgpack_store32(&buf[1], l);
+            buf[5] = type;
+            msgpack_pack_append_buffer(x, buf, 6);
+        }
+        break;
+    }
+}
+
+msgpack_pack_inline_func(_ext_body)(msgpack_pack_user x, const void* b, size_t l)
+{
+    msgpack_pack_append_buffer(x, (const unsigned char*)b, l);
+}
+
+#undef msgpack_pack_inline_func
+#undef msgpack_pack_user
+#undef msgpack_pack_append_buffer
+
+#undef TAKE8_8
+#undef TAKE8_16
+#undef TAKE8_32
+#undef TAKE8_64
+
+#undef msgpack_pack_real_uint8
+#undef msgpack_pack_real_uint16
+#undef msgpack_pack_real_uint32
+#undef msgpack_pack_real_uint64
+#undef msgpack_pack_real_int8
+#undef msgpack_pack_real_int16
+#undef msgpack_pack_real_int32
+#undef msgpack_pack_real_int64
diff --git a/include/msgpack/predef.h b/include/msgpack/predef.h
new file mode 100644
index 0000000..e53ceac
--- /dev/null
+++ b/include/msgpack/predef.h
@@ -0,0 +1,19 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_H
+#define MSGPACK_PREDEF_H
+
+#include <msgpack/predef/language.h>
+#include <msgpack/predef/architecture.h>
+#include <msgpack/predef/compiler.h>
+#include <msgpack/predef/library.h>
+#include <msgpack/predef/os.h>
+#include <msgpack/predef/other.h>
+#include <msgpack/predef/platform.h>
+
+#endif
diff --git a/include/msgpack/predef/architecture.h b/include/msgpack/predef/architecture.h
new file mode 100644
index 0000000..dc9a5a5
--- /dev/null
+++ b/include/msgpack/predef/architecture.h
@@ -0,0 +1,30 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_H
+#define MSGPACK_PREDEF_ARCHITECTURE_H
+
+#include <msgpack/predef/architecture/alpha.h>
+#include <msgpack/predef/architecture/arm.h>
+#include <msgpack/predef/architecture/blackfin.h>
+#include <msgpack/predef/architecture/convex.h>
+#include <msgpack/predef/architecture/ia64.h>
+#include <msgpack/predef/architecture/m68k.h>
+#include <msgpack/predef/architecture/mips.h>
+#include <msgpack/predef/architecture/parisc.h>
+#include <msgpack/predef/architecture/ppc.h>
+#include <msgpack/predef/architecture/pyramid.h>
+#include <msgpack/predef/architecture/rs6k.h>
+#include <msgpack/predef/architecture/sparc.h>
+#include <msgpack/predef/architecture/superh.h>
+#include <msgpack/predef/architecture/sys370.h>
+#include <msgpack/predef/architecture/sys390.h>
+#include <msgpack/predef/architecture/x86.h>
+#include <msgpack/predef/architecture/z.h>
+/*#include <msgpack/predef/architecture/.h>*/
+
+#endif
diff --git a/include/msgpack/predef/architecture/alpha.h b/include/msgpack/predef/architecture/alpha.h
new file mode 100644
index 0000000..9fe469c
--- /dev/null
+++ b/include/msgpack/predef/architecture/alpha.h
@@ -0,0 +1,60 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_ALPHA_H
+#define MSGPACK_PREDEF_ARCHITECTURE_ALPHA_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_ALPHA`]
+
+[@http://en.wikipedia.org/wiki/DEC_Alpha DEC Alpha] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+    [[`__alpha__`] [__predef_detection__]]
+    [[`__alpha`] [__predef_detection__]]
+    [[`_M_ALPHA`] [__predef_detection__]]
+
+    [[`__alpha_ev4__`] [4.0.0]]
+    [[`__alpha_ev5__`] [5.0.0]]
+    [[`__alpha_ev6__`] [6.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_ALPHA MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__alpha__) || defined(__alpha) || \
+    defined(_M_ALPHA)
+#   undef MSGPACK_ARCH_ALPHA
+#   if !defined(MSGPACK_ARCH_ALPHA) && defined(__alpha_ev4__)
+#       define MSGPACK_ARCH_ALPHA MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ALPHA) && defined(__alpha_ev5__)
+#       define MSGPACK_ARCH_ALPHA MSGPACK_VERSION_NUMBER(5,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ALPHA) && defined(__alpha_ev6__)
+#       define MSGPACK_ARCH_ALPHA MSGPACK_VERSION_NUMBER(6,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ALPHA)
+#       define MSGPACK_ARCH_ALPHA MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_ALPHA
+#   define MSGPACK_ARCH_ALPHA_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_ALPHA_NAME "DEC Alpha"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_ALPHA,MSGPACK_ARCH_ALPHA_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/arm.h b/include/msgpack/predef/architecture/arm.h
new file mode 100644
index 0000000..ccb175e
--- /dev/null
+++ b/include/msgpack/predef/architecture/arm.h
@@ -0,0 +1,71 @@
+/*
+Copyright Rene Rivera 2008-2013
+Copyright Franz Detro 2014
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_ARM_H
+#define MSGPACK_PREDEF_ARCHITECTURE_ARM_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_ARM`]
+
+[@http://en.wikipedia.org/wiki/ARM_architecture ARM] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__arm__`] [__predef_detection__]]
+    [[`__arm64`] [__predef_detection__]]
+    [[`__thumb__`] [__predef_detection__]]
+    [[`__TARGET_ARCH_ARM`] [__predef_detection__]]
+    [[`__TARGET_ARCH_THUMB`] [__predef_detection__]]
+    [[`_M_ARM`] [__predef_detection__]]
+
+    [[`__arm64`] [8.0.0]]
+    [[`__TARGET_ARCH_ARM`] [V.0.0]]
+    [[`__TARGET_ARCH_THUMB`] [V.0.0]]
+    [[`_M_ARM`] [V.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_ARM MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__arm__) || defined(__arm64) || defined(__thumb__) || \
+    defined(__TARGET_ARCH_ARM) || defined(__TARGET_ARCH_THUMB) || \
+    defined(_M_ARM)
+#   undef MSGPACK_ARCH_ARM
+#   if !defined(MSGPACK_ARCH_ARM) && defined(__arm64)
+#       define MSGPACK_ARCH_ARM MSGPACK_VERSION_NUMBER(8,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ARM) && defined(__TARGET_ARCH_ARM)
+#       define MSGPACK_ARCH_ARM MSGPACK_VERSION_NUMBER(__TARGET_ARCH_ARM,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ARM) && defined(__TARGET_ARCH_THUMB)
+#       define MSGPACK_ARCH_ARM MSGPACK_VERSION_NUMBER(__TARGET_ARCH_THUMB,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ARM) && defined(_M_ARM)
+#       define MSGPACK_ARCH_ARM MSGPACK_VERSION_NUMBER(_M_ARM,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_ARM)
+#       define MSGPACK_ARCH_ARM MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_ARM
+#   define MSGPACK_ARCH_ARM_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_ARM_NAME "ARM"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_ARM,MSGPACK_ARCH_ARM_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/blackfin.h b/include/msgpack/predef/architecture/blackfin.h
new file mode 100644
index 0000000..688feaa
--- /dev/null
+++ b/include/msgpack/predef/architecture/blackfin.h
@@ -0,0 +1,47 @@
+/*
+Copyright Rene Rivera 2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_BLACKFIN_H
+#define MSGPACK_PREDEF_ARCHITECTURE_BLACKFIN_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_BLACKFIN`]
+
+Blackfin Processors from Analog Devices.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__bfin__`] [__predef_detection__]]
+    [[`__BFIN__`] [__predef_detection__]]
+    [[`bfin`] [__predef_detection__]]
+    [[`BFIN`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_BLACKFIN MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__bfin__) || defined(__BFIN__) || \
+    defined(bfin) || defined(BFIN)
+#   undef MSGPACK_ARCH_BLACKFIN
+#   define MSGPACK_ARCH_BLACKFIN MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_BLACKFIN
+#   define MSGPACK_ARCH_BLACKFIN_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_BLACKFIN_NAME "Blackfin"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_BLACKFIN,MSGPACK_ARCH_BLACKFIN_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/convex.h b/include/msgpack/predef/architecture/convex.h
new file mode 100644
index 0000000..f209dcc
--- /dev/null
+++ b/include/msgpack/predef/architecture/convex.h
@@ -0,0 +1,67 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_CONVEX_H
+#define MSGPACK_PREDEF_ARCHITECTURE_CONVEX_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_CONVEX`]
+
+[@http://en.wikipedia.org/wiki/Convex_Computer Convex Computer] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__convex__`] [__predef_detection__]]
+
+    [[`__convex_c1__`] [1.0.0]]
+    [[`__convex_c2__`] [2.0.0]]
+    [[`__convex_c32__`] [3.2.0]]
+    [[`__convex_c34__`] [3.4.0]]
+    [[`__convex_c38__`] [3.8.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__convex__)
+#   undef MSGPACK_ARCH_CONVEX
+#   if !defined(MSGPACK_ARCH_CONVEX) && defined(__convex_c1__)
+#       define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER(1,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_CONVEX) && defined(__convex_c2__)
+#       define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER(2,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_CONVEX) && defined(__convex_c32__)
+#       define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER(3,2,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_CONVEX) && defined(__convex_c34__)
+#       define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER(3,4,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_CONVEX) && defined(__convex_c38__)
+#       define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER(3,8,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_CONVEX)
+#       define MSGPACK_ARCH_CONVEX MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_CONVEX
+#   define MSGPACK_ARCH_CONVEX_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_CONVEX_NAME "Convex Computer"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_CONVEX,MSGPACK_ARCH_CONVEX_NAME)
+
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/ia64.h b/include/msgpack/predef/architecture/ia64.h
new file mode 100644
index 0000000..a33f1e9
--- /dev/null
+++ b/include/msgpack/predef/architecture/ia64.h
@@ -0,0 +1,49 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_IA64_H
+#define MSGPACK_PREDEF_ARCHITECTURE_IA64_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_IA64`]
+
+[@http://en.wikipedia.org/wiki/Ia64 Intel Itanium 64] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__ia64__`] [__predef_detection__]]
+    [[`_IA64`] [__predef_detection__]]
+    [[`__IA64__`] [__predef_detection__]]
+    [[`__ia64`] [__predef_detection__]]
+    [[`_M_IA64`] [__predef_detection__]]
+    [[`__itanium__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_IA64 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__ia64__) || defined(_IA64) || \
+    defined(__IA64__) || defined(__ia64) || \
+    defined(_M_IA64) || defined(__itanium__)
+#   undef MSGPACK_ARCH_IA64
+#   define MSGPACK_ARCH_IA64 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_IA64
+#   define MSGPACK_ARCH_IA64_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_IA64_NAME "Intel Itanium 64"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_IA64,MSGPACK_ARCH_IA64_NAME)
+
+#endif
diff --git a/include/msgpack/predef/architecture/m68k.h b/include/msgpack/predef/architecture/m68k.h
new file mode 100644
index 0000000..5c530d5
--- /dev/null
+++ b/include/msgpack/predef/architecture/m68k.h
@@ -0,0 +1,83 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_M68K_H
+#define MSGPACK_PREDEF_ARCHITECTURE_M68K_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_M68K`]
+
+[@http://en.wikipedia.org/wiki/M68k Motorola 68k] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__m68k__`] [__predef_detection__]]
+    [[`M68000`] [__predef_detection__]]
+
+    [[`__mc68060__`] [6.0.0]]
+    [[`mc68060`] [6.0.0]]
+    [[`__mc68060`] [6.0.0]]
+    [[`__mc68040__`] [4.0.0]]
+    [[`mc68040`] [4.0.0]]
+    [[`__mc68040`] [4.0.0]]
+    [[`__mc68030__`] [3.0.0]]
+    [[`mc68030`] [3.0.0]]
+    [[`__mc68030`] [3.0.0]]
+    [[`__mc68020__`] [2.0.0]]
+    [[`mc68020`] [2.0.0]]
+    [[`__mc68020`] [2.0.0]]
+    [[`__mc68010__`] [1.0.0]]
+    [[`mc68010`] [1.0.0]]
+    [[`__mc68010`] [1.0.0]]
+    [[`__mc68000__`] [0.0.1]]
+    [[`mc68000`] [0.0.1]]
+    [[`__mc68000`] [0.0.1]]
+    ]
+ */
+
+#define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__m68k__) || defined(M68000)
+#   undef MSGPACK_ARCH_M68K
+#   if !defined(MSGPACK_ARCH_M68K) && (defined(__mc68060__) || defined(mc68060) || defined(__mc68060))
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER(6,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_M68K) && (defined(__mc68040__) || defined(mc68040) || defined(__mc68040))
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_M68K) && (defined(__mc68030__) || defined(mc68030) || defined(__mc68030))
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER(3,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_M68K) && (defined(__mc68020__) || defined(mc68020) || defined(__mc68020))
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER(2,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_M68K) && (defined(__mc68010__) || defined(mc68010) || defined(__mc68010))
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER(1,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_M68K) && (defined(__mc68000__) || defined(mc68000) || defined(__mc68000))
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#   if !defined(MSGPACK_ARCH_M68K)
+#       define MSGPACK_ARCH_M68K MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_M68K
+#   define MSGPACK_ARCH_M68K_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_M68K_NAME "Motorola 68k"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_M68K,MSGPACK_ARCH_M68K_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/mips.h b/include/msgpack/predef/architecture/mips.h
new file mode 100644
index 0000000..2559e71
--- /dev/null
+++ b/include/msgpack/predef/architecture/mips.h
@@ -0,0 +1,74 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_MIPS_H
+#define MSGPACK_PREDEF_ARCHITECTURE_MIPS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_MIPS`]
+
+[@http://en.wikipedia.org/wiki/MIPS_architecture MIPS] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__mips__`] [__predef_detection__]]
+    [[`__mips`] [__predef_detection__]]
+    [[`__MIPS__`] [__predef_detection__]]
+
+    [[`__mips`] [V.0.0]]
+    [[`_MIPS_ISA_MIPS1`] [1.0.0]]
+    [[`_R3000`] [1.0.0]]
+    [[`_MIPS_ISA_MIPS2`] [2.0.0]]
+    [[`__MIPS_ISA2__`] [2.0.0]]
+    [[`_R4000`] [2.0.0]]
+    [[`_MIPS_ISA_MIPS3`] [3.0.0]]
+    [[`__MIPS_ISA3__`] [3.0.0]]
+    [[`_MIPS_ISA_MIPS4`] [4.0.0]]
+    [[`__MIPS_ISA4__`] [4.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__mips__) || defined(__mips) || \
+    defined(__MIPS__)
+#   undef MSGPACK_ARCH_MIPS
+#   if !defined(MSGPACK_ARCH_MIPS) && (defined(__mips))
+#       define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER(__mips,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_MIPS) && (defined(_MIPS_ISA_MIPS1) || defined(_R3000))
+#       define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER(1,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_MIPS) && (defined(_MIPS_ISA_MIPS2) || defined(__MIPS_ISA2__) || defined(_R4000))
+#       define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER(2,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_MIPS) && (defined(_MIPS_ISA_MIPS3) || defined(__MIPS_ISA3__))
+#       define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER(3,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_MIPS) && (defined(_MIPS_ISA_MIPS4) || defined(__MIPS_ISA4__))
+#       define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_MIPS)
+#       define MSGPACK_ARCH_MIPS MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_MIPS
+#   define MSGPACK_ARCH_MIPS_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_MIPS_NAME "MIPS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_MIPS,MSGPACK_ARCH_MIPS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/parisc.h b/include/msgpack/predef/architecture/parisc.h
new file mode 100644
index 0000000..f6b575b
--- /dev/null
+++ b/include/msgpack/predef/architecture/parisc.h
@@ -0,0 +1,65 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_PARISC_H
+#define MSGPACK_PREDEF_ARCHITECTURE_PARISC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_PARISK`]
+
+[@http://en.wikipedia.org/wiki/PA-RISC_family HP/PA RISC] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__hppa__`] [__predef_detection__]]
+    [[`__hppa`] [__predef_detection__]]
+    [[`__HPPA__`] [__predef_detection__]]
+
+    [[`_PA_RISC1_0`] [1.0.0]]
+    [[`_PA_RISC1_1`] [1.1.0]]
+    [[`__HPPA11__`] [1.1.0]]
+    [[`__PA7100__`] [1.1.0]]
+    [[`_PA_RISC2_0`] [2.0.0]]
+    [[`__RISC2_0__`] [2.0.0]]
+    [[`__HPPA20__`] [2.0.0]]
+    [[`__PA8000__`] [2.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_PARISC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__hppa__) || defined(__hppa) || defined(__HPPA__)
+#   undef MSGPACK_ARCH_PARISC
+#   if !defined(MSGPACK_ARCH_PARISC) && (defined(_PA_RISC1_0))
+#       define MSGPACK_ARCH_PARISC MSGPACK_VERSION_NUMBER(1,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_PARISC) && (defined(_PA_RISC1_1) || defined(__HPPA11__) || defined(__PA7100__))
+#       define MSGPACK_ARCH_PARISC MSGPACK_VERSION_NUMBER(1,1,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_PARISC) && (defined(_PA_RISC2_0) || defined(__RISC2_0__) || defined(__HPPA20__) || defined(__PA8000__))
+#       define MSGPACK_ARCH_PARISC MSGPACK_VERSION_NUMBER(2,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_PARISC)
+#       define MSGPACK_ARCH_PARISC MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_PARISC
+#   define MSGPACK_ARCH_PARISC_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_PARISC_NAME "HP/PA RISC"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_PARISC,MSGPACK_ARCH_PARISC_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/ppc.h b/include/msgpack/predef/architecture/ppc.h
new file mode 100644
index 0000000..a62d604
--- /dev/null
+++ b/include/msgpack/predef/architecture/ppc.h
@@ -0,0 +1,73 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_PPC_H
+#define MSGPACK_PREDEF_ARCHITECTURE_PPC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_PPC`]
+
+[@http://en.wikipedia.org/wiki/PowerPC PowerPC] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__powerpc`] [__predef_detection__]]
+    [[`__powerpc__`] [__predef_detection__]]
+    [[`__POWERPC__`] [__predef_detection__]]
+    [[`__ppc__`] [__predef_detection__]]
+    [[`_M_PPC`] [__predef_detection__]]
+    [[`_ARCH_PPC`] [__predef_detection__]]
+    [[`__PPCGECKO__`] [__predef_detection__]]
+    [[`__PPCBROADWAY__`] [__predef_detection__]]
+    [[`_XENON`] [__predef_detection__]]
+
+    [[`__ppc601__`] [6.1.0]]
+    [[`_ARCH_601`] [6.1.0]]
+    [[`__ppc603__`] [6.3.0]]
+    [[`_ARCH_603`] [6.3.0]]
+    [[`__ppc604__`] [6.4.0]]
+    [[`__ppc604__`] [6.4.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_PPC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__powerpc) || defined(__powerpc__) || \
+    defined(__POWERPC__) || defined(__ppc__) || \
+    defined(_M_PPC) || defined(_ARCH_PPC) || \
+    defined(__PPCGECKO__) || defined(__PPCBROADWAY__) || \
+    defined(_XENON)
+#   undef MSGPACK_ARCH_PPC
+#   if !defined (MSGPACK_ARCH_PPC) && (defined(__ppc601__) || defined(_ARCH_601))
+#       define MSGPACK_ARCH_PPC MSGPACK_VERSION_NUMBER(6,1,0)
+#   endif
+#   if !defined (MSGPACK_ARCH_PPC) && (defined(__ppc603__) || defined(_ARCH_603))
+#       define MSGPACK_ARCH_PPC MSGPACK_VERSION_NUMBER(6,3,0)
+#   endif
+#   if !defined (MSGPACK_ARCH_PPC) && (defined(__ppc604__) || defined(__ppc604__))
+#       define MSGPACK_ARCH_PPC MSGPACK_VERSION_NUMBER(6,4,0)
+#   endif
+#   if !defined (MSGPACK_ARCH_PPC)
+#       define MSGPACK_ARCH_PPC MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_PPC
+#   define MSGPACK_ARCH_PPC_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_PPC_NAME "PowerPC"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_PPC,MSGPACK_ARCH_PPC_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/pyramid.h b/include/msgpack/predef/architecture/pyramid.h
new file mode 100644
index 0000000..b61323b
--- /dev/null
+++ b/include/msgpack/predef/architecture/pyramid.h
@@ -0,0 +1,43 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_PYRAMID_H
+#define MSGPACK_PREDEF_ARCHITECTURE_PYRAMID_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_PYRAMID`]
+
+Pyramid 9810 architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`pyr`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_PYRAMID MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(pyr)
+#   undef MSGPACK_ARCH_PYRAMID
+#   define MSGPACK_ARCH_PYRAMID MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_PYRAMID
+#   define MSGPACK_ARCH_PYRAMID_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_PYRAMID_NAME "Pyramid 9810"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_PYRAMID,MSGPACK_ARCH_PYRAMID_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/rs6k.h b/include/msgpack/predef/architecture/rs6k.h
new file mode 100644
index 0000000..78b87b5
--- /dev/null
+++ b/include/msgpack/predef/architecture/rs6k.h
@@ -0,0 +1,56 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_RS6K_H
+#define MSGPACK_PREDEF_ARCHITECTURE_RS6K_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_RS6000`]
+
+[@http://en.wikipedia.org/wiki/RS/6000 RS/6000] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__THW_RS6000`] [__predef_detection__]]
+    [[`_IBMR2`] [__predef_detection__]]
+    [[`_POWER`] [__predef_detection__]]
+    [[`_ARCH_PWR`] [__predef_detection__]]
+    [[`_ARCH_PWR2`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_RS6000 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__THW_RS6000) || defined(_IBMR2) || \
+    defined(_POWER) || defined(_ARCH_PWR) || \
+    defined(_ARCH_PWR2)
+#   undef MSGPACK_ARCH_RS6000
+#   define MSGPACK_ARCH_RS6000 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_RS6000
+#   define MSGPACK_ARCH_RS6000_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_RS6000_NAME "RS/6000"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_RS6000,MSGPACK_ARCH_RS6000_NAME)
+
+#define MSGPACK_ARCH_PWR MSGPACK_ARCH_RS6000
+
+#if MSGPACK_ARCH_PWR
+#   define MSGPACK_ARCH_PWR_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_PWR_NAME MSGPACK_ARCH_RS6000_NAME
+
+#endif
diff --git a/include/msgpack/predef/architecture/sparc.h b/include/msgpack/predef/architecture/sparc.h
new file mode 100644
index 0000000..5b52db1
--- /dev/null
+++ b/include/msgpack/predef/architecture/sparc.h
@@ -0,0 +1,55 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_SPARC_H
+#define MSGPACK_PREDEF_ARCHITECTURE_SPARC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_SPARC`]
+
+[@http://en.wikipedia.org/wiki/SPARC SPARC] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__sparc__`] [__predef_detection__]]
+    [[`__sparc`] [__predef_detection__]]
+
+    [[`__sparcv9`] [9.0.0]]
+    [[`__sparcv8`] [8.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_SPARC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__sparc__) || defined(__sparc)
+#   undef MSGPACK_ARCH_SPARC
+#   if !defined(MSGPACK_ARCH_SPARC) && defined(__sparcv9)
+#       define MSGPACK_ARCH_SPARC MSGPACK_VERSION_NUMBER(9,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SPARC) && defined(__sparcv8)
+#       define MSGPACK_ARCH_SPARC MSGPACK_VERSION_NUMBER(8,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SPARC)
+#       define MSGPACK_ARCH_SPARC MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_SPARC
+#   define MSGPACK_ARCH_SPARC_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_SPARC_NAME "SPARC"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_SPARC,MSGPACK_ARCH_SPARC_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/superh.h b/include/msgpack/predef/architecture/superh.h
new file mode 100644
index 0000000..bba6a2f
--- /dev/null
+++ b/include/msgpack/predef/architecture/superh.h
@@ -0,0 +1,68 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_SUPERH_H
+#define MSGPACK_PREDEF_ARCHITECTURE_SUPERH_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_SH`]
+
+[@http://en.wikipedia.org/wiki/SuperH SuperH] architecture:
+If available versions \[1-5\] are specifically detected.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__sh__`] [__predef_detection__]]
+
+    [[`__SH5__`] [5.0.0]]
+    [[`__SH4__`] [4.0.0]]
+    [[`__sh3__`] [3.0.0]]
+    [[`__SH3__`] [3.0.0]]
+    [[`__sh2__`] [2.0.0]]
+    [[`__sh1__`] [1.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__sh__)
+#   undef MSGPACK_ARCH_SH
+#   if !defined(MSGPACK_ARCH_SH) && (defined(__SH5__))
+#       define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER(5,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SH) && (defined(__SH4__))
+#       define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SH) && (defined(__sh3__) || defined(__SH3__))
+#       define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER(3,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SH) && (defined(__sh2__))
+#       define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER(2,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SH) && (defined(__sh1__))
+#       define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER(1,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_SH)
+#       define MSGPACK_ARCH_SH MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_SH
+#   define MSGPACK_ARCH_SH_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_SH_NAME "SuperH"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_SH,MSGPACK_ARCH_SH_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/sys370.h b/include/msgpack/predef/architecture/sys370.h
new file mode 100644
index 0000000..ddb7f04
--- /dev/null
+++ b/include/msgpack/predef/architecture/sys370.h
@@ -0,0 +1,44 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_SYS370_H
+#define MSGPACK_PREDEF_ARCHITECTURE_SYS370_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_SYS370`]
+
+[@http://en.wikipedia.org/wiki/System/370 System/370] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__370__`] [__predef_detection__]]
+    [[`__THW_370__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_SYS370 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__370__) || defined(__THW_370__)
+#   undef MSGPACK_ARCH_SYS370
+#   define MSGPACK_ARCH_SYS370 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_SYS370
+#   define MSGPACK_ARCH_SYS370_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_SYS370_NAME "System/370"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_SYS370,MSGPACK_ARCH_SYS370_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/sys390.h b/include/msgpack/predef/architecture/sys390.h
new file mode 100644
index 0000000..029214f
--- /dev/null
+++ b/include/msgpack/predef/architecture/sys390.h
@@ -0,0 +1,44 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_SYS390_H
+#define MSGPACK_PREDEF_ARCHITECTURE_SYS390_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_SYS390`]
+
+[@http://en.wikipedia.org/wiki/System/390 System/390] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__s390__`] [__predef_detection__]]
+    [[`__s390x__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_SYS390 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__s390__) || defined(__s390x__)
+#   undef MSGPACK_ARCH_SYS390
+#   define MSGPACK_ARCH_SYS390 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_SYS390
+#   define MSGPACK_ARCH_SYS390_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_SYS390_NAME "System/390"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_SYS390,MSGPACK_ARCH_SYS390_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/architecture/x86.h b/include/msgpack/predef/architecture/x86.h
new file mode 100644
index 0000000..109d9d9
--- /dev/null
+++ b/include/msgpack/predef/architecture/x86.h
@@ -0,0 +1,38 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_X86_H
+#define MSGPACK_PREDEF_ARCHITECTURE_X86_H
+
+#include <msgpack/predef/architecture/x86/32.h>
+#include <msgpack/predef/architecture/x86/64.h>
+
+/*`
+[heading `MSGPACK_ARCH_X86`]
+
+[@http://en.wikipedia.org/wiki/X86 Intel x86] architecture. This is
+a category to indicate that either `MSGPACK_ARCH_X86_32` or
+`MSGPACK_ARCH_X86_64` is detected.
+ */
+
+#define MSGPACK_ARCH_X86 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if MSGPACK_ARCH_X86_32 || MSGPACK_ARCH_X86_64
+#   undef MSGPACK_ARCH_X86
+#   define MSGPACK_ARCH_X86 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_X86
+#   define MSGPACK_ARCH_X86_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_X86_NAME "Intel x86"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_X86,MSGPACK_ARCH_X86_NAME)
+
+#endif
diff --git a/include/msgpack/predef/architecture/x86/32.h b/include/msgpack/predef/architecture/x86/32.h
new file mode 100644
index 0000000..ce6639d
--- /dev/null
+++ b/include/msgpack/predef/architecture/x86/32.h
@@ -0,0 +1,87 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_X86_32_H
+#define MSGPACK_PREDEF_ARCHITECTURE_X86_32_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_X86_32`]
+
+[@http://en.wikipedia.org/wiki/X86 Intel x86] architecture:
+If available versions \[3-6\] are specifically detected.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`i386`] [__predef_detection__]]
+    [[`__i386__`] [__predef_detection__]]
+    [[`__i486__`] [__predef_detection__]]
+    [[`__i586__`] [__predef_detection__]]
+    [[`__i686__`] [__predef_detection__]]
+    [[`__i386`] [__predef_detection__]]
+    [[`_M_IX86`] [__predef_detection__]]
+    [[`_X86_`] [__predef_detection__]]
+    [[`__THW_INTEL__`] [__predef_detection__]]
+    [[`__I86__`] [__predef_detection__]]
+    [[`__INTEL__`] [__predef_detection__]]
+
+    [[`__I86__`] [V.0.0]]
+    [[`_M_IX86`] [V.0.0]]
+    [[`__i686__`] [6.0.0]]
+    [[`__i586__`] [5.0.0]]
+    [[`__i486__`] [4.0.0]]
+    [[`__i386__`] [3.0.0]]
+    ]
+ */
+
+#define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(i386) || defined(__i386__) || \
+    defined(__i486__) || defined(__i586__) || \
+    defined(__i686__) || defined(__i386) || \
+    defined(_M_IX86) || defined(_X86_) || \
+    defined(__THW_INTEL__) || defined(__I86__) || \
+    defined(__INTEL__)
+#   undef MSGPACK_ARCH_X86_32
+#   if !defined(MSGPACK_ARCH_X86_32) && defined(__I86__)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER(__I86__,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_X86_32) && defined(_M_IX86)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_PREDEF_MAKE_10_VV00(_M_IX86)
+#   endif
+#   if !defined(MSGPACK_ARCH_X86_32) && defined(__i686__)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER(6,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_X86_32) && defined(__i586__)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER(5,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_X86_32) && defined(__i486__)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_X86_32) && defined(__i386__)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER(3,0,0)
+#   endif
+#   if !defined(MSGPACK_ARCH_X86_32)
+#       define MSGPACK_ARCH_X86_32 MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_ARCH_X86_32
+#   define MSGPACK_ARCH_X86_32_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_X86_32_NAME "Intel x86-32"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_X86_32,MSGPACK_ARCH_X86_32_NAME)
+
+#include <msgpack/predef/architecture/x86.h>
+
+#endif
diff --git a/include/msgpack/predef/architecture/x86/64.h b/include/msgpack/predef/architecture/x86/64.h
new file mode 100644
index 0000000..d6d65ef
--- /dev/null
+++ b/include/msgpack/predef/architecture/x86/64.h
@@ -0,0 +1,50 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_X86_64_H
+#define MSGPACK_PREDEF_ARCHITECTURE_X86_64_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_X86_64`]
+
+[@http://en.wikipedia.org/wiki/Ia64 Intel IA-64] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__x86_64`] [__predef_detection__]]
+    [[`__x86_64__`] [__predef_detection__]]
+    [[`__amd64__`] [__predef_detection__]]
+    [[`__amd64`] [__predef_detection__]]
+    [[`_M_X64`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_X86_64 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__x86_64) || defined(__x86_64__) || \
+    defined(__amd64__) || defined(__amd64) || \
+    defined(_M_X64)
+#   undef MSGPACK_ARCH_X86_64
+#   define MSGPACK_ARCH_X86_64 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_X86_64
+#   define MSGPACK_ARCH_X86_64_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_X86_64_NAME "Intel x86-64"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_X86_64,MSGPACK_ARCH_X86_64_NAME)
+
+#include <msgpack/predef/architecture/x86.h>
+
+#endif
diff --git a/include/msgpack/predef/architecture/z.h b/include/msgpack/predef/architecture/z.h
new file mode 100644
index 0000000..f8479f2
--- /dev/null
+++ b/include/msgpack/predef/architecture/z.h
@@ -0,0 +1,43 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ARCHITECTURE_Z_H
+#define MSGPACK_PREDEF_ARCHITECTURE_Z_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_ARCH_Z`]
+
+[@http://en.wikipedia.org/wiki/Z/Architecture z/Architecture] architecture.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__SYSC_ZARCH__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_ARCH_Z MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__SYSC_ZARCH__)
+#   undef MSGPACK_ARCH_Z
+#   define MSGPACK_ARCH_Z MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_ARCH_Z
+#   define MSGPACK_ARCH_Z_AVAILABLE
+#endif
+
+#define MSGPACK_ARCH_Z_NAME "z/Architecture"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ARCH_Z,MSGPACK_ARCH_Z_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/compiler.h b/include/msgpack/predef/compiler.h
new file mode 100644
index 0000000..08dec96
--- /dev/null
+++ b/include/msgpack/predef/compiler.h
@@ -0,0 +1,41 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_H
+#define MSGPACK_PREDEF_COMPILER_H
+
+#include <msgpack/predef/compiler/borland.h>
+#include <msgpack/predef/compiler/clang.h>
+#include <msgpack/predef/compiler/comeau.h>
+#include <msgpack/predef/compiler/compaq.h>
+#include <msgpack/predef/compiler/diab.h>
+#include <msgpack/predef/compiler/digitalmars.h>
+#include <msgpack/predef/compiler/dignus.h>
+#include <msgpack/predef/compiler/edg.h>
+#include <msgpack/predef/compiler/ekopath.h>
+#include <msgpack/predef/compiler/gcc_xml.h>
+#include <msgpack/predef/compiler/gcc.h>
+#include <msgpack/predef/compiler/greenhills.h>
+#include <msgpack/predef/compiler/hp_acc.h>
+#include <msgpack/predef/compiler/iar.h>
+#include <msgpack/predef/compiler/ibm.h>
+#include <msgpack/predef/compiler/intel.h>
+#include <msgpack/predef/compiler/kai.h>
+#include <msgpack/predef/compiler/llvm.h>
+#include <msgpack/predef/compiler/metaware.h>
+#include <msgpack/predef/compiler/metrowerks.h>
+#include <msgpack/predef/compiler/microtec.h>
+#include <msgpack/predef/compiler/mpw.h>
+#include <msgpack/predef/compiler/palm.h>
+#include <msgpack/predef/compiler/pgi.h>
+#include <msgpack/predef/compiler/sgi_mipspro.h>
+#include <msgpack/predef/compiler/sunpro.h>
+#include <msgpack/predef/compiler/tendra.h>
+#include <msgpack/predef/compiler/visualc.h>
+#include <msgpack/predef/compiler/watcom.h>
+
+#endif
diff --git a/include/msgpack/predef/compiler/borland.h b/include/msgpack/predef/compiler/borland.h
new file mode 100644
index 0000000..724a8e7
--- /dev/null
+++ b/include/msgpack/predef/compiler/borland.h
@@ -0,0 +1,64 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_BORLAND_H
+#define MSGPACK_PREDEF_COMPILER_BORLAND_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_BORLAND`]
+
+[@http://en.wikipedia.org/wiki/C_plus_plus_builder Borland C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__BORLANDC__`] [__predef_detection__]]
+    [[`__CODEGEARC__`] [__predef_detection__]]
+
+    [[`__BORLANDC__`] [V.R.P]]
+    [[`__CODEGEARC__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_BORLAND MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__BORLANDC__) || defined(__CODEGEARC__)
+#   if !defined(MSGPACK_COMP_BORLAND_DETECTION) && (defined(__CODEGEARC__))
+#       define MSGPACK_COMP_BORLAND_DETECTION MSGPACK_PREDEF_MAKE_0X_VVRP(__CODEGEARC__)
+#   endif
+#   if !defined(MSGPACK_COMP_BORLAND_DETECTION)
+#       define MSGPACK_COMP_BORLAND_DETECTION MSGPACK_PREDEF_MAKE_0X_VVRP(__BORLANDC__)
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_BORLAND_DETECTION
+#   define MSGPACK_COMP_BORLAND_AVAILABLE
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_BORLAND_EMULATED MSGPACK_COMP_BORLAND_DETECTION
+#   else
+#       undef MSGPACK_COMP_BORLAND
+#       define MSGPACK_COMP_BORLAND MSGPACK_COMP_BORLAND_DETECTION
+#   endif
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_BORLAND_NAME "Borland C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_BORLAND,MSGPACK_COMP_BORLAND_NAME)
+
+#ifdef MSGPACK_COMP_BORLAND_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_BORLAND_EMULATED,MSGPACK_COMP_BORLAND_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/clang.h b/include/msgpack/predef/compiler/clang.h
new file mode 100644
index 0000000..ded61ce
--- /dev/null
+++ b/include/msgpack/predef/compiler/clang.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_CLANG_H
+#define MSGPACK_PREDEF_COMPILER_CLANG_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_CLANG`]
+
+[@http://en.wikipedia.org/wiki/Clang Clang] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__clang__`] [__predef_detection__]]
+
+    [[`__clang_major__`, `__clang_minor__`, `__clang_patchlevel__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_CLANG MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__clang__)
+#   define MSGPACK_COMP_CLANG_DETECTION MSGPACK_VERSION_NUMBER(__clang_major__,__clang_minor__,__clang_patchlevel__)
+#endif
+
+#ifdef MSGPACK_COMP_CLANG_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_CLANG_EMULATED MSGPACK_COMP_CLANG_DETECTION
+#   else
+#       undef MSGPACK_COMP_CLANG
+#       define MSGPACK_COMP_CLANG MSGPACK_COMP_CLANG_DETECTION
+#   endif
+#   define MSGPACK_COMP_CLANG_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_CLANG_NAME "Clang"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_CLANG,MSGPACK_COMP_CLANG_NAME)
+
+#ifdef MSGPACK_COMP_CLANG_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_CLANG_EMULATED,MSGPACK_COMP_CLANG_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/comeau.h b/include/msgpack/predef/compiler/comeau.h
new file mode 100644
index 0000000..305517d
--- /dev/null
+++ b/include/msgpack/predef/compiler/comeau.h
@@ -0,0 +1,62 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_COMEAU_H
+#define MSGPACK_PREDEF_COMPILER_COMEAU_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+#define MSGPACK_COMP_COMO MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+/*`
+[heading `MSGPACK_COMP_COMO`]
+
+[@http://en.wikipedia.org/wiki/Comeau_C/C%2B%2B Comeau C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__COMO__`] [__predef_detection__]]
+
+    [[`__COMO_VERSION__`] [V.R.P]]
+    ]
+ */
+
+#if defined(__COMO__)
+#   if !defined(MSGPACK_COMP_COMO_DETECTION) && defined(__CONO_VERSION__)
+#       define MSGPACK_COMP_COMO_DETECTION MSGPACK_PREDEF_MAKE_0X_VRP(__COMO_VERSION__)
+#   endif
+#   if !defined(MSGPACK_COMP_COMO_DETECTION)
+#       define MSGPACK_COMP_COMO_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_COMO_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_COMO_EMULATED MSGPACK_COMP_COMO_DETECTION
+#   else
+#       undef MSGPACK_COMP_COMO
+#       define MSGPACK_COMP_COMO MSGPACK_COMP_COMO_DETECTION
+#   endif
+#   define MSGPACK_COMP_COMO_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_COMO_NAME "Comeau C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_COMO,MSGPACK_COMP_COMO_NAME)
+
+#ifdef MSGPACK_COMP_COMO_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_COMO_EMULATED,MSGPACK_COMP_COMO_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/compaq.h b/include/msgpack/predef/compiler/compaq.h
new file mode 100644
index 0000000..6755961
--- /dev/null
+++ b/include/msgpack/predef/compiler/compaq.h
@@ -0,0 +1,67 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_COMPAQ_H
+#define MSGPACK_PREDEF_COMPILER_COMPAQ_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_DEC`]
+
+[@http://www.openvms.compaq.com/openvms/brochures/deccplus/ Compaq C/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__DECCXX`] [__predef_detection__]]
+    [[`__DECC`] [__predef_detection__]]
+
+    [[`__DECCXX_VER`] [V.R.P]]
+    [[`__DECC_VER`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_DEC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__DECC) || defined(__DECCXX)
+#   if !defined(MSGPACK_COMP_DEC_DETECTION) && defined(__DECCXX_VER)
+#       define MSGPACK_COMP_DEC_DETECTION MSGPACK_PREDEF_MAKE_10_VVRR0PP00(__DECCXX_VER)
+#   endif
+#   if !defined(MSGPACK_COMP_DEC_DETECTION) && defined(__DECC_VER)
+#       define MSGPACK_COMP_DEC_DETECTION MSGPACK_PREDEF_MAKE_10_VVRR0PP00(__DECC_VER)
+#   endif
+#   if !defined(MSGPACK_COMP_DEC_DETECTION)
+#       define MSGPACK_COM_DEC_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_DEC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_DEC_EMULATED MSGPACK_COMP_DEC_DETECTION
+#   else
+#       undef MSGPACK_COMP_DEC
+#       define MSGPACK_COMP_DEC MSGPACK_COMP_DEC_DETECTION
+#   endif
+#   define MSGPACK_COMP_DEC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_DEC_NAME "Compaq C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_DEC,MSGPACK_COMP_DEC_NAME)
+
+#ifdef MSGPACK_COMP_DEC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_DEC_EMULATED,MSGPACK_COMP_DEC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/diab.h b/include/msgpack/predef/compiler/diab.h
new file mode 100644
index 0000000..8b2b584
--- /dev/null
+++ b/include/msgpack/predef/compiler/diab.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_DIAB_H
+#define MSGPACK_PREDEF_COMPILER_DIAB_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_DIAB`]
+
+[@http://www.windriver.com/products/development_suite/wind_river_compiler/ Diab C/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__DCC__`] [__predef_detection__]]
+
+    [[`__VERSION_NUMBER__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_DIAB MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__DCC__)
+#   define MSGPACK_COMP_DIAB_DETECTION MSGPACK_PREDEF_MAKE_10_VRPP(__VERSION_NUMBER__)
+#endif
+
+#ifdef MSGPACK_COMP_DIAB_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_DIAB_EMULATED MSGPACK_COMP_DIAB_DETECTION
+#   else
+#       undef MSGPACK_COMP_DIAB
+#       define MSGPACK_COMP_DIAB MSGPACK_COMP_DIAB_DETECTION
+#   endif
+#   define MSGPACK_COMP_DIAB_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_DIAB_NAME "Diab C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_DIAB,MSGPACK_COMP_DIAB_NAME)
+
+#ifdef MSGPACK_COMP_DIAB_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_DIAB_EMULATED,MSGPACK_COMP_DIAB_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/digitalmars.h b/include/msgpack/predef/compiler/digitalmars.h
new file mode 100644
index 0000000..c50d4fd
--- /dev/null
+++ b/include/msgpack/predef/compiler/digitalmars.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_DIGITALMARS_H
+#define MSGPACK_PREDEF_COMPILER_DIGITALMARS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_DMC`]
+
+[@http://en.wikipedia.org/wiki/Digital_Mars Digital Mars] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__DMC__`] [__predef_detection__]]
+
+    [[`__DMC__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_DMC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__DMC__)
+#   define MSGPACK_COMP_DMC_DETECTION MSGPACK_PREDEF_MAKE_0X_VRP(__DMC__)
+#endif
+
+#ifdef MSGPACK_COMP_DMC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_DMC_EMULATED MSGPACK_COMP_DMC_DETECTION
+#   else
+#       undef MSGPACK_COMP_DMC
+#       define MSGPACK_COMP_DMC MSGPACK_COMP_DMC_DETECTION
+#   endif
+#   define MSGPACK_COMP_DMC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_DMC_NAME "Digital Mars"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_DMC,MSGPACK_COMP_DMC_NAME)
+
+#ifdef MSGPACK_COMP_DMC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_DMC_EMULATED,MSGPACK_COMP_DMC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/dignus.h b/include/msgpack/predef/compiler/dignus.h
new file mode 100644
index 0000000..f5161cc
--- /dev/null
+++ b/include/msgpack/predef/compiler/dignus.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_DIGNUS_H
+#define MSGPACK_PREDEF_COMPILER_DIGNUS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_SYSC`]
+
+[@http://www.dignus.com/dcxx/ Dignus Systems/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__SYSC__`] [__predef_detection__]]
+
+    [[`__SYSC_VER__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_SYSC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__SYSC__)
+#   define MSGPACK_COMP_SYSC_DETECTION MSGPACK_PREDEF_MAKE_10_VRRPP(__SYSC_VER__)
+#endif
+
+#ifdef MSGPACK_COMP_SYSC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_SYSC_EMULATED MSGPACK_COMP_SYSC_DETECTION
+#   else
+#       undef MSGPACK_COMP_SYSC
+#       define MSGPACK_COMP_SYSC MSGPACK_COMP_SYSC_DETECTION
+#   endif
+#   define MSGPACK_COMP_SYSC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_SYSC_NAME "Dignus Systems/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_SYSC,MSGPACK_COMP_SYSC_NAME)
+
+#ifdef MSGPACK_COMP_SYSC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_SYSC_EMULATED,MSGPACK_COMP_SYSC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/edg.h b/include/msgpack/predef/compiler/edg.h
new file mode 100644
index 0000000..5284243
--- /dev/null
+++ b/include/msgpack/predef/compiler/edg.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_EDG_H
+#define MSGPACK_PREDEF_COMPILER_EDG_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_EDG`]
+
+[@http://en.wikipedia.org/wiki/Edison_Design_Group EDG C++ Frontend] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__EDG__`] [__predef_detection__]]
+
+    [[`__EDG_VERSION__`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_COMP_EDG MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__EDG__)
+#   define MSGPACK_COMP_EDG_DETECTION MSGPACK_PREDEF_MAKE_10_VRR(__EDG_VERSION__)
+#endif
+
+#ifdef MSGPACK_COMP_EDG_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_EDG_EMULATED MSGPACK_COMP_EDG_DETECTION
+#   else
+#       undef MSGPACK_COMP_EDG
+#       define MSGPACK_COMP_EDG MSGPACK_COMP_EDG_DETECTION
+#   endif
+#   define MSGPACK_COMP_EDG_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_EDG_NAME "EDG C++ Frontend"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_EDG,MSGPACK_COMP_EDG_NAME)
+
+#ifdef MSGPACK_COMP_EDG_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_EDG_EMULATED,MSGPACK_COMP_EDG_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/ekopath.h b/include/msgpack/predef/compiler/ekopath.h
new file mode 100644
index 0000000..2385966
--- /dev/null
+++ b/include/msgpack/predef/compiler/ekopath.h
@@ -0,0 +1,58 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_EKOPATH_H
+#define MSGPACK_PREDEF_COMPILER_EKOPATH_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_PATH`]
+
+[@http://en.wikipedia.org/wiki/PathScale EKOpath] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__PATHCC__`] [__predef_detection__]]
+
+    [[`__PATHCC__`, `__PATHCC_MINOR__`, `__PATHCC_PATCHLEVEL__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_PATH MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__PATHCC__)
+#   define MSGPACK_COMP_PATH_DETECTION \
+        MSGPACK_VERSION_NUMBER(__PATHCC__,__PATHCC_MINOR__,__PATHCC_PATCHLEVEL__)
+#endif
+
+#ifdef MSGPACK_COMP_PATH_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_PATH_EMULATED MSGPACK_COMP_PATH_DETECTION
+#   else
+#       undef MSGPACK_COMP_PATH
+#       define MSGPACK_COMP_PATH MSGPACK_COMP_PATH_DETECTION
+#   endif
+#   define MSGPACK_COMP_PATH_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_PATH_NAME "EKOpath"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_PATH,MSGPACK_COMP_PATH_NAME)
+
+#ifdef MSGPACK_COMP_PATH_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_PATH_EMULATED,MSGPACK_COMP_PATH_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/gcc.h b/include/msgpack/predef/compiler/gcc.h
new file mode 100644
index 0000000..95f5729
--- /dev/null
+++ b/include/msgpack/predef/compiler/gcc.h
@@ -0,0 +1,69 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_GCC_H
+#define MSGPACK_PREDEF_COMPILER_GCC_H
+
+/* Other compilers that emulate this one need to be detected first. */
+
+#include <msgpack/predef/compiler/clang.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_GNUC`]
+
+[@http://en.wikipedia.org/wiki/GNU_Compiler_Collection Gnu GCC C/C++] compiler.
+Version number available as major, minor, and patch (if available).
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__GNUC__`] [__predef_detection__]]
+
+    [[`__GNUC__`, `__GNUC_MINOR__`, `__GNUC_PATCHLEVEL__`] [V.R.P]]
+    [[`__GNUC__`, `__GNUC_MINOR__`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_COMP_GNUC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__GNUC__)
+#   if !defined(MSGPACK_COMP_GNUC_DETECTION) && defined(__GNUC_PATCHLEVEL__)
+#       define MSGPACK_COMP_GNUC_DETECTION \
+            MSGPACK_VERSION_NUMBER(__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__)
+#   endif
+#   if !defined(MSGPACK_COMP_GNUC_DETECTION)
+#       define MSGPACK_COMP_GNUC_DETECTION \
+            MSGPACK_VERSION_NUMBER(__GNUC__,__GNUC_MINOR__,0)
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_GNUC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_GNUC_EMULATED MSGPACK_COMP_GNUC_DETECTION
+#   else
+#       undef MSGPACK_COMP_GNUC
+#       define MSGPACK_COMP_GNUC MSGPACK_COMP_GNUC_DETECTION
+#   endif
+#   define MSGPACK_COMP_GNUC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_GNUC_NAME "Gnu GCC C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_GNUC,MSGPACK_COMP_GNUC_NAME)
+
+#ifdef MSGPACK_COMP_GNUC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_GNUC_EMULATED,MSGPACK_COMP_GNUC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/gcc_xml.h b/include/msgpack/predef/compiler/gcc_xml.h
new file mode 100644
index 0000000..8dd4ff7
--- /dev/null
+++ b/include/msgpack/predef/compiler/gcc_xml.h
@@ -0,0 +1,53 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_GCC_XML_H
+#define MSGPACK_PREDEF_COMPILER_GCC_XML_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_GCCXML`]
+
+[@http://www.gccxml.org/ GCC XML] compiler.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__GCCXML__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_COMP_GCCXML MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__GCCXML__)
+#   define MSGPACK_COMP_GCCXML_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#ifdef MSGPACK_COMP_GCCXML_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_GCCXML_EMULATED MSGPACK_COMP_GCCXML_DETECTION
+#   else
+#       undef MSGPACK_COMP_GCCXML
+#       define MSGPACK_COMP_GCCXML MSGPACK_COMP_GCCXML_DETECTION
+#   endif
+#   define MSGPACK_COMP_GCCXML_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_GCCXML_NAME "GCC XML"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_GCCXML,MSGPACK_COMP_GCCXML_NAME)
+
+#ifdef MSGPACK_COMP_GCCXML_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_GCCXML_EMULATED,MSGPACK_COMP_GCCXML_NAME)
+#endif
+
+#endif
diff --git a/include/msgpack/predef/compiler/greenhills.h b/include/msgpack/predef/compiler/greenhills.h
new file mode 100644
index 0000000..7ccab8b
--- /dev/null
+++ b/include/msgpack/predef/compiler/greenhills.h
@@ -0,0 +1,67 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_GREENHILLS_H
+#define MSGPACK_PREDEF_COMPILER_GREENHILLS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_GHS`]
+
+[@http://en.wikipedia.org/wiki/Green_Hills_Software Green Hills C/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__ghs`] [__predef_detection__]]
+    [[`__ghs__`] [__predef_detection__]]
+
+    [[`__GHS_VERSION_NUMBER__`] [V.R.P]]
+    [[`__ghs`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_GHS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__ghs) || defined(__ghs__)
+#   if !defined(MSGPACK_COMP_GHS_DETECTION) && defined(__GHS_VERSION_NUMBER__)
+#       define MSGPACK_COMP_GHS_DETECTION MSGPACK_PREDEF_MAKE_10_VRP(__GHS_VERSION_NUMBER__)
+#   endif
+#   if !defined(MSGPACK_COMP_GHS_DETECTION) && defined(__ghs)
+#       define MSGPACK_COMP_GHS_DETECTION MSGPACK_PREDEF_MAKE_10_VRP(__ghs)
+#   endif
+#   if !defined(MSGPACK_COMP_GHS_DETECTION)
+#       define MSGPACK_COMP_GHS_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_GHS_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_GHS_EMULATED MSGPACK_COMP_GHS_DETECTION
+#   else
+#       undef MSGPACK_COMP_GHS
+#       define MSGPACK_COMP_GHS MSGPACK_COMP_GHS_DETECTION
+#   endif
+#   define MSGPACK_COMP_GHS_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_GHS_NAME "Green Hills C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_GHS,MSGPACK_COMP_GHS_NAME)
+
+#ifdef MSGPACK_COMP_GHS_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_GHS_EMULATED,MSGPACK_COMP_GHS_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/hp_acc.h b/include/msgpack/predef/compiler/hp_acc.h
new file mode 100644
index 0000000..c31e6fa
--- /dev/null
+++ b/include/msgpack/predef/compiler/hp_acc.h
@@ -0,0 +1,62 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_HP_ACC_H
+#define MSGPACK_PREDEF_COMPILER_HP_ACC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_HPACC`]
+
+HP aC++ compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__HP_aCC`] [__predef_detection__]]
+
+    [[`__HP_aCC`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_HPACC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__HP_aCC)
+#   if !defined(MSGPACK_COMP_HPACC_DETECTION) && (__HP_aCC > 1)
+#       define MSGPACK_COMP_HPACC_DETECTION MSGPACK_PREDEF_MAKE_10_VVRRPP(__HP_aCC)
+#   endif
+#   if !defined(MSGPACK_COMP_HPACC_DETECTION)
+#       define MSGPACK_COMP_HPACC_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_HPACC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_HPACC_EMULATED MSGPACK_COMP_HPACC_DETECTION
+#   else
+#       undef MSGPACK_COMP_HPACC
+#       define MSGPACK_COMP_HPACC MSGPACK_COMP_HPACC_DETECTION
+#   endif
+#   define MSGPACK_COMP_HPACC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_HPACC_NAME "HP aC++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_HPACC,MSGPACK_COMP_HPACC_NAME)
+
+#ifdef MSGPACK_COMP_HPACC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_HPACC_EMULATED,MSGPACK_COMP_HPACC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/iar.h b/include/msgpack/predef/compiler/iar.h
new file mode 100644
index 0000000..65614bb
--- /dev/null
+++ b/include/msgpack/predef/compiler/iar.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_IAR_H
+#define MSGPACK_PREDEF_COMPILER_IAR_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_IAR`]
+
+IAR C/C++ compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__IAR_SYSTEMS_ICC__`] [__predef_detection__]]
+
+    [[`__VER__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_IAR MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__IAR_SYSTEMS_ICC__)
+#   define MSGPACK_COMP_IAR_DETECTION MSGPACK_PREDEF_MAKE_10_VVRR(__VER__)
+#endif
+
+#ifdef MSGPACK_COMP_IAR_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_IAR_EMULATED MSGPACK_COMP_IAR_DETECTION
+#   else
+#       undef MSGPACK_COMP_IAR
+#       define MSGPACK_COMP_IAR MSGPACK_COMP_IAR_DETECTION
+#   endif
+#   define MSGPACK_COMP_IAR_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_IAR_NAME "IAR C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_IAR,MSGPACK_COMP_IAR_NAME)
+
+#ifdef MSGPACK_COMP_IAR_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_IAR_EMULATED,MSGPACK_COMP_IAR_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/ibm.h b/include/msgpack/predef/compiler/ibm.h
new file mode 100644
index 0000000..346db81
--- /dev/null
+++ b/include/msgpack/predef/compiler/ibm.h
@@ -0,0 +1,73 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_IBM_H
+#define MSGPACK_PREDEF_COMPILER_IBM_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_IBM`]
+
+[@http://en.wikipedia.org/wiki/VisualAge IBM XL C/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__IBMCPP__`] [__predef_detection__]]
+    [[`__xlC__`] [__predef_detection__]]
+    [[`__xlc__`] [__predef_detection__]]
+
+    [[`__COMPILER_VER__`] [V.R.P]]
+    [[`__xlC__`] [V.R.P]]
+    [[`__xlc__`] [V.R.P]]
+    [[`__IBMCPP__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_IBM MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__IBMCPP__) || defined(__xlC__) || defined(__xlc__)
+#   if !defined(MSGPACK_COMP_IBM_DETECTION) && defined(__COMPILER_VER__)
+#       define MSGPACK_COMP_IBM_DETECTION MSGPACK_PREDEF_MAKE_0X_VRRPPPP(__COMPILER_VER__)
+#   endif
+#   if !defined(MSGPACK_COMP_IBM_DETECTION) && defined(__xlC__)
+#       define MSGPACK_COMP_IBM_DETECTION MSGPACK_PREDEF_MAKE_0X_VVRR(__xlC__)
+#   endif
+#   if !defined(MSGPACK_COMP_IBM_DETECTION) && defined(__xlc__)
+#       define MSGPACK_COMP_IBM_DETECTION MSGPACK_PREDEF_MAKE_0X_VVRR(__xlc__)
+#   endif
+#   if !defined(MSGPACK_COMP_IBM_DETECTION)
+#       define MSGPACK_COMP_IBM_DETECTION MSGPACK_PREDEF_MAKE_10_VRP(__IBMCPP__)
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_IBM_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_IBM_EMULATED MSGPACK_COMP_IBM_DETECTION
+#   else
+#       undef MSGPACK_COMP_IBM
+#       define MSGPACK_COMP_IBM MSGPACK_COMP_IBM_DETECTION
+#   endif
+#   define MSGPACK_COMP_IBM_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_IBM_NAME "IBM XL C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_IBM,MSGPACK_COMP_IBM_NAME)
+
+#ifdef MSGPACK_COMP_IBM_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_IBM_EMULATED,MSGPACK_COMP_IBM_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/intel.h b/include/msgpack/predef/compiler/intel.h
new file mode 100644
index 0000000..ed3e4bc
--- /dev/null
+++ b/include/msgpack/predef/compiler/intel.h
@@ -0,0 +1,66 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_INTEL_H
+#define MSGPACK_PREDEF_COMPILER_INTEL_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_INTEL`]
+
+[@http://en.wikipedia.org/wiki/Intel_C%2B%2B Intel C/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__INTEL_COMPILER`] [__predef_detection__]]
+    [[`__ICL`] [__predef_detection__]]
+    [[`__ICC`] [__predef_detection__]]
+    [[`__ECC`] [__predef_detection__]]
+
+    [[`__INTEL_COMPILER`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_INTEL MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || \
+    defined(__ECC)
+#   if !defined(MSGPACK_COMP_INTEL_DETECTION) && defined(__INTEL_COMPILER)
+#       define MSGPACK_COMP_INTEL_DETECTION MSGPACK_PREDEF_MAKE_10_VRP(__INTEL_COMPILER)
+#   endif
+#   if !defined(MSGPACK_COMP_INTEL_DETECTION)
+#       define MSGPACK_COMP_INTEL_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_INTEL_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_INTEL_EMULATED MSGPACK_COMP_INTEL_DETECTION
+#   else
+#       undef MSGPACK_COMP_INTEL
+#       define MSGPACK_COMP_INTEL MSGPACK_COMP_INTEL_DETECTION
+#   endif
+#   define MSGPACK_COMP_INTEL_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_INTEL_NAME "Intel C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_INTEL,MSGPACK_COMP_INTEL_NAME)
+
+#ifdef MSGPACK_COMP_INTEL_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_INTEL_EMULATED,MSGPACK_COMP_INTEL_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/kai.h b/include/msgpack/predef/compiler/kai.h
new file mode 100644
index 0000000..b7b701d
--- /dev/null
+++ b/include/msgpack/predef/compiler/kai.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_KAI_H
+#define MSGPACK_PREDEF_COMPILER_KAI_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_KCC`]
+
+Kai C++ compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__KCC`] [__predef_detection__]]
+
+    [[`__KCC_VERSION`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_KCC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__KCC)
+#   define MSGPACK_COMP_KCC_DETECTION MSGPACK_PREDEF_MAKE_0X_VRPP(__KCC_VERSION)
+#endif
+
+#ifdef MSGPACK_COMP_KCC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_KCC_EMULATED MSGPACK_COMP_KCC_DETECTION
+#   else
+#       undef MSGPACK_COMP_KCC
+#       define MSGPACK_COMP_KCC MSGPACK_COMP_KCC_DETECTION
+#   endif
+#   define MSGPACK_COMP_KCC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_KCC_NAME "Kai C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_KCC,MSGPACK_COMP_KCC_NAME)
+
+#ifdef MSGPACK_COMP_KCC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_KCC_EMULATED,MSGPACK_COMP_KCC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/llvm.h b/include/msgpack/predef/compiler/llvm.h
new file mode 100644
index 0000000..cc2b834
--- /dev/null
+++ b/include/msgpack/predef/compiler/llvm.h
@@ -0,0 +1,58 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_LLVM_H
+#define MSGPACK_PREDEF_COMPILER_LLVM_H
+
+/* Other compilers that emulate this one need to be detected first. */
+
+#include <msgpack/predef/compiler/clang.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_LLVM`]
+
+[@http://en.wikipedia.org/wiki/LLVM LLVM] compiler.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__llvm__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_COMP_LLVM MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__llvm__)
+#   define MSGPACK_COMP_LLVM_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#ifdef MSGPACK_COMP_LLVM_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_LLVM_EMULATED MSGPACK_COMP_LLVM_DETECTION
+#   else
+#       undef MSGPACK_COMP_LLVM
+#       define MSGPACK_COMP_LLVM MSGPACK_COMP_LLVM_DETECTION
+#   endif
+#   define MSGPACK_COMP_LLVM_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_LLVM_NAME "LLVM"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_LLVM,MSGPACK_COMP_LLVM_NAME)
+
+#ifdef MSGPACK_COMP_LLVM_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_LLVM_EMULATED,MSGPACK_COMP_LLVM_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/metaware.h b/include/msgpack/predef/compiler/metaware.h
new file mode 100644
index 0000000..0d9d04b
--- /dev/null
+++ b/include/msgpack/predef/compiler/metaware.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_METAWARE_H
+#define MSGPACK_PREDEF_COMPILER_METAWARE_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_HIGHC`]
+
+MetaWare High C/C++ compiler.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__HIGHC__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_COMP_HIGHC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__HIGHC__)
+#   define MSGPACK_COMP_HIGHC_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#ifdef MSGPACK_COMP_HIGHC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_HIGHC_EMULATED MSGPACK_COMP_HIGHC_DETECTION
+#   else
+#       undef MSGPACK_COMP_HIGHC
+#       define MSGPACK_COMP_HIGHC MSGPACK_COMP_HIGHC_DETECTION
+#   endif
+#   define MSGPACK_COMP_HIGHC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_HIGHC_NAME "MetaWare High C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_HIGHC,MSGPACK_COMP_HIGHC_NAME)
+
+#ifdef MSGPACK_COMP_HIGHC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_HIGHC_EMULATED,MSGPACK_COMP_HIGHC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/metrowerks.h b/include/msgpack/predef/compiler/metrowerks.h
new file mode 100644
index 0000000..7162cc7
--- /dev/null
+++ b/include/msgpack/predef/compiler/metrowerks.h
@@ -0,0 +1,78 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_METROWERKS_H
+#define MSGPACK_PREDEF_COMPILER_METROWERKS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_MWERKS`]
+
+[@http://en.wikipedia.org/wiki/CodeWarrior Metrowerks CodeWarrior] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__MWERKS__`] [__predef_detection__]]
+    [[`__CWCC__`] [__predef_detection__]]
+
+    [[`__CWCC__`] [V.R.P]]
+    [[`__MWERKS__`] [V.R.P >= 4.2.0]]
+    [[`__MWERKS__`] [9.R.0]]
+    [[`__MWERKS__`] [8.R.0]]
+    ]
+ */
+
+#define MSGPACK_COMP_MWERKS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__MWERKS__) || defined(__CWCC__)
+#   if !defined(MSGPACK_COMP_MWERKS_DETECTION) && defined(__CWCC__)
+#       define MSGPACK_COMP_MWERKS_DETECTION MSGPACK_PREDEF_MAKE_0X_VRPP(__CWCC__)
+#   endif
+#   if !defined(MSGPACK_COMP_MWERKS_DETECTION) && (__MWERKS__ >= 0x4200)
+#       define MSGPACK_COMP_MWERKS_DETECTION MSGPACK_PREDEF_MAKE_0X_VRPP(__MWERKS__)
+#   endif
+#   if !defined(MSGPACK_COMP_MWERKS_DETECTION) && (__MWERKS__ >= 0x3204) // note the "skip": 04->9.3
+#       define MSGPACK_COMP_MWERKS_DETECTION MSGPACK_VERSION_NUMBER(9,(__MWERKS__)%100-1,0)
+#   endif
+#   if !defined(MSGPACK_COMP_MWERKS_DETECTION) && (__MWERKS__ >= 0x3200)
+#       define MSGPACK_COMP_MWERKS_DETECTION MSGPACK_VERSION_NUMBER(9,(__MWERKS__)%100,0)
+#   endif
+#   if !defined(MSGPACK_COMP_MWERKS_DETECTION) && (__MWERKS__ >= 0x3000)
+#       define MSGPACK_COMP_MWERKS_DETECTION MSGPACK_VERSION_NUMBER(8,(__MWERKS__)%100,0)
+#   endif
+#   if !defined(MSGPACK_COMP_MWERKS_DETECTION)
+#       define MSGPACK_COMP_MWERKS_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_MWERKS_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_MWERKS_EMULATED MSGPACK_COMP_MWERKS_DETECTION
+#   else
+#       undef MSGPACK_COMP_MWERKS
+#       define MSGPACK_COMP_MWERKS MSGPACK_COMP_MWERKS_DETECTION
+#   endif
+#   define MSGPACK_COMP_MWERKS_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_MWERKS_NAME "Metrowerks CodeWarrior"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MWERKS,MSGPACK_COMP_MWERKS_NAME)
+
+#ifdef MSGPACK_COMP_MWERKS_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MWERKS_EMULATED,MSGPACK_COMP_MWERKS_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/microtec.h b/include/msgpack/predef/compiler/microtec.h
new file mode 100644
index 0000000..f6942f2
--- /dev/null
+++ b/include/msgpack/predef/compiler/microtec.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_MICROTEC_H
+#define MSGPACK_PREDEF_COMPILER_MICROTEC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_MRI`]
+
+[@http://www.mentor.com/microtec/ Microtec C/C++] compiler.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_MRI`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_COMP_MRI MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(_MRI)
+#   define MSGPACK_COMP_MRI_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#ifdef MSGPACK_COMP_MRI_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_MRI_EMULATED MSGPACK_COMP_MRI_DETECTION
+#   else
+#       undef MSGPACK_COMP_MRI
+#       define MSGPACK_COMP_MRI MSGPACK_COMP_MRI_DETECTION
+#   endif
+#   define MSGPACK_COMP_MRI_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_MRI_NAME "Microtec C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MRI,MSGPACK_COMP_MRI_NAME)
+
+#ifdef MSGPACK_COMP_MRI_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MRI_EMULATED,MSGPACK_COMP_MRI_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/mpw.h b/include/msgpack/predef/compiler/mpw.h
new file mode 100644
index 0000000..cef0ace
--- /dev/null
+++ b/include/msgpack/predef/compiler/mpw.h
@@ -0,0 +1,64 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_MPW_H
+#define MSGPACK_PREDEF_COMPILER_MPW_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_MPW`]
+
+[@http://en.wikipedia.org/wiki/Macintosh_Programmer%27s_Workshop MPW C++] compiler.
+Version number available as major, and minor.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__MRC__`] [__predef_detection__]]
+    [[`MPW_C`] [__predef_detection__]]
+    [[`MPW_CPLUS`] [__predef_detection__]]
+
+    [[`__MRC__`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_COMP_MPW MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__MRC__) || defined(MPW_C) || defined(MPW_CPLUS)
+#   if !defined(MSGPACK_COMP_MPW_DETECTION) && defined(__MRC__)
+#       define MSGPACK_COMP_MPW_DETECTION MSGPACK_PREDEF_MAKE_0X_VVRR(__MRC__)
+#   endif
+#   if !defined(MSGPACK_COMP_MPW_DETECTION)
+#       define MSGPACK_COMP_MPW_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_MPW_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_MPW_EMULATED MSGPACK_COMP_MPW_DETECTION
+#   else
+#       undef MSGPACK_COMP_MPW
+#       define MSGPACK_COMP_MPW MSGPACK_COMP_MPW_DETECTION
+#   endif
+#   define MSGPACK_COMP_MPW_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_MPW_NAME "MPW C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MPW,MSGPACK_COMP_MPW_NAME)
+
+#ifdef MSGPACK_COMP_MPW_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MPW_EMULATED,MSGPACK_COMP_MPW_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/palm.h b/include/msgpack/predef/compiler/palm.h
new file mode 100644
index 0000000..d3a960e
--- /dev/null
+++ b/include/msgpack/predef/compiler/palm.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_PALM_H
+#define MSGPACK_PREDEF_COMPILER_PALM_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_PALM`]
+
+Palm C/C++ compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_PACC_VER`] [__predef_detection__]]
+
+    [[`_PACC_VER`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_PALM MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(_PACC_VER)
+#   define MSGPACK_COMP_PALM_DETECTION MSGPACK_PREDEF_MAKE_0X_VRRPP000(_PACC_VER)
+#endif
+
+#ifdef MSGPACK_COMP_PALM_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_PALM_EMULATED MSGPACK_COMP_PALM_DETECTION
+#   else
+#       undef MSGPACK_COMP_PALM
+#       define MSGPACK_COMP_PALM MSGPACK_COMP_PALM_DETECTION
+#   endif
+#   define MSGPACK_COMP_PALM_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_PALM_NAME "Palm C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_PALM,MSGPACK_COMP_PALM_NAME)
+
+#ifdef MSGPACK_COMP_PALM_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_PALM_EMULATED,MSGPACK_COMP_PALM_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/pgi.h b/include/msgpack/predef/compiler/pgi.h
new file mode 100644
index 0000000..8bf5086
--- /dev/null
+++ b/include/msgpack/predef/compiler/pgi.h
@@ -0,0 +1,61 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_PGI_H
+#define MSGPACK_PREDEF_COMPILER_PGI_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_PGI`]
+
+[@http://en.wikipedia.org/wiki/The_Portland_Group Portland Group C/C++] compiler.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__PGI`] [__predef_detection__]]
+
+    [[`__PGIC__`, `__PGIC_MINOR__`, `__PGIC_PATCHLEVEL__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_PGI MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__PGI)
+#   if !defined(MSGPACK_COMP_PGI_DETECTION) && (defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__))
+#       define MSGPACK_COMP_PGI_DETECTION MSGPACK_VERSION_NUMBER(__PGIC__,__PGIC_MINOR__,__PGIC_PATCHLEVEL__)
+#   endif
+#   if !defined(MSGPACK_COMP_PGI_DETECTION)
+#       define MSGPACK_COMP_PGI_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_PGI_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_PGI_EMULATED MSGPACK_COMP_PGI_DETECTION
+#   else
+#       undef MSGPACK_COMP_PGI
+#       define MSGPACK_COMP_PGI MSGPACK_COMP_PGI_DETECTION
+#   endif
+#   define MSGPACK_COMP_PGI_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_PGI_NAME "Portland Group C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_PGI,MSGPACK_COMP_PGI_NAME)
+
+#ifdef MSGPACK_COMP_PGI_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_PGI_EMULATED,MSGPACK_COMP_PGI_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/sgi_mipspro.h b/include/msgpack/predef/compiler/sgi_mipspro.h
new file mode 100644
index 0000000..4e1b00b
--- /dev/null
+++ b/include/msgpack/predef/compiler/sgi_mipspro.h
@@ -0,0 +1,67 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_SGI_MIPSPRO_H
+#define MSGPACK_PREDEF_COMPILER_SGI_MIPSPRO_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_SGI`]
+
+[@http://en.wikipedia.org/wiki/MIPSpro SGI MIPSpro] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__sgi`] [__predef_detection__]]
+    [[`sgi`] [__predef_detection__]]
+
+    [[`_SGI_COMPILER_VERSION`] [V.R.P]]
+    [[`_COMPILER_VERSION`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_SGI MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__sgi) || defined(sgi)
+#   if !defined(MSGPACK_COMP_SGI_DETECTION) && defined(_SGI_COMPILER_VERSION)
+#       define MSGPACK_COMP_SGI_DETECTION MSGPACK_PREDEF_MAKE_10_VRP(_SGI_COMPILER_VERSION)
+#   endif
+#   if !defined(MSGPACK_COMP_SGI_DETECTION) && defined(_COMPILER_VERSION)
+#       define MSGPACK_COMP_SGI_DETECTION MSGPACK_PREDEF_MAKE_10_VRP(_COMPILER_VERSION)
+#   endif
+#   if !defined(MSGPACK_COMP_SGI_DETECTION)
+#       define MSGPACK_COMP_SGI_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_SGI_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_SGI_EMULATED MSGPACK_COMP_SGI_DETECTION
+#   else
+#       undef MSGPACK_COMP_SGI
+#       define MSGPACK_COMP_SGI MSGPACK_COMP_SGI_DETECTION
+#   endif
+#   define MSGPACK_COMP_SGI_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_SGI_NAME "SGI MIPSpro"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_SGI,MSGPACK_COMP_SGI_NAME)
+
+#ifdef MSGPACK_COMP_SGI_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_SGI_EMULATED,MSGPACK_COMP_SGI_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/sunpro.h b/include/msgpack/predef/compiler/sunpro.h
new file mode 100644
index 0000000..26e9513
--- /dev/null
+++ b/include/msgpack/predef/compiler/sunpro.h
@@ -0,0 +1,67 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_SUNPRO_H
+#define MSGPACK_PREDEF_COMPILER_SUNPRO_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_SUNPRO`]
+
+[@http://en.wikipedia.org/wiki/Sun_Studio_%28software%29 Sun Studio] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__SUNPRO_CC`] [__predef_detection__]]
+    [[`__SUNPRO_C`] [__predef_detection__]]
+
+    [[`__SUNPRO_CC`] [V.R.P]]
+    [[`__SUNPRO_C`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_SUNPRO MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__SUNPRO_CC) || defined(__SUNPRO_C)
+#   if !defined(MSGPACK_COMP_SUNPRO_DETECTION) && defined(__SUNPRO_CC)
+#       define MSGPACK_COMP_SUNPRO_DETECTION MSGPACK_PREDEF_MAKE_0X_VRP(__SUNPRO_CC)
+#   endif
+#   if !defined(MSGPACK_COMP_SUNPRO_DETECTION) && defined(__SUNPRO_C)
+#       define MSGPACK_COMP_SUNPRO_DETECTION MSGPACK_PREDEF_MAKE_0X_VRP(__SUNPRO_C)
+#   endif
+#   if !defined(MSGPACK_COMP_SUNPRO_DETECTION)
+#       define MSGPACK_COMP_SUNPRO_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_SUNPRO_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_SUNPRO_EMULATED MSGPACK_COMP_SUNPRO_DETECTION
+#   else
+#       undef MSGPACK_COMP_SUNPRO
+#       define MSGPACK_COMP_SUNPRO MSGPACK_COMP_SUNPRO_DETECTION
+#   endif
+#   define MSGPACK_COMP_SUNPRO_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_SUNPRO_NAME "Sun Studio"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_SUNPRO,MSGPACK_COMP_SUNPRO_NAME)
+
+#ifdef MSGPACK_COMP_SUNPRO_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_SUNPRO_EMULATED,MSGPACK_COMP_SUNPRO_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/tendra.h b/include/msgpack/predef/compiler/tendra.h
new file mode 100644
index 0000000..7eaa3c9
--- /dev/null
+++ b/include/msgpack/predef/compiler/tendra.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_TENDRA_H
+#define MSGPACK_PREDEF_COMPILER_TENDRA_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_TENDRA`]
+
+[@http://en.wikipedia.org/wiki/TenDRA_Compiler TenDRA C/C++] compiler.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__TenDRA__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_COMP_TENDRA MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__TenDRA__)
+#   define MSGPACK_COMP_TENDRA_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#ifdef MSGPACK_COMP_TENDRA_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_TENDRA_EMULATED MSGPACK_COMP_TENDRA_DETECTION
+#   else
+#       undef MSGPACK_COMP_TENDRA
+#       define MSGPACK_COMP_TENDRA MSGPACK_COMP_TENDRA_DETECTION
+#   endif
+#   define MSGPACK_COMP_TENDRA_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_TENDRA_NAME "TenDRA C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_TENDRA,MSGPACK_COMP_TENDRA_NAME)
+
+#ifdef MSGPACK_COMP_TENDRA_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_TENDRA_EMULATED,MSGPACK_COMP_TENDRA_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/visualc.h b/include/msgpack/predef/compiler/visualc.h
new file mode 100644
index 0000000..943dd00
--- /dev/null
+++ b/include/msgpack/predef/compiler/visualc.h
@@ -0,0 +1,92 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_VISUALC_H
+#define MSGPACK_PREDEF_COMPILER_VISUALC_H
+
+/* Other compilers that emulate this one need to be detected first. */
+
+#include <msgpack/predef/compiler/clang.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_MSVC`]
+
+[@http://en.wikipedia.org/wiki/Visual_studio Microsoft Visual C/C++] compiler.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_MSC_VER`] [__predef_detection__]]
+
+    [[`_MSC_FULL_VER`] [V.R.P]]
+    [[`_MSC_VER`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_COMP_MSVC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(_MSC_VER)
+#   if !defined (_MSC_FULL_VER)
+#       define MSGPACK_COMP_MSVC_BUILD 0
+#   else
+        /* how many digits does the build number have? */
+#       if _MSC_FULL_VER / 10000 == _MSC_VER
+            /* four digits */
+#           define MSGPACK_COMP_MSVC_BUILD (_MSC_FULL_VER % 10000)
+#       elif _MSC_FULL_VER / 100000 == _MSC_VER
+            /* five digits */
+#           define MSGPACK_COMP_MSVC_BUILD (_MSC_FULL_VER % 100000)
+#       else
+#           error "Cannot determine build number from _MSC_FULL_VER"
+#       endif
+#   endif
+    /*
+    VS2014 was skipped in the release sequence for MS. Which
+    means that the compiler and VS product versions are no longer
+    in sync. Hence we need to use different formulas for
+    mapping from MSC version to VS product version.
+    */
+#   if (_MSC_VER >= 1900)
+#       define MSGPACK_COMP_MSVC_DETECTION MSGPACK_VERSION_NUMBER(\
+            _MSC_VER/100-5,\
+            _MSC_VER%100,\
+            MSGPACK_COMP_MSVC_BUILD)
+#   else
+#       define MSGPACK_COMP_MSVC_DETECTION MSGPACK_VERSION_NUMBER(\
+            _MSC_VER/100-6,\
+            _MSC_VER%100,\
+            MSGPACK_COMP_MSVC_BUILD)
+#   endif
+#endif
+
+#ifdef MSGPACK_COMP_MSVC_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_MSVC_EMULATED MSGPACK_COMP_MSVC_DETECTION
+#   else
+#       undef MSGPACK_COMP_MSVC
+#       define MSGPACK_COMP_MSVC MSGPACK_COMP_MSVC_DETECTION
+#   endif
+#   define MSGPACK_COMP_MSVC_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_MSVC_NAME "Microsoft Visual C/C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MSVC,MSGPACK_COMP_MSVC_NAME)
+
+#ifdef MSGPACK_COMP_MSVC_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_MSVC_EMULATED,MSGPACK_COMP_MSVC_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/compiler/watcom.h b/include/msgpack/predef/compiler/watcom.h
new file mode 100644
index 0000000..705d041
--- /dev/null
+++ b/include/msgpack/predef/compiler/watcom.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_WATCOM_H
+#define MSGPACK_PREDEF_COMPILER_WATCOM_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_COMP_WATCOM`]
+
+[@http://en.wikipedia.org/wiki/Watcom Watcom C++] compiler.
+Version number available as major, and minor.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__WATCOMC__`] [__predef_detection__]]
+
+    [[`__WATCOMC__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_COMP_WATCOM MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__WATCOMC__)
+#   define MSGPACK_COMP_WATCOM_DETECTION MSGPACK_PREDEF_MAKE_10_VVRR(__WATCOMC__)
+#endif
+
+#ifdef MSGPACK_COMP_WATCOM_DETECTION
+#   if defined(MSGPACK_PREDEF_DETAIL_COMP_DETECTED)
+#       define MSGPACK_COMP_WATCOM_EMULATED MSGPACK_COMP_WATCOM_DETECTION
+#   else
+#       undef MSGPACK_COMP_WATCOM
+#       define MSGPACK_COMP_WATCOM MSGPACK_COMP_WATCOM_DETECTION
+#   endif
+#   define MSGPACK_COMP_WATCOM_AVAILABLE
+#   include <msgpack/predef/detail/comp_detected.h>
+#endif
+
+#define MSGPACK_COMP_WATCOM_NAME "Watcom C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_WATCOM,MSGPACK_COMP_WATCOM_NAME)
+
+#ifdef MSGPACK_COMP_WATCOM_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_COMP_WATCOM_EMULATED,MSGPACK_COMP_WATCOM_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/detail/_cassert.h b/include/msgpack/predef/detail/_cassert.h
new file mode 100644
index 0000000..b1cb6bc
--- /dev/null
+++ b/include/msgpack/predef/detail/_cassert.h
@@ -0,0 +1,17 @@
+/*
+Copyright Rene Rivera 2011-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL__CASSERT_H
+#define MSGPACK_PREDEF_DETAIL__CASSERT_H
+
+#if defined(__cpluplus)
+#include <cassert>
+#else
+#include <assert.h>
+#endif
+
+#endif
diff --git a/include/msgpack/predef/detail/_exception.h b/include/msgpack/predef/detail/_exception.h
new file mode 100644
index 0000000..963f37b
--- /dev/null
+++ b/include/msgpack/predef/detail/_exception.h
@@ -0,0 +1,15 @@
+/*
+Copyright Rene Rivera 2011-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL__EXCEPTION_H
+#define MSGPACK_PREDEF_DETAIL__EXCEPTION_H
+
+#if defined(__cpluplus)
+#include <exception>
+#endif
+
+#endif
diff --git a/include/msgpack/predef/detail/comp_detected.h b/include/msgpack/predef/detail/comp_detected.h
new file mode 100644
index 0000000..3996fd3
--- /dev/null
+++ b/include/msgpack/predef/detail/comp_detected.h
@@ -0,0 +1,10 @@
+/*
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL_COMP_DETECTED
+#define MSGPACK_PREDEF_DETAIL_COMP_DETECTED 1
+#endif
diff --git a/include/msgpack/predef/detail/endian_compat.h b/include/msgpack/predef/detail/endian_compat.h
new file mode 100644
index 0000000..1b4a665
--- /dev/null
+++ b/include/msgpack/predef/detail/endian_compat.h
@@ -0,0 +1,26 @@
+/*
+Copyright Rene Rivera 2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL_ENDIAN_COMPAT_H
+#define MSGPACK_PREDEF_DETAIL_ENDIAN_COMPAT_H
+
+#include <msgpack/predef/other/endian.h>
+
+#if MSGPACK_ENDIAN_BIG_BYTE
+#   define MSGPACK_BIG_ENDIAN
+#   define MSGPACK_BYTE_ORDER 4321
+#endif
+#if MSGPACK_ENDIAN_LITTLE_BYTE
+#   define MSGPACK_LITTLE_ENDIAN
+#   define MSGPACK_BYTE_ORDER 1234
+#endif
+#if MSGPACK_ENDIAN_LITTLE_WORD
+#   define MSGPACK_PDP_ENDIAN
+#   define MSGPACK_BYTE_ORDER 2134
+#endif
+
+#endif
diff --git a/include/msgpack/predef/detail/os_detected.h b/include/msgpack/predef/detail/os_detected.h
new file mode 100644
index 0000000..f9f23b7
--- /dev/null
+++ b/include/msgpack/predef/detail/os_detected.h
@@ -0,0 +1,10 @@
+/*
+Copyright Rene Rivera 2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL_OS_DETECTED
+#define MSGPACK_PREDEF_DETAIL_OS_DETECTED 1
+#endif
diff --git a/include/msgpack/predef/detail/platform_detected.h b/include/msgpack/predef/detail/platform_detected.h
new file mode 100644
index 0000000..782b3a2
--- /dev/null
+++ b/include/msgpack/predef/detail/platform_detected.h
@@ -0,0 +1,10 @@
+/*
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL_PLAT_DETECTED
+#define MSGPACK_PREDEF_DETAIL_PLAT_DETECTED 1
+#endif
diff --git a/include/msgpack/predef/detail/test.h b/include/msgpack/predef/detail/test.h
new file mode 100644
index 0000000..1414060
--- /dev/null
+++ b/include/msgpack/predef/detail/test.h
@@ -0,0 +1,17 @@
+/*
+Copyright Rene Rivera 2011-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_DETAIL_TEST_H
+#define MSGPACK_PREDEF_DETAIL_TEST_H
+
+#if !defined(MSGPACK_PREDEF_INTERNAL_GENERATE_TESTS)
+
+#define MSGPACK_PREDEF_DECLARE_TEST(x,s)
+
+#endif
+
+#endif
diff --git a/include/msgpack/predef/language.h b/include/msgpack/predef/language.h
new file mode 100644
index 0000000..8520187
--- /dev/null
+++ b/include/msgpack/predef/language.h
@@ -0,0 +1,15 @@
+/*
+Copyright Rene Rivera 2011-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LANGUAGE_H
+#define MSGPACK_PREDEF_LANGUAGE_H
+
+#include <msgpack/predef/language/stdc.h>
+#include <msgpack/predef/language/stdcpp.h>
+#include <msgpack/predef/language/objc.h>
+
+#endif
diff --git a/include/msgpack/predef/language/objc.h b/include/msgpack/predef/language/objc.h
new file mode 100644
index 0000000..0b0cb41
--- /dev/null
+++ b/include/msgpack/predef/language/objc.h
@@ -0,0 +1,43 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LANGUAGE_OBJC_H
+#define MSGPACK_PREDEF_LANGUAGE_OBJC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LANG_OBJC`]
+
+[@http://en.wikipedia.org/wiki/Objective-C Objective-C] language.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__OBJC__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_LANG_OBJC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__OBJC__)
+#   undef MSGPACK_LANG_OBJC
+#   define MSGPACK_LANG_OBJC MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_LANG_OBJC
+#   define MSGPACK_LANG_OBJC_AVAILABLE
+#endif
+
+#define MSGPACK_LANG_OBJC_NAME "Objective-C"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LANG_OBJC,MSGPACK_LANG_OBJC_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/language/stdc.h b/include/msgpack/predef/language/stdc.h
new file mode 100644
index 0000000..a913c32
--- /dev/null
+++ b/include/msgpack/predef/language/stdc.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2011-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LANGUAGE_STDC_H
+#define MSGPACK_PREDEF_LANGUAGE_STDC_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LANG_STDC`]
+
+[@http://en.wikipedia.org/wiki/C_(programming_language) Standard C] language.
+If available, the year of the standard is detected as YYYY.MM.1 from the Epoc date.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__STDC__`] [__predef_detection__]]
+
+    [[`__STDC_VERSION__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LANG_STDC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__STDC__)
+#   undef MSGPACK_LANG_STDC
+#   if defined(__STDC_VERSION__)
+#       if (__STDC_VERSION__ > 100)
+#           define MSGPACK_LANG_STDC MSGPACK_PREDEF_MAKE_YYYYMM(__STDC_VERSION__)
+#       else
+#           define MSGPACK_LANG_STDC MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#   else
+#       define MSGPACK_LANG_STDC MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LANG_STDC
+#   define MSGPACK_LANG_STDC_AVAILABLE
+#endif
+
+#define MSGPACK_LANG_STDC_NAME "Standard C"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LANG_STDC,MSGPACK_LANG_STDC_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/language/stdcpp.h b/include/msgpack/predef/language/stdcpp.h
new file mode 100644
index 0000000..5915489
--- /dev/null
+++ b/include/msgpack/predef/language/stdcpp.h
@@ -0,0 +1,124 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LANGUAGE_STDCPP_H
+#define MSGPACK_PREDEF_LANGUAGE_STDCPP_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LANG_STDCPP`]
+
+[@http://en.wikipedia.org/wiki/C%2B%2B Standard C++] language.
+If available, the year of the standard is detected as YYYY.MM.1 from the Epoc date.
+Because of the way the C++ standardization process works the
+defined version year will not be the commonly known year of the standard.
+Specifically the defined versions are:
+
+[table Detected Version Number vs. C++ Standard Year
+  [[Detected Version Number] [Standard Year] [C++ Standard]]
+  [[27.11.1] [1998] [ISO/IEC 14882:1998]]
+  [[41.12.1] [2011] [ISO/IEC 14882:2011]]
+]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__cplusplus`] [__predef_detection__]]
+
+    [[`__cplusplus`] [YYYY.MM.1]]
+    ]
+ */
+
+#define MSGPACK_LANG_STDCPP MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__cplusplus)
+#   undef MSGPACK_LANG_STDCPP
+#   if (__cplusplus > 100)
+#       define MSGPACK_LANG_STDCPP MSGPACK_PREDEF_MAKE_YYYYMM(__cplusplus)
+#   else
+#       define MSGPACK_LANG_STDCPP MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LANG_STDCPP
+#   define MSGPACK_LANG_STDCPP_AVAILABLE
+#endif
+
+#define MSGPACK_LANG_STDCPP_NAME "Standard C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LANG_STDCPP,MSGPACK_LANG_STDCPP_NAME)
+
+
+/*`
+[heading `MSGPACK_LANG_STDCPPCLI`]
+
+[@http://en.wikipedia.org/wiki/C%2B%2B/CLI Standard C++/CLI] language.
+If available, the year of the standard is detected as YYYY.MM.1 from the Epoc date.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__cplusplus_cli`] [__predef_detection__]]
+
+    [[`__cplusplus_cli`] [YYYY.MM.1]]
+    ]
+ */
+
+#define MSGPACK_LANG_STDCPPCLI MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__cplusplus_cli)
+#   undef MSGPACK_LANG_STDCPPCLI
+#   if (__cplusplus_cli > 100)
+#       define MSGPACK_LANG_STDCPPCLI MSGPACK_PREDEF_MAKE_YYYYMM(__cplusplus_cli)
+#   else
+#       define MSGPACK_LANG_STDCPPCLI MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LANG_STDCPPCLI
+#   define MSGPACK_LANG_STDCPPCLI_AVAILABLE
+#endif
+
+#define MSGPACK_LANG_STDCPPCLI_NAME "Standard C++/CLI"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LANG_STDCPPCLI,MSGPACK_LANG_STDCPPCLI_NAME)
+
+
+/*`
+[heading `MSGPACK_LANG_STDECPP`]
+
+[@http://en.wikipedia.org/wiki/Embedded_C%2B%2B Standard Embedded C++] language.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__embedded_cplusplus`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_LANG_STDECPP MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__embedded_cplusplus)
+#   undef MSGPACK_LANG_STDECPP
+#   define MSGPACK_LANG_STDECPP MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_LANG_STDECPP
+#   define MSGPACK_LANG_STDECPP_AVAILABLE
+#endif
+
+#define MSGPACK_LANG_STDECPP_NAME "Standard Embedded C++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LANG_STDECPP,MSGPACK_LANG_STDECPP_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library.h b/include/msgpack/predef/library.h
new file mode 100644
index 0000000..20ecc56
--- /dev/null
+++ b/include/msgpack/predef/library.h
@@ -0,0 +1,14 @@
+/*
+Copyright Rene Rivera 2008-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_H
+#define MSGPACK_PREDEF_LIBRARY_H
+
+#include <msgpack/predef/library/c.h>
+#include <msgpack/predef/library/std.h>
+
+#endif
diff --git a/include/msgpack/predef/library/c.h b/include/msgpack/predef/library/c.h
new file mode 100644
index 0000000..4794a8d
--- /dev/null
+++ b/include/msgpack/predef/library/c.h
@@ -0,0 +1,18 @@
+/*
+Copyright Rene Rivera 2008-2012
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_C_H
+#define MSGPACK_PREDEF_LIBRARY_C_H
+
+#include <msgpack/predef/library/c/_prefix.h>
+
+#include <msgpack/predef/library/c/gnu.h>
+#include <msgpack/predef/library/c/uc.h>
+#include <msgpack/predef/library/c/vms.h>
+#include <msgpack/predef/library/c/zos.h>
+
+#endif
diff --git a/include/msgpack/predef/library/c/_prefix.h b/include/msgpack/predef/library/c/_prefix.h
new file mode 100644
index 0000000..d16c373
--- /dev/null
+++ b/include/msgpack/predef/library/c/_prefix.h
@@ -0,0 +1,13 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_C__PREFIX_H
+#define MSGPACK_PREDEF_LIBRARY_C__PREFIX_H
+
+#include <msgpack/predef/detail/_cassert.h>
+
+#endif
diff --git a/include/msgpack/predef/library/c/gnu.h b/include/msgpack/predef/library/c/gnu.h
new file mode 100644
index 0000000..9e8f5d6
--- /dev/null
+++ b/include/msgpack/predef/library/c/gnu.h
@@ -0,0 +1,62 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_C_GNU_H
+#define MSGPACK_PREDEF_LIBRARY_C_GNU_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+#include <msgpack/predef/library/c/_prefix.h>
+
+#if defined(__STDC__)
+#include <stddef.h>
+#elif defined(__cplusplus)
+#include <cstddef>
+#endif
+
+/*`
+[heading `MSGPACK_LIB_C_GNU`]
+
+[@http://en.wikipedia.org/wiki/Glibc GNU glibc] Standard C library.
+Version number available as major, and minor.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__GLIBC__`] [__predef_detection__]]
+    [[`__GNU_LIBRARY__`] [__predef_detection__]]
+
+    [[`__GLIBC__`, `__GLIBC_MINOR__`] [V.R.0]]
+    [[`__GNU_LIBRARY__`, `__GNU_LIBRARY_MINOR__`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_LIB_C_GNU MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__GLIBC__) || defined(__GNU_LIBRARY__)
+#   undef MSGPACK_LIB_C_GNU
+#   if defined(__GLIBC__)
+#       define MSGPACK_LIB_C_GNU \
+            MSGPACK_VERSION_NUMBER(__GLIBC__,__GLIBC_MINOR__,0)
+#   else
+#       define MSGPACK_LIB_C_GNU \
+            MSGPACK_VERSION_NUMBER(__GNU_LIBRARY__,__GNU_LIBRARY_MINOR__,0)
+#   endif
+#endif
+
+#if MSGPACK_LIB_C_GNU
+#   define MSGPACK_LIB_C_GNU_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_C_GNU_NAME "GNU"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_C_GNU,MSGPACK_LIB_C_GNU_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/c/uc.h b/include/msgpack/predef/library/c/uc.h
new file mode 100644
index 0000000..7dbd838
--- /dev/null
+++ b/include/msgpack/predef/library/c/uc.h
@@ -0,0 +1,48 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_C_UC_H
+#define MSGPACK_PREDEF_LIBRARY_C_UC_H
+
+#include <msgpack/predef/library/c/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_C_UC`]
+
+[@http://en.wikipedia.org/wiki/Uclibc uClibc] Standard C library.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__UCLIBC__`] [__predef_detection__]]
+
+    [[`__UCLIBC_MAJOR__`, `__UCLIBC_MINOR__`, `__UCLIBC_SUBLEVEL__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_C_UC MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__UCLIBC__)
+#   undef MSGPACK_LIB_C_UC
+#   define MSGPACK_LIB_C_UC MSGPACK_VERSION_NUMBER(\
+        __UCLIBC_MAJOR__,__UCLIBC_MINOR__,__UCLIBC_SUBLEVEL__)
+#endif
+
+#if MSGPACK_LIB_C_UC
+#   define MSGPACK_LIB_C_UC_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_C_UC_NAME "uClibc"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_C_UC,MSGPACK_LIB_C_UC_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/c/vms.h b/include/msgpack/predef/library/c/vms.h
new file mode 100644
index 0000000..c2ef4d3
--- /dev/null
+++ b/include/msgpack/predef/library/c/vms.h
@@ -0,0 +1,48 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_C_VMS_H
+#define MSGPACK_PREDEF_LIBRARY_C_VMS_H
+
+#include <msgpack/predef/library/c/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_C_VMS`]
+
+VMS libc Standard C library.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__CRTL_VER`] [__predef_detection__]]
+
+    [[`__CRTL_VER`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_C_VMS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__CRTL_VER)
+#   undef MSGPACK_LIB_C_VMS
+#   define MSGPACK_LIB_C_VMS MSGPACK_PREDEF_MAKE_10_VVRR0PP00(__CRTL_VER)
+#endif
+
+#if MSGPACK_LIB_C_VMS
+#   define MSGPACK_LIB_C_VMS_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_C_VMS_NAME "VMS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_C_VMS,MSGPACK_LIB_C_VMS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/c/zos.h b/include/msgpack/predef/library/c/zos.h
new file mode 100644
index 0000000..67cb504
--- /dev/null
+++ b/include/msgpack/predef/library/c/zos.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_C_ZOS_H
+#define MSGPACK_PREDEF_LIBRARY_C_ZOS_H
+
+#include <msgpack/predef/library/c/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_C_ZOS`]
+
+z/OS libc Standard C library.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__LIBREL__`] [__predef_detection__]]
+
+    [[`__LIBREL__`] [V.R.P]]
+    [[`__TARGET_LIB__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_C_ZOS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__LIBREL__)
+#   undef MSGPACK_LIB_C_ZOS
+#   if !defined(MSGPACK_LIB_C_ZOS) && defined(__LIBREL__)
+#       define MSGPACK_LIB_C_ZOS MSGPACK_PREDEF_MAKE_0X_VRRPPPP(__LIBREL__)
+#   endif
+#   if !defined(MSGPACK_LIB_C_ZOS) && defined(__TARGET_LIB__)
+#       define MSGPACK_LIB_C_ZOS MSGPACK_PREDEF_MAKE_0X_VRRPPPP(__TARGET_LIB__)
+#   endif
+#   if !defined(MSGPACK_LIB_C_ZOS)
+#       define MSGPACK_LIB_C_ZOS MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LIB_C_ZOS
+#   define MSGPACK_LIB_C_ZOS_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_C_ZOS_NAME "z/OS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_C_ZOS,MSGPACK_LIB_C_ZOS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std.h b/include/msgpack/predef/library/std.h
new file mode 100644
index 0000000..7e5b208
--- /dev/null
+++ b/include/msgpack/predef/library/std.h
@@ -0,0 +1,23 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_H
+#define MSGPACK_PREDEF_LIBRARY_STD_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/library/std/cxx.h>
+#include <msgpack/predef/library/std/dinkumware.h>
+#include <msgpack/predef/library/std/libcomo.h>
+#include <msgpack/predef/library/std/modena.h>
+#include <msgpack/predef/library/std/msl.h>
+#include <msgpack/predef/library/std/roguewave.h>
+#include <msgpack/predef/library/std/sgi.h>
+#include <msgpack/predef/library/std/stdcpp3.h>
+#include <msgpack/predef/library/std/stlport.h>
+#include <msgpack/predef/library/std/vacpp.h>
+
+#endif
diff --git a/include/msgpack/predef/library/std/_prefix.h b/include/msgpack/predef/library/std/_prefix.h
new file mode 100644
index 0000000..6f9f566
--- /dev/null
+++ b/include/msgpack/predef/library/std/_prefix.h
@@ -0,0 +1,23 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+#ifndef MSGPACK_PREDEF_LIBRARY_STD__PREFIX_H
+#define MSGPACK_PREDEF_LIBRARY_STD__PREFIX_H
+
+/*
+We need to include an STD header to gives us the context
+of which library we are using. The "smallest" code-wise header
+seems to be <exception>. Boost uses <utility> but as far
+as I can tell (RR) it's not a stand-alone header in most
+implementations. Using <exception> also has the benefit of
+being available in EC++, so we get a chance to make this work
+for embedded users. And since it's not a header impacted by TR1
+there's no magic needed for inclusion in the face of the
+Boost.TR1 library.
+*/
+#include <msgpack/predef/detail/_exception.h>
+
+#endif
diff --git a/include/msgpack/predef/library/std/cxx.h b/include/msgpack/predef/library/std/cxx.h
new file mode 100644
index 0000000..16d2a70
--- /dev/null
+++ b/include/msgpack/predef/library/std/cxx.h
@@ -0,0 +1,47 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_CXX_H
+#define MSGPACK_PREDEF_LIBRARY_STD_CXX_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_CXX`]
+
+[@http://libcxx.llvm.org/ libc++] C++ Standard Library.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_LIBCPP_VERSION`] [__predef_detection__]]
+
+    [[`_LIBCPP_VERSION`] [V.0.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_CXX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(_LIBCPP_VERSION)
+#   undef MSGPACK_LIB_STD_CXX
+#   define MSGPACK_LIB_STD_CXX MSGPACK_PREDEF_MAKE_10_VPPP(_LIBCPP_VERSION)
+#endif
+
+#if MSGPACK_LIB_STD_CXX
+#   define MSGPACK_LIB_STD_CXX_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_CXX_NAME "libc++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_CXX,MSGPACK_LIB_STD_CXX_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/dinkumware.h b/include/msgpack/predef/library/std/dinkumware.h
new file mode 100644
index 0000000..2bda26f
--- /dev/null
+++ b/include/msgpack/predef/library/std/dinkumware.h
@@ -0,0 +1,53 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_DINKUMWARE_H
+#define MSGPACK_PREDEF_LIBRARY_STD_DINKUMWARE_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_DINKUMWARE`]
+
+[@http://en.wikipedia.org/wiki/Dinkumware Dinkumware] Standard C++ Library.
+If available version number as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_YVALS`, `__IBMCPP__`] [__predef_detection__]]
+    [[`_CPPLIB_VER`] [__predef_detection__]]
+
+    [[`_CPPLIB_VER`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_DINKUMWARE MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if (defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)
+#   undef MSGPACK_LIB_STD_DINKUMWARE
+#   if defined(_CPPLIB_VER)
+#       define MSGPACK_LIB_STD_DINKUMWARE MSGPACK_PREDEF_MAKE_10_VVRR(_CPPLIB_VER)
+#   else
+#       define MSGPACK_LIB_STD_DINKUMWARE MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LIB_STD_DINKUMWARE
+#   define MSGPACK_LIB_STD_DINKUMWARE_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_DINKUMWARE_NAME "Dinkumware"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_DINKUMWARE,MSGPACK_LIB_STD_DINKUMWARE_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/libcomo.h b/include/msgpack/predef/library/std/libcomo.h
new file mode 100644
index 0000000..590f865
--- /dev/null
+++ b/include/msgpack/predef/library/std/libcomo.h
@@ -0,0 +1,48 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_LIBCOMO_H
+#define MSGPACK_PREDEF_LIBRARY_STD_LIBCOMO_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_COMO`]
+
+[@http://www.comeaucomputing.com/libcomo/ Comeau Computing] Standard C++ Library.
+Version number available as major.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__LIBCOMO__`] [__predef_detection__]]
+
+    [[`__LIBCOMO_VERSION__`] [V.0.0]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_COMO MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__LIBCOMO__)
+#   undef MSGPACK_LIB_STD_COMO
+#   define MSGPACK_LIB_STD_COMO MSGPACK_VERSION_NUMBER(__LIBCOMO_VERSION__,0,0)
+#endif
+
+#if MSGPACK_LIB_STD_COMO
+#   define MSGPACK_LIB_STD_COMO_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_COMO_NAME "Comeau Computing"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_COMO,MSGPACK_LIB_STD_COMO_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/modena.h b/include/msgpack/predef/library/std/modena.h
new file mode 100644
index 0000000..ff0582a
--- /dev/null
+++ b/include/msgpack/predef/library/std/modena.h
@@ -0,0 +1,46 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_MODENA_H
+#define MSGPACK_PREDEF_LIBRARY_STD_MODENA_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_MSIPL`]
+
+[@http://modena.us/ Modena Software Lib++] Standard C++ Library.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`MSIPL_COMPILE_H`] [__predef_detection__]]
+    [[`__MSIPL_COMPILE_H`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_MSIPL MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(MSIPL_COMPILE_H) || defined(__MSIPL_COMPILE_H)
+#   undef MSGPACK_LIB_STD_MSIPL
+#   define MSGPACK_LIB_STD_MSIPL MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_LIB_STD_MSIPL
+#   define MSGPACK_LIB_STD_MSIPL_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_MSIPL_NAME "Modena Software Lib++"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_MSIPL,MSGPACK_LIB_STD_MSIPL_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/msl.h b/include/msgpack/predef/library/std/msl.h
new file mode 100644
index 0000000..aa4cc2a
--- /dev/null
+++ b/include/msgpack/predef/library/std/msl.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_MSL_H
+#define MSGPACK_PREDEF_LIBRARY_STD_MSL_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_MSL`]
+
+[@http://www.freescale.com/ Metrowerks] Standard C++ Library.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__MSL_CPP__`] [__predef_detection__]]
+    [[`__MSL__`] [__predef_detection__]]
+
+    [[`__MSL_CPP__`] [V.R.P]]
+    [[`__MSL__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_MSL MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__MSL_CPP__) || defined(__MSL__)
+#   undef MSGPACK_LIB_STD_MSL
+#   if defined(__MSL_CPP__)
+#       define MSGPACK_LIB_STD_MSL MSGPACK_PREDEF_MAKE_0X_VRPP(__MSL_CPP__)
+#   else
+#       define MSGPACK_LIB_STD_MSL MSGPACK_PREDEF_MAKE_0X_VRPP(__MSL__)
+#   endif
+#endif
+
+#if MSGPACK_LIB_STD_MSL
+#   define MSGPACK_LIB_STD_MSL_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_MSL_NAME "Metrowerks"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_MSL,MSGPACK_LIB_STD_MSL_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/roguewave.h b/include/msgpack/predef/library/std/roguewave.h
new file mode 100644
index 0000000..2990496
--- /dev/null
+++ b/include/msgpack/predef/library/std/roguewave.h
@@ -0,0 +1,57 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_ROGUEWAVE_H
+#define MSGPACK_PREDEF_LIBRARY_STD_ROGUEWAVE_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_RW`]
+
+[@http://stdcxx.apache.org/ Roguewave] Standard C++ library.
+If available version number as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__STD_RWCOMPILER_H__`] [__predef_detection__]]
+    [[`_RWSTD_VER`] [__predef_detection__]]
+
+    [[`_RWSTD_VER`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_RW MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+#   undef MSGPACK_LIB_STD_RW
+#   if defined(_RWSTD_VER)
+#       if _RWSTD_VER < 0x010000
+#           define MSGPACK_LIB_STD_RW MSGPACK_PREDEF_MAKE_0X_VVRRP(_RWSTD_VER)
+#       else
+#           define MSGPACK_LIB_STD_RW MSGPACK_PREDEF_MAKE_0X_VVRRPP(_RWSTD_VER)
+#       endif
+#   else
+#       define MSGPACK_LIB_STD_RW MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LIB_STD_RW
+#   define MSGPACK_LIB_STD_RW_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_RW_NAME "Roguewave"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_RW,MSGPACK_LIB_STD_RW_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/sgi.h b/include/msgpack/predef/library/std/sgi.h
new file mode 100644
index 0000000..ea081bb
--- /dev/null
+++ b/include/msgpack/predef/library/std/sgi.h
@@ -0,0 +1,52 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_SGI_H
+#define MSGPACK_PREDEF_LIBRARY_STD_SGI_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_SGI`]
+
+[@http://www.sgi.com/tech/stl/ SGI] Standard C++ library.
+If available version number as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__STL_CONFIG_H`] [__predef_detection__]]
+
+    [[`__SGI_STL`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_SGI MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__STL_CONFIG_H)
+#   undef MSGPACK_LIB_STD_SGI
+#   if defined(__SGI_STL)
+#       define MSGPACK_LIB_STD_SGI MSGPACK_PREDEF_MAKE_0X_VRP(__SGI_STL)
+#   else
+#       define MSGPACK_LIB_STD_SGI MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_LIB_STD_SGI
+#   define MSGPACK_LIB_STD_SGI_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_SGI_NAME "SGI"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_SGI,MSGPACK_LIB_STD_SGI_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/stdcpp3.h b/include/msgpack/predef/library/std/stdcpp3.h
new file mode 100644
index 0000000..2758f70
--- /dev/null
+++ b/include/msgpack/predef/library/std/stdcpp3.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_STDCPP3_H
+#define MSGPACK_PREDEF_LIBRARY_STD_STDCPP3_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_GNU`]
+
+[@http://gcc.gnu.org/libstdc++/ GNU libstdc++] Standard C++ library.
+Version number available as year (from 1970), month, and day.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__GLIBCXX__`] [__predef_detection__]]
+    [[`__GLIBCPP__`] [__predef_detection__]]
+
+    [[`__GLIBCXX__`] [V.R.P]]
+    [[`__GLIBCPP__`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_GNU MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__GLIBCPP__) || defined(__GLIBCXX__)
+#   undef MSGPACK_LIB_STD_GNU
+#   if defined(__GLIBCXX__)
+#       define MSGPACK_LIB_STD_GNU MSGPACK_PREDEF_MAKE_YYYYMMDD(__GLIBCXX__)
+#   else
+#       define MSGPACK_LIB_STD_GNU MSGPACK_PREDEF_MAKE_YYYYMMDD(__GLIBCPP__)
+#   endif
+#endif
+
+#if MSGPACK_LIB_STD_GNU
+#   define MSGPACK_LIB_STD_GNU_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_GNU_NAME "GNU"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_GNU,MSGPACK_LIB_STD_GNU_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/stlport.h b/include/msgpack/predef/library/std/stlport.h
new file mode 100644
index 0000000..5b9eccc
--- /dev/null
+++ b/include/msgpack/predef/library/std/stlport.h
@@ -0,0 +1,60 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_STLPORT_H
+#define MSGPACK_PREDEF_LIBRARY_STD_STLPORT_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_STLPORT`]
+
+[@http://sourceforge.net/projects/stlport/ STLport Standard C++] library.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__SGI_STL_PORT`] [__predef_detection__]]
+    [[`_STLPORT_VERSION`] [__predef_detection__]]
+
+    [[`_STLPORT_MAJOR`, `_STLPORT_MINOR`, `_STLPORT_PATCHLEVEL`] [V.R.P]]
+    [[`_STLPORT_VERSION`] [V.R.P]]
+    [[`__SGI_STL_PORT`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_STLPORT MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)
+#   undef MSGPACK_LIB_STD_STLPORT
+#   if !defined(MSGPACK_LIB_STD_STLPORT) && defined(_STLPORT_MAJOR)
+#       define MSGPACK_LIB_STD_STLPORT \
+            MSGPACK_VERSION_NUMBER(_STLPORT_MAJOR,_STLPORT_MINOR,_STLPORT_PATCHLEVEL)
+#   endif
+#   if !defined(MSGPACK_LIB_STD_STLPORT) && defined(_STLPORT_VERSION)
+#       define MSGPACK_LIB_STD_STLPORT MSGPACK_PREDEF_MAKE_0X_VRP(_STLPORT_VERSION)
+#   endif
+#   if !defined(MSGPACK_LIB_STD_STLPORT)
+#       define MSGPACK_LIB_STD_STLPORT MSGPACK_PREDEF_MAKE_0X_VRP(__SGI_STL_PORT)
+#   endif
+#endif
+
+#if MSGPACK_LIB_STD_STLPORT
+#   define MSGPACK_LIB_STD_STLPORT_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_STLPORT_NAME "STLport"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_STLPORT,MSGPACK_LIB_STD_STLPORT_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/library/std/vacpp.h b/include/msgpack/predef/library/std/vacpp.h
new file mode 100644
index 0000000..488a186
--- /dev/null
+++ b/include/msgpack/predef/library/std/vacpp.h
@@ -0,0 +1,45 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_LIBRARY_STD_VACPP_H
+#define MSGPACK_PREDEF_LIBRARY_STD_VACPP_H
+
+#include <msgpack/predef/library/std/_prefix.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_LIB_STD_IBM`]
+
+[@http://www.ibm.com/software/awdtools/xlcpp/ IBM VACPP Standard C++] library.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__IBMCPP__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_LIB_STD_IBM MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__IBMCPP__)
+#   undef MSGPACK_LIB_STD_IBM
+#   define MSGPACK_LIB_STD_IBM MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_LIB_STD_IBM
+#   define MSGPACK_LIB_STD_IBM_AVAILABLE
+#endif
+
+#define MSGPACK_LIB_STD_IBM_NAME "IBM VACPP"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_LIB_STD_IBM,MSGPACK_LIB_STD_IBM_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/make.h b/include/msgpack/predef/make.h
new file mode 100644
index 0000000..6a572b5
--- /dev/null
+++ b/include/msgpack/predef/make.h
@@ -0,0 +1,89 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+#include <msgpack/predef/detail/test.h>
+
+#ifndef MSGPACK_PREDEF_MAKE_H
+#define MSGPACK_PREDEF_MAKE_H
+
+/*
+Shorthands for the common version number formats used by vendors...
+*/
+
+/*`
+[heading `MSGPACK_PREDEF_MAKE_..` macros]
+
+These set of macros decompose common vendor version number
+macros which are composed version, revision, and patch digits.
+The naming convention indicates:
+
+* The base of the specified version number. "`MSGPACK_PREDEF_MAKE_0X`" for
+  hexadecimal digits, and "`MSGPACK_PREDEF_MAKE_10`" for decimal digits.
+* The format of the vendor version number. Where "`V`" indicates the version digits,
+  "`R`" indicates the revision digits, "`P`" indicates the patch digits, and "`0`"
+  indicates an ignored digit.
+
+Macros are:
+*/
+/*` `MSGPACK_PREDEF_MAKE_0X_VRP(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VRP(V) MSGPACK_VERSION_NUMBER((V&0xF00)>>8,(V&0xF0)>>4,(V&0xF))
+/*` `MSGPACK_PREDEF_MAKE_0X_VVRP(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VVRP(V) MSGPACK_VERSION_NUMBER((V&0xFF00)>>8,(V&0xF0)>>4,(V&0xF))
+/*` `MSGPACK_PREDEF_MAKE_0X_VRPP(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VRPP(V) MSGPACK_VERSION_NUMBER((V&0xF000)>>12,(V&0xF00)>>8,(V&0xFF))
+/*` `MSGPACK_PREDEF_MAKE_0X_VVRR(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VVRR(V) MSGPACK_VERSION_NUMBER((V&0xFF00)>>8,(V&0xFF),0)
+/*` `MSGPACK_PREDEF_MAKE_0X_VRRPPPP(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VRRPPPP(V) MSGPACK_VERSION_NUMBER((V&0xF000000)>>24,(V&0xFF0000)>>16,(V&0xFFFF))
+/*` `MSGPACK_PREDEF_MAKE_0X_VVRRP(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VVRRP(V) MSGPACK_VERSION_NUMBER((V&0xFF000)>>12,(V&0xFF0)>>4,(V&0xF))
+/*` `MSGPACK_PREDEF_MAKE_0X_VRRPP000(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VRRPP000(V) MSGPACK_VERSION_NUMBER((V&0xF0000000)>>28,(V&0xFF00000)>>20,(V&0xFF000)>>12)
+/*` `MSGPACK_PREDEF_MAKE_0X_VVRRPP(V)` */
+#define MSGPACK_PREDEF_MAKE_0X_VVRRPP(V) MSGPACK_VERSION_NUMBER((V&0xFF0000)>>16,(V&0xFF00)>>8,(V&0xFF))
+/*` `MSGPACK_PREDEF_MAKE_10_VPPP(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VPPP(V) MSGPACK_VERSION_NUMBER(((V)/1000)%10,0,(V)%1000)
+/*` `MSGPACK_PREDEF_MAKE_10_VRP(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VRP(V) MSGPACK_VERSION_NUMBER(((V)/100)%10,((V)/10)%10,(V)%10)
+/*` `MSGPACK_PREDEF_MAKE_10_VRP000(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VRP000(V) MSGPACK_VERSION_NUMBER(((V)/100000)%10,((V)/10000)%10,((V)/1000)%10)
+/*` `MSGPACK_PREDEF_MAKE_10_VRPP(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VRPP(V) MSGPACK_VERSION_NUMBER(((V)/1000)%10,((V)/100)%10,(V)%100)
+/*` `MSGPACK_PREDEF_MAKE_10_VRR(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VRR(V) MSGPACK_VERSION_NUMBER(((V)/100)%10,(V)%100,0)
+/*` `MSGPACK_PREDEF_MAKE_10_VRRPP(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VRRPP(V) MSGPACK_VERSION_NUMBER(((V)/10000)%10,((V)/100)%100,(V)%100)
+/*` `MSGPACK_PREDEF_MAKE_10_VRR000(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VRR000(V) MSGPACK_VERSION_NUMBER(((V)/100000)%10,((V)/1000)%100,0)
+/*` `MSGPACK_PREDEF_MAKE_10_VV00(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VV00(V) MSGPACK_VERSION_NUMBER(((V)/100)%100,0,0)
+/*` `MSGPACK_PREDEF_MAKE_10_VVRR(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VVRR(V) MSGPACK_VERSION_NUMBER(((V)/100)%100,(V)%100,0)
+/*` `MSGPACK_PREDEF_MAKE_10_VVRRPP(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VVRRPP(V) MSGPACK_VERSION_NUMBER(((V)/10000)%100,((V)/100)%100,(V)%100)
+/*` `MSGPACK_PREDEF_MAKE_10_VVRR0PP00(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VVRR0PP00(V) MSGPACK_VERSION_NUMBER(((V)/10000000)%100,((V)/100000)%100,((V)/100)%100)
+/*` `MSGPACK_PREDEF_MAKE_10_VVRR0PPPP(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VVRR0PPPP(V) MSGPACK_VERSION_NUMBER(((V)/10000000)%100,((V)/100000)%100,(V)%10000)
+/*` `MSGPACK_PREDEF_MAKE_10_VVRR00PP00(V)` */
+#define MSGPACK_PREDEF_MAKE_10_VVRR00PP00(V) MSGPACK_VERSION_NUMBER(((V)/100000000)%100,((V)/1000000)%100,((V)/100)%100)
+/*`
+[heading `MSGPACK_PREDEF_MAKE_*..` date macros]
+
+Date decomposition macros return a date in the relative to the 1970
+Epoch date. If the month is not available, January 1st is used as the month and day.
+If the day is not available, but the month is, the 1st of the month is used as the day.
+*/
+/*` `MSGPACK_PREDEF_MAKE_DATE(Y,M,D)` */
+#define MSGPACK_PREDEF_MAKE_DATE(Y,M,D) MSGPACK_VERSION_NUMBER((Y)%10000-1970,(M)%100,(D)%100)
+/*` `MSGPACK_PREDEF_MAKE_YYYYMMDD(V)` */
+#define MSGPACK_PREDEF_MAKE_YYYYMMDD(V) MSGPACK_PREDEF_MAKE_DATE(((V)/10000)%10000,((V)/100)%100,(V)%100)
+/*` `MSGPACK_PREDEF_MAKE_YYYY(V)` */
+#define MSGPACK_PREDEF_MAKE_YYYY(V) MSGPACK_PREDEF_MAKE_DATE(V,1,1)
+/*` `MSGPACK_PREDEF_MAKE_YYYYMM(V)` */
+#define MSGPACK_PREDEF_MAKE_YYYYMM(V) MSGPACK_PREDEF_MAKE_DATE((V)/100,(V),1)
+
+#endif
diff --git a/include/msgpack/predef/os.h b/include/msgpack/predef/os.h
new file mode 100644
index 0000000..c8b3f40
--- /dev/null
+++ b/include/msgpack/predef/os.h
@@ -0,0 +1,31 @@
+/*
+Copyright Rene Rivera 2008-2012
+Copyright Franz Detro 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_H
+#define MSGPACK_PREDEF_OS_H
+
+#include <msgpack/predef/os/aix.h>
+#include <msgpack/predef/os/amigaos.h>
+#include <msgpack/predef/os/android.h>
+#include <msgpack/predef/os/beos.h>
+#include <msgpack/predef/os/bsd.h>
+#include <msgpack/predef/os/cygwin.h>
+#include <msgpack/predef/os/haiku.h>
+#include <msgpack/predef/os/hpux.h>
+#include <msgpack/predef/os/irix.h>
+#include <msgpack/predef/os/ios.h>
+#include <msgpack/predef/os/linux.h>
+#include <msgpack/predef/os/macos.h>
+#include <msgpack/predef/os/os400.h>
+#include <msgpack/predef/os/qnxnto.h>
+#include <msgpack/predef/os/solaris.h>
+#include <msgpack/predef/os/unix.h>
+#include <msgpack/predef/os/vms.h>
+#include <msgpack/predef/os/windows.h>
+
+#endif
diff --git a/include/msgpack/predef/os/aix.h b/include/msgpack/predef/os/aix.h
new file mode 100644
index 0000000..c7afc6e
--- /dev/null
+++ b/include/msgpack/predef/os/aix.h
@@ -0,0 +1,67 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_AIX_H
+#define MSGPACK_PREDEF_OS_AIX_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_AIX`]
+
+[@http://en.wikipedia.org/wiki/AIX_operating_system IBM AIX] operating system.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_AIX`] [__predef_detection__]]
+    [[`__TOS_AIX__`] [__predef_detection__]]
+
+    [[`_AIX43`] [4.3.0]]
+    [[`_AIX41`] [4.1.0]]
+    [[`_AIX32`] [3.2.0]]
+    [[`_AIX3`] [3.0.0]]
+    ]
+ */
+
+#define MSGPACK_OS_AIX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(_AIX) || defined(__TOS_AIX__) \
+    )
+#   undef MSGPACK_OS_AIX
+#   if !defined(MSGPACK_OS_AIX) && defined(_AIX43)
+#       define MSGPACK_OS_AIX MSGPACK_VERSION_NUMBER(4,3,0)
+#   endif
+#   if !defined(MSGPACK_OS_AIX) && defined(_AIX41)
+#       define MSGPACK_OS_AIX MSGPACK_VERSION_NUMBER(4,1,0)
+#   endif
+#   if !defined(MSGPACK_OS_AIX) && defined(_AIX32)
+#       define MSGPACK_OS_AIX MSGPACK_VERSION_NUMBER(3,2,0)
+#   endif
+#   if !defined(MSGPACK_OS_AIX) && defined(_AIX3)
+#       define MSGPACK_OS_AIX MSGPACK_VERSION_NUMBER(3,0,0)
+#   endif
+#   if !defined(MSGPACK_OS_AIX)
+#       define MSGPACK_OS_AIX MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_AIX
+#   define MSGPACK_OS_AIX_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_AIX_NAME "IBM AIX"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_AIX,MSGPACK_OS_AIX_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/amigaos.h b/include/msgpack/predef/os/amigaos.h
new file mode 100644
index 0000000..9afcd4d
--- /dev/null
+++ b/include/msgpack/predef/os/amigaos.h
@@ -0,0 +1,47 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_AMIGAOS_H
+#define MSGPACK_PREDEF_OS_AMIGAOS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_AMIGAOS`]
+
+[@http://en.wikipedia.org/wiki/AmigaOS AmigaOS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`AMIGA`] [__predef_detection__]]
+    [[`__amigaos__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_AMIGAOS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(AMIGA) || defined(__amigaos__) \
+    )
+#   undef MSGPACK_OS_AMIGAOS
+#   define MSGPACK_OS_AMIGAOS MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_AMIGAOS
+#   define MSGPACK_OS_AMIGAOS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_AMIGAOS_NAME "AmigaOS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_AMIGAOS,MSGPACK_OS_AMIGAOS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/android.h b/include/msgpack/predef/os/android.h
new file mode 100644
index 0000000..d0ba537
--- /dev/null
+++ b/include/msgpack/predef/os/android.h
@@ -0,0 +1,46 @@
+/*
+Copyright Rene Rivera 2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_ADROID_H
+#define MSGPACK_PREDEF_OS_ADROID_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_ANDROID`]
+
+[@http://en.wikipedia.org/wiki/Android_%28operating_system%29 Android] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__ANDROID__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_ANDROID MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__ANDROID__) \
+    )
+#   undef MSGPACK_OS_ANDROID
+#   define MSGPACK_OS_ANDROID MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_ANDROID
+#   define MSGPACK_OS_ANDROID_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_ANDROID_NAME "Android"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_ANDROID,MSGPACK_OS_ANDROID_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/beos.h b/include/msgpack/predef/os/beos.h
new file mode 100644
index 0000000..7817f59
--- /dev/null
+++ b/include/msgpack/predef/os/beos.h
@@ -0,0 +1,46 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BEOS_H
+#define MSGPACK_PREDEF_OS_BEOS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_BEOS`]
+
+[@http://en.wikipedia.org/wiki/BeOS BeOS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__BEOS__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_BEOS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__BEOS__) \
+    )
+#   undef MSGPACK_OS_BEOS
+#   define MSGPACK_OS_BEOS MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_BEOS
+#   define MSGPACK_OS_BEOS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BEOS_NAME "BeOS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BEOS,MSGPACK_OS_BEOS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/bsd.h b/include/msgpack/predef/os/bsd.h
new file mode 100644
index 0000000..6a4b63f
--- /dev/null
+++ b/include/msgpack/predef/os/bsd.h
@@ -0,0 +1,95 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BSD_H
+#define MSGPACK_PREDEF_OS_BSD_H
+
+/* Special case: OSX will define BSD predefs if the sys/param.h
+ * header is included. We can guard against that, but only if we
+ * detect OSX first. Hence we will force include OSX detection
+ * before doing any BSD detection.
+ */
+#include <msgpack/predef/os/macos.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_BSD`]
+
+[@http://en.wikipedia.org/wiki/Berkeley_Software_Distribution BSD] operating system.
+
+BSD has various branch operating systems possible and each detected
+individually. This detects the following variations and sets a specific
+version number macro to match:
+
+* `MSGPACK_OS_BSD_DRAGONFLY` [@http://en.wikipedia.org/wiki/DragonFly_BSD DragonFly BSD]
+* `MSGPACK_OS_BSD_FREE` [@http://en.wikipedia.org/wiki/Freebsd FreeBSD]
+* `MSGPACK_OS_BSD_BSDI` [@http://en.wikipedia.org/wiki/BSD/OS BSDi BSD/OS]
+* `MSGPACK_OS_BSD_NET` [@http://en.wikipedia.org/wiki/Netbsd NetBSD]
+* `MSGPACK_OS_BSD_OPEN` [@http://en.wikipedia.org/wiki/Openbsd OpenBSD]
+
+[note The general `MSGPACK_OS_BSD` is set in all cases to indicate some form
+of BSD. If the above variants is detected the corresponding macro is also set.]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`BSD`] [__predef_detection__]]
+    [[`_SYSTYPE_BSD`] [__predef_detection__]]
+
+    [[`BSD4_2`] [4.2.0]]
+    [[`BSD4_3`] [4.3.0]]
+    [[`BSD4_4`] [4.4.0]]
+    [[`BSD`] [V.R.0]]
+    ]
+ */
+
+#include <msgpack/predef/os/bsd/bsdi.h>
+#include <msgpack/predef/os/bsd/dragonfly.h>
+#include <msgpack/predef/os/bsd/free.h>
+#include <msgpack/predef/os/bsd/open.h>
+#include <msgpack/predef/os/bsd/net.h>
+
+#ifndef MSGPACK_OS_BSD
+#define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+#endif
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(BSD) || \
+    defined(_SYSTYPE_BSD) \
+    )
+#   undef MSGPACK_OS_BSD
+#   include <sys/param.h>
+#   if !defined(MSGPACK_OS_BSD) && defined(BSD4_4)
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER(4,4,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD) && defined(BSD4_3)
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER(4,3,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD) && defined(BSD4_2)
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER(4,2,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD) && defined(BSD)
+#       define MSGPACK_OS_BSD MSGPACK_PREDEF_MAKE_10_VVRR(BSD)
+#   endif
+#   if !defined(MSGPACK_OS_BSD)
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_BSD
+#   define MSGPACK_OS_BSD_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BSD_NAME "BSD"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BSD,MSGPACK_OS_BSD_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/bsd/bsdi.h b/include/msgpack/predef/os/bsd/bsdi.h
new file mode 100644
index 0000000..9061066
--- /dev/null
+++ b/include/msgpack/predef/os/bsd/bsdi.h
@@ -0,0 +1,48 @@
+/*
+Copyright Rene Rivera 2012-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BSD_BSDI_H
+#define MSGPACK_PREDEF_OS_BSD_BSDI_H
+
+#include <msgpack/predef/os/bsd.h>
+
+/*`
+[heading `MSGPACK_OS_BSD_BSDI`]
+
+[@http://en.wikipedia.org/wiki/BSD/OS BSDi BSD/OS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__bsdi__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_BSD_BSDI MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__bsdi__) \
+    )
+#   ifndef MSGPACK_OS_BSD_AVAILABLE
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       define MSGPACK_OS_BSD_AVAILABLE
+#   endif
+#   undef MSGPACK_OS_BSD_BSDI
+#   define MSGPACK_OS_BSD_BSDI MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_BSD_BSDI
+#   define MSGPACK_OS_BSD_BSDI_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BSD_BSDI_NAME "BSDi BSD/OS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BSD_BSDI,MSGPACK_OS_BSD_BSDI_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/bsd/dragonfly.h b/include/msgpack/predef/os/bsd/dragonfly.h
new file mode 100644
index 0000000..bdf3e99
--- /dev/null
+++ b/include/msgpack/predef/os/bsd/dragonfly.h
@@ -0,0 +1,50 @@
+/*
+Copyright Rene Rivera 2012-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BSD_DRAGONFLY_H
+#define MSGPACK_PREDEF_OS_BSD_DRAGONFLY_H
+
+#include <msgpack/predef/os/bsd.h>
+
+/*`
+[heading `MSGPACK_OS_BSD_DRAGONFLY`]
+
+[@http://en.wikipedia.org/wiki/DragonFly_BSD DragonFly BSD] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__DragonFly__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_BSD_DRAGONFLY MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__DragonFly__) \
+    )
+#   ifndef MSGPACK_OS_BSD_AVAILABLE
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       define MSGPACK_OS_BSD_AVAILABLE
+#   endif
+#   undef MSGPACK_OS_BSD_DRAGONFLY
+#   if defined(__DragonFly__)
+#       define MSGPACK_OS_DRAGONFLY_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_BSD_DRAGONFLY
+#   define MSGPACK_OS_BSD_DRAGONFLY_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BSD_DRAGONFLY_NAME "DragonFly BSD"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BSD_DRAGONFLY,MSGPACK_OS_BSD_DRAGONFLY_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/bsd/free.h b/include/msgpack/predef/os/bsd/free.h
new file mode 100644
index 0000000..33d2494
--- /dev/null
+++ b/include/msgpack/predef/os/bsd/free.h
@@ -0,0 +1,60 @@
+/*
+Copyright Rene Rivera 2012-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BSD_FREE_H
+#define MSGPACK_PREDEF_OS_BSD_FREE_H
+
+#include <msgpack/predef/os/bsd.h>
+
+/*`
+[heading `MSGPACK_OS_BSD_FREE`]
+
+[@http://en.wikipedia.org/wiki/Freebsd FreeBSD] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__FreeBSD__`] [__predef_detection__]]
+
+    [[`__FreeBSD_version`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_OS_BSD_FREE MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__FreeBSD__) \
+    )
+#   ifndef MSGPACK_OS_BSD_AVAILABLE
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       define MSGPACK_OS_BSD_AVAILABLE
+#   endif
+#   undef MSGPACK_OS_BSD_FREE
+#   if defined(__FreeBSD_version)
+#       if __FreeBSD_version < 500000
+#           define MSGPACK_OS_BSD_FREE \
+                MSGPACK_PREDEF_MAKE_10_VRP000(__FreeBSD_version)
+#       else
+#           define MSGPACK_OS_BSD_FREE \
+                MSGPACK_PREDEF_MAKE_10_VRR000(__FreeBSD_version)
+#       endif
+#   else
+#       define MSGPACK_OS_BSD_FREE MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_BSD_FREE
+#   define MSGPACK_OS_BSD_FREE_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BSD_FREE_NAME "Free BSD"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BSD_FREE,MSGPACK_OS_BSD_FREE_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/bsd/net.h b/include/msgpack/predef/os/bsd/net.h
new file mode 100644
index 0000000..8953e07
--- /dev/null
+++ b/include/msgpack/predef/os/bsd/net.h
@@ -0,0 +1,84 @@
+/*
+Copyright Rene Rivera 2012-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BSD_NET_H
+#define MSGPACK_PREDEF_OS_BSD_NET_H
+
+#include <msgpack/predef/os/bsd.h>
+
+/*`
+[heading `MSGPACK_OS_BSD_NET`]
+
+[@http://en.wikipedia.org/wiki/Netbsd NetBSD] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__NETBSD__`] [__predef_detection__]]
+    [[`__NetBSD__`] [__predef_detection__]]
+
+    [[`__NETBSD_version`] [V.R.P]]
+    [[`NetBSD0_8`] [0.8.0]]
+    [[`NetBSD0_9`] [0.9.0]]
+    [[`NetBSD1_0`] [1.0.0]]
+    [[`__NetBSD_Version`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_OS_BSD_NET MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__NETBSD__) || defined(__NetBSD__) \
+    )
+#   ifndef MSGPACK_OS_BSD_AVAILABLE
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       define MSGPACK_OS_BSD_AVAILABLE
+#   endif
+#   undef MSGPACK_OS_BSD_NET
+#   if defined(__NETBSD__)
+#       if defined(__NETBSD_version)
+#           if __NETBSD_version < 500000
+#               define MSGPACK_OS_BSD_NET \
+                    MSGPACK_PREDEF_MAKE_10_VRP000(__NETBSD_version)
+#           else
+#               define MSGPACK_OS_BSD_NET \
+                    MSGPACK_PREDEF_MAKE_10_VRR000(__NETBSD_version)
+#           endif
+#       else
+#           define MSGPACK_OS_BSD_NET MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#   elif defined(__NetBSD__)
+#       if !defined(MSGPACK_OS_BSD_NET) && defined(NetBSD0_8)
+#           define MSGPACK_OS_BSD_NET MSGPACK_VERSION_NUMBER(0,8,0)
+#       endif
+#       if !defined(MSGPACK_OS_BSD_NET) && defined(NetBSD0_9)
+#           define MSGPACK_OS_BSD_NET MSGPACK_VERSION_NUMBER(0,9,0)
+#       endif
+#       if !defined(MSGPACK_OS_BSD_NET) && defined(NetBSD1_0)
+#           define MSGPACK_OS_BSD_NET MSGPACK_VERSION_NUMBER(1,0,0)
+#       endif
+#       if !defined(MSGPACK_OS_BSD_NET) && defined(__NetBSD_Version)
+#           define MSGPACK_OS_BSD_NET \
+                MSGPACK_PREDEF_MAKE_10_VVRR00PP00(__NetBSD_Version)
+#       endif
+#       if !defined(MSGPACK_OS_BSD_NET)
+#           define MSGPACK_OS_BSD_NET MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#   endif
+#endif
+
+#if MSGPACK_OS_BSD_NET
+#   define MSGPACK_OS_BSD_NET_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BSD_NET_NAME "DragonFly BSD"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BSD_NET,MSGPACK_OS_BSD_NET_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/bsd/open.h b/include/msgpack/predef/os/bsd/open.h
new file mode 100644
index 0000000..9b83d86
--- /dev/null
+++ b/include/msgpack/predef/os/bsd/open.h
@@ -0,0 +1,171 @@
+/*
+Copyright Rene Rivera 2012-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_BSD_OPEN_H
+#define MSGPACK_PREDEF_OS_BSD_OPEN_H
+
+#include <msgpack/predef/os/bsd.h>
+
+/*`
+[heading `MSGPACK_OS_BSD_OPEN`]
+
+[@http://en.wikipedia.org/wiki/Openbsd OpenBSD] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__OpenBSD__`] [__predef_detection__]]
+
+    [[`OpenBSD2_0`] [2.0.0]]
+    [[`OpenBSD2_1`] [2.1.0]]
+    [[`OpenBSD2_2`] [2.2.0]]
+    [[`OpenBSD2_3`] [2.3.0]]
+    [[`OpenBSD2_4`] [2.4.0]]
+    [[`OpenBSD2_5`] [2.5.0]]
+    [[`OpenBSD2_6`] [2.6.0]]
+    [[`OpenBSD2_7`] [2.7.0]]
+    [[`OpenBSD2_8`] [2.8.0]]
+    [[`OpenBSD2_9`] [2.9.0]]
+    [[`OpenBSD3_0`] [3.0.0]]
+    [[`OpenBSD3_1`] [3.1.0]]
+    [[`OpenBSD3_2`] [3.2.0]]
+    [[`OpenBSD3_3`] [3.3.0]]
+    [[`OpenBSD3_4`] [3.4.0]]
+    [[`OpenBSD3_5`] [3.5.0]]
+    [[`OpenBSD3_6`] [3.6.0]]
+    [[`OpenBSD3_7`] [3.7.0]]
+    [[`OpenBSD3_8`] [3.8.0]]
+    [[`OpenBSD3_9`] [3.9.0]]
+    [[`OpenBSD4_0`] [4.0.0]]
+    [[`OpenBSD4_1`] [4.1.0]]
+    [[`OpenBSD4_2`] [4.2.0]]
+    [[`OpenBSD4_3`] [4.3.0]]
+    [[`OpenBSD4_4`] [4.4.0]]
+    [[`OpenBSD4_5`] [4.5.0]]
+    [[`OpenBSD4_6`] [4.6.0]]
+    [[`OpenBSD4_7`] [4.7.0]]
+    [[`OpenBSD4_8`] [4.8.0]]
+    [[`OpenBSD4_9`] [4.9.0]]
+    ]
+ */
+
+#define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__OpenBSD__) \
+    )
+#   ifndef MSGPACK_OS_BSD_AVAILABLE
+#       define MSGPACK_OS_BSD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       define MSGPACK_OS_BSD_AVAILABLE
+#   endif
+#   undef MSGPACK_OS_BSD_OPEN
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_0)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,0,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_1)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,1,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_2)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,2,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_3)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,3,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_4)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,4,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_5)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,5,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_6)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,6,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_7)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,7,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_8)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,8,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD2_9)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(2,9,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_0)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,0,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_1)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,1,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_2)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,2,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_3)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,3,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_4)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,4,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_5)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,5,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_6)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,6,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_7)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,7,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_8)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,8,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD3_9)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(3,9,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_0)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_1)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,1,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_2)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,2,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_3)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,3,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_4)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,4,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_5)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,5,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_6)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,6,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_7)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,7,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_8)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,8,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN) && defined(OpenBSD4_9)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER(4,9,0)
+#   endif
+#   if !defined(MSGPACK_OS_BSD_OPEN)
+#       define MSGPACK_OS_BSD_OPEN MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_BSD_OPEN
+#   define MSGPACK_OS_BSD_OPEN_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_BSD_OPEN_NAME "OpenBSD"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_BSD_OPEN,MSGPACK_OS_BSD_OPEN_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/cygwin.h b/include/msgpack/predef/os/cygwin.h
new file mode 100644
index 0000000..dc595a4
--- /dev/null
+++ b/include/msgpack/predef/os/cygwin.h
@@ -0,0 +1,46 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_CYGWIN_H
+#define MSGPACK_PREDEF_OS_CYGWIN_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_CYGWIN`]
+
+[@http://en.wikipedia.org/wiki/Cygwin Cygwin] evironment.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__CYGWIN__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_CYGWIN MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__CYGWIN__) \
+    )
+#   undef MSGPACK_OS_CYGWIN
+#   define MSGPACK_OS_CGYWIN MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_CYGWIN
+#   define MSGPACK_OS_CYGWIN_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_CYGWIN_NAME "Cygwin"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_CYGWIN,MSGPACK_OS_CYGWIN_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/haiku.h b/include/msgpack/predef/os/haiku.h
new file mode 100644
index 0000000..8d18d3c
--- /dev/null
+++ b/include/msgpack/predef/os/haiku.h
@@ -0,0 +1,47 @@
+/*
+Copyright Jessica Hamilton 2014
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_HAIKU_H
+#define MSGPACK_PREDEF_OS_HAIKU_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_HAIKU`]
+
+[@http://en.wikipedia.org/wiki/Haiku_(operating_system) Haiku] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__HAIKU__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_HAIKU MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__HAIKU__) \
+    )
+#   undef MSGPACK_OS_HAIKU
+#   define MSGPACK_OS_HAIKU MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_HAIKU
+#   define MSGPACK_OS_HAIKU_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_HAIKU_NAME "Haiku"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_HAIKU,MSGPACK_OS_HAIKU_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/hpux.h b/include/msgpack/predef/os/hpux.h
new file mode 100644
index 0000000..7aa0fca
--- /dev/null
+++ b/include/msgpack/predef/os/hpux.h
@@ -0,0 +1,48 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_HPUX_H
+#define MSGPACK_PREDEF_OS_HPUX_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_HPUX`]
+
+[@http://en.wikipedia.org/wiki/HP-UX HP-UX] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`hpux`] [__predef_detection__]]
+    [[`_hpux`] [__predef_detection__]]
+    [[`__hpux`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_HPUX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(hpux) || defined(_hpux) || defined(__hpux) \
+    )
+#   undef MSGPACK_OS_HPUX
+#   define MSGPACK_OS_HPUX MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_HPUX
+#   define MSGPACK_OS_HPUX_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_HPUX_NAME "HP-UX"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_HPUX,MSGPACK_OS_HPUX_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/ios.h b/include/msgpack/predef/os/ios.h
new file mode 100644
index 0000000..99ca70b
--- /dev/null
+++ b/include/msgpack/predef/os/ios.h
@@ -0,0 +1,51 @@
+/*
+Copyright Franz Detro 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_IOS_H
+#define MSGPACK_PREDEF_OS_IOS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_IOS`]
+
+[@http://en.wikipedia.org/wiki/iOS iOS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__APPLE__`] [__predef_detection__]]
+    [[`__MACH__`] [__predef_detection__]]
+    [[`__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__`] [__predef_detection__]]
+
+    [[`__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__`] [__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000]]
+    ]
+ */
+
+#define MSGPACK_OS_IOS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__APPLE__) && defined(__MACH__) && \
+    defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) \
+    )
+#   undef MSGPACK_OS_IOS
+#   define MSGPACK_OS_IOS (__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__*1000)
+#endif
+
+#if MSGPACK_OS_IOS
+#   define MSGPACK_OS_IOS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_IOS_NAME "iOS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_IOS,MSGPACK_OS_IOS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/irix.h b/include/msgpack/predef/os/irix.h
new file mode 100644
index 0000000..e34f589
--- /dev/null
+++ b/include/msgpack/predef/os/irix.h
@@ -0,0 +1,47 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_IRIX_H
+#define MSGPACK_PREDEF_OS_IRIX_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_IRIX`]
+
+[@http://en.wikipedia.org/wiki/Irix IRIX] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`sgi`] [__predef_detection__]]
+    [[`__sgi`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_IRIX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(sgi) || defined(__sgi) \
+    )
+#   undef MSGPACK_OS_IRIX
+#   define MSGPACK_OS_IRIX MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_IRIX
+#   define MSGPACK_OS_IRIX_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_IRIX_NAME "IRIX"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_IRIX,MSGPACK_OS_IRIX_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/linux.h b/include/msgpack/predef/os/linux.h
new file mode 100644
index 0000000..0b5103c
--- /dev/null
+++ b/include/msgpack/predef/os/linux.h
@@ -0,0 +1,47 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_LINUX_H
+#define MSGPACK_PREDEF_OS_LINUX_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_LINUX`]
+
+[@http://en.wikipedia.org/wiki/Linux Linux] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`linux`] [__predef_detection__]]
+    [[`__linux`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_LINUX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(linux) || defined(__linux) \
+    )
+#   undef MSGPACK_OS_LINUX
+#   define MSGPACK_OS_LINUX MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_LINUX
+#   define MSGPACK_OS_LINUX_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_LINUX_NAME "Linux"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_LINUX,MSGPACK_OS_LINUX_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/macos.h b/include/msgpack/predef/os/macos.h
new file mode 100644
index 0000000..7c8113c
--- /dev/null
+++ b/include/msgpack/predef/os/macos.h
@@ -0,0 +1,66 @@
+/*
+Copyright Rene Rivera 2008-2013
+Copyright Franz Detro 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_MACOS_H
+#define MSGPACK_PREDEF_OS_MACOS_H
+
+/* Special case: iOS will define the same predefs as MacOS, and additionally
+ '__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__'. We can guard against that,
+ but only if we detect iOS first. Hence we will force include iOS detection
+ * before doing any MacOS detection.
+ */
+#include <msgpack/predef/os/ios.h>
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_MACOS`]
+
+[@http://en.wikipedia.org/wiki/Mac_OS Mac OS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`macintosh`] [__predef_detection__]]
+    [[`Macintosh`] [__predef_detection__]]
+    [[`__APPLE__`] [__predef_detection__]]
+    [[`__MACH__`] [__predef_detection__]]
+
+    [[`__APPLE__`, `__MACH__`] [10.0.0]]
+    [[ /otherwise/ ] [9.0.0]]
+    ]
+ */
+
+#define MSGPACK_OS_MACOS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(macintosh) || defined(Macintosh) || \
+    (defined(__APPLE__) && defined(__MACH__)) \
+    )
+#   undef MSGPACK_OS_MACOS
+#   if !defined(MSGPACK_OS_MACOS) && defined(__APPLE__) && defined(__MACH__)
+#       define MSGPACK_OS_MACOS MSGPACK_VERSION_NUMBER(10,0,0)
+#   endif
+#   if !defined(MSGPACK_OS_MACOS)
+#       define MSGPACK_OS_MACOS MSGPACK_VERSION_NUMBER(9,0,0)
+#   endif
+#endif
+
+#if MSGPACK_OS_MACOS
+#   define MSGPACK_OS_MACOS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_MACOS_NAME "Mac OS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_MACOS,MSGPACK_OS_MACOS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/os400.h b/include/msgpack/predef/os/os400.h
new file mode 100644
index 0000000..18d4677
--- /dev/null
+++ b/include/msgpack/predef/os/os400.h
@@ -0,0 +1,46 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_OS400_H
+#define MSGPACK_PREDEF_OS_OS400_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_OS400`]
+
+[@http://en.wikipedia.org/wiki/IBM_i IBM OS/400] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__OS400__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_OS400 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__OS400__) \
+    )
+#   undef MSGPACK_OS_OS400
+#   define MSGPACK_OS_OS400 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_OS400
+#   define MSGPACK_OS_OS400_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_OS400_NAME "IBM OS/400"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_OS400,MSGPACK_OS_OS400_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/qnxnto.h b/include/msgpack/predef/os/qnxnto.h
new file mode 100644
index 0000000..6d16fe5
--- /dev/null
+++ b/include/msgpack/predef/os/qnxnto.h
@@ -0,0 +1,60 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_QNXNTO_H
+#define MSGPACK_PREDEF_OS_QNXNTO_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_QNX`]
+
+[@http://en.wikipedia.org/wiki/QNX QNX] operating system.
+Version number available as major, and minor if possible. And
+version 4 is specifically detected.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__QNX__`] [__predef_detection__]]
+    [[`__QNXNTO__`] [__predef_detection__]]
+
+    [[`_NTO_VERSION`] [V.R.0]]
+    [[`__QNX__`] [4.0.0]]
+    ]
+ */
+
+#define MSGPACK_OS_QNX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(__QNX__) || defined(__QNXNTO__) \
+    )
+#   undef MSGPACK_OS_QNX
+#   if !defined(MSGPACK_OS_QNX) && defined(_NTO_VERSION)
+#       define MSGPACK_OS_QNX MSGPACK_PREDEF_MAKE_10_VVRR(_NTO_VERSION)
+#   endif
+#   if !defined(MSGPACK_OS_QNX) && defined(__QNX__)
+#       define MSGPACK_OS_QNX MSGPACK_VERSION_NUMBER(4,0,0)
+#   endif
+#   if !defined(MSGPACK_OS_QNX)
+#       define MSGPACK_OS_QNX MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_QNX
+#   define MSGPACK_OS_QNX_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_QNX_NAME "QNX"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_QNX,MSGPACK_OS_QNX_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/solaris.h b/include/msgpack/predef/os/solaris.h
new file mode 100644
index 0000000..83ac9e7
--- /dev/null
+++ b/include/msgpack/predef/os/solaris.h
@@ -0,0 +1,47 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_SOLARIS_H
+#define MSGPACK_PREDEF_OS_SOLARIS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_SOLARIS`]
+
+[@http://en.wikipedia.org/wiki/Solaris_Operating_Environment Solaris] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`sun`] [__predef_detection__]]
+    [[`__sun`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_SOLARIS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(sun) || defined(__sun) \
+    )
+#   undef MSGPACK_OS_SOLARIS
+#   define MSGPACK_OS_SOLARIS MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_SOLARIS
+#   define MSGPACK_OS_SOLARIS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_SOLARIS_NAME "Solaris"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_SOLARIS,MSGPACK_OS_SOLARIS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/unix.h b/include/msgpack/predef/os/unix.h
new file mode 100644
index 0000000..4d61fc0
--- /dev/null
+++ b/include/msgpack/predef/os/unix.h
@@ -0,0 +1,76 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_UNIX_H
+#define MSGPACK_PREDEF_OS_UNIX_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_UNIX`]
+
+[@http://en.wikipedia.org/wiki/Unix Unix Environment] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`unix`] [__predef_detection__]]
+    [[`__unix`] [__predef_detection__]]
+    [[`_XOPEN_SOURCE`] [__predef_detection__]]
+    [[`_POSIX_SOURCE`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_UNIX MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(unix) || defined(__unix) || \
+    defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE)
+#   undef MSGPACK_OS_UNIX
+#   define MSGPACK_OS_UNIX MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_UNIX
+#   define MSGPACK_OS_UNIX_AVAILABLE
+#endif
+
+#define MSGPACK_OS_UNIX_NAME "Unix Environment"
+
+/*`
+[heading `MSGPACK_OS_SVR4`]
+
+[@http://en.wikipedia.org/wiki/UNIX_System_V SVR4 Environment] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__sysv__`] [__predef_detection__]]
+    [[`__SVR4`] [__predef_detection__]]
+    [[`__svr4__`] [__predef_detection__]]
+    [[`_SYSTYPE_SVR4`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_SVR4 MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__sysv__) || defined(__SVR4) || \
+    defined(__svr4__) || defined(_SYSTYPE_SVR4)
+#   undef MSGPACK_OS_SVR4
+#   define MSGPACK_OS_SVR4 MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_SVR4
+#   define MSGPACK_OS_SVR4_AVAILABLE
+#endif
+
+#define MSGPACK_OS_SVR4_NAME "SVR4 Environment"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_UNIX,MSGPACK_OS_UNIX_NAME)
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_SVR4,MSGPACK_OS_SVR4_NAME)
+
+#endif
diff --git a/include/msgpack/predef/os/vms.h b/include/msgpack/predef/os/vms.h
new file mode 100644
index 0000000..8607481
--- /dev/null
+++ b/include/msgpack/predef/os/vms.h
@@ -0,0 +1,53 @@
+/*
+Copyright Rene Rivera 2011-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_VMS_H
+#define MSGPACK_PREDEF_OS_VMS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_VMS`]
+
+[@http://en.wikipedia.org/wiki/Vms VMS] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`VMS`] [__predef_detection__]]
+    [[`__VMS`] [__predef_detection__]]
+
+    [[`__VMS_VER`] [V.R.P]]
+    ]
+ */
+
+#define MSGPACK_OS_VMS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(VMS) || defined(__VMS) \
+    )
+#   undef MSGPACK_OS_VMS
+#   if defined(__VMS_VER)
+#       define MSGPACK_OS_VMS MSGPACK_PREDEF_MAKE_10_VVRR00PP00(__VMS_VER)
+#   else
+#       define MSGPACK_OS_VMS MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#if MSGPACK_OS_VMS
+#   define MSGPACK_OS_VMS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_VMS_NAME "VMS"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_VMS,MSGPACK_OS_VMS_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/os/windows.h b/include/msgpack/predef/os/windows.h
new file mode 100644
index 0000000..fc86df9
--- /dev/null
+++ b/include/msgpack/predef/os/windows.h
@@ -0,0 +1,51 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OS_WINDOWS_H
+#define MSGPACK_PREDEF_OS_WINDOWS_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_OS_WINDOWS`]
+
+[@http://en.wikipedia.org/wiki/Category:Microsoft_Windows Microsoft Windows] operating system.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`_WIN32`] [__predef_detection__]]
+    [[`_WIN64`] [__predef_detection__]]
+    [[`__WIN32__`] [__predef_detection__]]
+    [[`__TOS_WIN__`] [__predef_detection__]]
+    [[`__WINDOWS__`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_OS_WINDOWS MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if !defined(MSGPACK_PREDEF_DETAIL_OS_DETECTED) && ( \
+    defined(_WIN32) || defined(_WIN64) || \
+    defined(__WIN32__) || defined(__TOS_WIN__) || \
+    defined(__WINDOWS__) \
+    )
+#   undef MSGPACK_OS_WINDOWS
+#   define MSGPACK_OS_WINDOWS MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+
+#if MSGPACK_OS_WINDOWS
+#   define MSGPACK_OS_WINDOWS_AVAILABLE
+#   include <msgpack/predef/detail/os_detected.h>
+#endif
+
+#define MSGPACK_OS_WINDOWS_NAME "Microsoft Windows"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_OS_WINDOWS,MSGPACK_OS_WINDOWS_NAME)
+
+#endif
diff --git a/include/msgpack/predef/other.h b/include/msgpack/predef/other.h
new file mode 100644
index 0000000..99b32ca
--- /dev/null
+++ b/include/msgpack/predef/other.h
@@ -0,0 +1,14 @@
+/*
+Copyright Rene Rivera 2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_OTHER_H
+#define MSGPACK_PREDEF_OTHER_H
+
+#include <msgpack/predef/other/endian.h>
+/*#include <msgpack/predef/other/.h>*/
+
+#endif
diff --git a/include/msgpack/predef/other/endian.h b/include/msgpack/predef/other/endian.h
new file mode 100644
index 0000000..556e485
--- /dev/null
+++ b/include/msgpack/predef/other/endian.h
@@ -0,0 +1,205 @@
+/*
+Copyright Rene Rivera 2013-2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_ENDIAN_H
+#define MSGPACK_PREDEF_ENDIAN_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+#include <msgpack/predef/library/c/gnu.h>
+#include <msgpack/predef/os/macos.h>
+#include <msgpack/predef/os/bsd.h>
+#include <msgpack/predef/os/android.h>
+
+/*`
+[heading `MSGPACK_ENDIAN_*`]
+
+Detection of endian memory ordering. There are four defined macros
+in this header that define the various generally possible endian
+memory orderings:
+
+* `MSGPACK_ENDIAN_BIG_BYTE`, byte-swapped big-endian.
+* `MSGPACK_ENDIAN_BIG_WORD`, word-swapped big-endian.
+* `MSGPACK_ENDIAN_LITTLE_BYTE`, byte-swapped little-endian.
+* `MSGPACK_ENDIAN_LITTLE_WORD`, word-swapped little-endian.
+
+The detection is conservative in that it only identifies endianness
+that it knows for certain. In particular bi-endianness is not
+indicated as is it not practically possible to determine the
+endianness from anything but an operating system provided
+header. And the currently known headers do not define that
+programatic bi-endianness is available.
+
+This implementation is a compilation of various publicly available
+information and acquired knowledge:
+
+# The indispensable documentation of "Pre-defined Compiler Macros"
+  [@http://sourceforge.net/p/predef/wiki/Endianness Endianness].
+# The various endian specifications available in the
+  [@http://wikipedia.org/ Wikipedia] computer architecture pages.
+# Generally available searches for headers that define endianness.
+ */
+
+#define MSGPACK_ENDIAN_BIG_BYTE MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+#define MSGPACK_ENDIAN_BIG_WORD MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+#define MSGPACK_ENDIAN_LITTLE_BYTE MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+#define MSGPACK_ENDIAN_LITTLE_WORD MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+/* GNU libc provides a header defining __BYTE_ORDER, or _BYTE_ORDER.
+ * And some OSs provide some for of endian header also.
+ */
+#if !MSGPACK_ENDIAN_BIG_BYTE && !MSGPACK_ENDIAN_BIG_WORD && \
+    !MSGPACK_ENDIAN_LITTLE_BYTE && !MSGPACK_ENDIAN_LITTLE_WORD
+#   if MSGPACK_LIB_C_GNU || MSGPACK_OS_ANDROID
+#       include <endian.h>
+#   else
+#       if MSGPACK_OS_MACOS
+#           include <machine/endian.h>
+#       else
+#           if MSGPACK_OS_BSD
+#               if MSGPACK_OS_BSD_OPEN
+#                   include <machine/endian.h>
+#               else
+#                   include <sys/endian.h>
+#               endif
+#           endif
+#       endif
+#   endif
+#   if defined(__BYTE_ORDER)
+#       if defined(__BIG_ENDIAN) && (__BYTE_ORDER == __BIG_ENDIAN)
+#           undef MSGPACK_ENDIAN_BIG_BYTE
+#           define MSGPACK_ENDIAN_BIG_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#       if defined(__LITTLE_ENDIAN) && (__BYTE_ORDER == __LITTLE_ENDIAN)
+#           undef MSGPACK_ENDIAN_LITTLE_BYTE
+#           define MSGPACK_ENDIAN_LITTLE_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#       if defined(__PDP_ENDIAN) && (__BYTE_ORDER == __PDP_ENDIAN)
+#           undef MSGPACK_ENDIAN_LITTLE_WORD
+#           define MSGPACK_ENDIAN_LITTLE_WORD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#   endif
+#   if !defined(__BYTE_ORDER) && defined(_BYTE_ORDER)
+#       if defined(_BIG_ENDIAN) && (_BYTE_ORDER == _BIG_ENDIAN)
+#           undef MSGPACK_ENDIAN_BIG_BYTE
+#           define MSGPACK_ENDIAN_BIG_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#       if defined(_LITTLE_ENDIAN) && (_BYTE_ORDER == _LITTLE_ENDIAN)
+#           undef MSGPACK_ENDIAN_LITTLE_BYTE
+#           define MSGPACK_ENDIAN_LITTLE_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#       if defined(_PDP_ENDIAN) && (_BYTE_ORDER == _PDP_ENDIAN)
+#           undef MSGPACK_ENDIAN_LITTLE_WORD
+#           define MSGPACK_ENDIAN_LITTLE_WORD MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#   endif
+#endif
+
+/* Built-in byte-swpped big-endian macros.
+ */
+#if !MSGPACK_ENDIAN_BIG_BYTE && !MSGPACK_ENDIAN_BIG_WORD && \
+    !MSGPACK_ENDIAN_LITTLE_BYTE && !MSGPACK_ENDIAN_LITTLE_WORD
+#   if (defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__)) || \
+       (defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)) || \
+        defined(__ARMEB__) || \
+        defined(__THUMBEB__) || \
+        defined(__AARCH64EB__) || \
+        defined(_MIPSEB) || \
+        defined(__MIPSEB) || \
+        defined(__MIPSEB__)
+#       undef MSGPACK_ENDIAN_BIG_BYTE
+#       define MSGPACK_ENDIAN_BIG_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+/* Built-in byte-swpped little-endian macros.
+ */
+#if !MSGPACK_ENDIAN_BIG_BYTE && !MSGPACK_ENDIAN_BIG_WORD && \
+    !MSGPACK_ENDIAN_LITTLE_BYTE && !MSGPACK_ENDIAN_LITTLE_WORD
+#   if (defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)) || \
+       (defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)) || \
+        defined(__ARMEL__) || \
+        defined(__THUMBEL__) || \
+        defined(__AARCH64EL__) || \
+        defined(_MIPSEL) || \
+        defined(__MIPSEL) || \
+        defined(__MIPSEL__)
+#       undef MSGPACK_ENDIAN_LITTLE_BYTE
+#       define MSGPACK_ENDIAN_LITTLE_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+/* Some architectures are strictly one endianess (as opposed
+ * the current common bi-endianess).
+ */
+#if !MSGPACK_ENDIAN_BIG_BYTE && !MSGPACK_ENDIAN_BIG_WORD && \
+    !MSGPACK_ENDIAN_LITTLE_BYTE && !MSGPACK_ENDIAN_LITTLE_WORD
+#   include <msgpack/predef/architecture.h>
+#   if MSGPACK_ARCH_M68K || \
+        MSGPACK_ARCH_PARISK || \
+        MSGPACK_ARCH_SPARC || \
+        MSGPACK_ARCH_SYS370 || \
+        MSGPACK_ARCH_SYS390 || \
+        MSGPACK_ARCH_Z
+#       undef MSGPACK_ENDIAN_BIG_BYTE
+#       define MSGPACK_ENDIAN_BIG_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#   if MSGPACK_ARCH_AMD64 || \
+        MSGPACK_ARCH_IA64 || \
+        MSGPACK_ARCH_X86 || \
+        MSGPACK_ARCH_BLACKFIN
+#       undef MSGPACK_ENDIAN_LITTLE_BYTE
+#       define MSGPACK_ENDIAN_LITTLE_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+/* Windows on ARM, if not otherwise detected/specified, is always
+ * byte-swaped little-endian.
+ */
+#if !MSGPACK_ENDIAN_BIG_BYTE && !MSGPACK_ENDIAN_BIG_WORD && \
+    !MSGPACK_ENDIAN_LITTLE_BYTE && !MSGPACK_ENDIAN_LITTLE_WORD
+#   if MSGPACK_ARCH_ARM
+#       include <msgpack/predef/os/windows.h>
+#       if MSGPACK_OS_WINDOWS
+#           undef MSGPACK_ENDIAN_LITTLE_BYTE
+#           define MSGPACK_ENDIAN_LITTLE_BYTE MSGPACK_VERSION_NUMBER_AVAILABLE
+#       endif
+#   endif
+#endif
+
+#if MSGPACK_ENDIAN_BIG_BYTE
+#   define MSGPACK_ENDIAN_BIG_BYTE_AVAILABLE
+#endif
+#if MSGPACK_ENDIAN_BIG_WORD
+#   define MSGPACK_ENDIAN_BIG_WORD_BYTE_AVAILABLE
+#endif
+#if MSGPACK_ENDIAN_LITTLE_BYTE
+#   define MSGPACK_ENDIAN_LITTLE_BYTE_AVAILABLE
+#endif
+#if MSGPACK_ENDIAN_LITTLE_WORD
+#   define MSGPACK_ENDIAN_LITTLE_WORD_BYTE_AVAILABLE
+#endif
+
+#define MSGPACK_ENDIAN_BIG_BYTE_NAME "Byte-Swapped Big-Endian"
+#define MSGPACK_ENDIAN_BIG_WORD_NAME "Word-Swapped Big-Endian"
+#define MSGPACK_ENDIAN_LITTLE_BYTE_NAME "Byte-Swapped Little-Endian"
+#define MSGPACK_ENDIAN_LITTLE_WORD_NAME "Word-Swapped Little-Endian"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ENDIAN_BIG_BYTE,MSGPACK_ENDIAN_BIG_BYTE_NAME)
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ENDIAN_BIG_WORD,MSGPACK_ENDIAN_BIG_WORD_NAME)
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ENDIAN_LITTLE_BYTE,MSGPACK_ENDIAN_LITTLE_BYTE_NAME)
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_ENDIAN_LITTLE_WORD,MSGPACK_ENDIAN_LITTLE_WORD_NAME)
+
+
+#endif
diff --git a/include/msgpack/predef/platform.h b/include/msgpack/predef/platform.h
new file mode 100644
index 0000000..9029820
--- /dev/null
+++ b/include/msgpack/predef/platform.h
@@ -0,0 +1,19 @@
+/*
+Copyright Rene Rivera 2013
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_PLATFORM_H
+#define MSGPACK_PREDEF_PLATFORM_H
+
+#include <msgpack/predef/platform/mingw.h>
+#include <msgpack/predef/platform/windows_desktop.h>
+#include <msgpack/predef/platform/windows_store.h>
+#include <msgpack/predef/platform/windows_phone.h>
+#include <msgpack/predef/platform/windows_runtime.h>
+/*#include <msgpack/predef/platform/.h>*/
+
+#endif
diff --git a/include/msgpack/predef/platform/mingw.h b/include/msgpack/predef/platform/mingw.h
new file mode 100644
index 0000000..8410d3d
--- /dev/null
+++ b/include/msgpack/predef/platform/mingw.h
@@ -0,0 +1,70 @@
+/*
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_COMPILER_MINGW_H
+#define MSGPACK_PREDEF_COMPILER_MINGW_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+
+/*`
+[heading `MSGPACK_PLAT_MINGW`]
+
+[@http://en.wikipedia.org/wiki/MinGW MinGW] platform.
+Version number available as major, minor, and patch.
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`__MINGW32__`] [__predef_detection__]]
+    [[`__MINGW64__`] [__predef_detection__]]
+
+    [[`__MINGW64_VERSION_MAJOR`, `__MINGW64_VERSION_MINOR`] [V.R.0]]
+    [[`__MINGW32_VERSION_MAJOR`, `__MINGW32_VERSION_MINOR`] [V.R.0]]
+    ]
+ */
+
+#define MSGPACK_PLAT_MINGW MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#   include <_mingw.h>
+#   if !defined(MSGPACK_PLAT_MINGW_DETECTION) && (defined(__MINGW64_VERSION_MAJOR) && defined(__MINGW64_VERSION_MINOR))
+#       define MSGPACK_PLAT_MINGW_DETECTION \
+            MSGPACK_VERSION_NUMBER(__MINGW64_VERSION_MAJOR,__MINGW64_VERSION_MINOR,0)
+#   endif
+#   if !defined(MSGPACK_PLAT_MINGW_DETECTION) && (defined(__MINGW32_VERSION_MAJOR) && defined(__MINGW32_VERSION_MINOR))
+#       define MSGPACK_PLAT_MINGW_DETECTION \
+            MSGPACK_VERSION_NUMBER(__MINGW32_MAJOR_VERSION,__MINGW32_MINOR_VERSION,0)
+#   endif
+#   if !defined(MSGPACK_PLAT_MINGW_DETECTION)
+#       define MSGPACK_PLAT_MINGW_DETECTION MSGPACK_VERSION_NUMBER_AVAILABLE
+#   endif
+#endif
+
+#ifdef MSGPACK_PLAT_MINGW_DETECTION
+#   define MSGPACK_PLAT_MINGW_AVAILABLE
+#   if defined(MSGPACK_PREDEF_DETAIL_PLAT_DETECTED)
+#       define MSGPACK_PLAT_MINGW_EMULATED MSGPACK_PLAT_MINGW_DETECTION
+#   else
+#       undef MSGPACK_PLAT_MINGW
+#       define MSGPACK_PLAT_MINGW MSGPACK_PLAT_MINGW_DETECTION
+#   endif
+#   include <msgpack/predef/detail/platform_detected.h>
+#endif
+
+#define MSGPACK_PLAT_MINGW_NAME "MinGW"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_PLAT_MINGW,MSGPACK_PLAT_MINGW_NAME)
+
+#ifdef MSGPACK_PLAT_MINGW_EMULATED
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_PLAT_MINGW_EMULATED,MSGPACK_PLAT_MINGW_NAME)
+#endif
+
+
+#endif
diff --git a/include/msgpack/predef/platform/windows_desktop.h b/include/msgpack/predef/platform/windows_desktop.h
new file mode 100644
index 0000000..93a96cb
--- /dev/null
+++ b/include/msgpack/predef/platform/windows_desktop.h
@@ -0,0 +1,44 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_PLAT_WINDOWS_DESKTOP_H
+#define MSGPACK_PREDEF_PLAT_WINDOWS_DESKTOP_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+#include <msgpack/predef/os/windows.h>
+
+/*`
+[heading `MSGPACK_PLAT_WINDOWS_DESKTOP`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`!WINAPI_FAMILY`] [__predef_detection__]]
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_PLAT_WINDOWS_DESKTOP MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if MSGPACK_OS_WINDOWS && \
+    ( !defined(WINAPI_FAMILY) || (WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP) )
+#   undef MSGPACK_PLAT_WINDOWS_DESKTOP
+#   define MSGPACK_PLAT_WINDOWS_DESKTOP MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if MSGPACK_PLAT_WINDOWS_DESKTOP
+#   define MSGPACK_PLAT_WINDOWS_DESKTOP_AVALIABLE
+#   include <msgpack/predef/detail/platform_detected.h>
+#endif
+
+#define MSGPACK_PLAT_WINDOWS_DESKTOP_NAME "Windows Desktop"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_PLAT_WINDOWS_DESKTOP,MSGPACK_PLAT_WINDOWS_DESKTOP_NAME)
+
+#endif
diff --git a/include/msgpack/predef/platform/windows_phone.h b/include/msgpack/predef/platform/windows_phone.h
new file mode 100644
index 0000000..ccccfbb
--- /dev/null
+++ b/include/msgpack/predef/platform/windows_phone.h
@@ -0,0 +1,42 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_PLAT_WINDOWS_PHONE_H
+#define MSGPACK_PREDEF_PLAT_WINDOWS_PHONE_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+#include <msgpack/predef/os/windows.h>
+
+/*`
+[heading `MSGPACK_PLAT_WINDOWS_PHONE`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_PLAT_WINDOWS_PHONE MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if MSGPACK_OS_WINDOWS && defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP
+#   undef MSGPACK_PLAT_WINDOWS_PHONE
+#   define MSGPACK_PLAT_WINDOWS_PHONE MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if MSGPACK_PLAT_WINDOWS_PHONE
+#   define MSGPACK_PLAT_WINDOWS_PHONE_AVALIABLE
+#   include <msgpack/predef/detail/platform_detected.h>
+#endif
+
+#define MSGPACK_PLAT_WINDOWS_PHONE_NAME "Windows Phone"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_PLAT_WINDOWS_PHONE,MSGPACK_PLAT_WINDOWS_PHONE_NAME)
+
+#endif
diff --git a/include/msgpack/predef/platform/windows_runtime.h b/include/msgpack/predef/platform/windows_runtime.h
new file mode 100644
index 0000000..d93f153
--- /dev/null
+++ b/include/msgpack/predef/platform/windows_runtime.h
@@ -0,0 +1,44 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_PLAT_WINDOWS_RUNTIME_H
+#define MSGPACK_PREDEF_PLAT_WINDOWS_RUNTIME_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+#include <msgpack/predef/os/windows.h>
+
+/*`
+[heading `MSGPACK_PLAT_WINDOWS_RUNTIME`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_APP`] [__predef_detection__]]
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_PLAT_WINDOWS_RUNTIME MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if MSGPACK_OS_WINDOWS && defined(WINAPI_FAMILY) && \
+    ( WINAPI_FAMILY == WINAPI_FAMILY_APP || WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP )
+#   undef MSGPACK_PLAT_WINDOWS_RUNTIME
+#   define MSGPACK_PLAT_WINDOWS_RUNTIME MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if MSGPACK_PLAT_WINDOWS_RUNTIME
+#   define MSGPACK_PLAT_WINDOWS_RUNTIME_AVALIABLE
+#   include <msgpack/predef/detail/platform_detected.h>
+#endif
+
+#define MSGPACK_PLAT_WINDOWS_RUNTIME_NAME "Windows Runtime"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_PLAT_WINDOWS_RUNTIME,MSGPACK_PLAT_WINDOWS_RUNTIME_NAME)
+
+#endif
diff --git a/include/msgpack/predef/platform/windows_store.h b/include/msgpack/predef/platform/windows_store.h
new file mode 100644
index 0000000..005f4ec
--- /dev/null
+++ b/include/msgpack/predef/platform/windows_store.h
@@ -0,0 +1,42 @@
+/*
+Copyright (c) Microsoft Corporation 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_PLAT_WINDOWS_STORE_H
+#define MSGPACK_PREDEF_PLAT_WINDOWS_STORE_H
+
+#include <msgpack/predef/version_number.h>
+#include <msgpack/predef/make.h>
+#include <msgpack/predef/os/windows.h>
+
+/*`
+[heading `MSGPACK_PLAT_WINDOWS_STORE`]
+
+[table
+    [[__predef_symbol__] [__predef_version__]]
+
+    [[`WINAPI_FAMILY == WINAPI_FAMILY_APP`] [__predef_detection__]]
+    ]
+ */
+
+#define MSGPACK_PLAT_WINDOWS_STORE MSGPACK_VERSION_NUMBER_NOT_AVAILABLE
+
+#if MSGPACK_OS_WINDOWS && defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_APP
+#   undef MSGPACK_PLAT_WINDOWS_STORE
+#   define MSGPACK_PLAT_WINDOWS_STORE MSGPACK_VERSION_NUMBER_AVAILABLE
+#endif
+ 
+#if MSGPACK_PLAT_WINDOWS_STORE
+#   define MSGPACK_PLAT_WINDOWS_STORE_AVALIABLE
+#   include <msgpack/predef/detail/platform_detected.h>
+#endif
+
+#define MSGPACK_PLAT_WINDOWS_STORE_NAME "Windows Store"
+
+#include <msgpack/predef/detail/test.h>
+MSGPACK_PREDEF_DECLARE_TEST(MSGPACK_PLAT_WINDOWS_STORE,MSGPACK_PLAT_WINDOWS_STORE_NAME)
+
+#endif
diff --git a/include/msgpack/predef/version.h b/include/msgpack/predef/version.h
new file mode 100644
index 0000000..3910b96
--- /dev/null
+++ b/include/msgpack/predef/version.h
@@ -0,0 +1,15 @@
+/*
+Copyright Rene Rivera 2014
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_VERSION_H
+#define MSGPACK_PREDEF_VERSION_H
+
+#include <msgpack/predef/version_number.h>
+
+#define MSGPACK_PREDEF_VERSION MSGPACK_VERSION_NUMBER(1,2,0)
+
+#endif
diff --git a/include/msgpack/predef/version_number.h b/include/msgpack/predef/version_number.h
new file mode 100644
index 0000000..37af5d2
--- /dev/null
+++ b/include/msgpack/predef/version_number.h
@@ -0,0 +1,54 @@
+/*
+Copyright Rene Rivera 2005
+Copyright Rene Rivera 2008-2013
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file LICENSE_1_0.txt or copy at
+http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef MSGPACK_PREDEF_VERSION_NUMBER_H
+#define MSGPACK_PREDEF_VERSION_NUMBER_H
+
+/*`
+[heading `MSGPACK_VERSION_NUMBER`]
+
+``
+MSGPACK_VERSION_NUMBER(major,minor,patch)
+``
+
+Defines standard version numbers, with these properties:
+
+* Decimal base whole numbers in the range \[0,1000000000).
+  The number range is designed to allow for a (2,2,5) triplet.
+  Which fits within a 32 bit value.
+* The `major` number can be in the \[0,99\] range.
+* The `minor` number can be in the \[0,99\] range.
+* The `patch` number can be in the \[0,99999\] range.
+* Values can be specified in any base. As the defined value
+  is an constant expression.
+* Value can be directly used in both preprocessor and compiler
+  expressions for comparison to other similarly defined values.
+* The implementation enforces the individual ranges for the
+  major, minor, and patch numbers. And values over the ranges
+  are truncated (modulo).
+
+*/
+#define MSGPACK_VERSION_NUMBER(major,minor,patch) \
+    ( (((major)%100)*10000000) + (((minor)%100)*100000) + ((patch)%100000) )
+
+#define MSGPACK_VERSION_NUMBER_MAX \
+    MSGPACK_VERSION_NUMBER(99,99,99999)
+
+#define MSGPACK_VERSION_NUMBER_ZERO \
+    MSGPACK_VERSION_NUMBER(0,0,0)
+
+#define MSGPACK_VERSION_NUMBER_MIN \
+    MSGPACK_VERSION_NUMBER(0,0,1)
+
+#define MSGPACK_VERSION_NUMBER_AVAILABLE \
+    MSGPACK_VERSION_NUMBER_MIN
+
+#define MSGPACK_VERSION_NUMBER_NOT_AVAILABLE \
+    MSGPACK_VERSION_NUMBER_ZERO
+
+#endif
diff --git a/include/msgpack/sbuffer.h b/include/msgpack/sbuffer.h
new file mode 100644
index 0000000..c494bae
--- /dev/null
+++ b/include/msgpack/sbuffer.h
@@ -0,0 +1,110 @@
+/*
+ * MessagePack for C simple buffer implementation
+ *
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_SBUFFER_H
+#define MSGPACK_SBUFFER_H
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_sbuffer Simple buffer
+ * @ingroup msgpack_buffer
+ * @{
+ */
+
+typedef struct msgpack_sbuffer {
+    size_t size;
+    char* data;
+    size_t alloc;
+} msgpack_sbuffer;
+
+static inline void msgpack_sbuffer_init(msgpack_sbuffer* sbuf)
+{
+    memset(sbuf, 0, sizeof(msgpack_sbuffer));
+}
+
+static inline void msgpack_sbuffer_destroy(msgpack_sbuffer* sbuf)
+{
+    free(sbuf->data);
+}
+
+static inline msgpack_sbuffer* msgpack_sbuffer_new(void)
+{
+    return (msgpack_sbuffer*)calloc(1, sizeof(msgpack_sbuffer));
+}
+
+static inline void msgpack_sbuffer_free(msgpack_sbuffer* sbuf)
+{
+    if(sbuf == NULL) { return; }
+    msgpack_sbuffer_destroy(sbuf);
+    free(sbuf);
+}
+
+#ifndef MSGPACK_SBUFFER_INIT_SIZE
+#define MSGPACK_SBUFFER_INIT_SIZE 8192
+#endif
+
+static inline int msgpack_sbuffer_write(void* data, const char* buf, size_t len)
+{
+    msgpack_sbuffer* sbuf = (msgpack_sbuffer*)data;
+
+    if(sbuf->alloc - sbuf->size < len) {
+        void* tmp;
+        size_t nsize = (sbuf->alloc) ?
+                sbuf->alloc * 2 : MSGPACK_SBUFFER_INIT_SIZE;
+
+        while(nsize < sbuf->size + len) {
+            size_t tmp_nsize = nsize * 2;
+            if (tmp_nsize <= nsize) {
+                nsize = sbuf->size + len;
+                break;
+            }
+            nsize = tmp_nsize;
+        }
+
+        tmp = realloc(sbuf->data, nsize);
+        if(!tmp) { return -1; }
+
+        sbuf->data = (char*)tmp;
+        sbuf->alloc = nsize;
+    }
+
+    memcpy(sbuf->data + sbuf->size, buf, len);
+    sbuf->size += len;
+    return 0;
+}
+
+static inline char* msgpack_sbuffer_release(msgpack_sbuffer* sbuf)
+{
+    char* tmp = sbuf->data;
+    sbuf->size = 0;
+    sbuf->data = NULL;
+    sbuf->alloc = 0;
+    return tmp;
+}
+
+static inline void msgpack_sbuffer_clear(msgpack_sbuffer* sbuf)
+{
+    sbuf->size = 0;
+}
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/sbuffer.h */
diff --git a/include/msgpack/sysdep.h b/include/msgpack/sysdep.h
new file mode 100644
index 0000000..a3f9edc
--- /dev/null
+++ b/include/msgpack/sysdep.h
@@ -0,0 +1,189 @@
+/*
+ * MessagePack system dependencies
+ *
+ * Copyright (C) 2008-2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_SYSDEP_H
+#define MSGPACK_SYSDEP_H
+
+#include <msgpack/predef.h>
+
+#include <stdlib.h>
+#include <stddef.h>
+#if defined(_MSC_VER) && _MSC_VER < 1600
+    typedef __int8 int8_t;
+    typedef unsigned __int8 uint8_t;
+    typedef __int16 int16_t;
+    typedef unsigned __int16 uint16_t;
+    typedef __int32 int32_t;
+    typedef unsigned __int32 uint32_t;
+    typedef __int64 int64_t;
+    typedef unsigned __int64 uint64_t;
+#elif defined(_MSC_VER)  // && _MSC_VER >= 1600
+#   include <stdint.h>
+#else
+#   include <stdint.h>
+#   include <stdbool.h>
+#endif
+
+#if !defined(MSGPACK_DLLEXPORT)
+#if defined(_MSC_VER)
+#   define MSGPACK_DLLEXPORT __declspec(dllexport)
+#else  /* _MSC_VER */
+#   define MSGPACK_DLLEXPORT
+#endif /* _MSC_VER */
+#endif
+
+#ifdef _WIN32
+#   define _msgpack_atomic_counter_header <windows.h>
+    typedef long _msgpack_atomic_counter_t;
+#   define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr)
+#   define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr)
+#elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41)
+
+#   if defined(__cplusplus)
+#       define _msgpack_atomic_counter_header "gcc_atomic.hpp"
+#   else
+#       define _msgpack_atomic_counter_header "gcc_atomic.h"
+#   endif
+
+#else
+    typedef unsigned int _msgpack_atomic_counter_t;
+#   define _msgpack_sync_decr_and_fetch(ptr) __sync_sub_and_fetch(ptr, 1)
+#   define _msgpack_sync_incr_and_fetch(ptr) __sync_add_and_fetch(ptr, 1)
+#endif
+
+#ifdef _WIN32
+
+#   ifdef __cplusplus
+    /* numeric_limits<T>::min,max */
+#       ifdef max
+#           undef max
+#       endif
+#       ifdef min
+#           undef min
+#       endif
+#   endif
+
+#else /* _*/
+
+#include <arpa/inet.h>  /* __BYTE_ORDER */
+#   if defined(linux)
+#       include <byteswap.h>
+#   endif
+
+#endif
+
+#if MSGPACK_ENDIAN_LITTLE_BYTE
+
+#   ifdef _WIN32
+#       if defined(ntohs)
+#       define _msgpack_be16(x) ntohs(x)
+#        elif defined(_byteswap_ushort) || (defined(_MSC_VER) && _MSC_VER >= 1400)
+#            define _msgpack_be16(x) ((uint16_t)_byteswap_ushort((unsigned short)x))
+#        else
+#            define _msgpack_be16(x) ( \
+                 ((((uint16_t)x) <<  8) ) | \
+                 ((((uint16_t)x) >>  8) ) )
+#        endif
+#   else
+#        define _msgpack_be16(x) ntohs(x)
+#   endif
+
+#   ifdef _WIN32
+#        if defined(ntohl)
+#            define _msgpack_be32(x) ntohl(x)
+#        elif defined(_byteswap_ulong) || (defined(_MSC_VER) && _MSC_VER >= 1400)
+#            define _msgpack_be32(x) ((uint32_t)_byteswap_ulong((unsigned long)x))
+#        else
+#            define _msgpack_be32(x) \
+                 ( ((((uint32_t)x) << 24)               ) | \
+                   ((((uint32_t)x) <<  8) & 0x00ff0000U ) | \
+                   ((((uint32_t)x) >>  8) & 0x0000ff00U ) | \
+                   ((((uint32_t)x) >> 24)               ) )
+#        endif
+#   else
+#        define _msgpack_be32(x) ntohl(x)
+#   endif
+
+#   if defined(_byteswap_uint64) || (defined(_MSC_VER) && _MSC_VER >= 1400)
+#        define _msgpack_be64(x) (_byteswap_uint64(x))
+#   elif defined(bswap_64)
+#        define _msgpack_be64(x) bswap_64(x)
+#   elif defined(__DARWIN_OSSwapInt64)
+#        define _msgpack_be64(x) __DARWIN_OSSwapInt64(x)
+#   else
+#        define _msgpack_be64(x) \
+             ( ((((uint64_t)x) << 56)                         ) | \
+               ((((uint64_t)x) << 40) & 0x00ff000000000000ULL ) | \
+               ((((uint64_t)x) << 24) & 0x0000ff0000000000ULL ) | \
+               ((((uint64_t)x) <<  8) & 0x000000ff00000000ULL ) | \
+               ((((uint64_t)x) >>  8) & 0x00000000ff000000ULL ) | \
+               ((((uint64_t)x) >> 24) & 0x0000000000ff0000ULL ) | \
+               ((((uint64_t)x) >> 40) & 0x000000000000ff00ULL ) | \
+               ((((uint64_t)x) >> 56)                         ) )
+#   endif
+
+#elif MSGPACK_ENDIAN_BIG_BYTE
+
+#   define _msgpack_be16(x) (x)
+#   define _msgpack_be32(x) (x)
+#   define _msgpack_be64(x) (x)
+
+#else
+#   error msgpack-c supports only big endian and little endian
+#endif /* MSGPACK_ENDIAN_LITTLE_BYTE */
+
+#define _msgpack_load16(cast, from, to) do {       \
+        memcpy((cast*)(to), (from), sizeof(cast)); \
+        *(to) = _msgpack_be16(*(to));              \
+    } while (0);
+
+#define _msgpack_load32(cast, from, to) do {       \
+        memcpy((cast*)(to), (from), sizeof(cast)); \
+        *(to) = _msgpack_be32(*(to));              \
+    } while (0);
+#define _msgpack_load64(cast, from, to) do {       \
+        memcpy((cast*)(to), (from), sizeof(cast)); \
+        *(to) = _msgpack_be64(*(to));              \
+    } while (0);
+
+#define _msgpack_store16(to, num) \
+    do { uint16_t val = _msgpack_be16(num); memcpy(to, &val, 2); } while(0)
+#define _msgpack_store32(to, num) \
+    do { uint32_t val = _msgpack_be32(num); memcpy(to, &val, 4); } while(0)
+#define _msgpack_store64(to, num) \
+    do { uint64_t val = _msgpack_be64(num); memcpy(to, &val, 8); } while(0)
+
+/*
+#define _msgpack_load16(cast, from) \
+    ({ cast val; memcpy(&val, (char*)from, 2); _msgpack_be16(val); })
+#define _msgpack_load32(cast, from) \
+    ({ cast val; memcpy(&val, (char*)from, 4); _msgpack_be32(val); })
+#define _msgpack_load64(cast, from) \
+    ({ cast val; memcpy(&val, (char*)from, 8); _msgpack_be64(val); })
+*/
+
+
+#if !defined(__cplusplus) && defined(_MSC_VER)
+#  if !defined(FALSE)
+#    define FALSE (0)
+#  endif
+#  if !defined(TRUE)
+#    define TRUE (!FALSE)
+#  endif
+#  if _MSC_VER >= 1800
+#    include <stdbool.h>
+#  else
+#    define bool int
+#    define true TRUE
+#    define false FALSE
+#  endif
+#  define inline __inline
+#endif
+
+#endif /* msgpack/sysdep.h */
diff --git a/include/msgpack/unpack.h b/include/msgpack/unpack.h
new file mode 100644
index 0000000..0f9aede
--- /dev/null
+++ b/include/msgpack/unpack.h
@@ -0,0 +1,270 @@
+/*
+ * MessagePack for C unpacking routine
+ *
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_UNPACKER_H
+#define MSGPACK_UNPACKER_H
+
+#include "zone.h"
+#include "object.h"
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_unpack Deserializer
+ * @ingroup msgpack
+ * @{
+ */
+
+typedef struct msgpack_unpacked {
+    msgpack_zone* zone;
+    msgpack_object data;
+} msgpack_unpacked;
+
+typedef enum {
+    MSGPACK_UNPACK_SUCCESS              =  2,
+    MSGPACK_UNPACK_EXTRA_BYTES          =  1,
+    MSGPACK_UNPACK_CONTINUE             =  0,
+    MSGPACK_UNPACK_PARSE_ERROR          = -1,
+    MSGPACK_UNPACK_NOMEM_ERROR          = -2
+} msgpack_unpack_return;
+
+
+MSGPACK_DLLEXPORT
+msgpack_unpack_return
+msgpack_unpack_next(msgpack_unpacked* result,
+        const char* data, size_t len, size_t* off);
+
+/** @} */
+
+
+/**
+ * @defgroup msgpack_unpacker Streaming deserializer
+ * @ingroup msgpack
+ * @{
+ */
+
+typedef struct msgpack_unpacker {
+    char* buffer;
+    size_t used;
+    size_t free;
+    size_t off;
+    size_t parsed;
+    msgpack_zone* z;
+    size_t initial_buffer_size;
+    void* ctx;
+} msgpack_unpacker;
+
+
+#ifndef MSGPACK_UNPACKER_INIT_BUFFER_SIZE
+#define MSGPACK_UNPACKER_INIT_BUFFER_SIZE (64*1024)
+#endif
+
+/**
+ * Initializes a streaming deserializer.
+ * The initialized deserializer must be destroyed by msgpack_unpacker_destroy(msgpack_unpacker*).
+ */
+MSGPACK_DLLEXPORT
+bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size);
+
+/**
+ * Destroys a streaming deserializer initialized by msgpack_unpacker_init(msgpack_unpacker*, size_t).
+ */
+MSGPACK_DLLEXPORT
+void msgpack_unpacker_destroy(msgpack_unpacker* mpac);
+
+
+/**
+ * Creates a streaming deserializer.
+ * The created deserializer must be destroyed by msgpack_unpacker_free(msgpack_unpacker*).
+ */
+MSGPACK_DLLEXPORT
+msgpack_unpacker* msgpack_unpacker_new(size_t initial_buffer_size);
+
+/**
+ * Frees a streaming deserializer created by msgpack_unpacker_new(size_t).
+ */
+MSGPACK_DLLEXPORT
+void msgpack_unpacker_free(msgpack_unpacker* mpac);
+
+
+#ifndef MSGPACK_UNPACKER_RESERVE_SIZE
+#define MSGPACK_UNPACKER_RESERVE_SIZE (32*1024)
+#endif
+
+/**
+ * Reserves free space of the internal buffer.
+ * Use this function to fill the internal buffer with
+ * msgpack_unpacker_buffer(msgpack_unpacker*),
+ * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
+ * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
+ */
+static inline bool   msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size);
+
+/**
+ * Gets pointer to the free space of the internal buffer.
+ * Use this function to fill the internal buffer with
+ * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
+ * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*) and
+ * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
+ */
+static inline char*  msgpack_unpacker_buffer(msgpack_unpacker* mpac);
+
+/**
+ * Gets size of the free space of the internal buffer.
+ * Use this function to fill the internal buffer with
+ * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
+ * msgpack_unpacker_buffer(const msgpack_unpacker*) and
+ * msgpack_unpacker_buffer_consumed(msgpack_unpacker*).
+ */
+static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac);
+
+/**
+ * Notifies the deserializer that the internal buffer filled.
+ * Use this function to fill the internal buffer with
+ * msgpack_unpacker_reserve_buffer(msgpack_unpacker*, size_t),
+ * msgpack_unpacker_buffer(msgpack_unpacker*) and
+ * msgpack_unpacker_buffer_capacity(const msgpack_unpacker*).
+ */
+static inline void   msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size);
+
+
+/**
+ * Deserializes one object.
+ * Returns true if it successes. Otherwise false is returned.
+ * @param pac  pointer to an initialized msgpack_unpacked object.
+ */
+MSGPACK_DLLEXPORT
+msgpack_unpack_return msgpack_unpacker_next(msgpack_unpacker* mpac, msgpack_unpacked* pac);
+
+/**
+ * Initializes a msgpack_unpacked object.
+ * The initialized object must be destroyed by msgpack_unpacked_destroy(msgpack_unpacker*).
+ * Use the object with msgpack_unpacker_next(msgpack_unpacker*, msgpack_unpacked*) or
+ * msgpack_unpack_next(msgpack_unpacked*, const char*, size_t, size_t*).
+ */
+static inline void msgpack_unpacked_init(msgpack_unpacked* result);
+
+/**
+ * Destroys a streaming deserializer initialized by msgpack_unpacked().
+ */
+static inline void msgpack_unpacked_destroy(msgpack_unpacked* result);
+
+/**
+ * Releases the memory zone from msgpack_unpacked object.
+ * The released zone must be freed by msgpack_zone_free(msgpack_zone*).
+ */
+static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result);
+
+
+MSGPACK_DLLEXPORT
+int msgpack_unpacker_execute(msgpack_unpacker* mpac);
+
+MSGPACK_DLLEXPORT
+msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac);
+
+MSGPACK_DLLEXPORT
+msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac);
+
+MSGPACK_DLLEXPORT
+void msgpack_unpacker_reset_zone(msgpack_unpacker* mpac);
+
+MSGPACK_DLLEXPORT
+void msgpack_unpacker_reset(msgpack_unpacker* mpac);
+
+static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac);
+
+
+/** @} */
+
+
+// obsolete
+MSGPACK_DLLEXPORT
+msgpack_unpack_return
+msgpack_unpack(const char* data, size_t len, size_t* off,
+        msgpack_zone* result_zone, msgpack_object* result);
+
+
+
+
+static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac);
+
+MSGPACK_DLLEXPORT
+bool msgpack_unpacker_flush_zone(msgpack_unpacker* mpac);
+
+MSGPACK_DLLEXPORT
+bool msgpack_unpacker_expand_buffer(msgpack_unpacker* mpac, size_t size);
+
+static inline bool msgpack_unpacker_reserve_buffer(msgpack_unpacker* mpac, size_t size)
+{
+    if(mpac->free >= size) { return true; }
+    return msgpack_unpacker_expand_buffer(mpac, size);
+}
+
+static inline char* msgpack_unpacker_buffer(msgpack_unpacker* mpac)
+{
+    return mpac->buffer + mpac->used;
+}
+
+static inline size_t msgpack_unpacker_buffer_capacity(const msgpack_unpacker* mpac)
+{
+    return mpac->free;
+}
+
+static inline void msgpack_unpacker_buffer_consumed(msgpack_unpacker* mpac, size_t size)
+{
+    mpac->used += size;
+    mpac->free -= size;
+}
+
+static inline size_t msgpack_unpacker_message_size(const msgpack_unpacker* mpac)
+{
+    return mpac->parsed - mpac->off + mpac->used;
+}
+
+static inline size_t msgpack_unpacker_parsed_size(const msgpack_unpacker* mpac)
+{
+    return mpac->parsed;
+}
+
+
+static inline void msgpack_unpacked_init(msgpack_unpacked* result)
+{
+    memset(result, 0, sizeof(msgpack_unpacked));
+}
+
+static inline void msgpack_unpacked_destroy(msgpack_unpacked* result)
+{
+    if(result->zone != NULL) {
+        msgpack_zone_free(result->zone);
+        result->zone = NULL;
+        memset(&result->data, 0, sizeof(msgpack_object));
+    }
+}
+
+static inline msgpack_zone* msgpack_unpacked_release_zone(msgpack_unpacked* result)
+{
+    if(result->zone != NULL) {
+        msgpack_zone* z = result->zone;
+        result->zone = NULL;
+        return z;
+    }
+    return NULL;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/unpack.h */
+
diff --git a/include/msgpack/unpack_define.h b/include/msgpack/unpack_define.h
new file mode 100644
index 0000000..c7decf6
--- /dev/null
+++ b/include/msgpack/unpack_define.h
@@ -0,0 +1,89 @@
+/*
+ * MessagePack unpacking routine template
+ *
+ * Copyright (C) 2008-2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_UNPACK_DEFINE_H
+#define MSGPACK_UNPACK_DEFINE_H
+
+#include "msgpack/sysdep.h"
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <stdio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifndef MSGPACK_EMBED_STACK_SIZE
+#define MSGPACK_EMBED_STACK_SIZE 32
+#endif
+
+
+typedef enum {
+    MSGPACK_CS_HEADER            = 0x00,  // nil
+
+    //MSGPACK_CS_                = 0x01,
+    //MSGPACK_CS_                = 0x02,  // false
+    //MSGPACK_CS_                = 0x03,  // true
+
+    MSGPACK_CS_BIN_8             = 0x04,
+    MSGPACK_CS_BIN_16            = 0x05,
+    MSGPACK_CS_BIN_32            = 0x06,
+
+    MSGPACK_CS_EXT_8             = 0x07,
+    MSGPACK_CS_EXT_16            = 0x08,
+    MSGPACK_CS_EXT_32            = 0x09,
+
+    MSGPACK_CS_FLOAT             = 0x0a,
+    MSGPACK_CS_DOUBLE            = 0x0b,
+    MSGPACK_CS_UINT_8            = 0x0c,
+    MSGPACK_CS_UINT_16           = 0x0d,
+    MSGPACK_CS_UINT_32           = 0x0e,
+    MSGPACK_CS_UINT_64           = 0x0f,
+    MSGPACK_CS_INT_8             = 0x10,
+    MSGPACK_CS_INT_16            = 0x11,
+    MSGPACK_CS_INT_32            = 0x12,
+    MSGPACK_CS_INT_64            = 0x13,
+
+    MSGPACK_CS_FIXEXT_1          = 0x14,
+    MSGPACK_CS_FIXEXT_2          = 0x15,
+    MSGPACK_CS_FIXEXT_4          = 0x16,
+    MSGPACK_CS_FIXEXT_8          = 0x17,
+    MSGPACK_CS_FIXEXT_16         = 0x18,
+
+    MSGPACK_CS_STR_8             = 0x19, // str8
+    MSGPACK_CS_STR_16            = 0x1a, // str16
+    MSGPACK_CS_STR_32            = 0x1b, // str32
+    MSGPACK_CS_ARRAY_16          = 0x1c,
+    MSGPACK_CS_ARRAY_32          = 0x1d,
+    MSGPACK_CS_MAP_16            = 0x1e,
+    MSGPACK_CS_MAP_32            = 0x1f,
+
+    //MSGPACK_ACS_BIG_INT_VALUE,
+    //MSGPACK_ACS_BIG_FLOAT_VALUE,
+    MSGPACK_ACS_STR_VALUE,
+    MSGPACK_ACS_BIN_VALUE,
+    MSGPACK_ACS_EXT_VALUE
+} msgpack_unpack_state;
+
+
+typedef enum {
+    MSGPACK_CT_ARRAY_ITEM,
+    MSGPACK_CT_MAP_KEY,
+    MSGPACK_CT_MAP_VALUE
+} msgpack_container_type;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/unpack_define.h */
+
diff --git a/include/msgpack/unpack_template.h b/include/msgpack/unpack_template.h
new file mode 100644
index 0000000..a6dae6f
--- /dev/null
+++ b/include/msgpack/unpack_template.h
@@ -0,0 +1,474 @@
+/*
+ * MessagePack unpacking routine template
+ *
+ * Copyright (C) 2008-2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+
+#ifndef msgpack_unpack_func
+#error msgpack_unpack_func template is not defined
+#endif
+
+#ifndef msgpack_unpack_callback
+#error msgpack_unpack_callback template is not defined
+#endif
+
+#ifndef msgpack_unpack_struct
+#error msgpack_unpack_struct template is not defined
+#endif
+
+#ifndef msgpack_unpack_struct_decl
+#define msgpack_unpack_struct_decl(name) msgpack_unpack_struct(name)
+#endif
+
+#ifndef msgpack_unpack_object
+#error msgpack_unpack_object type is not defined
+#endif
+
+#ifndef msgpack_unpack_user
+#error msgpack_unpack_user type is not defined
+#endif
+
+#ifndef USE_CASE_RANGE
+#if !defined(_MSC_VER)
+#define USE_CASE_RANGE
+#endif
+#endif
+
+msgpack_unpack_struct_decl(_stack) {
+    msgpack_unpack_object obj;
+    size_t count;
+    unsigned int ct;
+    msgpack_unpack_object map_key;
+};
+
+msgpack_unpack_struct_decl(_context) {
+    msgpack_unpack_user user;
+    unsigned int cs;
+    unsigned int trail;
+    unsigned int top;
+    /*
+    msgpack_unpack_struct(_stack)* stack;
+    unsigned int stack_size;
+    msgpack_unpack_struct(_stack) embed_stack[MSGPACK_EMBED_STACK_SIZE];
+    */
+    msgpack_unpack_struct(_stack) stack[MSGPACK_EMBED_STACK_SIZE];
+};
+
+
+msgpack_unpack_func(void, _init)(msgpack_unpack_struct(_context)* ctx)
+{
+    ctx->cs = MSGPACK_CS_HEADER;
+    ctx->trail = 0;
+    ctx->top = 0;
+    /*
+    ctx->stack = ctx->embed_stack;
+    ctx->stack_size = MSGPACK_EMBED_STACK_SIZE;
+    */
+    ctx->stack[0].obj = msgpack_unpack_callback(_root)(&ctx->user);
+}
+
+/*
+msgpack_unpack_func(void, _destroy)(msgpack_unpack_struct(_context)* ctx)
+{
+    if(ctx->stack_size != MSGPACK_EMBED_STACK_SIZE) {
+        free(ctx->stack);
+    }
+}
+*/
+
+msgpack_unpack_func(msgpack_unpack_object, _data)(msgpack_unpack_struct(_context)* ctx)
+{
+    return (ctx)->stack[0].obj;
+}
+
+
+msgpack_unpack_func(int, _execute)(msgpack_unpack_struct(_context)* ctx, const char* data, size_t len, size_t* off)
+{
+    assert(len >= *off);
+    {
+        const unsigned char* p = (unsigned char*)data + *off;
+        const unsigned char* const pe = (unsigned char*)data + len;
+        const void* n = NULL;
+
+        unsigned int trail = ctx->trail;
+        unsigned int cs = ctx->cs;
+        unsigned int top = ctx->top;
+        msgpack_unpack_struct(_stack)* stack = ctx->stack;
+        /*
+        unsigned int stack_size = ctx->stack_size;
+        */
+        msgpack_unpack_user* user = &ctx->user;
+
+        msgpack_unpack_object obj;
+        msgpack_unpack_struct(_stack)* c = NULL;
+
+        int ret;
+
+#define push_simple_value(func) \
+        if(msgpack_unpack_callback(func)(user, &obj) < 0) { goto _failed; } \
+        goto _push
+#define push_fixed_value(func, arg) \
+        if(msgpack_unpack_callback(func)(user, arg, &obj) < 0) { goto _failed; } \
+        goto _push
+#define push_variable_value(func, base, pos, len) \
+        if(msgpack_unpack_callback(func)(user, \
+            (const char*)base, (const char*)pos, len, &obj) < 0) { goto _failed; } \
+        goto _push
+
+#define again_fixed_trail(_cs, trail_len) \
+        trail = trail_len; \
+        cs = _cs; \
+        goto _fixed_trail_again
+#define again_fixed_trail_if_zero(_cs, trail_len, ifzero) \
+        trail = trail_len; \
+        if(trail == 0) { goto ifzero; } \
+        cs = _cs; \
+        goto _fixed_trail_again
+
+#define start_container(func, count_, ct_) \
+        if(top >= MSGPACK_EMBED_STACK_SIZE) { goto _failed; } /* FIXME */ \
+        if(msgpack_unpack_callback(func)(user, count_, &stack[top].obj) < 0) { goto _failed; } \
+        if((count_) == 0) { obj = stack[top].obj; goto _push; } \
+        stack[top].ct = ct_; \
+        stack[top].count = count_; \
+        ++top; \
+        /*printf("container %d count %d stack %d\n",stack[top].obj,count_,top);*/ \
+        /*printf("stack push %d\n", top);*/ \
+        /* FIXME \
+        if(top >= stack_size) { \
+            if(stack_size == MSGPACK_EMBED_STACK_SIZE) { \
+                size_t csize = sizeof(msgpack_unpack_struct(_stack)) * MSGPACK_EMBED_STACK_SIZE; \
+                size_t nsize = csize * 2; \
+                msgpack_unpack_struct(_stack)* tmp = (msgpack_unpack_struct(_stack)*)malloc(nsize); \
+                if(tmp == NULL) { goto _failed; } \
+                memcpy(tmp, ctx->stack, csize); \
+                ctx->stack = stack = tmp; \
+                ctx->stack_size = stack_size = MSGPACK_EMBED_STACK_SIZE * 2; \
+            } else { \
+                size_t nsize = sizeof(msgpack_unpack_struct(_stack)) * ctx->stack_size * 2; \
+                msgpack_unpack_struct(_stack)* tmp = (msgpack_unpack_struct(_stack)*)realloc(ctx->stack, nsize); \
+                if(tmp == NULL) { goto _failed; } \
+                ctx->stack = stack = tmp; \
+                ctx->stack_size = stack_size = stack_size * 2; \
+            } \
+        } \
+        */ \
+        goto _header_again
+
+#define NEXT_CS(p) \
+        ((unsigned int)*p & 0x1f)
+
+#ifdef USE_CASE_RANGE
+#define SWITCH_RANGE_BEGIN     switch(*p) {
+#define SWITCH_RANGE(FROM, TO) case FROM ... TO:
+#define SWITCH_RANGE_DEFAULT   default:
+#define SWITCH_RANGE_END       }
+#else
+#define SWITCH_RANGE_BEGIN     { if(0) {
+#define SWITCH_RANGE(FROM, TO) } else if(FROM <= *p && *p <= TO) {
+#define SWITCH_RANGE_DEFAULT   } else {
+#define SWITCH_RANGE_END       } }
+#endif
+
+        if(p == pe) { goto _out; }
+        do {
+            switch(cs) {
+            case MSGPACK_CS_HEADER:
+                SWITCH_RANGE_BEGIN
+                SWITCH_RANGE(0x00, 0x7f)  // Positive Fixnum
+                    push_fixed_value(_uint8, *(uint8_t*)p);
+                SWITCH_RANGE(0xe0, 0xff)  // Negative Fixnum
+                    push_fixed_value(_int8, *(int8_t*)p);
+                SWITCH_RANGE(0xc0, 0xdf)  // Variable
+                    switch(*p) {
+                    case 0xc0:  // nil
+                        push_simple_value(_nil);
+                    //case 0xc1:  // string
+                    //  again_terminal_trail(NEXT_CS(p), p+1);
+                    case 0xc2:  // false
+                        push_simple_value(_false);
+                    case 0xc3:  // true
+                        push_simple_value(_true);
+                    case 0xc4: // bin 8
+                    case 0xc5: // bin 16
+                    case 0xc6: // bin 32
+                        again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
+                    case 0xc7: // ext 8
+                    case 0xc8: // ext 16
+                    case 0xc9: // ext 32
+                        again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) + 1) & 0x03));
+                    case 0xca:  // float
+                    case 0xcb:  // double
+                    case 0xcc:  // unsigned int  8
+                    case 0xcd:  // unsigned int 16
+                    case 0xce:  // unsigned int 32
+                    case 0xcf:  // unsigned int 64
+                    case 0xd0:  // signed int  8
+                    case 0xd1:  // signed int 16
+                    case 0xd2:  // signed int 32
+                    case 0xd3:  // signed int 64
+                        again_fixed_trail(NEXT_CS(p), 1 << (((unsigned int)*p) & 0x03));
+                    case 0xd4:  // fixext 1
+                    case 0xd5:  // fixext 2
+                    case 0xd6:  // fixext 4
+                    case 0xd7:  // fixext 8
+                        again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE,
+                            (1 << (((unsigned int)*p) & 0x03)) + 1, _ext_zero);
+                    case 0xd8:  // fixext 16
+                        again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 16+1, _ext_zero);
+
+                    case 0xd9:  // str 8
+                    case 0xda:  // str 16
+                    case 0xdb:  // str 32
+                        again_fixed_trail(NEXT_CS(p), 1 << ((((unsigned int)*p) & 0x03) - 1));
+                    case 0xdc:  // array 16
+                    case 0xdd:  // array 32
+                    case 0xde:  // map 16
+                    case 0xdf:  // map 32
+                        again_fixed_trail(NEXT_CS(p), 2u << (((unsigned int)*p) & 0x01));
+                    default:
+                        goto _failed;
+                    }
+                SWITCH_RANGE(0xa0, 0xbf)  // FixStr
+                    again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, ((unsigned int)*p & 0x1f), _str_zero);
+                SWITCH_RANGE(0x90, 0x9f)  // FixArray
+                    start_container(_array, ((unsigned int)*p) & 0x0f, MSGPACK_CT_ARRAY_ITEM);
+                SWITCH_RANGE(0x80, 0x8f)  // FixMap
+                    start_container(_map, ((unsigned int)*p) & 0x0f, MSGPACK_CT_MAP_KEY);
+
+                SWITCH_RANGE_DEFAULT
+                    goto _failed;
+                SWITCH_RANGE_END
+                // end MSGPACK_CS_HEADER
+
+
+            _fixed_trail_again:
+                ++p;
+
+            default:
+                if((size_t)(pe - p) < trail) { goto _out; }
+                n = p;  p += trail - 1;
+                switch(cs) {
+                //case MSGPACK_CS_
+                //case MSGPACK_CS_
+                case MSGPACK_CS_FLOAT: {
+                        union { uint32_t i; float f; } mem;
+                        _msgpack_load32(uint32_t, n, &mem.i);
+                        push_fixed_value(_float, mem.f); }
+                case MSGPACK_CS_DOUBLE: {
+                        union { uint64_t i; double f; } mem;
+                        _msgpack_load64(uint64_t, n, &mem.i);
+#if defined(TARGET_OS_IPHONE)
+                    // ok
+#elif defined(__arm__) && !(__ARM_EABI__) // arm-oabi
+                        // https://github.com/msgpack/msgpack-perl/pull/1
+                        mem.i = (mem.i & 0xFFFFFFFFUL) << 32UL | (mem.i >> 32UL);
+#endif
+                        push_fixed_value(_double, mem.f); }
+                case MSGPACK_CS_UINT_8:
+                    push_fixed_value(_uint8, *(uint8_t*)n);
+                case MSGPACK_CS_UINT_16:{
+                    uint16_t tmp;
+                    _msgpack_load16(uint16_t,n,&tmp);
+                    push_fixed_value(_uint16, tmp);
+                }
+                case MSGPACK_CS_UINT_32:{
+                    uint32_t tmp;
+                    _msgpack_load32(uint32_t,n,&tmp);
+                    push_fixed_value(_uint32, tmp);
+                }
+                case MSGPACK_CS_UINT_64:{
+                    uint64_t tmp;
+                    _msgpack_load64(uint64_t,n,&tmp);
+                    push_fixed_value(_uint64, tmp);
+                }
+                case MSGPACK_CS_INT_8:
+                    push_fixed_value(_int8, *(int8_t*)n);
+                case MSGPACK_CS_INT_16:{
+                    int16_t tmp;
+                    _msgpack_load16(int16_t,n,&tmp);
+                    push_fixed_value(_int16, tmp);
+                }
+                case MSGPACK_CS_INT_32:{
+                    int32_t tmp;
+                    _msgpack_load32(int32_t,n,&tmp);
+                    push_fixed_value(_int32, tmp);
+                }
+                case MSGPACK_CS_INT_64:{
+                    int64_t tmp;
+                    _msgpack_load64(int64_t,n,&tmp);
+                    push_fixed_value(_int64, tmp);
+                }
+                case MSGPACK_CS_FIXEXT_1:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 1+1, _ext_zero);
+                case MSGPACK_CS_FIXEXT_2:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 2+1, _ext_zero);
+                case MSGPACK_CS_FIXEXT_4:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 4+1, _ext_zero);
+                case MSGPACK_CS_FIXEXT_8:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 8+1, _ext_zero);
+                case MSGPACK_CS_FIXEXT_16:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, 16+1, _ext_zero);
+                case MSGPACK_CS_STR_8:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, *(uint8_t*)n, _str_zero);
+                case MSGPACK_CS_BIN_8:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, *(uint8_t*)n, _bin_zero);
+                case MSGPACK_CS_EXT_8:
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, (*(uint8_t*)n) + 1, _ext_zero);
+                case MSGPACK_CS_STR_16:{
+                    uint16_t tmp;
+                    _msgpack_load16(uint16_t,n,&tmp);
+                    again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, tmp, _str_zero);
+                }
+                case MSGPACK_CS_BIN_16:{
+                    uint16_t tmp;
+                    _msgpack_load16(uint16_t,n,&tmp);
+                    again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, tmp, _bin_zero);
+                }
+                case MSGPACK_CS_EXT_16:{
+                    uint16_t tmp;
+                    _msgpack_load16(uint16_t,n,&tmp);
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, tmp + 1, _ext_zero);
+                }
+                case MSGPACK_CS_STR_32:{
+                    uint32_t tmp;
+                    _msgpack_load32(uint32_t,n,&tmp);
+                    again_fixed_trail_if_zero(MSGPACK_ACS_STR_VALUE, tmp, _str_zero);
+                }
+                case MSGPACK_CS_BIN_32:{
+                    uint32_t tmp;
+                    _msgpack_load32(uint32_t,n,&tmp);
+                    again_fixed_trail_if_zero(MSGPACK_ACS_BIN_VALUE, tmp, _bin_zero);
+                }
+                case MSGPACK_CS_EXT_32:{
+                    uint32_t tmp;
+                    _msgpack_load32(uint32_t,n,&tmp);
+                    again_fixed_trail_if_zero(MSGPACK_ACS_EXT_VALUE, tmp + 1, _ext_zero);
+                }
+                case MSGPACK_ACS_STR_VALUE:
+                _str_zero:
+                    push_variable_value(_str, data, n, trail);
+                case MSGPACK_ACS_BIN_VALUE:
+                _bin_zero:
+                    push_variable_value(_bin, data, n, trail);
+                case MSGPACK_ACS_EXT_VALUE:
+                _ext_zero:
+                    push_variable_value(_ext, data, n, trail);
+
+                case MSGPACK_CS_ARRAY_16:{
+                    uint16_t tmp;
+                    _msgpack_load16(uint16_t,n,&tmp);
+                    start_container(_array, tmp, MSGPACK_CT_ARRAY_ITEM);
+                }
+                case MSGPACK_CS_ARRAY_32:{
+                    /* FIXME security guard */
+                    uint32_t tmp;
+                    _msgpack_load32(uint32_t,n,&tmp);
+                    start_container(_array, tmp, MSGPACK_CT_ARRAY_ITEM);
+                }
+
+                case MSGPACK_CS_MAP_16:{
+                    uint16_t tmp;
+                    _msgpack_load16(uint16_t,n,&tmp);
+                    start_container(_map, tmp, MSGPACK_CT_MAP_KEY);
+                }
+                case MSGPACK_CS_MAP_32:{
+                    /* FIXME security guard */
+                    uint32_t tmp;
+                    _msgpack_load32(uint32_t,n,&tmp);
+                    start_container(_map, tmp, MSGPACK_CT_MAP_KEY);
+                }
+
+                default:
+                    goto _failed;
+                }
+            }
+
+    _push:
+        if(top == 0) { goto _finish; }
+        c = &stack[top-1];
+        switch(c->ct) {
+        case MSGPACK_CT_ARRAY_ITEM:
+            if(msgpack_unpack_callback(_array_item)(user, &c->obj, obj) < 0) { goto _failed; }
+            if(--c->count == 0) {
+                obj = c->obj;
+                --top;
+                /*printf("stack pop %d\n", top);*/
+                goto _push;
+            }
+            goto _header_again;
+        case MSGPACK_CT_MAP_KEY:
+            c->map_key = obj;
+            c->ct = MSGPACK_CT_MAP_VALUE;
+            goto _header_again;
+        case MSGPACK_CT_MAP_VALUE:
+            if(msgpack_unpack_callback(_map_item)(user, &c->obj, c->map_key, obj) < 0) { goto _failed; }
+            if(--c->count == 0) {
+                obj = c->obj;
+                --top;
+                /*printf("stack pop %d\n", top);*/
+                goto _push;
+            }
+            c->ct = MSGPACK_CT_MAP_KEY;
+            goto _header_again;
+
+        default:
+            goto _failed;
+        }
+
+    _header_again:
+            cs = MSGPACK_CS_HEADER;
+            ++p;
+        } while(p != pe);
+        goto _out;
+
+
+    _finish:
+        stack[0].obj = obj;
+        ++p;
+        ret = 1;
+        /*printf("-- finish --\n"); */
+        goto _end;
+
+    _failed:
+        /*printf("** FAILED **\n"); */
+        ret = -1;
+        goto _end;
+
+    _out:
+        ret = 0;
+        goto _end;
+
+    _end:
+        ctx->cs = cs;
+        ctx->trail = trail;
+        ctx->top = top;
+        *off = (size_t)(p - (const unsigned char*)data);
+
+        return ret;
+    }
+}
+
+#undef msgpack_unpack_func
+#undef msgpack_unpack_callback
+#undef msgpack_unpack_struct
+#undef msgpack_unpack_object
+#undef msgpack_unpack_user
+
+#undef push_simple_value
+#undef push_fixed_value
+#undef push_variable_value
+#undef again_fixed_trail
+#undef again_fixed_trail_if_zero
+#undef start_container
+
+#undef NEXT_CS
+
+#undef SWITCH_RANGE_BEGIN
+#undef SWITCH_RANGE
+#undef SWITCH_RANGE_DEFAULT
+#undef SWITCH_RANGE_END
diff --git a/include/msgpack/util.h b/include/msgpack/util.h
new file mode 100644
index 0000000..959b56b
--- /dev/null
+++ b/include/msgpack/util.h
@@ -0,0 +1,15 @@
+/*
+ * MessagePack for C utilities
+ *
+ * Copyright (C) 2014 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_UTIL_H
+#define MSGPACK_UTIL_H
+
+#define MSGPACK_UNUSED(a) (void)(a)
+
+#endif /* MSGPACK_UTIL_H */
diff --git a/include/msgpack/version.h b/include/msgpack/version.h
new file mode 100644
index 0000000..bd6605b
--- /dev/null
+++ b/include/msgpack/version.h
@@ -0,0 +1,38 @@
+/*
+ * MessagePack for C version information
+ *
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_VERSION_H
+#define MSGPACK_VERSION_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+MSGPACK_DLLEXPORT
+const char* msgpack_version(void);
+MSGPACK_DLLEXPORT
+int msgpack_version_major(void);
+MSGPACK_DLLEXPORT
+int msgpack_version_minor(void);
+MSGPACK_DLLEXPORT
+int msgpack_version_revision(void);
+
+#include "version_master.h"
+
+#define MSGPACK_STR(v) #v
+#define MSGPACK_VERSION_I(maj, min, rev) MSGPACK_STR(maj) "." MSGPACK_STR(min) "." MSGPACK_STR(rev)
+
+#define MSGPACK_VERSION MSGPACK_VERSION_I(MSGPACK_VERSION_MAJOR, MSGPACK_VERSION_MINOR, MSGPACK_VERSION_REVISION)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/version.h */
+
diff --git a/include/msgpack/version_master.h b/include/msgpack/version_master.h
new file mode 100644
index 0000000..ec7555d
--- /dev/null
+++ b/include/msgpack/version_master.h
@@ -0,0 +1,3 @@
+#define MSGPACK_VERSION_MAJOR    1
+#define MSGPACK_VERSION_MINOR    4
+#define MSGPACK_VERSION_REVISION 0
diff --git a/include/msgpack/vrefbuffer.h b/include/msgpack/vrefbuffer.h
new file mode 100644
index 0000000..79682be
--- /dev/null
+++ b/include/msgpack/vrefbuffer.h
@@ -0,0 +1,141 @@
+/*
+ * MessagePack for C zero-copy buffer implementation
+ *
+ * Copyright (C) 2008-2009 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_VREFBUFFER_H
+#define MSGPACK_VREFBUFFER_H
+
+#include "zone.h"
+#include <stdlib.h>
+
+#ifndef _WIN32
+#include <sys/uio.h>
+#else
+struct iovec {
+    void  *iov_base;
+    size_t iov_len;
+};
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_vrefbuffer Vectored Referencing buffer
+ * @ingroup msgpack_buffer
+ * @{
+ */
+
+struct msgpack_vrefbuffer_chunk;
+typedef struct msgpack_vrefbuffer_chunk msgpack_vrefbuffer_chunk;
+
+typedef struct msgpack_vrefbuffer_inner_buffer {
+    size_t free;
+    char*  ptr;
+    msgpack_vrefbuffer_chunk* head;
+} msgpack_vrefbuffer_inner_buffer;
+
+typedef struct msgpack_vrefbuffer {
+    struct iovec* tail;
+    struct iovec* end;
+    struct iovec* array;
+
+    size_t chunk_size;
+    size_t ref_size;
+
+    msgpack_vrefbuffer_inner_buffer inner_buffer;
+} msgpack_vrefbuffer;
+
+
+#ifndef MSGPACK_VREFBUFFER_REF_SIZE
+#define MSGPACK_VREFBUFFER_REF_SIZE 32
+#endif
+
+#ifndef MSGPACK_VREFBUFFER_CHUNK_SIZE
+#define MSGPACK_VREFBUFFER_CHUNK_SIZE 8192
+#endif
+
+MSGPACK_DLLEXPORT
+bool msgpack_vrefbuffer_init(msgpack_vrefbuffer* vbuf,
+        size_t ref_size, size_t chunk_size);
+MSGPACK_DLLEXPORT
+void msgpack_vrefbuffer_destroy(msgpack_vrefbuffer* vbuf);
+
+static inline msgpack_vrefbuffer* msgpack_vrefbuffer_new(size_t ref_size, size_t chunk_size);
+static inline void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf);
+
+static inline int msgpack_vrefbuffer_write(void* data, const char* buf, size_t len);
+
+static inline const struct iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref);
+static inline size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref);
+
+MSGPACK_DLLEXPORT
+int msgpack_vrefbuffer_append_copy(msgpack_vrefbuffer* vbuf,
+        const char* buf, size_t len);
+
+MSGPACK_DLLEXPORT
+int msgpack_vrefbuffer_append_ref(msgpack_vrefbuffer* vbuf,
+        const char* buf, size_t len);
+
+MSGPACK_DLLEXPORT
+int msgpack_vrefbuffer_migrate(msgpack_vrefbuffer* vbuf, msgpack_vrefbuffer* to);
+
+MSGPACK_DLLEXPORT
+void msgpack_vrefbuffer_clear(msgpack_vrefbuffer* vref);
+
+/** @} */
+
+
+static inline msgpack_vrefbuffer* msgpack_vrefbuffer_new(size_t ref_size, size_t chunk_size)
+{
+    msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)malloc(sizeof(msgpack_vrefbuffer));
+    if (vbuf == NULL) return NULL;
+    if(!msgpack_vrefbuffer_init(vbuf, ref_size, chunk_size)) {
+        free(vbuf);
+        return NULL;
+    }
+    return vbuf;
+}
+
+static inline void msgpack_vrefbuffer_free(msgpack_vrefbuffer* vbuf)
+{
+    if(vbuf == NULL) { return; }
+    msgpack_vrefbuffer_destroy(vbuf);
+    free(vbuf);
+}
+
+static inline int msgpack_vrefbuffer_write(void* data, const char* buf, size_t len)
+{
+    msgpack_vrefbuffer* vbuf = (msgpack_vrefbuffer*)data;
+
+    if(len < vbuf->ref_size) {
+        return msgpack_vrefbuffer_append_copy(vbuf, buf, len);
+    } else {
+        return msgpack_vrefbuffer_append_ref(vbuf, buf, len);
+    }
+}
+
+static inline const struct iovec* msgpack_vrefbuffer_vec(const msgpack_vrefbuffer* vref)
+{
+    return vref->array;
+}
+
+static inline size_t msgpack_vrefbuffer_veclen(const msgpack_vrefbuffer* vref)
+{
+    return (size_t)(vref->tail - vref->array);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/vrefbuffer.h */
+
diff --git a/include/msgpack/zbuffer.h b/include/msgpack/zbuffer.h
new file mode 100644
index 0000000..e6f742b
--- /dev/null
+++ b/include/msgpack/zbuffer.h
@@ -0,0 +1,200 @@
+/*
+ * MessagePack for C deflate buffer implementation
+ *
+ * Copyright (C) 2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_ZBUFFER_H
+#define MSGPACK_ZBUFFER_H
+
+#include "sysdep.h"
+#include <stdlib.h>
+#include <string.h>
+#include <zlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_zbuffer Compressed buffer
+ * @ingroup msgpack_buffer
+ * @{
+ */
+
+typedef struct msgpack_zbuffer {
+    z_stream stream;
+    char* data;
+    size_t init_size;
+} msgpack_zbuffer;
+
+#ifndef MSGPACK_ZBUFFER_INIT_SIZE
+#define MSGPACK_ZBUFFER_INIT_SIZE 8192
+#endif
+
+static inline bool msgpack_zbuffer_init(
+    msgpack_zbuffer* zbuf, int level, size_t init_size);
+static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf);
+
+static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size);
+static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf);
+
+static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf);
+
+static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf);
+static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf);
+
+static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf);
+static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf);
+static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf);
+
+
+#ifndef MSGPACK_ZBUFFER_RESERVE_SIZE
+#define MSGPACK_ZBUFFER_RESERVE_SIZE 512
+#endif
+
+static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len);
+
+static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf);
+
+
+static inline bool msgpack_zbuffer_init(msgpack_zbuffer* zbuf,
+        int level, size_t init_size)
+{
+    memset(zbuf, 0, sizeof(msgpack_zbuffer));
+    zbuf->init_size = init_size;
+    if(deflateInit(&zbuf->stream, level) != Z_OK) {
+        free(zbuf->data);
+        return false;
+    }
+    return true;
+}
+
+static inline void msgpack_zbuffer_destroy(msgpack_zbuffer* zbuf)
+{
+    deflateEnd(&zbuf->stream);
+    free(zbuf->data);
+}
+
+static inline msgpack_zbuffer* msgpack_zbuffer_new(int level, size_t init_size)
+{
+    msgpack_zbuffer* zbuf = (msgpack_zbuffer*)malloc(sizeof(msgpack_zbuffer));
+    if (zbuf == NULL) return NULL;
+    if(!msgpack_zbuffer_init(zbuf, level, init_size)) {
+        free(zbuf);
+        return NULL;
+    }
+    return zbuf;
+}
+
+static inline void msgpack_zbuffer_free(msgpack_zbuffer* zbuf)
+{
+    if(zbuf == NULL) { return; }
+    msgpack_zbuffer_destroy(zbuf);
+    free(zbuf);
+}
+
+static inline bool msgpack_zbuffer_expand(msgpack_zbuffer* zbuf)
+{
+    size_t used = (char*)zbuf->stream.next_out - zbuf->data;
+    size_t csize = used + zbuf->stream.avail_out;
+    size_t nsize = (csize == 0) ? zbuf->init_size : csize * 2;
+
+    char* tmp = (char*)realloc(zbuf->data, nsize);
+    if(tmp == NULL) {
+        return false;
+    }
+
+    zbuf->data = tmp;
+    zbuf->stream.next_out  = (Bytef*)(tmp + used);
+    zbuf->stream.avail_out = nsize - used;
+
+    return true;
+}
+
+static inline int msgpack_zbuffer_write(void* data, const char* buf, size_t len)
+{
+    msgpack_zbuffer* zbuf = (msgpack_zbuffer*)data;
+
+    zbuf->stream.next_in = (Bytef*)buf;
+    zbuf->stream.avail_in = len;
+
+    while(zbuf->stream.avail_in > 0) {
+        if(zbuf->stream.avail_out < MSGPACK_ZBUFFER_RESERVE_SIZE) {
+            if(!msgpack_zbuffer_expand(zbuf)) {
+                return -1;
+            }
+        }
+
+        if(deflate(&zbuf->stream, Z_NO_FLUSH) != Z_OK) {
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+static inline char* msgpack_zbuffer_flush(msgpack_zbuffer* zbuf)
+{
+    while(true) {
+        switch(deflate(&zbuf->stream, Z_FINISH)) {
+        case Z_STREAM_END:
+            return zbuf->data;
+        case Z_OK:
+            if(!msgpack_zbuffer_expand(zbuf)) {
+                return NULL;
+            }
+            break;
+        default:
+            return NULL;
+        }
+    }
+}
+
+static inline const char* msgpack_zbuffer_data(const msgpack_zbuffer* zbuf)
+{
+    return zbuf->data;
+}
+
+static inline size_t msgpack_zbuffer_size(const msgpack_zbuffer* zbuf)
+{
+    return (char*)zbuf->stream.next_out - zbuf->data;
+}
+
+static inline void msgpack_zbuffer_reset_buffer(msgpack_zbuffer* zbuf)
+{
+    zbuf->stream.avail_out += (char*)zbuf->stream.next_out - zbuf->data;
+    zbuf->stream.next_out = (Bytef*)zbuf->data;
+}
+
+static inline bool msgpack_zbuffer_reset(msgpack_zbuffer* zbuf)
+{
+    if(deflateReset(&zbuf->stream) != Z_OK) {
+        return false;
+    }
+    msgpack_zbuffer_reset_buffer(zbuf);
+    return true;
+}
+
+static inline char* msgpack_zbuffer_release_buffer(msgpack_zbuffer* zbuf)
+{
+    char* tmp = zbuf->data;
+    zbuf->data = NULL;
+    zbuf->stream.next_out = NULL;
+    zbuf->stream.avail_out = 0;
+    return tmp;
+}
+
+/** @} */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/zbuffer.h */
+
diff --git a/include/msgpack/zone.h b/include/msgpack/zone.h
new file mode 100644
index 0000000..55229d7
--- /dev/null
+++ b/include/msgpack/zone.h
@@ -0,0 +1,163 @@
+/*
+ * MessagePack for C memory pool implementation
+ *
+ * Copyright (C) 2008-2010 FURUHASHI Sadayuki
+ *
+ *    Distributed under the Boost Software License, Version 1.0.
+ *    (See accompanying file LICENSE_1_0.txt or copy at
+ *    http://www.boost.org/LICENSE_1_0.txt)
+ */
+#ifndef MSGPACK_ZONE_H
+#define MSGPACK_ZONE_H
+
+#include "sysdep.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/**
+ * @defgroup msgpack_zone Memory zone
+ * @ingroup msgpack
+ * @{
+ */
+
+typedef struct msgpack_zone_finalizer {
+    void (*func)(void* data);
+    void* data;
+} msgpack_zone_finalizer;
+
+typedef struct msgpack_zone_finalizer_array {
+    msgpack_zone_finalizer* tail;
+    msgpack_zone_finalizer* end;
+    msgpack_zone_finalizer* array;
+} msgpack_zone_finalizer_array;
+
+struct msgpack_zone_chunk;
+typedef struct msgpack_zone_chunk msgpack_zone_chunk;
+
+typedef struct msgpack_zone_chunk_list {
+    size_t free;
+    char* ptr;
+    msgpack_zone_chunk* head;
+} msgpack_zone_chunk_list;
+
+typedef struct msgpack_zone {
+    msgpack_zone_chunk_list chunk_list;
+    msgpack_zone_finalizer_array finalizer_array;
+    size_t chunk_size;
+} msgpack_zone;
+
+#ifndef MSGPACK_ZONE_CHUNK_SIZE
+#define MSGPACK_ZONE_CHUNK_SIZE 8192
+#endif
+
+MSGPACK_DLLEXPORT
+bool msgpack_zone_init(msgpack_zone* zone, size_t chunk_size);
+MSGPACK_DLLEXPORT
+void msgpack_zone_destroy(msgpack_zone* zone);
+
+MSGPACK_DLLEXPORT
+msgpack_zone* msgpack_zone_new(size_t chunk_size);
+MSGPACK_DLLEXPORT
+void msgpack_zone_free(msgpack_zone* zone);
+
+static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size);
+static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size);
+
+static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
+        void (*func)(void* data), void* data);
+
+static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b);
+
+MSGPACK_DLLEXPORT
+bool msgpack_zone_is_empty(msgpack_zone* zone);
+
+MSGPACK_DLLEXPORT
+void msgpack_zone_clear(msgpack_zone* zone);
+
+/** @} */
+
+
+#ifndef MSGPACK_ZONE_ALIGN
+#define MSGPACK_ZONE_ALIGN sizeof(void*)
+#endif
+
+MSGPACK_DLLEXPORT
+void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size);
+
+static inline void* msgpack_zone_malloc_no_align(msgpack_zone* zone, size_t size)
+{
+    char* ptr;
+    msgpack_zone_chunk_list* cl = &zone->chunk_list;
+
+    if(zone->chunk_list.free < size) {
+        return msgpack_zone_malloc_expand(zone, size);
+    }
+
+    ptr = cl->ptr;
+    cl->free -= size;
+    cl->ptr  += size;
+
+    return ptr;
+}
+
+static inline void* msgpack_zone_malloc(msgpack_zone* zone, size_t size)
+{
+    char* aligned =
+        (char*)(
+            (size_t)(
+                zone->chunk_list.ptr + (MSGPACK_ZONE_ALIGN - 1)
+            ) / MSGPACK_ZONE_ALIGN * MSGPACK_ZONE_ALIGN
+        );
+    size_t adjusted_size = size + (aligned - zone->chunk_list.ptr);
+    if(zone->chunk_list.free >= adjusted_size) {
+        zone->chunk_list.free -= adjusted_size;
+        zone->chunk_list.ptr  += adjusted_size;
+        return aligned;
+    }
+    {
+        void* ptr = msgpack_zone_malloc_expand(zone, size + (MSGPACK_ZONE_ALIGN - 1));
+        if (ptr) {
+            return (char*)((size_t)(ptr) / MSGPACK_ZONE_ALIGN * MSGPACK_ZONE_ALIGN);
+        }
+    }
+    return NULL;
+}
+
+
+bool msgpack_zone_push_finalizer_expand(msgpack_zone* zone,
+        void (*func)(void* data), void* data);
+
+static inline bool msgpack_zone_push_finalizer(msgpack_zone* zone,
+        void (*func)(void* data), void* data)
+{
+    msgpack_zone_finalizer_array* const fa = &zone->finalizer_array;
+    msgpack_zone_finalizer* fin = fa->tail;
+
+    if(fin == fa->end) {
+        return msgpack_zone_push_finalizer_expand(zone, func, data);
+    }
+
+    fin->func = func;
+    fin->data = data;
+
+    ++fa->tail;
+
+    return true;
+}
+
+static inline void msgpack_zone_swap(msgpack_zone* a, msgpack_zone* b)
+{
+    msgpack_zone tmp = *a;
+    *a = *b;
+    *b = tmp;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* msgpack/zone.h */
diff --git a/lib/Data/MessagePack.pm b/lib/Data/MessagePack.pm
index 9eb6f62..473035d 100644
--- a/lib/Data/MessagePack.pm
+++ b/lib/Data/MessagePack.pm
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 use 5.008001;
 
-our $VERSION = '1.00';
+our $VERSION = '1.02';
 
 sub true () {
     require Data::MessagePack::Boolean;
@@ -36,7 +36,7 @@ sub new {
     return bless \%args, $class;
 }
 
-foreach my $name(qw(canonical prefer_integer utf8)) {
+foreach my $name(qw(canonical prefer_integer prefer_float32 utf8)) {
     my $setter = sub {
         my($self, $value) = @_;
         $self->{$name} = defined($value) ? $value : 1;
@@ -49,6 +49,7 @@ foreach my $name(qw(canonical prefer_integer utf8)) {
     no strict 'refs';
     *{$name}          = $setter;
     *{'get_' . $name} = $getter;
+
 }
 
 
diff --git a/lib/Data/MessagePack/PP.pm b/lib/Data/MessagePack/PP.pm
index 5d85c31..670984b 100644
--- a/lib/Data/MessagePack/PP.pm
+++ b/lib/Data/MessagePack/PP.pm
@@ -87,11 +87,17 @@ BEGIN {
                 my @v = unpack( 'V2', pack( 'q', $_[0] ) );
                 return pack 'CN2', 0xd3, @v[1,0];
             };
+
             *pack_double = $pack_double_oabi || sub {
                 my @v = unpack( 'V2', pack( 'd', $_[0] ) );
                 return pack 'CN2', 0xcb, @v[1,0];
             };
 
+            *pack_float = sub {
+                my @v = unpack( 'V2', pack( 'f', $_[0] ) );
+                return pack 'CN2', 0xca, @v[1,0];
+            };
+
             *unpack_float = sub {
                 my @v = unpack( 'v2', substr( $_[0], $_[1], 4 ) );
                 return unpack( 'f', pack( 'n2', @v[1,0] ) );
@@ -113,6 +119,7 @@ BEGIN {
         else { # big endian
             *pack_uint64   = sub { return pack 'CQ', 0xcf, $_[0]; };
             *pack_int64    = sub { return pack 'Cq', 0xd3, $_[0]; };
+            *pack_float   =  sub { return pack 'Cf', 0xca, $_[0]; };
             *pack_double   = $pack_double_oabi || sub { return pack 'Cd', 0xcb, $_[0]; };
 
             *unpack_float  = sub { return unpack( 'f', substr( $_[0], $_[1], 4 ) ); };
@@ -139,6 +146,7 @@ BEGIN {
         # pack_int64/uint64 are used only when the perl support quad types
         *pack_uint64   = sub { return pack 'CQ>', 0xcf, $_[0]; };
         *pack_int64    = sub { return pack 'Cq>', 0xd3, $_[0]; };
+        *pack_float   = sub { return pack 'Cf>', 0xca, $_[0]; };
         *pack_double   = $pack_double_oabi || sub { return pack 'Cd>', 0xcb, $_[0]; };
 
         *unpack_float  = sub { return unpack( 'f>', substr( $_[0], $_[1], 4 ) ); };
@@ -175,6 +183,7 @@ sub pack :method {
     Carp::croak('Usage: Data::MessagePack->pack($dat [,$max_depth])') if @_ < 2;
     $_max_depth = defined $max_depth ? $max_depth : 512; # init
 
+    # back-compat
     if(not ref $self) {
         $self = $self->new(
             prefer_integer => $Data::MessagePack::PreferInteger || 0,
@@ -271,7 +280,12 @@ sub _pack {
         return $header . $value;
 
     }
-    elsif( $flags & B::SVp_NOK ) { # double only
+    elsif( $flags & B::SVp_NOK ) {
+        # double unless user prefers single precision
+        if($self->{prefer_float32}) {
+            return pack_float( $value );
+        }
+
         return pack_double( $value );
     }
     elsif ( $flags & B::SVp_IOK ) {
diff --git a/minil.toml b/minil.toml
new file mode 100644
index 0000000..11a8584
--- /dev/null
+++ b/minil.toml
@@ -0,0 +1,9 @@
+name = "Data-MessagePack"
+authority = "cpan:TOKUHIROM"
+allow_pureperl = 1
+badges = ["travis"]
+module_maker = "ModuleBuild"
+tag_format = "perl-%v"
+
+[build]
+build_class = "builder::MyBuilder"
diff --git a/msgpack-c b/msgpack-c
deleted file mode 160000
index cabd8a8..0000000
--- a/msgpack-c
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit cabd8a8a038c78e569db06d2f3f812da28191cf4
diff --git a/t/01_pack.t b/t/01_pack.t
index 99f0ca0..84deca5 100644
--- a/t/01_pack.t
+++ b/t/01_pack.t
@@ -19,6 +19,13 @@ sub packit_utf8 {
     $_;
 }
 
+sub packit_float32 {
+    local $_ = unpack("H*", Data::MessagePack->new->prefer_float32->pack($_[0]));
+    s/(..)/$1 /g;
+    s/ $//;
+    $_;
+}
+
 sub pis ($$) {
     is packit($_[0]), $_[1], 'dump ' . $_[1];
 }
@@ -27,6 +34,10 @@ sub pis_utf8 ($$) {
     is packit_utf8($_[0]), $_[1], 'dump ' . $_[1];
 }
 
+sub pis_float32 ($$) {
+    is packit_float32($_[0]), $_[1], 'dump ' . $_[1];
+}
+
 my @dat = (
     0,     '00',
     (my $foo="0")+0, '00',
@@ -88,7 +99,7 @@ my @dat_utf8 = (
     'a' x 0x0100, 'da 01 00' . (' 61' x 0x0100),
 );
 
-plan tests => 1*(scalar(@dat)/2) + 1*(scalar(@dat_utf8)/2);
+plan tests => 1*(scalar(@dat)/2) + 1*(scalar(@dat_utf8)/2) + 1;
 
 for (my $i=0; $i<scalar(@dat); ) {
     pis $dat[$i++], $dat[$i++];
@@ -97,3 +108,6 @@ for (my $i=0; $i<scalar(@dat); ) {
 for (my $i=0; $i<scalar(@dat_utf8); ) {
     pis_utf8 $dat_utf8[$i++], $dat_utf8[$i++];
 }
+
+pis_float32 1.0, 'ca 3f 80 00 00';
+
diff --git a/t/05_preferred_int.t b/t/05_preferred_int.t
index c1db9f3..5015414 100644
--- a/t/05_preferred_int.t
+++ b/t/05_preferred_int.t
@@ -2,6 +2,12 @@ use t::Util;
 use Test::More;
 use Data::MessagePack;
 use Data::Dumper;
+use Config;
+
+# if use_quadmath is enabled, integer literal precision is different from non use_quadmath perl
+use if defined $Config{usequadmath},
+    'Test::More', skip_all => 'quadmath is not support this test';
+
 no warnings; # shut up "Integer overflow in hexadecimal number"
 
 sub packit {
@@ -36,7 +42,12 @@ sub pis_utf8 ($$$) {
     # is(Dumper(Data::MessagePack->unpack(Data::MessagePack->pack($_[0]))), Dumper($_[0]));
 }
 
-my $is_win = $^O eq 'MSWin32';
+# NOTE
+#  Exponential notation of older Windows Perl(< 5.30.0) is different from other perl
+#  For example 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+#    Older Windows Perl: 8.30767497365572e+034 <- leading zero
+#    Other Perl        : 8.30767497365572e+34
+my $is_old_win = $^O eq 'MSWin32' && $] < 5.030;
 my @dat = (
     '',      'c4 00',
     '0',     '00',
@@ -50,14 +61,14 @@ my @dat = (
     ''.0xFFFFFF => 'ce 00 ff ff ff',
     ''.0xFFFFFFFF => 'ce ff ff ff ff',
     ''.0xFFFFFFFFF => 'c4 0b 36 38 37 31 39 34 37 36 37 33 35',
-    ''.0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF => $is_win ?
+    ''.0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF => $is_old_win ?
                                             qr{^(c4 15 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 65 2b 30 33 34|c4 18 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 34 32 31 65 2b 30 33 34)$}
                                           : qr{^(c4 14 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 65 2b 33 34|c4 17 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 34 32 31 65 2b 33 34)$},
     '-'.0x8000000 => 'd2 f8 00 00 00',
     '-'.0x80000000 => 'd2 80 00 00 00',
     '-'.0x800000000 => 'c4 0c 2d 33 34 33 35 39 37 33 38 33 36 38',
     '-'.0x8000000000 => 'c4 0d 2d 35 34 39 37 35 35 38 31 33 38 38 38',
-    '-'.0x800000000000000000000000000000 => $is_win ?
+    '-'.0x800000000000000000000000000000 => $is_old_win ?
                                               qr{^(c4 16 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 38 65 2b 30 33 35|c4 19 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 37 39 33 36 65 2b 30 33 35)}
                                             : qr{^(c4 15 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 38 65 2b 33 35|c4 18 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 37 39 33 36 65 2b 33 35)},
     {'0' => '1'}, '81 00 01',
@@ -67,12 +78,12 @@ my @dat = (
 my @dat_utf8 = (
     '-',     'a1 2d',
     ''.0xFFFFFFFFF => 'ab 36 38 37 31 39 34 37 36 37 33 35',
-    ''.0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF => $is_win ?
+    ''.0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFF => $is_old_win ?
                                             qr{^(b5 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 65 2b 30 33 34|b8 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 34 32 31 65 2b 30 33 34)$}
                                           : qr{^(b4 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 65 2b 33 34|b7 38 2e 33 30 37 36 37 34 39 37 33 36 35 35 37 32 34 32 31 65 2b 33 34)$},
     '-'.0x800000000 => 'ac 2d 33 34 33 35 39 37 33 38 33 36 38',
     '-'.0x8000000000 => 'ad 2d 35 34 39 37 35 35 38 31 33 38 38 38',
-    '-'.0x800000000000000000000000000000 => $is_win ?
+    '-'.0x800000000000000000000000000000 => $is_old_win ?
                                               qr{^(b6 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 38 65 2b 30 33 35|b9 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 37 39 33 36 65 2b 30 33 35)}
                                             : qr{^(b5 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 38 65 2b 33 35|b8 2d 36 2e 36 34 36 31 33 39 39 37 38 39 32 34 35 37 39 33 36 65 2b 33 35)},
     {'abc' => '1'}, '81 a3 61 62 63 01',
diff --git a/t/23-empty-key.t b/t/23-empty-key.t
index 8a60f33..638a6d4 100644
--- a/t/23-empty-key.t
+++ b/t/23-empty-key.t
@@ -6,8 +6,6 @@ use warnings;
 
 use Test::More tests => 3;
 
-local $TODO = "not yet";
-
 my @orig = (
     ["ZZZ",{"10000050C2400102" => {"1332129147" => ["\x01\x07\x07 \xf7","2.48292"]}}],
     ["ZZZ",{"" => {}}],
@@ -44,6 +42,7 @@ if ($up->is_finished)
     {
         push(@res, $up->data);
 
+        local $TODO = 'not yet';
         is_deeply(\@res, \@orig) or diag(explain([\@res, \@orig]));
     }
     else
diff --git a/t/25_single_float.t b/t/25_single_float.t
new file mode 100644
index 0000000..c20299f
--- /dev/null
+++ b/t/25_single_float.t
@@ -0,0 +1,20 @@
+#!perl
+use strict;
+use Config;
+use if $Config{nvsize} > 8,
+    'Test::More', skip_all => 'long double is not supported';
+use Test::More;
+use Data::MessagePack;
+
+my $mp = Data::MessagePack->new();
+$mp->prefer_float32();
+
+foreach my $float(0.123, 3.14) {
+    is $mp->unpack($mp->pack($float)), unpack('f', pack('f',$float));
+
+    scalar( $float > 0 );
+
+    is $mp->unpack($mp->pack($float)), unpack('f', pack('f',$float));
+}
+done_testing;
+
diff --git a/t/std/cases.mpac b/t/std/cases.mpac
new file mode 100644
index 0000000..5ec08c6
Binary files /dev/null and b/t/std/cases.mpac differ
diff --git a/t/std/cases_compact.mpac b/t/std/cases_compact.mpac
new file mode 100644
index 0000000..8812442
Binary files /dev/null and b/t/std/cases_compact.mpac differ
diff --git a/xs-src/pack.c b/xs-src/pack.c
index f09a747..7807cb9 100644
--- a/xs-src/pack.c
+++ b/xs-src/pack.c
@@ -19,6 +19,7 @@ typedef struct {
     SV *sv;          /* result scalar */
 
     bool prefer_int;
+    bool prefer_float32;
     bool canonical;
 } enc_t;
 
@@ -191,7 +192,11 @@ STATIC_INLINE void _msgpack_pack_sv(pTHX_ enc_t* const enc, SV* const sv, int co
             }
         }
     } else if (SvNOKp(sv)) {
-        msgpack_pack_double(enc, (double)SvNVX(sv));
+        if(enc->prefer_float32) {
+            msgpack_pack_float(enc, (float)SvNVX(sv));
+        } else {
+            msgpack_pack_double(enc, (double)SvNVX(sv));
+        }
     } else if (SvIOKp(sv)) {
         if(SvUOK(sv)) {
             PACK_UV(enc, SvUVX(sv));
@@ -323,6 +328,7 @@ XS(xs_pack) {
     // setup configuration
     dMY_CXT;
     enc.prefer_int = MY_CXT.prefer_int; // back compat
+    enc.prefer_float32 = false;
     if(SvROK(self) && SvTYPE(SvRV(self)) == SVt_PVHV) {
         HV* const hv = (HV*)SvRV(self);
         SV** svp;
@@ -332,6 +338,11 @@ XS(xs_pack) {
             enc.prefer_int = SvTRUE(*svp) ? true : false;
         }
 
+        svp = hv_fetchs(hv, "prefer_float32", FALSE);
+        if(svp) {
+            enc.prefer_float32 = SvTRUE(*svp) ? true : false;
+        }
+
         svp = hv_fetchs(hv, "canonical", FALSE);
         if(svp) {
             enc.canonical = SvTRUE(*svp) ? true : false;
diff --git a/xs-src/unpack.c b/xs-src/unpack.c
index 2cefee4..849dd88 100644
--- a/xs-src/unpack.c
+++ b/xs-src/unpack.c
@@ -1,5 +1,6 @@
 #define NEED_newRV_noinc
 #define NEED_sv_2pv_flags
+#include "msgpack/unpack.h"
 #include "xshelper.h"
 
 #define MY_CXT_KEY "Data::MessagePack::_unpack_guts" XS_VERSION
diff --git a/xt/leaks/normal.t b/xt/leaks/normal.t
index 370b23e..d7965f5 100644
--- a/xt/leaks/normal.t
+++ b/xt/leaks/normal.t
@@ -5,6 +5,7 @@ use Data::MessagePack;
 use Devel::Peek;
 
 plan skip_all => '$ENV{LEAK_TEST} is required' unless $ENV{LEAK_TEST};
+plan skip_all => 'need /proc filesystem' unless -d "/proc/$$";
 
 my $input = [
     {
diff --git a/xt/leaks/stream.t b/xt/leaks/stream.t
index 7765d73..4b76418 100644
--- a/xt/leaks/stream.t
+++ b/xt/leaks/stream.t
@@ -5,6 +5,7 @@ use Data::MessagePack;
 use Devel::Peek;
 
 plan skip_all => '$ENV{LEAK_TEST} is required' unless $ENV{LEAK_TEST};
+plan skip_all => 'need /proc filesystem' unless -d "/proc/$$";
 
 my $input = [
     {