diff --git a/Demo/schema_tree.py b/Demo/schema_tree.py
new file mode 100644
index 0000000..3b3a091
--- /dev/null
+++ b/Demo/schema_tree.py
@@ -0,0 +1,100 @@
+"""
+Outputs the object class tree read from LDAPv3 schema
+of a given server
+
+Usage: schema_oc_tree.py [--html] [LDAP URL]
+"""
+
+import sys,getopt,ldap,ldap.schema
+
+
+ldap.trace_level = 1
+
+def PrintSchemaTree(schema,se_class,se_tree,se_oid,level):
+ """ASCII text output for console"""
+ se_obj = schema.get_obj(se_class,se_oid)
+ if se_obj!=None:
+ print '| '*(level-1)+'+---'*(level>0), \
+ ', '.join(se_obj.names), \
+ '(%s)' % se_obj.oid
+ for sub_se_oid in se_tree[se_oid]:
+ print '| '*(level+1)
+ PrintSchemaTree(schema,se_class,se_tree,sub_se_oid,level+1)
+
+
+def HTMLSchemaTree(schema,se_class,se_tree,se_oid,level):
+ """HTML output for browser"""
+ se_obj = schema.get_obj(se_class,se_oid)
+ if se_obj!=None:
+ print """
+
%s (%s)
+
+ %s
+ """ % (', '.join(se_obj.names),se_obj.oid,se_obj.desc)
+ if se_tree[se_oid]:
+ print ''
+ for sub_se_oid in se_tree[se_oid]:
+ HTMLSchemaTree(schema,se_class,se_tree,sub_se_oid,level+1)
+ print '
'
+ print ''
+
+
+ldap.set_option(ldap.OPT_DEBUG_LEVEL,0)
+
+ldap._trace_level = 0
+
+subschemasubentry_dn,schema = ldap.schema.urlfetch(sys.argv[-1],ldap.trace_level)
+
+if subschemasubentry_dn is None:
+ print 'No sub schema sub entry found!'
+ sys.exit(1)
+
+try:
+ options,args=getopt.getopt(sys.argv[1:],'',['html'])
+except getopt.error,e:
+ print 'Error: %s\nUsage: schema_oc_tree.py [--html] [LDAP URL]'
+
+html_output = options and options[0][0]=='--html'
+
+oc_tree = schema.tree(ldap.schema.ObjectClass)
+at_tree = schema.tree(ldap.schema.AttributeType)
+
+#for k,v in oc_tree.items():
+# print k,'->',v
+#for k,v in at_tree.items():
+# print k,'->',v
+
+if html_output:
+
+ print """
+
+ Object class tree
+
+
+Object class tree
+
+"""
+ HTMLSchemaTree(schema,ldap.schema.ObjectClass,oc_tree,'2.5.6.0',0)
+ print """
+Attribute type tree
+
+"""
+ for a in schema.listall(ldap.schema.AttributeType):
+ if at_tree[a]:
+ HTMLSchemaTree(schema,ldap.schema.AttributeType,at_tree,a,0)
+ print
+
+ print """
+
+
+"""
+
+else:
+
+ print '*** Object class tree ***\n'
+ print
+ PrintSchemaTree(schema,ldap.schema.ObjectClass,oc_tree,'2.5.6.0',0)
+
+ print '\n*** Attribute types tree ***\n'
+ PrintSchemaTree(schema,ldap.schema.AttributeType,at_tree,'_',0)
+