Working type casters for wide strings and wide characters
diff --git a/MANIFEST.in b/MANIFEST.in
index 7259680..33c22c8 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,2 +1 @@
-include setup.py
 include include/pybind11/*.h
diff --git a/README.md b/README.md
index 6763c06..85172cc 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 
 [![Documentation Status](https://readthedocs.org/projects/pybind11/badge/?version=latest)](http://pybind11.readthedocs.org/en/latest/?badge=latest)
 [![Build Status](https://travis-ci.org/pybind/pybind11.svg?branch=master)](https://travis-ci.org/pybind/pybind11)
-[![Build status](https://ci.appveyor.com/api/projects/status/riaj54pn4h08xy40?svg=true)](https://ci.appveyor.com/project/pybind/pybind11)
+[![Build status](https://ci.appveyor.com/api/projects/status/riaj54pn4h08xy40?svg=true)](https://ci.appveyor.com/project/wjakob/pybind11)
 
 **pybind11** is a lightweight header-only library that exposes C++ types in Python
 and vice versa, mainly to create Python bindings of existing C++ code. Its
@@ -92,8 +92,10 @@
 Jonas Adler,
 Sylvain Corlay,
 Axel Huebl,
-Johan Mabille, and
-Tomasz Miąsko.
+@hulucc,
+Johan Mabille,
+Tomasz Miąsko, and
+Ben Pritchard.
 
 ### License
 
diff --git a/conda.recipe/bld.bat b/conda.recipe/bld.bat
new file mode 100644
index 0000000..b9cd616
--- /dev/null
+++ b/conda.recipe/bld.bat
@@ -0,0 +1,2 @@
+"%PYTHON%" setup.py install --single-version-externally-managed --record=record.txt
+if errorlevel 1 exit 1
diff --git a/conda.recipe/build.sh b/conda.recipe/build.sh
new file mode 100644
index 0000000..175d6f1
--- /dev/null
+++ b/conda.recipe/build.sh
@@ -0,0 +1,3 @@
+#!/bin/bash
+${PYTHON} setup.py install --single-version-externally-managed --record=record.txt;
+
diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml
new file mode 100644
index 0000000..218391f
--- /dev/null
+++ b/conda.recipe/meta.yaml
@@ -0,0 +1,26 @@
+package:
+  name: pybind11
+  version: {{ environ.get('GIT_DESCRIBE_TAG', '') }}
+
+build:
+  number: {{ environ.get('GIT_DESCRIBE_NUMBER', 0) }}
+  {% if environ.get('GIT_DESCRIBE_NUMBER', '0') == '0' %}string: py{{ environ.get('PY_VER').replace('.', '') }}_0
+  {% else %}string: py{{ environ.get('PY_VER').replace('.', '') }}_{{ environ.get('GIT_BUILD_STR', 'GIT_STUB') }}{% endif %}
+
+source:
+  git_url: ../
+
+requirements:
+  build:
+    - python
+
+  run:
+    - python
+
+test:
+  imports:
+    - pybind11
+
+about:
+  home: https://github.com/wjakob/pybind11/
+  summary: Seamless operability between C++11 and Python
diff --git a/docs/_static/theme_overrides.css b/docs/_static/theme_overrides.css
index d746829..f678ab5 100644
--- a/docs/_static/theme_overrides.css
+++ b/docs/_static/theme_overrides.css
@@ -1,7 +1,7 @@
 .wy-table-responsive table td,
 .wy-table-responsive table th {
-  white-space: initial;
+    white-space: initial !important;
 }
 .rst-content table.docutils td {
-  vertical-align: top;
+    vertical-align: top !important;
 }
diff --git a/docs/advanced.rst b/docs/advanced.rst
index 1c2e4f4..f24d3b5 100644
--- a/docs/advanced.rst
+++ b/docs/advanced.rst
@@ -1007,11 +1007,20 @@
     py::class_<MyClass>("MyClass")
         .def("myFunction", py::arg_t<SomeType>("arg", SomeType(123), "SomeType(123)"));
 
+Sometimes it may be necessary to pass a null pointer value as a default
+argument. In this case, remember to cast it to the underlying type in question,
+like so:
+
+.. code-block:: cpp
+
+    py::class_<MyClass>("MyClass")
+        .def("myFunction", py::arg("arg") = (SomeType *) nullptr);
+
 Partitioning code over multiple extension modules
 =================================================
 
-It's straightforward to split binding code over multiple extension modules and
-reference types declared elsewhere. Everything "just" works without any special
+It's straightforward to split binding code over multiple extension modules, while
+referencing types that are declared elsewhere. Everything "just" works without any special
 precautions. One exception to this rule occurs when wanting to extend a type declared
 in another extension module. Recall the basic example from Section
 :ref:`inheritance`.
@@ -1040,3 +1049,17 @@
         .def(py::init<const std::string &>())
         .def("bark", &Dog::bark);
 
+Alternatively, we can rely on the ``base`` tag, which performs an automated
+lookup of the corresponding Python type. However, this also requires invoking
+the ``import`` function once to ensure that the pybind11 binding code of the
+module ``basic`` has been executed.
+
+Naturally, both methods will fail when there are cyclic dependencies.
+
+.. code-block:: cpp
+
+    py::module::import("basic");
+
+    py::class_<Dog>(m, "Dog", py::base<Pet>())
+        .def(py::init<const std::string &>())
+        .def("bark", &Dog::bark);
diff --git a/docs/basics.rst b/docs/basics.rst
index 53a325e..cb8962c 100644
--- a/docs/basics.rst
+++ b/docs/basics.rst
@@ -241,10 +241,14 @@
 +----------------------------+--------------------------+-----------------------+
 | char                       | Character literal        | pybind11/pybind11.h   |
 +----------------------------+--------------------------+-----------------------+
+| wchar_t                    | Wide character literal   | pybind11/pybind11.h   |
++----------------------------+--------------------------+-----------------------+
 | const char *               | UTF-8 string literal     | pybind11/pybind11.h   |
 +----------------------------+--------------------------+-----------------------+
 | std::string                | STL dynamic UTF-8 string | pybind11/pybind11.h   |
 +----------------------------+--------------------------+-----------------------+
+| std::wstring               | STL dynamic wide string  | pybind11/pybind11.h   |
++----------------------------+--------------------------+-----------------------+
 | std::pair<T1, T2>          | Pair of two custom types | pybind11/pybind11.h   |
 +----------------------------+--------------------------+-----------------------+
 | std::tuple<....>           | Arbitrary tuple of types | pybind11/pybind11.h   |
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 9850e46..00fd2ea 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -3,14 +3,20 @@
 Changelog
 #########
 
-1.3 (not yet released)
+1.4 (not yet released)
+--------------------------
+* Transparent type conversion for ``std::wstring`` and ``wchar_t``
+
+1.3 (March 8, 2016)
 --------------------------
 
 * Added support for the Intel C++ compiler (v15+)
 * Added support for the STL unordered set/map data structures
+* Added support for the STL linked list data structure
 * NumPy-style broadcasting support in ``pybind11::vectorize``
 * pybind11 now displays more verbose error messages when ``arg::operator=()`` fails.
-* Removed 'pybind11' python package whose purpose was never quite defined
+* pybind11 internal data structures now live in a version-dependent namespace to avoid ABI issues
+* Many, many bugfixes involving corner cases and advanced usage
 
 1.2 (February 7, 2016)
 --------------------------
diff --git a/docs/release.rst b/docs/release.rst
index 2296225..b5d18cf 100644
--- a/docs/release.rst
+++ b/docs/release.rst
@@ -1,12 +1,12 @@
 To release a new version of pybind11:
 
-- Update version macros in `include/pybind11/common.h`
 - Update `pybind11/_version.py` (set release version, remove 'dev')
 - `git add` and `git commit`.
 - `python setup.py sdist upload`.
 - `python setup.py bdist_wheel upload`.
 - `git tag -a X.X -m 'Release tag comment'`.
 - Update `_version.py` (add 'dev' and increment minor).
+- Update version macros in `include/pybind11/common.h`
 - `git add` and `git commit`. `git push`. `git push --tags`.
 
 The remote for the last `git push --tags` should be the main repository for
diff --git a/example/example2.cpp b/example/example2.cpp
index 3282a85..b137f99 100644
--- a/example/example2.cpp
+++ b/example/example2.cpp
@@ -60,9 +60,9 @@
     }
 
     /* C++ STL data types are automatically casted */
-    std::vector<std::string> get_list_2() {
-        std::vector<std::string> list;
-        list.push_back("value");
+    std::vector<std::wstring> get_list_2() {
+        std::vector<std::wstring> list;
+        list.push_back(L"value");
         return list;
     }
 
@@ -103,10 +103,10 @@
     }
 
     /* STL data types (such as vectors) are automatically casted from Python */
-    void print_list_2(std::vector<std::string> &list) {
+    void print_list_2(std::vector<std::wstring> &list) {
         int index = 0;
         for (auto item : list)
-            std::cout << "list item " << index++ << ": " << item << std::endl;
+            std::wcout << L"list item " << index++ << L": " << item << std::endl;
     }
 
     /* pybind automatically translates between C++11 and Python tuples */
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h
index 1428d4c..f22b670 100644
--- a/include/pybind11/cast.h
+++ b/include/pybind11/cast.h
@@ -34,12 +34,13 @@
     if (internals_ptr)
         return *internals_ptr;
     handle builtins(PyEval_GetBuiltins());
-    capsule caps(builtins["__pybind11__"]);
+    const char *id = PYBIND11_INTERNALS_ID;
+    capsule caps(builtins[id]);
     if (caps.check()) {
         internals_ptr = caps;
     } else {
         internals_ptr = new internals();
-        builtins["__pybind11__"] = capsule(internals_ptr);
+        builtins[id] = capsule(internals_ptr);
     }
     return *internals_ptr;
 }
@@ -203,7 +204,7 @@
 protected:
     template <typename T = type, typename std::enable_if<detail::is_copy_constructible<T>::value, int>::type = 0>
     static void *copy_constructor(const void *arg) {
-        return new type(*((const type *) arg));
+        return (void *) new type(*((const type *) arg));
     }
     template <typename T = type, typename std::enable_if<!detail::is_copy_constructible<T>::value, int>::type = 0>
     static void *copy_constructor(const void *) { return nullptr; }
@@ -358,8 +359,22 @@
 			if (!temp) { PyErr_Clear(); return false; }
 			load_src = temp;
 		}
-		wchar_t *buffer = PyUnicode_AS_UNICODE(load_src.ptr());
-		size_t length = PyUnicode_GET_SIZE(load_src.ptr());
+        wchar_t *buffer = nullptr;
+        ssize_t length = -1;
+#if PY_MAJOR_VERSION >= 3
+        buffer = PyUnicode_AsWideCharString(load_src.ptr(), &length);
+#else
+        temp = object(
+            sizeof(wchar_t) == sizeof(short)
+                ? PyUnicode_AsUTF16String(load_src.ptr())
+                : PyUnicode_AsUTF32String(load_src.ptr()), false);
+        if (temp) {
+            int err = PYBIND11_BYTES_AS_STRING_AND_SIZE(temp.ptr(), (char **) &buffer, &length);
+            if (err == -1) { buffer = nullptr; }  // TypeError
+            length = length / sizeof(wchar_t) - 1; ++buffer; // Skip BOM
+        }
+#endif
+        if (!buffer) { PyErr_Clear(); return false; }
 		value = std::wstring(buffer, length);
 		return true;
 	}
@@ -371,22 +386,8 @@
 	PYBIND11_TYPE_CASTER(std::wstring, _(PYBIND11_STRING_NAME));
 };
 
-template <> class type_caster<char> {
+template <> class type_caster<char> : public type_caster<std::string> {
 public:
-    bool load(handle src, bool) {
-        object temp;
-        handle load_src = src;
-        if (PyUnicode_Check(load_src.ptr())) {
-            temp = object(PyUnicode_AsUTF8String(load_src.ptr()), false);
-            if (!temp) { PyErr_Clear(); return false; }  // UnicodeEncodeError
-            load_src = temp;
-        }
-        const char *ptr = PYBIND11_BYTES_AS_STRING(load_src.ptr());
-        if (!ptr) { PyErr_Clear(); return false; }  // TypeError
-        value = std::string(ptr);
-        return true;
-    }
-
     static handle cast(const char *src, return_value_policy /* policy */, handle /* parent */) {
         return PyUnicode_FromString(src);
     }
@@ -404,22 +405,8 @@
     std::string value;
 };
 
-template <> class type_caster<wchar_t> {
+template <> class type_caster<wchar_t> : public type_caster<std::wstring> {
 public:
-	bool load(handle src, bool) {
-		object temp;
-		handle load_src = src;
-		if (!PyUnicode_Check(load_src.ptr())) {
-			temp = object(PyUnicode_FromObject(load_src.ptr()), false);
-			if (!temp) { PyErr_Clear(); return false; }
-			load_src = temp;
-		}
-		wchar_t *buffer = PyUnicode_AS_UNICODE(load_src.ptr());
-		size_t length = PyUnicode_GET_SIZE(load_src.ptr());
-		value = std::wstring(buffer, length);
-		return true;
-	}
-
 	static handle cast(const wchar_t *src, return_value_policy /* policy */, handle /* parent */) {
 		return PyUnicode_FromWideChar(src, wcslen(src));
 	}
@@ -556,12 +543,14 @@
     using type_caster<type>::copy_constructor;
 
     bool load(handle src, bool convert) {
-        if (!src || !typeinfo)
+        if (!src || !typeinfo) {
             return false;
-
-        if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
+        } else if (src.ptr() == Py_None) {
+            value = nullptr;
+            return true;
+        } else if (PyType_IsSubtype(Py_TYPE(src.ptr()), typeinfo->type)) {
             auto inst = (instance<type, holder_type> *) src.ptr();
-            value = inst->value;
+            value = (void *) inst->value;
             holder = inst->holder;
             return true;
         }
@@ -621,7 +610,7 @@
     detail::type_caster<typename detail::intrinsic_type<T>::type> conv;
     if (!conv.load(handle, true))
         throw cast_error("Unable to cast Python object to C++ type");
-    return conv;
+    return (T) conv;
 }
 
 template <typename T> inline object cast(const T &value, return_value_policy policy = return_value_policy::automatic, handle parent = handle()) {
diff --git a/include/pybind11/common.h b/include/pybind11/common.h
index e4cb9be..3cefa93 100644
--- a/include/pybind11/common.h
+++ b/include/pybind11/common.h
@@ -31,7 +31,7 @@
 #endif
 
 #define PYBIND11_VERSION_MAJOR 1
-#define PYBIND11_VERSION_MINOR 3
+#define PYBIND11_VERSION_MINOR 4
 
 /// Include Python header, disable linking to pythonX_d.lib on Windows in debug mode
 #if defined(_MSC_VER)
@@ -110,6 +110,10 @@
 #endif
 
 #define PYBIND11_TRY_NEXT_OVERLOAD ((PyObject *) 1) // special failure return code
+#define PYBIND11_STRINGIFY(x) #x
+#define PYBIND11_TOSTRING(x) PYBIND11_STRINGIFY(x)
+#define PYBIND11_INTERNALS_ID "__pybind11_" \
+    PYBIND11_TOSTRING(PYBIND11_VERSION_MAJOR) "_" PYBIND11_TOSTRING(PYBIND11_VERSION_MINOR) "__"
 
 #define PYBIND11_PLUGIN(name) \
     static PyObject *pybind11_init(); \
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h
index c78f1e2..4cf8ead 100644
--- a/include/pybind11/pybind11.h
+++ b/include/pybind11/pybind11.h
@@ -864,7 +864,7 @@
     template <typename T>
     static void init_holder_helper(instance_type *inst, const holder_type * /* unused */, const std::enable_shared_from_this<T> * /* dummy */) {
         try {
-            new (&inst->holder) holder_type(inst->value->shared_from_this());
+            new (&inst->holder) holder_type(std::static_pointer_cast<type>(inst->value->shared_from_this()));
         } catch (const std::bad_weak_ptr &) {
             new (&inst->holder) holder_type(inst->value);
         }
diff --git a/include/pybind11/stl.h b/include/pybind11/stl.h
index fca1ab8..97ccdbc 100644
--- a/include/pybind11/stl.h
+++ b/include/pybind11/stl.h
@@ -72,7 +72,7 @@
             if (!kconv.load(it.first.ptr(), convert) ||
                 !vconv.load(it.second.ptr(), convert))
                 return false;
-            value[(Key) kconv] = (Value) vconv;
+            value.emplace((Key) kconv, (Value) vconv);
         }
         return true;
     }
diff --git a/pybind11/_version.py b/pybind11/_version.py
index 6e1c20f..8c37a3f 100644
--- a/pybind11/_version.py
+++ b/pybind11/_version.py
@@ -1,2 +1,2 @@
-version_info = (1, 3, 'dev0')
+version_info = (1, 4, 'dev0')
 __version__ = '.'.join(map(str, version_info))
diff --git a/setup.py b/setup.py
index d8c5987..362b753 100644
--- a/setup.py
+++ b/setup.py
@@ -41,7 +41,6 @@
         'Programming Language :: Python :: 3.3',
         'Programming Language :: Python :: 3.4',
         'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
         'License :: OSI Approved :: BSD License',
     ],
     keywords='C++11, Python bindings',