fix
diff --git a/include/fuse.h b/include/fuse.h
index 065ae75..f7dba7f 100644
--- a/include/fuse.h
+++ b/include/fuse.h
@@ -404,13 +404,15 @@
  * @param argc the argument counter passed to the main() function
  * @param argv the argument vector passed to the main() function
  * @param op the file system operation
+ * @param user_data user data set in context for init() method
  * @return 0 on success, nonzero on failure
  */
 /*
-int fuse_main(int argc, char *argv[], const struct fuse_operations *op);
+int fuse_main(int argc, char *argv[], const struct fuse_operations *op,
+              void *user_data);
 */
-#define fuse_main(argc, argv, op) \
-            fuse_main_real(argc, argv, op, sizeof(*(op)))
+#define fuse_main(argc, argv, op, user_data) \
+            fuse_main_real(argc, argv, op, sizeof(*(op)), user_data)
 
 /* ----------------------------------------------------------- *
  * More detailed API                                           *
@@ -419,14 +421,16 @@
 /**
  * Create a new FUSE filesystem.
  *
- * @param fd the control file descriptor
+ * @param ch the communication channel
  * @param args argument vector
  * @param op the operations
  * @param op_size the size of the fuse_operations structure
+ * @param user_data user data set in context for init() method
  * @return the created FUSE handle
  */
-struct fuse *fuse_new(int fd, struct fuse_args *args,
-                      const struct fuse_operations *op, size_t op_size);
+struct fuse *fuse_new(struct fuse_chan *ch, struct fuse_args *args,
+                      const struct fuse_operations *op, size_t op_size,
+                      void *user_data);
 
 /**
  * Destroy the FUSE handle.
@@ -497,7 +501,7 @@
  * Do not call this directly, use fuse_main()
  */
 int fuse_main_real(int argc, char *argv[], const struct fuse_operations *op,
-                   size_t op_size);
+                   size_t op_size, void *user_data);
 
 /* ----------------------------------------------------------- *
  * Advanced API for event handling, don't worry about this...  *
@@ -509,10 +513,11 @@
 /** This is the part of fuse_main() before the event loop */
 struct fuse *fuse_setup(int argc, char *argv[],
                         const struct fuse_operations *op, size_t op_size,
-                        char **mountpoint, int *multithreaded, int *fd);
+                        char **mountpoint, int *multithreaded,
+                        void *user_data);
 
 /** This is the part of fuse_main() after the event loop */
-void fuse_teardown(struct fuse *fuse, int fd, char *mountpoint);
+void fuse_teardown(struct fuse *fuse, char *mountpoint);
 
 /** Read a single command.  If none are read, return NULL */
 struct fuse_cmd *fuse_read_cmd(struct fuse *f);
@@ -531,6 +536,9 @@
 /** Set function which can be used to get the current context */
 void fuse_set_getcontext_func(struct fuse_context *(*func)(void));
 
+/** Get session from fuse object */
+struct fuse_session *fuse_get_session(struct fuse *f);
+
 /* ----------------------------------------------------------- *
  * Compatibility stuff                                         *
  * ----------------------------------------------------------- */
@@ -543,6 +551,7 @@
             fuse_main_real_compat25(argc, argv, op, sizeof(*(op)))
 #    define fuse_new fuse_new_compat25
 #    define fuse_setup fuse_setup_compat25
+#    define fuse_teardown fuse_teardown_compat25
 #    define fuse_operations fuse_operations_compat25
 #  elif FUSE_USE_VERSION == 22
 #    define fuse_main(argc, argv, op) \