DECLARE_UVERBS_OBJECT(uverbs_object_pd, UVERBS_OBJECT_PD,
                      /* 2 is used in order to free the PD after MRs */
                      &UVERBS_TYPE_ALLOC_IDR(2, uverbs_free_pd));
+
+DECLARE_UVERBS_OBJECT(uverbs_object_device, UVERBS_OBJECT_DEVICE, NULL);
+
+DECLARE_UVERBS_OBJECT_TREE(uverbs_default_objects,
+                          &uverbs_object_device,
+                          &uverbs_object_pd,
+                          &uverbs_object_mr,
+                          &uverbs_object_comp_channel,
+                          &uverbs_object_cq,
+                          &uverbs_object_qp,
+                          &uverbs_object_ah,
+                          &uverbs_object_mw,
+                          &uverbs_object_srq,
+                          &uverbs_object_flow,
+                          &uverbs_object_wq,
+                          &uverbs_object_rwq_ind_table,
+                          &uverbs_object_xrcd);
 
  * =======================================
  */
 
+struct uverbs_attr_def {
+       u16                           id;
+       struct uverbs_attr_spec       attr;
+};
+
+struct uverbs_method_def {
+       u16                                  id;
+       /* Combination of bits from enum UVERBS_ACTION_FLAG_XXXX */
+       u32                                  flags;
+       size_t                               num_attrs;
+       const struct uverbs_attr_def * const (*attrs)[];
+       int (*handler)(struct ib_device *ib_dev, struct ib_uverbs_file *ufile,
+                      struct uverbs_attr_bundle *ctx);
+};
+
 struct uverbs_object_def {
+       u16                                      id;
        const struct uverbs_obj_type            *type_attrs;
+       size_t                                   num_methods;
+       const struct uverbs_method_def * const (*methods)[];
+};
+
+struct uverbs_object_tree_def {
+       size_t                                   num_objects;
+       const struct uverbs_object_def * const (*objects)[];
 };
 
 #define _UVERBS_OBJECT(_id, _type_attrs, ...)                          \
        ((const struct uverbs_object_def) {                             \
+        .id = _id,                                                     \
         .type_attrs = _type_attrs})
 #define DECLARE_UVERBS_OBJECT(_name, _id, _type_attrs, ...)            \
        const struct uverbs_object_def _name =                          \
                _UVERBS_OBJECT(_id, _type_attrs, ##__VA_ARGS__)
+#define _UVERBS_TREE_OBJECTS_SZ(...)                                   \
+       (sizeof((const struct uverbs_object_def * const []){__VA_ARGS__}) / \
+        sizeof(const struct uverbs_object_def *))
+#define _UVERBS_OBJECT_TREE(...)                                       \
+       ((const struct uverbs_object_tree_def) {                        \
+        .num_objects = _UVERBS_TREE_OBJECTS_SZ(__VA_ARGS__),           \
+        .objects = &(const struct uverbs_object_def * const []){__VA_ARGS__} })
+#define DECLARE_UVERBS_OBJECT_TREE(_name, ...)                         \
+       const struct uverbs_object_tree_def _name =                     \
+               _UVERBS_OBJECT_TREE(__VA_ARGS__)
+
 /* =================================================
  *              Parsing infrastructure
  * =================================================
 
 
 #include <rdma/uverbs_types.h>
 
+enum uverbs_default_objects {
+       UVERBS_OBJECT_DEVICE, /* No instances of DEVICE are allowed */
+       UVERBS_OBJECT_PD,
+       UVERBS_OBJECT_COMP_CHANNEL,
+       UVERBS_OBJECT_CQ,
+       UVERBS_OBJECT_QP,
+       UVERBS_OBJECT_SRQ,
+       UVERBS_OBJECT_AH,
+       UVERBS_OBJECT_MR,
+       UVERBS_OBJECT_MW,
+       UVERBS_OBJECT_FLOW,
+       UVERBS_OBJECT_XRCD,
+       UVERBS_OBJECT_RWQ_IND_TBL,
+       UVERBS_OBJECT_WQ,
+       UVERBS_OBJECT_LAST,
+};
+
 extern const struct uverbs_object_def uverbs_object_comp_channel;
 extern const struct uverbs_object_def uverbs_object_cq;
 extern const struct uverbs_object_def uverbs_object_qp;
 extern const struct uverbs_object_def uverbs_object_mw;
 extern const struct uverbs_object_def uverbs_object_pd;
 extern const struct uverbs_object_def uverbs_object_xrcd;
+extern const struct uverbs_object_def uverbs_object_device;
 
 static inline struct ib_uobject *__uobj_get(const struct uverbs_obj_type *type,
                                            bool write,