diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py
index 76efdac..25e05b2 100644
--- a/mesonbuild/mintro.py
+++ b/mesonbuild/mintro.py
@@ -85,36 +85,73 @@
     sources = [os.path.join(i.subdir, i.fname) for i in sources]
     print(json.dumps(sources))
 
+def split_options(user_options, suboptions):
+    main_options = {}
+    main_suboptions = {}
+    subproject_options = {}
+    subproject_suboptions = {} 
+    for k in user_options.keys():
+        if ':' in k:
+            subproject_options[k] = user_options[k]
+        else:
+            main_options[k] = user_options[k]
+    for k in suboptions.keys():
+        if ':' in k:
+            subproject_suboptions[k] = suboptions[k]
+        else:
+            main_suboptions[k] = suboptions[k]
+    return (main_options, main_suboptions, subproject_options, subproject_suboptions)
+
 def list_buildoptions(coredata, builddata):
+    (main_options, main_suboptions, subproject_options, subproject_suboptions) = split_options(coredata.user_options, coredata.suboptions)
     all_opt = [{'name' : 'builtin',
                 'description': 'Meson builtin options',
                 'type': 'suboption',
                 'value': get_keys(coredata.builtins),
                 }]
-    all_opt.append({'name': 'user',
-                    'description' : 'User defined options',
+    all_opt.append({'name': 'base',
+                    'description' : 'Base options',
                     'type' : 'suboption',
-                    'value' : build_usertree(coredata.suboptions, coredata.user_options),
+                    'value' : get_keys(coredata.base_options),
                     })
     all_opt.append({'name' : 'compilers',
                     'description' : 'Options for compilers',
                     'type' : 'suboption',
                     'value' : get_keys(coredata.compiler_options),
                     })
-    all_opt.append({'name': 'base',
-                    'description' : 'Base options',
+    all_opt.append({'name': 'user',
+                    'description' : 'User options',
                     'type' : 'suboption',
-                    'value' : get_keys(coredata.base_options),
+                    'value' : build_usertree(main_options, main_suboptions),
                     })
+    all_opt += build_subprojecttree(subproject_options, subproject_suboptions)
     print(json.dumps(all_opt, indent=2))
 
-def build_usertree(suboptions, user_options, subbranch=None):
+def build_subprojecttree(options, suboptions):
+    result = []
+    sp_names = {}
+    for n in options.keys():
+        sp_names[n.split(':')[0]] = True
+    for n in suboptions.keys():
+        sp_names[n.split(':')[0]] = True
+    for subproject in sorted(sp_names.keys()):
+        prefix = subproject + ':'
+        cur_opt = {x.name : x for x in options.values() if x.name.startswith(prefix)}
+        cur_subopt = {x.name : x for x in suboptions.values() if x.name.startswith(prefix)}
+        result.append({'name' : subproject,
+                      'description' : 'Options of subproject: %s' % subproject,
+                      'type' : 'suboption',
+                      'value' :  build_usertree(cur_opt, cur_subopt)
+                      })
+    return result
+
+def build_usertree(user_options, suboptions, subbranch=None):
     current = []
     current_suboptions = [x for x in suboptions.values() if x.parent == subbranch]
     current_options = [x for x in user_options.values() if x.parent == subbranch]
     for so in current_suboptions:
         subentry = {'type' : 'subobject',
-                    'value' : build_usertree(suboptions, user_options, so.name),
+                    'value' : build_usertree(user_options, suboptions, so.name),
                     'description' : so.description,
                     'name' : so.name
                     }
