Index: CXX/CXX/Python2/ExtensionType.hxx
===================================================================
--- CXX/CXX/Python2/ExtensionType.hxx	(revision 295)
+++ CXX/CXX/Python2/ExtensionType.hxx	(working copy)
@@ -184,7 +184,7 @@ namespace Py
         int m_methods_size;
     };
 
-    template<TEMPLATE_TYPENAME T> class PythonClass
+    template<TEMPLATE_TYPENAME T, TEMPLATE_TYPENAME U = T> class PythonClass
     : public PythonExtensionBase
     {
     protected:
@@ -225,7 +225,10 @@ namespace Py
                 p->set_tp_init( extension_object_init );
                 p->set_tp_dealloc( extension_object_deallocator );
                 // we are a class
-                p->supportClass();
+                if( typeid( T ) == typeid( U ))
+                    p->supportClass();
+                else
+                    p->supportClassWithBase( U::type_object() );
 
                 // always support get and set attr
                 p->supportGetattro();
Index: CXX/CXX/Python2/PythonType.hxx
===================================================================
--- CXX/CXX/Python2/PythonType.hxx	(revision 295)
+++ CXX/CXX/Python2/PythonType.hxx	(working copy)
@@ -57,6 +57,7 @@ namespace Py
         PythonType &doc( const char *d );
 
         PythonType &supportClass( void );
+        PythonType &supportClassWithBase( PyTypeObject* );
         PythonType &dealloc( void (*f)( PyObject* ) );
 #if defined( PYCXX_PYTHON_2TO3 )
         PythonType &supportPrint( void );
Index: CXX/CXX/Python3/ExtensionType.hxx
===================================================================
--- CXX/CXX/Python3/ExtensionType.hxx	(revision 295)
+++ CXX/CXX/Python3/ExtensionType.hxx	(working copy)
@@ -183,7 +183,7 @@ namespace Py
         int m_methods_size;
     };
 
-    template<TEMPLATE_TYPENAME T> class PythonClass
+    template<TEMPLATE_TYPENAME T, TEMPLATE_TYPENAME U = T> class PythonClass
     : public PythonExtensionBase
     {
     protected:
@@ -225,7 +225,10 @@ namespace Py
                 p->set_tp_dealloc( extension_object_deallocator );
 
                 // we are a class
-                p->supportClass();
+                if( typeid( T ) == typeid( U ))
+                    p->supportClass();
+                else
+                    p->supportClassWithBase( U::type_object() );
 
                 // always support get and set attr
                 p->supportGetattro();
Index: CXX/CXX/Python3/PythonType.hxx
===================================================================
--- CXX/CXX/Python3/PythonType.hxx	(revision 295)
+++ CXX/CXX/Python3/PythonType.hxx	(working copy)
@@ -57,6 +57,7 @@ namespace Py
         PythonType &doc( const char *d );
 
         PythonType &supportClass( void );
+        PythonType &supportClassWithBase( PyTypeObject* );
 #ifdef PYCXX_PYTHON_2TO3
         PythonType &supportPrint( void );
 #endif
Index: CXX/Demo/Python2/simple.cxx
===================================================================
--- CXX/Demo/Python2/simple.cxx	(revision 295)
+++ CXX/Demo/Python2/simple.cxx	(working copy)
@@ -126,6 +126,73 @@ public:
 };
 
 
+class new_style_subclass : public Py::PythonClass< new_style_subclass, new_style_class >
+{
+public:
+    new_style_subclass( Py::PythonClassInstance *self, Py::Tuple &args, Py::Dict &kwds )
+    : Py::PythonClass< new_style_subclass, new_style_class >::PythonClass( self, args, kwds )
+    , m_name( "default value" )
+    {
+        std::cout << "new_style_subclass c'tor Called with " << args.length() << " normal arguments." << std::endl;
+        Py::List names( kwds.keys() );
+        std::cout << "and with " << names.length() << " keyword arguments:" << std::endl;
+        for( Py::List::size_type i=0; i< names.length(); i++ )
+        {
+            Py::String name( names[i] );
+            std::cout << "    " << name << std::endl;
+        }
+    }
+
+    virtual ~new_style_subclass()
+    {
+        std::cout << "~new_style_subclass." << std::endl;
+    }
+
+    static void init_type(void)
+    {
+        behaviors().name( "new_style_subclass" );
+        behaviors().doc( "documentation for new_style_subclass class" );
+        behaviors().supportGetattro();
+        behaviors().supportSetattro();
+
+        // Call to make the type ready for use
+        behaviors().readyType();
+    }
+
+
+    Py::Object getattro( const Py::String &name_ )
+    {
+        std::string name( name_.as_std_string( "utf-8" ) );
+
+        if( name == "name" )
+        {
+            return m_name;
+        }
+        else
+        {
+            return genericGetAttro( name_ );
+        }
+    }
+
+    int setattro( const Py::String &name_, const Py::Object &value )
+    {
+        std::string name( name_.as_std_string( "utf-8" ) );
+
+        if( name == "name" )
+        {
+            m_name = value;
+            return 0;
+        }
+        else
+        {
+            return genericSetAttro( name_, value );
+        }
+    }
+
+    Py::String m_name;
+};
+
+
 class old_style_class: public Py::PythonExtension< old_style_class >
 {
 public:
@@ -188,6 +255,7 @@ public:
     {
         old_style_class::init_type();
         new_style_class::init_type();
+        new_style_subclass::init_type();
 
         add_varargs_method("old_style_class", &simple_module::factory_old_style_class, "documentation for old_style_class()");
         add_keyword_method("func", &simple_module::func, "documentation for func()");
@@ -203,6 +271,8 @@ public:
         d["var"] = Py::String( "var value" );
         Py::Object x( new_style_class::type() );
         d["new_style_class"] = x;
+        Py::Object y( new_style_subclass::type() );
+        d["new_style_subclass"] = y;
     }
 
     virtual ~simple_module()
Index: CXX/Demo/Python2/test_simple.py
===================================================================
--- CXX/Demo/Python2/test_simple.py	(revision 295)
+++ CXX/Demo/Python2/test_simple.py	(working copy)
@@ -64,3 +64,26 @@ except RuntimeError, e:
     print 'Raised %r' % (str(e),)
 
 new_style_class = None
+
+
+print( '--- new_style_subclass func ---' )
+new_style_class = simple.new_style_subclass()
+print( dir( new_style_class ) )
+new_style_class.func_noargs()
+new_style_class.func_varargs()
+new_style_class.func_varargs( 4 )
+new_style_class.func_keyword()
+new_style_class.func_keyword( name=6, value=7 )
+new_style_class.func_keyword( 4, 5 )
+new_style_class.func_keyword( 4, 5, name=6, value=7 )
+print( new_style_class.name )
+
+try:
+    new_style_class.func_noargs_raise_exception()
+    print 'Error: did not raised RuntimeError'
+    sys.exit( 1 )
+
+except RuntimeError, e:
+    print 'Raised %r' % (str(e),)
+
+new_style_class = None
Index: CXX/Demo/Python3/simple.cxx
===================================================================
--- CXX/Demo/Python3/simple.cxx	(revision 295)
+++ CXX/Demo/Python3/simple.cxx	(working copy)
@@ -127,6 +127,73 @@ public:
 };
 
 
+class new_style_subclass : public Py::PythonClass< new_style_subclass, new_style_class >
+{
+public:
+    new_style_subclass( Py::PythonClassInstance *self, Py::Tuple &args, Py::Dict &kwds )
+    : Py::PythonClass< new_style_subclass, new_style_class >::PythonClass( self, args, kwds )
+    , m_name( "default value" )
+    {
+        std::cout << "new_style_subclass c'tor Called with " << args.length() << " normal arguments." << std::endl;
+        Py::List names( kwds.keys() );
+        std::cout << "and with " << names.length() << " keyword arguments:" << std::endl;
+        for( Py::List::size_type i=0; i< names.length(); i++ )
+        {
+            Py::String name( names[i] );
+            std::cout << "    " << name << std::endl;
+        }
+    }
+
+    virtual ~new_style_subclass()
+    {
+        std::cout << "~new_style_subclass." << std::endl;
+    }
+
+    static void init_type(void)
+    {
+        behaviors().name( "new_style_subclass" );
+        behaviors().doc( "documentation for new_style_subclass class" );
+        behaviors().supportGetattro();
+        behaviors().supportSetattro();
+
+        // Call to make the type ready for use
+        behaviors().readyType();
+    }
+
+
+    Py::Object getattro( const Py::String &name_ )
+    {
+        std::string name( name_.as_std_string( "utf-8" ) );
+
+        if( name == "name" )
+        {
+            return m_name;
+        }
+        else
+        {
+            return genericGetAttro( name_ );
+        }
+    }
+
+    int setattro( const Py::String &name_, const Py::Object &value )
+    {
+        std::string name( name_.as_std_string( "utf-8" ) );
+
+        if( name == "name" )
+        {
+            m_name = value;
+            return 0;
+        }
+        else
+        {
+            return genericSetAttro( name_, value );
+        }
+    }
+
+    Py::String m_name;
+};
+
+
 class old_style_class: public Py::PythonExtension< old_style_class >
 {
 public:
@@ -189,6 +256,7 @@ public:
     {
         old_style_class::init_type();
         new_style_class::init_type();
+        new_style_subclass::init_type();
 
         add_varargs_method("old_style_class", &simple_module::factory_old_style_class, "documentation for old_style_class()");
         add_keyword_method("func", &simple_module::func, "documentation for func()");
@@ -204,6 +272,8 @@ public:
         d["var"] = Py::String( "var value" );
         Py::Object x( new_style_class::type() );
         d["new_style_class"] = x;
+        Py::Object y( new_style_subclass::type() );
+        d["new_style_subclass"] = y;
     }
 
     virtual ~simple_module()
Index: CXX/Demo/Python3/test_simple.py
===================================================================
--- CXX/Demo/Python3/test_simple.py	(revision 295)
+++ CXX/Demo/Python3/test_simple.py	(working copy)
@@ -63,3 +63,26 @@ except RuntimeError as e:
     print( 'Raised %r' % (str(e),) )
 
 new_style_class = None
+
+
+print( '--- new_style_subclass func ---' )
+new_style_class = simple.new_style_subclass()
+print( dir( new_style_class ) )
+new_style_class.func_noargs()
+new_style_class.func_varargs()
+new_style_class.func_varargs( 4 )
+new_style_class.func_keyword()
+new_style_class.func_keyword( name=6, value=7 )
+new_style_class.func_keyword( 4, 5 )
+new_style_class.func_keyword( 4, 5, name=6, value=7 )
+print( new_style_class.name )
+
+try:
+    new_style_class.func_noargs_raise_exception()
+    print( 'Error: did not raised RuntimeError' )
+    sys.exit( 1 )
+
+except RuntimeError as e:
+    print( 'Raised %r' % (str(e),) )
+
+new_style_class = None
Index: CXX/Src/Python2/cxx_extensions.cxx
===================================================================
--- CXX/Src/Python2/cxx_extensions.cxx	(revision 295)
+++ CXX/Src/Python2/cxx_extensions.cxx	(working copy)
@@ -554,6 +554,13 @@ PythonType &PythonType::supportClass()
     return *this;
 }
 
+PythonType &PythonType::supportClassWithBase( PyTypeObject *base )
+{
+    table->tp_flags |= Py_TPFLAGS_BASETYPE;
+    table->tp_base = base;
+    return *this;
+}
+
 PythonType &PythonType::dealloc( void( *f )( PyObject * ))
 {
     table->tp_dealloc = f;
Index: CXX/Src/Python3/cxx_extensions.cxx
===================================================================
--- CXX/Src/Python3/cxx_extensions.cxx	(revision 295)
+++ CXX/Src/Python3/cxx_extensions.cxx	(working copy)
@@ -514,6 +514,13 @@ PythonType &PythonType::supportClass()
     return *this;
 }
 
+PythonType &PythonType::supportClassWithBase( PyTypeObject *base )
+{
+    table->tp_flags |= Py_TPFLAGS_BASETYPE;
+    table->tp_base = base;
+    return *this;
+}
+
 #ifdef PYCXX_PYTHON_2TO3
 PythonType &PythonType::supportPrint()
 {
