[Pkg-ofed-commits] [libfabric] 02/18: New upstream version 1.5.2

Benjamin Drung bdrung at moszumanska.debian.org
Wed Nov 29 16:04:04 UTC 2017


This is an automated email from the git hooks/post-receive script.

bdrung pushed a commit to branch master
in repository libfabric.

commit d584bec820e25bbe53a7908c21512aab19eedec0
Author: Benjamin Drung <bdrung at debian.org>
Date:   Wed Nov 29 14:48:02 2017 +0100

    New upstream version 1.5.2
---
 AUTHORS                                            |   14 +
 COPYING                                            |    4 +-
 Makefile.am                                        |   36 +-
 Makefile.in                                        | 3755 +++++++++----
 NEWS.md                                            |  270 +
 README                                             |    4 +-
 aclocal.m4                                         |  195 +-
 config.h.in                                        |   46 +-
 config/ar-lib                                      |    2 +-
 config/compile                                     |    2 +-
 config/config.guess                                |  239 +-
 config/config.sub                                  |   71 +-
 config/depcomp                                     |    2 +-
 config/fi_provider.m4                              |   45 +-
 config/install-sh                                  |  373 +-
 config/libtool.m4                                  | 2588 +++++----
 config/ltmain.sh                                   | 5511 +++++++++++++-------
 config/ltoptions.m4                                |  127 +-
 config/ltsugar.m4                                  |    7 +-
 config/ltversion.m4                                |   12 +-
 config/lt~obsolete.m4                              |    7 +-
 config/missing                                     |    6 +-
 config/test-driver                                 |   35 +-
 configure                                          | 5364 ++++++++++++-------
 configure.ac                                       |   50 +-
 include/fi.h                                       |  112 +-
 include/fi_abi.h                                   |  115 +-
 include/fi_atom.h                                  |  338 +-
 include/fi_enosys.h                                |    9 +-
 include/fi_indexer.h                               |   65 +-
 prov/util/src/util_fabric.c => include/fi_iov.h    |   74 +-
 include/fi_list.h                                  |   43 +-
 include/fi_lock.h                                  |    3 +-
 include/fi_mem.h                                   |   25 +-
 include/fi_osd.h                                   |   30 +
 include/fi_proto.h                                 |   14 +-
 include/fi_rbuf.h                                  |  166 +-
 include/fi_util.h                                  |  467 +-
 include/{fi_abi.h => ofi_atomic.h}                 |   50 +-
 include/osx/osd.h                                  |   13 -
 include/prov.h                                     |   42 +-
 include/rdma/fabric.h                              |  103 +-
 include/rdma/fi_atomic.h                           |   75 +-
 include/rdma/fi_cm.h                               |   21 +-
 include/rdma/fi_domain.h                           |  117 +-
 include/rdma/fi_endpoint.h                         |    5 +-
 include/rdma/fi_eq.h                               |   17 +
 include/rdma/fi_errno.h                            |    1 +
 include/rdma/fi_trigger.h                          |   93 +-
 include/rdma/providers/fi_log.h                    |    1 +
 include/unix/osd.h                                 |  122 +-
 libfabric.map.in                                   |    8 +
 libfabric.spec                                     |   42 +-
 libfabric.spec.in                                  |   40 +-
 man/man1/fi_info.1                                 |    2 +-
 man/man1/fi_pingpong.1                             |    2 +-
 man/man1/fi_strerror.1                             |    2 +-
 man/man3/fi_atomic.3                               |   65 +-
 man/man3/fi_av.3                                   |   46 +-
 man/man3/fi_cm.3                                   |   63 +-
 man/man3/fi_cntr.3                                 |   17 +-
 man/man3/fi_control.3                              |    2 +-
 man/man3/fi_cq.3                                   |  137 +-
 man/man3/fi_domain.3                               |  336 +-
 man/man3/fi_endpoint.3                             |  224 +-
 man/man3/fi_eq.3                                   |  100 +-
 man/man3/fi_errno.3                                |    2 +-
 man/man3/fi_fabric.3                               |   20 +-
 man/man3/fi_getinfo.3                              |  111 +-
 man/man3/fi_mr.3                                   |  464 +-
 man/man3/fi_msg.3                                  |   30 +-
 man/man3/fi_poll.3                                 |    4 +-
 man/man3/fi_rma.3                                  |    5 +-
 man/man3/fi_tagged.3                               |   16 +-
 man/man3/fi_trigger.3                              |  137 +-
 man/man3/fi_version.3                              |    2 +-
 man/man7/fabric.7                                  |    2 +-
 man/man7/fi_bgq.7                                  |  124 +
 man/man7/fi_direct.7                               |    8 +-
 man/man7/fi_gni.7                                  |   95 +-
 man/man7/{fi_mxm.7 => fi_mlx.7}                    |   26 +-
 man/man7/fi_provider.7                             |   37 +-
 man/man7/fi_psm.7                                  |    2 +-
 man/man7/fi_psm2.7                                 |   80 +-
 man/man7/fi_sockets.7                              |    4 +-
 man/man7/fi_udp.7                                  |    4 +-
 man/man7/fi_usnic.7                                |   12 +-
 man/man7/fi_verbs.7                                |   45 +-
 prov/bgq/Makefile.include                          |  111 +
 prov/bgq/configure.m4                              |  135 +
 prov/bgq/include/rdma/fi_direct.h.in               |  378 ++
 include/fi_osd.h => prov/bgq/src/fi_bgq_agent.c    |   27 +-
 prov/bgq/src/fi_bgq_atomic.c                       |  856 +++
 prov/bgq/src/fi_bgq_av.c                           |  494 ++
 .../src/util_fabric.c => bgq/src/fi_bgq_cm.c}      |   96 +-
 prov/bgq/src/fi_bgq_cntr.c                         |  283 +
 prov/bgq/src/fi_bgq_cq.c                           |  596 +++
 prov/bgq/src/fi_bgq_domain.c                       |  585 +++
 prov/bgq/src/fi_bgq_ep.c                           | 2023 +++++++
 prov/bgq/src/fi_bgq_fabric.c                       |  152 +
 prov/bgq/src/fi_bgq_info.c                         |  140 +
 prov/bgq/src/fi_bgq_init.c                         |  365 ++
 prov/bgq/src/fi_bgq_mr.c                           |  207 +
 prov/bgq/src/fi_bgq_msg.c                          |  176 +
 prov/bgq/src/fi_bgq_node.c                         |  486 ++
 prov/bgq/src/fi_bgq_pmi.c                          |  364 ++
 prov/bgq/src/fi_bgq_progress.c                     |  384 ++
 prov/bgq/src/fi_bgq_rma.c                          |  257 +
 prov/bgq/src/fi_bgq_sep.c                          |  456 ++
 prov/bgq/src/fi_bgq_spi.c                          |  211 +
 prov/bgq/src/fi_bgq_tagged.c                       |  199 +
 prov/bgq/src/test/Makefile.include                 |  139 +
 prov/bgq/src/test/l2atomic_fifo_perf.c             |  237 +
 prov/bgq/src/test/spi_pingpong.c                   |  476 ++
 prov/gni/Makefile.include                          |   13 +
 prov/gni/configure.m4                              |   85 +-
 prov/gni/include/fi_ext_gni.h                      |   64 +-
 prov/gni/include/gnix.h                            |  368 +-
 prov/gni/include/gnix_atomic.h                     |    3 +
 prov/gni/include/gnix_auth_key.h                   |  201 +
 prov/gni/include/gnix_av.h                         |   37 +-
 prov/gni/include/gnix_cm.h                         |  159 +
 prov/gni/include/gnix_cm_nic.h                     |   44 +-
 prov/gni/include/gnix_cntr.h                       |   35 +-
 prov/gni/include/gnix_cq.h                         |   39 +-
 prov/gni/include/gnix_datagram.h                   |   50 +-
 prov/gni/include/gnix_ep.h                         |  202 +-
 prov/gni/include/gnix_eq.h                         |   36 +-
 prov/gni/include/gnix_freelist.h                   |   76 +-
 prov/gni/include/gnix_hashtable.h                  |    6 +-
 prov/gni/include/gnix_mbox_allocator.h             |    2 +-
 prov/gni/include/gnix_mr.h                         |   39 +-
 prov/gni/include/gnix_mr_cache.h                   |    5 +-
 prov/gni/include/gnix_mr_notifier.h                |   16 +-
 prov/gni/include/gnix_msg.h                        |    6 +-
 prov/gni/include/gnix_nameserver.h                 |   13 +-
 prov/gni/include/gnix_nic.h                        |  101 +-
 .../include/{gnix_nameserver.h => gnix_progress.h} |   32 +-
 prov/gni/include/gnix_rma.h                        |    5 +-
 prov/gni/include/gnix_tags.h                       |    2 +-
 prov/gni/include/gnix_util.h                       |   45 +-
 prov/gni/include/gnix_vc.h                         |   72 +-
 prov/gni/include/gnix_wait.h                       |    2 +
 prov/gni/src/gnix_atomic.c                         |  104 +-
 prov/gni/src/gnix_auth_key.c                       |  350 ++
 prov/gni/src/gnix_av.c                             |  227 +-
 prov/gni/src/gnix_buddy_allocator.c                |    7 +-
 prov/gni/src/gnix_cm.c                             | 1287 ++++-
 prov/gni/src/gnix_cm_nic.c                         |  144 +-
 prov/gni/src/gnix_cntr.c                           |  233 +-
 prov/gni/src/gnix_cq.c                             |  304 +-
 prov/gni/src/gnix_datagram.c                       |   56 +-
 prov/gni/src/gnix_dom.c                            |  217 +-
 prov/gni/src/gnix_ep.c                             | 1392 +++--
 prov/gni/src/gnix_eq.c                             |  252 +-
 prov/gni/src/gnix_fabric.c                         |  841 ++-
 prov/gni/src/gnix_freelist.c                       |   59 +-
 prov/gni/src/gnix_hashtable.c                      |   42 +-
 prov/gni/src/gnix_init.c                           |  101 +-
 prov/gni/src/gnix_mbox_allocator.c                 |    2 +-
 prov/gni/src/gnix_mr.c                             |  424 +-
 prov/gni/src/gnix_mr_cache.c                       |   48 +-
 prov/gni/src/gnix_mr_notifier.c                    |  174 +-
 prov/gni/src/gnix_msg.c                            |  901 ++--
 prov/gni/src/gnix_nameserver.c                     |  164 +-
 prov/gni/src/gnix_nic.c                            |  438 +-
 prov/gni/src/gnix_progress.c                       |  159 +
 prov/gni/src/gnix_rma.c                            |  654 ++-
 prov/gni/src/gnix_sep.c                            | 1637 ++++++
 prov/gni/src/gnix_tags.c                           |    2 +-
 prov/gni/src/gnix_trigger.c                        |    4 +-
 prov/gni/src/gnix_util.c                           |  100 +-
 prov/gni/src/gnix_vc.c                             |  761 ++-
 prov/gni/src/gnix_wait.c                           |  275 +-
 prov/gni/src/gnix_xpmem.c                          |    2 +-
 prov/mlx/Makefile.include                          |   34 +
 prov/mlx/configure.m4                              |   26 +
 prov/mlx/src/mlx.h                                 |  185 +
 prov/mlx/src/mlx_av.c                              |  218 +
 prov/mlx/src/mlx_callbacks.c                       |  165 +
 prov/{mxm/src/mlxm_cm.c => mlx/src/mlx_cm.c}       |   77 +-
 .../include/gnix_nameserver.h => mlx/src/mlx_cq.c} |   41 +-
 prov/mlx/src/mlx_domain.c                          |  145 +
 prov/mlx/src/mlx_ep.c                              |  195 +
 .../src/udpx_fabric.c => mlx/src/mlx_fabric.c}     |   86 +-
 prov/mlx/src/mlx_init.c                            |  250 +
 prov/mlx/src/mlx_tagged.c                          |  367 ++
 prov/mxm/Makefile.include                          |   37 -
 prov/mxm/configure.m4                              |   26 -
 prov/mxm/src/mlxm.h                                |  185 -
 prov/mxm/src/mlxm_av.c                             |  144 -
 prov/mxm/src/mlxm_cq.c                             |  213 -
 prov/mxm/src/mlxm_domain.c                         |   75 -
 prov/mxm/src/mlxm_ep.c                             |  183 -
 prov/mxm/src/mlxm_helpers.h                        |  397 --
 prov/mxm/src/mlxm_init.c                           |  326 --
 prov/mxm/src/mlxm_mq_storage.h                     |   58 -
 prov/mxm/src/mlxm_mr.c                             |   76 -
 prov/mxm/src/mlxm_tagged.c                         |  296 --
 prov/mxm/src/mpool.h                               |  104 -
 prov/mxm/src/uthash.h                              |  958 ----
 prov/psm/libfabric-psm.spec.in                     |   52 +
 prov/psm/src/psmx.h                                |   58 +-
 prov/psm/src/psmx_am.c                             |    2 +-
 prov/psm/src/psmx_atomic.c                         |   75 +-
 prov/psm/src/psmx_av.c                             |   43 +-
 prov/psm/src/psmx_cm.c                             |    4 +-
 prov/psm/src/psmx_cntr.c                           |   54 +-
 prov/psm/src/psmx_cq.c                             |   56 +-
 prov/psm/src/psmx_domain.c                         |    5 +-
 prov/psm/src/psmx_ep.c                             |   42 +-
 prov/psm/src/psmx_fabric.c                         |   65 +-
 prov/psm/src/psmx_init.c                           |  188 +-
 prov/psm/src/psmx_mr.c                             |   27 +-
 prov/psm/src/psmx_msg.c                            |    2 +-
 prov/psm/src/psmx_msg2.c                           |    2 +-
 prov/psm/src/psmx_rma.c                            |    8 +-
 prov/psm/src/psmx_tagged.c                         |    2 +-
 prov/psm/src/psmx_util.c                           |    2 +-
 prov/psm/src/psmx_wait.c                           |    2 +-
 prov/psm/src/version.h                             |    2 +-
 prov/psm2/libfabric-psm2.spec.in                   |   52 +
 prov/psm2/src/psmx2.h                              |  397 +-
 prov/psm2/src/psmx2_am.c                           |  300 +-
 prov/psm2/src/psmx2_atomic.c                       |  268 +-
 prov/psm2/src/psmx2_av.c                           |  416 +-
 prov/psm2/src/psmx2_cm.c                           |   40 +-
 prov/psm2/src/psmx2_cntr.c                         |   90 +-
 prov/psm2/src/psmx2_cq.c                           |  224 +-
 prov/psm2/src/psmx2_domain.c                       |  268 +-
 prov/psm2/src/psmx2_ep.c                           |  474 +-
 prov/psm2/src/psmx2_fabric.c                       |   65 +-
 prov/psm2/src/psmx2_init.c                         |  374 +-
 prov/psm2/src/psmx2_mr.c                           |   40 +-
 prov/psm2/src/psmx2_msg.c                          |   54 +-
 prov/psm2/src/psmx2_rma.c                          |   93 +-
 prov/psm2/src/psmx2_tagged.c                       |  260 +-
 prov/psm2/src/psmx2_util.c                         |  158 +-
 prov/psm2/src/psmx2_wait.c                         |    4 +-
 prov/psm2/src/version.h                            |    2 +-
 prov/rxd/Makefile.include                          |    1 +
 prov/rxd/src/rxd.h                                 |  235 +-
 prov/rxd/src/rxd_attr.c                            |   24 +-
 prov/rxd/src/rxd_av.c                              |  284 +-
 prov/rxd/src/rxd_cntr.c                            |  128 +
 prov/rxd/src/rxd_cq.c                              |  726 ++-
 prov/rxd/src/rxd_domain.c                          |   94 +-
 prov/rxd/src/rxd_ep.c                              | 1445 +++--
 prov/rxd/src/rxd_fabric.c                          |   10 +-
 prov/rxd/src/rxd_init.c                            |   31 +-
 prov/rxd/src/rxd_rma.c                             |  120 +-
 prov/rxm/Makefile.include                          |    2 +
 prov/{util/src/util_fabric.c => rxm/src/rxm.c}     |   78 +-
 prov/rxm/src/rxm.h                                 |  289 +-
 prov/rxm/src/rxm_attr.c                            |   38 +-
 prov/rxm/src/rxm_conn.c                            |  320 +-
 prov/rxm/src/rxm_cq.c                              |  656 ++-
 prov/rxm/src/rxm_domain.c                          |   26 +-
 prov/rxm/src/rxm_ep.c                              | 1223 ++++-
 prov/rxm/src/rxm_fabric.c                          |   64 +-
 prov/rxm/src/rxm_init.c                            |  165 +-
 prov/rxm/src/rxm_rma.c                             |  405 ++
 prov/sockets/include/sock.h                        |  193 +-
 prov/sockets/libfabric-sockets.spec.in             |   52 +
 prov/sockets/src/sock_atomic.c                     |  119 +-
 prov/sockets/src/sock_av.c                         |   44 +-
 prov/sockets/src/sock_cntr.c                       |  254 +-
 prov/sockets/src/sock_comm.c                       |   43 +-
 prov/sockets/src/sock_conn.c                       |   32 +-
 prov/sockets/src/sock_cq.c                         |  164 +-
 prov/sockets/src/sock_ctx.c                        |   36 +-
 prov/sockets/src/sock_dom.c                        |   91 +-
 prov/sockets/src/sock_ep.c                         |  203 +-
 prov/sockets/src/sock_ep_dgram.c                   |    6 +-
 prov/sockets/src/sock_ep_msg.c                     |   33 +-
 prov/sockets/src/sock_ep_rdm.c                     |    6 +-
 prov/sockets/src/sock_eq.c                         |   26 +-
 prov/sockets/src/sock_fabric.c                     |   53 +-
 prov/sockets/src/sock_msg.c                        |   37 +-
 prov/sockets/src/sock_poll.c                       |   22 +-
 prov/sockets/src/sock_progress.c                   |  774 +--
 prov/sockets/src/sock_rma.c                        |   16 +-
 prov/sockets/src/sock_rx_entry.c                   |    5 +-
 prov/sockets/src/sock_trigger.c                    |  198 +-
 prov/sockets/src/sock_wait.c                       |    6 +-
 prov/udp/libfabric-udp.spec.in                     |   52 +
 prov/udp/src/udpx.h                                |   17 +-
 prov/udp/src/udpx_attr.c                           |   10 +-
 prov/udp/src/udpx_domain.c                         |    5 +-
 prov/udp/src/udpx_ep.c                             |  365 +-
 prov/udp/src/udpx_fabric.c                         |    2 +-
 prov/udp/src/udpx_init.c                           |   44 +-
 prov/usnic/Makefile.include                        |    4 +-
 prov/usnic/configure.m4                            |   64 +-
 prov/usnic/libfabric-usnic.spec.in                 |   52 +
 prov/usnic/src/usdf.h                              |   63 +-
 prov/usnic/src/usdf_av.c                           |  254 +-
 prov/usnic/src/usdf_av.h                           |   12 +-
 prov/usnic/src/usdf_cm.c                           |  137 +-
 prov/usnic/src/usdf_cm.h                           |   12 +-
 prov/usnic/src/usdf_cq.c                           |   42 +-
 prov/usnic/src/usdf_dgram.h                        |   14 +-
 prov/usnic/src/usdf_domain.c                       |  147 +-
 prov/usnic/src/usdf_ep_dgram.c                     |  147 +-
 prov/usnic/src/usdf_ep_msg.c                       |  160 +-
 prov/usnic/src/usdf_ep_rdm.c                       |  185 +-
 prov/usnic/src/usdf_eq.c                           |  106 +-
 prov/usnic/src/usdf_fabric.c                       |  481 +-
 prov/usnic/src/usdf_mem.c                          |   36 +-
 prov/usnic/src/usdf_msg.h                          |   13 +-
 prov/usnic/src/usdf_pep.c                          |  145 +-
 prov/usnic/src/usdf_poll.c                         |   14 +-
 prov/usnic/src/usdf_poll.h                         |    2 +-
 prov/usnic/src/usdf_progress.c                     |    2 +-
 prov/usnic/src/usdf_rdm.c                          |   10 +-
 prov/usnic/src/usdf_rdm.h                          |   15 +-
 prov/usnic/src/usdf_wait.c                         |    8 +-
 prov/usnic/src/usdf_wait.h                         |    2 +-
 prov/usnic/src/usnic_direct/usd_device.c           |    2 -
 prov/usnic/src/usnic_direct/usd_event.c            |    7 +-
 prov/usnic/src/usnic_direct/usd_ib_cmd.c           |  211 +-
 prov/usnic/src/usnic_direct/usd_ib_sysfs.c         |    2 -
 prov/usnic/src/usnic_direct/usnic_ib_abi.h         |   78 +-
 prov/util/src/util_atomic.c                        |  449 ++
 prov/util/src/util_attr.c                          |  685 ++-
 prov/util/src/util_av.c                            |  589 ++-
 prov/util/src/util_buf.c                           |   12 -
 prov/util/src/util_cntr.c                          |  335 ++
 prov/util/src/util_cq.c                            |  175 +-
 prov/util/src/util_domain.c                        |   26 +-
 prov/util/src/util_ep.c                            |  218 +-
 prov/util/src/util_eq.c                            |   10 +-
 prov/util/src/util_fabric.c                        |   30 +-
 prov/util/src/util_main.c                          |  188 +-
 prov/util/src/util_mr.c                            |  277 +-
 prov/util/src/util_ns.c                            |  596 +++
 prov/util/src/util_poll.c                          |    8 +-
 prov/util/src/util_wait.c                          |   14 +-
 prov/verbs/Makefile.include                        |    1 -
 prov/verbs/configure.m4                            |   29 +
 prov/verbs/libfabric-verbs.spec.in                 |   52 +
 prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c            |  554 +-
 prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c            |   37 +-
 prov/verbs/src/ep_rdm/verbs_ep_rdm.c               |  365 +-
 prov/verbs/src/ep_rdm/verbs_queuing.h              |   20 +-
 prov/verbs/src/ep_rdm/verbs_rdm.h                  |  208 +-
 prov/verbs/src/ep_rdm/verbs_rdm_cm.c               |  283 +-
 prov/verbs/src/ep_rdm/verbs_rdm_cntr.c             |   25 +-
 prov/verbs/src/ep_rdm/verbs_rdm_msg.c              |   20 +-
 prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm.c        |  135 +-
 prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.c |  370 +-
 prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.h |    6 +-
 prov/verbs/src/ep_rdm/verbs_utils.c                |   15 +-
 prov/verbs/src/ep_rdm/verbs_utils.h                |    7 +-
 prov/verbs/src/fi_verbs.c                          |  183 +-
 prov/verbs/src/fi_verbs.h                          |   68 +-
 prov/verbs/src/verbs_atomic.c                      |  140 +-
 prov/verbs/src/verbs_av.c                          |  150 -
 prov/verbs/src/verbs_cm.c                          |   37 +-
 prov/verbs/src/verbs_cq.c                          |   90 +-
 prov/verbs/src/verbs_domain.c                      |  198 +-
 prov/verbs/src/verbs_eq.c                          |   63 +-
 prov/verbs/src/verbs_info.c                        | 1006 ++--
 prov/verbs/src/verbs_msg_ep.c                      |   57 +-
 prov/verbs/src/verbs_rma.c                         |   97 +-
 prov/verbs/src/verbs_srq.c                         |    4 +-
 src/abi_1_0.c                                      |  246 +
 src/common.c                                       |  331 +-
 src/enosys.c                                       |   19 +
 src/fabric.c                                       |  475 +-
 src/fi_tostr.c                                     |  161 +-
 src/indexer.c                                      |   84 +-
 src/{osx/osd.c => iov.c}                           |   50 +-
 src/log.c                                          |   26 +-
 src/unix/osd.c                                     |   13 +-
 src/var.c                                          |   11 +-
 util/info.c                                        |   42 +-
 util/pingpong.c                                    |  253 +-
 378 files changed, 55066 insertions(+), 21467 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index fb2b5d5..17c2c36 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,4 +1,6 @@
+aingerson <alexia.ingerson at intel.com>
 Ajay Kulkarni <ajaykulk at cisco.com>
+Amith Abraham <aabraham at cray.com>
 Ana Guerrero López <ana at ekaia.org>
 Andrew Friedley <andrew.friedley at intel.com>
 Arun C Ilango <arun.ilango at intel.com>
@@ -7,11 +9,14 @@ Ashley Pittman <ampittma at ampittma-mac02.pittman.co.uk.20.20.172.in-addr.arpa>
 Ashley Pittman <ashley.m.pittman at intel.com>
 Ben Turrubiates <bturrubiates at lanl.gov>
 Ben Turrubiates <bturrubi at cisco.com>
+Brian Li <brian14708 at gmail.com>
 Chang Hyun Park <heartinpiece at gmail.com>
 Chen Zhao <soniczhao at gmail.com>
 Chuck Fossen <chuckf at cray.com>
 Dave Goodell <dgoodell at cisco.com>
+David Noel <david.noel19 at gmail.com>
 Dmitry Durnov <dmitry.durnov at intel.com>
+Dmitry Gladkov <dmitry.gladkov at intel.com>
 Erik Paulson <erik.r.paulson at intel.com>
 Evan Harvey <e1.0harvey at gmail.com>
 Evan Harvey <eharvey at cray.com>
@@ -24,22 +29,28 @@ Howard Pritchard <howardp at lanl.gov>
 James Dinan <james.dinan at intel.com>
 James Shimek <jshimek at cray.com>
 James Swaro <jswaro at cray.com>
+Jason Godfrey <godfrey at cray.com>
+Jason Gunthorpe <jgunthorpe at obsidianresearch.com>
 Jay Sternberg <jay.e.sternberg at intel.com>
 Jeff Hammond <jeff.science at gmail.com>
 Jeff Squyres <jsquyres at cisco.com>
 Jianxin Xiong <jianxin.xiong at intel.com>
 Jithin Jose <jithin.jose at intel.com>
 Joe Doyle <joseph.doyle at intel.com>
+Jonathan Behrens <fintelia at gmail.com>
 Ken Raffenetti <raffenet at mcs.anl.gov>
 kseager <kayla.seager at intel.com>
 Latchesar Ionkov <lionkov at lanl.gov>
+Martin Kontsek <mkontsek at cisco.com>
 Miao Luo <miao.luo at intel.com>
+Michael Chuvelev <michael.chuvelev at intel.com>
 Oblomov, Sergey <hoopoepg at gmail.com>
 Oblomov, Sergey <sergey.oblomov at intel.com>
 OFIWG Bot <ofiwg at lists.openfabrics.org>
 Paolo Inaudi <p91paul at gmail.com>
 Patrick MacArthur <pmacarth at iol.unh.edu>
 Patrick McCormick <patrick.m.mccormick at intel.com>
+Paul Coffman <pcoffman at anl.gov>
 Pierre Roux <piroux at cisco.com>
 Prankur Gupta <prankgup at cisco.com>
 Reese Faucette <rfaucett at cisco.com>
@@ -49,10 +60,13 @@ Sean Hefty <sean.hefty at intel.com>
 Sergey Oblomov <sergey.oblomov at intel.com>
 Shantonu Hossain <shantonu.hossain at intel.com>
 soblomov <sergey.oblomov at intel.com>
+Solovyev, Dmitriy <dmitriy.solovyev at intel.com>
 Stan Smith <stan.smith at intel.com>
+Steven Vormwald <sdvormwa at cray.com>
 Sung-Eun Choi <sungeunchoi at users.noreply.github.com>
 Sung-Eun Choi <sungeun at cray.com>
 Sylvain Didelot <didelot.sylvain at gmail.com>
+Thananon Patinyasakdikul <apatinya at cisco.com>
 Thomas Smith <thomasm2 at cisco.com>
 Tony Zinger <ajz at cray.com>
 Wesley Bland <wesley.bland at intel.com>
diff --git a/COPYING b/COPYING
index 9170682..7dabed6 100644
--- a/COPYING
+++ b/COPYING
@@ -3,8 +3,8 @@ licenses.  You may choose to be licensed under the terms of the the
 BSD license or the GNU General Public License (GPL) Version
 2, both included below.
 
-Copyright (c) 2015-2016 Intel Corporation.  All rights reserved.
-Copyright (c) 2015-2016 Cisco Systems, Inc.  All rights reserved.
+Copyright (c) 2015-2017 Intel Corporation.  All rights reserved.
+Copyright (c) 2015-2017 Cisco Systems, Inc.  All rights reserved.
 
 ==================================================================
 
diff --git a/Makefile.am b/Makefile.am
index cc323e3..a99913f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -5,7 +5,7 @@
 
 AM_CPPFLAGS = \
 	-I$(srcdir)/include \
-	-D_GNU_SOURCE \
+	-D_GNU_SOURCE -D__USE_XOPEN2K8 \
 	-DSYSCONFDIR=\"$(sysconfdir)\" \
 	-DRDMADIR=\"@rdmadir@\" \
 	-DPROVDLDIR=\"$(pkglibdir)\"
@@ -23,7 +23,7 @@ pkglib_LTLIBRARIES = $(DL_PROVIDERS)
 
 
 ACLOCAL_AMFLAGS = -I config
-AM_CFLAGS = -g -Wall
+AM_CFLAGS = -Wall
 
 if HAVE_LD_VERSION_SCRIPT
     libfabric_version_script = -Wl,--version-script=$(builddir)/libfabric.map
@@ -42,24 +42,24 @@ common_srcs = \
 	src/rbtree.c \
 	src/fasthash.c \
 	src/indexer.c \
+	src/iov.c \
+	prov/util/src/util_atomic.c \
 	prov/util/src/util_attr.c   \
 	prov/util/src/util_av.c     \
 	prov/util/src/util_cq.c     \
+	prov/util/src/util_cntr.c   \
 	prov/util/src/util_domain.c \
-	prov/util/src/util_ep.c \
+	prov/util/src/util_ep.c     \
 	prov/util/src/util_eq.c     \
 	prov/util/src/util_fabric.c \
 	prov/util/src/util_main.c   \
 	prov/util/src/util_poll.c   \
 	prov/util/src/util_wait.c   \
 	prov/util/src/util_buf.c    \
-	prov/util/src/util_mr.c
+	prov/util/src/util_mr.c     \
+	prov/util/src/util_ns.c
 
 if MACOS
-if !HAVE_CLOCK_GETTIME
-common_srcs += src/osx/osd.c
-endif
-
 common_srcs += src/unix/osd.c
 common_srcs += include/osx/osd.h
 common_srcs += include/unix/osd.h
@@ -99,6 +99,7 @@ util_fi_pingpong_SOURCES = \
 	util/pingpong.c
 util_fi_pingpong_LDADD = $(linkback)
 
+nodist_src_libfabric_la_SOURCES =
 src_libfabric_la_SOURCES = \
 	include/fi.h \
 	include/fi_abi.h \
@@ -106,6 +107,7 @@ src_libfabric_la_SOURCES = \
 	include/fi_enosys.h \
 	include/fi_file.h \
 	include/fi_indexer.h \
+	include/fi_iov.h \
 	include/fi_list.h \
 	include/fi_lock.h \
 	include/fi_mem.h \
@@ -114,6 +116,7 @@ src_libfabric_la_SOURCES = \
 	include/fi_rbuf.h \
 	include/fi_signal.h \
 	include/fi_util.h \
+	include/ofi_atomic.h \
 	include/fasthash.h \
 	include/rbtree.h \
 	include/prov.h \
@@ -123,6 +126,7 @@ src_libfabric_la_SOURCES = \
 	src/fi_tostr.c \
 	src/log.c \
 	src/var.c \
+	src/abi_1_0.c \
 	$(common_srcs)
 
 src_libfabric_la_CPPFLAGS = $(AM_CPPFLAGS)
@@ -130,7 +134,10 @@ src_libfabric_la_LDFLAGS =
 src_libfabric_la_LIBADD =
 src_libfabric_la_DEPENDENCIES = libfabric.map
 
-src_libfabric_la_LDFLAGS += -version-info 3:1:2 -export-dynamic \
+if !EMBEDDED
+src_libfabric_la_LDFLAGS += -version-info 10:2:9
+endif
+src_libfabric_la_LDFLAGS += -export-dynamic \
 			   $(libfabric_version_script)
 rdmainclude_HEADERS += \
 	$(top_srcdir)/include/rdma/fabric.h \
@@ -146,7 +153,6 @@ rdmainclude_HEADERS += \
 
 if HAVE_DIRECT
 nodist_rdmainclude_HEADERS = \
-	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct.h \
 	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_domain.h \
 	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_endpoint.h \
 	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_tagged.h \
@@ -156,6 +162,11 @@ nodist_rdmainclude_HEADERS = \
 	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_cm.h \
 	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_eq.h \
 	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_trigger.h
+if FI_DIRECT_H_IN
+nodist_rdmainclude_HEADERS += $(top_builddir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct.h
+else
+nodist_rdmainclude_HEADERS += $(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct.h
+endif
 endif HAVE_DIRECT
 
 real_man_pages = \
@@ -302,7 +313,7 @@ pkgconfig_DATA = libfabric.pc
 nroff:
 	@for file in $(real_man_pages) $(prov_install_man_pages); do \
 	    source=`echo $$file | sed -e 's@/man[0-9]@@'`; \
-	    config/md2nroff.pl --source=$$source.md; \
+	    $(top_srcdir)/config/md2nroff.pl --source=$(top_srcdir)/$$source.md; \
 	done
 
 dist-hook: libfabric.spec
@@ -327,10 +338,11 @@ include prov/verbs/Makefile.include
 include prov/usnic/Makefile.include
 include prov/psm/Makefile.include
 include prov/psm2/Makefile.include
-include prov/mxm/Makefile.include
 include prov/gni/Makefile.include
 include prov/rxm/Makefile.include
 include prov/rxd/Makefile.include
+include prov/bgq/Makefile.include
+include prov/mlx/Makefile.include
 
 man_MANS = $(real_man_pages) $(prov_install_man_pages) $(dummy_man_pages)
 
diff --git a/Makefile.in b/Makefile.in
index 6a34494..2a5c709 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.13.3 from Makefile.am.
+# Makefile.in generated by automake 1.15 from Makefile.am.
 # @configure_input@
 
-# Copyright (C) 1994-2013 Free Software Foundation, Inc.
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
 
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -22,7 +22,7 @@
 # Makefile.include for sockets provider
 
 #
-# Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+# Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
 #
 # This software is available to you under a choice of one of two
 # licenses.  You may choose to be licensed under the terms of the GNU
@@ -59,12 +59,54 @@
 
 # Makefile.am for gni provider
 
+#
+# Copyright (C) 2016 by Argonne National Laboratory.
+#
+# This software is available to you under a choice of one of two
+# licenses.  You may choose to be licensed under the terms of the GNU
+# General Public License (GPL) Version 2, available from the file
+# COPYING in the main directory of this source tree, or the
+# BSD license below:
+#
+#     Redistribution and use in source and binary forms, with or
+#     without modification, are permitted provided that the following
+#     conditions are met:
+#
+#      - Redistributions of source code must retain the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer.
+#
+#      - Redistributions in binary form must reproduce the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer in the documentation and/or other materials
+#        provided with the distribution.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
 
 
 
 
 VPATH = @srcdir@
-am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
 am__make_running_with_option = \
   case $${target_option-} in \
       ?) ;; \
@@ -129,104 +171,94 @@ build_triplet = @build@
 host_triplet = @host@
 @EMBEDDED_TRUE at am__append_1 = src/libfabric.la
 @EMBEDDED_FALSE at am__append_2 = src/libfabric.la
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__append_3 = src/osx/osd.c
- at MACOS_TRUE@am__append_4 = src/unix/osd.c include/osx/osd.h \
+ at MACOS_TRUE@am__append_3 = src/unix/osd.c include/osx/osd.h \
 @MACOS_TRUE@	include/unix/osd.h
- at FREEBSD_TRUE@am__append_5 = src/unix/osd.c include/freebsd/osd.h \
+ at FREEBSD_TRUE@am__append_4 = src/unix/osd.c include/freebsd/osd.h \
 @FREEBSD_TRUE@	include/unix/osd.h
- at LINUX_TRUE@am__append_6 = src/unix/osd.c include/linux/osd.h \
+ at LINUX_TRUE@am__append_5 = src/unix/osd.c include/linux/osd.h \
 @LINUX_TRUE@	include/unix/osd.h
 bin_PROGRAMS = util/fi_info$(EXEEXT) util/fi_strerror$(EXEEXT) \
 	util/fi_pingpong$(EXEEXT) $(am__EXEEXT_1)
+ at EMBEDDED_FALSE@am__append_6 = -version-info 10:2:9
+ at FI_DIRECT_H_IN_TRUE@@HAVE_DIRECT_TRUE at am__append_7 = $(top_builddir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct.h
+ at FI_DIRECT_H_IN_FALSE@@HAVE_DIRECT_TRUE at am__append_8 = $(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct.h
 TESTS = util/fi_info$(EXEEXT)
-DIST_COMMON = $(srcdir)/prov/sockets/Makefile.include \
-	$(srcdir)/prov/udp/Makefile.include \
-	$(srcdir)/prov/verbs/Makefile.include \
-	$(srcdir)/prov/usnic/Makefile.include \
-	$(srcdir)/prov/psm/Makefile.include \
-	$(srcdir)/prov/psm2/Makefile.include \
-	$(srcdir)/prov/mxm/Makefile.include \
-	$(srcdir)/prov/gni/Makefile.include \
-	$(srcdir)/prov/rxm/Makefile.include \
-	$(srcdir)/prov/rxd/Makefile.include $(srcdir)/Makefile.in \
-	$(srcdir)/Makefile.am $(top_srcdir)/configure \
-	$(am__configure_deps) $(srcdir)/config.h.in \
-	$(srcdir)/libfabric.pc.in $(srcdir)/libfabric.spec.in \
-	$(srcdir)/libfabric.map.in $(top_srcdir)/config/depcomp \
-	$(am__rdmainclude_HEADERS_DIST) \
-	$(top_srcdir)/config/test-driver AUTHORS COPYING README \
-	config/ar-lib config/compile config/config.guess \
-	config/config.sub config/depcomp config/install-sh \
-	config/missing config/ltmain.sh $(top_srcdir)/config/ar-lib \
-	$(top_srcdir)/config/compile $(top_srcdir)/config/config.guess \
-	$(top_srcdir)/config/config.sub \
-	$(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \
-	$(top_srcdir)/config/missing
- at HAVE_SOCKETS_TRUE@am__append_7 = -I$(top_srcdir)/prov/sockets/include -I$(top_srcdir)/prov/sockets
- at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE at am__append_8 = libsockets-fi.la
- at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE at am__append_9 = $(_sockets_files) $(_sockets_headers)
- at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE at am__append_10 = $(sockets_LIBS)
- at HAVE_SOCKETS_TRUE@am__append_11 = man/man7/fi_sockets.7
- at HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE at am__append_12 = libudp-fi.la
- at HAVE_UDP_DL_FALSE@@HAVE_UDP_TRUE at am__append_13 = $(_udp_files)
- at HAVE_UDP_DL_FALSE@@HAVE_UDP_TRUE at am__append_14 = $(udp_shm_LIBS)
- at HAVE_UDP_TRUE@am__append_15 = man/man7/fi_udp.7
- at HAVE_VERBS_DL_TRUE@@HAVE_VERBS_TRUE at am__append_16 = libverbs-fi.la
- at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_17 = $(_verbs_files)
- at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_18 = $(verbs_CPPFLAGS)
- at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_19 = $(verbs_LDFLAGS)
- at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_20 = $(verbs_LIBS)
- at HAVE_VERBS_TRUE@am__append_21 = man/man7/fi_verbs.7
- at HAVE_USNIC_TRUE@@HAVE_VERBS_TRUE at am__append_22 = prov/usnic/src/usdf_fake_ibv.c
- at HAVE_USNIC_TRUE@am__append_23 = \
+ at HAVE_SOCKETS_TRUE@am__append_9 = -I$(top_srcdir)/prov/sockets/include -I$(top_srcdir)/prov/sockets
+ at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE at am__append_10 = libsockets-fi.la
+ at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE at am__append_11 = $(_sockets_files) $(_sockets_headers)
+ at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE at am__append_12 = $(sockets_LIBS)
+ at HAVE_SOCKETS_TRUE@am__append_13 = man/man7/fi_sockets.7
+ at HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE at am__append_14 = libudp-fi.la
+ at HAVE_UDP_DL_FALSE@@HAVE_UDP_TRUE at am__append_15 = $(_udp_files)
+ at HAVE_UDP_DL_FALSE@@HAVE_UDP_TRUE at am__append_16 = $(udp_shm_LIBS)
+ at HAVE_UDP_TRUE@am__append_17 = man/man7/fi_udp.7
+ at HAVE_VERBS_DL_TRUE@@HAVE_VERBS_TRUE at am__append_18 = libverbs-fi.la
+ at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_19 = $(_verbs_files)
+ at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_20 = $(verbs_CPPFLAGS)
+ at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_21 = $(verbs_LDFLAGS)
+ at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__append_22 = $(verbs_LIBS)
+ at HAVE_VERBS_TRUE@am__append_23 = man/man7/fi_verbs.7
+ at HAVE_USNIC_TRUE@@USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE at am__append_24 = prov/usnic/src/usdf_fake_ibv.c
+ at HAVE_USNIC_TRUE@am__append_25 = \
 @HAVE_USNIC_TRUE@	prov/usnic/src/fi_ext_usnic.h
 
- at HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE at am__append_24 = libusnic-fi.la
- at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_25 = $(_usnic_files)
- at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_26 = $(_usnic_cppflags)
- at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_27 = $(usnic_LDFLAGS)
- at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_28 = $(usnic_LIBS)
- at HAVE_USNIC_TRUE@am__append_29 = man/man7/fi_usnic.7
- at HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE at am__append_30 = libpsmx-fi.la
- at HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE at am__append_31 = libpsmx.la
- at HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE at am__append_32 = libpsmx.la
+ at HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE at am__append_26 = libusnic-fi.la
+ at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_27 = $(_usnic_files)
+ at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_28 = $(_usnic_cppflags)
+ at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_29 = $(usnic_LDFLAGS)
+ at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__append_30 = $(usnic_LIBS)
+ at HAVE_USNIC_TRUE@am__append_31 = man/man7/fi_usnic.7
+ at HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE at am__append_32 = libpsmx-fi.la
 @HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE at am__append_33 = libpsmx.la
- at HAVE_PSM_TRUE@am__append_34 = man/man7/fi_psm.7
- at HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE at am__append_35 = libpsmx2-fi.la
- at HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at am__append_36 = libpsmx2.la
- at HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at am__append_37 = libpsmx2.la
+ at HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE at am__append_34 = libpsmx.la
+ at HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE at am__append_35 = libpsmx.la
+ at HAVE_PSM_TRUE@am__append_36 = man/man7/fi_psm.7
+ at HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE at am__append_37 = libpsmx2-fi.la
 @HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at am__append_38 = libpsmx2.la
- at HAVE_PSM2_TRUE@am__append_39 = man/man7/fi_psm2.7
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at am__append_40 = libmlxm-fi.la
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE at am__append_41 = $(_mxm_files)
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE at am__append_42 = $(mxm_CPPFLAGS)
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE at am__append_43 = $(mxm_LDFLAGS)
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE at am__append_44 = $(mxm_LIBS)
- at HAVE_MXM_TRUE@am__append_45 = man/man7/fi_mxm.7
+ at HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at am__append_39 = libpsmx2.la
+ at HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at am__append_40 = libpsmx2.la
+ at HAVE_PSM2_TRUE@am__append_41 = man/man7/fi_psm2.7
 
 #
 # want to keep ccan in the include path seen in the
 # source code, so just add prov/gni to the include path
 # rather than prov/gni/ccan
 #
- at HAVE_GNI_TRUE@am__append_46 = -I$(top_srcdir)/prov/gni/include -I$(top_srcdir)/prov/gni
- at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at am__append_47 = prov/gni/test/gnitest
- at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at am__append_48 = prov/gni/test/run_gnitest
- at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE at am__append_49 = libgnix-fi.la
- at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_50 = $(_gni_files) $(_gni_headers)
- at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_51 = $(gni_CPPFLAGS)
- at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_52 = $(gni_LDFLAGS)
- at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_53 = $(gni_LIBS)
- at HAVE_GNI_TRUE@am__append_54 = \
+ at HAVE_GNI_TRUE@am__append_42 = -I$(top_srcdir)/prov/gni/include -I$(top_srcdir)/prov/gni
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at am__append_43 = prov/gni/test/gnitest
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at am__append_44 = prov/gni/test/run_gnitest
+ at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE at am__append_45 = libgnix-fi.la
+ at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_46 = $(_gni_files) $(_gni_headers)
+ at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_47 = $(gni_CPPFLAGS)
+ at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_48 = $(gni_LDFLAGS)
+ at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__append_49 = $(gni_LIBS)
+ at HAVE_GNI_TRUE@am__append_50 = \
 @HAVE_GNI_TRUE@	prov/gni/include/fi_ext_gni.h
 
- at HAVE_GNI_TRUE@am__append_55 = man/man7/fi_gni.7
- at HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE at am__append_56 = librxm-fi.la
- at HAVE_RXM_DL_FALSE@@HAVE_RXM_TRUE at am__append_57 = $(_rxm_files)
- at HAVE_RXM_DL_FALSE@@HAVE_RXM_TRUE at am__append_58 = $(rxm_shm_LIBS)
- at HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE at am__append_59 = librxd-fi.la
- at HAVE_RXD_DL_FALSE@@HAVE_RXD_TRUE at am__append_60 = $(_rxd_files)
- at HAVE_RXD_DL_FALSE@@HAVE_RXD_TRUE at am__append_61 = $(rxd_shm_LIBS)
+ at HAVE_GNI_TRUE@am__append_51 = man/man7/fi_gni.7
+ at HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE at am__append_52 = librxm-fi.la
+ at HAVE_RXM_DL_FALSE@@HAVE_RXM_TRUE at am__append_53 = $(_rxm_files)
+ at HAVE_RXM_DL_FALSE@@HAVE_RXM_TRUE at am__append_54 = $(rxm_shm_LIBS)
+ at HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE at am__append_55 = librxd-fi.la
+ at HAVE_RXD_DL_FALSE@@HAVE_RXD_TRUE at am__append_56 = $(_rxd_files)
+ at HAVE_RXD_DL_FALSE@@HAVE_RXD_TRUE at am__append_57 = $(rxd_shm_LIBS)
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at am__append_58 = libbgq-fi.la
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__append_59 = $(bgq_files)
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__append_60 = $(bgq_files_nodist)
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__append_61 = $(bgq_CPPFLAGS)
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__append_62 = $(bgq_LDFLAGS)
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__append_63 = $(bgq_LIBS)
+ at HAVE_BGQ_TRUE@sbin_PROGRAMS = fi_bgq_agent0$(EXEEXT) \
+ at HAVE_BGQ_TRUE@	fi_bgq_agent1$(EXEEXT)
+ at HAVE_BGQ_TRUE@test_PROGRAMS = l2atomic_fifo_perf$(EXEEXT) \
+ at HAVE_BGQ_TRUE@	spi_pingpong$(EXEEXT)
+ at HAVE_BGQ_TRUE@am__append_64 = man/man7/fi_bgq.7
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at am__append_65 = libmlx-fi.la
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE at am__append_66 = $(_mlx_files)
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE at am__append_67 = $(mlx_CPPFLAGS)
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE at am__append_68 = $(mlx_LDFLAGS)
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE at am__append_69 = $(mlx_LIBS)
+ at HAVE_MLX_TRUE@am__append_70 = man/man7/fi_mlx.7
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/fi_provider.m4 \
@@ -241,19 +273,29 @@ am__aclocal_m4_deps = $(top_srcdir)/config/fi_provider.m4 \
 	$(top_srcdir)/prov/sockets/configure.m4 \
 	$(top_srcdir)/prov/verbs/configure.m4 \
 	$(top_srcdir)/prov/usnic/configure.m4 \
-	$(top_srcdir)/prov/mxm/configure.m4 \
+	$(top_srcdir)/prov/mlx/configure.m4 \
 	$(top_srcdir)/prov/gni/configure.m4 \
 	$(top_srcdir)/config/fi_pkg.m4 \
 	$(top_srcdir)/prov/udp/configure.m4 \
 	$(top_srcdir)/prov/rxm/configure.m4 \
-	$(top_srcdir)/prov/rxd/configure.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/prov/rxd/configure.m4 \
+	$(top_srcdir)/prov/bgq/configure.m4 $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \
+	$(am__configure_deps) $(rdma_bgqinclude_HEADERS) \
+	$(am__rdmainclude_HEADERS_DIST) $(am__DIST_COMMON)
 am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
  configure.lineno config.status.lineno
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES = libfabric.pc libfabric.spec libfabric.map
+CONFIG_CLEAN_FILES = prov/psm/libfabric-psm.spec \
+	prov/psm2/libfabric-psm2.spec \
+	prov/sockets/libfabric-sockets.spec \
+	prov/verbs/libfabric-verbs.spec \
+	prov/usnic/libfabric-usnic.spec prov/udp/libfabric-udp.spec \
+	prov/bgq/include/rdma/fi_direct.h libfabric.pc libfabric.spec \
+	libfabric.map
 CONFIG_CLEAN_VPATH_FILES =
 am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
 am__vpath_adj = case $$p in \
@@ -283,60 +325,150 @@ am__uninstall_files_from_dir = { \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
 am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkglibdir)" \
-	"$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" \
+	"$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" \
+	"$(DESTDIR)$(testdir)" "$(DESTDIR)$(bindir)" \
 	"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" \
 	"$(DESTDIR)$(man7dir)" "$(DESTDIR)$(pkgconfigdir)" \
-	"$(DESTDIR)$(rdmaincludedir)" "$(DESTDIR)$(rdmaincludedir)"
+	"$(DESTDIR)$(rdma_bgqincludedir)" \
+	"$(DESTDIR)$(rdmaincludedir)" \
+	"$(DESTDIR)$(rdma_bgqincludedir)" \
+	"$(DESTDIR)$(rdmaincludedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES) \
 	$(pkglib_LTLIBRARIES)
-am__libgnix_fi_la_SOURCES_DIST = prov/gni/src/gnix_atomic.c \
-	prov/gni/src/gnix_av.c prov/gni/src/gnix_bitmap.c \
-	prov/gni/src/gnix_buddy_allocator.c prov/gni/src/gnix_cm.c \
-	prov/gni/src/gnix_cm_nic.c prov/gni/src/gnix_cntr.c \
-	prov/gni/src/gnix_cq.c prov/gni/src/gnix_datagram.c \
-	prov/gni/src/gnix_dom.c prov/gni/src/gnix_ep.c \
-	prov/gni/src/gnix_eq.c prov/gni/src/gnix_fabric.c \
-	prov/gni/src/gnix_freelist.c prov/gni/src/gnix_hashtable.c \
-	prov/gni/src/gnix_init.c prov/gni/src/gnix_mbox_allocator.c \
-	prov/gni/src/gnix_mr.c prov/gni/src/gnix_mr_cache.c \
-	prov/gni/src/gnix_mr_notifier.c prov/gni/src/gnix_msg.c \
-	prov/gni/src/gnix_nameserver.c prov/gni/src/gnix_nic.c \
-	prov/gni/src/gnix_poll.c prov/gni/src/gnix_queue.c \
-	prov/gni/src/gnix_rma.c prov/gni/src/gnix_tags.c \
-	prov/gni/src/gnix_trigger.c prov/gni/src/gnix_util.c \
-	prov/gni/src/gnix_vc.c prov/gni/src/gnix_vector.c \
-	prov/gni/src/gnix_xpmem.c prov/gni/src/gnix_wait.c \
-	prov/gni/include/fi_ext_gni.h prov/gni/include/gnix_atomic.h \
-	prov/gni/include/gnix_av.h prov/gni/include/gnix_bitmap.h \
-	prov/gni/include/gnix_buddy_allocator.h \
-	prov/gni/include/gnix_cm_nic.h prov/gni/include/gnix_cntr.h \
-	prov/gni/include/gnix_cq.h prov/gni/include/gnix_datagram.h \
-	prov/gni/include/gnix_ep.h prov/gni/include/gnix_eq.h \
-	prov/gni/include/gnix_freelist.h prov/gni/include/gnix.h \
-	prov/gni/include/gnix_hashtable.h \
-	prov/gni/include/gnix_mbox_allocator.h \
-	prov/gni/include/gnix_mr.h prov/gni/include/gnix_mr_cache.h \
-	prov/gni/include/gnix_mr_notifier.h \
-	prov/gni/include/gnix_msg.h prov/gni/include/gnix_nameserver.h \
-	prov/gni/include/gnix_nic.h prov/gni/include/gnix_poll.h \
-	prov/gni/include/gnix_priv.h prov/gni/include/gnix_queue.h \
-	prov/gni/include/gnix_rma.h prov/gni/include/gnix_tags.h \
-	prov/gni/include/gnix_trigger.h prov/gni/include/gnix_util.h \
-	prov/gni/include/gnix_vc.h prov/gni/include/gnix_vector.h \
-	prov/gni/include/gnix_xpmem.h prov/gni/include/gnix_wait.h \
+am__libbgq_fi_la_SOURCES_DIST = prov/bgq/src/fi_bgq_atomic.c \
+	prov/bgq/src/fi_bgq_av.c prov/bgq/src/fi_bgq_spi.c \
+	prov/bgq/src/fi_bgq_cm.c prov/bgq/src/fi_bgq_cntr.c \
+	prov/bgq/src/fi_bgq_cq.c prov/bgq/src/fi_bgq_domain.c \
+	prov/bgq/src/fi_bgq_ep.c prov/bgq/src/fi_bgq_fabric.c \
+	prov/bgq/src/fi_bgq_info.c prov/bgq/src/fi_bgq_init.c \
+	prov/bgq/src/fi_bgq_mr.c prov/bgq/src/fi_bgq_msg.c \
+	prov/bgq/src/fi_bgq_rma.c prov/bgq/src/fi_bgq_sep.c \
+	prov/bgq/src/fi_bgq_tagged.c prov/bgq/src/fi_bgq_node.c \
+	prov/bgq/src/fi_bgq_progress.c prov/bgq/src/fi_bgq_pmi.c \
 	src/common.c src/enosys.c src/rbtree.c src/fasthash.c \
-	src/indexer.c prov/util/src/util_attr.c \
-	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	src/indexer.c src/iov.c prov/util/src/util_atomic.c \
+	prov/util/src/util_attr.c prov/util/src/util_av.c \
+	prov/util/src/util_cq.c prov/util/src/util_cntr.c \
 	prov/util/src/util_domain.c prov/util/src/util_ep.c \
 	prov/util/src/util_eq.c prov/util/src/util_fabric.c \
 	prov/util/src/util_main.c prov/util/src/util_poll.c \
 	prov/util/src/util_wait.c prov/util/src/util_buf.c \
-	prov/util/src/util_mr.c src/osx/osd.c src/unix/osd.c \
+	prov/util/src/util_mr.c prov/util/src/util_ns.c src/unix/osd.c \
 	include/osx/osd.h include/unix/osd.h include/freebsd/osd.h \
 	include/linux/osd.h
 am__dirstamp = $(am__leading_dot)dirstamp
- at HAVE_GNI_TRUE@am__objects_1 =  \
+ at HAVE_BGQ_TRUE@am__objects_1 =  \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo
+ at MACOS_TRUE@am__objects_2 = src/unix/libbgq_fi_la-osd.lo
+ at FREEBSD_TRUE@am__objects_3 = src/unix/libbgq_fi_la-osd.lo
+ at LINUX_TRUE@am__objects_4 = src/unix/libbgq_fi_la-osd.lo
+am__objects_5 = src/libbgq_fi_la-common.lo src/libbgq_fi_la-enosys.lo \
+	src/libbgq_fi_la-rbtree.lo src/libbgq_fi_la-fasthash.lo \
+	src/libbgq_fi_la-indexer.lo src/libbgq_fi_la-iov.lo \
+	prov/util/src/libbgq_fi_la-util_atomic.lo \
+	prov/util/src/libbgq_fi_la-util_attr.lo \
+	prov/util/src/libbgq_fi_la-util_av.lo \
+	prov/util/src/libbgq_fi_la-util_cq.lo \
+	prov/util/src/libbgq_fi_la-util_cntr.lo \
+	prov/util/src/libbgq_fi_la-util_domain.lo \
+	prov/util/src/libbgq_fi_la-util_ep.lo \
+	prov/util/src/libbgq_fi_la-util_eq.lo \
+	prov/util/src/libbgq_fi_la-util_fabric.lo \
+	prov/util/src/libbgq_fi_la-util_main.lo \
+	prov/util/src/libbgq_fi_la-util_poll.lo \
+	prov/util/src/libbgq_fi_la-util_wait.lo \
+	prov/util/src/libbgq_fi_la-util_buf.lo \
+	prov/util/src/libbgq_fi_la-util_mr.lo \
+	prov/util/src/libbgq_fi_la-util_ns.lo $(am__objects_2) \
+	$(am__objects_3) $(am__objects_4)
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at am_libbgq_fi_la_OBJECTS =  \
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE@	$(am__objects_1) \
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE@	$(am__objects_5)
+ at HAVE_BGQ_TRUE@am__objects_6 =  \
+ at HAVE_BGQ_TRUE@	prov/bgq/external/libbgq_fi_la-memory_impl.lo
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at nodist_libbgq_fi_la_OBJECTS =  \
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE@	$(am__objects_6)
+libbgq_fi_la_OBJECTS = $(am_libbgq_fi_la_OBJECTS) \
+	$(nodist_libbgq_fi_la_OBJECTS)
+AM_V_lt = $(am__v_lt_ at AM_V@)
+am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libbgq_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(libbgq_fi_la_LDFLAGS) $(LDFLAGS) -o $@
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at am_libbgq_fi_la_rpath = -rpath \
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE@	$(pkglibdir)
+am__libgnix_fi_la_SOURCES_DIST = prov/gni/src/gnix_atomic.c \
+	prov/gni/src/gnix_auth_key.c prov/gni/src/gnix_av.c \
+	prov/gni/src/gnix_bitmap.c prov/gni/src/gnix_buddy_allocator.c \
+	prov/gni/src/gnix_cm.c prov/gni/src/gnix_cm_nic.c \
+	prov/gni/src/gnix_cntr.c prov/gni/src/gnix_cq.c \
+	prov/gni/src/gnix_datagram.c prov/gni/src/gnix_dom.c \
+	prov/gni/src/gnix_ep.c prov/gni/src/gnix_eq.c \
+	prov/gni/src/gnix_fabric.c prov/gni/src/gnix_freelist.c \
+	prov/gni/src/gnix_hashtable.c prov/gni/src/gnix_init.c \
+	prov/gni/src/gnix_mbox_allocator.c prov/gni/src/gnix_mr.c \
+	prov/gni/src/gnix_mr_cache.c prov/gni/src/gnix_mr_notifier.c \
+	prov/gni/src/gnix_msg.c prov/gni/src/gnix_nameserver.c \
+	prov/gni/src/gnix_nic.c prov/gni/src/gnix_poll.c \
+	prov/gni/src/gnix_progress.c prov/gni/src/gnix_queue.c \
+	prov/gni/src/gnix_rma.c prov/gni/src/gnix_sep.c \
+	prov/gni/src/gnix_tags.c prov/gni/src/gnix_trigger.c \
+	prov/gni/src/gnix_util.c prov/gni/src/gnix_vc.c \
+	prov/gni/src/gnix_vector.c prov/gni/src/gnix_xpmem.c \
+	prov/gni/src/gnix_wait.c prov/gni/include/fi_ext_gni.h \
+	prov/gni/include/gnix_atomic.h \
+	prov/gni/include/gnix_auth_key.h prov/gni/include/gnix_av.h \
+	prov/gni/include/gnix_bitmap.h \
+	prov/gni/include/gnix_buddy_allocator.h \
+	prov/gni/include/gnix_cm.h prov/gni/include/gnix_cm_nic.h \
+	prov/gni/include/gnix_cntr.h prov/gni/include/gnix_cq.h \
+	prov/gni/include/gnix_datagram.h prov/gni/include/gnix_ep.h \
+	prov/gni/include/gnix_eq.h prov/gni/include/gnix_freelist.h \
+	prov/gni/include/gnix.h prov/gni/include/gnix_hashtable.h \
+	prov/gni/include/gnix_mbox_allocator.h \
+	prov/gni/include/gnix_mr.h prov/gni/include/gnix_mr_cache.h \
+	prov/gni/include/gnix_mr_notifier.h \
+	prov/gni/include/gnix_msg.h prov/gni/include/gnix_nameserver.h \
+	prov/gni/include/gnix_nic.h prov/gni/include/gnix_poll.h \
+	prov/gni/include/gnix_progress.h prov/gni/include/gnix_priv.h \
+	prov/gni/include/gnix_queue.h prov/gni/include/gnix_rma.h \
+	prov/gni/include/gnix_tags.h prov/gni/include/gnix_trigger.h \
+	prov/gni/include/gnix_util.h prov/gni/include/gnix_vc.h \
+	prov/gni/include/gnix_vector.h prov/gni/include/gnix_xpmem.h \
+	prov/gni/include/gnix_wait.h src/common.c src/enosys.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
+	prov/util/src/util_ep.c prov/util/src/util_eq.c \
+	prov/util/src/util_fabric.c prov/util/src/util_main.c \
+	prov/util/src/util_poll.c prov/util/src/util_wait.c \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
+ at HAVE_GNI_TRUE@am__objects_7 =  \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_atomic.lo \
+ at HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_auth_key.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_av.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_bitmap.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_buddy_allocator.lo \
@@ -360,8 +492,10 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_nameserver.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_nic.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_poll.lo \
+ at HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_progress.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_queue.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_rma.lo \
+ at HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_sep.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_tags.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_trigger.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_util.lo \
@@ -369,17 +503,19 @@ am__dirstamp = $(am__leading_dot)dirstamp
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_vector.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_xpmem.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/libgnix_fi_la-gnix_wait.lo
-am__objects_2 =
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_3 = src/osx/libgnix_fi_la-osd.lo
- at MACOS_TRUE@am__objects_4 = src/unix/libgnix_fi_la-osd.lo
- at FREEBSD_TRUE@am__objects_5 = src/unix/libgnix_fi_la-osd.lo
- at LINUX_TRUE@am__objects_6 = src/unix/libgnix_fi_la-osd.lo
-am__objects_7 = src/libgnix_fi_la-common.lo \
+am__objects_8 =
+ at MACOS_TRUE@am__objects_9 = src/unix/libgnix_fi_la-osd.lo
+ at FREEBSD_TRUE@am__objects_10 = src/unix/libgnix_fi_la-osd.lo
+ at LINUX_TRUE@am__objects_11 = src/unix/libgnix_fi_la-osd.lo
+am__objects_12 = src/libgnix_fi_la-common.lo \
 	src/libgnix_fi_la-enosys.lo src/libgnix_fi_la-rbtree.lo \
 	src/libgnix_fi_la-fasthash.lo src/libgnix_fi_la-indexer.lo \
+	src/libgnix_fi_la-iov.lo \
+	prov/util/src/libgnix_fi_la-util_atomic.lo \
 	prov/util/src/libgnix_fi_la-util_attr.lo \
 	prov/util/src/libgnix_fi_la-util_av.lo \
 	prov/util/src/libgnix_fi_la-util_cq.lo \
+	prov/util/src/libgnix_fi_la-util_cntr.lo \
 	prov/util/src/libgnix_fi_la-util_domain.lo \
 	prov/util/src/libgnix_fi_la-util_ep.lo \
 	prov/util/src/libgnix_fi_la-util_eq.lo \
@@ -388,77 +524,76 @@ am__objects_7 = src/libgnix_fi_la-common.lo \
 	prov/util/src/libgnix_fi_la-util_poll.lo \
 	prov/util/src/libgnix_fi_la-util_wait.lo \
 	prov/util/src/libgnix_fi_la-util_buf.lo \
-	prov/util/src/libgnix_fi_la-util_mr.lo $(am__objects_3) \
-	$(am__objects_4) $(am__objects_5) $(am__objects_6)
+	prov/util/src/libgnix_fi_la-util_mr.lo \
+	prov/util/src/libgnix_fi_la-util_ns.lo $(am__objects_9) \
+	$(am__objects_10) $(am__objects_11)
 @HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE at am_libgnix_fi_la_OBJECTS =  \
- at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(am__objects_1) \
- at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(am__objects_2) \
- at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(am__objects_7)
+ at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(am__objects_7) \
+ at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(am__objects_8) \
+ at HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(am__objects_12)
 libgnix_fi_la_OBJECTS = $(am_libgnix_fi_la_OBJECTS)
-AM_V_lt = $(am__v_lt_ at AM_V@)
-am__v_lt_ = $(am__v_lt_ at AM_DEFAULT_V@)
-am__v_lt_0 = --silent
-am__v_lt_1 = 
 libgnix_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(libgnix_fi_la_LDFLAGS) $(LDFLAGS) -o $@
 @HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE at am_libgnix_fi_la_rpath = -rpath \
 @HAVE_GNI_DL_TRUE@@HAVE_GNI_TRUE@	$(pkglibdir)
 am__DEPENDENCIES_1 =
-am__libmlxm_fi_la_SOURCES_DIST = prov/mxm/src/mlxm.h \
-	prov/mxm/src/uthash.h prov/mxm/src/mpool.h \
-	prov/mxm/src/mlxm_mq_storage.h prov/mxm/src/mlxm_helpers.h \
-	prov/mxm/src/mlxm_init.c prov/mxm/src/mlxm_domain.c \
-	prov/mxm/src/mlxm_cq.c prov/mxm/src/mlxm_av.c \
-	prov/mxm/src/mlxm_ep.c prov/mxm/src/mlxm_cm.c \
-	prov/mxm/src/mlxm_tagged.c prov/mxm/src/mlxm_mr.c src/common.c \
-	src/enosys.c src/rbtree.c src/fasthash.c src/indexer.c \
-	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
+am__libmlx_fi_la_SOURCES_DIST = prov/mlx/src/mlx.h \
+	prov/mlx/src/mlx_av.c prov/mlx/src/mlx_cm.c \
+	prov/mlx/src/mlx_cq.c prov/mlx/src/mlx_domain.c \
+	prov/mlx/src/mlx_ep.c prov/mlx/src/mlx_init.c \
+	prov/mlx/src/mlx_tagged.c prov/mlx/src/mlx_fabric.c \
+	prov/mlx/src/mlx_callbacks.c src/common.c src/enosys.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
 	prov/util/src/util_ep.c prov/util/src/util_eq.c \
 	prov/util/src/util_fabric.c prov/util/src/util_main.c \
 	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
- at HAVE_MXM_TRUE@am__objects_8 =  \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_init.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_av.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_9 = src/osx/libmlxm_fi_la-osd.lo
- at MACOS_TRUE@am__objects_10 = src/unix/libmlxm_fi_la-osd.lo
- at FREEBSD_TRUE@am__objects_11 = src/unix/libmlxm_fi_la-osd.lo
- at LINUX_TRUE@am__objects_12 = src/unix/libmlxm_fi_la-osd.lo
-am__objects_13 = src/libmlxm_fi_la-common.lo \
-	src/libmlxm_fi_la-enosys.lo src/libmlxm_fi_la-rbtree.lo \
-	src/libmlxm_fi_la-fasthash.lo src/libmlxm_fi_la-indexer.lo \
-	prov/util/src/libmlxm_fi_la-util_attr.lo \
-	prov/util/src/libmlxm_fi_la-util_av.lo \
-	prov/util/src/libmlxm_fi_la-util_cq.lo \
-	prov/util/src/libmlxm_fi_la-util_domain.lo \
-	prov/util/src/libmlxm_fi_la-util_ep.lo \
-	prov/util/src/libmlxm_fi_la-util_eq.lo \
-	prov/util/src/libmlxm_fi_la-util_fabric.lo \
-	prov/util/src/libmlxm_fi_la-util_main.lo \
-	prov/util/src/libmlxm_fi_la-util_poll.lo \
-	prov/util/src/libmlxm_fi_la-util_wait.lo \
-	prov/util/src/libmlxm_fi_la-util_buf.lo \
-	prov/util/src/libmlxm_fi_la-util_mr.lo $(am__objects_9) \
-	$(am__objects_10) $(am__objects_11) $(am__objects_12)
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at am_libmlxm_fi_la_OBJECTS =  \
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE@	$(am__objects_8) \
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE@	$(am__objects_13)
-libmlxm_fi_la_OBJECTS = $(am_libmlxm_fi_la_OBJECTS)
-libmlxm_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
+ at HAVE_MLX_TRUE@am__objects_13 = prov/mlx/src/libmlx_fi_la-mlx_av.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_cm.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_cq.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_domain.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_ep.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_init.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_tagged.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_fabric.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo
+ at MACOS_TRUE@am__objects_14 = src/unix/libmlx_fi_la-osd.lo
+ at FREEBSD_TRUE@am__objects_15 = src/unix/libmlx_fi_la-osd.lo
+ at LINUX_TRUE@am__objects_16 = src/unix/libmlx_fi_la-osd.lo
+am__objects_17 = src/libmlx_fi_la-common.lo src/libmlx_fi_la-enosys.lo \
+	src/libmlx_fi_la-rbtree.lo src/libmlx_fi_la-fasthash.lo \
+	src/libmlx_fi_la-indexer.lo src/libmlx_fi_la-iov.lo \
+	prov/util/src/libmlx_fi_la-util_atomic.lo \
+	prov/util/src/libmlx_fi_la-util_attr.lo \
+	prov/util/src/libmlx_fi_la-util_av.lo \
+	prov/util/src/libmlx_fi_la-util_cq.lo \
+	prov/util/src/libmlx_fi_la-util_cntr.lo \
+	prov/util/src/libmlx_fi_la-util_domain.lo \
+	prov/util/src/libmlx_fi_la-util_ep.lo \
+	prov/util/src/libmlx_fi_la-util_eq.lo \
+	prov/util/src/libmlx_fi_la-util_fabric.lo \
+	prov/util/src/libmlx_fi_la-util_main.lo \
+	prov/util/src/libmlx_fi_la-util_poll.lo \
+	prov/util/src/libmlx_fi_la-util_wait.lo \
+	prov/util/src/libmlx_fi_la-util_buf.lo \
+	prov/util/src/libmlx_fi_la-util_mr.lo \
+	prov/util/src/libmlx_fi_la-util_ns.lo $(am__objects_14) \
+	$(am__objects_15) $(am__objects_16)
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at am_libmlx_fi_la_OBJECTS =  \
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE@	$(am__objects_13) \
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE@	$(am__objects_17)
+libmlx_fi_la_OBJECTS = $(am_libmlx_fi_la_OBJECTS)
+libmlx_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(libmlxm_fi_la_LDFLAGS) $(LDFLAGS) -o $@
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at am_libmlxm_fi_la_rpath = -rpath \
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE@	$(pkglibdir)
+	$(libmlx_fi_la_LDFLAGS) $(LDFLAGS) -o $@
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at am_libmlx_fi_la_rpath = -rpath \
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE@	$(pkglibdir)
 am__libpsmx_fi_la_SOURCES_DIST = prov/psm/src/version.h \
 	prov/psm/src/psm_am.h prov/psm/src/psmx.h \
 	prov/psm/src/psmx_init.c prov/psm/src/psmx_fabric.c \
@@ -470,16 +605,17 @@ am__libpsmx_fi_la_SOURCES_DIST = prov/psm/src/version.h \
 	prov/psm/src/psmx_atomic.c prov/psm/src/psmx_am.c \
 	prov/psm/src/psmx_mr.c prov/psm/src/psmx_wait.c \
 	prov/psm/src/psmx_util.c src/common.c src/enosys.c \
-	src/rbtree.c src/fasthash.c src/indexer.c \
-	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
 	prov/util/src/util_ep.c prov/util/src/util_eq.c \
 	prov/util/src/util_fabric.c prov/util/src/util_main.c \
 	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
- at HAVE_PSM_TRUE@am__objects_14 =  \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
+ at HAVE_PSM_TRUE@am__objects_18 =  \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_fi_la-psmx_init.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_fi_la-psmx_fabric.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_fi_la-psmx_domain.lo \
@@ -497,16 +633,18 @@ am__libpsmx_fi_la_SOURCES_DIST = prov/psm/src/version.h \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_fi_la-psmx_mr.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_fi_la-psmx_wait.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_fi_la-psmx_util.lo
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_15 = src/osx/libpsmx_fi_la-osd.lo
- at MACOS_TRUE@am__objects_16 = src/unix/libpsmx_fi_la-osd.lo
- at FREEBSD_TRUE@am__objects_17 = src/unix/libpsmx_fi_la-osd.lo
- at LINUX_TRUE@am__objects_18 = src/unix/libpsmx_fi_la-osd.lo
-am__objects_19 = src/libpsmx_fi_la-common.lo \
+ at MACOS_TRUE@am__objects_19 = src/unix/libpsmx_fi_la-osd.lo
+ at FREEBSD_TRUE@am__objects_20 = src/unix/libpsmx_fi_la-osd.lo
+ at LINUX_TRUE@am__objects_21 = src/unix/libpsmx_fi_la-osd.lo
+am__objects_22 = src/libpsmx_fi_la-common.lo \
 	src/libpsmx_fi_la-enosys.lo src/libpsmx_fi_la-rbtree.lo \
 	src/libpsmx_fi_la-fasthash.lo src/libpsmx_fi_la-indexer.lo \
+	src/libpsmx_fi_la-iov.lo \
+	prov/util/src/libpsmx_fi_la-util_atomic.lo \
 	prov/util/src/libpsmx_fi_la-util_attr.lo \
 	prov/util/src/libpsmx_fi_la-util_av.lo \
 	prov/util/src/libpsmx_fi_la-util_cq.lo \
+	prov/util/src/libpsmx_fi_la-util_cntr.lo \
 	prov/util/src/libpsmx_fi_la-util_domain.lo \
 	prov/util/src/libpsmx_fi_la-util_ep.lo \
 	prov/util/src/libpsmx_fi_la-util_eq.lo \
@@ -515,11 +653,12 @@ am__objects_19 = src/libpsmx_fi_la-common.lo \
 	prov/util/src/libpsmx_fi_la-util_poll.lo \
 	prov/util/src/libpsmx_fi_la-util_wait.lo \
 	prov/util/src/libpsmx_fi_la-util_buf.lo \
-	prov/util/src/libpsmx_fi_la-util_mr.lo $(am__objects_15) \
-	$(am__objects_16) $(am__objects_17) $(am__objects_18)
+	prov/util/src/libpsmx_fi_la-util_mr.lo \
+	prov/util/src/libpsmx_fi_la-util_ns.lo $(am__objects_19) \
+	$(am__objects_20) $(am__objects_21)
 @HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE at am_libpsmx_fi_la_OBJECTS =  \
- at HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE@	$(am__objects_14) \
- at HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE@	$(am__objects_19)
+ at HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE@	$(am__objects_18) \
+ at HAVE_PSM_DL_TRUE@@HAVE_PSM_TRUE@	$(am__objects_22)
 libpsmx_fi_la_OBJECTS = $(am_libpsmx_fi_la_OBJECTS)
 libpsmx_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -539,7 +678,7 @@ am__libpsmx_la_SOURCES_DIST = prov/psm/src/version.h \
 	prov/psm/src/psmx_atomic.c prov/psm/src/psmx_am.c \
 	prov/psm/src/psmx_mr.c prov/psm/src/psmx_wait.c \
 	prov/psm/src/psmx_util.c
- at HAVE_PSM_TRUE@am__objects_20 = prov/psm/src/libpsmx_la-psmx_init.lo \
+ at HAVE_PSM_TRUE@am__objects_23 = prov/psm/src/libpsmx_la-psmx_init.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_la-psmx_fabric.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_la-psmx_domain.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_la-psmx_cq.lo \
@@ -557,7 +696,7 @@ am__libpsmx_la_SOURCES_DIST = prov/psm/src/version.h \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_la-psmx_wait.lo \
 @HAVE_PSM_TRUE@	prov/psm/src/libpsmx_la-psmx_util.lo
 @HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE at am_libpsmx_la_OBJECTS =  \
- at HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE@	$(am__objects_20)
+ at HAVE_PSM_DL_FALSE@@HAVE_PSM_TRUE@	$(am__objects_23)
 libpsmx_la_OBJECTS = $(am_libpsmx_la_OBJECTS)
 libpsmx_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -573,16 +712,17 @@ am__libpsmx2_fi_la_SOURCES_DIST = prov/psm2/src/version.h \
 	prov/psm2/src/psmx2_atomic.c prov/psm2/src/psmx2_am.c \
 	prov/psm2/src/psmx2_mr.c prov/psm2/src/psmx2_wait.c \
 	prov/psm2/src/psmx2_util.c src/common.c src/enosys.c \
-	src/rbtree.c src/fasthash.c src/indexer.c \
-	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
 	prov/util/src/util_ep.c prov/util/src/util_eq.c \
 	prov/util/src/util_fabric.c prov/util/src/util_main.c \
 	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
- at HAVE_PSM2_TRUE@am__objects_21 =  \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
+ at HAVE_PSM2_TRUE@am__objects_24 =  \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_fi_la-psmx2_init.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_fi_la-psmx2_fabric.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_fi_la-psmx2_domain.lo \
@@ -599,16 +739,18 @@ am__libpsmx2_fi_la_SOURCES_DIST = prov/psm2/src/version.h \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_fi_la-psmx2_mr.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_fi_la-psmx2_wait.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_fi_la-psmx2_util.lo
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_22 = src/osx/libpsmx2_fi_la-osd.lo
- at MACOS_TRUE@am__objects_23 = src/unix/libpsmx2_fi_la-osd.lo
- at FREEBSD_TRUE@am__objects_24 = src/unix/libpsmx2_fi_la-osd.lo
- at LINUX_TRUE@am__objects_25 = src/unix/libpsmx2_fi_la-osd.lo
-am__objects_26 = src/libpsmx2_fi_la-common.lo \
+ at MACOS_TRUE@am__objects_25 = src/unix/libpsmx2_fi_la-osd.lo
+ at FREEBSD_TRUE@am__objects_26 = src/unix/libpsmx2_fi_la-osd.lo
+ at LINUX_TRUE@am__objects_27 = src/unix/libpsmx2_fi_la-osd.lo
+am__objects_28 = src/libpsmx2_fi_la-common.lo \
 	src/libpsmx2_fi_la-enosys.lo src/libpsmx2_fi_la-rbtree.lo \
 	src/libpsmx2_fi_la-fasthash.lo src/libpsmx2_fi_la-indexer.lo \
+	src/libpsmx2_fi_la-iov.lo \
+	prov/util/src/libpsmx2_fi_la-util_atomic.lo \
 	prov/util/src/libpsmx2_fi_la-util_attr.lo \
 	prov/util/src/libpsmx2_fi_la-util_av.lo \
 	prov/util/src/libpsmx2_fi_la-util_cq.lo \
+	prov/util/src/libpsmx2_fi_la-util_cntr.lo \
 	prov/util/src/libpsmx2_fi_la-util_domain.lo \
 	prov/util/src/libpsmx2_fi_la-util_ep.lo \
 	prov/util/src/libpsmx2_fi_la-util_eq.lo \
@@ -617,11 +759,12 @@ am__objects_26 = src/libpsmx2_fi_la-common.lo \
 	prov/util/src/libpsmx2_fi_la-util_poll.lo \
 	prov/util/src/libpsmx2_fi_la-util_wait.lo \
 	prov/util/src/libpsmx2_fi_la-util_buf.lo \
-	prov/util/src/libpsmx2_fi_la-util_mr.lo $(am__objects_22) \
-	$(am__objects_23) $(am__objects_24) $(am__objects_25)
+	prov/util/src/libpsmx2_fi_la-util_mr.lo \
+	prov/util/src/libpsmx2_fi_la-util_ns.lo $(am__objects_25) \
+	$(am__objects_26) $(am__objects_27)
 @HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE at am_libpsmx2_fi_la_OBJECTS =  \
- at HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE@	$(am__objects_21) \
- at HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE@	$(am__objects_26)
+ at HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE@	$(am__objects_24) \
+ at HAVE_PSM2_DL_TRUE@@HAVE_PSM2_TRUE@	$(am__objects_28)
 libpsmx2_fi_la_OBJECTS = $(am_libpsmx2_fi_la_OBJECTS)
 libpsmx2_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -641,7 +784,7 @@ am__libpsmx2_la_SOURCES_DIST = prov/psm2/src/version.h \
 	prov/psm2/src/psmx2_atomic.c prov/psm2/src/psmx2_am.c \
 	prov/psm2/src/psmx2_mr.c prov/psm2/src/psmx2_wait.c \
 	prov/psm2/src/psmx2_util.c
- at HAVE_PSM2_TRUE@am__objects_27 =  \
+ at HAVE_PSM2_TRUE@am__objects_29 =  \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_la-psmx2_init.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_la-psmx2_fabric.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_la-psmx2_domain.lo \
@@ -659,7 +802,7 @@ am__libpsmx2_la_SOURCES_DIST = prov/psm2/src/version.h \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_la-psmx2_wait.lo \
 @HAVE_PSM2_TRUE@	prov/psm2/src/libpsmx2_la-psmx2_util.lo
 @HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at am_libpsmx2_la_OBJECTS =  \
- at HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE@	$(am__objects_27)
+ at HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE@	$(am__objects_29)
 libpsmx2_la_OBJECTS = $(am_libpsmx2_la_OBJECTS)
 libpsmx2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -668,39 +811,43 @@ libpsmx2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 am__librxd_fi_la_SOURCES_DIST = prov/rxd/src/rxd_attr.c \
 	prov/rxd/src/rxd_init.c prov/rxd/src/rxd_fabric.c \
 	prov/rxd/src/rxd_domain.c prov/rxd/src/rxd_av.c \
-	prov/rxd/src/rxd_cq.c prov/rxd/src/rxd_ep.c \
-	prov/rxd/src/rxd_rma.c prov/rxd/src/rxd.h src/common.c \
-	src/enosys.c src/rbtree.c src/fasthash.c src/indexer.c \
-	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
+	prov/rxd/src/rxd_cq.c prov/rxd/src/rxd_cntr.c \
+	prov/rxd/src/rxd_ep.c prov/rxd/src/rxd_rma.c \
+	prov/rxd/src/rxd.h src/common.c src/enosys.c src/rbtree.c \
+	src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
 	prov/util/src/util_ep.c prov/util/src/util_eq.c \
 	prov/util/src/util_fabric.c prov/util/src/util_main.c \
 	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
- at HAVE_RXD_TRUE@am__objects_28 = prov/rxd/src/rxd_attr.lo \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
+ at HAVE_RXD_TRUE@am__objects_30 = prov/rxd/src/rxd_attr.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_init.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_fabric.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_domain.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_av.lo prov/rxd/src/rxd_cq.lo \
- at HAVE_RXD_TRUE@	prov/rxd/src/rxd_ep.lo prov/rxd/src/rxd_rma.lo
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_29 = src/osx/osd.lo
- at MACOS_TRUE@am__objects_30 = src/unix/osd.lo
- at FREEBSD_TRUE@am__objects_31 = src/unix/osd.lo
- at LINUX_TRUE@am__objects_32 = src/unix/osd.lo
-am__objects_33 = src/common.lo src/enosys.lo src/rbtree.lo \
-	src/fasthash.lo src/indexer.lo prov/util/src/util_attr.lo \
+ at HAVE_RXD_TRUE@	prov/rxd/src/rxd_cntr.lo prov/rxd/src/rxd_ep.lo \
+ at HAVE_RXD_TRUE@	prov/rxd/src/rxd_rma.lo
+ at MACOS_TRUE@am__objects_31 = src/unix/osd.lo
+ at FREEBSD_TRUE@am__objects_32 = src/unix/osd.lo
+ at LINUX_TRUE@am__objects_33 = src/unix/osd.lo
+am__objects_34 = src/common.lo src/enosys.lo src/rbtree.lo \
+	src/fasthash.lo src/indexer.lo src/iov.lo \
+	prov/util/src/util_atomic.lo prov/util/src/util_attr.lo \
 	prov/util/src/util_av.lo prov/util/src/util_cq.lo \
-	prov/util/src/util_domain.lo prov/util/src/util_ep.lo \
-	prov/util/src/util_eq.lo prov/util/src/util_fabric.lo \
-	prov/util/src/util_main.lo prov/util/src/util_poll.lo \
-	prov/util/src/util_wait.lo prov/util/src/util_buf.lo \
-	prov/util/src/util_mr.lo $(am__objects_29) $(am__objects_30) \
-	$(am__objects_31) $(am__objects_32)
+	prov/util/src/util_cntr.lo prov/util/src/util_domain.lo \
+	prov/util/src/util_ep.lo prov/util/src/util_eq.lo \
+	prov/util/src/util_fabric.lo prov/util/src/util_main.lo \
+	prov/util/src/util_poll.lo prov/util/src/util_wait.lo \
+	prov/util/src/util_buf.lo prov/util/src/util_mr.lo \
+	prov/util/src/util_ns.lo $(am__objects_31) $(am__objects_32) \
+	$(am__objects_33)
 @HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE at am_librxd_fi_la_OBJECTS =  \
- at HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE@	$(am__objects_28) \
- at HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE@	$(am__objects_33)
+ at HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE@	$(am__objects_30) \
+ at HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE@	$(am__objects_34)
 librxd_fi_la_OBJECTS = $(am_librxd_fi_la_OBJECTS)
 librxd_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -710,26 +857,29 @@ librxd_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 am__librxm_fi_la_SOURCES_DIST = prov/rxm/src/rxm_attr.c \
 	prov/rxm/src/rxm_init.c prov/rxm/src/rxm_fabric.c \
 	prov/rxm/src/rxm_domain.c prov/rxm/src/rxm_conn.c \
-	prov/rxm/src/rxm_ep.c prov/rxm/src/rxm_cq.c prov/rxm/src/rxm.h \
+	prov/rxm/src/rxm_ep.c prov/rxm/src/rxm_cq.c \
+	prov/rxm/src/rxm_rma.c prov/rxm/src/rxm.c prov/rxm/src/rxm.h \
 	src/common.c src/enosys.c src/rbtree.c src/fasthash.c \
-	src/indexer.c prov/util/src/util_attr.c \
-	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	src/indexer.c src/iov.c prov/util/src/util_atomic.c \
+	prov/util/src/util_attr.c prov/util/src/util_av.c \
+	prov/util/src/util_cq.c prov/util/src/util_cntr.c \
 	prov/util/src/util_domain.c prov/util/src/util_ep.c \
 	prov/util/src/util_eq.c prov/util/src/util_fabric.c \
 	prov/util/src/util_main.c prov/util/src/util_poll.c \
 	prov/util/src/util_wait.c prov/util/src/util_buf.c \
-	prov/util/src/util_mr.c src/osx/osd.c src/unix/osd.c \
+	prov/util/src/util_mr.c prov/util/src/util_ns.c src/unix/osd.c \
 	include/osx/osd.h include/unix/osd.h include/freebsd/osd.h \
 	include/linux/osd.h
- at HAVE_RXM_TRUE@am__objects_34 = prov/rxm/src/rxm_attr.lo \
+ at HAVE_RXM_TRUE@am__objects_35 = prov/rxm/src/rxm_attr.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/rxm_init.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/rxm_fabric.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/rxm_domain.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/rxm_conn.lo prov/rxm/src/rxm_ep.lo \
- at HAVE_RXM_TRUE@	prov/rxm/src/rxm_cq.lo
+ at HAVE_RXM_TRUE@	prov/rxm/src/rxm_cq.lo prov/rxm/src/rxm_rma.lo \
+ at HAVE_RXM_TRUE@	prov/rxm/src/rxm.lo
 @HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE at am_librxm_fi_la_OBJECTS =  \
- at HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE@	$(am__objects_34) \
- at HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE@	$(am__objects_33)
+ at HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE@	$(am__objects_35) \
+ at HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE@	$(am__objects_34)
 librxm_fi_la_OBJECTS = $(am_librxm_fi_la_OBJECTS)
 librxm_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -751,16 +901,17 @@ am__libsockets_fi_la_SOURCES_DIST = prov/sockets/src/sock_av.c \
 	prov/sockets/src/sock_trigger.c prov/sockets/src/sock_epoll.c \
 	prov/sockets/include/sock.h prov/sockets/include/sock_util.h \
 	src/common.c src/enosys.c src/rbtree.c src/fasthash.c \
-	src/indexer.c prov/util/src/util_attr.c \
-	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	src/indexer.c src/iov.c prov/util/src/util_atomic.c \
+	prov/util/src/util_attr.c prov/util/src/util_av.c \
+	prov/util/src/util_cq.c prov/util/src/util_cntr.c \
 	prov/util/src/util_domain.c prov/util/src/util_ep.c \
 	prov/util/src/util_eq.c prov/util/src/util_fabric.c \
 	prov/util/src/util_main.c prov/util/src/util_poll.c \
 	prov/util/src/util_wait.c prov/util/src/util_buf.c \
-	prov/util/src/util_mr.c src/osx/osd.c src/unix/osd.c \
+	prov/util/src/util_mr.c prov/util/src/util_ns.c src/unix/osd.c \
 	include/osx/osd.h include/unix/osd.h include/freebsd/osd.h \
 	include/linux/osd.h
- at HAVE_SOCKETS_TRUE@am__objects_35 = prov/sockets/src/sock_av.lo \
+ at HAVE_SOCKETS_TRUE@am__objects_36 = prov/sockets/src/sock_av.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_dom.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_eq.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_cq.lo \
@@ -783,9 +934,9 @@ am__libsockets_fi_la_SOURCES_DIST = prov/sockets/src/sock_av.c \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_trigger.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_epoll.lo
 @HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE at am_libsockets_fi_la_OBJECTS =  \
- at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE@	$(am__objects_35) \
- at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE@	$(am__objects_2) \
- at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE@	$(am__objects_33)
+ at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE@	$(am__objects_36) \
+ at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE@	$(am__objects_8) \
+ at HAVE_SOCKETS_DL_TRUE@@HAVE_SOCKETS_TRUE@	$(am__objects_34)
 libsockets_fi_la_OBJECTS = $(am_libsockets_fi_la_OBJECTS)
 libsockets_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -798,23 +949,25 @@ am__libudp_fi_la_SOURCES_DIST = prov/udp/src/udpx_attr.c \
 	prov/udp/src/udpx_ep.c prov/udp/src/udpx_fabric.c \
 	prov/udp/src/udpx_init.c prov/udp/src/udpx.h src/common.c \
 	src/enosys.c src/rbtree.c src/fasthash.c src/indexer.c \
+	src/iov.c prov/util/src/util_atomic.c \
 	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
-	prov/util/src/util_ep.c prov/util/src/util_eq.c \
-	prov/util/src/util_fabric.c prov/util/src/util_main.c \
-	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
- at HAVE_UDP_TRUE@am__objects_36 = prov/udp/src/udpx_attr.lo \
+	prov/util/src/util_cq.c prov/util/src/util_cntr.c \
+	prov/util/src/util_domain.c prov/util/src/util_ep.c \
+	prov/util/src/util_eq.c prov/util/src/util_fabric.c \
+	prov/util/src/util_main.c prov/util/src/util_poll.c \
+	prov/util/src/util_wait.c prov/util/src/util_buf.c \
+	prov/util/src/util_mr.c prov/util/src/util_ns.c src/unix/osd.c \
+	include/osx/osd.h include/unix/osd.h include/freebsd/osd.h \
+	include/linux/osd.h
+ at HAVE_UDP_TRUE@am__objects_37 = prov/udp/src/udpx_attr.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/udpx_cq.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/udpx_domain.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/udpx_ep.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/udpx_fabric.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/udpx_init.lo
 @HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE at am_libudp_fi_la_OBJECTS =  \
- at HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE@	$(am__objects_36) \
- at HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE@	$(am__objects_33)
+ at HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE@	$(am__objects_37) \
+ at HAVE_UDP_DL_TRUE@@HAVE_UDP_TRUE@	$(am__objects_34)
 libudp_fi_la_OBJECTS = $(am_libudp_fi_la_OBJECTS)
 libudp_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@@ -901,16 +1054,17 @@ am__libusnic_fi_la_SOURCES_DIST =  \
 	prov/usnic/src/usdf_poll.h prov/usnic/src/usdf_ext.c \
 	prov/usnic/src/usdf_wait.h prov/usnic/src/usdf_wait.c \
 	prov/usnic/src/usdf_fake_ibv.c src/common.c src/enosys.c \
-	src/rbtree.c src/fasthash.c src/indexer.c \
-	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
 	prov/util/src/util_ep.c prov/util/src/util_eq.c \
 	prov/util/src/util_fabric.c prov/util/src/util_main.c \
 	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
- at HAVE_USNIC_TRUE@am__objects_37 = prov/usnic/src/usnic_direct/libusnic_fi_la-libnl_utils_common.lo \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
+ at HAVE_USNIC_TRUE@am__objects_38 = prov/usnic/src/usnic_direct/libusnic_fi_la-libnl_utils_common.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/libusnic_fi_la-usd_caps.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/libusnic_fi_la-usd_dest.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/libusnic_fi_la-usd_device.lo \
@@ -933,8 +1087,8 @@ am__libusnic_fi_la_SOURCES_DIST =  \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/libusnic_fi_la-vnic_rq.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/libusnic_fi_la-vnic_wq.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/libusnic_fi_la-vnic_intr.lo
- at HAVE_USNIC_TRUE@@HAVE_VERBS_TRUE at am__objects_38 = prov/usnic/src/libusnic_fi_la-usdf_fake_ibv.lo
- at HAVE_USNIC_TRUE@am__objects_39 = $(am__objects_37) \
+ at HAVE_USNIC_TRUE@@USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE at am__objects_39 = prov/usnic/src/libusnic_fi_la-usdf_fake_ibv.lo
+ at HAVE_USNIC_TRUE@am__objects_40 = $(am__objects_38) \
 @HAVE_USNIC_TRUE@	prov/usnic/src/libusnic_fi_la-usdf_av.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/libusnic_fi_la-usdf_cm.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/libusnic_fi_la-usdf_cq.lo \
@@ -955,17 +1109,19 @@ am__libusnic_fi_la_SOURCES_DIST =  \
 @HAVE_USNIC_TRUE@	prov/usnic/src/libusnic_fi_la-usdf_poll.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/libusnic_fi_la-usdf_ext.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/libusnic_fi_la-usdf_wait.lo \
- at HAVE_USNIC_TRUE@	$(am__objects_38)
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_40 = src/osx/libusnic_fi_la-osd.lo
+ at HAVE_USNIC_TRUE@	$(am__objects_39)
 @MACOS_TRUE at am__objects_41 = src/unix/libusnic_fi_la-osd.lo
 @FREEBSD_TRUE at am__objects_42 = src/unix/libusnic_fi_la-osd.lo
 @LINUX_TRUE at am__objects_43 = src/unix/libusnic_fi_la-osd.lo
 am__objects_44 = src/libusnic_fi_la-common.lo \
 	src/libusnic_fi_la-enosys.lo src/libusnic_fi_la-rbtree.lo \
 	src/libusnic_fi_la-fasthash.lo src/libusnic_fi_la-indexer.lo \
+	src/libusnic_fi_la-iov.lo \
+	prov/util/src/libusnic_fi_la-util_atomic.lo \
 	prov/util/src/libusnic_fi_la-util_attr.lo \
 	prov/util/src/libusnic_fi_la-util_av.lo \
 	prov/util/src/libusnic_fi_la-util_cq.lo \
+	prov/util/src/libusnic_fi_la-util_cntr.lo \
 	prov/util/src/libusnic_fi_la-util_domain.lo \
 	prov/util/src/libusnic_fi_la-util_ep.lo \
 	prov/util/src/libusnic_fi_la-util_eq.lo \
@@ -974,10 +1130,11 @@ am__objects_44 = src/libusnic_fi_la-common.lo \
 	prov/util/src/libusnic_fi_la-util_poll.lo \
 	prov/util/src/libusnic_fi_la-util_wait.lo \
 	prov/util/src/libusnic_fi_la-util_buf.lo \
-	prov/util/src/libusnic_fi_la-util_mr.lo $(am__objects_40) \
-	$(am__objects_41) $(am__objects_42) $(am__objects_43)
+	prov/util/src/libusnic_fi_la-util_mr.lo \
+	prov/util/src/libusnic_fi_la-util_ns.lo $(am__objects_41) \
+	$(am__objects_42) $(am__objects_43)
 @HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE at am_libusnic_fi_la_OBJECTS =  \
- at HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE@	$(am__objects_39) \
+ at HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE@	$(am__objects_40) \
 @HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE@	$(am__objects_44)
 libusnic_fi_la_OBJECTS = $(am_libusnic_fi_la_OBJECTS)
 libusnic_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
@@ -988,12 +1145,11 @@ libusnic_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 @HAVE_USNIC_DL_TRUE@@HAVE_USNIC_TRUE@	$(pkglibdir)
 am__libverbs_fi_la_SOURCES_DIST = prov/verbs/src/fi_verbs.h \
 	prov/verbs/src/fi_verbs.c prov/verbs/src/uthash.h \
-	prov/verbs/src/verbs_atomic.c prov/verbs/src/verbs_av.c \
-	prov/verbs/src/verbs_cm.c prov/verbs/src/verbs_cq.c \
-	prov/verbs/src/verbs_srq.c prov/verbs/src/verbs_domain.c \
-	prov/verbs/src/verbs_eq.c prov/verbs/src/verbs_info.c \
-	prov/verbs/src/verbs_msg.c prov/verbs/src/verbs_msg_ep.c \
-	prov/verbs/src/verbs_rma.c \
+	prov/verbs/src/verbs_atomic.c prov/verbs/src/verbs_cm.c \
+	prov/verbs/src/verbs_cq.c prov/verbs/src/verbs_srq.c \
+	prov/verbs/src/verbs_domain.c prov/verbs/src/verbs_eq.c \
+	prov/verbs/src/verbs_info.c prov/verbs/src/verbs_msg.c \
+	prov/verbs/src/verbs_msg_ep.c prov/verbs/src/verbs_rma.c \
 	prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c \
 	prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c \
 	prov/verbs/src/ep_rdm/verbs_ep_rdm.c \
@@ -1007,19 +1163,19 @@ am__libverbs_fi_la_SOURCES_DIST = prov/verbs/src/fi_verbs.h \
 	prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm.c \
 	prov/verbs/src/ep_rdm/verbs_utils.c \
 	prov/verbs/src/ep_rdm/verbs_utils.h src/common.c src/enosys.c \
-	src/rbtree.c src/fasthash.c src/indexer.c \
-	prov/util/src/util_attr.c prov/util/src/util_av.c \
-	prov/util/src/util_cq.c prov/util/src/util_domain.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
+	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
 	prov/util/src/util_ep.c prov/util/src/util_eq.c \
 	prov/util/src/util_fabric.c prov/util/src/util_main.c \
 	prov/util/src/util_poll.c prov/util/src/util_wait.c \
-	prov/util/src/util_buf.c prov/util/src/util_mr.c src/osx/osd.c \
-	src/unix/osd.c include/osx/osd.h include/unix/osd.h \
-	include/freebsd/osd.h include/linux/osd.h
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h
 @HAVE_VERBS_TRUE at am__objects_45 =  \
 @HAVE_VERBS_TRUE@	prov/verbs/src/libverbs_fi_la-fi_verbs.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/libverbs_fi_la-verbs_atomic.lo \
- at HAVE_VERBS_TRUE@	prov/verbs/src/libverbs_fi_la-verbs_av.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/libverbs_fi_la-verbs_cm.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/libverbs_fi_la-verbs_cq.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/libverbs_fi_la-verbs_srq.lo \
@@ -1038,16 +1194,18 @@ am__libverbs_fi_la_SOURCES_DIST = prov/verbs/src/fi_verbs.h \
 @HAVE_VERBS_TRUE@	prov/verbs/src/ep_rdm/libverbs_fi_la-verbs_tagged_ep_rdm_states.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/ep_rdm/libverbs_fi_la-verbs_tagged_ep_rdm.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/ep_rdm/libverbs_fi_la-verbs_utils.lo
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_46 = src/osx/libverbs_fi_la-osd.lo
- at MACOS_TRUE@am__objects_47 = src/unix/libverbs_fi_la-osd.lo
- at FREEBSD_TRUE@am__objects_48 = src/unix/libverbs_fi_la-osd.lo
- at LINUX_TRUE@am__objects_49 = src/unix/libverbs_fi_la-osd.lo
-am__objects_50 = src/libverbs_fi_la-common.lo \
+ at MACOS_TRUE@am__objects_46 = src/unix/libverbs_fi_la-osd.lo
+ at FREEBSD_TRUE@am__objects_47 = src/unix/libverbs_fi_la-osd.lo
+ at LINUX_TRUE@am__objects_48 = src/unix/libverbs_fi_la-osd.lo
+am__objects_49 = src/libverbs_fi_la-common.lo \
 	src/libverbs_fi_la-enosys.lo src/libverbs_fi_la-rbtree.lo \
 	src/libverbs_fi_la-fasthash.lo src/libverbs_fi_la-indexer.lo \
+	src/libverbs_fi_la-iov.lo \
+	prov/util/src/libverbs_fi_la-util_atomic.lo \
 	prov/util/src/libverbs_fi_la-util_attr.lo \
 	prov/util/src/libverbs_fi_la-util_av.lo \
 	prov/util/src/libverbs_fi_la-util_cq.lo \
+	prov/util/src/libverbs_fi_la-util_cntr.lo \
 	prov/util/src/libverbs_fi_la-util_domain.lo \
 	prov/util/src/libverbs_fi_la-util_ep.lo \
 	prov/util/src/libverbs_fi_la-util_eq.lo \
@@ -1056,11 +1214,12 @@ am__objects_50 = src/libverbs_fi_la-common.lo \
 	prov/util/src/libverbs_fi_la-util_poll.lo \
 	prov/util/src/libverbs_fi_la-util_wait.lo \
 	prov/util/src/libverbs_fi_la-util_buf.lo \
-	prov/util/src/libverbs_fi_la-util_mr.lo $(am__objects_46) \
-	$(am__objects_47) $(am__objects_48) $(am__objects_49)
+	prov/util/src/libverbs_fi_la-util_mr.lo \
+	prov/util/src/libverbs_fi_la-util_ns.lo $(am__objects_46) \
+	$(am__objects_47) $(am__objects_48)
 @HAVE_VERBS_DL_TRUE@@HAVE_VERBS_TRUE at am_libverbs_fi_la_OBJECTS =  \
 @HAVE_VERBS_DL_TRUE@@HAVE_VERBS_TRUE@	$(am__objects_45) \
- at HAVE_VERBS_DL_TRUE@@HAVE_VERBS_TRUE@	$(am__objects_50)
+ at HAVE_VERBS_DL_TRUE@@HAVE_VERBS_TRUE@	$(am__objects_49)
 libverbs_fi_la_OBJECTS = $(am_libverbs_fi_la_OBJECTS)
 libverbs_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -1075,30 +1234,32 @@ libverbs_fi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 @HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE@	$(am__DEPENDENCIES_1)
 @HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__DEPENDENCIES_5 =  \
 @HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE@	$(am__DEPENDENCIES_1)
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE at am__DEPENDENCIES_6 =  \
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE@	$(am__DEPENDENCIES_1)
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE at am__DEPENDENCIES_6 =  \
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE@	$(am__DEPENDENCIES_1)
 am__src_libfabric_la_SOURCES_DIST = include/fi.h include/fi_abi.h \
 	include/fi_atom.h include/fi_enosys.h include/fi_file.h \
-	include/fi_indexer.h include/fi_list.h include/fi_lock.h \
-	include/fi_mem.h include/fi_osd.h include/fi_proto.h \
-	include/fi_rbuf.h include/fi_signal.h include/fi_util.h \
-	include/fasthash.h include/rbtree.h include/prov.h \
+	include/fi_indexer.h include/fi_iov.h include/fi_list.h \
+	include/fi_lock.h include/fi_mem.h include/fi_osd.h \
+	include/fi_proto.h include/fi_rbuf.h include/fi_signal.h \
+	include/fi_util.h include/ofi_atomic.h include/fasthash.h \
+	include/rbtree.h include/prov.h \
 	include/rdma/providers/fi_log.h \
 	include/rdma/providers/fi_prov.h src/fabric.c src/fi_tostr.c \
-	src/log.c src/var.c src/common.c src/enosys.c src/rbtree.c \
-	src/fasthash.c src/indexer.c prov/util/src/util_attr.c \
+	src/log.c src/var.c src/abi_1_0.c src/common.c src/enosys.c \
+	src/rbtree.c src/fasthash.c src/indexer.c src/iov.c \
+	prov/util/src/util_atomic.c prov/util/src/util_attr.c \
 	prov/util/src/util_av.c prov/util/src/util_cq.c \
-	prov/util/src/util_domain.c prov/util/src/util_ep.c \
-	prov/util/src/util_eq.c prov/util/src/util_fabric.c \
-	prov/util/src/util_main.c prov/util/src/util_poll.c \
-	prov/util/src/util_wait.c prov/util/src/util_buf.c \
-	prov/util/src/util_mr.c src/osx/osd.c src/unix/osd.c \
-	include/osx/osd.h include/unix/osd.h include/freebsd/osd.h \
-	include/linux/osd.h prov/sockets/src/sock_av.c \
-	prov/sockets/src/sock_dom.c prov/sockets/src/sock_eq.c \
-	prov/sockets/src/sock_cq.c prov/sockets/src/sock_cntr.c \
-	prov/sockets/src/sock_poll.c prov/sockets/src/sock_wait.c \
-	prov/sockets/src/sock_ep_rdm.c \
+	prov/util/src/util_cntr.c prov/util/src/util_domain.c \
+	prov/util/src/util_ep.c prov/util/src/util_eq.c \
+	prov/util/src/util_fabric.c prov/util/src/util_main.c \
+	prov/util/src/util_poll.c prov/util/src/util_wait.c \
+	prov/util/src/util_buf.c prov/util/src/util_mr.c \
+	prov/util/src/util_ns.c src/unix/osd.c include/osx/osd.h \
+	include/unix/osd.h include/freebsd/osd.h include/linux/osd.h \
+	prov/sockets/src/sock_av.c prov/sockets/src/sock_dom.c \
+	prov/sockets/src/sock_eq.c prov/sockets/src/sock_cq.c \
+	prov/sockets/src/sock_cntr.c prov/sockets/src/sock_poll.c \
+	prov/sockets/src/sock_wait.c prov/sockets/src/sock_ep_rdm.c \
 	prov/sockets/src/sock_ep_dgram.c \
 	prov/sockets/src/sock_ep_msg.c prov/sockets/src/sock_fabric.c \
 	prov/sockets/src/sock_ep.c prov/sockets/src/sock_ctx.c \
@@ -1113,12 +1274,11 @@ am__src_libfabric_la_SOURCES_DIST = include/fi.h include/fi_abi.h \
 	prov/udp/src/udpx_fabric.c prov/udp/src/udpx_init.c \
 	prov/udp/src/udpx.h prov/verbs/src/fi_verbs.h \
 	prov/verbs/src/fi_verbs.c prov/verbs/src/uthash.h \
-	prov/verbs/src/verbs_atomic.c prov/verbs/src/verbs_av.c \
-	prov/verbs/src/verbs_cm.c prov/verbs/src/verbs_cq.c \
-	prov/verbs/src/verbs_srq.c prov/verbs/src/verbs_domain.c \
-	prov/verbs/src/verbs_eq.c prov/verbs/src/verbs_info.c \
-	prov/verbs/src/verbs_msg.c prov/verbs/src/verbs_msg_ep.c \
-	prov/verbs/src/verbs_rma.c \
+	prov/verbs/src/verbs_atomic.c prov/verbs/src/verbs_cm.c \
+	prov/verbs/src/verbs_cq.c prov/verbs/src/verbs_srq.c \
+	prov/verbs/src/verbs_domain.c prov/verbs/src/verbs_eq.c \
+	prov/verbs/src/verbs_info.c prov/verbs/src/verbs_msg.c \
+	prov/verbs/src/verbs_msg_ep.c prov/verbs/src/verbs_rma.c \
 	prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c \
 	prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c \
 	prov/verbs/src/ep_rdm/verbs_ep_rdm.c \
@@ -1210,14 +1370,8 @@ am__src_libfabric_la_SOURCES_DIST = include/fi.h include/fi_abi.h \
 	prov/usnic/src/usdf_timer.h prov/usnic/src/usdf_poll.c \
 	prov/usnic/src/usdf_poll.h prov/usnic/src/usdf_ext.c \
 	prov/usnic/src/usdf_wait.h prov/usnic/src/usdf_wait.c \
-	prov/usnic/src/usdf_fake_ibv.c prov/mxm/src/mlxm.h \
-	prov/mxm/src/uthash.h prov/mxm/src/mpool.h \
-	prov/mxm/src/mlxm_mq_storage.h prov/mxm/src/mlxm_helpers.h \
-	prov/mxm/src/mlxm_init.c prov/mxm/src/mlxm_domain.c \
-	prov/mxm/src/mlxm_cq.c prov/mxm/src/mlxm_av.c \
-	prov/mxm/src/mlxm_ep.c prov/mxm/src/mlxm_cm.c \
-	prov/mxm/src/mlxm_tagged.c prov/mxm/src/mlxm_mr.c \
-	prov/gni/src/gnix_atomic.c prov/gni/src/gnix_av.c \
+	prov/usnic/src/usdf_fake_ibv.c prov/gni/src/gnix_atomic.c \
+	prov/gni/src/gnix_auth_key.c prov/gni/src/gnix_av.c \
 	prov/gni/src/gnix_bitmap.c prov/gni/src/gnix_buddy_allocator.c \
 	prov/gni/src/gnix_cm.c prov/gni/src/gnix_cm_nic.c \
 	prov/gni/src/gnix_cntr.c prov/gni/src/gnix_cq.c \
@@ -1229,49 +1383,68 @@ am__src_libfabric_la_SOURCES_DIST = include/fi.h include/fi_abi.h \
 	prov/gni/src/gnix_mr_cache.c prov/gni/src/gnix_mr_notifier.c \
 	prov/gni/src/gnix_msg.c prov/gni/src/gnix_nameserver.c \
 	prov/gni/src/gnix_nic.c prov/gni/src/gnix_poll.c \
-	prov/gni/src/gnix_queue.c prov/gni/src/gnix_rma.c \
+	prov/gni/src/gnix_progress.c prov/gni/src/gnix_queue.c \
+	prov/gni/src/gnix_rma.c prov/gni/src/gnix_sep.c \
 	prov/gni/src/gnix_tags.c prov/gni/src/gnix_trigger.c \
 	prov/gni/src/gnix_util.c prov/gni/src/gnix_vc.c \
 	prov/gni/src/gnix_vector.c prov/gni/src/gnix_xpmem.c \
 	prov/gni/src/gnix_wait.c prov/gni/include/fi_ext_gni.h \
-	prov/gni/include/gnix_atomic.h prov/gni/include/gnix_av.h \
+	prov/gni/include/gnix_atomic.h \
+	prov/gni/include/gnix_auth_key.h prov/gni/include/gnix_av.h \
 	prov/gni/include/gnix_bitmap.h \
 	prov/gni/include/gnix_buddy_allocator.h \
-	prov/gni/include/gnix_cm_nic.h prov/gni/include/gnix_cntr.h \
-	prov/gni/include/gnix_cq.h prov/gni/include/gnix_datagram.h \
-	prov/gni/include/gnix_ep.h prov/gni/include/gnix_eq.h \
-	prov/gni/include/gnix_freelist.h prov/gni/include/gnix.h \
-	prov/gni/include/gnix_hashtable.h \
+	prov/gni/include/gnix_cm.h prov/gni/include/gnix_cm_nic.h \
+	prov/gni/include/gnix_cntr.h prov/gni/include/gnix_cq.h \
+	prov/gni/include/gnix_datagram.h prov/gni/include/gnix_ep.h \
+	prov/gni/include/gnix_eq.h prov/gni/include/gnix_freelist.h \
+	prov/gni/include/gnix.h prov/gni/include/gnix_hashtable.h \
 	prov/gni/include/gnix_mbox_allocator.h \
 	prov/gni/include/gnix_mr.h prov/gni/include/gnix_mr_cache.h \
 	prov/gni/include/gnix_mr_notifier.h \
 	prov/gni/include/gnix_msg.h prov/gni/include/gnix_nameserver.h \
 	prov/gni/include/gnix_nic.h prov/gni/include/gnix_poll.h \
-	prov/gni/include/gnix_priv.h prov/gni/include/gnix_queue.h \
-	prov/gni/include/gnix_rma.h prov/gni/include/gnix_tags.h \
-	prov/gni/include/gnix_trigger.h prov/gni/include/gnix_util.h \
-	prov/gni/include/gnix_vc.h prov/gni/include/gnix_vector.h \
-	prov/gni/include/gnix_xpmem.h prov/gni/include/gnix_wait.h \
-	prov/rxm/src/rxm_attr.c prov/rxm/src/rxm_init.c \
-	prov/rxm/src/rxm_fabric.c prov/rxm/src/rxm_domain.c \
-	prov/rxm/src/rxm_conn.c prov/rxm/src/rxm_ep.c \
-	prov/rxm/src/rxm_cq.c prov/rxm/src/rxm.h \
+	prov/gni/include/gnix_progress.h prov/gni/include/gnix_priv.h \
+	prov/gni/include/gnix_queue.h prov/gni/include/gnix_rma.h \
+	prov/gni/include/gnix_tags.h prov/gni/include/gnix_trigger.h \
+	prov/gni/include/gnix_util.h prov/gni/include/gnix_vc.h \
+	prov/gni/include/gnix_vector.h prov/gni/include/gnix_xpmem.h \
+	prov/gni/include/gnix_wait.h prov/rxm/src/rxm_attr.c \
+	prov/rxm/src/rxm_init.c prov/rxm/src/rxm_fabric.c \
+	prov/rxm/src/rxm_domain.c prov/rxm/src/rxm_conn.c \
+	prov/rxm/src/rxm_ep.c prov/rxm/src/rxm_cq.c \
+	prov/rxm/src/rxm_rma.c prov/rxm/src/rxm.c prov/rxm/src/rxm.h \
 	prov/rxd/src/rxd_attr.c prov/rxd/src/rxd_init.c \
 	prov/rxd/src/rxd_fabric.c prov/rxd/src/rxd_domain.c \
 	prov/rxd/src/rxd_av.c prov/rxd/src/rxd_cq.c \
-	prov/rxd/src/rxd_ep.c prov/rxd/src/rxd_rma.c \
-	prov/rxd/src/rxd.h
- at HAVE_CLOCK_GETTIME_FALSE@@MACOS_TRUE at am__objects_51 = src/osx/src_libfabric_la-osd.lo
- at MACOS_TRUE@am__objects_52 = src/unix/src_libfabric_la-osd.lo
- at FREEBSD_TRUE@am__objects_53 = src/unix/src_libfabric_la-osd.lo
- at LINUX_TRUE@am__objects_54 = src/unix/src_libfabric_la-osd.lo
-am__objects_55 = src/src_libfabric_la-common.lo \
+	prov/rxd/src/rxd_cntr.c prov/rxd/src/rxd_ep.c \
+	prov/rxd/src/rxd_rma.c prov/rxd/src/rxd.h \
+	prov/bgq/src/fi_bgq_atomic.c prov/bgq/src/fi_bgq_av.c \
+	prov/bgq/src/fi_bgq_spi.c prov/bgq/src/fi_bgq_cm.c \
+	prov/bgq/src/fi_bgq_cntr.c prov/bgq/src/fi_bgq_cq.c \
+	prov/bgq/src/fi_bgq_domain.c prov/bgq/src/fi_bgq_ep.c \
+	prov/bgq/src/fi_bgq_fabric.c prov/bgq/src/fi_bgq_info.c \
+	prov/bgq/src/fi_bgq_init.c prov/bgq/src/fi_bgq_mr.c \
+	prov/bgq/src/fi_bgq_msg.c prov/bgq/src/fi_bgq_rma.c \
+	prov/bgq/src/fi_bgq_sep.c prov/bgq/src/fi_bgq_tagged.c \
+	prov/bgq/src/fi_bgq_node.c prov/bgq/src/fi_bgq_progress.c \
+	prov/bgq/src/fi_bgq_pmi.c prov/mlx/src/mlx.h \
+	prov/mlx/src/mlx_av.c prov/mlx/src/mlx_cm.c \
+	prov/mlx/src/mlx_cq.c prov/mlx/src/mlx_domain.c \
+	prov/mlx/src/mlx_ep.c prov/mlx/src/mlx_init.c \
+	prov/mlx/src/mlx_tagged.c prov/mlx/src/mlx_fabric.c \
+	prov/mlx/src/mlx_callbacks.c
+ at MACOS_TRUE@am__objects_50 = src/unix/src_libfabric_la-osd.lo
+ at FREEBSD_TRUE@am__objects_51 = src/unix/src_libfabric_la-osd.lo
+ at LINUX_TRUE@am__objects_52 = src/unix/src_libfabric_la-osd.lo
+am__objects_53 = src/src_libfabric_la-common.lo \
 	src/src_libfabric_la-enosys.lo src/src_libfabric_la-rbtree.lo \
 	src/src_libfabric_la-fasthash.lo \
-	src/src_libfabric_la-indexer.lo \
+	src/src_libfabric_la-indexer.lo src/src_libfabric_la-iov.lo \
+	prov/util/src/src_libfabric_la-util_atomic.lo \
 	prov/util/src/src_libfabric_la-util_attr.lo \
 	prov/util/src/src_libfabric_la-util_av.lo \
 	prov/util/src/src_libfabric_la-util_cq.lo \
+	prov/util/src/src_libfabric_la-util_cntr.lo \
 	prov/util/src/src_libfabric_la-util_domain.lo \
 	prov/util/src/src_libfabric_la-util_ep.lo \
 	prov/util/src/src_libfabric_la-util_eq.lo \
@@ -1280,9 +1453,10 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 	prov/util/src/src_libfabric_la-util_poll.lo \
 	prov/util/src/src_libfabric_la-util_wait.lo \
 	prov/util/src/src_libfabric_la-util_buf.lo \
-	prov/util/src/src_libfabric_la-util_mr.lo $(am__objects_51) \
-	$(am__objects_52) $(am__objects_53) $(am__objects_54)
- at HAVE_SOCKETS_TRUE@am__objects_56 = prov/sockets/src/src_libfabric_la-sock_av.lo \
+	prov/util/src/src_libfabric_la-util_mr.lo \
+	prov/util/src/src_libfabric_la-util_ns.lo $(am__objects_50) \
+	$(am__objects_51) $(am__objects_52)
+ at HAVE_SOCKETS_TRUE@am__objects_54 = prov/sockets/src/src_libfabric_la-sock_av.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/src_libfabric_la-sock_dom.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/src_libfabric_la-sock_eq.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/src_libfabric_la-sock_cq.lo \
@@ -1304,21 +1478,20 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/src_libfabric_la-sock_atomic.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/src_libfabric_la-sock_trigger.lo \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/src_libfabric_la-sock_epoll.lo
- at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE at am__objects_57 =  \
- at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE@	$(am__objects_56) \
- at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE@	$(am__objects_2)
- at HAVE_UDP_TRUE@am__objects_58 =  \
+ at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE at am__objects_55 =  \
+ at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE@	$(am__objects_54) \
+ at HAVE_SOCKETS_DL_FALSE@@HAVE_SOCKETS_TRUE@	$(am__objects_8)
+ at HAVE_UDP_TRUE@am__objects_56 =  \
 @HAVE_UDP_TRUE@	prov/udp/src/src_libfabric_la-udpx_attr.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/src_libfabric_la-udpx_cq.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/src_libfabric_la-udpx_domain.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/src_libfabric_la-udpx_ep.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/src_libfabric_la-udpx_fabric.lo \
 @HAVE_UDP_TRUE@	prov/udp/src/src_libfabric_la-udpx_init.lo
- at HAVE_UDP_DL_FALSE@@HAVE_UDP_TRUE at am__objects_59 = $(am__objects_58)
- at HAVE_VERBS_TRUE@am__objects_60 =  \
+ at HAVE_UDP_DL_FALSE@@HAVE_UDP_TRUE at am__objects_57 = $(am__objects_56)
+ at HAVE_VERBS_TRUE@am__objects_58 =  \
 @HAVE_VERBS_TRUE@	prov/verbs/src/src_libfabric_la-fi_verbs.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/src_libfabric_la-verbs_atomic.lo \
- at HAVE_VERBS_TRUE@	prov/verbs/src/src_libfabric_la-verbs_av.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/src_libfabric_la-verbs_cm.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/src_libfabric_la-verbs_cq.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/src_libfabric_la-verbs_srq.lo \
@@ -1337,9 +1510,9 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/ep_rdm/src_libfabric_la-verbs_tagged_ep_rdm_states.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/ep_rdm/src_libfabric_la-verbs_tagged_ep_rdm.lo \
 @HAVE_VERBS_TRUE@	prov/verbs/src/ep_rdm/src_libfabric_la-verbs_utils.lo
- at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__objects_61 =  \
- at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE@	$(am__objects_60)
- at HAVE_USNIC_TRUE@am__objects_62 = prov/usnic/src/usnic_direct/src_libfabric_la-libnl_utils_common.lo \
+ at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE at am__objects_59 =  \
+ at HAVE_VERBS_DL_FALSE@@HAVE_VERBS_TRUE@	$(am__objects_58)
+ at HAVE_USNIC_TRUE@am__objects_60 = prov/usnic/src/usnic_direct/src_libfabric_la-libnl_utils_common.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/src_libfabric_la-usd_caps.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/src_libfabric_la-usd_dest.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/src_libfabric_la-usd_device.lo \
@@ -1362,8 +1535,8 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/src_libfabric_la-vnic_rq.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/src_libfabric_la-vnic_wq.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usnic_direct/src_libfabric_la-vnic_intr.lo
- at HAVE_USNIC_TRUE@@HAVE_VERBS_TRUE at am__objects_63 = prov/usnic/src/src_libfabric_la-usdf_fake_ibv.lo
- at HAVE_USNIC_TRUE@am__objects_64 = $(am__objects_62) \
+ at HAVE_USNIC_TRUE@@USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE at am__objects_61 = prov/usnic/src/src_libfabric_la-usdf_fake_ibv.lo
+ at HAVE_USNIC_TRUE@am__objects_62 = $(am__objects_60) \
 @HAVE_USNIC_TRUE@	prov/usnic/src/src_libfabric_la-usdf_av.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/src_libfabric_la-usdf_cm.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/src_libfabric_la-usdf_cq.lo \
@@ -1384,21 +1557,12 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/src_libfabric_la-usdf_poll.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/src_libfabric_la-usdf_ext.lo \
 @HAVE_USNIC_TRUE@	prov/usnic/src/src_libfabric_la-usdf_wait.lo \
- at HAVE_USNIC_TRUE@	$(am__objects_63)
- at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__objects_65 =  \
- at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE@	$(am__objects_64)
- at HAVE_MXM_TRUE@am__objects_66 =  \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_init.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_domain.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_cq.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_av.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_ep.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_cm.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_tagged.lo \
- at HAVE_MXM_TRUE@	prov/mxm/src/src_libfabric_la-mlxm_mr.lo
- at HAVE_MXM_DL_FALSE@@HAVE_MXM_TRUE at am__objects_67 = $(am__objects_66)
- at HAVE_GNI_TRUE@am__objects_68 =  \
+ at HAVE_USNIC_TRUE@	$(am__objects_61)
+ at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE at am__objects_63 =  \
+ at HAVE_USNIC_DL_FALSE@@HAVE_USNIC_TRUE@	$(am__objects_62)
+ at HAVE_GNI_TRUE@am__objects_64 =  \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_atomic.lo \
+ at HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_auth_key.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_av.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_bitmap.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_buddy_allocator.lo \
@@ -1422,8 +1586,10 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_nameserver.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_nic.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_poll.lo \
+ at HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_progress.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_queue.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_rma.lo \
+ at HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_sep.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_tags.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_trigger.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_util.lo \
@@ -1431,34 +1597,74 @@ am__objects_55 = src/src_libfabric_la-common.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_vector.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_xpmem.lo \
 @HAVE_GNI_TRUE@	prov/gni/src/src_libfabric_la-gnix_wait.lo
- at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__objects_69 = $(am__objects_68) \
- at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE@	$(am__objects_2)
- at HAVE_RXM_TRUE@am__objects_70 =  \
+ at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE at am__objects_65 = $(am__objects_64) \
+ at HAVE_GNI_DL_FALSE@@HAVE_GNI_TRUE@	$(am__objects_8)
+ at HAVE_RXM_TRUE@am__objects_66 =  \
 @HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_attr.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_init.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_fabric.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_domain.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_conn.lo \
 @HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_ep.lo \
- at HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_cq.lo
- at HAVE_RXM_DL_FALSE@@HAVE_RXM_TRUE at am__objects_71 = $(am__objects_70)
- at HAVE_RXD_TRUE@am__objects_72 =  \
+ at HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_cq.lo \
+ at HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm_rma.lo \
+ at HAVE_RXM_TRUE@	prov/rxm/src/src_libfabric_la-rxm.lo
+ at HAVE_RXM_DL_FALSE@@HAVE_RXM_TRUE at am__objects_67 = $(am__objects_66)
+ at HAVE_RXD_TRUE@am__objects_68 =  \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_attr.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_init.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_fabric.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_domain.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_av.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_cq.lo \
+ at HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_cntr.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_ep.lo \
 @HAVE_RXD_TRUE@	prov/rxd/src/src_libfabric_la-rxd_rma.lo
- at HAVE_RXD_DL_FALSE@@HAVE_RXD_TRUE at am__objects_73 = $(am__objects_72)
+ at HAVE_RXD_DL_FALSE@@HAVE_RXD_TRUE at am__objects_69 = $(am__objects_68)
+ at HAVE_BGQ_TRUE@am__objects_70 =  \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_av.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_info.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_init.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_node.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__objects_71 = $(am__objects_70)
+ at HAVE_MLX_TRUE@am__objects_72 =  \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_av.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_cm.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_cq.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_domain.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_ep.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_init.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_tagged.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_fabric.lo \
+ at HAVE_MLX_TRUE@	prov/mlx/src/src_libfabric_la-mlx_callbacks.lo
+ at HAVE_MLX_DL_FALSE@@HAVE_MLX_TRUE at am__objects_73 = $(am__objects_72)
 am_src_libfabric_la_OBJECTS = src/src_libfabric_la-fabric.lo \
 	src/src_libfabric_la-fi_tostr.lo src/src_libfabric_la-log.lo \
-	src/src_libfabric_la-var.lo $(am__objects_55) \
-	$(am__objects_57) $(am__objects_59) $(am__objects_61) \
-	$(am__objects_65) $(am__objects_67) $(am__objects_69) \
-	$(am__objects_71) $(am__objects_73)
-src_libfabric_la_OBJECTS = $(am_src_libfabric_la_OBJECTS)
+	src/src_libfabric_la-var.lo src/src_libfabric_la-abi_1_0.lo \
+	$(am__objects_53) $(am__objects_55) $(am__objects_57) \
+	$(am__objects_59) $(am__objects_63) $(am__objects_65) \
+	$(am__objects_67) $(am__objects_69) $(am__objects_71) \
+	$(am__objects_73)
+ at HAVE_BGQ_TRUE@am__objects_74 = prov/bgq/external/src_libfabric_la-memory_impl.lo
+ at HAVE_BGQ_DL_FALSE@@HAVE_BGQ_TRUE at am__objects_75 = $(am__objects_74)
+nodist_src_libfabric_la_OBJECTS = $(am__objects_75)
+src_libfabric_la_OBJECTS = $(am_src_libfabric_la_OBJECTS) \
+	$(nodist_src_libfabric_la_OBJECTS)
 src_libfabric_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(AM_CFLAGS) $(CFLAGS) $(src_libfabric_la_LDFLAGS) $(LDFLAGS) \
@@ -1466,9 +1672,34 @@ src_libfabric_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 @EMBEDDED_FALSE at am_src_libfabric_la_rpath = -rpath $(libdir)
 @EMBEDDED_TRUE at am_src_libfabric_la_rpath =
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at am__EXEEXT_1 = prov/gni/test/gnitest$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS)
+PROGRAMS = $(bin_PROGRAMS) $(sbin_PROGRAMS) $(test_PROGRAMS)
+am__fi_bgq_agent0_SOURCES_DIST = prov/bgq/src/fi_bgq_agent.c
+ at HAVE_BGQ_TRUE@am__objects_76 = prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.$(OBJEXT)
+ at HAVE_BGQ_TRUE@am_fi_bgq_agent0_OBJECTS = $(am__objects_76)
+fi_bgq_agent0_OBJECTS = $(am_fi_bgq_agent0_OBJECTS)
+fi_bgq_agent0_LDADD = $(LDADD)
+fi_bgq_agent0_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(fi_bgq_agent0_LDFLAGS) $(LDFLAGS) -o $@
+am__fi_bgq_agent1_SOURCES_DIST = prov/bgq/src/fi_bgq_agent.c
+ at HAVE_BGQ_TRUE@am_fi_bgq_agent1_OBJECTS = prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.$(OBJEXT)
+fi_bgq_agent1_OBJECTS = $(am_fi_bgq_agent1_OBJECTS)
+fi_bgq_agent1_LDADD = $(LDADD)
+fi_bgq_agent1_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(fi_bgq_agent1_LDFLAGS) $(LDFLAGS) -o $@
+am__l2atomic_fifo_perf_SOURCES_DIST =  \
+	prov/bgq/src/test/l2atomic_fifo_perf.c
+ at HAVE_BGQ_TRUE@am_l2atomic_fifo_perf_OBJECTS = prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.$(OBJEXT)
+l2atomic_fifo_perf_OBJECTS = $(am_l2atomic_fifo_perf_OBJECTS)
+l2atomic_fifo_perf_LDADD = $(LDADD)
+l2atomic_fifo_perf_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(AM_CFLAGS) $(CFLAGS) $(l2atomic_fifo_perf_LDFLAGS) \
+	$(LDFLAGS) -o $@
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at nodist_prov_gni_test_gnitest_OBJECTS = prov/gni/test/prov_gni_test_gnitest-allocator.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-av.$(OBJEXT) \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-auth_key.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-bitmap.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-buddy_allocator.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-cancel.$(OBJEXT) \
@@ -1479,6 +1710,8 @@ PROGRAMS = $(bin_PROGRAMS)
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-dom.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-ep.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-eq.$(OBJEXT) \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-fabric.$(OBJEXT) \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-fi_addr_str.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-freelist.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-hashtable.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-mr.$(OBJEXT) \
@@ -1496,11 +1729,14 @@ PROGRAMS = $(bin_PROGRAMS)
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-api.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-api_cq.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-api_cntr.$(OBJEXT) \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-sep.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-utils.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-vc.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-vc_lookup.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-vector.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-wait.$(OBJEXT) \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.$(OBJEXT) \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-cm.$(OBJEXT) \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/prov_gni_test_gnitest-common.$(OBJEXT)
 prov_gni_test_gnitest_OBJECTS =  \
 	$(nodist_prov_gni_test_gnitest_OBJECTS)
@@ -1511,6 +1747,19 @@ prov_gni_test_gnitest_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(AM_CFLAGS) $(CFLAGS) $(prov_gni_test_gnitest_LDFLAGS) \
 	$(LDFLAGS) -o $@
+am__spi_pingpong_SOURCES_DIST = prov/bgq/src/test/spi_pingpong.c \
+	prov/bgq/src/fi_bgq_spi.c
+ at HAVE_BGQ_TRUE@am__objects_77 = prov/bgq/src/test/spi_pingpong-spi_pingpong.$(OBJEXT) \
+ at HAVE_BGQ_TRUE@	prov/bgq/src/spi_pingpong-fi_bgq_spi.$(OBJEXT)
+ at HAVE_BGQ_TRUE@am_spi_pingpong_OBJECTS = $(am__objects_77)
+ at HAVE_BGQ_TRUE@am__objects_78 = prov/bgq/external/spi_pingpong-memory_impl.$(OBJEXT)
+ at HAVE_BGQ_TRUE@nodist_spi_pingpong_OBJECTS = $(am__objects_78)
+spi_pingpong_OBJECTS = $(am_spi_pingpong_OBJECTS) \
+	$(nodist_spi_pingpong_OBJECTS)
+spi_pingpong_LDADD = $(LDADD)
+spi_pingpong_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(spi_pingpong_LDFLAGS) $(LDFLAGS) -o $@
 am_util_fi_info_OBJECTS = util/info.$(OBJEXT)
 util_fi_info_OBJECTS = $(am_util_fi_info_OBJECTS)
 util_fi_info_DEPENDENCIES = $(linkback)
@@ -1555,18 +1804,23 @@ AM_V_CCLD = $(am__v_CCLD_ at AM_V@)
 am__v_CCLD_ = $(am__v_CCLD_ at AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libgnix_fi_la_SOURCES) $(libmlxm_fi_la_SOURCES) \
+SOURCES = $(libbgq_fi_la_SOURCES) $(nodist_libbgq_fi_la_SOURCES) \
+	$(libgnix_fi_la_SOURCES) $(libmlx_fi_la_SOURCES) \
 	$(libpsmx_fi_la_SOURCES) $(libpsmx_la_SOURCES) \
 	$(libpsmx2_fi_la_SOURCES) $(libpsmx2_la_SOURCES) \
 	$(librxd_fi_la_SOURCES) $(librxm_fi_la_SOURCES) \
 	$(libsockets_fi_la_SOURCES) $(libudp_fi_la_SOURCES) \
 	$(libusnic_fi_la_SOURCES) $(libverbs_fi_la_SOURCES) \
-	$(src_libfabric_la_SOURCES) \
+	$(src_libfabric_la_SOURCES) $(nodist_src_libfabric_la_SOURCES) \
+	$(fi_bgq_agent0_SOURCES) $(fi_bgq_agent1_SOURCES) \
+	$(l2atomic_fifo_perf_SOURCES) \
 	$(nodist_prov_gni_test_gnitest_SOURCES) \
+	$(spi_pingpong_SOURCES) $(nodist_spi_pingpong_SOURCES) \
 	$(util_fi_info_SOURCES) $(util_fi_pingpong_SOURCES) \
 	$(util_fi_strerror_SOURCES)
-DIST_SOURCES = $(am__libgnix_fi_la_SOURCES_DIST) \
-	$(am__libmlxm_fi_la_SOURCES_DIST) \
+DIST_SOURCES = $(am__libbgq_fi_la_SOURCES_DIST) \
+	$(am__libgnix_fi_la_SOURCES_DIST) \
+	$(am__libmlx_fi_la_SOURCES_DIST) \
 	$(am__libpsmx_fi_la_SOURCES_DIST) \
 	$(am__libpsmx_la_SOURCES_DIST) \
 	$(am__libpsmx2_fi_la_SOURCES_DIST) \
@@ -1577,7 +1831,11 @@ DIST_SOURCES = $(am__libgnix_fi_la_SOURCES_DIST) \
 	$(am__libudp_fi_la_SOURCES_DIST) \
 	$(am__libusnic_fi_la_SOURCES_DIST) \
 	$(am__libverbs_fi_la_SOURCES_DIST) \
-	$(am__src_libfabric_la_SOURCES_DIST) $(util_fi_info_SOURCES) \
+	$(am__src_libfabric_la_SOURCES_DIST) \
+	$(am__fi_bgq_agent0_SOURCES_DIST) \
+	$(am__fi_bgq_agent1_SOURCES_DIST) \
+	$(am__l2atomic_fifo_perf_SOURCES_DIST) \
+	$(am__spi_pingpong_SOURCES_DIST) $(util_fi_info_SOURCES) \
 	$(util_fi_pingpong_SOURCES) $(util_fi_strerror_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
@@ -1601,7 +1859,9 @@ am__rdmainclude_HEADERS_DIST = $(top_srcdir)/include/rdma/fabric.h \
 	$(top_srcdir)/include/rdma/fi_tagged.h \
 	$(top_srcdir)/include/rdma/fi_trigger.h \
 	prov/usnic/src/fi_ext_usnic.h prov/gni/include/fi_ext_gni.h
-HEADERS = $(nodist_rdmainclude_HEADERS) $(rdmainclude_HEADERS)
+HEADERS = $(nodist_rdma_bgqinclude_HEADERS) \
+	$(nodist_rdmainclude_HEADERS) $(rdma_bgqinclude_HEADERS) \
+	$(rdmainclude_HEADERS)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \
 	$(LISP)config.h.in
 # Read a list of newline-separated strings from the standard input,
@@ -1800,6 +2060,36 @@ TEST_LOGS = $(am__test_logs2:.test.log=.log)
 TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/config/test-driver
 TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \
 	$(TEST_LOG_FLAGS)
+am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+	$(srcdir)/libfabric.map.in $(srcdir)/libfabric.pc.in \
+	$(srcdir)/libfabric.spec.in \
+	$(srcdir)/prov/bgq/Makefile.include \
+	$(srcdir)/prov/gni/Makefile.include \
+	$(srcdir)/prov/mlx/Makefile.include \
+	$(srcdir)/prov/psm/Makefile.include \
+	$(srcdir)/prov/psm2/Makefile.include \
+	$(srcdir)/prov/rxd/Makefile.include \
+	$(srcdir)/prov/rxm/Makefile.include \
+	$(srcdir)/prov/sockets/Makefile.include \
+	$(srcdir)/prov/udp/Makefile.include \
+	$(srcdir)/prov/usnic/Makefile.include \
+	$(srcdir)/prov/verbs/Makefile.include \
+	$(top_srcdir)/config/ar-lib $(top_srcdir)/config/compile \
+	$(top_srcdir)/config/config.guess \
+	$(top_srcdir)/config/config.sub $(top_srcdir)/config/depcomp \
+	$(top_srcdir)/config/install-sh $(top_srcdir)/config/ltmain.sh \
+	$(top_srcdir)/config/missing $(top_srcdir)/config/test-driver \
+	$(top_srcdir)/prov/bgq/include/rdma/fi_direct.h.in \
+	$(top_srcdir)/prov/bgq/src/test/Makefile.include \
+	$(top_srcdir)/prov/psm/libfabric-psm.spec.in \
+	$(top_srcdir)/prov/psm2/libfabric-psm2.spec.in \
+	$(top_srcdir)/prov/sockets/libfabric-sockets.spec.in \
+	$(top_srcdir)/prov/udp/libfabric-udp.spec.in \
+	$(top_srcdir)/prov/usnic/libfabric-usnic.spec.in \
+	$(top_srcdir)/prov/verbs/libfabric-verbs.spec.in AUTHORS \
+	COPYING README config/ar-lib config/compile \
+	config/config.guess config/config.sub config/depcomp \
+	config/install-sh config/ltmain.sh config/missing
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 distdir = $(PACKAGE)-$(VERSION)
 top_distdir = $(distdir)
@@ -1837,12 +2127,15 @@ CRAY_ALPS_UTIL_CFLAGS = @CRAY_ALPS_UTIL_CFLAGS@
 CRAY_ALPS_UTIL_LIBS = @CRAY_ALPS_UTIL_LIBS@
 CRAY_GNI_HEADERS_CFLAGS = @CRAY_GNI_HEADERS_CFLAGS@
 CRAY_GNI_HEADERS_LIBS = @CRAY_GNI_HEADERS_LIBS@
+CRAY_KDREG_CFLAGS = @CRAY_KDREG_CFLAGS@
+CRAY_KDREG_LIBS = @CRAY_KDREG_LIBS@
 CRAY_PMI_CFLAGS = @CRAY_PMI_CFLAGS@
 CRAY_PMI_LIBS = @CRAY_PMI_LIBS@
 CRAY_UDREG_CFLAGS = @CRAY_UDREG_CFLAGS@
 CRAY_UDREG_LIBS = @CRAY_UDREG_LIBS@
 CRAY_UGNI_CFLAGS = @CRAY_UGNI_CFLAGS@
 CRAY_UGNI_LIBS = @CRAY_UGNI_LIBS@
+CRAY_UGNI_STATIC_LIBS = @CRAY_UGNI_STATIC_LIBS@
 CRAY_XPMEM_CFLAGS = @CRAY_XPMEM_CFLAGS@
 CRAY_XPMEM_LIBS = @CRAY_XPMEM_LIBS@
 CYGPATH_W = @CYGPATH_W@
@@ -1878,6 +2171,7 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
 MAKEINFO = @MAKEINFO@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
@@ -1917,6 +2211,12 @@ am__leading_dot = @am__leading_dot@
 am__quote = @am__quote@
 am__tar = @am__tar@
 am__untar = @am__untar@
+bgq_driver = @bgq_driver@
+bgq_external_source = @bgq_external_source@
+bgq_fabric_direct_av = @bgq_fabric_direct_av@
+bgq_fabric_direct_mr = @bgq_fabric_direct_mr@
+bgq_fabric_direct_progress = @bgq_fabric_direct_progress@
+bgq_fabric_direct_thread = @bgq_fabric_direct_thread@
 bindir = @bindir@
 build = @build@
 build_alias = @build_alias@
@@ -1949,9 +2249,9 @@ localedir = @localedir@
 localstatedir = @localstatedir@
 mandir = @mandir@
 mkdir_p = @mkdir_p@
-mxm_CPPFLAGS = @mxm_CPPFLAGS@
-mxm_LDFLAGS = @mxm_LDFLAGS@
-mxm_LIBS = @mxm_LIBS@
+mlx_CPPFLAGS = @mlx_CPPFLAGS@
+mlx_LDFLAGS = @mlx_LDFLAGS@
+mlx_LIBS = @mlx_LIBS@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
 prefix = @prefix@
@@ -1963,6 +2263,7 @@ psm2_LIBS = @psm2_LIBS@
 psm_CPPFLAGS = @psm_CPPFLAGS@
 psm_LDFLAGS = @psm_LDFLAGS@
 psm_LIBS = @psm_LIBS@
+runstatedir = @runstatedir@
 sbindir = @sbindir@
 sharedstatedir = @sharedstatedir@
 sockets_CPPFLAGS = @sockets_CPPFLAGS@
@@ -1992,17 +2293,17 @@ verbs_ibverbs_LIBS = @verbs_ibverbs_LIBS@
 verbs_rdmacm_CPPFLAGS = @verbs_rdmacm_CPPFLAGS@
 verbs_rdmacm_LDFLAGS = @verbs_rdmacm_LDFLAGS@
 verbs_rdmacm_LIBS = @verbs_rdmacm_LIBS@
-AM_CPPFLAGS = -I$(srcdir)/include -D_GNU_SOURCE \
+AM_CPPFLAGS = -I$(srcdir)/include -D_GNU_SOURCE -D__USE_XOPEN2K8 \
 	-DSYSCONFDIR=\"$(sysconfdir)\" -DRDMADIR=\"@rdmadir@\" \
-	-DPROVDLDIR=\"$(pkglibdir)\" $(am__append_7) $(am__append_46)
-noinst_LTLIBRARIES = $(am__append_1) $(am__append_31) $(am__append_36)
+	-DPROVDLDIR=\"$(pkglibdir)\" $(am__append_9) $(am__append_42)
+noinst_LTLIBRARIES = $(am__append_1) $(am__append_33) $(am__append_38)
 lib_LTLIBRARIES = $(am__append_2)
-pkglib_LTLIBRARIES = $(DL_PROVIDERS) $(am__append_8) $(am__append_12) \
-	$(am__append_16) $(am__append_24) $(am__append_30) \
-	$(am__append_35) $(am__append_40) $(am__append_49) \
-	$(am__append_56) $(am__append_59)
+pkglib_LTLIBRARIES = $(DL_PROVIDERS) $(am__append_10) $(am__append_14) \
+	$(am__append_18) $(am__append_26) $(am__append_32) \
+	$(am__append_37) $(am__append_45) $(am__append_52) \
+	$(am__append_55) $(am__append_58) $(am__append_65)
 ACLOCAL_AMFLAGS = -I config
-AM_CFLAGS = -g -Wall
+AM_CFLAGS = -Wall
 @HAVE_LD_VERSION_SCRIPT_FALSE at libfabric_version_script = 
 @HAVE_LD_VERSION_SCRIPT_TRUE at libfabric_version_script = -Wl,--version-script=$(builddir)/libfabric.map
 rdmaincludedir = $(includedir)/rdma
@@ -2015,23 +2316,24 @@ rdmainclude_HEADERS = $(top_srcdir)/include/rdma/fabric.h \
 	$(top_srcdir)/include/rdma/fi_endpoint.h \
 	$(top_srcdir)/include/rdma/fi_errno.h \
 	$(top_srcdir)/include/rdma/fi_tagged.h \
-	$(top_srcdir)/include/rdma/fi_trigger.h $(am__append_23) \
-	$(am__append_54)
+	$(top_srcdir)/include/rdma/fi_trigger.h $(am__append_25) \
+	$(am__append_50)
 
 # internal utility functions shared by in-tree providers:
 common_srcs = src/common.c src/enosys.c src/rbtree.c src/fasthash.c \
-	src/indexer.c prov/util/src/util_attr.c \
-	prov/util/src/util_av.c prov/util/src/util_cq.c \
+	src/indexer.c src/iov.c prov/util/src/util_atomic.c \
+	prov/util/src/util_attr.c prov/util/src/util_av.c \
+	prov/util/src/util_cq.c prov/util/src/util_cntr.c \
 	prov/util/src/util_domain.c prov/util/src/util_ep.c \
 	prov/util/src/util_eq.c prov/util/src/util_fabric.c \
 	prov/util/src/util_main.c prov/util/src/util_poll.c \
 	prov/util/src/util_wait.c prov/util/src/util_buf.c \
-	prov/util/src/util_mr.c $(am__append_3) $(am__append_4) \
-	$(am__append_5) $(am__append_6)
+	prov/util/src/util_mr.c prov/util/src/util_ns.c \
+	$(am__append_3) $(am__append_4) $(am__append_5)
 
 # ensure dl-built providers link back to libfabric
 linkback = src/libfabric.la
-bin_SCRIPTS = $(am__append_48)
+bin_SCRIPTS = $(am__append_44)
 util_fi_info_SOURCES = \
 	util/info.c
 
@@ -2044,32 +2346,33 @@ util_fi_pingpong_SOURCES = \
 	util/pingpong.c
 
 util_fi_pingpong_LDADD = $(linkback)
+nodist_src_libfabric_la_SOURCES = $(am__append_60)
 src_libfabric_la_SOURCES = include/fi.h include/fi_abi.h \
 	include/fi_atom.h include/fi_enosys.h include/fi_file.h \
-	include/fi_indexer.h include/fi_list.h include/fi_lock.h \
-	include/fi_mem.h include/fi_osd.h include/fi_proto.h \
-	include/fi_rbuf.h include/fi_signal.h include/fi_util.h \
-	include/fasthash.h include/rbtree.h include/prov.h \
+	include/fi_indexer.h include/fi_iov.h include/fi_list.h \
+	include/fi_lock.h include/fi_mem.h include/fi_osd.h \
+	include/fi_proto.h include/fi_rbuf.h include/fi_signal.h \
+	include/fi_util.h include/ofi_atomic.h include/fasthash.h \
+	include/rbtree.h include/prov.h \
 	include/rdma/providers/fi_log.h \
 	include/rdma/providers/fi_prov.h src/fabric.c src/fi_tostr.c \
-	src/log.c src/var.c $(common_srcs) $(am__append_9) \
-	$(am__append_13) $(am__append_17) $(am__append_25) \
-	$(am__append_41) $(am__append_50) $(am__append_57) \
-	$(am__append_60)
-src_libfabric_la_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_18) \
-	$(am__append_26) $(am__append_42) $(am__append_51)
-src_libfabric_la_LDFLAGS = -version-info 3:1:2 -export-dynamic \
-	$(libfabric_version_script) $(am__append_19) $(am__append_27) \
-	$(am__append_43) $(am__append_52)
-src_libfabric_la_LIBADD = $(am__append_10) $(am__append_14) \
-	$(am__append_20) $(am__append_28) $(am__append_32) \
-	$(am__append_37) $(am__append_44) $(am__append_53) \
-	$(am__append_58) $(am__append_61)
-src_libfabric_la_DEPENDENCIES = libfabric.map $(am__append_33) \
-	$(am__append_38)
- at HAVE_DIRECT_TRUE@nodist_rdmainclude_HEADERS = \
- at HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct.h \
- at HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_domain.h \
+	src/log.c src/var.c src/abi_1_0.c $(common_srcs) \
+	$(am__append_11) $(am__append_15) $(am__append_19) \
+	$(am__append_27) $(am__append_46) $(am__append_53) \
+	$(am__append_56) $(am__append_59) $(am__append_66)
+src_libfabric_la_CPPFLAGS = $(AM_CPPFLAGS) $(am__append_20) \
+	$(am__append_28) $(am__append_47) $(am__append_61) \
+	$(am__append_67)
+src_libfabric_la_LDFLAGS = $(am__append_6) -export-dynamic \
+	$(libfabric_version_script) $(am__append_21) $(am__append_29) \
+	$(am__append_48) $(am__append_62) $(am__append_68)
+src_libfabric_la_LIBADD = $(am__append_12) $(am__append_16) \
+	$(am__append_22) $(am__append_30) $(am__append_34) \
+	$(am__append_39) $(am__append_49) $(am__append_54) \
+	$(am__append_57) $(am__append_63) $(am__append_69)
+src_libfabric_la_DEPENDENCIES = libfabric.map $(am__append_35) \
+	$(am__append_40)
+ at HAVE_DIRECT_TRUE@nodist_rdmainclude_HEADERS = $(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_domain.h \
 @HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_endpoint.h \
 @HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_tagged.h \
 @HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_rma.h \
@@ -2077,8 +2380,8 @@ src_libfabric_la_DEPENDENCIES = libfabric.map $(am__append_33) \
 @HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_atomic.h \
 @HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_cm.h \
 @HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_eq.h \
- at HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_trigger.h
-
+ at HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/fi_direct_trigger.h \
+ at HAVE_DIRECT_TRUE@	$(am__append_7) $(am__append_8)
 real_man_pages = \
         man/man1/fi_info.1 \
         man/man1/fi_pingpong.1 \
@@ -2219,12 +2522,14 @@ dummy_man_pages = \
 
 pkgconfigdir = $(libdir)/pkgconfig
 pkgconfig_DATA = libfabric.pc
-prov_install_man_pages = $(am__append_11) $(am__append_15) \
-	$(am__append_21) $(am__append_29) $(am__append_34) \
-	$(am__append_39) $(am__append_45) $(am__append_55)
+prov_install_man_pages = $(am__append_13) $(am__append_17) \
+	$(am__append_23) $(am__append_31) $(am__append_36) \
+	$(am__append_41) $(am__append_51) $(am__append_64) \
+	$(am__append_70)
 prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 	man/man7/fi_verbs.7 man/man7/fi_usnic.7 man/man7/fi_psm.7 \
-	man/man7/fi_psm2.7 man/man7/fi_mxm.7 man/man7/fi_gni.7
+	man/man7/fi_psm2.7 man/man7/fi_gni.7 man/man7/fi_bgq.7 \
+	man/man7/fi_mlx.7
 @HAVE_SOCKETS_TRUE at _sockets_files = \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_av.c \
 @HAVE_SOCKETS_TRUE@	prov/sockets/src/sock_dom.c \
@@ -2275,7 +2580,6 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_VERBS_TRUE@	prov/verbs/src/fi_verbs.c \
 @HAVE_VERBS_TRUE@	prov/verbs/src/uthash.h \
 @HAVE_VERBS_TRUE@	prov/verbs/src/verbs_atomic.c \
- at HAVE_VERBS_TRUE@	prov/verbs/src/verbs_av.c \
 @HAVE_VERBS_TRUE@	prov/verbs/src/verbs_cm.c \
 @HAVE_VERBS_TRUE@	prov/verbs/src/verbs_cq.c \
 @HAVE_VERBS_TRUE@	prov/verbs/src/verbs_srq.c \
@@ -2403,7 +2707,7 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usdf_poll.h \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usdf_ext.c \
 @HAVE_USNIC_TRUE@	prov/usnic/src/usdf_wait.h \
- at HAVE_USNIC_TRUE@	prov/usnic/src/usdf_wait.c $(am__append_22)
+ at HAVE_USNIC_TRUE@	prov/usnic/src/usdf_wait.c $(am__append_24)
 @HAVE_USNIC_TRUE at _usnic_cppflags = \
 @HAVE_USNIC_TRUE@        -D__LIBUSNIC__ -DWANT_DEBUG_MSGS=0 \
 @HAVE_USNIC_TRUE@        -DHAVE_LIBNL3=$(HAVE_LIBNL3) $(usnic_CPPFLAGS) \
@@ -2481,30 +2785,9 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at libpsmx2_la_CPPFLAGS = $(src_libfabric_la_CPPFLAGS) $(psm2_CPPFLAGS)
 @HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at libpsmx2_la_LDFLAGS = $(psm2_LDFLAGS)
 @HAVE_PSM2_DL_FALSE@@HAVE_PSM2_TRUE at libpsmx2_la_LIBADD = $(psm2_LIBS)
- at HAVE_MXM_TRUE@_mxm_files = prov/mxm/src/mlxm.h \
- at HAVE_MXM_TRUE@	prov/mxm/src/uthash.h \
- at HAVE_MXM_TRUE@	prov/mxm/src/mpool.h \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_mq_storage.h \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_helpers.h \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_init.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_domain.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_cq.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_av.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_ep.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_cm.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_tagged.c \
- at HAVE_MXM_TRUE@	prov/mxm/src/mlxm_mr.c
-
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at libmlxm_fi_la_CPPFLAGS = $(AM_CPPFLAGS) $(mxm_CPPFLAGS)
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at libmlxm_fi_la_SOURCES = $(_mxm_files) $(common_srcs)
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at libmlxm_fi_la_LDFLAGS = \
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE@	$(mxm_LDFLAGS) \
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE@	-module -avoid-version -shared -export-dynamic
-
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at libmlxm_fi_la_LIBADD = $(linkback) $(mxm_LIBS)
- at HAVE_MXM_DL_TRUE@@HAVE_MXM_TRUE at libmlxm_fi_la_DEPENDENCIES = $(linkback)
 @HAVE_GNI_TRUE at _gni_files = \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_atomic.c \
+ at HAVE_GNI_TRUE@	prov/gni/src/gnix_auth_key.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_av.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_bitmap.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_buddy_allocator.c \
@@ -2528,8 +2811,10 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_nameserver.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_nic.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_poll.c \
+ at HAVE_GNI_TRUE@	prov/gni/src/gnix_progress.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_queue.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_rma.c \
+ at HAVE_GNI_TRUE@	prov/gni/src/gnix_sep.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_tags.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_trigger.c \
 @HAVE_GNI_TRUE@	prov/gni/src/gnix_util.c \
@@ -2541,9 +2826,11 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_GNI_TRUE at _gni_headers = \
 @HAVE_GNI_TRUE@	prov/gni/include/fi_ext_gni.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_atomic.h \
+ at HAVE_GNI_TRUE@	prov/gni/include/gnix_auth_key.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_av.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_bitmap.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_buddy_allocator.h \
+ at HAVE_GNI_TRUE@	prov/gni/include/gnix_cm.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_cm_nic.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_cntr.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_cq.h \
@@ -2561,6 +2848,7 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_nameserver.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_nic.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_poll.h \
+ at HAVE_GNI_TRUE@	prov/gni/include/gnix_progress.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_priv.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_queue.h \
 @HAVE_GNI_TRUE@	prov/gni/include/gnix_rma.h \
@@ -2575,6 +2863,7 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at nodist_prov_gni_test_gnitest_SOURCES = \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/allocator.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/av.c \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/auth_key.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/bitmap.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/buddy_allocator.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/cancel.c \
@@ -2585,6 +2874,8 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/dom.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/ep.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/eq.c \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/fabric.c \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/fi_addr_str.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/freelist.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/hashtable.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/mr.c \
@@ -2602,11 +2893,14 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/api.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/api_cq.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/api_cntr.c \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/sep.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/utils.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/vc.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/vc_lookup.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/vector.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/wait.c \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/rdm_dgram_stx.c \
+ at HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/cm.c \
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE@	prov/gni/test/common.c
 
 @HAVE_CRITERION_TRUE@@HAVE_GNI_TRUE at prov_gni_test_gnitest_LDFLAGS = $(CRAY_PMI_LIBS) $(gnitest_LDFLAGS) -static
@@ -2628,6 +2922,8 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_RXM_TRUE@       prov/rxm/src/rxm_conn.c		\
 @HAVE_RXM_TRUE@       prov/rxm/src/rxm_ep.c		\
 @HAVE_RXM_TRUE@       prov/rxm/src/rxm_cq.c		\
+ at HAVE_RXM_TRUE@       prov/rxm/src/rxm_rma.c		\
+ at HAVE_RXM_TRUE@       prov/rxm/src/rxm.c		\
 @HAVE_RXM_TRUE@       prov/rxm/src/rxm.h
 
 @HAVE_RXM_DL_TRUE@@HAVE_RXM_TRUE at librxm_fi_la_SOURCES = $(_rxm_files) $(common_srcs)
@@ -2641,6 +2937,7 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_domain.c	\
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_av.c		\
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_cq.c		\
+ at HAVE_RXD_TRUE@	prov/rxd/src/rxd_cntr.c		\
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_ep.c		\
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd_rma.c		\
 @HAVE_RXD_TRUE@	prov/rxd/src/rxd.h
@@ -2649,6 +2946,125 @@ prov_dist_man_pages = man/man7/fi_sockets.7 man/man7/fi_udp.7 \
 @HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE at librxd_fi_la_LIBADD = $(linkback) $(rxd_shm_LIBS)
 @HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE at librxd_fi_la_LDFLAGS = -module -avoid-version -shared -export-dynamic
 @HAVE_RXD_DL_TRUE@@HAVE_RXD_TRUE at librxd_fi_la_DEPENDENCIES = $(linkback)
+
+#
+# Copyright (C) 2016 by Argonne National Laboratory.
+#
+# This software is available to you under a choice of one of two
+# licenses.  You may choose to be licensed under the terms of the GNU
+# General Public License (GPL) Version 2, available from the file
+# COPYING in the main directory of this source tree, or the
+# BSD license below:
+#
+#     Redistribution and use in source and binary forms, with or
+#     without modification, are permitted provided that the following
+#     conditions are met:
+#
+#      - Redistributions of source code must retain the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer.
+#
+#      - Redistributions in binary form must reproduce the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer in the documentation and/or other materials
+#        provided with the distribution.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+ at HAVE_BGQ_TRUE@bgq_files = prov/bgq/src/fi_bgq_atomic.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_av.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_spi.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_cm.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_cntr.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_cq.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_domain.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_ep.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_fabric.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_info.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_init.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_mr.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_msg.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_rma.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_sep.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_tagged.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_node.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_progress.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_pmi.c
+
+ at HAVE_BGQ_TRUE@bgq_files_nodist = prov/bgq/external/memory_impl.c
+ at HAVE_BGQ_TRUE@bgq_CPPFLAGS = -I at bgq_driver@ -I at bgq_driver@/spi/include/kernel/cnk -I$(builddir)/prov/bgq/include -I$(srcdir)/prov/bgq/include
+ at HAVE_BGQ_TRUE@bgq_LDFLAGS = -static
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at libbgq_fi_la_SOURCES = $(bgq_files) $(common_srcs)
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at nodist_libbgq_fi_la_SOURCES = $(bgq_files_nodist)
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at libbgq_fi_la_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at libbgq_fi_la_LDFLAGS = \
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE@    -module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at libbgq_fi_la_LIBADD = $(linkback) $(bgq_LIBS)
+ at HAVE_BGQ_DL_TRUE@@HAVE_BGQ_TRUE at libbgq_fi_la_DEPENDENCIES = $(linkback)
+ at HAVE_BGQ_TRUE@fi_bgq_agent1_SOURCES = prov/bgq/src/fi_bgq_agent.c
+ at HAVE_BGQ_TRUE@fi_bgq_agent1_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+ at HAVE_BGQ_TRUE@fi_bgq_agent1_LDFLAGS = -all-static $(bgq_LDFLAGS) -Wl,--script=@bgq_driver@/cnk/tools/AppAgent1.lds
+ at HAVE_BGQ_TRUE@fi_bgq_agent0_SOURCES = $(fi_bgq_agent1_SOURCES)
+ at HAVE_BGQ_TRUE@fi_bgq_agent0_CPPFLAGS = $(fi_bgq_agent1_CPPFLAGS)
+ at HAVE_BGQ_TRUE@fi_bgq_agent0_LDFLAGS = -all-static $(bgq_LDFLAGS) -Wl,--script=@bgq_driver@/cnk/tools/AppAgent0.lds
+ at HAVE_BGQ_TRUE@testdir = @bindir@/test
+ at HAVE_BGQ_TRUE@l2atomic_fifo_perf_SOURCES = prov/bgq/src/test/l2atomic_fifo_perf.c
+ at HAVE_BGQ_TRUE@l2atomic_fifo_perf_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+ at HAVE_BGQ_TRUE@l2atomic_fifo_perf_LDFLAGS = \
+ at HAVE_BGQ_TRUE@		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+ at HAVE_BGQ_TRUE@spi_pp_files = prov/bgq/src/test/spi_pingpong.c \
+ at HAVE_BGQ_TRUE@		prov/bgq/src/fi_bgq_spi.c
+
+ at HAVE_BGQ_TRUE@spi_pp_files_nodist = prov/bgq/external/memory_impl.c
+ at HAVE_BGQ_TRUE@spi_pingpong_SOURCES = $(spi_pp_files)
+ at HAVE_BGQ_TRUE@nodist_spi_pingpong_SOURCES = $(spi_pp_files_nodist)
+ at HAVE_BGQ_TRUE@spi_pingpong_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+ at HAVE_BGQ_TRUE@spi_pingpong_LDFLAGS = \
+ at HAVE_BGQ_TRUE@		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+ at HAVE_BGQ_TRUE@rdma_bgqincludedir = $(includedir)/rdma/bgq
+ at HAVE_BGQ_TRUE@rdma_bgqinclude_HEADERS = 
+
+# internal utility functions shared by in-tree providers:
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE at nodist_rdma_bgqinclude_HEADERS = \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_compiler.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_hwi.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_mu.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_spi.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_node.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_progress.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_flight_recorder.h \
+ at HAVE_BGQ_TRUE@@HAVE_DIRECT_TRUE@	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_l2atomic.h
+
+ at HAVE_MLX_TRUE@_mlx_files = prov/mlx/src/mlx.h \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_av.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_cm.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_cq.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_domain.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_ep.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_init.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_tagged.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_fabric.c \
+ at HAVE_MLX_TRUE@    prov/mlx/src/mlx_callbacks.c
+
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at libmlx_fi_la_CPPFLAGS = $(AM_CPPFLAGS) $(mlx_CPPFLAGS)
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at libmlx_fi_la_SOURCES = $(_mlx_files) $(common_srcs)
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at libmlx_fi_la_LDFLAGS = \
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE@	$(mlx_LDFLAGS) \
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE@	-module -avoid-version -shared -export-dynamic
+
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at libmlx_fi_la_LIBADD = $(linkback) $(mlx_LIBS)
+ at HAVE_MLX_DL_TRUE@@HAVE_MLX_TRUE at libmlx_fi_la_DEPENDENCIES = $(linkback)
 man_MANS = $(real_man_pages) $(prov_install_man_pages) $(dummy_man_pages)
 EXTRA_DIST = \
         NEWS.md \
@@ -2663,7 +3079,7 @@ all: config.h
 .SUFFIXES: .c .lo .log .o .obj .test .test$(EXEEXT) .trs
 am--refresh: Makefile
 	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/prov/sockets/Makefile.include $(srcdir)/prov/udp/Makefile.include $(srcdir)/prov/verbs/Makefile.include $(srcdir)/prov/usnic/Makefile.include $(srcdir)/prov/psm/Makefile.include $(srcdir)/prov/psm2/Makefile.include $(srcdir)/prov/mxm/Makefile.include $(srcdir)/prov/gni/Makefile.include $(srcdir)/prov/rxm/Makefile.include $(srcdir)/prov/rxd/Makefile.include $(am__configure_deps)
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/prov/sockets/Makefile.include $(srcdir)/prov/udp/Makefile.include $(srcdir)/prov/verbs/Makefile.include $(srcdir)/prov/usnic/Makefile.include $(srcdir)/prov/psm/Makefile.include $(srcdir)/prov/psm2/Makefile.include $(srcdir)/prov/gni/Makefile.include $(srcdir)/prov/rxm/Makefile.include $(srcdir)/prov/rxd/Makefile.include $(srcdir)/prov/bgq/Makefile.include $(top_srcdir)/prov/bgq/src/test/Makefile.include $(srcdir)/prov/mlx/Makefile. [...]
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
@@ -2676,7 +3092,6 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am $(srcdir)/prov/sockets/Makefile.in
 	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
 	$(am__cd) $(top_srcdir) && \
 	  $(AUTOMAKE) --foreign Makefile
-.PRECIOUS: Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -2686,7 +3101,7 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
 	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
 	esac;
-$(srcdir)/prov/sockets/Makefile.include $(srcdir)/prov/udp/Makefile.include $(srcdir)/prov/verbs/Makefile.include $(srcdir)/prov/usnic/Makefile.include $(srcdir)/prov/psm/Makefile.include $(srcdir)/prov/psm2/Makefile.include $(srcdir)/prov/mxm/Makefile.include $(srcdir)/prov/gni/Makefile.include $(srcdir)/prov/rxm/Makefile.include $(srcdir)/prov/rxd/Makefile.include:
+$(srcdir)/prov/sockets/Makefile.include $(srcdir)/prov/udp/Makefile.include $(srcdir)/prov/verbs/Makefile.include $(srcdir)/prov/usnic/Makefile.include $(srcdir)/prov/psm/Makefile.include $(srcdir)/prov/psm2/Makefile.include $(srcdir)/prov/gni/Makefile.include $(srcdir)/prov/rxm/Makefile.include $(srcdir)/prov/rxd/Makefile.include $(srcdir)/prov/bgq/Makefile.include $(top_srcdir)/prov/bgq/src/test/Makefile.include $(srcdir)/prov/mlx/Makefile.include $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
 	$(SHELL) ./config.status --recheck
@@ -2698,8 +3113,8 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 
 config.h: stamp-h1
-	@if test ! -f $@; then rm -f stamp-h1; else :; fi
-	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
+	@test -f $@ || rm -f stamp-h1
+	@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1
 
 stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
 	@rm -f stamp-h1
@@ -2711,6 +3126,20 @@ $(srcdir)/config.h.in:  $(am__configure_deps)
 
 distclean-hdr:
 	-rm -f config.h stamp-h1
+prov/psm/libfabric-psm.spec: $(top_builddir)/config.status $(top_srcdir)/prov/psm/libfabric-psm.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+prov/psm2/libfabric-psm2.spec: $(top_builddir)/config.status $(top_srcdir)/prov/psm2/libfabric-psm2.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+prov/sockets/libfabric-sockets.spec: $(top_builddir)/config.status $(top_srcdir)/prov/sockets/libfabric-sockets.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+prov/verbs/libfabric-verbs.spec: $(top_builddir)/config.status $(top_srcdir)/prov/verbs/libfabric-verbs.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+prov/usnic/libfabric-usnic.spec: $(top_builddir)/config.status $(top_srcdir)/prov/usnic/libfabric-usnic.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+prov/udp/libfabric-udp.spec: $(top_builddir)/config.status $(top_srcdir)/prov/udp/libfabric-udp.spec.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+prov/bgq/include/rdma/fi_direct.h: $(top_builddir)/config.status $(top_srcdir)/prov/bgq/include/rdma/fi_direct.h.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
 libfabric.pc: $(top_builddir)/config.status $(srcdir)/libfabric.pc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $@
 libfabric.spec: $(top_builddir)/config.status $(srcdir)/libfabric.spec.in
@@ -2798,6 +3227,141 @@ clean-pkglibLTLIBRARIES:
 	  echo rm -f $${locs}; \
 	  rm -f $${locs}; \
 	}
+prov/bgq/src/$(am__dirstamp):
+	@$(MKDIR_P) prov/bgq/src
+	@: > prov/bgq/src/$(am__dirstamp)
+prov/bgq/src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) prov/bgq/src/$(DEPDIR)
+	@: > prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo: prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/$(DEPDIR)
+	@: > src/$(DEPDIR)/$(am__dirstamp)
+src/libbgq_fi_la-common.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libbgq_fi_la-enosys.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libbgq_fi_la-rbtree.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libbgq_fi_la-fasthash.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libbgq_fi_la-indexer.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+src/libbgq_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/$(am__dirstamp):
+	@$(MKDIR_P) prov/util/src
+	@: > prov/util/src/$(am__dirstamp)
+prov/util/src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) prov/util/src/$(DEPDIR)
+	@: > prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_attr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_av.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_cq.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_domain.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_ep.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_eq.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_fabric.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_main.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_poll.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_wait.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_buf.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_mr.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libbgq_fi_la-util_ns.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+src/unix/$(am__dirstamp):
+	@$(MKDIR_P) src/unix
+	@: > src/unix/$(am__dirstamp)
+src/unix/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/unix/$(DEPDIR)
+	@: > src/unix/$(DEPDIR)/$(am__dirstamp)
+src/unix/libbgq_fi_la-osd.lo: src/unix/$(am__dirstamp) \
+	src/unix/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/external/$(am__dirstamp):
+	@$(MKDIR_P) prov/bgq/external
+	@: > prov/bgq/external/$(am__dirstamp)
+prov/bgq/external/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) prov/bgq/external/$(DEPDIR)
+	@: > prov/bgq/external/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/external/libbgq_fi_la-memory_impl.lo:  \
+	prov/bgq/external/$(am__dirstamp) \
+	prov/bgq/external/$(DEPDIR)/$(am__dirstamp)
+
+libbgq-fi.la: $(libbgq_fi_la_OBJECTS) $(libbgq_fi_la_DEPENDENCIES) $(EXTRA_libbgq_fi_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libbgq_fi_la_LINK) $(am_libbgq_fi_la_rpath) $(libbgq_fi_la_OBJECTS) $(libbgq_fi_la_LIBADD) $(LIBS)
 prov/gni/src/$(am__dirstamp):
 	@$(MKDIR_P) prov/gni/src
 	@: > prov/gni/src/$(am__dirstamp)
@@ -2807,6 +3371,9 @@ prov/gni/src/$(DEPDIR)/$(am__dirstamp):
 prov/gni/src/libgnix_fi_la-gnix_atomic.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
+prov/gni/src/libgnix_fi_la-gnix_auth_key.lo:  \
+	prov/gni/src/$(am__dirstamp) \
+	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_av.lo: prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_bitmap.lo:  \
@@ -2864,11 +3431,16 @@ prov/gni/src/libgnix_fi_la-gnix_nic.lo: prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_poll.lo: prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
+prov/gni/src/libgnix_fi_la-gnix_progress.lo:  \
+	prov/gni/src/$(am__dirstamp) \
+	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_queue.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_rma.lo: prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
+prov/gni/src/libgnix_fi_la-gnix_sep.lo: prov/gni/src/$(am__dirstamp) \
+	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_tags.lo: prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_trigger.lo:  \
@@ -2886,12 +3458,6 @@ prov/gni/src/libgnix_fi_la-gnix_xpmem.lo:  \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/libgnix_fi_la-gnix_wait.lo: prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
-src/$(am__dirstamp):
-	@$(MKDIR_P) src
-	@: > src/$(am__dirstamp)
-src/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/$(DEPDIR)
-	@: > src/$(DEPDIR)/$(am__dirstamp)
 src/libgnix_fi_la-common.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/libgnix_fi_la-enosys.lo: src/$(am__dirstamp) \
@@ -2902,12 +3468,11 @@ src/libgnix_fi_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/libgnix_fi_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/$(am__dirstamp):
-	@$(MKDIR_P) prov/util/src
-	@: > prov/util/src/$(am__dirstamp)
-prov/util/src/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) prov/util/src/$(DEPDIR)
-	@: > prov/util/src/$(DEPDIR)/$(am__dirstamp)
+src/libgnix_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libgnix_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libgnix_fi_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -2915,6 +3480,9 @@ prov/util/src/libgnix_fi_la-util_av.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libgnix_fi_la-util_cq.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libgnix_fi_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libgnix_fi_la-util_domain.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -2939,97 +3507,93 @@ prov/util/src/libgnix_fi_la-util_buf.lo:  \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libgnix_fi_la-util_mr.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/$(am__dirstamp):
-	@$(MKDIR_P) src/osx
-	@: > src/osx/$(am__dirstamp)
-src/osx/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/osx/$(DEPDIR)
-	@: > src/osx/$(DEPDIR)/$(am__dirstamp)
-src/osx/libgnix_fi_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
-src/unix/$(am__dirstamp):
-	@$(MKDIR_P) src/unix
-	@: > src/unix/$(am__dirstamp)
-src/unix/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/unix/$(DEPDIR)
-	@: > src/unix/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libgnix_fi_la-util_ns.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/libgnix_fi_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
 libgnix-fi.la: $(libgnix_fi_la_OBJECTS) $(libgnix_fi_la_DEPENDENCIES) $(EXTRA_libgnix_fi_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(libgnix_fi_la_LINK) $(am_libgnix_fi_la_rpath) $(libgnix_fi_la_OBJECTS) $(libgnix_fi_la_LIBADD) $(LIBS)
-prov/mxm/src/$(am__dirstamp):
-	@$(MKDIR_P) prov/mxm/src
-	@: > prov/mxm/src/$(am__dirstamp)
-prov/mxm/src/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) prov/mxm/src/$(DEPDIR)
-	@: > prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_init.lo: prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo: prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_av.lo: prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo: prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo: prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo: prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-src/libmlxm_fi_la-common.lo: src/$(am__dirstamp) \
+prov/mlx/src/$(am__dirstamp):
+	@$(MKDIR_P) prov/mlx/src
+	@: > prov/mlx/src/$(am__dirstamp)
+prov/mlx/src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) prov/mlx/src/$(DEPDIR)
+	@: > prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_av.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_cm.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_cq.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_domain.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_ep.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_init.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_tagged.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_fabric.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo:  \
+	prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+src/libmlx_fi_la-common.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
-src/libmlxm_fi_la-enosys.lo: src/$(am__dirstamp) \
+src/libmlx_fi_la-enosys.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
-src/libmlxm_fi_la-rbtree.lo: src/$(am__dirstamp) \
+src/libmlx_fi_la-rbtree.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
-src/libmlxm_fi_la-fasthash.lo: src/$(am__dirstamp) \
+src/libmlx_fi_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
-src/libmlxm_fi_la-indexer.lo: src/$(am__dirstamp) \
+src/libmlx_fi_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_attr.lo:  \
+src/libmlx_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libmlx_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libmlx_fi_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_av.lo: prov/util/src/$(am__dirstamp) \
+prov/util/src/libmlx_fi_la-util_av.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_cq.lo: prov/util/src/$(am__dirstamp) \
+prov/util/src/libmlx_fi_la-util_cq.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_domain.lo:  \
+prov/util/src/libmlx_fi_la-util_cntr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_ep.lo: prov/util/src/$(am__dirstamp) \
+prov/util/src/libmlx_fi_la-util_domain.lo:  \
+	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_eq.lo: prov/util/src/$(am__dirstamp) \
+prov/util/src/libmlx_fi_la-util_ep.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_fabric.lo:  \
-	prov/util/src/$(am__dirstamp) \
+prov/util/src/libmlx_fi_la-util_eq.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_main.lo:  \
+prov/util/src/libmlx_fi_la-util_fabric.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_poll.lo:  \
+prov/util/src/libmlx_fi_la-util_main.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_wait.lo:  \
+prov/util/src/libmlx_fi_la-util_poll.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_buf.lo:  \
+prov/util/src/libmlx_fi_la-util_wait.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-prov/util/src/libmlxm_fi_la-util_mr.lo: prov/util/src/$(am__dirstamp) \
+prov/util/src/libmlx_fi_la-util_buf.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libmlx_fi_la-util_mr.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libmlx_fi_la-util_ns.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/libmlxm_fi_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
-src/unix/libmlxm_fi_la-osd.lo: src/unix/$(am__dirstamp) \
+src/unix/libmlx_fi_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
-libmlxm-fi.la: $(libmlxm_fi_la_OBJECTS) $(libmlxm_fi_la_DEPENDENCIES) $(EXTRA_libmlxm_fi_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libmlxm_fi_la_LINK) $(am_libmlxm_fi_la_rpath) $(libmlxm_fi_la_OBJECTS) $(libmlxm_fi_la_LIBADD) $(LIBS)
+libmlx-fi.la: $(libmlx_fi_la_OBJECTS) $(libmlx_fi_la_DEPENDENCIES) $(EXTRA_libmlx_fi_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libmlx_fi_la_LINK) $(am_libmlx_fi_la_rpath) $(libmlx_fi_la_OBJECTS) $(libmlx_fi_la_LIBADD) $(LIBS)
 prov/psm/src/$(am__dirstamp):
 	@$(MKDIR_P) prov/psm/src
 	@: > prov/psm/src/$(am__dirstamp)
@@ -3084,6 +3648,11 @@ src/libpsmx_fi_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/libpsmx_fi_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/libpsmx_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libpsmx_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libpsmx_fi_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3091,6 +3660,9 @@ prov/util/src/libpsmx_fi_la-util_av.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libpsmx_fi_la-util_cq.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libpsmx_fi_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libpsmx_fi_la-util_domain.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3115,8 +3687,8 @@ prov/util/src/libpsmx_fi_la-util_buf.lo:  \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libpsmx_fi_la-util_mr.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/libpsmx_fi_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libpsmx_fi_la-util_ns.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/libpsmx_fi_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
@@ -3223,6 +3795,11 @@ src/libpsmx2_fi_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/libpsmx2_fi_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/libpsmx2_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libpsmx2_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libpsmx2_fi_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3232,6 +3809,9 @@ prov/util/src/libpsmx2_fi_la-util_av.lo:  \
 prov/util/src/libpsmx2_fi_la-util_cq.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libpsmx2_fi_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libpsmx2_fi_la-util_domain.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3259,8 +3839,9 @@ prov/util/src/libpsmx2_fi_la-util_buf.lo:  \
 prov/util/src/libpsmx2_fi_la-util_mr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/libpsmx2_fi_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libpsmx2_fi_la-util_ns.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/libpsmx2_fi_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
@@ -3327,6 +3908,8 @@ prov/rxd/src/rxd_av.lo: prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/rxd_cq.lo: prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
+prov/rxd/src/rxd_cntr.lo: prov/rxd/src/$(am__dirstamp) \
+	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/rxd_ep.lo: prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/rxd_rma.lo: prov/rxd/src/$(am__dirstamp) \
@@ -3336,12 +3919,17 @@ src/enosys.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
 src/rbtree.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
 src/fasthash.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
 src/indexer.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+src/iov.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/util_atomic.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/util_attr.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/util_av.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/util_cq.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/util_cntr.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/util_domain.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/util_ep.lo: prov/util/src/$(am__dirstamp) \
@@ -3360,8 +3948,8 @@ prov/util/src/util_buf.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/util_mr.lo: prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/util_ns.lo: prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
@@ -3387,6 +3975,10 @@ prov/rxm/src/rxm_ep.lo: prov/rxm/src/$(am__dirstamp) \
 	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxm/src/rxm_cq.lo: prov/rxm/src/$(am__dirstamp) \
 	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
+prov/rxm/src/rxm_rma.lo: prov/rxm/src/$(am__dirstamp) \
+	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
+prov/rxm/src/rxm.lo: prov/rxm/src/$(am__dirstamp) \
+	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
 
 librxm-fi.la: $(librxm_fi_la_OBJECTS) $(librxm_fi_la_DEPENDENCIES) $(EXTRA_librxm_fi_la_DEPENDENCIES) 
 	$(AM_V_CCLD)$(librxm_fi_la_LINK) $(am_librxm_fi_la_rpath) $(librxm_fi_la_OBJECTS) $(librxm_fi_la_LIBADD) $(LIBS)
@@ -3618,6 +4210,11 @@ src/libusnic_fi_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/libusnic_fi_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/libusnic_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libusnic_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libusnic_fi_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3627,6 +4224,9 @@ prov/util/src/libusnic_fi_la-util_av.lo:  \
 prov/util/src/libusnic_fi_la-util_cq.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libusnic_fi_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libusnic_fi_la-util_domain.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3654,8 +4254,9 @@ prov/util/src/libusnic_fi_la-util_buf.lo:  \
 prov/util/src/libusnic_fi_la-util_mr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/libusnic_fi_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libusnic_fi_la-util_ns.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/libusnic_fi_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
@@ -3673,9 +4274,6 @@ prov/verbs/src/libverbs_fi_la-fi_verbs.lo:  \
 prov/verbs/src/libverbs_fi_la-verbs_atomic.lo:  \
 	prov/verbs/src/$(am__dirstamp) \
 	prov/verbs/src/$(DEPDIR)/$(am__dirstamp)
-prov/verbs/src/libverbs_fi_la-verbs_av.lo:  \
-	prov/verbs/src/$(am__dirstamp) \
-	prov/verbs/src/$(DEPDIR)/$(am__dirstamp)
 prov/verbs/src/libverbs_fi_la-verbs_cm.lo:  \
 	prov/verbs/src/$(am__dirstamp) \
 	prov/verbs/src/$(DEPDIR)/$(am__dirstamp)
@@ -3746,6 +4344,11 @@ src/libverbs_fi_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/libverbs_fi_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/libverbs_fi_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libverbs_fi_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libverbs_fi_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3755,6 +4358,9 @@ prov/util/src/libverbs_fi_la-util_av.lo:  \
 prov/util/src/libverbs_fi_la-util_cq.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libverbs_fi_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/libverbs_fi_la-util_domain.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3782,8 +4388,9 @@ prov/util/src/libverbs_fi_la-util_buf.lo:  \
 prov/util/src/libverbs_fi_la-util_mr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/libverbs_fi_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/libverbs_fi_la-util_ns.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/libverbs_fi_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 
@@ -3797,6 +4404,8 @@ src/src_libfabric_la-log.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/src_libfabric_la-var.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/src_libfabric_la-abi_1_0.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
 src/src_libfabric_la-common.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/src_libfabric_la-enosys.lo: src/$(am__dirstamp) \
@@ -3807,6 +4416,11 @@ src/src_libfabric_la-fasthash.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
 src/src_libfabric_la-indexer.lo: src/$(am__dirstamp) \
 	src/$(DEPDIR)/$(am__dirstamp)
+src/src_libfabric_la-iov.lo: src/$(am__dirstamp) \
+	src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/src_libfabric_la-util_atomic.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/src_libfabric_la-util_attr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3816,6 +4430,9 @@ prov/util/src/src_libfabric_la-util_av.lo:  \
 prov/util/src/src_libfabric_la-util_cq.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/src_libfabric_la-util_cntr.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 prov/util/src/src_libfabric_la-util_domain.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
@@ -3843,8 +4460,9 @@ prov/util/src/src_libfabric_la-util_buf.lo:  \
 prov/util/src/src_libfabric_la-util_mr.lo:  \
 	prov/util/src/$(am__dirstamp) \
 	prov/util/src/$(DEPDIR)/$(am__dirstamp)
-src/osx/src_libfabric_la-osd.lo: src/osx/$(am__dirstamp) \
-	src/osx/$(DEPDIR)/$(am__dirstamp)
+prov/util/src/src_libfabric_la-util_ns.lo:  \
+	prov/util/src/$(am__dirstamp) \
+	prov/util/src/$(DEPDIR)/$(am__dirstamp)
 src/unix/src_libfabric_la-osd.lo: src/unix/$(am__dirstamp) \
 	src/unix/$(DEPDIR)/$(am__dirstamp)
 prov/sockets/src/src_libfabric_la-sock_av.lo:  \
@@ -3937,9 +4555,6 @@ prov/verbs/src/src_libfabric_la-fi_verbs.lo:  \
 prov/verbs/src/src_libfabric_la-verbs_atomic.lo:  \
 	prov/verbs/src/$(am__dirstamp) \
 	prov/verbs/src/$(DEPDIR)/$(am__dirstamp)
-prov/verbs/src/src_libfabric_la-verbs_av.lo:  \
-	prov/verbs/src/$(am__dirstamp) \
-	prov/verbs/src/$(DEPDIR)/$(am__dirstamp)
 prov/verbs/src/src_libfabric_la-verbs_cm.lo:  \
 	prov/verbs/src/$(am__dirstamp) \
 	prov/verbs/src/$(DEPDIR)/$(am__dirstamp)
@@ -4126,33 +4741,12 @@ prov/usnic/src/src_libfabric_la-usdf_wait.lo:  \
 prov/usnic/src/src_libfabric_la-usdf_fake_ibv.lo:  \
 	prov/usnic/src/$(am__dirstamp) \
 	prov/usnic/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_init.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_domain.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_cq.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_av.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_ep.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_cm.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_tagged.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-prov/mxm/src/src_libfabric_la-mlxm_mr.lo:  \
-	prov/mxm/src/$(am__dirstamp) \
-	prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/src_libfabric_la-gnix_atomic.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
+prov/gni/src/src_libfabric_la-gnix_auth_key.lo:  \
+	prov/gni/src/$(am__dirstamp) \
+	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/src_libfabric_la-gnix_av.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
@@ -4222,12 +4816,18 @@ prov/gni/src/src_libfabric_la-gnix_nic.lo:  \
 prov/gni/src/src_libfabric_la-gnix_poll.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
+prov/gni/src/src_libfabric_la-gnix_progress.lo:  \
+	prov/gni/src/$(am__dirstamp) \
+	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/src_libfabric_la-gnix_queue.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/src_libfabric_la-gnix_rma.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
+prov/gni/src/src_libfabric_la-gnix_sep.lo:  \
+	prov/gni/src/$(am__dirstamp) \
+	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 prov/gni/src/src_libfabric_la-gnix_tags.lo:  \
 	prov/gni/src/$(am__dirstamp) \
 	prov/gni/src/$(DEPDIR)/$(am__dirstamp)
@@ -4268,6 +4868,11 @@ prov/rxm/src/src_libfabric_la-rxm_ep.lo: prov/rxm/src/$(am__dirstamp) \
 	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxm/src/src_libfabric_la-rxm_cq.lo: prov/rxm/src/$(am__dirstamp) \
 	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
+prov/rxm/src/src_libfabric_la-rxm_rma.lo:  \
+	prov/rxm/src/$(am__dirstamp) \
+	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
+prov/rxm/src/src_libfabric_la-rxm.lo: prov/rxm/src/$(am__dirstamp) \
+	prov/rxm/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/src_libfabric_la-rxd_attr.lo:  \
 	prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
@@ -4284,11 +4889,97 @@ prov/rxd/src/src_libfabric_la-rxd_av.lo: prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/src_libfabric_la-rxd_cq.lo: prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
+prov/rxd/src/src_libfabric_la-rxd_cntr.lo:  \
+	prov/rxd/src/$(am__dirstamp) \
+	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/src_libfabric_la-rxd_ep.lo: prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
 prov/rxd/src/src_libfabric_la-rxd_rma.lo:  \
 	prov/rxd/src/$(am__dirstamp) \
 	prov/rxd/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_av.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_info.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_init.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_node.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo:  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_av.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_cm.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_cq.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_domain.lo:  \
+	prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_ep.lo: prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_init.lo:  \
+	prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_tagged.lo:  \
+	prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_fabric.lo:  \
+	prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/mlx/src/src_libfabric_la-mlx_callbacks.lo:  \
+	prov/mlx/src/$(am__dirstamp) \
+	prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/external/src_libfabric_la-memory_impl.lo:  \
+	prov/bgq/external/$(am__dirstamp) \
+	prov/bgq/external/$(DEPDIR)/$(am__dirstamp)
 
 src/libfabric.la: $(src_libfabric_la_OBJECTS) $(src_libfabric_la_DEPENDENCIES) $(EXTRA_src_libfabric_la_DEPENDENCIES) src/$(am__dirstamp)
 	$(AM_V_CCLD)$(src_libfabric_la_LINK) $(am_src_libfabric_la_rpath) $(src_libfabric_la_OBJECTS) $(src_libfabric_la_LIBADD) $(LIBS)
@@ -4341,6 +5032,131 @@ clean-binPROGRAMS:
 	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
 	echo " rm -f" $$list; \
 	rm -f $$list
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-sbinPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(sbindir)" && rm -f $$files
+
+clean-sbinPROGRAMS:
+	@list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+install-testPROGRAMS: $(test_PROGRAMS)
+	@$(NORMAL_INSTALL)
+	@list='$(test_PROGRAMS)'; test -n "$(testdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(testdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(testdir)" || exit 1; \
+	fi; \
+	for p in $$list; do echo "$$p $$p"; done | \
+	sed 's/$(EXEEXT)$$//' | \
+	while read p p1; do if test -f $$p \
+	 || test -f $$p1 \
+	  ; then echo "$$p"; echo "$$p"; else :; fi; \
+	done | \
+	sed -e 'p;s,.*/,,;n;h' \
+	    -e 's|.*|.|' \
+	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+	sed 'N;N;N;s,\n, ,g' | \
+	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+	    if ($$2 == $$4) files[d] = files[d] " " $$1; \
+	    else { print "f", $$3 "/" $$4, $$1; } } \
+	  END { for (d in files) print "f", d, files[d] }' | \
+	while read type dir files; do \
+	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+	    test -z "$$files" || { \
+	    echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(testdir)$$dir'"; \
+	    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(testdir)$$dir" || exit $$?; \
+	    } \
+	; done
+
+uninstall-testPROGRAMS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(test_PROGRAMS)'; test -n "$(testdir)" || list=; \
+	files=`for p in $$list; do echo "$$p"; done | \
+	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+	      -e 's/$$/$(EXEEXT)/' \
+	`; \
+	test -n "$$list" || exit 0; \
+	echo " ( cd '$(DESTDIR)$(testdir)' && rm -f" $$files ")"; \
+	cd "$(DESTDIR)$(testdir)" && rm -f $$files
+
+clean-testPROGRAMS:
+	@list='$(test_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.$(OBJEXT):  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+
+fi_bgq_agent0$(EXEEXT): $(fi_bgq_agent0_OBJECTS) $(fi_bgq_agent0_DEPENDENCIES) $(EXTRA_fi_bgq_agent0_DEPENDENCIES) 
+	@rm -f fi_bgq_agent0$(EXEEXT)
+	$(AM_V_CCLD)$(fi_bgq_agent0_LINK) $(fi_bgq_agent0_OBJECTS) $(fi_bgq_agent0_LDADD) $(LIBS)
+prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.$(OBJEXT):  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+
+fi_bgq_agent1$(EXEEXT): $(fi_bgq_agent1_OBJECTS) $(fi_bgq_agent1_DEPENDENCIES) $(EXTRA_fi_bgq_agent1_DEPENDENCIES) 
+	@rm -f fi_bgq_agent1$(EXEEXT)
+	$(AM_V_CCLD)$(fi_bgq_agent1_LINK) $(fi_bgq_agent1_OBJECTS) $(fi_bgq_agent1_LDADD) $(LIBS)
+prov/bgq/src/test/$(am__dirstamp):
+	@$(MKDIR_P) prov/bgq/src/test
+	@: > prov/bgq/src/test/$(am__dirstamp)
+prov/bgq/src/test/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) prov/bgq/src/test/$(DEPDIR)
+	@: > prov/bgq/src/test/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.$(OBJEXT):  \
+	prov/bgq/src/test/$(am__dirstamp) \
+	prov/bgq/src/test/$(DEPDIR)/$(am__dirstamp)
+
+l2atomic_fifo_perf$(EXEEXT): $(l2atomic_fifo_perf_OBJECTS) $(l2atomic_fifo_perf_DEPENDENCIES) $(EXTRA_l2atomic_fifo_perf_DEPENDENCIES) 
+	@rm -f l2atomic_fifo_perf$(EXEEXT)
+	$(AM_V_CCLD)$(l2atomic_fifo_perf_LINK) $(l2atomic_fifo_perf_OBJECTS) $(l2atomic_fifo_perf_LDADD) $(LIBS)
 prov/gni/test/$(am__dirstamp):
 	@$(MKDIR_P) prov/gni/test
 	@: > prov/gni/test/$(am__dirstamp)
@@ -4353,6 +5169,9 @@ prov/gni/test/prov_gni_test_gnitest-allocator.$(OBJEXT):  \
 prov/gni/test/prov_gni_test_gnitest-av.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
+prov/gni/test/prov_gni_test_gnitest-auth_key.$(OBJEXT):  \
+	prov/gni/test/$(am__dirstamp) \
+	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
 prov/gni/test/prov_gni_test_gnitest-bitmap.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
@@ -4383,6 +5202,12 @@ prov/gni/test/prov_gni_test_gnitest-ep.$(OBJEXT):  \
 prov/gni/test/prov_gni_test_gnitest-eq.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
+prov/gni/test/prov_gni_test_gnitest-fabric.$(OBJEXT):  \
+	prov/gni/test/$(am__dirstamp) \
+	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
+prov/gni/test/prov_gni_test_gnitest-fi_addr_str.$(OBJEXT):  \
+	prov/gni/test/$(am__dirstamp) \
+	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
 prov/gni/test/prov_gni_test_gnitest-freelist.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
@@ -4434,6 +5259,9 @@ prov/gni/test/prov_gni_test_gnitest-api_cq.$(OBJEXT):  \
 prov/gni/test/prov_gni_test_gnitest-api_cntr.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
+prov/gni/test/prov_gni_test_gnitest-sep.$(OBJEXT):  \
+	prov/gni/test/$(am__dirstamp) \
+	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
 prov/gni/test/prov_gni_test_gnitest-utils.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
@@ -4449,6 +5277,12 @@ prov/gni/test/prov_gni_test_gnitest-vector.$(OBJEXT):  \
 prov/gni/test/prov_gni_test_gnitest-wait.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
+prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.$(OBJEXT):  \
+	prov/gni/test/$(am__dirstamp) \
+	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
+prov/gni/test/prov_gni_test_gnitest-cm.$(OBJEXT):  \
+	prov/gni/test/$(am__dirstamp) \
+	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
 prov/gni/test/prov_gni_test_gnitest-common.$(OBJEXT):  \
 	prov/gni/test/$(am__dirstamp) \
 	prov/gni/test/$(DEPDIR)/$(am__dirstamp)
@@ -4456,6 +5290,19 @@ prov/gni/test/prov_gni_test_gnitest-common.$(OBJEXT):  \
 prov/gni/test/gnitest$(EXEEXT): $(prov_gni_test_gnitest_OBJECTS) $(prov_gni_test_gnitest_DEPENDENCIES) $(EXTRA_prov_gni_test_gnitest_DEPENDENCIES) prov/gni/test/$(am__dirstamp)
 	@rm -f prov/gni/test/gnitest$(EXEEXT)
 	$(AM_V_CCLD)$(prov_gni_test_gnitest_LINK) $(prov_gni_test_gnitest_OBJECTS) $(prov_gni_test_gnitest_LDADD) $(LIBS)
+prov/bgq/src/test/spi_pingpong-spi_pingpong.$(OBJEXT):  \
+	prov/bgq/src/test/$(am__dirstamp) \
+	prov/bgq/src/test/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/src/spi_pingpong-fi_bgq_spi.$(OBJEXT):  \
+	prov/bgq/src/$(am__dirstamp) \
+	prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+prov/bgq/external/spi_pingpong-memory_impl.$(OBJEXT):  \
+	prov/bgq/external/$(am__dirstamp) \
+	prov/bgq/external/$(DEPDIR)/$(am__dirstamp)
+
+spi_pingpong$(EXEEXT): $(spi_pingpong_OBJECTS) $(spi_pingpong_DEPENDENCIES) $(EXTRA_spi_pingpong_DEPENDENCIES) 
+	@rm -f spi_pingpong$(EXEEXT)
+	$(AM_V_CCLD)$(spi_pingpong_LINK) $(spi_pingpong_OBJECTS) $(spi_pingpong_LDADD) $(LIBS)
 util/$(am__dirstamp):
 	@$(MKDIR_P) util
 	@: > util/$(am__dirstamp)
@@ -4518,11 +5365,16 @@ uninstall-binSCRIPTS:
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
+	-rm -f prov/bgq/external/*.$(OBJEXT)
+	-rm -f prov/bgq/external/*.lo
+	-rm -f prov/bgq/src/*.$(OBJEXT)
+	-rm -f prov/bgq/src/*.lo
+	-rm -f prov/bgq/src/test/*.$(OBJEXT)
 	-rm -f prov/gni/src/*.$(OBJEXT)
 	-rm -f prov/gni/src/*.lo
 	-rm -f prov/gni/test/*.$(OBJEXT)
-	-rm -f prov/mxm/src/*.$(OBJEXT)
-	-rm -f prov/mxm/src/*.lo
+	-rm -f prov/mlx/src/*.$(OBJEXT)
+	-rm -f prov/mlx/src/*.lo
 	-rm -f prov/psm/src/*.$(OBJEXT)
 	-rm -f prov/psm/src/*.lo
 	-rm -f prov/psm2/src/*.$(OBJEXT)
@@ -4547,8 +5399,6 @@ mostlyclean-compile:
 	-rm -f prov/verbs/src/ep_rdm/*.lo
 	-rm -f src/*.$(OBJEXT)
 	-rm -f src/*.lo
-	-rm -f src/osx/*.$(OBJEXT)
-	-rm -f src/osx/*.lo
 	-rm -f src/unix/*.$(OBJEXT)
 	-rm -f src/unix/*.lo
 	-rm -f util/*.$(OBJEXT)
@@ -4556,7 +5406,54 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/external/$(DEPDIR)/libbgq_fi_la-memory_impl.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/external/$(DEPDIR)/src_libfabric_la-memory_impl.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_atomic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cntr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_domain.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_ep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_fabric.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_info.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_msg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_node.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_pmi.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_progress.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_rma.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_sep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_spi.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_tagged.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_atomic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cntr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_domain.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_ep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_fabric.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_info.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_msg.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_node.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_pmi.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_progress.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_rma.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_sep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_spi.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_tagged.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_atomic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_auth_key.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_bitmap.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_buddy_allocator.Plo at am__quote@
@@ -4580,8 +5477,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_nameserver.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_nic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_poll.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_progress.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_queue.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_rma.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_sep.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_tags.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_trigger.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_util.Plo at am__quote@
@@ -4590,6 +5489,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_wait.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_xpmem.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_atomic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_auth_key.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_bitmap.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_buddy_allocator.Plo at am__quote@
@@ -4613,8 +5513,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_nameserver.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_nic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_poll.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_progress.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_queue.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_rma.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_sep.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_tags.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_trigger.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_util.Plo at am__quote@
@@ -4626,10 +5528,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-api.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-api_cntr.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-api_cq.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-av.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-bitmap.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-buddy_allocator.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cancel.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cntr.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-common.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cq.Po at am__quote@
@@ -4638,6 +5542,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-dom.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-ep.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-eq.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-freelist.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-hashtable.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-mr.Po at am__quote@
@@ -4647,32 +5553,36 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-queue.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_atomic.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_rma.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_fi_pcd_trecv_msg.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_rx_overrun.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_sr.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_tagged_sr.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-tags.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-utils.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-vc.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-vc_lookup.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-vector.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-wait.Po at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_av.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cm.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cq.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_domain.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_ep.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_init.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_mr.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_tagged.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_av.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cm.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cq.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_domain.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_ep.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_init.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_mr.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_tagged.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_callbacks.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_domain.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_ep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_fabric.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_tagged.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_callbacks.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cm.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_domain.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_ep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_fabric.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_tagged.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/psm/src/$(DEPDIR)/libpsmx_fi_la-psmx_am.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/psm/src/$(DEPDIR)/libpsmx_fi_la-psmx_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/psm/src/$(DEPDIR)/libpsmx_fi_la-psmx_av.Plo at am__quote@
@@ -4741,6 +5651,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/psm2/src/$(DEPDIR)/libpsmx2_la-psmx2_wait.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_ep.Plo at am__quote@
@@ -4749,12 +5660,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/rxd_rma.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_ep.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_init.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_rma.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_conn.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_cq.Plo at am__quote@
@@ -4762,6 +5675,8 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_ep.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/rxm_rma.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_conn.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_cq.Plo at am__quote@
@@ -4769,6 +5684,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_ep.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_init.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_rma.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/sockets/src/$(DEPDIR)/sock_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/sockets/src/$(DEPDIR)/sock_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/sockets/src/$(DEPDIR)/sock_cntr.Plo at am__quote@
@@ -4913,9 +5829,26 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/usnic/src/usnic_direct/$(DEPDIR)/src_libfabric_la-vnic_intr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/usnic/src/usnic_direct/$(DEPDIR)/src_libfabric_la-vnic_rq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/usnic/src/usnic_direct/$(DEPDIR)/src_libfabric_la-vnic_wq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_atomic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_attr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cntr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_domain.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_eq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_fabric.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_main.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ns.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_poll.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libbgq_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_ep.Plo at am__quote@
@@ -4923,23 +5856,29 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libgnix_fi_la-util_wait.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_attr.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_av.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_buf.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_cq.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_domain.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_ep.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_eq.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_fabric.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_main.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_mr.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_poll.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_atomic.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_attr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_av.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cntr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_domain.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ep.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_eq.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_fabric.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_main.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ns.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_poll.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libmlx_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_ep.Plo at am__quote@
@@ -4947,11 +5886,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_ep.Plo at am__quote@
@@ -4959,11 +5901,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_ep.Plo at am__quote@
@@ -4971,11 +5916,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libusnic_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_ep.Plo at am__quote@
@@ -4983,11 +5931,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/libverbs_fi_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_ep.Plo at am__quote@
@@ -4995,11 +5946,14 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/src_libfabric_la-util_wait.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_atomic.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_attr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_buf.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_cntr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_domain.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_ep.Plo at am__quote@
@@ -5007,11 +5961,11 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_mr.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_ns.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_poll.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/util/src/$(DEPDIR)/util_wait.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-fi_verbs.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_atomic.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_cm.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_domain.Plo at am__quote@
@@ -5023,7 +5977,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_srq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/src_libfabric_la-fi_verbs.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_atomic.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_av.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_cm.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_cq.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_domain.Plo at am__quote@
@@ -5055,56 +6008,64 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/iov.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libbgq_fi_la-common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libbgq_fi_la-enosys.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libbgq_fi_la-fasthash.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libbgq_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libbgq_fi_la-iov.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libbgq_fi_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libgnix_fi_la-common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libgnix_fi_la-enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libgnix_fi_la-fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libgnix_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libgnix_fi_la-iov.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libgnix_fi_la-rbtree.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlxm_fi_la-common.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlxm_fi_la-enosys.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlxm_fi_la-fasthash.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlxm_fi_la-indexer.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlxm_fi_la-rbtree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlx_fi_la-common.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlx_fi_la-enosys.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlx_fi_la-fasthash.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlx_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlx_fi_la-iov.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libmlx_fi_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx2_fi_la-common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx2_fi_la-enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx2_fi_la-fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx2_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx2_fi_la-iov.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx2_fi_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx_fi_la-common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx_fi_la-enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx_fi_la-fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx_fi_la-iov.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libpsmx_fi_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libusnic_fi_la-common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libusnic_fi_la-enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libusnic_fi_la-fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libusnic_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libusnic_fi_la-iov.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libusnic_fi_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libverbs_fi_la-common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libverbs_fi_la-enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libverbs_fi_la-fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libverbs_fi_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libverbs_fi_la-iov.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/libverbs_fi_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/rbtree.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-abi_1_0.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-common.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-enosys.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-fabric.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-fasthash.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-fi_tostr.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-indexer.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-iov.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-log.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-rbtree.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/src_libfabric_la-var.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/libgnix_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/libmlxm_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/libpsmx2_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/libpsmx_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/libusnic_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/libverbs_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/osx/$(DEPDIR)/src_libfabric_la-osd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libbgq_fi_la-osd.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libgnix_fi_la-osd.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libmlxm_fi_la-osd.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libmlx_fi_la-osd.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libpsmx2_fi_la-osd.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libpsmx_fi_la-osd.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at src/unix/$(DEPDIR)/libusnic_fi_la-osd.Plo at am__quote@
@@ -5115,29 +6076,323 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at util/$(DEPDIR)/pingpong.Po at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at util/$(DEPDIR)/strerror.Po at am__quote@
 
-.c.o:
- at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
- at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+.c.o:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo: prov/bgq/src/fi_bgq_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_atomic.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo `test -f 'prov/bgq/src/fi_bgq_atomic.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_atomic.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_atomic.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_atomic.lo `test -f 'prov/bgq/src/fi_bgq_atomic.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_atomic.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo: prov/bgq/src/fi_bgq_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_av.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo `test -f 'prov/bgq/src/fi_bgq_av.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_av.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_av.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_av.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_av.lo `test -f 'prov/bgq/src/fi_bgq_av.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_av.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo: prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_spi.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo `test -f 'prov/bgq/src/fi_bgq_spi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_spi.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_spi.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_spi.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_spi.lo `test -f 'prov/bgq/src/fi_bgq_spi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_spi.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo: prov/bgq/src/fi_bgq_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cm.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo `test -f 'prov/bgq/src/fi_bgq_cm.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cm.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_cm.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_cm.lo `test -f 'prov/bgq/src/fi_bgq_cm.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cm.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo: prov/bgq/src/fi_bgq_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cntr.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo `test -f 'prov/bgq/src/fi_bgq_cntr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cntr.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_cntr.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_cntr.lo `test -f 'prov/bgq/src/fi_bgq_cntr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cntr.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo: prov/bgq/src/fi_bgq_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cq.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo `test -f 'prov/bgq/src/fi_bgq_cq.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cq.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_cq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_cq.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_cq.lo `test -f 'prov/bgq/src/fi_bgq_cq.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cq.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo: prov/bgq/src/fi_bgq_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_domain.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo `test -f 'prov/bgq/src/fi_bgq_domain.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_domain.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_domain.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_domain.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_domain.lo `test -f 'prov/bgq/src/fi_bgq_domain.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_domain.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo: prov/bgq/src/fi_bgq_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_ep.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo `test -f 'prov/bgq/src/fi_bgq_ep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_ep.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_ep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_ep.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_ep.lo `test -f 'prov/bgq/src/fi_bgq_ep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_ep.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo: prov/bgq/src/fi_bgq_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_fabric.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo `test -f 'prov/bgq/src/fi_bgq_fabric.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_fabric.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_fabric.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_fabric.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_fabric.lo `test -f 'prov/bgq/src/fi_bgq_fabric.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_fabric.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo: prov/bgq/src/fi_bgq_info.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_info.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo `test -f 'prov/bgq/src/fi_bgq_info.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_info.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_info.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_info.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_info.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_info.lo `test -f 'prov/bgq/src/fi_bgq_info.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_info.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo: prov/bgq/src/fi_bgq_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_init.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo `test -f 'prov/bgq/src/fi_bgq_init.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_init.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_init.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_init.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_init.lo `test -f 'prov/bgq/src/fi_bgq_init.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_init.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo: prov/bgq/src/fi_bgq_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_mr.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo `test -f 'prov/bgq/src/fi_bgq_mr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_mr.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_mr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_mr.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_mr.lo `test -f 'prov/bgq/src/fi_bgq_mr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_mr.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo: prov/bgq/src/fi_bgq_msg.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_msg.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo `test -f 'prov/bgq/src/fi_bgq_msg.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_msg.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_msg.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_msg.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_msg.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_msg.lo `test -f 'prov/bgq/src/fi_bgq_msg.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_msg.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo: prov/bgq/src/fi_bgq_rma.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_rma.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo `test -f 'prov/bgq/src/fi_bgq_rma.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_rma.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_rma.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_rma.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_rma.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_rma.lo `test -f 'prov/bgq/src/fi_bgq_rma.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_rma.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo: prov/bgq/src/fi_bgq_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_sep.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo `test -f 'prov/bgq/src/fi_bgq_sep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_sep.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_sep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_sep.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_sep.lo `test -f 'prov/bgq/src/fi_bgq_sep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_sep.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo: prov/bgq/src/fi_bgq_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_tagged.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo `test -f 'prov/bgq/src/fi_bgq_tagged.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_tagged.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_tagged.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_tagged.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_tagged.lo `test -f 'prov/bgq/src/fi_bgq_tagged.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_tagged.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo: prov/bgq/src/fi_bgq_node.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_node.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo `test -f 'prov/bgq/src/fi_bgq_node.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_node.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_node.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_node.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_node.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_node.lo `test -f 'prov/bgq/src/fi_bgq_node.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_node.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo: prov/bgq/src/fi_bgq_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_progress.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo `test -f 'prov/bgq/src/fi_bgq_progress.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_progress.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_progress.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_progress.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_progress.lo `test -f 'prov/bgq/src/fi_bgq_progress.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_progress.c
+
+prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo: prov/bgq/src/fi_bgq_pmi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_pmi.Tpo -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo `test -f 'prov/bgq/src/fi_bgq_pmi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_pmi.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_pmi.Tpo prov/bgq/src/$(DEPDIR)/libbgq_fi_la-fi_bgq_pmi.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_pmi.c' object='prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/libbgq_fi_la-fi_bgq_pmi.lo `test -f 'prov/bgq/src/fi_bgq_pmi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_pmi.c
+
+src/libbgq_fi_la-common.lo: src/common.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libbgq_fi_la-common.lo -MD -MP -MF src/$(DEPDIR)/libbgq_fi_la-common.Tpo -c -o src/libbgq_fi_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libbgq_fi_la-common.Tpo src/$(DEPDIR)/libbgq_fi_la-common.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/common.c' object='src/libbgq_fi_la-common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libbgq_fi_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
+
+src/libbgq_fi_la-enosys.lo: src/enosys.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libbgq_fi_la-enosys.lo -MD -MP -MF src/$(DEPDIR)/libbgq_fi_la-enosys.Tpo -c -o src/libbgq_fi_la-enosys.lo `test -f 'src/enosys.c' || echo '$(srcdir)/'`src/enosys.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libbgq_fi_la-enosys.Tpo src/$(DEPDIR)/libbgq_fi_la-enosys.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/enosys.c' object='src/libbgq_fi_la-enosys.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libbgq_fi_la-enosys.lo `test -f 'src/enosys.c' || echo '$(srcdir)/'`src/enosys.c
+
+src/libbgq_fi_la-rbtree.lo: src/rbtree.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libbgq_fi_la-rbtree.lo -MD -MP -MF src/$(DEPDIR)/libbgq_fi_la-rbtree.Tpo -c -o src/libbgq_fi_la-rbtree.lo `test -f 'src/rbtree.c' || echo '$(srcdir)/'`src/rbtree.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libbgq_fi_la-rbtree.Tpo src/$(DEPDIR)/libbgq_fi_la-rbtree.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/rbtree.c' object='src/libbgq_fi_la-rbtree.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libbgq_fi_la-rbtree.lo `test -f 'src/rbtree.c' || echo '$(srcdir)/'`src/rbtree.c
+
+src/libbgq_fi_la-fasthash.lo: src/fasthash.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libbgq_fi_la-fasthash.lo -MD -MP -MF src/$(DEPDIR)/libbgq_fi_la-fasthash.Tpo -c -o src/libbgq_fi_la-fasthash.lo `test -f 'src/fasthash.c' || echo '$(srcdir)/'`src/fasthash.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libbgq_fi_la-fasthash.Tpo src/$(DEPDIR)/libbgq_fi_la-fasthash.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/fasthash.c' object='src/libbgq_fi_la-fasthash.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libbgq_fi_la-fasthash.lo `test -f 'src/fasthash.c' || echo '$(srcdir)/'`src/fasthash.c
+
+src/libbgq_fi_la-indexer.lo: src/indexer.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libbgq_fi_la-indexer.lo -MD -MP -MF src/$(DEPDIR)/libbgq_fi_la-indexer.Tpo -c -o src/libbgq_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libbgq_fi_la-indexer.Tpo src/$(DEPDIR)/libbgq_fi_la-indexer.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/indexer.c' object='src/libbgq_fi_la-indexer.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libbgq_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
+
+src/libbgq_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libbgq_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libbgq_fi_la-iov.Tpo -c -o src/libbgq_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libbgq_fi_la-iov.Tpo src/$(DEPDIR)/libbgq_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libbgq_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libbgq_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/libbgq_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_atomic.Tpo -c -o prov/util/src/libbgq_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libbgq_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
+prov/util/src/libbgq_fi_la-util_attr.lo: prov/util/src/util_attr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_attr.Tpo -c -o prov/util/src/libbgq_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_attr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_attr.c' object='prov/util/src/libbgq_fi_la-util_attr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
+
+prov/util/src/libbgq_fi_la-util_av.lo: prov/util/src/util_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_av.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_av.Tpo -c -o prov/util/src/libbgq_fi_la-util_av.lo `test -f 'prov/util/src/util_av.c' || echo '$(srcdir)/'`prov/util/src/util_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_av.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_av.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_av.c' object='prov/util/src/libbgq_fi_la-util_av.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_av.lo `test -f 'prov/util/src/util_av.c' || echo '$(srcdir)/'`prov/util/src/util_av.c
+
+prov/util/src/libbgq_fi_la-util_cq.lo: prov/util/src/util_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_cq.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cq.Tpo -c -o prov/util/src/libbgq_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cq.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cq.c' object='prov/util/src/libbgq_fi_la-util_cq.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
+
+prov/util/src/libbgq_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cntr.Tpo -c -o prov/util/src/libbgq_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libbgq_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ $<
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
 
-.c.obj:
- at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
- at am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
- at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+prov/util/src/libbgq_fi_la-util_domain.lo: prov/util/src/util_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_domain.Tpo -c -o prov/util/src/libbgq_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_domain.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_domain.c' object='prov/util/src/libbgq_fi_la-util_domain.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 
-.c.lo:
- at am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
- at am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
- at am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libbgq_fi_la-util_ep.lo: prov/util/src/util_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_ep.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ep.Tpo -c -o prov/util/src/libbgq_fi_la-util_ep.lo `test -f 'prov/util/src/util_ep.c' || echo '$(srcdir)/'`prov/util/src/util_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ep.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ep.c' object='prov/util/src/libbgq_fi_la-util_ep.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LTCOMPILE) -c -o $@ $<
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_ep.lo `test -f 'prov/util/src/util_ep.c' || echo '$(srcdir)/'`prov/util/src/util_ep.c
+
+prov/util/src/libbgq_fi_la-util_eq.lo: prov/util/src/util_eq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_eq.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_eq.Tpo -c -o prov/util/src/libbgq_fi_la-util_eq.lo `test -f 'prov/util/src/util_eq.c' || echo '$(srcdir)/'`prov/util/src/util_eq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_eq.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_eq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_eq.c' object='prov/util/src/libbgq_fi_la-util_eq.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_eq.lo `test -f 'prov/util/src/util_eq.c' || echo '$(srcdir)/'`prov/util/src/util_eq.c
+
+prov/util/src/libbgq_fi_la-util_fabric.lo: prov/util/src/util_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_fabric.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_fabric.Tpo -c -o prov/util/src/libbgq_fi_la-util_fabric.lo `test -f 'prov/util/src/util_fabric.c' || echo '$(srcdir)/'`prov/util/src/util_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_fabric.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_fabric.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_fabric.c' object='prov/util/src/libbgq_fi_la-util_fabric.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_fabric.lo `test -f 'prov/util/src/util_fabric.c' || echo '$(srcdir)/'`prov/util/src/util_fabric.c
+
+prov/util/src/libbgq_fi_la-util_main.lo: prov/util/src/util_main.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_main.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_main.Tpo -c -o prov/util/src/libbgq_fi_la-util_main.lo `test -f 'prov/util/src/util_main.c' || echo '$(srcdir)/'`prov/util/src/util_main.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_main.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_main.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_main.c' object='prov/util/src/libbgq_fi_la-util_main.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_main.lo `test -f 'prov/util/src/util_main.c' || echo '$(srcdir)/'`prov/util/src/util_main.c
+
+prov/util/src/libbgq_fi_la-util_poll.lo: prov/util/src/util_poll.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_poll.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_poll.Tpo -c -o prov/util/src/libbgq_fi_la-util_poll.lo `test -f 'prov/util/src/util_poll.c' || echo '$(srcdir)/'`prov/util/src/util_poll.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_poll.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_poll.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_poll.c' object='prov/util/src/libbgq_fi_la-util_poll.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_poll.lo `test -f 'prov/util/src/util_poll.c' || echo '$(srcdir)/'`prov/util/src/util_poll.c
+
+prov/util/src/libbgq_fi_la-util_wait.lo: prov/util/src/util_wait.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_wait.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_wait.Tpo -c -o prov/util/src/libbgq_fi_la-util_wait.lo `test -f 'prov/util/src/util_wait.c' || echo '$(srcdir)/'`prov/util/src/util_wait.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_wait.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_wait.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_wait.c' object='prov/util/src/libbgq_fi_la-util_wait.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_wait.lo `test -f 'prov/util/src/util_wait.c' || echo '$(srcdir)/'`prov/util/src/util_wait.c
+
+prov/util/src/libbgq_fi_la-util_buf.lo: prov/util/src/util_buf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_buf.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_buf.Tpo -c -o prov/util/src/libbgq_fi_la-util_buf.lo `test -f 'prov/util/src/util_buf.c' || echo '$(srcdir)/'`prov/util/src/util_buf.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_buf.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_buf.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_buf.c' object='prov/util/src/libbgq_fi_la-util_buf.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_buf.lo `test -f 'prov/util/src/util_buf.c' || echo '$(srcdir)/'`prov/util/src/util_buf.c
+
+prov/util/src/libbgq_fi_la-util_mr.lo: prov/util/src/util_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_mr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_mr.Tpo -c -o prov/util/src/libbgq_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_mr.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_mr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_mr.c' object='prov/util/src/libbgq_fi_la-util_mr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
+
+prov/util/src/libbgq_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libbgq_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ns.Tpo -c -o prov/util/src/libbgq_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libbgq_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libbgq_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libbgq_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+
+src/unix/libbgq_fi_la-osd.lo: src/unix/osd.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libbgq_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libbgq_fi_la-osd.Tpo -c -o src/unix/libbgq_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/unix/$(DEPDIR)/libbgq_fi_la-osd.Tpo src/unix/$(DEPDIR)/libbgq_fi_la-osd.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/unix/osd.c' object='src/unix/libbgq_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/unix/libbgq_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
+
+prov/bgq/external/libbgq_fi_la-memory_impl.lo: prov/bgq/external/memory_impl.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/external/libbgq_fi_la-memory_impl.lo -MD -MP -MF prov/bgq/external/$(DEPDIR)/libbgq_fi_la-memory_impl.Tpo -c -o prov/bgq/external/libbgq_fi_la-memory_impl.lo `test -f 'prov/bgq/external/memory_impl.c' || echo '$(srcdir)/'`prov/bgq/external/memory_impl.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/external/$(DEPDIR)/libbgq_fi_la-memory_impl.Tpo prov/bgq/external/$(DEPDIR)/libbgq_fi_la-memory_impl.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/external/memory_impl.c' object='prov/bgq/external/libbgq_fi_la-memory_impl.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libbgq_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/external/libbgq_fi_la-memory_impl.lo `test -f 'prov/bgq/external/memory_impl.c' || echo '$(srcdir)/'`prov/bgq/external/memory_impl.c
 
 prov/gni/src/libgnix_fi_la-gnix_atomic.lo: prov/gni/src/gnix_atomic.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_atomic.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_atomic.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_atomic.lo `test -f 'prov/gni/src/gnix_atomic.c' || echo '$(srcdir)/'`prov/gni/src/gnix_atomic.c
@@ -5146,6 +6401,13 @@ prov/gni/src/libgnix_fi_la-gnix_atomic.lo: prov/gni/src/gnix_atomic.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/libgnix_fi_la-gnix_atomic.lo `test -f 'prov/gni/src/gnix_atomic.c' || echo '$(srcdir)/'`prov/gni/src/gnix_atomic.c
 
+prov/gni/src/libgnix_fi_la-gnix_auth_key.lo: prov/gni/src/gnix_auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_auth_key.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_auth_key.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_auth_key.lo `test -f 'prov/gni/src/gnix_auth_key.c' || echo '$(srcdir)/'`prov/gni/src/gnix_auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_auth_key.Tpo prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_auth_key.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/src/gnix_auth_key.c' object='prov/gni/src/libgnix_fi_la-gnix_auth_key.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/libgnix_fi_la-gnix_auth_key.lo `test -f 'prov/gni/src/gnix_auth_key.c' || echo '$(srcdir)/'`prov/gni/src/gnix_auth_key.c
+
 prov/gni/src/libgnix_fi_la-gnix_av.lo: prov/gni/src/gnix_av.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_av.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_av.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_av.lo `test -f 'prov/gni/src/gnix_av.c' || echo '$(srcdir)/'`prov/gni/src/gnix_av.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_av.Tpo prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_av.Plo
@@ -5307,6 +6569,13 @@ prov/gni/src/libgnix_fi_la-gnix_poll.lo: prov/gni/src/gnix_poll.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/libgnix_fi_la-gnix_poll.lo `test -f 'prov/gni/src/gnix_poll.c' || echo '$(srcdir)/'`prov/gni/src/gnix_poll.c
 
+prov/gni/src/libgnix_fi_la-gnix_progress.lo: prov/gni/src/gnix_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_progress.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_progress.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_progress.lo `test -f 'prov/gni/src/gnix_progress.c' || echo '$(srcdir)/'`prov/gni/src/gnix_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_progress.Tpo prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_progress.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/src/gnix_progress.c' object='prov/gni/src/libgnix_fi_la-gnix_progress.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/libgnix_fi_la-gnix_progress.lo `test -f 'prov/gni/src/gnix_progress.c' || echo '$(srcdir)/'`prov/gni/src/gnix_progress.c
+
 prov/gni/src/libgnix_fi_la-gnix_queue.lo: prov/gni/src/gnix_queue.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_queue.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_queue.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_queue.lo `test -f 'prov/gni/src/gnix_queue.c' || echo '$(srcdir)/'`prov/gni/src/gnix_queue.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_queue.Tpo prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_queue.Plo
@@ -5321,6 +6590,13 @@ prov/gni/src/libgnix_fi_la-gnix_rma.lo: prov/gni/src/gnix_rma.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/libgnix_fi_la-gnix_rma.lo `test -f 'prov/gni/src/gnix_rma.c' || echo '$(srcdir)/'`prov/gni/src/gnix_rma.c
 
+prov/gni/src/libgnix_fi_la-gnix_sep.lo: prov/gni/src/gnix_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_sep.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_sep.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_sep.lo `test -f 'prov/gni/src/gnix_sep.c' || echo '$(srcdir)/'`prov/gni/src/gnix_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_sep.Tpo prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_sep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/src/gnix_sep.c' object='prov/gni/src/libgnix_fi_la-gnix_sep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/libgnix_fi_la-gnix_sep.lo `test -f 'prov/gni/src/gnix_sep.c' || echo '$(srcdir)/'`prov/gni/src/gnix_sep.c
+
 prov/gni/src/libgnix_fi_la-gnix_tags.lo: prov/gni/src/gnix_tags.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/libgnix_fi_la-gnix_tags.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_tags.Tpo -c -o prov/gni/src/libgnix_fi_la-gnix_tags.lo `test -f 'prov/gni/src/gnix_tags.c' || echo '$(srcdir)/'`prov/gni/src/gnix_tags.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_tags.Tpo prov/gni/src/$(DEPDIR)/libgnix_fi_la-gnix_tags.Plo
@@ -5405,6 +6681,20 @@ src/libgnix_fi_la-indexer.lo: src/indexer.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libgnix_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
+src/libgnix_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libgnix_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libgnix_fi_la-iov.Tpo -c -o src/libgnix_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libgnix_fi_la-iov.Tpo src/$(DEPDIR)/libgnix_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libgnix_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libgnix_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/libgnix_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libgnix_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libgnix_fi_la-util_atomic.Tpo -c -o prov/util/src/libgnix_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libgnix_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libgnix_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libgnix_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libgnix_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
 prov/util/src/libgnix_fi_la-util_attr.lo: prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libgnix_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libgnix_fi_la-util_attr.Tpo -c -o prov/util/src/libgnix_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libgnix_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libgnix_fi_la-util_attr.Plo
@@ -5426,6 +6716,13 @@ prov/util/src/libgnix_fi_la-util_cq.lo: prov/util/src/util_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libgnix_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
+prov/util/src/libgnix_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libgnix_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libgnix_fi_la-util_cntr.Tpo -c -o prov/util/src/libgnix_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libgnix_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libgnix_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libgnix_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libgnix_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+
 prov/util/src/libgnix_fi_la-util_domain.lo: prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libgnix_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libgnix_fi_la-util_domain.Tpo -c -o prov/util/src/libgnix_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libgnix_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libgnix_fi_la-util_domain.Plo
@@ -5489,12 +6786,12 @@ prov/util/src/libgnix_fi_la-util_mr.lo: prov/util/src/util_mr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libgnix_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/osx/libgnix_fi_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/libgnix_fi_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/libgnix_fi_la-osd.Tpo -c -o src/osx/libgnix_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/libgnix_fi_la-osd.Tpo src/osx/$(DEPDIR)/libgnix_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/libgnix_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libgnix_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libgnix_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libgnix_fi_la-util_ns.Tpo -c -o prov/util/src/libgnix_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libgnix_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libgnix_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libgnix_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/libgnix_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libgnix_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
 
 src/unix/libgnix_fi_la-osd.lo: src/unix/osd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libgnix_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libgnix_fi_la-osd.Tpo -c -o src/unix/libgnix_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
@@ -5503,194 +6800,222 @@ src/unix/libgnix_fi_la-osd.lo: src/unix/osd.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgnix_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/unix/libgnix_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_init.lo: prov/mxm/src/mlxm_init.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_init.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_init.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_init.lo `test -f 'prov/mxm/src/mlxm_init.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_init.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_init.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_init.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_init.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_init.lo' libtool=yes @AMDEPBACKSLASH@
+prov/mlx/src/libmlx_fi_la-mlx_av.lo: prov/mlx/src/mlx_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_av.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_av.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_av.lo `test -f 'prov/mlx/src/mlx_av.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_av.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_av.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_av.c' object='prov/mlx/src/libmlx_fi_la-mlx_av.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_av.lo `test -f 'prov/mlx/src/mlx_av.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_av.c
+
+prov/mlx/src/libmlx_fi_la-mlx_cm.lo: prov/mlx/src/mlx_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_cm.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cm.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_cm.lo `test -f 'prov/mlx/src/mlx_cm.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cm.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_cm.c' object='prov/mlx/src/libmlx_fi_la-mlx_cm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_cm.lo `test -f 'prov/mlx/src/mlx_cm.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cm.c
+
+prov/mlx/src/libmlx_fi_la-mlx_cq.lo: prov/mlx/src/mlx_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_cq.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cq.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_cq.lo `test -f 'prov/mlx/src/mlx_cq.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cq.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_cq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_cq.c' object='prov/mlx/src/libmlx_fi_la-mlx_cq.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_cq.lo `test -f 'prov/mlx/src/mlx_cq.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cq.c
+
+prov/mlx/src/libmlx_fi_la-mlx_domain.lo: prov/mlx/src/mlx_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_domain.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_domain.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_domain.lo `test -f 'prov/mlx/src/mlx_domain.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_domain.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_domain.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_domain.c' object='prov/mlx/src/libmlx_fi_la-mlx_domain.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_init.lo `test -f 'prov/mxm/src/mlxm_init.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_init.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_domain.lo `test -f 'prov/mlx/src/mlx_domain.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_domain.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo: prov/mxm/src/mlxm_domain.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_domain.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo `test -f 'prov/mxm/src/mlxm_domain.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_domain.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_domain.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_domain.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_domain.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo' libtool=yes @AMDEPBACKSLASH@
+prov/mlx/src/libmlx_fi_la-mlx_ep.lo: prov/mlx/src/mlx_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_ep.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_ep.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_ep.lo `test -f 'prov/mlx/src/mlx_ep.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_ep.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_ep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_ep.c' object='prov/mlx/src/libmlx_fi_la-mlx_ep.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_domain.lo `test -f 'prov/mxm/src/mlxm_domain.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_domain.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_ep.lo `test -f 'prov/mlx/src/mlx_ep.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_ep.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo: prov/mxm/src/mlxm_cq.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cq.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo `test -f 'prov/mxm/src/mlxm_cq.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cq.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cq.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cq.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_cq.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo' libtool=yes @AMDEPBACKSLASH@
+prov/mlx/src/libmlx_fi_la-mlx_init.lo: prov/mlx/src/mlx_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_init.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_init.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_init.lo `test -f 'prov/mlx/src/mlx_init.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_init.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_init.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_init.c' object='prov/mlx/src/libmlx_fi_la-mlx_init.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_cq.lo `test -f 'prov/mxm/src/mlxm_cq.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cq.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_init.lo `test -f 'prov/mlx/src/mlx_init.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_init.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_av.lo: prov/mxm/src/mlxm_av.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_av.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_av.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_av.lo `test -f 'prov/mxm/src/mlxm_av.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_av.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_av.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_av.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_av.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_av.lo' libtool=yes @AMDEPBACKSLASH@
+prov/mlx/src/libmlx_fi_la-mlx_tagged.lo: prov/mlx/src/mlx_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_tagged.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_tagged.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_tagged.lo `test -f 'prov/mlx/src/mlx_tagged.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_tagged.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_tagged.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_tagged.c' object='prov/mlx/src/libmlx_fi_la-mlx_tagged.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_av.lo `test -f 'prov/mxm/src/mlxm_av.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_av.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_tagged.lo `test -f 'prov/mlx/src/mlx_tagged.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_tagged.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo: prov/mxm/src/mlxm_ep.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_ep.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo `test -f 'prov/mxm/src/mlxm_ep.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_ep.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_ep.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_ep.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_ep.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo' libtool=yes @AMDEPBACKSLASH@
+prov/mlx/src/libmlx_fi_la-mlx_fabric.lo: prov/mlx/src/mlx_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_fabric.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_fabric.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_fabric.lo `test -f 'prov/mlx/src/mlx_fabric.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_fabric.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_fabric.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_fabric.c' object='prov/mlx/src/libmlx_fi_la-mlx_fabric.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_ep.lo `test -f 'prov/mxm/src/mlxm_ep.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_ep.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_fabric.lo `test -f 'prov/mlx/src/mlx_fabric.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_fabric.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo: prov/mxm/src/mlxm_cm.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cm.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo `test -f 'prov/mxm/src/mlxm_cm.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cm.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cm.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_cm.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_cm.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo' libtool=yes @AMDEPBACKSLASH@
+prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo: prov/mlx/src/mlx_callbacks.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_callbacks.Tpo -c -o prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo `test -f 'prov/mlx/src/mlx_callbacks.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_callbacks.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_callbacks.Tpo prov/mlx/src/$(DEPDIR)/libmlx_fi_la-mlx_callbacks.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_callbacks.c' object='prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_cm.lo `test -f 'prov/mxm/src/mlxm_cm.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cm.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/libmlx_fi_la-mlx_callbacks.lo `test -f 'prov/mlx/src/mlx_callbacks.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_callbacks.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo: prov/mxm/src/mlxm_tagged.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_tagged.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo `test -f 'prov/mxm/src/mlxm_tagged.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_tagged.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_tagged.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_tagged.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_tagged.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo' libtool=yes @AMDEPBACKSLASH@
+src/libmlx_fi_la-common.lo: src/common.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlx_fi_la-common.lo -MD -MP -MF src/$(DEPDIR)/libmlx_fi_la-common.Tpo -c -o src/libmlx_fi_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlx_fi_la-common.Tpo src/$(DEPDIR)/libmlx_fi_la-common.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/common.c' object='src/libmlx_fi_la-common.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_tagged.lo `test -f 'prov/mxm/src/mlxm_tagged.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_tagged.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlx_fi_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
 
-prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo: prov/mxm/src/mlxm_mr.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_mr.Tpo -c -o prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo `test -f 'prov/mxm/src/mlxm_mr.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_mr.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_mr.Tpo prov/mxm/src/$(DEPDIR)/libmlxm_fi_la-mlxm_mr.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_mr.c' object='prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo' libtool=yes @AMDEPBACKSLASH@
+src/libmlx_fi_la-enosys.lo: src/enosys.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlx_fi_la-enosys.lo -MD -MP -MF src/$(DEPDIR)/libmlx_fi_la-enosys.Tpo -c -o src/libmlx_fi_la-enosys.lo `test -f 'src/enosys.c' || echo '$(srcdir)/'`src/enosys.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlx_fi_la-enosys.Tpo src/$(DEPDIR)/libmlx_fi_la-enosys.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/enosys.c' object='src/libmlx_fi_la-enosys.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/libmlxm_fi_la-mlxm_mr.lo `test -f 'prov/mxm/src/mlxm_mr.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_mr.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlx_fi_la-enosys.lo `test -f 'src/enosys.c' || echo '$(srcdir)/'`src/enosys.c
 
-src/libmlxm_fi_la-common.lo: src/common.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlxm_fi_la-common.lo -MD -MP -MF src/$(DEPDIR)/libmlxm_fi_la-common.Tpo -c -o src/libmlxm_fi_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlxm_fi_la-common.Tpo src/$(DEPDIR)/libmlxm_fi_la-common.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/common.c' object='src/libmlxm_fi_la-common.lo' libtool=yes @AMDEPBACKSLASH@
+src/libmlx_fi_la-rbtree.lo: src/rbtree.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlx_fi_la-rbtree.lo -MD -MP -MF src/$(DEPDIR)/libmlx_fi_la-rbtree.Tpo -c -o src/libmlx_fi_la-rbtree.lo `test -f 'src/rbtree.c' || echo '$(srcdir)/'`src/rbtree.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlx_fi_la-rbtree.Tpo src/$(DEPDIR)/libmlx_fi_la-rbtree.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/rbtree.c' object='src/libmlx_fi_la-rbtree.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlxm_fi_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlx_fi_la-rbtree.lo `test -f 'src/rbtree.c' || echo '$(srcdir)/'`src/rbtree.c
 
-src/libmlxm_fi_la-enosys.lo: src/enosys.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlxm_fi_la-enosys.lo -MD -MP -MF src/$(DEPDIR)/libmlxm_fi_la-enosys.Tpo -c -o src/libmlxm_fi_la-enosys.lo `test -f 'src/enosys.c' || echo '$(srcdir)/'`src/enosys.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlxm_fi_la-enosys.Tpo src/$(DEPDIR)/libmlxm_fi_la-enosys.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/enosys.c' object='src/libmlxm_fi_la-enosys.lo' libtool=yes @AMDEPBACKSLASH@
+src/libmlx_fi_la-fasthash.lo: src/fasthash.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlx_fi_la-fasthash.lo -MD -MP -MF src/$(DEPDIR)/libmlx_fi_la-fasthash.Tpo -c -o src/libmlx_fi_la-fasthash.lo `test -f 'src/fasthash.c' || echo '$(srcdir)/'`src/fasthash.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlx_fi_la-fasthash.Tpo src/$(DEPDIR)/libmlx_fi_la-fasthash.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/fasthash.c' object='src/libmlx_fi_la-fasthash.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlxm_fi_la-enosys.lo `test -f 'src/enosys.c' || echo '$(srcdir)/'`src/enosys.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlx_fi_la-fasthash.lo `test -f 'src/fasthash.c' || echo '$(srcdir)/'`src/fasthash.c
 
-src/libmlxm_fi_la-rbtree.lo: src/rbtree.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlxm_fi_la-rbtree.lo -MD -MP -MF src/$(DEPDIR)/libmlxm_fi_la-rbtree.Tpo -c -o src/libmlxm_fi_la-rbtree.lo `test -f 'src/rbtree.c' || echo '$(srcdir)/'`src/rbtree.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlxm_fi_la-rbtree.Tpo src/$(DEPDIR)/libmlxm_fi_la-rbtree.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/rbtree.c' object='src/libmlxm_fi_la-rbtree.lo' libtool=yes @AMDEPBACKSLASH@
+src/libmlx_fi_la-indexer.lo: src/indexer.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlx_fi_la-indexer.lo -MD -MP -MF src/$(DEPDIR)/libmlx_fi_la-indexer.Tpo -c -o src/libmlx_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlx_fi_la-indexer.Tpo src/$(DEPDIR)/libmlx_fi_la-indexer.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/indexer.c' object='src/libmlx_fi_la-indexer.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlxm_fi_la-rbtree.lo `test -f 'src/rbtree.c' || echo '$(srcdir)/'`src/rbtree.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlx_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
-src/libmlxm_fi_la-fasthash.lo: src/fasthash.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlxm_fi_la-fasthash.lo -MD -MP -MF src/$(DEPDIR)/libmlxm_fi_la-fasthash.Tpo -c -o src/libmlxm_fi_la-fasthash.lo `test -f 'src/fasthash.c' || echo '$(srcdir)/'`src/fasthash.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlxm_fi_la-fasthash.Tpo src/$(DEPDIR)/libmlxm_fi_la-fasthash.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/fasthash.c' object='src/libmlxm_fi_la-fasthash.lo' libtool=yes @AMDEPBACKSLASH@
+src/libmlx_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlx_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libmlx_fi_la-iov.Tpo -c -o src/libmlx_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlx_fi_la-iov.Tpo src/$(DEPDIR)/libmlx_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libmlx_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlxm_fi_la-fasthash.lo `test -f 'src/fasthash.c' || echo '$(srcdir)/'`src/fasthash.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlx_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
 
-src/libmlxm_fi_la-indexer.lo: src/indexer.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libmlxm_fi_la-indexer.lo -MD -MP -MF src/$(DEPDIR)/libmlxm_fi_la-indexer.Tpo -c -o src/libmlxm_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libmlxm_fi_la-indexer.Tpo src/$(DEPDIR)/libmlxm_fi_la-indexer.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/indexer.c' object='src/libmlxm_fi_la-indexer.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_atomic.Tpo -c -o prov/util/src/libmlx_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libmlx_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libmlxm_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
 
-prov/util/src/libmlxm_fi_la-util_attr.lo: prov/util/src/util_attr.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_attr.Tpo -c -o prov/util/src/libmlxm_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_attr.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_attr.c' object='prov/util/src/libmlxm_fi_la-util_attr.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_attr.lo: prov/util/src/util_attr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_attr.Tpo -c -o prov/util/src/libmlx_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_attr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_attr.c' object='prov/util/src/libmlx_fi_la-util_attr.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 
-prov/util/src/libmlxm_fi_la-util_av.lo: prov/util/src/util_av.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_av.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_av.Tpo -c -o prov/util/src/libmlxm_fi_la-util_av.lo `test -f 'prov/util/src/util_av.c' || echo '$(srcdir)/'`prov/util/src/util_av.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_av.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_av.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_av.c' object='prov/util/src/libmlxm_fi_la-util_av.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_av.lo: prov/util/src/util_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_av.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_av.Tpo -c -o prov/util/src/libmlx_fi_la-util_av.lo `test -f 'prov/util/src/util_av.c' || echo '$(srcdir)/'`prov/util/src/util_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_av.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_av.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_av.c' object='prov/util/src/libmlx_fi_la-util_av.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_av.lo `test -f 'prov/util/src/util_av.c' || echo '$(srcdir)/'`prov/util/src/util_av.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_av.lo `test -f 'prov/util/src/util_av.c' || echo '$(srcdir)/'`prov/util/src/util_av.c
 
-prov/util/src/libmlxm_fi_la-util_cq.lo: prov/util/src/util_cq.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_cq.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_cq.Tpo -c -o prov/util/src/libmlxm_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_cq.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_cq.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cq.c' object='prov/util/src/libmlxm_fi_la-util_cq.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_cq.lo: prov/util/src/util_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_cq.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cq.Tpo -c -o prov/util/src/libmlx_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cq.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cq.c' object='prov/util/src/libmlx_fi_la-util_cq.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
-prov/util/src/libmlxm_fi_la-util_domain.lo: prov/util/src/util_domain.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_domain.Tpo -c -o prov/util/src/libmlxm_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_domain.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_domain.c' object='prov/util/src/libmlxm_fi_la-util_domain.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cntr.Tpo -c -o prov/util/src/libmlx_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libmlx_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
 
-prov/util/src/libmlxm_fi_la-util_ep.lo: prov/util/src/util_ep.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_ep.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_ep.Tpo -c -o prov/util/src/libmlxm_fi_la-util_ep.lo `test -f 'prov/util/src/util_ep.c' || echo '$(srcdir)/'`prov/util/src/util_ep.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_ep.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_ep.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ep.c' object='prov/util/src/libmlxm_fi_la-util_ep.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_domain.lo: prov/util/src/util_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_domain.Tpo -c -o prov/util/src/libmlx_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_domain.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_domain.c' object='prov/util/src/libmlx_fi_la-util_domain.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_ep.lo `test -f 'prov/util/src/util_ep.c' || echo '$(srcdir)/'`prov/util/src/util_ep.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 
-prov/util/src/libmlxm_fi_la-util_eq.lo: prov/util/src/util_eq.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_eq.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_eq.Tpo -c -o prov/util/src/libmlxm_fi_la-util_eq.lo `test -f 'prov/util/src/util_eq.c' || echo '$(srcdir)/'`prov/util/src/util_eq.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_eq.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_eq.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_eq.c' object='prov/util/src/libmlxm_fi_la-util_eq.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_ep.lo: prov/util/src/util_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_ep.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ep.Tpo -c -o prov/util/src/libmlx_fi_la-util_ep.lo `test -f 'prov/util/src/util_ep.c' || echo '$(srcdir)/'`prov/util/src/util_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ep.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ep.c' object='prov/util/src/libmlx_fi_la-util_ep.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_eq.lo `test -f 'prov/util/src/util_eq.c' || echo '$(srcdir)/'`prov/util/src/util_eq.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_ep.lo `test -f 'prov/util/src/util_ep.c' || echo '$(srcdir)/'`prov/util/src/util_ep.c
 
-prov/util/src/libmlxm_fi_la-util_fabric.lo: prov/util/src/util_fabric.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_fabric.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_fabric.Tpo -c -o prov/util/src/libmlxm_fi_la-util_fabric.lo `test -f 'prov/util/src/util_fabric.c' || echo '$(srcdir)/'`prov/util/src/util_fabric.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_fabric.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_fabric.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_fabric.c' object='prov/util/src/libmlxm_fi_la-util_fabric.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_eq.lo: prov/util/src/util_eq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_eq.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_eq.Tpo -c -o prov/util/src/libmlx_fi_la-util_eq.lo `test -f 'prov/util/src/util_eq.c' || echo '$(srcdir)/'`prov/util/src/util_eq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_eq.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_eq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_eq.c' object='prov/util/src/libmlx_fi_la-util_eq.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_fabric.lo `test -f 'prov/util/src/util_fabric.c' || echo '$(srcdir)/'`prov/util/src/util_fabric.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_eq.lo `test -f 'prov/util/src/util_eq.c' || echo '$(srcdir)/'`prov/util/src/util_eq.c
 
-prov/util/src/libmlxm_fi_la-util_main.lo: prov/util/src/util_main.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_main.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_main.Tpo -c -o prov/util/src/libmlxm_fi_la-util_main.lo `test -f 'prov/util/src/util_main.c' || echo '$(srcdir)/'`prov/util/src/util_main.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_main.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_main.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_main.c' object='prov/util/src/libmlxm_fi_la-util_main.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_fabric.lo: prov/util/src/util_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_fabric.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_fabric.Tpo -c -o prov/util/src/libmlx_fi_la-util_fabric.lo `test -f 'prov/util/src/util_fabric.c' || echo '$(srcdir)/'`prov/util/src/util_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_fabric.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_fabric.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_fabric.c' object='prov/util/src/libmlx_fi_la-util_fabric.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_main.lo `test -f 'prov/util/src/util_main.c' || echo '$(srcdir)/'`prov/util/src/util_main.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_fabric.lo `test -f 'prov/util/src/util_fabric.c' || echo '$(srcdir)/'`prov/util/src/util_fabric.c
 
-prov/util/src/libmlxm_fi_la-util_poll.lo: prov/util/src/util_poll.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_poll.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_poll.Tpo -c -o prov/util/src/libmlxm_fi_la-util_poll.lo `test -f 'prov/util/src/util_poll.c' || echo '$(srcdir)/'`prov/util/src/util_poll.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_poll.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_poll.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_poll.c' object='prov/util/src/libmlxm_fi_la-util_poll.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_main.lo: prov/util/src/util_main.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_main.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_main.Tpo -c -o prov/util/src/libmlx_fi_la-util_main.lo `test -f 'prov/util/src/util_main.c' || echo '$(srcdir)/'`prov/util/src/util_main.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_main.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_main.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_main.c' object='prov/util/src/libmlx_fi_la-util_main.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_poll.lo `test -f 'prov/util/src/util_poll.c' || echo '$(srcdir)/'`prov/util/src/util_poll.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_main.lo `test -f 'prov/util/src/util_main.c' || echo '$(srcdir)/'`prov/util/src/util_main.c
 
-prov/util/src/libmlxm_fi_la-util_wait.lo: prov/util/src/util_wait.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_wait.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_wait.Tpo -c -o prov/util/src/libmlxm_fi_la-util_wait.lo `test -f 'prov/util/src/util_wait.c' || echo '$(srcdir)/'`prov/util/src/util_wait.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_wait.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_wait.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_wait.c' object='prov/util/src/libmlxm_fi_la-util_wait.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_poll.lo: prov/util/src/util_poll.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_poll.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_poll.Tpo -c -o prov/util/src/libmlx_fi_la-util_poll.lo `test -f 'prov/util/src/util_poll.c' || echo '$(srcdir)/'`prov/util/src/util_poll.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_poll.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_poll.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_poll.c' object='prov/util/src/libmlx_fi_la-util_poll.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_wait.lo `test -f 'prov/util/src/util_wait.c' || echo '$(srcdir)/'`prov/util/src/util_wait.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_poll.lo `test -f 'prov/util/src/util_poll.c' || echo '$(srcdir)/'`prov/util/src/util_poll.c
 
-prov/util/src/libmlxm_fi_la-util_buf.lo: prov/util/src/util_buf.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_buf.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_buf.Tpo -c -o prov/util/src/libmlxm_fi_la-util_buf.lo `test -f 'prov/util/src/util_buf.c' || echo '$(srcdir)/'`prov/util/src/util_buf.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_buf.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_buf.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_buf.c' object='prov/util/src/libmlxm_fi_la-util_buf.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_wait.lo: prov/util/src/util_wait.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_wait.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_wait.Tpo -c -o prov/util/src/libmlx_fi_la-util_wait.lo `test -f 'prov/util/src/util_wait.c' || echo '$(srcdir)/'`prov/util/src/util_wait.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_wait.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_wait.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_wait.c' object='prov/util/src/libmlx_fi_la-util_wait.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_buf.lo `test -f 'prov/util/src/util_buf.c' || echo '$(srcdir)/'`prov/util/src/util_buf.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_wait.lo `test -f 'prov/util/src/util_wait.c' || echo '$(srcdir)/'`prov/util/src/util_wait.c
 
-prov/util/src/libmlxm_fi_la-util_mr.lo: prov/util/src/util_mr.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlxm_fi_la-util_mr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_mr.Tpo -c -o prov/util/src/libmlxm_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_mr.Tpo prov/util/src/$(DEPDIR)/libmlxm_fi_la-util_mr.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_mr.c' object='prov/util/src/libmlxm_fi_la-util_mr.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_buf.lo: prov/util/src/util_buf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_buf.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_buf.Tpo -c -o prov/util/src/libmlx_fi_la-util_buf.lo `test -f 'prov/util/src/util_buf.c' || echo '$(srcdir)/'`prov/util/src/util_buf.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_buf.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_buf.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_buf.c' object='prov/util/src/libmlx_fi_la-util_buf.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlxm_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_buf.lo `test -f 'prov/util/src/util_buf.c' || echo '$(srcdir)/'`prov/util/src/util_buf.c
 
-src/osx/libmlxm_fi_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/libmlxm_fi_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/libmlxm_fi_la-osd.Tpo -c -o src/osx/libmlxm_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/libmlxm_fi_la-osd.Tpo src/osx/$(DEPDIR)/libmlxm_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/libmlxm_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_mr.lo: prov/util/src/util_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_mr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_mr.Tpo -c -o prov/util/src/libmlx_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_mr.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_mr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_mr.c' object='prov/util/src/libmlx_fi_la-util_mr.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/libmlxm_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/unix/libmlxm_fi_la-osd.lo: src/unix/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libmlxm_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libmlxm_fi_la-osd.Tpo -c -o src/unix/libmlxm_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/unix/$(DEPDIR)/libmlxm_fi_la-osd.Tpo src/unix/$(DEPDIR)/libmlxm_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/unix/osd.c' object='src/unix/libmlxm_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libmlx_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libmlx_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ns.Tpo -c -o prov/util/src/libmlx_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libmlx_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libmlx_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlxm_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/unix/libmlxm_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libmlx_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+
+src/unix/libmlx_fi_la-osd.lo: src/unix/osd.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libmlx_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libmlx_fi_la-osd.Tpo -c -o src/unix/libmlx_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/unix/$(DEPDIR)/libmlx_fi_la-osd.Tpo src/unix/$(DEPDIR)/libmlx_fi_la-osd.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/unix/osd.c' object='src/unix/libmlx_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libmlx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/unix/libmlx_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
 
 prov/psm/src/libpsmx_fi_la-psmx_init.lo: prov/psm/src/psmx_init.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/psm/src/libpsmx_fi_la-psmx_init.lo -MD -MP -MF prov/psm/src/$(DEPDIR)/libpsmx_fi_la-psmx_init.Tpo -c -o prov/psm/src/libpsmx_fi_la-psmx_init.lo `test -f 'prov/psm/src/psmx_init.c' || echo '$(srcdir)/'`prov/psm/src/psmx_init.c
@@ -5846,6 +7171,20 @@ src/libpsmx_fi_la-indexer.lo: src/indexer.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libpsmx_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
+src/libpsmx_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libpsmx_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libpsmx_fi_la-iov.Tpo -c -o src/libpsmx_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpsmx_fi_la-iov.Tpo src/$(DEPDIR)/libpsmx_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libpsmx_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libpsmx_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/libpsmx_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_atomic.Tpo -c -o prov/util/src/libpsmx_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libpsmx_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
 prov/util/src/libpsmx_fi_la-util_attr.lo: prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_attr.Tpo -c -o prov/util/src/libpsmx_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_attr.Plo
@@ -5867,6 +7206,13 @@ prov/util/src/libpsmx_fi_la-util_cq.lo: prov/util/src/util_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
+prov/util/src/libpsmx_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_cntr.Tpo -c -o prov/util/src/libpsmx_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libpsmx_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+
 prov/util/src/libpsmx_fi_la-util_domain.lo: prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_domain.Tpo -c -o prov/util/src/libpsmx_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_domain.Plo
@@ -5930,12 +7276,12 @@ prov/util/src/libpsmx_fi_la-util_mr.lo: prov/util/src/util_mr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/osx/libpsmx_fi_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/libpsmx_fi_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/libpsmx_fi_la-osd.Tpo -c -o src/osx/libpsmx_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/libpsmx_fi_la-osd.Tpo src/osx/$(DEPDIR)/libpsmx_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/libpsmx_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libpsmx_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_ns.Tpo -c -o prov/util/src/libpsmx_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libpsmx_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libpsmx_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/libpsmx_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
 
 src/unix/libpsmx_fi_la-osd.lo: src/unix/osd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libpsmx_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libpsmx_fi_la-osd.Tpo -c -o src/unix/libpsmx_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
@@ -6210,6 +7556,20 @@ src/libpsmx2_fi_la-indexer.lo: src/indexer.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libpsmx2_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
+src/libpsmx2_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libpsmx2_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libpsmx2_fi_la-iov.Tpo -c -o src/libpsmx2_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libpsmx2_fi_la-iov.Tpo src/$(DEPDIR)/libpsmx2_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libpsmx2_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libpsmx2_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/libpsmx2_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx2_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_atomic.Tpo -c -o prov/util/src/libpsmx2_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libpsmx2_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx2_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
 prov/util/src/libpsmx2_fi_la-util_attr.lo: prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx2_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_attr.Tpo -c -o prov/util/src/libpsmx2_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_attr.Plo
@@ -6231,6 +7591,13 @@ prov/util/src/libpsmx2_fi_la-util_cq.lo: prov/util/src/util_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx2_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
+prov/util/src/libpsmx2_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx2_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_cntr.Tpo -c -o prov/util/src/libpsmx2_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libpsmx2_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx2_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+
 prov/util/src/libpsmx2_fi_la-util_domain.lo: prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx2_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_domain.Tpo -c -o prov/util/src/libpsmx2_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_domain.Plo
@@ -6294,12 +7661,12 @@ prov/util/src/libpsmx2_fi_la-util_mr.lo: prov/util/src/util_mr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx2_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/osx/libpsmx2_fi_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/libpsmx2_fi_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/libpsmx2_fi_la-osd.Tpo -c -o src/osx/libpsmx2_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/libpsmx2_fi_la-osd.Tpo src/osx/$(DEPDIR)/libpsmx2_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/libpsmx2_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libpsmx2_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libpsmx2_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_ns.Tpo -c -o prov/util/src/libpsmx2_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libpsmx2_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libpsmx2_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/libpsmx2_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libpsmx2_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
 
 src/unix/libpsmx2_fi_la-osd.lo: src/unix/osd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpsmx2_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libpsmx2_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libpsmx2_fi_la-osd.Tpo -c -o src/unix/libpsmx2_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
@@ -6763,6 +8130,20 @@ src/libusnic_fi_la-indexer.lo: src/indexer.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libusnic_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
+src/libusnic_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libusnic_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libusnic_fi_la-iov.Tpo -c -o src/libusnic_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libusnic_fi_la-iov.Tpo src/$(DEPDIR)/libusnic_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libusnic_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libusnic_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/libusnic_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libusnic_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libusnic_fi_la-util_atomic.Tpo -c -o prov/util/src/libusnic_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libusnic_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libusnic_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libusnic_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libusnic_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
 prov/util/src/libusnic_fi_la-util_attr.lo: prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libusnic_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libusnic_fi_la-util_attr.Tpo -c -o prov/util/src/libusnic_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libusnic_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libusnic_fi_la-util_attr.Plo
@@ -6784,6 +8165,13 @@ prov/util/src/libusnic_fi_la-util_cq.lo: prov/util/src/util_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libusnic_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
+prov/util/src/libusnic_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libusnic_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libusnic_fi_la-util_cntr.Tpo -c -o prov/util/src/libusnic_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libusnic_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libusnic_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libusnic_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libusnic_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+
 prov/util/src/libusnic_fi_la-util_domain.lo: prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libusnic_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libusnic_fi_la-util_domain.Tpo -c -o prov/util/src/libusnic_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libusnic_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libusnic_fi_la-util_domain.Plo
@@ -6847,12 +8235,12 @@ prov/util/src/libusnic_fi_la-util_mr.lo: prov/util/src/util_mr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libusnic_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/osx/libusnic_fi_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/libusnic_fi_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/libusnic_fi_la-osd.Tpo -c -o src/osx/libusnic_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/libusnic_fi_la-osd.Tpo src/osx/$(DEPDIR)/libusnic_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/libusnic_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libusnic_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libusnic_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libusnic_fi_la-util_ns.Tpo -c -o prov/util/src/libusnic_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libusnic_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libusnic_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libusnic_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/libusnic_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libusnic_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
 
 src/unix/libusnic_fi_la-osd.lo: src/unix/osd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libusnic_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libusnic_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libusnic_fi_la-osd.Tpo -c -o src/unix/libusnic_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
@@ -6875,13 +8263,6 @@ prov/verbs/src/libverbs_fi_la-verbs_atomic.lo: prov/verbs/src/verbs_atomic.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/verbs/src/libverbs_fi_la-verbs_atomic.lo `test -f 'prov/verbs/src/verbs_atomic.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_atomic.c
 
-prov/verbs/src/libverbs_fi_la-verbs_av.lo: prov/verbs/src/verbs_av.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/verbs/src/libverbs_fi_la-verbs_av.lo -MD -MP -MF prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_av.Tpo -c -o prov/verbs/src/libverbs_fi_la-verbs_av.lo `test -f 'prov/verbs/src/verbs_av.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_av.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_av.Tpo prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_av.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/verbs/src/verbs_av.c' object='prov/verbs/src/libverbs_fi_la-verbs_av.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/verbs/src/libverbs_fi_la-verbs_av.lo `test -f 'prov/verbs/src/verbs_av.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_av.c
-
 prov/verbs/src/libverbs_fi_la-verbs_cm.lo: prov/verbs/src/verbs_cm.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/verbs/src/libverbs_fi_la-verbs_cm.lo -MD -MP -MF prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_cm.Tpo -c -o prov/verbs/src/libverbs_fi_la-verbs_cm.lo `test -f 'prov/verbs/src/verbs_cm.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_cm.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_cm.Tpo prov/verbs/src/$(DEPDIR)/libverbs_fi_la-verbs_cm.Plo
@@ -7043,6 +8424,20 @@ src/libverbs_fi_la-indexer.lo: src/indexer.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libverbs_fi_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
+src/libverbs_fi_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/libverbs_fi_la-iov.lo -MD -MP -MF src/$(DEPDIR)/libverbs_fi_la-iov.Tpo -c -o src/libverbs_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/libverbs_fi_la-iov.Tpo src/$(DEPDIR)/libverbs_fi_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/libverbs_fi_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/libverbs_fi_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/libverbs_fi_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libverbs_fi_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libverbs_fi_la-util_atomic.Tpo -c -o prov/util/src/libverbs_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libverbs_fi_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/libverbs_fi_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/libverbs_fi_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libverbs_fi_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
 prov/util/src/libverbs_fi_la-util_attr.lo: prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libverbs_fi_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libverbs_fi_la-util_attr.Tpo -c -o prov/util/src/libverbs_fi_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libverbs_fi_la-util_attr.Tpo prov/util/src/$(DEPDIR)/libverbs_fi_la-util_attr.Plo
@@ -7064,6 +8459,13 @@ prov/util/src/libverbs_fi_la-util_cq.lo: prov/util/src/util_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libverbs_fi_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
+prov/util/src/libverbs_fi_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libverbs_fi_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libverbs_fi_la-util_cntr.Tpo -c -o prov/util/src/libverbs_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libverbs_fi_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/libverbs_fi_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/libverbs_fi_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libverbs_fi_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+
 prov/util/src/libverbs_fi_la-util_domain.lo: prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libverbs_fi_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libverbs_fi_la-util_domain.Tpo -c -o prov/util/src/libverbs_fi_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libverbs_fi_la-util_domain.Tpo prov/util/src/$(DEPDIR)/libverbs_fi_la-util_domain.Plo
@@ -7127,12 +8529,12 @@ prov/util/src/libverbs_fi_la-util_mr.lo: prov/util/src/util_mr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libverbs_fi_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/osx/libverbs_fi_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/libverbs_fi_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/libverbs_fi_la-osd.Tpo -c -o src/osx/libverbs_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/libverbs_fi_la-osd.Tpo src/osx/$(DEPDIR)/libverbs_fi_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/libverbs_fi_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/libverbs_fi_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/libverbs_fi_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/libverbs_fi_la-util_ns.Tpo -c -o prov/util/src/libverbs_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/libverbs_fi_la-util_ns.Tpo prov/util/src/$(DEPDIR)/libverbs_fi_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/libverbs_fi_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/libverbs_fi_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/libverbs_fi_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
 
 src/unix/libverbs_fi_la-osd.lo: src/unix/osd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libverbs_fi_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/libverbs_fi_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/libverbs_fi_la-osd.Tpo -c -o src/unix/libverbs_fi_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
@@ -7169,6 +8571,13 @@ src/src_libfabric_la-var.lo: src/var.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/src_libfabric_la-var.lo `test -f 'src/var.c' || echo '$(srcdir)/'`src/var.c
 
+src/src_libfabric_la-abi_1_0.lo: src/abi_1_0.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/src_libfabric_la-abi_1_0.lo -MD -MP -MF src/$(DEPDIR)/src_libfabric_la-abi_1_0.Tpo -c -o src/src_libfabric_la-abi_1_0.lo `test -f 'src/abi_1_0.c' || echo '$(srcdir)/'`src/abi_1_0.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/src_libfabric_la-abi_1_0.Tpo src/$(DEPDIR)/src_libfabric_la-abi_1_0.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/abi_1_0.c' object='src/src_libfabric_la-abi_1_0.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/src_libfabric_la-abi_1_0.lo `test -f 'src/abi_1_0.c' || echo '$(srcdir)/'`src/abi_1_0.c
+
 src/src_libfabric_la-common.lo: src/common.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/src_libfabric_la-common.lo -MD -MP -MF src/$(DEPDIR)/src_libfabric_la-common.Tpo -c -o src/src_libfabric_la-common.lo `test -f 'src/common.c' || echo '$(srcdir)/'`src/common.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/src_libfabric_la-common.Tpo src/$(DEPDIR)/src_libfabric_la-common.Plo
@@ -7204,6 +8613,20 @@ src/src_libfabric_la-indexer.lo: src/indexer.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/src_libfabric_la-indexer.lo `test -f 'src/indexer.c' || echo '$(srcdir)/'`src/indexer.c
 
+src/src_libfabric_la-iov.lo: src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/src_libfabric_la-iov.lo -MD -MP -MF src/$(DEPDIR)/src_libfabric_la-iov.Tpo -c -o src/src_libfabric_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/$(DEPDIR)/src_libfabric_la-iov.Tpo src/$(DEPDIR)/src_libfabric_la-iov.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/iov.c' object='src/src_libfabric_la-iov.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/src_libfabric_la-iov.lo `test -f 'src/iov.c' || echo '$(srcdir)/'`src/iov.c
+
+prov/util/src/src_libfabric_la-util_atomic.lo: prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/src_libfabric_la-util_atomic.lo -MD -MP -MF prov/util/src/$(DEPDIR)/src_libfabric_la-util_atomic.Tpo -c -o prov/util/src/src_libfabric_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/src_libfabric_la-util_atomic.Tpo prov/util/src/$(DEPDIR)/src_libfabric_la-util_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_atomic.c' object='prov/util/src/src_libfabric_la-util_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/src_libfabric_la-util_atomic.lo `test -f 'prov/util/src/util_atomic.c' || echo '$(srcdir)/'`prov/util/src/util_atomic.c
+
 prov/util/src/src_libfabric_la-util_attr.lo: prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/src_libfabric_la-util_attr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/src_libfabric_la-util_attr.Tpo -c -o prov/util/src/src_libfabric_la-util_attr.lo `test -f 'prov/util/src/util_attr.c' || echo '$(srcdir)/'`prov/util/src/util_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/src_libfabric_la-util_attr.Tpo prov/util/src/$(DEPDIR)/src_libfabric_la-util_attr.Plo
@@ -7225,6 +8648,13 @@ prov/util/src/src_libfabric_la-util_cq.lo: prov/util/src/util_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/src_libfabric_la-util_cq.lo `test -f 'prov/util/src/util_cq.c' || echo '$(srcdir)/'`prov/util/src/util_cq.c
 
+prov/util/src/src_libfabric_la-util_cntr.lo: prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/src_libfabric_la-util_cntr.lo -MD -MP -MF prov/util/src/$(DEPDIR)/src_libfabric_la-util_cntr.Tpo -c -o prov/util/src/src_libfabric_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/src_libfabric_la-util_cntr.Tpo prov/util/src/$(DEPDIR)/src_libfabric_la-util_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_cntr.c' object='prov/util/src/src_libfabric_la-util_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/src_libfabric_la-util_cntr.lo `test -f 'prov/util/src/util_cntr.c' || echo '$(srcdir)/'`prov/util/src/util_cntr.c
+
 prov/util/src/src_libfabric_la-util_domain.lo: prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/src_libfabric_la-util_domain.lo -MD -MP -MF prov/util/src/$(DEPDIR)/src_libfabric_la-util_domain.Tpo -c -o prov/util/src/src_libfabric_la-util_domain.lo `test -f 'prov/util/src/util_domain.c' || echo '$(srcdir)/'`prov/util/src/util_domain.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/src_libfabric_la-util_domain.Tpo prov/util/src/$(DEPDIR)/src_libfabric_la-util_domain.Plo
@@ -7288,12 +8718,12 @@ prov/util/src/src_libfabric_la-util_mr.lo: prov/util/src/util_mr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/src_libfabric_la-util_mr.lo `test -f 'prov/util/src/util_mr.c' || echo '$(srcdir)/'`prov/util/src/util_mr.c
 
-src/osx/src_libfabric_la-osd.lo: src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/osx/src_libfabric_la-osd.lo -MD -MP -MF src/osx/$(DEPDIR)/src_libfabric_la-osd.Tpo -c -o src/osx/src_libfabric_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) src/osx/$(DEPDIR)/src_libfabric_la-osd.Tpo src/osx/$(DEPDIR)/src_libfabric_la-osd.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='src/osx/osd.c' object='src/osx/src_libfabric_la-osd.lo' libtool=yes @AMDEPBACKSLASH@
+prov/util/src/src_libfabric_la-util_ns.lo: prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/util/src/src_libfabric_la-util_ns.lo -MD -MP -MF prov/util/src/$(DEPDIR)/src_libfabric_la-util_ns.Tpo -c -o prov/util/src/src_libfabric_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/util/src/$(DEPDIR)/src_libfabric_la-util_ns.Tpo prov/util/src/$(DEPDIR)/src_libfabric_la-util_ns.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/util/src/util_ns.c' object='prov/util/src/src_libfabric_la-util_ns.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/osx/src_libfabric_la-osd.lo `test -f 'src/osx/osd.c' || echo '$(srcdir)/'`src/osx/osd.c
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/util/src/src_libfabric_la-util_ns.lo `test -f 'prov/util/src/util_ns.c' || echo '$(srcdir)/'`prov/util/src/util_ns.c
 
 src/unix/src_libfabric_la-osd.lo: src/unix/osd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/unix/src_libfabric_la-osd.lo -MD -MP -MF src/unix/$(DEPDIR)/src_libfabric_la-osd.Tpo -c -o src/unix/src_libfabric_la-osd.lo `test -f 'src/unix/osd.c' || echo '$(srcdir)/'`src/unix/osd.c
@@ -7512,13 +8942,6 @@ prov/verbs/src/src_libfabric_la-verbs_atomic.lo: prov/verbs/src/verbs_atomic.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/verbs/src/src_libfabric_la-verbs_atomic.lo `test -f 'prov/verbs/src/verbs_atomic.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_atomic.c
 
-prov/verbs/src/src_libfabric_la-verbs_av.lo: prov/verbs/src/verbs_av.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/verbs/src/src_libfabric_la-verbs_av.lo -MD -MP -MF prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_av.Tpo -c -o prov/verbs/src/src_libfabric_la-verbs_av.lo `test -f 'prov/verbs/src/verbs_av.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_av.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_av.Tpo prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_av.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/verbs/src/verbs_av.c' object='prov/verbs/src/src_libfabric_la-verbs_av.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/verbs/src/src_libfabric_la-verbs_av.lo `test -f 'prov/verbs/src/verbs_av.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_av.c
-
 prov/verbs/src/src_libfabric_la-verbs_cm.lo: prov/verbs/src/verbs_cm.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/verbs/src/src_libfabric_la-verbs_cm.lo -MD -MP -MF prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_cm.Tpo -c -o prov/verbs/src/src_libfabric_la-verbs_cm.lo `test -f 'prov/verbs/src/verbs_cm.c' || echo '$(srcdir)/'`prov/verbs/src/verbs_cm.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_cm.Tpo prov/verbs/src/$(DEPDIR)/src_libfabric_la-verbs_cm.Plo
@@ -7953,62 +9376,6 @@ prov/usnic/src/src_libfabric_la-usdf_fake_ibv.lo: prov/usnic/src/usdf_fake_ibv.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/usnic/src/src_libfabric_la-usdf_fake_ibv.lo `test -f 'prov/usnic/src/usdf_fake_ibv.c' || echo '$(srcdir)/'`prov/usnic/src/usdf_fake_ibv.c
 
-prov/mxm/src/src_libfabric_la-mlxm_init.lo: prov/mxm/src/mlxm_init.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_init.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_init.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_init.lo `test -f 'prov/mxm/src/mlxm_init.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_init.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_init.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_init.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_init.c' object='prov/mxm/src/src_libfabric_la-mlxm_init.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_init.lo `test -f 'prov/mxm/src/mlxm_init.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_init.c
-
-prov/mxm/src/src_libfabric_la-mlxm_domain.lo: prov/mxm/src/mlxm_domain.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_domain.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_domain.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_domain.lo `test -f 'prov/mxm/src/mlxm_domain.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_domain.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_domain.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_domain.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_domain.c' object='prov/mxm/src/src_libfabric_la-mlxm_domain.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_domain.lo `test -f 'prov/mxm/src/mlxm_domain.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_domain.c
-
-prov/mxm/src/src_libfabric_la-mlxm_cq.lo: prov/mxm/src/mlxm_cq.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_cq.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cq.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_cq.lo `test -f 'prov/mxm/src/mlxm_cq.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cq.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cq.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cq.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_cq.c' object='prov/mxm/src/src_libfabric_la-mlxm_cq.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_cq.lo `test -f 'prov/mxm/src/mlxm_cq.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cq.c
-
-prov/mxm/src/src_libfabric_la-mlxm_av.lo: prov/mxm/src/mlxm_av.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_av.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_av.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_av.lo `test -f 'prov/mxm/src/mlxm_av.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_av.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_av.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_av.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_av.c' object='prov/mxm/src/src_libfabric_la-mlxm_av.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_av.lo `test -f 'prov/mxm/src/mlxm_av.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_av.c
-
-prov/mxm/src/src_libfabric_la-mlxm_ep.lo: prov/mxm/src/mlxm_ep.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_ep.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_ep.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_ep.lo `test -f 'prov/mxm/src/mlxm_ep.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_ep.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_ep.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_ep.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_ep.c' object='prov/mxm/src/src_libfabric_la-mlxm_ep.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_ep.lo `test -f 'prov/mxm/src/mlxm_ep.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_ep.c
-
-prov/mxm/src/src_libfabric_la-mlxm_cm.lo: prov/mxm/src/mlxm_cm.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_cm.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cm.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_cm.lo `test -f 'prov/mxm/src/mlxm_cm.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cm.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cm.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_cm.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_cm.c' object='prov/mxm/src/src_libfabric_la-mlxm_cm.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_cm.lo `test -f 'prov/mxm/src/mlxm_cm.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_cm.c
-
-prov/mxm/src/src_libfabric_la-mlxm_tagged.lo: prov/mxm/src/mlxm_tagged.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_tagged.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_tagged.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_tagged.lo `test -f 'prov/mxm/src/mlxm_tagged.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_tagged.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_tagged.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_tagged.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_tagged.c' object='prov/mxm/src/src_libfabric_la-mlxm_tagged.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_tagged.lo `test -f 'prov/mxm/src/mlxm_tagged.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_tagged.c
-
-prov/mxm/src/src_libfabric_la-mlxm_mr.lo: prov/mxm/src/mlxm_mr.c
- at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mxm/src/src_libfabric_la-mlxm_mr.lo -MD -MP -MF prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_mr.Tpo -c -o prov/mxm/src/src_libfabric_la-mlxm_mr.lo `test -f 'prov/mxm/src/mlxm_mr.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_mr.c
- at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_mr.Tpo prov/mxm/src/$(DEPDIR)/src_libfabric_la-mlxm_mr.Plo
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mxm/src/mlxm_mr.c' object='prov/mxm/src/src_libfabric_la-mlxm_mr.lo' libtool=yes @AMDEPBACKSLASH@
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mxm/src/src_libfabric_la-mlxm_mr.lo `test -f 'prov/mxm/src/mlxm_mr.c' || echo '$(srcdir)/'`prov/mxm/src/mlxm_mr.c
-
 prov/gni/src/src_libfabric_la-gnix_atomic.lo: prov/gni/src/gnix_atomic.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_atomic.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_atomic.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_atomic.lo `test -f 'prov/gni/src/gnix_atomic.c' || echo '$(srcdir)/'`prov/gni/src/gnix_atomic.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_atomic.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_atomic.Plo
@@ -8016,6 +9383,13 @@ prov/gni/src/src_libfabric_la-gnix_atomic.lo: prov/gni/src/gnix_atomic.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/src_libfabric_la-gnix_atomic.lo `test -f 'prov/gni/src/gnix_atomic.c' || echo '$(srcdir)/'`prov/gni/src/gnix_atomic.c
 
+prov/gni/src/src_libfabric_la-gnix_auth_key.lo: prov/gni/src/gnix_auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_auth_key.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_auth_key.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_auth_key.lo `test -f 'prov/gni/src/gnix_auth_key.c' || echo '$(srcdir)/'`prov/gni/src/gnix_auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_auth_key.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_auth_key.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/src/gnix_auth_key.c' object='prov/gni/src/src_libfabric_la-gnix_auth_key.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/src_libfabric_la-gnix_auth_key.lo `test -f 'prov/gni/src/gnix_auth_key.c' || echo '$(srcdir)/'`prov/gni/src/gnix_auth_key.c
+
 prov/gni/src/src_libfabric_la-gnix_av.lo: prov/gni/src/gnix_av.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_av.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_av.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_av.lo `test -f 'prov/gni/src/gnix_av.c' || echo '$(srcdir)/'`prov/gni/src/gnix_av.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_av.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_av.Plo
@@ -8177,6 +9551,13 @@ prov/gni/src/src_libfabric_la-gnix_poll.lo: prov/gni/src/gnix_poll.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/src_libfabric_la-gnix_poll.lo `test -f 'prov/gni/src/gnix_poll.c' || echo '$(srcdir)/'`prov/gni/src/gnix_poll.c
 
+prov/gni/src/src_libfabric_la-gnix_progress.lo: prov/gni/src/gnix_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_progress.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_progress.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_progress.lo `test -f 'prov/gni/src/gnix_progress.c' || echo '$(srcdir)/'`prov/gni/src/gnix_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_progress.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_progress.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/src/gnix_progress.c' object='prov/gni/src/src_libfabric_la-gnix_progress.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/src_libfabric_la-gnix_progress.lo `test -f 'prov/gni/src/gnix_progress.c' || echo '$(srcdir)/'`prov/gni/src/gnix_progress.c
+
 prov/gni/src/src_libfabric_la-gnix_queue.lo: prov/gni/src/gnix_queue.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_queue.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_queue.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_queue.lo `test -f 'prov/gni/src/gnix_queue.c' || echo '$(srcdir)/'`prov/gni/src/gnix_queue.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_queue.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_queue.Plo
@@ -8191,6 +9572,13 @@ prov/gni/src/src_libfabric_la-gnix_rma.lo: prov/gni/src/gnix_rma.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/src_libfabric_la-gnix_rma.lo `test -f 'prov/gni/src/gnix_rma.c' || echo '$(srcdir)/'`prov/gni/src/gnix_rma.c
 
+prov/gni/src/src_libfabric_la-gnix_sep.lo: prov/gni/src/gnix_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_sep.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_sep.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_sep.lo `test -f 'prov/gni/src/gnix_sep.c' || echo '$(srcdir)/'`prov/gni/src/gnix_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_sep.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_sep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/src/gnix_sep.c' object='prov/gni/src/src_libfabric_la-gnix_sep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/src/src_libfabric_la-gnix_sep.lo `test -f 'prov/gni/src/gnix_sep.c' || echo '$(srcdir)/'`prov/gni/src/gnix_sep.c
+
 prov/gni/src/src_libfabric_la-gnix_tags.lo: prov/gni/src/gnix_tags.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/src/src_libfabric_la-gnix_tags.lo -MD -MP -MF prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_tags.Tpo -c -o prov/gni/src/src_libfabric_la-gnix_tags.lo `test -f 'prov/gni/src/gnix_tags.c' || echo '$(srcdir)/'`prov/gni/src/gnix_tags.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_tags.Tpo prov/gni/src/$(DEPDIR)/src_libfabric_la-gnix_tags.Plo
@@ -8289,6 +9677,20 @@ prov/rxm/src/src_libfabric_la-rxm_cq.lo: prov/rxm/src/rxm_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/rxm/src/src_libfabric_la-rxm_cq.lo `test -f 'prov/rxm/src/rxm_cq.c' || echo '$(srcdir)/'`prov/rxm/src/rxm_cq.c
 
+prov/rxm/src/src_libfabric_la-rxm_rma.lo: prov/rxm/src/rxm_rma.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/rxm/src/src_libfabric_la-rxm_rma.lo -MD -MP -MF prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_rma.Tpo -c -o prov/rxm/src/src_libfabric_la-rxm_rma.lo `test -f 'prov/rxm/src/rxm_rma.c' || echo '$(srcdir)/'`prov/rxm/src/rxm_rma.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_rma.Tpo prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm_rma.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/rxm/src/rxm_rma.c' object='prov/rxm/src/src_libfabric_la-rxm_rma.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/rxm/src/src_libfabric_la-rxm_rma.lo `test -f 'prov/rxm/src/rxm_rma.c' || echo '$(srcdir)/'`prov/rxm/src/rxm_rma.c
+
+prov/rxm/src/src_libfabric_la-rxm.lo: prov/rxm/src/rxm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/rxm/src/src_libfabric_la-rxm.lo -MD -MP -MF prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm.Tpo -c -o prov/rxm/src/src_libfabric_la-rxm.lo `test -f 'prov/rxm/src/rxm.c' || echo '$(srcdir)/'`prov/rxm/src/rxm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm.Tpo prov/rxm/src/$(DEPDIR)/src_libfabric_la-rxm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/rxm/src/rxm.c' object='prov/rxm/src/src_libfabric_la-rxm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/rxm/src/src_libfabric_la-rxm.lo `test -f 'prov/rxm/src/rxm.c' || echo '$(srcdir)/'`prov/rxm/src/rxm.c
+
 prov/rxd/src/src_libfabric_la-rxd_attr.lo: prov/rxd/src/rxd_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/rxd/src/src_libfabric_la-rxd_attr.lo -MD -MP -MF prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_attr.Tpo -c -o prov/rxd/src/src_libfabric_la-rxd_attr.lo `test -f 'prov/rxd/src/rxd_attr.c' || echo '$(srcdir)/'`prov/rxd/src/rxd_attr.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_attr.Tpo prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_attr.Plo
@@ -8331,6 +9733,13 @@ prov/rxd/src/src_libfabric_la-rxd_cq.lo: prov/rxd/src/rxd_cq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/rxd/src/src_libfabric_la-rxd_cq.lo `test -f 'prov/rxd/src/rxd_cq.c' || echo '$(srcdir)/'`prov/rxd/src/rxd_cq.c
 
+prov/rxd/src/src_libfabric_la-rxd_cntr.lo: prov/rxd/src/rxd_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/rxd/src/src_libfabric_la-rxd_cntr.lo -MD -MP -MF prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_cntr.Tpo -c -o prov/rxd/src/src_libfabric_la-rxd_cntr.lo `test -f 'prov/rxd/src/rxd_cntr.c' || echo '$(srcdir)/'`prov/rxd/src/rxd_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_cntr.Tpo prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/rxd/src/rxd_cntr.c' object='prov/rxd/src/src_libfabric_la-rxd_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/rxd/src/src_libfabric_la-rxd_cntr.lo `test -f 'prov/rxd/src/rxd_cntr.c' || echo '$(srcdir)/'`prov/rxd/src/rxd_cntr.c
+
 prov/rxd/src/src_libfabric_la-rxd_ep.lo: prov/rxd/src/rxd_ep.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/rxd/src/src_libfabric_la-rxd_ep.lo -MD -MP -MF prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_ep.Tpo -c -o prov/rxd/src/src_libfabric_la-rxd_ep.lo `test -f 'prov/rxd/src/rxd_ep.c' || echo '$(srcdir)/'`prov/rxd/src/rxd_ep.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_ep.Tpo prov/rxd/src/$(DEPDIR)/src_libfabric_la-rxd_ep.Plo
@@ -8345,6 +9754,251 @@ prov/rxd/src/src_libfabric_la-rxd_rma.lo: prov/rxd/src/rxd_rma.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/rxd/src/src_libfabric_la-rxd_rma.lo `test -f 'prov/rxd/src/rxd_rma.c' || echo '$(srcdir)/'`prov/rxd/src/rxd_rma.c
 
+prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo: prov/bgq/src/fi_bgq_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_atomic.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo `test -f 'prov/bgq/src/fi_bgq_atomic.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_atomic.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_atomic.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_atomic.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_atomic.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_atomic.lo `test -f 'prov/bgq/src/fi_bgq_atomic.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_atomic.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_av.lo: prov/bgq/src/fi_bgq_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_av.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_av.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_av.lo `test -f 'prov/bgq/src/fi_bgq_av.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_av.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_av.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_av.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_av.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_av.lo `test -f 'prov/bgq/src/fi_bgq_av.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_av.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo: prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_spi.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo `test -f 'prov/bgq/src/fi_bgq_spi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_spi.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_spi.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_spi.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_spi.lo `test -f 'prov/bgq/src/fi_bgq_spi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_spi.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo: prov/bgq/src/fi_bgq_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cm.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo `test -f 'prov/bgq/src/fi_bgq_cm.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cm.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_cm.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_cm.lo `test -f 'prov/bgq/src/fi_bgq_cm.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cm.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo: prov/bgq/src/fi_bgq_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cntr.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo `test -f 'prov/bgq/src/fi_bgq_cntr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cntr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cntr.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cntr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_cntr.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_cntr.lo `test -f 'prov/bgq/src/fi_bgq_cntr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cntr.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo: prov/bgq/src/fi_bgq_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cq.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo `test -f 'prov/bgq/src/fi_bgq_cq.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cq.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_cq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_cq.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_cq.lo `test -f 'prov/bgq/src/fi_bgq_cq.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_cq.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo: prov/bgq/src/fi_bgq_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_domain.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo `test -f 'prov/bgq/src/fi_bgq_domain.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_domain.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_domain.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_domain.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_domain.lo `test -f 'prov/bgq/src/fi_bgq_domain.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_domain.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo: prov/bgq/src/fi_bgq_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_ep.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo `test -f 'prov/bgq/src/fi_bgq_ep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_ep.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_ep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_ep.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_ep.lo `test -f 'prov/bgq/src/fi_bgq_ep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_ep.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo: prov/bgq/src/fi_bgq_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_fabric.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo `test -f 'prov/bgq/src/fi_bgq_fabric.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_fabric.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_fabric.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_fabric.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_fabric.lo `test -f 'prov/bgq/src/fi_bgq_fabric.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_fabric.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_info.lo: prov/bgq/src/fi_bgq_info.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_info.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_info.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_info.lo `test -f 'prov/bgq/src/fi_bgq_info.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_info.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_info.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_info.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_info.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_info.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_info.lo `test -f 'prov/bgq/src/fi_bgq_info.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_info.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_init.lo: prov/bgq/src/fi_bgq_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_init.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_init.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_init.lo `test -f 'prov/bgq/src/fi_bgq_init.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_init.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_init.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_init.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_init.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_init.lo `test -f 'prov/bgq/src/fi_bgq_init.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_init.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo: prov/bgq/src/fi_bgq_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_mr.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo `test -f 'prov/bgq/src/fi_bgq_mr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_mr.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_mr.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_mr.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_mr.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_mr.lo `test -f 'prov/bgq/src/fi_bgq_mr.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_mr.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo: prov/bgq/src/fi_bgq_msg.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_msg.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo `test -f 'prov/bgq/src/fi_bgq_msg.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_msg.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_msg.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_msg.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_msg.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_msg.lo `test -f 'prov/bgq/src/fi_bgq_msg.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_msg.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo: prov/bgq/src/fi_bgq_rma.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_rma.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo `test -f 'prov/bgq/src/fi_bgq_rma.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_rma.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_rma.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_rma.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_rma.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_rma.lo `test -f 'prov/bgq/src/fi_bgq_rma.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_rma.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo: prov/bgq/src/fi_bgq_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_sep.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo `test -f 'prov/bgq/src/fi_bgq_sep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_sep.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_sep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_sep.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_sep.lo `test -f 'prov/bgq/src/fi_bgq_sep.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_sep.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo: prov/bgq/src/fi_bgq_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_tagged.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo `test -f 'prov/bgq/src/fi_bgq_tagged.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_tagged.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_tagged.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_tagged.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_tagged.lo `test -f 'prov/bgq/src/fi_bgq_tagged.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_tagged.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_node.lo: prov/bgq/src/fi_bgq_node.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_node.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_node.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_node.lo `test -f 'prov/bgq/src/fi_bgq_node.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_node.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_node.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_node.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_node.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_node.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_node.lo `test -f 'prov/bgq/src/fi_bgq_node.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_node.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo: prov/bgq/src/fi_bgq_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_progress.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo `test -f 'prov/bgq/src/fi_bgq_progress.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_progress.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_progress.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_progress.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_progress.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_progress.lo `test -f 'prov/bgq/src/fi_bgq_progress.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_progress.c
+
+prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo: prov/bgq/src/fi_bgq_pmi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo -MD -MP -MF prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_pmi.Tpo -c -o prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo `test -f 'prov/bgq/src/fi_bgq_pmi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_pmi.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_pmi.Tpo prov/bgq/src/$(DEPDIR)/src_libfabric_la-fi_bgq_pmi.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_pmi.c' object='prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/src_libfabric_la-fi_bgq_pmi.lo `test -f 'prov/bgq/src/fi_bgq_pmi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_pmi.c
+
+prov/mlx/src/src_libfabric_la-mlx_av.lo: prov/mlx/src/mlx_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_av.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_av.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_av.lo `test -f 'prov/mlx/src/mlx_av.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_av.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_av.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_av.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_av.c' object='prov/mlx/src/src_libfabric_la-mlx_av.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_av.lo `test -f 'prov/mlx/src/mlx_av.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_av.c
+
+prov/mlx/src/src_libfabric_la-mlx_cm.lo: prov/mlx/src/mlx_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_cm.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cm.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_cm.lo `test -f 'prov/mlx/src/mlx_cm.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cm.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cm.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_cm.c' object='prov/mlx/src/src_libfabric_la-mlx_cm.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_cm.lo `test -f 'prov/mlx/src/mlx_cm.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cm.c
+
+prov/mlx/src/src_libfabric_la-mlx_cq.lo: prov/mlx/src/mlx_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_cq.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cq.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_cq.lo `test -f 'prov/mlx/src/mlx_cq.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cq.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cq.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_cq.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_cq.c' object='prov/mlx/src/src_libfabric_la-mlx_cq.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_cq.lo `test -f 'prov/mlx/src/mlx_cq.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_cq.c
+
+prov/mlx/src/src_libfabric_la-mlx_domain.lo: prov/mlx/src/mlx_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_domain.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_domain.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_domain.lo `test -f 'prov/mlx/src/mlx_domain.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_domain.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_domain.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_domain.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_domain.c' object='prov/mlx/src/src_libfabric_la-mlx_domain.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_domain.lo `test -f 'prov/mlx/src/mlx_domain.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_domain.c
+
+prov/mlx/src/src_libfabric_la-mlx_ep.lo: prov/mlx/src/mlx_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_ep.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_ep.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_ep.lo `test -f 'prov/mlx/src/mlx_ep.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_ep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_ep.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_ep.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_ep.c' object='prov/mlx/src/src_libfabric_la-mlx_ep.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_ep.lo `test -f 'prov/mlx/src/mlx_ep.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_ep.c
+
+prov/mlx/src/src_libfabric_la-mlx_init.lo: prov/mlx/src/mlx_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_init.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_init.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_init.lo `test -f 'prov/mlx/src/mlx_init.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_init.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_init.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_init.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_init.c' object='prov/mlx/src/src_libfabric_la-mlx_init.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_init.lo `test -f 'prov/mlx/src/mlx_init.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_init.c
+
+prov/mlx/src/src_libfabric_la-mlx_tagged.lo: prov/mlx/src/mlx_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_tagged.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_tagged.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_tagged.lo `test -f 'prov/mlx/src/mlx_tagged.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_tagged.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_tagged.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_tagged.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_tagged.c' object='prov/mlx/src/src_libfabric_la-mlx_tagged.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_tagged.lo `test -f 'prov/mlx/src/mlx_tagged.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_tagged.c
+
+prov/mlx/src/src_libfabric_la-mlx_fabric.lo: prov/mlx/src/mlx_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_fabric.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_fabric.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_fabric.lo `test -f 'prov/mlx/src/mlx_fabric.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_fabric.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_fabric.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_fabric.c' object='prov/mlx/src/src_libfabric_la-mlx_fabric.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_fabric.lo `test -f 'prov/mlx/src/mlx_fabric.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_fabric.c
+
+prov/mlx/src/src_libfabric_la-mlx_callbacks.lo: prov/mlx/src/mlx_callbacks.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/mlx/src/src_libfabric_la-mlx_callbacks.lo -MD -MP -MF prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_callbacks.Tpo -c -o prov/mlx/src/src_libfabric_la-mlx_callbacks.lo `test -f 'prov/mlx/src/mlx_callbacks.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_callbacks.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_callbacks.Tpo prov/mlx/src/$(DEPDIR)/src_libfabric_la-mlx_callbacks.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/mlx/src/mlx_callbacks.c' object='prov/mlx/src/src_libfabric_la-mlx_callbacks.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/mlx/src/src_libfabric_la-mlx_callbacks.lo `test -f 'prov/mlx/src/mlx_callbacks.c' || echo '$(srcdir)/'`prov/mlx/src/mlx_callbacks.c
+
+prov/bgq/external/src_libfabric_la-memory_impl.lo: prov/bgq/external/memory_impl.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/external/src_libfabric_la-memory_impl.lo -MD -MP -MF prov/bgq/external/$(DEPDIR)/src_libfabric_la-memory_impl.Tpo -c -o prov/bgq/external/src_libfabric_la-memory_impl.lo `test -f 'prov/bgq/external/memory_impl.c' || echo '$(srcdir)/'`prov/bgq/external/memor [...]
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/external/$(DEPDIR)/src_libfabric_la-memory_impl.Tpo prov/bgq/external/$(DEPDIR)/src_libfabric_la-memory_impl.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/external/memory_impl.c' object='prov/bgq/external/src_libfabric_la-memory_impl.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(src_libfabric_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/external/src_libfabric_la-memory_impl.lo `test -f 'prov/bgq/external/memory_impl.c' || echo '$(srcdir)/'`prov/bgq/external/memory_impl.c
+
+prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.o: prov/bgq/src/fi_bgq_agent.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent0_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.o -MD -MP -MF prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Tpo -c -o prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.o `test -f 'prov/bgq/src/fi_bgq_agent.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_agent.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Tpo prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_agent.c' object='prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent0_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.o `test -f 'prov/bgq/src/fi_bgq_agent.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_agent.c
+
+prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.obj: prov/bgq/src/fi_bgq_agent.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent0_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.obj -MD -MP -MF prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Tpo -c -o prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.obj `if test -f 'prov/bgq/src/fi_bgq_agent.c'; then $(CYGPATH_W) 'prov/bgq/src/fi_bgq_agent.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/fi_bgq_agent.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Tpo prov/bgq/src/$(DEPDIR)/fi_bgq_agent0-fi_bgq_agent.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_agent.c' object='prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent0_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/fi_bgq_agent0-fi_bgq_agent.obj `if test -f 'prov/bgq/src/fi_bgq_agent.c'; then $(CYGPATH_W) 'prov/bgq/src/fi_bgq_agent.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/fi_bgq_agent.c'; fi`
+
+prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.o: prov/bgq/src/fi_bgq_agent.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.o -MD -MP -MF prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Tpo -c -o prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.o `test -f 'prov/bgq/src/fi_bgq_agent.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_agent.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Tpo prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_agent.c' object='prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.o `test -f 'prov/bgq/src/fi_bgq_agent.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_agent.c
+
+prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.obj: prov/bgq/src/fi_bgq_agent.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.obj -MD -MP -MF prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Tpo -c -o prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.obj `if test -f 'prov/bgq/src/fi_bgq_agent.c'; then $(CYGPATH_W) 'prov/bgq/src/fi_bgq_agent.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/fi_bgq_agent.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Tpo prov/bgq/src/$(DEPDIR)/fi_bgq_agent1-fi_bgq_agent.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_agent.c' object='prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(fi_bgq_agent1_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/fi_bgq_agent1-fi_bgq_agent.obj `if test -f 'prov/bgq/src/fi_bgq_agent.c'; then $(CYGPATH_W) 'prov/bgq/src/fi_bgq_agent.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/fi_bgq_agent.c'; fi`
+
+prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.o: prov/bgq/src/test/l2atomic_fifo_perf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(l2atomic_fifo_perf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.o -MD -MP -MF prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Tpo -c -o prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.o `test -f 'prov/bgq/src/test/l2atomic_fifo_perf.c' || echo '$(srcdir)/'`prov/bgq/src/test/l2atomic_fifo_perf.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Tpo prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/test/l2atomic_fifo_perf.c' object='prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(l2atomic_fifo_perf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.o `test -f 'prov/bgq/src/test/l2atomic_fifo_perf.c' || echo '$(srcdir)/'`prov/bgq/src/test/l2atomic_fifo_perf.c
+
+prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.obj: prov/bgq/src/test/l2atomic_fifo_perf.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(l2atomic_fifo_perf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.obj -MD -MP -MF prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Tpo -c -o prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.obj `if test -f 'prov/bgq/src/test/l2atomic_fifo_perf.c'; then $(CYGPATH_W) 'prov/bgq/src/test/l2atomic_fifo_perf.c'; else $(CYGPATH_W) '$(sr [...]
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Tpo prov/bgq/src/test/$(DEPDIR)/l2atomic_fifo_perf-l2atomic_fifo_perf.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/test/l2atomic_fifo_perf.c' object='prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(l2atomic_fifo_perf_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/test/l2atomic_fifo_perf-l2atomic_fifo_perf.obj `if test -f 'prov/bgq/src/test/l2atomic_fifo_perf.c'; then $(CYGPATH_W) 'prov/bgq/src/test/l2atomic_fifo_perf.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/test/l2atomic_fifo_perf.c'; fi`
+
 prov/gni/test/prov_gni_test_gnitest-allocator.o: prov/gni/test/allocator.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-allocator.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-allocator.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-allocator.o `test -f 'prov/gni/test/allocator.c' || echo '$(srcdir)/'`prov/gni/test/allocator.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-allocator.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-allocator.Po
@@ -8373,6 +10027,20 @@ prov/gni/test/prov_gni_test_gnitest-av.obj: prov/gni/test/av.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-av.obj `if test -f 'prov/gni/test/av.c'; then $(CYGPATH_W) 'prov/gni/test/av.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/av.c'; fi`
 
+prov/gni/test/prov_gni_test_gnitest-auth_key.o: prov/gni/test/auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-auth_key.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-auth_key.o `test -f 'prov/gni/test/auth_key.c' || echo '$(srcdir)/'`prov/gni/test/auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/auth_key.c' object='prov/gni/test/prov_gni_test_gnitest-auth_key.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-auth_key.o `test -f 'prov/gni/test/auth_key.c' || echo '$(srcdir)/'`prov/gni/test/auth_key.c
+
+prov/gni/test/prov_gni_test_gnitest-auth_key.obj: prov/gni/test/auth_key.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-auth_key.obj -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-auth_key.obj `if test -f 'prov/gni/test/auth_key.c'; then $(CYGPATH_W) 'prov/gni/test/auth_key.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/auth_key.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-auth_key.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/auth_key.c' object='prov/gni/test/prov_gni_test_gnitest-auth_key.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-auth_key.obj `if test -f 'prov/gni/test/auth_key.c'; then $(CYGPATH_W) 'prov/gni/test/auth_key.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/auth_key.c'; fi`
+
 prov/gni/test/prov_gni_test_gnitest-bitmap.o: prov/gni/test/bitmap.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-bitmap.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-bitmap.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-bitmap.o `test -f 'prov/gni/test/bitmap.c' || echo '$(srcdir)/'`prov/gni/test/bitmap.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-bitmap.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-bitmap.Po
@@ -8513,6 +10181,34 @@ prov/gni/test/prov_gni_test_gnitest-eq.obj: prov/gni/test/eq.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-eq.obj `if test -f 'prov/gni/test/eq.c'; then $(CYGPATH_W) 'prov/gni/test/eq.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/eq.c'; fi`
 
+prov/gni/test/prov_gni_test_gnitest-fabric.o: prov/gni/test/fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-fabric.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-fabric.o `test -f 'prov/gni/test/fabric.c' || echo '$(srcdir)/'`prov/gni/test/fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/fabric.c' object='prov/gni/test/prov_gni_test_gnitest-fabric.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-fabric.o `test -f 'prov/gni/test/fabric.c' || echo '$(srcdir)/'`prov/gni/test/fabric.c
+
+prov/gni/test/prov_gni_test_gnitest-fabric.obj: prov/gni/test/fabric.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-fabric.obj -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-fabric.obj `if test -f 'prov/gni/test/fabric.c'; then $(CYGPATH_W) 'prov/gni/test/fabric.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/fabric.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fabric.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/fabric.c' object='prov/gni/test/prov_gni_test_gnitest-fabric.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-fabric.obj `if test -f 'prov/gni/test/fabric.c'; then $(CYGPATH_W) 'prov/gni/test/fabric.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/fabric.c'; fi`
+
+prov/gni/test/prov_gni_test_gnitest-fi_addr_str.o: prov/gni/test/fi_addr_str.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-fi_addr_str.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-fi_addr_str.o `test -f 'prov/gni/test/fi_addr_str.c' || echo '$(srcdir)/'`prov/gni/test/fi_addr_str.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/fi_addr_str.c' object='prov/gni/test/prov_gni_test_gnitest-fi_addr_str.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-fi_addr_str.o `test -f 'prov/gni/test/fi_addr_str.c' || echo '$(srcdir)/'`prov/gni/test/fi_addr_str.c
+
+prov/gni/test/prov_gni_test_gnitest-fi_addr_str.obj: prov/gni/test/fi_addr_str.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-fi_addr_str.obj -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-fi_addr_str.obj `if test -f 'prov/gni/test/fi_addr_str.c'; then $(CYGPATH_W) 'prov/gni/test/fi_addr_str.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/fi_addr_str.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-fi_addr_str.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/fi_addr_str.c' object='prov/gni/test/prov_gni_test_gnitest-fi_addr_str.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-fi_addr_str.obj `if test -f 'prov/gni/test/fi_addr_str.c'; then $(CYGPATH_W) 'prov/gni/test/fi_addr_str.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/fi_addr_str.c'; fi`
+
 prov/gni/test/prov_gni_test_gnitest-freelist.o: prov/gni/test/freelist.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-freelist.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-freelist.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-freelist.o `test -f 'prov/gni/test/freelist.c' || echo '$(srcdir)/'`prov/gni/test/freelist.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-freelist.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-freelist.Po
@@ -8751,6 +10447,20 @@ prov/gni/test/prov_gni_test_gnitest-api_cntr.obj: prov/gni/test/api_cntr.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-api_cntr.obj `if test -f 'prov/gni/test/api_cntr.c'; then $(CYGPATH_W) 'prov/gni/test/api_cntr.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/api_cntr.c'; fi`
 
+prov/gni/test/prov_gni_test_gnitest-sep.o: prov/gni/test/sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-sep.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-sep.o `test -f 'prov/gni/test/sep.c' || echo '$(srcdir)/'`prov/gni/test/sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/sep.c' object='prov/gni/test/prov_gni_test_gnitest-sep.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-sep.o `test -f 'prov/gni/test/sep.c' || echo '$(srcdir)/'`prov/gni/test/sep.c
+
+prov/gni/test/prov_gni_test_gnitest-sep.obj: prov/gni/test/sep.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-sep.obj -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-sep.obj `if test -f 'prov/gni/test/sep.c'; then $(CYGPATH_W) 'prov/gni/test/sep.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/sep.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-sep.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/sep.c' object='prov/gni/test/prov_gni_test_gnitest-sep.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-sep.obj `if test -f 'prov/gni/test/sep.c'; then $(CYGPATH_W) 'prov/gni/test/sep.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/sep.c'; fi`
+
 prov/gni/test/prov_gni_test_gnitest-utils.o: prov/gni/test/utils.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-utils.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-utils.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-utils.o `test -f 'prov/gni/test/utils.c' || echo '$(srcdir)/'`prov/gni/test/utils.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-utils.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-utils.Po
@@ -8821,6 +10531,34 @@ prov/gni/test/prov_gni_test_gnitest-wait.obj: prov/gni/test/wait.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-wait.obj `if test -f 'prov/gni/test/wait.c'; then $(CYGPATH_W) 'prov/gni/test/wait.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/wait.c'; fi`
 
+prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.o: prov/gni/test/rdm_dgram_stx.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.o `test -f 'prov/gni/test/rdm_dgram_stx.c' || echo '$(srcdir)/'`prov/gni/test/rdm_dgram_stx.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/rdm_dgram_stx.c' object='prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.o `test -f 'prov/gni/test/rdm_dgram_stx.c' || echo '$(srcdir)/'`prov/gni/test/rdm_dgram_stx.c
+
+prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.obj: prov/gni/test/rdm_dgram_stx.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.obj -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.obj `if test -f 'prov/gni/test/rdm_dgram_stx.c'; then $(CYGPATH_W) 'prov/gni/test/rdm_dgram_stx.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/rdm_dgram_stx [...]
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-rdm_dgram_stx.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/rdm_dgram_stx.c' object='prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-rdm_dgram_stx.obj `if test -f 'prov/gni/test/rdm_dgram_stx.c'; then $(CYGPATH_W) 'prov/gni/test/rdm_dgram_stx.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/rdm_dgram_stx.c'; fi`
+
+prov/gni/test/prov_gni_test_gnitest-cm.o: prov/gni/test/cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-cm.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-cm.o `test -f 'prov/gni/test/cm.c' || echo '$(srcdir)/'`prov/gni/test/cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/cm.c' object='prov/gni/test/prov_gni_test_gnitest-cm.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-cm.o `test -f 'prov/gni/test/cm.c' || echo '$(srcdir)/'`prov/gni/test/cm.c
+
+prov/gni/test/prov_gni_test_gnitest-cm.obj: prov/gni/test/cm.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-cm.obj -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-cm.obj `if test -f 'prov/gni/test/cm.c'; then $(CYGPATH_W) 'prov/gni/test/cm.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/cm.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-cm.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/gni/test/cm.c' object='prov/gni/test/prov_gni_test_gnitest-cm.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-cm.obj `if test -f 'prov/gni/test/cm.c'; then $(CYGPATH_W) 'prov/gni/test/cm.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/cm.c'; fi`
+
 prov/gni/test/prov_gni_test_gnitest-common.o: prov/gni/test/common.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/gni/test/prov_gni_test_gnitest-common.o -MD -MP -MF prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-common.Tpo -c -o prov/gni/test/prov_gni_test_gnitest-common.o `test -f 'prov/gni/test/common.c' || echo '$(srcdir)/'`prov/gni/test/common.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-common.Tpo prov/gni/test/$(DEPDIR)/prov_gni_test_gnitest-common.Po
@@ -8835,14 +10573,58 @@ prov/gni/test/prov_gni_test_gnitest-common.obj: prov/gni/test/common.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(prov_gni_test_gnitest_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/gni/test/prov_gni_test_gnitest-common.obj `if test -f 'prov/gni/test/common.c'; then $(CYGPATH_W) 'prov/gni/test/common.c'; else $(CYGPATH_W) '$(srcdir)/prov/gni/test/common.c'; fi`
 
+prov/bgq/src/test/spi_pingpong-spi_pingpong.o: prov/bgq/src/test/spi_pingpong.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/test/spi_pingpong-spi_pingpong.o -MD -MP -MF prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Tpo -c -o prov/bgq/src/test/spi_pingpong-spi_pingpong.o `test -f 'prov/bgq/src/test/spi_pingpong.c' || echo '$(srcdir)/'`prov/bgq/src/test/spi_pingpong.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Tpo prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/test/spi_pingpong.c' object='prov/bgq/src/test/spi_pingpong-spi_pingpong.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/test/spi_pingpong-spi_pingpong.o `test -f 'prov/bgq/src/test/spi_pingpong.c' || echo '$(srcdir)/'`prov/bgq/src/test/spi_pingpong.c
+
+prov/bgq/src/test/spi_pingpong-spi_pingpong.obj: prov/bgq/src/test/spi_pingpong.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/test/spi_pingpong-spi_pingpong.obj -MD -MP -MF prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Tpo -c -o prov/bgq/src/test/spi_pingpong-spi_pingpong.obj `if test -f 'prov/bgq/src/test/spi_pingpong.c'; then $(CYGPATH_W) 'prov/bgq/src/test/spi_pingpong.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/test/spi_pingpong.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Tpo prov/bgq/src/test/$(DEPDIR)/spi_pingpong-spi_pingpong.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/test/spi_pingpong.c' object='prov/bgq/src/test/spi_pingpong-spi_pingpong.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/test/spi_pingpong-spi_pingpong.obj `if test -f 'prov/bgq/src/test/spi_pingpong.c'; then $(CYGPATH_W) 'prov/bgq/src/test/spi_pingpong.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/test/spi_pingpong.c'; fi`
+
+prov/bgq/src/spi_pingpong-fi_bgq_spi.o: prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/spi_pingpong-fi_bgq_spi.o -MD -MP -MF prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Tpo -c -o prov/bgq/src/spi_pingpong-fi_bgq_spi.o `test -f 'prov/bgq/src/fi_bgq_spi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Tpo prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_spi.c' object='prov/bgq/src/spi_pingpong-fi_bgq_spi.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/spi_pingpong-fi_bgq_spi.o `test -f 'prov/bgq/src/fi_bgq_spi.c' || echo '$(srcdir)/'`prov/bgq/src/fi_bgq_spi.c
+
+prov/bgq/src/spi_pingpong-fi_bgq_spi.obj: prov/bgq/src/fi_bgq_spi.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/src/spi_pingpong-fi_bgq_spi.obj -MD -MP -MF prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Tpo -c -o prov/bgq/src/spi_pingpong-fi_bgq_spi.obj `if test -f 'prov/bgq/src/fi_bgq_spi.c'; then $(CYGPATH_W) 'prov/bgq/src/fi_bgq_spi.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/fi_bgq_spi.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Tpo prov/bgq/src/$(DEPDIR)/spi_pingpong-fi_bgq_spi.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/src/fi_bgq_spi.c' object='prov/bgq/src/spi_pingpong-fi_bgq_spi.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/src/spi_pingpong-fi_bgq_spi.obj `if test -f 'prov/bgq/src/fi_bgq_spi.c'; then $(CYGPATH_W) 'prov/bgq/src/fi_bgq_spi.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/src/fi_bgq_spi.c'; fi`
+
+prov/bgq/external/spi_pingpong-memory_impl.o: prov/bgq/external/memory_impl.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/external/spi_pingpong-memory_impl.o -MD -MP -MF prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Tpo -c -o prov/bgq/external/spi_pingpong-memory_impl.o `test -f 'prov/bgq/external/memory_impl.c' || echo '$(srcdir)/'`prov/bgq/external/memory_impl.c
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Tpo prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/external/memory_impl.c' object='prov/bgq/external/spi_pingpong-memory_impl.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/external/spi_pingpong-memory_impl.o `test -f 'prov/bgq/external/memory_impl.c' || echo '$(srcdir)/'`prov/bgq/external/memory_impl.c
+
+prov/bgq/external/spi_pingpong-memory_impl.obj: prov/bgq/external/memory_impl.c
+ at am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT prov/bgq/external/spi_pingpong-memory_impl.obj -MD -MP -MF prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Tpo -c -o prov/bgq/external/spi_pingpong-memory_impl.obj `if test -f 'prov/bgq/external/memory_impl.c'; then $(CYGPATH_W) 'prov/bgq/external/memory_impl.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/external/memory_impl.c'; fi`
+ at am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Tpo prov/bgq/external/$(DEPDIR)/spi_pingpong-memory_impl.Po
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='prov/bgq/external/memory_impl.c' object='prov/bgq/external/spi_pingpong-memory_impl.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@	$(AM_V_CC at am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(spi_pingpong_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o prov/bgq/external/spi_pingpong-memory_impl.obj `if test -f 'prov/bgq/external/memory_impl.c'; then $(CYGPATH_W) 'prov/bgq/external/memory_impl.c'; else $(CYGPATH_W) '$(srcdir)/prov/bgq/external/memory_impl.c'; fi`
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
 clean-libtool:
 	-rm -rf .libs _libs
+	-rm -rf prov/bgq/external/.libs prov/bgq/external/_libs
+	-rm -rf prov/bgq/src/.libs prov/bgq/src/_libs
 	-rm -rf prov/gni/src/.libs prov/gni/src/_libs
 	-rm -rf prov/gni/test/.libs prov/gni/test/_libs
-	-rm -rf prov/mxm/src/.libs prov/mxm/src/_libs
+	-rm -rf prov/mlx/src/.libs prov/mlx/src/_libs
 	-rm -rf prov/psm/src/.libs prov/psm/src/_libs
 	-rm -rf prov/psm2/src/.libs prov/psm2/src/_libs
 	-rm -rf prov/rxd/src/.libs prov/rxd/src/_libs
@@ -8855,7 +10637,6 @@ clean-libtool:
 	-rm -rf prov/verbs/src/.libs prov/verbs/src/_libs
 	-rm -rf prov/verbs/src/ep_rdm/.libs prov/verbs/src/ep_rdm/_libs
 	-rm -rf src/.libs src/_libs
-	-rm -rf src/osx/.libs src/osx/_libs
 	-rm -rf src/unix/.libs src/unix/_libs
 	-rm -rf util/.libs util/_libs
 
@@ -9011,6 +10792,27 @@ uninstall-pkgconfigDATA:
 	@list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir)
+install-nodist_rdma_bgqincludeHEADERS: $(nodist_rdma_bgqinclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(nodist_rdma_bgqinclude_HEADERS)'; test -n "$(rdma_bgqincludedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(rdma_bgqincludedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(rdma_bgqincludedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(rdma_bgqincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(rdma_bgqincludedir)" || exit $$?; \
+	done
+
+uninstall-nodist_rdma_bgqincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nodist_rdma_bgqinclude_HEADERS)'; test -n "$(rdma_bgqincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(rdma_bgqincludedir)'; $(am__uninstall_files_from_dir)
 install-nodist_rdmaincludeHEADERS: $(nodist_rdmainclude_HEADERS)
 	@$(NORMAL_INSTALL)
 	@list='$(nodist_rdmainclude_HEADERS)'; test -n "$(rdmaincludedir)" || list=; \
@@ -9032,6 +10834,27 @@ uninstall-nodist_rdmaincludeHEADERS:
 	@list='$(nodist_rdmainclude_HEADERS)'; test -n "$(rdmaincludedir)" || list=; \
 	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
 	dir='$(DESTDIR)$(rdmaincludedir)'; $(am__uninstall_files_from_dir)
+install-rdma_bgqincludeHEADERS: $(rdma_bgqinclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(rdma_bgqinclude_HEADERS)'; test -n "$(rdma_bgqincludedir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(rdma_bgqincludedir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(rdma_bgqincludedir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(rdma_bgqincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(rdma_bgqincludedir)" || exit $$?; \
+	done
+
+uninstall-rdma_bgqincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(rdma_bgqinclude_HEADERS)'; test -n "$(rdma_bgqincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(rdma_bgqincludedir)'; $(am__uninstall_files_from_dir)
 install-rdmaincludeHEADERS: $(rdmainclude_HEADERS)
 	@$(NORMAL_INSTALL)
 	@list='$(rdmainclude_HEADERS)'; test -n "$(rdmaincludedir)" || list=; \
@@ -9143,7 +10966,7 @@ $(TEST_SUITE_LOG): $(TEST_LOGS)
 	if test -n "$$am__remaking_logs"; then \
 	  echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \
 	       "recursion detected" >&2; \
-	else \
+	elif test -n "$$redo_logs"; then \
 	  am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \
 	fi; \
 	if $(am__make_dryrun); then :; else \
@@ -9334,10 +11157,16 @@ dist-xz: distdir
 	$(am__post_remove_distdir)
 
 dist-tarZ: distdir
+	@echo WARNING: "Support for distribution archives compressed with" \
+		       "legacy program 'compress' is deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
 	$(am__post_remove_distdir)
 
 dist-shar: distdir
+	@echo WARNING: "Support for shar distribution archives is" \
+	               "deprecated." >&2
+	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
 	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
 	$(am__post_remove_distdir)
 
@@ -9372,16 +11201,17 @@ distcheck: dist
 	esac
 	chmod -R a-w $(distdir)
 	chmod u+w $(distdir)
-	mkdir $(distdir)/_build $(distdir)/_inst
+	mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst
 	chmod a-w $(distdir)
 	test -d $(distdir)/_build || exit 0; \
 	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
 	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
 	  && am__cwd=`pwd` \
-	  && $(am__cd) $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	  && $(am__cd) $(distdir)/_build/sub \
+	  && ../../configure \
 	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
 	    $(DISTCHECK_CONFIGURE_FLAGS) \
+	    --srcdir=../.. --prefix="$$dc_install_base" \
 	  && $(MAKE) $(AM_MAKEFLAGS) \
 	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
 	  && $(MAKE) $(AM_MAKEFLAGS) check \
@@ -9442,7 +11272,7 @@ all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(MANS) $(DATA) \
 install-binPROGRAMS: install-libLTLIBRARIES
 
 installdirs:
-	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(rdmaincludedir)" "$(DESTDIR)$(rdmaincludedir)"; do \
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(testdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(man3dir)" "$(DESTDIR)$(man7dir)" "$(DESTDIR)$(pkgconfigdir)" "$(DESTDIR)$(rdma_bgqincludedir)" "$(DESTDIR)$(rdmaincludedir)" "$(DESTDIR)$(rdma_bgqincludedir)" "$(DESTDIR)$(rdmaincludedir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
@@ -9474,12 +11304,18 @@ clean-generic:
 distclean-generic:
 	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
 	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f prov/bgq/external/$(DEPDIR)/$(am__dirstamp)
+	-rm -f prov/bgq/external/$(am__dirstamp)
+	-rm -f prov/bgq/src/$(DEPDIR)/$(am__dirstamp)
+	-rm -f prov/bgq/src/$(am__dirstamp)
+	-rm -f prov/bgq/src/test/$(DEPDIR)/$(am__dirstamp)
+	-rm -f prov/bgq/src/test/$(am__dirstamp)
 	-rm -f prov/gni/src/$(DEPDIR)/$(am__dirstamp)
 	-rm -f prov/gni/src/$(am__dirstamp)
 	-rm -f prov/gni/test/$(DEPDIR)/$(am__dirstamp)
 	-rm -f prov/gni/test/$(am__dirstamp)
-	-rm -f prov/mxm/src/$(DEPDIR)/$(am__dirstamp)
-	-rm -f prov/mxm/src/$(am__dirstamp)
+	-rm -f prov/mlx/src/$(DEPDIR)/$(am__dirstamp)
+	-rm -f prov/mlx/src/$(am__dirstamp)
 	-rm -f prov/psm/src/$(DEPDIR)/$(am__dirstamp)
 	-rm -f prov/psm/src/$(am__dirstamp)
 	-rm -f prov/psm2/src/$(DEPDIR)/$(am__dirstamp)
@@ -9504,8 +11340,6 @@ distclean-generic:
 	-rm -f prov/verbs/src/ep_rdm/$(am__dirstamp)
 	-rm -f src/$(DEPDIR)/$(am__dirstamp)
 	-rm -f src/$(am__dirstamp)
-	-rm -f src/osx/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/osx/$(am__dirstamp)
 	-rm -f src/unix/$(DEPDIR)/$(am__dirstamp)
 	-rm -f src/unix/$(am__dirstamp)
 	-rm -f util/$(DEPDIR)/$(am__dirstamp)
@@ -9518,11 +11352,11 @@ clean: clean-am
 
 clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
 	clean-libtool clean-noinstLTLIBRARIES clean-pkglibLTLIBRARIES \
-	mostlyclean-am
+	clean-sbinPROGRAMS clean-testPROGRAMS mostlyclean-am
 
 distclean: distclean-am
 	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf prov/gni/src/$(DEPDIR) prov/gni/test/$(DEPDIR) prov/mxm/src/$(DEPDIR) prov/psm/src/$(DEPDIR) prov/psm2/src/$(DEPDIR) prov/rxd/src/$(DEPDIR) prov/rxm/src/$(DEPDIR) prov/sockets/src/$(DEPDIR) prov/udp/src/$(DEPDIR) prov/usnic/src/$(DEPDIR) prov/usnic/src/usnic_direct/$(DEPDIR) prov/util/src/$(DEPDIR) prov/verbs/src/$(DEPDIR) prov/verbs/src/ep_rdm/$(DEPDIR) src/$(DEPDIR) src/osx/$(DEPDIR) src/unix/$(DEPDIR) util/$(DEPDIR)
+	-rm -rf prov/bgq/external/$(DEPDIR) prov/bgq/src/$(DEPDIR) prov/bgq/src/test/$(DEPDIR) prov/gni/src/$(DEPDIR) prov/gni/test/$(DEPDIR) prov/mlx/src/$(DEPDIR) prov/psm/src/$(DEPDIR) prov/psm2/src/$(DEPDIR) prov/rxd/src/$(DEPDIR) prov/rxm/src/$(DEPDIR) prov/sockets/src/$(DEPDIR) prov/udp/src/$(DEPDIR) prov/usnic/src/$(DEPDIR) prov/usnic/src/usnic_direct/$(DEPDIR) prov/util/src/$(DEPDIR) prov/verbs/src/$(DEPDIR) prov/verbs/src/ep_rdm/$(DEPDIR) src/$(DEPDIR) src/unix/$(DEPDIR) util/$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
 	distclean-hdr distclean-libtool distclean-tags
@@ -9539,15 +11373,18 @@ info: info-am
 
 info-am:
 
-install-data-am: install-man install-nodist_rdmaincludeHEADERS \
-	install-pkgconfigDATA install-rdmaincludeHEADERS
+install-data-am: install-man install-nodist_rdma_bgqincludeHEADERS \
+	install-nodist_rdmaincludeHEADERS install-pkgconfigDATA \
+	install-rdma_bgqincludeHEADERS install-rdmaincludeHEADERS \
+	install-testPROGRAMS
 
 install-dvi: install-dvi-am
 
 install-dvi-am:
 
 install-exec-am: install-binPROGRAMS install-binSCRIPTS \
-	install-libLTLIBRARIES install-pkglibLTLIBRARIES
+	install-libLTLIBRARIES install-pkglibLTLIBRARIES \
+	install-sbinPROGRAMS
 
 install-html: install-html-am
 
@@ -9572,7 +11409,7 @@ installcheck-am:
 maintainer-clean: maintainer-clean-am
 	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
 	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf prov/gni/src/$(DEPDIR) prov/gni/test/$(DEPDIR) prov/mxm/src/$(DEPDIR) prov/psm/src/$(DEPDIR) prov/psm2/src/$(DEPDIR) prov/rxd/src/$(DEPDIR) prov/rxm/src/$(DEPDIR) prov/sockets/src/$(DEPDIR) prov/udp/src/$(DEPDIR) prov/usnic/src/$(DEPDIR) prov/usnic/src/usnic_direct/$(DEPDIR) prov/util/src/$(DEPDIR) prov/verbs/src/$(DEPDIR) prov/verbs/src/ep_rdm/$(DEPDIR) src/$(DEPDIR) src/osx/$(DEPDIR) src/unix/$(DEPDIR) util/$(DEPDIR)
+	-rm -rf prov/bgq/external/$(DEPDIR) prov/bgq/src/$(DEPDIR) prov/bgq/src/test/$(DEPDIR) prov/gni/src/$(DEPDIR) prov/gni/test/$(DEPDIR) prov/mlx/src/$(DEPDIR) prov/psm/src/$(DEPDIR) prov/psm2/src/$(DEPDIR) prov/rxd/src/$(DEPDIR) prov/rxm/src/$(DEPDIR) prov/sockets/src/$(DEPDIR) prov/udp/src/$(DEPDIR) prov/usnic/src/$(DEPDIR) prov/usnic/src/usnic_direct/$(DEPDIR) prov/util/src/$(DEPDIR) prov/verbs/src/$(DEPDIR) prov/verbs/src/ep_rdm/$(DEPDIR) src/$(DEPDIR) src/unix/$(DEPDIR) util/$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
 
@@ -9591,8 +11428,11 @@ ps-am:
 
 uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
 	uninstall-libLTLIBRARIES uninstall-man \
+	uninstall-nodist_rdma_bgqincludeHEADERS \
 	uninstall-nodist_rdmaincludeHEADERS uninstall-pkgconfigDATA \
-	uninstall-pkglibLTLIBRARIES uninstall-rdmaincludeHEADERS
+	uninstall-pkglibLTLIBRARIES uninstall-rdma_bgqincludeHEADERS \
+	uninstall-rdmaincludeHEADERS uninstall-sbinPROGRAMS \
+	uninstall-testPROGRAMS
 
 uninstall-man: uninstall-man1 uninstall-man3 uninstall-man7
 
@@ -9601,35 +11441,43 @@ uninstall-man: uninstall-man1 uninstall-man3 uninstall-man7
 .PHONY: CTAGS GTAGS TAGS all all-am am--refresh check check-TESTS \
 	check-am clean clean-binPROGRAMS clean-cscope clean-generic \
 	clean-libLTLIBRARIES clean-libtool clean-noinstLTLIBRARIES \
-	clean-pkglibLTLIBRARIES cscope cscopelist-am ctags ctags-am \
-	dist dist-all dist-bzip2 dist-gzip dist-hook dist-lzip \
-	dist-shar dist-tarZ dist-xz dist-zip distcheck distclean \
-	distclean-compile distclean-generic distclean-hdr \
-	distclean-libtool distclean-tags distcleancheck distdir \
-	distuninstallcheck dvi dvi-am html html-am info info-am \
-	install install-am install-binPROGRAMS install-binSCRIPTS \
-	install-data install-data-am install-dvi install-dvi-am \
-	install-exec install-exec-am install-html install-html-am \
-	install-info install-info-am install-libLTLIBRARIES \
-	install-man install-man1 install-man3 install-man7 \
+	clean-pkglibLTLIBRARIES clean-sbinPROGRAMS clean-testPROGRAMS \
+	cscope cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \
+	dist-gzip dist-hook dist-lzip dist-shar dist-tarZ dist-xz \
+	dist-zip distcheck distclean distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-binPROGRAMS install-binSCRIPTS install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-libLTLIBRARIES install-man \
+	install-man1 install-man3 install-man7 \
+	install-nodist_rdma_bgqincludeHEADERS \
 	install-nodist_rdmaincludeHEADERS install-pdf install-pdf-am \
 	install-pkgconfigDATA install-pkglibLTLIBRARIES install-ps \
-	install-ps-am install-rdmaincludeHEADERS install-strip \
-	installcheck installcheck-am installdirs maintainer-clean \
-	maintainer-clean-generic mostlyclean mostlyclean-compile \
-	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
-	recheck tags tags-am uninstall uninstall-am \
-	uninstall-binPROGRAMS uninstall-binSCRIPTS \
+	install-ps-am install-rdma_bgqincludeHEADERS \
+	install-rdmaincludeHEADERS install-sbinPROGRAMS install-strip \
+	install-testPROGRAMS installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am recheck tags tags-am uninstall \
+	uninstall-am uninstall-binPROGRAMS uninstall-binSCRIPTS \
 	uninstall-libLTLIBRARIES uninstall-man uninstall-man1 \
 	uninstall-man3 uninstall-man7 \
+	uninstall-nodist_rdma_bgqincludeHEADERS \
 	uninstall-nodist_rdmaincludeHEADERS uninstall-pkgconfigDATA \
-	uninstall-pkglibLTLIBRARIES uninstall-rdmaincludeHEADERS
+	uninstall-pkglibLTLIBRARIES uninstall-rdma_bgqincludeHEADERS \
+	uninstall-rdmaincludeHEADERS uninstall-sbinPROGRAMS \
+	uninstall-testPROGRAMS
+
+.PRECIOUS: Makefile
 
 
 nroff:
 	@for file in $(real_man_pages) $(prov_install_man_pages); do \
 	    source=`echo $$file | sed -e 's@/man[0-9]@@'`; \
-	    config/md2nroff.pl --source=$$source.md; \
+	    $(top_srcdir)/config/md2nroff.pl --source=$(top_srcdir)/$$source.md; \
 	done
 
 dist-hook: libfabric.spec
@@ -9646,6 +11494,21 @@ rpm: dist
 
 #prov_dist_man_pages += man/man7/fi_rxd.7
 
+ at HAVE_BGQ_TRUE@prov/bgq/external/memory_impl.c: @bgq_external_source@/spi/src/kernel/cnk/memory_impl.c
+ at HAVE_BGQ_TRUE@	@${MKDIR_P} $(@D)
+ at HAVE_BGQ_TRUE@	@cp $< $@
+
+#bin_PROGRAMS += test_cq_agent_init
+#test_cq_agent_init_SOURCES = prov/bgq/src/test/cq_agent_init.c \
+#		prov/bgq/src/l2atomic.c \
+#		prov/bgq/src/cq_agent_client.c \
+#		prov/bgq/src/agent/cq_agent.c \
+#		prov/bgq/src/fi_bgq_memfifo.c
+#test_cq_agent_init_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_cq_agent_init_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+#test_cq_agent_init_LDADD = $(bgq_LIBS)
+
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/NEWS.md b/NEWS.md
index 5f1ee8c..c271989 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -5,6 +5,276 @@ This file contains the main features as well as overviews of specific
 bug fixes (and other actions) for each version of Libfabric since
 version 1.0.
 
+v1.5.2, Wed Nov 8, 2017
+=======================
+
+## Core
+
+- Fix Power PC 32-bit build
+
+## RXM
+
+-- Remove dependency on shared receive contexts
+-- Switch to automatic data progress
+-- Fix removing addresses from AV
+
+## Sockets
+
+-- Fix incorrect reporting of counter attributes
+
+## Verbs
+
+-- Fix reporting attributes based on device limits
+-- Fix incorrect CQ size reported for iWarp NICs
+-- Update man page with known issues for specific NICs
+-- Fix FI_RX_CQ_DATA mode check
+-- Disable on-demand paging by default (can cause data corruption)
+-- Disable loopback (localhost) addressing (causing failures in MPI)
+
+v1.5.1, Wed Oct 4, 2017
+=======================
+
+## Core
+
+- Fix initialization used by DL providers to avoid crash
+- Add checks for null hints and improperly terminated strings
+- Check for invalid core names passed to fabric open
+- Provide consistent provider ordering when using DL providers
+- Fix OFI_LIKELY definitions when GNUC is not present
+
+## GNI
+
+- Add ability to detect local PE rank
+- Fix compiler/config problems
+- Fix CQ read error corruption
+- Remove tests of deprecated interfaces
+
+## PSM
+
+- Fix CQ corruption reporting errors
+- Always generate a completion on error
+
+## PSM2
+
+- Fix CQ corruption reporting errors
+- Always generate a completion on error
+- Add checks to handle out of memory errors
+- Add NULL check for iov in atomic readv/writev calls
+- Fix FI_PEEK src address matching
+- Fix bug in scalable endpoint address resolution
+- Fix segfault bug in RMA completion generation
+
+## Sockets
+
+- Fix missing FI_CLAIM src address data on completion
+- Fix CQ corruption reporting errors
+- Fix serialization issue wrt out of order CPU writes to Tx ring buffer
+
+## Verbs
+
+- Allow modifying rnr retry timout to improve performance
+- Add checks to handle out of memory errors
+- Fix crash using atomic operations for MSG EPs
+
+
+v1.5.0, Wed Aug 9, 2017
+============================
+
+The 1.5 release includes updates to the libfabric API and ABI.  As a
+result, the ABI bumps from 1.0 to 1.1.  All changes are backwards
+compatible with previous versions of the interface.  The following
+features were added to the libfabric API.  (Note that individual
+providers may not support all new features).  For full details
+see the man pages.
+
+- Authorization keys
+  Authorization keys, commonly referred to as job keys, are used to
+  isolate processes from communicating with other processes for security
+  purposes.
+- Multicast support
+  Datagram endpoints can now support multicast communication.
+- (Experimental) socket-like endpoint types
+  New FI_SOCK_STREAM and FI_SOCK_DGRAM endpoint types are introduced.
+  These endpoint types target support of cloud and enterprise based
+  middleware and applications.
+- Tagged atomic support
+  Atomic operations can now target tagged receive buffers, in
+  addition to RMA buffers.
+- (Experimental) deferred work queues
+  Deferred work queues are enhanced triggerred operations.  They
+  target support for collective-based operations.
+- New mode bits: FI_RESTRICTED_COMP and FI_NOTIFY_FLAGS_ONLY
+  These mode bits support optimized completion processing to
+  minimize software overhead.
+- Multi-threaded error reporting
+  Reading CQ and EQ errors now allow the application to provide the
+  error buffer, eliminating the need for the application to synchronize
+  between multiple threads when handling errors.
+- FI_SOURCE_ERR capability
+  This feature allows the provider to validate and report the source
+  address for any received messages.
+- FI_ADDR_STR string based addressing
+  Applications can now request and use addresses provided using a
+  standardized string format.  This makes it easier to pass full
+  addressing data through a command line, or handle address exchange
+  through text files.
+- Communication scope capabilities: FI_LOCAL_COMM and FI_REMOTE_COMM
+  Used to indicate if an application requires communication with
+  peers on the same node and/or remote nodes.
+- New memory registration modes
+  The FI_BASIC_MR and FI_SCALABLE_MR memory registration modes have
+  been replaced by more refined registration mode bits.  This allows
+  applications to make better use of provider hardware capabilities
+  when dealing with registered memory regions.
+- New mode bit: FI_CONTEXT2
+  Some providers need more than the size provided by the FI_CONTEXT
+  mode bit setting.  To accomodate such providers, an FI_CONTEXT2
+  mode bit was added.  This mode bit doubles the amount of context
+  space that an application allocates on behalf of the provider.
+
+## BGQ provider notes
+
+- The OFI 1.5 BGQ provider officially supports the Open Fabrics Interfaces
+  utilized by the MPICH implementation of the MPI-3 standard.  In addition
+  to the MPICH test suite it has been tested by several scientific applications
+  running MPICH on BGQ at scale, and several bugs in the provider and MPICH
+  have been identified and fixed.  At least one INCITE project is attempting
+  to use it for production science.  Support of this provider is a high-
+  priority for ALCF, and MPICH users on BGQ are encouraged to utilize it to
+  compare function and performance against the PAMI-based default toolchain.
+  Any discovered bugs will be quickly addressed with high priority.  Results
+  so far have shown significant point-to-point and RMA latency improvements
+  over PAMI as well as RMA functional improvements at scale.  The only
+  potential drawback is collective performance degradation against the PAMI
+  optimizations, but at certain message and partition sizes, performance has
+  been observed to be comparable or even better.
+
+## MLX provider notes
+
+- New provider to replace the deprecated mxm provider.
+- Targets Mellanox InfiniBand fabrics, through the UCX library.
+- Supports RDM endpoints with the tagged interfaces.
+- Requires FI_CONTEXT mode support.
+- See fi_mlx.7 man page for more details.
+
+## NetDir provider nodes
+
+- New provider for Windows that runs over the NetworkDirect API.
+- Supports FI_EP_MSG endpoints, with FI_MSG and FI_RMA interfaces.
+
+## PSM provider notes
+
+- Improve the name server functionality and move to the utility code
+- Handle updated mr_mode definitions
+- Add support of 32 and 64 bit atomic values
+
+## PSM2 provider notes
+
+- Add option to adjust the locking level
+- Improve the name server functionality and move to the utility code
+- Add support for string address format
+- Add an environment vaiable for message inject size
+- Handle FI_DISCARD in tagged receive functions
+- Handle updated mr_mode definitions
+- Add support for scalable endpoint
+- Add support of 32 and 64 bit atomic values
+- Add FI_SOURCE_ERR to the supported caps
+- Improve the method of checking device existence
+
+## Sockets provider notes
+
+- Updated and enhanced atomic operation support.
+- Add support for experimental deferred work queue operations.
+- Fixed counter signaling when used with wait sets.
+- Improved support on Windows.
+- Cleaned up event reporting for destroyed endpoints.
+- Fixed several possible crash scenarios.
+- Fixed handling socket disconnect events which could hang the provider.
+
+## RxM provider notes
+
+- Add OFI RxM provider. It is an utility provider that supports RDM
+  endpoints emulated over a base provider that supports only MSG end-
+  points.
+- The provider was earlier experimental. It's functional from this
+  release onwards.
+- Please refer to the man page of the provider for more info.
+
+## UDP provider notes
+
+- Add support for multicast data transfers
+
+## usNIC provider notes
+
+- Only requires libibverbs when necessary
+- Updated to handle 1.5 interface changes.
+
+## Verbs provider notes
+
+- Fix an issue where if the user requests higher values for tx, rx
+  context sizes than default it wasn't honored.
+- Introduce env variables for setting default tx, rx context sizes
+  and iov limits.
+- Report correct completion ordering supported by MSG endpoints.
+
+
+v1.4.2, Fri May 12, 2017
+========================
+
+## Core
+
+- Fix for OS X clock_gettime() portability issue.
+
+## PSM provider notes
+
+- Updated default counter wait object for improved performance
+- Fix multi-threaded RMA progress stalls
+
+## PSM2 provider notes
+
+- Updated default counter wait object for improved performance
+- Fix multi-threaded RMA progress stalls
+
+## Sockets provider notes
+
+- Fix error in fi_cq_sreadfrom aborting before timeout expires
+- Set atomic iov count correct correctly inside fi_atomicv
+
+## Verbs provider notes
+
+- Fix handling of apps that call fork.  Move ibv_fork_init() before
+  calling any other verbs call.
+- Fix crash in fi_write when connection is not yet established and
+  write data size is below inline threshold.
+- Fix issues not handling multiple ipoib interfaces
+- Reduce lock contention on buffer pools in send/completion handling
+  code.
+- To see verbs provider in fi_info output, configure the corresponding
+  IPoIB interface with an IP address. This is a change in behavior from
+  previous versions. Please refer fi_verbs man page for more info.
+
+v1.4.1, Fri Feb  3, 2017
+========================
+
+## PSM provider notes
+
+- Defer initialization of the PSM library to allow runtime selection from
+  different versions of the same provider before fi_getinfo is called.
+
+## PSM2 provider notes
+
+- Defer initialization of the PSM2 library to allow runtime selection from
+  different versions of the same provider before fi_getinfo is called.
+- General bug fixes.
+
+## UDP provider notes
+
+- Fix setting address format in fi_getinfo call.
+
+## usNIC provider notes
+
+- Fixed compilation issues with newer versions of libibverbs.
+
 v1.4.0, Fri Oct 28, 2016
 ========================
 
diff --git a/README b/README
index 855e132..fa356f4 100644
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
-Version Libfabric v1.4.0
-Released on 2016-11-02
+Version Libfabric v1.5.2
+Released on 2017-11-08
 
 Introduction
 ============
diff --git a/aclocal.m4 b/aclocal.m4
index d73ec32..a751f96 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,6 +1,6 @@
-# generated automatically by aclocal 1.13.3 -*- Autoconf -*-
+# generated automatically by aclocal 1.15 -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -20,7 +20,7 @@ You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 
-# Copyright (C) 2002-2013 Free Software Foundation, Inc.
+# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -32,10 +32,10 @@ To do so, use the procedure documented by the package, typically 'autoreconf'.])
 # generated from the m4 files accompanying Automake X.Y.
 # (This private macro should not be called outside this file.)
 AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.13'
+[am__api_version='1.15'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.13.3], [],
+m4_if([$1], [1.15], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -51,12 +51,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 # This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.13.3])dnl
+[AM_AUTOMAKE_VERSION([1.15])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -76,7 +76,8 @@ AC_CHECK_TOOLS([AR], [ar lib "link -lib"], [false])
 : ${AR=ar}
 
 AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
-  [am_cv_ar_interface=ar
+  [AC_LANG_PUSH([C])
+   am_cv_ar_interface=ar
    AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],
      [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([am_ar_try])
@@ -93,7 +94,7 @@ AC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],
       fi
       rm -f conftest.lib libconftest.a
      ])
-   ])
+   AC_LANG_POP([C])])
 
 case $am_cv_ar_interface in
 ar)
@@ -117,7 +118,7 @@ AC_SUBST([AR])dnl
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -162,15 +163,14 @@ AC_SUBST([AR])dnl
 # configured tree to be moved without reconfiguration.
 
 AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 ])
 
 # AM_CONDITIONAL                                            -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -201,7 +201,7 @@ AC_CONFIG_COMMANDS_PRE(
 Usually this means the macro was only invoked conditionally.]])
 fi])])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -392,7 +392,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -468,7 +468,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 
 # Do all the work for Automake.                             -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -477,6 +477,12 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 # This macro actually does too much.  Some checks are only needed if
 # your package does certain things.  But this isn't really a big deal.
 
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
 # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
 # AM_INIT_AUTOMAKE([OPTIONS])
 # -----------------------------------------------
@@ -552,8 +558,8 @@ AC_REQUIRE([AC_PROG_MKDIR_P])dnl
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 AC_SUBST([mkdir_p], ['$(MKDIR_P)'])
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 AC_REQUIRE([AC_PROG_AWK])dnl
 AC_REQUIRE([AC_PROG_MAKE_SET])dnl
 AC_REQUIRE([AM_SET_LEADING_DOT])dnl
@@ -585,6 +591,51 @@ dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
 AC_CONFIG_COMMANDS_PRE(dnl
 [m4_provide_if([_AM_COMPILER_EXEEXT],
   [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+  fi
+fi
+dnl The trailing newline in this macro's definition is deliberate, for
+dnl backward compatibility and to allow trailing 'dnl'-style comments
+dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.
 ])
 
 dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
@@ -593,7 +644,6 @@ dnl mangled by Autoconf and run in a shell conditional statement.
 m4_define([_AC_COMPILER_EXEEXT],
 m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
 
-
 # When config.status generates a header, we must update the stamp-h file.
 # This file resides in the same directory as the config header
 # that is generated.  The stamp files are numbered to have different names.
@@ -615,7 +665,7 @@ for _am_header in $config_headers :; do
 done
 echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -626,7 +676,7 @@ echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_co
 # Define $install_sh.
 AC_DEFUN([AM_PROG_INSTALL_SH],
 [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -636,7 +686,7 @@ if test x"${install_sh}" != xset; then
 fi
 AC_SUBST([install_sh])])
 
-# Copyright (C) 2003-2013 Free Software Foundation, Inc.
+# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -657,7 +707,7 @@ AC_SUBST([am__leading_dot])])
 
 # Check to see how 'make' treats includes.	            -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -705,41 +755,9 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
-          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
 # Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 
-# Copyright (C) 1997-2013 Free Software Foundation, Inc.
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -778,7 +796,7 @@ fi
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -807,7 +825,54 @@ AC_DEFUN([_AM_SET_OPTIONS],
 AC_DEFUN([_AM_IF_OPTION],
 [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+  [whether $CC understands -c and -o together],
+  [am_cv_prog_cc_c_o],
+  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -826,7 +891,7 @@ AC_DEFUN([AM_RUN_LOG],
 
 # Check to make sure that the build environment is sane.    -*- Autoconf -*-
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -907,7 +972,7 @@ AC_CONFIG_COMMANDS_PRE(
 rm -f conftest.file
 ])
 
-# Copyright (C) 2009-2013 Free Software Foundation, Inc.
+# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -967,7 +1032,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 ])
 
-# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -995,7 +1060,7 @@ fi
 INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 AC_SUBST([INSTALL_STRIP_PROGRAM])])
 
-# Copyright (C) 2006-2013 Free Software Foundation, Inc.
+# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -1014,7 +1079,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 
 # Check how to create a tarball.                            -*- Autoconf -*-
 
-# Copyright (C) 2004-2013 Free Software Foundation, Inc.
+# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
diff --git a/config.h.in b/config.h.in
index 88bee37..17c1f0c 100644
--- a/config.h.in
+++ b/config.h.in
@@ -13,8 +13,17 @@
 /* Set to 1 to use c11 atomic functions */
 #undef HAVE_ATOMICS
 
-/* Define to 1 if clock_gettime is available. */
-#undef HAVE_CLOCK_GETTIME
+/* bgq provider is built */
+#undef HAVE_BGQ
+
+/* bgq provider is built as DSO */
+#undef HAVE_BGQ_DL
+
+/* Set to 1 to use built-in intrincics atomics */
+#undef HAVE_BUILTIN_ATOMICS
+
+/* Define to 1 if criterion requested and available */
+#undef HAVE_CRITERION
 
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
@@ -37,8 +46,8 @@
 /* gni provider is built as DSO */
 #undef HAVE_GNI_DL
 
-/* Define to 1 if you have the `host_get_clock_service' function. */
-#undef HAVE_HOST_GET_CLOCK_SERVICE
+/* Define to 1 if you have the <infiniband/verbs_exp.h> header file. */
+#undef HAVE_INFINIBAND_VERBS_EXP_H
 
 /* Define to 1 if you have the <infiniband/verbs.h> header file. */
 #undef HAVE_INFINIBAND_VERBS_H
@@ -46,6 +55,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if kdreg available */
+#undef HAVE_KDREG
+
 /* Define to 1 if you have the `dl' library (-ldl). */
 #undef HAVE_LIBDL
 
@@ -58,14 +70,11 @@
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
-/* mxm provider is built */
-#undef HAVE_MXM
-
-/* Define to 1 if you have the <mxm/api/mxm_api.h> header file. */
-#undef HAVE_MXM_API_MXM_API_H
+/* mlx provider is built */
+#undef HAVE_MLX
 
-/* mxm provider is built as DSO */
-#undef HAVE_MXM_DL
+/* mlx provider is built as DSO */
+#undef HAVE_MLX_DL
 
 /* Define to 1 if you have the <netlink/netlink.h> header file. */
 #undef HAVE_NETLINK_NETLINK_H
@@ -139,6 +148,9 @@
 /* Define to 1 if typeof works with your compiler. */
 #undef HAVE_TYPEOF
 
+/* Define to 1 if you have the <ucp/api/ucp.h> header file. */
+#undef HAVE_UCP_API_UCP_H
+
 /* udp provider is built */
 #undef HAVE_UDP
 
@@ -160,19 +172,18 @@
 /* verbs provider is built as DSO */
 #undef HAVE_VERBS_DL
 
+/* Experimental verbs features support */
+#undef HAVE_VERBS_EXP_H
+
 /* Define to 1 if xpmem available */
 #undef HAVE_XPMEM
 
 /* Define to 1 to enable valgrind annotations */
 #undef INCLUDE_VALGRIND
 
-/* Define to the sub-directory in which libtool stores uninstalled libraries.
-   */
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
 #undef LT_OBJDIR
 
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
 /* Name of package */
 #undef PACKAGE
 
@@ -200,6 +211,9 @@
 /* Define to 1 if you have the ANSI C header files. */
 #undef STDC_HEADERS
 
+/* Whether to build the fake usNIC verbs provider or not */
+#undef USNIC_BUILD_FAKE_VERBS_DRIVER
+
 /* Version number of package */
 #undef VERSION
 
diff --git a/config/ar-lib b/config/ar-lib
index fe2301e..463b9ec 100755
--- a/config/ar-lib
+++ b/config/ar-lib
@@ -4,7 +4,7 @@
 me=ar-lib
 scriptversion=2012-03-01.08; # UTC
 
-# Copyright (C) 2010-2013 Free Software Foundation, Inc.
+# Copyright (C) 2010-2014 Free Software Foundation, Inc.
 # Written by Peter Rosin <peda at lysator.liu.se>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/config/compile b/config/compile
index 531136b..a85b723 100755
--- a/config/compile
+++ b/config/compile
@@ -3,7 +3,7 @@
 
 scriptversion=2012-10-14.11; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 # Written by Tom Tromey <tromey at cygnus.com>.
 #
 # This program is free software; you can redistribute it and/or modify
diff --git a/config/config.guess b/config/config.guess
index 120cc0d..1659250 100755
--- a/config/config.guess
+++ b/config/config.guess
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-05-16'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@ timestamp='2013-05-16'
 # program.  This Exception is an additional permission under section 7
 # of the GNU General Public License, version 3 ("GPLv3").
 #
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
 # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
 #
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 
 
 me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
 	LIBC=gnu
 	#endif
 	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
 	;;
 esac
 
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
 	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+	    /sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || \
+	    echo unknown)`
 	case "${UNAME_MACHINE_ARCH}" in
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
+	    earmv*)
+		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		machine=${arch}${endian}-unknown
+		;;
 	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
 	# to ELF recently, or will in the future.
 	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
 		eval $set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		os=netbsd
 		;;
 	esac
+	# Determine ABI tags.
+	case "${UNAME_MACHINE_ARCH}" in
+	    earm*)
+		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		;;
+	esac
 	# The OS release
 	# Debian GNU/NetBSD machines have a different userland, and
 	# thus, need a distinct triplet. However, they do not need
@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
+	echo "${machine}-${os}${release}${abi}"
 	exit ;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -235,6 +249,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     *:MirBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
 	exit ;;
+    *:Sortix:*:*)
+	echo ${UNAME_MACHINE}-unknown-sortix
+	exit ;;
     alpha:OSF1:*:*)
 	case $UNAME_RELEASE in
 	*4.0)
@@ -579,8 +596,9 @@ EOF
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
+	if [ -x /usr/bin/lslpp ] ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
 		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
 	fi
@@ -826,7 +844,7 @@ EOF
     *:MINGW*:*)
 	echo ${UNAME_MACHINE}-pc-mingw32
 	exit ;;
-    i*:MSYS*:*)
+    *:MSYS*:*)
 	echo ${UNAME_MACHINE}-pc-msys
 	exit ;;
     i*:windows32*:*)
@@ -932,6 +950,9 @@ EOF
     crisv32:Linux:*:*)
 	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
 	exit ;;
+    e2k:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	exit ;;
     frv:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
@@ -969,10 +990,10 @@ EOF
 	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
 	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
 	;;
-    or1k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+    openrisc*:Linux:*:*)
+	echo or1k-unknown-linux-${LIBC}
 	exit ;;
-    or32:Linux:*:*)
+    or32:Linux:*:* | or1k*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
 	exit ;;
     padre:Linux:*:*)
@@ -995,6 +1016,12 @@ EOF
     ppc:Linux:*:*)
 	echo powerpc-unknown-linux-${LIBC}
 	exit ;;
+    ppc64le:Linux:*:*)
+	echo powerpc64le-unknown-linux-${LIBC}
+	exit ;;
+    ppcle:Linux:*:*)
+	echo powerpcle-unknown-linux-${LIBC}
+	exit ;;
     s390:Linux:*:* | s390x:Linux:*:*)
 	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
 	exit ;;
@@ -1014,7 +1041,7 @@ EOF
 	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
 	exit ;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
 	exit ;;
     xtensa*:Linux:*:*)
 	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1254,16 +1281,26 @@ EOF
 	if test "$UNAME_PROCESSOR" = unknown ; then
 	    UNAME_PROCESSOR=powerpc
 	fi
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		grep IS_64BIT_ARCH >/dev/null
-	    then
-		case $UNAME_PROCESSOR in
-		    i386) UNAME_PROCESSOR=x86_64 ;;
-		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		esac
+	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		    grep IS_64BIT_ARCH >/dev/null
+		then
+		    case $UNAME_PROCESSOR in
+			i386) UNAME_PROCESSOR=x86_64 ;;
+			powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		    esac
+		fi
 	    fi
+	elif test "$UNAME_PROCESSOR" = i386 ; then
+	    # Avoid executing cc on OS X 10.9, as it ships with a stub
+	    # that puts up a graphical alert prompting to install
+	    # developer tools.  Any system running Mac OS X 10.7 or
+	    # later (Darwin 11 and later) is required to have a 64-bit
+	    # processor. This is not true of the ARM version of Darwin
+	    # that Apple uses in portable devices.
+	    UNAME_PROCESSOR=x86_64
 	fi
 	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
 	exit ;;
@@ -1355,154 +1392,6 @@ EOF
 	exit ;;
 esac
 
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-	"4"
-#else
-	""
-#endif
-	); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
 cat >&2 <<EOF
 $0: unable to guess system type
 
diff --git a/config/config.sub b/config/config.sub
index 8b612ab..1acc966 100755
--- a/config/config.sub
+++ b/config/config.sub
@@ -1,8 +1,8 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2013 Free Software Foundation, Inc.
+#   Copyright 1992-2015 Free Software Foundation, Inc.
 
-timestamp='2013-04-24'
+timestamp='2015-08-20'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ timestamp='2013-04-24'
 # of the GNU General Public License, version 3 ("GPLv3").
 
 
-# Please send patches with a ChangeLog entry to config-patches at gnu.org.
+# Please send patches to <config-patches at gnu.org>.
 #
 # Configuration subroutine to validate and canonicalize a configuration type.
 # Supply the specified configuration type as an argument.
@@ -68,7 +68,7 @@ Report bugs and patches to <config-patches at gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,7 +117,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
   nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
   linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
   kopensolaris*-gnu* | \
   storm-chaos* | os2-emx* | rtmk-nova*)
     os=-$maybe_os
@@ -255,16 +255,18 @@ case $basic_machine in
 	| arc | arceb \
 	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
 	| avr | avr32 \
+	| ba \
 	| be32 | be64 \
 	| bfin \
-	| c4x | clipper \
+	| c4x | c8051 | clipper \
 	| d10v | d30v | dlx | dsp16xx \
-	| epiphany \
-	| fido | fr30 | frv \
+	| e2k | epiphany \
+	| fido | fr30 | frv | ft32 \
 	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 	| hexagon \
 	| i370 | i860 | i960 | ia64 \
 	| ip2k | iq2000 \
+	| k1om \
 	| le32 | le64 \
 	| lm32 \
 	| m32c | m32r | m32rle | m68000 | m68k | m88k \
@@ -282,8 +284,10 @@ case $basic_machine in
 	| mips64vr5900 | mips64vr5900el \
 	| mipsisa32 | mipsisa32el \
 	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa32r6 | mipsisa32r6el \
 	| mipsisa64 | mipsisa64el \
 	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64r6 | mipsisa64r6el \
 	| mipsisa64sb1 | mipsisa64sb1el \
 	| mipsisa64sr71k | mipsisa64sr71kel \
 	| mipsr5900 | mipsr5900el \
@@ -295,14 +299,14 @@ case $basic_machine in
 	| nds32 | nds32le | nds32be \
 	| nios | nios2 | nios2eb | nios2el \
 	| ns16k | ns32k \
-	| open8 \
-	| or1k | or32 \
+	| open8 | or1k | or1knd | or32 \
 	| pdp10 | pdp11 | pj | pjl \
 	| powerpc | powerpc64 | powerpc64le | powerpcle \
 	| pyramid \
+	| riscv32 | riscv64 \
 	| rl78 | rx \
 	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
 	| sh64 | sh64le \
 	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
 	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -310,6 +314,7 @@ case $basic_machine in
 	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
 	| ubicom32 \
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| visium \
 	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
@@ -324,7 +329,10 @@ case $basic_machine in
 	c6x)
 		basic_machine=tic6x-unknown
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+	leon|leon[3-9])
+		basic_machine=sparc-$basic_machine
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
 		basic_machine=$basic_machine-unknown
 		os=-none
 		;;
@@ -369,18 +377,20 @@ case $basic_machine in
 	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
 	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
 	| avr-* | avr32-* \
+	| ba-* \
 	| be32-* | be64-* \
 	| bfin-* | bs2000-* \
 	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| clipper-* | craynv-* | cydra-* \
+	| c8051-* | clipper-* | craynv-* | cydra-* \
 	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
+	| e2k-* | elxsi-* \
 	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
 	| h8300-* | h8500-* \
 	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
 	| hexagon-* \
 	| i*86-* | i860-* | i960-* | ia64-* \
 	| ip2k-* | iq2000-* \
+	| k1om-* \
 	| le32-* | le64-* \
 	| lm32-* \
 	| m32c-* | m32r-* | m32rle-* \
@@ -400,8 +410,10 @@ case $basic_machine in
 	| mips64vr5900-* | mips64vr5900el-* \
 	| mipsisa32-* | mipsisa32el-* \
 	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa32r6-* | mipsisa32r6el-* \
 	| mipsisa64-* | mipsisa64el-* \
 	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64r6-* | mipsisa64r6el-* \
 	| mipsisa64sb1-* | mipsisa64sb1el-* \
 	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
 	| mipsr5900-* | mipsr5900el-* \
@@ -413,16 +425,18 @@ case $basic_machine in
 	| nios-* | nios2-* | nios2eb-* | nios2el-* \
 	| none-* | np1-* | ns16k-* | ns32k-* \
 	| open8-* \
+	| or1k*-* \
 	| orion-* \
 	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
 	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
 	| pyramid-* \
+	| riscv32-* | riscv64-* \
 	| rl78-* | romp-* | rs6000-* | rx-* \
 	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
 	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
 	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
 	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
 	| tahoe-* \
 	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
 	| tile*-* \
@@ -430,6 +444,7 @@ case $basic_machine in
 	| ubicom32-* \
 	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
 	| vax-* \
+	| visium-* \
 	| we32k-* \
 	| x86-* | x86_64-* | xc16x-* | xps100-* \
 	| xstormy16-* | xtensa*-* \
@@ -506,6 +521,9 @@ case $basic_machine in
 		basic_machine=i386-pc
 		os=-aros
 		;;
+        asmjs)
+		basic_machine=asmjs-unknown
+		;;
 	aux)
 		basic_machine=m68k-apple
 		os=-aux
@@ -767,6 +785,9 @@ case $basic_machine in
 		basic_machine=m68k-isi
 		os=-sysv
 		;;
+	leon-*|leon[3-9]-*)
+		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+		;;
 	m68knommu)
 		basic_machine=m68k-unknown
 		os=-linux
@@ -794,7 +815,7 @@ case $basic_machine in
 		os=-mingw64
 		;;
 	mingw32)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-mingw32
 		;;
 	mingw32ce)
@@ -822,6 +843,10 @@ case $basic_machine in
 		basic_machine=powerpc-unknown
 		os=-morphos
 		;;
+	moxiebox)
+		basic_machine=moxie-unknown
+		os=-moxiebox
+		;;
 	msdos)
 		basic_machine=i386-pc
 		os=-msdos
@@ -830,7 +855,7 @@ case $basic_machine in
 		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
 		;;
 	msys)
-		basic_machine=i386-pc
+		basic_machine=i686-pc
 		os=-msys
 		;;
 	mvs)
@@ -1354,7 +1379,7 @@ case $os in
 	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
 	      | -sym* | -kopensolaris* | -plan9* \
 	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* \
+	      | -aos* | -aros* | -cloudabi* | -sortix* \
 	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
 	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
 	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
@@ -1367,14 +1392,14 @@ case $os in
 	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
 	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
 	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
 	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
 	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
 	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
 	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
 	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
 	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
 	-qnx*)
@@ -1546,6 +1571,9 @@ case $basic_machine in
 	c4x-* | tic4x-*)
 		os=-coff
 		;;
+	c8051-*)
+		os=-elf
+		;;
 	hexagon-*)
 		os=-elf
 		;;
@@ -1589,9 +1617,6 @@ case $basic_machine in
 	mips*-*)
 		os=-elf
 		;;
-	or1k-*)
-		os=-elf
-		;;
 	or32-*)
 		os=-coff
 		;;
diff --git a/config/depcomp b/config/depcomp
index 4ebd5b3..fc98710 100755
--- a/config/depcomp
+++ b/config/depcomp
@@ -3,7 +3,7 @@
 
 scriptversion=2013-05-30.07; # UTC
 
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
diff --git a/config/fi_provider.m4 b/config/fi_provider.m4
index ede4e0c..5822a0c 100644
--- a/config/fi_provider.m4
+++ b/config/fi_provider.m4
@@ -51,17 +51,24 @@ dnl
 dnl HAVE_$1_DL: same value as $1_dl
 dnl
 AC_DEFUN([FI_PROVIDER_SETUP],[
-	AC_MSG_NOTICE([*** Configuring $1 provider])
-	AC_ARG_ENABLE([$1],
-	      [AS_HELP_STRING([--enable-$1@<:@=yes|no|auto|dl|PATH@:>@],
-			      [Enable $1 provider @<:@default=auto@:>@
-				(yes: enable $1 provider; no: disable $1 provider;
-				auto: enable $1 provider if possible;
-				dl: enable $1 provider and build as a loadable library;
-				PATH: enable $1 provider and use $1 installed under PATH)])
-	      ],
-	      [],
-	      [enable_$1=auto])
+
+dnl
+dnl Check if --enable-direct is being used.  If yes, exclude all other providers
+dnl
+	AS_IF([test x"$enable_direct" != x"no" && test x"$enable_direct" != x"$1"],
+	      [enable_$1=no
+               AC_MSG_NOTICE([*** Skipping $1 provider because $enable_direct direct requested])],
+	      [AC_MSG_NOTICE([*** Configuring $1 provider])
+	       AC_ARG_ENABLE([$1],
+			     [AS_HELP_STRING([--enable-$1@<:@=yes|no|auto|dl|PATH@:>@],
+					[Enable $1 provider @<:@default=auto@:>@
+					(yes: enable $1 provider; no: disable $1 provider;
+					auto: enable $1 provider if possible;
+					dl: enable $1 provider and build as a loadable library;
+					PATH: enable $1 provider and use $1 installed under PATH)])
+			     ],
+			     [],
+			     [enable_$1=auto])])
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -98,6 +105,11 @@ AC_DEFUN([FI_PROVIDER_SETUP],[
 				 AC_MSG_WARN([but libfabric is being built as static-only])
 				 AC_MSG_ERROR([This is an impossible situation. Cannot continue.])])
 			 AC_MSG_NOTICE([$1 provider: build as plugin])
+
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 m4_ifnblank(m4_esyscmd(ls prov/$1/libfabric-$1.spec.in 2> /dev/null),
+			       [AC_CONFIG_FILES([prov/$1/libfabric-$1.spec])])
 			],
 			[PROVIDERS_STATIC="prov/$1/lib$1.la $PROVIDERS_STATIC"
 			 AC_MSG_NOTICE([$1 provider: include in libfabric])])
@@ -127,8 +139,15 @@ AC_DEFUN([FI_PROVIDER_SETUP],[
 		 AS_IF([test -f "$srcdir/prov/$1/include/rdma/fi_direct.h"],
 			[AC_MSG_RESULT(yes)],
 			[AC_MSG_RESULT(no)
-			  AC_MSG_ERROR([$1 provider was requested as direct, but is missing fi_direct.h])]
-			)])
+			 AC_MSG_CHECKING(for $srcdir/prov/$1/include/rdma/fi_direct.h.in)
+			 AS_IF([test -f "$srcdir/prov/$1/include/rdma/fi_direct.h.in"],
+				[AC_MSG_RESULT(yes)],
+				[AC_MSG_RESULT(no)
+				 AC_MSG_ERROR([$1 provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in])]
+			      )])])
+
+	AM_CONDITIONAL([FI_DIRECT_H_IN], [test -f "$srcdir/prov/$1/include/rdma/fi_direct.h.in"])
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$$1_orig_CPPFLAGS
diff --git a/config/install-sh b/config/install-sh
index 377bb86..59990a1 100755
--- a/config/install-sh
+++ b/config/install-sh
@@ -1,7 +1,7 @@
 #!/bin/sh
 # install - install a program, script, or datafile
 
-scriptversion=2011-11-20.07; # UTC
+scriptversion=2014-09-12.12; # UTC
 
 # This originates from X11R5 (mit/util/scripts/install.sh), which was
 # later released in X11R6 (xc/config/util/install.sh) with the
@@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC
 # This script is compatible with the BSD install script, but was written
 # from scratch.
 
+tab='	'
 nl='
 '
-IFS=" ""	$nl"
+IFS=" $tab$nl"
 
-# set DOITPROG to echo to test this script
+# Set DOITPROG to "echo" to test this script.
 
-# Don't use :- since 4.3BSD and earlier shells don't like it.
 doit=${DOITPROG-}
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
+doit_exec=${doit:-exec}
 
 # Put in absolute file names if you don't have them in your path;
 # or use environment vars.
@@ -68,17 +64,6 @@ mvprog=${MVPROG-mv}
 rmprog=${RMPROG-rm}
 stripprog=${STRIPPROG-strip}
 
-posix_glob='?'
-initialize_posix_glob='
-  test "$posix_glob" != "?" || {
-    if (set -f) 2>/dev/null; then
-      posix_glob=
-    else
-      posix_glob=:
-    fi
-  }
-'
-
 posix_mkdir=
 
 # Desired mode of installed file.
@@ -97,7 +82,7 @@ dir_arg=
 dst_arg=
 
 copy_on_change=false
-no_target_directory=
+is_target_a_directory=possibly
 
 usage="\
 Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
@@ -137,46 +122,57 @@ while test $# -ne 0; do
     -d) dir_arg=true;;
 
     -g) chgrpcmd="$chgrpprog $2"
-	shift;;
+        shift;;
 
     --help) echo "$usage"; exit $?;;
 
     -m) mode=$2
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-	shift;;
+        case $mode in
+          *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*)
+            echo "$0: invalid mode: $mode" >&2
+            exit 1;;
+        esac
+        shift;;
 
     -o) chowncmd="$chownprog $2"
-	shift;;
+        shift;;
 
     -s) stripcmd=$stripprog;;
 
-    -t) dst_arg=$2
-	# Protect names problematic for 'test' and other utilities.
-	case $dst_arg in
-	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
-	esac
-	shift;;
+    -t)
+        is_target_a_directory=always
+        dst_arg=$2
+        # Protect names problematic for 'test' and other utilities.
+        case $dst_arg in
+          -* | [=\(\)!]) dst_arg=./$dst_arg;;
+        esac
+        shift;;
 
-    -T) no_target_directory=true;;
+    -T) is_target_a_directory=never;;
 
     --version) echo "$0 $scriptversion"; exit $?;;
 
-    --)	shift
-	break;;
+    --) shift
+        break;;
 
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
+    -*) echo "$0: invalid option: $1" >&2
+        exit 1;;
 
     *)  break;;
   esac
   shift
 done
 
+# We allow the use of options -d and -T together, by making -d
+# take the precedence; this is for compatibility with GNU install.
+
+if test -n "$dir_arg"; then
+  if test -n "$dst_arg"; then
+    echo "$0: target directory not allowed when installing a directory." >&2
+    exit 1
+  fi
+fi
+
 if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
   # When -d is used, all remaining arguments are directories to create.
   # When -t is used, the destination is already specified.
@@ -208,6 +204,15 @@ if test $# -eq 0; then
 fi
 
 if test -z "$dir_arg"; then
+  if test $# -gt 1 || test "$is_target_a_directory" = always; then
+    if test ! -d "$dst_arg"; then
+      echo "$0: $dst_arg: Is not a directory." >&2
+      exit 1
+    fi
+  fi
+fi
+
+if test -z "$dir_arg"; then
   do_exit='(exit $ret); exit $ret'
   trap "ret=129; $do_exit" 1
   trap "ret=130; $do_exit" 2
@@ -223,16 +228,16 @@ if test -z "$dir_arg"; then
 
     *[0-7])
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw='% 200'
+        u_plus_rw='% 200'
       fi
       cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
     *)
       if test -z "$stripcmd"; then
-	u_plus_rw=
+        u_plus_rw=
       else
-	u_plus_rw=,u+rw
+        u_plus_rw=,u+rw
       fi
       cp_umask=$mode$u_plus_rw;;
   esac
@@ -269,41 +274,15 @@ do
     # If destination is a directory, append the input filename; won't work
     # if double slashes aren't ignored.
     if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dst_arg: Is a directory" >&2
-	exit 1
+      if test "$is_target_a_directory" = never; then
+        echo "$0: $dst_arg: Is a directory" >&2
+        exit 1
       fi
       dstdir=$dst
       dst=$dstdir/`basename "$src"`
       dstdir_status=0
     else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
+      dstdir=`dirname "$dst"`
       test -d "$dstdir"
       dstdir_status=$?
     fi
@@ -314,74 +293,81 @@ do
   if test $dstdir_status != 0; then
     case $posix_mkdir in
       '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
+        # Create intermediate dirs using mode 755 as modified by the umask.
+        # This is like FreeBSD 'install' as of 1997-10-28.
+        umask=`umask`
+        case $stripcmd.$umask in
+          # Optimize common cases.
+          *[2367][2367]) mkdir_umask=$umask;;
+          .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+          *[0-7])
+            mkdir_umask=`expr $umask + 22 \
+              - $umask % 100 % 40 + $umask % 20 \
+              - $umask % 10 % 4 + $umask % 2
+            `;;
+          *) mkdir_umask=$umask,go-w;;
+        esac
+
+        # With -d, create the new directory with the user-specified mode.
+        # Otherwise, rely on $mkdir_umask.
+        if test -n "$dir_arg"; then
+          mkdir_mode=-m$mode
+        else
+          mkdir_mode=
+        fi
+
+        posix_mkdir=false
+        case $umask in
+          *[123567][0-7][0-7])
+            # POSIX mkdir -p sets u+wx bits regardless of umask, which
+            # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+            ;;
+          *)
+            # $RANDOM is not portable (e.g. dash);  use it when possible to
+            # lower collision chance
+            tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+            trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+            # As "mkdir -p" follows symlinks and we work in /tmp possibly;  so
+            # create the $tmpdir first (and fail if unsuccessful) to make sure
+            # that nobody tries to guess the $tmpdir name.
+            if (umask $mkdir_umask &&
+                $mkdirprog $mkdir_mode "$tmpdir" &&
+                exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1
+            then
+              if test -z "$dir_arg" || {
+                   # Check for POSIX incompatibilities with -m.
+                   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+                   # other-writable bit of parent directory when it shouldn't.
+                   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+                   test_tmpdir="$tmpdir/a"
+                   ls_ld_tmpdir=`ls -ld "$test_tmpdir"`
+                   case $ls_ld_tmpdir in
+                     d????-?r-*) different_mode=700;;
+                     d????-?--*) different_mode=755;;
+                     *) false;;
+                   esac &&
+                   $mkdirprog -m$different_mode -p -- "$test_tmpdir" && {
+                     ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"`
+                     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+                   }
+                 }
+              then posix_mkdir=:
+              fi
+              rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir"
+            else
+              # Remove any dirs left behind by ancient mkdir implementations.
+              rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null
+            fi
+            trap '' 0;;
+        esac;;
     esac
 
     if
       $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+        umask $mkdir_umask &&
+        $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
       )
     then :
     else
@@ -391,53 +377,51 @@ do
       # directory the slow way, step by step, checking for races as we go.
 
       case $dstdir in
-	/*) prefix='/';;
-	[-=\(\)!]*) prefix='./';;
-	*)  prefix='';;
+        /*) prefix='/';;
+        [-=\(\)!]*) prefix='./';;
+        *)  prefix='';;
       esac
 
-      eval "$initialize_posix_glob"
-
       oIFS=$IFS
       IFS=/
-      $posix_glob set -f
+      set -f
       set fnord $dstdir
       shift
-      $posix_glob set +f
+      set +f
       IFS=$oIFS
 
       prefixes=
 
       for d
       do
-	test X"$d" = X && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
+        test X"$d" = X && continue
+
+        prefix=$prefix$d
+        if test -d "$prefix"; then
+          prefixes=
+        else
+          if $posix_mkdir; then
+            (umask=$mkdir_umask &&
+             $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+            # Don't fail if two instances are running concurrently.
+            test -d "$prefix" || exit 1
+          else
+            case $prefix in
+              *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+              *) qprefix=$prefix;;
+            esac
+            prefixes="$prefixes '$qprefix'"
+          fi
+        fi
+        prefix=$prefix/
       done
 
       if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
+        # Don't fail if two instances are running concurrently.
+        (umask $mkdir_umask &&
+         eval "\$doit_exec \$mkdirprog $prefixes") ||
+          test -d "$dstdir" || exit 1
+        obsolete_mkdir_used=true
       fi
     fi
   fi
@@ -472,15 +456,12 @@ do
 
     # If -C, don't bother to copy if it wouldn't change the file.
     if $copy_on_change &&
-       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
-       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
-
-       eval "$initialize_posix_glob" &&
-       $posix_glob set -f &&
+       old=`LC_ALL=C ls -dlL "$dst"     2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"  2>/dev/null` &&
+       set -f &&
        set X $old && old=:$2:$4:$5:$6 &&
        set X $new && new=:$2:$4:$5:$6 &&
-       $posix_glob set +f &&
-
+       set +f &&
        test "$old" = "$new" &&
        $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
     then
@@ -493,24 +474,24 @@ do
       # to itself, or perhaps because mv is so ancient that it does not
       # support -f.
       {
-	# Now remove or move aside any old file at destination location.
-	# We try this two ways since rm can't unlink itself on some
-	# systems and the destination file might be busy for other
-	# reasons.  In this case, the final cleanup might fail but the new
-	# file should still install successfully.
-	{
-	  test ! -f "$dst" ||
-	  $doit $rmcmd -f "$dst" 2>/dev/null ||
-	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
-	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
-	  } ||
-	  { echo "$0: cannot unlink or rename $dst" >&2
-	    (exit 1); exit 1
-	  }
-	} &&
-
-	# Now rename the file to the real destination.
-	$doit $mvcmd "$dsttmp" "$dst"
+        # Now remove or move aside any old file at destination location.
+        # We try this two ways since rm can't unlink itself on some
+        # systems and the destination file might be busy for other
+        # reasons.  In this case, the final cleanup might fail but the new
+        # file should still install successfully.
+        {
+          test ! -f "$dst" ||
+          $doit $rmcmd -f "$dst" 2>/dev/null ||
+          { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+            { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+          } ||
+          { echo "$0: cannot unlink or rename $dst" >&2
+            (exit 1); exit 1
+          }
+        } &&
+
+        # Now rename the file to the real destination.
+        $doit $mvcmd "$dsttmp" "$dst"
       }
     fi || exit 1
 
diff --git a/config/libtool.m4 b/config/libtool.m4
index 44e0ecf..10ab284 100644
--- a/config/libtool.m4
+++ b/config/libtool.m4
@@ -1,8 +1,6 @@
 # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
 #   Written by Gordon Matzigkeit, 1996
 #
 # This file is free software; the Free Software Foundation gives
@@ -10,36 +8,30 @@
 # modifications, as long as this notice is preserved.
 
 m4_define([_LT_COPYING], [dnl
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ])
 
-# serial 57 LT_INIT
+# serial 58 LT_INIT
 
 
 # LT_PREREQ(VERSION)
@@ -67,7 +59,7 @@ esac
 # LT_INIT([OPTIONS])
 # ------------------
 AC_DEFUN([LT_INIT],
-[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
 AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
 AC_BEFORE([$0], [LT_LANG])dnl
 AC_BEFORE([$0], [LT_OUTPUT])dnl
@@ -91,7 +83,7 @@ dnl Parse OPTIONS
 _LT_SET_OPTIONS([$0], [$1])
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -111,26 +103,43 @@ dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
 dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
 
 
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
 # _LT_CC_BASENAME(CC)
 # -------------------
-# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
 m4_defun([_LT_CC_BASENAME],
-[for cc_temp in $1""; do
-  case $cc_temp in
-    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
 ])
 
 
 # _LT_FILEUTILS_DEFAULTS
 # ----------------------
 # It is okay to use these file commands and assume they have been set
-# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
 m4_defun([_LT_FILEUTILS_DEFAULTS],
 [: ${CP="cp -f"}
 : ${MV="mv -f"}
@@ -177,15 +186,16 @@ m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
 m4_require([_LT_CMD_OLD_ARCHIVE])dnl
 m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
 m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
 
 _LT_CONFIG_LIBTOOL_INIT([
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 ])
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -198,7 +208,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -209,14 +219,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -269,14 +279,14 @@ no_glob_subst='s/\*/\\\*/g'
 
 # _LT_PROG_LTMAIN
 # ---------------
-# Note that this code is called both from `configure', and `config.status'
+# Note that this code is called both from 'configure', and 'config.status'
 # now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
-# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
 # so we pass a copy along to make sure it has a sensible value anyway.
 m4_defun([_LT_PROG_LTMAIN],
 [m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
 _LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 ])# _LT_PROG_LTMAIN
 
 
@@ -286,7 +296,7 @@ ltmain="$ac_aux_dir/ltmain.sh"
 
 # So that we can recreate a full libtool script including additional
 # tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-# in macros and then make a single call at the end using the `libtool'
+# in macros and then make a single call at the end using the 'libtool'
 # label.
 
 
@@ -421,8 +431,8 @@ m4_define([_lt_decl_all_varnames],
 
 # _LT_CONFIG_STATUS_DECLARE([VARNAME])
 # ------------------------------------
-# Quote a variable value, and forward it to `config.status' so that its
-# declaration there will have the same value as in `configure'.  VARNAME
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
 # must have a single quote delimited value for this to work.
 m4_define([_LT_CONFIG_STATUS_DECLARE],
 [$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
@@ -446,7 +456,7 @@ m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
 # Output comment and list of tags supported by the script
 m4_defun([_LT_LIBTOOL_TAGS],
 [_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-available_tags="_LT_TAGS"dnl
+available_tags='_LT_TAGS'dnl
 ])
 
 
@@ -474,7 +484,7 @@ m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
 # _LT_LIBTOOL_CONFIG_VARS
 # -----------------------
 # Produce commented declarations of non-tagged libtool config variables
-# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
 # script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
 # section) are produced by _LT_LIBTOOL_TAG_VARS.
 m4_defun([_LT_LIBTOOL_CONFIG_VARS],
@@ -500,8 +510,8 @@ m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
 # Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
 # variables for single and double quote escaping we saved from calls
 # to _LT_DECL, we can put quote escaped variables declarations
-# into `config.status', and then the shell code to quote escape them in
-# for loops in `config.status'.  Finally, any additional code accumulated
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
 # from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
 m4_defun([_LT_CONFIG_COMMANDS],
 [AC_PROVIDE_IFELSE([LT_OUTPUT],
@@ -547,7 +557,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_quote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -560,7 +570,7 @@ for var in lt_decl_all_varnames([[ \
 ]], lt_decl_dquote_varnames); do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[[\\\\\\\`\\"\\\$]]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -576,7 +586,7 @@ _LT_OUTPUT_LIBTOOL_INIT
 # Generate a child script FILE with all initialization necessary to
 # reuse the environment learned by the parent script, and make the
 # file executable.  If COMMENT is supplied, it is inserted after the
-# `#!' sequence but before initialization text begins.  After this
+# '#!' sequence but before initialization text begins.  After this
 # macro, additional text can be appended to FILE to form the body of
 # the child script.  The macro ends with non-zero status if the
 # file could not be fully written (such as if the disk is full).
@@ -598,7 +608,7 @@ AS_SHELL_SANITIZE
 _AS_PREPARE
 exec AS_MESSAGE_FD>&1
 _ASEOF
-test $lt_write_fail = 0 && chmod +x $1[]dnl
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
 m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
 
 # LT_OUTPUT
@@ -621,7 +631,7 @@ exec AS_MESSAGE_LOG_FD>>config.log
 } >&AS_MESSAGE_LOG_FD
 
 lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
 for use in further configure time tests before the real libtool is
 generated.
 
@@ -643,7 +653,7 @@ Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
-while test $[#] != 0
+while test 0 != $[#]
 do
   case $[1] in
     --version | --v* | -V )
@@ -656,10 +666,10 @@ do
       lt_cl_silent=: ;;
 
     -*) AC_MSG_ERROR([unrecognized option: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
 
     *) AC_MSG_ERROR([unrecognized argument: $[1]
-Try \`$[0] --help' for more information.]) ;;
+Try '$[0] --help' for more information.]) ;;
   esac
   shift
 done
@@ -685,7 +695,7 @@ chmod +x "$CONFIG_LT"
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec AS_MESSAGE_LOG_FD>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -705,27 +715,31 @@ m4_defun([_LT_CONFIG],
 _LT_CONFIG_SAVE_COMMANDS([
   m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
   m4_if(_LT_TAG, [C], [
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
 _LT_COPYING
 _LT_LIBTOOL_TAGS
 
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
 # ### BEGIN LIBTOOL CONFIG
 _LT_LIBTOOL_CONFIG_VARS
 _LT_LIBTOOL_TAG_VARS
@@ -733,13 +747,24 @@ _LT_LIBTOOL_TAG_VARS
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -756,8 +781,6 @@ _LT_EOF
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  _LT_PROG_REPLACE_SHELLFNS
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -775,7 +798,6 @@ _LT_EOF
 [m4_if([$1], [], [
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'], [])
 ])dnl /_LT_CONFIG_SAVE_COMMANDS
@@ -974,7 +996,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 
     AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
       [lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -992,7 +1014,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1010,7 +1032,7 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
       AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
 	[lt_cv_ld_exported_symbols_list=yes],
 	[lt_cv_ld_exported_symbols_list=no])
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
     ])
 
     AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
@@ -1032,7 +1054,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&AS_MESSAGE_LOG_FD
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&AS_MESSAGE_LOG_FD
@@ -1042,32 +1064,32 @@ _LT_EOF
     ])
     case $host_os in
     rhapsody* | darwin1.[[012]])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[[012]]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -1087,29 +1109,29 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
   _LT_TAGVAR(hardcode_direct, $1)=no
   _LT_TAGVAR(hardcode_automatic, $1)=yes
   _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
     m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
                   [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
   else
     _LT_TAGVAR(whole_archive_flag_spec, $1)=''
   fi
   _LT_TAGVAR(link_all_deplibs, $1)=yes
-  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
     m4_if([$1], [CXX],
-[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
     fi
 ],[])
   else
@@ -1129,7 +1151,7 @@ m4_defun([_LT_DARWIN_LINKER_FEATURES],
 # Allow to override them for all tags through lt_cv_aix_libpath.
 m4_defun([_LT_SYS_MODULE_PATH_AIX],
 [m4_require([_LT_DECL_SED])dnl
-if test "${lt_cv_aix_libpath+set}" = set; then
+if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
@@ -1147,7 +1169,7 @@ else
     _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
   fi],[])
   if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
-    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
   fi
   ])
   aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
@@ -1167,8 +1189,8 @@ m4_define([_LT_SHELL_INIT],
 # -----------------------
 # Find how we can fake an echo command that does not interpret backslash.
 # In particular, with Autoconf 2.60 or later we add some code to the start
-# of the generated configure script which will find a shell with a builtin
-# printf (which we can use as an echo command).
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
 m4_defun([_LT_PROG_ECHO_BACKSLASH],
 [ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
 ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
@@ -1196,10 +1218,10 @@ fi
 # Invoke $ECHO with all args, space-separated.
 func_echo_all ()
 {
-    $ECHO "$*" 
+    $ECHO "$*"
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) AC_MSG_RESULT([printf]) ;;
   print*) AC_MSG_RESULT([print -r]) ;;
   *) AC_MSG_RESULT([cat]) ;;
@@ -1225,16 +1247,17 @@ _LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
 AC_DEFUN([_LT_WITH_SYSROOT],
 [AC_MSG_CHECKING([for sysroot])
 AC_ARG_WITH([sysroot],
-[  --with-sysroot[=DIR] Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
 [], [with_sysroot=no])
 
 dnl lt_sysroot will always be passed unquoted.  We quote it here
 dnl in case the user passed a directory name.
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -1244,14 +1267,14 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_RESULT([$with_sysroot])
    AC_MSG_ERROR([The sysroot must be an absolute path.])
    ;;
 esac
 
  AC_MSG_RESULT([${lt_sysroot:-no}])
 _LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
-[dependent libraries, and in which our libraries should be installed.])])
+[dependent libraries, and where our libraries should be installed.])])
 
 # _LT_ENABLE_LOCK
 # ---------------
@@ -1259,31 +1282,33 @@ m4_defun([_LT_ENABLE_LOCK],
 [AC_ARG_ENABLE([libtool-lock],
   [AS_HELP_STRING([--disable-libtool-lock],
     [avoid locking (might break parallel builds)])])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -1312,9 +1337,46 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1324,9 +1386,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	    LD="${LD-ld} -m elf_i386_fbsd"
 	    ;;
 	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -1345,7 +1417,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -1363,19 +1438,20 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
     [AC_LANG_PUSH(C)
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
      AC_LANG_POP])
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if AC_TRY_EVAL(ac_compile); then
     case `/usr/bin/file conftest.o` in
@@ -1383,7 +1459,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -1392,7 +1468,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -1408,7 +1484,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 ])# _LT_ENABLE_LOCK
 
 
@@ -1427,11 +1503,11 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      [echo conftest.$ac_objext > conftest.lst
       lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
       AC_TRY_EVAL([lt_ar_try])
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	AC_TRY_EVAL([lt_ar_try])
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -1439,7 +1515,7 @@ AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
      ])
   ])
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -1470,7 +1546,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -1506,7 +1582,7 @@ AC_CACHE_CHECK([$1], [$2],
   [$2=no
    m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$3"
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -1533,7 +1609,7 @@ AC_CACHE_CHECK([$1], [$2],
    $RM conftest*
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$5], , :, [$5])
 else
     m4_if([$6], , :, [$6])
@@ -1555,7 +1631,7 @@ AC_DEFUN([_LT_LINKER_OPTION],
 m4_require([_LT_DECL_SED])dnl
 AC_CACHE_CHECK([$1], [$2],
   [$2=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $3"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -1574,10 +1650,10 @@ AC_CACHE_CHECK([$1], [$2],
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 ])
 
-if test x"[$]$2" = xyes; then
+if test yes = "[$]$2"; then
     m4_if([$4], , :, [$4])
 else
     m4_if([$5], , :, [$5])
@@ -1598,7 +1674,7 @@ AC_DEFUN([LT_CMD_MAX_LEN],
 AC_MSG_CHECKING([the maximum length of command line arguments])
 AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
   i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -1638,7 +1714,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -1688,22 +1764,23 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -1719,7 +1796,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
     ;;
   esac
 ])
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
 else
   AC_MSG_RESULT(none)
@@ -1747,7 +1824,7 @@ m4_defun([_LT_HEADER_DLFCN],
 # ----------------------------------------------------------------
 m4_defun([_LT_TRY_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "$cross_compiling" = yes; then :
+if test yes = "$cross_compiling"; then :
   [$4]
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -1794,9 +1871,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -1822,7 +1899,7 @@ int main ()
   return status;
 }]
 _LT_EOF
-  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -1843,7 +1920,7 @@ rm -fr conftest*
 # ------------------
 AC_DEFUN([LT_SYS_DLOPEN_SELF],
 [m4_require([_LT_HEADER_DLFCN])dnl
-if test "x$enable_dlopen" != xyes; then
+if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -1853,44 +1930,52 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-    lt_cv_dlopen="dyld"
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ])
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     AC_CHECK_FUNC([shl_load],
-	  [lt_cv_dlopen="shl_load"],
+	  [lt_cv_dlopen=shl_load],
       [AC_CHECK_LIB([dld], [shl_load],
-	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
 	[AC_CHECK_FUNC([dlopen],
-	      [lt_cv_dlopen="dlopen"],
+	      [lt_cv_dlopen=dlopen],
 	  [AC_CHECK_LIB([dl], [dlopen],
-		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
 	    [AC_CHECK_LIB([svld], [dlopen],
-		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
 	      [AC_CHECK_LIB([dld], [dld_link],
-		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
 	      ])
 	    ])
 	  ])
@@ -1899,21 +1984,21 @@ else
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     AC_CACHE_CHECK([whether a program can dlopen itself],
@@ -1923,7 +2008,7 @@ else
 	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
     ])
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
 	  lt_cv_dlopen_self_static, [dnl
@@ -1933,9 +2018,9 @@ else
       ])
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -2027,8 +2112,8 @@ m4_defun([_LT_COMPILER_FILE_LOCKS],
 m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 _LT_COMPILER_C_O([$1])
 
-hard_links="nottested"
-if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   AC_MSG_CHECKING([if we can lock with hard links])
   hard_links=yes
@@ -2038,8 +2123,8 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" !=
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   AC_MSG_RESULT([$hard_links])
-  if test "$hard_links" = no; then
-    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
     need_locks=warn
   fi
 else
@@ -2066,8 +2151,8 @@ objdir=$lt_cv_objdir
 _LT_DECL([], [objdir], [0],
          [The name of the directory that contains temporary libtool files])dnl
 m4_pattern_allow([LT_OBJDIR])dnl
-AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
-  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
 ])# _LT_CHECK_OBJDIR
 
 
@@ -2079,15 +2164,15 @@ m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
 _LT_TAGVAR(hardcode_action, $1)=
 if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
    test -n "$_LT_TAGVAR(runpath_var, $1)" ||
-   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
 
   # We can hardcode non-existent directories.
-  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
     # Linking always hardcodes the temporary library directory.
     _LT_TAGVAR(hardcode_action, $1)=relink
   else
@@ -2101,12 +2186,12 @@ else
 fi
 AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
 
-if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
-   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -2130,7 +2215,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       AC_MSG_RESULT([yes])
@@ -2148,6 +2233,47 @@ _LT_DECL([], [striplib], [1])
 ])# _LT_CMD_STRIPLIB
 
 
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x at S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
 # _LT_SYS_DYNAMIC_LINKER([TAG])
 # -----------------------------
 # PORTME Fill in your ld.so characteristics
@@ -2158,17 +2284,18 @@ m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_OBJDUMP])dnl
 m4_require([_LT_DECL_SED])dnl
 m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
 AC_MSG_CHECKING([dynamic linker characteristics])
 m4_if([$1],
 	[], [
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -2184,28 +2311,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -2219,7 +2353,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -2228,7 +2362,7 @@ fi])
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -2245,14 +2379,17 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[[4-9]]*)
@@ -2260,41 +2397,91 @@ aix[[4-9]]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[[01]] | aix4.[[01]].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -2304,18 +2491,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -2323,8 +2510,8 @@ beos*)
 bsdi[[45]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -2336,7 +2523,7 @@ bsdi[[45]]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -2345,8 +2532,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -2362,17 +2549,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
 m4_if([$1], [],[
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -2381,8 +2568,8 @@ m4_if([$1], [],[
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -2409,7 +2596,7 @@ m4_if([$1], [],[
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -2422,8 +2609,8 @@ m4_if([$1], [],[
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -2436,7 +2623,7 @@ m4_if([$1], [],[
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -2449,8 +2636,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -2463,8 +2650,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2482,12 +2669,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -2512,26 +2700,15 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -2549,14 +2726,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -2564,8 +2742,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -2574,8 +2752,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -2588,8 +2766,8 @@ interix[[3-9]]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2600,7 +2778,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -2608,8 +2786,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -2628,8 +2806,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -2638,13 +2816,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -2669,7 +2867,12 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -2684,17 +2887,29 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu)
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -2704,7 +2919,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -2713,58 +2928,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[[89]] | openbsd2.[[89]].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -2775,8 +3000,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -2786,11 +3011,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -2798,8 +3023,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -2820,24 +3045,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -2855,7 +3080,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -2863,8 +3088,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -2873,20 +3098,30 @@ uts4*)
   ;;
 esac
 AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
 _LT_DECL([], [variables_saved_for_relink], [1],
     [Variables whose values should be saved in libtool wrapper scripts and
     restored at link time])
@@ -2919,39 +3154,41 @@ _LT_DECL([], [hardcode_into_libs], [0],
     [Whether we should hardcode library paths into libraries])
 _LT_DECL([], [sys_lib_search_path_spec], [2],
     [Compile-time system search path for libraries])
-_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
-    [Run-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
 ])# _LT_SYS_DYNAMIC_LINKER
 
 
 # _LT_PATH_TOOL_PREFIX(TOOL)
 # --------------------------
-# find a file program which can recognize shared library
+# find a file program that can recognize shared library
 AC_DEFUN([_LT_PATH_TOOL_PREFIX],
 [m4_require([_LT_DECL_EGREP])dnl
 AC_MSG_CHECKING([for $1])
 AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
 [case $MAGIC_CMD in
 [[\\/*] |  ?:[\\/]*])
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
 dnl $ac_dummy forces splitting on constant user-supplied paths.
 dnl POSIX.2 word splitting is done only on the output of word expansions,
 dnl not every word.  This closes a longstanding sh security hole.
   ac_dummy="m4_if([$2], , $PATH, [$2])"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/$1; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -2974,11 +3211,11 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   AC_MSG_RESULT($MAGIC_CMD)
 else
@@ -2996,7 +3233,7 @@ dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
 
 # _LT_PATH_MAGIC
 # --------------
-# find a file program which can recognize a shared library
+# find a file program that can recognize a shared library
 m4_defun([_LT_PATH_MAGIC],
 [_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
 if test -z "$lt_cv_path_MAGIC_CMD"; then
@@ -3023,16 +3260,16 @@ m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
 AC_ARG_WITH([gnu-ld],
     [AS_HELP_STRING([--with-gnu-ld],
 	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
-    [test "$withval" = no || with_gnu_ld=yes],
+    [test no = "$withval" || with_gnu_ld=yes],
     [with_gnu_ld=no])dnl
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   AC_MSG_CHECKING([for ld used by $CC])
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -3046,7 +3283,7 @@ if test "$GCC" = yes; then
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -3057,37 +3294,37 @@ if test "$GCC" = yes; then
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   AC_MSG_CHECKING([for GNU ld])
 else
   AC_MSG_CHECKING([for non-GNU ld])
 fi
 AC_CACHE_VAL(lt_cv_path_LD,
 [if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi])
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   AC_MSG_RESULT($LD)
 else
@@ -3141,13 +3378,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -3158,6 +3395,43 @@ _LT_TAGDECL([], [reload_cmds], [2])dnl
 ])# _LT_CMD_RELOAD
 
 
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
 # _LT_CHECK_MAGIC_METHOD
 # ----------------------
 # how to check for library dependencies
@@ -3173,13 +3447,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[[4-9]]*)
@@ -3206,8 +3480,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -3243,10 +3516,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -3285,11 +3554,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
   else
@@ -3307,8 +3576,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
@@ -3361,6 +3630,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 ])
 
@@ -3401,33 +3673,38 @@ AC_DEFUN([LT_PATH_NM],
 AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
 [if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -3438,21 +3715,21 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi])
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
     # Let the user override the test.
   else
     AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -3460,8 +3737,8 @@ else
     esac
   fi
   AC_SUBST([DUMPBIN])
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -3507,8 +3784,8 @@ lt_cv_sharedlib_from_linklib_cmd,
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -3520,7 +3797,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 ])
@@ -3547,13 +3824,28 @@ AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool
     lt_cv_path_mainfest_tool=yes
   fi
   rm -f conftest*])
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 _LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
 ])# _LT_PATH_MANIFEST_TOOL
 
 
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
 # LT_LIB_M
 # --------
 # check for math library
@@ -3565,11 +3857,11 @@ case $host in
   # These system don't have libm, or don't need it
   ;;
 *-ncr-sysv4.3*)
-  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
   AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
   ;;
 *)
-  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
   ;;
 esac
 AC_SUBST([LIBM])
@@ -3588,7 +3880,7 @@ m4_defun([_LT_COMPILER_NO_RTTI],
 
 _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
@@ -3640,7 +3932,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[[ABCDGISTW]]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[[ABCDEGRST]]'
   fi
   ;;
@@ -3673,14 +3965,44 @@ case `$NM -V 2>&1` in
   symcode='[[ABCDGIRSTW]]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -3698,21 +4020,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK ['"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx]"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -3752,11 +4077,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT@&t at _DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT@&t at _DLSYM_CONST
 #else
@@ -3782,7 +4107,7 @@ lt__PROGRAM__LTX_preloaded_symbols[[]] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -3802,9 +4127,9 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -3825,7 +4150,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -3852,12 +4177,16 @@ _LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
     [Take the output of nm and produce a listing of raw symbols and C names])
 _LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
     [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
 _LT_DECL([global_symbol_to_c_name_address],
     [lt_cv_sys_global_symbol_to_c_name_address], [1],
     [Transform the output of nm in a C name address pair])
 _LT_DECL([global_symbol_to_c_name_address_lib_prefix],
     [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
     [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
 _LT_DECL([], [nm_file_list_spec], [1],
     [Specify filename containing input files for $NM])
 ]) # _LT_CMD_GLOBAL_SYMBOLS
@@ -3873,17 +4202,18 @@ _LT_TAGVAR(lt_prog_compiler_static, $1)=
 
 m4_if([$1], [CXX], [
   # C++ specific cases for pic, static, wl, etc.
-  if test "$GXX" = yes; then
+  if test yes = "$GXX"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
     aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -3894,8 +4224,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -3911,6 +4241,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
     darwin* | rhapsody*)
       # PIC is the default on this platform
@@ -3960,7 +4295,7 @@ m4_if([$1], [CXX], [
     case $host_os in
       aix[[4-9]]*)
 	# All AIX code is PIC.
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	  # AIX 5 now supports IA64 processor
 	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	else
@@ -4001,14 +4336,14 @@ m4_if([$1], [CXX], [
 	case $cc_basename in
 	  CC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
-	    if test "$host_cpu" != ia64; then
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
 	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
 	    fi
 	    ;;
 	  aCC*)
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
 	    case $host_cpu in
 	    hppa*64*|ia64*)
 	      # +Z the default
@@ -4037,7 +4372,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
 	case $cc_basename in
 	  KCC*)
 	    # KAI C++ Compiler
@@ -4045,7 +4380,7 @@ m4_if([$1], [CXX], [
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
 	    ;;
 	  ecpc* )
-	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    # old Intel C++ for x86_64, which still supported -KPIC.
 	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
 	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
@@ -4101,7 +4436,7 @@ m4_if([$1], [CXX], [
 	    ;;
 	esac
 	;;
-      netbsd*)
+      netbsd* | netbsdelf*-gnu)
 	;;
       *qnx* | *nto*)
         # QNX uses GNU C++, but need to define -shared option too, otherwise
@@ -4190,17 +4525,18 @@ m4_if([$1], [CXX], [
   fi
 ],
 [
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
     _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
       ;;
 
     amigaos*)
@@ -4211,8 +4547,8 @@ m4_if([$1], [CXX], [
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -4229,6 +4565,11 @@ m4_if([$1], [CXX], [
       # (--disable-auto-import) libraries
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -4299,7 +4640,7 @@ m4_if([$1], [CXX], [
     case $host_os in
     aix*)
       _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       else
@@ -4307,11 +4648,30 @@ m4_if([$1], [CXX], [
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       m4_if([$1], [GCJ], [],
 	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -4327,7 +4687,7 @@ m4_if([$1], [CXX], [
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -4336,9 +4696,9 @@ m4_if([$1], [CXX], [
       _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
@@ -4363,6 +4723,12 @@ m4_if([$1], [CXX], [
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -4460,7 +4826,7 @@ m4_if([$1], [CXX], [
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
 	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
       fi
@@ -4489,7 +4855,7 @@ m4_if([$1], [CXX], [
   fi
 ])
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     _LT_TAGVAR(lt_prog_compiler_pic, $1)=
     ;;
@@ -4555,17 +4921,21 @@ m4_if([$1], [CXX], [
   case $host_os in
   aix[[4-9]]*)
     # If we're using GNU nm, then we don't want the "-C" option.
-    # -C means demangle to AIX nm, but means don't demangle with GNU nm
-    # Also, AIX nm treats weak defined symbols like other global defined
-    # symbols, whereas GNU nm marks them as "W".
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
     if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
     else
-      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
     fi
     ;;
   pw32*)
-    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
     ;;
   cygwin* | mingw* | cegcc*)
     case $cc_basename in
@@ -4578,6 +4948,9 @@ m4_if([$1], [CXX], [
       ;;
     esac
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   *)
     _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
     ;;
@@ -4611,9 +4984,9 @@ m4_if([$1], [CXX], [
   # included in the symbol list
   _LT_TAGVAR(include_expsyms, $1)=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -4629,7 +5002,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -4637,9 +5010,12 @@ dnl Note also adjust exclude_expsyms for C++ above.
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
   esac
 
   _LT_TAGVAR(ld_shlibs, $1)=yes
@@ -4647,7 +5023,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -4669,24 +5045,24 @@ dnl Note also adjust exclude_expsyms for C++ above.
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       _LT_TAGVAR(whole_archive_flag_spec, $1)=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -4699,7 +5075,7 @@ dnl Note also adjust exclude_expsyms for C++ above.
     case $host_os in
     aix[[3-9]]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
@@ -4718,7 +5094,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -4734,7 +5110,7 @@ _LT_EOF
 	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4744,7 +5120,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
       # as there is no search path for DLLs.
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
       _LT_TAGVAR(always_export_symbols, $1)=no
       _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -4752,61 +5128,89 @@ _LT_EOF
       _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
 
     haiku*)
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
     interix[[3-9]]*)
       _LT_TAGVAR(hardcode_direct, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -4817,42 +5221,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  _LT_TAGVAR(compiler_needs_object, $1)=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -4861,13 +5270,13 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -4885,8 +5294,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
@@ -4898,7 +5307,7 @@ _LT_EOF
 	_LT_TAGVAR(ld_shlibs, $1)=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -4913,9 +5322,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -4932,15 +5341,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
       fi
       ;;
     esac
 
-    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
       runpath_var=
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
       _LT_TAGVAR(export_dynamic_flag_spec, $1)=
@@ -4956,7 +5365,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	_LT_TAGVAR(hardcode_direct, $1)=unsupported
@@ -4964,34 +5373,57 @@ _LT_EOF
       ;;
 
     aix[[4-9]]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -5010,13 +5442,21 @@ _LT_EOF
       _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[[012]]|aix4.[[012]].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -5035,61 +5475,80 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       _LT_TAGVAR(always_export_symbols, $1)=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
         _LT_SYS_MODULE_PATH_AIX([$1])
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
 	 _LT_SYS_MODULE_PATH_AIX([$1])
-	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	  fi
 	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 3 [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -5098,7 +5557,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             _LT_TAGVAR(archive_expsym_cmds, $1)=''
         ;;
       m68k)
@@ -5128,16 +5587,17 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
@@ -5146,18 +5606,18 @@ _LT_EOF
 	# Don't use ranlib
 	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -5166,7 +5626,7 @@ _LT_EOF
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -5216,33 +5676,33 @@ _LT_EOF
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_direct, $1)=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	_LT_TAGVAR(hardcode_minus_L, $1)=yes
@@ -5250,25 +5710,25 @@ _LT_EOF
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 	m4_if($1, [], [
@@ -5276,14 +5736,14 @@ _LT_EOF
 	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
 	  _LT_LINKER_OPTION([if $CC understands -b],
 	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
-	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
 	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
-	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	case $host_cpu in
@@ -5294,7 +5754,7 @@ _LT_EOF
 	*)
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -5305,16 +5765,16 @@ _LT_EOF
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
 	# This should be the same for all languages, so no per-tag cache variable.
 	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
 	  [lt_cv_irix_exported_symbol],
-	  [save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   AC_LINK_IFELSE(
 	     [AC_LANG_SOURCE(
 	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
@@ -5327,22 +5787,33 @@ _LT_EOF
       end]])])],
 	      [lt_cv_irix_exported_symbol=yes],
 	      [lt_cv_irix_exported_symbol=no])
-           LDFLAGS="$save_LDFLAGS"])
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(inherit_rpath, $1)=yes
       _LT_TAGVAR(link_all_deplibs, $1)=yes
       ;;
 
-    netbsd*)
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -5356,7 +5827,7 @@ _LT_EOF
     newsos6)
       _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       _LT_TAGVAR(hardcode_direct, $1)=yes
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       ;;
@@ -5364,27 +5835,19 @@ _LT_EOF
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	_LT_TAGVAR(hardcode_direct, $1)=yes
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
-	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	     ;;
-	   *)
-	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	fi
       else
 	_LT_TAGVAR(ld_shlibs, $1)=no
@@ -5395,33 +5858,53 @@ _LT_EOF
       _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
       _LT_TAGVAR(hardcode_minus_L, $1)=yes
       _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
-      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
       else
 	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -5432,24 +5915,24 @@ _LT_EOF
 
     solaris*)
       _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -5459,11 +5942,11 @@ _LT_EOF
       solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	fi
@@ -5473,10 +5956,10 @@ _LT_EOF
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -5525,43 +6008,43 @@ _LT_EOF
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
       _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
       _LT_TAGVAR(link_all_deplibs, $1)=yes
-      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -5576,17 +6059,17 @@ _LT_EOF
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
 	;;
       esac
     fi
   fi
 ])
 AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
 _LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
 
@@ -5603,7 +6086,7 @@ x|xyes)
   # Assume -lc should be added
   _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $_LT_TAGVAR(archive_cmds, $1) in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -5683,12 +6166,12 @@ _LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
 _LT_TAGDECL([], [hardcode_libdir_separator], [1],
     [Whether we need a single "-rpath" flag with a separated argument])
 _LT_TAGDECL([], [hardcode_direct], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary])
 _LT_TAGDECL([], [hardcode_direct_absolute], [0],
-    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
     DIR into the resulting binary and the resulting library dependency is
-    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
     library is relocated])
 _LT_TAGDECL([], [hardcode_minus_L], [0],
     [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
@@ -5729,10 +6212,10 @@ dnl    [Compiler flag to generate thread safe objects])
 # ------------------------
 # Ensure that the configuration variables for a C compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_C_CONFIG],
 [m4_require([_LT_DECL_EGREP])dnl
-lt_save_CC="$CC"
+lt_save_CC=$CC
 AC_LANG_PUSH(C)
 
 # Source file extension for C test sources.
@@ -5772,18 +6255,18 @@ if test -n "$compiler"; then
   LT_SYS_DLOPEN_SELF
   _LT_CMD_STRIPLIB
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   AC_MSG_CHECKING([if libtool supports shared libraries])
   AC_MSG_RESULT([$can_build_shared])
 
   AC_MSG_CHECKING([whether to build shared libraries])
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -5791,8 +6274,12 @@ if test -n "$compiler"; then
     ;;
 
   aix[[4-9]]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -5800,13 +6287,13 @@ if test -n "$compiler"; then
 
   AC_MSG_CHECKING([whether to build static libraries])
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   AC_MSG_RESULT([$enable_static])
 
   _LT_CONFIG($1)
 fi
 AC_LANG_POP
-CC="$lt_save_CC"
+CC=$lt_save_CC
 ])# _LT_LANG_C_CONFIG
 
 
@@ -5814,14 +6301,14 @@ CC="$lt_save_CC"
 # --------------------------
 # Ensure that the configuration variables for a C++ compiler are suitably
 # defined.  These variables are subsequently used by _LT_CONFIG to write
-# the compiler configuration to `libtool'.
+# the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_CXX_CONFIG],
 [m4_require([_LT_FILEUTILS_DEFAULTS])dnl
 m4_require([_LT_DECL_EGREP])dnl
 m4_require([_LT_PATH_MANIFEST_TOOL])dnl
-if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
-    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
-    (test "X$CXX" != "Xg++"))) ; then
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
   AC_PROG_CXXCPP
 else
   _lt_caught_CXX_error=yes
@@ -5863,7 +6350,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the CXX compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_caught_CXX_error" != yes; then
+if test yes != "$_lt_caught_CXX_error"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="int some_variable = 0;"
 
@@ -5905,35 +6392,35 @@ if test "$_lt_caught_CXX_error" != yes; then
   if test -n "$compiler"; then
     # We don't want -fno-exception when compiling C++ code, so set the
     # no_builtin_flag separately
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
     else
       _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
     fi
 
-    if test "$GXX" = yes; then
+    if test yes = "$GXX"; then
       # Set up default GNU C++ configuration
 
       LT_PATH_LD
 
       # Check if GNU C++ uses GNU ld as the underlying linker, since the
       # archiving commands below assume that GNU ld is being used.
-      if test "$with_gnu_ld" = yes; then
-        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
         # If archive_cmds runs LD, not CC, wlarc should be empty
         # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
         #     investigate it a little bit more. (MM)
-        wlarc='${wl}'
+        wlarc='$wl'
 
         # ancient GNU ld didn't support --whole-archive et. al.
         if eval "`$CC -print-prog-name=ld` --help 2>&1" |
 	  $GREP 'no-whole-archive' > /dev/null; then
-          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
         else
           _LT_TAGVAR(whole_archive_flag_spec, $1)=
         fi
@@ -5969,18 +6456,30 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=no
         ;;
       aix[[4-9]]*)
-        if test "$host_cpu" = ia64; then
+        if test ia64 = "$host_cpu"; then
           # On IA64, the linker does run time linking by default, so we don't
           # have to do anything special.
           aix_use_runtimelinking=no
           exp_sym_flag='-Bexport'
-          no_entry_flag=""
+          no_entry_flag=
         else
           aix_use_runtimelinking=no
 
           # Test if we are trying to use run time linking or normal
           # AIX style linking. If -brtl is somewhere in LDFLAGS, we
-          # need to do runtime linking.
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
           case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
 	    for ld_flag in $LDFLAGS; do
 	      case $ld_flag in
@@ -5990,6 +6489,13 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        ;;
 	      esac
 	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
 	    ;;
           esac
 
@@ -6008,13 +6514,21 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
         _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
-        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
 
-        if test "$GXX" = yes; then
+        if test yes = "$GXX"; then
           case $host_os in aix4.[[012]]|aix4.[[012]].*)
           # We only want to do this on AIX 4.2 and lower, the check
           # below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -6032,64 +6546,84 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  fi
           esac
           shared_flag='-shared'
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag="$shared_flag "'${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
 	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
         else
           # not using gcc
-          if test "$host_cpu" = ia64; then
+          if test ia64 = "$host_cpu"; then
 	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	  # chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
           else
-	    if test "$aix_use_runtimelinking" = yes; then
-	      shared_flag='${wl}-G'
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
 	    else
-	      shared_flag='${wl}-bM:SRE'
+	      shared_flag='$wl-bM:SRE'
 	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
           fi
         fi
 
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
         # It seems that -bexpall does not export symbols beginning with
         # underscore (_), so it is better to generate a list of symbols to
 	# export.
         _LT_TAGVAR(always_export_symbols, $1)=yes
-        if test "$aix_use_runtimelinking" = yes; then
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
           # Warning - without using the other runtime loading flags (-brtl),
           # -berok will link without error, but may produce a broken library.
-          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
           # Determine the default libpath from the value encoded in an empty
           # executable.
           _LT_SYS_MODULE_PATH_AIX([$1])
-          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 
-          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
         else
-          if test "$host_cpu" = ia64; then
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
 	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
           else
 	    # Determine the default libpath from the value encoded in an
 	    # empty executable.
 	    _LT_SYS_MODULE_PATH_AIX([$1])
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
 	    # Warning - without using the other run time loading flags,
 	    # -berok will link without error, but may produce a broken library.
-	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
-	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
-	    if test "$with_gnu_ld" = yes; then
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
 	      # We only use this code for GNU lds that support --whole-archive.
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    else
 	      # Exported symbols can be pulled into shared objects from archives
 	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
 	    fi
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
-	    # This is similar to how AIX traditionally builds its shared
-	    # libraries.
-	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# [...]
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
           fi
         fi
         ;;
@@ -6099,7 +6633,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	  # support --undefined.  This deserves some investigation.  FIXME
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 	else
 	  _LT_TAGVAR(ld_shlibs, $1)=no
 	fi
@@ -6127,57 +6661,58 @@ if test "$_lt_caught_CXX_error" != yes; then
 	  # Tell ltmain to make .lib files, not .a files.
 	  libext=lib
 	  # Tell ltmain to make .dll files, not .so files.
-	  shrext_cmds=".dll"
+	  shrext_cmds=.dll
 	  # FIXME: Setting linknames here is a bad hack.
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	    else
-	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	    fi~
-	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	    linknames='
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
 	  # The linker will not automatically build a static lib if we build a DLL.
 	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 	  # Don't use ranlib
 	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
 	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
-	    lt_tool_outputfile="@TOOL_OUTPUT@"~
-	    case $lt_outputfile in
-	      *.exe|*.EXE) ;;
-	      *)
-		lt_outputfile="$lt_outputfile.exe"
-		lt_tool_outputfile="$lt_tool_outputfile.exe"
-		;;
-	    esac~
-	    func_to_tool_file "$lt_outputfile"~
-	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	      $RM "$lt_outputfile.manifest";
-	    fi'
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
 	  ;;
 	*)
 	  # g++
 	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
 	  # as there is no search path for DLLs.
 	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
-	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
 	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
 	  _LT_TAGVAR(always_export_symbols, $1)=no
 	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
 
 	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	    # If the export-symbols file already is a .def file (1st line
-	    # is EXPORTS), use it as is; otherwise, prepend...
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	      cp $export_symbols $output_objdir/$soname.def;
-	    else
-	      echo EXPORTS > $output_objdir/$soname.def;
-	      cat $export_symbols >> $output_objdir/$soname.def;
-	    fi~
-	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
 	  else
 	    _LT_TAGVAR(ld_shlibs, $1)=no
 	  fi
@@ -6188,6 +6723,34 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_DARWIN_LINKER_FEATURES($1)
 	;;
 
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
       dgux*)
         case $cc_basename in
           ec++*)
@@ -6222,18 +6785,15 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
         ;;
 
-      gnu*)
-        ;;
-
       haiku*)
-        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
         _LT_TAGVAR(link_all_deplibs, $1)=yes
         ;;
 
       hpux9*)
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
-        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
         _LT_TAGVAR(hardcode_direct, $1)=yes
         _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
 				             # but as the default
@@ -6245,7 +6805,7 @@ if test "$_lt_caught_CXX_error" != yes; then
             _LT_TAGVAR(ld_shlibs, $1)=no
             ;;
           aCC*)
-            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             # Commands to make compiler produce verbose output that lists
             # what "hidden" libraries, object files and flags are used when
             # linking a shared library.
@@ -6254,11 +6814,11 @@ if test "$_lt_caught_CXX_error" != yes; then
             # explicitly linking system object files so we need to strip them
             # from the output so that they don't get included in the library
             # dependencies.
-            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
             ;;
           *)
-            if test "$GXX" = yes; then
-              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
             else
               # FIXME: insert proper C++ library support
               _LT_TAGVAR(ld_shlibs, $1)=no
@@ -6268,15 +6828,15 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
       hpux10*|hpux11*)
-        if test $with_gnu_ld = no; then
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
 	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
           case $host_cpu in
             hppa*64*|ia64*)
               ;;
             *)
-	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
               ;;
           esac
         fi
@@ -6302,13 +6862,13 @@ if test "$_lt_caught_CXX_error" != yes; then
           aCC*)
 	    case $host_cpu in
 	      hppa*64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      ia64*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	      *)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	        ;;
 	    esac
 	    # Commands to make compiler produce verbose output that lists
@@ -6319,20 +6879,20 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test $with_gnu_ld = no; then
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
 	        case $host_cpu in
 	          hppa*64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          ia64*)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	          *)
-	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	            ;;
 	        esac
 	      fi
@@ -6347,22 +6907,22 @@ if test "$_lt_caught_CXX_error" != yes; then
       interix[[3-9]]*)
 	_LT_TAGVAR(hardcode_direct, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
 	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
 	# Instead, shared libraries are loaded at an image base (0x10000000 by
 	# default) and relocated if they conflict, which is a slow very memory
 	# consuming and fragmenting process.  To avoid this, we pick a random,
 	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
 	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
 	;;
       irix5* | irix6*)
         case $cc_basename in
           CC*)
 	    # SGI C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
@@ -6371,22 +6931,22 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
 	    ;;
           *)
-	    if test "$GXX" = yes; then
-	      if test "$with_gnu_ld" = no; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	      else
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
 	      fi
 	    fi
 	    _LT_TAGVAR(link_all_deplibs, $1)=yes
 	    ;;
         esac
-        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
         _LT_TAGVAR(hardcode_libdir_separator, $1)=:
         _LT_TAGVAR(inherit_rpath, $1)=yes
         ;;
 
-      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
         case $cc_basename in
           KCC*)
 	    # Kuck and Associates, Inc. (KAI) C++ Compiler
@@ -6394,8 +6954,8 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
 	    # Commands to make compiler produce verbose output that lists
 	    # what "hidden" libraries, object files and flags are used when
 	    # linking a shared library.
@@ -6404,10 +6964,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
 
 	    # Archives containing C++ object files must be created using
 	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
@@ -6421,59 +6981,59 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # earlier do not add the objects themselves.
 	    case `$CC -V 2>&1` in
 	      *"Version 7."*)
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	      *)  # Version 8.0 or newer
 	        tmp_idyn=
 	        case $host_cpu in
 		  ia64*) tmp_idyn=' -i_dynamic';;
 		esac
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 		;;
 	    esac
 	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
 	    ;;
           pgCC* | pgcpp*)
             # Portland Group C++ compiler
 	    case `$CC -V` in
 	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
 	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
-		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
 	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
-		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
-		$RANLIB $oldlib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
 	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
-		rm -rf $tpldir~
-		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
-		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    *) # Version 6 and above use weak symbols
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	      ;;
 	    esac
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
             ;;
 	  cxx*)
 	    # Compaq C++
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
 
 	    runpath_var=LD_RUN_PATH
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
@@ -6487,18 +7047,18 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
 	    ;;
 	  xl* | mpixl* | bgxl*)
 	    # IBM XL 8.0 on PPC, with GNU ld
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
 	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
-		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-		echo "local: *; };" >> $output_objdir/$libname.ver~
-		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
 	    fi
 	    ;;
 	  *)
@@ -6506,10 +7066,10 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    *Sun\ C*)
 	      # Sun C++ 5.9
 	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
-	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
 	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
-	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	      _LT_TAGVAR(compiler_needs_object, $1)=yes
 
 	      # Not sure whether something based on
@@ -6567,22 +7127,17 @@ if test "$_lt_caught_CXX_error" != yes; then
         _LT_TAGVAR(ld_shlibs, $1)=yes
 	;;
 
-      openbsd2*)
-        # C++ shared libraries are fairly broken
-	_LT_TAGVAR(ld_shlibs, $1)=no
-	;;
-
-      openbsd*)
+      openbsd* | bitrig*)
 	if test -f /usr/libexec/ld.so; then
 	  _LT_TAGVAR(hardcode_direct, $1)=yes
 	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
 	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
 	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
-	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
-	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
-	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
-	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
 	  fi
 	  output_verbose_link_cmd=func_echo_all
 	else
@@ -6598,9 +7153,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # KCC will only create a shared library if the output file
 	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
 	    # to its proper name (with version) after linking.
-	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
 
-	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
 	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	    # Archives containing C++ object files must be created using
@@ -6618,17 +7173,17 @@ if test "$_lt_caught_CXX_error" != yes; then
           cxx*)
 	    case $host in
 	      osf3*)
-	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 		;;
 	      *)
 	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
-	          echo "-hidden">> $lib.exp~
-	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
-	          $RM $lib.exp'
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
 	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
 		;;
 	    esac
@@ -6643,21 +7198,21 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # explicitly linking system object files so we need to strip them
 	    # from the output so that they don't get included in the library
 	    # dependencies.
-	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
 	    ;;
 	  *)
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
 	      case $host in
 	        osf3*)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	        *)
-	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 		  ;;
 	      esac
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
 	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
 
 	      # Commands to make compiler produce verbose output that lists
@@ -6703,9 +7258,9 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    # Sun C++ 4.2, 5.x and Centerline C++
             _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
 	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
 	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
 	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
@@ -6713,7 +7268,7 @@ if test "$_lt_caught_CXX_error" != yes; then
 	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 	      *)
 		# The compiler driver will combine and reorder linker options,
-		# but understands `-z linker_flag'.
+		# but understands '-z linker_flag'.
 	        # Supported since Solaris 2.6 (maybe 2.5.1?)
 		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
 	        ;;
@@ -6730,30 +7285,30 @@ if test "$_lt_caught_CXX_error" != yes; then
 	    ;;
           gcx*)
 	    # Green Hills C++ Compiler
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 
 	    # The C++ compiler must be used to create the archive.
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
 	    ;;
           *)
 	    # GNU C++ compiler with Solaris linker
-	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
-	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
 	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
 	        # linking a shared library.
 	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      else
-	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
 	        # platform.
-	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
 	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
 
 	        # Commands to make compiler produce verbose output that lists
 	        # what "hidden" libraries, object files and flags are used when
@@ -6761,11 +7316,11 @@ if test "$_lt_caught_CXX_error" != yes; then
 	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
 	      fi
 
-	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
 	      case $host_os in
 		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
 		*)
-		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 		  ;;
 	      esac
 	    fi
@@ -6774,52 +7329,52 @@ if test "$_lt_caught_CXX_error" != yes; then
         ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
-      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
       _LT_TAGVAR(archive_cmds_need_lc, $1)=no
       _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
       runpath_var='LD_RUN_PATH'
 
       case $cc_basename in
         CC*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
       esac
       ;;
 
       sysv5* | sco3.2v5* | sco5v6*)
-	# Note: We can NOT use -z defs as we might desire, because we do not
+	# Note: We CANNOT use -z defs as we might desire, because we do not
 	# link with -lc, and that would cause any symbols used from libc to
 	# always be unresolved, which means just about no library would
 	# ever link correctly.  If we're not using GNU ld we use -z text
 	# though, which does catch some bad symbols but isn't as heavy-handed
 	# as -z defs.
-	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
-	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
 	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
 	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
-	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
 	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
 	_LT_TAGVAR(link_all_deplibs, $1)=yes
-	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
 	runpath_var='LD_RUN_PATH'
 
 	case $cc_basename in
           CC*)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
-	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
 	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
-	      '"$_LT_TAGVAR(reload_cmds, $1)"
+              '"$_LT_TAGVAR(reload_cmds, $1)"
 	    ;;
 	  *)
-	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
 	    ;;
 	esac
       ;;
@@ -6850,10 +7405,10 @@ if test "$_lt_caught_CXX_error" != yes; then
     esac
 
     AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
-    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
 
-    _LT_TAGVAR(GCC, $1)="$GXX"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -6880,7 +7435,7 @@ if test "$_lt_caught_CXX_error" != yes; then
   lt_cv_path_LD=$lt_save_path_LD
   lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
   lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
-fi # test "$_lt_caught_CXX_error" != yes
+fi # test yes != "$_lt_caught_CXX_error"
 
 AC_LANG_POP
 ])# _LT_LANG_CXX_CONFIG
@@ -6902,13 +7457,14 @@ AC_REQUIRE([_LT_DECL_SED])
 AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
 func_stripname_cnf ()
 {
-  case ${2} in
-  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
   esac
 } # func_stripname_cnf
 ])# _LT_FUNC_STRIPNAME_CNF
 
+
 # _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
 # ---------------------------------
 # Figure out "hidden" library dependencies from verbose
@@ -6992,13 +7548,13 @@ if AC_TRY_EVAL(ac_compile); then
   pre_test_object_deps_done=no
 
   for p in `eval "$output_verbose_link_cmd"`; do
-    case ${prev}${p} in
+    case $prev$p in
 
     -L* | -R* | -l*)
        # Some compilers place space between "-{L,R}" and the path.
        # Remove the space.
-       if test $p = "-L" ||
-          test $p = "-R"; then
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
 	 prev=$p
 	 continue
        fi
@@ -7014,16 +7570,16 @@ if AC_TRY_EVAL(ac_compile); then
        case $p in
        =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
        esac
-       if test "$pre_test_object_deps_done" = no; then
-	 case ${prev} in
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
 	 -L | -R)
 	   # Internal compiler library paths should come after those
 	   # provided the user.  The postdeps already come after the
 	   # user supplied libs so there is no need to process them.
 	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
 	   else
-	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
 	   fi
 	   ;;
 	 # The "-l" case would never come before the object being
@@ -7031,9 +7587,9 @@ if AC_TRY_EVAL(ac_compile); then
 	 esac
        else
 	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
-	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
 	 else
-	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
 	 fi
        fi
        prev=
@@ -7048,15 +7604,15 @@ if AC_TRY_EVAL(ac_compile); then
 	 continue
        fi
 
-       if test "$pre_test_object_deps_done" = no; then
+       if test no = "$pre_test_object_deps_done"; then
 	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
-	   _LT_TAGVAR(predep_objects, $1)="$p"
+	   _LT_TAGVAR(predep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
 	 fi
        else
 	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
-	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	   _LT_TAGVAR(postdep_objects, $1)=$p
 	 else
 	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
 	 fi
@@ -7087,51 +7643,6 @@ interix[[3-9]]*)
   _LT_TAGVAR(postdep_objects,$1)=
   _LT_TAGVAR(postdeps,$1)=
   ;;
-
-linux*)
-  case `$CC -V 2>&1 | sed 5q` in
-  *Sun\ C*)
-    # Sun C++ 5.9
-
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
-
-solaris*)
-  case $cc_basename in
-  CC* | sunCC*)
-    # The more standards-conforming stlport4 library is
-    # incompatible with the Cstd library. Avoid specifying
-    # it if it's in CXXFLAGS. Ignore libCrun as
-    # -library=stlport4 depends on it.
-    case " $CXX $CXXFLAGS " in
-    *" -library=stlport4 "*)
-      solaris_use_stlport4=yes
-      ;;
-    esac
-
-    # Adding this requires a known-good setup of shared libraries for
-    # Sun compiler versions before 5.6, else PIC objects from an old
-    # archive will be linked into the output, leading to subtle bugs.
-    if test "$solaris_use_stlport4" != yes; then
-      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
-    fi
-    ;;
-  esac
-  ;;
 esac
 ])
 
@@ -7140,7 +7651,7 @@ case " $_LT_TAGVAR(postdeps, $1) " in
 esac
  _LT_TAGVAR(compiler_lib_search_dirs, $1)=
 if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
- _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
 fi
 _LT_TAGDECL([], [compiler_lib_search_dirs], [1],
     [The directories searched by this compiler when creating a shared library])
@@ -7160,10 +7671,10 @@ _LT_TAGDECL([], [compiler_lib_search_path], [1],
 # --------------------------
 # Ensure that the configuration variables for a Fortran 77 compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_F77_CONFIG],
 [AC_LANG_PUSH(Fortran 77)
-if test -z "$F77" || test "X$F77" = "Xno"; then
+if test -z "$F77" || test no = "$F77"; then
   _lt_disable_F77=yes
 fi
 
@@ -7200,7 +7711,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the F77 compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_F77" != yes; then
+if test yes != "$_lt_disable_F77"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7222,7 +7733,7 @@ if test "$_lt_disable_F77" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${F77-"f77"}
@@ -7236,21 +7747,25 @@ if test "$_lt_disable_F77" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7258,11 +7773,11 @@ if test "$_lt_disable_F77" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$G77"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7279,9 +7794,9 @@ if test "$_lt_disable_F77" != yes; then
   fi # test -n "$compiler"
 
   GCC=$lt_save_GCC
-  CC="$lt_save_CC"
-  CFLAGS="$lt_save_CFLAGS"
-fi # test "$_lt_disable_F77" != yes
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
 
 AC_LANG_POP
 ])# _LT_LANG_F77_CONFIG
@@ -7291,11 +7806,11 @@ AC_LANG_POP
 # -------------------------
 # Ensure that the configuration variables for a Fortran compiler are
 # suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_FC_CONFIG],
 [AC_LANG_PUSH(Fortran)
 
-if test -z "$FC" || test "X$FC" = "Xno"; then
+if test -z "$FC" || test no = "$FC"; then
   _lt_disable_FC=yes
 fi
 
@@ -7332,7 +7847,7 @@ _LT_TAGVAR(objext, $1)=$objext
 # the FC compiler isn't working.  Some variables (like enable_shared)
 # are currently assumed to apply to all compilers on this platform,
 # and will be corrupted by setting them based on a non-working compiler.
-if test "$_lt_disable_FC" != yes; then
+if test yes != "$_lt_disable_FC"; then
   # Code to be used in simple compile tests
   lt_simple_compile_test_code="\
       subroutine t
@@ -7354,7 +7869,7 @@ if test "$_lt_disable_FC" != yes; then
   _LT_LINKER_BOILERPLATE
 
   # Allow CC to be a program name with arguments.
-  lt_save_CC="$CC"
+  lt_save_CC=$CC
   lt_save_GCC=$GCC
   lt_save_CFLAGS=$CFLAGS
   CC=${FC-"f95"}
@@ -7370,21 +7885,25 @@ if test "$_lt_disable_FC" != yes; then
     AC_MSG_RESULT([$can_build_shared])
 
     AC_MSG_CHECKING([whether to build shared libraries])
-    test "$can_build_shared" = "no" && enable_shared=no
+    test no = "$can_build_shared" && enable_shared=no
 
     # On AIX, shared libraries and static libraries use the same namespace, and
     # are all built from PIC.
     case $host_os in
       aix3*)
-        test "$enable_shared" = yes && enable_static=no
+        test yes = "$enable_shared" && enable_static=no
         if test -n "$RANLIB"; then
           archive_cmds="$archive_cmds~\$RANLIB \$lib"
           postinstall_cmds='$RANLIB $lib'
         fi
         ;;
       aix[[4-9]]*)
-	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-	  test "$enable_shared" = yes && enable_static=no
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
 	fi
         ;;
     esac
@@ -7392,11 +7911,11 @@ if test "$_lt_disable_FC" != yes; then
 
     AC_MSG_CHECKING([whether to build static libraries])
     # Make sure either enable_shared or enable_static is yes.
-    test "$enable_shared" = yes || enable_static=yes
+    test yes = "$enable_shared" || enable_static=yes
     AC_MSG_RESULT([$enable_static])
 
-    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
-    _LT_TAGVAR(LD, $1)="$LD"
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
 
     ## CAVEAT EMPTOR:
     ## There is no encapsulation within the following macros, do not change
@@ -7416,7 +7935,7 @@ if test "$_lt_disable_FC" != yes; then
   GCC=$lt_save_GCC
   CC=$lt_save_CC
   CFLAGS=$lt_save_CFLAGS
-fi # test "$_lt_disable_FC" != yes
+fi # test yes != "$_lt_disable_FC"
 
 AC_LANG_POP
 ])# _LT_LANG_FC_CONFIG
@@ -7426,7 +7945,7 @@ AC_LANG_POP
 # --------------------------
 # Ensure that the configuration variables for the GNU Java Compiler compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GCJ_CONFIG],
 [AC_REQUIRE([LT_PROG_GCJ])dnl
 AC_LANG_SAVE
@@ -7460,7 +7979,7 @@ CC=${GCJ-"gcj"}
 CFLAGS=$GCJFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # GCJ did not exist at the time GCC didn't implicitly link libc in.
@@ -7497,7 +8016,7 @@ CFLAGS=$lt_save_CFLAGS
 # --------------------------
 # Ensure that the configuration variables for the GNU Go compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_GO_CONFIG],
 [AC_REQUIRE([LT_PROG_GO])dnl
 AC_LANG_SAVE
@@ -7531,7 +8050,7 @@ CC=${GOC-"gccgo"}
 CFLAGS=$GOFLAGS
 compiler=$CC
 _LT_TAGVAR(compiler, $1)=$CC
-_LT_TAGVAR(LD, $1)="$LD"
+_LT_TAGVAR(LD, $1)=$LD
 _LT_CC_BASENAME([$compiler])
 
 # Go did not exist at the time GCC didn't implicitly link libc in.
@@ -7568,7 +8087,7 @@ CFLAGS=$lt_save_CFLAGS
 # -------------------------
 # Ensure that the configuration variables for the Windows resource compiler
 # are suitably defined.  These variables are subsequently used by _LT_CONFIG
-# to write the compiler configuration to `libtool'.
+# to write the compiler configuration to 'libtool'.
 m4_defun([_LT_LANG_RC_CONFIG],
 [AC_REQUIRE([LT_PROG_RC])dnl
 AC_LANG_SAVE
@@ -7584,7 +8103,7 @@ _LT_TAGVAR(objext, $1)=$objext
 lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
 
 # Code to be used in simple link tests
-lt_simple_link_test_code="$lt_simple_compile_test_code"
+lt_simple_link_test_code=$lt_simple_compile_test_code
 
 # ltmain only uses $CC for tagged configurations so make sure $CC is set.
 _LT_TAG_COMPILER
@@ -7594,7 +8113,7 @@ _LT_COMPILER_BOILERPLATE
 _LT_LINKER_BOILERPLATE
 
 # Allow CC to be a program name with arguments.
-lt_save_CC="$CC"
+lt_save_CC=$CC
 lt_save_CFLAGS=$CFLAGS
 lt_save_GCC=$GCC
 GCC=
@@ -7623,7 +8142,7 @@ AC_DEFUN([LT_PROG_GCJ],
 [m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
   [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
     [AC_CHECK_TOOL(GCJ, gcj,)
-      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
       AC_SUBST(GCJFLAGS)])])[]dnl
 ])
 
@@ -7734,7 +8253,7 @@ lt_ac_count=0
 # Add /usr/xpg4/bin/sed as it is typically found on Solaris
 # along with /bin/sed that truncates output.
 for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
-  test ! -f $lt_ac_sed && continue
+  test ! -f "$lt_ac_sed" && continue
   cat /dev/null > conftest.in
   lt_ac_count=0
   echo $ECHO_N "0123456789$ECHO_C" >conftest.in
@@ -7751,9 +8270,9 @@ for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
     $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
     cmp -s conftest.out conftest.nl || break
     # 10000 chars as input seems more than enough
-    test $lt_ac_count -gt 10 && break
+    test 10 -lt "$lt_ac_count" && break
     lt_ac_count=`expr $lt_ac_count + 1`
-    if test $lt_ac_count -gt $lt_ac_max; then
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
       lt_ac_max=$lt_ac_count
       lt_cv_path_SED=$lt_ac_sed
     fi
@@ -7777,27 +8296,7 @@ dnl AC_DEFUN([LT_AC_PROG_SED], [])
 # Find out whether the shell is Bourne or XSI compatible,
 # or has some other useful features.
 m4_defun([_LT_CHECK_SHELL_FEATURES],
-[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-AC_MSG_RESULT([$xsi_shell])
-_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
-
-AC_MSG_CHECKING([whether the shell understands "+="])
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-AC_MSG_RESULT([$lt_shell_append])
-_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
-
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
   lt_unset=false
@@ -7821,102 +8320,9 @@ _LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
 ])# _LT_CHECK_SHELL_FEATURES
 
 
-# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
-# ------------------------------------------------------
-# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
-# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
-m4_defun([_LT_PROG_FUNCTION_REPLACE],
-[dnl {
-sed -e '/^$1 ()$/,/^} # $1 /c\
-$1 ()\
-{\
-m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
-} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-])
-
-
-# _LT_PROG_REPLACE_SHELLFNS
-# -------------------------
-# Replace existing portable implementations of several shell functions with
-# equivalent extended shell implementations where those features are available..
-m4_defun([_LT_PROG_REPLACE_SHELLFNS],
-[if test x"$xsi_shell" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
-    case ${1} in
-      */*) func_dirname_result="${1%/*}${2}" ;;
-      *  ) func_dirname_result="${3}" ;;
-    esac
-    func_basename_result="${1##*/}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
-    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
-    # positional parameters, so assign one to ordinary parameter first.
-    func_stripname_result=${3}
-    func_stripname_result=${func_stripname_result#"${1}"}
-    func_stripname_result=${func_stripname_result%"${2}"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
-    func_split_long_opt_name=${1%%=*}
-    func_split_long_opt_arg=${1#*=}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
-    func_split_short_opt_arg=${1#??}
-    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
-
-  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
-    case ${1} in
-      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
-      *)    func_lo2o_result=${1} ;;
-    esac])
-
-  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
-
-  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
-
-  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
-
-  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
-    func_quote_for_eval "${2}"
-dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
-    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
-fi
-])
-
 # _LT_PATH_CONVERSION_FUNCTIONS
 # -----------------------------
-# Determine which file name conversion functions should be used by
+# Determine what file name conversion functions should be used by
 # func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
 # for certain cross-compile configurations and native mingw.
 m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
diff --git a/config/ltmain.sh b/config/ltmain.sh
index 63ae69d..147d758 100644
--- a/config/ltmain.sh
+++ b/config/ltmain.sh
@@ -1,9 +1,12 @@
+#! /bin/sh
+## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
+##               by inline-source v2014-01-03.01
 
-# libtool (GNU libtool) 2.4.2
+# libtool (GNU libtool) 2.4.6
+# Provide generalized library-building support services.
 # Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
 
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
-# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# Copyright (C) 1996-2015 Free Software Foundation, Inc.
 # This is free software; see the source for copying conditions.  There is NO
 # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 
@@ -23,881 +26,2112 @@
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html,
-# or obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# Usage: $progname [OPTION]... [MODE-ARG]...
-#
-# Provide generalized library-building support services.
-#
-#       --config             show all configuration variables
-#       --debug              enable verbose shell tracing
-#   -n, --dry-run            display commands without modifying any files
-#       --features           display basic configuration information and exit
-#       --mode=MODE          use operation mode MODE
-#       --preserve-dup-deps  don't remove duplicate dependency libraries
-#       --quiet, --silent    don't print informational messages
-#       --no-quiet, --no-silent
-#                            print informational messages (default)
-#       --no-warn            don't display warning messages
-#       --tag=TAG            use configuration variables from tag TAG
-#   -v, --verbose            print more informational messages than default
-#       --no-verbose         don't print the extra informational messages
-#       --version            print version information
-#   -h, --help, --help-all   print short, long, or detailed help message
-#
-# MODE must be one of the following:
-#
-#         clean              remove files from the build directory
-#         compile            compile a source file into a libtool object
-#         execute            automatically set library path, then run a program
-#         finish             complete the installation of libtool libraries
-#         install            install libraries or executables
-#         link               create a library or an executable
-#         uninstall          remove libraries from an installed directory
-#
-# MODE-ARGS vary depending on the MODE.  When passed as first option,
-# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
-# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
-#
-# When reporting a bug, please describe a test case to reproduce it and
-# include the following information:
-#
-#         host-triplet:	$host
-#         shell:		$SHELL
-#         compiler:		$LTCC
-#         compiler flags:		$LTCFLAGS
-#         linker:		$LD (gnu? $with_gnu_ld)
-#         $progname:	(GNU libtool) 2.4.2
-#         automake:	$automake_version
-#         autoconf:	$autoconf_version
-#
-# Report bugs to <bug-libtool at gnu.org>.
-# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
-# General help using GNU software: <http://www.gnu.org/gethelp/>.
 
 PROGRAM=libtool
 PACKAGE=libtool
-VERSION=2.4.2
-TIMESTAMP=""
-package_revision=1.3337
+VERSION="2.4.6 Debian-2.4.6-0.1"
+package_revision=2.4.6
 
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Run './libtool --help' for help with using this script from the
+# command line.
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# After configure completes, it has a better idea of some of the
+# shell tools we need than the defaults used by the functions shared
+# with bootstrap, so set those here where they can still be over-
+# ridden by the user, but otherwise take precedence.
+
+: ${AUTOCONF="autoconf"}
+: ${AUTOMAKE="automake"}
+
+
+## -------------------------- ##
+## Source external libraries. ##
+## -------------------------- ##
+
+# Much of our low-level functionality needs to be sourced from external
+# libraries, which are installed to $pkgauxdir.
+
+# Set a version string for this script.
+scriptversion=2015-01-20.17; # UTC
+
+# General shell script boiler plate, and helper functions.
+# Written by Gary V. Vaughan, 2004
+
+# Copyright (C) 2004-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# As a special exception to the GNU General Public License, if you distribute
+# this file as part of a program or library that is built using GNU Libtool,
+# you may include this file under the same distribution terms that you use
+# for the rest of that program.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# Evaluate this file near the top of your script to gain access to
+# the functions and variables defined here:
+#
+#   . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh
+#
+# If you need to override any of the default environment variable
+# settings, do that before evaluating this file.
+
+
+## -------------------- ##
+## Shell normalisation. ##
+## -------------------- ##
+
+# Some shells need a little help to be as Bourne compatible as possible.
+# Before doing anything else, make sure all that help has been provided!
+
+DUALCASE=1; export DUALCASE # for MKS sh
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
 else
-  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac
+  case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac
 fi
-BIN_SH=xpg4; export BIN_SH # for Tru64
-DUALCASE=1; export DUALCASE # for MKS sh
-
-# A function that is used when there is no print builtin or printf.
-func_fallback_echo ()
-{
-  eval 'cat <<_LTECHO_EOF
-$1
-_LTECHO_EOF'
-}
 
-# NLS nuisances: We save the old values to restore during execute mode.
-lt_user_locale=
-lt_safe_locale=
-for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+# NLS nuisances: We save the old values in case they are required later.
+_G_user_locale=
+_G_safe_locale=
+for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
 do
-  eval "if test \"\${$lt_var+set}\" = set; then
-          save_$lt_var=\$$lt_var
-          $lt_var=C
-	  export $lt_var
-	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
-	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+  eval "if test set = \"\${$_G_var+set}\"; then
+          save_$_G_var=\$$_G_var
+          $_G_var=C
+	  export $_G_var
+	  _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\"
+	  _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\"
 	fi"
 done
-LC_ALL=C
-LANGUAGE=C
-export LANGUAGE LC_ALL
 
-$lt_unset CDPATH
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
+# Make sure IFS has a sensible default
+sp=' '
+nl='
+'
+IFS="$sp	$nl"
+
+# There are apparently some retarded systems that use ';' as a PATH separator!
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+fi
 
-# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
-# is ksh but when the shell is invoked as "sh" and the current value of
-# the _XPG environment variable is not equal to 1 (one), the special
-# positional parameter $0, within a function call, is the name of the
-# function.
-progpath="$0"
 
 
+## ------------------------- ##
+## Locate command utilities. ##
+## ------------------------- ##
+
+
+# func_executable_p FILE
+# ----------------------
+# Check that FILE is an executable regular file.
+func_executable_p ()
+{
+    test -f "$1" && test -x "$1"
+}
+
+
+# func_path_progs PROGS_LIST CHECK_FUNC [PATH]
+# --------------------------------------------
+# Search for either a program that responds to --version with output
+# containing "GNU", or else returned by CHECK_FUNC otherwise, by
+# trying all the directories in PATH with each of the elements of
+# PROGS_LIST.
+#
+# CHECK_FUNC should accept the path to a candidate program, and
+# set $func_check_prog_result if it truncates its output less than
+# $_G_path_prog_max characters.
+func_path_progs ()
+{
+    _G_progs_list=$1
+    _G_check_func=$2
+    _G_PATH=${3-"$PATH"}
+
+    _G_path_prog_max=0
+    _G_path_prog_found=false
+    _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:}
+    for _G_dir in $_G_PATH; do
+      IFS=$_G_save_IFS
+      test -z "$_G_dir" && _G_dir=.
+      for _G_prog_name in $_G_progs_list; do
+        for _exeext in '' .EXE; do
+          _G_path_prog=$_G_dir/$_G_prog_name$_exeext
+          func_executable_p "$_G_path_prog" || continue
+          case `"$_G_path_prog" --version 2>&1` in
+            *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;;
+            *)     $_G_check_func $_G_path_prog
+		   func_path_progs_result=$func_check_prog_result
+		   ;;
+          esac
+          $_G_path_prog_found && break 3
+        done
+      done
+    done
+    IFS=$_G_save_IFS
+    test -z "$func_path_progs_result" && {
+      echo "no acceptable sed could be found in \$PATH" >&2
+      exit 1
+    }
+}
+
+
+# We want to be able to use the functions in this file before configure
+# has figured out where the best binaries are kept, which means we have
+# to search for them ourselves - except when the results are already set
+# where we skip the searches.
+
+# Unless the user overrides by setting SED, search the path for either GNU
+# sed, or the sed that truncates its output the least.
+test -z "$SED" && {
+  _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+  for _G_i in 1 2 3 4 5 6 7; do
+    _G_sed_script=$_G_sed_script$nl$_G_sed_script
+  done
+  echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed
+  _G_sed_script=
+
+  func_check_prog_sed ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo '' >> conftest.nl
+      "$_G_path_prog" -f conftest.sed <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin
+  rm -f conftest.sed
+  SED=$func_path_progs_result
+}
+
+
+# Unless the user overrides by setting GREP, search the path for either GNU
+# grep, or the grep that truncates its output the least.
+test -z "$GREP" && {
+  func_check_prog_grep ()
+  {
+    _G_path_prog=$1
+
+    _G_count=0
+    _G_path_prog_max=0
+    printf 0123456789 >conftest.in
+    while :
+    do
+      cat conftest.in conftest.in >conftest.tmp
+      mv conftest.tmp conftest.in
+      cp conftest.in conftest.nl
+      echo 'GREP' >> conftest.nl
+      "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' <conftest.nl >conftest.out 2>/dev/null || break
+      diff conftest.out conftest.nl >/dev/null 2>&1 || break
+      _G_count=`expr $_G_count + 1`
+      if test "$_G_count" -gt "$_G_path_prog_max"; then
+        # Best one so far, save it but keep looking for a better one
+        func_check_prog_result=$_G_path_prog
+        _G_path_prog_max=$_G_count
+      fi
+      # 10*(2^10) chars as input seems more than enough
+      test 10 -lt "$_G_count" && break
+    done
+    rm -f conftest.in conftest.tmp conftest.nl conftest.out
+  }
+
+  func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin
+  GREP=$func_path_progs_result
+}
+
+
+## ------------------------------- ##
+## User overridable command paths. ##
+## ------------------------------- ##
+
+# All uppercase variable names are used for environment variables.  These
+# variables can be overridden by the user before calling a script that
+# uses them if a suitable command of that name is not already available
+# in the command search PATH.
 
 : ${CP="cp -f"}
-test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${ECHO="printf %s\n"}
+: ${EGREP="$GREP -E"}
+: ${FGREP="$GREP -F"}
+: ${LN_S="ln -s"}
 : ${MAKE="make"}
 : ${MKDIR="mkdir"}
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 : ${SHELL="${CONFIG_SHELL-/bin/sh}"}
-: ${Xsed="$SED -e 1s/^X//"}
-
-# Global variables:
-EXIT_SUCCESS=0
-EXIT_FAILURE=1
-EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
-EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
-
-exit_status=$EXIT_SUCCESS
-
-# Make sure IFS has a sensible default
-lt_nl='
-'
-IFS=" 	$lt_nl"
 
-dirname="s,/[^/]*$,,"
-basename="s,^.*/,,"
 
-# func_dirname file append nondir_replacement
-# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
-# otherwise set result to NONDIR_REPLACEMENT.
-func_dirname ()
-{
-    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-} # func_dirname may be replaced by extended shell implementation
+## -------------------- ##
+## Useful sed snippets. ##
+## -------------------- ##
 
+sed_dirname='s|/[^/]*$||'
+sed_basename='s|^.*/||'
 
-# func_basename file
-func_basename ()
-{
-    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
-} # func_basename may be replaced by extended shell implementation
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='s|\([`"$\\]\)|\\\1|g'
 
+# Same as above, but do not quote variable references.
+sed_double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# func_dirname_and_basename file append nondir_replacement
-# perform func_basename and func_dirname in a single function
-# call:
-#   dirname:  Compute the dirname of FILE.  If nonempty,
-#             add APPEND to the result, otherwise set result
-#             to NONDIR_REPLACEMENT.
-#             value returned in "$func_dirname_result"
-#   basename: Compute filename of FILE.
-#             value retuned in "$func_basename_result"
-# Implementation must be kept synchronized with func_dirname
-# and func_basename. For efficiency, we do not delegate to
-# those functions but instead duplicate the functionality here.
-func_dirname_and_basename ()
-{
-    # Extract subdirectory from the argument.
-    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
-    if test "X$func_dirname_result" = "X${1}"; then
-      func_dirname_result="${3}"
-    else
-      func_dirname_result="$func_dirname_result${2}"
-    fi
-    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
-} # func_dirname_and_basename may be replaced by extended shell implementation
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g'
 
+# Sed substitution that converts a w32 file name or path
+# that contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-'\' parameter expansions in output of sed_double_quote_subst that
+# were '\'-ed in input to the same.  If an odd number of '\' preceded a
+# '$' in input to sed_double_quote_subst, that '$' was protected from
+# expansion.  Since each input '\' is now two '\'s, look for any number
+# of runs of four '\'s followed by two '\'s and then a '$'.  '\' that '$'.
+_G_bs='\\'
+_G_bs2='\\\\'
+_G_bs4='\\\\\\\\'
+_G_dollar='\$'
+sed_double_backslash="\
+  s/$_G_bs4/&\\
+/g
+  s/^$_G_bs2$_G_dollar/$_G_bs&/
+  s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g
+  s/\n//g"
 
-# func_stripname prefix suffix name
-# strip PREFIX and SUFFIX off of NAME.
-# PREFIX and SUFFIX must not contain globbing or regex special
-# characters, hashes, percent signs, but SUFFIX may contain a leading
-# dot (in which case that matches only a dot).
-# func_strip_suffix prefix name
-func_stripname ()
-{
-    case ${2} in
-      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
-      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
-    esac
-} # func_stripname may be replaced by extended shell implementation
 
+## ----------------- ##
+## Global variables. ##
+## ----------------- ##
 
-# These SED scripts presuppose an absolute path with a trailing slash.
-pathcar='s,^/\([^/]*\).*$,\1,'
-pathcdr='s,^/[^/]*,,'
-removedotparts=':dotsl
-		s@/\./@/@g
-		t dotsl
-		s,/\.$,/,'
-collapseslashes='s@/\{1,\}@/@g'
-finalslash='s,/*$,/,'
+# Except for the global variables explicitly listed below, the following
+# functions in the '^func_' namespace, and the '^require_' namespace
+# variables initialised in the 'Resource management' section, sourcing
+# this file will not pollute your global namespace with anything
+# else. There's no portable way to scope variables in Bourne shell
+# though, so actually running these functions will sometimes place
+# results into a variable named after the function, and often use
+# temporary variables in the '^_G_' namespace. If you are careful to
+# avoid using those namespaces casually in your sourcing script, things
+# should continue to work as you expect. And, of course, you can freely
+# overwrite any of the functions or variables defined here before
+# calling anything to customize them.
 
-# func_normal_abspath PATH
-# Remove doubled-up and trailing slashes, "." path components,
-# and cancel out any ".." path components in PATH after making
-# it an absolute path.
-#             value returned in "$func_normal_abspath_result"
-func_normal_abspath ()
-{
-  # Start from root dir and reassemble the path.
-  func_normal_abspath_result=
-  func_normal_abspath_tpath=$1
-  func_normal_abspath_altnamespace=
-  case $func_normal_abspath_tpath in
-    "")
-      # Empty path, that just means $cwd.
-      func_stripname '' '/' "`pwd`"
-      func_normal_abspath_result=$func_stripname_result
-      return
-    ;;
-    # The next three entries are used to spot a run of precisely
-    # two leading slashes without using negated character classes;
-    # we take advantage of case's first-match behaviour.
-    ///*)
-      # Unusual form of absolute path, do nothing.
-    ;;
-    //*)
-      # Not necessarily an ordinary path; POSIX reserves leading '//'
-      # and for example Cygwin uses it to access remote file shares
-      # over CIFS/SMB, so we conserve a leading double slash if found.
-      func_normal_abspath_altnamespace=/
-    ;;
-    /*)
-      # Absolute path, do nothing.
-    ;;
-    *)
-      # Relative path, prepend $cwd.
-      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
-    ;;
-  esac
-  # Cancel out all the simple stuff to save iterations.  We also want
-  # the path to end with a slash for ease of parsing, so make sure
-  # there is one (and only one) here.
-  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
-  while :; do
-    # Processed it all yet?
-    if test "$func_normal_abspath_tpath" = / ; then
-      # If we ascended to the root using ".." the result may be empty now.
-      if test -z "$func_normal_abspath_result" ; then
-        func_normal_abspath_result=/
-      fi
-      break
-    fi
-    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcar"`
-    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
-        -e "$pathcdr"`
-    # Figure out what to do with it
-    case $func_normal_abspath_tcomponent in
-      "")
-        # Trailing empty path component, ignore it.
-      ;;
-      ..)
-        # Parent dir; strip last assembled component from result.
-        func_dirname "$func_normal_abspath_result"
-        func_normal_abspath_result=$func_dirname_result
-      ;;
-      *)
-        # Actual path component, append it.
-        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
-      ;;
-    esac
-  done
-  # Restore leading double-slash if one was found on entry.
-  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
-}
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
 
-# func_relative_path SRCDIR DSTDIR
-# generates a relative path from SRCDIR to DSTDIR, with a trailing
-# slash if non-empty, suitable for immediately appending a filename
-# without needing to append a separator.
-#             value returned in "$func_relative_path_result"
-func_relative_path ()
-{
-  func_relative_path_result=
-  func_normal_abspath "$1"
-  func_relative_path_tlibdir=$func_normal_abspath_result
-  func_normal_abspath "$2"
-  func_relative_path_tbindir=$func_normal_abspath_result
-
-  # Ascend the tree starting from libdir
-  while :; do
-    # check if we have found a prefix of bindir
-    case $func_relative_path_tbindir in
-      $func_relative_path_tlibdir)
-        # found an exact match
-        func_relative_path_tcancelled=
-        break
-        ;;
-      $func_relative_path_tlibdir*)
-        # found a matching prefix
-        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
-        func_relative_path_tcancelled=$func_stripname_result
-        if test -z "$func_relative_path_result"; then
-          func_relative_path_result=.
-        fi
-        break
-        ;;
-      *)
-        func_dirname $func_relative_path_tlibdir
-        func_relative_path_tlibdir=${func_dirname_result}
-        if test "x$func_relative_path_tlibdir" = x ; then
-          # Have to descend all the way to the root!
-          func_relative_path_result=../$func_relative_path_result
-          func_relative_path_tcancelled=$func_relative_path_tbindir
-          break
-        fi
-        func_relative_path_result=../$func_relative_path_result
-        ;;
-    esac
-  done
+# Allow overriding, eg assuming that you follow the convention of
+# putting '$debug_cmd' at the start of all your functions, you can get
+# bash to show function call trace with:
+#
+#    debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name
+debug_cmd=${debug_cmd-":"}
+exit_cmd=:
 
-  # Now calculate path; take care to avoid doubling-up slashes.
-  func_stripname '' '/' "$func_relative_path_result"
-  func_relative_path_result=$func_stripname_result
-  func_stripname '/' '/' "$func_relative_path_tcancelled"
-  if test "x$func_stripname_result" != x ; then
-    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
-  fi
+# By convention, finish your script with:
+#
+#    exit $exit_status
+#
+# so that you can set exit_status to non-zero if you want to indicate
+# something went wrong during execution without actually bailing out at
+# the point of failure.
+exit_status=$EXIT_SUCCESS
 
-  # Normalisation. If bindir is libdir, return empty string,
-  # else relative path ending with a slash; either way, target
-  # file name can be directly appended.
-  if test ! -z "$func_relative_path_result"; then
-    func_stripname './' '' "$func_relative_path_result/"
-    func_relative_path_result=$func_stripname_result
-  fi
-}
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath=$0
 
-# The name of this program:
-func_dirname_and_basename "$progpath"
-progname=$func_basename_result
+# The name of this program.
+progname=`$ECHO "$progpath" |$SED "$sed_basename"`
 
-# Make sure we have an absolute path for reexecution:
+# Make sure we have an absolute progpath for reexecution:
 case $progpath in
   [\\/]*|[A-Za-z]:\\*) ;;
   *[\\/]*)
-     progdir=$func_dirname_result
+     progdir=`$ECHO "$progpath" |$SED "$sed_dirname"`
      progdir=`cd "$progdir" && pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
   *)
-     save_IFS="$IFS"
+     _G_IFS=$IFS
      IFS=${PATH_SEPARATOR-:}
      for progdir in $PATH; do
-       IFS="$save_IFS"
+       IFS=$_G_IFS
        test -x "$progdir/$progname" && break
      done
-     IFS="$save_IFS"
+     IFS=$_G_IFS
      test -n "$progdir" || progdir=`pwd`
-     progpath="$progdir/$progname"
+     progpath=$progdir/$progname
      ;;
 esac
 
-# Sed substitution that helps us do robust quoting.  It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed="${SED}"' -e 1s/^X//'
-sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\(["`\\]\)/\\\1/g'
 
-# Sed substitution that turns a string into a regex matching for the
-# string literally.
-sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+## ----------------- ##
+## Standard options. ##
+## ----------------- ##
 
-# Sed substitution that converts a w32 file name or path
-# which contains forward slashes, into one that contains
-# (escaped) backslashes.  A very naive implementation.
-lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
-
-# Re-`\' parameter expansions in output of double_quote_subst that were
-# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
-# in input to double_quote_subst, that '$' was protected from expansion.
-# Since each input `\' is now two `\'s, look for any number of runs of
-# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
-bs='\\'
-bs2='\\\\'
-bs4='\\\\\\\\'
-dollar='\$'
-sed_double_backslash="\
-  s/$bs4/&\\
-/g
-  s/^$bs2$dollar/$bs&/
-  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
-  s/\n//g"
+# The following options affect the operation of the functions defined
+# below, and should be set appropriately depending on run-time para-
+# meters passed on the command line.
 
-# Standard options:
 opt_dry_run=false
-opt_help=false
 opt_quiet=false
 opt_verbose=false
-opt_warning=:
 
-# func_echo arg...
-# Echo program name prefixed message, along with the current mode
-# name if it has been set yet.
-func_echo ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
-}
+# Categories 'all' and 'none' are always available.  Append any others
+# you will pass as the first argument to func_warning from your own
+# code.
+warning_categories=
 
-# func_verbose arg...
-# Echo program name prefixed message in verbose mode only.
-func_verbose ()
-{
-    $opt_verbose && func_echo ${1+"$@"}
+# By default, display warnings according to 'opt_warning_types'.  Set
+# 'warning_func'  to ':' to elide all warnings, or func_fatal_error to
+# treat the next displayed warning as a fatal error.
+warning_func=func_warn_and_continue
 
-    # A bug in bash halts the script if the last line of a function
-    # fails when set -e is in force, so we need another command to
-    # work around that:
-    :
-}
+# Set to 'all' to display all warnings, 'none' to suppress all
+# warnings, or a space delimited list of some subset of
+# 'warning_categories' to display only the listed warnings.
+opt_warning_types=all
 
-# func_echo_all arg...
-# Invoke $ECHO with all args, space-separated.
-func_echo_all ()
-{
-    $ECHO "$*"
-}
 
-# func_error arg...
-# Echo program name prefixed message to standard error.
-func_error ()
-{
-    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
-}
+## -------------------- ##
+## Resource management. ##
+## -------------------- ##
 
-# func_warning arg...
-# Echo program name prefixed warning message to standard error.
-func_warning ()
-{
-    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+# This section contains definitions for functions that each ensure a
+# particular resource (a file, or a non-empty configuration variable for
+# example) is available, and if appropriate to extract default values
+# from pertinent package files. Call them using their associated
+# 'require_*' variable to ensure that they are executed, at most, once.
+#
+# It's entirely deliberate that calling these functions can set
+# variables that don't obey the namespace limitations obeyed by the rest
+# of this file, in order that that they be as useful as possible to
+# callers.
 
-    # bash bug again:
-    :
-}
 
-# func_fatal_error arg...
-# Echo program name prefixed message to standard error, and exit.
-func_fatal_error ()
+# require_term_colors
+# -------------------
+# Allow display of bold text on terminals that support it.
+require_term_colors=func_require_term_colors
+func_require_term_colors ()
 {
-    func_error ${1+"$@"}
-    exit $EXIT_FAILURE
-}
+    $debug_cmd
+
+    test -t 1 && {
+      # COLORTERM and USE_ANSI_COLORS environment variables take
+      # precedence, because most terminfo databases neglect to describe
+      # whether color sequences are supported.
+      test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"}
+
+      if test 1 = "$USE_ANSI_COLORS"; then
+        # Standard ANSI escape sequences
+        tc_reset=''
+        tc_bold='';   tc_standout=''
+        tc_red='';   tc_green=''
+        tc_blue='';  tc_cyan=''
+      else
+        # Otherwise trust the terminfo database after all.
+        test -n "`tput sgr0 2>/dev/null`" && {
+          tc_reset=`tput sgr0`
+          test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold`
+          tc_standout=$tc_bold
+          test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso`
+          test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1`
+          test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2`
+          test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4`
+          test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5`
+        }
+      fi
+    }
 
-# func_fatal_help arg...
-# Echo program name prefixed message to standard error, followed by
-# a help hint, and exit.
-func_fatal_help ()
-{
-    func_error ${1+"$@"}
-    func_fatal_error "$help"
+    require_term_colors=:
 }
-help="Try \`$progname --help' for more information."  ## default
 
 
-# func_grep expression filename
+## ----------------- ##
+## Function library. ##
+## ----------------- ##
+
+# This section contains a variety of useful functions to call in your
+# scripts. Take note of the portable wrappers for features provided by
+# some modern shells, which will fall back to slower equivalents on
+# less featureful shells.
+
+
+# func_append VAR VALUE
+# ---------------------
+# Append VALUE onto the existing contents of VAR.
+
+  # We should try to minimise forks, especially on Windows where they are
+  # unreasonably slow, so skip the feature probes when bash or zsh are
+  # being used:
+  if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then
+    : ${_G_HAVE_ARITH_OP="yes"}
+    : ${_G_HAVE_XSI_OPS="yes"}
+    # The += operator was introduced in bash 3.1
+    case $BASH_VERSION in
+      [12].* | 3.0 | 3.0*) ;;
+      *)
+        : ${_G_HAVE_PLUSEQ_OP="yes"}
+        ;;
+    esac
+  fi
+
+  # _G_HAVE_PLUSEQ_OP
+  # Can be empty, in which case the shell is probed, "yes" if += is
+  # useable or anything else if it does not work.
+  test -z "$_G_HAVE_PLUSEQ_OP" \
+    && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \
+    && _G_HAVE_PLUSEQ_OP=yes
+
+if test yes = "$_G_HAVE_PLUSEQ_OP"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_append ()
+  {
+    $debug_cmd
+
+    eval "$1+=\$2"
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_append ()
+  {
+    $debug_cmd
+
+    eval "$1=\$$1\$2"
+  }
+fi
+
+
+# func_append_quoted VAR VALUE
+# ----------------------------
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+if test yes = "$_G_HAVE_PLUSEQ_OP"; then
+  eval 'func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1+=\\ \$func_quote_for_eval_result"
+  }'
+else
+  func_append_quoted ()
+  {
+    $debug_cmd
+
+    func_quote_for_eval "$2"
+    eval "$1=\$$1\\ \$func_quote_for_eval_result"
+  }
+fi
+
+
+# func_append_uniq VAR VALUE
+# --------------------------
+# Append unique VALUE onto the existing contents of VAR, assuming
+# entries are delimited by the first character of VALUE.  For example:
+#
+#   func_append_uniq options " --another-option option-argument"
+#
+# will only append to $options if " --another-option option-argument "
+# is not already present somewhere in $options already (note spaces at
+# each end implied by leading space in second argument).
+func_append_uniq ()
+{
+    $debug_cmd
+
+    eval _G_current_value='`$ECHO $'$1'`'
+    _G_delim=`expr "$2" : '\(.\)'`
+
+    case $_G_delim$_G_current_value$_G_delim in
+      *"$2$_G_delim"*) ;;
+      *) func_append "$@" ;;
+    esac
+}
+
+
+# func_arith TERM...
+# ------------------
+# Set func_arith_result to the result of evaluating TERMs.
+  test -z "$_G_HAVE_ARITH_OP" \
+    && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \
+    && _G_HAVE_ARITH_OP=yes
+
+if test yes = "$_G_HAVE_ARITH_OP"; then
+  eval 'func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=$(( $* ))
+  }'
+else
+  func_arith ()
+  {
+    $debug_cmd
+
+    func_arith_result=`expr "$@"`
+  }
+fi
+
+
+# func_basename FILE
+# ------------------
+# Set func_basename_result to FILE with everything up to and including
+# the last / stripped.
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  # If this shell supports suffix pattern removal, then use it to avoid
+  # forking. Hide the definitions single quotes in case the shell chokes
+  # on unsupported syntax...
+  _b='func_basename_result=${1##*/}'
+  _d='case $1 in
+        */*) func_dirname_result=${1%/*}$2 ;;
+        *  ) func_dirname_result=$3        ;;
+      esac'
+
+else
+  # ...otherwise fall back to using sed.
+  _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`'
+  _d='func_dirname_result=`$ECHO "$1"  |$SED "$sed_dirname"`
+      if test "X$func_dirname_result" = "X$1"; then
+        func_dirname_result=$3
+      else
+        func_append func_dirname_result "$2"
+      fi'
+fi
+
+eval 'func_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+}'
+
+
+# func_dirname FILE APPEND NONDIR_REPLACEMENT
+# -------------------------------------------
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+eval 'func_dirname ()
+{
+    $debug_cmd
+
+    '"$_d"'
+}'
+
+
+# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT
+# --------------------------------------------------------
+# Perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# For efficiency, we do not delegate to the functions above but instead
+# duplicate the functionality here.
+eval 'func_dirname_and_basename ()
+{
+    $debug_cmd
+
+    '"$_b"'
+    '"$_d"'
+}'
+
+
+# func_echo ARG...
+# ----------------
+# Echo program name prefixed message.
+func_echo ()
+{
+    $debug_cmd
+
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
+
+
+# func_echo_all ARG...
+# --------------------
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+
+# func_echo_infix_1 INFIX ARG...
+# ------------------------------
+# Echo program name, followed by INFIX on the first line, with any
+# additional lines not showing INFIX.
+func_echo_infix_1 ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    _G_infix=$1; shift
+    _G_indent=$_G_infix
+    _G_prefix="$progname: $_G_infix: "
+    _G_message=$*
+
+    # Strip color escape sequences before counting printable length
+    for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan"
+    do
+      test -n "$_G_tc" && {
+        _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"`
+        _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"`
+      }
+    done
+    _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`"  " ## exclude from sc_prohibit_nested_quotes
+
+    func_echo_infix_1_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_infix_1_IFS
+      $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2
+      _G_prefix=$_G_indent
+    done
+    IFS=$func_echo_infix_1_IFS
+}
+
+
+# func_error ARG...
+# -----------------
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "  $tc_standout${tc_red}error$tc_reset" "$*" >&2
+}
+
+
+# func_fatal_error ARG...
+# -----------------------
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    $debug_cmd
+
+    func_error "$*"
+    exit $EXIT_FAILURE
+}
+
+
+# func_grep EXPRESSION FILENAME
+# -----------------------------
 # Check whether EXPRESSION matches any line of FILENAME, without output.
 func_grep ()
 {
+    $debug_cmd
+
     $GREP "$1" "$2" >/dev/null 2>&1
 }
 
 
-# func_mkdir_p directory-path
+# func_len STRING
+# ---------------
+# Set func_len_result to the length of STRING. STRING may not
+# start with a hyphen.
+  test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=${#1}
+  }'
+else
+  func_len ()
+  {
+    $debug_cmd
+
+    func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len`
+  }
+fi
+
+
+# func_mkdir_p DIRECTORY-PATH
+# ---------------------------
 # Make sure the entire path to DIRECTORY-PATH is available.
 func_mkdir_p ()
 {
-    my_directory_path="$1"
-    my_dir_list=
+    $debug_cmd
+
+    _G_directory_path=$1
+    _G_dir_list=
 
-    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+    if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then
 
-      # Protect directory names starting with `-'
-      case $my_directory_path in
-        -*) my_directory_path="./$my_directory_path" ;;
+      # Protect directory names starting with '-'
+      case $_G_directory_path in
+        -*) _G_directory_path=./$_G_directory_path ;;
       esac
 
       # While some portion of DIR does not yet exist...
-      while test ! -d "$my_directory_path"; do
+      while test ! -d "$_G_directory_path"; do
         # ...make a list in topmost first order.  Use a colon delimited
 	# list incase some portion of path contains whitespace.
-        my_dir_list="$my_directory_path:$my_dir_list"
+        _G_dir_list=$_G_directory_path:$_G_dir_list
 
         # If the last portion added has no slash in it, the list is done
-        case $my_directory_path in */*) ;; *) break ;; esac
+        case $_G_directory_path in */*) ;; *) break ;; esac
 
         # ...otherwise throw away the child directory and loop
-        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+        _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"`
       done
-      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+      _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'`
 
-      save_mkdir_p_IFS="$IFS"; IFS=':'
-      for my_dir in $my_dir_list; do
-	IFS="$save_mkdir_p_IFS"
-        # mkdir can fail with a `File exist' error if two processes
+      func_mkdir_p_IFS=$IFS; IFS=:
+      for _G_dir in $_G_dir_list; do
+	IFS=$func_mkdir_p_IFS
+        # mkdir can fail with a 'File exist' error if two processes
         # try to create one of the directories concurrently.  Don't
         # stop in that case!
-        $MKDIR "$my_dir" 2>/dev/null || :
+        $MKDIR "$_G_dir" 2>/dev/null || :
       done
-      IFS="$save_mkdir_p_IFS"
+      IFS=$func_mkdir_p_IFS
 
       # Bail out if we (or some other process) failed to create a directory.
-      test -d "$my_directory_path" || \
-        func_fatal_error "Failed to create \`$1'"
+      test -d "$_G_directory_path" || \
+        func_fatal_error "Failed to create '$1'"
     fi
 }
 
 
-# func_mktempdir [string]
+# func_mktempdir [BASENAME]
+# -------------------------
 # Make a temporary directory that won't clash with other running
 # libtool processes, and avoids race conditions if possible.  If
-# given, STRING is the basename for that directory.
+# given, BASENAME is the basename for that directory.
 func_mktempdir ()
 {
-    my_template="${TMPDIR-/tmp}/${1-$progname}"
+    $debug_cmd
+
+    _G_template=${TMPDIR-/tmp}/${1-$progname}
 
-    if test "$opt_dry_run" = ":"; then
+    if test : = "$opt_dry_run"; then
       # Return a directory name, but don't create it in dry-run mode
-      my_tmpdir="${my_template}-$$"
+      _G_tmpdir=$_G_template-$$
     else
 
       # If mktemp works, use that first and foremost
-      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+      _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null`
 
-      if test ! -d "$my_tmpdir"; then
+      if test ! -d "$_G_tmpdir"; then
         # Failing that, at least try and use $RANDOM to avoid a race
-        my_tmpdir="${my_template}-${RANDOM-0}$$"
+        _G_tmpdir=$_G_template-${RANDOM-0}$$
 
-        save_mktempdir_umask=`umask`
+        func_mktempdir_umask=`umask`
         umask 0077
-        $MKDIR "$my_tmpdir"
-        umask $save_mktempdir_umask
+        $MKDIR "$_G_tmpdir"
+        umask $func_mktempdir_umask
       fi
 
       # If we're not in dry-run mode, bomb out on failure
-      test -d "$my_tmpdir" || \
-        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+      test -d "$_G_tmpdir" || \
+        func_fatal_error "cannot create temporary directory '$_G_tmpdir'"
     fi
 
-    $ECHO "$my_tmpdir"
+    $ECHO "$_G_tmpdir"
 }
 
 
-# func_quote_for_eval arg
-# Aesthetically quote ARG to be evaled later.
-# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
-# is double-quoted, suitable for a subsequent eval, whereas
-# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
-# which are still active within double quotes backslashified.
-func_quote_for_eval ()
+# func_normal_abspath PATH
+# ------------------------
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+func_normal_abspath ()
 {
-    case $1 in
-      *[\\\`\"\$]*)
-	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
-      *)
-        func_quote_for_eval_unquoted_result="$1" ;;
-    esac
+    $debug_cmd
 
-    case $func_quote_for_eval_unquoted_result in
-      # Double-quote args containing shell metacharacters to delay
-      # word splitting, command substitution and and variable
-      # expansion for a subsequent eval.
-      # Many Bourne shells cannot handle close brackets correctly
-      # in scan sets, so we specify it separately.
-      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+    # These SED scripts presuppose an absolute path with a trailing slash.
+    _G_pathcar='s|^/\([^/]*\).*$|\1|'
+    _G_pathcdr='s|^/[^/]*||'
+    _G_removedotparts=':dotsl
+		s|/\./|/|g
+		t dotsl
+		s|/\.$|/|'
+    _G_collapseslashes='s|/\{1,\}|/|g'
+    _G_finalslash='s|/*$|/|'
+
+    # Start from root dir and reassemble the path.
+    func_normal_abspath_result=
+    func_normal_abspath_tpath=$1
+    func_normal_abspath_altnamespace=
+    case $func_normal_abspath_tpath in
+      "")
+        # Empty path, that just means $cwd.
+        func_stripname '' '/' "`pwd`"
+        func_normal_abspath_result=$func_stripname_result
+        return
+        ;;
+      # The next three entries are used to spot a run of precisely
+      # two leading slashes without using negated character classes;
+      # we take advantage of case's first-match behaviour.
+      ///*)
+        # Unusual form of absolute path, do nothing.
+        ;;
+      //*)
+        # Not necessarily an ordinary path; POSIX reserves leading '//'
+        # and for example Cygwin uses it to access remote file shares
+        # over CIFS/SMB, so we conserve a leading double slash if found.
+        func_normal_abspath_altnamespace=/
+        ;;
+      /*)
+        # Absolute path, do nothing.
         ;;
       *)
-        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+        # Relative path, prepend $cwd.
+        func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+        ;;
     esac
+
+    # Cancel out all the simple stuff to save iterations.  We also want
+    # the path to end with a slash for ease of parsing, so make sure
+    # there is one (and only one) here.
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"`
+    while :; do
+      # Processed it all yet?
+      if test / = "$func_normal_abspath_tpath"; then
+        # If we ascended to the root using ".." the result may be empty now.
+        if test -z "$func_normal_abspath_result"; then
+          func_normal_abspath_result=/
+        fi
+        break
+      fi
+      func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcar"`
+      func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+          -e "$_G_pathcdr"`
+      # Figure out what to do with it
+      case $func_normal_abspath_tcomponent in
+        "")
+          # Trailing empty path component, ignore it.
+          ;;
+        ..)
+          # Parent dir; strip last assembled component from result.
+          func_dirname "$func_normal_abspath_result"
+          func_normal_abspath_result=$func_dirname_result
+          ;;
+        *)
+          # Actual path component, append it.
+          func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent"
+          ;;
+      esac
+    done
+    # Restore leading double-slash if one was found on entry.
+    func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+
+# func_notquiet ARG...
+# --------------------
+# Echo program name prefixed message only when not in quiet mode.
+func_notquiet ()
+{
+    $debug_cmd
+
+    $opt_quiet || func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+
+# func_relative_path SRCDIR DSTDIR
+# --------------------------------
+# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR.
+func_relative_path ()
+{
+    $debug_cmd
+
+    func_relative_path_result=
+    func_normal_abspath "$1"
+    func_relative_path_tlibdir=$func_normal_abspath_result
+    func_normal_abspath "$2"
+    func_relative_path_tbindir=$func_normal_abspath_result
+
+    # Ascend the tree starting from libdir
+    while :; do
+      # check if we have found a prefix of bindir
+      case $func_relative_path_tbindir in
+        $func_relative_path_tlibdir)
+          # found an exact match
+          func_relative_path_tcancelled=
+          break
+          ;;
+        $func_relative_path_tlibdir*)
+          # found a matching prefix
+          func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+          func_relative_path_tcancelled=$func_stripname_result
+          if test -z "$func_relative_path_result"; then
+            func_relative_path_result=.
+          fi
+          break
+          ;;
+        *)
+          func_dirname $func_relative_path_tlibdir
+          func_relative_path_tlibdir=$func_dirname_result
+          if test -z "$func_relative_path_tlibdir"; then
+            # Have to descend all the way to the root!
+            func_relative_path_result=../$func_relative_path_result
+            func_relative_path_tcancelled=$func_relative_path_tbindir
+            break
+          fi
+          func_relative_path_result=../$func_relative_path_result
+          ;;
+      esac
+    done
+
+    # Now calculate path; take care to avoid doubling-up slashes.
+    func_stripname '' '/' "$func_relative_path_result"
+    func_relative_path_result=$func_stripname_result
+    func_stripname '/' '/' "$func_relative_path_tcancelled"
+    if test -n "$func_stripname_result"; then
+      func_append func_relative_path_result "/$func_stripname_result"
+    fi
+
+    # Normalisation. If bindir is libdir, return '.' else relative path.
+    if test -n "$func_relative_path_result"; then
+      func_stripname './' '' "$func_relative_path_result"
+      func_relative_path_result=$func_stripname_result
+    fi
+
+    test -n "$func_relative_path_result" || func_relative_path_result=.
+
+    :
 }
 
 
-# func_quote_for_expand arg
+# func_quote_for_eval ARG...
+# --------------------------
+# Aesthetically quote ARGs to be evaled later.
+# This function returns two values:
+#   i) func_quote_for_eval_result
+#      double-quoted, suitable for a subsequent eval
+#  ii) func_quote_for_eval_unquoted_result
+#      has all characters that are still active within double
+#      quotes backslashified.
+func_quote_for_eval ()
+{
+    $debug_cmd
+
+    func_quote_for_eval_unquoted_result=
+    func_quote_for_eval_result=
+    while test 0 -lt $#; do
+      case $1 in
+        *[\\\`\"\$]*)
+	  _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;;
+        *)
+          _G_unquoted_arg=$1 ;;
+      esac
+      if test -n "$func_quote_for_eval_unquoted_result"; then
+	func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg"
+      else
+        func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg"
+      fi
+
+      case $_G_unquoted_arg in
+        # Double-quote args containing shell metacharacters to delay
+        # word splitting, command substitution and variable expansion
+        # for a subsequent eval.
+        # Many Bourne shells cannot handle close brackets correctly
+        # in scan sets, so we specify it separately.
+        *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+          _G_quoted_arg=\"$_G_unquoted_arg\"
+          ;;
+        *)
+          _G_quoted_arg=$_G_unquoted_arg
+	  ;;
+      esac
+
+      if test -n "$func_quote_for_eval_result"; then
+	func_append func_quote_for_eval_result " $_G_quoted_arg"
+      else
+        func_append func_quote_for_eval_result "$_G_quoted_arg"
+      fi
+      shift
+    done
+}
+
+
+# func_quote_for_expand ARG
+# -------------------------
 # Aesthetically quote ARG to be evaled later; same as above,
 # but do not quote variable references.
 func_quote_for_expand ()
 {
+    $debug_cmd
+
     case $1 in
       *[\\\`\"]*)
-	my_arg=`$ECHO "$1" | $SED \
-	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+	_G_arg=`$ECHO "$1" | $SED \
+	    -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;;
       *)
-        my_arg="$1" ;;
+        _G_arg=$1 ;;
     esac
 
-    case $my_arg in
+    case $_G_arg in
       # Double-quote args containing shell metacharacters to delay
       # word splitting and command substitution for a subsequent eval.
       # Many Bourne shells cannot handle close brackets correctly
       # in scan sets, so we specify it separately.
       *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
-        my_arg="\"$my_arg\""
+        _G_arg=\"$_G_arg\"
         ;;
     esac
 
-    func_quote_for_expand_result="$my_arg"
+    func_quote_for_expand_result=$_G_arg
+}
+
+
+# func_stripname PREFIX SUFFIX NAME
+# ---------------------------------
+# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_stripname ()
+  {
+    $debug_cmd
+
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary variable first.
+    func_stripname_result=$3
+    func_stripname_result=${func_stripname_result#"$1"}
+    func_stripname_result=${func_stripname_result%"$2"}
+  }'
+else
+  func_stripname ()
+  {
+    $debug_cmd
+
+    case $2 in
+      .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;;
+      *)  func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;;
+    esac
+  }
+fi
+
+
+# func_show_eval CMD [FAIL_EXP]
+# -----------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    func_quote_for_expand "$_G_cmd"
+    eval "func_notquiet $func_quote_for_expand_result"
+
+    $opt_dry_run || {
+      eval "$_G_cmd"
+      _G_status=$?
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_show_eval_locale CMD [FAIL_EXP]
+# ------------------------------------
+# Unless opt_quiet is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    $debug_cmd
+
+    _G_cmd=$1
+    _G_fail_exp=${2-':'}
+
+    $opt_quiet || {
+      func_quote_for_expand "$_G_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    $opt_dry_run || {
+      eval "$_G_user_locale
+	    $_G_cmd"
+      _G_status=$?
+      eval "$_G_safe_locale"
+      if test 0 -ne "$_G_status"; then
+	eval "(exit $_G_status); $_G_fail_exp"
+      fi
+    }
+}
+
+
+# func_tr_sh
+# ----------
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+    $debug_cmd
+
+    case $1 in
+    [0-9]* | *[!a-zA-Z0-9_]*)
+      func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'`
+      ;;
+    * )
+      func_tr_sh_result=$1
+      ;;
+    esac
+}
+
+
+# func_verbose ARG...
+# -------------------
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $debug_cmd
+
+    $opt_verbose && func_echo "$*"
+
+    :
+}
+
+
+# func_warn_and_continue ARG...
+# -----------------------------
+# Echo program name prefixed warning message to standard error.
+func_warn_and_continue ()
+{
+    $debug_cmd
+
+    $require_term_colors
+
+    func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2
+}
+
+
+# func_warning CATEGORY ARG...
+# ----------------------------
+# Echo program name prefixed warning message to standard error. Warning
+# messages can be filtered according to CATEGORY, where this function
+# elides messages where CATEGORY is not listed in the global variable
+# 'opt_warning_types'.
+func_warning ()
+{
+    $debug_cmd
+
+    # CATEGORY must be in the warning_categories list!
+    case " $warning_categories " in
+      *" $1 "*) ;;
+      *) func_internal_error "invalid warning category '$1'" ;;
+    esac
+
+    _G_category=$1
+    shift
+
+    case " $opt_warning_types " in
+      *" $_G_category "*) $warning_func ${1+"$@"} ;;
+    esac
 }
 
 
-# func_show_eval cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.
-func_show_eval ()
+# func_sort_ver VER1 VER2
+# -----------------------
+# 'sort -V' is not generally available.
+# Note this deviates from the version comparison in automake
+# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a
+# but this should suffice as we won't be specifying old
+# version formats or redundant trailing .0 in bootstrap.conf.
+# If we did want full compatibility then we should probably
+# use m4_version_compare from autoconf.
+func_sort_ver ()
+{
+    $debug_cmd
+
+    printf '%s\n%s\n' "$1" "$2" \
+      | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n
+}
+
+# func_lt_ver PREV CURR
+# ---------------------
+# Return true if PREV and CURR are in the correct order according to
+# func_sort_ver, otherwise false.  Use it like this:
+#
+#  func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..."
+func_lt_ver ()
+{
+    $debug_cmd
+
+    test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q`
+}
+
+
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
+#! /bin/sh
+
+# Set a version string for this script.
+scriptversion=2014-01-07.03; # UTC
+
+# A portable, pluggable option parser for Bourne shell.
+# Written by Gary V. Vaughan, 2010
+
+# Copyright (C) 2010-2015 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Please report bugs or propose patches to gary at gnu.org.
+
+
+## ------ ##
+## Usage. ##
+## ------ ##
+
+# This file is a library for parsing options in your shell scripts along
+# with assorted other useful supporting features that you can make use
+# of too.
+#
+# For the simplest scripts you might need only:
+#
+#   #!/bin/sh
+#   . relative/path/to/funclib.sh
+#   . relative/path/to/options-parser
+#   scriptversion=1.0
+#   func_options ${1+"$@"}
+#   eval set dummy "$func_options_result"; shift
+#   ...rest of your script...
+#
+# In order for the '--version' option to work, you will need to have a
+# suitably formatted comment like the one at the top of this file
+# starting with '# Written by ' and ending with '# warranty; '.
+#
+# For '-h' and '--help' to work, you will also need a one line
+# description of your script's purpose in a comment directly above the
+# '# Written by ' line, like the one at the top of this file.
+#
+# The default options also support '--debug', which will turn on shell
+# execution tracing (see the comment above debug_cmd below for another
+# use), and '--verbose' and the func_verbose function to allow your script
+# to display verbose messages only when your user has specified
+# '--verbose'.
+#
+# After sourcing this file, you can plug processing for additional
+# options by amending the variables from the 'Configuration' section
+# below, and following the instructions in the 'Option parsing'
+# section further down.
+
+## -------------- ##
+## Configuration. ##
+## -------------- ##
+
+# You should override these variables in your script after sourcing this
+# file so that they reflect the customisations you have added to the
+# option parser.
+
+# The usage line for option parsing errors and the start of '-h' and
+# '--help' output messages. You can embed shell variables for delayed
+# expansion at the time the message is displayed, but you will need to
+# quote other shell meta-characters carefully to prevent them being
+# expanded when the contents are evaled.
+usage='$progpath [OPTION]...'
+
+# Short help message in response to '-h' and '--help'.  Add to this or
+# override it after sourcing this library to reflect the full set of
+# options your script accepts.
+usage_message="\
+       --debug        enable verbose shell tracing
+   -W, --warnings=CATEGORY
+                      report the warnings falling in CATEGORY [all]
+   -v, --verbose      verbosely report processing
+       --version      print version information and exit
+   -h, --help         print short or long help message and exit
+"
+
+# Additional text appended to 'usage_message' in response to '--help'.
+long_help_message="
+Warning categories include:
+       'all'          show all warnings
+       'none'         turn off all the warnings
+       'error'        warnings are treated as fatal errors"
+
+# Help message printed before fatal option parsing errors.
+fatal_help="Try '\$progname --help' for more information."
+
+
+
+## ------------------------- ##
+## Hook function management. ##
+## ------------------------- ##
+
+# This section contains functions for adding, removing, and running hooks
+# to the main code.  A hook is just a named list of of function, that can
+# be run in order later on.
+
+# func_hookable FUNC_NAME
+# -----------------------
+# Declare that FUNC_NAME will run hooks added with
+# 'func_add_hook FUNC_NAME ...'.
+func_hookable ()
+{
+    $debug_cmd
+
+    func_append hookable_fns " $1"
+}
+
+
+# func_add_hook FUNC_NAME HOOK_FUNC
+# ---------------------------------
+# Request that FUNC_NAME call HOOK_FUNC before it returns.  FUNC_NAME must
+# first have been declared "hookable" by a call to 'func_hookable'.
+func_add_hook ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not accept hook functions." ;;
+    esac
+
+    eval func_append ${1}_hooks '" $2"'
+}
+
+
+# func_remove_hook FUNC_NAME HOOK_FUNC
+# ------------------------------------
+# Remove HOOK_FUNC from the list of functions called by FUNC_NAME.
+func_remove_hook ()
+{
+    $debug_cmd
+
+    eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`'
+}
+
+
+# func_run_hooks FUNC_NAME [ARG]...
+# ---------------------------------
+# Run all hook functions registered to FUNC_NAME.
+# It is assumed that the list of hook functions contains nothing more
+# than a whitespace-delimited list of legal shell function names, and
+# no effort is wasted trying to catch shell meta-characters or preserve
+# whitespace.
+func_run_hooks ()
+{
+    $debug_cmd
+
+    case " $hookable_fns " in
+      *" $1 "*) ;;
+      *) func_fatal_error "'$1' does not support hook funcions.n" ;;
+    esac
+
+    eval _G_hook_fns=\$$1_hooks; shift
+
+    for _G_hook in $_G_hook_fns; do
+      eval $_G_hook '"$@"'
+
+      # store returned options list back into positional
+      # parameters for next 'cmd' execution.
+      eval _G_hook_result=\$${_G_hook}_result
+      eval set dummy "$_G_hook_result"; shift
+    done
+
+    func_quote_for_eval ${1+"$@"}
+    func_run_hooks_result=$func_quote_for_eval_result
+}
+
+
+
+## --------------- ##
+## Option parsing. ##
+## --------------- ##
+
+# In order to add your own option parsing hooks, you must accept the
+# full positional parameter list in your hook function, remove any
+# options that you action, and then pass back the remaining unprocessed
+# options in '<hooked_function_name>_result', escaped suitably for
+# 'eval'.  Like this:
+#
+#    my_options_prep ()
+#    {
+#        $debug_cmd
+#
+#        # Extend the existing usage message.
+#        usage_message=$usage_message'
+#      -s, --silent       don'\''t print informational messages
+#    '
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_options_prep_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_options_prep my_options_prep
+#
+#
+#    my_silent_option ()
+#    {
+#        $debug_cmd
+#
+#        # Note that for efficiency, we parse as many options as we can
+#        # recognise in a loop before passing the remainder back to the
+#        # caller on the first unrecognised argument we encounter.
+#        while test $# -gt 0; do
+#          opt=$1; shift
+#          case $opt in
+#            --silent|-s) opt_silent=: ;;
+#            # Separate non-argument short options:
+#            -s*)         func_split_short_opt "$_G_opt"
+#                         set dummy "$func_split_short_opt_name" \
+#                             "-$func_split_short_opt_arg" ${1+"$@"}
+#                         shift
+#                         ;;
+#            *)            set dummy "$_G_opt" "$*"; shift; break ;;
+#          esac
+#        done
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_silent_option_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_parse_options my_silent_option
+#
+#
+#    my_option_validation ()
+#    {
+#        $debug_cmd
+#
+#        $opt_silent && $opt_verbose && func_fatal_help "\
+#    '--silent' and '--verbose' options are mutually exclusive."
+#
+#        func_quote_for_eval ${1+"$@"}
+#        my_option_validation_result=$func_quote_for_eval_result
+#    }
+#    func_add_hook func_validate_options my_option_validation
+#
+# You'll alse need to manually amend $usage_message to reflect the extra
+# options you parse.  It's preferable to append if you can, so that
+# multiple option parsing hooks can be added safely.
+
+
+# func_options [ARG]...
+# ---------------------
+# All the functions called inside func_options are hookable. See the
+# individual implementations for details.
+func_hookable func_options
+func_options ()
 {
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+    $debug_cmd
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+    func_options_prep ${1+"$@"}
+    eval func_parse_options \
+        ${func_options_prep_result+"$func_options_prep_result"}
+    eval func_validate_options \
+        ${func_parse_options_result+"$func_parse_options_result"}
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$my_cmd"
-      my_status=$?
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
+    eval func_run_hooks func_options \
+        ${func_validate_options_result+"$func_validate_options_result"}
+
+    # save modified positional parameters for caller
+    func_options_result=$func_run_hooks_result
 }
 
 
-# func_show_eval_locale cmd [fail_exp]
-# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
-# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
-# is given, then evaluate it.  Use the saved locale for evaluation.
-func_show_eval_locale ()
+# func_options_prep [ARG]...
+# --------------------------
+# All initialisations required before starting the option parse loop.
+# Note that when calling hook functions, we pass through the list of
+# positional parameters.  If a hook function modifies that list, and
+# needs to propogate that back to rest of this script, then the complete
+# modified list must be put in 'func_run_hooks_result' before
+# returning.
+func_hookable func_options_prep
+func_options_prep ()
 {
-    my_cmd="$1"
-    my_fail_exp="${2-:}"
+    $debug_cmd
 
-    ${opt_silent-false} || {
-      func_quote_for_expand "$my_cmd"
-      eval "func_echo $func_quote_for_expand_result"
-    }
+    # Option defaults:
+    opt_verbose=false
+    opt_warning_types=
 
-    if ${opt_dry_run-false}; then :; else
-      eval "$lt_user_locale
-	    $my_cmd"
-      my_status=$?
-      eval "$lt_safe_locale"
-      if test "$my_status" -eq 0; then :; else
-	eval "(exit $my_status); $my_fail_exp"
-      fi
-    fi
+    func_run_hooks func_options_prep ${1+"$@"}
+
+    # save modified positional parameters for caller
+    func_options_prep_result=$func_run_hooks_result
 }
 
-# func_tr_sh
-# Turn $1 into a string suitable for a shell variable name.
-# Result is stored in $func_tr_sh_result.  All characters
-# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
-# if $1 begins with a digit, a '_' is prepended as well.
-func_tr_sh ()
+
+# func_parse_options [ARG]...
+# ---------------------------
+# The main option parsing loop.
+func_hookable func_parse_options
+func_parse_options ()
 {
-  case $1 in
-  [0-9]* | *[!a-zA-Z0-9_]*)
-    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
-    ;;
-  * )
-    func_tr_sh_result=$1
-    ;;
-  esac
+    $debug_cmd
+
+    func_parse_options_result=
+
+    # this just eases exit handling
+    while test $# -gt 0; do
+      # Defer to hook functions for initial option parsing, so they
+      # get priority in the event of reusing an option name.
+      func_run_hooks func_parse_options ${1+"$@"}
+
+      # Adjust func_parse_options positional parameters to match
+      eval set dummy "$func_run_hooks_result"; shift
+
+      # Break out of the loop if we already parsed every option.
+      test $# -gt 0 || break
+
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --debug|-x)   debug_cmd='set -x'
+                      func_echo "enabling shell trace mode"
+                      $debug_cmd
+                      ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                      set dummy --warnings none ${1+"$@"}
+                      shift
+		      ;;
+
+        --warnings|--warning|-W)
+                      test $# = 0 && func_missing_arg $_G_opt && break
+                      case " $warning_categories $1" in
+                        *" $1 "*)
+                          # trailing space prevents matching last $1 above
+                          func_append_uniq opt_warning_types " $1"
+                          ;;
+                        *all)
+                          opt_warning_types=$warning_categories
+                          ;;
+                        *none)
+                          opt_warning_types=none
+                          warning_func=:
+                          ;;
+                        *error)
+                          opt_warning_types=$warning_categories
+                          warning_func=func_fatal_error
+                          ;;
+                        *)
+                          func_fatal_error \
+                             "unsupported warning category: '$1'"
+                          ;;
+                      esac
+                      shift
+                      ;;
+
+        --verbose|-v) opt_verbose=: ;;
+        --version)    func_version ;;
+        -\?|-h)       func_usage ;;
+        --help)       func_help ;;
+
+	# Separate optargs to long options (plugins may need this):
+	--*=*)        func_split_equals "$_G_opt"
+	              set dummy "$func_split_equals_lhs" \
+                          "$func_split_equals_rhs" ${1+"$@"}
+                      shift
+                      ;;
+
+       # Separate optargs to short options:
+        -W*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        # Separate non-argument short options:
+        -\?*|-h*|-v*|-x*)
+                      func_split_short_opt "$_G_opt"
+                      set dummy "$func_split_short_opt_name" \
+                          "-$func_split_short_opt_arg" ${1+"$@"}
+                      shift
+                      ;;
+
+        --)           break ;;
+        -*)           func_fatal_help "unrecognised option: '$_G_opt'" ;;
+        *)            set dummy "$_G_opt" ${1+"$@"}; shift; break ;;
+      esac
+    done
+
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    func_parse_options_result=$func_quote_for_eval_result
 }
 
 
-# func_version
-# Echo version message to standard output and exit.
-func_version ()
+# func_validate_options [ARG]...
+# ------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+func_hookable func_validate_options
+func_validate_options ()
 {
-    $opt_debug
+    $debug_cmd
 
-    $SED -n '/(C)/!b go
-	:more
-	/\./!{
-	  N
-	  s/\n# / /
-	  b more
-	}
-	:go
-	/^# '$PROGRAM' (GNU /,/# warranty; / {
-        s/^# //
-	s/^# *$//
-        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
-        p
-     }' < "$progpath"
-     exit $?
+    # Display all warnings if -W was not given.
+    test -n "$opt_warning_types" || opt_warning_types=" $warning_categories"
+
+    func_run_hooks func_validate_options ${1+"$@"}
+
+    # Bail if the options were screwed!
+    $exit_cmd $EXIT_FAILURE
+
+    # save modified positional parameters for caller
+    func_validate_options_result=$func_run_hooks_result
 }
 
-# func_usage
-# Echo short help message to standard output and exit.
-func_usage ()
+
+
+## ----------------- ##
+## Helper functions. ##
+## ----------------- ##
+
+# This section contains the helper functions used by the rest of the
+# hookable option parser framework in ascii-betical order.
+
+
+# func_fatal_help ARG...
+# ----------------------
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
 {
-    $opt_debug
+    $debug_cmd
 
-    $SED -n '/^# Usage:/,/^#  *.*--help/ {
-        s/^# //
-	s/^# *$//
-	s/\$progname/'$progname'/
-	p
-    }' < "$progpath"
-    echo
-    $ECHO "run \`$progname --help | more' for full usage"
-    exit $?
+    eval \$ECHO \""Usage: $usage"\"
+    eval \$ECHO \""$fatal_help"\"
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
 }
 
-# func_help [NOEXIT]
-# Echo long help message to standard output and exit,
-# unless 'noexit' is passed as argument.
+
+# func_help
+# ---------
+# Echo long help message to standard output and exit.
 func_help ()
 {
-    $opt_debug
-
-    $SED -n '/^# Usage:/,/# Report bugs to/ {
-	:print
-        s/^# //
-	s/^# *$//
-	s*\$progname*'$progname'*
-	s*\$host*'"$host"'*
-	s*\$SHELL*'"$SHELL"'*
-	s*\$LTCC*'"$LTCC"'*
-	s*\$LTCFLAGS*'"$LTCFLAGS"'*
-	s*\$LD*'"$LD"'*
-	s/\$with_gnu_ld/'"$with_gnu_ld"'/
-	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
-	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
-	p
-	d
-     }
-     /^# .* home page:/b print
-     /^# General help using/b print
-     ' < "$progpath"
-    ret=$?
-    if test -z "$1"; then
-      exit $ret
-    fi
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message"
+    exit 0
 }
 
-# func_missing_arg argname
+
+# func_missing_arg ARGNAME
+# ------------------------
 # Echo program name prefixed message to standard error and set global
 # exit_cmd.
 func_missing_arg ()
 {
-    $opt_debug
+    $debug_cmd
 
-    func_error "missing argument for $1."
+    func_error "Missing argument for '$1'."
     exit_cmd=exit
 }
 
 
-# func_split_short_opt shortopt
+# func_split_equals STRING
+# ------------------------
+# Set func_split_equals_lhs and func_split_equals_rhs shell variables after
+# splitting STRING at the '=' sign.
+test -z "$_G_HAVE_XSI_OPS" \
+    && (eval 'x=a/b/c;
+      test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \
+    && _G_HAVE_XSI_OPS=yes
+
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=${1%%=*}
+      func_split_equals_rhs=${1#*=}
+      test "x$func_split_equals_lhs" = "x$1" \
+        && func_split_equals_rhs=
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_equals ()
+  {
+      $debug_cmd
+
+      func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'`
+      func_split_equals_rhs=
+      test "x$func_split_equals_lhs" = "x$1" \
+        || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'`
+  }
+fi #func_split_equals
+
+
+# func_split_short_opt SHORTOPT
+# -----------------------------
 # Set func_split_short_opt_name and func_split_short_opt_arg shell
 # variables after splitting SHORTOPT after the 2nd character.
-func_split_short_opt ()
+if test yes = "$_G_HAVE_XSI_OPS"
+then
+  # This is an XSI compatible shell, allowing a faster implementation...
+  eval 'func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_arg=${1#??}
+      func_split_short_opt_name=${1%"$func_split_short_opt_arg"}
+  }'
+else
+  # ...otherwise fall back to using expr, which is often a shell builtin.
+  func_split_short_opt ()
+  {
+      $debug_cmd
+
+      func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'`
+      func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'`
+  }
+fi #func_split_short_opt
+
+
+# func_usage
+# ----------
+# Echo short help message to standard output and exit.
+func_usage ()
 {
-    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
-    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+    $debug_cmd
 
-    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
-    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
-} # func_split_short_opt may be replaced by extended shell implementation
+    func_usage_message
+    $ECHO "Run '$progname --help |${PAGER-more}' for full usage"
+    exit 0
+}
 
 
-# func_split_long_opt longopt
-# Set func_split_long_opt_name and func_split_long_opt_arg shell
-# variables after splitting LONGOPT at the `=' sign.
-func_split_long_opt ()
+# func_usage_message
+# ------------------
+# Echo short help message to standard output.
+func_usage_message ()
 {
-    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
-    my_sed_long_arg='1s/^--[^=]*=//'
+    $debug_cmd
 
-    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
-    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
-} # func_split_long_opt may be replaced by extended shell implementation
+    eval \$ECHO \""Usage: $usage"\"
+    echo
+    $SED -n 's|^# ||
+        /^Written by/{
+          x;p;x
+        }
+	h
+	/^Written by/q' < "$progpath"
+    echo
+    eval \$ECHO \""$usage_message"\"
+}
 
-exit_cmd=:
 
+# func_version
+# ------------
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $debug_cmd
 
+    printf '%s\n' "$progname $scriptversion"
+    $SED -n '
+        /(C)/!b go
+        :more
+        /\./!{
+          N
+          s|\n# | |
+          b more
+        }
+        :go
+        /^# Written by /,/# warranty; / {
+          s|^# ||
+          s|^# *$||
+          s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2|
+          p
+        }
+        /^# Written by / {
+          s|^# ||
+          p
+        }
+        /^warranty; /q' < "$progpath"
 
+    exit $?
+}
 
 
-magic="%%%MAGIC variable%%%"
-magic_exe="%%%MAGIC EXE variable%%%"
+# Local variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC"
+# time-stamp-time-zone: "UTC"
+# End:
 
-# Global variables.
-nonopt=
-preserve_args=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-extracted_archives=
-extracted_serial=0
+# Set a version string.
+scriptversion='(GNU libtool) 2.4.6'
 
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end.  This prevents here-documents from being
-# left over by shells.
-exec_cmd=
 
-# func_append var value
-# Append VALUE to the end of shell variable VAR.
-func_append ()
+# func_echo ARG...
+# ----------------
+# Libtool also displays the current mode in messages, so override
+# funclib.sh func_echo with this custom definition.
+func_echo ()
 {
-    eval "${1}=\$${1}\${2}"
-} # func_append may be replaced by extended shell implementation
+    $debug_cmd
 
-# func_append_quoted var value
-# Quote VALUE and append to the end of shell variable VAR, separated
-# by a space.
-func_append_quoted ()
-{
-    func_quote_for_eval "${2}"
-    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
-} # func_append_quoted may be replaced by extended shell implementation
+    _G_message=$*
+
+    func_echo_IFS=$IFS
+    IFS=$nl
+    for _G_line in $_G_message; do
+      IFS=$func_echo_IFS
+      $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line"
+    done
+    IFS=$func_echo_IFS
+}
 
 
-# func_arith arithmetic-term...
-func_arith ()
+# func_warning ARG...
+# -------------------
+# Libtool warnings are not categorized, so override funclib.sh
+# func_warning with this simpler definition.
+func_warning ()
 {
-    func_arith_result=`expr "${@}"`
-} # func_arith may be replaced by extended shell implementation
+    $debug_cmd
+
+    $warning_func ${1+"$@"}
+}
+
 
+## ---------------- ##
+## Options parsing. ##
+## ---------------- ##
+
+# Hook in the functions to make sure our own options are parsed during
+# the option parsing loop.
+
+usage='$progpath [OPTION]... [MODE-ARG]...'
+
+# Short help message in response to '-h'.
+usage_message="Options:
+       --config             show all configuration variables
+       --debug              enable verbose shell tracing
+   -n, --dry-run            display commands without modifying any files
+       --features           display basic configuration information and exit
+       --mode=MODE          use operation mode MODE
+       --no-warnings        equivalent to '-Wnone'
+       --preserve-dup-deps  don't remove duplicate dependency libraries
+       --quiet, --silent    don't print informational messages
+       --tag=TAG            use configuration variables from tag TAG
+   -v, --verbose            print more informational messages than default
+       --version            print version information
+   -W, --warnings=CATEGORY  report the warnings falling in CATEGORY [all]
+   -h, --help, --help-all   print short, long, or detailed help message
+"
 
-# func_len string
-# STRING may not start with a hyphen.
-func_len ()
+# Additional text appended to 'usage_message' in response to '--help'.
+func_help ()
 {
-    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
-} # func_len may be replaced by extended shell implementation
+    $debug_cmd
+
+    func_usage_message
+    $ECHO "$long_help_message
+
+MODE must be one of the following:
+
+       clean           remove files from the build directory
+       compile         compile a source file into a libtool object
+       execute         automatically set library path, then run a program
+       finish          complete the installation of libtool libraries
+       install         install libraries or executables
+       link            create a library or an executable
+       uninstall       remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE.  When passed as first option,
+'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that.
+Try '$progname --help --mode=MODE' for a more detailed description of MODE.
+
+When reporting a bug, please describe a test case to reproduce it and
+include the following information:
+
+       host-triplet:   $host
+       shell:          $SHELL
+       compiler:       $LTCC
+       compiler flags: $LTCFLAGS
+       linker:         $LD (gnu? $with_gnu_ld)
+       version:        $progname (GNU libtool) 2.4.6
+       automake:       `($AUTOMAKE --version) 2>/dev/null |$SED 1q`
+       autoconf:       `($AUTOCONF --version) 2>/dev/null |$SED 1q`
+
+Report bugs to <bug-libtool at gnu.org>.
+GNU libtool home page: <http://www.gnu.org/s/libtool/>.
+General help using GNU software: <http://www.gnu.org/gethelp/>."
+    exit 0
+}
 
 
-# func_lo2o object
-func_lo2o ()
-{
-    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
-} # func_lo2o may be replaced by extended shell implementation
+# func_lo2o OBJECT-NAME
+# ---------------------
+# Transform OBJECT-NAME from a '.lo' suffix to the platform specific
+# object suffix.
 
+lo2o=s/\\.lo\$/.$objext/
+o2lo=s/\\.$objext\$/.lo/
 
-# func_xform libobj-or-source
-func_xform ()
-{
-    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
-} # func_xform may be replaced by extended shell implementation
+if test yes = "$_G_HAVE_XSI_OPS"; then
+  eval 'func_lo2o ()
+  {
+    case $1 in
+      *.lo) func_lo2o_result=${1%.lo}.$objext ;;
+      *   ) func_lo2o_result=$1               ;;
+    esac
+  }'
+
+  # func_xform LIBOBJ-OR-SOURCE
+  # ---------------------------
+  # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise)
+  # suffix to a '.lo' libtool-object suffix.
+  eval 'func_xform ()
+  {
+    func_xform_result=${1%.*}.lo
+  }'
+else
+  # ...otherwise fall back to using sed.
+  func_lo2o ()
+  {
+    func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"`
+  }
+
+  func_xform ()
+  {
+    func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'`
+  }
+fi
 
 
-# func_fatal_configuration arg...
+# func_fatal_configuration ARG...
+# -------------------------------
 # Echo program name prefixed message to standard error, followed by
 # a configuration failure hint, and exit.
 func_fatal_configuration ()
 {
-    func_error ${1+"$@"}
-    func_error "See the $PACKAGE documentation for more information."
-    func_fatal_error "Fatal configuration error."
+    func__fatal_error ${1+"$@"} \
+      "See the $PACKAGE documentation for more information." \
+      "Fatal configuration error."
 }
 
 
 # func_config
+# -----------
 # Display the configuration for all the tags in this script.
 func_config ()
 {
@@ -915,17 +2149,19 @@ func_config ()
     exit $?
 }
 
+
 # func_features
+# -------------
 # Display the features supported by this script.
 func_features ()
 {
     echo "host: $host"
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       echo "enable shared libraries"
     else
       echo "disable shared libraries"
     fi
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       echo "enable static libraries"
     else
       echo "disable static libraries"
@@ -934,289 +2170,297 @@ func_features ()
     exit $?
 }
 
-# func_enable_tag tagname
+
+# func_enable_tag TAGNAME
+# -----------------------
 # Verify that TAGNAME is valid, and either flag an error and exit, or
 # enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
 # variable here.
 func_enable_tag ()
 {
-  # Global variable:
-  tagname="$1"
+    # Global variable:
+    tagname=$1
 
-  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
-  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
-  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+    re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+    re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+    sed_extractcf=/$re_begincf/,/$re_endcf/p
 
-  # Validate tagname.
-  case $tagname in
-    *[!-_A-Za-z0-9,/]*)
-      func_fatal_error "invalid tag name: $tagname"
-      ;;
-  esac
+    # Validate tagname.
+    case $tagname in
+      *[!-_A-Za-z0-9,/]*)
+        func_fatal_error "invalid tag name: $tagname"
+        ;;
+    esac
 
-  # Don't test for the "default" C tag, as we know it's
-  # there but not specially marked.
-  case $tagname in
-    CC) ;;
+    # Don't test for the "default" C tag, as we know it's
+    # there but not specially marked.
+    case $tagname in
+        CC) ;;
     *)
-      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
-	taglist="$taglist $tagname"
-
-	# Evaluate the configuration.  Be careful to quote the path
-	# and the sed script, to avoid splitting on whitespace, but
-	# also don't use non-portable quotes within backquotes within
-	# quotes we have to do it in 2 steps:
-	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
-	eval "$extractedcf"
-      else
-	func_error "ignoring unknown tag $tagname"
-      fi
-      ;;
-  esac
+        if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	  taglist="$taglist $tagname"
+
+	  # Evaluate the configuration.  Be careful to quote the path
+	  # and the sed script, to avoid splitting on whitespace, but
+	  # also don't use non-portable quotes within backquotes within
+	  # quotes we have to do it in 2 steps:
+	  extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	  eval "$extractedcf"
+        else
+	  func_error "ignoring unknown tag $tagname"
+        fi
+        ;;
+    esac
 }
 
+
 # func_check_version_match
+# ------------------------
 # Ensure that we are using m4 macros, and libtool script from the same
 # release of libtool.
 func_check_version_match ()
 {
-  if test "$package_revision" != "$macro_revision"; then
-    if test "$VERSION" != "$macro_version"; then
-      if test -z "$macro_version"; then
-        cat >&2 <<_LT_EOF
+    if test "$package_revision" != "$macro_revision"; then
+      if test "$VERSION" != "$macro_version"; then
+        if test -z "$macro_version"; then
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from an older release.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      else
-        cat >&2 <<_LT_EOF
+        else
+          cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
 $progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
 $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
 $progname: and run autoconf again.
 _LT_EOF
-      fi
-    else
-      cat >&2 <<_LT_EOF
+        fi
+      else
+        cat >&2 <<_LT_EOF
 $progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
 $progname: but the definition of this LT_INIT comes from revision $macro_revision.
 $progname: You should recreate aclocal.m4 with macros from revision $package_revision
 $progname: of $PACKAGE $VERSION and run autoconf again.
 _LT_EOF
-    fi
+      fi
 
-    exit $EXIT_MISMATCH
-  fi
+      exit $EXIT_MISMATCH
+    fi
 }
 
 
-# Shorthand for --mode=foo, only valid as the first argument
-case $1 in
-clean|clea|cle|cl)
-  shift; set dummy --mode clean ${1+"$@"}; shift
-  ;;
-compile|compil|compi|comp|com|co|c)
-  shift; set dummy --mode compile ${1+"$@"}; shift
-  ;;
-execute|execut|execu|exec|exe|ex|e)
-  shift; set dummy --mode execute ${1+"$@"}; shift
-  ;;
-finish|finis|fini|fin|fi|f)
-  shift; set dummy --mode finish ${1+"$@"}; shift
-  ;;
-install|instal|insta|inst|ins|in|i)
-  shift; set dummy --mode install ${1+"$@"}; shift
-  ;;
-link|lin|li|l)
-  shift; set dummy --mode link ${1+"$@"}; shift
-  ;;
-uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
-  shift; set dummy --mode uninstall ${1+"$@"}; shift
-  ;;
-esac
+# libtool_options_prep [ARG]...
+# -----------------------------
+# Preparation for options parsed by libtool.
+libtool_options_prep ()
+{
+    $debug_mode
 
+    # Option defaults:
+    opt_config=false
+    opt_dlopen=
+    opt_dry_run=false
+    opt_help=false
+    opt_mode=
+    opt_preserve_dup_deps=false
+    opt_quiet=false
 
+    nonopt=
+    preserve_args=
 
-# Option defaults:
-opt_debug=:
-opt_dry_run=false
-opt_config=false
-opt_preserve_dup_deps=false
-opt_features=false
-opt_finish=false
-opt_help=false
-opt_help_all=false
-opt_silent=:
-opt_warning=:
-opt_verbose=:
-opt_silent=false
-opt_verbose=false
+    # Shorthand for --mode=foo, only valid as the first argument
+    case $1 in
+    clean|clea|cle|cl)
+      shift; set dummy --mode clean ${1+"$@"}; shift
+      ;;
+    compile|compil|compi|comp|com|co|c)
+      shift; set dummy --mode compile ${1+"$@"}; shift
+      ;;
+    execute|execut|execu|exec|exe|ex|e)
+      shift; set dummy --mode execute ${1+"$@"}; shift
+      ;;
+    finish|finis|fini|fin|fi|f)
+      shift; set dummy --mode finish ${1+"$@"}; shift
+      ;;
+    install|instal|insta|inst|ins|in|i)
+      shift; set dummy --mode install ${1+"$@"}; shift
+      ;;
+    link|lin|li|l)
+      shift; set dummy --mode link ${1+"$@"}; shift
+      ;;
+    uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+      shift; set dummy --mode uninstall ${1+"$@"}; shift
+      ;;
+    esac
+
+    # Pass back the list of options.
+    func_quote_for_eval ${1+"$@"}
+    libtool_options_prep_result=$func_quote_for_eval_result
+}
+func_add_hook func_options_prep libtool_options_prep
 
 
-# Parse options once, thoroughly.  This comes as soon as possible in the
-# script to make things like `--version' happen as quickly as we can.
+# libtool_parse_options [ARG]...
+# ---------------------------------
+# Provide handling for libtool specific options.
+libtool_parse_options ()
 {
-  # this just eases exit handling
-  while test $# -gt 0; do
-    opt="$1"
-    shift
-    case $opt in
-      --debug|-x)	opt_debug='set -x'
-			func_echo "enabling shell trace mode"
-			$opt_debug
-			;;
-      --dry-run|--dryrun|-n)
-			opt_dry_run=:
-			;;
-      --config)
-			opt_config=:
-func_config
-			;;
-      --dlopen|-dlopen)
-			optarg="$1"
-			opt_dlopen="${opt_dlopen+$opt_dlopen
-}$optarg"
-			shift
-			;;
-      --preserve-dup-deps)
-			opt_preserve_dup_deps=:
-			;;
-      --features)
-			opt_features=:
-func_features
-			;;
-      --finish)
-			opt_finish=:
-set dummy --mode finish ${1+"$@"}; shift
-			;;
-      --help)
-			opt_help=:
-			;;
-      --help-all)
-			opt_help_all=:
-opt_help=': help-all'
-			;;
-      --mode)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_mode="$optarg"
-case $optarg in
-  # Valid mode arguments:
-  clean|compile|execute|finish|install|link|relink|uninstall) ;;
-
-  # Catch anything else as an error
-  *) func_error "invalid argument for $opt"
-     exit_cmd=exit
-     break
-     ;;
-esac
-			shift
-			;;
-      --no-silent|--no-quiet)
-			opt_silent=false
-func_append preserve_args " $opt"
-			;;
-      --no-warning|--no-warn)
-			opt_warning=false
-func_append preserve_args " $opt"
-			;;
-      --no-verbose)
-			opt_verbose=false
-func_append preserve_args " $opt"
-			;;
-      --silent|--quiet)
-			opt_silent=:
-func_append preserve_args " $opt"
-        opt_verbose=false
-			;;
-      --verbose|-v)
-			opt_verbose=:
-func_append preserve_args " $opt"
-opt_silent=false
-			;;
-      --tag)
-			test $# = 0 && func_missing_arg $opt && break
-			optarg="$1"
-			opt_tag="$optarg"
-func_append preserve_args " $opt $optarg"
-func_enable_tag "$optarg"
-			shift
-			;;
-
-      -\?|-h)		func_usage				;;
-      --help)		func_help				;;
-      --version)	func_version				;;
-
-      # Separate optargs to long options:
-      --*=*)
-			func_split_long_opt "$opt"
-			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      # Separate non-argument short options:
-      -\?*|-h*|-n*|-v*)
-			func_split_short_opt "$opt"
-			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
-			shift
-			;;
-
-      --)		break					;;
-      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
-      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
-    esac
-  done
+    $debug_cmd
 
-  # Validate options:
+    # Perform our own loop to consume as many options as possible in
+    # each iteration.
+    while test $# -gt 0; do
+      _G_opt=$1
+      shift
+      case $_G_opt in
+        --dry-run|--dryrun|-n)
+                        opt_dry_run=:
+                        ;;
+
+        --config)       func_config ;;
+
+        --dlopen|-dlopen)
+                        opt_dlopen="${opt_dlopen+$opt_dlopen
+}$1"
+                        shift
+                        ;;
+
+        --preserve-dup-deps)
+                        opt_preserve_dup_deps=: ;;
+
+        --features)     func_features ;;
+
+        --finish)       set dummy --mode finish ${1+"$@"}; shift ;;
+
+        --help)         opt_help=: ;;
+
+        --help-all)     opt_help=': help-all' ;;
+
+        --mode)         test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_mode=$1
+                        case $1 in
+                          # Valid mode arguments:
+                          clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+                          # Catch anything else as an error
+                          *) func_error "invalid argument for $_G_opt"
+                             exit_cmd=exit
+                             break
+                             ;;
+                        esac
+                        shift
+                        ;;
+
+        --no-silent|--no-quiet)
+                        opt_quiet=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-warnings|--no-warning|--no-warn)
+                        opt_warning=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --no-verbose)
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --silent|--quiet)
+                        opt_quiet=:
+                        opt_verbose=false
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+        --tag)          test $# = 0 && func_missing_arg $_G_opt && break
+                        opt_tag=$1
+                        func_append preserve_args " $_G_opt $1"
+                        func_enable_tag "$1"
+                        shift
+                        ;;
+
+        --verbose|-v)   opt_quiet=false
+                        opt_verbose=:
+                        func_append preserve_args " $_G_opt"
+                        ;;
+
+	# An option not handled by this hook function:
+        *)		set dummy "$_G_opt" ${1+"$@"};	shift; break  ;;
+      esac
+    done
 
-  # save first non-option argument
-  if test "$#" -gt 0; then
-    nonopt="$opt"
-    shift
-  fi
 
-  # preserve --debug
-  test "$opt_debug" = : || func_append preserve_args " --debug"
+    # save modified positional parameters for caller
+    func_quote_for_eval ${1+"$@"}
+    libtool_parse_options_result=$func_quote_for_eval_result
+}
+func_add_hook func_parse_options libtool_parse_options
 
-  case $host in
-    *cygwin* | *mingw* | *pw32* | *cegcc*)
-      # don't eliminate duplications in $postdeps and $predeps
-      opt_duplicate_compiler_generated_deps=:
-      ;;
-    *)
-      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
-      ;;
-  esac
 
-  $opt_help || {
-    # Sanity checks first:
-    func_check_version_match
 
-    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
-      func_fatal_configuration "not configured to build any kind of library"
+# libtool_validate_options [ARG]...
+# ---------------------------------
+# Perform any sanity checks on option settings and/or unconsumed
+# arguments.
+libtool_validate_options ()
+{
+    # save first non-option argument
+    if test 0 -lt $#; then
+      nonopt=$1
+      shift
     fi
 
-    # Darwin sucks
-    eval std_shrext=\"$shrext_cmds\"
+    # preserve --debug
+    test : = "$debug_cmd" || func_append preserve_args " --debug"
 
-    # Only execute mode is allowed to have -dlopen flags.
-    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
-      func_error "unrecognized option \`-dlopen'"
-      $ECHO "$help" 1>&2
-      exit $EXIT_FAILURE
-    fi
+    case $host in
+      # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+      # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+      *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+        # don't eliminate duplications in $postdeps and $predeps
+        opt_duplicate_compiler_generated_deps=:
+        ;;
+      *)
+        opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+        ;;
+    esac
 
-    # Change the help message to a mode-specific one.
-    generic_help="$help"
-    help="Try \`$progname --help --mode=$opt_mode' for more information."
-  }
+    $opt_help || {
+      # Sanity checks first:
+      func_check_version_match
 
+      test yes != "$build_libtool_libs" \
+        && test yes != "$build_old_libs" \
+        && func_fatal_configuration "not configured to build any kind of library"
 
-  # Bail if the options were screwed
-  $exit_cmd $EXIT_FAILURE
+      # Darwin sucks
+      eval std_shrext=\"$shrext_cmds\"
+
+      # Only execute mode is allowed to have -dlopen flags.
+      if test -n "$opt_dlopen" && test execute != "$opt_mode"; then
+        func_error "unrecognized option '-dlopen'"
+        $ECHO "$help" 1>&2
+        exit $EXIT_FAILURE
+      fi
+
+      # Change the help message to a mode-specific one.
+      generic_help=$help
+      help="Try '$progname --help --mode=$opt_mode' for more information."
+    }
+
+    # Pass back the unparsed argument list
+    func_quote_for_eval ${1+"$@"}
+    libtool_validate_options_result=$func_quote_for_eval_result
 }
+func_add_hook func_validate_options libtool_validate_options
+
 
+# Process options as early as possible so that --help and --version
+# can return quickly.
+func_options ${1+"$@"}
+eval set dummy "$func_options_result"; shift
 
 
 
@@ -1224,24 +2468,52 @@ func_enable_tag "$optarg"
 ##    Main.    ##
 ## ----------- ##
 
+magic='%%%MAGIC variable%%%'
+magic_exe='%%%MAGIC EXE variable%%%'
+
+# Global variables.
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# func_generated_by_libtool
+# True iff stdin has been generated by Libtool. This function is only
+# a basic sanity check; it will hardly flush out determined imposters.
+func_generated_by_libtool_p ()
+{
+  $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
 # func_lalib_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function is only a basic sanity check; it will hardly flush out
 # determined imposters.
 func_lalib_p ()
 {
     test -f "$1" &&
-      $SED -e 4q "$1" 2>/dev/null \
-        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+      $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_lalib_unsafe_p file
-# True iff FILE is a libtool `.la' library or `.lo' object file.
+# True iff FILE is a libtool '.la' library or '.lo' object file.
 # This function implements the same check as func_lalib_p without
 # resorting to external programs.  To this end, it redirects stdin and
 # closes it afterwards, without saving the original file descriptor.
 # As a safety measure, use it only where a negative result would be
-# fatal anyway.  Works if `file' does not exist.
+# fatal anyway.  Works if 'file' does not exist.
 func_lalib_unsafe_p ()
 {
     lalib_p=no
@@ -1249,13 +2521,13 @@ func_lalib_unsafe_p ()
 	for lalib_p_l in 1 2 3 4
 	do
 	    read lalib_p_line
-	    case "$lalib_p_line" in
+	    case $lalib_p_line in
 		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
 	    esac
 	done
 	exec 0<&5 5<&-
     fi
-    test "$lalib_p" = yes
+    test yes = "$lalib_p"
 }
 
 # func_ltwrapper_script_p file
@@ -1264,7 +2536,8 @@ func_lalib_unsafe_p ()
 # determined imposters.
 func_ltwrapper_script_p ()
 {
-    func_lalib_p "$1"
+    test -f "$1" &&
+      $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p
 }
 
 # func_ltwrapper_executable_p file
@@ -1289,7 +2562,7 @@ func_ltwrapper_scriptname ()
 {
     func_dirname_and_basename "$1" "" "."
     func_stripname '' '.exe' "$func_basename_result"
-    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+    func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper
 }
 
 # func_ltwrapper_p file
@@ -1308,11 +2581,13 @@ func_ltwrapper_p ()
 # FAIL_CMD may read-access the current command in variable CMD!
 func_execute_cmds ()
 {
-    $opt_debug
+    $debug_cmd
+
     save_ifs=$IFS; IFS='~'
     for cmd in $1; do
-      IFS=$save_ifs
+      IFS=$sp$nl
       eval cmd=\"$cmd\"
+      IFS=$save_ifs
       func_show_eval "$cmd" "${2-:}"
     done
     IFS=$save_ifs
@@ -1324,10 +2599,11 @@ func_execute_cmds ()
 # Note that it is not necessary on cygwin/mingw to append a dot to
 # FILE even if both FILE and FILE.exe exist: automatic-append-.exe
 # behavior happens only for exec(3), not for open(2)!  Also, sourcing
-# `FILE.' does not work on cygwin managed mounts.
+# 'FILE.' does not work on cygwin managed mounts.
 func_source ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $1 in
     */* | *\\*)	. "$1" ;;
     *)		. "./$1" ;;
@@ -1354,10 +2630,10 @@ func_resolve_sysroot ()
 # store the result into func_replace_sysroot_result.
 func_replace_sysroot ()
 {
-  case "$lt_sysroot:$1" in
+  case $lt_sysroot:$1 in
   ?*:"$lt_sysroot"*)
     func_stripname "$lt_sysroot" '' "$1"
-    func_replace_sysroot_result="=$func_stripname_result"
+    func_replace_sysroot_result='='$func_stripname_result
     ;;
   *)
     # Including no sysroot.
@@ -1374,7 +2650,8 @@ func_replace_sysroot ()
 # arg is usually of the form 'gcc ...'
 func_infer_tag ()
 {
-    $opt_debug
+    $debug_cmd
+
     if test -n "$available_tags" && test -z "$tagname"; then
       CC_quoted=
       for arg in $CC; do
@@ -1393,7 +2670,7 @@ func_infer_tag ()
 	for z in $available_tags; do
 	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
 	    # Evaluate the configuration.
-	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
 	    CC_quoted=
 	    for arg in $CC; do
 	      # Double-quote args containing other shell metacharacters.
@@ -1418,7 +2695,7 @@ func_infer_tag ()
 	# line option must be used.
 	if test -z "$tagname"; then
 	  func_echo "unable to infer tagged configuration"
-	  func_fatal_error "specify a tag with \`--tag'"
+	  func_fatal_error "specify a tag with '--tag'"
 #	else
 #	  func_verbose "using $tagname tagged configuration"
 	fi
@@ -1434,15 +2711,15 @@ func_infer_tag ()
 # but don't create it if we're doing a dry run.
 func_write_libtool_object ()
 {
-    write_libobj=${1}
-    if test "$build_libtool_libs" = yes; then
-      write_lobj=\'${2}\'
+    write_libobj=$1
+    if test yes = "$build_libtool_libs"; then
+      write_lobj=\'$2\'
     else
       write_lobj=none
     fi
 
-    if test "$build_old_libs" = yes; then
-      write_oldobj=\'${3}\'
+    if test yes = "$build_old_libs"; then
+      write_oldobj=\'$3\'
     else
       write_oldobj=none
     fi
@@ -1450,7 +2727,7 @@ func_write_libtool_object ()
     $opt_dry_run || {
       cat >${write_libobj}T <<EOF
 # $write_libobj - a libtool object file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -1462,7 +2739,7 @@ pic_object=$write_lobj
 non_pic_object=$write_oldobj
 
 EOF
-      $MV "${write_libobj}T" "${write_libobj}"
+      $MV "${write_libobj}T" "$write_libobj"
     }
 }
 
@@ -1482,8 +2759,9 @@ EOF
 # be empty on error (or when ARG is empty)
 func_convert_core_file_wine_to_w32 ()
 {
-  $opt_debug
-  func_convert_core_file_wine_to_w32_result="$1"
+  $debug_cmd
+
+  func_convert_core_file_wine_to_w32_result=$1
   if test -n "$1"; then
     # Unfortunately, winepath does not exit with a non-zero error code, so we
     # are forced to check the contents of stdout. On the other hand, if the
@@ -1491,9 +2769,9 @@ func_convert_core_file_wine_to_w32 ()
     # *an error message* to stdout. So we must check for both error code of
     # zero AND non-empty stdout, which explains the odd construction:
     func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
-    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+    if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then
       func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
-        $SED -e "$lt_sed_naive_backslashify"`
+        $SED -e "$sed_naive_backslashify"`
     else
       func_convert_core_file_wine_to_w32_result=
     fi
@@ -1514,18 +2792,19 @@ func_convert_core_file_wine_to_w32 ()
 # are convertible, then the result may be empty.
 func_convert_core_path_wine_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # unfortunately, winepath doesn't convert paths, only file names
-  func_convert_core_path_wine_to_w32_result=""
+  func_convert_core_path_wine_to_w32_result=
   if test -n "$1"; then
     oldIFS=$IFS
     IFS=:
     for func_convert_core_path_wine_to_w32_f in $1; do
       IFS=$oldIFS
       func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
-      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+      if test -n "$func_convert_core_file_wine_to_w32_result"; then
         if test -z "$func_convert_core_path_wine_to_w32_result"; then
-          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+          func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result
         else
           func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
         fi
@@ -1554,7 +2833,8 @@ func_convert_core_path_wine_to_w32 ()
 # environment variable; do not put it in $PATH.
 func_cygpath ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
     func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
     if test "$?" -ne 0; then
@@ -1563,7 +2843,7 @@ func_cygpath ()
     fi
   else
     func_cygpath_result=
-    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+    func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'"
   fi
 }
 #end: func_cygpath
@@ -1574,10 +2854,11 @@ func_cygpath ()
 # result in func_convert_core_msys_to_w32_result.
 func_convert_core_msys_to_w32 ()
 {
-  $opt_debug
+  $debug_cmd
+
   # awkward: cmd appends spaces to result
   func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
-    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+    $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"`
 }
 #end: func_convert_core_msys_to_w32
 
@@ -1588,13 +2869,14 @@ func_convert_core_msys_to_w32 ()
 # func_to_host_file_result to ARG1).
 func_convert_file_check ()
 {
-  $opt_debug
-  if test -z "$2" && test -n "$1" ; then
+  $debug_cmd
+
+  if test -z "$2" && test -n "$1"; then
     func_error "Could not determine host file name corresponding to"
-    func_error "  \`$1'"
+    func_error "  '$1'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback:
-    func_to_host_file_result="$1"
+    func_to_host_file_result=$1
   fi
 }
 # end func_convert_file_check
@@ -1606,10 +2888,11 @@ func_convert_file_check ()
 # func_to_host_file_result to a simplistic fallback value (see below).
 func_convert_path_check ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$4" && test -n "$3"; then
     func_error "Could not determine the host path corresponding to"
-    func_error "  \`$3'"
+    func_error "  '$3'"
     func_error "Continuing, but uninstalled executables may not work."
     # Fallback.  This is a deliberately simplistic "conversion" and
     # should not be "improved".  See libtool.info.
@@ -1618,7 +2901,7 @@ func_convert_path_check ()
       func_to_host_path_result=`echo "$3" |
         $SED -e "$lt_replace_pathsep_chars"`
     else
-      func_to_host_path_result="$3"
+      func_to_host_path_result=$3
     fi
   fi
 }
@@ -1630,9 +2913,10 @@ func_convert_path_check ()
 # and appending REPL if ORIG matches BACKPAT.
 func_convert_path_front_back_pathsep ()
 {
-  $opt_debug
+  $debug_cmd
+
   case $4 in
-  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+  $1 ) func_to_host_path_result=$3$func_to_host_path_result
     ;;
   esac
   case $4 in
@@ -1646,7 +2930,7 @@ func_convert_path_front_back_pathsep ()
 ##################################################
 # $build to $host FILE NAME CONVERSION FUNCTIONS #
 ##################################################
-# invoked via `$to_host_file_cmd ARG'
+# invoked via '$to_host_file_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # Result will be available in $func_to_host_file_result.
@@ -1657,7 +2941,8 @@ func_convert_path_front_back_pathsep ()
 # in func_to_host_file_result.
 func_to_host_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   $to_host_file_cmd "$1"
 }
 # end func_to_host_file
@@ -1669,7 +2954,8 @@ func_to_host_file ()
 # in (the comma separated) LAZY, no conversion takes place.
 func_to_tool_file ()
 {
-  $opt_debug
+  $debug_cmd
+
   case ,$2, in
     *,"$to_tool_file_cmd",*)
       func_to_tool_file_result=$1
@@ -1687,7 +2973,7 @@ func_to_tool_file ()
 # Copy ARG to func_to_host_file_result.
 func_convert_file_noop ()
 {
-  func_to_host_file_result="$1"
+  func_to_host_file_result=$1
 }
 # end func_convert_file_noop
 
@@ -1698,11 +2984,12 @@ func_convert_file_noop ()
 # func_to_host_file_result.
 func_convert_file_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result=$func_convert_core_msys_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1714,8 +3001,9 @@ func_convert_file_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_file_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
     # LT_CYGPATH in this case.
@@ -1731,11 +3019,12 @@ func_convert_file_cygwin_to_w32 ()
 # and a working winepath. Returns result in func_to_host_file_result.
 func_convert_file_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_file_wine_to_w32 "$1"
-    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result=$func_convert_core_file_wine_to_w32_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1747,12 +3036,13 @@ func_convert_file_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_file_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     func_convert_core_msys_to_w32 "$1"
     func_cygpath -u "$func_convert_core_msys_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1765,13 +3055,14 @@ func_convert_file_msys_to_cygwin ()
 # in func_to_host_file_result.
 func_convert_file_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_file_result="$1"
+  $debug_cmd
+
+  func_to_host_file_result=$1
   if test -n "$1"; then
     # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
     func_convert_core_file_wine_to_w32 "$1"
     func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
-    func_to_host_file_result="$func_cygpath_result"
+    func_to_host_file_result=$func_cygpath_result
   fi
   func_convert_file_check "$1" "$func_to_host_file_result"
 }
@@ -1781,7 +3072,7 @@ func_convert_file_nix_to_cygwin ()
 #############################################
 # $build to $host PATH CONVERSION FUNCTIONS #
 #############################################
-# invoked via `$to_host_path_cmd ARG'
+# invoked via '$to_host_path_cmd ARG'
 #
 # In each case, ARG is the path to be converted from $build to $host format.
 # The result will be available in $func_to_host_path_result.
@@ -1805,10 +3096,11 @@ func_convert_file_nix_to_cygwin ()
 to_host_path_cmd=
 func_init_to_host_path_cmd ()
 {
-  $opt_debug
+  $debug_cmd
+
   if test -z "$to_host_path_cmd"; then
     func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
-    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+    to_host_path_cmd=func_convert_path_$func_stripname_result
   fi
 }
 
@@ -1818,7 +3110,8 @@ func_init_to_host_path_cmd ()
 # in func_to_host_path_result.
 func_to_host_path ()
 {
-  $opt_debug
+  $debug_cmd
+
   func_init_to_host_path_cmd
   $to_host_path_cmd "$1"
 }
@@ -1829,7 +3122,7 @@ func_to_host_path ()
 # Copy ARG to func_to_host_path_result.
 func_convert_path_noop ()
 {
-  func_to_host_path_result="$1"
+  func_to_host_path_result=$1
 }
 # end func_convert_path_noop
 
@@ -1840,8 +3133,9 @@ func_convert_path_noop ()
 # func_to_host_path_result.
 func_convert_path_msys_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from ARG.  MSYS
     # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
@@ -1849,7 +3143,7 @@ func_convert_path_msys_to_w32 ()
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result=$func_convert_core_msys_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1863,8 +3157,9 @@ func_convert_path_msys_to_w32 ()
 # func_to_host_file_result.
 func_convert_path_cygwin_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
@@ -1883,14 +3178,15 @@ func_convert_path_cygwin_to_w32 ()
 # a working winepath.  Returns result in func_to_host_file_result.
 func_convert_path_nix_to_w32 ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
-    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result=$func_convert_core_path_wine_to_w32_result
     func_convert_path_check : ";" \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
@@ -1904,15 +3200,16 @@ func_convert_path_nix_to_w32 ()
 # Returns result in func_to_host_file_result.
 func_convert_path_msys_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # See func_convert_path_msys_to_w32:
     func_stripname : : "$1"
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1927,8 +3224,9 @@ func_convert_path_msys_to_cygwin ()
 # func_to_host_file_result.
 func_convert_path_nix_to_cygwin ()
 {
-  $opt_debug
-  func_to_host_path_result="$1"
+  $debug_cmd
+
+  func_to_host_path_result=$1
   if test -n "$1"; then
     # Remove leading and trailing path separator characters from
     # ARG. msys behavior is inconsistent here, cygpath turns them
@@ -1937,7 +3235,7 @@ func_convert_path_nix_to_cygwin ()
     func_to_host_path_tmp1=$func_stripname_result
     func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
     func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
-    func_to_host_path_result="$func_cygpath_result"
+    func_to_host_path_result=$func_cygpath_result
     func_convert_path_check : : \
       "$func_to_host_path_tmp1" "$func_to_host_path_result"
     func_convert_path_front_back_pathsep ":*" "*:" : "$1"
@@ -1946,13 +3244,31 @@ func_convert_path_nix_to_cygwin ()
 # end func_convert_path_nix_to_cygwin
 
 
+# func_dll_def_p FILE
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with _LT_DLL_DEF_P in libtool.m4
+func_dll_def_p ()
+{
+  $debug_cmd
+
+  func_dll_def_p_tmp=`$SED -n \
+    -e 's/^[	 ]*//' \
+    -e '/^\(;.*\)*$/d' \
+    -e 's/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p' \
+    -e q \
+    "$1"`
+  test DEF = "$func_dll_def_p_tmp"
+}
+
+
 # func_mode_compile arg...
 func_mode_compile ()
 {
-    $opt_debug
+    $debug_cmd
+
     # Get the compilation command and the source file.
     base_compile=
-    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    srcfile=$nonopt  #  always keep a non-empty value in "srcfile"
     suppress_opt=yes
     suppress_output=
     arg_mode=normal
@@ -1965,12 +3281,12 @@ func_mode_compile ()
       case $arg_mode in
       arg  )
 	# do not "continue".  Instead, add this to base_compile
-	lastarg="$arg"
+	lastarg=$arg
 	arg_mode=normal
 	;;
 
       target )
-	libobj="$arg"
+	libobj=$arg
 	arg_mode=normal
 	continue
 	;;
@@ -1980,7 +3296,7 @@ func_mode_compile ()
 	case $arg in
 	-o)
 	  test -n "$libobj" && \
-	    func_fatal_error "you cannot specify \`-o' more than once"
+	    func_fatal_error "you cannot specify '-o' more than once"
 	  arg_mode=target
 	  continue
 	  ;;
@@ -2009,12 +3325,12 @@ func_mode_compile ()
 	  func_stripname '-Wc,' '' "$arg"
 	  args=$func_stripname_result
 	  lastarg=
-	  save_ifs="$IFS"; IFS=','
+	  save_ifs=$IFS; IFS=,
 	  for arg in $args; do
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 	    func_append_quoted lastarg "$arg"
 	  done
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
 	  func_stripname ' ' '' "$lastarg"
 	  lastarg=$func_stripname_result
 
@@ -2027,8 +3343,8 @@ func_mode_compile ()
 	  # Accept the current argument as the source file.
 	  # The previous "srcfile" becomes the current argument.
 	  #
-	  lastarg="$srcfile"
-	  srcfile="$arg"
+	  lastarg=$srcfile
+	  srcfile=$arg
 	  ;;
 	esac  #  case $arg
 	;;
@@ -2043,13 +3359,13 @@ func_mode_compile ()
       func_fatal_error "you must specify an argument for -Xcompile"
       ;;
     target)
-      func_fatal_error "you must specify a target with \`-o'"
+      func_fatal_error "you must specify a target with '-o'"
       ;;
     *)
       # Get the name of the library object.
       test -z "$libobj" && {
 	func_basename "$srcfile"
-	libobj="$func_basename_result"
+	libobj=$func_basename_result
       }
       ;;
     esac
@@ -2069,7 +3385,7 @@ func_mode_compile ()
     case $libobj in
     *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
     *)
-      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      func_fatal_error "cannot determine name of library object from '$libobj'"
       ;;
     esac
 
@@ -2078,8 +3394,8 @@ func_mode_compile ()
     for arg in $later; do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes = "$build_libtool_libs" \
+	  || func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	continue
 	;;
@@ -2105,17 +3421,17 @@ func_mode_compile ()
     func_quote_for_eval "$libobj"
     test "X$libobj" != "X$func_quote_for_eval_result" \
       && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
-      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+      && func_warning "libobj name '$libobj' may not contain shell special characters."
     func_dirname_and_basename "$obj" "/" ""
-    objname="$func_basename_result"
-    xdir="$func_dirname_result"
-    lobj=${xdir}$objdir/$objname
+    objname=$func_basename_result
+    xdir=$func_dirname_result
+    lobj=$xdir$objdir/$objname
 
     test -z "$base_compile" && \
       func_fatal_help "you must specify a compilation command"
 
     # Delete any leftover library objects.
-    if test "$build_old_libs" = yes; then
+    if test yes = "$build_old_libs"; then
       removelist="$obj $lobj $libobj ${libobj}T"
     else
       removelist="$lobj $libobj ${libobj}T"
@@ -2127,16 +3443,16 @@ func_mode_compile ()
       pic_mode=default
       ;;
     esac
-    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+    if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then
       # non-PIC code in shared libraries is not supported
       pic_mode=default
     fi
 
     # Calculate the filename of the output object if compiler does
     # not support -o with -c
-    if test "$compiler_c_o" = no; then
-      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
-      lockfile="$output_obj.lock"
+    if test no = "$compiler_c_o"; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext
+      lockfile=$output_obj.lock
     else
       output_obj=
       need_locks=no
@@ -2145,12 +3461,12 @@ func_mode_compile ()
 
     # Lock this critical section if it is needed
     # We use this script file to make the link, it avoids creating a new file
-    if test "$need_locks" = yes; then
+    if test yes = "$need_locks"; then
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
 	sleep 2
       done
-    elif test "$need_locks" = warn; then
+    elif test warn = "$need_locks"; then
       if test -f "$lockfile"; then
 	$ECHO "\
 *** ERROR, $lockfile exists and contains:
@@ -2158,7 +3474,7 @@ func_mode_compile ()
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2180,11 +3496,11 @@ compiler."
     qsrcfile=$func_quote_for_eval_result
 
     # Only build a PIC object if we are building libtool libraries.
-    if test "$build_libtool_libs" = yes; then
+    if test yes = "$build_libtool_libs"; then
       # Without this assignment, base_compile gets emptied.
       fbsd_hideous_sh_bug=$base_compile
 
-      if test "$pic_mode" != no; then
+      if test no != "$pic_mode"; then
 	command="$base_compile $qsrcfile $pic_flag"
       else
 	# Don't build PIC code
@@ -2201,7 +3517,7 @@ compiler."
       func_show_eval_locale "$command"	\
           'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2212,7 +3528,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2228,20 +3544,20 @@ compiler."
       fi
 
       # Allow error messages only from the first compilation.
-      if test "$suppress_opt" = yes; then
+      if test yes = "$suppress_opt"; then
 	suppress_output=' >/dev/null 2>&1'
       fi
     fi
 
     # Only build a position-dependent object if we build old libraries.
-    if test "$build_old_libs" = yes; then
-      if test "$pic_mode" != yes; then
+    if test yes = "$build_old_libs"; then
+      if test yes != "$pic_mode"; then
 	# Don't build PIC code
 	command="$base_compile $qsrcfile$pie_flag"
       else
 	command="$base_compile $qsrcfile $pic_flag"
       fi
-      if test "$compiler_c_o" = yes; then
+      if test yes = "$compiler_c_o"; then
 	func_append command " -o $obj"
       fi
 
@@ -2250,7 +3566,7 @@ compiler."
       func_show_eval_locale "$command" \
         '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
 
-      if test "$need_locks" = warn &&
+      if test warn = "$need_locks" &&
 	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
 	$ECHO "\
 *** ERROR, $lockfile contains:
@@ -2261,7 +3577,7 @@ $srcfile
 
 This indicates that another process is trying to use the same
 temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together.  If you
+your compiler does not support '-c' and '-o' together.  If you
 repeat this compilation, it may succeed, by chance, but you had better
 avoid parallel builds (make -j) in this platform, or get a better
 compiler."
@@ -2281,7 +3597,7 @@ compiler."
       func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
 
       # Unlock the critical section if it was locked
-      if test "$need_locks" != no; then
+      if test no != "$need_locks"; then
 	removelist=$lockfile
         $RM "$lockfile"
       fi
@@ -2291,7 +3607,7 @@ compiler."
 }
 
 $opt_help || {
-  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+  test compile = "$opt_mode" && func_mode_compile ${1+"$@"}
 }
 
 func_mode_help ()
@@ -2311,7 +3627,7 @@ func_mode_help ()
 Remove files from the build directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, object or program, all the files associated
@@ -2330,16 +3646,16 @@ This mode accepts the following additional options:
   -no-suppress      do not suppress compiler output for multiple passes
   -prefer-pic       try to build PIC objects only
   -prefer-non-pic   try to build non-PIC objects only
-  -shared           do not build a \`.o' file suitable for static linking
-  -static           only build a \`.o' file suitable for static linking
+  -shared           do not build a '.o' file suitable for static linking
+  -static           only build a '.o' file suitable for static linking
   -Wc,FLAG          pass FLAG directly to the compiler
 
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+COMPILE-COMMAND is a command to be used in creating a 'standard' object file
 from the given SOURCEFILE.
 
 The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
+SOURCEFILE, then substituting the C source code suffix '.c' with the
+library object suffix, '.lo'."
         ;;
 
       execute)
@@ -2352,7 +3668,7 @@ This mode accepts the following additional options:
 
   -dlopen FILE      add the directory containing FILE to the library path
 
-This mode sets the library path environment variable according to \`-dlopen'
+This mode sets the library path environment variable according to '-dlopen'
 flags.
 
 If any of the ARGS are libtool executable wrappers, then they are translated
@@ -2371,7 +3687,7 @@ Complete the installation of libtool libraries.
 Each LIBDIR is a directory that contains libtool libraries.
 
 The commands that this mode executes may require superuser privileges.  Use
-the \`--dry-run' option if you just want to see what would be executed."
+the '--dry-run' option if you just want to see what would be executed."
         ;;
 
       install)
@@ -2381,7 +3697,7 @@ the \`--dry-run' option if you just want to see what would be executed."
 Install executables or libraries.
 
 INSTALL-COMMAND is the installation command.  The first component should be
-either the \`install' or \`cp' program.
+either the 'install' or 'cp' program.
 
 The following components of INSTALL-COMMAND are treated specially:
 
@@ -2407,7 +3723,7 @@ The following components of LINK-COMMAND are treated specially:
   -avoid-version    do not add a version suffix if possible
   -bindir BINDIR    specify path to binaries directory (for systems where
                     libraries must be found in the PATH setting at runtime)
-  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlopen FILE      '-dlpreopen' FILE if it cannot be dlopened at runtime
   -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
   -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
   -export-symbols SYMFILE
@@ -2421,7 +3737,8 @@ The following components of LINK-COMMAND are treated specially:
   -no-install       link a not-installable executable
   -no-undefined     declare that a library does not refer to external symbols
   -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
-  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -objectlist FILE  use a list of object files found in FILE to specify objects
+  -os2dllname NAME  force a short DLL name on OS/2 (no effect on other OSes)
   -precious-files-regex REGEX
                     don't remove output files matching REGEX
   -release RELEASE  specify package release information
@@ -2441,20 +3758,20 @@ The following components of LINK-COMMAND are treated specially:
   -Xlinker FLAG     pass linker-specific FLAG directly to the linker
   -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
 
-All other options (arguments beginning with \`-') are ignored.
+All other options (arguments beginning with '-') are ignored.
 
-Every other argument is treated as a filename.  Files ending in \`.la' are
+Every other argument is treated as a filename.  Files ending in '.la' are
 treated as uninstalled libtool libraries, other files are standard or library
 object files.
 
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
+If the OUTPUT-FILE ends in '.la', then a libtool library is created,
+only library objects ('.lo' files) may be specified, and '-rpath' is
 required, except when creating a convenience library.
 
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
+If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created
+using 'ar' and 'ranlib', or on Windows using 'lib'.
 
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file
 is created, otherwise an executable program is created."
         ;;
 
@@ -2465,7 +3782,7 @@ is created, otherwise an executable program is created."
 Remove libraries from an installation directory.
 
 RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+(typically '/bin/rm').  RM-OPTIONS are options (such as '-f') to be passed
 to RM.
 
 If FILE is a libtool library, all the files associated with it are deleted.
@@ -2473,17 +3790,17 @@ Otherwise, only FILE itself is deleted using RM."
         ;;
 
       *)
-        func_fatal_help "invalid operation mode \`$opt_mode'"
+        func_fatal_help "invalid operation mode '$opt_mode'"
         ;;
     esac
 
     echo
-    $ECHO "Try \`$progname --help' for more information about other modes."
+    $ECHO "Try '$progname --help' for more information about other modes."
 }
 
 # Now that we've collected a possible --mode arg, show help if necessary
 if $opt_help; then
-  if test "$opt_help" = :; then
+  if test : = "$opt_help"; then
     func_mode_help
   else
     {
@@ -2491,7 +3808,7 @@ if $opt_help; then
       for opt_mode in compile link execute install finish uninstall clean; do
 	func_mode_help
       done
-    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    } | $SED -n '1p; 2,$s/^Usage:/  or: /p'
     {
       func_help noexit
       for opt_mode in compile link execute install finish uninstall clean; do
@@ -2499,7 +3816,7 @@ if $opt_help; then
 	func_mode_help
       done
     } |
-    sed '1d
+    $SED '1d
       /^When reporting/,/^Report/{
 	H
 	d
@@ -2516,16 +3833,17 @@ fi
 # func_mode_execute arg...
 func_mode_execute ()
 {
-    $opt_debug
+    $debug_cmd
+
     # The first argument is the command name.
-    cmd="$nonopt"
+    cmd=$nonopt
     test -z "$cmd" && \
       func_fatal_help "you must specify a COMMAND"
 
     # Handle -dlopen flags immediately.
     for file in $opt_dlopen; do
       test -f "$file" \
-	|| func_fatal_help "\`$file' is not a file"
+	|| func_fatal_help "'$file' is not a file"
 
       dir=
       case $file in
@@ -2535,7 +3853,7 @@ func_mode_execute ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+	  || func_fatal_help "'$lib' is not a valid libtool archive"
 
 	# Read the libtool library.
 	dlname=
@@ -2546,18 +3864,18 @@ func_mode_execute ()
 	if test -z "$dlname"; then
 	  # Warn if it was a shared library.
 	  test -n "$library_names" && \
-	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	    func_warning "'$file' was not linked with '-export-dynamic'"
 	  continue
 	fi
 
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 
 	if test -f "$dir/$objdir/$dlname"; then
 	  func_append dir "/$objdir"
 	else
 	  if test ! -f "$dir/$dlname"; then
-	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	    func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'"
 	  fi
 	fi
 	;;
@@ -2565,18 +3883,18 @@ func_mode_execute ()
       *.lo)
 	# Just add the directory containing the .lo file.
 	func_dirname "$file" "" "."
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	;;
 
       *)
-	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	func_warning "'-dlopen' is ignored for non-libtool libraries and objects"
 	continue
 	;;
       esac
 
       # Get the absolute pathname.
       absdir=`cd "$dir" && pwd`
-      test -n "$absdir" && dir="$absdir"
+      test -n "$absdir" && dir=$absdir
 
       # Now add the directory to shlibpath_var.
       if eval "test -z \"\$$shlibpath_var\""; then
@@ -2588,7 +3906,7 @@ func_mode_execute ()
 
     # This variable tells wrapper scripts just to set shlibpath_var
     # rather than running their programs.
-    libtool_execute_magic="$magic"
+    libtool_execute_magic=$magic
 
     # Check if any of the arguments is a wrapper script.
     args=
@@ -2601,12 +3919,12 @@ func_mode_execute ()
 	if func_ltwrapper_script_p "$file"; then
 	  func_source "$file"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	elif func_ltwrapper_executable_p "$file"; then
 	  func_ltwrapper_scriptname "$file"
 	  func_source "$func_ltwrapper_scriptname_result"
 	  # Transform arg to wrapped name.
-	  file="$progdir/$program"
+	  file=$progdir/$program
 	fi
 	;;
       esac
@@ -2614,7 +3932,15 @@ func_mode_execute ()
       func_append_quoted args "$file"
     done
 
-    if test "X$opt_dry_run" = Xfalse; then
+    if $opt_dry_run; then
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    else
       if test -n "$shlibpath_var"; then
 	# Export the shlibpath_var.
 	eval "export $shlibpath_var"
@@ -2631,25 +3957,18 @@ func_mode_execute ()
       done
 
       # Now prepare to actually exec the command.
-      exec_cmd="\$cmd$args"
-    else
-      # Display what would be done.
-      if test -n "$shlibpath_var"; then
-	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
-	echo "export $shlibpath_var"
-      fi
-      $ECHO "$cmd$args"
-      exit $EXIT_SUCCESS
+      exec_cmd=\$cmd$args
     fi
 }
 
-test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+test execute = "$opt_mode" && func_mode_execute ${1+"$@"}
 
 
 # func_mode_finish arg...
 func_mode_finish ()
 {
-    $opt_debug
+    $debug_cmd
+
     libs=
     libdirs=
     admincmds=
@@ -2663,11 +3982,11 @@ func_mode_finish ()
 	if func_lalib_unsafe_p "$opt"; then
 	  func_append libs " $opt"
 	else
-	  func_warning "\`$opt' is not a valid libtool archive"
+	  func_warning "'$opt' is not a valid libtool archive"
 	fi
 
       else
-	func_fatal_error "invalid argument \`$opt'"
+	func_fatal_error "invalid argument '$opt'"
       fi
     done
 
@@ -2682,12 +4001,12 @@ func_mode_finish ()
       # Remove sysroot references
       if $opt_dry_run; then
         for lib in $libs; do
-          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+          echo "removing references to $lt_sysroot and '=' prefixes from $lib"
         done
       else
         tmpdir=`func_mktempdir`
         for lib in $libs; do
-	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	  $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
 	    > $tmpdir/tmp-la
 	  mv -f $tmpdir/tmp-la $lib
 	done
@@ -2712,7 +4031,7 @@ func_mode_finish ()
     fi
 
     # Exit here if they wanted silent mode.
-    $opt_silent && exit $EXIT_SUCCESS
+    $opt_quiet && exit $EXIT_SUCCESS
 
     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
       echo "----------------------------------------------------------------------"
@@ -2723,27 +4042,27 @@ func_mode_finish ()
       echo
       echo "If you ever happen to want to link against installed libraries"
       echo "in a given directory, LIBDIR, you must either use libtool, and"
-      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "specify the full pathname of the library, or use the '-LLIBDIR'"
       echo "flag during linking and do at least one of the following:"
       if test -n "$shlibpath_var"; then
-	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "   - add LIBDIR to the '$shlibpath_var' environment variable"
 	echo "     during execution"
       fi
       if test -n "$runpath_var"; then
-	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "   - add LIBDIR to the '$runpath_var' environment variable"
 	echo "     during linking"
       fi
       if test -n "$hardcode_libdir_flag_spec"; then
 	libdir=LIBDIR
 	eval flag=\"$hardcode_libdir_flag_spec\"
 
-	$ECHO "   - use the \`$flag' linker flag"
+	$ECHO "   - use the '$flag' linker flag"
       fi
       if test -n "$admincmds"; then
 	$ECHO "   - have your system administrator run these commands:$admincmds"
       fi
       if test -f /etc/ld.so.conf; then
-	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+	echo "   - have your system administrator add LIBDIR to '/etc/ld.so.conf'"
       fi
       echo
 
@@ -2762,18 +4081,20 @@ func_mode_finish ()
     exit $EXIT_SUCCESS
 }
 
-test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+test finish = "$opt_mode" && func_mode_finish ${1+"$@"}
 
 
 # func_mode_install arg...
 func_mode_install ()
 {
-    $opt_debug
+    $debug_cmd
+
     # There may be an optional sh(1) argument at the beginning of
     # install_prog (especially on Windows NT).
-    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+    if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" ||
        # Allow the use of GNU shtool's install command.
-       case $nonopt in *shtool*) :;; *) false;; esac; then
+       case $nonopt in *shtool*) :;; *) false;; esac
+    then
       # Aesthetically quote it.
       func_quote_for_eval "$nonopt"
       install_prog="$func_quote_for_eval_result "
@@ -2800,7 +4121,7 @@ func_mode_install ()
     opts=
     prev=
     install_type=
-    isdir=no
+    isdir=false
     stripme=
     no_mode=:
     for arg
@@ -2813,7 +4134,7 @@ func_mode_install ()
       fi
 
       case $arg in
-      -d) isdir=yes ;;
+      -d) isdir=: ;;
       -f)
 	if $install_cp; then :; else
 	  prev=$arg
@@ -2831,7 +4152,7 @@ func_mode_install ()
       *)
 	# If the previous option needed an argument, then skip it.
 	if test -n "$prev"; then
-	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	  if test X-m = "X$prev" && test -n "$install_override_mode"; then
 	    arg2=$install_override_mode
 	    no_mode=false
 	  fi
@@ -2856,7 +4177,7 @@ func_mode_install ()
       func_fatal_help "you must specify an install program"
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prev' option requires an argument"
+      func_fatal_help "the '$prev' option requires an argument"
 
     if test -n "$install_override_mode" && $no_mode; then
       if $install_cp; then :; else
@@ -2878,19 +4199,19 @@ func_mode_install ()
     dest=$func_stripname_result
 
     # Check to see that the destination is a directory.
-    test -d "$dest" && isdir=yes
-    if test "$isdir" = yes; then
-      destdir="$dest"
+    test -d "$dest" && isdir=:
+    if $isdir; then
+      destdir=$dest
       destname=
     else
       func_dirname_and_basename "$dest" "" "."
-      destdir="$func_dirname_result"
-      destname="$func_basename_result"
+      destdir=$func_dirname_result
+      destname=$func_basename_result
 
       # Not a directory, so check to see that there is only one file specified.
       set dummy $files; shift
       test "$#" -gt 1 && \
-	func_fatal_help "\`$dest' is not a directory"
+	func_fatal_help "'$dest' is not a directory"
     fi
     case $destdir in
     [\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -2899,7 +4220,7 @@ func_mode_install ()
 	case $file in
 	*.lo) ;;
 	*)
-	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  func_fatal_help "'$destdir' must be an absolute directory name"
 	  ;;
 	esac
       done
@@ -2908,7 +4229,7 @@ func_mode_install ()
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     staticlibs=
     future_libdirs=
@@ -2928,7 +4249,7 @@ func_mode_install ()
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$file" \
-	  || func_fatal_help "\`$file' is not a valid libtool archive"
+	  || func_fatal_help "'$file' is not a valid libtool archive"
 
 	library_names=
 	old_library=
@@ -2950,7 +4271,7 @@ func_mode_install ()
 	fi
 
 	func_dirname "$file" "/" ""
-	dir="$func_dirname_result"
+	dir=$func_dirname_result
 	func_append dir "$objdir"
 
 	if test -n "$relink_command"; then
@@ -2964,7 +4285,7 @@ func_mode_install ()
 	  # are installed into $libdir/../bin (currently, that works fine)
 	  # but it's something to keep an eye on.
 	  test "$inst_prefix_dir" = "$destdir" && \
-	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+	    func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir"
 
 	  if test -n "$inst_prefix_dir"; then
 	    # Stick the inst_prefix_dir data into the link command.
@@ -2973,29 +4294,36 @@ func_mode_install ()
 	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
 	  fi
 
-	  func_warning "relinking \`$file'"
+	  func_warning "relinking '$file'"
 	  func_show_eval "$relink_command" \
-	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	    'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"'
 	fi
 
 	# See the names of the shared library.
 	set dummy $library_names; shift
 	if test -n "$1"; then
-	  realname="$1"
+	  realname=$1
 	  shift
 
-	  srcname="$realname"
-	  test -n "$relink_command" && srcname="$realname"T
+	  srcname=$realname
+	  test -n "$relink_command" && srcname=${realname}T
 
 	  # Install the shared library and build the symlinks.
 	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
 	      'exit $?'
-	  tstripme="$stripme"
+	  tstripme=$stripme
 	  case $host_os in
 	  cygwin* | mingw* | pw32* | cegcc*)
 	    case $realname in
 	    *.dll.a)
-	      tstripme=""
+	      tstripme=
+	      ;;
+	    esac
+	    ;;
+	  os2*)
+	    case $realname in
+	    *_dll.a)
+	      tstripme=
 	      ;;
 	    esac
 	    ;;
@@ -3006,7 +4334,7 @@ func_mode_install ()
 
 	  if test "$#" -gt 0; then
 	    # Delete the old symlinks, and create new ones.
-	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # Try 'ln -sf' first, because the 'ln' binary might depend on
 	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
 	    # so we also need to try rm && ln -s.
 	    for linkname
@@ -3017,14 +4345,14 @@ func_mode_install ()
 	  fi
 
 	  # Do each command in the postinstall commands.
-	  lib="$destdir/$realname"
+	  lib=$destdir/$realname
 	  func_execute_cmds "$postinstall_cmds" 'exit $?'
 	fi
 
 	# Install the pseudo-library for information purposes.
 	func_basename "$file"
-	name="$func_basename_result"
-	instname="$dir/$name"i
+	name=$func_basename_result
+	instname=$dir/${name}i
 	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
 
 	# Maybe install the static library, too.
@@ -3036,11 +4364,11 @@ func_mode_install ()
 
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# Deduce the name of the destination old-style object file.
@@ -3050,11 +4378,11 @@ func_mode_install ()
 	  staticdest=$func_lo2o_result
 	  ;;
 	*.$objext)
-	  staticdest="$destfile"
+	  staticdest=$destfile
 	  destfile=
 	  ;;
 	*)
-	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  func_fatal_help "cannot copy a libtool object to '$destfile'"
 	  ;;
 	esac
 
@@ -3063,7 +4391,7 @@ func_mode_install ()
 	  func_show_eval "$install_prog $file $destfile" 'exit $?'
 
 	# Install the old object if enabled.
-	if test "$build_old_libs" = yes; then
+	if test yes = "$build_old_libs"; then
 	  # Deduce the name of the old-style object file.
 	  func_lo2o "$file"
 	  staticobj=$func_lo2o_result
@@ -3075,23 +4403,23 @@ func_mode_install ()
       *)
 	# Figure out destination file name, if it wasn't already specified.
 	if test -n "$destname"; then
-	  destfile="$destdir/$destname"
+	  destfile=$destdir/$destname
 	else
 	  func_basename "$file"
-	  destfile="$func_basename_result"
-	  destfile="$destdir/$destfile"
+	  destfile=$func_basename_result
+	  destfile=$destdir/$destfile
 	fi
 
 	# If the file is missing, and there is a .exe on the end, strip it
 	# because it is most likely a libtool script we actually want to
 	# install
-	stripped_ext=""
+	stripped_ext=
 	case $file in
 	  *.exe)
 	    if test ! -f "$file"; then
 	      func_stripname '' '.exe' "$file"
 	      file=$func_stripname_result
-	      stripped_ext=".exe"
+	      stripped_ext=.exe
 	    fi
 	    ;;
 	esac
@@ -3119,19 +4447,19 @@ func_mode_install ()
 
 	  # Check the variables that should have been set.
 	  test -z "$generated_by_libtool_version" && \
-	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+	    func_fatal_error "invalid libtool wrapper script '$wrapper'"
 
-	  finalize=yes
+	  finalize=:
 	  for lib in $notinst_deplibs; do
 	    # Check to see that each library is installed.
 	    libdir=
 	    if test -f "$lib"; then
 	      func_source "$lib"
 	    fi
-	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'`
 	    if test -n "$libdir" && test ! -f "$libfile"; then
-	      func_warning "\`$lib' has not been installed in \`$libdir'"
-	      finalize=no
+	      func_warning "'$lib' has not been installed in '$libdir'"
+	      finalize=false
 	    fi
 	  done
 
@@ -3139,29 +4467,29 @@ func_mode_install ()
 	  func_source "$wrapper"
 
 	  outputname=
-	  if test "$fast_install" = no && test -n "$relink_command"; then
+	  if test no = "$fast_install" && test -n "$relink_command"; then
 	    $opt_dry_run || {
-	      if test "$finalize" = yes; then
+	      if $finalize; then
 	        tmpdir=`func_mktempdir`
 		func_basename "$file$stripped_ext"
-		file="$func_basename_result"
-	        outputname="$tmpdir/$file"
+		file=$func_basename_result
+	        outputname=$tmpdir/$file
 	        # Replace the output file specification.
 	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
 
-	        $opt_silent || {
+	        $opt_quiet || {
 	          func_quote_for_expand "$relink_command"
 		  eval "func_echo $func_quote_for_expand_result"
 	        }
 	        if eval "$relink_command"; then :
 	          else
-		  func_error "error: relink \`$file' with the above command before installing it"
+		  func_error "error: relink '$file' with the above command before installing it"
 		  $opt_dry_run || ${RM}r "$tmpdir"
 		  continue
 	        fi
-	        file="$outputname"
+	        file=$outputname
 	      else
-	        func_warning "cannot relink \`$file'"
+	        func_warning "cannot relink '$file'"
 	      fi
 	    }
 	  else
@@ -3198,10 +4526,10 @@ func_mode_install ()
 
     for file in $staticlibs; do
       func_basename "$file"
-      name="$func_basename_result"
+      name=$func_basename_result
 
       # Set up the ranlib parameters.
-      oldlib="$destdir/$name"
+      oldlib=$destdir/$name
       func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
       tool_oldlib=$func_to_tool_file_result
 
@@ -3216,18 +4544,18 @@ func_mode_install ()
     done
 
     test -n "$future_libdirs" && \
-      func_warning "remember to run \`$progname --finish$future_libdirs'"
+      func_warning "remember to run '$progname --finish$future_libdirs'"
 
     if test -n "$current_libdirs"; then
       # Maybe just do a dry run.
       $opt_dry_run && current_libdirs=" -n$current_libdirs"
-      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+      exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs'
     else
       exit $EXIT_SUCCESS
     fi
 }
 
-test "$opt_mode" = install && func_mode_install ${1+"$@"}
+test install = "$opt_mode" && func_mode_install ${1+"$@"}
 
 
 # func_generate_dlsyms outputname originator pic_p
@@ -3235,16 +4563,17 @@ test "$opt_mode" = install && func_mode_install ${1+"$@"}
 # a dlpreopen symbol table.
 func_generate_dlsyms ()
 {
-    $opt_debug
-    my_outputname="$1"
-    my_originator="$2"
-    my_pic_p="${3-no}"
-    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    $debug_cmd
+
+    my_outputname=$1
+    my_originator=$2
+    my_pic_p=${3-false}
+    my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'`
     my_dlsyms=
 
-    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+    if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
       if test -n "$NM" && test -n "$global_symbol_pipe"; then
-	my_dlsyms="${my_outputname}S.c"
+	my_dlsyms=${my_outputname}S.c
       else
 	func_error "not configured to extract global symbols from dlpreopened files"
       fi
@@ -3255,7 +4584,7 @@ func_generate_dlsyms ()
       "") ;;
       *.c)
 	# Discover the nlist of each of the dlfiles.
-	nlist="$output_objdir/${my_outputname}.nm"
+	nlist=$output_objdir/$my_outputname.nm
 
 	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
 
@@ -3263,34 +4592,36 @@ func_generate_dlsyms ()
 	func_verbose "creating $output_objdir/$my_dlsyms"
 
 	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
-/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
-/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */
 
 #ifdef __cplusplus
 extern \"C\" {
 #endif
 
-#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
 #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
 #endif
 
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
 # define LT_DLSYM_CONST const
 #endif
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* External symbol declarations for the compiler. */\
 "
 
-	if test "$dlself" = yes; then
-	  func_verbose "generating symbol list for \`$output'"
+	if test yes = "$dlself"; then
+	  func_verbose "generating symbol list for '$output'"
 
 	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
 
@@ -3298,7 +4629,7 @@ extern \"C\" {
 	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	  for progfile in $progfiles; do
 	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
-	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    func_verbose "extracting global C symbols from '$func_to_tool_file_result'"
 	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
 	  done
 
@@ -3318,10 +4649,10 @@ extern \"C\" {
 
 	  # Prepare the list of exported symbols
 	  if test -z "$export_symbols"; then
-	    export_symbols="$output_objdir/$outputname.exp"
+	    export_symbols=$output_objdir/$outputname.exp
 	    $opt_dry_run || {
 	      $RM $export_symbols
-	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
 	      case $host in
 	      *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
@@ -3331,7 +4662,7 @@ extern \"C\" {
 	    }
 	  else
 	    $opt_dry_run || {
-	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
 	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	      case $host in
@@ -3345,22 +4676,22 @@ extern \"C\" {
 	fi
 
 	for dlprefile in $dlprefiles; do
-	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_verbose "extracting global C symbols from '$dlprefile'"
 	  func_basename "$dlprefile"
-	  name="$func_basename_result"
+	  name=$func_basename_result
           case $host in
 	    *cygwin* | *mingw* | *cegcc* )
 	      # if an import library, we need to obtain dlname
 	      if func_win32_import_lib_p "$dlprefile"; then
 	        func_tr_sh "$dlprefile"
 	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
-	        dlprefile_dlbasename=""
+	        dlprefile_dlbasename=
 	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
 	          # Use subshell, to avoid clobbering current variable values
 	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
-	          if test -n "$dlprefile_dlname" ; then
+	          if test -n "$dlprefile_dlname"; then
 	            func_basename "$dlprefile_dlname"
-	            dlprefile_dlbasename="$func_basename_result"
+	            dlprefile_dlbasename=$func_basename_result
 	          else
 	            # no lafile. user explicitly requested -dlpreopen <import library>.
 	            $sharedlib_from_linklib_cmd "$dlprefile"
@@ -3368,7 +4699,7 @@ extern \"C\" {
 	          fi
 	        fi
 	        $opt_dry_run || {
-	          if test -n "$dlprefile_dlbasename" ; then
+	          if test -n "$dlprefile_dlbasename"; then
 	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
 	          else
 	            func_warning "Could not compute DLL name from $name"
@@ -3424,6 +4755,11 @@ extern \"C\" {
 	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
 	  fi
 
+	  func_show_eval '$RM "${nlist}I"'
+	  if test -n "$global_symbol_to_import"; then
+	    eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I'
+	  fi
+
 	  echo >> "$output_objdir/$my_dlsyms" "\
 
 /* The mapping between symbol names and symbols.  */
@@ -3432,11 +4768,30 @@ typedef struct {
   void *address;
 } lt_dlsymlist;
 extern LT_DLSYM_CONST lt_dlsymlist
-lt_${my_prefix}_LTX_preloaded_symbols[];
+lt_${my_prefix}_LTX_preloaded_symbols[];\
+"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+static void lt_syminit(void)
+{
+  LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols;
+  for (; symbol->name; ++symbol)
+    {"
+	    $SED 's/.*/      if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms"
+	    echo >> "$output_objdir/$my_dlsyms" "\
+    }
+}"
+	  fi
+	  echo >> "$output_objdir/$my_dlsyms" "\
 LT_DLSYM_CONST lt_dlsymlist
 lt_${my_prefix}_LTX_preloaded_symbols[] =
-{\
-  { \"$my_originator\", (void *) 0 },"
+{ {\"$my_originator\", (void *) 0},"
+
+	  if test -s "$nlist"I; then
+	    echo >> "$output_objdir/$my_dlsyms" "\
+  {\"@INIT@\", (void *) &lt_syminit},"
+	  fi
 
 	  case $need_lib_prefix in
 	  no)
@@ -3478,9 +4833,7 @@ static const void *lt_preloaded_setup() {
 	  *-*-hpux*)
 	    pic_flag_for_symtable=" $pic_flag"  ;;
 	  *)
-	    if test "X$my_pic_p" != Xno; then
-	      pic_flag_for_symtable=" $pic_flag"
-	    fi
+	    $my_pic_p && pic_flag_for_symtable=" $pic_flag"
 	    ;;
 	  esac
 	  ;;
@@ -3497,10 +4850,10 @@ static const void *lt_preloaded_setup() {
 	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
 
 	# Clean up the generated files.
-	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"'
 
 	# Transform the symbol file into the correct name.
-	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	symfileobj=$output_objdir/${my_outputname}S.$objext
 	case $host in
 	*cygwin* | *mingw* | *cegcc* )
 	  if test -f "$output_objdir/$my_outputname.def"; then
@@ -3518,7 +4871,7 @@ static const void *lt_preloaded_setup() {
 	esac
 	;;
       *)
-	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	func_fatal_error "unknown suffix for '$my_dlsyms'"
 	;;
       esac
     else
@@ -3532,6 +4885,32 @@ static const void *lt_preloaded_setup() {
     fi
 }
 
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $debug_cmd
+
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
 # func_win32_libid arg
 # return the library type of file 'arg'
 #
@@ -3541,8 +4920,9 @@ static const void *lt_preloaded_setup() {
 # Despite the name, also deal with 64 bit binaries.
 func_win32_libid ()
 {
-  $opt_debug
-  win32_libid_type="unknown"
+  $debug_cmd
+
+  win32_libid_type=unknown
   win32_fileres=`file -L $1 2>/dev/null`
   case $win32_fileres in
   *ar\ archive\ import\ library*) # definitely import
@@ -3552,16 +4932,29 @@ func_win32_libid ()
     # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
     if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
        $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
-      func_to_tool_file "$1" func_convert_file_msys_to_w32
-      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
-	$SED -n -e '
+      case $nm_interface in
+      "MS dumpbin")
+	if func_cygming_ms_implib_p "$1" ||
+	   func_cygming_gnu_implib_p "$1"
+	then
+	  win32_nmres=import
+	else
+	  win32_nmres=
+	fi
+	;;
+      *)
+	func_to_tool_file "$1" func_convert_file_msys_to_w32
+	win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	  $SED -n -e '
 	    1,100{
 		/ I /{
-		    s,.*,import,
+		    s|.*|import|
 		    p
 		    q
 		}
 	    }'`
+	;;
+      esac
       case $win32_nmres in
       import*)  win32_libid_type="x86 archive import";;
       *)        win32_libid_type="x86 archive static";;
@@ -3593,7 +4986,8 @@ func_win32_libid ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib ()
 {
-  $opt_debug
+  $debug_cmd
+
   sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
 }
 
@@ -3610,7 +5004,8 @@ func_cygming_dll_for_implib ()
 # specified import library.
 func_cygming_dll_for_implib_fallback_core ()
 {
-  $opt_debug
+  $debug_cmd
+
   match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
   $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
     $SED '/^Contents of section '"$match_literal"':/{
@@ -3646,8 +5041,8 @@ func_cygming_dll_for_implib_fallback_core ()
       /./p' |
     # we now have a list, one entry per line, of the stringified
     # contents of the appropriate section of all members of the
-    # archive which possess that section. Heuristic: eliminate
-    # all those which have a first or second character that is
+    # archive that possess that section. Heuristic: eliminate
+    # all those that have a first or second character that is
     # a '.' (that is, objdump's representation of an unprintable
     # character.) This should work for all archives with less than
     # 0x302f exports -- but will fail for DLLs whose name actually
@@ -3658,30 +5053,6 @@ func_cygming_dll_for_implib_fallback_core ()
     $SED -e '/^\./d;/^.\./d;q'
 }
 
-# func_cygming_gnu_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is a GNU/binutils-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_gnu_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
-  test -n "$func_cygming_gnu_implib_tmp"
-}
-
-# func_cygming_ms_implib_p ARG
-# This predicate returns with zero status (TRUE) if
-# ARG is an MS-style import library. Returns
-# with nonzero status (FALSE) otherwise.
-func_cygming_ms_implib_p ()
-{
-  $opt_debug
-  func_to_tool_file "$1" func_convert_file_msys_to_w32
-  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
-  test -n "$func_cygming_ms_implib_tmp"
-}
-
 # func_cygming_dll_for_implib_fallback ARG
 # Platform-specific function to extract the
 # name of the DLL associated with the specified
@@ -3695,16 +5066,17 @@ func_cygming_ms_implib_p ()
 #    $sharedlib_from_linklib_result
 func_cygming_dll_for_implib_fallback ()
 {
-  $opt_debug
-  if func_cygming_gnu_implib_p "$1" ; then
+  $debug_cmd
+
+  if func_cygming_gnu_implib_p "$1"; then
     # binutils import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
-  elif func_cygming_ms_implib_p "$1" ; then
+  elif func_cygming_ms_implib_p "$1"; then
     # ms-generated import library
     sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
   else
     # unknown
-    sharedlib_from_linklib_result=""
+    sharedlib_from_linklib_result=
   fi
 }
 
@@ -3712,10 +5084,11 @@ func_cygming_dll_for_implib_fallback ()
 # func_extract_an_archive dir oldlib
 func_extract_an_archive ()
 {
-    $opt_debug
-    f_ex_an_ar_dir="$1"; shift
-    f_ex_an_ar_oldlib="$1"
-    if test "$lock_old_archive_extraction" = yes; then
+    $debug_cmd
+
+    f_ex_an_ar_dir=$1; shift
+    f_ex_an_ar_oldlib=$1
+    if test yes = "$lock_old_archive_extraction"; then
       lockfile=$f_ex_an_ar_oldlib.lock
       until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
 	func_echo "Waiting for $lockfile to be removed"
@@ -3724,7 +5097,7 @@ func_extract_an_archive ()
     fi
     func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
 		   'stat=$?; rm -f "$lockfile"; exit $stat'
-    if test "$lock_old_archive_extraction" = yes; then
+    if test yes = "$lock_old_archive_extraction"; then
       $opt_dry_run || rm -f "$lockfile"
     fi
     if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
@@ -3738,22 +5111,23 @@ func_extract_an_archive ()
 # func_extract_archives gentop oldlib ...
 func_extract_archives ()
 {
-    $opt_debug
-    my_gentop="$1"; shift
+    $debug_cmd
+
+    my_gentop=$1; shift
     my_oldlibs=${1+"$@"}
-    my_oldobjs=""
-    my_xlib=""
-    my_xabs=""
-    my_xdir=""
+    my_oldobjs=
+    my_xlib=
+    my_xabs=
+    my_xdir=
 
     for my_xlib in $my_oldlibs; do
       # Extract the objects.
       case $my_xlib in
-	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;;
 	*) my_xabs=`pwd`"/$my_xlib" ;;
       esac
       func_basename "$my_xlib"
-      my_xlib="$func_basename_result"
+      my_xlib=$func_basename_result
       my_xlib_u=$my_xlib
       while :; do
         case " $extracted_archives " in
@@ -3765,7 +5139,7 @@ func_extract_archives ()
 	esac
       done
       extracted_archives="$extracted_archives $my_xlib_u"
-      my_xdir="$my_gentop/$my_xlib_u"
+      my_xdir=$my_gentop/$my_xlib_u
 
       func_mkdir_p "$my_xdir"
 
@@ -3778,22 +5152,23 @@ func_extract_archives ()
 	  cd $my_xdir || exit $?
 	  darwin_archive=$my_xabs
 	  darwin_curdir=`pwd`
-	  darwin_base_archive=`basename "$darwin_archive"`
+	  func_basename "$darwin_archive"
+	  darwin_base_archive=$func_basename_result
 	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
 	  if test -n "$darwin_arches"; then
 	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
 	    darwin_arch=
 	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
-	    for darwin_arch in  $darwin_arches ; do
-	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
-	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
-	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	    for darwin_arch in  $darwin_arches; do
+	      func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive"
+	      cd "unfat-$$/$darwin_base_archive-$darwin_arch"
+	      func_extract_an_archive "`pwd`" "$darwin_base_archive"
 	      cd "$darwin_curdir"
-	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	      $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive"
 	    done # $darwin_arches
             ## Okay now we've a bunch of thin objects, gotta fatten them up :)
-	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u`
 	    darwin_file=
 	    darwin_files=
 	    for darwin_file in $darwin_filelist; do
@@ -3815,7 +5190,7 @@ func_extract_archives ()
       my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
     done
 
-    func_extract_archives_result="$my_oldobjs"
+    func_extract_archives_result=$my_oldobjs
 }
 
 
@@ -3830,7 +5205,7 @@ func_extract_archives ()
 #
 # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
 # variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
+# will assume that the directory where it is stored is
 # the $objdir directory.  This is a cygwin/mingw-specific
 # behavior.
 func_emit_wrapper ()
@@ -3841,7 +5216,7 @@ func_emit_wrapper ()
 #! $SHELL
 
 # $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # The $output program cannot be directly executed until all the libtool
 # libraries that it depends on are installed.
@@ -3898,9 +5273,9 @@ _LTECHO_EOF'
 
 # Very basic option parsing. These options are (a) specific to
 # the libtool wrapper, (b) are identical between the wrapper
-# /script/ and the wrapper /executable/ which is used only on
+# /script/ and the wrapper /executable/ that is used only on
 # windows platforms, and (c) all begin with the string "--lt-"
-# (application programs are unlikely to have options which match
+# (application programs are unlikely to have options that match
 # this pattern).
 #
 # There are only two supported options: --lt-debug and
@@ -3933,7 +5308,7 @@ func_parse_lt_options ()
 
   # Print the debug banner immediately:
   if test -n \"\$lt_option_debug\"; then
-    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+    echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2
   fi
 }
 
@@ -3944,7 +5319,7 @@ func_lt_dump_args ()
   lt_dump_args_N=1;
   for lt_arg
   do
-    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\"
     lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
   done
 }
@@ -3958,7 +5333,7 @@ func_exec_program_core ()
   *-*-mingw | *-*-os2* | *-cegcc*)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
@@ -3968,7 +5343,7 @@ func_exec_program_core ()
   *)
     $ECHO "\
       if test -n \"\$lt_option_debug\"; then
-        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2
         func_lt_dump_args \${1+\"\$@\"} 1>&2
       fi
       exec \"\$progdir/\$program\" \${1+\"\$@\"}
@@ -4043,13 +5418,13 @@ func_exec_program ()
   test -n \"\$absdir\" && thisdir=\"\$absdir\"
 "
 
-	if test "$fast_install" = yes; then
+	if test yes = "$fast_install"; then
 	  $ECHO "\
   program=lt-'$outputname'$exeext
   progdir=\"\$thisdir/$objdir\"
 
   if test ! -f \"\$progdir/\$program\" ||
-     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\
        test \"X\$file\" != \"X\$progdir/\$program\"; }; then
 
     file=\"\$\$-\$program\"
@@ -4066,7 +5441,7 @@ func_exec_program ()
     if test -n \"\$relink_command\"; then
       if relink_command_output=\`eval \$relink_command 2>&1\`; then :
       else
-	$ECHO \"\$relink_command_output\" >&2
+	\$ECHO \"\$relink_command_output\" >&2
 	$RM \"\$progdir/\$file\"
 	exit 1
       fi
@@ -4101,7 +5476,7 @@ func_exec_program ()
 	fi
 
 	# Export our shlibpath_var if we have one.
-	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
 	  $ECHO "\
     # Add our own library path to $shlibpath_var
     $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
@@ -4121,7 +5496,7 @@ func_exec_program ()
     fi
   else
     # The program doesn't exist.
-    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2
     \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
     \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
     exit 1
@@ -4140,7 +5515,7 @@ func_emit_cwrapperexe_src ()
 	cat <<EOF
 
 /* $cwrappersource - temporary wrapper executable for $objdir/$outputname
-   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+   Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 
    The $output program cannot be directly executed until all the libtool
    libraries that it depends on are installed.
@@ -4175,47 +5550,45 @@ EOF
 #include <fcntl.h>
 #include <sys/stat.h>
 
+#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0)
+
 /* declarations of non-ANSI functions */
-#if defined(__MINGW32__)
+#if defined __MINGW32__
 # ifdef __STRICT_ANSI__
 int _putenv (const char *);
 # endif
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # ifdef __STRICT_ANSI__
 char *realpath (const char *, char *);
 int putenv (char *);
 int setenv (const char *, const char *, int);
 # endif
-/* #elif defined (other platforms) ... */
+/* #elif defined other_platform || defined ... */
 #endif
 
 /* portability defines, excluding path handling macros */
-#if defined(_MSC_VER)
+#if defined _MSC_VER
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
 # define S_IXUSR _S_IEXEC
-# ifndef _INTPTR_T_DEFINED
-#  define _INTPTR_T_DEFINED
-#  define intptr_t int
-# endif
-#elif defined(__MINGW32__)
+#elif defined __MINGW32__
 # define setmode _setmode
 # define stat    _stat
 # define chmod   _chmod
 # define getcwd  _getcwd
 # define putenv  _putenv
-#elif defined(__CYGWIN__)
+#elif defined __CYGWIN__
 # define HAVE_SETENV
 # define FOPEN_WB "wb"
-/* #elif defined (other platforms) ... */
+/* #elif defined other platforms ... */
 #endif
 
-#if defined(PATH_MAX)
+#if defined PATH_MAX
 # define LT_PATHMAX PATH_MAX
-#elif defined(MAXPATHLEN)
+#elif defined MAXPATHLEN
 # define LT_PATHMAX MAXPATHLEN
 #else
 # define LT_PATHMAX 1024
@@ -4234,8 +5607,8 @@ int setenv (const char *, const char *, int);
 # define PATH_SEPARATOR ':'
 #endif
 
-#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
-  defined (__OS2__)
+#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \
+  defined __OS2__
 # define HAVE_DOS_BASED_FILE_SYSTEM
 # define FOPEN_WB "wb"
 # ifndef DIR_SEPARATOR_2
@@ -4268,10 +5641,10 @@ int setenv (const char *, const char *, int);
 
 #define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
 #define XFREE(stale) do { \
-  if (stale) { free ((void *) stale); stale = 0; } \
+  if (stale) { free (stale); stale = 0; } \
 } while (0)
 
-#if defined(LT_DEBUGWRAPPER)
+#if defined LT_DEBUGWRAPPER
 static int lt_debug = 1;
 #else
 static int lt_debug = 0;
@@ -4300,11 +5673,16 @@ void lt_dump_script (FILE *f);
 EOF
 
 	    cat <<EOF
-volatile const char * MAGIC_EXE = "$magic_exe";
+#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
+# define externally_visible volatile
+#else
+# define externally_visible __attribute__((externally_visible)) volatile
+#endif
+externally_visible const char * MAGIC_EXE = "$magic_exe";
 const char * LIB_PATH_VARNAME = "$shlibpath_var";
 EOF
 
-	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	    if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
               func_to_host_path "$temp_rpath"
 	      cat <<EOF
 const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
@@ -4328,7 +5706,7 @@ const char * EXE_PATH_VALUE   = "";
 EOF
 	    fi
 
-	    if test "$fast_install" = yes; then
+	    if test yes = "$fast_install"; then
 	      cat <<EOF
 const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
 EOF
@@ -4357,12 +5735,12 @@ main (int argc, char *argv[])
   char *actual_cwrapper_name;
   char *target_name;
   char *lt_argv_zero;
-  intptr_t rval = 127;
+  int rval = 127;
 
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
-  newargz = XMALLOC (char *, argc + 1);
+  newargz = XMALLOC (char *, (size_t) argc + 1);
 
   /* very simple arg parsing; don't want to rely on getopt
    * also, copy all non cwrapper options to newargz, except
@@ -4371,10 +5749,10 @@ main (int argc, char *argv[])
   newargc=0;
   for (i = 1; i < argc; i++)
     {
-      if (strcmp (argv[i], dumpscript_opt) == 0)
+      if (STREQ (argv[i], dumpscript_opt))
 	{
 EOF
-	    case "$host" in
+	    case $host in
 	      *mingw* | *cygwin* )
 		# make stdout use "unix" line endings
 		echo "          setmode(1,_O_BINARY);"
@@ -4385,12 +5763,12 @@ EOF
 	  lt_dump_script (stdout);
 	  return 0;
 	}
-      if (strcmp (argv[i], debug_opt) == 0)
+      if (STREQ (argv[i], debug_opt))
 	{
           lt_debug = 1;
           continue;
 	}
-      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+      if (STREQ (argv[i], ltwrapper_option_prefix))
         {
           /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
              namespace, but it is not one of the ones we know about and
@@ -4413,7 +5791,7 @@ EOF
 EOF
 	    cat <<EOF
   /* The GNU banner must be the first non-error debug message */
-  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE) $VERSION\n");
 EOF
 	    cat <<"EOF"
   lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
@@ -4524,7 +5902,7 @@ EOF
 		cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
   newargz = prepare_spawn (newargz);
-  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  rval = (int) _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
@@ -4569,7 +5947,7 @@ base_name (const char *name)
 {
   const char *base;
 
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   /* Skip over the disk name in MSDOS pathnames. */
   if (isalpha ((unsigned char) name[0]) && name[1] == ':')
     name += 2;
@@ -4628,7 +6006,7 @@ find_executable (const char *wrapper)
   const char *p_next;
   /* static buffer for getcwd */
   char tmp[LT_PATHMAX + 1];
-  int tmp_len;
+  size_t tmp_len;
   char *concat_name;
 
   lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
@@ -4638,7 +6016,7 @@ find_executable (const char *wrapper)
     return NULL;
 
   /* Absolute path? */
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
   if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
     {
       concat_name = xstrdup (wrapper);
@@ -4656,7 +6034,7 @@ find_executable (const char *wrapper)
 	    return concat_name;
 	  XFREE (concat_name);
 	}
-#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+#if defined HAVE_DOS_BASED_FILE_SYSTEM
     }
 #endif
 
@@ -4679,7 +6057,7 @@ find_executable (const char *wrapper)
 	      for (q = p; *q; q++)
 		if (IS_PATH_SEPARATOR (*q))
 		  break;
-	      p_len = q - p;
+	      p_len = (size_t) (q - p);
 	      p_next = (*q == '\0' ? q : q + 1);
 	      if (p_len == 0)
 		{
@@ -4798,7 +6176,7 @@ strendzap (char *str, const char *pat)
   if (patlen <= len)
     {
       str += len - patlen;
-      if (strcmp (str, pat) == 0)
+      if (STREQ (str, pat))
 	*str = '\0';
     }
   return str;
@@ -4863,7 +6241,7 @@ lt_setenv (const char *name, const char *value)
     char *str = xstrdup (value);
     setenv (name, str, 1);
 #else
-    int len = strlen (name) + 1 + strlen (value) + 1;
+    size_t len = strlen (name) + 1 + strlen (value) + 1;
     char *str = XMALLOC (char, len);
     sprintf (str, "%s=%s", name, value);
     if (putenv (str) != EXIT_SUCCESS)
@@ -4880,8 +6258,8 @@ lt_extend_str (const char *orig_value, const char *add, int to_end)
   char *new_value;
   if (orig_value && *orig_value)
     {
-      int orig_value_len = strlen (orig_value);
-      int add_len = strlen (add);
+      size_t orig_value_len = strlen (orig_value);
+      size_t add_len = strlen (add);
       new_value = XMALLOC (char, add_len + orig_value_len + 1);
       if (to_end)
         {
@@ -4912,10 +6290,10 @@ lt_update_exe_path (const char *name, const char *value)
     {
       char *new_value = lt_extend_str (getenv (name), value, 0);
       /* some systems can't cope with a ':'-terminated path #' */
-      int len = strlen (new_value);
-      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+      size_t len = strlen (new_value);
+      while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
         {
-          new_value[len-1] = '\0';
+          new_value[--len] = '\0';
         }
       lt_setenv (name, new_value);
       XFREE (new_value);
@@ -5082,27 +6460,47 @@ EOF
 # True if ARG is an import lib, as indicated by $file_magic_cmd
 func_win32_import_lib_p ()
 {
-    $opt_debug
+    $debug_cmd
+
     case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
     *import*) : ;;
     *) false ;;
     esac
 }
 
+# func_suncc_cstd_abi
+# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!!
+# Several compiler flags select an ABI that is incompatible with the
+# Cstd library. Avoid specifying it if any are in CXXFLAGS.
+func_suncc_cstd_abi ()
+{
+    $debug_cmd
+
+    case " $compile_command " in
+    *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*)
+      suncc_use_cstd_abi=no
+      ;;
+    *)
+      suncc_use_cstd_abi=yes
+      ;;
+    esac
+}
+
 # func_mode_link arg...
 func_mode_link ()
 {
-    $opt_debug
+    $debug_cmd
+
     case $host in
     *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
-      # which system we are compiling for in order to pass an extra
+      # what system we are compiling for in order to pass an extra
       # flag for every libtool invocation.
       # allow_undefined=no
 
       # FIXME: Unfortunately, there are problems with the above when trying
-      # to make a dll which has undefined symbols, in which case not
+      # to make a dll that has undefined symbols, in which case not
       # even a static library is built.  For now, we need to specify
       # -no-undefined on the libtool link line when we can be certain
       # that all symbols are satisfied, otherwise we get a static library.
@@ -5146,10 +6544,11 @@ func_mode_link ()
     module=no
     no_install=no
     objs=
+    os2dllname=
     non_pic_objects=
     precious_files_regex=
     prefer_static_libs=no
-    preload=no
+    preload=false
     prev=
     prevarg=
     release=
@@ -5161,7 +6560,7 @@ func_mode_link ()
     vinfo=
     vinfo_number=no
     weak_libs=
-    single_module="${wl}-single_module"
+    single_module=$wl-single_module
     func_infer_tag $base_compile
 
     # We need to know -static, to get the right output filenames.
@@ -5169,15 +6568,15 @@ func_mode_link ()
     do
       case $arg in
       -shared)
-	test "$build_libtool_libs" != yes && \
-	  func_fatal_configuration "can not build a shared library"
+	test yes != "$build_libtool_libs" \
+	  && func_fatal_configuration "cannot build a shared library"
 	build_old_libs=no
 	break
 	;;
       -all-static | -static | -static-libtool-libs)
 	case $arg in
 	-all-static)
-	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	  if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then
 	    func_warning "complete static linking is impossible in this configuration"
 	  fi
 	  if test -n "$link_static_flag"; then
@@ -5210,7 +6609,7 @@ func_mode_link ()
 
     # Go through the arguments, transforming them on the way.
     while test "$#" -gt 0; do
-      arg="$1"
+      arg=$1
       shift
       func_quote_for_eval "$arg"
       qarg=$func_quote_for_eval_unquoted_result
@@ -5227,21 +6626,21 @@ func_mode_link ()
 
 	case $prev in
 	bindir)
-	  bindir="$arg"
+	  bindir=$arg
 	  prev=
 	  continue
 	  ;;
 	dlfiles|dlprefiles)
-	  if test "$preload" = no; then
+	  $preload || {
 	    # Add the symbol object into the linking commands.
 	    func_append compile_command " @SYMFILE@"
 	    func_append finalize_command " @SYMFILE@"
-	    preload=yes
-	  fi
+	    preload=:
+	  }
 	  case $arg in
 	  *.la | *.lo) ;;  # We handle these cases below.
 	  force)
-	    if test "$dlself" = no; then
+	    if test no = "$dlself"; then
 	      dlself=needless
 	      export_dynamic=yes
 	    fi
@@ -5249,9 +6648,9 @@ func_mode_link ()
 	    continue
 	    ;;
 	  self)
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      dlself=yes
-	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	    elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then
 	      dlself=yes
 	    else
 	      dlself=needless
@@ -5261,7 +6660,7 @@ func_mode_link ()
 	    continue
 	    ;;
 	  *)
-	    if test "$prev" = dlfiles; then
+	    if test dlfiles = "$prev"; then
 	      func_append dlfiles " $arg"
 	    else
 	      func_append dlprefiles " $arg"
@@ -5272,14 +6671,14 @@ func_mode_link ()
 	  esac
 	  ;;
 	expsyms)
-	  export_symbols="$arg"
+	  export_symbols=$arg
 	  test -f "$arg" \
-	    || func_fatal_error "symbol file \`$arg' does not exist"
+	    || func_fatal_error "symbol file '$arg' does not exist"
 	  prev=
 	  continue
 	  ;;
 	expsyms_regex)
-	  export_symbols_regex="$arg"
+	  export_symbols_regex=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5297,7 +6696,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	inst_prefix)
-	  inst_prefix_dir="$arg"
+	  inst_prefix_dir=$arg
+	  prev=
+	  continue
+	  ;;
+	mllvm)
+	  # Clang does not use LLVM to link, so we can simply discard any
+	  # '-mllvm $arg' options when doing the link step.
 	  prev=
 	  continue
 	  ;;
@@ -5321,21 +6726,21 @@ func_mode_link ()
 
 		if test -z "$pic_object" ||
 		   test -z "$non_pic_object" ||
-		   test "$pic_object" = none &&
-		   test "$non_pic_object" = none; then
-		  func_fatal_error "cannot find name of object for \`$arg'"
+		   test none = "$pic_object" &&
+		   test none = "$non_pic_object"; then
+		  func_fatal_error "cannot find name of object for '$arg'"
 		fi
 
 		# Extract subdirectory from the argument.
 		func_dirname "$arg" "/" ""
-		xdir="$func_dirname_result"
+		xdir=$func_dirname_result
 
-		if test "$pic_object" != none; then
+		if test none != "$pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  pic_object="$xdir$pic_object"
+		  pic_object=$xdir$pic_object
 
-		  if test "$prev" = dlfiles; then
-		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		  if test dlfiles = "$prev"; then
+		    if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		      func_append dlfiles " $pic_object"
 		      prev=
 		      continue
@@ -5346,7 +6751,7 @@ func_mode_link ()
 		  fi
 
 		  # CHECK ME:  I think I busted this.  -Ossama
-		  if test "$prev" = dlprefiles; then
+		  if test dlprefiles = "$prev"; then
 		    # Preload the old-style object.
 		    func_append dlprefiles " $pic_object"
 		    prev=
@@ -5354,23 +6759,23 @@ func_mode_link ()
 
 		  # A PIC object.
 		  func_append libobjs " $pic_object"
-		  arg="$pic_object"
+		  arg=$pic_object
 		fi
 
 		# Non-PIC object.
-		if test "$non_pic_object" != none; then
+		if test none != "$non_pic_object"; then
 		  # Prepend the subdirectory the object is found in.
-		  non_pic_object="$xdir$non_pic_object"
+		  non_pic_object=$xdir$non_pic_object
 
 		  # A standard non-PIC object
 		  func_append non_pic_objects " $non_pic_object"
-		  if test -z "$pic_object" || test "$pic_object" = none ; then
-		    arg="$non_pic_object"
+		  if test -z "$pic_object" || test none = "$pic_object"; then
+		    arg=$non_pic_object
 		  fi
 		else
 		  # If the PIC object exists, use it instead.
 		  # $xdir was prepended to $pic_object above.
-		  non_pic_object="$pic_object"
+		  non_pic_object=$pic_object
 		  func_append non_pic_objects " $non_pic_object"
 		fi
 	      else
@@ -5378,7 +6783,7 @@ func_mode_link ()
 		if $opt_dry_run; then
 		  # Extract subdirectory from the argument.
 		  func_dirname "$arg" "/" ""
-		  xdir="$func_dirname_result"
+		  xdir=$func_dirname_result
 
 		  func_lo2o "$arg"
 		  pic_object=$xdir$objdir/$func_lo2o_result
@@ -5386,24 +6791,29 @@ func_mode_link ()
 		  func_append libobjs " $pic_object"
 		  func_append non_pic_objects " $non_pic_object"
 	        else
-		  func_fatal_error "\`$arg' is not a valid libtool object"
+		  func_fatal_error "'$arg' is not a valid libtool object"
 		fi
 	      fi
 	    done
 	  else
-	    func_fatal_error "link input file \`$arg' does not exist"
+	    func_fatal_error "link input file '$arg' does not exist"
 	  fi
 	  arg=$save_arg
 	  prev=
 	  continue
 	  ;;
+	os2dllname)
+	  os2dllname=$arg
+	  prev=
+	  continue
+	  ;;
 	precious_regex)
-	  precious_files_regex="$arg"
+	  precious_files_regex=$arg
 	  prev=
 	  continue
 	  ;;
 	release)
-	  release="-$arg"
+	  release=-$arg
 	  prev=
 	  continue
 	  ;;
@@ -5415,7 +6825,7 @@ func_mode_link ()
 	    func_fatal_error "only absolute run-paths are allowed"
 	    ;;
 	  esac
-	  if test "$prev" = rpath; then
+	  if test rpath = "$prev"; then
 	    case "$rpath " in
 	    *" $arg "*) ;;
 	    *) func_append rpath " $arg" ;;
@@ -5430,7 +6840,7 @@ func_mode_link ()
 	  continue
 	  ;;
 	shrext)
-	  shrext_cmds="$arg"
+	  shrext_cmds=$arg
 	  prev=
 	  continue
 	  ;;
@@ -5470,7 +6880,7 @@ func_mode_link ()
 	esac
       fi # test -n "$prev"
 
-      prevarg="$arg"
+      prevarg=$arg
 
       case $arg in
       -all-static)
@@ -5484,7 +6894,7 @@ func_mode_link ()
 
       -allow-undefined)
 	# FIXME: remove this flag sometime in the future.
-	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	func_fatal_error "'-allow-undefined' must not be used because it is the default"
 	;;
 
       -avoid-version)
@@ -5516,7 +6926,7 @@ func_mode_link ()
 	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
 	  func_fatal_error "more than one -exported-symbols argument is not allowed"
 	fi
-	if test "X$arg" = "X-export-symbols"; then
+	if test X-export-symbols = "X$arg"; then
 	  prev=expsyms
 	else
 	  prev=expsyms_regex
@@ -5550,9 +6960,9 @@ func_mode_link ()
 	func_stripname "-L" '' "$arg"
 	if test -z "$func_stripname_result"; then
 	  if test "$#" -gt 0; then
-	    func_fatal_error "require no space between \`-L' and \`$1'"
+	    func_fatal_error "require no space between '-L' and '$1'"
 	  else
-	    func_fatal_error "need path for \`-L' option"
+	    func_fatal_error "need path for '-L' option"
 	  fi
 	fi
 	func_resolve_sysroot "$func_stripname_result"
@@ -5563,8 +6973,8 @@ func_mode_link ()
 	*)
 	  absdir=`cd "$dir" && pwd`
 	  test -z "$absdir" && \
-	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
-	  dir="$absdir"
+	    func_fatal_error "cannot determine absolute directory name of '$dir'"
+	  dir=$absdir
 	  ;;
 	esac
 	case "$deplibs " in
@@ -5599,7 +7009,7 @@ func_mode_link ()
 	;;
 
       -l*)
-	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	if test X-lc = "X$arg" || test X-lm = "X$arg"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
 	    # These systems don't actually have a C or math library (as such)
@@ -5607,11 +7017,11 @@ func_mode_link ()
 	    ;;
 	  *-*-os2*)
 	    # These systems don't actually have a C library (as such)
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
-	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	    # Do not include libc due to us having libc/libc_r.
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
 	    # Rhapsody C and math libraries are in the System framework
@@ -5620,16 +7030,16 @@ func_mode_link ()
 	    ;;
 	  *-*-sco3.2v5* | *-*-sco5v6*)
 	    # Causes problems with __ctype
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
 	    # Compiler inserts libc in the correct place for threads to work
-	    test "X$arg" = "X-lc" && continue
+	    test X-lc = "X$arg" && continue
 	    ;;
 	  esac
-	elif test "X$arg" = "X-lc_r"; then
+	elif test X-lc_r = "X$arg"; then
 	 case $host in
-	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*)
 	   # Do not include libc_r directly, use -pthread flag.
 	   continue
 	   ;;
@@ -5639,6 +7049,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -mllvm)
+	prev=mllvm
+	continue
+	;;
+
       -module)
 	module=yes
 	continue
@@ -5668,7 +7083,7 @@ func_mode_link ()
 	;;
 
       -multi_module)
-	single_module="${wl}-multi_module"
+	single_module=$wl-multi_module
 	continue
 	;;
 
@@ -5682,8 +7097,8 @@ func_mode_link ()
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
 	  # The PATH hackery in wrapper scripts is required on Windows
 	  # and Darwin in order for the loader to find any dlls it needs.
-	  func_warning "\`-no-install' is ignored for $host"
-	  func_warning "assuming \`-no-fast-install' instead"
+	  func_warning "'-no-install' is ignored for $host"
+	  func_warning "assuming '-no-fast-install' instead"
 	  fast_install=no
 	  ;;
 	*) no_install=yes ;;
@@ -5701,6 +7116,11 @@ func_mode_link ()
 	continue
 	;;
 
+      -os2dllname)
+	prev=os2dllname
+	continue
+	;;
+
       -o) prev=output ;;
 
       -precious-files-regex)
@@ -5788,14 +7208,14 @@ func_mode_link ()
 	func_stripname '-Wc,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $func_quote_for_eval_result"
 	  func_append compiler_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5804,15 +7224,15 @@ func_mode_link ()
 	func_stripname '-Wl,' '' "$arg"
 	args=$func_stripname_result
 	arg=
-	save_ifs="$IFS"; IFS=','
+	save_ifs=$IFS; IFS=,
 	for flag in $args; do
-	  IFS="$save_ifs"
+	  IFS=$save_ifs
           func_quote_for_eval "$flag"
 	  func_append arg " $wl$func_quote_for_eval_result"
 	  func_append compiler_flags " $wl$func_quote_for_eval_result"
 	  func_append linker_flags " $func_quote_for_eval_result"
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 	func_stripname ' ' '' "$arg"
 	arg=$func_stripname_result
 	;;
@@ -5835,7 +7255,7 @@ func_mode_link ()
       # -msg_* for osf cc
       -msg_*)
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       # Flags to be passed through unchanged, with rationale:
@@ -5847,25 +7267,49 @@ func_mode_link ()
       # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
       # -F/path              path to uninstalled frameworks, gcc on darwin
       # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # -fstack-protector*   stack protector flags for GCC
       # @file                GCC response files
       # -tp=*                Portland pgcc target processor selection
       # --sysroot=*          for sysroot support
-      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      # -specs=*             GCC specs files
+      # -stdlib=*            select c++ std lib with clang
+      # -fsanitize=*         Clang/GCC memory and address sanitizer
       -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
       -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
-      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+      -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \
+      -specs=*|-fsanitize=*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
         func_append compile_command " $arg"
         func_append finalize_command " $arg"
         func_append compiler_flags " $arg"
         continue
         ;;
 
+      -Z*)
+        if test os2 = "`expr $host : '.*\(os2\)'`"; then
+          # OS/2 uses -Zxxx to specify OS/2-specific options
+	  compiler_flags="$compiler_flags $arg"
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  case $arg in
+	  -Zlinker | -Zstack)
+	    prev=xcompiler
+	    ;;
+	  esac
+	  continue
+        else
+	  # Otherwise treat like 'Some other compiler flag' below
+	  func_quote_for_eval "$arg"
+	  arg=$func_quote_for_eval_result
+        fi
+	;;
+
       # Some other compiler flag.
       -* | +*)
         func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
 
       *.$objext)
@@ -5886,21 +7330,21 @@ func_mode_link ()
 
 	  if test -z "$pic_object" ||
 	     test -z "$non_pic_object" ||
-	     test "$pic_object" = none &&
-	     test "$non_pic_object" = none; then
-	    func_fatal_error "cannot find name of object for \`$arg'"
+	     test none = "$pic_object" &&
+	     test none = "$non_pic_object"; then
+	    func_fatal_error "cannot find name of object for '$arg'"
 	  fi
 
 	  # Extract subdirectory from the argument.
 	  func_dirname "$arg" "/" ""
-	  xdir="$func_dirname_result"
+	  xdir=$func_dirname_result
 
-	  if test "$pic_object" != none; then
+	  test none = "$pic_object" || {
 	    # Prepend the subdirectory the object is found in.
-	    pic_object="$xdir$pic_object"
+	    pic_object=$xdir$pic_object
 
-	    if test "$prev" = dlfiles; then
-	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+	    if test dlfiles = "$prev"; then
+	      if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then
 		func_append dlfiles " $pic_object"
 		prev=
 		continue
@@ -5911,7 +7355,7 @@ func_mode_link ()
 	    fi
 
 	    # CHECK ME:  I think I busted this.  -Ossama
-	    if test "$prev" = dlprefiles; then
+	    if test dlprefiles = "$prev"; then
 	      # Preload the old-style object.
 	      func_append dlprefiles " $pic_object"
 	      prev=
@@ -5919,23 +7363,23 @@ func_mode_link ()
 
 	    # A PIC object.
 	    func_append libobjs " $pic_object"
-	    arg="$pic_object"
-	  fi
+	    arg=$pic_object
+	  }
 
 	  # Non-PIC object.
-	  if test "$non_pic_object" != none; then
+	  if test none != "$non_pic_object"; then
 	    # Prepend the subdirectory the object is found in.
-	    non_pic_object="$xdir$non_pic_object"
+	    non_pic_object=$xdir$non_pic_object
 
 	    # A standard non-PIC object
 	    func_append non_pic_objects " $non_pic_object"
-	    if test -z "$pic_object" || test "$pic_object" = none ; then
-	      arg="$non_pic_object"
+	    if test -z "$pic_object" || test none = "$pic_object"; then
+	      arg=$non_pic_object
 	    fi
 	  else
 	    # If the PIC object exists, use it instead.
 	    # $xdir was prepended to $pic_object above.
-	    non_pic_object="$pic_object"
+	    non_pic_object=$pic_object
 	    func_append non_pic_objects " $non_pic_object"
 	  fi
 	else
@@ -5943,7 +7387,7 @@ func_mode_link ()
 	  if $opt_dry_run; then
 	    # Extract subdirectory from the argument.
 	    func_dirname "$arg" "/" ""
-	    xdir="$func_dirname_result"
+	    xdir=$func_dirname_result
 
 	    func_lo2o "$arg"
 	    pic_object=$xdir$objdir/$func_lo2o_result
@@ -5951,7 +7395,7 @@ func_mode_link ()
 	    func_append libobjs " $pic_object"
 	    func_append non_pic_objects " $non_pic_object"
 	  else
-	    func_fatal_error "\`$arg' is not a valid libtool object"
+	    func_fatal_error "'$arg' is not a valid libtool object"
 	  fi
 	fi
 	;;
@@ -5967,11 +7411,11 @@ func_mode_link ()
 	# A libtool-controlled library.
 
 	func_resolve_sysroot "$arg"
-	if test "$prev" = dlfiles; then
+	if test dlfiles = "$prev"; then
 	  # This library was specified with -dlopen.
 	  func_append dlfiles " $func_resolve_sysroot_result"
 	  prev=
-	elif test "$prev" = dlprefiles; then
+	elif test dlprefiles = "$prev"; then
 	  # The library was specified with -dlpreopen.
 	  func_append dlprefiles " $func_resolve_sysroot_result"
 	  prev=
@@ -5986,7 +7430,7 @@ func_mode_link ()
 	# Unknown arguments in both finalize_command and compile_command need
 	# to be aesthetically quoted because they are evaled later.
 	func_quote_for_eval "$arg"
-	arg="$func_quote_for_eval_result"
+	arg=$func_quote_for_eval_result
 	;;
       esac # arg
 
@@ -5998,9 +7442,9 @@ func_mode_link ()
     done # argument parsing loop
 
     test -n "$prev" && \
-      func_fatal_help "the \`$prevarg' option requires an argument"
+      func_fatal_help "the '$prevarg' option requires an argument"
 
-    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+    if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then
       eval arg=\"$export_dynamic_flag_spec\"
       func_append compile_command " $arg"
       func_append finalize_command " $arg"
@@ -6009,20 +7453,23 @@ func_mode_link ()
     oldlibs=
     # calculate the name of the file, without its directory
     func_basename "$output"
-    outputname="$func_basename_result"
-    libobjs_save="$libobjs"
+    outputname=$func_basename_result
+    libobjs_save=$libobjs
 
     if test -n "$shlibpath_var"; then
       # get the directories listed in $shlibpath_var
-      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+      eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\`
     else
       shlib_search_path=
     fi
     eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
     eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
 
+    # Definition is injected by LT_CONFIG during libtool generation.
+    func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH"
+
     func_dirname "$output" "/" ""
-    output_objdir="$func_dirname_result$objdir"
+    output_objdir=$func_dirname_result$objdir
     func_to_tool_file "$output_objdir/"
     tool_output_objdir=$func_to_tool_file_result
     # Create the object directory.
@@ -6045,7 +7492,7 @@ func_mode_link ()
     # Find all interdependent deplibs by searching for libraries
     # that are linked more than once (e.g. -la -lb -la)
     for deplib in $deplibs; do
-      if $opt_preserve_dup_deps ; then
+      if $opt_preserve_dup_deps; then
 	case "$libs " in
 	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	esac
@@ -6053,7 +7500,7 @@ func_mode_link ()
       func_append libs " $deplib"
     done
 
-    if test "$linkmode" = lib; then
+    if test lib = "$linkmode"; then
       libs="$predeps $libs $compiler_lib_search_path $postdeps"
 
       # Compute libraries that are listed more than once in $predeps
@@ -6085,7 +7532,7 @@ func_mode_link ()
 	  case $file in
 	  *.la) ;;
 	  *)
-	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    func_fatal_help "libraries can '-dlopen' only libtool libraries: $file"
 	    ;;
 	  esac
 	done
@@ -6093,7 +7540,7 @@ func_mode_link ()
     prog)
 	compile_deplibs=
 	finalize_deplibs=
-	alldeplibs=no
+	alldeplibs=false
 	newdlfiles=
 	newdlprefiles=
 	passes="conv scan dlopen dlpreopen link"
@@ -6105,29 +7552,32 @@ func_mode_link ()
     for pass in $passes; do
       # The preopen pass in lib mode reverses $deplibs; put it back here
       # so that -L comes before libs that need it for instance...
-      if test "$linkmode,$pass" = "lib,link"; then
+      if test lib,link = "$linkmode,$pass"; then
 	## FIXME: Find the place where the list is rebuilt in the wrong
 	##        order, and fix it there properly
         tmp_deplibs=
 	for deplib in $deplibs; do
 	  tmp_deplibs="$deplib $tmp_deplibs"
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
       fi
 
-      if test "$linkmode,$pass" = "lib,link" ||
-	 test "$linkmode,$pass" = "prog,scan"; then
-	libs="$deplibs"
+      if test lib,link = "$linkmode,$pass" ||
+	 test prog,scan = "$linkmode,$pass"; then
+	libs=$deplibs
 	deplibs=
       fi
-      if test "$linkmode" = prog; then
+      if test prog = "$linkmode"; then
 	case $pass in
-	dlopen) libs="$dlfiles" ;;
-	dlpreopen) libs="$dlprefiles" ;;
-	link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
+	dlopen) libs=$dlfiles ;;
+	dlpreopen) libs=$dlprefiles ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
 	esac
       fi
-      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+      if test lib,dlpreopen = "$linkmode,$pass"; then
 	# Collect and forward deplibs of preopened libtool libs
 	for lib in $dlprefiles; do
 	  # Ignore non-libtool-libs
@@ -6148,26 +7598,26 @@ func_mode_link ()
 	    esac
 	  done
 	done
-	libs="$dlprefiles"
+	libs=$dlprefiles
       fi
-      if test "$pass" = dlopen; then
+      if test dlopen = "$pass"; then
 	# Collect dlpreopened libraries
-	save_deplibs="$deplibs"
+	save_deplibs=$deplibs
 	deplibs=
       fi
 
       for deplib in $libs; do
 	lib=
-	found=no
+	found=false
 	case $deplib in
 	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
         |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    func_append compiler_flags " $deplib"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6177,13 +7627,13 @@ func_mode_link ()
 	  continue
 	  ;;
 	-l*)
-	  if test "$linkmode" != lib && test "$linkmode" != prog; then
-	    func_warning "\`-l' is ignored for archives/objects"
+	  if test lib != "$linkmode" && test prog != "$linkmode"; then
+	    func_warning "'-l' is ignored for archives/objects"
 	    continue
 	  fi
 	  func_stripname '-l' '' "$deplib"
 	  name=$func_stripname_result
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
 	  else
 	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
@@ -6191,31 +7641,22 @@ func_mode_link ()
 	  for searchdir in $searchdirs; do
 	    for search_ext in .la $std_shrext .so .a; do
 	      # Search the libtool library
-	      lib="$searchdir/lib${name}${search_ext}"
+	      lib=$searchdir/lib$name$search_ext
 	      if test -f "$lib"; then
-		if test "$search_ext" = ".la"; then
-		  found=yes
+		if test .la = "$search_ext"; then
+		  found=:
 		else
-		  found=no
+		  found=false
 		fi
 		break 2
 	      fi
 	    done
 	  done
-	  if test "$found" != yes; then
-	    # deplib doesn't seem to be a libtool library
-	    if test "$linkmode,$pass" = "prog,link"; then
-	      compile_deplibs="$deplib $compile_deplibs"
-	      finalize_deplibs="$deplib $finalize_deplibs"
-	    else
-	      deplibs="$deplib $deplibs"
-	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
-	    fi
-	    continue
-	  else # deplib is a libtool library
+	  if $found; then
+	    # deplib is a libtool library
 	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
 	    # We need to do some special things here, and not later.
-	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 	      case " $predeps $postdeps " in
 	      *" $deplib "*)
 		if func_lalib_p "$lib"; then
@@ -6223,19 +7664,19 @@ func_mode_link ()
 		  old_library=
 		  func_source "$lib"
 		  for l in $old_library $library_names; do
-		    ll="$l"
+		    ll=$l
 		  done
-		  if test "X$ll" = "X$old_library" ; then # only static version available
-		    found=no
+		  if test "X$ll" = "X$old_library"; then # only static version available
+		    found=false
 		    func_dirname "$lib" "" "."
-		    ladir="$func_dirname_result"
+		    ladir=$func_dirname_result
 		    lib=$ladir/$old_library
-		    if test "$linkmode,$pass" = "prog,link"; then
+		    if test prog,link = "$linkmode,$pass"; then
 		      compile_deplibs="$deplib $compile_deplibs"
 		      finalize_deplibs="$deplib $finalize_deplibs"
 		    else
 		      deplibs="$deplib $deplibs"
-		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
 		    fi
 		    continue
 		  fi
@@ -6244,15 +7685,25 @@ func_mode_link ()
 	      *) ;;
 	      esac
 	    fi
+	  else
+	    # deplib doesn't seem to be a libtool library
+	    if test prog,link = "$linkmode,$pass"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
 	  fi
 	  ;; # -l
 	*.ltframework)
-	  if test "$linkmode,$pass" = "prog,link"; then
+	  if test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$deplib $compile_deplibs"
 	    finalize_deplibs="$deplib $finalize_deplibs"
 	  else
 	    deplibs="$deplib $deplibs"
-	    if test "$linkmode" = lib ; then
+	    if test lib = "$linkmode"; then
 		case "$new_inherited_linker_flags " in
 		    *" $deplib "*) ;;
 		    * ) func_append new_inherited_linker_flags " $deplib" ;;
@@ -6265,18 +7716,18 @@ func_mode_link ()
 	  case $linkmode in
 	  lib)
 	    deplibs="$deplib $deplibs"
-	    test "$pass" = conv && continue
+	    test conv = "$pass" && continue
 	    newdependency_libs="$deplib $newdependency_libs"
 	    func_stripname '-L' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  prog)
-	    if test "$pass" = conv; then
+	    if test conv = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	      continue
 	    fi
-	    if test "$pass" = scan; then
+	    if test scan = "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6287,13 +7738,13 @@ func_mode_link ()
 	    func_append newlib_search_path " $func_resolve_sysroot_result"
 	    ;;
 	  *)
-	    func_warning "\`-L' is ignored for archives/objects"
+	    func_warning "'-L' is ignored for archives/objects"
 	    ;;
 	  esac # linkmode
 	  continue
 	  ;; # -L
 	-R*)
-	  if test "$pass" = link; then
+	  if test link = "$pass"; then
 	    func_stripname '-R' '' "$deplib"
 	    func_resolve_sysroot "$func_stripname_result"
 	    dir=$func_resolve_sysroot_result
@@ -6311,7 +7762,7 @@ func_mode_link ()
 	  lib=$func_resolve_sysroot_result
 	  ;;
 	*.$libext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
 	    continue
 	  fi
@@ -6322,21 +7773,26 @@ func_mode_link ()
 	    case " $dlpreconveniencelibs " in
 	    *" $deplib "*) ;;
 	    *)
-	      valid_a_lib=no
+	      valid_a_lib=false
 	      case $deplibs_check_method in
 		match_pattern*)
 		  set dummy $deplibs_check_method; shift
 		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
 		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
 		    | $EGREP "$match_pattern_regex" > /dev/null; then
-		    valid_a_lib=yes
+		    valid_a_lib=:
 		  fi
 		;;
 		pass_all)
-		  valid_a_lib=yes
+		  valid_a_lib=:
 		;;
 	      esac
-	      if test "$valid_a_lib" != yes; then
+	      if $valid_a_lib; then
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      else
 		echo
 		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
 		echo "*** I have the capability to make that library automatically link in when"
@@ -6344,18 +7800,13 @@ func_mode_link ()
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because the file extensions .$libext of this argument makes me believe"
 		echo "*** that it is just a static archive that I should not use here."
-	      else
-		echo
-		$ECHO "*** Warning: Linking the shared library $output against the"
-		$ECHO "*** static library $deplib is not portable!"
-		deplibs="$deplib $deplibs"
 	      fi
 	      ;;
 	    esac
 	    continue
 	    ;;
 	  prog)
-	    if test "$pass" != link; then
+	    if test link != "$pass"; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      compile_deplibs="$deplib $compile_deplibs"
@@ -6366,10 +7817,10 @@ func_mode_link ()
 	  esac # linkmode
 	  ;; # *.$libext
 	*.lo | *.$objext)
-	  if test "$pass" = conv; then
+	  if test conv = "$pass"; then
 	    deplibs="$deplib $deplibs"
-	  elif test "$linkmode" = prog; then
-	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	  elif test prog = "$linkmode"; then
+	    if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then
 	      # If there is no dlopen support or we're linking statically,
 	      # we need to preload.
 	      func_append newdlprefiles " $deplib"
@@ -6382,22 +7833,20 @@ func_mode_link ()
 	  continue
 	  ;;
 	%DEPLIBS%)
-	  alldeplibs=yes
+	  alldeplibs=:
 	  continue
 	  ;;
 	esac # case $deplib
 
-	if test "$found" = yes || test -f "$lib"; then :
-	else
-	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
-	fi
+	$found || test -f "$lib" \
+	  || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'"
 
 	# Check to see that this really is a libtool archive.
 	func_lalib_unsafe_p "$lib" \
-	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+	  || func_fatal_error "'$lib' is not a valid libtool archive"
 
 	func_dirname "$lib" "" "."
-	ladir="$func_dirname_result"
+	ladir=$func_dirname_result
 
 	dlname=
 	dlopen=
@@ -6427,36 +7876,36 @@ func_mode_link ()
 	  done
 	fi
 	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
-	if test "$linkmode,$pass" = "lib,link" ||
-	   test "$linkmode,$pass" = "prog,scan" ||
-	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	if test lib,link = "$linkmode,$pass" ||
+	   test prog,scan = "$linkmode,$pass" ||
+	   { test prog != "$linkmode" && test lib != "$linkmode"; }; then
 	  test -n "$dlopen" && func_append dlfiles " $dlopen"
 	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
 	fi
 
-	if test "$pass" = conv; then
+	if test conv = "$pass"; then
 	  # Only check for convenience libraries
 	  deplibs="$lib $deplibs"
 	  if test -z "$libdir"; then
 	    if test -z "$old_library"; then
-	      func_fatal_error "cannot find name of link library for \`$lib'"
+	      func_fatal_error "cannot find name of link library for '$lib'"
 	    fi
 	    # It is a libtool convenience library, so add in its objects.
 	    func_append convenience " $ladir/$objdir/$old_library"
 	    func_append old_convenience " $ladir/$objdir/$old_library"
-	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
-	    func_fatal_error "\`$lib' is not a convenience library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test prog != "$linkmode" && test lib != "$linkmode"; then
+	    func_fatal_error "'$lib' is not a convenience library"
 	  fi
-	  tmp_libs=
-	  for deplib in $dependency_libs; do
-	    deplibs="$deplib $deplibs"
-	    if $opt_preserve_dup_deps ; then
-	      case "$tmp_libs " in
-	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
-	      esac
-	    fi
-	    func_append tmp_libs " $deplib"
-	  done
 	  continue
 	fi # $pass = conv
 
@@ -6464,26 +7913,26 @@ func_mode_link ()
 	# Get the name of the library we link against.
 	linklib=
 	if test -n "$old_library" &&
-	   { test "$prefer_static_libs" = yes ||
-	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	   { test yes = "$prefer_static_libs" ||
+	     test built,no = "$prefer_static_libs,$installed"; }; then
 	  linklib=$old_library
 	else
 	  for l in $old_library $library_names; do
-	    linklib="$l"
+	    linklib=$l
 	  done
 	fi
 	if test -z "$linklib"; then
-	  func_fatal_error "cannot find name of link library for \`$lib'"
+	  func_fatal_error "cannot find name of link library for '$lib'"
 	fi
 
 	# This library was specified with -dlopen.
-	if test "$pass" = dlopen; then
-	  if test -z "$libdir"; then
-	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
-	  fi
+	if test dlopen = "$pass"; then
+	  test -z "$libdir" \
+	    && func_fatal_error "cannot -dlopen a convenience library: '$lib'"
 	  if test -z "$dlname" ||
-	     test "$dlopen_support" != yes ||
-	     test "$build_libtool_libs" = no; then
+	     test yes != "$dlopen_support" ||
+	     test no = "$build_libtool_libs"
+	  then
 	    # If there is no dlname, no dlopen support or we're linking
 	    # statically, we need to preload.  We also need to preload any
 	    # dependent libraries so libltdl's deplib preloader doesn't
@@ -6497,40 +7946,40 @@ func_mode_link ()
 
 	# We need an absolute path.
 	case $ladir in
-	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;;
 	*)
 	  abs_ladir=`cd "$ladir" && pwd`
 	  if test -z "$abs_ladir"; then
-	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "cannot determine absolute directory name of '$ladir'"
 	    func_warning "passing it literally to the linker, although it might fail"
-	    abs_ladir="$ladir"
+	    abs_ladir=$ladir
 	  fi
 	  ;;
 	esac
 	func_basename "$lib"
-	laname="$func_basename_result"
+	laname=$func_basename_result
 
 	# Find the relevant object directory and library name.
-	if test "X$installed" = Xyes; then
+	if test yes = "$installed"; then
 	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    func_warning "library \`$lib' was moved."
-	    dir="$ladir"
-	    absdir="$abs_ladir"
-	    libdir="$abs_ladir"
+	    func_warning "library '$lib' was moved."
+	    dir=$ladir
+	    absdir=$abs_ladir
+	    libdir=$abs_ladir
 	  else
-	    dir="$lt_sysroot$libdir"
-	    absdir="$lt_sysroot$libdir"
+	    dir=$lt_sysroot$libdir
+	    absdir=$lt_sysroot$libdir
 	  fi
-	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	  test yes = "$hardcode_automatic" && avoidtemprpath=yes
 	else
 	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
-	    dir="$ladir"
-	    absdir="$abs_ladir"
+	    dir=$ladir
+	    absdir=$abs_ladir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  else
-	    dir="$ladir/$objdir"
-	    absdir="$abs_ladir/$objdir"
+	    dir=$ladir/$objdir
+	    absdir=$abs_ladir/$objdir
 	    # Remove this search path later
 	    func_append notinst_path " $abs_ladir"
 	  fi
@@ -6539,11 +7988,11 @@ func_mode_link ()
 	name=$func_stripname_result
 
 	# This library was specified with -dlpreopen.
-	if test "$pass" = dlpreopen; then
-	  if test -z "$libdir" && test "$linkmode" = prog; then
-	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	if test dlpreopen = "$pass"; then
+	  if test -z "$libdir" && test prog = "$linkmode"; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'"
 	  fi
-	  case "$host" in
+	  case $host in
 	    # special handling for platforms with PE-DLLs.
 	    *cygwin* | *mingw* | *cegcc* )
 	      # Linker will automatically link against shared library if both
@@ -6587,9 +8036,9 @@ func_mode_link ()
 
 	if test -z "$libdir"; then
 	  # Link the convenience library
-	  if test "$linkmode" = lib; then
+	  if test lib = "$linkmode"; then
 	    deplibs="$dir/$old_library $deplibs"
-	  elif test "$linkmode,$pass" = "prog,link"; then
+	  elif test prog,link = "$linkmode,$pass"; then
 	    compile_deplibs="$dir/$old_library $compile_deplibs"
 	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
 	  else
@@ -6599,14 +8048,14 @@ func_mode_link ()
 	fi
 
 
-	if test "$linkmode" = prog && test "$pass" != link; then
+	if test prog = "$linkmode" && test link != "$pass"; then
 	  func_append newlib_search_path " $ladir"
 	  deplibs="$lib $deplibs"
 
-	  linkalldeplibs=no
-	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
-	     test "$build_libtool_libs" = no; then
-	    linkalldeplibs=yes
+	  linkalldeplibs=false
+	  if test no != "$link_all_deplibs" || test -z "$library_names" ||
+	     test no = "$build_libtool_libs"; then
+	    linkalldeplibs=:
 	  fi
 
 	  tmp_libs=
@@ -6618,14 +8067,14 @@ func_mode_link ()
 		 ;;
 	    esac
 	    # Need to link against all dependency_libs?
-	    if test "$linkalldeplibs" = yes; then
+	    if $linkalldeplibs; then
 	      deplibs="$deplib $deplibs"
 	    else
 	      # Need to hardcode shared library paths
 	      # or/and link against static libraries
 	      newdependency_libs="$deplib $newdependency_libs"
 	    fi
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
 	      esac
@@ -6635,15 +8084,15 @@ func_mode_link ()
 	  continue
 	fi # $linkmode = prog...
 
-	if test "$linkmode,$pass" = "prog,link"; then
+	if test prog,link = "$linkmode,$pass"; then
 	  if test -n "$library_names" &&
-	     { { test "$prefer_static_libs" = no ||
-	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	     { { test no = "$prefer_static_libs" ||
+	         test built,yes = "$prefer_static_libs,$installed"; } ||
 	       test -z "$old_library"; }; then
 	    # We need to hardcode the library path
-	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then
 	      # Make sure the rpath contains only unique directories.
-	      case "$temp_rpath:" in
+	      case $temp_rpath: in
 	      *"$absdir:"*) ;;
 	      *) func_append temp_rpath "$absdir:" ;;
 	      esac
@@ -6672,9 +8121,9 @@ func_mode_link ()
 	    esac
 	  fi # $linkmode,$pass = prog,link...
 
-	  if test "$alldeplibs" = yes &&
-	     { test "$deplibs_check_method" = pass_all ||
-	       { test "$build_libtool_libs" = yes &&
+	  if $alldeplibs &&
+	     { test pass_all = "$deplibs_check_method" ||
+	       { test yes = "$build_libtool_libs" &&
 		 test -n "$library_names"; }; }; then
 	    # We only need to search for static libraries
 	    continue
@@ -6683,19 +8132,19 @@ func_mode_link ()
 
 	link_static=no # Whether the deplib will be linked statically
 	use_static_libs=$prefer_static_libs
-	if test "$use_static_libs" = built && test "$installed" = yes; then
+	if test built = "$use_static_libs" && test yes = "$installed"; then
 	  use_static_libs=no
 	fi
 	if test -n "$library_names" &&
-	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	   { test no = "$use_static_libs" || test -z "$old_library"; }; then
 	  case $host in
-	  *cygwin* | *mingw* | *cegcc*)
+	  *cygwin* | *mingw* | *cegcc* | *os2*)
 	      # No point in relinking DLLs because paths are not encoded
 	      func_append notinst_deplibs " $lib"
 	      need_relink=no
 	    ;;
 	  *)
-	    if test "$installed" = no; then
+	    if test no = "$installed"; then
 	      func_append notinst_deplibs " $lib"
 	      need_relink=yes
 	    fi
@@ -6705,24 +8154,24 @@ func_mode_link ()
 
 	  # Warn about portability, can't link against -module's on some
 	  # systems (darwin).  Don't bleat about dlopened modules though!
-	  dlopenmodule=""
+	  dlopenmodule=
 	  for dlpremoduletest in $dlprefiles; do
 	    if test "X$dlpremoduletest" = "X$lib"; then
-	      dlopenmodule="$dlpremoduletest"
+	      dlopenmodule=$dlpremoduletest
 	      break
 	    fi
 	  done
-	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	  if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then
 	    echo
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
 	    else
 	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
 	    fi
 	    $ECHO "*** $linklib is not portable!"
 	  fi
-	  if test "$linkmode" = lib &&
-	     test "$hardcode_into_libs" = yes; then
+	  if test lib = "$linkmode" &&
+	     test yes = "$hardcode_into_libs"; then
 	    # Hardcode the library path.
 	    # Skip directories that are in the system default run-time
 	    # search path.
@@ -6750,43 +8199,43 @@ func_mode_link ()
 	    # figure out the soname
 	    set dummy $library_names
 	    shift
-	    realname="$1"
+	    realname=$1
 	    shift
 	    libname=`eval "\\$ECHO \"$libname_spec\""`
 	    # use dlname if we got it. it's perfectly good, no?
 	    if test -n "$dlname"; then
-	      soname="$dlname"
+	      soname=$dlname
 	    elif test -n "$soname_spec"; then
 	      # bleh windows
 	      case $host in
-	      *cygwin* | mingw* | *cegcc*)
+	      *cygwin* | mingw* | *cegcc* | *os2*)
 	        func_arith $current - $age
 		major=$func_arith_result
-		versuffix="-$major"
+		versuffix=-$major
 		;;
 	      esac
 	      eval soname=\"$soname_spec\"
 	    else
-	      soname="$realname"
+	      soname=$realname
 	    fi
 
 	    # Make a new name for the extract_expsyms_cmds to use
-	    soroot="$soname"
+	    soroot=$soname
 	    func_basename "$soroot"
-	    soname="$func_basename_result"
+	    soname=$func_basename_result
 	    func_stripname 'lib' '.dll' "$soname"
 	    newlib=libimp-$func_stripname_result.a
 
 	    # If the library has no export list, then create one now
 	    if test -f "$output_objdir/$soname-def"; then :
 	    else
-	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_verbose "extracting exported symbol list from '$soname'"
 	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
 	    fi
 
 	    # Create $newlib
 	    if test -f "$output_objdir/$newlib"; then :; else
-	      func_verbose "generating import library for \`$soname'"
+	      func_verbose "generating import library for '$soname'"
 	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
 	    fi
 	    # make sure the library variables are pointing to the new library
@@ -6794,58 +8243,58 @@ func_mode_link ()
 	    linklib=$newlib
 	  fi # test -n "$old_archive_from_expsyms_cmds"
 
-	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	  if test prog = "$linkmode" || test relink != "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    lib_linked=yes
 	    case $hardcode_action in
 	    immediate | unsupported)
-	      if test "$hardcode_direct" = no; then
-		add="$dir/$linklib"
+	      if test no = "$hardcode_direct"; then
+		add=$dir/$linklib
 		case $host in
-		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
-		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;;
+		  *-*-sysv4*uw2*) add_dir=-L$dir ;;
 		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
-		    *-*-unixware7*) add_dir="-L$dir" ;;
+		    *-*-unixware7*) add_dir=-L$dir ;;
 		  *-*-darwin* )
-		    # if the lib is a (non-dlopened) module then we can not
+		    # if the lib is a (non-dlopened) module then we cannot
 		    # link against it, someone is ignoring the earlier warnings
 		    if /usr/bin/file -L $add 2> /dev/null |
-			 $GREP ": [^:]* bundle" >/dev/null ; then
+			 $GREP ": [^:]* bundle" >/dev/null; then
 		      if test "X$dlopenmodule" != "X$lib"; then
 			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
-			if test -z "$old_library" ; then
+			if test -z "$old_library"; then
 			  echo
 			  echo "*** And there doesn't seem to be a static archive available"
 			  echo "*** The link will probably fail, sorry"
 			else
-			  add="$dir/$old_library"
+			  add=$dir/$old_library
 			fi
 		      elif test -n "$old_library"; then
-			add="$dir/$old_library"
+			add=$dir/$old_library
 		      fi
 		    fi
 		esac
-	      elif test "$hardcode_minus_L" = no; then
+	      elif test no = "$hardcode_minus_L"; then
 		case $host in
-		*-*-sunos*) add_shlibpath="$dir" ;;
+		*-*-sunos*) add_shlibpath=$dir ;;
 		esac
-		add_dir="-L$dir"
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = no; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add_dir=-L$dir
+		add=-l$name
+	      elif test no = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
 	      ;;
 	    relink)
-	      if test "$hardcode_direct" = yes &&
-	         test "$hardcode_direct_absolute" = no; then
-		add="$dir/$linklib"
-	      elif test "$hardcode_minus_L" = yes; then
-		add_dir="-L$absdir"
+	      if test yes = "$hardcode_direct" &&
+	         test no = "$hardcode_direct_absolute"; then
+		add=$dir/$linklib
+	      elif test yes = "$hardcode_minus_L"; then
+		add_dir=-L$absdir
 		# Try looking first in the location we're being installed to.
 		if test -n "$inst_prefix_dir"; then
 		  case $libdir in
@@ -6854,10 +8303,10 @@ func_mode_link ()
 		      ;;
 		  esac
 		fi
-		add="-l$name"
-	      elif test "$hardcode_shlibpath_var" = yes; then
-		add_shlibpath="$dir"
-		add="-l$name"
+		add=-l$name
+	      elif test yes = "$hardcode_shlibpath_var"; then
+		add_shlibpath=$dir
+		add=-l$name
 	      else
 		lib_linked=no
 	      fi
@@ -6865,7 +8314,7 @@ func_mode_link ()
 	    *) lib_linked=no ;;
 	    esac
 
-	    if test "$lib_linked" != yes; then
+	    if test yes != "$lib_linked"; then
 	      func_fatal_configuration "unsupported hardcode properties"
 	    fi
 
@@ -6875,15 +8324,15 @@ func_mode_link ()
 	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
 	      esac
 	    fi
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
 	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
 	    else
 	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
 	      test -n "$add" && deplibs="$add $deplibs"
-	      if test "$hardcode_direct" != yes &&
-		 test "$hardcode_minus_L" != yes &&
-		 test "$hardcode_shlibpath_var" = yes; then
+	      if test yes != "$hardcode_direct" &&
+		 test yes != "$hardcode_minus_L" &&
+		 test yes = "$hardcode_shlibpath_var"; then
 		case :$finalize_shlibpath: in
 		*":$libdir:"*) ;;
 		*) func_append finalize_shlibpath "$libdir:" ;;
@@ -6892,33 +8341,33 @@ func_mode_link ()
 	    fi
 	  fi
 
-	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	  if test prog = "$linkmode" || test relink = "$opt_mode"; then
 	    add_shlibpath=
 	    add_dir=
 	    add=
 	    # Finalize command for both is simple: just hardcode it.
-	    if test "$hardcode_direct" = yes &&
-	       test "$hardcode_direct_absolute" = no; then
-	      add="$libdir/$linklib"
-	    elif test "$hardcode_minus_L" = yes; then
-	      add_dir="-L$libdir"
-	      add="-l$name"
-	    elif test "$hardcode_shlibpath_var" = yes; then
+	    if test yes = "$hardcode_direct" &&
+	       test no = "$hardcode_direct_absolute"; then
+	      add=$libdir/$linklib
+	    elif test yes = "$hardcode_minus_L"; then
+	      add_dir=-L$libdir
+	      add=-l$name
+	    elif test yes = "$hardcode_shlibpath_var"; then
 	      case :$finalize_shlibpath: in
 	      *":$libdir:"*) ;;
 	      *) func_append finalize_shlibpath "$libdir:" ;;
 	      esac
-	      add="-l$name"
-	    elif test "$hardcode_automatic" = yes; then
+	      add=-l$name
+	    elif test yes = "$hardcode_automatic"; then
 	      if test -n "$inst_prefix_dir" &&
-		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
-		add="$inst_prefix_dir$libdir/$linklib"
+		 test -f "$inst_prefix_dir$libdir/$linklib"; then
+		add=$inst_prefix_dir$libdir/$linklib
 	      else
-		add="$libdir/$linklib"
+		add=$libdir/$linklib
 	      fi
 	    else
 	      # We cannot seem to hardcode it, guess we'll fake it.
-	      add_dir="-L$libdir"
+	      add_dir=-L$libdir
 	      # Try looking first in the location we're being installed to.
 	      if test -n "$inst_prefix_dir"; then
 		case $libdir in
@@ -6927,10 +8376,10 @@ func_mode_link ()
 		    ;;
 		esac
 	      fi
-	      add="-l$name"
+	      add=-l$name
 	    fi
 
-	    if test "$linkmode" = prog; then
+	    if test prog = "$linkmode"; then
 	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
 	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
 	    else
@@ -6938,43 +8387,43 @@ func_mode_link ()
 	      test -n "$add" && deplibs="$add $deplibs"
 	    fi
 	  fi
-	elif test "$linkmode" = prog; then
+	elif test prog = "$linkmode"; then
 	  # Here we assume that one of hardcode_direct or hardcode_minus_L
 	  # is not unsupported.  This is valid on all known static and
 	  # shared platforms.
-	  if test "$hardcode_direct" != unsupported; then
-	    test -n "$old_library" && linklib="$old_library"
+	  if test unsupported != "$hardcode_direct"; then
+	    test -n "$old_library" && linklib=$old_library
 	    compile_deplibs="$dir/$linklib $compile_deplibs"
 	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
 	  else
 	    compile_deplibs="-l$name -L$dir $compile_deplibs"
 	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
 	  fi
-	elif test "$build_libtool_libs" = yes; then
+	elif test yes = "$build_libtool_libs"; then
 	  # Not a shared library
-	  if test "$deplibs_check_method" != pass_all; then
+	  if test pass_all != "$deplibs_check_method"; then
 	    # We're trying link a shared library against a static one
 	    # but the system doesn't support it.
 
 	    # Just print a warning and add the library to dependency_libs so
 	    # that the program can be linked against the static library.
 	    echo
-	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    $ECHO "*** Warning: This system cannot link to static lib archive $lib."
 	    echo "*** I have the capability to make that library automatically link in when"
 	    echo "*** you link to this library.  But I can only do this if you have a"
 	    echo "*** shared version of the library, which you do not appear to have."
-	    if test "$module" = yes; then
+	    if test yes = "$module"; then
 	      echo "*** But as you try to build a module library, libtool will still create "
 	      echo "*** a static module, that should work as long as the dlopening application"
 	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
 	      if test -z "$global_symbol_pipe"; then
 		echo
 		echo "*** However, this would only work if libtool was able to extract symbol"
-		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 		echo "*** not find such a program.  So, this module is probably useless."
-		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+		echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	      fi
-	      if test "$build_old_libs" = no; then
+	      if test no = "$build_old_libs"; then
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -6987,11 +8436,11 @@ func_mode_link ()
 	  fi
 	fi # link shared/static library?
 
-	if test "$linkmode" = lib; then
+	if test lib = "$linkmode"; then
 	  if test -n "$dependency_libs" &&
-	     { test "$hardcode_into_libs" != yes ||
-	       test "$build_old_libs" = yes ||
-	       test "$link_static" = yes; }; then
+	     { test yes != "$hardcode_into_libs" ||
+	       test yes = "$build_old_libs" ||
+	       test yes = "$link_static"; }; then
 	    # Extract -R from dependency_libs
 	    temp_deplibs=
 	    for libdir in $dependency_libs; do
@@ -7005,12 +8454,12 @@ func_mode_link ()
 	      *) func_append temp_deplibs " $libdir";;
 	      esac
 	    done
-	    dependency_libs="$temp_deplibs"
+	    dependency_libs=$temp_deplibs
 	  fi
 
 	  func_append newlib_search_path " $absdir"
 	  # Link against this library
-	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
 	  # ... and its dependency_libs
 	  tmp_libs=
 	  for deplib in $dependency_libs; do
@@ -7020,7 +8469,7 @@ func_mode_link ()
                    func_resolve_sysroot "$func_stripname_result";;
               *) func_resolve_sysroot "$deplib" ;;
             esac
-	    if $opt_preserve_dup_deps ; then
+	    if $opt_preserve_dup_deps; then
 	      case "$tmp_libs " in
 	      *" $func_resolve_sysroot_result "*)
                 func_append specialdeplibs " $func_resolve_sysroot_result" ;;
@@ -7029,12 +8478,12 @@ func_mode_link ()
 	    func_append tmp_libs " $func_resolve_sysroot_result"
 	  done
 
-	  if test "$link_all_deplibs" != no; then
+	  if test no != "$link_all_deplibs"; then
 	    # Add the search paths of all dependency libraries
 	    for deplib in $dependency_libs; do
 	      path=
 	      case $deplib in
-	      -L*) path="$deplib" ;;
+	      -L*) path=$deplib ;;
 	      *.la)
 	        func_resolve_sysroot "$deplib"
 	        deplib=$func_resolve_sysroot_result
@@ -7042,12 +8491,12 @@ func_mode_link ()
 		dir=$func_dirname_result
 		# We need an absolute path.
 		case $dir in
-		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;;
 		*)
 		  absdir=`cd "$dir" && pwd`
 		  if test -z "$absdir"; then
-		    func_warning "cannot determine absolute directory name of \`$dir'"
-		    absdir="$dir"
+		    func_warning "cannot determine absolute directory name of '$dir'"
+		    absdir=$dir
 		  fi
 		  ;;
 		esac
@@ -7055,35 +8504,35 @@ func_mode_link ()
 		case $host in
 		*-*-darwin*)
 		  depdepl=
-		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
-		  if test -n "$deplibrary_names" ; then
-		    for tmp in $deplibrary_names ; do
+		  eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names"; then
+		    for tmp in $deplibrary_names; do
 		      depdepl=$tmp
 		    done
-		    if test -f "$absdir/$objdir/$depdepl" ; then
-		      depdepl="$absdir/$objdir/$depdepl"
-		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+		    if test -f "$absdir/$objdir/$depdepl"; then
+		      depdepl=$absdir/$objdir/$depdepl
+		      darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
                       if test -z "$darwin_install_name"; then
-                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                          darwin_install_name=`$OTOOL64 -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
                       fi
-		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
-		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl"
+		      func_append linker_flags " -dylib_file $darwin_install_name:$depdepl"
 		      path=
 		    fi
 		  fi
 		  ;;
 		*)
-		  path="-L$absdir/$objdir"
+		  path=-L$absdir/$objdir
 		  ;;
 		esac
 		else
-		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
 		  test -z "$libdir" && \
-		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		    func_fatal_error "'$deplib' is not a valid libtool archive"
 		  test "$absdir" != "$libdir" && \
-		    func_warning "\`$deplib' seems to be moved"
+		    func_warning "'$deplib' seems to be moved"
 
-		  path="-L$absdir"
+		  path=-L$absdir
 		fi
 		;;
 	      esac
@@ -7095,23 +8544,23 @@ func_mode_link ()
 	  fi # link_all_deplibs != no
 	fi # linkmode = lib
       done # for deplib in $libs
-      if test "$pass" = link; then
-	if test "$linkmode" = "prog"; then
+      if test link = "$pass"; then
+	if test prog = "$linkmode"; then
 	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
 	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
 	else
 	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
 	fi
       fi
-      dependency_libs="$newdependency_libs"
-      if test "$pass" = dlpreopen; then
+      dependency_libs=$newdependency_libs
+      if test dlpreopen = "$pass"; then
 	# Link the dlpreopened libraries before other libraries
 	for deplib in $save_deplibs; do
 	  deplibs="$deplib $deplibs"
 	done
       fi
-      if test "$pass" != dlopen; then
-	if test "$pass" != conv; then
+      if test dlopen != "$pass"; then
+	test conv = "$pass" || {
 	  # Make sure lib_search_path contains only unique directories.
 	  lib_search_path=
 	  for dir in $newlib_search_path; do
@@ -7121,12 +8570,12 @@ func_mode_link ()
 	    esac
 	  done
 	  newlib_search_path=
-	fi
+	}
 
-	if test "$linkmode,$pass" != "prog,link"; then
-	  vars="deplibs"
-	else
+	if test prog,link = "$linkmode,$pass"; then
 	  vars="compile_deplibs finalize_deplibs"
+	else
+	  vars=deplibs
 	fi
 	for var in $vars dependency_libs; do
 	  # Add libraries to $var in reverse order
@@ -7184,62 +8633,93 @@ func_mode_link ()
 	  eval $var=\"$tmp_libs\"
 	done # for var
       fi
+
+      # Add Sun CC postdeps if required:
+      test CXX = "$tagname" && {
+        case $host_os in
+        linux*)
+          case `$CC -V 2>&1 | sed 5q` in
+          *Sun\ C*) # Sun C++ 5.9
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+
+        solaris*)
+          func_cc_basename "$CC"
+          case $func_cc_basename_result in
+          CC* | sunCC*)
+            func_suncc_cstd_abi
+
+            if test no != "$suncc_use_cstd_abi"; then
+              func_append postdeps ' -library=Cstd -library=Crun'
+            fi
+            ;;
+          esac
+          ;;
+        esac
+      }
+
       # Last step: remove runtime libs from dependency_libs
       # (they stay in deplibs)
       tmp_libs=
-      for i in $dependency_libs ; do
+      for i in $dependency_libs; do
 	case " $predeps $postdeps $compiler_lib_search_path " in
 	*" $i "*)
-	  i=""
+	  i=
 	  ;;
 	esac
-	if test -n "$i" ; then
+	if test -n "$i"; then
 	  func_append tmp_libs " $i"
 	fi
       done
       dependency_libs=$tmp_libs
     done # for pass
-    if test "$linkmode" = prog; then
-      dlfiles="$newdlfiles"
+    if test prog = "$linkmode"; then
+      dlfiles=$newdlfiles
     fi
-    if test "$linkmode" = prog || test "$linkmode" = lib; then
-      dlprefiles="$newdlprefiles"
+    if test prog = "$linkmode" || test lib = "$linkmode"; then
+      dlprefiles=$newdlprefiles
     fi
 
     case $linkmode in
     oldlib)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for archives"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for archives"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+	func_warning "'-l' and '-L' are ignored for archives" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for archives"
+	func_warning "'-rpath' is ignored for archives"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for archives"
+	func_warning "'-R' is ignored for archives"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info/-version-number' is ignored for archives"
+	func_warning "'-version-info/-version-number' is ignored for archives"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for archives"
+	func_warning "'-release' is ignored for archives"
 
       test -n "$export_symbols$export_symbols_regex" && \
-	func_warning "\`-export-symbols' is ignored for archives"
+	func_warning "'-export-symbols' is ignored for archives"
 
       # Now set the variables for building old libraries.
       build_libtool_libs=no
-      oldlibs="$output"
+      oldlibs=$output
       func_append objs "$old_deplibs"
       ;;
 
     lib)
-      # Make sure we only generate libraries of the form `libNAME.la'.
+      # Make sure we only generate libraries of the form 'libNAME.la'.
       case $outputname in
       lib*)
 	func_stripname 'lib' '.la' "$outputname"
@@ -7248,10 +8728,10 @@ func_mode_link ()
 	eval libname=\"$libname_spec\"
 	;;
       *)
-	test "$module" = no && \
-	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+	test no = "$module" \
+	  && func_fatal_help "libtool library '$output' must begin with 'lib'"
 
-	if test "$need_lib_prefix" != no; then
+	if test no != "$need_lib_prefix"; then
 	  # Add the "lib" prefix for modules if required
 	  func_stripname '' '.la' "$outputname"
 	  name=$func_stripname_result
@@ -7265,8 +8745,8 @@ func_mode_link ()
       esac
 
       if test -n "$objs"; then
-	if test "$deplibs_check_method" != pass_all; then
-	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	if test pass_all != "$deplibs_check_method"; then
+	  func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs"
 	else
 	  echo
 	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
@@ -7275,21 +8755,21 @@ func_mode_link ()
 	fi
       fi
 
-      test "$dlself" != no && \
-	func_warning "\`-dlopen self' is ignored for libtool libraries"
+      test no = "$dlself" \
+	|| func_warning "'-dlopen self' is ignored for libtool libraries"
 
       set dummy $rpath
       shift
-      test "$#" -gt 1 && \
-	func_warning "ignoring multiple \`-rpath's for a libtool library"
+      test 1 -lt "$#" \
+	&& func_warning "ignoring multiple '-rpath's for a libtool library"
 
-      install_libdir="$1"
+      install_libdir=$1
 
       oldlibs=
       if test -z "$rpath"; then
-	if test "$build_libtool_libs" = yes; then
+	if test yes = "$build_libtool_libs"; then
 	  # Building a libtool convenience library.
-	  # Some compilers have problems with a `.al' extension so
+	  # Some compilers have problems with a '.al' extension so
 	  # convenience libraries should have the same extension an
 	  # archive normally would.
 	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
@@ -7298,20 +8778,20 @@ func_mode_link ()
 	fi
 
 	test -n "$vinfo" && \
-	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+	  func_warning "'-version-info/-version-number' is ignored for convenience libraries"
 
 	test -n "$release" && \
-	  func_warning "\`-release' is ignored for convenience libraries"
+	  func_warning "'-release' is ignored for convenience libraries"
       else
 
 	# Parse the version information argument.
-	save_ifs="$IFS"; IFS=':'
+	save_ifs=$IFS; IFS=:
 	set dummy $vinfo 0 0 0
 	shift
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	test -n "$7" && \
-	  func_fatal_help "too many parameters to \`-version-info'"
+	  func_fatal_help "too many parameters to '-version-info'"
 
 	# convert absolute version numbers to libtool ages
 	# this retains compatibility with .la files and attempts
@@ -7319,42 +8799,45 @@ func_mode_link ()
 
 	case $vinfo_number in
 	yes)
-	  number_major="$1"
-	  number_minor="$2"
-	  number_revision="$3"
+	  number_major=$1
+	  number_minor=$2
+	  number_revision=$3
 	  #
 	  # There are really only two kinds -- those that
 	  # use the current revision as the major version
 	  # and those that subtract age and use age as
 	  # a minor version.  But, then there is irix
-	  # which has an extra 1 added just for fun
+	  # that has an extra 1 added just for fun
 	  #
 	  case $version_type in
 	  # correct linux to gnu/linux during the next big refactor
-	  darwin|linux|osf|windows|none)
+	  darwin|freebsd-elf|linux|osf|windows|none)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_revision"
+	    age=$number_minor
+	    revision=$number_revision
 	    ;;
-	  freebsd-aout|freebsd-elf|qnx|sunos)
-	    current="$number_major"
-	    revision="$number_minor"
-	    age="0"
+	  freebsd-aout|qnx|sunos)
+	    current=$number_major
+	    revision=$number_minor
+	    age=0
 	    ;;
 	  irix|nonstopux)
 	    func_arith $number_major + $number_minor
 	    current=$func_arith_result
-	    age="$number_minor"
-	    revision="$number_minor"
+	    age=$number_minor
+	    revision=$number_minor
 	    lt_irix_increment=no
 	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type '$version_type'"
+	    ;;
 	  esac
 	  ;;
 	no)
-	  current="$1"
-	  revision="$2"
-	  age="$3"
+	  current=$1
+	  revision=$2
+	  age=$3
 	  ;;
 	esac
 
@@ -7362,30 +8845,30 @@ func_mode_link ()
 	case $current in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "CURRENT \`$current' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "CURRENT '$current' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $revision in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "REVISION \`$revision' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "REVISION '$revision' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	case $age in
 	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
 	*)
-	  func_error "AGE \`$age' must be a nonnegative integer"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' must be a nonnegative integer"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	  ;;
 	esac
 
 	if test "$age" -gt "$current"; then
-	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
-	  func_fatal_error "\`$vinfo' is not valid version information"
+	  func_error "AGE '$age' is greater than the current interface number '$current'"
+	  func_fatal_error "'$vinfo' is not valid version information"
 	fi
 
 	# Calculate the version variables.
@@ -7400,26 +8883,36 @@ func_mode_link ()
 	  # verstring for coding it into the library header
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  # Darwin ld doesn't like 0 for these options...
 	  func_arith $current + 1
 	  minor_current=$func_arith_result
-	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
 	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+          # On Darwin other compilers
+          case $CC in
+              nagfor*)
+                  verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision"
+                  ;;
+              *)
+                  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+                  ;;
+          esac
 	  ;;
 
 	freebsd-aout)
-	  major=".$current"
-	  versuffix=".$current.$revision";
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	freebsd-elf)
-	  major=".$current"
-	  versuffix=".$current"
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	irix | nonstopux)
-	  if test "X$lt_irix_increment" = "Xno"; then
+	  if test no = "$lt_irix_increment"; then
 	    func_arith $current - $age
 	  else
 	    func_arith $current - $age + 1
@@ -7430,69 +8923,74 @@ func_mode_link ()
 	    nonstopux) verstring_prefix=nonstopux ;;
 	    *)         verstring_prefix=sgi ;;
 	  esac
-	  verstring="$verstring_prefix$major.$revision"
+	  verstring=$verstring_prefix$major.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$revision
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $revision - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring_prefix$major.$iface:$verstring"
+	    verstring=$verstring_prefix$major.$iface:$verstring
 	  done
 
-	  # Before this point, $major must not contain `.'.
+	  # Before this point, $major must not contain '.'.
 	  major=.$major
-	  versuffix="$major.$revision"
+	  versuffix=$major.$revision
 	  ;;
 
 	linux) # correct to gnu/linux during the next big refactor
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix="$major.$age.$revision"
+	  versuffix=$major.$age.$revision
 	  ;;
 
 	osf)
 	  func_arith $current - $age
 	  major=.$func_arith_result
-	  versuffix=".$current.$age.$revision"
-	  verstring="$current.$age.$revision"
+	  versuffix=.$current.$age.$revision
+	  verstring=$current.$age.$revision
 
 	  # Add in all the interfaces that we are compatible with.
 	  loop=$age
-	  while test "$loop" -ne 0; do
+	  while test 0 -ne "$loop"; do
 	    func_arith $current - $loop
 	    iface=$func_arith_result
 	    func_arith $loop - 1
 	    loop=$func_arith_result
-	    verstring="$verstring:${iface}.0"
+	    verstring=$verstring:$iface.0
 	  done
 
 	  # Make executables depend on our current version.
-	  func_append verstring ":${current}.0"
+	  func_append verstring ":$current.0"
 	  ;;
 
 	qnx)
-	  major=".$current"
-	  versuffix=".$current"
+	  major=.$current
+	  versuffix=.$current
+	  ;;
+
+	sco)
+	  major=.$current
+	  versuffix=.$current
 	  ;;
 
 	sunos)
-	  major=".$current"
-	  versuffix=".$current.$revision"
+	  major=.$current
+	  versuffix=.$current.$revision
 	  ;;
 
 	windows)
 	  # Use '-' rather than '.', since we only want one
-	  # extension on DOS 8.3 filesystems.
+	  # extension on DOS 8.3 file systems.
 	  func_arith $current - $age
 	  major=$func_arith_result
-	  versuffix="-$major"
+	  versuffix=-$major
 	  ;;
 
 	*)
-	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  func_fatal_configuration "unknown library version type '$version_type'"
 	  ;;
 	esac
 
@@ -7506,42 +9004,45 @@ func_mode_link ()
 	    verstring=
 	    ;;
 	  *)
-	    verstring="0.0"
+	    verstring=0.0
 	    ;;
 	  esac
-	  if test "$need_version" = no; then
+	  if test no = "$need_version"; then
 	    versuffix=
 	  else
-	    versuffix=".0.0"
+	    versuffix=.0.0
 	  fi
 	fi
 
 	# Remove version info from name if versioning should be avoided
-	if test "$avoid_version" = yes && test "$need_version" = no; then
+	if test yes,no = "$avoid_version,$need_version"; then
 	  major=
 	  versuffix=
-	  verstring=""
+	  verstring=
 	fi
 
 	# Check to see if the archive will have undefined symbols.
-	if test "$allow_undefined" = yes; then
-	  if test "$allow_undefined_flag" = unsupported; then
-	    func_warning "undefined symbols not allowed in $host shared libraries"
-	    build_libtool_libs=no
-	    build_old_libs=yes
+	if test yes = "$allow_undefined"; then
+	  if test unsupported = "$allow_undefined_flag"; then
+	    if test yes = "$build_old_libs"; then
+	      func_warning "undefined symbols not allowed in $host shared libraries; building static only"
+	      build_libtool_libs=no
+	    else
+	      func_fatal_error "can't build $host shared library unless -no-undefined is specified"
+	    fi
 	  fi
 	else
 	  # Don't allow undefined symbols.
-	  allow_undefined_flag="$no_undefined_flag"
+	  allow_undefined_flag=$no_undefined_flag
 	fi
 
       fi
 
-      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_generate_dlsyms "$libname" "$libname" :
       func_append libobjs " $symfileobj"
-      test "X$libobjs" = "X " && libobjs=
+      test " " = "$libobjs" && libobjs=
 
-      if test "$opt_mode" != relink; then
+      if test relink != "$opt_mode"; then
 	# Remove our outputs, but don't remove object files since they
 	# may have been created when compiling PIC objects.
 	removelist=
@@ -7550,8 +9051,8 @@ func_mode_link ()
 	  case $p in
 	    *.$objext | *.gcno)
 	       ;;
-	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
-	       if test "X$precious_files_regex" != "X"; then
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*)
+	       if test -n "$precious_files_regex"; then
 		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
 		 then
 		   continue
@@ -7567,11 +9068,11 @@ func_mode_link ()
       fi
 
       # Now set the variables for building old libraries.
-      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+      if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then
 	func_append oldlibs " $output_objdir/$libname.$libext"
 
 	# Transform .lo files to .o files.
-	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP`
       fi
 
       # Eliminate all temporary directories.
@@ -7592,13 +9093,13 @@ func_mode_link ()
 	  *) func_append finalize_rpath " $libdir" ;;
 	  esac
 	done
-	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then
 	  dependency_libs="$temp_xrpath $dependency_libs"
 	fi
       fi
 
       # Make sure dlfiles contains only unique files that won't be dlpreopened
-      old_dlfiles="$dlfiles"
+      old_dlfiles=$dlfiles
       dlfiles=
       for lib in $old_dlfiles; do
 	case " $dlprefiles $dlfiles " in
@@ -7608,7 +9109,7 @@ func_mode_link ()
       done
 
       # Make sure dlprefiles contains only unique files
-      old_dlprefiles="$dlprefiles"
+      old_dlprefiles=$dlprefiles
       dlprefiles=
       for lib in $old_dlprefiles; do
 	case "$dlprefiles " in
@@ -7617,7 +9118,7 @@ func_mode_link ()
 	esac
       done
 
-      if test "$build_libtool_libs" = yes; then
+      if test yes = "$build_libtool_libs"; then
 	if test -n "$rpath"; then
 	  case $host in
 	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
@@ -7641,7 +9142,7 @@ func_mode_link ()
 	    ;;
 	  *)
 	    # Add libc to deplibs on all other systems if necessary.
-	    if test "$build_libtool_need_lc" = "yes"; then
+	    if test yes = "$build_libtool_need_lc"; then
 	      func_append deplibs " -lc"
 	    fi
 	    ;;
@@ -7657,9 +9158,9 @@ func_mode_link ()
 	# I'm not sure if I'm treating the release correctly.  I think
 	# release should show up in the -l (ie -lgmp5) so we don't want to
 	# add it in twice.  Is that correct?
-	release=""
-	versuffix=""
-	major=""
+	release=
+	versuffix=
+	major=
 	newdeplibs=
 	droppeddeps=no
 	case $deplibs_check_method in
@@ -7688,20 +9189,20 @@ EOF
 	      -l*)
 		func_stripname -l '' "$i"
 		name=$func_stripname_result
-		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		  case " $predeps $postdeps " in
 		  *" $i "*)
 		    func_append newdeplibs " $i"
-		    i=""
+		    i=
 		    ;;
 		  esac
 		fi
-		if test -n "$i" ; then
+		if test -n "$i"; then
 		  libname=`eval "\\$ECHO \"$libname_spec\""`
 		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		  set dummy $deplib_matches; shift
 		  deplib_match=$1
-		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		    func_append newdeplibs " $i"
 		  else
 		    droppeddeps=yes
@@ -7731,20 +9232,20 @@ EOF
 		$opt_dry_run || $RM conftest
 		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
 		  ldd_output=`ldd conftest`
-		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		    case " $predeps $postdeps " in
 		    *" $i "*)
 		      func_append newdeplibs " $i"
-		      i=""
+		      i=
 		      ;;
 		    esac
 		  fi
-		  if test -n "$i" ; then
+		  if test -n "$i"; then
 		    libname=`eval "\\$ECHO \"$libname_spec\""`
 		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
 		    set dummy $deplib_matches; shift
 		    deplib_match=$1
-		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0; then
 		      func_append newdeplibs " $i"
 		    else
 		      droppeddeps=yes
@@ -7781,24 +9282,24 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		if test -n "$file_magic_glob"; then
 		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
 		else
 		  libnameglob=$libname
 		fi
-		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		test yes = "$want_nocaseglob" && nocaseglob=`shopt -p nocaseglob`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
-		  if test "$want_nocaseglob" = yes; then
+		  if test yes = "$want_nocaseglob"; then
 		    shopt -s nocaseglob
 		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
 		    $nocaseglob
@@ -7816,25 +9317,25 @@ EOF
 		      # We might still enter an endless loop, since a link
 		      # loop can be closed while we follow links,
 		      # but so what?
-		      potlib="$potent_lib"
+		      potlib=$potent_lib
 		      while test -h "$potlib" 2>/dev/null; do
-			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			potliblink=`ls -ld $potlib | $SED 's/.* -> //'`
 			case $potliblink in
-			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
-			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			[\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;;
+			*) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";;
 			esac
 		      done
 		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
 			 $SED -e 10q |
 			 $EGREP "$file_magic_regex" > /dev/null; then
 			func_append newdeplibs " $a_deplib"
-			a_deplib=""
+			a_deplib=
 			break 2
 		      fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7842,7 +9343,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7865,30 +9366,30 @@ EOF
 	    -l*)
 	      func_stripname -l '' "$a_deplib"
 	      name=$func_stripname_result
-	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      if test yes = "$allow_libtool_libs_with_static_runtimes"; then
 		case " $predeps $postdeps " in
 		*" $a_deplib "*)
 		  func_append newdeplibs " $a_deplib"
-		  a_deplib=""
+		  a_deplib=
 		  ;;
 		esac
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		libname=`eval "\\$ECHO \"$libname_spec\""`
 		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
 		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
 		  for potent_lib in $potential_libs; do
-		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    potlib=$potent_lib # see symlink-check above in file_magic test
 		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
 		       $EGREP "$match_pattern_regex" > /dev/null; then
 		      func_append newdeplibs " $a_deplib"
-		      a_deplib=""
+		      a_deplib=
 		      break 2
 		    fi
 		  done
 		done
 	      fi
-	      if test -n "$a_deplib" ; then
+	      if test -n "$a_deplib"; then
 		droppeddeps=yes
 		echo
 		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
@@ -7896,7 +9397,7 @@ EOF
 		echo "*** you link to this library.  But I can only do this if you have a"
 		echo "*** shared version of the library, which you do not appear to have"
 		echo "*** because I did check the linker path looking for a file starting"
-		if test -z "$potlib" ; then
+		if test -z "$potlib"; then
 		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
 		else
 		  $ECHO "*** with $libname and none of the candidates passed a file format test"
@@ -7912,18 +9413,18 @@ EOF
 	  done # Gone through all deplibs.
 	  ;;
 	none | unknown | *)
-	  newdeplibs=""
+	  newdeplibs=
 	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
-	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
-	    for i in $predeps $postdeps ; do
+	  if test yes = "$allow_libtool_libs_with_static_runtimes"; then
+	    for i in $predeps $postdeps; do
 	      # can't use Xsed below, because $i might contain '/'
-	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"`
 	    done
 	  fi
 	  case $tmp_deplibs in
 	  *[!\	\ ]*)
 	    echo
-	    if test "X$deplibs_check_method" = "Xnone"; then
+	    if test none = "$deplibs_check_method"; then
 	      echo "*** Warning: inter-library dependencies are not supported in this platform."
 	    else
 	      echo "*** Warning: inter-library dependencies are not known to be supported."
@@ -7947,8 +9448,8 @@ EOF
 	  ;;
 	esac
 
-	if test "$droppeddeps" = yes; then
-	  if test "$module" = yes; then
+	if test yes = "$droppeddeps"; then
+	  if test yes = "$module"; then
 	    echo
 	    echo "*** Warning: libtool could not satisfy all declared inter-library"
 	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
@@ -7957,12 +9458,12 @@ EOF
 	    if test -z "$global_symbol_pipe"; then
 	      echo
 	      echo "*** However, this would only work if libtool was able to extract symbol"
-	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** lists from a program, using 'nm' or equivalent, but libtool could"
 	      echo "*** not find such a program.  So, this module is probably useless."
-	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      echo "*** 'nm' from GNU binutils and a full rebuild may help."
 	    fi
-	    if test "$build_old_libs" = no; then
-	      oldlibs="$output_objdir/$libname.$libext"
+	    if test no = "$build_old_libs"; then
+	      oldlibs=$output_objdir/$libname.$libext
 	      build_libtool_libs=module
 	      build_old_libs=yes
 	    else
@@ -7973,14 +9474,14 @@ EOF
 	    echo "*** automatically added whenever a program is linked with this library"
 	    echo "*** or is declared to -dlopen it."
 
-	    if test "$allow_undefined" = no; then
+	    if test no = "$allow_undefined"; then
 	      echo
 	      echo "*** Since this library must not contain undefined symbols,"
 	      echo "*** because either the platform does not support them or"
 	      echo "*** it was explicitly requested with -no-undefined,"
 	      echo "*** libtool will only create a static version of it."
-	      if test "$build_old_libs" = no; then
-		oldlibs="$output_objdir/$libname.$libext"
+	      if test no = "$build_old_libs"; then
+		oldlibs=$output_objdir/$libname.$libext
 		build_libtool_libs=module
 		build_old_libs=yes
 	      else
@@ -8026,7 +9527,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      deplibs="$new_libs"
+      deplibs=$new_libs
 
       # All the library-specific variables (install_libdir is set above).
       library_names=
@@ -8034,25 +9535,25 @@ EOF
       dlname=
 
       # Test again, we may have decided not to build it any more
-      if test "$build_libtool_libs" = yes; then
-	# Remove ${wl} instances when linking with ld.
+      if test yes = "$build_libtool_libs"; then
+	# Remove $wl instances when linking with ld.
 	# FIXME: should test the right _cmds variable.
 	case $archive_cmds in
 	  *\$LD\ *) wl= ;;
         esac
-	if test "$hardcode_into_libs" = yes; then
+	if test yes = "$hardcode_into_libs"; then
 	  # Hardcode the library paths
 	  hardcode_libdirs=
 	  dep_rpath=
-	  rpath="$finalize_rpath"
-	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  rpath=$finalize_rpath
+	  test relink = "$opt_mode" || rpath=$compile_rpath$rpath
 	  for libdir in $rpath; do
 	    if test -n "$hardcode_libdir_flag_spec"; then
 	      if test -n "$hardcode_libdir_separator"; then
 		func_replace_sysroot "$libdir"
 		libdir=$func_replace_sysroot_result
 		if test -z "$hardcode_libdirs"; then
-		  hardcode_libdirs="$libdir"
+		  hardcode_libdirs=$libdir
 		else
 		  # Just accumulate the unique libdirs.
 		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8077,7 +9578,7 @@ EOF
 	  # Substitute the hardcoded libdirs into the rpath.
 	  if test -n "$hardcode_libdir_separator" &&
 	     test -n "$hardcode_libdirs"; then
-	    libdir="$hardcode_libdirs"
+	    libdir=$hardcode_libdirs
 	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
 	  fi
 	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
@@ -8091,8 +9592,8 @@ EOF
 	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
 	fi
 
-	shlibpath="$finalize_shlibpath"
-	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	shlibpath=$finalize_shlibpath
+	test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath
 	if test -n "$shlibpath"; then
 	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
 	fi
@@ -8102,19 +9603,19 @@ EOF
 	eval library_names=\"$library_names_spec\"
 	set dummy $library_names
 	shift
-	realname="$1"
+	realname=$1
 	shift
 
 	if test -n "$soname_spec"; then
 	  eval soname=\"$soname_spec\"
 	else
-	  soname="$realname"
+	  soname=$realname
 	fi
 	if test -z "$dlname"; then
 	  dlname=$soname
 	fi
 
-	lib="$output_objdir/$realname"
+	lib=$output_objdir/$realname
 	linknames=
 	for link
 	do
@@ -8128,7 +9629,7 @@ EOF
 	delfiles=
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
 	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
-	  export_symbols="$output_objdir/$libname.uexp"
+	  export_symbols=$output_objdir/$libname.uexp
 	  func_append delfiles " $export_symbols"
 	fi
 
@@ -8137,31 +9638,31 @@ EOF
 	cygwin* | mingw* | cegcc*)
 	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
 	    # exporting using user supplied symfile
-	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	    func_dll_def_p "$export_symbols" || {
 	      # and it's NOT already a .def file. Must figure out
 	      # which of the given symbols are data symbols and tag
 	      # them as such. So, trigger use of export_symbols_cmds.
 	      # export_symbols gets reassigned inside the "prepare
 	      # the list of exported symbols" if statement, so the
 	      # include_expsyms logic still works.
-	      orig_export_symbols="$export_symbols"
+	      orig_export_symbols=$export_symbols
 	      export_symbols=
 	      always_export_symbols=yes
-	    fi
+	    }
 	  fi
 	  ;;
 	esac
 
 	# Prepare the list of exported symbols
 	if test -z "$export_symbols"; then
-	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
-	    func_verbose "generating symbol list for \`$libname.la'"
-	    export_symbols="$output_objdir/$libname.exp"
+	  if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for '$libname.la'"
+	    export_symbols=$output_objdir/$libname.exp
 	    $opt_dry_run || $RM $export_symbols
 	    cmds=$export_symbols_cmds
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd1 in $cmds; do
-	      IFS="$save_ifs"
+	      IFS=$save_ifs
 	      # Take the normal branch if the nm_file_list_spec branch
 	      # doesn't work or if tool conversion is not needed.
 	      case $nm_file_list_spec~$to_tool_file_cmd in
@@ -8175,7 +9676,7 @@ EOF
 		  try_normal_branch=no
 		  ;;
 	      esac
-	      if test "$try_normal_branch" = yes \
+	      if test yes = "$try_normal_branch" \
 		 && { test "$len" -lt "$max_cmd_len" \
 		      || test "$max_cmd_len" -le -1; }
 	      then
@@ -8186,7 +9687,7 @@ EOF
 		output_la=$func_basename_result
 		save_libobjs=$libobjs
 		save_output=$output
-		output=${output_objdir}/${output_la}.nm
+		output=$output_objdir/$output_la.nm
 		func_to_tool_file "$output"
 		libobjs=$nm_file_list_spec$func_to_tool_file_result
 		func_append delfiles " $output"
@@ -8209,8 +9710,8 @@ EOF
 		break
 	      fi
 	    done
-	    IFS="$save_ifs"
-	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	    IFS=$save_ifs
+	    if test -n "$export_symbols_regex" && test : != "$skipped_export"; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
 	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
 	    fi
@@ -8218,16 +9719,16 @@ EOF
 	fi
 
 	if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	  tmp_export_symbols="$export_symbols"
-	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  tmp_export_symbols=$export_symbols
+	  test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	fi
 
-	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	if test : != "$skipped_export" && test -n "$orig_export_symbols"; then
 	  # The given exports_symbols file has to be filtered, so filter it.
-	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # 's' commands, which not all seds can handle. GNU sed should be fine
 	  # though. Also, the filter scales superlinearly with the number of
 	  # global variables. join(1) would be nice here, but unfortunately
 	  # isn't a blessed tool.
@@ -8246,11 +9747,11 @@ EOF
 	    ;;
 	  esac
 	done
-	deplibs="$tmp_deplibs"
+	deplibs=$tmp_deplibs
 
 	if test -n "$convenience"; then
 	  if test -n "$whole_archive_flag_spec" &&
-	    test "$compiler_needs_object" = yes &&
+	    test yes = "$compiler_needs_object" &&
 	    test -z "$libobjs"; then
 	    # extract the archives, so we have objects to list.
 	    # TODO: could optimize this to just extract one archive.
@@ -8261,7 +9762,7 @@ EOF
 	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
 	    test "X$libobjs" = "X " && libobjs=
 	  else
-	    gentop="$output_objdir/${outputname}x"
+	    gentop=$output_objdir/${outputname}x
 	    func_append generated " $gentop"
 
 	    func_extract_archives $gentop $convenience
@@ -8270,18 +9771,18 @@ EOF
 	  fi
 	fi
 
-	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then
 	  eval flag=\"$thread_safe_flag_spec\"
 	  func_append linker_flags " $flag"
 	fi
 
 	# Make a backup of the uninstalled library when relinking
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
 	fi
 
 	# Do each of the archive commands.
-	if test "$module" = yes && test -n "$module_cmds" ; then
+	if test yes = "$module" && test -n "$module_cmds"; then
 	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	    eval test_cmds=\"$module_expsym_cmds\"
 	    cmds=$module_expsym_cmds
@@ -8299,7 +9800,7 @@ EOF
 	  fi
 	fi
 
-	if test "X$skipped_export" != "X:" &&
+	if test : != "$skipped_export" &&
 	   func_len " $test_cmds" &&
 	   len=$func_len_result &&
 	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
@@ -8332,8 +9833,8 @@ EOF
 	  last_robj=
 	  k=1
 
-	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
-	    output=${output_objdir}/${output_la}.lnkscript
+	  if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then
+	    output=$output_objdir/$output_la.lnkscript
 	    func_verbose "creating GNU ld script: $output"
 	    echo 'INPUT (' > $output
 	    for obj in $save_libobjs
@@ -8345,14 +9846,14 @@ EOF
 	    func_append delfiles " $output"
 	    func_to_tool_file "$output"
 	    output=$func_to_tool_file_result
-	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
-	    output=${output_objdir}/${output_la}.lnk
+	  elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then
+	    output=$output_objdir/$output_la.lnk
 	    func_verbose "creating linker input file list: $output"
 	    : > $output
 	    set x $save_libobjs
 	    shift
 	    firstobj=
-	    if test "$compiler_needs_object" = yes; then
+	    if test yes = "$compiler_needs_object"; then
 	      firstobj="$1 "
 	      shift
 	    fi
@@ -8367,7 +9868,7 @@ EOF
 	  else
 	    if test -n "$save_libobjs"; then
 	      func_verbose "creating reloadable object files..."
-	      output=$output_objdir/$output_la-${k}.$objext
+	      output=$output_objdir/$output_la-$k.$objext
 	      eval test_cmds=\"$reload_cmds\"
 	      func_len " $test_cmds"
 	      len0=$func_len_result
@@ -8379,13 +9880,13 @@ EOF
 		func_len " $obj"
 		func_arith $len + $func_len_result
 		len=$func_arith_result
-		if test "X$objlist" = X ||
+		if test -z "$objlist" ||
 		   test "$len" -lt "$max_cmd_len"; then
 		  func_append objlist " $obj"
 		else
 		  # The command $test_cmds is almost too long, add a
 		  # command to the queue.
-		  if test "$k" -eq 1 ; then
+		  if test 1 -eq "$k"; then
 		    # The first file doesn't have a previous command to add.
 		    reload_objs=$objlist
 		    eval concat_cmds=\"$reload_cmds\"
@@ -8395,10 +9896,10 @@ EOF
 		    reload_objs="$objlist $last_robj"
 		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
 		  fi
-		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  last_robj=$output_objdir/$output_la-$k.$objext
 		  func_arith $k + 1
 		  k=$func_arith_result
-		  output=$output_objdir/$output_la-${k}.$objext
+		  output=$output_objdir/$output_la-$k.$objext
 		  objlist=" $obj"
 		  func_len " $last_robj"
 		  func_arith $len0 + $func_len_result
@@ -8410,9 +9911,9 @@ EOF
 	      # files will link in the last one created.
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
 	      reload_objs="$objlist $last_robj"
-	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$reload_cmds\"
 	      if test -n "$last_robj"; then
-	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	        eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
 	      func_append delfiles " $output"
 
@@ -8420,9 +9921,9 @@ EOF
 	      output=
 	    fi
 
-	    if ${skipped_export-false}; then
-	      func_verbose "generating symbol list for \`$libname.la'"
-	      export_symbols="$output_objdir/$libname.exp"
+	    ${skipped_export-false} && {
+	      func_verbose "generating symbol list for '$libname.la'"
+	      export_symbols=$output_objdir/$libname.exp
 	      $opt_dry_run || $RM $export_symbols
 	      libobjs=$output
 	      # Append the command to create the export file.
@@ -8431,16 +9932,16 @@ EOF
 	      if test -n "$last_robj"; then
 		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
 	      fi
-	    fi
+	    }
 
 	    test -n "$save_libobjs" &&
 	      func_verbose "creating a temporary reloadable object file: $output"
 
 	    # Loop through the commands generated above and execute them.
-	    save_ifs="$IFS"; IFS='~'
+	    save_ifs=$IFS; IFS='~'
 	    for cmd in $concat_cmds; do
-	      IFS="$save_ifs"
-	      $opt_silent || {
+	      IFS=$save_ifs
+	      $opt_quiet || {
 		  func_quote_for_expand "$cmd"
 		  eval "func_echo $func_quote_for_expand_result"
 	      }
@@ -8448,7 +9949,7 @@ EOF
 		lt_exit=$?
 
 		# Restore the uninstalled library and exit
-		if test "$opt_mode" = relink; then
+		if test relink = "$opt_mode"; then
 		  ( cd "$output_objdir" && \
 		    $RM "${realname}T" && \
 		    $MV "${realname}U" "$realname" )
@@ -8457,7 +9958,7 @@ EOF
 		exit $lt_exit
 	      }
 	    done
-	    IFS="$save_ifs"
+	    IFS=$save_ifs
 
 	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
 	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
@@ -8465,18 +9966,18 @@ EOF
 	    fi
 	  fi
 
-          if ${skipped_export-false}; then
+          ${skipped_export-false} && {
 	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
-	      tmp_export_symbols="$export_symbols"
-	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      tmp_export_symbols=$export_symbols
+	      test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols
 	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
 	    fi
 
 	    if test -n "$orig_export_symbols"; then
 	      # The given exports_symbols file has to be filtered, so filter it.
-	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      func_verbose "filter symbol list for '$libname.la' to tag DATA exports"
 	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
-	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # 's' commands, which not all seds can handle. GNU sed should be fine
 	      # though. Also, the filter scales superlinearly with the number of
 	      # global variables. join(1) would be nice here, but unfortunately
 	      # isn't a blessed tool.
@@ -8485,7 +9986,7 @@ EOF
 	      export_symbols=$output_objdir/$libname.def
 	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
 	    fi
-	  fi
+	  }
 
 	  libobjs=$output
 	  # Restore the value of output.
@@ -8499,7 +10000,7 @@ EOF
 	  # value of $libobjs for piecewise linking.
 
 	  # Do each of the archive commands.
-	  if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test yes = "$module" && test -n "$module_cmds"; then
 	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
 	      cmds=$module_expsym_cmds
 	    else
@@ -8521,7 +10022,7 @@ EOF
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -8529,11 +10030,12 @@ EOF
 	  test "X$libobjs" = "X " && libobjs=
 	fi
 
-	save_ifs="$IFS"; IFS='~'
+	save_ifs=$IFS; IFS='~'
 	for cmd in $cmds; do
-	  IFS="$save_ifs"
+	  IFS=$sp$nl
 	  eval cmd=\"$cmd\"
-	  $opt_silent || {
+	  IFS=$save_ifs
+	  $opt_quiet || {
 	    func_quote_for_expand "$cmd"
 	    eval "func_echo $func_quote_for_expand_result"
 	  }
@@ -8541,7 +10043,7 @@ EOF
 	    lt_exit=$?
 
 	    # Restore the uninstalled library and exit
-	    if test "$opt_mode" = relink; then
+	    if test relink = "$opt_mode"; then
 	      ( cd "$output_objdir" && \
 	        $RM "${realname}T" && \
 		$MV "${realname}U" "$realname" )
@@ -8550,10 +10052,10 @@ EOF
 	    exit $lt_exit
 	  }
 	done
-	IFS="$save_ifs"
+	IFS=$save_ifs
 
 	# Restore the uninstalled library and exit
-	if test "$opt_mode" = relink; then
+	if test relink = "$opt_mode"; then
 	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
 
 	  if test -n "$convenience"; then
@@ -8573,39 +10075,39 @@ EOF
 	done
 
 	# If -module or -export-dynamic was specified, set the dlname.
-	if test "$module" = yes || test "$export_dynamic" = yes; then
+	if test yes = "$module" || test yes = "$export_dynamic"; then
 	  # On all known operating systems, these are identical.
-	  dlname="$soname"
+	  dlname=$soname
 	fi
       fi
       ;;
 
     obj)
-      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
-	func_warning "\`-dlopen' is ignored for objects"
+      if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then
+	func_warning "'-dlopen' is ignored for objects"
       fi
 
       case " $deplibs" in
       *\ -l* | *\ -L*)
-	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+	func_warning "'-l' and '-L' are ignored for objects" ;;
       esac
 
       test -n "$rpath" && \
-	func_warning "\`-rpath' is ignored for objects"
+	func_warning "'-rpath' is ignored for objects"
 
       test -n "$xrpath" && \
-	func_warning "\`-R' is ignored for objects"
+	func_warning "'-R' is ignored for objects"
 
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for objects"
+	func_warning "'-version-info' is ignored for objects"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for objects"
+	func_warning "'-release' is ignored for objects"
 
       case $output in
       *.lo)
 	test -n "$objs$old_deplibs" && \
-	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+	  func_fatal_error "cannot build library object '$output' from non-libtool objects"
 
 	libobj=$output
 	func_lo2o "$libobj"
@@ -8613,7 +10115,7 @@ EOF
 	;;
       *)
 	libobj=
-	obj="$output"
+	obj=$output
 	;;
       esac
 
@@ -8626,17 +10128,19 @@ EOF
       # the extraction.
       reload_conv_objs=
       gentop=
-      # reload_cmds runs $LD directly, so let us get rid of
-      # -Wl from whole_archive_flag_spec and hope we can get by with
-      # turning comma into space..
-      wl=
-
+      # if reload_cmds runs $LD directly, get rid of -Wl from
+      # whole_archive_flag_spec and hope we can get by with turning comma
+      # into space.
+      case $reload_cmds in
+        *\$LD[\ \$]*) wl= ;;
+      esac
       if test -n "$convenience"; then
 	if test -n "$whole_archive_flag_spec"; then
 	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
-	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	  reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags
 	else
-	  gentop="$output_objdir/${obj}x"
+	  gentop=$output_objdir/${obj}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $convenience
@@ -8645,12 +10149,12 @@ EOF
       fi
 
       # If we're not building shared, we need to use non_pic_objs
-      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+      test yes = "$build_libtool_libs" || libobjs=$non_pic_objects
 
       # Create the old-style object.
-      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+      reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs
 
-      output="$obj"
+      output=$obj
       func_execute_cmds "$reload_cmds" 'exit $?'
 
       # Exit if we aren't doing a library object file.
@@ -8662,7 +10166,7 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$build_libtool_libs" != yes; then
+      test yes = "$build_libtool_libs" || {
 	if test -n "$gentop"; then
 	  func_show_eval '${RM}r "$gentop"'
 	fi
@@ -8672,12 +10176,12 @@ EOF
 	# $show "echo timestamp > $libobj"
 	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
 	exit $EXIT_SUCCESS
-      fi
+      }
 
-      if test -n "$pic_flag" || test "$pic_mode" != default; then
+      if test -n "$pic_flag" || test default != "$pic_mode"; then
 	# Only do commands if we really have different PIC objects.
 	reload_objs="$libobjs $reload_conv_objs"
-	output="$libobj"
+	output=$libobj
 	func_execute_cmds "$reload_cmds" 'exit $?'
       fi
 
@@ -8694,16 +10198,14 @@ EOF
 	          output=$func_stripname_result.exe;;
       esac
       test -n "$vinfo" && \
-	func_warning "\`-version-info' is ignored for programs"
+	func_warning "'-version-info' is ignored for programs"
 
       test -n "$release" && \
-	func_warning "\`-release' is ignored for programs"
+	func_warning "'-release' is ignored for programs"
 
-      test "$preload" = yes \
-        && test "$dlopen_support" = unknown \
-	&& test "$dlopen_self" = unknown \
-	&& test "$dlopen_self_static" = unknown && \
-	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+      $preload \
+	&& test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \
+	&& func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support."
 
       case $host in
       *-*-rhapsody* | *-*-darwin1.[012])
@@ -8717,11 +10219,11 @@ EOF
       *-*-darwin*)
 	# Don't allow lazy linking, it breaks C++ global constructors
 	# But is supposedly fixed on 10.4 or later (yay!).
-	if test "$tagname" = CXX ; then
+	if test CXX = "$tagname"; then
 	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
 	    10.[0123])
-	      func_append compile_command " ${wl}-bind_at_load"
-	      func_append finalize_command " ${wl}-bind_at_load"
+	      func_append compile_command " $wl-bind_at_load"
+	      func_append finalize_command " $wl-bind_at_load"
 	    ;;
 	  esac
 	fi
@@ -8757,7 +10259,7 @@ EOF
 	*) func_append new_libs " $deplib" ;;
 	esac
       done
-      compile_deplibs="$new_libs"
+      compile_deplibs=$new_libs
 
 
       func_append compile_command " $compile_deplibs"
@@ -8781,7 +10283,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8804,7 +10306,7 @@ EOF
 	fi
 	case $host in
 	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
-	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$libdir:"*) ;;
 	  ::) dllsearchpath=$libdir;;
@@ -8821,10 +10323,10 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      compile_rpath="$rpath"
+      compile_rpath=$rpath
 
       rpath=
       hardcode_libdirs=
@@ -8832,7 +10334,7 @@ EOF
 	if test -n "$hardcode_libdir_flag_spec"; then
 	  if test -n "$hardcode_libdir_separator"; then
 	    if test -z "$hardcode_libdirs"; then
-	      hardcode_libdirs="$libdir"
+	      hardcode_libdirs=$libdir
 	    else
 	      # Just accumulate the unique libdirs.
 	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
@@ -8857,45 +10359,43 @@ EOF
       # Substitute the hardcoded libdirs into the rpath.
       if test -n "$hardcode_libdir_separator" &&
 	 test -n "$hardcode_libdirs"; then
-	libdir="$hardcode_libdirs"
+	libdir=$hardcode_libdirs
 	eval rpath=\" $hardcode_libdir_flag_spec\"
       fi
-      finalize_rpath="$rpath"
+      finalize_rpath=$rpath
 
-      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+      if test -n "$libobjs" && test yes = "$build_old_libs"; then
 	# Transform all the library objects into standard objects.
 	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
 	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
       fi
 
-      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+      func_generate_dlsyms "$outputname" "@PROGRAM@" false
 
       # template prelinking step
       if test -n "$prelink_cmds"; then
 	func_execute_cmds "$prelink_cmds" 'exit $?'
       fi
 
-      wrappers_required=yes
+      wrappers_required=:
       case $host in
       *cegcc* | *mingw32ce*)
         # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
-        wrappers_required=no
+        wrappers_required=false
         ;;
       *cygwin* | *mingw* )
-        if test "$build_libtool_libs" != yes; then
-          wrappers_required=no
-        fi
+        test yes = "$build_libtool_libs" || wrappers_required=false
         ;;
       *)
-        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
-          wrappers_required=no
+        if test no = "$need_relink" || test yes != "$build_libtool_libs"; then
+          wrappers_required=false
         fi
         ;;
       esac
-      if test "$wrappers_required" = no; then
+      $wrappers_required || {
 	# Replace the output file specification.
 	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
-	link_command="$compile_command$compile_rpath"
+	link_command=$compile_command$compile_rpath
 
 	# We have no uninstalled library dependencies, so finalize right now.
 	exit_status=0
@@ -8908,12 +10408,12 @@ EOF
 	fi
 
 	# Delete the generated files.
-	if test -f "$output_objdir/${outputname}S.${objext}"; then
-	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	if test -f "$output_objdir/${outputname}S.$objext"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.$objext"'
 	fi
 
 	exit $exit_status
-      fi
+      }
 
       if test -n "$compile_shlibpath$finalize_shlibpath"; then
 	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
@@ -8943,9 +10443,9 @@ EOF
 	fi
       fi
 
-      if test "$no_install" = yes; then
+      if test yes = "$no_install"; then
 	# We don't need to create a wrapper script.
-	link_command="$compile_var$compile_command$compile_rpath"
+	link_command=$compile_var$compile_command$compile_rpath
 	# Replace the output file specification.
 	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
 	# Delete the old output file.
@@ -8962,27 +10462,28 @@ EOF
 	exit $EXIT_SUCCESS
       fi
 
-      if test "$hardcode_action" = relink; then
-	# Fast installation is not supported
-	link_command="$compile_var$compile_command$compile_rpath"
-	relink_command="$finalize_var$finalize_command$finalize_rpath"
+      case $hardcode_action,$fast_install in
+        relink,*)
+	  # Fast installation is not supported
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
 
-	func_warning "this platform does not like uninstalled shared libraries"
-	func_warning "\`$output' will be relinked during installation"
-      else
-	if test "$fast_install" != no; then
-	  link_command="$finalize_var$compile_command$finalize_rpath"
-	  if test "$fast_install" = yes; then
-	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
-	  else
-	    # fast_install is set to needless
-	    relink_command=
-	  fi
-	else
-	  link_command="$compile_var$compile_command$compile_rpath"
-	  relink_command="$finalize_var$finalize_command$finalize_rpath"
-	fi
-      fi
+	  func_warning "this platform does not like uninstalled shared libraries"
+	  func_warning "'$output' will be relinked during installation"
+	  ;;
+        *,yes)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+          ;;
+	*,no)
+	  link_command=$compile_var$compile_command$compile_rpath
+	  relink_command=$finalize_var$finalize_command$finalize_rpath
+          ;;
+	*,needless)
+	  link_command=$finalize_var$compile_command$finalize_rpath
+	  relink_command=
+          ;;
+      esac
 
       # Replace the output file specification.
       link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
@@ -9039,8 +10540,8 @@ EOF
 	    func_dirname_and_basename "$output" "" "."
 	    output_name=$func_basename_result
 	    output_path=$func_dirname_result
-	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
-	    cwrapper="$output_path/$output_name.exe"
+	    cwrappersource=$output_path/$objdir/lt-$output_name.c
+	    cwrapper=$output_path/$output_name.exe
 	    $RM $cwrappersource $cwrapper
 	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
 
@@ -9061,7 +10562,7 @@ EOF
 	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
 	    $opt_dry_run || {
 	      # note: this script will not be executed, so do not chmod.
-	      if test "x$build" = "x$host" ; then
+	      if test "x$build" = "x$host"; then
 		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
 	      else
 		func_emit_wrapper no > $func_ltwrapper_scriptname_result
@@ -9084,25 +10585,27 @@ EOF
     # See if we need to build an old-fashioned archive.
     for oldlib in $oldlibs; do
 
-      if test "$build_libtool_libs" = convenience; then
-	oldobjs="$libobjs_save $symfileobj"
-	addlibs="$convenience"
-	build_libtool_libs=no
-      else
-	if test "$build_libtool_libs" = module; then
-	  oldobjs="$libobjs_save"
+      case $build_libtool_libs in
+        convenience)
+	  oldobjs="$libobjs_save $symfileobj"
+	  addlibs=$convenience
 	  build_libtool_libs=no
-	else
+	  ;;
+	module)
+	  oldobjs=$libobjs_save
+	  addlibs=$old_convenience
+	  build_libtool_libs=no
+          ;;
+	*)
 	  oldobjs="$old_deplibs $non_pic_objects"
-	  if test "$preload" = yes && test -f "$symfileobj"; then
-	    func_append oldobjs " $symfileobj"
-	  fi
-	fi
-	addlibs="$old_convenience"
-      fi
+	  $preload && test -f "$symfileobj" \
+	    && func_append oldobjs " $symfileobj"
+	  addlibs=$old_convenience
+	  ;;
+      esac
 
       if test -n "$addlibs"; then
-	gentop="$output_objdir/${outputname}x"
+	gentop=$output_objdir/${outputname}x
 	func_append generated " $gentop"
 
 	func_extract_archives $gentop $addlibs
@@ -9110,13 +10613,13 @@ EOF
       fi
 
       # Do each command in the archive commands.
-      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+      if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then
 	cmds=$old_archive_from_new_cmds
       else
 
 	# Add any objects from preloaded convenience libraries
 	if test -n "$dlprefiles"; then
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 
 	  func_extract_archives $gentop $dlprefiles
@@ -9137,7 +10640,7 @@ EOF
 	  :
 	else
 	  echo "copying selected object files to avoid basename conflicts..."
-	  gentop="$output_objdir/${outputname}x"
+	  gentop=$output_objdir/${outputname}x
 	  func_append generated " $gentop"
 	  func_mkdir_p "$gentop"
 	  save_oldobjs=$oldobjs
@@ -9146,7 +10649,7 @@ EOF
 	  for obj in $save_oldobjs
 	  do
 	    func_basename "$obj"
-	    objbase="$func_basename_result"
+	    objbase=$func_basename_result
 	    case " $oldobjs " in
 	    " ") oldobjs=$obj ;;
 	    *[\ /]"$objbase "*)
@@ -9215,18 +10718,18 @@ EOF
 	    else
 	      # the above command should be used before it gets too long
 	      oldobjs=$objlist
-	      if test "$obj" = "$last_oldobj" ; then
+	      if test "$obj" = "$last_oldobj"; then
 		RANLIB=$save_RANLIB
 	      fi
 	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
-	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      eval concat_cmds=\"\$concat_cmds$old_archive_cmds\"
 	      objlist=
 	      len=$len0
 	    fi
 	  done
 	  RANLIB=$save_RANLIB
 	  oldobjs=$objlist
-	  if test "X$oldobjs" = "X" ; then
+	  if test -z "$oldobjs"; then
 	    eval cmds=\"\$concat_cmds\"
 	  else
 	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
@@ -9243,7 +10746,7 @@ EOF
     case $output in
     *.la)
       old_library=
-      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      test yes = "$build_old_libs" && old_library=$libname.$libext
       func_verbose "creating $output"
 
       # Preserve any variables that may affect compiler behavior
@@ -9258,31 +10761,31 @@ EOF
 	fi
       done
       # Quote the link command for shipping.
-      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
       relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
-      if test "$hardcode_automatic" = yes ; then
+      if test yes = "$hardcode_automatic"; then
 	relink_command=
       fi
 
       # Only create the output if not a dry run.
       $opt_dry_run || {
 	for installed in no yes; do
-	  if test "$installed" = yes; then
+	  if test yes = "$installed"; then
 	    if test -z "$install_libdir"; then
 	      break
 	    fi
-	    output="$output_objdir/$outputname"i
+	    output=$output_objdir/${outputname}i
 	    # Replace all uninstalled libtool libraries with the installed ones
 	    newdependency_libs=
 	    for deplib in $dependency_libs; do
 	      case $deplib in
 	      *.la)
 		func_basename "$deplib"
-		name="$func_basename_result"
+		name=$func_basename_result
 		func_resolve_sysroot "$deplib"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  func_fatal_error "'$deplib' is not a valid libtool archive"
 		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      -L*)
@@ -9298,23 +10801,23 @@ EOF
 	      *) func_append newdependency_libs " $deplib" ;;
 	      esac
 	    done
-	    dependency_libs="$newdependency_libs"
+	    dependency_libs=$newdependency_libs
 	    newdlfiles=
 
 	    for lib in $dlfiles; do
 	      case $lib in
 	      *.la)
 	        func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      *) func_append newdlfiles " $lib" ;;
 	      esac
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
@@ -9324,34 +10827,34 @@ EOF
 		# didn't already link the preopened objects directly into
 		# the library:
 		func_basename "$lib"
-		name="$func_basename_result"
-		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		name=$func_basename_result
+		eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
 		test -z "$libdir" && \
-		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		  func_fatal_error "'$lib' is not a valid libtool archive"
 		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
 		;;
 	      esac
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  else
 	    newdlfiles=
 	    for lib in $dlfiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlfiles " $abs"
 	    done
-	    dlfiles="$newdlfiles"
+	    dlfiles=$newdlfiles
 	    newdlprefiles=
 	    for lib in $dlprefiles; do
 	      case $lib in
-		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		[\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;;
 		*) abs=`pwd`"/$lib" ;;
 	      esac
 	      func_append newdlprefiles " $abs"
 	    done
-	    dlprefiles="$newdlprefiles"
+	    dlprefiles=$newdlprefiles
 	  fi
 	  $RM $output
 	  # place dlname in correct position for cygwin
@@ -9367,10 +10870,9 @@ EOF
 	  case $host,$output,$installed,$module,$dlname in
 	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
 	      # If a -bindir argument was supplied, place the dll there.
-	      if test "x$bindir" != x ;
-	      then
+	      if test -n "$bindir"; then
 		func_relative_path "$install_libdir" "$bindir"
-		tdlname=$func_relative_path_result$dlname
+		tdlname=$func_relative_path_result/$dlname
 	      else
 		# Otherwise fall back on heuristic.
 		tdlname=../bin/$dlname
@@ -9379,7 +10881,7 @@ EOF
 	  esac
 	  $ECHO > $output "\
 # $outputname - a libtool library file
-# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+# Generated by $PROGRAM (GNU $PACKAGE) $VERSION
 #
 # Please DO NOT delete this file!
 # It is necessary for linking the library.
@@ -9393,7 +10895,7 @@ library_names='$library_names'
 # The name of the static archive.
 old_library='$old_library'
 
-# Linker flags that can not go in dependency_libs.
+# Linker flags that cannot go in dependency_libs.
 inherited_linker_flags='$new_inherited_linker_flags'
 
 # Libraries that this one depends upon.
@@ -9419,7 +10921,7 @@ dlpreopen='$dlprefiles'
 
 # Directory that this library needs to be installed in:
 libdir='$install_libdir'"
-	  if test "$installed" = no && test "$need_relink" = yes; then
+	  if test no,yes = "$installed,$need_relink"; then
 	    $ECHO >> $output "\
 relink_command=\"$relink_command\""
 	  fi
@@ -9434,27 +10936,29 @@ relink_command=\"$relink_command\""
     exit $EXIT_SUCCESS
 }
 
-{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
-    func_mode_link ${1+"$@"}
+if test link = "$opt_mode" || test relink = "$opt_mode"; then
+  func_mode_link ${1+"$@"}
+fi
 
 
 # func_mode_uninstall arg...
 func_mode_uninstall ()
 {
-    $opt_debug
-    RM="$nonopt"
+    $debug_cmd
+
+    RM=$nonopt
     files=
-    rmforce=
+    rmforce=false
     exit_status=0
 
     # This variable tells wrapper scripts just to set variables rather
     # than running their programs.
-    libtool_install_magic="$magic"
+    libtool_install_magic=$magic
 
     for arg
     do
       case $arg in
-      -f) func_append RM " $arg"; rmforce=yes ;;
+      -f) func_append RM " $arg"; rmforce=: ;;
       -*) func_append RM " $arg" ;;
       *) func_append files " $arg" ;;
       esac
@@ -9467,18 +10971,18 @@ func_mode_uninstall ()
 
     for file in $files; do
       func_dirname "$file" "" "."
-      dir="$func_dirname_result"
-      if test "X$dir" = X.; then
-	odir="$objdir"
+      dir=$func_dirname_result
+      if test . = "$dir"; then
+	odir=$objdir
       else
-	odir="$dir/$objdir"
+	odir=$dir/$objdir
       fi
       func_basename "$file"
-      name="$func_basename_result"
-      test "$opt_mode" = uninstall && odir="$dir"
+      name=$func_basename_result
+      test uninstall = "$opt_mode" && odir=$dir
 
       # Remember odir for removal later, being careful to avoid duplicates
-      if test "$opt_mode" = clean; then
+      if test clean = "$opt_mode"; then
 	case " $rmdirs " in
 	  *" $odir "*) ;;
 	  *) func_append rmdirs " $odir" ;;
@@ -9493,11 +10997,11 @@ func_mode_uninstall ()
       elif test -d "$file"; then
 	exit_status=1
 	continue
-      elif test "$rmforce" = yes; then
+      elif $rmforce; then
 	continue
       fi
 
-      rmfiles="$file"
+      rmfiles=$file
 
       case $name in
       *.la)
@@ -9511,7 +11015,7 @@ func_mode_uninstall ()
 	  done
 	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
 
-	  case "$opt_mode" in
+	  case $opt_mode in
 	  clean)
 	    case " $library_names " in
 	    *" $dlname "*) ;;
@@ -9522,12 +11026,12 @@ func_mode_uninstall ()
 	  uninstall)
 	    if test -n "$library_names"; then
 	      # Do each command in the postuninstall commands.
-	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 
 	    if test -n "$old_library"; then
 	      # Do each command in the old_postuninstall commands.
-	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	      func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1'
 	    fi
 	    # FIXME: should reinstall the best remaining shared library.
 	    ;;
@@ -9543,21 +11047,19 @@ func_mode_uninstall ()
 	  func_source $dir/$name
 
 	  # Add PIC object to the list of files to remove.
-	  if test -n "$pic_object" &&
-	     test "$pic_object" != none; then
+	  if test -n "$pic_object" && test none != "$pic_object"; then
 	    func_append rmfiles " $dir/$pic_object"
 	  fi
 
 	  # Add non-PIC object to the list of files to remove.
-	  if test -n "$non_pic_object" &&
-	     test "$non_pic_object" != none; then
+	  if test -n "$non_pic_object" && test none != "$non_pic_object"; then
 	    func_append rmfiles " $dir/$non_pic_object"
 	  fi
 	fi
 	;;
 
       *)
-	if test "$opt_mode" = clean ; then
+	if test clean = "$opt_mode"; then
 	  noexename=$name
 	  case $file in
 	  *.exe)
@@ -9584,12 +11086,12 @@ func_mode_uninstall ()
 
 	    # note $name still contains .exe if it was in $file originally
 	    # as does the version of $file that was added into $rmfiles
-	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
-	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	    func_append rmfiles " $odir/$name $odir/${name}S.$objext"
+	    if test yes = "$fast_install" && test -n "$relink_command"; then
 	      func_append rmfiles " $odir/lt-$name"
 	    fi
-	    if test "X$noexename" != "X$name" ; then
-	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    if test "X$noexename" != "X$name"; then
+	      func_append rmfiles " $odir/lt-$noexename.c"
 	    fi
 	  fi
 	fi
@@ -9598,7 +11100,7 @@ func_mode_uninstall ()
       func_show_eval "$RM $rmfiles" 'exit_status=1'
     done
 
-    # Try to remove the ${objdir}s in the directories where we deleted files
+    # Try to remove the $objdir's in the directories where we deleted files
     for dir in $rmdirs; do
       if test -d "$dir"; then
 	func_show_eval "rmdir $dir >/dev/null 2>&1"
@@ -9608,16 +11110,17 @@ func_mode_uninstall ()
     exit $exit_status
 }
 
-{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
-    func_mode_uninstall ${1+"$@"}
+if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then
+  func_mode_uninstall ${1+"$@"}
+fi
 
 test -z "$opt_mode" && {
-  help="$generic_help"
+  help=$generic_help
   func_fatal_help "you must specify a MODE"
 }
 
 test -z "$exec_cmd" && \
-  func_fatal_help "invalid operation mode \`$opt_mode'"
+  func_fatal_help "invalid operation mode '$opt_mode'"
 
 if test -n "$exec_cmd"; then
   eval exec "$exec_cmd"
@@ -9628,7 +11131,7 @@ exit $exit_status
 
 
 # The TAGs below are defined such that we never get into a situation
-# in which we disable both kinds of libraries.  Given conflicting
+# where we disable both kinds of libraries.  Given conflicting
 # choices, we go for a static library, that is the most portable,
 # since we can't tell whether shared libraries were disabled because
 # the user asked for that or because the platform doesn't support
@@ -9651,5 +11154,3 @@ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
 # mode:shell-script
 # sh-indentation:2
 # End:
-# vi:sw=2
-
diff --git a/config/ltoptions.m4 b/config/ltoptions.m4
index 5d9acd8..94b0829 100644
--- a/config/ltoptions.m4
+++ b/config/ltoptions.m4
@@ -1,14 +1,14 @@
 # Helper functions for option handling.                    -*- Autoconf -*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
-#   Inc.
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 7 ltoptions.m4
+# serial 8 ltoptions.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
@@ -29,7 +29,7 @@ m4_define([_LT_SET_OPTION],
 [m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
 m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
         _LT_MANGLE_DEFUN([$1], [$2]),
-    [m4_warning([Unknown $1 option `$2'])])[]dnl
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
 ])
 
 
@@ -75,13 +75,15 @@ m4_if([$1],[LT_INIT],[
   dnl
   dnl If no reference was made to various pairs of opposing options, then
   dnl we run the default mode handler for the pair.  For example, if neither
-  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
   dnl archives by default:
   _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
   _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
   _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
-  		   [_LT_ENABLE_FAST_INSTALL])
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
   ])
 ])# _LT_SET_OPTIONS
 
@@ -112,7 +114,7 @@ AU_DEFUN([AC_LIBTOOL_DLOPEN],
 [_LT_SET_OPTION([LT_INIT], [dlopen])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `dlopen' option into LT_INIT's first parameter.])
+put the 'dlopen' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -148,7 +150,7 @@ AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
 _LT_SET_OPTION([LT_INIT], [win32-dll])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `win32-dll' option into LT_INIT's first parameter.])
+put the 'win32-dll' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -157,9 +159,9 @@ dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
 
 # _LT_ENABLE_SHARED([DEFAULT])
 # ----------------------------
-# implement the --enable-shared flag, and supports the `shared' and
-# `disable-shared' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_SHARED],
 [m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([shared],
@@ -172,14 +174,14 @@ AC_ARG_ENABLE([shared],
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
@@ -211,9 +213,9 @@ dnl AC_DEFUN([AM_DISABLE_SHARED], [])
 
 # _LT_ENABLE_STATIC([DEFAULT])
 # ----------------------------
-# implement the --enable-static flag, and support the `static' and
-# `disable-static' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_STATIC],
 [m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([static],
@@ -226,14 +228,14 @@ AC_ARG_ENABLE([static],
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
@@ -265,9 +267,9 @@ dnl AC_DEFUN([AM_DISABLE_STATIC], [])
 
 # _LT_ENABLE_FAST_INSTALL([DEFAULT])
 # ----------------------------------
-# implement the --enable-fast-install flag, and support the `fast-install'
-# and `disable-fast-install' LT_INIT options.
-# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
 m4_define([_LT_ENABLE_FAST_INSTALL],
 [m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
 AC_ARG_ENABLE([fast-install],
@@ -280,14 +282,14 @@ AC_ARG_ENABLE([fast-install],
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
     [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
@@ -304,14 +306,14 @@ AU_DEFUN([AC_ENABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `fast-install' option into LT_INIT's first parameter.])
+the 'fast-install' option into LT_INIT's first parameter.])
 ])
 
 AU_DEFUN([AC_DISABLE_FAST_INSTALL],
 [_LT_SET_OPTION([LT_INIT], [disable-fast-install])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you put
-the `disable-fast-install' option into LT_INIT's first parameter.])
+the 'disable-fast-install' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
@@ -319,11 +321,64 @@ dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
 dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
 
 
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
 # _LT_WITH_PIC([MODE])
 # --------------------
-# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
 # LT_INIT options.
-# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
 m4_define([_LT_WITH_PIC],
 [AC_ARG_WITH([pic],
     [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
@@ -334,19 +389,17 @@ m4_define([_LT_WITH_PIC],
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac],
-    [pic_mode=default])
-
-test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+    [pic_mode=m4_default([$1], [default])])
 
 _LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
 ])# _LT_WITH_PIC
@@ -359,7 +412,7 @@ AU_DEFUN([AC_LIBTOOL_PICMODE],
 [_LT_SET_OPTION([LT_INIT], [pic-only])
 AC_DIAGNOSE([obsolete],
 [$0: Remove this warning and the call to _LT_SET_OPTION when you
-put the `pic-only' option into LT_INIT's first parameter.])
+put the 'pic-only' option into LT_INIT's first parameter.])
 ])
 
 dnl aclocal-1.4 backwards compatibility:
diff --git a/config/ltsugar.m4 b/config/ltsugar.m4
index 9000a05..48bc934 100644
--- a/config/ltsugar.m4
+++ b/config/ltsugar.m4
@@ -1,6 +1,7 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
 # Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -33,7 +34,7 @@ m4_define([_lt_join],
 # ------------
 # Manipulate m4 lists.
 # These macros are necessary as long as will still need to support
-# Autoconf-2.59 which quotes differently.
+# Autoconf-2.59, which quotes differently.
 m4_define([lt_car], [[$1]])
 m4_define([lt_cdr],
 [m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
@@ -44,7 +45,7 @@ m4_define([lt_unquote], $1)
 
 # lt_append(MACRO-NAME, STRING, [SEPARATOR])
 # ------------------------------------------
-# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
 # Note that neither SEPARATOR nor STRING are expanded; they are appended
 # to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
 # No SEPARATOR is output if MACRO-NAME was previously undefined (different
diff --git a/config/ltversion.m4 b/config/ltversion.m4
index 07a8602..fa04b52 100644
--- a/config/ltversion.m4
+++ b/config/ltversion.m4
@@ -1,6 +1,6 @@
 # ltversion.m4 -- version numbers			-*- Autoconf -*-
 #
-#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
 #   Written by Scott James Remnant, 2004
 #
 # This file is free software; the Free Software Foundation gives
@@ -9,15 +9,15 @@
 
 # @configure_input@
 
-# serial 3337 ltversion.m4
+# serial 4179 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.4.2])
-m4_define([LT_PACKAGE_REVISION], [1.3337])
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.4.2'
-macro_revision='1.3337'
+[macro_version='2.4.6'
+macro_revision='2.4.6'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
diff --git a/config/lt~obsolete.m4 b/config/lt~obsolete.m4
index c573da9..c6b26f8 100644
--- a/config/lt~obsolete.m4
+++ b/config/lt~obsolete.m4
@@ -1,6 +1,7 @@
 # lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
 #   Written by Scott James Remnant, 2004.
 #
 # This file is free software; the Free Software Foundation gives
@@ -11,7 +12,7 @@
 
 # These exist entirely to fool aclocal when bootstrapping libtool.
 #
-# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
 # which have later been changed to m4_define as they aren't part of the
 # exported API, or moved to Autoconf or Automake where they belong.
 #
@@ -25,7 +26,7 @@
 # included after everything else.  This provides aclocal with the
 # AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
 # because those macros already exist, or will be overwritten later.
-# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
 #
 # Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
 # Yes, that means every name once taken will need to remain here until
diff --git a/config/missing b/config/missing
index cdea514..f62bbae 100755
--- a/config/missing
+++ b/config/missing
@@ -1,9 +1,9 @@
 #! /bin/sh
 # Common wrapper for a few potentially missing GNU programs.
 
-scriptversion=2012-06-26.16; # UTC
+scriptversion=2013-10-28.13; # UTC
 
-# Copyright (C) 1996-2013 Free Software Foundation, Inc.
+# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 # Originally written by Fran,cois Pinard <pinard at iro.umontreal.ca>, 1996.
 
 # This program is free software; you can redistribute it and/or modify
@@ -160,7 +160,7 @@ give_advice ()
       ;;
    autom4te*)
       echo "You might have modified some maintainer files that require"
-      echo "the 'automa4te' program to be rebuilt."
+      echo "the 'autom4te' program to be rebuilt."
       program_details 'autom4te'
       ;;
     bison*|yacc*)
diff --git a/config/test-driver b/config/test-driver
index 32bf39e..8e575b0 100755
--- a/config/test-driver
+++ b/config/test-driver
@@ -1,9 +1,9 @@
 #! /bin/sh
 # test-driver - basic testsuite driver script.
 
-scriptversion=2012-06-27.10; # UTC
+scriptversion=2013-07-13.22; # UTC
 
-# Copyright (C) 2011-2013 Free Software Foundation, Inc.
+# Copyright (C) 2011-2014 Free Software Foundation, Inc.
 #
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -44,13 +44,12 @@ print_usage ()
 Usage:
   test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
               [--expect-failure={yes|no}] [--color-tests={yes|no}]
-              [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT
+              [--enable-hard-errors={yes|no}] [--]
+              TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
 The '--test-name', '--log-file' and '--trs-file' options are mandatory.
 END
 }
 
-# TODO: better error handling in option parsing (in particular, ensure
-# TODO: $log_file, $trs_file and $test_name are defined).
 test_name= # Used for reporting.
 log_file=  # Where to save the output of the test script.
 trs_file=  # Where to save the metadata of the test run.
@@ -69,10 +68,23 @@ while test $# -gt 0; do
   --enable-hard-errors) enable_hard_errors=$2; shift;;
   --) shift; break;;
   -*) usage_error "invalid option: '$1'";;
+   *) break;;
   esac
   shift
 done
 
+missing_opts=
+test x"$test_name" = x && missing_opts="$missing_opts --test-name"
+test x"$log_file"  = x && missing_opts="$missing_opts --log-file"
+test x"$trs_file"  = x && missing_opts="$missing_opts --trs-file"
+if test x"$missing_opts" != x; then
+  usage_error "the following mandatory options are missing:$missing_opts"
+fi
+
+if test $# -eq 0; then
+  usage_error "missing argument"
+fi
+
 if test $color_tests = yes; then
   # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
   red='' # Red.
@@ -94,11 +106,14 @@ trap "st=143; $do_exit" 15
 # Test script is run here.
 "$@" >$log_file 2>&1
 estatus=$?
+
 if test $enable_hard_errors = no && test $estatus -eq 99; then
-  estatus=1
+  tweaked_estatus=1
+else
+  tweaked_estatus=$estatus
 fi
 
-case $estatus:$expect_failure in
+case $tweaked_estatus:$expect_failure in
   0:yes) col=$red res=XPASS recheck=yes gcopy=yes;;
   0:*)   col=$grn res=PASS  recheck=no  gcopy=no;;
   77:*)  col=$blu res=SKIP  recheck=no  gcopy=yes;;
@@ -107,6 +122,12 @@ case $estatus:$expect_failure in
   *:*)   col=$red res=FAIL  recheck=yes gcopy=yes;;
 esac
 
+# Report the test outcome and exit status in the logs, so that one can
+# know whether the test passed or failed simply by looking at the '.log'
+# file, without the need of also peaking into the corresponding '.trs'
+# file (automake bug#11814).
+echo "$res $test_name (exit status: $estatus)" >>$log_file
+
 # Report outcome to console.
 echo "${col}${res}${std}: $test_name"
 
diff --git a/configure b/configure
index 6399598..3bc0c9b 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for libfabric 1.4.0.
+# Generated by GNU Autoconf 2.69 for libfabric 1.5.2.
 #
 # Report bugs to <ofiwg at lists.openfabrics.org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='libfabric'
 PACKAGE_TARNAME='libfabric'
-PACKAGE_VERSION='1.4.0'
-PACKAGE_STRING='libfabric 1.4.0'
+PACKAGE_VERSION='1.5.2'
+PACKAGE_STRING='libfabric 1.5.2'
 PACKAGE_BUGREPORT='ofiwg at lists.openfabrics.org'
 PACKAGE_URL=''
 
@@ -645,6 +645,16 @@ FI_PC_CFLAGS
 PROVIDERS_STATIC
 PROVIDERS_DL
 PROVIDERS_TO_BUILD
+HAVE_BGQ_DL_FALSE
+HAVE_BGQ_DL_TRUE
+HAVE_BGQ_FALSE
+HAVE_BGQ_TRUE
+bgq_fabric_direct_thread
+bgq_fabric_direct_mr
+bgq_fabric_direct_av
+bgq_fabric_direct_progress
+bgq_external_source
+bgq_driver
 HAVE_RXD_DL_FALSE
 HAVE_RXD_DL_TRUE
 HAVE_RXD_FALSE
@@ -671,6 +681,8 @@ gni_LDFLAGS
 gni_CPPFLAGS
 HAVE_CRITERION_FALSE
 HAVE_CRITERION_TRUE
+CRAY_KDREG_LIBS
+CRAY_KDREG_CFLAGS
 CRAY_PMI_LIBS
 CRAY_PMI_CFLAGS
 CRAY_XPMEM_LIBS
@@ -682,6 +694,7 @@ CRAY_ALPS_UTIL_CFLAGS
 CRAY_ALPS_LLI_STATIC_LIBS
 CRAY_ALPS_LLI_LIBS
 CRAY_ALPS_LLI_CFLAGS
+CRAY_UGNI_STATIC_LIBS
 CRAY_UGNI_LIBS
 CRAY_UGNI_CFLAGS
 CRAY_GNI_HEADERS_LIBS
@@ -689,17 +702,19 @@ CRAY_GNI_HEADERS_CFLAGS
 FI_PKG_CONFIG_LIBDIR
 FI_PKG_CONFIG_PATH
 FI_PKG_CONFIG
-HAVE_MXM_DL_FALSE
-HAVE_MXM_DL_TRUE
-HAVE_MXM_FALSE
-HAVE_MXM_TRUE
-mxm_LIBS
-mxm_LDFLAGS
-mxm_CPPFLAGS
+HAVE_MLX_DL_FALSE
+HAVE_MLX_DL_TRUE
+HAVE_MLX_FALSE
+HAVE_MLX_TRUE
+mlx_LIBS
+mlx_LDFLAGS
+mlx_CPPFLAGS
 HAVE_USNIC_DL_FALSE
 HAVE_USNIC_DL_TRUE
 HAVE_USNIC_FALSE
 HAVE_USNIC_TRUE
+USNIC_BUILD_FAKE_VERBS_DRIVER_FALSE
+USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE
 usnic_LIBS
 usnic_LDFLAGS
 usnic_CPPFLAGS
@@ -734,6 +749,8 @@ HAVE_PSM2_TRUE
 psm2_LIBS
 psm2_LDFLAGS
 psm2_CPPFLAGS
+FI_DIRECT_H_IN_FALSE
+FI_DIRECT_H_IN_TRUE
 HAVE_PSM_DL_FALSE
 HAVE_PSM_DL_TRUE
 HAVE_PSM_FALSE
@@ -745,8 +762,7 @@ HAVE_LD_VERSION_SCRIPT_FALSE
 HAVE_LD_VERSION_SCRIPT_TRUE
 EMBEDDED_FALSE
 EMBEDDED_TRUE
-HAVE_CLOCK_GETTIME_FALSE
-HAVE_CLOCK_GETTIME_TRUE
+LT_SYS_LIBRARY_PATH
 OTOOL64
 OTOOL
 LIPO
@@ -846,6 +862,7 @@ infodir
 docdir
 oldincludedir
 includedir
+runstatedir
 localstatedir
 sharedstatedir
 sysconfdir
@@ -877,10 +894,12 @@ enable_shared
 enable_static
 with_pic
 enable_fast_install
+with_aix_soname
 with_gnu_ld
 with_sysroot
 enable_libtool_lock
 with_dlopen
+enable_picky
 enable_embedded
 enable_psm
 enable_psm2
@@ -888,14 +907,20 @@ enable_sockets
 enable_verbs
 enable_usnic
 with_libnl
-enable_mxm
+enable_mlx
 enable_gni
 enable_xpmem
+enable_ugni_static
 with_criterion
 with_kdreg
 enable_udp
 enable_rxm
 enable_rxd
+enable_bgq
+with_bgq_driver
+with_bgq_src
+with_bgq_progress
+with_bgq_mr
 '
       ac_precious_vars='build_alias
 host_alias
@@ -906,6 +931,7 @@ LDFLAGS
 LIBS
 CPPFLAGS
 CPP
+LT_SYS_LIBRARY_PATH
 FI_PKG_CONFIG
 FI_PKG_CONFIG_PATH
 FI_PKG_CONFIG_LIBDIR
@@ -913,6 +939,7 @@ CRAY_GNI_HEADERS_CFLAGS
 CRAY_GNI_HEADERS_LIBS
 CRAY_UGNI_CFLAGS
 CRAY_UGNI_LIBS
+CRAY_UGNI_STATIC_LIBS
 CRAY_ALPS_LLI_CFLAGS
 CRAY_ALPS_LLI_LIBS
 CRAY_ALPS_LLI_STATIC_LIBS
@@ -923,7 +950,9 @@ CRAY_UDREG_LIBS
 CRAY_XPMEM_CFLAGS
 CRAY_XPMEM_LIBS
 CRAY_PMI_CFLAGS
-CRAY_PMI_LIBS'
+CRAY_PMI_LIBS
+CRAY_KDREG_CFLAGS
+CRAY_KDREG_LIBS'
 
 
 # Initialize some variables set by options.
@@ -962,6 +991,7 @@ datadir='${datarootdir}'
 sysconfdir='${prefix}/etc'
 sharedstatedir='${prefix}/com'
 localstatedir='${prefix}/var'
+runstatedir='${localstatedir}/run'
 includedir='${prefix}/include'
 oldincludedir='/usr/include'
 docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
@@ -1214,6 +1244,15 @@ do
   | -silent | --silent | --silen | --sile | --sil)
     silent=yes ;;
 
+  -runstatedir | --runstatedir | --runstatedi | --runstated \
+  | --runstate | --runstat | --runsta | --runst | --runs \
+  | --run | --ru | --r)
+    ac_prev=runstatedir ;;
+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
+  | --run=* | --ru=* | --r=*)
+    runstatedir=$ac_optarg ;;
+
   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
     ac_prev=sbindir ;;
   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
@@ -1351,7 +1390,7 @@ fi
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
+		libdir localedir mandir runstatedir
 do
   eval ac_val=\$$ac_var
   # Remove trailing slashes.
@@ -1464,7 +1503,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures libfabric 1.4.0 to adapt to many kinds of systems.
+\`configure' configures libfabric 1.5.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1504,6 +1543,7 @@ Fine tuning of the installation directories:
   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
   --libdir=DIR            object code libraries [EPREFIX/lib]
   --includedir=DIR        C header files [PREFIX/include]
   --oldincludedir=DIR     C header files for non-gcc [/usr/include]
@@ -1534,7 +1574,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of libfabric 1.4.0:";;
+     short | recursive ) echo "Configuration of libfabric 1.5.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1559,6 +1599,8 @@ Optional Features:
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-picky          Enable developer-level compiler pickyness when
+                          building [default=no]
   --enable-embedded       Enable embedded support (turns off symbol
                           versioning) [default=no]
 
@@ -1601,12 +1643,12 @@ Optional Features:
                           enable usnic provider and use usnic installed under
                           PATH)
 
-  --enable-mxm[=yes|no|auto|dl|PATH]
-                          Enable mxm provider [default=auto] (yes: enable mxm
-                          provider; no: disable mxm provider; auto: enable mxm
-                          provider if possible; dl: enable mxm provider and
-                          build as a loadable library; PATH: enable mxm
-                          provider and use mxm installed under PATH)
+  --enable-mlx[=yes|no|auto|dl|PATH]
+                          Enable mlx provider [default=auto] (yes: enable mlx
+                          provider; no: disable mlx provider; auto: enable mlx
+                          provider if possible; dl: enable mlx provider and
+                          build as a loadable library; PATH: enable mlx
+                          provider and use mlx installed under PATH)
 
   --enable-gni[=yes|no|auto|dl|PATH]
                           Enable gni provider [default=auto] (yes: enable gni
@@ -1616,6 +1658,8 @@ Optional Features:
                           provider and use gni installed under PATH)
 
   --enable-xpmem          Enable xpmem (gni provider) [default=yes]
+  --enable-ugni-static    Enable static linking with uGNI. Recommended for
+                          KNL.
   --enable-udp[=yes|no|auto|dl|PATH]
                           Enable udp provider [default=auto] (yes: enable udp
                           provider; no: disable udp provider; auto: enable udp
@@ -1637,6 +1681,13 @@ Optional Features:
                           build as a loadable library; PATH: enable rxd
                           provider and use rxd installed under PATH)
 
+  --enable-bgq[=yes|no|auto|dl|PATH]
+                          Enable bgq provider [default=auto] (yes: enable bgq
+                          provider; no: disable bgq provider; auto: enable bgq
+                          provider if possible; dl: enable bgq provider and
+                          build as a loadable library; PATH: enable bgq
+                          provider and use bgq installed under PATH)
+
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1644,15 +1695,32 @@ Optional Packages:
   --with-valgrind         Enable valgrind annotations [default=no]
   --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                           both]
+  --with-aix-soname=aix|svr4|both
+                          shared library versioning (aka "SONAME") variant to
+                          provide on AIX, [default=aix].
   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
-  --with-sysroot=DIR Search for dependent libraries within DIR
-                        (or the compiler's sysroot if not specified).
+  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
+                          compiler's sysroot if not specified).
   --with-dlopen           dl-loadable provider support [default=yes]
   --with-libnl(=DIR)      Directory prefix for libnl (typically only necessary
                           if libnl is installed in a location that the
                           compiler/linker will not search by default)
   --with-criterion        Location for criterion unit testing framework
   --with-kdreg            Install directory for kdreg headers
+  --with-bgq-driver=[BGQ driver installation path]
+                          Provide path to where BGQ system headers are
+                          installed
+
+  --with-bgq-src(=DIR)    bgq opensource distribution [default=auto]
+
+  --with-bgq-progress(=auto|manual|runtime)
+                          Specify the bgq FABRIC_DIRECT progess mode
+                          [default=manual]
+
+  --with-bgq-mr(=scalable|basic)
+                          Specify the bgq FABRIC_DIRECT mr mode
+                          [default=scalable]
+
 
 Some influential environment variables:
   CC          C compiler command
@@ -1663,6 +1731,8 @@ Some influential environment variables:
   CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
               you have headers in a nonstandard directory <include dir>
   CPP         C preprocessor
+  LT_SYS_LIBRARY_PATH
+              User-defined run-time library search path.
   FI_PKG_CONFIG
               path to pkg-config utility
   FI_PKG_CONFIG_PATH
@@ -1677,6 +1747,8 @@ Some influential environment variables:
               C compiler flags for CRAY_UGNI, overriding pkg-config
   CRAY_UGNI_LIBS
               linker flags for CRAY_UGNI, overriding pkg-config
+  CRAY_UGNI_STATIC_LIBS
+              static linker flags for CRAY_UGNI, overriding pkg-config
   CRAY_ALPS_LLI_CFLAGS
               C compiler flags for CRAY_ALPS_LLI, overriding pkg-config
   CRAY_ALPS_LLI_LIBS
@@ -1699,6 +1771,10 @@ Some influential environment variables:
               C compiler flags for CRAY_PMI, overriding pkg-config
   CRAY_PMI_LIBS
               linker flags for CRAY_PMI, overriding pkg-config
+  CRAY_KDREG_CFLAGS
+              C compiler flags for CRAY_KDREG, overriding pkg-config
+  CRAY_KDREG_LIBS
+              linker flags for CRAY_KDREG, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1766,7 +1842,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-libfabric configure 1.4.0
+libfabric configure 1.5.2
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2235,7 +2311,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by libfabric $as_me 1.4.0, which was
+It was created by libfabric $as_me 1.5.2, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2616,7 +2692,7 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 ac_config_headers="$ac_config_headers config.h"
 
-am__api_version='1.13'
+am__api_version='1.15'
 
 # Find a good install program.  We prefer a C program (faster),
 # so one script is as good as another.  But avoid the broken or
@@ -2788,8 +2864,8 @@ test "$program_suffix" != NONE &&
 ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
 program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
+# Expand $ac_aux_dir to an absolute path.
+am_aux_dir=`cd "$ac_aux_dir" && pwd`
 
 if test x"${MISSING+set}" != xset; then
   case $am_aux_dir in
@@ -2808,7 +2884,7 @@ else
 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
 fi
 
-if test x"${install_sh}" != xset; then
+if test x"${install_sh+set}" != xset; then
   case $am_aux_dir in
   *\ * | *\	*)
     install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
@@ -3102,7 +3178,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='libfabric'
- VERSION='1.4.0'
+ VERSION='1.5.2'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3136,8 +3212,8 @@ MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
 # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
 mkdir_p='$(MKDIR_P)'
 
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
+# We need awk for the "check" target (and possibly the TAP driver).  The
+# system "awk" is bad on some platforms.
 # Always define AMTAR for backward compatibility.  Yes, it's still used
 # in the wild :-(  We should find a proper way to deprecate it ...
 AMTAR='$${TAR-tar}'
@@ -3269,6 +3345,48 @@ $as_echo "$am_cv_prog_tar_ustar" >&6; }
 
 
 
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes.  So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+  cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present.  This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake at gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message.  This
+can help us improve future automake versions.
+
+END
+  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+    echo 'Configuration will proceed anyway, since you have set the' >&2
+    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+    echo >&2
+  else
+    cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+  fi
+fi
+
 # Check whether --enable-silent-rules was given.
 if test "${enable_silent_rules+set}" = set; then :
   enableval=$enable_silent_rules;
@@ -3426,10 +3544,12 @@ fi
 
 
 base_c_warn_flags="-Wall -Wundef -Wpointer-arith"
+debug_c_warn_flags="-Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-missing-field-initializers"
+picky_c_warn_flags="-Wno-long-long -Wmissing-prototypes -Wstrict-prototypes -Wcomment -pedantic"
 
 # Check whether --enable-debug was given.
 if test "${enable_debug+set}" = set; then :
-  enableval=$enable_debug; CFLAGS="-g -O0 ${base_c_warn_flags} -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-missing-field-initializers $CFLAGS"
+  enableval=$enable_debug; CFLAGS="-g -O0 ${base_c_warn_flags} ${debug_c_warn_flags} $CFLAGS"
 	       dbg=1
 else
   enable_debug=no
@@ -4301,6 +4421,65 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+  # Make sure it works both with $CC and with simple cc.
+  # Following AC_PROG_CC_C_O, we do the test twice because some
+  # compilers refuse to overwrite an existing .o file with -o,
+  # though they will create one.
+  am_cv_prog_cc_c_o=yes
+  for am_i in 1 2; do
+    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); } \
+         && test -f conftest2.$ac_objext; then
+      : OK
+    else
+      am_cv_prog_cc_c_o=no
+      break
+    fi
+  done
+  rm -f core conftest*
+  unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+   # Losing compiler, so override with the script.
+   # FIXME: It is wrong to rewrite CC.
+   # But if we don't then we get into trouble of one sort or another.
+   # A longer-term fix would be to have automake use am__CC in this case,
+   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+   CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
 depcc="$CC"   am_compiler_list=
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
@@ -4537,7 +4716,13 @@ $as_echo_n "checking the archiver ($AR) interface... " >&6; }
 if ${am_cv_ar_interface+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  am_cv_ar_interface=ar
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+   am_cv_ar_interface=ar
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int some_variable = 0;
@@ -4568,6 +4753,11 @@ if ac_fn_c_try_compile "$LINENO"; then :
 
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+   ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5
@@ -4792,131 +4982,6 @@ if test "x$ac_cv_prog_cc_c99" != xno; then :
 fi
 
 
-if test "x$CC" != xcc; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
-$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
-$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
-fi
-set dummy $CC; ac_cc=`$as_echo "$2" |
-		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-   test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-then
-  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
-  if test "x$CC" != xcc; then
-    # Test first that cc exists at all.
-    if { ac_try='cc -c conftest.$ac_ext >&5'
-  { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; }; then
-      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-      rm -f conftest2.*
-      if { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } &&
-	 test -f conftest2.$ac_objext && { { case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; };
-      then
-	# cc works too.
-	:
-      else
-	# cc exists but doesn't like -o.
-	eval ac_cv_prog_cc_${ac_cc}_c_o=no
-      fi
-    fi
-  fi
-else
-  eval ac_cv_prog_cc_${ac_cc}_c_o=no
-fi
-rm -f core conftest*
-
-fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
-
-fi
-
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5363,8 +5428,8 @@ esac
 
 
 
-macro_version='2.4.2'
-macro_revision='1.3337'
+macro_version='2.4.6'
+macro_revision='2.4.6'
 
 
 
@@ -5378,7 +5443,7 @@ macro_revision='1.3337'
 
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 # Backslashify metacharacters that are still active within
 # double-quoted strings.
@@ -5427,7 +5492,7 @@ func_echo_all ()
     $ECHO ""
 }
 
-case "$ECHO" in
+case $ECHO in
   printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
 $as_echo "printf" >&6; } ;;
   print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
@@ -5620,19 +5685,19 @@ test -z "$GREP" && GREP=grep
 
 # Check whether --with-gnu-ld was given.
 if test "${with_gnu_ld+set}" = set; then :
-  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
 else
   with_gnu_ld=no
 fi
 
 ac_prog=ld
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   # Check if gcc -print-prog-name=ld gives a path.
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
 $as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
-    # gcc leaves a trailing carriage return which upsets mingw
+    # gcc leaves a trailing carriage return, which upsets mingw
     ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
   *)
     ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
@@ -5646,7 +5711,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
       while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
 	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
       done
-      test -z "$LD" && LD="$ac_prog"
+      test -z "$LD" && LD=$ac_prog
       ;;
   "")
     # If it fails, then pretend we aren't using GCC.
@@ -5657,7 +5722,7 @@ $as_echo_n "checking for ld used by $CC... " >&6; }
     with_gnu_ld=unknown
     ;;
   esac
-elif test "$with_gnu_ld" = yes; then
+elif test yes = "$with_gnu_ld"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
 $as_echo_n "checking for GNU ld... " >&6; }
 else
@@ -5668,32 +5733,32 @@ if ${lt_cv_path_LD+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   for ac_dir in $PATH; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
     if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
-      lt_cv_path_LD="$ac_dir/$ac_prog"
+      lt_cv_path_LD=$ac_dir/$ac_prog
       # Check to see if the program is GNU ld.  I'd rather use --version,
       # but apparently some variants of GNU ld only accept -v.
       # Break only if it was the GNU/non-GNU ld that we prefer.
       case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
       *GNU* | *'with BFD'*)
-	test "$with_gnu_ld" != no && break
+	test no != "$with_gnu_ld" && break
 	;;
       *)
-	test "$with_gnu_ld" != yes && break
+	test yes != "$with_gnu_ld" && break
 	;;
       esac
     fi
   done
-  IFS="$lt_save_ifs"
+  IFS=$lt_save_ifs
 else
-  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
 fi
 fi
 
-LD="$lt_cv_path_LD"
+LD=$lt_cv_path_LD
 if test -n "$LD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
 $as_echo "$LD" >&6; }
@@ -5736,33 +5801,38 @@ if ${lt_cv_path_NM+:} false; then :
 else
   if test -n "$NM"; then
   # Let the user override the test.
-  lt_cv_path_NM="$NM"
+  lt_cv_path_NM=$NM
 else
-  lt_nm_to_check="${ac_tool_prefix}nm"
+  lt_nm_to_check=${ac_tool_prefix}nm
   if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
     lt_nm_to_check="$lt_nm_to_check nm"
   fi
   for lt_tmp_nm in $lt_nm_to_check; do
-    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
     for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       test -z "$ac_dir" && ac_dir=.
-      tmp_nm="$ac_dir/$lt_tmp_nm"
-      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
 	# Check to see if the nm accepts a BSD-compat flag.
-	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
 	#   nm: unknown option "B" ignored
 	# Tru64's nm complains that /dev/null is an invalid object file
-	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
-	*/dev/null* | *'Invalid file or object type'*)
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
 	  lt_cv_path_NM="$tmp_nm -B"
-	  break
+	  break 2
 	  ;;
 	*)
 	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
 	  */dev/null*)
 	    lt_cv_path_NM="$tmp_nm -p"
-	    break
+	    break 2
 	    ;;
 	  *)
 	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
@@ -5773,15 +5843,15 @@ else
 	esac
       fi
     done
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
   done
   : ${lt_cv_path_NM=no}
 fi
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
 $as_echo "$lt_cv_path_NM" >&6; }
-if test "$lt_cv_path_NM" != "no"; then
-  NM="$lt_cv_path_NM"
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
 else
   # Didn't find any BSD compatible name lister, look for dumpbin.
   if test -n "$DUMPBIN"; then :
@@ -5887,9 +5957,9 @@ esac
   fi
 fi
 
-    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
     *COFF*)
-      DUMPBIN="$DUMPBIN -symbols"
+      DUMPBIN="$DUMPBIN -symbols -headers"
       ;;
     *)
       DUMPBIN=:
@@ -5897,8 +5967,8 @@ fi
     esac
   fi
 
-  if test "$DUMPBIN" != ":"; then
-    NM="$DUMPBIN"
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
   fi
 fi
 test -z "$NM" && NM=nm
@@ -5949,7 +6019,7 @@ if ${lt_cv_sys_max_cmd_len+:} false; then :
   $as_echo_n "(cached) " >&6
 else
     i=0
-  teststring="ABCD"
+  teststring=ABCD
 
   case $build_os in
   msdosdjgpp*)
@@ -5989,7 +6059,7 @@ else
     lt_cv_sys_max_cmd_len=8192;
     ;;
 
-  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
     # This has been around since 386BSD, at least.  Likely further.
     if test -x /sbin/sysctl; then
       lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
@@ -6039,22 +6109,23 @@ else
     ;;
   *)
     lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
-    if test -n "$lt_cv_sys_max_cmd_len"; then
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
       lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
     else
       # Make teststring a little bigger before we do anything with it.
       # a 1K string should be a reasonable start.
-      for i in 1 2 3 4 5 6 7 8 ; do
+      for i in 1 2 3 4 5 6 7 8; do
         teststring=$teststring$teststring
       done
       SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
       # If test is not a shell built-in, we'll probably end up computing a
       # maximum length that is only half of the actual maximum length, but
       # we can't tell.
-      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
 	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
-	      test $i != 17 # 1/2 MB should be enough
+	      test 17 != "$i" # 1/2 MB should be enough
       do
         i=`expr $i + 1`
         teststring=$teststring$teststring
@@ -6072,7 +6143,7 @@ else
 
 fi
 
-if test -n $lt_cv_sys_max_cmd_len ; then
+if test -n "$lt_cv_sys_max_cmd_len"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
 $as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
@@ -6090,30 +6161,6 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
-$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
-# Try some XSI features
-xsi_shell=no
-( _lt_dummy="a/b/c"
-  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
-      = c,a/b,b/c, \
-    && eval 'test $(( 1 + 1 )) -eq 2 \
-    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
-  && xsi_shell=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
-$as_echo "$xsi_shell" >&6; }
-
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
-$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
-lt_shell_append=no
-( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
-    >/dev/null 2>&1 \
-  && lt_shell_append=yes
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
-$as_echo "$lt_shell_append" >&6; }
-
-
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
   lt_unset=unset
 else
@@ -6236,13 +6283,13 @@ esac
 reload_cmds='$LD$reload_flag -o $output$reload_objs'
 case $host_os in
   cygwin* | mingw* | pw32* | cegcc*)
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       reload_cmds=false
     fi
     ;;
   darwin*)
-    if test "$GCC" = yes; then
-      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
     else
       reload_cmds='$LD$reload_flag -o $output$reload_objs'
     fi
@@ -6370,13 +6417,13 @@ lt_cv_deplibs_check_method='unknown'
 # Need to set the preceding variable on all platforms that support
 # interlibrary dependencies.
 # 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
+# 'unknown' -- same as none, but documents that we really don't know.
 # 'pass_all' -- all dependencies passed with no checks.
 # 'test_compile' -- check by making test program.
 # 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given extended regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
 
 case $host_os in
 aix[4-9]*)
@@ -6403,8 +6450,7 @@ mingw* | pw32*)
   # Base MSYS/MinGW do not provide the 'file' command needed by
   # func_win32_libid shell function, so use a weaker test based on 'objdump',
   # unless we find 'file', for example because we are cross-compiling.
-  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
-  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+  if ( file / ) >/dev/null 2>&1; then
     lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
     lt_cv_file_magic_cmd='func_win32_libid'
   else
@@ -6440,10 +6486,6 @@ freebsd* | dragonfly*)
   fi
   ;;
 
-gnu*)
-  lt_cv_deplibs_check_method=pass_all
-  ;;
-
 haiku*)
   lt_cv_deplibs_check_method=pass_all
   ;;
@@ -6482,11 +6524,11 @@ irix5* | irix6* | nonstopux*)
   ;;
 
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-netbsd*)
+netbsd* | netbsdelf*-gnu)
   if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
   else
@@ -6504,8 +6546,8 @@ newos6*)
   lt_cv_deplibs_check_method=pass_all
   ;;
 
-openbsd*)
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
   else
     lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
@@ -6558,6 +6600,9 @@ sysv4 | sysv4.3*)
 tpf*)
   lt_cv_deplibs_check_method=pass_all
   ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
 esac
 
 fi
@@ -6715,8 +6760,8 @@ else
 
 case $host_os in
 cygwin* | mingw* | pw32* | cegcc*)
-  # two different shell functions defined in ltmain.sh
-  # decide which to use based on capabilities of $DLLTOOL
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
   case `$DLLTOOL --help 2>&1` in
   *--identify-strict*)
     lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
@@ -6728,7 +6773,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   ;;
 *)
   # fallback: assume linklib IS sharedlib
-  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
   ;;
 esac
 
@@ -6882,7 +6927,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-      if test "$ac_status" -eq 0; then
+      if test 0 -eq "$ac_status"; then
 	# Ensure the archiver fails upon bogus file names.
 	rm -f conftest.$ac_objext libconftest.a
 	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
@@ -6890,7 +6935,7 @@ if ac_fn_c_try_compile "$LINENO"; then :
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }
-	if test "$ac_status" -ne 0; then
+	if test 0 -ne "$ac_status"; then
           lt_cv_ar_at_file=@
         fi
       fi
@@ -6903,7 +6948,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
 $as_echo "$lt_cv_ar_at_file" >&6; }
 
-if test "x$lt_cv_ar_at_file" = xno; then
+if test no = "$lt_cv_ar_at_file"; then
   archiver_list_spec=
 else
   archiver_list_spec=$lt_cv_ar_at_file
@@ -7120,7 +7165,7 @@ old_postuninstall_cmds=
 
 if test -n "$RANLIB"; then
   case $host_os in
-  openbsd*)
+  bitrig* | openbsd*)
     old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
     ;;
   *)
@@ -7210,7 +7255,7 @@ cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
 hpux*)
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     symcode='[ABCDEGRST]'
   fi
   ;;
@@ -7243,14 +7288,44 @@ case `$NM -V 2>&1` in
   symcode='[ABCDGIRSTW]' ;;
 esac
 
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
 # Transform an extracted symbol line into a proper C declaration.
 # Some systems (esp. on ia64) link data and code symbols differently,
 # so use this general approach.
-lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
 
 # Transform an extracted symbol line into symbol name and symbol address
-lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
-lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
 
 # Handle CRLF in mingw tool chain
 opt_cr=
@@ -7268,21 +7343,24 @@ for ac_symprfx in "" "_"; do
 
   # Write the raw and C identifiers.
   if test "$lt_cv_nm_interface" = "MS dumpbin"; then
-    # Fake it for dumpbin and say T for any non-static function
-    # and D for any global variable.
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
     # Also find C++ and __fastcall symbols from MSVC++,
     # which start with @ or ?.
     lt_cv_sys_global_symbol_pipe="$AWK '"\
 "     {last_section=section; section=\$ 3};"\
 "     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
 "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
 "     \$ 0!~/External *\|/{next};"\
 "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
 "     {if(hide[section]) next};"\
-"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
-"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
-"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
-"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
 "     ' prfx=^$ac_symprfx"
   else
     lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
@@ -7330,11 +7408,11 @@ _LT_EOF
 	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
 	  cat <<_LT_EOF > conftest.$ac_ext
 /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
-#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
-/* DATA imports from DLLs on WIN32 con't be const, because runtime
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
    relocations are performed -- see ld's documentation on pseudo-relocs.  */
 # define LT_DLSYM_CONST
-#elif defined(__osf__)
+#elif defined __osf__
 /* This system does not cope well with relocations in const data.  */
 # define LT_DLSYM_CONST
 #else
@@ -7360,7 +7438,7 @@ lt__PROGRAM__LTX_preloaded_symbols[] =
 {
   { "@PROGRAM@", (void *) 0 },
 _LT_EOF
-	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
 	  cat <<\_LT_EOF >> conftest.$ac_ext
   {0, (void *) 0}
 };
@@ -7380,13 +7458,13 @@ _LT_EOF
 	  mv conftest.$ac_objext conftstm.$ac_objext
 	  lt_globsym_save_LIBS=$LIBS
 	  lt_globsym_save_CFLAGS=$CFLAGS
-	  LIBS="conftstm.$ac_objext"
+	  LIBS=conftstm.$ac_objext
 	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
 	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+  test $ac_status = 0; } && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS=$lt_globsym_save_LIBS
@@ -7407,7 +7485,7 @@ _LT_EOF
   rm -rf conftest* conftst*
 
   # Do not use the global_symbol_pipe unless it works.
-  if test "$pipe_works" = yes; then
+  if test yes = "$pipe_works"; then
     break
   else
     lt_cv_sys_global_symbol_pipe=
@@ -7460,6 +7538,16 @@ fi
 
 
 
+
+
+
+
+
+
+
+
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
 $as_echo_n "checking for sysroot... " >&6; }
 
@@ -7472,9 +7560,9 @@ fi
 
 
 lt_sysroot=
-case ${with_sysroot} in #(
+case $with_sysroot in #(
  yes)
-   if test "$GCC" = yes; then
+   if test yes = "$GCC"; then
      lt_sysroot=`$CC --print-sysroot 2>/dev/null`
    fi
    ;; #(
@@ -7484,8 +7572,8 @@ case ${with_sysroot} in #(
  no|'')
    ;; #(
  *)
-   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
-$as_echo "${with_sysroot}" >&6; }
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
+$as_echo "$with_sysroot" >&6; }
    as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
    ;;
 esac
@@ -7497,18 +7585,99 @@ $as_echo "${lt_sysroot:-no}" >&6; }
 
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
+$as_echo_n "checking for a working dd... " >&6; }
+if ${ac_cv_path_lt_DD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+if test -z "$lt_DD"; then
+  ac_path_lt_DD_found=false
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in dd; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
+      as_fn_executable_p "$ac_path_lt_DD" || continue
+if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi
+      $ac_path_lt_DD_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_lt_DD"; then
+    :
+  fi
+else
+  ac_cv_path_lt_DD=$lt_DD
+fi
+
+rm -f conftest.i conftest2.i conftest.out
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
+$as_echo "$ac_cv_path_lt_DD" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
+$as_echo_n "checking how to truncate binary pipes... " >&6; }
+if ${lt_cv_truncate_bin+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
+$as_echo "$lt_cv_truncate_bin" >&6; }
+
+
+
+
+
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
 # Check whether --enable-libtool-lock was given.
 if test "${enable_libtool_lock+set}" = set; then :
   enableval=$enable_libtool_lock;
 fi
 
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
 
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
 ia64-*-hpux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7517,24 +7686,25 @@ ia64-*-hpux*)
   test $ac_status = 0; }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
-	HPUX_IA64_MODE="32"
+	HPUX_IA64_MODE=32
 	;;
       *ELF-64*)
-	HPUX_IA64_MODE="64"
+	HPUX_IA64_MODE=64
 	;;
     esac
   fi
   rm -rf conftest*
   ;;
 *-*-irix6*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-    if test "$lt_cv_prog_gnu_ld" = yes; then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
       case `/usr/bin/file conftest.$ac_objext` in
 	*32-bit*)
 	  LD="${LD-ld} -melf32bsmip"
@@ -7563,9 +7733,50 @@ ia64-*-hpux*)
   rm -rf conftest*
   ;;
 
-x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
 s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7579,9 +7790,19 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	    LD="${LD-ld} -m elf_i386_fbsd"
 	    ;;
 	  x86_64-*linux*)
-	    LD="${LD-ld} -m elf_i386"
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
 	    ;;
-	  ppc64-*linux*|powerpc64-*linux*)
+	  powerpc64-*linux*)
 	    LD="${LD-ld} -m elf32ppclinux"
 	    ;;
 	  s390x-*linux*)
@@ -7600,7 +7821,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 	  x86_64-*linux*)
 	    LD="${LD-ld} -m elf_x86_64"
 	    ;;
-	  ppc*-*linux*|powerpc*-*linux*)
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
 	    LD="${LD-ld} -m elf64ppc"
 	    ;;
 	  s390*-*linux*|s390*-*tpf*)
@@ -7618,7 +7842,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
 
 *-*-sco3.2v5*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-  SAVE_CFLAGS="$CFLAGS"
+  SAVE_CFLAGS=$CFLAGS
   CFLAGS="$CFLAGS -belf"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
 $as_echo_n "checking whether the C compiler needs -belf... " >&6; }
@@ -7658,13 +7882,14 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
 $as_echo "$lt_cv_cc_needs_belf" >&6; }
-  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+  if test yes != "$lt_cv_cc_needs_belf"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-    CFLAGS="$SAVE_CFLAGS"
+    CFLAGS=$SAVE_CFLAGS
   fi
   ;;
 *-*solaris*)
-  # Find out which ABI we are using.
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
   echo 'int i;' > conftest.$ac_ext
   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
   (eval $ac_compile) 2>&5
@@ -7676,7 +7901,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
       case $lt_cv_prog_gnu_ld in
       yes*)
         case $host in
-        i?86-*-solaris*)
+        i?86-*-solaris*|x86_64-*-solaris*)
           LD="${LD-ld} -m elf_x86_64"
           ;;
         sparc*-*-solaris*)
@@ -7685,7 +7910,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
         esac
         # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
         if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
-          LD="${LD-ld}_sol2"
+          LD=${LD-ld}_sol2
         fi
         ;;
       *)
@@ -7701,7 +7926,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; }
   ;;
 esac
 
-need_locks="$enable_libtool_lock"
+need_locks=$enable_libtool_lock
 
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
@@ -7812,7 +8037,7 @@ else
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
 $as_echo "$lt_cv_path_mainfest_tool" >&6; }
-if test "x$lt_cv_path_mainfest_tool" != xyes; then
+if test yes != "$lt_cv_path_mainfest_tool"; then
   MANIFEST_TOOL=:
 fi
 
@@ -8315,7 +8540,7 @@ if ${lt_cv_apple_cc_single_mod+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
-      if test -z "${LT_MULTI_MODULE}"; then
+      if test -z "$LT_MULTI_MODULE"; then
 	# By default we will add the -single_module flag. You can override
 	# by either setting the environment variable LT_MULTI_MODULE
 	# non-empty at configure time, or by adding -multi_module to the
@@ -8333,7 +8558,7 @@ else
 	  cat conftest.err >&5
 	# Otherwise, if the output was created with a 0 exit code from
 	# the compiler, it worked.
-	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
 	  lt_cv_apple_cc_single_mod=yes
 	else
 	  cat conftest.err >&5
@@ -8372,7 +8597,7 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-	LDFLAGS="$save_LDFLAGS"
+	LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
@@ -8401,7 +8626,7 @@ _LT_EOF
       _lt_result=$?
       if test -s conftest.err && $GREP force_load conftest.err; then
 	cat conftest.err >&5
-      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
 	lt_cv_ld_force_load=yes
       else
 	cat conftest.err >&5
@@ -8414,32 +8639,32 @@ fi
 $as_echo "$lt_cv_ld_force_load" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
-      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
     darwin1.*)
-      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
     darwin*) # darwin 5.x on
       # if running on 10.5 or later, the deployment target defaults
       # to the OS version, if on x86, and 10.4, the deployment
       # target defaults to 10.4. Don't you love it?
       case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
 	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-	10.[012]*)
-	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[012][,.]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
 	10.*)
-	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
       esac
     ;;
   esac
-    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
       _lt_dar_single_mod='$single_module'
     fi
-    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
     else
-      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
     fi
-    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
       _lt_dsymutil='~$DSYMUTIL $lib || :'
     else
       _lt_dsymutil=
@@ -8447,6 +8672,41 @@ $as_echo "$lt_cv_ld_force_load" >&6; }
     ;;
   esac
 
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
 # On IRIX 5.3, sys/types and inttypes.h are conflicting.
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
 		  inttypes.h stdint.h unistd.h
@@ -8500,14 +8760,14 @@ if test "${enable_shared+set}" = set; then :
     *)
       enable_shared=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_shared=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8531,14 +8791,14 @@ if test "${enable_static+set}" = set; then :
     *)
      enable_static=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_static=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8562,14 +8822,14 @@ if test "${with_pic+set}" = set; then :
     *)
       pic_mode=default
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for lt_pkg in $withval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$lt_pkg" = "X$lt_p"; then
 	  pic_mode=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8577,8 +8837,6 @@ else
 fi
 
 
-test -z "$pic_mode" && pic_mode=default
-
 
 
 
@@ -8594,14 +8852,14 @@ if test "${enable_fast_install+set}" = set; then :
     *)
       enable_fast_install=no
       # Look at the argument we got.  We use all the common list separators.
-      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
       for pkg in $enableval; do
-	IFS="$lt_save_ifs"
+	IFS=$lt_save_ifs
 	if test "X$pkg" = "X$p"; then
 	  enable_fast_install=yes
 	fi
       done
-      IFS="$lt_save_ifs"
+      IFS=$lt_save_ifs
       ;;
     esac
 else
@@ -8615,11 +8873,63 @@ fi
 
 
 
+  shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[5-9]*,yes)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
+$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }
+
+# Check whether --with-aix-soname was given.
+if test "${with_aix_soname+set}" = set; then :
+  withval=$with_aix_soname; case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname
+else
+  if ${lt_cv_with_aix_soname+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_with_aix_soname=aix
+fi
+
+    with_aix_soname=$lt_cv_with_aix_soname
+fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
+$as_echo "$with_aix_soname" >&6; }
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+
+
+
+
+
+
 
 
 
 # This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ltmain"
+LIBTOOL_DEPS=$ltmain
 
 # Always use our own libtool.
 LIBTOOL='$(SHELL) $(top_builddir)/libtool'
@@ -8668,7 +8978,7 @@ test -z "$LN_S" && LN_S="ln -s"
 
 
 
-if test -n "${ZSH_VERSION+set}" ; then
+if test -n "${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
@@ -8707,7 +9017,7 @@ aix3*)
   # AIX sometimes has problems with the GCC collect2 program.  For some
   # reason, if we set the COLLECT_NAMES environment variable, the problems
   # vanish in a puff of smoke.
-  if test "X${COLLECT_NAMES+set}" != Xset; then
+  if test set != "${COLLECT_NAMES+set}"; then
     COLLECT_NAMES=
     export COLLECT_NAMES
   fi
@@ -8718,14 +9028,14 @@ esac
 ofile=libtool
 can_build_shared=yes
 
-# All known linkers require a `.a' archive for static linking (except MSVC,
+# All known linkers require a '.a' archive for static linking (except MSVC,
 # which needs '.lib').
 libext=a
 
-with_gnu_ld="$lt_cv_prog_gnu_ld"
+with_gnu_ld=$lt_cv_prog_gnu_ld
 
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
+old_CC=$CC
+old_CFLAGS=$CFLAGS
 
 # Set sane defaults for various variables
 test -z "$CC" && CC=cc
@@ -8734,15 +9044,8 @@ test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
 test -z "$LD" && LD=ld
 test -z "$ac_objext" && ac_objext=o
 
-for cc_temp in $compiler""; do
-  case $cc_temp in
-    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
-    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
-    \-*) ;;
-    *) break;;
-  esac
-done
-cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+func_cc_basename $compiler
+cc_basename=$func_cc_basename_result
 
 
 # Only perform the check for file, if the check method requires it
@@ -8757,22 +9060,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/${ac_tool_prefix}file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+    if test -f "$ac_dir/${ac_tool_prefix}file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8795,13 +9098,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8823,22 +9126,22 @@ if ${lt_cv_path_MAGIC_CMD+:} false; then :
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
-  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
   ;;
 *)
-  lt_save_MAGIC_CMD="$MAGIC_CMD"
-  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
   ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
   for ac_dir in $ac_dummy; do
-    IFS="$lt_save_ifs"
+    IFS=$lt_save_ifs
     test -z "$ac_dir" && ac_dir=.
-    if test -f $ac_dir/file; then
-      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+    if test -f "$ac_dir/file"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
       if test -n "$file_magic_test_file"; then
 	case $deplibs_check_method in
 	"file_magic "*)
 	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
-	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
 	    $EGREP "$file_magic_regex" > /dev/null; then
 	    :
@@ -8861,13 +9164,13 @@ _LT_EOF
       break
     fi
   done
-  IFS="$lt_save_ifs"
-  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
   ;;
 esac
 fi
 
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
 if test -n "$MAGIC_CMD"; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
 $as_echo "$MAGIC_CMD" >&6; }
@@ -8888,7 +9191,7 @@ esac
 
 # Use C for the default configuration in the libtool script
 
-lt_save_CC="$CC"
+lt_save_CC=$CC
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
@@ -8950,7 +9253,7 @@ if test -n "$compiler"; then
 
 lt_prog_compiler_no_builtin_flag=
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $cc_basename in
   nvcc*)
     lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
@@ -8966,7 +9269,7 @@ else
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -8996,7 +9299,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
-if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
 else
     :
@@ -9014,17 +9317,18 @@ lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
 
-  if test "$GCC" = yes; then
+  if test yes = "$GCC"; then
     lt_prog_compiler_wl='-Wl,'
     lt_prog_compiler_static='-static'
 
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       fi
+      lt_prog_compiler_pic='-fPIC'
       ;;
 
     amigaos*)
@@ -9035,8 +9339,8 @@ lt_prog_compiler_static=
         ;;
       m68k)
             # FIXME: we need at least 68020 code to build shared libraries, but
-            # adding the `-m68020' flag to GCC prevents building anything better,
-            # like `-m68040'.
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
             lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
         ;;
       esac
@@ -9052,6 +9356,11 @@ lt_prog_compiler_static=
       # Although the cygwin gcc ignores -fPIC, still need this for old-style
       # (--disable-auto-import) libraries
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     darwin* | rhapsody*)
@@ -9122,7 +9431,7 @@ lt_prog_compiler_static=
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# AIX 5 now supports IA64 processor
 	lt_prog_compiler_static='-Bstatic'
       else
@@ -9130,10 +9439,29 @@ lt_prog_compiler_static=
       fi
       ;;
 
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        lt_prog_compiler_wl='-Wl,-Wl,,'
+        lt_prog_compiler_pic='-PIC'
+        lt_prog_compiler_static='-Bstatic'
+        ;;
+      esac
+      ;;
+
     mingw* | cygwin* | pw32* | os2* | cegcc*)
       # This hack is so that the source file can tell whether it is being
       # built for inclusion in a dll (and should export symbols for example).
       lt_prog_compiler_pic='-DDLL_EXPORT'
+      case $host_os in
+      os2*)
+	lt_prog_compiler_static='$wl-static'
+	;;
+      esac
       ;;
 
     hpux9* | hpux10* | hpux11*)
@@ -9149,7 +9477,7 @@ lt_prog_compiler_static=
 	;;
       esac
       # Is there a better lt_prog_compiler_static that works with the bundled CC?
-      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      lt_prog_compiler_static='$wl-a ${wl}archive'
       ;;
 
     irix5* | irix6* | nonstopux*)
@@ -9158,9 +9486,9 @@ lt_prog_compiler_static=
       lt_prog_compiler_static='-non_shared'
       ;;
 
-    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
       case $cc_basename in
-      # old Intel for x86_64 which still supported -KPIC.
+      # old Intel for x86_64, which still supported -KPIC.
       ecc*)
 	lt_prog_compiler_wl='-Wl,'
 	lt_prog_compiler_pic='-KPIC'
@@ -9185,6 +9513,12 @@ lt_prog_compiler_static=
 	lt_prog_compiler_pic='-PIC'
 	lt_prog_compiler_static='-Bstatic'
 	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+	;;
       pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
         # Portland Group compilers (*not* the Pentium gcc compiler,
 	# which looks to be a dead project)
@@ -9282,7 +9616,7 @@ lt_prog_compiler_static=
       ;;
 
     sysv4*MP*)
-      if test -d /usr/nec ;then
+      if test -d /usr/nec; then
 	lt_prog_compiler_pic='-Kconform_pic'
 	lt_prog_compiler_static='-Bstatic'
       fi
@@ -9311,7 +9645,7 @@ lt_prog_compiler_static=
   fi
 
 case $host_os in
-  # For platforms which do not support PIC, -DPIC is meaningless:
+  # For platforms that do not support PIC, -DPIC is meaningless:
   *djgpp*)
     lt_prog_compiler_pic=
     ;;
@@ -9343,7 +9677,7 @@ else
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
    echo "$lt_simple_compile_test_code" > conftest.$ac_ext
-   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
    # Insert the option either (1) after the last *FLAGS variable, or
    # (2) before a word containing "conftest.", or (3) at the end.
    # Note that $ac_compile itself does not contain backslashes and begins
@@ -9373,7 +9707,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_pic_works"; then
     case $lt_prog_compiler_pic in
      "" | " "*) ;;
      *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
@@ -9405,7 +9739,7 @@ if ${lt_cv_prog_compiler_static_works+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -9424,13 +9758,13 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
 $as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
-if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+if test yes = "$lt_cv_prog_compiler_static_works"; then
     :
 else
     lt_prog_compiler_static=
@@ -9550,8 +9884,8 @@ $as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
-hard_links="nottested"
-if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+hard_links=nottested
+if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
   # do not overwrite the value of need_locks provided by the user
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
 $as_echo_n "checking if we can lock with hard links... " >&6; }
@@ -9563,9 +9897,9 @@ $as_echo_n "checking if we can lock with hard links... " >&6; }
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
 $as_echo "$hard_links" >&6; }
-  if test "$hard_links" = no; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+  if test no = "$hard_links"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -9608,9 +9942,9 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # included in the symbol list
   include_expsyms=
   # exclude_expsyms can be an extended regexp of symbols to exclude
-  # it will be wrapped by ` (' and `)$', so one must not match beginning or
-  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-  # as well as any symbol that contains `d'.
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
   exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
   # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
   # platforms (ab)use it in PIC code, but their linkers get confused if
@@ -9625,7 +9959,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # FIXME: the MSVC++ port hasn't been tested in a loooong time
     # When not using gcc, we currently assume that we are using
     # Microsoft Visual C++.
-    if test "$GCC" != yes; then
+    if test yes != "$GCC"; then
       with_gnu_ld=no
     fi
     ;;
@@ -9633,9 +9967,12 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     # we just hope/assume this is gcc and not c89 (= MSVC++)
     with_gnu_ld=yes
     ;;
-  openbsd*)
+  openbsd* | bitrig*)
     with_gnu_ld=no
     ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
   esac
 
   ld_shlibs=yes
@@ -9643,7 +9980,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
   # On some targets, GNU ld is compatible enough with the native linker
   # that we're better off using the native interface for both.
   lt_use_gnu_ld_interface=no
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     case $host_os in
       aix*)
 	# The AIX port of GNU ld has always aspired to compatibility
@@ -9665,24 +10002,24 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     esac
   fi
 
-  if test "$lt_use_gnu_ld_interface" = yes; then
+  if test yes = "$lt_use_gnu_ld_interface"; then
     # If archive_cmds runs LD, not CC, wlarc should be empty
-    wlarc='${wl}'
+    wlarc='$wl'
 
     # Set some defaults for GNU ld with shared library support. These
     # are reset later if shared libraries are not supported. Putting them
     # here allows them to be overridden if necessary.
     runpath_var=LD_RUN_PATH
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-    export_dynamic_flag_spec='${wl}--export-dynamic'
+    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+    export_dynamic_flag_spec='$wl--export-dynamic'
     # ancient GNU ld didn't support --whole-archive et. al.
     if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
-      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
     else
       whole_archive_flag_spec=
     fi
     supports_anon_versioning=no
-    case `$LD -v 2>&1` in
+    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
       *GNU\ gold*) supports_anon_versioning=yes ;;
       *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
       *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
@@ -9695,7 +10032,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
+      if test ia64 != "$host_cpu"; then
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
@@ -9714,7 +10051,7 @@ _LT_EOF
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -9730,7 +10067,7 @@ _LT_EOF
 	allow_undefined_flag=unsupported
 	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
 	# support --undefined.  This deserves some investigation.  FIXME
-	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9740,7 +10077,7 @@ _LT_EOF
       # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
       # as there is no search path for DLLs.
       hardcode_libdir_flag_spec='-L$libdir'
-      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      export_dynamic_flag_spec='$wl--export-all-symbols'
       allow_undefined_flag=unsupported
       always_export_symbols=no
       enable_shared_with_static_runtimes=yes
@@ -9748,61 +10085,89 @@ _LT_EOF
       exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
 
       if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
-        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
-	# If the export-symbols file already is a .def file (1st line
-	# is EXPORTS), use it as is; otherwise, prepend...
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	  cp $export_symbols $output_objdir/$soname.def;
-	else
-	  echo EXPORTS > $output_objdir/$soname.def;
-	  cat $export_symbols >> $output_objdir/$soname.def;
-	fi~
-	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
       else
 	ld_shlibs=no
       fi
       ;;
 
     haiku*)
-      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
       link_all_deplibs=yes
       ;;
 
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
+      ;;
+
     interix[3-9]*)
       hardcode_direct=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-      export_dynamic_flag_spec='${wl}-E'
+      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+      export_dynamic_flag_spec='$wl-E'
       # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
       # Instead, shared libraries are loaded at an image base (0x10000000 by
       # default) and relocated if they conflict, which is a slow very memory
       # consuming and fragmenting process.  To avoid this, we pick a random,
       # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
       # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
-      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
-      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
       ;;
 
     gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
       tmp_diet=no
-      if test "$host_os" = linux-dietlibc; then
+      if test linux-dietlibc = "$host_os"; then
 	case $cc_basename in
 	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
 	esac
       fi
       if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
-	 && test "$tmp_diet" = no
+	 && test no = "$tmp_diet"
       then
 	tmp_addflag=' $pic_flag'
 	tmp_sharedflag='-shared'
 	case $cc_basename,$host_cpu in
         pgcc*)				# Portland Group C compiler
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag'
 	  ;;
 	pgf77* | pgf90* | pgf95* | pgfortran*)
 					# Portland Group f77 and f90 compilers
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
 	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
 	  tmp_addflag=' -i_dynamic' ;;
@@ -9813,42 +10178,47 @@ _LT_EOF
 	lf95*)				# Lahey Fortran 8.1
 	  whole_archive_flag_spec=
 	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
 	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
 	  tmp_sharedflag='-qmkshrobj'
 	  tmp_addflag= ;;
 	nvcc*)	# Cuda Compiler Driver 2.2
-	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  ;;
 	esac
 	case `$CC -V 2>&1 | sed 5q` in
 	*Sun\ C*)			# Sun C 5.9
-	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
 	  compiler_needs_object=yes
 	  tmp_sharedflag='-G' ;;
 	*Sun\ F*)			# Sun Fortran 8.3
 	  tmp_sharedflag='-G' ;;
 	esac
-	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
 
-        if test "x$supports_anon_versioning" = xyes; then
+        if test yes = "$supports_anon_versioning"; then
           archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	    echo "local: *; };" >> $output_objdir/$libname.ver~
-	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
         fi
 
 	case $cc_basename in
+	tcc*)
+	  export_dynamic_flag_spec='-rdynamic'
+	  ;;
 	xlf* | bgf* | bgxlf* | mpixlf*)
 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
 	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
-	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
 	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
-	  if test "x$supports_anon_versioning" = xyes; then
+	  if test yes = "$supports_anon_versioning"; then
 	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
-	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
-	      echo "local: *; };" >> $output_objdir/$libname.ver~
-	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
 	  fi
 	  ;;
 	esac
@@ -9857,13 +10227,13 @@ _LT_EOF
       fi
       ;;
 
-    netbsd*)
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
 	wlarc=
       else
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       fi
       ;;
 
@@ -9881,8 +10251,8 @@ _LT_EOF
 
 _LT_EOF
       elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
@@ -9894,7 +10264,7 @@ _LT_EOF
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
-*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
 *** reliably create shared libraries on SCO systems.  Therefore, libtool
 *** is disabling shared libraries support.  We urge you to upgrade GNU
 *** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
@@ -9909,9 +10279,9 @@ _LT_EOF
 	  # DT_RUNPATH tag from executables and libraries.  But doing so
 	  # requires that you compile everything twice, which is a pain.
 	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
 	  else
 	    ld_shlibs=no
 	  fi
@@ -9928,15 +10298,15 @@ _LT_EOF
 
     *)
       if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
-	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
       else
 	ld_shlibs=no
       fi
       ;;
     esac
 
-    if test "$ld_shlibs" = no; then
+    if test no = "$ld_shlibs"; then
       runpath_var=
       hardcode_libdir_flag_spec=
       export_dynamic_flag_spec=
@@ -9952,7 +10322,7 @@ _LT_EOF
       # Note: this linker hardcodes the directories in LIBPATH if there
       # are no directories specified by -L.
       hardcode_minus_L=yes
-      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
 	# Neither direct hardcoding nor static linking is supported with a
 	# broken collect2.
 	hardcode_direct=unsupported
@@ -9960,34 +10330,57 @@ _LT_EOF
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
+      if test ia64 = "$host_cpu"; then
 	# On IA64, the linker does run time linking by default, so we don't
 	# have to do anything special.
 	aix_use_runtimelinking=no
 	exp_sym_flag='-Bexport'
-	no_entry_flag=""
+	no_entry_flag=
       else
 	# If we're using GNU nm, then we don't want the "-C" option.
-	# -C means demangle to AIX nm, but means don't demangle with GNU nm
-	# Also, AIX nm treats weak defined symbols like other global
-	# defined symbols, whereas GNU nm marks them as "W".
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
 	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
-	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
 	else
-	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
 	fi
 	aix_use_runtimelinking=no
 
 	# Test if we are trying to use run time linking or normal
 	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
-	# need to do runtime linking.
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
 	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
 	  for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
 	    aix_use_runtimelinking=yes
 	    break
 	  fi
 	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
 	  ;;
 	esac
 
@@ -10006,13 +10399,21 @@ _LT_EOF
       hardcode_direct_absolute=yes
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      file_list_spec='${wl}-f,'
+      file_list_spec='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	hardcode_direct=no
+	hardcode_direct_absolute=no
+	;;
+      esac
 
-      if test "$GCC" = yes; then
+      if test yes = "$GCC"; then
 	case $host_os in aix4.[012]|aix4.[012].*)
 	# We only want to do this on AIX 4.2 and lower, the check
 	# below for broken collect2 doesn't work under 4.3+
-	  collect2name=`${CC} -print-prog-name=collect2`
+	  collect2name=`$CC -print-prog-name=collect2`
 	  if test -f "$collect2name" &&
 	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
 	  then
@@ -10031,35 +10432,42 @@ _LT_EOF
 	  ;;
 	esac
 	shared_flag='-shared'
-	if test "$aix_use_runtimelinking" = yes; then
-	  shared_flag="$shared_flag "'${wl}-G'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
 	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
+	if test ia64 = "$host_cpu"; then
 	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
 	# chokes on -Wl,-G. The following line is correct:
 	  shared_flag='-G'
 	else
-	  if test "$aix_use_runtimelinking" = yes; then
-	    shared_flag='${wl}-G'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
 	  else
-	    shared_flag='${wl}-bM:SRE'
+	    shared_flag='$wl-bM:SRE'
 	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
 	fi
       fi
 
-      export_dynamic_flag_spec='${wl}-bexpall'
+      export_dynamic_flag_spec='$wl-bexpall'
       # It seems that -bexpall does not export symbols beginning with
       # underscore (_), so it is better to generate a list of symbols to export.
       always_export_symbols=yes
-      if test "$aix_use_runtimelinking" = yes; then
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
 	# Warning - without using the other runtime loading flags (-brtl),
 	# -berok will link without error, but may produce a broken library.
 	allow_undefined_flag='-berok'
         # Determine the default libpath from the value encoded in an
         # empty executable.
-        if test "${lt_cv_aix_libpath+set}" = set; then
+        if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -10094,7 +10502,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -10102,17 +10510,17 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	if test ia64 = "$host_cpu"; then
+	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
 	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
 	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
-	 if test "${lt_cv_aix_libpath+set}" = set; then
+	 if test set = "${lt_cv_aix_libpath+set}"; then
   aix_libpath=$lt_cv_aix_libpath
 else
   if ${lt_cv_aix_libpath_+:} false; then :
@@ -10147,7 +10555,7 @@ fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
   if test -z "$lt_cv_aix_libpath_"; then
-    lt_cv_aix_libpath_="/usr/lib:/lib"
+    lt_cv_aix_libpath_=/usr/lib:/lib
   fi
 
 fi
@@ -10155,21 +10563,33 @@ fi
   aix_libpath=$lt_cv_aix_libpath_
 fi
 
-	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
 	  # Warning - without using the other run time loading flags,
 	  # -berok will link without error, but may produce a broken library.
-	  no_undefined_flag=' ${wl}-bernotok'
-	  allow_undefined_flag=' ${wl}-berok'
-	  if test "$with_gnu_ld" = yes; then
+	  no_undefined_flag=' $wl-bernotok'
+	  allow_undefined_flag=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
 	    # We only use this code for GNU lds that support --whole-archive.
-	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
 	  else
 	    # Exported symbols can be pulled into shared objects from archives
 	    whole_archive_flag_spec='$convenience'
 	  fi
 	  archive_cmds_need_lc=yes
-	  # This is similar to how AIX traditionally builds its shared libraries.
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) >  [...]
+	  else
+	    # used by -dlpreopen to get the symbols
+	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
 	fi
       fi
       ;;
@@ -10178,7 +10598,7 @@ fi
       case $host_cpu in
       powerpc)
             # see comment about AmigaOS4 .so support
-            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
             archive_expsym_cmds=''
         ;;
       m68k)
@@ -10208,16 +10628,17 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
-	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
-	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
-	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
-	  else
-	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
-	  fi~
-	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
-	  linknames='
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
 	# The linker will not automatically build a static lib if we build a DLL.
 	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
 	enable_shared_with_static_runtimes=yes
@@ -10226,18 +10647,18 @@ fi
 	# Don't use ranlib
 	old_postinstall_cmds='chmod 644 $oldlib'
 	postlink_cmds='lt_outputfile="@OUTPUT@"~
-	  lt_tool_outputfile="@TOOL_OUTPUT@"~
-	  case $lt_outputfile in
-	    *.exe|*.EXE) ;;
-	    *)
-	      lt_outputfile="$lt_outputfile.exe"
-	      lt_tool_outputfile="$lt_tool_outputfile.exe"
-	      ;;
-	  esac~
-	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
-	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
-	    $RM "$lt_outputfile.manifest";
-	  fi'
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
 	;;
       *)
 	# Assume MSVC wrapper
@@ -10246,7 +10667,7 @@ fi
 	# Tell ltmain to make .lib files, not .a files.
 	libext=lib
 	# Tell ltmain to make .dll files, not .so files.
-	shrext_cmds=".dll"
+	shrext_cmds=.dll
 	# FIXME: Setting linknames here is a bad hack.
 	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
 	# The linker will automatically build a .lib file if we build a DLL.
@@ -10265,24 +10686,24 @@ fi
   hardcode_direct=no
   hardcode_automatic=yes
   hardcode_shlibpath_var=unsupported
-  if test "$lt_cv_ld_force_load" = "yes"; then
-    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+  if test yes = "$lt_cv_ld_force_load"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
 
   else
     whole_archive_flag_spec=''
   fi
   link_all_deplibs=yes
-  allow_undefined_flag="$_lt_dar_allow_undefined"
+  allow_undefined_flag=$_lt_dar_allow_undefined
   case $cc_basename in
-     ifort*) _lt_dar_can_shared=yes ;;
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
      *) _lt_dar_can_shared=$GCC ;;
   esac
-  if test "$_lt_dar_can_shared" = "yes"; then
+  if test yes = "$_lt_dar_can_shared"; then
     output_verbose_link_cmd=func_echo_all
-    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
 
   else
   ld_shlibs=no
@@ -10324,33 +10745,33 @@ fi
       ;;
 
     hpux9*)
-      if test "$GCC" = yes; then
-	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       else
-	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
       fi
-      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_direct=yes
 
       # hardcode_minus_L: Not really in the search PATH,
       # but as the default location of the library.
       hardcode_minus_L=yes
-      export_dynamic_flag_spec='${wl}-E'
+      export_dynamic_flag_spec='$wl-E'
       ;;
 
     hpux10*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
-	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 	hardcode_direct=yes
 	hardcode_direct_absolute=yes
-	export_dynamic_flag_spec='${wl}-E'
+	export_dynamic_flag_spec='$wl-E'
 	# hardcode_minus_L: Not really in the search PATH,
 	# but as the default location of the library.
 	hardcode_minus_L=yes
@@ -10358,25 +10779,25 @@ fi
       ;;
 
     hpux11*)
-      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+      if test yes,no = "$GCC,$with_gnu_ld"; then
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
-	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	esac
       else
 	case $host_cpu in
 	hppa*64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
 	*)
 
@@ -10388,7 +10809,7 @@ if ${lt_cv_prog_compiler__b+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler__b=no
-   save_LDFLAGS="$LDFLAGS"
+   save_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -b"
    echo "$lt_simple_link_test_code" > conftest.$ac_ext
    if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
@@ -10407,14 +10828,14 @@ else
      fi
    fi
    $RM -r conftest*
-   LDFLAGS="$save_LDFLAGS"
+   LDFLAGS=$save_LDFLAGS
 
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
 $as_echo "$lt_cv_prog_compiler__b" >&6; }
 
-if test x"$lt_cv_prog_compiler__b" = xyes; then
-    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+if test yes = "$lt_cv_prog_compiler__b"; then
+    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 else
     archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
 fi
@@ -10422,8 +10843,8 @@ fi
 	  ;;
 	esac
       fi
-      if test "$with_gnu_ld" = no; then
-	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      if test no = "$with_gnu_ld"; then
+	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
 	hardcode_libdir_separator=:
 
 	case $host_cpu in
@@ -10434,7 +10855,7 @@ fi
 	*)
 	  hardcode_direct=yes
 	  hardcode_direct_absolute=yes
-	  export_dynamic_flag_spec='${wl}-E'
+	  export_dynamic_flag_spec='$wl-E'
 
 	  # hardcode_minus_L: Not really in the search PATH,
 	  # but as the default location of the library.
@@ -10445,8 +10866,8 @@ fi
       ;;
 
     irix5* | irix6* | nonstopux*)
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
 	# Try to use the -exported_symbol ld option, if it does not
 	# work, assume that -exports_file does not work either and
 	# implicitly export all symbols.
@@ -10456,8 +10877,8 @@ $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >
 if ${lt_cv_irix_exported_symbol+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  save_LDFLAGS="$LDFLAGS"
-	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+  save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
 	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 int foo (void) { return 0; }
@@ -10469,25 +10890,36 @@ else
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
-           LDFLAGS="$save_LDFLAGS"
+           LDFLAGS=$save_LDFLAGS
 fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
 $as_echo "$lt_cv_irix_exported_symbol" >&6; }
-	if test "$lt_cv_irix_exported_symbol" = yes; then
-          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
 	fi
+	link_all_deplibs=no
       else
-	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
-	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       inherit_rpath=yes
       link_all_deplibs=yes
       ;;
 
-    netbsd*)
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	ld_shlibs=yes
+	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
       if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
 	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
       else
@@ -10501,7 +10933,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     newsos6)
       archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
       hardcode_direct=yes
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       hardcode_shlibpath_var=no
       ;;
@@ -10509,27 +10941,19 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
     *nto* | *qnx*)
       ;;
 
-    openbsd*)
+    openbsd* | bitrig*)
       if test -f /usr/libexec/ld.so; then
 	hardcode_direct=yes
 	hardcode_shlibpath_var=no
 	hardcode_direct_absolute=yes
-	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
 	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
-	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	  export_dynamic_flag_spec='${wl}-E'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
+	  export_dynamic_flag_spec='$wl-E'
 	else
-	  case $host_os in
-	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
-	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
-	     hardcode_libdir_flag_spec='-R$libdir'
-	     ;;
-	   *)
-	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
-	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
-	     ;;
-	  esac
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
 	fi
       else
 	ld_shlibs=no
@@ -10540,33 +10964,53 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       hardcode_libdir_flag_spec='-L$libdir'
       hardcode_minus_L=yes
       allow_undefined_flag=unsupported
-      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
-      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      shrext_cmds=.dll
+      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      enable_shared_with_static_runtimes=yes
       ;;
 
     osf3*)
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
       fi
       archive_cmds_need_lc='no'
-      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       hardcode_libdir_separator=:
       ;;
 
     osf4* | osf5*)	# as osf3* with the addition of -msym flag
-      if test "$GCC" = yes; then
-	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
-	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      if test yes = "$GCC"; then
+	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
+	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
       else
 	allow_undefined_flag=' -expect_unresolved \*'
-	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
 	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
-	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
 
 	# Both c and cxx compiler support -rpath directly
 	hardcode_libdir_flag_spec='-rpath $libdir'
@@ -10577,24 +11021,24 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
     solaris*)
       no_undefined_flag=' -z defs'
-      if test "$GCC" = yes; then
-	wlarc='${wl}'
-	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
 	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
       else
 	case `$CC -V 2>&1` in
 	*"Compilers 5.0"*)
 	  wlarc=''
-	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
 	  ;;
 	*)
-	  wlarc='${wl}'
-	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  wlarc='$wl'
+	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
 	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
-	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
 	  ;;
 	esac
       fi
@@ -10604,11 +11048,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       solaris2.[0-5] | solaris2.[0-5].*) ;;
       *)
 	# The compiler driver will combine and reorder linker options,
-	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
 	# but is careful enough not to reorder.
 	# Supported since Solaris 2.6 (maybe 2.5.1?)
-	if test "$GCC" = yes; then
-	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	if test yes = "$GCC"; then
+	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
 	else
 	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
 	fi
@@ -10618,10 +11062,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sunos4*)
-      if test "x$host_vendor" = xsequent; then
+      if test sequent = "$host_vendor"; then
 	# Use $CC to link under sequent, because it throws in some extra .o
 	# files that make .init and .fini sections work.
-	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
       else
 	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
       fi
@@ -10670,43 +11114,43 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
 
     sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
-      no_undefined_flag='${wl}-z,text'
+      no_undefined_flag='$wl-z,text'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
     sysv5* | sco3.2v5* | sco5v6*)
-      # Note: We can NOT use -z defs as we might desire, because we do not
+      # Note: We CANNOT use -z defs as we might desire, because we do not
       # link with -lc, and that would cause any symbols used from libc to
       # always be unresolved, which means just about no library would
       # ever link correctly.  If we're not using GNU ld we use -z text
       # though, which does catch some bad symbols but isn't as heavy-handed
       # as -z defs.
-      no_undefined_flag='${wl}-z,text'
-      allow_undefined_flag='${wl}-z,nodefs'
+      no_undefined_flag='$wl-z,text'
+      allow_undefined_flag='$wl-z,nodefs'
       archive_cmds_need_lc=no
       hardcode_shlibpath_var=no
-      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_flag_spec='$wl-R,$libdir'
       hardcode_libdir_separator=':'
       link_all_deplibs=yes
-      export_dynamic_flag_spec='${wl}-Bexport'
+      export_dynamic_flag_spec='$wl-Bexport'
       runpath_var='LD_RUN_PATH'
 
-      if test "$GCC" = yes; then
-	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      if test yes = "$GCC"; then
+	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       else
-	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
-	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
       fi
       ;;
 
@@ -10721,10 +11165,10 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
       ;;
     esac
 
-    if test x$host_vendor = xsni; then
+    if test sni = "$host_vendor"; then
       case $host in
       sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
-	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	export_dynamic_flag_spec='$wl-Blargedynsym'
 	;;
       esac
     fi
@@ -10732,7 +11176,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; }
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
 $as_echo "$ld_shlibs" >&6; }
-test "$ld_shlibs" = no && can_build_shared=no
+test no = "$ld_shlibs" && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
 
@@ -10758,7 +11202,7 @@ x|xyes)
   # Assume -lc should be added
   archive_cmds_need_lc=yes
 
-  if test "$enable_shared" = yes && test "$GCC" = yes; then
+  if test yes,yes = "$GCC,$enable_shared"; then
     case $archive_cmds in
     *'~'*)
       # FIXME: we may have to deal with multi-command sequences.
@@ -10973,14 +11417,14 @@ esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
 $as_echo_n "checking dynamic linker characteristics... " >&6; }
 
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   case $host_os in
-    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
-    *) lt_awk_arg="/^libraries:/" ;;
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
   esac
   case $host_os in
-    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
-    *) lt_sed_strip_eq="s,=/,/,g" ;;
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
   esac
   lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
   case $lt_search_path_spec in
@@ -10996,28 +11440,35 @@ if test "$GCC" = yes; then
     ;;
   esac
   # Ok, now we have the path, separated by spaces, we can step through it
-  # and add multilib dir if necessary.
+  # and add multilib dir if necessary...
   lt_tmp_lt_search_path_spec=
-  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
   for lt_sys_path in $lt_search_path_spec; do
-    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
-      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
-    else
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
       test -d "$lt_sys_path" && \
 	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
     fi
   done
   lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
-BEGIN {RS=" "; FS="/|\n";} {
-  lt_foo="";
-  lt_count=0;
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
   for (lt_i = NF; lt_i > 0; lt_i--) {
     if ($lt_i != "" && $lt_i != ".") {
       if ($lt_i == "..") {
         lt_count++;
       } else {
         if (lt_count == 0) {
-          lt_foo="/" $lt_i lt_foo;
+          lt_foo = "/" $lt_i lt_foo;
         } else {
           lt_count--;
         }
@@ -11031,7 +11482,7 @@ BEGIN {RS=" "; FS="/|\n";} {
   # for these hosts.
   case $host_os in
     mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
-      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
   esac
   sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
 else
@@ -11040,7 +11491,7 @@ fi
 library_names_spec=
 libname_spec='lib$name'
 soname_spec=
-shrext_cmds=".so"
+shrext_cmds=.so
 postinstall_cmds=
 postuninstall_cmds=
 finish_cmds=
@@ -11057,14 +11508,16 @@ hardcode_into_libs=no
 # flags to be left without arguments
 need_version=unknown
 
+
+
 case $host_os in
 aix3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
   shlibpath_var=LIBPATH
 
   # AIX 3 has no versioning support, so we append a major version to the name.
-  soname_spec='${libname}${release}${shared_ext}$major'
+  soname_spec='$libname$release$shared_ext$major'
   ;;
 
 aix[4-9]*)
@@ -11072,41 +11525,91 @@ aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
+  if test ia64 = "$host_cpu"; then
     # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
     shlibpath_var=LD_LIBRARY_PATH
   else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
-    # the line `#! .'.  This would cause the generated library to
-    # depend on `.', always an invalid library.  This was fixed in
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
     # development snapshots of GCC prior to 3.0.
     case $host_os in
       aix4 | aix4.[01] | aix4.[01].*)
       if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
 	   echo ' yes '
-	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
 	:
       else
 	can_build_shared=no
       fi
       ;;
     esac
-    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
     # soname into executable. Probably we can add versioning support to
     # collect2, so additional links can be useful in future.
-    if test "$aix_use_runtimelinking" = yes; then
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
       # If using run time linking (on AIX 4.2 or later) use lib<name>.so
       # instead of lib<name>.a to let people know that these are not
       # typical AIX shared libraries.
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    else
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a(lib.so.V)'
       # We preserve .a as extension for shared libraries through AIX4.2
       # and later when we are not doing run time linking.
-      library_names_spec='${libname}${release}.a $libname.a'
-      soname_spec='${libname}${release}${shared_ext}$major'
-    fi
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
     shlibpath_var=LIBPATH
   fi
   ;;
@@ -11116,18 +11619,18 @@ amigaos*)
   powerpc)
     # Since July 2007 AmigaOS4 officially supports .so libraries.
     # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
     ;;
   m68k)
     library_names_spec='$libname.ixlibrary $libname.a'
     # Create ${libname}_ixlibrary.a entries in /sys/libs.
-    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
     ;;
   esac
   ;;
 
 beos*)
-  library_names_spec='${libname}${shared_ext}'
+  library_names_spec='$libname$shared_ext'
   dynamic_linker="$host_os ld.so"
   shlibpath_var=LIBRARY_PATH
   ;;
@@ -11135,8 +11638,8 @@ beos*)
 bsdi[45]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
@@ -11148,7 +11651,7 @@ bsdi[45]*)
 
 cygwin* | mingw* | pw32* | cegcc*)
   version_type=windows
-  shrext_cmds=".dll"
+  shrext_cmds=.dll
   need_version=no
   need_lib_prefix=no
 
@@ -11157,8 +11660,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     # gcc
     library_names_spec='$libname.dll.a'
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname~
@@ -11174,17 +11677,17 @@ cygwin* | mingw* | pw32* | cegcc*)
     case $host_os in
     cygwin*)
       # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
 
       sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
       ;;
     mingw* | cegcc*)
       # MinGW DLLs use traditional 'lib' prefix
-      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     pw32*)
       # pw32 DLLs use 'pw' prefix rather than 'lib'
-      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
       ;;
     esac
     dynamic_linker='Win32 ld.exe'
@@ -11193,8 +11696,8 @@ cygwin* | mingw* | pw32* | cegcc*)
   *,cl*)
     # Native MSVC
     libname_spec='$name'
-    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
-    library_names_spec='${libname}.dll.lib'
+    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
 
     case $build_os in
     mingw*)
@@ -11221,7 +11724,7 @@ cygwin* | mingw* | pw32* | cegcc*)
       sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
       ;;
     *)
-      sys_lib_search_path_spec="$LIB"
+      sys_lib_search_path_spec=$LIB
       if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
         # It is most probably a Windows format PATH.
         sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
@@ -11234,8 +11737,8 @@ cygwin* | mingw* | pw32* | cegcc*)
     esac
 
     # DLL is installed to $(libdir)/../bin by postinstall_cmds
-    postinstall_cmds='base_file=`basename \${file}`~
-      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
       dldir=$destdir/`dirname \$dlpath`~
       test -d \$dldir || mkdir -p \$dldir~
       $install_prog $dir/$dlname \$dldir/$dlname'
@@ -11248,7 +11751,7 @@ cygwin* | mingw* | pw32* | cegcc*)
 
   *)
     # Assume MSVC wrapper
-    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
     dynamic_linker='Win32 ld.exe'
     ;;
   esac
@@ -11261,8 +11764,8 @@ darwin* | rhapsody*)
   version_type=darwin
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
-  soname_spec='${libname}${release}${major}$shared_ext'
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
   shlibpath_overrides_runpath=yes
   shlibpath_var=DYLD_LIBRARY_PATH
   shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
@@ -11275,8 +11778,8 @@ dgux*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11294,12 +11797,13 @@ freebsd* | dragonfly*)
   version_type=freebsd-$objformat
   case $version_type in
     freebsd-elf*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
       need_version=no
       need_lib_prefix=no
       ;;
     freebsd-*)
-      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
       need_version=yes
       ;;
   esac
@@ -11324,26 +11828,15 @@ freebsd* | dragonfly*)
   esac
   ;;
 
-gnu*)
-  version_type=linux # correct to gnu/linux during the next big refactor
-  need_lib_prefix=no
-  need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
-  shlibpath_var=LD_LIBRARY_PATH
-  shlibpath_overrides_runpath=no
-  hardcode_into_libs=yes
-  ;;
-
 haiku*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
   dynamic_linker="$host_os runtime_loader"
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LIBRARY_PATH
-  shlibpath_overrides_runpath=yes
+  shlibpath_overrides_runpath=no
   sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
   hardcode_into_libs=yes
   ;;
@@ -11361,14 +11854,15 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.so"
     shlibpath_var=LD_LIBRARY_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
       sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
     else
       sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
     fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
   hppa*64*)
     shrext_cmds='.sl'
@@ -11376,8 +11870,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
     shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
     sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
     ;;
@@ -11386,8 +11880,8 @@ hpux9* | hpux10* | hpux11*)
     dynamic_linker="$host_os dld.sl"
     shlibpath_var=SHLIB_PATH
     shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     ;;
   esac
   # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
@@ -11400,8 +11894,8 @@ interix[3-9]*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -11412,7 +11906,7 @@ irix5* | irix6* | nonstopux*)
   case $host_os in
     nonstopux*) version_type=nonstopux ;;
     *)
-	if test "$lt_cv_prog_gnu_ld" = yes; then
+	if test yes = "$lt_cv_prog_gnu_ld"; then
 		version_type=linux # correct to gnu/linux during the next big refactor
 	else
 		version_type=irix
@@ -11420,8 +11914,8 @@ irix5* | irix6* | nonstopux*)
   esac
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
   case $host_os in
   irix5* | nonstopux*)
     libsuff= shlibsuff=
@@ -11440,8 +11934,8 @@ irix5* | irix6* | nonstopux*)
   esac
   shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
   shlibpath_overrides_runpath=no
-  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
-  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
   hardcode_into_libs=yes
   ;;
 
@@ -11450,13 +11944,33 @@ linux*oldld* | linux*aout* | linux*coff*)
   dynamic_linker=no
   ;;
 
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  hardcode_libdir_flag_spec='-L$libdir'
+  ;;
+
 # This must be glibc/ELF.
-linux* | k*bsd*-gnu | kopensolaris*-gnu)
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
@@ -11500,7 +12014,12 @@ fi
   # before this can be enabled.
   hardcode_into_libs=yes
 
-  # Append ld.so.conf contents to the search path
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
   if test -f /etc/ld.so.conf; then
     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
     sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
@@ -11515,17 +12034,29 @@ fi
   dynamic_linker='GNU/Linux ld.so'
   ;;
 
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
 netbsd*)
   version_type=sunos
   need_lib_prefix=no
   need_version=no
   if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
     finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
     dynamic_linker='NetBSD (a.out) ld.so'
   else
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
     dynamic_linker='NetBSD ld.elf_so'
   fi
   shlibpath_var=LD_LIBRARY_PATH
@@ -11535,7 +12066,7 @@ netbsd*)
 
 newsos6)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   ;;
@@ -11544,58 +12075,68 @@ newsos6)
   version_type=qnx
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
   dynamic_linker='ldqnx.so'
   ;;
 
-openbsd*)
+openbsd* | bitrig*)
   version_type=sunos
-  sys_lib_dlsearch_path_spec="/usr/lib"
+  sys_lib_dlsearch_path_spec=/usr/lib
   need_lib_prefix=no
-  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
-  case $host_os in
-    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
-    *)				need_version=no  ;;
-  esac
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
-  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-  shlibpath_var=LD_LIBRARY_PATH
-  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-    case $host_os in
-      openbsd2.[89] | openbsd2.[89].*)
-	shlibpath_overrides_runpath=no
-	;;
-      *)
-	shlibpath_overrides_runpath=yes
-	;;
-      esac
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
   else
-    shlibpath_overrides_runpath=yes
+    need_version=yes
   fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
   ;;
 
 os2*)
   libname_spec='$name'
-  shrext_cmds=".dll"
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
   need_lib_prefix=no
-  library_names_spec='$libname${shared_ext} $libname.a'
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
   dynamic_linker='OS/2 ld.exe'
-  shlibpath_var=LIBPATH
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
   ;;
 
 osf3* | osf4* | osf5*)
   version_type=osf
   need_lib_prefix=no
   need_version=no
-  soname_spec='${libname}${release}${shared_ext}$major'
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
-  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
   ;;
 
 rdos*)
@@ -11606,8 +12147,8 @@ solaris*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
@@ -11617,11 +12158,11 @@ solaris*)
 
 sunos4*)
   version_type=sunos
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
   finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     need_lib_prefix=no
   fi
   need_version=yes
@@ -11629,8 +12170,8 @@ sunos4*)
 
 sysv4 | sysv4.3*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   case $host_vendor in
     sni)
@@ -11651,24 +12192,24 @@ sysv4 | sysv4.3*)
   ;;
 
 sysv4*MP*)
-  if test -d /usr/nec ;then
+  if test -d /usr/nec; then
     version_type=linux # correct to gnu/linux during the next big refactor
-    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
-    soname_spec='$libname${shared_ext}.$major'
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
     shlibpath_var=LD_LIBRARY_PATH
   fi
   ;;
 
 sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
-  version_type=freebsd-elf
+  version_type=sco
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=yes
   hardcode_into_libs=yes
-  if test "$with_gnu_ld" = yes; then
+  if test yes = "$with_gnu_ld"; then
     sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
   else
     sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
@@ -11686,7 +12227,7 @@ tpf*)
   version_type=linux # correct to gnu/linux during the next big refactor
   need_lib_prefix=no
   need_version=no
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
   shlibpath_var=LD_LIBRARY_PATH
   shlibpath_overrides_runpath=no
   hardcode_into_libs=yes
@@ -11694,8 +12235,8 @@ tpf*)
 
 uts4*)
   version_type=linux # correct to gnu/linux during the next big refactor
-  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
   shlibpath_var=LD_LIBRARY_PATH
   ;;
 
@@ -11705,20 +12246,35 @@ uts4*)
 esac
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
 $as_echo "$dynamic_linker" >&6; }
-test "$dynamic_linker" = no && can_build_shared=no
+test no = "$dynamic_linker" && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
+if test yes = "$GCC"; then
   variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
 fi
 
-if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
-  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
 fi
-if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
-  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
 fi
 
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+
+
+
+
+
 
 
 
@@ -11815,15 +12371,15 @@ $as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
-   test "X$hardcode_automatic" = "Xyes" ; then
+   test yes = "$hardcode_automatic"; then
 
   # We can hardcode non-existent directories.
-  if test "$hardcode_direct" != no &&
+  if test no != "$hardcode_direct" &&
      # If the only mechanism to avoid hardcoding is shlibpath_var, we
      # have to relink, otherwise we might link with an installed library
      # when we should be linking with a yet-to-be-installed one
-     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
-     test "$hardcode_minus_L" != no; then
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
+     test no != "$hardcode_minus_L"; then
     # Linking always hardcodes the temporary library directory.
     hardcode_action=relink
   else
@@ -11838,12 +12394,12 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
 $as_echo "$hardcode_action" >&6; }
 
-if test "$hardcode_action" = relink ||
-   test "$inherit_rpath" = yes; then
+if test relink = "$hardcode_action" ||
+   test yes = "$inherit_rpath"; then
   # Fast installation is not supported
   enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
-     test "$enable_shared" = no; then
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
   # Fast installation is not necessary
   enable_fast_install=needless
 fi
@@ -11853,7 +12409,7 @@ fi
 
 
 
-  if test "x$enable_dlopen" != xyes; then
+  if test yes != "$enable_dlopen"; then
   enable_dlopen=unknown
   enable_dlopen_self=unknown
   enable_dlopen_self_static=unknown
@@ -11863,23 +12419,23 @@ else
 
   case $host_os in
   beos*)
-    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen=load_add_on
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
     ;;
 
   mingw* | pw32* | cegcc*)
-    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen=LoadLibrary
     lt_cv_dlopen_libs=
     ;;
 
   cygwin*)
-    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen=dlopen
     lt_cv_dlopen_libs=
     ;;
 
   darwin*)
-  # if libdl is installed we need to link against it
+    # if libdl is installed we need to link against it
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
 if ${ac_cv_lib_dl_dlopen+:} false; then :
@@ -11917,10 +12473,10 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
 
-    lt_cv_dlopen="dyld"
+    lt_cv_dlopen=dyld
     lt_cv_dlopen_libs=
     lt_cv_dlopen_self=yes
 
@@ -11928,10 +12484,18 @@ fi
 
     ;;
 
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
   *)
     ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
 if test "x$ac_cv_func_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load"
+  lt_cv_dlopen=shl_load
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
 $as_echo_n "checking for shl_load in -ldld... " >&6; }
@@ -11970,11 +12534,11 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
 $as_echo "$ac_cv_lib_dld_shl_load" >&6; }
 if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
-  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
 else
   ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
 if test "x$ac_cv_func_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen"
+  lt_cv_dlopen=dlopen
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
 $as_echo_n "checking for dlopen in -ldl... " >&6; }
@@ -12013,7 +12577,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
 $as_echo "$ac_cv_lib_dl_dlopen" >&6; }
 if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
 $as_echo_n "checking for dlopen in -lsvld... " >&6; }
@@ -12052,7 +12616,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
 $as_echo "$ac_cv_lib_svld_dlopen" >&6; }
 if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
-  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
 $as_echo_n "checking for dld_link in -ldld... " >&6; }
@@ -12091,7 +12655,7 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
 $as_echo "$ac_cv_lib_dld_dld_link" >&6; }
 if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
-  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
 fi
 
 
@@ -12112,21 +12676,21 @@ fi
     ;;
   esac
 
-  if test "x$lt_cv_dlopen" != xno; then
-    enable_dlopen=yes
-  else
+  if test no = "$lt_cv_dlopen"; then
     enable_dlopen=no
+  else
+    enable_dlopen=yes
   fi
 
   case $lt_cv_dlopen in
   dlopen)
-    save_CPPFLAGS="$CPPFLAGS"
-    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
 
-    save_LDFLAGS="$LDFLAGS"
+    save_LDFLAGS=$LDFLAGS
     wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
 
-    save_LIBS="$LIBS"
+    save_LIBS=$LIBS
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
@@ -12134,7 +12698,7 @@ $as_echo_n "checking whether a program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -12181,9 +12745,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -12213,7 +12777,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -12233,14 +12797,14 @@ fi
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
 $as_echo "$lt_cv_dlopen_self" >&6; }
 
-    if test "x$lt_cv_dlopen_self" = xyes; then
+    if test yes = "$lt_cv_dlopen_self"; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if ${lt_cv_dlopen_self_static+:} false; then :
   $as_echo_n "(cached) " >&6
 else
-  	  if test "$cross_compiling" = yes; then :
+  	  if test yes = "$cross_compiling"; then :
   lt_cv_dlopen_self_static=cross
 else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
@@ -12287,9 +12851,9 @@ else
 #  endif
 #endif
 
-/* When -fvisbility=hidden is used, assume the code has been annotated
+/* When -fvisibility=hidden is used, assume the code has been annotated
    correspondingly for the symbols needed.  */
-#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
 int fnord () __attribute__((visibility("default")));
 #endif
 
@@ -12319,7 +12883,7 @@ _LT_EOF
   (eval $ac_link) 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
     case x$lt_status in
@@ -12340,9 +12904,9 @@ fi
 $as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
-    CPPFLAGS="$save_CPPFLAGS"
-    LDFLAGS="$save_LDFLAGS"
-    LIBS="$save_LIBS"
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
     ;;
   esac
 
@@ -12386,7 +12950,7 @@ else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
   darwin*)
-    if test -n "$STRIP" ; then
+    if test -n "$STRIP"; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
       { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -12414,7 +12978,7 @@ fi
 
 
 
-  # Report which library types will actually be built
+  # Report what library types will actually be built
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
 $as_echo_n "checking if libtool supports shared libraries... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
@@ -12422,13 +12986,13 @@ $as_echo "$can_build_shared" >&6; }
 
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
 $as_echo_n "checking whether to build shared libraries... " >&6; }
-  test "$can_build_shared" = "no" && enable_shared=no
+  test no = "$can_build_shared" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
   # are all built from PIC.
   case $host_os in
   aix3*)
-    test "$enable_shared" = yes && enable_static=no
+    test yes = "$enable_shared" && enable_static=no
     if test -n "$RANLIB"; then
       archive_cmds="$archive_cmds~\$RANLIB \$lib"
       postinstall_cmds='$RANLIB $lib'
@@ -12436,8 +13000,12 @@ $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
-      test "$enable_shared" = yes && enable_static=no
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
     fi
     ;;
   esac
@@ -12447,7 +13015,7 @@ $as_echo "$enable_shared" >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
 $as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
-  test "$enable_shared" = yes || enable_static=yes
+  test yes = "$enable_shared" || enable_static=yes
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
 $as_echo "$enable_static" >&6; }
 
@@ -12461,7 +13029,7 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-CC="$lt_save_CC"
+CC=$lt_save_CC
 
 
 
@@ -12877,7 +13445,7 @@ _ASBOX
 } >&5
 
 lt_cl_help="\
-\`$as_me' creates a local libtool stub from the current configuration,
+'$as_me' creates a local libtool stub from the current configuration,
 for use in further configure time tests before the real libtool is
 generated.
 
@@ -12891,14 +13459,14 @@ Usage: $0 [OPTIONS]
 Report bugs to <bug-libtool at gnu.org>."
 
 lt_cl_version="\
-libfabric config.lt 1.4.0
+libfabric config.lt 1.5.2
 configured by $0, generated by GNU Autoconf 2.69.
 
 Copyright (C) 2011 Free Software Foundation, Inc.
 This config.lt script is free software; the Free Software Foundation
 gives unlimited permision to copy, distribute and modify it."
 
-while test $# != 0
+while test 0 != $#
 do
   case $1 in
     --version | --v* | -V )
@@ -12911,10 +13479,10 @@ do
       lt_cl_silent=: ;;
 
     -*) as_fn_error $? "unrecognized option: $1
-Try \`$0 --help' for more information." "$LINENO" 5 ;;
+Try '$0 --help' for more information." "$LINENO" 5 ;;
 
     *) as_fn_error $? "unrecognized argument: $1
-Try \`$0 --help' for more information." "$LINENO" 5 ;;
+Try '$0 --help' for more information." "$LINENO" 5 ;;
   esac
   shift
 done
@@ -12940,6 +13508,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
@@ -12989,10 +13558,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -13057,7 +13629,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -13108,9 +13681,12 @@ CFLAGS \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
 nm_file_list_spec \
+lt_cv_truncate_bin \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
@@ -13145,7 +13721,7 @@ old_striplib \
 striplib; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -13172,10 +13748,11 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -13184,19 +13761,16 @@ sys_lib_dlsearch_path_spec; do
 done
 
 ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
 
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'
 
@@ -13209,55 +13783,53 @@ cat >>"$CONFIG_LT" <<\_LTEOF
 $as_echo "$as_me: creating $ofile" >&6;}
 
 
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # The names of the tagged configurations supported by this script.
-available_tags=""
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
 
 # ### BEGIN LIBTOOL CONFIG
 
@@ -13277,6 +13849,9 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
@@ -13394,18 +13969,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
 lt_sysroot=$lt_sysroot
 
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
@@ -13496,8 +14080,11 @@ hardcode_into_libs=$hardcode_into_libs
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
@@ -13590,13 +14177,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
@@ -13648,13 +14235,72 @@ hardcode_action=$hardcode_action
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -13663,7 +14309,7 @@ _LT_EOF
   esac
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
@@ -13673,165 +14319,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
@@ -13846,7 +14333,7 @@ chmod +x "$CONFIG_LT"
 # open by configure.  Here we exec the FD to /dev/null, effectively closing
 # config.log, so it can be properly (re)opened and appended to by config.lt.
 lt_cl_success=:
-test "$silent" = yes &&
+test yes = "$silent" &&
   lt_config_lt_args="$lt_config_lt_args --quiet"
 exec 5>/dev/null
 $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
@@ -13915,6 +14402,20 @@ fi
 fi
 fi
 
+# Check whether --enable-picky was given.
+if test "${enable_picky+set}" = set; then :
+  enableval=$enable_picky;
+fi
+
+if test x"$enable_picky" = x"yes" && test x"$GCC" = x"yes"; then :
+  if test x"$enable_debug" = x"no"; then :
+  CFLAGS="${base_c_warn_flags} ${debug_c_warn_flags} ${picky_c_warn_flags} $CFLAGS"
+else
+  CFLAGS="${picky_c_warn_flags} $CFLAGS"
+fi
+
+fi
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5
 $as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; }
 if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then :
@@ -14045,8 +14546,6 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
-have_clock_gettime=0
-
 for ac_func in epoll_create
 do :
   ac_fn_c_check_func "$LINENO" "epoll_create" "ac_cv_func_epoll_create"
@@ -14064,104 +14563,54 @@ $as_echo "#define HAVE_EPOLL 1" >>confdefs.h
 
 fi
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
-$as_echo_n "checking for library containing clock_gettime... " >&6; }
-if ${ac_cv_search_clock_gettime+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  ac_func_search_save_LIBS=$LIBS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for c11 atomics" >&5
+$as_echo_n "checking compiler support for c11 atomics... " >&6; }
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char clock_gettime ();
+#include <stdatomic.h>
 int
 main ()
 {
-return clock_gettime ();
+atomic_int a;
+     atomic_init(&a, 0);
+     #ifdef __STDC_NO_ATOMICS__
+       #error c11 atomics are not supported
+     #else
+       return 0;
+     #endif
+
   ;
   return 0;
 }
 _ACEOF
-for ac_lib in '' rt; do
-  if test -z "$ac_lib"; then
-    ac_res="none required"
-  else
-    ac_res=-l$ac_lib
-    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
-  fi
-  if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_search_clock_gettime=$ac_res
-fi
-rm -f core conftest.err conftest.$ac_objext \
-    conftest$ac_exeext
-  if ${ac_cv_search_clock_gettime+:} false; then :
-  break
-fi
-done
-if ${ac_cv_search_clock_gettime+:} false; then :
-
-else
-  ac_cv_search_clock_gettime=no
-fi
-rm conftest.$ac_ext
-LIBS=$ac_func_search_save_LIBS
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
-$as_echo "$ac_cv_search_clock_gettime" >&6; }
-ac_res=$ac_cv_search_clock_gettime
-if test "$ac_res" != no; then :
-  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
-  have_clock_gettime=1
-else
-  for ac_func in host_get_clock_service
-do :
-  ac_fn_c_check_func "$LINENO" "host_get_clock_service" "ac_cv_func_host_get_clock_service"
-if test "x$ac_cv_func_host_get_clock_service" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_HOST_GET_CLOCK_SERVICE 1
-_ACEOF
-
-else
-  as_fn_error $? "clock_gettime or host_get_clock_service
-			 not found." "$LINENO" 5
-fi
-done
-
-fi
+if ac_fn_c_try_link "$LINENO"; then :
 
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
 
+$as_echo "#define HAVE_ATOMICS 1" >>confdefs.h
 
-cat >>confdefs.h <<_ACEOF
-#define HAVE_CLOCK_GETTIME $have_clock_gettime
-_ACEOF
 
- if test $have_clock_gettime -eq 1; then
-  HAVE_CLOCK_GETTIME_TRUE=
-  HAVE_CLOCK_GETTIME_FALSE='#'
 else
-  HAVE_CLOCK_GETTIME_TRUE='#'
-  HAVE_CLOCK_GETTIME_FALSE=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
 fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
 
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for c11 atomics" >&5
-$as_echo_n "checking compiler support for c11 atomics... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compiler support for built-in atomics" >&5
+$as_echo_n "checking compiler support for built-in atomics... " >&6; }
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
-#include <stdatomic.h>
+#include <stdint.h>
 int
 main ()
 {
-atomic_int a;
-     atomic_init(&a, 0);
-     #ifdef __STDC_NO_ATOMICS__
-       #error c11 atomics are not supported
+int32_t a;
+     __sync_add_and_fetch(&a, 0);
+     __sync_sub_and_fetch(&a, 0);
+     #if defined(__PPC__) && !defined(__PPC64__)
+       #error compiler built-in atomics are not supported on PowerPC 32-bit
      #else
        return 0;
      #endif
@@ -14175,7 +14624,7 @@ if ac_fn_c_try_link "$LINENO"; then :
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 
-$as_echo "#define HAVE_ATOMICS 1" >>confdefs.h
+$as_echo "#define HAVE_BUILTIN_ATOMICS 1" >>confdefs.h
 
 
 else
@@ -14360,15 +14809,22 @@ done
 
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring psm provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"psm"; then :
+  enable_psm=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping psm provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping psm provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring psm provider" >&5
 $as_echo "$as_me: *** Configuring psm provider" >&6;}
-	# Check whether --enable-psm was given.
+	       # Check whether --enable-psm was given.
 if test "${enable_psm+set}" = set; then :
   enableval=$enable_psm;
 else
   enable_psm=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -15112,6 +15568,11 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: psm provider: build as plugin" >&5
 $as_echo "$as_me: psm provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 ac_config_files="$ac_config_files prov/psm/libfabric-psm.spec"
+
+
 else
   PROVIDERS_STATIC="prov/psm/libpsm.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: psm provider: include in libfabric" >&5
@@ -15172,10 +15633,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "psm provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/psm/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/psm/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/psm/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "psm provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/psm/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$psm_orig_CPPFLAGS
@@ -15186,15 +15666,22 @@ fi
 	unset psm_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring psm2 provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"psm2"; then :
+  enable_psm2=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping psm2 provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping psm2 provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring psm2 provider" >&5
 $as_echo "$as_me: *** Configuring psm2 provider" >&6;}
-	# Check whether --enable-psm2 was given.
+	       # Check whether --enable-psm2 was given.
 if test "${enable_psm2+set}" = set; then :
   enableval=$enable_psm2;
 else
   enable_psm2=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -15863,6 +16350,11 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: psm2 provider: build as plugin" >&5
 $as_echo "$as_me: psm2 provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 ac_config_files="$ac_config_files prov/psm2/libfabric-psm2.spec"
+
+
 else
   PROVIDERS_STATIC="prov/psm2/libpsm2.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: psm2 provider: include in libfabric" >&5
@@ -15923,10 +16415,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "psm2 provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/psm2/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/psm2/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/psm2/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "psm2 provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/psm2/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$psm2_orig_CPPFLAGS
@@ -15937,15 +16448,22 @@ fi
 	unset psm2_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring sockets provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"sockets"; then :
+  enable_sockets=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping sockets provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping sockets provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring sockets provider" >&5
 $as_echo "$as_me: *** Configuring sockets provider" >&6;}
-	# Check whether --enable-sockets was given.
+	       # Check whether --enable-sockets was given.
 if test "${enable_sockets+set}" = set; then :
   enableval=$enable_sockets;
 else
   enable_sockets=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -16649,6 +17167,11 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: sockets provider: build as plugin" >&5
 $as_echo "$as_me: sockets provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 ac_config_files="$ac_config_files prov/sockets/libfabric-sockets.spec"
+
+
 else
   PROVIDERS_STATIC="prov/sockets/libsockets.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: sockets provider: include in libfabric" >&5
@@ -16709,10 +17232,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "sockets provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/sockets/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/sockets/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/sockets/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "sockets provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/sockets/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$sockets_orig_CPPFLAGS
@@ -16723,15 +17265,22 @@ fi
 	unset sockets_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring verbs provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"verbs"; then :
+  enable_verbs=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping verbs provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping verbs provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring verbs provider" >&5
 $as_echo "$as_me: *** Configuring verbs provider" >&6;}
-	# Check whether --enable-verbs was given.
+	       # Check whether --enable-verbs was given.
 if test "${enable_verbs+set}" = set; then :
   enableval=$enable_verbs;
 else
   enable_verbs=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -16799,6 +17348,7 @@ esac
 	# Determine if we can support the verbs provider
 	verbs_ibverbs_happy=0
 	verbs_rdmacm_happy=0
+	verbs_ibverbs_exp_happy=0
 	if test x"$enable_verbs" != x"no"; then :
 
     fi_check_package_verbs_ibverbs_save_CPPFLAGS="$CPPFLAGS"
@@ -17396,13 +17946,13 @@ fi
 
 
 
-    fi_check_package_verbs_rdmacm_save_CPPFLAGS="$CPPFLAGS"
-    fi_check_package_verbs_rdmacm_save_LDFLAGS="$LDFLAGS"
-    fi_check_package_verbs_rdmacm_save_LIBS="$LIBS"
+    fi_check_package_verbs_ibverbs_save_CPPFLAGS="$CPPFLAGS"
+    fi_check_package_verbs_ibverbs_save_LDFLAGS="$LDFLAGS"
+    fi_check_package_verbs_ibverbs_save_LIBS="$LIBS"
 
-    fi_check_package_verbs_rdmacm_orig_CPPFLAGS="$verbs_rdmacm_CPPFLAGS"
-    fi_check_package_verbs_rdmacm_orig_LDFLAGS="$verbs_rdmacm_LDFLAGS"
-    fi_check_package_verbs_rdmacm_orig_LIBS="$verbs_rdmacm_LIBS"
+    fi_check_package_verbs_ibverbs_orig_CPPFLAGS="$verbs_ibverbs_CPPFLAGS"
+    fi_check_package_verbs_ibverbs_orig_LDFLAGS="$verbs_ibverbs_LDFLAGS"
+    fi_check_package_verbs_ibverbs_orig_LIBS="$verbs_ibverbs_LIBS"
 
 
     # This is stolen from autoconf to peek under the covers to get the
@@ -17412,19 +17962,19 @@ fi
     # There's unfortunately no way to get through the progression of
     # header includes without killing off the cache variable and
     # trying again...
-    unset ac_cv_header_rdma_rsocket_h
+    unset ac_cv_header_infiniband_verbs_exp_h
 
     fi_check_package_header_happy="no"
     if test "$verbs_PREFIX" = "/usr" || test "$verbs_PREFIX" = "/usr/local"; then :
    # try as is...
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for header without includes" >&5
 $as_echo "looking for header without includes" >&6; }
-            for ac_header in rdma/rsocket.h
+            for ac_header in infiniband/verbs_exp.h
 do :
-  ac_fn_c_check_header_mongrel "$LINENO" "rdma/rsocket.h" "ac_cv_header_rdma_rsocket_h" "$ac_includes_default"
-if test "x$ac_cv_header_rdma_rsocket_h" = xyes; then :
+  ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs_exp.h" "ac_cv_header_infiniband_verbs_exp_h" "$ac_includes_default"
+if test "x$ac_cv_header_infiniband_verbs_exp_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_RDMA_RSOCKET_H 1
+#define HAVE_INFINIBAND_VERBS_EXP_H 1
 _ACEOF
  fi_check_package_header_happy="yes"
 fi
@@ -17433,21 +17983,21 @@ done
 
             if test "$fi_check_package_header_happy" = "no"; then :
   # no go on the as is - reset the cache and try again
-                   unset ac_cv_header_rdma_rsocket_h
+                   unset ac_cv_header_infiniband_verbs_exp_h
 fi
 fi
 
     if test "$fi_check_package_header_happy" = "no"; then :
   if test "$verbs_PREFIX" != ""; then :
-  verbs_rdmacm_CPPFLAGS="$verbs_rdmacm_CPPFLAGS -I$verbs_PREFIX/include"
+  verbs_ibverbs_CPPFLAGS="$verbs_ibverbs_CPPFLAGS -I$verbs_PREFIX/include"
                   CPPFLAGS="$CPPFLAGS -I$verbs_PREFIX/include"
 fi
-          for ac_header in rdma/rsocket.h
+          for ac_header in infiniband/verbs_exp.h
 do :
-  ac_fn_c_check_header_mongrel "$LINENO" "rdma/rsocket.h" "ac_cv_header_rdma_rsocket_h" "$ac_includes_default"
-if test "x$ac_cv_header_rdma_rsocket_h" = xyes; then :
+  ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs_exp.h" "ac_cv_header_infiniband_verbs_exp_h" "$ac_includes_default"
+if test "x$ac_cv_header_infiniband_verbs_exp_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_RDMA_RSOCKET_H 1
+#define HAVE_INFINIBAND_VERBS_EXP_H 1
 _ACEOF
  fi_check_package_header_happy="yes"
 fi
@@ -17460,19 +18010,19 @@ done
     # cache variable for the library check.
 
     # See comment above
-    unset ac_cv_lib_rdmacm_rdma_create_qp
+    unset ac_cv_lib_ibverbs_ibv_open_device
     fi_check_package_lib_happy="no"
     if test "$verbs_LIBDIR" != ""; then :
    # libdir was specified - search only there
-           verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$verbs_LIBDIR"
+           verbs_ibverbs_LDFLAGS="$verbs_ibverbs_LDFLAGS -L$verbs_LIBDIR"
            LDFLAGS="$LDFLAGS -L$verbs_LIBDIR"
-           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
-$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
-if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lrdmacm  $LIBS"
+LIBS="-libverbs  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -17482,36 +18032,36 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char rdma_create_qp ();
+char ibv_open_device ();
 int
 main ()
 {
-return rdma_create_qp ();
+return ibv_open_device ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_rdmacm_rdma_create_qp=yes
+  ac_cv_lib_ibverbs_ibv_open_device=yes
 else
-  ac_cv_lib_rdmacm_rdma_create_qp=no
+  ac_cv_lib_ibverbs_ibv_open_device=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
-$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
-if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
-  LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
-                  verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
-                  unset ac_cv_lib_rdmacm_rdma_create_qp
+  LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                  verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                  unset ac_cv_lib_ibverbs_ibv_open_device
 fi
 else
    # libdir was not specified - go through search path
@@ -17522,13 +18072,13 @@ else
    # try as is...
                 { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library without search path" >&5
 $as_echo "looking for library without search path" >&6; }
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
-$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
-if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lrdmacm  $LIBS"
+LIBS="-libverbs  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -17538,27 +18088,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char rdma_create_qp ();
+char ibv_open_device ();
 int
 main ()
 {
-return rdma_create_qp ();
+return ibv_open_device ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_rdmacm_rdma_create_qp=yes
+  ac_cv_lib_ibverbs_ibv_open_device=yes
 else
-  ac_cv_lib_rdmacm_rdma_create_qp=no
+  ac_cv_lib_ibverbs_ibv_open_device=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
-$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
-if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -17566,25 +18116,25 @@ fi
 
                 if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                     LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
-                     verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
-                     unset ac_cv_lib_rdmacm_rdma_create_qp
+                     LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                     verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                     unset ac_cv_lib_ibverbs_ibv_open_device
 fi
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
   if test "$fi_check_package_libdir" != ""; then :
-  verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$fi_check_package_libdir/lib"
+  verbs_ibverbs_LDFLAGS="$verbs_ibverbs_LDFLAGS -L$fi_check_package_libdir/lib"
                      LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib"
                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib" >&5
 $as_echo "looking for library in lib" >&6; }
-                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
-$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
-if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lrdmacm  $LIBS"
+LIBS="-libverbs  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -17594,27 +18144,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char rdma_create_qp ();
+char ibv_open_device ();
 int
 main ()
 {
-return rdma_create_qp ();
+return ibv_open_device ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_rdmacm_rdma_create_qp=yes
+  ac_cv_lib_ibverbs_ibv_open_device=yes
 else
-  ac_cv_lib_rdmacm_rdma_create_qp=no
+  ac_cv_lib_ibverbs_ibv_open_device=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
-$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
-if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -17622,26 +18172,26 @@ fi
 
                      if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                          LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
-                          verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
-                          unset ac_cv_lib_rdmacm_rdma_create_qp
+                          LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                          verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                          unset ac_cv_lib_ibverbs_ibv_open_device
 fi
 fi
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
   if test "$fi_check_package_libdir" != ""; then :
-  verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$fi_check_package_libdir/lib64"
+  verbs_ibverbs_LDFLAGS="$verbs_ibverbs_LDFLAGS -L$fi_check_package_libdir/lib64"
                      LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib64"
                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib64" >&5
 $as_echo "looking for library in lib64" >&6; }
-                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
-$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
-if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lrdmacm  $LIBS"
+LIBS="-libverbs  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -17651,27 +18201,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char rdma_create_qp ();
+char ibv_open_device ();
 int
 main ()
 {
-return rdma_create_qp ();
+return ibv_open_device ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_rdmacm_rdma_create_qp=yes
+  ac_cv_lib_ibverbs_ibv_open_device=yes
 else
-  ac_cv_lib_rdmacm_rdma_create_qp=no
+  ac_cv_lib_ibverbs_ibv_open_device=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
-$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
-if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -17679,16 +18229,16 @@ fi
 
                      if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                          LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
-                          verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
-                          unset ac_cv_lib_rdmacm_rdma_create_qp
+                          LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                          verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                          unset ac_cv_lib_ibverbs_ibv_open_device
 fi
 fi
 fi
 fi
 
     if test "$fi_check_package_lib_happy" = "yes"; then :
-  verbs_rdmacm_LIBS="-lrdmacm "
+  verbs_ibverbs_LIBS="-libverbs "
            fi_check_package_happy="yes"
 else
   fi_check_package_happy="no"
@@ -17704,15 +18254,582 @@ else
     # cache variable for the library check.
 
     # See comment above
-    unset ac_cv_lib_rdmacm_rdma_create_qp
+    unset ac_cv_lib_ibverbs_ibv_open_device
     fi_check_package_lib_happy="no"
     if test "$verbs_LIBDIR" != ""; then :
    # libdir was specified - search only there
-           verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$verbs_LIBDIR"
+           verbs_ibverbs_LDFLAGS="$verbs_ibverbs_LDFLAGS -L$verbs_LIBDIR"
            LDFLAGS="$LDFLAGS -L$verbs_LIBDIR"
-           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
-$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
-if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-libverbs  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ibv_open_device ();
+int
+main ()
+{
+return ibv_open_device ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ibverbs_ibv_open_device=yes
+else
+  ac_cv_lib_ibverbs_ibv_open_device=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+           if test "$fi_check_package_lib_happy" = "no"; then :
+  LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                  verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                  unset ac_cv_lib_ibverbs_ibv_open_device
+fi
+else
+   # libdir was not specified - go through search path
+           fi_check_package_libdir="$verbs_PREFIX"
+           if test "$fi_check_package_libdir" = "" || \
+                  test "$fi_check_package_libdir" = "/usr" || \
+                  test "$fi_check_package_libdir" = "/usr/local"; then :
+   # try as is...
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library without search path" >&5
+$as_echo "looking for library without search path" >&6; }
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-libverbs  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ibv_open_device ();
+int
+main ()
+{
+return ibv_open_device ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ibverbs_ibv_open_device=yes
+else
+  ac_cv_lib_ibverbs_ibv_open_device=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+                if test "$fi_check_package_lib_happy" = "no"; then :
+   # no go on the as is..  see what happens later...
+                     LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                     verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                     unset ac_cv_lib_ibverbs_ibv_open_device
+fi
+fi
+
+           if test "$fi_check_package_lib_happy" = "no"; then :
+  if test "$fi_check_package_libdir" != ""; then :
+  verbs_ibverbs_LDFLAGS="$verbs_ibverbs_LDFLAGS -L$fi_check_package_libdir/lib"
+                     LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib"
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib" >&5
+$as_echo "looking for library in lib" >&6; }
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-libverbs  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ibv_open_device ();
+int
+main ()
+{
+return ibv_open_device ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ibverbs_ibv_open_device=yes
+else
+  ac_cv_lib_ibverbs_ibv_open_device=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+                     if test "$fi_check_package_lib_happy" = "no"; then :
+   # no go on the as is..  see what happens later...
+                          LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                          verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                          unset ac_cv_lib_ibverbs_ibv_open_device
+fi
+fi
+fi
+
+           if test "$fi_check_package_lib_happy" = "no"; then :
+  if test "$fi_check_package_libdir" != ""; then :
+  verbs_ibverbs_LDFLAGS="$verbs_ibverbs_LDFLAGS -L$fi_check_package_libdir/lib64"
+                     LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib64"
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib64" >&5
+$as_echo "looking for library in lib64" >&6; }
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ibv_open_device in -libverbs" >&5
+$as_echo_n "checking for ibv_open_device in -libverbs... " >&6; }
+if ${ac_cv_lib_ibverbs_ibv_open_device+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-libverbs  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char ibv_open_device ();
+int
+main ()
+{
+return ibv_open_device ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_ibverbs_ibv_open_device=yes
+else
+  ac_cv_lib_ibverbs_ibv_open_device=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ibverbs_ibv_open_device" >&5
+$as_echo "$ac_cv_lib_ibverbs_ibv_open_device" >&6; }
+if test "x$ac_cv_lib_ibverbs_ibv_open_device" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+                     if test "$fi_check_package_lib_happy" = "no"; then :
+   # no go on the as is..  see what happens later...
+                          LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+                          verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+                          unset ac_cv_lib_ibverbs_ibv_open_device
+fi
+fi
+fi
+fi
+
+    if test "$fi_check_package_lib_happy" = "yes"; then :
+  verbs_ibverbs_LIBS="-libverbs "
+           fi_check_package_happy="yes"
+else
+  fi_check_package_happy="no"
+fi
+
+
+fi
+    unset fi_check_package_header_happy
+
+
+
+    if test "$fi_check_package_happy" = "yes"; then :
+  verbs_ibverbs_exp_happy=1
+else
+  verbs_ibverbs_CPPFLAGS="$fi_check_package_verbs_ibverbs_orig_CPPFLAGS"
+           verbs_ibverbs_LDFLAGS="$fi_check_package_verbs_ibverbs_orig_LDFLAGS"
+           verbs_ibverbs_LIBS="$fi_check_package_verbs_ibverbs_orig_LIBS"
+           verbs_ibverbs_exp_happy=0
+fi
+
+
+
+
+
+    CPPFLAGS="$fi_check_package_verbs_ibverbs_save_CPPFLAGS"
+    LDFLAGS="$fi_check_package_verbs_ibverbs_save_LDFLAGS"
+    LIBS="$fi_check_package_verbs_ibverbs_save_LIBS"
+
+
+
+    fi_check_package_verbs_rdmacm_save_CPPFLAGS="$CPPFLAGS"
+    fi_check_package_verbs_rdmacm_save_LDFLAGS="$LDFLAGS"
+    fi_check_package_verbs_rdmacm_save_LIBS="$LIBS"
+
+    fi_check_package_verbs_rdmacm_orig_CPPFLAGS="$verbs_rdmacm_CPPFLAGS"
+    fi_check_package_verbs_rdmacm_orig_LDFLAGS="$verbs_rdmacm_LDFLAGS"
+    fi_check_package_verbs_rdmacm_orig_LIBS="$verbs_rdmacm_LIBS"
+
+
+    # This is stolen from autoconf to peek under the covers to get the
+    # cache variable for the library check.
+
+
+    # There's unfortunately no way to get through the progression of
+    # header includes without killing off the cache variable and
+    # trying again...
+    unset ac_cv_header_rdma_rsocket_h
+
+    fi_check_package_header_happy="no"
+    if test "$verbs_PREFIX" = "/usr" || test "$verbs_PREFIX" = "/usr/local"; then :
+   # try as is...
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for header without includes" >&5
+$as_echo "looking for header without includes" >&6; }
+            for ac_header in rdma/rsocket.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "rdma/rsocket.h" "ac_cv_header_rdma_rsocket_h" "$ac_includes_default"
+if test "x$ac_cv_header_rdma_rsocket_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_RDMA_RSOCKET_H 1
+_ACEOF
+ fi_check_package_header_happy="yes"
+fi
+
+done
+
+            if test "$fi_check_package_header_happy" = "no"; then :
+  # no go on the as is - reset the cache and try again
+                   unset ac_cv_header_rdma_rsocket_h
+fi
+fi
+
+    if test "$fi_check_package_header_happy" = "no"; then :
+  if test "$verbs_PREFIX" != ""; then :
+  verbs_rdmacm_CPPFLAGS="$verbs_rdmacm_CPPFLAGS -I$verbs_PREFIX/include"
+                  CPPFLAGS="$CPPFLAGS -I$verbs_PREFIX/include"
+fi
+          for ac_header in rdma/rsocket.h
+do :
+  ac_fn_c_check_header_mongrel "$LINENO" "rdma/rsocket.h" "ac_cv_header_rdma_rsocket_h" "$ac_includes_default"
+if test "x$ac_cv_header_rdma_rsocket_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_RDMA_RSOCKET_H 1
+_ACEOF
+ fi_check_package_header_happy="yes"
+fi
+
+done
+
+          if test "$fi_check_package_header_happy" = "yes"; then :
+
+    # This is stolen from autoconf to peek under the covers to get the
+    # cache variable for the library check.
+
+    # See comment above
+    unset ac_cv_lib_rdmacm_rdma_create_qp
+    fi_check_package_lib_happy="no"
+    if test "$verbs_LIBDIR" != ""; then :
+   # libdir was specified - search only there
+           verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$verbs_LIBDIR"
+           LDFLAGS="$LDFLAGS -L$verbs_LIBDIR"
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
+$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
+if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrdmacm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char rdma_create_qp ();
+int
+main ()
+{
+return rdma_create_qp ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_rdmacm_rdma_create_qp=yes
+else
+  ac_cv_lib_rdmacm_rdma_create_qp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
+$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
+if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+           if test "$fi_check_package_lib_happy" = "no"; then :
+  LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
+                  verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
+                  unset ac_cv_lib_rdmacm_rdma_create_qp
+fi
+else
+   # libdir was not specified - go through search path
+           fi_check_package_libdir="$verbs_PREFIX"
+           if test "$fi_check_package_libdir" = "" || \
+                  test "$fi_check_package_libdir" = "/usr" || \
+                  test "$fi_check_package_libdir" = "/usr/local"; then :
+   # try as is...
+                { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library without search path" >&5
+$as_echo "looking for library without search path" >&6; }
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
+$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
+if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrdmacm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char rdma_create_qp ();
+int
+main ()
+{
+return rdma_create_qp ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_rdmacm_rdma_create_qp=yes
+else
+  ac_cv_lib_rdmacm_rdma_create_qp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
+$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
+if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+                if test "$fi_check_package_lib_happy" = "no"; then :
+   # no go on the as is..  see what happens later...
+                     LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
+                     verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
+                     unset ac_cv_lib_rdmacm_rdma_create_qp
+fi
+fi
+
+           if test "$fi_check_package_lib_happy" = "no"; then :
+  if test "$fi_check_package_libdir" != ""; then :
+  verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$fi_check_package_libdir/lib"
+                     LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib"
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib" >&5
+$as_echo "looking for library in lib" >&6; }
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
+$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
+if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrdmacm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char rdma_create_qp ();
+int
+main ()
+{
+return rdma_create_qp ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_rdmacm_rdma_create_qp=yes
+else
+  ac_cv_lib_rdmacm_rdma_create_qp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
+$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
+if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+                     if test "$fi_check_package_lib_happy" = "no"; then :
+   # no go on the as is..  see what happens later...
+                          LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
+                          verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
+                          unset ac_cv_lib_rdmacm_rdma_create_qp
+fi
+fi
+fi
+
+           if test "$fi_check_package_lib_happy" = "no"; then :
+  if test "$fi_check_package_libdir" != ""; then :
+  verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$fi_check_package_libdir/lib64"
+                     LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib64"
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib64" >&5
+$as_echo "looking for library in lib64" >&6; }
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
+$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
+if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lrdmacm  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char rdma_create_qp ();
+int
+main ()
+{
+return rdma_create_qp ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_rdmacm_rdma_create_qp=yes
+else
+  ac_cv_lib_rdmacm_rdma_create_qp=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rdmacm_rdma_create_qp" >&5
+$as_echo "$ac_cv_lib_rdmacm_rdma_create_qp" >&6; }
+if test "x$ac_cv_lib_rdmacm_rdma_create_qp" = xyes; then :
+  fi_check_package_lib_happy="yes"
+else
+  fi_check_package_lib_happy="no"
+fi
+
+                     if test "$fi_check_package_lib_happy" = "no"; then :
+   # no go on the as is..  see what happens later...
+                          LDFLAGS="$fi_check_package_verbs_rdmacm_save_LDFLAGS"
+                          verbs_rdmacm_LDFLAGS="$fi_check_package_verbs_rdmacm_orig_LDFLAGS"
+                          unset ac_cv_lib_rdmacm_rdma_create_qp
+fi
+fi
+fi
+fi
+
+    if test "$fi_check_package_lib_happy" = "yes"; then :
+  verbs_rdmacm_LIBS="-lrdmacm "
+           fi_check_package_happy="yes"
+else
+  fi_check_package_happy="no"
+fi
+
+
+else
+  fi_check_package_happy="no"
+fi
+else
+
+    # This is stolen from autoconf to peek under the covers to get the
+    # cache variable for the library check.
+
+    # See comment above
+    unset ac_cv_lib_rdmacm_rdma_create_qp
+    fi_check_package_lib_happy="no"
+    if test "$verbs_LIBDIR" != ""; then :
+   # libdir was specified - search only there
+           verbs_rdmacm_LDFLAGS="$verbs_rdmacm_LDFLAGS -L$verbs_LIBDIR"
+           LDFLAGS="$LDFLAGS -L$verbs_LIBDIR"
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for rdma_create_qp in -lrdmacm" >&5
+$as_echo_n "checking for rdma_create_qp in -lrdmacm... " >&6; }
+if ${ac_cv_lib_rdmacm_rdma_create_qp+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
@@ -17964,6 +19081,29 @@ fi
 
 fi
 
+	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+			    #include <infiniband/verbs_exp.h>
+
+int
+main ()
+{
+
+			    return (IBV_EXP_DEVICE_ATTR_ODP | IBV_EXP_DEVICE_ODP);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  verbs_ibverbs_exp_happy=1
+else
+  verbs_ibverbs_exp_happy=0
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
 	if test $verbs_ibverbs_happy -eq 1 && \
 	       test $verbs_rdmacm_happy -eq 1; then :
   verbs_happy=1
@@ -17971,6 +19111,14 @@ else
   verbs_happy=0
 fi
 
+	if test $verbs_ibverbs_happy -eq 1 && \
+	       test $verbs_rdmacm_happy -eq 1 && \
+	       test $verbs_ibverbs_exp_happy -eq 1; then :
+
+$as_echo "#define HAVE_VERBS_EXP_H 1" >>confdefs.h
+
+fi
+
 	# Technically, verbs_ibverbs_CPPFLAGS and
 	# verbs_rdmacm_CPPFLAGS could be different, but it is highly
 	# unlikely that they ever will be.  So only list
@@ -18010,6 +19158,11 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: verbs provider: build as plugin" >&5
 $as_echo "$as_me: verbs provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 ac_config_files="$ac_config_files prov/verbs/libfabric-verbs.spec"
+
+
 else
   PROVIDERS_STATIC="prov/verbs/libverbs.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: verbs provider: include in libfabric" >&5
@@ -18070,10 +19223,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "verbs provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/verbs/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/verbs/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/verbs/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "verbs provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/verbs/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$verbs_orig_CPPFLAGS
@@ -18084,15 +19256,22 @@ fi
 	unset verbs_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring usnic provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"usnic"; then :
+  enable_usnic=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping usnic provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping usnic provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring usnic provider" >&5
 $as_echo "$as_me: *** Configuring usnic provider" >&6;}
-	# Check whether --enable-usnic was given.
+	       # Check whether --enable-usnic was given.
 if test "${enable_usnic+set}" = set; then :
   enableval=$enable_usnic;
 else
   enable_usnic=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -18177,8 +19356,11 @@ esac
 
 
 
+
+
     # Determine if we can support the usnic provider
     usnic_happy=0
+    usnic_build_fake_driver=0
     if test "x$enable_usnic" != "xno"; then :
   ac_fn_c_check_header_mongrel "$LINENO" "infiniband/verbs.h" "ac_cv_header_infiniband_verbs_h" "$ac_includes_default"
 if test "x$ac_cv_header_infiniband_verbs_h" = xyes; then :
@@ -18188,6 +19370,37 @@ fi
 
 	   if test $usnic_happy -eq 1; then :
 
+	ac_fn_c_check_header_mongrel "$LINENO" "infiniband/driver.h" "ac_cv_header_infiniband_driver_h" "$ac_includes_default"
+if test "x$ac_cv_header_infiniband_driver_h" = xyes; then :
+  ac_fn_c_check_decl "$LINENO" "verbs_register_driver" "ac_cv_have_decl_verbs_register_driver" "#include <infiniband/driver.h>
+
+"
+if test "x$ac_cv_have_decl_verbs_register_driver" = xyes; then :
+
+else
+  usnic_build_fake_driver=1
+fi
+
+fi
+
+
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if building usnic fake verbs driver" >&5
+$as_echo_n "checking if building usnic fake verbs driver... " >&6; }
+	if test $usnic_build_fake_driver -eq 1; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define USNIC_BUILD_FAKE_VERBS_DRIVER $usnic_build_fake_driver
+_ACEOF
+
+
+
 
 # Check whether --with-libnl was given.
 if test "${with_libnl+set}" = set; then :
@@ -19555,21 +20768,14 @@ _ACEOF
 	usnic_LDFLAGS=$usnic_nl_LDFLAGS
 	usnic_LIBS=$usnic_nl_LIBS
 
-	# If the verbs or usnic providers are being built as a DL,
-	# then we need to add libibverbs to usnic_LIBS.  We can tell
-	# if verbs/usnic are being built as DL because fi_provider.m4
-	# will set $PROVIDER_dl to 1.  Also, per note in configure.ac,
-	# the verbs provider *must* be configured before the usnic
-	# provider explicitly for this case: so that $verbs_dl will be
-	# (potentially) set by the time we get here.
-
-	# NOTE: this decision whether to -libverbs or not used to be
-	# handled in Makefile.am via an AM_CONDITIONAL.  However, to
-	# properly support pkg-config, we have to make this decision
-	# here/now and AC SUBST the final result into usnic_LIBS.
-	if test "$verbs_dl" = "1" || test "$usnic_dl" = "1"; then :
-  usnic_LIBS="$usnic_LIBS -libverbs"
+	# If we're building the usNIC fake verbs provider, we need to
+	# -libverbs, so put it in usnic_LIBS (so that it will also get
+	# properly substituted into the pkg-config data files).
+	usnic_verbs_lib=
+	if test $usnic_build_fake_driver -eq 1; then :
+  usnic_verbs_lib="-libverbs"
 fi
+	usnic_LIBS="$usnic_LIBS $usnic_verbs_lib"
 
 
 
@@ -19583,6 +20789,16 @@ fi
 
 fi
 
+    # AM_CONDITIONALs must always be defined
+     if test $usnic_build_fake_driver -eq 1; then
+  USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE=
+  USNIC_BUILD_FAKE_VERBS_DRIVER_FALSE='#'
+else
+  USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE='#'
+  USNIC_BUILD_FAKE_VERBS_DRIVER_FALSE=
+fi
+
+
 
 
 
@@ -19610,6 +20826,11 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: usnic provider: build as plugin" >&5
 $as_echo "$as_me: usnic provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 ac_config_files="$ac_config_files prov/usnic/libfabric-usnic.spec"
+
+
 else
   PROVIDERS_STATIC="prov/usnic/libusnic.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: usnic provider: include in libfabric" >&5
@@ -19670,10 +20891,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "usnic provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/usnic/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/usnic/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/usnic/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "usnic provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/usnic/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$usnic_orig_CPPFLAGS
@@ -19684,68 +20924,75 @@ fi
 	unset usnic_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring mxm provider" >&5
-$as_echo "$as_me: *** Configuring mxm provider" >&6;}
-	# Check whether --enable-mxm was given.
-if test "${enable_mxm+set}" = set; then :
-  enableval=$enable_mxm;
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"mlx"; then :
+  enable_mlx=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping mlx provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping mlx provider because $enable_direct direct requested" >&6;}
 else
-  enable_mxm=auto
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring mlx provider" >&5
+$as_echo "$as_me: *** Configuring mlx provider" >&6;}
+	       # Check whether --enable-mlx was given.
+if test "${enable_mlx+set}" = set; then :
+  enableval=$enable_mlx;
+else
+  enable_mlx=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
 	# Also save LIBS, as a matter of principle.
-	mxm_orig_CPPFLAGS=$CPPFLAGS
-	mxm_orig_LDFLAGS=$LDFLAGS
-	mxm_orig_LIBS=$LIBS
+	mlx_orig_CPPFLAGS=$CPPFLAGS
+	mlx_orig_LDFLAGS=$LDFLAGS
+	mlx_orig_LIBS=$LIBS
 
-	# Check the --enable-<mxm> value
-	mxm_dl=0
-	case $enable_mxm in #(
+	# Check the --enable-<mlx> value
+	mlx_dl=0
+	case $enable_mlx in #(
   yes|no) :
      ;; #(
   dl) :
-    enable_mxm=yes mxm_dl=1 ;; #(
+    enable_mlx=yes mlx_dl=1 ;; #(
   auto) :
      ;; #(
   *) :
 
 	# Check that the base directory exists
-	if test ! -d "$enable_mxm"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: supplied directory \"$enable_mxm\" does not exist" >&5
-$as_echo "$as_me: WARNING: supplied directory \"$enable_mxm\" does not exist" >&2;}
+	if test ! -d "$enable_mlx"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: supplied directory \"$enable_mlx\" does not exist" >&5
+$as_echo "$as_me: WARNING: supplied directory \"$enable_mlx\" does not exist" >&2;}
 	        as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 
 	# Check that base/include exists
-	 if test -d "$enable_mxm/include"; then :
-  mxm_PREFIX="$enable_mxm"
+	 if test -d "$enable_mlx/include"; then :
+  mlx_PREFIX="$enable_mlx"
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"include\" subdirectory in supplied \"$enable_mxm\" directory\"" >&5
-$as_echo "$as_me: WARNING: could not find \"include\" subdirectory in supplied \"$enable_mxm\" directory\"" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"include\" subdirectory in supplied \"$enable_mlx\" directory\"" >&5
+$as_echo "$as_me: WARNING: could not find \"include\" subdirectory in supplied \"$enable_mlx\" directory\"" >&2;}
 	        as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 
 	# Check that base/lib or base/lib64 exists
-	 if test -d "$enable_mxm/lib"; then :
-  mxm_LIBDIR="$enable_mxm/lib"
+	 if test -d "$enable_mlx/lib"; then :
+  mlx_LIBDIR="$enable_mlx/lib"
 else
-  if test -d "$enable_mxm/lib64"; then :
-  mxm_LIBDIR="$enable_mxm/lib64"
+  if test -d "$enable_mlx/lib64"; then :
+  mlx_LIBDIR="$enable_mlx/lib64"
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_mxm\" directory\"" >&5
-$as_echo "$as_me: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_mxm\" directory\"" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_mlx\" directory\"" >&5
+$as_echo "$as_me: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_mlx\" directory\"" >&2;}
 		       as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 
 fi
 
-	 enable_mxm=yes
+	 enable_mlx=yes
 	 ;;
 esac
 
@@ -19757,16 +21004,16 @@ esac
 
 
     # Determine if we can support the mxm provider
-    mxm_happy=0
-    if test x"$enable_mxm" != x"no"; then :
+    mlx_happy=0
+    if test x"$enable_mlx" != x"no"; then :
 
-    fi_check_package_mxm_save_CPPFLAGS="$CPPFLAGS"
-    fi_check_package_mxm_save_LDFLAGS="$LDFLAGS"
-    fi_check_package_mxm_save_LIBS="$LIBS"
+    fi_check_package_mlx_save_CPPFLAGS="$CPPFLAGS"
+    fi_check_package_mlx_save_LDFLAGS="$LDFLAGS"
+    fi_check_package_mlx_save_LIBS="$LIBS"
 
-    fi_check_package_mxm_orig_CPPFLAGS="$mxm_CPPFLAGS"
-    fi_check_package_mxm_orig_LDFLAGS="$mxm_LDFLAGS"
-    fi_check_package_mxm_orig_LIBS="$mxm_LIBS"
+    fi_check_package_mlx_orig_CPPFLAGS="$mlx_CPPFLAGS"
+    fi_check_package_mlx_orig_LDFLAGS="$mlx_LDFLAGS"
+    fi_check_package_mlx_orig_LIBS="$mlx_LIBS"
 
 
     # This is stolen from autoconf to peek under the covers to get the
@@ -19776,19 +21023,19 @@ esac
     # There's unfortunately no way to get through the progression of
     # header includes without killing off the cache variable and
     # trying again...
-    unset ac_cv_header_mxm_api_mxm_api_h
+    unset ac_cv_header_ucp_api_ucp_h
 
     fi_check_package_header_happy="no"
-    if test "$mxm_PREFIX" = "/usr" || test "$mxm_PREFIX" = "/usr/local"; then :
+    if test "$mlx_PREFIX" = "/usr" || test "$mlx_PREFIX" = "/usr/local"; then :
    # try as is...
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for header without includes" >&5
 $as_echo "looking for header without includes" >&6; }
-            for ac_header in mxm/api/mxm_api.h
+            for ac_header in ucp/api/ucp.h
 do :
-  ac_fn_c_check_header_mongrel "$LINENO" "mxm/api/mxm_api.h" "ac_cv_header_mxm_api_mxm_api_h" "$ac_includes_default"
-if test "x$ac_cv_header_mxm_api_mxm_api_h" = xyes; then :
+  ac_fn_c_check_header_mongrel "$LINENO" "ucp/api/ucp.h" "ac_cv_header_ucp_api_ucp_h" "$ac_includes_default"
+if test "x$ac_cv_header_ucp_api_ucp_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_MXM_API_MXM_API_H 1
+#define HAVE_UCP_API_UCP_H 1
 _ACEOF
  fi_check_package_header_happy="yes"
 fi
@@ -19797,21 +21044,21 @@ done
 
             if test "$fi_check_package_header_happy" = "no"; then :
   # no go on the as is - reset the cache and try again
-                   unset ac_cv_header_mxm_api_mxm_api_h
+                   unset ac_cv_header_ucp_api_ucp_h
 fi
 fi
 
     if test "$fi_check_package_header_happy" = "no"; then :
-  if test "$mxm_PREFIX" != ""; then :
-  mxm_CPPFLAGS="$mxm_CPPFLAGS -I$mxm_PREFIX/include"
-                  CPPFLAGS="$CPPFLAGS -I$mxm_PREFIX/include"
+  if test "$mlx_PREFIX" != ""; then :
+  mlx_CPPFLAGS="$mlx_CPPFLAGS -I$mlx_PREFIX/include"
+                  CPPFLAGS="$CPPFLAGS -I$mlx_PREFIX/include"
 fi
-          for ac_header in mxm/api/mxm_api.h
+          for ac_header in ucp/api/ucp.h
 do :
-  ac_fn_c_check_header_mongrel "$LINENO" "mxm/api/mxm_api.h" "ac_cv_header_mxm_api_mxm_api_h" "$ac_includes_default"
-if test "x$ac_cv_header_mxm_api_mxm_api_h" = xyes; then :
+  ac_fn_c_check_header_mongrel "$LINENO" "ucp/api/ucp.h" "ac_cv_header_ucp_api_ucp_h" "$ac_includes_default"
+if test "x$ac_cv_header_ucp_api_ucp_h" = xyes; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_MXM_API_MXM_API_H 1
+#define HAVE_UCP_API_UCP_H 1
 _ACEOF
  fi_check_package_header_happy="yes"
 fi
@@ -19824,19 +21071,19 @@ done
     # cache variable for the library check.
 
     # See comment above
-    unset ac_cv_lib_mxm_mxm_get_version
+    unset ac_cv_lib_ucp_ucp_get_version_string
     fi_check_package_lib_happy="no"
-    if test "$mxm_LIBDIR" != ""; then :
+    if test "$mlx_LIBDIR" != ""; then :
    # libdir was specified - search only there
-           mxm_LDFLAGS="$mxm_LDFLAGS -L$mxm_LIBDIR"
-           LDFLAGS="$LDFLAGS -L$mxm_LIBDIR"
-           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+           mlx_LDFLAGS="$mlx_LDFLAGS -L$mlx_LIBDIR"
+           LDFLAGS="$LDFLAGS -L$mlx_LIBDIR"
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19846,53 +21093,53 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
-  LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                  mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                  unset ac_cv_lib_mxm_mxm_get_version
+  LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                  mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                  unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 else
    # libdir was not specified - go through search path
-           fi_check_package_libdir="$mxm_PREFIX"
+           fi_check_package_libdir="$mlx_PREFIX"
            if test "$fi_check_package_libdir" = "" || \
                   test "$fi_check_package_libdir" = "/usr" || \
                   test "$fi_check_package_libdir" = "/usr/local"; then :
    # try as is...
                 { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library without search path" >&5
 $as_echo "looking for library without search path" >&6; }
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19902,27 +21149,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -19930,25 +21177,25 @@ fi
 
                 if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                     LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                     mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                     unset ac_cv_lib_mxm_mxm_get_version
+                     LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                     mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                     unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
   if test "$fi_check_package_libdir" != ""; then :
-  mxm_LDFLAGS="$mxm_LDFLAGS -L$fi_check_package_libdir/lib"
+  mlx_LDFLAGS="$mlx_LDFLAGS -L$fi_check_package_libdir/lib"
                      LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib"
                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib" >&5
 $as_echo "looking for library in lib" >&6; }
-                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -19958,27 +21205,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -19986,26 +21233,26 @@ fi
 
                      if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                          LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                          mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                          unset ac_cv_lib_mxm_mxm_get_version
+                          LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                          mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                          unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 fi
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
   if test "$fi_check_package_libdir" != ""; then :
-  mxm_LDFLAGS="$mxm_LDFLAGS -L$fi_check_package_libdir/lib64"
+  mlx_LDFLAGS="$mlx_LDFLAGS -L$fi_check_package_libdir/lib64"
                      LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib64"
                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib64" >&5
 $as_echo "looking for library in lib64" >&6; }
-                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -20015,27 +21262,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -20043,16 +21290,16 @@ fi
 
                      if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                          LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                          mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                          unset ac_cv_lib_mxm_mxm_get_version
+                          LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                          mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                          unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 fi
 fi
 fi
 
     if test "$fi_check_package_lib_happy" = "yes"; then :
-  mxm_LIBS="-lmxm "
+  mlx_LIBS="-lucp "
            fi_check_package_happy="yes"
 else
   fi_check_package_happy="no"
@@ -20068,19 +21315,19 @@ else
     # cache variable for the library check.
 
     # See comment above
-    unset ac_cv_lib_mxm_mxm_get_version
+    unset ac_cv_lib_ucp_ucp_get_version_string
     fi_check_package_lib_happy="no"
-    if test "$mxm_LIBDIR" != ""; then :
+    if test "$mlx_LIBDIR" != ""; then :
    # libdir was specified - search only there
-           mxm_LDFLAGS="$mxm_LDFLAGS -L$mxm_LIBDIR"
-           LDFLAGS="$LDFLAGS -L$mxm_LIBDIR"
-           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+           mlx_LDFLAGS="$mlx_LDFLAGS -L$mlx_LIBDIR"
+           LDFLAGS="$LDFLAGS -L$mlx_LIBDIR"
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -20090,53 +21337,53 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
-  LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                  mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                  unset ac_cv_lib_mxm_mxm_get_version
+  LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                  mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                  unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 else
    # libdir was not specified - go through search path
-           fi_check_package_libdir="$mxm_PREFIX"
+           fi_check_package_libdir="$mlx_PREFIX"
            if test "$fi_check_package_libdir" = "" || \
                   test "$fi_check_package_libdir" = "/usr" || \
                   test "$fi_check_package_libdir" = "/usr/local"; then :
    # try as is...
                 { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library without search path" >&5
 $as_echo "looking for library without search path" >&6; }
-                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -20146,27 +21393,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -20174,25 +21421,25 @@ fi
 
                 if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                     LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                     mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                     unset ac_cv_lib_mxm_mxm_get_version
+                     LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                     mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                     unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
   if test "$fi_check_package_libdir" != ""; then :
-  mxm_LDFLAGS="$mxm_LDFLAGS -L$fi_check_package_libdir/lib"
+  mlx_LDFLAGS="$mlx_LDFLAGS -L$fi_check_package_libdir/lib"
                      LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib"
                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib" >&5
 $as_echo "looking for library in lib" >&6; }
-                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -20202,27 +21449,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -20230,26 +21477,26 @@ fi
 
                      if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                          LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                          mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                          unset ac_cv_lib_mxm_mxm_get_version
+                          LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                          mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                          unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 fi
 fi
 
            if test "$fi_check_package_lib_happy" = "no"; then :
   if test "$fi_check_package_libdir" != ""; then :
-  mxm_LDFLAGS="$mxm_LDFLAGS -L$fi_check_package_libdir/lib64"
+  mlx_LDFLAGS="$mlx_LDFLAGS -L$fi_check_package_libdir/lib64"
                      LDFLAGS="$LDFLAGS -L$fi_check_package_libdir/lib64"
                      { $as_echo "$as_me:${as_lineno-$LINENO}: result: looking for library in lib64" >&5
 $as_echo "looking for library in lib64" >&6; }
-                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mxm_get_version in -lmxm" >&5
-$as_echo_n "checking for mxm_get_version in -lmxm... " >&6; }
-if ${ac_cv_lib_mxm_mxm_get_version+:} false; then :
+                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ucp_get_version_string in -lucp" >&5
+$as_echo_n "checking for ucp_get_version_string in -lucp... " >&6; }
+if ${ac_cv_lib_ucp_ucp_get_version_string+:} false; then :
   $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
-LIBS="-lmxm  $LIBS"
+LIBS="-lucp  $LIBS"
 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -20259,27 +21506,27 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 #ifdef __cplusplus
 extern "C"
 #endif
-char mxm_get_version ();
+char ucp_get_version_string ();
 int
 main ()
 {
-return mxm_get_version ();
+return ucp_get_version_string ();
   ;
   return 0;
 }
 _ACEOF
 if ac_fn_c_try_link "$LINENO"; then :
-  ac_cv_lib_mxm_mxm_get_version=yes
+  ac_cv_lib_ucp_ucp_get_version_string=yes
 else
-  ac_cv_lib_mxm_mxm_get_version=no
+  ac_cv_lib_ucp_ucp_get_version_string=no
 fi
 rm -f core conftest.err conftest.$ac_objext \
     conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mxm_mxm_get_version" >&5
-$as_echo "$ac_cv_lib_mxm_mxm_get_version" >&6; }
-if test "x$ac_cv_lib_mxm_mxm_get_version" = xyes; then :
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ucp_ucp_get_version_string" >&5
+$as_echo "$ac_cv_lib_ucp_ucp_get_version_string" >&6; }
+if test "x$ac_cv_lib_ucp_ucp_get_version_string" = xyes; then :
   fi_check_package_lib_happy="yes"
 else
   fi_check_package_lib_happy="no"
@@ -20287,16 +21534,16 @@ fi
 
                      if test "$fi_check_package_lib_happy" = "no"; then :
    # no go on the as is..  see what happens later...
-                          LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-                          mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-                          unset ac_cv_lib_mxm_mxm_get_version
+                          LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+                          mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+                          unset ac_cv_lib_ucp_ucp_get_version_string
 fi
 fi
 fi
 fi
 
     if test "$fi_check_package_lib_happy" = "yes"; then :
-  mxm_LIBS="-lmxm "
+  mlx_LIBS="-lucp "
            fi_check_package_happy="yes"
 else
   fi_check_package_happy="no"
@@ -20309,28 +21556,28 @@ fi
 
 
     if test "$fi_check_package_happy" = "yes"; then :
-  mxm_happy=1
+  mlx_happy=1
 else
-  mxm_CPPFLAGS="$fi_check_package_mxm_orig_CPPFLAGS"
-           mxm_LDFLAGS="$fi_check_package_mxm_orig_LDFLAGS"
-           mxm_LIBS="$fi_check_package_mxm_orig_LIBS"
-           mxm_happy=0
+  mlx_CPPFLAGS="$fi_check_package_mlx_orig_CPPFLAGS"
+           mlx_LDFLAGS="$fi_check_package_mlx_orig_LDFLAGS"
+           mlx_LIBS="$fi_check_package_mlx_orig_LIBS"
+           mlx_happy=0
 fi
 
 
 
 
 
-    CPPFLAGS="$fi_check_package_mxm_save_CPPFLAGS"
-    LDFLAGS="$fi_check_package_mxm_save_LDFLAGS"
-    LIBS="$fi_check_package_mxm_save_LIBS"
+    CPPFLAGS="$fi_check_package_mlx_save_CPPFLAGS"
+    LDFLAGS="$fi_check_package_mlx_save_LDFLAGS"
+    LIBS="$fi_check_package_mlx_save_LIBS"
 
 
 fi
-    if test $mxm_happy -eq 1; then :
-  mxm_happy=1
+    if test $mlx_happy -eq 1; then :
+  mlx_happy=1
 else
-  mxm_happy=0
+  mlx_happy=0
 fi
 
 
@@ -20340,98 +21587,121 @@ fi
 
 
 	# See if the provider configured successfully
-	if test $mxm_happy -eq 1; then :
-  PROVIDERS_TO_BUILD="$PROVIDERS_TO_BUILD mxm"
+	if test $mlx_happy -eq 1; then :
+  PROVIDERS_TO_BUILD="$PROVIDERS_TO_BUILD mlx"
 		 PROVIDERS_COUNT=$((PROVIDERS_COUNT+1))
 
-	 FI_PC_CFLAGS="$FI_PC_CFLAGS $mxm_CFLAGS $mxm_CPPFLAGS"
-	 FI_PC_PRIVATE_LIBS="$FI_PC_PRIVATE_LIBS $mxm_LDFLAGS $mxm_LIBS"
+	 FI_PC_CFLAGS="$FI_PC_CFLAGS $mlx_CFLAGS $mlx_CPPFLAGS"
+	 FI_PC_PRIVATE_LIBS="$FI_PC_PRIVATE_LIBS $mlx_LDFLAGS $mlx_LIBS"
 
-		 if test $mxm_dl -eq 1; then :
-  PROVIDERS_DL="prov/mxm/libmxm.la $PROVIDERS_DL"
+		 if test $mlx_dl -eq 1; then :
+  PROVIDERS_DL="prov/mlx/libmlx.la $PROVIDERS_DL"
 			 if test x"$enable_static" = x"yes" &&
 				test x"$enable_shared" = x"no"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mxm provider was selected to be built as DL" >&5
-$as_echo "$as_me: WARNING: mxm provider was selected to be built as DL" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mlx provider was selected to be built as DL" >&5
+$as_echo "$as_me: WARNING: mlx provider was selected to be built as DL" >&2;}
 				 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: but libfabric is being built as static-only" >&5
 $as_echo "$as_me: WARNING: but libfabric is being built as static-only" >&2;}
 				 as_fn_error $? "This is an impossible situation. Cannot continue." "$LINENO" 5
 fi
-			 { $as_echo "$as_me:${as_lineno-$LINENO}: mxm provider: build as plugin" >&5
-$as_echo "$as_me: mxm provider: build as plugin" >&6;}
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: mlx provider: build as plugin" >&5
+$as_echo "$as_me: mlx provider: build as plugin" >&6;}
+
+			 # See if this provider has a specfile that
+			 # needs to be generated
+
 
 else
-  PROVIDERS_STATIC="prov/mxm/libmxm.la $PROVIDERS_STATIC"
-			 { $as_echo "$as_me:${as_lineno-$LINENO}: mxm provider: include in libfabric" >&5
-$as_echo "$as_me: mxm provider: include in libfabric" >&6;}
+  PROVIDERS_STATIC="prov/mlx/libmlx.la $PROVIDERS_STATIC"
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: mlx provider: include in libfabric" >&5
+$as_echo "$as_me: mlx provider: include in libfabric" >&6;}
 fi
 
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: mxm provider: disabled" >&5
-$as_echo "$as_me: mxm provider: disabled" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: mlx provider: disabled" >&5
+$as_echo "$as_me: mlx provider: disabled" >&6;}
 fi
 
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_MXM $mxm_happy
+#define HAVE_MLX $mlx_happy
 _ACEOF
 
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_MXM_DL $mxm_dl
+#define HAVE_MLX_DL $mlx_dl
 _ACEOF
 
 
 	# Set AM conditionals for HAVE_<provider> and HAVE_<provider>_DL
 	# as well as AC defines
-	 if test $mxm_happy -eq 1; then
-  HAVE_MXM_TRUE=
-  HAVE_MXM_FALSE='#'
+	 if test $mlx_happy -eq 1; then
+  HAVE_MLX_TRUE=
+  HAVE_MLX_FALSE='#'
 else
-  HAVE_MXM_TRUE='#'
-  HAVE_MXM_FALSE=
+  HAVE_MLX_TRUE='#'
+  HAVE_MLX_FALSE=
 fi
 
-	 if test $mxm_dl -eq 1; then
-  HAVE_MXM_DL_TRUE=
-  HAVE_MXM_DL_FALSE='#'
+	 if test $mlx_dl -eq 1; then
+  HAVE_MLX_DL_TRUE=
+  HAVE_MLX_DL_FALSE='#'
 else
-  HAVE_MXM_DL_TRUE='#'
-  HAVE_MXM_DL_FALSE=
+  HAVE_MLX_DL_TRUE='#'
+  HAVE_MLX_DL_FALSE=
 fi
 
 
 	# If this provider was specifically requested but we can't
 	# build it, error.
-	if test "$enable_mxm $mxm_happy" = "yes 0"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mxm provider was requested, but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: mxm provider was requested, but cannot be compiled" >&2;}
+	if test "$enable_mlx $mlx_happy" = "yes 0"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mlx provider was requested, but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: mlx provider was requested, but cannot be compiled" >&2;}
 	       as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 	# If this provider was requested for direct build, ensure that
 	# provider's fi_direct.h exists in tree. Error otherwise.
-	if test x"$enable_direct" = x"mxm"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/mxm/include/rdma/fi_direct.h" >&5
-$as_echo_n "checking for $srcdir/prov/mxm/include/rdma/fi_direct.h... " >&6; }
-		 if test -f "$srcdir/prov/mxm/include/rdma/fi_direct.h"; then :
+	if test x"$enable_direct" = x"mlx"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/mlx/include/rdma/fi_direct.h" >&5
+$as_echo_n "checking for $srcdir/prov/mlx/include/rdma/fi_direct.h... " >&6; }
+		 if test -f "$srcdir/prov/mlx/include/rdma/fi_direct.h"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "mxm provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/mlx/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/mlx/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/mlx/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "mlx provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/mlx/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
-	CPPFLAGS=$mxm_orig_CPPFLAGS
-	unset mxm_orig_CPPFLAGS
-	LDFLAGS=$mxm_orig_LDFLAGS
-	unset mxm_orig_LDFLAGS
-	LIBS=$mxm_orig_LIBS
-	unset mxm_orig_LIBS
+	CPPFLAGS=$mlx_orig_CPPFLAGS
+	unset mlx_orig_CPPFLAGS
+	LDFLAGS=$mlx_orig_LDFLAGS
+	unset mlx_orig_LDFLAGS
+	LIBS=$mlx_orig_LIBS
+	unset mlx_orig_LIBS
 
 
 
@@ -20554,15 +21824,22 @@ $as_echo "no" >&6; }
 	fi
 fi
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring gni provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"gni"; then :
+  enable_gni=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping gni provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping gni provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring gni provider" >&5
 $as_echo "$as_me: *** Configuring gni provider" >&6;}
-	# Check whether --enable-gni was given.
+	       # Check whether --enable-gni was given.
 if test "${enable_gni+set}" = set; then :
   enableval=$enable_gni;
 else
   enable_gni=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -20622,6 +21899,7 @@ esac
 	# Call the provider's CONFIGURE and CONDITIONALS macros
 
 
+
 # pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
 # serial 1 (pkg-config-0.24)
 #
@@ -20749,6 +22027,8 @@ esac
 	gnitest_CPPFLAGS=
 	gnitest_LDFLAGS=
         gnitest_LIBS=
+        xpmem_happy=0
+        kdreg_happy=0
 
 
         # Check whether --enable-xpmem was given.
@@ -20757,6 +22037,12 @@ if test "${enable_xpmem+set}" = set; then :
 fi
 
 
+        # Check whether --enable-ugni-static was given.
+if test "${enable_ugni_static+set}" = set; then :
+  enableval=$enable_ugni_static;
+fi
+
+
         if test x"$enable_gni" != x"no"; then :
 
 pkg_failed=no
@@ -20829,7 +22115,6 @@ else
 $as_echo "yes" >&6; }
 	gni_header_happy=1
                                   gni_CPPFLAGS="$CRAY_GNI_HEADERS_CFLAGS $gni_CPPFLAGS"
-                                  gni_LDFLAGS="$CRAY_GNI_HEADER_LIBS $gni_LDFLAGS"
 
 fi
 
@@ -20875,11 +22160,28 @@ fi
  else
     pkg_failed=untried
 fi
+if test -n "$CRAY_UGNI_STATIC_LIBS"; then
+	pkg_cv_CRAY_UGNI_STATIC_LIBS="$CRAY_UGNI_STATIC_LIBS"
+elif test -n "$FI_PKG_CONFIG"; then
+	if test -n "$FI_PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$FI_PKG_CONFIG --exists --print-errors \"cray-ugni\""; } >&5
+  ($FI_PKG_CONFIG --exists --print-errors "cray-ugni") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CRAY_UGNI_STATIC_LIBS=`$FI_PKG_CONFIG --libs --static "cray-ugni" 2>/dev/null`
+		test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+else
+	pkg_failed=untried
+fi
 
 
 
 if test $pkg_failed = yes; then
-   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 
 if $FI_PKG_CONFIG --atleast-pkgconfig-version 0.20; then
@@ -20887,22 +22189,23 @@ if $FI_PKG_CONFIG --atleast-pkgconfig-version 0.20; then
 else
         _pkg_short_errors_supported=no
 fi
-        if test $_pkg_short_errors_supported = yes; then
-	        CRAY_UGNI_PKG_ERRORS=`$FI_PKG_CONFIG --short-errors --print-errors --cflags --libs "cray-ugni" 2>&1`
-        else
-	        CRAY_UGNI_PKG_ERRORS=`$FI_PKG_CONFIG --print-errors --cflags --libs "cray-ugni" 2>&1`
-        fi
+	if test $_pkg_short_errors_supported = yes; then
+		CRAY_UGNI_PKG_ERRORS=`$FI_PKG_CONFIG --short-errors --print-errors --cflags --libs "cray-ugni" 2>&1`
+	else
+		CRAY_UGNI_PKG_ERRORS=`$FI_PKG_CONFIG --print-errors --cflags --libs "cray-ugni" 2>&1`
+	fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$CRAY_UGNI_PKG_ERRORS" >&5
 
 	ugni_lib_happy=0
 elif test $pkg_failed = untried; then
-     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 	ugni_lib_happy=0
 else
 	CRAY_UGNI_CFLAGS=$pkg_cv_CRAY_UGNI_CFLAGS
 	CRAY_UGNI_LIBS=$pkg_cv_CRAY_UGNI_LIBS
+	CRAY_UGNI_STATIC_LIBS=$pkg_cv_CRAY_UGNI_STATIC_LIBS
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 	ugni_lib_happy=1
@@ -20911,6 +22214,11 @@ $as_echo "yes" >&6; }
 
 fi
 
+               if test x"$enable_ugni_static" == x"yes" && test $ugni_lib_happy -eq 1; then :
+  gni_LDFLAGS=$(echo $gni_LDFLAGS | sed -e 's/lugni/l:libugni.a/')
+fi
+
+
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRAY_ALPS_LLI" >&5
 $as_echo_n "checking for CRAY_ALPS_LLI... " >&6; }
@@ -21210,31 +22518,11 @@ fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$CRAY_XPMEM_PKG_ERRORS" >&5
 
-	as_fn_error $? "Package requirements (cray-xpmem) were not met:
-
-$CRAY_XPMEM_PKG_ERRORS
-
-Consider adjusting the FI_PKG_CONFIG_PATH environment variable if you
-installed software in a non-standard prefix.
-
-Alternatively, you may set the environment variables CRAY_XPMEM_CFLAGS
-and CRAY_XPMEM_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details." "$LINENO" 5
+	xpmem_happy=0
 elif test $pkg_failed = untried; then
      	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
-is in your PATH or set the FI_PKG_CONFIG environment variable to the full
-path to pkg-config.
-
-Alternatively, you may set the environment variables CRAY_XPMEM_CFLAGS
-and CRAY_XPMEM_LIBS to avoid the need to call pkg-config.
-See the pkg-config man page for more details.
-
-To get pkg-config, see <http://pkg-config.freedesktop.org/>.
-See \`config.log' for more details" "$LINENO" 5; }
+	xpmem_happy=0
 else
 	CRAY_XPMEM_CFLAGS=$pkg_cv_CRAY_XPMEM_CFLAGS
 	CRAY_XPMEM_LIBS=$pkg_cv_CRAY_XPMEM_LIBS
@@ -21410,20 +22698,107 @@ fi
 
 
 
-fi
 
 
-# Check whether --with-kdreg was given.
-if test "${with_kdreg+set}" = set; then :
-  withval=$with_kdreg;
+
+# Check whether --with-kdreg was given.
+if test "${with_kdreg+set}" = set; then :
+  withval=$with_kdreg;
+fi
+
+
+                if test "$with_kdreg" != "" && test "$with_kdreg" != "no"; then :
+  gni_CPPFLAGS="-I$with_kdreg/include $gni_CPPFLAGS"
+                       gnitest_CPPFLAGS="-I$with_kdreg/include $gnitest_CPPFLAGS"
+                       kdreg_happy=1
+else
+  if test "$with_kdreg" != "no"; then :
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CRAY_KDREG" >&5
+$as_echo_n "checking for CRAY_KDREG... " >&6; }
+
+if test -n "$CRAY_KDREG_CFLAGS"; then
+    pkg_cv_CRAY_KDREG_CFLAGS="$CRAY_KDREG_CFLAGS"
+ elif test -n "$FI_PKG_CONFIG"; then
+    if test -n "$FI_PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$FI_PKG_CONFIG --exists --print-errors \"cray-kdreg\""; } >&5
+  ($FI_PKG_CONFIG --exists --print-errors "cray-kdreg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CRAY_KDREG_CFLAGS=`$FI_PKG_CONFIG --cflags "cray-kdreg" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$CRAY_KDREG_LIBS"; then
+    pkg_cv_CRAY_KDREG_LIBS="$CRAY_KDREG_LIBS"
+ elif test -n "$FI_PKG_CONFIG"; then
+    if test -n "$FI_PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$FI_PKG_CONFIG --exists --print-errors \"cray-kdreg\""; } >&5
+  ($FI_PKG_CONFIG --exists --print-errors "cray-kdreg") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CRAY_KDREG_LIBS=`$FI_PKG_CONFIG --libs "cray-kdreg" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $FI_PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CRAY_KDREG_PKG_ERRORS=`$FI_PKG_CONFIG --short-errors --print-errors --cflags --libs "cray-kdreg" 2>&1`
+        else
+	        CRAY_KDREG_PKG_ERRORS=`$FI_PKG_CONFIG --print-errors --cflags --libs "cray-kdreg" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CRAY_KDREG_PKG_ERRORS" >&5
+
+	kdreg_happy=0
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	kdreg_happy=0
+else
+	CRAY_KDREG_CFLAGS=$pkg_cv_CRAY_KDREG_CFLAGS
+	CRAY_KDREG_LIBS=$pkg_cv_CRAY_KDREG_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	kdreg_happy=1
+                                              gni_CPPFLAGS="$CRAY_KDREG_CFLAGS $gni_CPPFLAGS"
+                                              gnitest_CPPFLAGS="$CRAY_KDREG_CFLAGS $gnitest_CPPFLAGS"
+fi
+fi
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_KDREG $kdreg_happy
+_ACEOF
+
+
+
 fi
 
 
-        if test "$with_kdreg" != "" && test "$with_kdreg" != "no"; then
-		    gni_CPPFLAGS="-I$with_kdreg/include -DHAVE_KDREG $gni_CPPFLAGS"
-        fi
-
-
          if test "x$have_criterion" = "xtrue"; then
   HAVE_CRITERION_TRUE=
   HAVE_CRITERION_FALSE='#'
@@ -21432,6 +22807,19 @@ else
   HAVE_CRITERION_FALSE=
 fi
 
+        if test "x$have_criterion" = "xtrue"; then :
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_CRITERION 1
+_ACEOF
+
+else
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_CRITERION 0
+_ACEOF
+
+fi
 
 
 
@@ -21474,6 +22862,10 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: gni provider: build as plugin" >&5
 $as_echo "$as_me: gni provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+
+
 else
   PROVIDERS_STATIC="prov/gni/libgni.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: gni provider: include in libfabric" >&5
@@ -21534,10 +22926,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "gni provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/gni/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/gni/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/gni/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "gni provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/gni/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$gni_orig_CPPFLAGS
@@ -21548,15 +22959,22 @@ fi
 	unset gni_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring udp provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"udp"; then :
+  enable_udp=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping udp provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping udp provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring udp provider" >&5
 $as_echo "$as_me: *** Configuring udp provider" >&6;}
-	# Check whether --enable-udp was given.
+	       # Check whether --enable-udp was given.
 if test "${enable_udp+set}" = set; then :
   enableval=$enable_udp;
 else
   enable_udp=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -22248,6 +23666,11 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: udp provider: build as plugin" >&5
 $as_echo "$as_me: udp provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+			 ac_config_files="$ac_config_files prov/udp/libfabric-udp.spec"
+
+
 else
   PROVIDERS_STATIC="prov/udp/libudp.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: udp provider: include in libfabric" >&5
@@ -22308,10 +23731,29 @@ $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "udp provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/udp/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/udp/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/udp/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "udp provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/udp/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
 	CPPFLAGS=$udp_orig_CPPFLAGS
@@ -22322,15 +23764,22 @@ fi
 	unset udp_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring rxm provider" >&5
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"rxm"; then :
+  enable_rxm=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping rxm provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping rxm provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring rxm provider" >&5
 $as_echo "$as_me: *** Configuring rxm provider" >&6;}
-	# Check whether --enable-rxm was given.
+	       # Check whether --enable-rxm was given.
 if test "${enable_rxm+set}" = set; then :
   enableval=$enable_rxm;
 else
   enable_rxm=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
@@ -22432,6 +23881,10 @@ fi
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: rxm provider: build as plugin" >&5
 $as_echo "$as_me: rxm provider: build as plugin" >&6;}
 
+			 # See if this provider has a specfile that
+			 # needs to be generated
+
+
 else
   PROVIDERS_STATIC="prov/rxm/librxm.la $PROVIDERS_STATIC"
 			 { $as_echo "$as_me:${as_lineno-$LINENO}: rxm provider: include in libfabric" >&5
@@ -22483,91 +23936,330 @@ $as_echo "$as_me: WARNING: rxm provider was requested, but cannot be compiled" >
 fi
 	# If this provider was requested for direct build, ensure that
 	# provider's fi_direct.h exists in tree. Error otherwise.
-	if test x"$enable_direct" = x"rxm"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/rxm/include/rdma/fi_direct.h" >&5
-$as_echo_n "checking for $srcdir/prov/rxm/include/rdma/fi_direct.h... " >&6; }
-		 if test -f "$srcdir/prov/rxm/include/rdma/fi_direct.h"; then :
+	if test x"$enable_direct" = x"rxm"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/rxm/include/rdma/fi_direct.h" >&5
+$as_echo_n "checking for $srcdir/prov/rxm/include/rdma/fi_direct.h... " >&6; }
+		 if test -f "$srcdir/prov/rxm/include/rdma/fi_direct.h"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/rxm/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/rxm/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/rxm/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "rxm provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
+
+fi
+fi
+fi
+
+	 if test -f "$srcdir/prov/rxm/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
+
+	# Restore CPPFLAGS/LDFLAGS/LIBS
+	CPPFLAGS=$rxm_orig_CPPFLAGS
+	unset rxm_orig_CPPFLAGS
+	LDFLAGS=$rxm_orig_LDFLAGS
+	unset rxm_orig_LDFLAGS
+	LIBS=$rxm_orig_LIBS
+	unset rxm_orig_LIBS
+
+
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"rxd"; then :
+  enable_rxd=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping rxd provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping rxd provider because $enable_direct direct requested" >&6;}
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring rxd provider" >&5
+$as_echo "$as_me: *** Configuring rxd provider" >&6;}
+	       # Check whether --enable-rxd was given.
+if test "${enable_rxd+set}" = set; then :
+  enableval=$enable_rxd;
+else
+  enable_rxd=auto
+fi
+
+fi
+
+	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
+	# Provider's local macros could use the value if needed.
+	# Also save LIBS, as a matter of principle.
+	rxd_orig_CPPFLAGS=$CPPFLAGS
+	rxd_orig_LDFLAGS=$LDFLAGS
+	rxd_orig_LIBS=$LIBS
+
+	# Check the --enable-<rxd> value
+	rxd_dl=0
+	case $enable_rxd in #(
+  yes|no) :
+     ;; #(
+  dl) :
+    enable_rxd=yes rxd_dl=1 ;; #(
+  auto) :
+     ;; #(
+  *) :
+
+	# Check that the base directory exists
+	if test ! -d "$enable_rxd"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: supplied directory \"$enable_rxd\" does not exist" >&5
+$as_echo "$as_me: WARNING: supplied directory \"$enable_rxd\" does not exist" >&2;}
+	        as_fn_error $? "Cannot continue" "$LINENO" 5
+
+fi
+
+	# Check that base/include exists
+	 if test -d "$enable_rxd/include"; then :
+  rxd_PREFIX="$enable_rxd"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"include\" subdirectory in supplied \"$enable_rxd\" directory\"" >&5
+$as_echo "$as_me: WARNING: could not find \"include\" subdirectory in supplied \"$enable_rxd\" directory\"" >&2;}
+	        as_fn_error $? "Cannot continue" "$LINENO" 5
+
+fi
+
+	# Check that base/lib or base/lib64 exists
+	 if test -d "$enable_rxd/lib"; then :
+  rxd_LIBDIR="$enable_rxd/lib"
+else
+  if test -d "$enable_rxd/lib64"; then :
+  rxd_LIBDIR="$enable_rxd/lib64"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_rxd\" directory\"" >&5
+$as_echo "$as_me: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_rxd\" directory\"" >&2;}
+		       as_fn_error $? "Cannot continue" "$LINENO" 5
+
+fi
+
+fi
+
+	 enable_rxd=yes
+	 ;;
+esac
+
+	# Call the provider's CONFIGURE and CONDITIONALS macros
+
+
+
+
+
+	# Determine if we can support the rxd provider
+	rxd_h_happy=0
+	if test x"$enable_rxd" != x"no"; then :
+  rxd_h_happy=1
+fi
+        if test $rxd_h_happy -eq 1; then :
+  rxd_happy=1
+else
+  rxd_happy=0
+fi
+
+
+
+
+
+
+
+	# See if the provider configured successfully
+	if test $rxd_happy -eq 1; then :
+  PROVIDERS_TO_BUILD="$PROVIDERS_TO_BUILD rxd"
+		 PROVIDERS_COUNT=$((PROVIDERS_COUNT+1))
+
+	 FI_PC_CFLAGS="$FI_PC_CFLAGS $rxd_CFLAGS $rxd_CPPFLAGS"
+	 FI_PC_PRIVATE_LIBS="$FI_PC_PRIVATE_LIBS $rxd_LDFLAGS $rxd_LIBS"
+
+		 if test $rxd_dl -eq 1; then :
+  PROVIDERS_DL="prov/rxd/librxd.la $PROVIDERS_DL"
+			 if test x"$enable_static" = x"yes" &&
+				test x"$enable_shared" = x"no"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: rxd provider was selected to be built as DL" >&5
+$as_echo "$as_me: WARNING: rxd provider was selected to be built as DL" >&2;}
+				 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: but libfabric is being built as static-only" >&5
+$as_echo "$as_me: WARNING: but libfabric is being built as static-only" >&2;}
+				 as_fn_error $? "This is an impossible situation. Cannot continue." "$LINENO" 5
+fi
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: rxd provider: build as plugin" >&5
+$as_echo "$as_me: rxd provider: build as plugin" >&6;}
+
+			 # See if this provider has a specfile that
+			 # needs to be generated
+
+
+else
+  PROVIDERS_STATIC="prov/rxd/librxd.la $PROVIDERS_STATIC"
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: rxd provider: include in libfabric" >&5
+$as_echo "$as_me: rxd provider: include in libfabric" >&6;}
+fi
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: rxd provider: disabled" >&5
+$as_echo "$as_me: rxd provider: disabled" >&6;}
+fi
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_RXD $rxd_happy
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_RXD_DL $rxd_dl
+_ACEOF
+
+
+	# Set AM conditionals for HAVE_<provider> and HAVE_<provider>_DL
+	# as well as AC defines
+	 if test $rxd_happy -eq 1; then
+  HAVE_RXD_TRUE=
+  HAVE_RXD_FALSE='#'
+else
+  HAVE_RXD_TRUE='#'
+  HAVE_RXD_FALSE=
+fi
+
+	 if test $rxd_dl -eq 1; then
+  HAVE_RXD_DL_TRUE=
+  HAVE_RXD_DL_FALSE='#'
+else
+  HAVE_RXD_DL_TRUE='#'
+  HAVE_RXD_DL_FALSE=
+fi
+
+
+	# If this provider was specifically requested but we can't
+	# build it, error.
+	if test "$enable_rxd $rxd_happy" = "yes 0"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: rxd provider was requested, but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: rxd provider was requested, but cannot be compiled" >&2;}
+	       as_fn_error $? "Cannot continue" "$LINENO" 5
+
+fi
+	# If this provider was requested for direct build, ensure that
+	# provider's fi_direct.h exists in tree. Error otherwise.
+	if test x"$enable_direct" = x"rxd"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/rxd/include/rdma/fi_direct.h" >&5
+$as_echo_n "checking for $srcdir/prov/rxd/include/rdma/fi_direct.h... " >&6; }
+		 if test -f "$srcdir/prov/rxd/include/rdma/fi_direct.h"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "rxm provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/rxd/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/rxd/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/rxd/include/rdma/fi_direct.h.in"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+				 as_fn_error $? "rxd provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/rxd/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
-	CPPFLAGS=$rxm_orig_CPPFLAGS
-	unset rxm_orig_CPPFLAGS
-	LDFLAGS=$rxm_orig_LDFLAGS
-	unset rxm_orig_LDFLAGS
-	LIBS=$rxm_orig_LIBS
-	unset rxm_orig_LIBS
+	CPPFLAGS=$rxd_orig_CPPFLAGS
+	unset rxd_orig_CPPFLAGS
+	LDFLAGS=$rxd_orig_LDFLAGS
+	unset rxd_orig_LDFLAGS
+	LIBS=$rxd_orig_LIBS
+	unset rxd_orig_LIBS
 
 
-	{ $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring rxd provider" >&5
-$as_echo "$as_me: *** Configuring rxd provider" >&6;}
-	# Check whether --enable-rxd was given.
-if test "${enable_rxd+set}" = set; then :
-  enableval=$enable_rxd;
+
+	if test x"$enable_direct" != x"no" && test x"$enable_direct" != x"bgq"; then :
+  enable_bgq=no
+               { $as_echo "$as_me:${as_lineno-$LINENO}: *** Skipping bgq provider because $enable_direct direct requested" >&5
+$as_echo "$as_me: *** Skipping bgq provider because $enable_direct direct requested" >&6;}
 else
-  enable_rxd=auto
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** Configuring bgq provider" >&5
+$as_echo "$as_me: *** Configuring bgq provider" >&6;}
+	       # Check whether --enable-bgq was given.
+if test "${enable_bgq+set}" = set; then :
+  enableval=$enable_bgq;
+else
+  enable_bgq=auto
 fi
 
+fi
 
 	# Save CPPFLAGS and LDFLAGS before they are modified by FI_CHECK_PREFIX_DIR.
 	# Provider's local macros could use the value if needed.
 	# Also save LIBS, as a matter of principle.
-	rxd_orig_CPPFLAGS=$CPPFLAGS
-	rxd_orig_LDFLAGS=$LDFLAGS
-	rxd_orig_LIBS=$LIBS
+	bgq_orig_CPPFLAGS=$CPPFLAGS
+	bgq_orig_LDFLAGS=$LDFLAGS
+	bgq_orig_LIBS=$LIBS
 
-	# Check the --enable-<rxd> value
-	rxd_dl=0
-	case $enable_rxd in #(
+	# Check the --enable-<bgq> value
+	bgq_dl=0
+	case $enable_bgq in #(
   yes|no) :
      ;; #(
   dl) :
-    enable_rxd=yes rxd_dl=1 ;; #(
+    enable_bgq=yes bgq_dl=1 ;; #(
   auto) :
      ;; #(
   *) :
 
 	# Check that the base directory exists
-	if test ! -d "$enable_rxd"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: supplied directory \"$enable_rxd\" does not exist" >&5
-$as_echo "$as_me: WARNING: supplied directory \"$enable_rxd\" does not exist" >&2;}
+	if test ! -d "$enable_bgq"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: supplied directory \"$enable_bgq\" does not exist" >&5
+$as_echo "$as_me: WARNING: supplied directory \"$enable_bgq\" does not exist" >&2;}
 	        as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 
 	# Check that base/include exists
-	 if test -d "$enable_rxd/include"; then :
-  rxd_PREFIX="$enable_rxd"
+	 if test -d "$enable_bgq/include"; then :
+  bgq_PREFIX="$enable_bgq"
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"include\" subdirectory in supplied \"$enable_rxd\" directory\"" >&5
-$as_echo "$as_me: WARNING: could not find \"include\" subdirectory in supplied \"$enable_rxd\" directory\"" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"include\" subdirectory in supplied \"$enable_bgq\" directory\"" >&5
+$as_echo "$as_me: WARNING: could not find \"include\" subdirectory in supplied \"$enable_bgq\" directory\"" >&2;}
 	        as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 
 	# Check that base/lib or base/lib64 exists
-	 if test -d "$enable_rxd/lib"; then :
-  rxd_LIBDIR="$enable_rxd/lib"
+	 if test -d "$enable_bgq/lib"; then :
+  bgq_LIBDIR="$enable_bgq/lib"
 else
-  if test -d "$enable_rxd/lib64"; then :
-  rxd_LIBDIR="$enable_rxd/lib64"
+  if test -d "$enable_bgq/lib64"; then :
+  bgq_LIBDIR="$enable_bgq/lib64"
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_rxd\" directory\"" >&5
-$as_echo "$as_me: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_rxd\" directory\"" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_bgq\" directory\"" >&5
+$as_echo "$as_me: WARNING: could not find \"lib\" or \"lib64\" subdirectories in supplied \"$enable_bgq\" directory\"" >&2;}
 		       as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 
 fi
 
-	 enable_rxd=yes
+	 enable_bgq=yes
 	 ;;
 esac
 
@@ -22577,15 +24269,139 @@ esac
 
 
 
-	# Determine if we can support the rxd provider
-	rxd_h_happy=0
-	if test x"$enable_rxd" != x"no"; then :
-  rxd_h_happy=1
+
+
+	# Determine if we can support the bgq provider
+	bgq_happy=0
+	bgq_direct=0
+
+	if test x"$enable_bgq" != x"no"; then :
+
+		{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for direct bgq provider" >&5
+$as_echo_n "checking for direct bgq provider... " >&6; }
+		if test x"$enable_direct" != x"bgq"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+			bgq_driver=/bgsys/drivers/ppcfloor
+
+
+# Check whether --with-bgq-driver was given.
+if test "${with_bgq_driver+set}" = set; then :
+  withval=$with_bgq_driver; bgq_driver=$with_bgq_driver
 fi
-        if test $rxd_h_happy -eq 1; then :
-  rxd_happy=1
+
+
+			bgq_driver_CPPFLAGS="-I$bgq_driver -I$bgq_driver/spi/include/kernel/cnk"
+			CPPFLAGS="$bgq_driver_CPPFLAGS $CPPFLAGS"
+
+			ac_fn_c_check_header_mongrel "$LINENO" "hwi/include/bqc/MU_Descriptor.h" "ac_cv_header_hwi_include_bqc_MU_Descriptor_h" "$ac_includes_default"
+if test "x$ac_cv_header_hwi_include_bqc_MU_Descriptor_h" = xyes; then :
+  bgq_happy=1
 else
-  rxd_happy=0
+  bgq_happy=0
+fi
+
+
+
+			bgq_external_source=auto
+
+
+# Check whether --with-bgq-src was given.
+if test "${with_bgq_src+set}" = set; then :
+  withval=$with_bgq_src; bgq_external_source=$with_bgq_src
+fi
+
+
+			if test x"$bgq_external_source" == x"auto"; then :
+
+				for bgq_dir in `ls -r /bgsys/source`; do
+					{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for bgq opensource distribution" >&5
+$as_echo_n "checking for bgq opensource distribution... " >&6; }
+					if test -f /bgsys/source/$bgq_dir/spi/src/kernel/cnk/memory_impl.c; then :
+  bgq_external_source="/bgsys/source/$bgq_dir"
+						{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $bgq_external_source" >&5
+$as_echo "$bgq_external_source" >&6; }
+						break
+fi
+				done
+				if test x"$bgq_external_source" == x"auto"; then :
+
+					bgq_happy=0
+					{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+fi
+
+			if test ! -f $bgq_external_source/spi/src/kernel/cnk/memory_impl.c; then :
+
+				as_fn_error $? "unable to locate the bgq opensource distribution" "$LINENO" 5
+fi
+
+
+# Check whether --with-bgq-progress was given.
+if test "${with_bgq_progress+set}" = set; then :
+  withval=$with_bgq_progress;
+fi
+
+
+			case $with_bgq_progress in #(
+  auto) :
+    BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_AUTO ;; #(
+  manual) :
+    BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_MANUAL ;; #(
+  runtime) :
+    BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_UNSPEC ;; #(
+  *) :
+    BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_MANUAL ;;
+esac
+
+			bgq_fabric_direct_progress=$BGQ_FABRIC_DIRECT_PROGRESS
+
+
+						BGQ_FABRIC_DIRECT_AV=FI_AV_MAP
+			bgq_fabric_direct_av=$BGQ_FABRIC_DIRECT_AV
+
+
+
+# Check whether --with-bgq-mr was given.
+if test "${with_bgq_mr+set}" = set; then :
+  withval=$with_bgq_mr;
+fi
+
+
+			case $with_bgq_mr in #(
+  scalable) :
+    BGQ_FABRIC_DIRECT_MR=FI_MR_SCALABLE ;; #(
+  basic) :
+    BGQ_FABRIC_DIRECT_MR=FI_MR_BASIC ;; #(
+  *) :
+    BGQ_FABRIC_DIRECT_MR=FI_MR_SCALABLE ;;
+esac
+
+			bgq_fabric_direct_mr=$BGQ_FABRIC_DIRECT_MR
+
+
+						BGQ_FABRIC_DIRECT_THREAD=FI_THREAD_ENDPOINT
+			bgq_fabric_direct_thread=$BGQ_FABRIC_DIRECT_THREAD
+
+
+
+			ac_config_files="$ac_config_files prov/bgq/include/rdma/fi_direct.h"
+
+
+fi
+
+fi
+
+	if test $bgq_happy -eq 1; then :
+  bgq_happy=1
+else
+  bgq_happy=0
 fi
 
 
@@ -22594,99 +24410,123 @@ fi
 
 
 
+
 	# See if the provider configured successfully
-	if test $rxd_happy -eq 1; then :
-  PROVIDERS_TO_BUILD="$PROVIDERS_TO_BUILD rxd"
+	if test $bgq_happy -eq 1; then :
+  PROVIDERS_TO_BUILD="$PROVIDERS_TO_BUILD bgq"
 		 PROVIDERS_COUNT=$((PROVIDERS_COUNT+1))
 
-	 FI_PC_CFLAGS="$FI_PC_CFLAGS $rxd_CFLAGS $rxd_CPPFLAGS"
-	 FI_PC_PRIVATE_LIBS="$FI_PC_PRIVATE_LIBS $rxd_LDFLAGS $rxd_LIBS"
+	 FI_PC_CFLAGS="$FI_PC_CFLAGS $bgq_CFLAGS $bgq_CPPFLAGS"
+	 FI_PC_PRIVATE_LIBS="$FI_PC_PRIVATE_LIBS $bgq_LDFLAGS $bgq_LIBS"
 
-		 if test $rxd_dl -eq 1; then :
-  PROVIDERS_DL="prov/rxd/librxd.la $PROVIDERS_DL"
+		 if test $bgq_dl -eq 1; then :
+  PROVIDERS_DL="prov/bgq/libbgq.la $PROVIDERS_DL"
 			 if test x"$enable_static" = x"yes" &&
 				test x"$enable_shared" = x"no"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: rxd provider was selected to be built as DL" >&5
-$as_echo "$as_me: WARNING: rxd provider was selected to be built as DL" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: bgq provider was selected to be built as DL" >&5
+$as_echo "$as_me: WARNING: bgq provider was selected to be built as DL" >&2;}
 				 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: but libfabric is being built as static-only" >&5
 $as_echo "$as_me: WARNING: but libfabric is being built as static-only" >&2;}
 				 as_fn_error $? "This is an impossible situation. Cannot continue." "$LINENO" 5
 fi
-			 { $as_echo "$as_me:${as_lineno-$LINENO}: rxd provider: build as plugin" >&5
-$as_echo "$as_me: rxd provider: build as plugin" >&6;}
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: bgq provider: build as plugin" >&5
+$as_echo "$as_me: bgq provider: build as plugin" >&6;}
+
+			 # See if this provider has a specfile that
+			 # needs to be generated
+
 
 else
-  PROVIDERS_STATIC="prov/rxd/librxd.la $PROVIDERS_STATIC"
-			 { $as_echo "$as_me:${as_lineno-$LINENO}: rxd provider: include in libfabric" >&5
-$as_echo "$as_me: rxd provider: include in libfabric" >&6;}
+  PROVIDERS_STATIC="prov/bgq/libbgq.la $PROVIDERS_STATIC"
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: bgq provider: include in libfabric" >&5
+$as_echo "$as_me: bgq provider: include in libfabric" >&6;}
 fi
 
 else
-  { $as_echo "$as_me:${as_lineno-$LINENO}: rxd provider: disabled" >&5
-$as_echo "$as_me: rxd provider: disabled" >&6;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: bgq provider: disabled" >&5
+$as_echo "$as_me: bgq provider: disabled" >&6;}
 fi
 
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_RXD $rxd_happy
+#define HAVE_BGQ $bgq_happy
 _ACEOF
 
 
 cat >>confdefs.h <<_ACEOF
-#define HAVE_RXD_DL $rxd_dl
+#define HAVE_BGQ_DL $bgq_dl
 _ACEOF
 
 
 	# Set AM conditionals for HAVE_<provider> and HAVE_<provider>_DL
 	# as well as AC defines
-	 if test $rxd_happy -eq 1; then
-  HAVE_RXD_TRUE=
-  HAVE_RXD_FALSE='#'
+	 if test $bgq_happy -eq 1; then
+  HAVE_BGQ_TRUE=
+  HAVE_BGQ_FALSE='#'
 else
-  HAVE_RXD_TRUE='#'
-  HAVE_RXD_FALSE=
+  HAVE_BGQ_TRUE='#'
+  HAVE_BGQ_FALSE=
 fi
 
-	 if test $rxd_dl -eq 1; then
-  HAVE_RXD_DL_TRUE=
-  HAVE_RXD_DL_FALSE='#'
+	 if test $bgq_dl -eq 1; then
+  HAVE_BGQ_DL_TRUE=
+  HAVE_BGQ_DL_FALSE='#'
 else
-  HAVE_RXD_DL_TRUE='#'
-  HAVE_RXD_DL_FALSE=
+  HAVE_BGQ_DL_TRUE='#'
+  HAVE_BGQ_DL_FALSE=
 fi
 
 
 	# If this provider was specifically requested but we can't
 	# build it, error.
-	if test "$enable_rxd $rxd_happy" = "yes 0"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: rxd provider was requested, but cannot be compiled" >&5
-$as_echo "$as_me: WARNING: rxd provider was requested, but cannot be compiled" >&2;}
+	if test "$enable_bgq $bgq_happy" = "yes 0"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: bgq provider was requested, but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: bgq provider was requested, but cannot be compiled" >&2;}
 	       as_fn_error $? "Cannot continue" "$LINENO" 5
 
 fi
 	# If this provider was requested for direct build, ensure that
 	# provider's fi_direct.h exists in tree. Error otherwise.
-	if test x"$enable_direct" = x"rxd"; then :
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/rxd/include/rdma/fi_direct.h" >&5
-$as_echo_n "checking for $srcdir/prov/rxd/include/rdma/fi_direct.h... " >&6; }
-		 if test -f "$srcdir/prov/rxd/include/rdma/fi_direct.h"; then :
+	if test x"$enable_direct" = x"bgq"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/bgq/include/rdma/fi_direct.h" >&5
+$as_echo_n "checking for $srcdir/prov/bgq/include/rdma/fi_direct.h... " >&6; }
+		 if test -f "$srcdir/prov/bgq/include/rdma/fi_direct.h"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+			 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $srcdir/prov/bgq/include/rdma/fi_direct.h.in" >&5
+$as_echo_n "checking for $srcdir/prov/bgq/include/rdma/fi_direct.h.in... " >&6; }
+			 if test -f "$srcdir/prov/bgq/include/rdma/fi_direct.h.in"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
 else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
-			  as_fn_error $? "rxd provider was requested as direct, but is missing fi_direct.h" "$LINENO" 5
+				 as_fn_error $? "bgq provider was requested as direct, but is missing fi_direct.h and fi_direct.h.in" "$LINENO" 5
 
 fi
 fi
+fi
+
+	 if test -f "$srcdir/prov/bgq/include/rdma/fi_direct.h.in"; then
+  FI_DIRECT_H_IN_TRUE=
+  FI_DIRECT_H_IN_FALSE='#'
+else
+  FI_DIRECT_H_IN_TRUE='#'
+  FI_DIRECT_H_IN_FALSE=
+fi
+
+
 
 	# Restore CPPFLAGS/LDFLAGS/LIBS
-	CPPFLAGS=$rxd_orig_CPPFLAGS
-	unset rxd_orig_CPPFLAGS
-	LDFLAGS=$rxd_orig_LDFLAGS
-	unset rxd_orig_LDFLAGS
-	LIBS=$rxd_orig_LIBS
-	unset rxd_orig_LIBS
+	CPPFLAGS=$bgq_orig_CPPFLAGS
+	unset bgq_orig_CPPFLAGS
+	LDFLAGS=$bgq_orig_LDFLAGS
+	unset bgq_orig_LDFLAGS
+	LIBS=$bgq_orig_LIBS
+	unset bgq_orig_LIBS
 
 
 
@@ -22906,10 +24746,6 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_CLOCK_GETTIME_TRUE}" && test -z "${HAVE_CLOCK_GETTIME_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_CLOCK_GETTIME\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${EMBEDDED_TRUE}" && test -z "${EMBEDDED_FALSE}"; then
   as_fn_error $? "conditional \"EMBEDDED\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22926,6 +24762,10 @@ if test -z "${HAVE_PSM_DL_TRUE}" && test -z "${HAVE_PSM_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_PSM_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_PSM2_TRUE}" && test -z "${HAVE_PSM2_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_PSM2\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22934,6 +24774,10 @@ if test -z "${HAVE_PSM2_DL_TRUE}" && test -z "${HAVE_PSM2_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_PSM2_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_SOCKETS_TRUE}" && test -z "${HAVE_SOCKETS_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_SOCKETS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22942,6 +24786,10 @@ if test -z "${HAVE_SOCKETS_DL_TRUE}" && test -z "${HAVE_SOCKETS_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_SOCKETS_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_VERBS_TRUE}" && test -z "${HAVE_VERBS_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_VERBS\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22950,6 +24798,14 @@ if test -z "${HAVE_VERBS_DL_TRUE}" && test -z "${HAVE_VERBS_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_VERBS_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USNIC_BUILD_FAKE_VERBS_DRIVER_TRUE}" && test -z "${USNIC_BUILD_FAKE_VERBS_DRIVER_FALSE}"; then
+  as_fn_error $? "conditional \"USNIC_BUILD_FAKE_VERBS_DRIVER\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_USNIC_TRUE}" && test -z "${HAVE_USNIC_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_USNIC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22958,12 +24814,20 @@ if test -z "${HAVE_USNIC_DL_TRUE}" && test -z "${HAVE_USNIC_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_USNIC_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_MXM_TRUE}" && test -z "${HAVE_MXM_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_MXM\" was never defined.
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_MLX_TRUE}" && test -z "${HAVE_MLX_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_MLX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${HAVE_MXM_DL_TRUE}" && test -z "${HAVE_MXM_DL_FALSE}"; then
-  as_fn_error $? "conditional \"HAVE_MXM_DL\" was never defined.
+if test -z "${HAVE_MLX_DL_TRUE}" && test -z "${HAVE_MLX_DL_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_MLX_DL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
 if test -z "${HAVE_CRITERION_TRUE}" && test -z "${HAVE_CRITERION_FALSE}"; then
@@ -22978,6 +24842,10 @@ if test -z "${HAVE_GNI_DL_TRUE}" && test -z "${HAVE_GNI_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_GNI_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_UDP_TRUE}" && test -z "${HAVE_UDP_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_UDP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22986,6 +24854,10 @@ if test -z "${HAVE_UDP_DL_TRUE}" && test -z "${HAVE_UDP_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_UDP_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_RXM_TRUE}" && test -z "${HAVE_RXM_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_RXM\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -22994,6 +24866,10 @@ if test -z "${HAVE_RXM_DL_TRUE}" && test -z "${HAVE_RXM_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_RXM_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_RXD_TRUE}" && test -z "${HAVE_RXD_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_RXD\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -23002,6 +24878,22 @@ if test -z "${HAVE_RXD_DL_TRUE}" && test -z "${HAVE_RXD_DL_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_RXD_DL\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_BGQ_TRUE}" && test -z "${HAVE_BGQ_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_BGQ\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_BGQ_DL_TRUE}" && test -z "${HAVE_BGQ_DL_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_BGQ_DL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${FI_DIRECT_H_IN_TRUE}" && test -z "${FI_DIRECT_H_IN_FALSE}"; then
+  as_fn_error $? "conditional \"FI_DIRECT_H_IN\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_DIRECT_TRUE}" && test -z "${HAVE_DIRECT_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_DIRECT\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -23403,7 +25295,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by libfabric $as_me 1.4.0, which was
+This file was extended by libfabric $as_me 1.5.2, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -23469,7 +25361,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-libfabric config.status 1.4.0
+libfabric config.status 1.5.2
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -23604,6 +25496,7 @@ enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
 enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
 pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
 enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
 SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
 ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
 PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
@@ -23653,10 +25546,13 @@ compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
 GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
 nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
 lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
 objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
 MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
 lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
@@ -23721,7 +25617,8 @@ finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
 finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
 hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
 sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
-sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
+configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
 hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
 enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
 enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
@@ -23772,9 +25669,12 @@ CFLAGS \
 compiler \
 lt_cv_sys_global_symbol_pipe \
 lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_import \
 lt_cv_sys_global_symbol_to_c_name_address \
 lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+lt_cv_nm_interface \
 nm_file_list_spec \
+lt_cv_truncate_bin \
 lt_prog_compiler_no_builtin_flag \
 lt_prog_compiler_pic \
 lt_prog_compiler_wl \
@@ -23809,7 +25709,7 @@ old_striplib \
 striplib; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -23836,10 +25736,11 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
+configure_time_dlsearch_path \
+configure_time_lt_sys_library_path; do
     case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
     *[\\\\\\\`\\"\\\$]*)
-      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
       ;;
     *)
       eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
@@ -23848,19 +25749,16 @@ sys_lib_dlsearch_path_spec; do
 done
 
 ac_aux_dir='$ac_aux_dir'
-xsi_shell='$xsi_shell'
-lt_shell_append='$lt_shell_append'
 
-# See if we are running on zsh, and set the options which allow our
+# See if we are running on zsh, and set the options that allow our
 # commands through without removal of \ escapes INIT.
-if test -n "\${ZSH_VERSION+set}" ; then
+if test -n "\${ZSH_VERSION+set}"; then
    setopt NO_GLOB_SUBST
 fi
 
 
     PACKAGE='$PACKAGE'
     VERSION='$VERSION'
-    TIMESTAMP='$TIMESTAMP'
     RM='$RM'
     ofile='$ofile'
 
@@ -23879,6 +25777,13 @@ do
     "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
     "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
     "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+    "prov/psm/libfabric-psm.spec") CONFIG_FILES="$CONFIG_FILES prov/psm/libfabric-psm.spec" ;;
+    "prov/psm2/libfabric-psm2.spec") CONFIG_FILES="$CONFIG_FILES prov/psm2/libfabric-psm2.spec" ;;
+    "prov/sockets/libfabric-sockets.spec") CONFIG_FILES="$CONFIG_FILES prov/sockets/libfabric-sockets.spec" ;;
+    "prov/verbs/libfabric-verbs.spec") CONFIG_FILES="$CONFIG_FILES prov/verbs/libfabric-verbs.spec" ;;
+    "prov/usnic/libfabric-usnic.spec") CONFIG_FILES="$CONFIG_FILES prov/usnic/libfabric-usnic.spec" ;;
+    "prov/udp/libfabric-udp.spec") CONFIG_FILES="$CONFIG_FILES prov/udp/libfabric-udp.spec" ;;
+    "prov/bgq/include/rdma/fi_direct.h") CONFIG_FILES="$CONFIG_FILES prov/bgq/include/rdma/fi_direct.h" ;;
     "libfabric.pc") CONFIG_FILES="$CONFIG_FILES libfabric.pc" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "libfabric.spec") CONFIG_FILES="$CONFIG_FILES libfabric.spec" ;;
@@ -24612,55 +26517,53 @@ $as_echo X"$file" |
  ;;
     "libtool":C)
 
-    # See if we are running on zsh, and set the options which allow our
+    # See if we are running on zsh, and set the options that allow our
     # commands through without removal of \ escapes.
-    if test -n "${ZSH_VERSION+set}" ; then
+    if test -n "${ZSH_VERSION+set}"; then
       setopt NO_GLOB_SUBST
     fi
 
-    cfgfile="${ofile}T"
+    cfgfile=${ofile}T
     trap "$RM \"$cfgfile\"; exit 1" 1 2 15
     $RM "$cfgfile"
 
     cat <<_LT_EOF >> "$cfgfile"
 #! $SHELL
-
-# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Generated automatically by $as_me ($PACKAGE) $VERSION
 # Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
 # NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
 #
-#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
-#                 Foundation, Inc.
-#   Written by Gordon Matzigkeit, 1996
-#
-#   This file is part of GNU Libtool.
-#
-# GNU Libtool is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation; either version 2 of
-# the License, or (at your option) any later version.
-#
-# As a special exception to the GNU General Public License,
-# if you distribute this file as part of a program or library that
-# is built using GNU Libtool, you may include this file under the
-# same distribution terms that you use for the rest of that program.
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
 #
-# GNU Libtool is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with GNU Libtool; see the file COPYING.  If not, a copy
-# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-# obtained by writing to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
 # The names of the tagged configurations supported by this script.
-available_tags=""
+available_tags=''
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
 
 # ### BEGIN LIBTOOL CONFIG
 
@@ -24680,6 +26583,9 @@ pic_mode=$pic_mode
 # Whether or not to optimize for fast installation.
 fast_install=$enable_fast_install
 
+# Shared archive member basename,for filename based shared library versioning on AIX.
+shared_archive_member_spec=$shared_archive_member_spec
+
 # Shell to use when invoking shell scripts.
 SHELL=$lt_SHELL
 
@@ -24797,18 +26703,27 @@ global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
 # Transform the output of nm in a proper C declaration.
 global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
 
+# Transform the output of nm into a list of symbols to manually relocate.
+global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import
+
 # Transform the output of nm in a C name address pair.
 global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
 
 # Transform the output of nm in a C name address pair when lib prefix is needed.
 global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
 
+# The name lister interface.
+nm_interface=$lt_lt_cv_nm_interface
+
 # Specify filename containing input files for \$NM.
 nm_file_list_spec=$lt_nm_file_list_spec
 
-# The root where to search for dependent libraries,and in which our libraries should be installed.
+# The root where to search for dependent libraries,and where our libraries should be installed.
 lt_sysroot=$lt_sysroot
 
+# Command to truncate a binary pipe.
+lt_truncate_bin=$lt_lt_cv_truncate_bin
+
 # The name of the directory that contains temporary libtool files.
 objdir=$objdir
 
@@ -24899,8 +26814,11 @@ hardcode_into_libs=$hardcode_into_libs
 # Compile-time system search path for libraries.
 sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
 
-# Run-time system search path for libraries.
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+# Detected run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path
+
+# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
+configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path
 
 # Whether dlopen is supported.
 dlopen_support=$enable_dlopen
@@ -24993,13 +26911,13 @@ hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
 # Whether we need a single "-rpath" flag with a separated argument.
 hardcode_libdir_separator=$lt_hardcode_libdir_separator
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary.
 hardcode_direct=$hardcode_direct
 
-# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
 # DIR into the resulting binary and the resulting library dependency is
-# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# "absolute",i.e impossible to change by setting \$shlibpath_var if the
 # library is relocated.
 hardcode_direct_absolute=$hardcode_direct_absolute
 
@@ -25051,13 +26969,72 @@ hardcode_action=$hardcode_action
 
 _LT_EOF
 
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x$2 in
+    x)
+        ;;
+    *:)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
+        ;;
+    x:*)
+        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
+        ;;
+    *)
+        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+
+
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in $*""; do
+      case $cc_temp in
+        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
   case $host_os in
   aix3*)
     cat <<\_LT_EOF >> "$cfgfile"
 # AIX sometimes has problems with the GCC collect2 program.  For some
 # reason, if we set the COLLECT_NAMES environment variable, the problems
 # vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
+if test set != "${COLLECT_NAMES+set}"; then
   COLLECT_NAMES=
   export COLLECT_NAMES
 fi
@@ -25066,7 +27043,7 @@ _LT_EOF
   esac
 
 
-ltmain="$ac_aux_dir/ltmain.sh"
+ltmain=$ac_aux_dir/ltmain.sh
 
 
   # We use sed instead of cat because bash on DJGPP gets confused if
@@ -25076,165 +27053,6 @@ ltmain="$ac_aux_dir/ltmain.sh"
   sed '$q' "$ltmain" >> "$cfgfile" \
      || (rm -f "$cfgfile"; exit 1)
 
-  if test x"$xsi_shell" = xyes; then
-  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
-func_dirname ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_basename ()$/,/^} # func_basename /c\
-func_basename ()\
-{\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
-func_dirname_and_basename ()\
-{\
-\    case ${1} in\
-\      */*) func_dirname_result="${1%/*}${2}" ;;\
-\      *  ) func_dirname_result="${3}" ;;\
-\    esac\
-\    func_basename_result="${1##*/}"\
-} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
-func_stripname ()\
-{\
-\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
-\    # positional parameters, so assign one to ordinary parameter first.\
-\    func_stripname_result=${3}\
-\    func_stripname_result=${func_stripname_result#"${1}"}\
-\    func_stripname_result=${func_stripname_result%"${2}"}\
-} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
-func_split_long_opt ()\
-{\
-\    func_split_long_opt_name=${1%%=*}\
-\    func_split_long_opt_arg=${1#*=}\
-} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
-func_split_short_opt ()\
-{\
-\    func_split_short_opt_arg=${1#??}\
-\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
-} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
-func_lo2o ()\
-{\
-\    case ${1} in\
-\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
-\      *)    func_lo2o_result=${1} ;;\
-\    esac\
-} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_xform ()$/,/^} # func_xform /c\
-func_xform ()\
-{\
-    func_xform_result=${1%.*}.lo\
-} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_arith ()$/,/^} # func_arith /c\
-func_arith ()\
-{\
-    func_arith_result=$(( $* ))\
-} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_len ()$/,/^} # func_len /c\
-func_len ()\
-{\
-    func_len_result=${#1}\
-} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-fi
-
-if test x"$lt_shell_append" = xyes; then
-  sed -e '/^func_append ()$/,/^} # func_append /c\
-func_append ()\
-{\
-    eval "${1}+=\\${2}"\
-} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
-func_append_quoted ()\
-{\
-\    func_quote_for_eval "${2}"\
-\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
-} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
-  && mv -f "$cfgfile.tmp" "$cfgfile" \
-    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-test 0 -eq $? || _lt_function_replace_fail=:
-
-
-  # Save a `func_append' function call where possible by direct use of '+='
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-else
-  # Save a `func_append' function call even when '+=' is not available
-  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
-    && mv -f "$cfgfile.tmp" "$cfgfile" \
-      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
-  test 0 -eq $? || _lt_function_replace_fail=:
-fi
-
-if test x"$_lt_function_replace_fail" = x":"; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
-$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
-fi
-
-
    mv -f "$cfgfile" "$ofile" ||
     (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
   chmod +x "$ofile"
diff --git a/configure.ac b/configure.ac
index d137250..202f983 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@ dnl
 dnl Process this file with autoconf to produce a configure script.
 
 AC_PREREQ([2.60])
-AC_INIT([libfabric], [1.4.0], [ofiwg at lists.openfabrics.org])
+AC_INIT([libfabric], [1.5.2], [ofiwg at lists.openfabrics.org])
 AC_CONFIG_SRCDIR([src/fabric.c])
 AC_CONFIG_AUX_DIR(config)
 AC_CONFIG_MACRO_DIR(config)
@@ -38,12 +38,14 @@ AM_CONDITIONAL([LINUX], [test "x$linux" = "x1"])
 AM_CONDITIONAL([FREEBSD], [test "x$freebsd" = "x1"])
 
 base_c_warn_flags="-Wall -Wundef -Wpointer-arith"
+debug_c_warn_flags="-Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-missing-field-initializers"
+picky_c_warn_flags="-Wno-long-long -Wmissing-prototypes -Wstrict-prototypes -Wcomment -pedantic"
 
 AC_ARG_ENABLE([debug],
 	      [AS_HELP_STRING([--enable-debug],
 			      [Enable debugging @<:@default=no@:>@])
 	      ],
-	      [CFLAGS="-g -O0 ${base_c_warn_flags} -Wextra -Wno-unused-parameter -Wno-sign-compare -Wno-missing-field-initializers $CFLAGS"
+	      [CFLAGS="-g -O0 ${base_c_warn_flags} ${debug_c_warn_flags} $CFLAGS"
 	       dbg=1],
 	      [enable_debug=no
                dbg=0])
@@ -105,6 +107,16 @@ AC_CHECK_LIB(dl, dlopen, [],
 ])
 fi
 
+dnl handle picky option
+AC_ARG_ENABLE([picky],
+    [AC_HELP_STRING([--enable-picky],
+                    [Enable developer-level compiler pickyness when building @<:@default=no@:>@])])
+AS_IF([test x"$enable_picky" = x"yes" && test x"$GCC" = x"yes"],
+      [AS_IF([test x"$enable_debug" = x"no"],
+             [CFLAGS="${base_c_warn_flags} ${debug_c_warn_flags} ${picky_c_warn_flags} $CFLAGS"],
+             [CFLAGS="${picky_c_warn_flags} $CFLAGS"])
+      ])
+
 dnl Checks for libraries
 AC_CHECK_LIB(pthread, pthread_mutex_init, [],
     AC_MSG_ERROR([pthread_mutex_init() not found.  libfabric requires libpthread.]))
@@ -125,24 +137,11 @@ fi
 AC_DEFINE_UNQUOTED([PT_LOCK_SPIN], [$have_spinlock],
 	[Define to 1 if pthread_spin_init is available.])
 
-have_clock_gettime=0
-
 AC_CHECK_FUNCS([epoll_create])
 if test "$ac_cv_func_epoll_create" = yes; then
   AC_DEFINE([HAVE_EPOLL], [1], [Define if you have epoll support.])
 fi
 
-AC_SEARCH_LIBS([clock_gettime],[rt],
-		[have_clock_gettime=1],
-		[AC_CHECK_FUNCS([host_get_clock_service],
-			[],
-			[AC_MSG_ERROR([clock_gettime or host_get_clock_service
-			 not found.])])])
-
-AC_DEFINE_UNQUOTED(HAVE_CLOCK_GETTIME, [$have_clock_gettime],
-		   [Define to 1 if clock_gettime is available.])
-AM_CONDITIONAL(HAVE_CLOCK_GETTIME, [test $have_clock_gettime -eq 1])
-
 dnl Check for gcc atomic intrinsics
 AC_MSG_CHECKING(compiler support for c11 atomics)
 AC_TRY_LINK([#include <stdatomic.h>],
@@ -160,6 +159,24 @@ AC_TRY_LINK([#include <stdatomic.h>],
     ],
     [AC_MSG_RESULT(no)])
 
+dnl Check for gcc built-in atomics
+AC_MSG_CHECKING(compiler support for built-in atomics)
+AC_TRY_LINK([#include <stdint.h>],
+    [int32_t a;
+     __sync_add_and_fetch(&a, 0);
+     __sync_sub_and_fetch(&a, 0);
+     #if defined(__PPC__) && !defined(__PPC64__)
+       #error compiler built-in atomics are not supported on PowerPC 32-bit
+     #else
+       return 0;
+     #endif
+    ],
+    [
+	AC_MSG_RESULT(yes)
+        AC_DEFINE(HAVE_BUILTIN_ATOMICS, 1, [Set to 1 to use built-in intrincics atomics])
+    ],
+    [AC_MSG_RESULT(no)])
+
 if test "$with_valgrind" != "" && test "$with_valgrind" != "no"; then
 AC_CHECK_HEADER(valgrind/memcheck.h, [],
     AC_MSG_ERROR([valgrind requested but <valgrind/memcheck.h> not found.]))
@@ -247,11 +264,12 @@ FI_PROVIDER_SETUP([verbs])
 dnl The usnic provider must be setup after the verbs provider.  See
 dnl prov/usnic/configure.m4 for details.
 FI_PROVIDER_SETUP([usnic])
-FI_PROVIDER_SETUP([mxm])
+FI_PROVIDER_SETUP([mlx])
 FI_PROVIDER_SETUP([gni])
 FI_PROVIDER_SETUP([udp])
 FI_PROVIDER_SETUP([rxm])
 FI_PROVIDER_SETUP([rxd])
+FI_PROVIDER_SETUP([bgq])
 FI_PROVIDER_FINI
 dnl Configure the .pc file
 FI_PROVIDER_SETUP_PC
diff --git a/include/fi.h b/include/fi.h
index 7357506..70602d3 100644
--- a/include/fi.h
+++ b/include/fi.h
@@ -61,6 +61,8 @@
 extern "C" {
 #endif
 
+#define OFI_CORE_PROV_ONLY	(1ULL << 59)
+
 /*
  * OS X doesn't have __BYTE_ORDER, Linux usually has BYTE_ORDER but not under
  * all features.h flags
@@ -112,6 +114,7 @@ static inline uint64_t ntohll(uint64_t x) { return x; }
 /* Restrict to size of struct fi_context */
 struct fi_prov_context {
 	int disable_logging;
+	int is_util_prov;
 };
 
 struct fi_filter {
@@ -122,18 +125,18 @@ struct fi_filter {
 extern struct fi_filter prov_log_filter;
 extern struct fi_provider core_prov;
 
-void fi_create_filter(struct fi_filter *filter, const char *env_name);
-void fi_free_filter(struct fi_filter *filter);
-int fi_apply_filter(struct fi_filter *filter, const char *name);
+void ofi_create_filter(struct fi_filter *filter, const char *env_name);
+void ofi_free_filter(struct fi_filter *filter);
+int ofi_apply_filter(struct fi_filter *filter, const char *name);
 
-void fi_util_init(void);
-void fi_util_fini(void);
 void fi_log_init(void);
 void fi_log_fini(void);
 void fi_param_init(void);
 void fi_param_fini(void);
 void fi_param_undefine(const struct fi_provider *provider);
 
+const char *ofi_hex_str(const uint8_t *data, size_t len);
+
 static inline uint64_t roundup_power_of_two(uint64_t n)
 {
 	if (!n || !(n & (n - 1)))
@@ -158,30 +161,115 @@ static inline size_t fi_get_aligned_sz(size_t size, size_t alignment)
 #define FI_TAG_GENERIC	0xAAAAAAAAAAAAAAAAULL
 
 
-size_t fi_datatype_size(enum fi_datatype datatype);
 uint64_t fi_tag_bits(uint64_t mem_tag_format);
 uint64_t fi_tag_format(uint64_t tag_bits);
+int fi_size_bits(uint64_t num);
 
 int ofi_send_allowed(uint64_t caps);
 int ofi_recv_allowed(uint64_t caps);
 int ofi_rma_initiate_allowed(uint64_t caps);
 int ofi_rma_target_allowed(uint64_t caps);
-int ofi_ep_bind_valid(struct fi_provider *prov, struct fid *bfid, uint64_t flags);
+int ofi_ep_bind_valid(const struct fi_provider *prov, struct fid *bfid,
+		      uint64_t flags);
 
 uint64_t fi_gettime_ms(void);
 uint64_t fi_gettime_us(void);
 
-static inline int ofi_equals_ipaddr(struct sockaddr_in *addr1,
-                             struct sockaddr_in *addr2)
+/*
+ * Address utility functions
+ */
+
+#ifndef AF_IB
+#define AF_IB 27
+#endif
+
+#define ofi_sin_addr(addr) (((struct sockaddr_in *)(addr))->sin_addr)
+#define ofi_sin_port(addr) (((struct sockaddr_in *)(addr))->sin_port)
+
+#define ofi_sin6_addr(addr) (((struct sockaddr_in6 *)(addr))->sin6_addr)
+#define ofi_sin6_port(addr) (((struct sockaddr_in6 *)(addr))->sin6_port)
+
+#define OFI_ADDRSTRLEN (INET6_ADDRSTRLEN + 50)
+
+#define OFI_ENUM_VAL(X) X
+#define OFI_STR(X) #X
+#define OFI_STR_INT(X) OFI_STR(X)
+
+static inline size_t ofi_sizeofaddr(const struct sockaddr *address)
+{
+	return (address->sa_family == AF_INET ?
+		sizeof(struct sockaddr_in) :
+		sizeof(struct sockaddr_in6));
+}
+
+static inline int ofi_equals_ipaddr(const struct sockaddr_in *addr1,
+				    const struct sockaddr_in *addr2)
 {
         return (addr1->sin_addr.s_addr == addr2->sin_addr.s_addr);
 }
 
-static inline int ofi_equals_sockaddr(struct sockaddr_in *addr1,
-                             struct sockaddr_in *addr2)
+static inline int ofi_equals_sockaddr(const struct sockaddr_in *addr1,
+				      const struct sockaddr_in *addr2)
 {
         return (ofi_equals_ipaddr(addr1, addr2) &&
-                (addr1->sin_port == addr2->sin_port));
+        	(addr1->sin_port == addr2->sin_port));
+}
+
+static inline int ofi_translate_addr_format(int family)
+{
+	switch (family) {
+	case AF_INET:
+		return FI_SOCKADDR_IN;
+	case AF_INET6:
+		return FI_SOCKADDR_IN6;
+	case AF_IB:
+		return FI_SOCKADDR_IB;
+	default:
+		return FI_FORMAT_UNSPEC;
+	}
+}
+
+const char *ofi_straddr(char *buf, size_t *len,
+			uint32_t addr_format, const void *addr);
+
+/* Returns allocated address to caller.  Caller must free.  */
+int ofi_str_toaddr(const char *str, uint32_t *addr_format,
+		   void **addr, size_t *len);
+
+int ofi_addr_cmp(const struct fi_provider *prov, const struct sockaddr *sa1,
+		const struct sockaddr *sa2);
+/*
+ * Key Index
+ */
+
+/*
+ * The key_idx object and related functions can be used to generate unique keys
+ * from an index. The key and index would refer to an object defined by the user.
+ * A local endpoint can exchange this key with a remote endpoint in the first message.
+ * The remote endpoint would then use this key in subsequent messages to reference
+ * the correct object at the local endpoint.
+ */
+struct ofi_key_idx {
+	uint64_t seq_no;
+	/* The uniqueness of the generated key would depend on how many bits are
+	 * used for the index */
+	uint8_t idx_bits;
+};
+
+static inline void ofi_key_idx_init(struct ofi_key_idx *key_idx, uint8_t idx_bits)
+{
+	key_idx->seq_no = 0;
+	key_idx->idx_bits = idx_bits;
+}
+
+static inline uint64_t ofi_idx2key(struct ofi_key_idx *key_idx, uint64_t idx)
+{
+	return ((++(key_idx->seq_no)) << key_idx->idx_bits) | idx;
+}
+
+static inline uint64_t ofi_key2idx(struct ofi_key_idx *key_idx, uint64_t key)
+{
+	return key & ((1ULL << key_idx->idx_bits) - 1);
 }
 
 #ifdef __cplusplus
diff --git a/include/fi_abi.h b/include/fi_abi.h
index 0deedbb..556eb71 100644
--- a/include/fi_abi.h
+++ b/include/fi_abi.h
@@ -43,7 +43,75 @@ extern "C" {
 #endif
 
 
-#define DEFAULT_ABI "FABRIC_1.0"
+/*
+ * ABI version support definitions.
+ *
+ * CURRENT_ABI:
+ * This defines the current ABI version.  The ABI version is separate from
+ * the packaging or interface versions.  Whenever a change is
+ * added to the interfaces that breaks the ABI, this definition should be
+ * updated.  If you don't know if a change breaks the ABI, then you shouldn't
+ * be modifying the header files under include/rdma!  :P
+ *
+ * DEFAULT_SYMVER_PRE:
+ * This macro appends an underscore to a function name.  It should be used
+ * around any function that is exported from the library as the default call
+ * that applications invoke.
+ *
+ * CURRENT_SYMVER:
+ * This macro is placed after a function definition.  It should be used with
+ * any function that is exported by the library and was added as part of the
+ * current ABI (identified by CURRENT_ABI) version.  It results in the function
+ * being exported at the current ABI version.  This is the macro to use when
+ * exporting new functions.
+ *
+ * DEFAULT_SYMVER:
+ * This macro is similar to CURRENT_SYMVER, but is used to specify that a
+ * function, while the default interface that applications call, was added
+ * in a previous version of the ABI.  Any function that was not impacted by
+ * an ABI change should use this macro.  This often means converting functions
+ * marked as CURRENT_SYMVER to DEFAULT_SYMVER as part of the ABI update.
+ *
+ * COMPAT_SYMVER:
+ * The compatibility symbols are used to mark interfaces which were exported
+ * in previous ABI versions, but are no longer the default.  These functions
+ * are provided purely for backwards compatibility with existing (already
+ * compiled) applications.
+ *
+ * Example:
+ * ABI version 1.0 introduced functions foo() and bar().
+ * ABI version 1.1 modified the behavior for function foo().
+ * This scenario would result in the following definitions.
+ *
+ * CURRENT_ABI "MYLIB_1.1"
+ *
+ * This function is the main entry point for function bar.
+ * int DEFAULT_SYMVER_PRE(bar)(void)
+ * {
+ *    ...
+ * }
+ * DEFAULT_SYMVER(bar_, bar, "MYLIB_1.0");
+ *
+ * This function is the main entry point for function foo.
+ * int DEFAULT_SYMVER_PRE(foo)(void)
+ * {
+ *    ...
+ * }
+ * CURRENT_SYMVER(foo_, foo);
+ *
+ * This function is the old entry point for function foo, provided for
+ * backwards compatibility.
+ * int foo_1_0(void)
+ * {
+ *    ...
+ * }
+ * COMPAT_SYMVER(foo_1_0, foo, "MYLIB_1.0");
+ *
+ * By convention, the name of compatibility functions is the exported function
+ * name appended with the ABI version that it is compatible with.
+ */
+
+#define CURRENT_ABI "FABRIC_1.1"
 
 #if  HAVE_ALIAS_ATTRIBUTE == 1
 #define DEFAULT_SYMVER_PRE(a) a##_
@@ -54,22 +122,49 @@ extern "C" {
 /* symbol -> external symbol mappings */
 #if HAVE_SYMVER_SUPPORT
 
-#  define SYMVER(name, api, ver) \
-        asm(".symver " #name "," #api "@" #ver)
-#  define DEFAULT_SYMVER(name, api) \
-        asm(".symver " #name "," #api "@@" DEFAULT_ABI)
+#define COMPAT_SYMVER(name, api, ver) \
+	asm(".symver " #name "," #api "@" #ver)
+#define DEFAULT_SYMVER(name, api, ver) \
+	asm(".symver " #name "," #api "@@" #ver)
+#define CURRENT_SYMVER(name, api) \
+	asm(".symver " #name "," #api "@@" CURRENT_ABI)
+
 #else
-#  define SYMVER(Name, api, ver)
-#if  HAVE_ALIAS_ATTRIBUTE == 1
-#  define DEFAULT_SYMVER(name, api) \
-        extern typeof (name) api __attribute__((alias(#name)));
+
+#define COMPAT_SYMVER(name, api, ver)
+
+#if HAVE_ALIAS_ATTRIBUTE == 1
+#define DEFAULT_SYMVER(name, api, ver) \
+	extern typeof (name) api __attribute__((alias(#name)));
+#define CURRENT_SYMVER(name, api) \
+	extern typeof (name) api __attribute__((alias(#name)));
 #else
-#  define DEFAULT_SYMVER(name, api)
+#define DEFAULT_SYMVER(name, api, ver)
+#define CURRENT_SYMVER(name, api)
 #endif  /* HAVE_ALIAS_ATTRIBUTE == 1*/
 
 #endif /* HAVE_SYMVER_SUPPORT */
 
 
+/*
+ * The conversion from abi 1.0 requires being able to cast from a newer
+ * structure back to the older version.
+ */
+struct fi_cq_err_entry_1_0 {
+	void			*op_context;
+	uint64_t		flags;
+	size_t			len;
+	void			*buf;
+	uint64_t		data;
+	uint64_t		tag;
+	size_t			olen;
+	int			err;
+	int			prov_errno;
+	/* err_data is available until the next time the CQ is read */
+	void			*err_data;
+};
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/include/fi_atom.h b/include/fi_atom.h
index bd2a158..4ed4ade 100644
--- a/include/fi_atom.h
+++ b/include/fi_atom.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -53,150 +53,214 @@ extern "C" {
 
 
 #if ENABLE_DEBUG
+#define ATOMIC_DEF_INIT int is_initialized
 #define ATOMIC_IS_INITIALIZED(atomic) assert(atomic->is_initialized)
+#define ATOMIC_INIT(atomic) atomic->is_initialized = 1
 #else
+#define ATOMIC_DEF_INIT
 #define ATOMIC_IS_INITIALIZED(atomic)
+#define ATOMIC_INIT(atomic)
 #endif
 
 #ifdef HAVE_ATOMICS
-typedef struct {
-    atomic_int val;
-#if ENABLE_DEBUG
-    int is_initialized;
-#endif
-} atomic_t;
-
-static inline int atomic_inc(atomic_t *atomic)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	return atomic_fetch_add_explicit(&atomic->val, 1, memory_order_acq_rel) + 1;
-}
-
-static inline int atomic_dec(atomic_t *atomic)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	return atomic_fetch_sub_explicit(&atomic->val, 1, memory_order_acq_rel) - 1;
-}
-
-static inline int atomic_set(atomic_t *atomic, int value)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	atomic_store(&atomic->val, value);
-	return value;
-}
-
-static inline int atomic_get(atomic_t *atomic)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	return atomic_load(&atomic->val);
-}
-
-/* avoid using "atomic_init" so we don't conflict with symbol/macro from stdatomic.h */
-static inline void atomic_initialize(atomic_t *atomic, int value)
-{
-	atomic_init(&atomic->val, value);
-#if ENABLE_DEBUG
-	atomic->is_initialized = 1;
-#endif
-}
-
-static inline int atomic_add(atomic_t *atomic, int val)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	return atomic_fetch_add_explicit(&atomic->val,
-			val, memory_order_acq_rel) + 1;
-}
-
-static inline int atomic_sub(atomic_t *atomic, int val)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	return atomic_fetch_sub_explicit(&atomic->val,
-			val, memory_order_acq_rel) - 1;
-}
-
-#else
-
-typedef struct {
-	fastlock_t lock;
-	int val;
-#if ENABLE_DEBUG
-	int is_initialized;
-#endif
-} atomic_t;
-
-static inline int atomic_inc(atomic_t *atomic)
-{
-	int v;
-
-	ATOMIC_IS_INITIALIZED(atomic);
-	fastlock_acquire(&atomic->lock);
-	v = ++(atomic->val);
-	fastlock_release(&atomic->lock);
-	return v;
-}
-
-static inline int atomic_dec(atomic_t *atomic)
-{
-	int v;
-
-	ATOMIC_IS_INITIALIZED(atomic);
-	fastlock_acquire(&atomic->lock);
-	v = --(atomic->val);
-	fastlock_release(&atomic->lock);
-	return v;
-}
-
-static inline int atomic_set(atomic_t *atomic, int value)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	fastlock_acquire(&atomic->lock);
-	atomic->val = value;
-	fastlock_release(&atomic->lock);
-	return value;
-}
-
-/* avoid using "atomic_init" so we don't conflict with symbol/macro from stdatomic.h */
-static inline void atomic_initialize(atomic_t *atomic, int value)
-{
-	fastlock_init(&atomic->lock);
-	atomic->val = value;
-#if ENABLE_DEBUG
-	atomic->is_initialized = 1;
-#endif
-}
-
-static inline int atomic_get(atomic_t *atomic)
-{
-	ATOMIC_IS_INITIALIZED(atomic);
-	return atomic->val;
-}
-
-static inline int atomic_add(atomic_t *atomic, int val)
-{
-	int v;
-
-	ATOMIC_IS_INITIALIZED(atomic);
-	fastlock_acquire(&atomic->lock);
-	atomic->val += val;
-	v = atomic->val;
-	fastlock_release(&atomic->lock);
-	return v;
-}
-
-static inline int atomic_sub(atomic_t *atomic, int val)
-{
-	int v;
-
-	ATOMIC_IS_INITIALIZED(atomic);
-	fastlock_acquire(&atomic->lock);
-	atomic->val -= val;
-	v = atomic->val;
-	fastlock_release(&atomic->lock);
-	return v;
-}
-
+	typedef atomic_int_least32_t	ofi_atomic_int32_t;
+	typedef atomic_int_least64_t	ofi_atomic_int64_t;
+
+#define OFI_ATOMIC_DEFINE(radix)									\
+	typedef struct {										\
+		ofi_atomic_int##radix##_t val;								\
+		ATOMIC_DEF_INIT;									\
+	} ofi_atomic##radix##_t;									\
+													\
+	static inline											\
+	int##radix##_t ofi_atomic_inc##radix(ofi_atomic##radix##_t *atomic)				\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)atomic_fetch_add_explicit(&atomic->val, 1,			\
+								 memory_order_acq_rel) + 1;		\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_dec##radix(ofi_atomic##radix##_t *atomic)				\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)atomic_fetch_sub_explicit(&atomic->val, 1,			\
+								 memory_order_acq_rel) - 1;		\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_set##radix(ofi_atomic##radix##_t *atomic, int##radix##_t value)	\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		atomic_store(&atomic->val, value);							\
+		return (int##radix##_t)value;								\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_get##radix(ofi_atomic##radix##_t *atomic)				\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)atomic_load(&atomic->val);					\
+	}												\
+	static inline											\
+	void ofi_atomic_initialize##radix(ofi_atomic##radix##_t *atomic, int##radix##_t value)		\
+	{												\
+		atomic_init(&atomic->val, value);							\
+		ATOMIC_INIT(atomic);									\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_add##radix(ofi_atomic##radix##_t *atomic, int##radix##_t val)		\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)atomic_fetch_add_explicit(&atomic->val, val,			\
+								 memory_order_acq_rel) + val;		\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_sub##radix(ofi_atomic##radix##_t *atomic, int##radix##_t val)		\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)atomic_fetch_sub_explicit(&atomic->val, val,			\
+								 memory_order_acq_rel) - val;		\
+	}
+
+#elif defined HAVE_BUILTIN_ATOMICS
+#  if ENABLE_DEBUG
+#    define ATOMIC_T(radix)		\
+	struct {			\
+		int##radix##_t val;	\
+		ATOMIC_DEF_INIT;	\
+	}
+
+#    define ofi_atomic_ptr(atomic) (&((atomic)->val))
+#  else
+#    define ATOMIC_T(radix) int##radix##_t
+#    define ofi_atomic_ptr(atomic) (atomic)
+#  endif
+
+#define OFI_ATOMIC_DEFINE(radix)									\
+	typedef ATOMIC_T(radix) ofi_atomic##radix##_t;							\
+													\
+	static inline											\
+	int##radix##_t ofi_atomic_add##radix(ofi_atomic##radix##_t *atomic, int##radix##_t val)		\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)ofi_atomic_add_and_fetch(radix, ofi_atomic_ptr(atomic), val);	\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_sub##radix(ofi_atomic##radix##_t *atomic, int##radix##_t val)		\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return (int##radix##_t)ofi_atomic_sub_and_fetch(radix, ofi_atomic_ptr(atomic), val);	\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_inc##radix(ofi_atomic##radix##_t *atomic)				\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return ofi_atomic_add##radix(atomic, 1);						\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_dec##radix(ofi_atomic##radix##_t *atomic)				\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return ofi_atomic_sub##radix(atomic, 1);						\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_set##radix(ofi_atomic##radix##_t *atomic, int##radix##_t value)	\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		*(ofi_atomic_ptr(atomic)) = value;							\
+		return value;										\
+	}												\
+	static inline											\
+	int##radix##_t ofi_atomic_get##radix(ofi_atomic##radix##_t *atomic)				\
+	{												\
+		ATOMIC_IS_INITIALIZED(atomic);								\
+		return *ofi_atomic_ptr(atomic);								\
+	}												\
+	static inline											\
+	void ofi_atomic_initialize##radix(ofi_atomic##radix##_t *atomic, int##radix##_t value)		\
+	{												\
+		*(ofi_atomic_ptr(atomic)) = value;							\
+		ATOMIC_INIT(atomic);									\
+	}
+	
+#else /* HAVE_ATOMICS */
+
+#define OFI_ATOMIC_DEFINE(radix)								\
+	typedef	struct {									\
+		fastlock_t lock;								\
+		int##radix##_t val;								\
+		ATOMIC_DEF_INIT;								\
+	} ofi_atomic##radix##_t;								\
+												\
+	static inline										\
+	int##radix##_t ofi_atomic_inc##radix(ofi_atomic##radix##_t *atomic)			\
+	{											\
+		int##radix##_t v = 0;								\
+		ATOMIC_IS_INITIALIZED(atomic);							\
+		fastlock_acquire(&atomic->lock);						\
+		v = ++(atomic->val);								\
+		fastlock_release(&atomic->lock);						\
+		return v;									\
+	}											\
+	static inline										\
+	int##radix##_t ofi_atomic_dec##radix(ofi_atomic##radix##_t *atomic)			\
+	{											\
+		int##radix##_t v = 0;								\
+		ATOMIC_IS_INITIALIZED(atomic);							\
+		fastlock_acquire(&atomic->lock);						\
+		v = --(atomic->val);								\
+		fastlock_release(&atomic->lock);						\
+		return v;									\
+	}											\
+	static inline										\
+	int##radix##_t ofi_atomic_set##radix(ofi_atomic##radix##_t *atomic,			\
+					     int##radix##_t value)				\
+	{											\
+		ATOMIC_IS_INITIALIZED(atomic);							\
+		fastlock_acquire(&atomic->lock);						\
+		atomic->val = value;								\
+		fastlock_release(&atomic->lock);						\
+		return value;									\
+	}											\
+	static inline int##radix##_t ofi_atomic_get##radix(ofi_atomic##radix##_t *atomic)	\
+	{											\
+		ATOMIC_IS_INITIALIZED(atomic);							\
+		return atomic->val;								\
+	}											\
+	static inline										\
+	void ofi_atomic_initialize##radix(ofi_atomic##radix##_t *atomic,			\
+					  int##radix##_t value)					\
+	{											\
+		fastlock_init(&atomic->lock);							\
+		atomic->val = value;								\
+		ATOMIC_INIT(atomic);								\
+	}											\
+	static inline										\
+	int##radix##_t ofi_atomic_add##radix(ofi_atomic##radix##_t *atomic,			\
+					     int##radix##_t val)				\
+	{											\
+		int##radix##_t v;								\
+		ATOMIC_IS_INITIALIZED(atomic);							\
+		fastlock_acquire(&atomic->lock);						\
+		atomic->val += val;								\
+		v = atomic->val;								\
+		fastlock_release(&atomic->lock);						\
+		return v;									\
+	}											\
+	static inline										\
+	int##radix##_t ofi_atomic_sub##radix(ofi_atomic##radix##_t *atomic,			\
+					     int##radix##_t val)				\
+	{											\
+		int##radix##_t v;								\
+		ATOMIC_IS_INITIALIZED(atomic);							\
+		fastlock_acquire(&atomic->lock);						\
+		atomic->val -= val;								\
+		v = atomic->val;								\
+		fastlock_release(&atomic->lock);						\
+		return v;									\
+	}
 #endif // HAVE_ATOMICS
 
+OFI_ATOMIC_DEFINE(32)
+OFI_ATOMIC_DEFINE(64)
 
 #ifdef __cplusplus
 }
diff --git a/include/fi_enosys.h b/include/fi_enosys.h
index e8dc327..75a189b 100644
--- a/include/fi_enosys.h
+++ b/include/fi_enosys.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c); 2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2014-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -162,6 +162,7 @@ static struct fi_ops_cm X = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 */
 int fi_no_setname(fid_t fid, void *addr, size_t addrlen);
@@ -174,6 +175,8 @@ int fi_no_accept(struct fid_ep *ep, const void *param, size_t paramlen);
 int fi_no_reject(struct fid_pep *pep, fid_t handle,
 		const void *param, size_t paramlen);
 int fi_no_shutdown(struct fid_ep *ep, uint64_t flags);
+int fi_no_join(struct fid_ep *ep, const void *addr, uint64_t flags,
+		struct fid_mc **mc, void *context);
 
 /*
 static struct fi_ops_domain X = {
@@ -186,6 +189,7 @@ static struct fi_ops_domain X = {
 	.poll_open = fi_no_poll_open,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = fi_no_query_atomic,
 };
 */
 int fi_no_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
@@ -204,6 +208,9 @@ int fi_no_stx_context(struct fid_domain *domain, struct fi_tx_attr *attr,
 		struct fid_stx **stx, void *context);
 int fi_no_srx_context(struct fid_domain *domain, struct fi_rx_attr *attr,
 		struct fid_ep **rx_ep, void *context);
+int fi_no_query_atomic(struct fid_domain *domain, enum fi_datatype datatype,
+		enum fi_op op, struct fi_atomic_attr *attr, uint64_t flags);
+
 
 /*
 static struct fi_ops_mr X = {
diff --git a/include/fi_indexer.h b/include/fi_indexer.h
index 24c85c5..e67587a 100644
--- a/include/fi_indexer.h
+++ b/include/fi_indexer.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2011 Intel Corporation.  All rights reserved.
+ * Copyright (c) 2016 Cisco Systems, Inc .  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -44,35 +45,45 @@
  * indexer by setting free_list and size to 0.
  */
 
-union idx_entry {
+union ofi_idx_entry {
 	void *item;
 	int   next;
 };
 
-#define IDX_INDEX_BITS 16
-#define IDX_ENTRY_BITS 10
-#define IDX_ENTRY_SIZE (1 << IDX_ENTRY_BITS)
-#define IDX_ARRAY_SIZE (1 << (IDX_INDEX_BITS - IDX_ENTRY_BITS))
-#define IDX_MAX_INDEX  ((1 << IDX_INDEX_BITS) - 1)
+#define OFI_IDX_INDEX_BITS 16
+#define OFI_IDX_ENTRY_BITS 10
+#define OFI_IDX_ENTRY_SIZE (1 << OFI_IDX_ENTRY_BITS)
+#define OFI_IDX_ARRAY_SIZE (1 << (OFI_IDX_INDEX_BITS - OFI_IDX_ENTRY_BITS))
+#define OFI_IDX_MAX_INDEX  ((1 << OFI_IDX_INDEX_BITS) - 1)
 
 struct indexer
 {
-	union idx_entry *array[IDX_ARRAY_SIZE];
+	union ofi_idx_entry *array[OFI_IDX_ARRAY_SIZE];
 	int		 free_list;
-	int		 size;
+	int		 size;	/* Array size (used): [0, OFI_IDX_ARRAY_SIZE) */
 };
 
-#define idx_array_index(index) (index >> IDX_ENTRY_BITS)
-#define idx_entry_index(index) (index & (IDX_ENTRY_SIZE - 1))
+#define ofi_idx_array_index(index) (index >> OFI_IDX_ENTRY_BITS)
+#define ofi_idx_entry_index(index) (index & (OFI_IDX_ENTRY_SIZE - 1))
 
-int idx_insert(struct indexer *idx, void *item);
-void *idx_remove(struct indexer *idx, int index);
-void idx_replace(struct indexer *idx, int index, void *item);
-void idx_reset(struct indexer *idx);
+int ofi_idx_insert(struct indexer *idx, void *item);
+void *ofi_idx_remove(struct indexer *idx, int index);
+void ofi_idx_replace(struct indexer *idx, int index, void *item);
+void ofi_idx_reset(struct indexer *idx);
 
-static inline void *idx_at(struct indexer *idx, int index)
+static inline int ofi_idx_is_valid(struct indexer *idx, int index)
 {
-	return (idx->array[idx_array_index(index)] + idx_entry_index(index))->item;
+	return (index > 0) && (index < idx->size * OFI_IDX_ENTRY_SIZE);
+}
+
+static inline void *ofi_idx_at(struct indexer *idx, int index)
+{
+	return (idx->array[ofi_idx_array_index(index)] + ofi_idx_entry_index(index))->item;
+}
+
+static inline void *ofi_idx_lookup(struct indexer *idx, int index)
+{
+	return ofi_idx_is_valid(idx, index) ? ofi_idx_at(idx, index) : NULL;
 }
 
 /*
@@ -83,25 +94,25 @@ static inline void *idx_at(struct indexer *idx, int index)
 
 struct index_map
 {
-	void **array[IDX_ARRAY_SIZE];
-	int count[IDX_ARRAY_SIZE];
+	void **array[OFI_IDX_ARRAY_SIZE];
+	int count[OFI_IDX_ARRAY_SIZE];
 };
 
-int idm_set(struct index_map *idm, int index, void *item);
-void *idm_clear(struct index_map *idm, int index);
-void idm_reset(struct index_map *idm);
+int ofi_idm_set(struct index_map *idm, int index, void *item);
+void *ofi_idm_clear(struct index_map *idm, int index);
+void ofi_idm_reset(struct index_map *idm);
 
-static inline void *idm_at(struct index_map *idm, int index)
+static inline void *ofi_idm_at(struct index_map *idm, int index)
 {
 	void **entry;
-	entry = idm->array[idx_array_index(index)];
-	return entry[idx_entry_index(index)];
+	entry = idm->array[ofi_idx_array_index(index)];
+	return entry[ofi_idx_entry_index(index)];
 }
 
-static inline void *idm_lookup(struct index_map *idm, int index)
+static inline void *ofi_idm_lookup(struct index_map *idm, int index)
 {
-	return ((index <= IDX_MAX_INDEX) && idm->array[idx_array_index(index)]) ?
-		idm_at(idm, index) : NULL;
+	return ((index <= OFI_IDX_MAX_INDEX) && idm->array[ofi_idx_array_index(index)]) ?
+		ofi_idm_at(idm, index) : NULL;
 }
 
 #endif /* INDEXER_H */
diff --git a/prov/util/src/util_fabric.c b/include/fi_iov.h
similarity index 53%
copy from prov/util/src/util_fabric.c
copy to include/fi_iov.h
index 6dfe3d4..aa27b05 100644
--- a/prov/util/src/util_fabric.c
+++ b/include/fi_iov.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2016 Intel Corporation.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -28,52 +28,60 @@
  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
+ *
  */
 
+#if !defined(IOV_H)
+#define IOV_H
+
+#include "config.h"
+
 #include <stdlib.h>
 #include <string.h>
+#include <sys/uio.h>
+#include <inttypes.h>
+#include <rdma/fabric.h>
 
-#include <fi_enosys.h>
-#include <fi_util.h>
 
-int ofi_fabric_close(struct util_fabric *fabric)
+static inline size_t ofi_total_iov_len(const struct iovec *iov, size_t iov_count)
 {
-	if (atomic_get(&fabric->ref))
-		return -FI_EBUSY;
+	size_t i, len = 0;
+	for (i = 0; i < iov_count; i++)
+		len += iov[i].iov_len;
+	return len;
+}
 
-	fi_fabric_remove(fabric);
-	fastlock_destroy(&fabric->lock);
-	return 0;
+static inline size_t ofi_total_ioc_cnt(const struct fi_ioc *ioc, size_t ioc_count)
+{
+	size_t i, cnt = 0;
+	for (i = 0; i < ioc_count; i++)
+		cnt += ioc[i].count;
+	return cnt;
 }
 
-static void util_fabric_init(struct util_fabric *fabric, const char *name)
+#define OFI_COPY_IOV_TO_BUF 0
+#define OFI_COPY_BUF_TO_IOV 1
+
+uint64_t ofi_copy_iov_buf(const struct iovec *iov, size_t iov_count,
+			uint64_t iov_offset, void *buf, uint64_t bufsize,
+			int dir);
+
+static inline uint64_t
+ofi_copy_to_iov(const struct iovec *iov, size_t iov_count,
+		uint64_t iov_offset, void *buf, uint64_t bufsize)
 {
-	atomic_initialize(&fabric->ref, 0);
-	dlist_init(&fabric->domain_list);
-	fastlock_init(&fabric->lock);
-	fabric->name = name;
+	return ofi_copy_iov_buf(iov, iov_count, iov_offset, buf, bufsize,
+				OFI_COPY_BUF_TO_IOV);
 }
 
-int ofi_fabric_init(const struct fi_provider *prov,
-		   struct fi_fabric_attr *prov_attr,
-		   struct fi_fabric_attr *user_attr,
-		   struct util_fabric *fabric, void *context,
-		   enum fi_match_type type)
+static inline uint64_t
+ofi_copy_from_iov(void *buf, uint64_t bufsize,
+		  const struct iovec *iov, size_t iov_count, uint64_t iov_offset)
 {
-	int ret;
+	return ofi_copy_iov_buf(iov, iov_count, iov_offset, buf, bufsize,
+				OFI_COPY_IOV_TO_BUF);
+}
 
-	ret = fi_check_fabric_attr(prov, prov_attr, user_attr, type);
-	if (ret)
-		return ret;
 
-	fabric->prov = prov;
-	util_fabric_init(fabric, prov_attr->name);
+#endif /* IOV_H */
 
-	fabric->fabric_fid.fid.fclass = FI_CLASS_FABRIC;
-	fabric->fabric_fid.fid.context = context;
-	/*
-	 * fabric ops set by provider
-	 */
-	fi_fabric_insert(fabric);
-	return 0;
-}
diff --git a/include/fi_list.h b/include/fi_list.h
index 08be1e8..dc70274 100644
--- a/include/fi_list.h
+++ b/include/fi_list.h
@@ -89,9 +89,24 @@ static inline void dlist_remove(struct dlist_entry *item)
 	item->next->prev = item->prev;
 }
 
-#define dlist_foreach(head, item) \
+#define dlist_pop_front(head, type, container, member)			\
+	do {								\
+		container = container_of((head)->next, type, member);	\
+		dlist_remove((head)->next);				\
+	} while (0)
+
+#define dlist_foreach(head, item) 						\
 	for ((item) = (head)->next; (item) != (head); (item) = (item)->next)
 
+#define dlist_foreach_container(head, type, container, member)			\
+	for (container = container_of((head)->next, type, member);		\
+		&(container->member) != (head);					\
+		container = container_of(container->member.next, type, member))
+
+#define dlist_foreach_safe(head, item, tmp) \
+    for ((item) = (head)->next, (tmp) = (item)->next; (item) != (head); \
+              (item) = (tmp), (tmp) = (item)->next)
+
 typedef int dlist_func_t(struct dlist_entry *item, const void *arg);
 
 static inline struct dlist_entry *
@@ -180,10 +195,11 @@ static inline struct slist_entry *slist_remove_head(struct slist *list)
 	return item;
 }
 
-#define slist_foreach(list, item, prev)\
-	for ((prev) = NULL, (item) = (list)->head; (item); \
+#define slist_foreach(list, item, prev)				\
+	for ((prev) = NULL, (item) = (list)->head; (item); 	\
 			(prev) = (item), (item) = (item)->next)
 
+
 typedef int slist_func_t(struct slist_entry *item, const void *arg);
 
 static inline struct slist_entry *
@@ -199,6 +215,18 @@ slist_find_first_match(const struct slist *list, slist_func_t *match,
 	return NULL;
 }
 
+static inline void slist_remove(struct slist *list,
+		struct slist_entry *item, struct slist_entry *prev)
+{
+	if (prev)
+		prev->next = item->next;
+	else
+		list->head = item->next;
+
+	if (!item->next)
+		list->tail = prev;
+}
+
 static inline struct slist_entry *
 slist_remove_first_match(struct slist *list, slist_func_t *match, const void *arg)
 {
@@ -206,14 +234,7 @@ slist_remove_first_match(struct slist *list, slist_func_t *match, const void *ar
 
 	slist_foreach(list, item, prev) {
 		if (match(item, arg)) {
-			if (prev)
-				prev->next = item->next;
-			else
-				list->head = item->next;
-
-			if (!item->next)
-				list->tail = prev;
-
+			slist_remove(list, item, prev);
 			return item;
 		}
 	}
diff --git a/include/fi_lock.h b/include/fi_lock.h
index 637ef63..832b9fe 100644
--- a/include/fi_lock.h
+++ b/include/fi_lock.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -47,7 +48,7 @@ extern "C" {
 #endif
 
 
-int fi_wait_cond(pthread_cond_t *cond, pthread_mutex_t *mut, int timeout);
+int fi_wait_cond(pthread_cond_t *cond, pthread_mutex_t *mut, int timeout_ms);
 
 
 #if PT_LOCK_SPIN == 1
diff --git a/include/fi_mem.h b/include/fi_mem.h
index 67930cc..011a0bd 100644
--- a/include/fi_mem.h
+++ b/include/fi_mem.h
@@ -99,7 +99,7 @@ struct name {							\
 								\
 static inline void name ## _init(struct name *fs, size_t size)	\
 {								\
-	int i;							\
+	ssize_t i;						\
 	assert(size == roundup_power_of_two(size));		\
 	assert(sizeof(fs->buf[0]) >= sizeof(void *));		\
 	fs->size = size;					\
@@ -121,7 +121,7 @@ static inline struct name * name ## _create(size_t size)	\
 static inline int name ## _index(struct name *fs,		\
 		entrytype *entry)				\
 {								\
-	return entry - fs->buf;					\
+	return (int)(entry - fs->buf);				\
 }								\
 								\
 static inline void name ## _free(struct name *fs)		\
@@ -248,6 +248,27 @@ static inline void *util_buf_alloc_ex(struct util_buf_pool *pool, void **context
 	return buf;
 }
 
+#if ENABLE_DEBUG
+static inline int util_buf_use_ftr(struct util_buf_pool *pool)
+{
+	OFI_UNUSED(pool);
+	return 1;
+}
+#else
+static inline int util_buf_use_ftr(struct util_buf_pool *pool)
+{
+	return (pool->alloc_hndlr || pool->free_hndlr) ? 1 : 0;
+}
+#endif
+
+static inline void *util_buf_get_ctx(struct util_buf_pool *pool, void *buf)
+{
+	struct util_buf_footer *buf_ftr;
+	assert(util_buf_use_ftr(pool));
+	buf_ftr = (struct util_buf_footer *) ((char *) buf + pool->data_sz);
+	return buf_ftr->region->context;
+}
+
 void util_buf_pool_destroy(struct util_buf_pool *pool);
 
 #endif /* _FI_MEM_H_ */
diff --git a/include/fi_osd.h b/include/fi_osd.h
index cc2db36..225ea5f 100644
--- a/include/fi_osd.h
+++ b/include/fi_osd.h
@@ -33,6 +33,28 @@
 #ifndef _FI_OSD_H_
 #define _FI_OSD_H_
 
+
+/* We use macros to create atomic and complex function definitions,
+ * and we can't have spaces in function names */
+typedef long double long_double;
+
+
+/* Complex data type support:
+ *
+ * Complex data types are operating system.  For portability, each osd.h file
+ * must define the following datatypes and operations:
+ *
+ * Datatype:
+ * ofi_complex_XXX
+ *
+ * Operations:
+ * ofi_complex_eq_XXX, ofi_complex_sum_XXX, ofi_complex_prod_XXX,
+ * ofi_complex_land_XXX, ofi_complex_lor_XXX, ofi_complex_lxor_XXX
+ *
+ * Where XXX = float, double, or long_double
+ */
+
+
 #ifdef __APPLE__
 #include <osx/osd.h>
 #include <unix/osd.h>
@@ -46,4 +68,12 @@
 #include <unix/osd.h>
 #endif
 
+#ifdef __GNUC__
+#define OFI_LIKELY(x)	__builtin_expect((x), 1)
+#define OFI_UNLIKELY(x)	__builtin_expect((x), 0)
+#else
+#define OFI_LIKELY(x)	(x)
+#define OFI_UNLIKELY(x)	(x)
+#endif
+
 #endif /* _FI_OSD_H_ */
diff --git a/include/fi_proto.h b/include/fi_proto.h
index f569468..c76fa7c 100644
--- a/include/fi_proto.h
+++ b/include/fi_proto.h
@@ -76,16 +76,20 @@ enum {
  * conn_id: Communication identifier.  Conn_id values are exchanged between
  *     peer endpoints as part of communication setup.  This field is valid
  *     as part of the first message in any data transfer.
- * msg_id: Unique number identifying all segments of a message
+ * msg_id: This is the sender's identifier for a message.
+ *     Unique number identifying all segments of a message
  *     Message id can be formed using an equation similar to:
  *     (seq_no++ << tx size) | tx_key
  * conn_data: Connection specific data.  This may be set to the index
  *     of the transmit endpoint's address in its local AV, which may
  *     be used as a hint at the Rx side to locate the Tx EP address in
- *     its AV.
- * rx_key: Key returned by the Rx side, that the Tx side includes in
- *     subsequent packets.  This field is used for rendezvous and
- *     segmentation and reassembly protocols.
+ *     its AV.  The assumption is that all addresses were inserted into
+ *     all AVs across the fabric using a copied array.  (This is an
+ *     optimization hint only; the peer validates the actual entry.)
+ * rx_key: This is the receiver's identifier for a message (receive side
+ *     equivalent of msg_id).  Key returned by the Rx side, that the
+ *     Tx side includes in subsequent packets.  This field is used for
+ *     rendezvous and segmentation and reassembly protocols.
  *     The rx_key may be formed similar to message_id.
  */
 struct ofi_ctrl_hdr {
diff --git a/include/fi_rbuf.h b/include/fi_rbuf.h
index a4b8868..b986920 100644
--- a/include/fi_rbuf.h
+++ b/include/fi_rbuf.h
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2014 Intel Corporation.  All rights reserved.
+ * Copyright (c) 2016 Cisco Systems, Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -31,8 +32,8 @@
  *
  */
 
-#if !defined(RBUF_H)
-#define RBUF_H
+#if !defined(FI_RBUF_H)
+#define FI_RBUF_H
 
 #include "config.h"
 
@@ -50,7 +51,7 @@
 /*
  * Circular queue/array template
  */
-#define DECLARE_CIRQUE(entrytype, name)				\
+#define OFI_DECLARE_CIRQUE(entrytype, name)                     \
 struct name {							\
 	size_t		size;					\
 	size_t		size_mask;				\
@@ -83,25 +84,25 @@ static inline void name ## _free(struct name *cq)		\
 	free(cq);						\
 }
 
-#define cirque_isempty(cq)	((cq)->wcnt == (cq)->rcnt)
-#define cirque_usedcnt(cq)	((cq)->wcnt - (cq)->rcnt)
-#define cirque_freecnt(cq)	((cq)->size - cirque_usedcnt(cq))
-#define cirque_isfull(cq)	(cirque_freecnt(cq) <= 0)
+#define ofi_cirque_isempty(cq)		((cq)->wcnt == (cq)->rcnt)
+#define ofi_cirque_usedcnt(cq)		((cq)->wcnt - (cq)->rcnt)
+#define ofi_cirque_freecnt(cq)		((cq)->size - ofi_cirque_usedcnt(cq))
+#define ofi_cirque_isfull(cq)		(ofi_cirque_freecnt(cq) <= 0)
 
-#define cirque_rindex(cq)	((cq)->rcnt & (cq)->size_mask)
-#define cirque_windex(cq)	((cq)->wcnt & (cq)->size_mask)
-#define cirque_head(cq)		(&(cq)->buf[cirque_rindex(cq)])
-#define cirque_tail(cq)		(&(cq)->buf[cirque_windex(cq)])
-#define cirque_insert(cq, x)	(cq)->buf[(cq)->wcnt++ & (cq)->size_mask] = x
-#define cirque_remove(cq)	(&(cq)->buf[(cq)->rcnt++ & (cq)->size_mask])
-#define cirque_discard(cq)	((cq)->rcnt++)
-#define cirque_commit(cq)	((cq)->wcnt++)
+#define ofi_cirque_rindex(cq)		((cq)->rcnt & (cq)->size_mask)
+#define ofi_cirque_windex(cq)		((cq)->wcnt & (cq)->size_mask)
+#define ofi_cirque_head(cq)		(&(cq)->buf[ofi_cirque_rindex(cq)])
+#define ofi_cirque_tail(cq)		(&(cq)->buf[ofi_cirque_windex(cq)])
+#define ofi_cirque_insert(cq, x)	(cq)->buf[(cq)->wcnt++ & (cq)->size_mask] = x
+#define ofi_cirque_remove(cq)		(&(cq)->buf[(cq)->rcnt++ & (cq)->size_mask])
+#define ofi_cirque_discard(cq)		((cq)->rcnt++)
+#define ofi_cirque_commit(cq)		((cq)->wcnt++)
 
 
 /*
  * Simple ring buffer
  */
-struct ringbuf {
+struct ofi_ringbuf {
 	size_t		size;
 	size_t		size_mask;
 	size_t		rcnt;
@@ -110,7 +111,7 @@ struct ringbuf {
 	void		*buf;
 };
 
-static inline int rbinit(struct ringbuf *rb, size_t size)
+static inline int ofi_rbinit(struct ofi_ringbuf *rb, size_t size)
 {
 	rb->size = roundup_power_of_two(size);
 	rb->size_mask = rb->size - 1;
@@ -123,32 +124,39 @@ static inline int rbinit(struct ringbuf *rb, size_t size)
 	return 0;
 }
 
-static inline void rbfree(struct ringbuf *rb)
+static inline void ofi_rbreset(struct ofi_ringbuf *rb)
+{
+	rb->rcnt = 0;
+	rb->wcnt = 0;
+	rb->wpos = 0;
+}
+
+static inline void ofi_rbfree(struct ofi_ringbuf *rb)
 {
 	free(rb->buf);
 }
 
-static inline int rbfull(struct ringbuf *rb)
+static inline int ofi_rbfull(struct ofi_ringbuf *rb)
 {
 	return rb->wcnt - rb->rcnt >= rb->size;
 }
 
-static inline int rbempty(struct ringbuf *rb)
+static inline int ofi_rbempty(struct ofi_ringbuf *rb)
 {
 	return rb->wcnt == rb->rcnt;
 }
 
-static inline size_t rbused(struct ringbuf *rb)
+static inline size_t ofi_rbused(struct ofi_ringbuf *rb)
 {
 	return rb->wcnt - rb->rcnt;
 }
 
-static inline size_t rbavail(struct ringbuf *rb)
+static inline size_t ofi_rbavail(struct ofi_ringbuf *rb)
 {
-	return rb->size - rbused(rb);
+	return rb->size - ofi_rbused(rb);
 }
 
-static inline void rbwrite(struct ringbuf *rb, const void *buf, size_t len)
+static inline void ofi_rbwrite(struct ofi_ringbuf *rb, const void *buf, size_t len)
 {
 	size_t endlen;
 
@@ -162,17 +170,17 @@ static inline void rbwrite(struct ringbuf *rb, const void *buf, size_t len)
 	rb->wpos += len;
 }
 
-static inline void rbcommit(struct ringbuf *rb)
+static inline void ofi_rbcommit(struct ofi_ringbuf *rb)
 {
 	rb->wcnt = rb->wpos;
 }
 
-static inline void rbabort(struct ringbuf *rb)
+static inline void ofi_rbabort(struct ofi_ringbuf *rb)
 {
 	rb->wpos = rb->wcnt;
 }
 
-static inline void rbpeek(struct ringbuf *rb, void *buf, size_t len)
+static inline void ofi_rbpeek(struct ofi_ringbuf *rb, void *buf, size_t len)
 {
 	size_t endlen;
 
@@ -185,15 +193,15 @@ static inline void rbpeek(struct ringbuf *rb, void *buf, size_t len)
 	}
 }
 
-static inline void rbread(struct ringbuf *rb, void *buf, size_t len)
+static inline void ofi_rbread(struct ofi_ringbuf *rb, void *buf, size_t len)
 {
-	rbpeek(rb, buf, len);
+	ofi_rbpeek(rb, buf, len);
 	rb->rcnt += len;
 }
 
-static inline size_t rbdiscard(struct ringbuf *rb, size_t len)
+static inline size_t ofi_rbdiscard(struct ofi_ringbuf *rb, size_t len)
 {
-	size_t used_len = MIN(rbused(rb), len);
+	size_t used_len = MIN(ofi_rbused(rb), len);
 	rb->rcnt += used_len;
 	return used_len;
 }
@@ -202,24 +210,24 @@ static inline size_t rbdiscard(struct ringbuf *rb, size_t len)
  * Ring buffer with blocking read support using an fd
  */
 enum {
-	RB_READ_FD,
-	RB_WRITE_FD
+	OFI_RB_READ_FD,
+	OFI_RB_WRITE_FD
 };
 
-struct ringbuffd {
-	struct ringbuf	rb;
-	int		fdrcnt;
-	int		fdwcnt;
-	int		fd[2];
+struct ofi_ringbuffd {
+	struct ofi_ringbuf	rb;
+	int			fdrcnt;
+	int			fdwcnt;
+	int			fd[2];
 };
 
-static inline int rbfdinit(struct ringbuffd *rbfd, size_t size)
+static inline int ofi_rbfdinit(struct ofi_ringbuffd *rbfd, size_t size)
 {
 	int ret;
 
 	rbfd->fdrcnt = 0;
 	rbfd->fdwcnt = 0;
-	ret = rbinit(&rbfd->rb, size);
+	ret = ofi_rbinit(&rbfd->rb, size);
 	if (ret)
 		return ret;
 
@@ -227,7 +235,7 @@ static inline int rbfdinit(struct ringbuffd *rbfd, size_t size)
 	if (ret < 0)
 		goto err1;
 
-	ret = fi_fd_nonblock(rbfd->fd[RB_READ_FD]);
+	ret = fi_fd_nonblock(rbfd->fd[OFI_RB_READ_FD]);
 	if (ret)
 		goto err2;
 
@@ -237,109 +245,109 @@ err2:
 	ofi_close_socket(rbfd->fd[0]);
 	ofi_close_socket(rbfd->fd[1]);
 err1:
-	rbfree(&rbfd->rb);
+	ofi_rbfree(&rbfd->rb);
 	return -errno;
 }
 
-static inline void rbfdfree(struct ringbuffd *rbfd)
+static inline void ofi_rbfdfree(struct ofi_ringbuffd *rbfd)
 {
-	rbfree(&rbfd->rb);
+	ofi_rbfree(&rbfd->rb);
 	ofi_close_socket(rbfd->fd[0]);
 	ofi_close_socket(rbfd->fd[1]);
 }
 
-static inline int rbfdfull(struct ringbuffd *rbfd)
+static inline int ofi_rbfdfull(struct ofi_ringbuffd *rbfd)
 {
-	return rbfull(&rbfd->rb);
+	return ofi_rbfull(&rbfd->rb);
 }
 
-static inline int rbfdempty(struct ringbuffd *rbfd)
+static inline int ofi_rbfdempty(struct ofi_ringbuffd *rbfd)
 {
-	return rbempty(&rbfd->rb);
+	return ofi_rbempty(&rbfd->rb);
 }
 
-static inline size_t rbfdused(struct ringbuffd *rbfd)
+static inline size_t ofi_rbfdused(struct ofi_ringbuffd *rbfd)
 {
-	return rbused(&rbfd->rb);
+	return ofi_rbused(&rbfd->rb);
 }
 
-static inline size_t rbfdavail(struct ringbuffd *rbfd)
+static inline size_t ofi_rbfdavail(struct ofi_ringbuffd *rbfd)
 {
-	return rbavail(&rbfd->rb);
+	return ofi_rbavail(&rbfd->rb);
 }
 
-static inline void rbfdsignal(struct ringbuffd *rbfd)
+static inline void ofi_rbfdsignal(struct ofi_ringbuffd *rbfd)
 {
 	char c = 0;
 	if (rbfd->fdwcnt == rbfd->fdrcnt) {
-		if (ofi_write_socket(rbfd->fd[RB_WRITE_FD], &c, sizeof c) == sizeof c)
+		if (ofi_write_socket(rbfd->fd[OFI_RB_WRITE_FD], &c, sizeof c) == sizeof c)
 			rbfd->fdwcnt++;
 	}
 }
 
-static inline void rbfdreset(struct ringbuffd *rbfd)
+static inline void ofi_rbfdreset(struct ofi_ringbuffd *rbfd)
 {
 	char c;
 
-	if (rbfdempty(rbfd) && (rbfd->fdrcnt != rbfd->fdwcnt)) {
-		if (ofi_read_socket(rbfd->fd[RB_READ_FD], &c, sizeof c) == sizeof c)
+	if (ofi_rbfdempty(rbfd) && (rbfd->fdrcnt != rbfd->fdwcnt)) {
+		if (ofi_read_socket(rbfd->fd[OFI_RB_READ_FD], &c, sizeof c) == sizeof c)
 			rbfd->fdrcnt++;
 	}
 }
 
-static inline void rbfdwrite(struct ringbuffd *rbfd, const void *buf, size_t len)
+static inline void ofi_rbfdwrite(struct ofi_ringbuffd *rbfd, const void *buf, size_t len)
 {
-	rbwrite(&rbfd->rb, buf, len);
+	ofi_rbwrite(&rbfd->rb, buf, len);
 }
 
-static inline void rbfdcommit(struct ringbuffd *rbfd)
+static inline void ofi_rbfdcommit(struct ofi_ringbuffd *rbfd)
 {
-	rbcommit(&rbfd->rb);
-	rbfdsignal(rbfd);
+	ofi_rbcommit(&rbfd->rb);
+	ofi_rbfdsignal(rbfd);
 }
 
-static inline void rbfdabort(struct ringbuffd *rbfd)
+static inline void ofi_rbfdabort(struct ofi_ringbuffd *rbfd)
 {
-	rbabort(&rbfd->rb);
+	ofi_rbabort(&rbfd->rb);
 }
 
-static inline void rbfdpeek(struct ringbuffd *rbfd, void *buf, size_t len)
+static inline void ofi_rbfdpeek(struct ofi_ringbuffd *rbfd, void *buf, size_t len)
 {
-	rbpeek(&rbfd->rb, buf, len);
+	ofi_rbpeek(&rbfd->rb, buf, len);
 }
 
-static inline void rbfdread(struct ringbuffd *rbfd, void *buf, size_t len)
+static inline void ofi_rbfdread(struct ofi_ringbuffd *rbfd, void *buf, size_t len)
 {
-	rbread(&rbfd->rb, buf, len);
-	rbfdreset(rbfd);
+	ofi_rbread(&rbfd->rb, buf, len);
+	ofi_rbfdreset(rbfd);
 }
 
-static inline size_t rbfdsread(struct ringbuffd *rbfd, void *buf, size_t len,
+static inline size_t ofi_rbfdsread(struct ofi_ringbuffd *rbfd, void *buf, size_t len,
 				int timeout)
 {
 	int ret;
 	size_t avail;
 
-	avail = rbfdused(rbfd);
+	avail = ofi_rbfdused(rbfd);
 	if (avail) {
 		len = MIN(len, avail);
-		rbfdread(rbfd, buf, len);
+		ofi_rbfdread(rbfd, buf, len);
 		return len;
 	}
-	
-	ret = fi_poll_fd(rbfd->fd[RB_READ_FD], timeout);
+
+	ret = fi_poll_fd(rbfd->fd[OFI_RB_READ_FD], timeout);
 	if (ret == 1) {
-		len = MIN(len, rbfdused(rbfd));
-		rbfdread(rbfd, buf, len);
+		len = MIN(len, ofi_rbfdused(rbfd));
+		ofi_rbfdread(rbfd, buf, len);
 		return len;
 	}
 	return ret;
 }
 
-static inline size_t rbfdwait(struct ringbuffd *rbfd, int timeout)
+static inline size_t ofi_rbfdwait(struct ofi_ringbuffd *rbfd, int timeout)
 {
-	return  fi_poll_fd(rbfd->fd[RB_READ_FD], timeout);
+	return  fi_poll_fd(rbfd->fd[OFI_RB_READ_FD], timeout);
 }
 
 
-#endif /* RBUF_H */
+#endif /* FI_RBUF_H */
diff --git a/include/fi_util.h b/include/fi_util.h
index c8f2e92..4d4dc56 100644
--- a/include/fi_util.h
+++ b/include/fi_util.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2015-2017 Intel Corporation, Inc.  All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -56,6 +56,9 @@
 #include <fi_signal.h>
 #include <fi_enosys.h>
 #include <fi_osd.h>
+#include <fi_indexer.h>
+
+#include "rbtree.h"
 
 #ifndef _FI_UTIL_H_
 #define _FI_UTIL_H_
@@ -89,13 +92,41 @@
 	OFI_Q_READERR(prov, log, eq, "eq", fi_eq_readerr, 	\
 			fi_eq_strerror, ret, err_entry)
 
-#define ofi_sin_addr(addr) (((struct sockaddr_in *)(addr))->sin_addr)
-#define ofi_sin6_addr(addr) (((struct sockaddr_in6 *)(addr))->sin6_addr)
+#define FI_INFO_FIELD(provider, prov_attr, user_attr, prov_str, user_str, type)	\
+	do {										\
+		FI_INFO(provider, FI_LOG_CORE, prov_str ": %s\n",			\
+				fi_tostr(&prov_attr, type));				\
+		FI_INFO(provider, FI_LOG_CORE, user_str ": %s\n",			\
+				fi_tostr(&user_attr, type));				\
+	} while (0)
 
-enum fi_match_type {
-	FI_MATCH_EXACT,
-	FI_MATCH_PREFIX,
-};
+#define FI_INFO_STRING(provider, prov_attr, user_attr, prov_str, user_str)	\
+	do {									\
+		FI_INFO(provider, FI_LOG_CORE, prov_str ": %s\n", prov_attr);	\
+		FI_INFO(provider, FI_LOG_CORE, user_str ": %s\n", user_attr);	\
+	} while (0)
+
+#define FI_INFO_CHECK(provider, prov, user, field, type)		\
+	FI_INFO_FIELD(provider, prov->field, user->field, "Supported",	\
+		      "Requested", type)
+
+#define FI_INFO_CHECK_VAL(provider, prov, user, field)					\
+	do {										\
+		FI_INFO(provider, FI_LOG_CORE, "Supported: %zd\n", prov->field);	\
+		FI_INFO(provider, FI_LOG_CORE, "Requested: %zd\n", user->field);	\
+	} while (0)
+
+#define FI_INFO_MODE(provider, prov_mode, user_mode)				\
+	FI_INFO_FIELD(provider, prov_mode, user_mode, "Expected", "Given",	\
+		      FI_TYPE_MODE)
+
+#define FI_INFO_MR_MODE(provider, prov_mode, user_mode)			\
+	FI_INFO_FIELD(provider, prov_mode, user_mode, "Expected", "Given",	\
+		      FI_TYPE_MR_MODE)
+
+#define FI_INFO_NAME(provider, prov, user)				\
+	FI_INFO_STRING(provider, prov->name, user->name, "Supported",	\
+		       "Requested")
 
 enum {
 	UTIL_TX_SHARED_CTX = 1 << 0,
@@ -115,11 +146,16 @@ struct util_prov {
 /*
  * Fabric
  */
+struct util_fabric_info {
+	const char 			*name;
+	const struct fi_provider 	*prov;
+};
+
 struct util_fabric {
 	struct fid_fabric	fabric_fid;
 	struct dlist_entry	list_entry;
 	fastlock_t		lock;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	const char		*name;
 	const struct fi_provider *prov;
 
@@ -127,10 +163,9 @@ struct util_fabric {
 };
 
 int ofi_fabric_init(const struct fi_provider *prov,
-		   struct fi_fabric_attr *prov_attr,
-		   struct fi_fabric_attr *user_attr,
-		   struct util_fabric *fabric, void *context,
-		   enum fi_match_type type);
+		    const struct fi_fabric_attr *prov_attr,
+		    const struct fi_fabric_attr *user_attr,
+		    struct util_fabric *fabric, void *context);
 int ofi_fabric_close(struct util_fabric *fabric);
 int ofi_trywait(struct fid_fabric *fabric, struct fid **fids, int count);
 
@@ -141,19 +176,22 @@ struct util_domain {
 	struct fid_domain	domain_fid;
 	struct dlist_entry	list_entry;
 	struct util_fabric	*fabric;
+	struct util_eq		*eq;
 	fastlock_t		lock;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	const struct fi_provider *prov;
 
 	char			*name;
-	uint64_t		caps;
-	uint64_t		mode;
+	uint64_t		info_domain_caps;
+	uint64_t		info_domain_mode;
+	int			mr_mode;
 	uint32_t		addr_format;
 	enum fi_av_type		av_type;
 };
 
 int ofi_domain_init(struct fid_fabric *fabric_fid, const struct fi_info *info,
 		     struct util_domain *domain, void *context);
+int ofi_domain_bind_eq(struct util_domain *domain, struct util_eq *eq);
 int ofi_domain_close(struct util_domain *domain);
 
 
@@ -162,22 +200,44 @@ int ofi_domain_close(struct util_domain *domain);
  */
 
 struct util_ep;
-typedef void (*fi_ep_progress_func)(struct util_ep *util_ep);
+typedef void (*ofi_ep_progress_func)(struct util_ep *util_ep);
 
 struct util_ep {
 	struct fid_ep		ep_fid;
 	struct util_domain	*domain;
+
 	struct util_av		*av;
+	struct dlist_entry	av_entry;
+	struct util_eq		*eq;
+	/* CQ entries */
 	struct util_cq		*rx_cq;
+	uint64_t		rx_op_flags;
 	struct util_cq		*tx_cq;
+	uint64_t		tx_op_flags;
+
+	/* CNTR entries */
+	struct util_cntr	*tx_cntr;     /* transmit/send */
+	struct util_cntr	*rx_cntr;     /* receive       */
+	struct util_cntr	*rd_cntr;     /* read          */
+	struct util_cntr	*wr_cntr;     /* write         */
+	struct util_cntr	*rem_rd_cntr; /* remote read   */
+	struct util_cntr	*rem_wr_cntr; /* remote write  */
+
 	uint64_t		caps;
 	uint64_t		flags;
-	fi_ep_progress_func	progress;
+	ofi_ep_progress_func	progress;
+	struct util_cmap	*cmap;
+	fastlock_t		lock;
 };
 
+int ofi_ep_bind_av(struct util_ep *util_ep, struct util_av *av);
+int ofi_ep_bind_eq(struct util_ep *ep, struct util_eq *eq);
+int ofi_ep_bind_cq(struct util_ep *ep, struct util_cq *cq, uint64_t flags);
+int ofi_ep_bind_cntr(struct util_ep *ep, struct util_cntr *cntr, uint64_t flags);
+int ofi_ep_bind(struct util_ep *util_ep, struct fid *fid, uint64_t flags);
 int ofi_endpoint_init(struct fid_domain *domain, const struct util_prov *util_prov,
-		struct fi_info *info, struct util_ep *ep, void *context,
-		enum fi_match_type type);
+		      struct fi_info *info, struct util_ep *ep, void *context,
+		      ofi_ep_progress_func progress);
 
 int ofi_endpoint_close(struct util_ep *util_ep);
 
@@ -199,16 +259,17 @@ struct util_cq_err_entry {
 	struct slist_entry	list_entry;
 };
 
-DECLARE_CIRQUE(struct fi_cq_tagged_entry, util_comp_cirq);
+OFI_DECLARE_CIRQUE(struct fi_cq_tagged_entry, util_comp_cirq);
+
+typedef void (*ofi_cq_progress_func)(struct util_cq *cq);
 
-typedef void (*fi_cq_progress_func)(struct util_cq *cq);
 struct util_cq {
 	struct fid_cq		cq_fid;
 	struct util_domain	*domain;
 	struct util_wait	*wait;
-	atomic_t		ref;
-	struct dlist_entry	list;
-	fastlock_t		list_lock;
+	ofi_atomic32_t		ref;
+	struct dlist_entry	ep_list;
+	fastlock_t		ep_list_lock;
 	fastlock_t		cq_lock;
 
 	struct util_comp_cirq	*cirq;
@@ -217,27 +278,61 @@ struct util_cq {
 	struct slist		err_list;
 	fi_cq_read_func		read_entry;
 	int			internal_wait;
-	fi_cq_progress_func	progress;
+	ofi_cq_progress_func	progress;
 };
 
 int ofi_cq_init(const struct fi_provider *prov, struct fid_domain *domain,
 		 struct fi_cq_attr *attr, struct util_cq *cq,
-		 fi_cq_progress_func progress, void *context);
+		 ofi_cq_progress_func progress, void *context);
+int ofi_check_bind_cq_flags(struct util_ep *ep, struct util_cq *cq,
+			    uint64_t flags);
 void ofi_cq_progress(struct util_cq *cq);
 int ofi_cq_cleanup(struct util_cq *cq);
+ssize_t ofi_cq_read(struct fid_cq *cq_fid, void *buf, size_t count);
+ssize_t ofi_cq_readfrom(struct fid_cq *cq_fid, void *buf, size_t count,
+		fi_addr_t *src_addr);
+ssize_t ofi_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *buf,
+		uint64_t flags);
+ssize_t ofi_cq_sread(struct fid_cq *cq_fid, void *buf, size_t count,
+		const void *cond, int timeout);
+ssize_t ofi_cq_sreadfrom(struct fid_cq *cq_fid, void *buf, size_t count,
+		fi_addr_t *src_addr, const void *cond, int timeout);
+int ofi_cq_signal(struct fid_cq *cq_fid);
+int ofi_cq_write_error(struct util_cq *cq,
+		       const struct fi_cq_err_entry *err_entry);
 
 /*
  * Counter
  */
+struct util_cntr;
+typedef void (*ofi_cntr_progress_func)(struct util_cntr *cntr);
+
 struct util_cntr {
 	struct fid_cntr		cntr_fid;
 	struct util_domain	*domain;
-	atomic_t		ref;
+	struct util_wait	*wait;
+	ofi_atomic32_t		ref;
+
+	ofi_atomic64_t		cnt;
+	ofi_atomic64_t		err;
+
 	uint64_t		checkpoint_cnt;
 	uint64_t		checkpoint_err;
+
+	struct dlist_entry	ep_list;
+	fastlock_t		ep_list_lock;
+
+	ofi_cntr_progress_func	progress;
 };
 
+int ofi_check_bind_cntr_flags(struct util_ep *ep, struct util_cntr *cntr,
+			      uint64_t flags);
 
+void ofi_cntr_progress(struct util_cntr *cntr);
+int ofi_cntr_init(const struct fi_provider *prov, struct fid_domain *domain,
+		  struct fi_cntr_attr *attr, struct util_cntr *cntr,
+		  ofi_cntr_progress_func progress, void *context);
+int ofi_cntr_cleanup(struct util_cntr *cntr);
 /*
  * AV / addressing
  */
@@ -257,7 +352,7 @@ struct util_av {
 	struct fid_av		av_fid;
 	struct util_domain	*domain;
 	struct util_eq		*eq;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	fastlock_t		lock;
 	const struct fi_provider *prov;
 
@@ -268,6 +363,7 @@ struct util_av {
 	ssize_t			free_list;
 	struct util_av_hash	hash;
 	void			*data;
+	struct dlist_entry	ep_list;
 };
 
 struct util_av_attr {
@@ -282,6 +378,7 @@ int ofi_av_init(struct util_domain *domain,
 int ofi_av_close(struct util_av *av);
 
 int ofi_av_insert_addr(struct util_av *av, const void *addr, int slot, int *index);
+int ofi_av_remove_addr(struct util_av *av, int slot, int index);
 int ofi_av_lookup_index(struct util_av *av, const void *addr, int slot);
 int ofi_av_bind(struct fid *av_fid, struct fid *eq_fid, uint64_t flags);
 void ofi_av_write_event(struct util_av *av, uint64_t data,
@@ -307,59 +404,98 @@ int ofi_av_get_index(struct util_av *av, const void *addr);
  * Connection Map
  */
 
+// TODO explore replacing this with a simple connection hash map that is common
+// for both AV and RX only connections.
+#define UTIL_CMAP_IDX_BITS 48
+
+enum ofi_cmap_signal {
+	OFI_CMAP_FREE,
+	OFI_CMAP_EXIT,
+};
+
 enum util_cmap_state {
-	CMAP_UNSPEC,
-	CMAP_CONNECTING,
-	CMAP_CONNECTED
+	CMAP_IDLE,
+	CMAP_CONNREQ_SENT,
+	CMAP_CONNREQ_RECV,
+	CMAP_ACCEPT,
+	CMAP_CONNECTED,
+	CMAP_SHUTDOWN,
 };
 
 struct util_cmap_handle {
 	struct util_cmap *cmap;
 	enum util_cmap_state state;
-	struct util_cmap_key *key;
-	size_t key_index;
+	/* Unique identifier for a connection. Can be exchanged with a peer
+	 * during connection setup and can later be used in a message header
+	 * to identify the source of the message (Used for FI_SOURCE, RNDV
+	 * protocol, etc.) */
+	uint64_t key;
+	uint64_t remote_key;
 	fi_addr_t fi_addr;
 	struct util_cmap_peer *peer;
 };
 
-struct util_cmap_key {
-	struct util_cmap_handle *handle;
-};
-DECLARE_FREESTACK(struct util_cmap_key, util_cmap_keypool);
-
 struct util_cmap_peer {
 	struct util_cmap_handle *handle;
 	struct dlist_entry entry;
-	size_t addrlen;
 	uint8_t addr[];
 };
 
-typedef void (*ofi_cmap_free_handle_func)(void *arg);
+typedef struct util_cmap_handle* (*ofi_cmap_alloc_handle_func)(void);
+typedef void (*ofi_cmap_handle_func)(struct util_cmap_handle *handle);
+typedef int (*ofi_cmap_connect_func)(struct util_ep *cmap,
+				     struct util_cmap_handle *handle,
+				     fi_addr_t fi_addr);
+typedef void *(*ofi_cmap_event_handler_func)(void *arg);
+typedef int (*ofi_cmap_signal_func)(struct util_ep *ep, void *context,
+				    enum ofi_cmap_signal signal);
+
+struct util_cmap_attr {
+	void 				*name;
+	ofi_cmap_alloc_handle_func 	alloc;
+	ofi_cmap_handle_func 		close;
+	ofi_cmap_handle_func 		free;
+	ofi_cmap_connect_func 		connect;
+	ofi_cmap_event_handler_func	event_handler;
+	ofi_cmap_signal_func		signal;
+};
 
 struct util_cmap {
+	struct util_ep *ep;
 	struct util_av *av;
-	struct util_cmap_handle **handles;
-	struct util_cmap_keypool *keypool;
+
+	/* cmap handles that correspond to addresses in AV */
+	struct util_cmap_handle **handles_av;
+
+	/* Store all cmap handles (inclusive of handles_av) in an indexer.
+	 * This allows reverse lookup of the handle using the index. */
+	struct indexer handles_idx;
+
+	struct ofi_key_idx key_idx;
+
 	struct dlist_entry peer_list;
-	ofi_cmap_free_handle_func free_handle;
+	struct util_cmap_attr attr;
+	pthread_t event_handler_thread;
 	fastlock_t lock;
 };
 
-void ofi_cmap_update_state(struct util_cmap_handle *handle,
-		enum util_cmap_state state);
-/*
- * Caller must hold cmap->lock. Either fi_addr or
- * addr and addrlen args should be present.
- */
-int ofi_cmap_add_handle(struct util_cmap *cmap, struct util_cmap_handle *handle,
-		enum util_cmap_state state, fi_addr_t fi_addr, void *addr,
-		size_t addrlen);
-/* Caller must hold cmap->lock */
-struct util_cmap_handle *ofi_cmap_get_handle(struct util_cmap *cmap, fi_addr_t fi_addr);
+struct util_cmap_handle *ofi_cmap_key2handle(struct util_cmap *cmap, uint64_t key);
+int ofi_cmap_get_handle(struct util_cmap *cmap, fi_addr_t fi_addr,
+			struct util_cmap_handle **handle);
+
+void ofi_cmap_process_connect(struct util_cmap *cmap,
+			      struct util_cmap_handle *handle,
+			      uint64_t *remote_key);
+void ofi_cmap_process_reject(struct util_cmap *cmap,
+			     struct util_cmap_handle *handle);
+int ofi_cmap_process_connreq(struct util_cmap *cmap, void *addr,
+			     struct util_cmap_handle **handle);
+void ofi_cmap_process_shutdown(struct util_cmap *cmap,
+			       struct util_cmap_handle *handle);
 void ofi_cmap_del_handle(struct util_cmap_handle *handle);
 void ofi_cmap_free(struct util_cmap *cmap);
-struct util_cmap *ofi_cmap_alloc(struct util_av *av,
-		ofi_cmap_free_handle_func free_handle);
+struct util_cmap *ofi_cmap_alloc(struct util_ep *ep,
+				 struct util_cmap_attr *attr);
 
 /*
  * Poll set
@@ -369,7 +505,7 @@ struct util_poll {
 	struct util_domain	*domain;
 	struct dlist_entry	fid_list;
 	fastlock_t		lock;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	const struct fi_provider *prov;
 };
 
@@ -390,7 +526,7 @@ struct util_wait {
 	struct fid_wait		wait_fid;
 	struct util_fabric	*fabric;
 	struct util_poll	*pollset;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	const struct fi_provider *prov;
 
 	enum fi_wait_obj	wait_obj;
@@ -420,7 +556,7 @@ struct util_eq {
 	struct util_fabric	*fabric;
 	struct util_wait	*wait;
 	fastlock_t		lock;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	const struct fi_provider *prov;
 
 	struct slist		list;
@@ -441,74 +577,99 @@ int ofi_eq_create(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 /*
  * MR
  */
+#define OFI_MR_BASIC_MAP (FI_MR_ALLOCATED | FI_MR_PROV_KEY | FI_MR_VIRT_ADDR)
 
+#define OFI_CHECK_MR_BASIC(mode) ((mode == FI_MR_BASIC) || \
+				  ((mode & OFI_MR_BASIC_MAP) == OFI_MR_BASIC_MAP))
 
-/*hide addr related info & store prov_mr ptr */
-struct ofi_util_mr {
-    void *map_handle;
-    uint64_t b_key; /* track available key (BASIC usage) */
-    enum fi_mr_mode mr_type;
-    const struct fi_provider *prov;
-};
+#define OFI_CHECK_MR_SCALABLE(mode) (!(mode & OFI_MR_BASIC_MAP))
 
-/*create instance of data structure and return handle to user */
-int ofi_mr_init(const struct fi_provider *in_prov, enum fi_mr_mode mode,
-                                struct ofi_util_mr ** out_new_mr);
-/*insert user mr struct in data structure*/
-int ofi_mr_insert(struct ofi_util_mr * in_mr_h,
-                                const struct fi_mr_attr *in_attr,
-                                uint64_t * out_key, void * in_prov_mr);
-/*return on user mr struct */
-void * ofi_mr_retrieve(struct ofi_util_mr * in_mr_h,  uint64_t in_key);
-/*need address offsetted, verified, and user mr struct returned*/
-/* io_addr is address of buff (&buf) */
-int ofi_mr_retrieve_and_verify(struct ofi_util_mr * in_mr_h, ssize_t in_len,
-                                uintptr_t *io_addr, uint64_t in_key,
-                                uint64_t in_access, void **out_prov_mr);
-/*erase a specific item in the data structure */
-int ofi_mr_erase(struct ofi_util_mr * in_mr_h, uint64_t in_key);
-/*close data structure instance */
-void ofi_mr_close(struct ofi_util_mr *in_mr_h);
+struct ofi_mr_map {
+	const struct fi_provider *prov;
+	void			*rbtree;
+	uint64_t		key;
+	enum fi_mr_mode		mode;
+};
 
+/* If the app sets FI_MR_LOCAL, we ignore FI_LOCAL_MR.  So, if the
+ * app doesn't set FI_MR_LOCAL, we need to check for FI_LOCAL_MR.
+ * The provider is assumed only to set FI_MR_LOCAL correctly.
+ */
+static inline uint64_t ofi_mr_get_prov_mode(uint32_t version,
+					    const struct fi_info *user_info,
+					    const struct fi_info *prov_info)
+{
+	if (FI_VERSION_LT(version, FI_VERSION(1, 5)) ||
+	    (user_info->domain_attr &&
+	     !(user_info->domain_attr->mr_mode & FI_MR_LOCAL))) {
+		return (prov_info->domain_attr->mr_mode & FI_MR_LOCAL) ?
+			prov_info->mode | FI_LOCAL_MR : prov_info->mode;
+	} else {
+		return prov_info->mode;
+	}
+}
+
+int ofi_mr_map_init(const struct fi_provider *in_prov, int mode,
+		    struct ofi_mr_map *map);
+void ofi_mr_map_close(struct ofi_mr_map *map);
+
+int ofi_mr_insert(struct ofi_mr_map *map,
+		  const struct fi_mr_attr *attr,
+		  uint64_t *key, void *context);
+int ofi_mr_remove(struct ofi_mr_map *map, uint64_t key);
+void *ofi_mr_get(struct ofi_mr_map *map,  uint64_t key);
+
+int ofi_mr_verify(struct ofi_mr_map *map, uintptr_t *io_addr,
+		  size_t len, uint64_t key, uint64_t access,
+		  void **context);
 
 
 /*
  * Attributes and capabilities
  */
-#define FI_PRIMARY_CAPS	(FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMICS | \
+#define FI_PRIMARY_CAPS	(FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMICS | FI_MULTICAST | \
 			 FI_NAMED_RX_CTX | FI_DIRECTED_RECV | \
 			 FI_READ | FI_WRITE | FI_RECV | FI_SEND | \
 			 FI_REMOTE_READ | FI_REMOTE_WRITE)
 
 #define FI_SECONDARY_CAPS (FI_MULTI_RECV | FI_SOURCE | FI_RMA_EVENT | \
-			   FI_TRIGGER | FI_FENCE)
-
-int fi_check_fabric_attr(const struct fi_provider *prov,
-			 const struct fi_fabric_attr *prov_attr,
-			 const struct fi_fabric_attr *user_attr,
-			 enum fi_match_type type);
-int fi_check_wait_attr(const struct fi_provider *prov,
-		       const struct fi_wait_attr *attr);
-int fi_check_domain_attr(const struct fi_provider *prov,
-			 const struct fi_domain_attr *prov_attr,
-			 const struct fi_domain_attr *user_attr,
-			 enum fi_match_type type);
-int fi_check_ep_attr(const struct util_prov *util_prov,
-		     const struct fi_ep_attr *user_attr);
-int fi_check_cq_attr(const struct fi_provider *prov,
-		     const struct fi_cq_attr *attr);
-int fi_check_rx_attr(const struct fi_provider *prov,
-		     const struct fi_rx_attr *prov_attr,
-		     const struct fi_rx_attr *user_attr);
-int fi_check_tx_attr(const struct fi_provider *prov,
-		     const struct fi_tx_attr *prov_attr,
-		     const struct fi_tx_attr *user_attr);
-int fi_check_info(const struct util_prov *util_prov,
-		  const struct fi_info *user_info,
-		  enum fi_match_type type);
-void ofi_alter_info(struct fi_info *info,
-		   const struct fi_info *hints);
-
+			   FI_SHARED_AV | FI_TRIGGER | FI_FENCE | \
+			   FI_LOCAL_COMM | FI_REMOTE_COMM)
+
+int ofi_check_mr_mode(uint32_t api_version, uint32_t prov_mode,
+			     uint32_t user_mode);
+int ofi_check_fabric_attr(const struct fi_provider *prov,
+			  const struct fi_fabric_attr *prov_attr,
+			  const struct fi_fabric_attr *user_attr);
+int ofi_check_wait_attr(const struct fi_provider *prov,
+		        const struct fi_wait_attr *attr);
+int ofi_check_domain_attr(const struct fi_provider *prov, uint32_t api_version,
+			  const struct fi_domain_attr *prov_attr,
+			  const struct fi_domain_attr *user_attr);
+int ofi_check_ep_attr(const struct util_prov *util_prov, uint32_t api_version,
+		      const struct fi_ep_attr *user_attr);
+int ofi_check_cq_attr(const struct fi_provider *prov,
+		      const struct fi_cq_attr *attr);
+int ofi_check_rx_attr(const struct fi_provider *prov,
+		      const struct fi_rx_attr *prov_attr,
+		      const struct fi_rx_attr *user_attr, uint64_t info_mode);
+int ofi_check_tx_attr(const struct fi_provider *prov,
+		      const struct fi_tx_attr *prov_attr,
+		      const struct fi_tx_attr *user_attr, uint64_t info_mode);
+int ofi_prov_check_info(const struct util_prov *util_prov,
+			uint32_t api_version,
+			const struct fi_info *user_info);
+int ofi_prov_check_dup_info(const struct util_prov *util_prov,
+			    uint32_t api_version,
+			    const struct fi_info *user_info,
+			    struct fi_info **info);
+int ofi_check_info(const struct util_prov *util_prov,
+		   const struct fi_info *prov_info, uint32_t api_version,
+		   const struct fi_info *user_info);
+void ofi_alter_info(struct fi_info *info, const struct fi_info *hints,
+		    uint32_t api_version);
+
+struct fi_info *ofi_allocinfo_internal(void);
 int util_getinfo(const struct util_prov *util_prov, uint32_t version,
 		 const char *node, const char *service, uint64_t flags,
 		 struct fi_info *hints, struct fi_info **info);
@@ -524,27 +685,83 @@ int fid_list_insert(struct dlist_entry *fid_list, fastlock_t *lock,
 void fid_list_remove(struct dlist_entry *fid_list, fastlock_t *lock,
 		     struct fid *fid);
 
-void fi_fabric_insert(struct util_fabric *fabric);
-struct util_fabric *fi_fabric_find(const char *name);
-void fi_fabric_remove(struct util_fabric *fabric);
+void ofi_fabric_insert(struct util_fabric *fabric);
+struct util_fabric *ofi_fabric_find(struct util_fabric_info *fabric_info);
+void ofi_fabric_remove(struct util_fabric *fabric);
 
 /*
- * Layered Providers
+ * Utility Providers
  */
 
-typedef int (*ofi_alter_info_t)(struct fi_info *src_info, struct fi_info *dest_info);
+typedef int (*ofi_alter_info_t)(uint32_t version, struct fi_info *src_info,
+				struct fi_info *dest_info);
 
+int ofi_get_core_info(uint32_t version, const char *node, const char *service,
+		      uint64_t flags, const struct util_prov *util_prov,
+		      struct fi_info *util_hints, ofi_alter_info_t info_to_core,
+		      struct fi_info **core_info);
 int ofix_getinfo(uint32_t version, const char *node, const char *service,
-			uint64_t flags, const struct util_prov *util_prov,
-			struct fi_info *hints,
-			ofi_alter_info_t alter_layer_info,
-			ofi_alter_info_t alter_base_info,
-			int get_base_info, struct fi_info **info);
-char *ofi_strdup_less_prefix(char *name, char *prefix);
-char *ofi_strdup_add_prefix(char *name, char *prefix);
+		 uint64_t flags, const struct util_prov *util_prov,
+		 struct fi_info *hints, ofi_alter_info_t info_to_core,
+		 ofi_alter_info_t info_to_util, struct fi_info **info);
+int ofi_get_core_info_fabric(struct fi_fabric_attr *util_attr,
+			     struct fi_info **core_info);
+
+
+#define OFI_NAME_DELIM	';'
+#define OFI_UTIL_PREFIX "ofi_"
+
+char *ofi_strdup_append(const char *head, const char *tail);
+// char *ofi_strdup_head(const char *str);
+// char *ofi_strdup_tail(const char *str);
+const char *ofi_util_name(const char *prov_name, size_t *len);
+const char *ofi_core_name(const char *prov_name, size_t *len);
+
 
 int ofi_shm_map(struct util_shm *shm, const char *name, size_t size,
 		int readonly, void **mapped);
 int ofi_shm_unmap(struct util_shm *shm);
 
+/*
+ * Name Server TODO: add support for Windows OS
+ * (osd/windows/pthread.h should be extended)
+ */
+
+typedef int(*ofi_ns_service_cmp_func_t)(void *svc1, void *svc2);
+typedef int(*ofi_ns_is_service_wildcard_func_t)(void *svc);
+
+struct util_ns {
+	RbtHandle	ns_map;
+	char		*ns_hostname;
+	int		ns_port;
+	pthread_t	ns_thread;
+
+	size_t	name_len;
+	size_t	service_len;
+
+	ofi_ns_service_cmp_func_t	service_cmp;
+
+	ofi_ns_is_service_wildcard_func_t is_service_wildcard;
+};
+
+struct util_ns_attr {
+	char	*ns_hostname;
+	int	ns_port;
+
+	size_t	name_len;
+	size_t	service_len;
+
+	ofi_ns_service_cmp_func_t	service_cmp;
+
+	ofi_ns_is_service_wildcard_func_t is_service_wildcard;
+};
+
+int ofi_ns_init(struct util_ns_attr *attr, struct util_ns *ns);
+void ofi_ns_start_server(struct util_ns *ns);
+void ofi_ns_stop_server(struct util_ns *ns);
+int ofi_ns_add_local_name(struct util_ns *ns, void *service, void *name);
+int ofi_ns_del_local_name(struct util_ns *ns, void *service, void *name);
+void *ofi_ns_resolve_name(struct util_ns *ns, const char *server,
+			  void *service);
+
 #endif
diff --git a/include/fi_abi.h b/include/ofi_atomic.h
similarity index 59%
copy from include/fi_abi.h
copy to include/ofi_atomic.h
index 0deedbb..d8dabbc 100644
--- a/include/fi_abi.h
+++ b/include/ofi_atomic.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -11,7 +11,7 @@
  *     without modification, are permitted provided that the following
  *     conditions are met:
  *
- *      - Redistributions of source code must retain the above
+ *      - Redistibutions of source code must retain the above
  *        copyright notice, this list of conditions and the following
  *        disclaimer.
  *
@@ -30,48 +30,38 @@
  * SOFTWARE.
  */
 
-#ifndef _FI_ABI_H_
-#define _FI_ABI_H_
+#ifndef _OFI_ATOMIC_H_
+#define _OFI_ATOMIC_H_
 
 #include "config.h"
 
-#include <fi_osd.h>
-
+#include "fi.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
+size_t ofi_datatype_size(enum fi_datatype datatype);
 
-#define DEFAULT_ABI "FABRIC_1.0"
-
-#if  HAVE_ALIAS_ATTRIBUTE == 1
-#define DEFAULT_SYMVER_PRE(a) a##_
-#else
-#define DEFAULT_SYMVER_PRE(a) a
-#endif
-
-/* symbol -> external symbol mappings */
-#if HAVE_SYMVER_SUPPORT
+#define OFI_WRITE_OP_LAST	FI_CSWAP
+#define OFI_READWRITE_OP_LAST	FI_CSWAP
+#define OFI_SWAP_OP_START	FI_CSWAP
+#define OFI_SWAP_OP_LAST	(FI_MSWAP - FI_CSWAP + 1)
 
-#  define SYMVER(name, api, ver) \
-        asm(".symver " #name "," #api "@" #ver)
-#  define DEFAULT_SYMVER(name, api) \
-        asm(".symver " #name "," #api "@@" DEFAULT_ABI)
-#else
-#  define SYMVER(Name, api, ver)
-#if  HAVE_ALIAS_ATTRIBUTE == 1
-#  define DEFAULT_SYMVER(name, api) \
-        extern typeof (name) api __attribute__((alias(#name)));
-#else
-#  define DEFAULT_SYMVER(name, api)
-#endif  /* HAVE_ALIAS_ATTRIBUTE == 1*/
+extern void (*ofi_atomic_write_handlers[OFI_WRITE_OP_LAST][FI_DATATYPE_LAST])
+			(void *dst, const void *src, size_t cnt);
+extern void (*ofi_atomic_readwrite_handlers[OFI_READWRITE_OP_LAST][FI_DATATYPE_LAST])
+			(void *dst, const void *src, void *res, size_t cnt);
+extern void (*ofi_atomic_swap_handlers[OFI_SWAP_OP_LAST][FI_DATATYPE_LAST])
+			(void *dst, const void *src, const void *cmp,
+			 void *res, size_t cnt);
 
-#endif /* HAVE_SYMVER_SUPPORT */
+int ofi_atomic_valid(const struct fi_provider *prov,
+		     enum fi_datatype datatype, enum fi_op op, uint64_t flags);
 
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* _FI_ABI_H_ */
+#endif /* _OFI_ATOMIC_H_ */
diff --git a/include/osx/osd.h b/include/osx/osd.h
index bcd0730..279a2c5 100644
--- a/include/osx/osd.h
+++ b/include/osx/osd.h
@@ -62,19 +62,6 @@
 extern "C" {
 #endif
 
-/* macOS Sierra added clock_gettime to libc. This implementation should only
- * take effect if it is not available.
- */
-#if !HAVE_CLOCK_GETTIME
-
-#define CLOCK_REALTIME CALENDAR_CLOCK
-#define CLOCK_MONOTONIC SYSTEM_CLOCK
-
-typedef int clockid_t;
-int clock_gettime(clockid_t clk_id, struct timespec *tp);
-
-#endif
-
 static inline int ofi_shm_remap(struct util_shm *shm, size_t newsize, void **mapped)
 {
 	return -1;
diff --git a/include/prov.h b/include/prov.h
index 399e600..88679a2 100644
--- a/include/prov.h
+++ b/include/prov.h
@@ -114,15 +114,15 @@ USNIC_INI ;
 #  define USNIC_INIT NULL
 #endif
 
-#if (HAVE_MXM) && (HAVE_MXM_DL)
-#  define MXM_INI FI_EXT_INI
-#  define MXM_INIT NULL
-#elif (HAVE_MXM)
-#  define MXM_INI INI_SIG(fi_mxm_ini)
-#  define MXM_INIT fi_mxm_ini()
-MXM_INI ;
+#if (HAVE_MLX) && (HAVE_MLX_DL)
+#  define MLX_INI FI_EXT_INI
+#  define MLX_INIT NULL
+#elif (HAVE_MLX)
+#  define MLX_INI INI_SIG(fi_mlx_ini)
+#  define MLX_INIT fi_mlx_ini()
+MLX_INI ;
 #else
-#  define MXM_INIT NULL
+#  define MLX_INIT NULL
 #endif
 
 #if (HAVE_UDP) && (HAVE_UDP_DL)
@@ -158,4 +158,30 @@ RXD_INI ;
 #  define RXD_INIT NULL
 #endif
 
+#if (HAVE_BGQ) && (HAVE_BGQ_DL)
+#  define BGQ_INI FI_EXT_INI
+#  define BGQ_INIT NULL
+#elif (HAVE_BGQ)
+#  define BGQ_INI INI_SIG(fi_bgq_ini)
+#  define BGQ_INIT fi_bgq_ini()
+BGQ_INI ;
+#else
+#  define BGQ_INIT NULL
+#endif
+
+#ifdef _WIN32
+#if (HAVE_NETDIR) && (HAVE_NETDIR_DL)
+#  define NETDIR_INI FI_EXT_INI
+#  define NETDIR_INIT NULL
+#elif (HAVE_NETDIR)
+#  define NETDIR_INI INI_SIG(fi_netdir_ini)
+#  define NETDIR_INIT fi_netdir_ini()
+NETDIR_INI ;
+#else
+#  define NETDIR_INIT NULL
+#endif
+#else /* _WIN32 */
+#  define NETDIR_INIT NULL
+#endif /* _WIN32 */
+
 #endif /* _PROV_H_ */
diff --git a/include/rdma/fabric.h b/include/rdma/fabric.h
index 533234f..956cd4e 100644
--- a/include/rdma/fabric.h
+++ b/include/rdma/fabric.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -38,6 +38,17 @@
 #include <stddef.h>
 #include <sys/types.h>
 
+#ifdef __GNUC__
+#define FI_DEPRECATED_FUNC __attribute__((deprecated))
+#define FI_DEPRECATED_FIELD __attribute__((deprecated))
+#elif defined(_MSC_VER)
+#define FI_DEPRECATED_FUNC __declspec(deprecated)
+#define FI_DEPRECATED_FIELD
+#else
+#define FI_DEPRECATED_FUNC
+#define FI_DEPRECATED_FIELD
+#endif
+
 #if defined(_WIN32)
 #include <BaseTsd.h>
 #include <windows.h>
@@ -57,7 +68,7 @@ extern "C" {
  * tarball/libfabric package version number).
  */
 #define FI_MAJOR_VERSION 1
-#define FI_MINOR_VERSION 4
+#define FI_MINOR_VERSION 5
 
 enum {
 	FI_PATH_MAX		= 256,
@@ -110,6 +121,7 @@ typedef struct fid *fid_t;
 #define FI_TAGGED		(1ULL << 3)
 #define FI_ATOMIC		(1ULL << 4)
 #define FI_ATOMICS		FI_ATOMIC
+#define FI_MULTICAST		(1ULL << 5)
 
 #define FI_READ			(1ULL << 8)
 #define FI_WRITE		(1ULL << 9)
@@ -134,7 +146,10 @@ typedef struct fid *fid_t;
 #define FI_DELIVERY_COMPLETE	(1ULL << 28)
 #define FI_AFFINITY		(1ULL << 29)
 
-/* fi_getinfo()-specific flags/caps */
+#define FI_SOURCE_ERR		(1ULL << 50)
+#define FI_LOCAL_COMM		(1ULL << 51)
+#define FI_REMOTE_COMM		(1ULL << 52)
+#define FI_SHARED_AV		(1ULL << 53)
 #define FI_PROV_ATTR_ONLY	(1ULL << 54)
 #define FI_NUMERICHOST		(1ULL << 55)
 #define FI_RMA_EVENT		(1ULL << 56)
@@ -158,12 +173,17 @@ enum {
 	FI_SOCKADDR_IN6,	/* struct sockaddr_in6 */
 	FI_SOCKADDR_IB,		/* struct sockaddr_ib */
 	FI_ADDR_PSMX,		/* uint64_t */
-	FI_ADDR_GNI
+	FI_ADDR_GNI,
+	FI_ADDR_BGQ,
+	FI_ADDR_MLX,
+	FI_ADDR_STR,		/* formatted char * */
+	FI_ADDR_PSMX2,		/* uint64_t[2] */
 };
 
 #define FI_ADDR_UNSPEC		((uint64_t) -1)
 #define FI_ADDR_NOTAVAIL	((uint64_t) -1)
-#define FI_SHARED_CONTEXT	(-(size_t)1)
+#define FI_KEY_NOTAVAIL		((uint64_t) -1)
+#define FI_SHARED_CONTEXT	SIZE_MAX
 typedef uint64_t		fi_addr_t;
 
 enum fi_av_type {
@@ -172,11 +192,20 @@ enum fi_av_type {
 	FI_AV_TABLE
 };
 
+/* Named enum for backwards compatibility */
 enum fi_mr_mode {
 	FI_MR_UNSPEC,
-	FI_MR_BASIC,
-	FI_MR_SCALABLE
+	FI_MR_BASIC,	     /* (1 << 0) */
+	FI_MR_SCALABLE,	     /* (1 << 1) */
 };
+#define FI_MR_LOCAL		(1 << 2)
+#define FI_MR_RAW		(1 << 3)
+#define FI_MR_VIRT_ADDR		(1 << 4)
+#define FI_MR_ALLOCATED		(1 << 5)
+#define FI_MR_PROV_KEY		(1 << 6)
+#define FI_MR_MMU_NOTIFY	(1 << 7)
+#define FI_MR_RMA_EVENT		(1 << 8)
+#define FI_MR_ENDPOINT		(1 << 9)
 
 enum fi_progress {
 	FI_PROGRESS_UNSPEC,
@@ -217,8 +246,8 @@ enum fi_ep_type {
 	FI_EP_MSG,
 	FI_EP_DGRAM,
 	FI_EP_RDM,
-	/* FI_EP_RAW, */
-	/* FI_EP_PACKET, */
+	FI_EP_SOCK_STREAM,
+	FI_EP_SOCK_DGRAM,
 };
 
 /* Endpoint protocol
@@ -233,12 +262,18 @@ enum {
 	FI_PROTO_PSMX,
 	FI_PROTO_UDP,
 	FI_PROTO_SOCK_TCP,
+	/*  MXM provider is deprecated.
+	 *  We will keep  this value in order to save binary compatibility.
+	 */
 	FI_PROTO_MXM,
 	FI_PROTO_IWARP_RDM,
 	FI_PROTO_IB_RDM,
 	FI_PROTO_GNI,
 	FI_PROTO_RXM,
-	FI_PROTO_RXD
+	FI_PROTO_RXD,
+	FI_PROTO_MLX,
+	FI_PROTO_NETWORKDIRECT,
+	FI_PROTO_PSMX2,
 };
 
 /* Mode bits */
@@ -247,6 +282,9 @@ enum {
 #define FI_ASYNC_IOV		(1ULL << 57)
 #define FI_RX_CQ_DATA		(1ULL << 56)
 #define FI_LOCAL_MR		(1ULL << 55)
+#define FI_NOTIFY_FLAGS_ONLY	(1ULL << 54)
+#define FI_RESTRICTED_COMP	(1ULL << 53)
+#define FI_CONTEXT2		(1ULL << 52)
 
 struct fi_tx_attr {
 	uint64_t		caps;
@@ -283,6 +321,8 @@ struct fi_ep_attr {
 	uint64_t		mem_tag_format;
 	size_t			tx_ctx_cnt;
 	size_t			rx_ctx_cnt;
+	size_t			auth_key_size;
+	uint8_t			*auth_key;
 };
 
 struct fi_domain_attr {
@@ -293,7 +333,7 @@ struct fi_domain_attr {
 	enum fi_progress	data_progress;
 	enum fi_resource_mgmt	resource_mgmt;
 	enum fi_av_type		av_type;
-	enum fi_mr_mode		mr_mode;
+	int			mr_mode;
 	size_t			mr_key_size;
 	size_t			cq_data_size;
 	size_t			cq_cnt;
@@ -304,6 +344,14 @@ struct fi_domain_attr {
 	size_t			max_ep_rx_ctx;
 	size_t			max_ep_stx_ctx;
 	size_t			max_ep_srx_ctx;
+	size_t			cntr_cnt;
+	size_t			mr_iov_limit;
+	uint64_t		caps;
+	uint64_t		mode;
+	uint8_t			*auth_key;
+	size_t 			auth_key_size;
+	size_t			max_err_data;
+	size_t			mr_cnt;
 };
 
 struct fi_fabric_attr {
@@ -311,6 +359,7 @@ struct fi_fabric_attr {
 	char			*name;
 	char			*prov_name;
 	uint32_t		prov_version;
+	uint32_t		api_version;
 };
 
 struct fi_info {
@@ -349,7 +398,8 @@ enum {
 	FI_CLASS_CNTR,
 	FI_CLASS_WAIT,
 	FI_CLASS_POLL,
-	FI_CLASS_CONNREQ
+	FI_CLASS_CONNREQ,
+	FI_CLASS_MC,
 };
 
 struct fi_eq_attr;
@@ -401,6 +451,7 @@ struct fi_ops_fabric {
 struct fid_fabric {
 	struct fid		fid;
 	struct fi_ops_fabric	*ops;
+	uint32_t		api_version;
 };
 
 int fi_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric, void *context);
@@ -418,6 +469,21 @@ struct fi_alias {
 	uint64_t		flags;
 };
 
+struct fi_mr_raw_attr {
+	uint64_t	flags;
+	uint64_t	*base_addr;
+	uint8_t		*raw_key;
+	size_t		*key_size;
+};
+
+struct fi_mr_map_raw {
+	uint64_t	flags;
+	uint64_t	base_addr;
+	uint8_t		*raw_key;
+	size_t		key_size;
+	uint64_t	*key;
+};
+
 /* control commands */
 enum {
 	FI_GETFIDFLAG,		/* uint64_t flags */
@@ -428,6 +494,13 @@ enum {
 	FI_GETWAIT,		/* void * wait object */
 	FI_ENABLE,		/* NULL */
 	FI_BACKLOG,		/* integer * */
+	FI_GET_RAW_MR,		/* fi_mr_raw_attr */
+	FI_MAP_RAW_MR,		/* fi_mr_map_raw */
+	FI_UNMAP_KEY,		/* uint64_t key */
+	FI_QUEUE_WORK,		/* struct fi_deferred_work */
+	FI_CANCEL_WORK,		/* struct fi_deferred_work */
+	FI_FLUSH_WORK,		/* NULL */
+	FI_REFRESH,		/* mr: fi_mr_modify */
 };
 
 static inline int fi_control(struct fid *fid, int command, void *arg)
@@ -472,6 +545,8 @@ enum fi_type {
 	FI_TYPE_VERSION,
 	FI_TYPE_EQ_EVENT,
 	FI_TYPE_CQ_EVENT_FLAGS,
+	FI_TYPE_MR_MODE,
+	FI_TYPE_OP_TYPE,
 };
 
 char *fi_tostr(const void *data, enum fi_type datatype);
@@ -501,6 +576,10 @@ void fi_freeparams(struct fi_param *params);
 struct fi_context {
 	void			*internal[4];
 };
+
+struct fi_context2 {
+	void			*internal[8];
+};
 #endif
 
 #ifdef __cplusplus
diff --git a/include/rdma/fi_atomic.h b/include/rdma/fi_atomic.h
index 5929c91..cc8b1e5 100644
--- a/include/rdma/fi_atomic.h
+++ b/include/rdma/fi_atomic.h
@@ -42,54 +42,15 @@
 extern "C" {
 #endif
 
-#ifdef FABRIC_DIRECT
-#include <rdma/fi_direct_atomic_def.h>
-#endif /* FABRIC_DIRECT */
-
-#ifndef FABRIC_DIRECT_ATOMIC_DEF
-
-enum fi_datatype {
-	FI_INT8,
-	FI_UINT8,
-	FI_INT16,
-	FI_UINT16,
-	FI_INT32,
-	FI_UINT32,
-	FI_INT64,
-	FI_UINT64,
-	FI_FLOAT,
-	FI_DOUBLE,
-	FI_FLOAT_COMPLEX,
-	FI_DOUBLE_COMPLEX,
-	FI_LONG_DOUBLE,
-	FI_LONG_DOUBLE_COMPLEX,
-	FI_DATATYPE_LAST
-};
 
-enum fi_op {
-	FI_MIN,
-	FI_MAX,
-	FI_SUM,
-	FI_PROD,
-	FI_LOR,
-	FI_LAND,
-	FI_BOR,
-	FI_BAND,
-	FI_LXOR,
-	FI_BXOR,
-	FI_ATOMIC_READ,
-	FI_ATOMIC_WRITE,
-	FI_CSWAP,
-	FI_CSWAP_NE,
-	FI_CSWAP_LE,
-	FI_CSWAP_LT,
-	FI_CSWAP_GE,
-	FI_CSWAP_GT,
-	FI_MSWAP,
-	FI_ATOMIC_OP_LAST
-};
+/* Atomic flags */
+#define FI_FETCH_ATOMIC		(1ULL << 58)
+#define FI_COMPARE_ATOMIC	(1ULL << 59)
 
-#endif
+struct fi_atomic_attr {
+	size_t			count;
+	size_t			size;
+};
 
 struct fi_msg_atomic {
 	const struct fi_ioc	*msg_iov;
@@ -104,6 +65,18 @@ struct fi_msg_atomic {
 	uint64_t		data;
 };
 
+struct fi_msg_fetch {
+	struct fi_ioc		*msg_iov;
+	void			**desc;
+	size_t			iov_count;
+};
+
+struct fi_msg_compare {
+	const struct fi_ioc	*msg_iov;
+	void			**desc;
+	size_t			iov_count;
+};
+
 struct fi_ops_atomic {
 	size_t	size;
 	ssize_t	(*write)(struct fid_ep *ep,
@@ -308,6 +281,16 @@ fi_compare_atomicvalid(struct fid_ep *ep,
 	return ep->atomic->compwritevalid(ep, datatype, op, count);
 }
 
+static inline int
+fi_query_atomic(struct fid_domain *domain,
+		enum fi_datatype datatype, enum fi_op op,
+		struct fi_atomic_attr *attr, uint64_t flags)
+{
+	return FI_CHECK_OP(domain->ops, struct fi_ops_domain, query_atomic) ?
+		domain->ops->query_atomic(domain, datatype, op, attr, flags) :
+		-FI_ENOSYS;
+}
+
 #endif
 
 #ifdef __cplusplus
diff --git a/include/rdma/fi_cm.h b/include/rdma/fi_cm.h
index d3839c9..e21fec9 100644
--- a/include/rdma/fi_cm.h
+++ b/include/rdma/fi_cm.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2016 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -41,6 +41,11 @@ extern "C" {
 #endif
 
 
+struct fid_mc {
+	struct fid		fid;
+	fi_addr_t		fi_addr;
+};
+
 struct fi_ops_cm {
 	size_t	size;
 	int	(*setname)(fid_t fid, void *addr, size_t addrlen);
@@ -53,6 +58,8 @@ struct fi_ops_cm {
 	int	(*reject)(struct fid_pep *pep, fid_t handle,
 			const void *param, size_t paramlen);
 	int	(*shutdown)(struct fid_ep *ep, uint64_t flags);
+	int	(*join)(struct fid_ep *ep, const void *addr, uint64_t flags,
+			struct fid_mc **mc, void *context);
 };
 
 
@@ -109,6 +116,18 @@ static inline int fi_shutdown(struct fid_ep *ep, uint64_t flags)
 	return ep->cm->shutdown(ep, flags);
 }
 
+static inline int fi_join(struct fid_ep *ep, const void *addr, uint64_t flags,
+			  struct fid_mc **mc, void *context)
+{
+	return FI_CHECK_OP(ep->cm, struct fi_ops_cm, join) ?
+		ep->cm->join(ep, addr, flags, mc, context) : -FI_ENOSYS;
+}
+
+static inline fi_addr_t fi_mc_addr(struct fid_mc *mc)
+{
+	return mc->fi_addr;
+}
+
 #endif
 
 #ifdef __cplusplus
diff --git a/include/rdma/fi_domain.h b/include/rdma/fi_domain.h
index fd288d7..28c3e19 100644
--- a/include/rdma/fi_domain.h
+++ b/include/rdma/fi_domain.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -48,6 +48,8 @@ extern "C" {
  */
 
 #define FI_SYMMETRIC		(1ULL << 59)
+#define FI_SYNC_ERR		(1ULL << 58)
+
 
 struct fi_av_attr {
 	enum fi_av_type		type;
@@ -101,13 +103,70 @@ struct fi_mr_attr {
 	uint64_t		offset;
 	uint64_t		requested_key;
 	void			*context;
+	size_t			auth_key_size;
+	uint8_t			*auth_key;
+};
+
+struct fi_mr_modify {
+	uint64_t		flags;
+	struct fi_mr_attr	attr;
+};
+
+
+#ifdef FABRIC_DIRECT
+#include <rdma/fi_direct_atomic_def.h>
+#endif /* FABRIC_DIRECT */
+
+#ifndef FABRIC_DIRECT_ATOMIC_DEF
+
+enum fi_datatype {
+	FI_INT8,
+	FI_UINT8,
+	FI_INT16,
+	FI_UINT16,
+	FI_INT32,
+	FI_UINT32,
+	FI_INT64,
+	FI_UINT64,
+	FI_FLOAT,
+	FI_DOUBLE,
+	FI_FLOAT_COMPLEX,
+	FI_DOUBLE_COMPLEX,
+	FI_LONG_DOUBLE,
+	FI_LONG_DOUBLE_COMPLEX,
+	FI_DATATYPE_LAST
 };
 
+enum fi_op {
+	FI_MIN,
+	FI_MAX,
+	FI_SUM,
+	FI_PROD,
+	FI_LOR,
+	FI_LAND,
+	FI_BOR,
+	FI_BAND,
+	FI_LXOR,
+	FI_BXOR,
+	FI_ATOMIC_READ,
+	FI_ATOMIC_WRITE,
+	FI_CSWAP,
+	FI_CSWAP_NE,
+	FI_CSWAP_LE,
+	FI_CSWAP_LT,
+	FI_CSWAP_GE,
+	FI_CSWAP_GT,
+	FI_MSWAP,
+	FI_ATOMIC_OP_LAST
+};
+
+#endif
+
 
+struct fi_atomic_attr;
 struct fi_cq_attr;
 struct fi_cntr_attr;
 
-
 struct fi_ops_domain {
 	size_t	size;
 	int	(*av_open)(struct fid_domain *domain, struct fi_av_attr *attr,
@@ -128,8 +187,13 @@ struct fi_ops_domain {
 	int	(*srx_ctx)(struct fid_domain *domain,
 			struct fi_rx_attr *attr, struct fid_ep **rx_ep,
 			void *context);
+	int	(*query_atomic)(struct fid_domain *domain,
+			enum fi_datatype datatype, enum fi_op op,
+			struct fi_atomic_attr *attr, uint64_t flags);
 };
 
+/* Memory registration flags */
+/* #define FI_RMA_EVENT		(1ULL << 56) */
 
 struct fi_ops_mr {
 	size_t	size;
@@ -237,12 +301,61 @@ static inline uint64_t fi_mr_key(struct fid_mr *mr)
 	return mr->key;
 }
 
+static inline int
+fi_mr_raw_attr(struct fid_mr *mr, uint64_t *base_addr,
+	       uint8_t *raw_key, size_t *key_size, uint64_t flags)
+{
+	struct fi_mr_raw_attr attr = {
+		.flags = flags,
+		.base_addr = base_addr,
+		.raw_key = raw_key,
+		.key_size = key_size
+	};
+	return mr->fid.ops->control(&mr->fid, FI_GET_RAW_MR, &attr);
+}
+
+static inline int
+fi_mr_map_raw(struct fid_domain *domain, uint64_t base_addr,
+	      uint8_t *raw_key, size_t key_size, uint64_t *key, uint64_t flags)
+{
+	struct fi_mr_map_raw map = {
+		.flags = flags,
+		.base_addr = base_addr,
+		.raw_key = raw_key,
+		.key_size = key_size,
+		.key = key
+	};
+	return domain->fid.ops->control(&domain->fid, FI_MAP_RAW_MR, &map);
+}
+
+static inline int
+fi_mr_unmap_key(struct fid_domain *domain, uint64_t key)
+{
+	return domain->fid.ops->control(&domain->fid, FI_UNMAP_KEY, &key);
+}
+
 static inline int fi_mr_bind(struct fid_mr *mr, struct fid *bfid, uint64_t flags)
 {
 	return mr->fid.ops->bind(&mr->fid, bfid, flags);
 }
 
 static inline int
+fi_mr_refresh(struct fid_mr *mr, const struct iovec *iov, size_t count,
+	      uint64_t flags)
+{
+	struct fi_mr_modify modify = {0};
+	modify.flags = flags;
+	modify.attr.mr_iov = iov;
+	modify.attr.iov_count = count;
+	return mr->fid.ops->control(&mr->fid, FI_REFRESH, &modify);
+}
+
+static inline int fi_mr_enable(struct fid_mr *mr)
+{
+	return mr->fid.ops->control(&mr->fid, FI_ENABLE, NULL);
+}
+
+static inline int
 fi_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 	   struct fid_av **av, void *context)
 {
diff --git a/include/rdma/fi_endpoint.h b/include/rdma/fi_endpoint.h
index 0c6790e..d2ef6ba 100644
--- a/include/rdma/fi_endpoint.h
+++ b/include/rdma/fi_endpoint.h
@@ -105,7 +105,6 @@ struct fi_ops_cm;
 struct fi_ops_rma;
 struct fi_ops_tagged;
 struct fi_ops_atomic;
-/* struct fi_ops_collectives; */
 
 /*
  * Calls which modify the properties of a endpoint (control, setopt, bind, ...)
@@ -231,13 +230,13 @@ fi_rx_context(struct fid_ep *ep, int index, struct fi_rx_attr *attr,
 	return ep->ops->rx_ctx(ep, index, attr, rx_ep, context);
 }
 
-static inline ssize_t
+static inline FI_DEPRECATED_FUNC ssize_t
 fi_rx_size_left(struct fid_ep *ep)
 {
 	return ep->ops->rx_size_left(ep);
 }
 
-static inline ssize_t
+static inline FI_DEPRECATED_FUNC ssize_t
 fi_tx_size_left(struct fid_ep *ep)
 {
 	return ep->ops->tx_size_left(ep);
diff --git a/include/rdma/fi_eq.h b/include/rdma/fi_eq.h
index 2cb7d53..1cf7a6f 100644
--- a/include/rdma/fi_eq.h
+++ b/include/rdma/fi_eq.h
@@ -38,6 +38,7 @@
 #endif /* _WIN32 */
 
 #include <rdma/fabric.h>
+#include <rdma/fi_errno.h>
 
 
 #ifdef __cplusplus
@@ -127,6 +128,7 @@ enum {
 	FI_SHUTDOWN,
 	FI_MR_COMPLETE,
 	FI_AV_COMPLETE,
+	FI_JOIN_COMPLETE,
 };
 
 struct fi_eq_entry {
@@ -227,6 +229,7 @@ struct fi_cq_err_entry {
 	int			prov_errno;
 	/* err_data is available until the next time the CQ is read */
 	void			*err_data;
+	size_t			err_data_size;
 };
 
 enum fi_cq_wait_cond {
@@ -289,6 +292,8 @@ struct fi_ops_cntr {
 	int	(*add)(struct fid_cntr *cntr, uint64_t value);
 	int	(*set)(struct fid_cntr *cntr, uint64_t value);
 	int	(*wait)(struct fid_cntr *cntr, uint64_t threshold, int timeout);
+	int	(*adderr)(struct fid_cntr *cntr, uint64_t value);
+	int	(*seterr)(struct fid_cntr *cntr, uint64_t value);
 };
 
 struct fid_cntr {
@@ -433,11 +438,23 @@ static inline int fi_cntr_add(struct fid_cntr *cntr, uint64_t value)
 	return cntr->ops->add(cntr, value);
 }
 
+static inline int fi_cntr_adderr(struct fid_cntr *cntr, uint64_t value)
+{
+	return FI_CHECK_OP(cntr->ops, struct fi_ops_cntr, adderr) ?
+		cntr->ops->adderr(cntr, value) : -FI_ENOSYS;
+}
+
 static inline int fi_cntr_set(struct fid_cntr *cntr, uint64_t value)
 {
 	return cntr->ops->set(cntr, value);
 }
 
+static inline int fi_cntr_seterr(struct fid_cntr *cntr, uint64_t value)
+{
+	return FI_CHECK_OP(cntr->ops, struct fi_ops_cntr, seterr) ?
+		cntr->ops->seterr(cntr, value) : -FI_ENOSYS;
+}
+
 static inline int
 fi_cntr_wait(struct fid_cntr *cntr, uint64_t threshold, int timeout)
 {
diff --git a/include/rdma/fi_errno.h b/include/rdma/fi_errno.h
index 8324671..cfb9eb0 100644
--- a/include/rdma/fi_errno.h
+++ b/include/rdma/fi_errno.h
@@ -192,6 +192,7 @@ enum {
 	FI_ETRUNC        = 265, /* Truncation error */
 	FI_ENOKEY        = 266, /* Required key not available */
 	FI_ENOAV	 = 267, /* Missing or unavailable address vector */
+	FI_EOVERRUN	 = 268, /* Queue has been overrun */
 	FI_ERRNO_MAX
 };
 
diff --git a/include/rdma/fi_trigger.h b/include/rdma/fi_trigger.h
index df170ec..52b016b 100644
--- a/include/rdma/fi_trigger.h
+++ b/include/rdma/fi_trigger.h
@@ -34,6 +34,10 @@
 #define FI_TRIGGER_H
 
 #include <rdma/fabric.h>
+#include <rdma/fi_endpoint.h>
+#include <rdma/fi_rma.h>
+#include <rdma/fi_tagged.h>
+#include <rdma/fi_atomic.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -43,11 +47,69 @@ enum fi_trigger_event {
 	FI_TRIGGER_THRESHOLD,
 };
 
+enum fi_op_type {
+	FI_OP_RECV,
+	FI_OP_SEND,
+	FI_OP_TRECV,
+	FI_OP_TSEND,
+	FI_OP_READ,
+	FI_OP_WRITE,
+	FI_OP_ATOMIC,
+	FI_OP_FETCH_ATOMIC,
+	FI_OP_COMPARE_ATOMIC,
+	FI_OP_CNTR_SET,
+	FI_OP_CNTR_ADD
+};
+
 struct fi_trigger_threshold {
 	struct fid_cntr		*cntr;
 	size_t			threshold;
 };
 
+struct fi_op_msg {
+	struct fid_ep		*ep;
+	struct fi_msg		msg;
+	uint64_t		flags;
+};
+
+struct fi_op_tagged {
+	struct fid_ep		*ep;
+	struct fi_msg_tagged	msg;
+	uint64_t		flags;
+};
+
+struct fi_op_rma {
+	struct fid_ep		*ep;
+	struct fi_msg_rma	msg;
+	uint64_t		flags;
+};
+
+struct fi_op_atomic {
+	struct fid_ep		*ep;
+	struct fi_msg_atomic	msg;
+	uint64_t		flags;
+};
+
+struct fi_op_fetch_atomic {
+	struct fid_ep		*ep;
+	struct fi_msg_atomic	msg;
+	struct fi_msg_fetch	fetch;
+	uint64_t		flags;
+};
+
+struct fi_op_compare_atomic {
+	struct fid_ep		*ep;
+	struct fi_msg_atomic	msg;
+	struct fi_msg_fetch	fetch;
+	struct fi_msg_compare	compare;
+	uint64_t		flags;
+};
+
+struct fi_op_cntr {
+	struct fid_cntr		*cntr;
+	uint64_t		value;
+};
+
 #ifdef FABRIC_DIRECT
 #include <rdma/fi_direct_trigger.h>
 #endif
@@ -56,13 +118,42 @@ struct fi_trigger_threshold {
 
 /* Size must match struct fi_context */
 struct fi_triggered_context {
-	enum fi_trigger_event	event_type;
+	enum fi_trigger_event			event_type;
 	union {
 		struct fi_trigger_threshold	threshold;
 		void				*internal[3];
 	} trigger;
 };
 
+/* Size must match struct fi_context2 */
+struct fi_triggered_context2 {
+	enum fi_trigger_event			event_type;
+	union {
+		struct fi_trigger_threshold	threshold;
+		void				*internal[7];
+	} trigger;
+};
+
+struct fi_deferred_work {
+	struct fi_context2			context;
+
+	uint64_t				threshold;
+	struct fid_cntr				*triggering_cntr;
+	struct fid_cntr				*completion_cntr;
+
+	enum fi_op_type				op_type;
+
+	union {
+		struct fi_op_msg		*msg;
+		struct fi_op_tagged		*tagged;
+		struct fi_op_rma		*rma;
+		struct fi_op_atomic		*atomic;
+		struct fi_op_fetch_atomic	*fetch_atomic;
+		struct fi_op_compare_atomic	*compare_atomic;
+		struct fi_op_cntr		*cntr;
+	} op;
+};
+
 #endif
 
 
diff --git a/include/rdma/providers/fi_log.h b/include/rdma/providers/fi_log.h
index ed21009..d4d2e38 100644
--- a/include/rdma/providers/fi_log.h
+++ b/include/rdma/providers/fi_log.h
@@ -54,6 +54,7 @@ enum fi_log_subsys {
 	FI_LOG_CQ,
 	FI_LOG_EQ,
 	FI_LOG_MR,
+	FI_LOG_CNTR,
 	FI_LOG_SUBSYS_MAX
 };
 
diff --git a/include/unix/osd.h b/include/unix/osd.h
index c83eefd..0ec4821 100644
--- a/include/unix/osd.h
+++ b/include/unix/osd.h
@@ -33,12 +33,40 @@
 #ifndef _FI_UNIX_OSD_H_
 #define _FI_UNIX_OSD_H_
 
+#include "config.h"
+
 #include <stdlib.h>
 #include <unistd.h>
 #include <errno.h>
+#include <complex.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+/* MSG_NOSIGNAL doesn't exist on OS X */
+#ifndef MSG_NOSIGNAL
+#define MSG_NOSIGNAL 0
+#endif
+
+#ifndef SOCKET
+#define SOCKET int
+#endif
+
+#ifndef INVALID_SOCKET
+#define INVALID_SOCKET (-1)
+#endif
+
 
 #define FI_DESTRUCTOR(func) static __attribute__((destructor)) void func
 
+#ifndef UNREFERENCED_PARAMETER
+#define OFI_UNUSED(var) (void)var
+#else
+#define OFI_UNUSED UNREFERENCED_PARAMETER
+#endif
+
+#define OFI_SOCK_TRY_RCV_AGAIN(err)			\
+	((err) == EAGAIN || (err) == EWOULDBLOCK)
+
 struct util_shm
 {
 	int		shared_fd;
@@ -57,17 +85,36 @@ static inline void ofi_freealign(void *memptr)
 	free(memptr);
 }
 
-static inline ssize_t ofi_read_socket(int fd, void *buf, size_t count)
+static inline void ofi_osd_init(void)
+{
+}
+
+static inline void ofi_osd_fini(void)
+{
+}
+
+static inline SOCKET ofi_socket(int domain, int type, int protocol)
+{
+	return socket(domain, type, protocol);
+}
+
+static inline ssize_t ofi_read_socket(SOCKET fd, void *buf, size_t count)
 {
 	return read(fd, buf, count);
 }
 
-static inline ssize_t ofi_write_socket(int fd, const void *buf, size_t count)
+static inline ssize_t ofi_write_socket(SOCKET fd, const void *buf, size_t count)
 {
 	return write(fd, buf, count);
 }
 
-static inline int ofi_close_socket(int socket)
+static inline ssize_t ofi_send_socket(SOCKET fd, const void *buf, size_t count,
+				      int flags)
+{
+	return send(fd, buf, count, flags);
+}
+
+static inline int ofi_close_socket(SOCKET socket)
 {
 	return close(socket);
 }
@@ -77,13 +124,74 @@ static inline int ofi_sockerr(void)
 	return errno;
 }
 
-static inline void ofi_osd_init(void)
+static inline int ofi_sysconf(int name)
 {
+	return sysconf(name);
 }
 
-static inline void ofi_osd_fini(void)
-{
+/* OSX has no such definition. So, add it manually */
+#ifndef s6_addr32
+#define s6_addr32 __u6_addr.__u6_addr32
+#endif /* s6_addr32 */
+
+static inline int ofi_is_loopback_addr(struct sockaddr *addr) {
+	return (addr->sa_family == AF_INET &&
+		((struct sockaddr_in *)addr)->sin_addr.s_addr == ntohl(INADDR_LOOPBACK)) ||
+		(addr->sa_family == AF_INET6 &&
+		((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr32[0] == 0 &&
+		((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr32[1] == 0 &&
+		((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr32[2] == 0 &&
+		((struct sockaddr_in6 *)addr)->sin6_addr.s6_addr32[3] == ntohl(1));
 }
 
-#endif /* _FI_UNIX_OSD_H_ */
 
+/* complex operations implementation */
+
+typedef float complex ofi_complex_float;
+typedef double complex ofi_complex_double;
+typedef long double complex ofi_complex_long_double;
+
+#define OFI_DEF_COMPLEX_OPS(type)				\
+static inline int ofi_complex_eq_## type			\
+	(ofi_complex_## type a, ofi_complex_## type b)		\
+{								\
+	return a == b;						\
+}								\
+static inline ofi_complex_## type ofi_complex_sum_## type	\
+	(ofi_complex_## type a, ofi_complex_## type b)		\
+{								\
+	return a + b;						\
+}								\
+static inline ofi_complex_## type ofi_complex_prod_## type	\
+	(ofi_complex_## type a, ofi_complex_## type b)		\
+{								\
+	return a * b;						\
+}								\
+static inline ofi_complex_## type ofi_complex_land_## type	\
+	(ofi_complex_## type a, ofi_complex_## type b)		\
+{								\
+	return a && b;      					\
+}								\
+static inline ofi_complex_## type ofi_complex_lor_## type	\
+	(ofi_complex_## type a, ofi_complex_## type b)		\
+{								\
+	return a || b;						\
+}								\
+static inline int ofi_complex_lxor_## type			\
+	(ofi_complex_## type a, ofi_complex_## type b)		\
+{								\
+	return (a && !b) || (!a && b);				\
+}								\
+
+OFI_DEF_COMPLEX_OPS(float)
+OFI_DEF_COMPLEX_OPS(double)
+OFI_DEF_COMPLEX_OPS(long_double)
+
+
+/* atomics primitives */
+#ifdef HAVE_BUILTIN_ATOMICS
+#define ofi_atomic_add_and_fetch(radix, ptr, val) __sync_add_and_fetch((ptr), (val))
+#define ofi_atomic_sub_and_fetch(radix, ptr, val) __sync_sub_and_fetch((ptr), (val))
+#endif /* HAVE_BUILTIN_ATOMICS */
+
+#endif /* _FI_UNIX_OSD_H_ */
diff --git a/libfabric.map.in b/libfabric.map.in
index a0fc995..ef2f53d 100644
--- a/libfabric.map.in
+++ b/libfabric.map.in
@@ -16,3 +16,11 @@ FABRIC_1.0 {
 		@FI_DIRECT_PROVIDER_API_10@
 	local: *;
 };
+
+FABRIC_1.1 {
+	global:
+		fi_getinfo;
+		fi_freeinfo;
+		fi_dupinfo;
+		fi_fabric;
+} FABRIC_1.0;
diff --git a/libfabric.spec b/libfabric.spec
index d32d693..29fa2fc 100644
--- a/libfabric.spec
+++ b/libfabric.spec
@@ -1,7 +1,14 @@
-%{!?configopts: %global configopts %{nil}}
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+
+
+# Define install_modulefile to 1 if you want this RPM to install a modulefile.
+%{!?install_modulefile: %define install_modulefile 0}
+
+# Path to install modulefiles in
+%{!?modulefile_path: %define modulefile_path /usr/share/Modules/modulefiles}
 
 Name: libfabric
-Version: 1.4.0
+Version: 1.5.2
 Release: 1%{?dist}
 Summary: User-space RDMA Fabric Interfaces
 
@@ -27,12 +34,36 @@ Development files for the libfabric library.
 %setup -q -n %{name}-%{version}
 
 %build
-# defaults: with-dlopen and without-valgrind can be over-rode:
-%configure %{?_without_dlopen} %{?_with_valgrind} %{configopts}
+%configure %{configopts}
 make %{?_smp_mflags}
 
 %install
 rm -rf %{buildroot}
+
+# First, the [optional] modulefile
+
+%if %{install_modulefile}
+%{__mkdir_p} %{buildroot}/%{modulefile_path}/%{name}/
+cat <<EOF >%{buildroot}/%{modulefile_path}/%{name}/%{version}
+#%Module -*- tcl -*-
+#
+# This file was automatically generated by Libfabric RPM.
+#
+# Modulefile for Libfabric %{version}
+#
+
+proc ModulesHelp { } {
+   puts stderr \"\tThis module adds Libfabric %{version} to the environment.\"
+}
+
+module-whatis   \"This module adds Libfabric %{version} to the environment\"
+
+prepend-path PATH %{_prefix}/bin
+prepend-path LD_LIBRARY_PATH %{_libdir}
+prepend-path MANPATH %{_mandir}
+EOF
+%endif
+
 %makeinstall installdirs
 # remove unpackaged files from the buildroot
 rm -f %{buildroot}%{_libdir}/*.la
@@ -49,6 +80,9 @@ rm -rf %{buildroot}
 %{_bindir}/fi_info
 %{_bindir}/fi_strerror
 %{_bindir}/fi_pingpong
+%if %{install_modulefile}
+%{modulefile_path}/%{name}/%{version}
+%endif
 %dir %{_libdir}/libfabric/
 %doc AUTHORS COPYING README
 
diff --git a/libfabric.spec.in b/libfabric.spec.in
index 7e546df..87dc567 100644
--- a/libfabric.spec.in
+++ b/libfabric.spec.in
@@ -1,4 +1,11 @@
-%{!?configopts: %global configopts %{nil}}
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+
+
+# Define install_modulefile to 1 if you want this RPM to install a modulefile.
+%{!?install_modulefile: %define install_modulefile 0}
+
+# Path to install modulefiles in
+%{!?modulefile_path: %define modulefile_path /usr/share/Modules/modulefiles}
 
 Name: libfabric
 Version: @VERSION@
@@ -27,12 +34,36 @@ Development files for the libfabric library.
 %setup -q -n %{name}-%{version}
 
 %build
-# defaults: with-dlopen and without-valgrind can be over-rode:
-%configure %{?_without_dlopen} %{?_with_valgrind} %{configopts}
+%configure %{configopts}
 make %{?_smp_mflags}
 
 %install
 rm -rf %{buildroot}
+
+# First, the [optional] modulefile
+
+%if %{install_modulefile}
+%{__mkdir_p} %{buildroot}/%{modulefile_path}/%{name}/
+cat <<EOF >%{buildroot}/%{modulefile_path}/%{name}/%{version}
+#%Module -*- tcl -*-
+#
+# This file was automatically generated by Libfabric RPM.
+#
+# Modulefile for Libfabric %{version}
+#
+
+proc ModulesHelp { } {
+   puts stderr \"\tThis module adds Libfabric %{version} to the environment.\"
+}
+
+module-whatis   \"This module adds Libfabric %{version} to the environment\"
+
+prepend-path PATH %{_prefix}/bin
+prepend-path LD_LIBRARY_PATH %{_libdir}
+prepend-path MANPATH %{_mandir}
+EOF
+%endif
+
 %makeinstall installdirs
 # remove unpackaged files from the buildroot
 rm -f %{buildroot}%{_libdir}/*.la
@@ -49,6 +80,9 @@ rm -rf %{buildroot}
 %{_bindir}/fi_info
 %{_bindir}/fi_strerror
 %{_bindir}/fi_pingpong
+%if %{install_modulefile}
+%{modulefile_path}/%{name}/%{version}
+%endif
 %dir %{_libdir}/libfabric/
 %doc AUTHORS COPYING README
 
diff --git a/man/man1/fi_info.1 b/man/man1/fi_info.1
index 7ba9412..39ea51a 100644
--- a/man/man1/fi_info.1
+++ b/man/man1/fi_info.1
@@ -1,4 +1,4 @@
-.TH "fi_info" "1" "2016\-09\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_info" "1" "2016\-09\-12" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_info \- Simple utility to query for fabric interfaces
diff --git a/man/man1/fi_pingpong.1 b/man/man1/fi_pingpong.1
index 842da9c..49b23a8 100644
--- a/man/man1/fi_pingpong.1
+++ b/man/man1/fi_pingpong.1
@@ -1,4 +1,4 @@
-.TH "fi_pingpong" "1" "2016\-09\-02" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_pingpong" "1" "2016\-09\-02" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_pingpong \- Quick and simple pingpong test for libfabric
diff --git a/man/man1/fi_strerror.1 b/man/man1/fi_strerror.1
index e46bc2b..d9a876e 100644
--- a/man/man1/fi_strerror.1
+++ b/man/man1/fi_strerror.1
@@ -1,4 +1,4 @@
-.TH "fi_strerror" "1" "2016\-06\-30" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_strerror" "1" "2016\-06\-30" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_strerror \- display libfabric error strings
diff --git a/man/man3/fi_atomic.3 b/man/man3/fi_atomic.3
index ef31619..80a9daf 100644
--- a/man/man3/fi_atomic.3
+++ b/man/man3/fi_atomic.3
@@ -1,4 +1,4 @@
-.TH "fi_atomic" "3" "2016\-10\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_atomic" "3" "2017\-06\-08" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_atomic \- Remote atomic functions
@@ -13,8 +13,9 @@ fi_compare_atomic / fi_compare_atomicv / fi_compare_atomicmsg :
 Initiates an atomic compare\-operation to remote memory, retrieving the
 initial value.
 .PP
-fi_atomicvalid / fi_fetch_atomicvalid / fi_compare_atomicvalid :
-Indicates if a provider supports a specific atomic operation
+fi_atomicvalid / fi_fetch_atomicvalid / fi_compare_atomicvalid /
+fi_query_atomic : Indicates if a provider supports a specific atomic
+operation
 .SH SYNOPSIS
 .IP
 .nf
@@ -81,6 +82,10 @@ int\ fi_fetch_atomicvalid(struct\ fid_ep\ *ep,\ enum\ fi_datatype\ datatype,
 
 int\ fi_compare_atomicvalid(struct\ fid_ep\ *ep,\ enum\ fi_datatype\ datatype,
 \ \ \ \ enum\ fi_op\ op,\ size_t\ *count);
+
+int\ fi_query_atomic(struct\ fid_domain\ *domain,
+\ \ \ \ enum\ fi_datatype\ datatype,\ enum\ fi_op\ op,
+\ \ \ \ struct\ fi_atomic_attr\ *attr,\ uint64_t\ flags);
 \f[]
 .fi
 .SH ARGUMENTS
@@ -418,10 +423,15 @@ struct\ fi_msg_atomic\ {
 \ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ \ data;\ \ \ \ \ /*\ optional\ data\ */
 };
 
+struct\ fi_ioc\ {
+\ \ \ \ void\ \ \ \ \ \ \ \ *addr;\ \ \ \ /*\ local\ address\ */
+\ \ \ \ size_t\ \ \ \ \ \ count;\ \ \ \ /*\ #\ target\ opearnds\ */
+};
+
 struct\ fi_rma_ioc\ {
-\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ addr;\ \ \ \ \ \ /*\ target\ address\ */
-\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ count;\ \ \ \ \ /*\ #\ target\ operands\ */
-\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ key;\ \ \ \ \ \ \ /*\ access\ key\ */
+\ \ \ \ uint64_t\ \ \ \ addr;\ \ \ \ \ /*\ target\ address\ */
+\ \ \ \ size_t\ \ \ \ \ \ count;\ \ \ \ /*\ #\ target\ operands\ */
+\ \ \ \ uint64_t\ \ \ \ key;\ \ \ \ \ \ /*\ access\ key\ */
 };
 \f[]
 .fi
@@ -474,6 +484,43 @@ compare\-atomic operation for a given datatype and operation.
 If an operation is supported, an atomic valid call will return 0, along
 with a count of atomic data units that a single function call will
 operate on.
+.SS Query Atomic Attributes
+.PP
+The fi_query_atomic call acts as an enhanced atomic valid operation (see
+the atomic valid function definitions above).
+It is provided, in part, for future extensibility.
+The query operation reports which atomic operations are supported by the
+domain, for suitably configured endpoints.
+.PP
+The behavior of fi_query_atomic is adjusted based on the flags
+parameter.
+If flags is 0, then the operation reports the supported atomic
+attributes for base atomic operations, similar to fi_atomicvalid for
+endpoints.
+If flags has the FI_FETCH_ATOMIC bit set, the operation behaves similar
+to fi_fetch_atomicvalid.
+Similarly, the flag bit FI_COMPARE_ATOMIC results in query acting as
+fi_compare_atomicvalid.
+The FI_FETCH_ATOMIC and FI_COMPARE_ATOMIC bits may not both be set.
+.PP
+If the FI_TAGGED bit is set, the provider will indicate if it supports
+atomic operations to tagged receive buffers.
+The FI_TAGGED bit may be used by itself, or in conjunction with the
+FI_FETCH_ATOMIC and FI_COMPARE_ATOMIC flags.
+.PP
+The output of fi_query_atomic is struct fi_atomic_attr:
+.IP
+.nf
+\f[C]
+struct\ fi_atomic_attr\ {
+\ \ \ \ size_t\ count;
+\ \ \ \ size_t\ size;
+};
+\f[]
+.fi
+.PP
+The count attribute field is as defined for the atomic valid calls.
+The size field indicates the size in bytes of the atomic datatype.
 .SS Completions
 .PP
 Completed atomic operations are reported to the user through one or more
@@ -521,6 +568,12 @@ This flag can only be used with messages smaller than inject_size.
 \f[I]FI_FENCE\f[] : Indicates that the requested operation, also known
 as the fenced operation, be deferred until all previous operations
 targeting the same target endpoint have completed.
+.PP
+\f[I]FI_TAGGED\f[] : Specifies that the target of the atomic operation
+is a tagged receive buffer instead of an RMA buffer.
+When a tagged buffer is the target memory region, the addr parameter is
+used as a 0\-based byte offset into the tagged buffer, with the key
+parameter specifying the tag.
 .SH RETURN VALUE
 .PP
 Returns 0 on success.
diff --git a/man/man3/fi_av.3 b/man/man3/fi_av.3
index 8274aca..1aad6e2 100644
--- a/man/man3/fi_av.3
+++ b/man/man3/fi_av.3
@@ -1,4 +1,4 @@
-.TH "fi_av" "3" "2016\-09\-19" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_av" "3" "2017\-06\-21" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_av \- Address vector operations
@@ -253,6 +253,7 @@ If an AV has been opened with \f[C]FI_EVENT\f[], then an event queue
 must be bound to the AV before any insertion calls are attempted.
 Any calls to insert addresses before an event queue has been bound will
 fail with \f[C]\-FI_ENOEQ\f[].
+Flags are reserved for future use and must be 0.
 .SS fi_av_insert
 .PP
 The fi_av_insert call inserts zero or more addresses into an AV.
@@ -262,6 +263,8 @@ AV.
 Addresses inserted into an address vector must be in the same format as
 specified in the addr_format field of the fi_info struct provided when
 opening the corresponding domain.
+When using the \f[C]FI_ADDR_STR\f[] format, the \f[C]addr\f[] parameter
+should reference an array of strings (char **).
 .PP
 For AV\[aq]s of type FI_AV_MAP, once inserted addresses have been
 mapped, the mapped values are written into the buffer referenced by
@@ -291,23 +294,37 @@ Because insertions occur at a pre\-determined index, the fi_addr
 parameter may be NULL.
 If fi_addr is non\-NULL, it must reference an array of fi_addr_t, and
 the buffer must remain valid until the insertion operation completes.
-Note that if fi_addr is NULL and synchronous operation is requested,
-individual insertion failures cannot be reported and the application
-must use other calls, such as \f[C]fi_av_lookup\f[] to learn which
-specific addresses failed to insert.
+Note that if fi_addr is NULL and synchronous operation is requested
+without using FI_SYNC_ERR flag, individual insertion failures cannot be
+reported and the application must use other calls, such as
+\f[C]fi_av_lookup\f[] to learn which specific addresses failed to
+insert.
 Since fi_av_remove is provider\-specific, it is recommended that calls
 to fi_av_insert following a call to fi_av_remove always reference a
 valid buffer in the fi_addr parameter.
 Otherwise it may be difficult to determine what the next assigned index
 will be.
 .PP
-\f[I]flags\f[] : The following flag may be passed to fi_av_insert
+\f[I]flags\f[] : The following flag may be passed to AV insertion calls:
+fi_av_insert, fi_av_insertsvc, or fi_av_insertsym.
 .IP \[bu] 2
 \f[I]FI_MORE\f[] : In order to allow optimized address insertion, the
 application may specify the FI_MORE flag to the insert call to give a
 hint to the provider that more insertion requests will follow, allowing
 the provider to aggregate insertion requests if desired.
+An application may make any number of insertion calls with FI_MORE set,
+provided that they are followed by an insertion call without FI_MORE.
+This signifies to the provider that the insertion list is complete.
 Providers are free to ignore FI_MORE.
+.IP \[bu] 2
+\f[I]FI_SYNC_ERR\f[] : This flag applies to synchronous insertions only,
+and is used to retrieve error details of failed insertions.
+If set, the context parameter of insertion calls references an array of
+integers, with context set to address of the first element of the array.
+The resulting status of attempting to insert each address will be
+written to the corresponding array location.
+Successful insertions will be updated to 0.
+Failures will contain a fabric errno code.
 .SS fi_av_insertsvc
 .PP
 The fi_av_insertsvc call behaves similar to fi_av_insert, but allows the
@@ -318,6 +335,11 @@ Node should be a string that corresponds to a hostname or network
 address.
 The service string corresponds to a textual representation of a
 transport address.
+Applications may also pass in an \f[C]FI_ADDR_STR\f[] formatted address
+as the node parameter.
+In such cases, the service parameter must be NULL.
+See fi_getinfo.3 for details on using \f[C]FI_ADDR_STR\f[].
+Supported flags are the same as for fi_av_insert.
 .SS fi_av_insertsym
 .PP
 fi_av_insertsym performs a symmetric insert that inserts a sequential
@@ -345,6 +367,8 @@ If node were replaced by the hostname "host10", the addresses would be:
 host10:5000, host10:5001, host11:5000, host11:5001.
 .PP
 The total number of inserted addresses will be nodecnt x svccnt.
+.PP
+Supported flags are the same as for fi_av_insert.
 .SS fi_av_remove
 .PP
 fi_av_remove removes a set of addresses from an address vector.
@@ -361,6 +385,8 @@ free memory allocated with addresses that will no longer be accessed.
 Inserted addresses are not required to be removed.
 fi_av_close will automatically cleanup any resources associated with
 addresses remaining in the AV when it is invoked.
+.PP
+Flags are reserved for future use and must be 0.
 .SS fi_av_lookup
 .PP
 This call returns the address stored in the address vector that
@@ -410,15 +436,19 @@ Similarly, a provider may lazily release resources from removed entries.
 Insertion calls for an AV opened for synchronous operation will return
 the number of addresses that were successfully inserted.
 In the case of failure, the return value will be less than the number of
-addresses that were specified.
+addresses that was specified.
 .PP
 Insertion calls for an AV opened for asynchronous operation (with
 FI_EVENT flag specified) will return 0 if the operation was successfully
 initiated.
 In the case of failure, a negative fabric errno will be returned.
+Providers are allowed to abort insertion operations in the case of an
+error.
+Addresses that are not inserted because they were aborted will fail with
+an error code of FI_ECANCELED.
 .PP
 In both the synchronous and asynchronous modes of operation, the fi_addr
-buffer associated with a failed insertion will be set to
+buffer associated with a failed or aborted insertion will be set to
 FI_ADDR_NOTAVAIL.
 .PP
 All other calls return 0 on success, or a negative value corresponding
diff --git a/man/man3/fi_cm.3 b/man/man3/fi_cm.3
index a8b219a..0a502f3 100644
--- a/man/man3/fi_cm.3
+++ b/man/man3/fi_cm.3
@@ -1,4 +1,4 @@
-.TH "fi_cm" "3" "2016\-09\-19" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_cm" "3" "2017\-06\-06" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_cm \- Connection management operations
@@ -8,6 +8,9 @@ endpoint connection state.
 .PP
 fi_setname / fi_getname / fi_getpeer : Set local, or return local or
 peer endpoint address.
+.PP
+fi_join / fi_close / fi_mc_addr : Join, leave, or retrieve a multicast
+address.
 .SH SYNOPSIS
 .IP
 .nf
@@ -31,6 +34,13 @@ int\ fi_setname(fid_t\ fid,\ void\ *addr,\ size_t\ addrlen);
 int\ fi_getname(fid_t\ fid,\ void\ *addr,\ size_t\ *addrlen);
 
 int\ fi_getpeer(struct\ fid_ep\ *ep,\ void\ *addr,\ size_t\ *addrlen);
+
+int\ fi_join(struct\ fid_ep\ *ep,\ const\ void\ *addr,\ uint64_t\ flags,
+\ \ \ \ struct\ fid_mc\ **mc,\ void\ *context);
+
+int\ fi_close(struct\ fid\ *mc);
+
+fi_addr_t\ fi_mc_addr(struct\ fid_mc\ *mc);
 \f[]
 .fi
 .SH ARGUMENTS
@@ -57,6 +67,8 @@ connection exchange.
 .PP
 \f[I]info\f[] : Fabric information associated with a connection request.
 .PP
+\f[I]mc\f[] : Multicast group associated with an endpoint.
+.PP
 \f[I]flags\f[] : Additional flags for controlling connection operation.
 .PP
 \f[I]context\f[] : User context associated with the request.
@@ -141,6 +153,11 @@ Note that in the abrupt close case, an FI_SHUTDOWN event will only be
 generated if the peer system is reachable and a service or kernel agent
 on the peer system is able to notify the local endpoint that the
 connection has been aborted.
+.SS fi_close
+.PP
+Fi_close is used to disassociate an endpoint from a multicast group and
+close all resources associated with the group.
+Fi_close must be called on all multicast groups that an endpoint joins.
 .SS fi_setname
 .PP
 The fi_setname call may be used to modify or assign the address of the
@@ -182,9 +199,51 @@ An address may be assigned using fi_setname.
 fi_getpeer is not guaranteed to return a valid peer address until an
 endpoint has been completely connected \-\- an FI_CONNECTED event has
 been generated.
+.SS fi_join
+.PP
+This call attaches an endpoint to a multicast group.
+By default, the endpoint will join the group based on the data transfer
+capabilities of the endpoint.
+For example, if the endpoint has been configured to both send and
+receive data, then the endpoint will be able to initiate and receive
+transfers to and from the multicast group.
+The fi_join flags may be used to restrict access to the multicast group,
+subject to endpoint capability limitations.
+.PP
+Multicast join operations complete asynchronously.
+An endpoint must be bound to an event queue prior to calling fi_join.
+The result of the join operation will be reported to the EQ as an
+FI_JOIN_COMPLETE event.
+Applications cannot issue multicast transfers until receiving
+notification that the join operation has completed.
+Note that an endpoint may begin receiving messages from the multicast
+group as soon as the join completes, which can occur prior to the
+FI_JOIN_COMPLETE event being generated.
+.PP
+Applications must call fi_close on the multicast group to disconnect the
+endpoint from the group.
+After a join operation has completed, the fi_mc_addr call may be used to
+retrieve the address associated with the multicast group.
+.SS fi_mc_addr
+.PP
+Returns the fi_addr_t address associated with a multicast group.
+This address must be used when transmitting data to a multicast group
+and paired with the FI_MULTICAST operation flag.
 .SH FLAGS
 .PP
-Flag values are reserved and must be 0.
+Except in functions noted below, flags are reserved and must be 0.
+.PP
+\f[I]FI_SEND\f[] : Applies to fi_join.
+This flag indicates that the endpoint should join the multicast group as
+a send only member.
+The endpoint must be configured for transmit operations to use this
+flag, or an error will occur.
+.PP
+\f[I]FI_RECV\f[] : Applies to fi_join.
+This flag indicates that the endpoint should join the multicast group
+with receive permissions only.
+The endpoint must be configured for receive operations to use this flag,
+or an error will occur.
 .SH RETURN VALUE
 .PP
 Returns 0 on success.
diff --git a/man/man3/fi_cntr.3 b/man/man3/fi_cntr.3
index e172dca..a5bc5f8 100644
--- a/man/man3/fi_cntr.3
+++ b/man/man3/fi_cntr.3
@@ -1,4 +1,4 @@
-.TH "fi_cntr" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_cntr" "3" "2017\-03\-09" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_cntr \- Completion and event counter operations
@@ -33,8 +33,12 @@ uint64_t\ fi_cntr_readerr(struct\ fid_cntr\ *cntr);
 
 int\ fi_cntr_add(struct\ fid_cntr\ *cntr,\ uint64_t\ value);
 
+int\ fi_cntr_adderr(struct\ fid_cntr\ *cntr,\ uint64_t\ value);
+
 int\ fi_cntr_set(struct\ fid_cntr\ *cntr,\ uint64_t\ value);
 
+int\ fi_cntr_seterr(struct\ fid_cntr\ *cntr,\ uint64_t\ value);
+
 int\ fi_cntr_wait(struct\ fid_cntr\ *cntr,\ uint64_t\ threshold,
 \ \ \ \ int\ timeout);
 \f[]
@@ -69,6 +73,8 @@ to a request.
 Counters typically only count successful completions.
 However, if an operation completes in error, it may increment an
 associated error value.
+That is, a counter actually stores two distinct values, with error
+completions updating an error specific value.
 .SS fi_cntr_open
 .PP
 fi_cntr_open allocates a new fabric counter.
@@ -93,7 +99,7 @@ The specific type which is to counted are one of the following:
 successful completion that occurs on an associated bound endpoint.
 The type of completions \-\- sends and/or receives \-\- which are
 counted may be restricted using control flags when binding the counter
-an the endpoint.
+and the endpoint.
 Counters increment on all successful completions, separately from
 whether the operation generates an entry in an event queue.
 .PP
@@ -106,6 +112,7 @@ associated with a counter, in order to use it in other system calls.
 The following values may be used to specify the type of wait object
 associated with a counter: FI_WAIT_NONE, FI_WAIT_UNSPEC, FI_WAIT_SET,
 FI_WAIT_FD, and FI_WAIT_MUTEX_COND.
+The default is FI_WAIT_NONE.
 .IP \[bu] 2
 \f[I]FI_WAIT_NONE\f[] : Used to indicate that the user will not block
 (wait) for events on the counter.
@@ -181,9 +188,15 @@ error and were unable to update the counter.
 .SS fi_cntr_add
 .PP
 This adds the user\-specified value to the counter.
+.SS fi_cntr_adderr
+.PP
+This adds the user\-specified value to the error value of the counter.
 .SS fi_cntr_set
 .PP
 This sets the counter to the specified value.
+.SS fi_cntr_seterr
+.PP
+This sets the error value of the counter to the specified value.
 .SS fi_cntr_wait
 .PP
 This call may be used to wait until the counter reaches the specified
diff --git a/man/man3/fi_control.3 b/man/man3/fi_control.3
index f82e72b..135a059 100644
--- a/man/man3/fi_control.3
+++ b/man/man3/fi_control.3
@@ -1,4 +1,4 @@
-.TH "fi_control" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_control" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_control \- Perform an operation on a fabric resource.
diff --git a/man/man3/fi_cq.3 b/man/man3/fi_cq.3
index 1b10c45..838b57e 100644
--- a/man/man3/fi_cq.3
+++ b/man/man3/fi_cq.3
@@ -1,4 +1,4 @@
-.TH "fi_cq" "3" "2016\-10\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_cq" "3" "2017\-06\-06" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_cq \- Completion queue operations
@@ -205,10 +205,11 @@ object.
 Wait objects allow applications to block until the wait object is
 signaled, indicating that a completion is available to be read.
 Users may use fi_control to retrieve the underlying wait object
-associated with an CQ, in order to use it in other system calls.
+associated with a CQ, in order to use it in other system calls.
 The following values may be used to specify the type of wait object
-associated with an CQ: FI_WAIT_NONE, FI_WAIT_UNSPEC, FI_WAIT_SET,
+associated with a CQ: FI_WAIT_NONE, FI_WAIT_UNSPEC, FI_WAIT_SET,
 FI_WAIT_FD, and FI_WAIT_MUTEX_COND.
+The default is FI_WAIT_NONE.
 .IP \[bu] 2
 \f[I]FI_WAIT_NONE\f[] : Used to indicate that the user will not block
 (wait) for completions on the CQ.
@@ -248,8 +249,8 @@ associated with the CQ should target.
 This field should be treated as a hint to the provider and may be
 ignored if the provider does not support interrupt affinity.
 .PP
-\f[I]wait_cond\f[] : By default, when a completion is inserted into an
-CQ that supports blocking reads (fi_cq_sread/fi_cq_sreadfrom), the
+\f[I]wait_cond\f[] : By default, when a completion is inserted into a CQ
+that supports blocking reads (fi_cq_sread/fi_cq_sreadfrom), the
 corresponding wait object is signaled.
 Users may specify a condition that must first be met before the wait is
 satisfied.
@@ -295,7 +296,7 @@ The fi_control call is used to access provider or implementation
 specific details of the completion queue.
 Access to the CQ should be serialized across all calls when fi_control
 is invoked, as it may redirect the implementation of CQ operations.
-The following control commands are usable with an CQ.
+The following control commands are usable with a CQ.
 .PP
 \f[I]FI_GETWAIT (void **)\f[] : This command allows the user to retrieve
 the low\-level wait object associated with the CQ.
@@ -304,19 +305,33 @@ the CQ attributes.
 The fi_control arg parameter should be an address where a pointer to the
 returned wait object will be written.
 See fi_eq.3 for addition details using fi_control with FI_GETWAIT.
-.SS fi_cq_read / fi_cq_readfrom
+.SS fi_cq_read
 .PP
-The fi_cq_read and fi_cq_readfrom operations perform a non\-blocking
-read of completion data from the CQ.
+The fi_cq_read operation performs a non\-blocking read of completion
+data from the CQ.
 The format of the completion event is determined using the fi_cq_format
 option that was specified when the CQ was opened.
 Multiple completions may be retrieved from a CQ in a single call.
 The maximum number of entries to return is limited to the specified
 count parameter, with the number of entries successfully read from the
 CQ returned by the call.
+(See return values section below.)
 .PP
-The fi_cq_readfrom call allows the CQ to return source address
-information to the user for any received data.
+CQs are optimized to report operations which have completed
+successfully.
+Operations which fail are reported \[aq]out of band\[aq].
+Such operations are retrieved using the fi_cq_readerr function.
+When an operation that has completed with an unexpected error is
+encountered, it is placed into a temporary error queue.
+Attempting to read from a CQ while an item is in the error queue results
+in fi_cq_read failing with a return code of \-FI_EAVAIL.
+Applications may use this return code to determine when to call
+fi_cq_readerr.
+.SS fi_cq_readfrom
+.PP
+The fi_cq_readfrom call behaves identical to fi_cq_read, with the
+exception that it allows the CQ to return source address information to
+the user for any received data.
 Source address data is only available for those endpoints configured
 with FI_SOURCE capability.
 If fi_cq_readfrom is called on an endpoint for which source addressing
@@ -325,16 +340,29 @@ FI_ADDR_NOTAVAIL.
 The number of input src_addr entries must the the same as the count
 parameter.
 .PP
-CQs are optimized to report operations which have completed
-successfully.
-Operations which fail are reported \[aq]out of band\[aq].
-Such operations are retrieved using the fi_cq_readerr function.
-When an operation that completes with an unexpected error is inserted
-into an CQ, it is placed into a temporary error queue.
-Attempting to read from an CQ while an item is in the error queue
-results in an FI_EAVAIL failure.
-Applications may use this return code to determine when to call
-fi_cq_readerr.
+Returned source addressing data is converted from the native address
+used by the underlying fabric into an fi_addr_t, which may be used in
+transmit operations.
+Typically, returning fi_addr_t requires that the source address be
+inserted into the address vector associated with the receiving endpoint.
+For endpoints allocated using the FI_SOURCE_ERR capability, if the
+source address has not been inserted into the address vector,
+fi_cq_readfrom will return \-FI_EAVAIL.
+The completion will then be reported through fi_cq_readerr with error
+code \-FI_EADDRNOTAVAIL.
+See fi_cq_readerr for details.
+.PP
+If FI_SOURCE is specified without FI_SOURCE_ERR, source addresses which
+cannot be mapped to a local fi_addr_t will be reported as
+FI_ADDR_NOTAVAIL.
+The behavior is dependent on the type of address vector in use.
+For AVs of type FI_AV_MAP, source addresses may be mapped directly to an
+fi_addr_t value, even if the source address were not inserted into the
+AV.
+This allows the provider to optimize the reporting of the source
+fi_addr_t without the overhead of verifying whether the address is in
+the AV.
+If full address validation is necessary, FI_SOURCE_ERR must be used.
 .SS fi_cq_sread / fi_cq_sreadfrom
 .PP
 The fi_cq_sread and fi_cq_sreadfrom calls are the blocking equivalent
@@ -369,6 +397,7 @@ struct\ fi_cq_err_entry\ {
 \ \ \ \ int\ \ \ \ \ \ err;\ \ \ \ \ \ \ \ \ /*\ positive\ error\ code\ */
 \ \ \ \ int\ \ \ \ \ \ prov_errno;\ \ /*\ provider\ error\ code\ */
 \ \ \ \ void\ \ \ \ *err_data;\ \ \ \ /*\ \ error\ data\ */
+\ \ \ \ size_t\ \ \ err_data_size;\ /*\ size\ of\ err_data\ */
 };
 \f[]
 .fi
@@ -382,6 +411,20 @@ The contents of the buffer will remain valid until a subsequent read
 call against the CQ.
 Users may call fi_cq_strerror to convert provider specific error
 information into a printable string for debugging purposes.
+.PP
+Notable completion error codes are given below.
+.PP
+\f[I]FI_EADDRNOTAVAIL\f[] : This error code is used by CQs configured
+with FI_SOURCE_ERR to report completions for which a matching fi_addr_t
+source address could not be found.
+An error code of FI_EADDRNOTAVAIL indicates that the data transfer was
+successfully received and processed, with the fi_cq_err_entry fields
+containing information about the completion.
+The err_data field will be set to the source address data.
+The source address will be in the same format as specified through the
+fi_info addr_format field for the opened domain.
+This may be pass directly into an fi_av_insert call to add the source
+address to the address vector.
 .SS fi_cq_signal
 .PP
 The fi_cq_signal call will unblock any thread waiting in fi_cq_sread or
@@ -456,10 +499,21 @@ The use of this field and its meaning is provider specific.
 It is intended to be used as a debugging aid.
 See fi_cq_strerror for additional details on converting this error data
 into a human readable string.
-Providers are allowed to reuse a single internal buffer to store
-additional error information.
-As a result, error data is only guaranteed to be available until the
-next time the CQ is read.
+.PP
+\f[I]err_data_size\f[] : On input, err_data_size indicates the size of
+the err_data buffer in bytes.
+On output, err_data_size will be set to the number of bytes copied to
+the err_data buffer.
+The err_data information is typically used with fi_cq_strerror to
+provide details about the type of error that occurred.
+.PP
+For compatibility purposes, if err_data_size is 0 on input, or the
+fabric was opened with release < 1.5, err_data will be set to a data
+buffer owned by the provider.
+The contents of the buffer will remain valid until a subsequent read
+call against the CQ.
+Applications must serialize access to the CQ when processing errors to
+ensure that the buffer referenced by err_data does no change.
 .SH COMPLETION FLAGS
 .PP
 Completion flags provide additional details regarding the completed
@@ -489,6 +543,11 @@ This flag may be combined with an FI_SEND or FI_RECV flag.
 completed.
 This flag may be combined with an FI_SEND or FI_RECV flag.
 .PP
+\f[I]FI_MULTICAST\f[] : Indicates that a multicast operation completed.
+This flag may be combined with FI_MSG and relevant flags.
+This flag is only guaranteed to be valid for received messages if the
+endpoint has been configured with FI_SOURCE.
+.PP
 \f[I]FI_READ\f[] : Indicates that a locally initiated RMA or atomic read
 operation has completed.
 This flag may be combined with an FI_RMA or FI_ATOMIC flag.
@@ -502,7 +561,7 @@ atomic read operation has completed.
 This flag may be combined with an FI_RMA or FI_ATOMIC flag.
 .PP
 \f[I]FI_REMOTE_WRITE\f[] : Indicates that a remotely initiated RMA or
-atomic read operation has completed.
+atomic write operation has completed.
 This flag may be combined with an FI_RMA or FI_ATOMIC flag.
 .PP
 \f[I]FI_REMOTE_CQ_DATA\f[] : This indicates that remote CQ data is
@@ -515,7 +574,7 @@ referenced by the completion has been consumed and was released by the
 provider.
 Providers may set this flag on the last message that is received into
 the multi\- recv buffer, or may generate a separate completion that
-indicates that the buffer has been freed.
+indicates that the buffer has been released.
 .PP
 Applications can distinguish between these two cases by examining the
 completion entry flags field.
@@ -526,8 +585,30 @@ received message was placed into the multi\-recv buffer.
 Other fields in the completion entry will be determined based on the
 received message.
 If other flag bits are zero, the provider is reporting that the
-multi\-recv buffer has been freed, and the completion entry is not
+multi\-recv buffer has been released, and the completion entry is not
 associated with a received message.
+.SH NOTES
+.PP
+A completion queue must be bound to at least one enabled endpoint before
+any operation such as fi_cq_read, fi_cq_readfrom, fi_cq_sread,
+fi_cq_sreadfrom etc.
+can be called on it.
+.PP
+Completion flags may be suppressed if the FI_NOTIFY_FLAGS_ONLY mode bit
+has been set.
+When enabled, only the following flags are guaranteed to be set in
+completion data when they are valid: FI_REMOTE_READ and FI_REMOTE_WRITE
+(when FI_RMA_EVENT capability bit has been set), FI_REMOTE_CQ_DATA, and
+FI_MULTI_RECV.
+.PP
+If a completion queue has been overrun, it will be placed into an
+\[aq]overrun\[aq] state.
+Read operations will continue to return any valid, non\-corrupted
+completions, if available.
+After all valid completions have been retrieved, any attempt to read the
+CQ will result in it returning an FI_EOVERRUN error event.
+Overrun completion queues are considered fatal and may not be used to
+report additional completions once the overrun occurs.
 .SH RETURN VALUES
 .PP
 fi_cq_open / fi_cq_signal : Returns 0 on success.
diff --git a/man/man3/fi_domain.3 b/man/man3/fi_domain.3
index 9b36d5b..f41dbdf 100644
--- a/man/man3/fi_domain.3
+++ b/man/man3/fi_domain.3
@@ -1,5 +1,5 @@
 .\"t
-.TH "fi_domain" "3" "2016\-09\-26" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_domain" "3" "2017\-07\-25" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_domain \- Open a fabric access domain
@@ -103,7 +103,7 @@ struct\ fi_domain_attr\ {
 \ \ \ \ enum\ fi_progress\ \ \ \ \ \ data_progress;
 \ \ \ \ enum\ fi_resource_mgmt\ resource_mgmt;
 \ \ \ \ enum\ fi_av_type\ \ \ \ \ \ \ av_type;
-\ \ \ \ enum\ fi_mr_mode\ \ \ \ \ \ \ mr_mode;
+\ \ \ \ int\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ mr_mode;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ mr_key_size;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cq_data_size;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cq_cnt;
@@ -114,6 +114,14 @@ struct\ fi_domain_attr\ {
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ max_ep_rx_ctx;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ max_ep_stx_ctx;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ max_ep_srx_ctx;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ cntr_cnt;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ mr_iov_limit;
+\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ caps;
+\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ mode;
+\ \ \ \ uint8_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *auth_key;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ auth_key_size;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ max_err_data;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ mr_cnt;
 };
 \f[]
 .fi
@@ -295,7 +303,8 @@ provider domain.
 The behavior of the various resource management options depends on
 whether the endpoint is reliable or unreliable, as well as provider and
 protocol specific implementation details, as shown in the following
-tables.
+table.
+The table assumes that all peers enable or disable RM the same.
 .PP
 .TS
 tab(@);
@@ -303,72 +312,83 @@ c c c c c.
 T{
 Resource
 T}@T{
-Unrel EP\-RM Disabled
+DGRAM EP\-no RM
 T}@T{
-Unrel EP\-RM Enabled
+DGRAM EP\-with RM
 T}@T{
-Rel EP\-RM Disabled
+RDM/MSG EP\-no RM
 T}@T{
-Rel EP\-RM Enabled
+RDM/MSG EP\-with RM
 T}
 _
 T{
-Tx
+Tx Ctx
 T}@T{
-error
+undefined error
 T}@T{
 EAGAIN
 T}@T{
-error
+undefined error
 T}@T{
 EAGAIN
 T}
 T{
-Rx
+Rx Ctx
 T}@T{
-error
+undefined error
 T}@T{
 EAGAIN
 T}@T{
-error
+undefined error
 T}@T{
 EAGAIN
 T}
 T{
 Tx CQ
 T}@T{
-error
+undefined error
 T}@T{
 EAGAIN
 T}@T{
-error
+undefined error
 T}@T{
 EAGAIN
 T}
 T{
 Rx CQ
 T}@T{
-error
+undefined error
 T}@T{
-EAGAIN or drop
+EAGAIN
+T}@T{
+undefined error
+T}@T{
+EAGAIN
+T}
+T{
+Target EP
 T}@T{
-error
+dropped
 T}@T{
-EAGAIN or retry
+dropped
+T}@T{
+transmit error
+T}@T{
+retried
 T}
 T{
-Unmatched Recv
+No Rx Buffer
 T}@T{
-buffered or drop
+dropped
 T}@T{
-buffered or drop
+dropped
 T}@T{
-buffered or error
+transmit error
 T}@T{
-buffered or retry
+retried
 T}
 T{
-Recv Overrun
+Rx Buf Overrun
 T}@T{
 truncate or drop
 T}@T{
@@ -385,9 +405,9 @@ not applicable
 T}@T{
 not applicable
 T}@T{
-error
+transmit error
 T}@T{
-error
+transmit error
 T}
 T{
 RMA Overrun
@@ -396,63 +416,75 @@ not applicable
 T}@T{
 not applicable
 T}@T{
-error
+transmit error
 T}@T{
-error
+transmit error
 T}
 .TE
 .PP
 The resource column indicates the resource being accessed by a data
 transfer operation.
-Tx refers to the transmit context when a data transfer operation posted.
-Rx refers to the receive context when receive data buffers are posted.
-When RM is enabled, the provider will ensure that space is available to
-accept the operation.
-If space is not available, the operation will fail with \-FI_EAGAIN.
-If resource management is disabled, the application is responsible for
-ensuring that there is space available before attempting to queue an
-operation.
-.PP
-Tx CQ and Rx CQ refer to the completion queues associated with the
-transmit and receive contexts, respectively.
+.PP
+\f[I]Tx Ctx / Rx Ctx\f[] : Refers to the transmit/receive contexts when
+a data transfer operation is submitted.
+When RM is enabled, attempting to submit a request will fail if the
+context is full.
+If RM is disabled, an undefined error (provider specific) will occur.
+Such errors should be considered fatal to the context, and applications
+must take steps to avoid queue overruns.
+.PP
+\f[I]Tx CQ / Rx CQ\f[] : Refers to the completion queue associated with
+the Tx or Rx context when a local operation completes.
 When RM is disabled, applications must take care to ensure that
 completion queues do not get overrun.
-This can be accomplished by sizing the CQs appropriately or by deferring
+When an overrun occurs, an undefined, but fatal, error will occur
+affecting all endpoints associated with the CQ.
+Overruns can be avoided by sizing the CQs appropriately or by deferring
 the posting of a data transfer operation unless CQ space is available to
 store its completion.
 When RM is enabled, providers may use different mechanisms to prevent CQ
 overruns.
 This includes failing (returning \-FI_EAGAIN) the posting of operations
-that could result in CQ overruns, dropping received messages, or forcing
-requests to be retried.
-.PP
-Unmatched receives and receive overruns deal with the processing of
-messages that consume a receive buffers.
-Unmatched receives references incoming messages that are received by an
-endpoint, but do not have an application data buffer to consume.
-No buffers may be available at the receive side, or buffers may
-available, but restricted from accepting the received message (such as
-being associated with different tags).
-Unmatched receives may be handled by protocol flow control, resulting in
-the message being retried.
-For unreliable endpoints, unmatched messages are usually dropped, unless
-the provider can internally buffer the data.
-An error will usually occur on a reliable endpoint if received data
-cannot be placed if RM is disabled, or the data cannot be received with
-RM enabled after retries have been exhausted.
-.PP
-In some cases, buffering on the receive side may be available, but
-insufficient space may have been provided to receive the full message
-that was sent.
-This is considered an error, however, rather than failing the operation,
-a provider may instead truncate the message and report the truncation to
-the app.
-.PP
-Unmatched RMA and RMA overruns deal with the processing of RMA and
-atomic operations that access registered memory buffers directly.
-RMA operations are not defined for unreliable endpoints.
-For reliable endpoints, unmatched RMA and RMA overruns are both treated
-as errors.
+that could result in CQ overruns, or internally retrying requests (which
+will be hidden from the application).
+See notes at the end of this section regarding CQ resource management
+restrictions.
+.PP
+\f[I]Target EP / No Rx Buffer\f[] : Target EP refers to resources
+associated with the endpoint that is the target of a transmit operation.
+This includes the target endpoint\[aq]s receive queue, posted receive
+buffers (no Rx buffers), the receive side completion queue, and other
+related packet processing queues.
+The defined behavior is that seen by the initiator of a request.
+For FI_EP_DGRAM endpoints, if the target EP queues are unable to accept
+incoming messages, received messages will be dropped.
+For reliable endpoints, if RM is disabled, the transmit operation will
+complete in error.
+If RM is enabled, the provider will internally retry the operation.
+.PP
+\f[I]Rx Buffer Overrun\f[] : This refers to buffers posted to receive
+incoming tagged or untagged messages, with the behavior defined from the
+viewpoint of the sender.
+The behavior for handling received messages that are larger than the
+buffers provided by the application is provider specific.
+Providers may either truncate the message and report a successful
+completion, or fail the operation.
+For datagram endpoints, failed sends will result in the message being
+dropped.
+For reliable endpoints, send operations may complete successfully, yet
+be truncated at the receive side.
+This can occur when the target side buffers received data until an
+application buffer is made available.
+The completion status may also be dependent upon the completion model
+selected byt the application (e.g.
+FI_DELIVERY_COMPLETE versus FI_TRANSMIT_COMPLETE).
+.PP
+\f[I]Unmatched RMA / RMA Overrun\f[] : Unmatched RMA and RMA overruns
+deal with the processing of RMA and atomic operations.
+Unlike send operations, RMA operations that attempt to access a memory
+address that is either not registered for such operations, or attempt to
+access outside of the target memory region will fail, resulting in a
+transmit error.
 .PP
 When a resource management error occurs on an endpoint, the endpoint is
 transitioned into a disabled state.
@@ -462,6 +494,26 @@ For unconnected endpoints, the endpoint must be re\-enabled before it
 will accept new data transfer operations.
 For connected endpoints, the connection is torn down and must be
 re\-established.
+.PP
+There is one notable restriction on the protections offered by resource
+management.
+This occurs when resource management is enabled on an endpoint that has
+been bound to completion queue(s) using the FI_SELECTIVE_COMPLETION
+flag.
+Operations posted to such an endpoint may specify that a successful
+completion should not generate a entry on the corresponding completion
+queue.
+(I.e.
+the operation leaves the FI_COMPLETION flag unset).
+In such situations, the provider is not required to reserve an entry in
+the completion queue to handle the case where the operation fails and
+does generate a CQ entry, which would effectively require tracking the
+operation to completion.
+Applications concerned with avoiding CQ overruns in the occurrence of
+errors must ensure that there is sufficient space in the CQ to report
+failed operations.
+This can typically be achieved by sizing the CQ to at least the same
+size as the endpoint queue(s) that are bound to it.
 .SS AV Type (av_type)
 .PP
 Specifies the type of address vectors that are usable with this domain.
@@ -488,19 +540,60 @@ format is supportable, or may return another AV type to indicate the
 optimal AV type supported by this domain.
 .SS Memory Registration Mode (mr_mode)
 .PP
-Specifies the method of memory registration that is used with this
-domain.
-For additional details on MR mode, see \f[C]fi_mr\f[](3).
+Defines memory registration specific mode bits used with this domain.
+Full details on MR mode options are available in \f[C]fi_mr\f[](3).
 The following values may be specified.
 .PP
-\f[I]FI_MR_UNSPEC\f[] : Any memory registration mode is requested and
-supported.
-.PP
-\f[I]FI_MR_BASIC\f[] : Only basic memory registration operations are
-requested or supported.
-.PP
-\f[I]FI_MR_SCALABLE\f[] : Only scalable memory registration operations
-are requested or supported.
+\f[I]FI_MR_LOCAL\f[] : The provider is optimized around having
+applications register memory for locally accessed data buffers.
+Data buffers used in send and receive operations and as the source
+buffer for RMA and atomic operations must be registered by the
+application for access domains opened with this capability.
+.PP
+\f[I]FI_MR_RAW\f[] : The provider requires additional setup as part of
+their memory registration process.
+This mode is required by providers that use a memory key that is larger
+than 64\-bits.
+.PP
+\f[I]FI_MR_VIRT_ADDR\f[] : Registered memory regions are referenced by
+peers using the virtual address of the registered memory region, rather
+than a 0\-based offset.
+.PP
+\f[I]FI_MR_ALLOCATED\f[] : Indicates that memory registration occurs on
+allocated data buffers, and physical pages must back all virtual
+addresses being registered.
+.PP
+\f[I]FI_MR_PROV_KEY\f[] : Memory registration keys are selected and
+returned by the provider.
+.PP
+\f[I]FI_MR_MMU_NOTIFY\f[] : Indicates that the application is
+responsible for notifying the provider when the page tables referencing
+a registered memory region may have been updated.
+.PP
+\f[I]FI_MR_RMA_EVENT\f[] : Indicates that the memory regions associated
+with completion counters must be explicitly enabled after being bound to
+any counter.
+.PP
+\f[I]FI_MR_UNSPEC\f[] : Defined for compatibility \-\- library versions
+1.4 and earlier.
+Setting mr_mode to 0 indicates that FI_MR_BASIC or FI_MR_SCALABLE are
+requested and supported.
+.PP
+\f[I]FI_MR_BASIC\f[] : Defined for compatibility \-\- library versions
+1.4 and earlier.
+Only basic memory registration operations are requested or supported.
+This mode is equivalent to the FI_MR_VIRT_ADDR, FI_MR_ALLOCATED, and
+FI_MR_PROV_KEY flags being set in later library versions.
+This flag may not be used in conjunction with other mr_mode bits.
+.PP
+\f[I]FI_MR_SCALABLE\f[] : Defined for compatibility \-\- library
+versions 1.4 and earlier.
+Only scalable memory registration operations are requested or supported.
+Scalable registration uses offset based addressing, with application
+selectable memory keys.
+For library versions 1.5 and later, this is the default if no mr_mode
+bits are set.
+This flag may not be used in conjunction with other mr_mode bits.
 .PP
 Buffers used in data transfer operations may require notifying the
 provider of their use before a data transfer can occur.
@@ -516,6 +609,7 @@ registration mode.
 Size of the memory region remote access key, in bytes.
 Applications that request their own MR key must select a value within
 the range specified by this value.
+Key sizes larger than 8 bytes require using the FI_RAW_KEY mode bit.
 .SS CQ Data Size (cq_data_size)
 .PP
 Applications may include a small message with a data transfer that is
@@ -584,6 +678,84 @@ transmit context.
 .PP
 The maximum number of endpoints that may be associated with a shared
 receive context.
+.SS Counter Count (cntr_cnt)
+.PP
+The optimal number of completion counters supported by the domain.
+The cq_cnt value may be a fixed value of the maximum number of counters
+supported by the underlying hardware, or may be a dynamic value, based
+on the default attributes of the domain.
+.SS MR IOV Limit (mr_iov_limit)
+.PP
+This is the maximum number of IO vectors (scatter\-gather elements) that
+a single memory registration operation may reference.
+.SS Capabilities (caps)
+.PP
+Domain level capabilities.
+Domain capabilities indicate domain level features that are supported by
+the provider.
+.PP
+\f[I]FI_LOCAL_COMM\f[] : At a conceptual level, this field indicates
+that the underlying device supports loopback communication.
+More specifically, this field indicates that an endpoint may communicate
+with other endpoints that are allocated from the same underlying named
+domain.
+If this field is not set, an application may need to use an alternate
+domain or mechanism (e.g.
+shared memory) to communicate with peers that execute on the same node.
+.PP
+\f[I]FI_REMOTE_COMM\f[] : This field indicates that the underlying
+provider supports communication with nodes that are reachable over the
+network.
+If this field is not set, then the provider only supports communication
+between processes that execute on the same node \-\- a shared memory
+provider, for example.
+.PP
+\f[I]FI_SHARED_AV\f[] : Indicates that the domain supports the ability
+to share address vectors among multiple processes using the named
+address vector feature.
+.PP
+See \f[C]fi_getinfo\f[](3) for a discussion on primary versus secondary
+capabilities.
+All domain capabilities are considered secondary capabilities.
+.SS mode
+.PP
+The operational mode bit related to using the domain.
+.PP
+\f[I]FI_RESTRICTED_COMP\f[] : This bit indicates that the domain limits
+completion queues and counters to only be used with endpoints, transmit
+contexts, and receive contexts that have the same set of capability
+flags.
+.SS Default authorization key (auth_key)
+.PP
+The default authorization key to associate with endpoint and memory
+registrations created within the domain.
+This field is ignored unless the fabric is opened with API version 1.5
+or greater.
+.SS Default authorization key length (auth_key_size)
+.PP
+The length in bytes of the default authorization key for the domain.
+If set to 0, then no authorization key will be associated with endpoints
+and memory registrations created within the domain unless specified in
+the endpoint or memory registration attributes.
+This field is ignored unless the fabric is opened with API version 1.5
+or greater.
+.SS Max Error Data Size (max_err_data)
+.PP
+: The maximum amount of error data, in bytes, that may be returned as
+part of a completion or event queue error.
+This value corresponds to the err_data_size field in struct
+fi_cq_err_entry and struct fi_eq_err_entry.
+.SS Memory Regions Count (mr_cnt)
+.PP
+The optimal number of memory regions supported by the domain.
+The mr_cnt value may be a fixed value of the maximum number of MRs
+supported by the underlying hardware, or may be a dynamic value, based
+on the default attributes of the domain, such as the supported memory
+registration modes.
+Applications can set the mr_cnt on input to fi_getinfo, in order to
+indicate their memory registration requirements.
+Doing so may allow the provider to optimize any memory registration
+cache or lookup tables.
 .SH RETURN VALUE
 .PP
 Returns 0 on success.
diff --git a/man/man3/fi_endpoint.3 b/man/man3/fi_endpoint.3
index 677cd30..93f8dbb 100644
--- a/man/man3/fi_endpoint.3
+++ b/man/man3/fi_endpoint.3
@@ -1,4 +1,4 @@
-.TH "fi_endpoint" "3" "2016\-10\-25" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_endpoint" "3" "2017\-06\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_endpoint \- Fabric endpoint operations
@@ -9,8 +9,9 @@ Allocate or close an endpoint.
 .RE
 .TP
 .B fi_ep_bind
-Associate an endpoint with an event queue, completion queue, counter, or
-address vector
+Associate an endpoint with hardware resources, such as event queues,
+completion queues, counters, address vectors, or shared transmit/receive
+contexts.
 .RS
 .RE
 .TP
@@ -54,9 +55,11 @@ Open a transmit or receive context.
 .RS
 .RE
 .TP
-.B fi_rx_size_left / fi_tx_size_left
+.B fi_rx_size_left / fi_tx_size_left (DEPRECATED)
 Query the lower bound on how many RX/TX operations may be posted without
 an operation returning \-FI_EAGAIN.
+This functions have been deprecated and will be removed in a future
+version of the library.
 .RS
 .RE
 .SH SYNOPSIS
@@ -114,9 +117,9 @@ int\ fi_getopt(struct\ fid\ *ep,\ int\ level,\ int\ optname,
 int\ fi_setopt(struct\ fid\ *ep,\ int\ level,\ int\ optname,
 \ \ \ \ const\ void\ *optval,\ size_t\ optlen);
 
-ssize_t\ fi_rx_size_left(struct\ fid_ep\ *ep);
+DEPRECATED\ ssize_t\ fi_rx_size_left(struct\ fid_ep\ *ep);
 
-ssize_t\ fi_tx_size_left(struct\ fid_ep\ *ep);
+DEPRECATED\ ssize_t\ fi_tx_size_left(struct\ fid_ep\ *ep);
 \f[]
 .fi
 .SH ARGUMENTS
@@ -384,7 +387,14 @@ targets the given endpoint.
 Use of this flag requires that the endpoint be created using
 FI_RMA_EVENT.
 .PP
+An endpoint may only be bound to a single CQ or counter for a given type
+of operation.
+For example, a EP may not bind to two counters both using FI_WRITE.
+Furthermore, providers may limit CQ and counter bindings to endpoints of
+the same endpoint type (DGRAM, MSG, RDM, etc.).
+.PP
 Connectionless endpoints must be bound to a single address vector.
+.PP
 If an endpoint is using a shared transmit and/or receive context, the
 shared contexts must be bound to the endpoint.
 CQs, counters, AV, and shared contexts must be bound to endpoints before
@@ -439,17 +449,22 @@ period of time.
 This call creates an alias to the specified endpoint.
 Conceptually, an endpoint alias provides an alternate software path from
 the application to the underlying provider hardware.
-Applications configure an alias endpoint with data transfer flags,
-specified through the fi_ep_alias call.
-The flags must include FI_TRANSMIT or FI_RECV (not both) with other
-flags OR\[aq]ed to indicate the type of data transfer the flags should
-apply to.
-This will override the transmit and receive attributes of the alias
-endpoint.
-Typically the attributes of the alias endpoint are different than those
-assigned to the actual endpoint.
-The alias mechanism allows a single endpoint to have multiple optimized
-software interfaces.
+An alias EP differs from its parent endpoint only by its default data
+transfer flags.
+For example, an alias EP may be configured to use a different completion
+mode.
+By default, an alias EP inherits the same data transfer flags as the
+parent endpoint.
+An application can use fi_control to modify the alias EP operational
+flags.
+.PP
+When allocating an alias, an application may configure either the
+transmit or receive operational flags.
+This avoids needing a separate call to fi_control to set those flags.
+The flags passed to fi_ep_alias must include FI_TRANSMIT or FI_RECV (not
+both) with other operational flags OR\[aq]ed in.
+This will override the transmit or receive flags, respectively, for
+operations posted through the alias endpoint.
 All allocated aliases must be closed for the underlying endpoint to be
 released.
 .SS fi_control
@@ -486,6 +501,14 @@ Valid control flags are defined below.
 endpoints.
 It is used to set the connection request backlog for listening
 endpoints.
+.PP
+\f[I]FI_GETWAIT (void **)\f[] : This command allows the user to retrieve
+the file descriptor associated with a socket endpoint.
+The fi_control arg parameter should be an address where a pointer to the
+returned file descriptor will be written.
+See fi_eq.3 for addition details using fi_control with FI_GETWAIT.
+The file descriptor may be used for notification that the endpoint is
+ready to send or receive data.
 .SS fi_getopt / fi_setopt
 .PP
 Endpoint protocol operations may be retrieved using fi_getopt or set
@@ -500,8 +523,8 @@ The following option levels and option names and parameters are defined.
 \f[I]FI_OPT_ENDPOINT\f[]
 .IP \[bu] 2
 \f[I]FI_OPT_MIN_MULTI_RECV \- size_t\f[] : Defines the minimum receive
-buffer space available when the receive buffer is automatically freed
-(see FI_MULTI_RECV).
+buffer space available when the receive buffer is released by the
+provider (see FI_MULTI_RECV).
 Modifying this value is only guaranteed to set the minimum buffer space
 needed on receives posted after the value has been changed.
 It is recommended that applications that want to override the default
@@ -518,7 +541,11 @@ except in the case of passive endpoints, in which the size reflects the
 maximum size of the data that may be present as part of a connection
 request event.
 This option is read only.
-.SS fi_rx_size_left
+.SS fi_rx_size_left (DEPRECATED)
+.PP
+This function has been deprecated and will be removed in a future
+version of the library.
+It may not be supported by all providers.
 .PP
 The fi_rx_size_left call returns a lower bound on the number of receive
 operations that may be posted to the given endpoint without that
@@ -527,7 +554,11 @@ Depending on the specific details of the subsequently posted receive
 operations (e.g., number of iov entries, which receive function is
 called, etc.), it may be possible to post more receive operations than
 originally indicated by fi_rx_size_left.
-.SS fi_tx_size_left
+.SS fi_tx_size_left (DEPRECATED)
+.PP
+This function has been deprecated and will be removed in a future
+version of the library.
+It may not be supported by all providers.
 .PP
 The fi_tx_size_left call returns a lower bound on the number of transmit
 operations that may be posted to the given endpoint without that
@@ -557,6 +588,8 @@ struct\ fi_ep_attr\ {
 \ \ \ \ uint64_t\ \ \ \ \ \ \ \ mem_tag_format;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ tx_ctx_cnt;
 \ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ rx_ctx_cnt;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ auth_key_size;
+\ \ \ \ uint8_t\ \ \ \ \ \ \ \ \ *auth_key;
 };
 \f[]
 .fi
@@ -582,6 +615,22 @@ Flow control is not guaranteed.
 \f[I]FI_EP_RDM\f[] : Reliable datagram message.
 Provides a reliable, unconnected data transfer service with flow control
 that maintains message boundaries.
+.PP
+\f[I]FI_EP_SOCK_STREAM\f[] : Data streaming endpoint with TCP
+socket\-like semantics.
+Provides a reliable, connection\-oriented data transfer service that
+does not maintain message boundaries.
+FI_EP_SOCK_STREAM is most useful for applications designed around using
+TCP sockets.
+See the SOCKET ENDPOINT section for additional details and restrictions
+that apply to stream endpoints.
+.PP
+\f[I]FI_EP_SOCK_DGRAM\f[] : A connectionless, unreliable datagram
+endpoint with UDP socket\-like semantics.
+FI_EP_SOCK_DGRAM is most useful for applications designed around using
+UDP sockets.
+See the SOCKET ENDPOINT section for additional details and restrictions
+that apply to datagram socket endpoints.
 .SS Protocol
 .PP
 Specifies the low\-level end to end protocol employed by the provider.
@@ -770,6 +819,24 @@ request.
 .PP
 See the scalable endpoint and shared contexts sections for additional
 details.
+.SS auth_key_size \- Authorization Key Length
+.PP
+The length of the authorization key in bytes.
+This field will be 0 if authorization keys are not available or used.
+This field is ignored unless the fabric is opened with API version 1.5
+or greater.
+.SS auth_key \- Authorization Key
+.PP
+If supported by the fabric, an authorization key (a.k.a.
+job key) to associate with the endpoint.
+An authorization key is used to limit communication between endpoints.
+Only peer endpoints that are programmed to use the same authorization
+key may communicate.
+Authorization keys are often used to implement job keys, to ensure that
+processes running in different jobs do not accidentally cross traffic.
+The domain authorization key will be used if auth_key_size is set to 0.
+This field is ignored unless the fabric is opened with API version 1.5
+or greater.
 .SH TRANSMIT CONTEXT ATTRIBUTES
 .PP
 Attributes specific to the transmit capabilities of an endpoint are
@@ -1029,17 +1096,25 @@ Data ordering applies to memory accessed as part of a single operation
 and between operations if message ordering is guaranteed.
 .SS total_buffered_recv
 .PP
-Defines the total available space allocated by the provider to buffer
-messages that are received for which there is no matching receive
-operation.
-That is, this defines the minimal amount of receive side buffering
-available.
+This field is supported for backwards compatibility purposes.
+It is a hint to the provider of the total available space that may be
+needed to buffer messages that are received for which there is no
+matching receive operation.
+The provider may adjust or ignore this value.
+The allocation of internal network buffering among received message is
+provider specific.
+For instance, a provider may limit the size of messages which can be
+buffered or the amount of buffering allocated to a single message.
+.PP
 If receive side buffering is disabled (total_buffered_recv = 0) and a
 message is received by an endpoint, then the behavior is dependent on
 whether resource management has been enabled (FI_RM_ENABLED has be set
 or not).
 See the Resource Management section of fi_domain.3 for further
 clarification.
+It is recommended that applications enable resource management if they
+anticipate receiving unexpected messages, rather than modifying this
+value.
 .SS size
 .PP
 The size of the context.
@@ -1072,14 +1147,17 @@ Transmit contexts are independent transmit queues.
 Ordering and synchronization between contexts are not defined.
 Conceptually a transmit context behaves similar to a send\-only
 endpoint.
-A transmit context may be configured with fewer attributes than the base
-endpoint, such as fewer capabilities, relaxed ordering, etc.
+A transmit context may be configured with fewer capabilities than the
+base endpoint and with different attributes (such as ordering
+requirements and inject size) than other contexts associated with the
+same scalable endpoint.
 Each transmit context has its own completion queue.
 The number of transmit contexts associated with an endpoint is specified
 during endpoint creation.
 .PP
 The fi_tx_context call is used to retrieve a specific context,
-identified by an index.
+identified by an index (see above for details on transmit context
+attributes).
 Providers may dynamically allocate contexts when fi_tx_context is
 called, or may statically create all contexts when fi_endpoint is
 invoked.
@@ -1098,8 +1176,10 @@ data.
 Ordering and synchronization between contexts are not guaranteed.
 Conceptually a receive context behaves similar to a receive\-only
 endpoint.
-A receive context may be configured with fewer attributes than the base
-endpoint, such as fewer capabilities, relaxed ordering, etc.
+A receive context may be configured with fewer capabilities than the
+base endpoint and with different attributes (such as ordering
+requirements and inject size) than other contexts associated with the
+same scalable endpoint.
 Each receive context has its own completion queue.
 The number of receive contexts associated with an endpoint is specified
 during endpoint creation.
@@ -1115,7 +1195,8 @@ Support for named receive contexts is coordinated with address vectors.
 See fi_av(3) and fi_rx_addr(3).
 .PP
 The fi_rx_context call is used to retrieve a specific context,
-identified by an index.
+identified by an index (see above for details on receive context
+attributes).
 Providers may dynamically allocate contexts when fi_rx_context is
 called, or may statically create all contexts when fi_endpoint is
 invoked.
@@ -1171,20 +1252,62 @@ Furthermore, an endpoint may use a shared context of one type, but a
 scalable set of contexts of the alternate type.
 .SS fi_stx_context
 .PP
-This call is used to open a shareable transmit context.
-See fi_tx_context call under the SCALABLE ENDPOINTS section for details
-on the transit context attributes.
-The exception is that endpoints attached to a shared transmit context
-must use a subset of the transmit context attributes.
-This is opposite of the requirement for scalable endpoints.
+This call is used to open a shareable transmit context (see above for
+details on the transmit context attributes).
+Endpoints associated with a shared transmit context must use a subset of
+the transmit context\[aq]s attributes.
+Note that this is the reverse of the requirement for transmit contexts
+for scalable endpoints.
 .SS fi_srx_context
 .PP
-This allocates a shareable receive context.
-See fi_rx_context call under SCALABLE ENDPOINTS section for details on
-the receive context attributes.
-The exception is that endpoints attached to a shared receive context
-must use a subset of the receive context attributes.
-This is opposite of the requirement for scalable endpoints.
+This allocates a shareable receive context (see above for details on the
+receive context attributes).
+Endpoints associated with a shared receive context must use a subset of
+the receive context\[aq]s attributes.
+Note that this is the reverse of the requirement for receive contexts
+for scalable endpoints.
+.SH SOCKET ENDPOINTS
+.PP
+The following feature and description should be considered experimental.
+Until the experimental tag is removed, the interfaces, semantics, and
+data structures associated with socket endpoints may change between
+library versions.
+.PP
+This section applies to endpoints of type FI_EP_SOCK_STREAM and
+FI_EP_SOCK_DGRAM, commonly referred to as socket endpoints.
+.PP
+Socket endpoints are defined with semantics that allow them to more
+easily be adopted by developers familiar with the UNIX socket API, or by
+middleware that exposes the socket API, while still taking advantage of
+high\-performance hardware features.
+.PP
+The key difference between socket endpoints and other active endpoints
+are socket endpoints use synchronous data transfers.
+Buffers passed into send and receive operations revert to the control of
+the application upon returning from the function call.
+As a result, no data transfer completions are reported to the
+application, and socket endpoints are not associated with completion
+queues or counters.
+.PP
+Socket endpoints support a subset of message operations: fi_send,
+fi_sendv, fi_sendmsg, fi_recv, fi_recvv, fi_recvmsg, and fi_inject.
+Because data transfers are synchronous, the return value from send and
+receive operations indicate the number of bytes transferred on success,
+or a negative value on error, including \-FI_EAGAIN if the endpoint
+cannot send or receive any data because of full or empty queues,
+respectively.
+.PP
+Socket endpoints are associated with event queues and address vectors,
+and process connection management events asynchronously, similar to
+other endpoints.
+Unlike UNIX sockets, socket endpoint must still be declared as either
+active or passive.
+.PP
+Socket endpoints behave like non\-blocking sockets.
+In order to support select and poll semantics, active socket endpoints
+are associated with a file descriptor that is signaled whenever the
+endpoint is ready to send and/or receive data.
+The file descriptor may be retrieved using fi_control.
 .SH OPERATION FLAGS
 .PP
 Operation flags are obtained by OR\-ing the following flags together.
@@ -1211,12 +1334,14 @@ Use of this flag may cause a single posted receive operation to generate
 multiple completions as messages are placed into the buffer.
 The placement of received data into the buffer may be subjected to
 provider specific alignment restrictions.
-The buffer will be returned to the application\[aq]s control, and an
-\f[I]FI_MULTI_RECV\f[] completion will be generated, when a message is
-received that cannot fit into the remaining free buffer space.
+The buffer will be released by the provider when the available buffer
+space falls below the specified minimum (see FI_OPT_MIN_MULTI_RECV).
 .PP
 \f[I]FI_COMPLETION\f[] : Indicates that a completion entry should be
 generated for data transfer operations.
+This flag only applies to operations issued on endpoints that were bound
+to a CQ or counter with the FI_SELECTIVE_COMPLETION flag.
+See the fi_ep_bind section above for more detail.
 .PP
 \f[I]FI_INJECT_COMPLETE\f[] : Indicates that a completion should be
 generated when the source buffer(s) may be reused.
@@ -1261,6 +1386,11 @@ For operations that return data to the initiator, such as RMA read or
 atomic\-fetch, the source endpoint is also considered a destination
 endpoint.
 This is the default completion mode for such operations.
+.PP
+\f[I]FI_MULTICAST\f[] : Indicates that data transfers will target
+multicast addresses by default.
+Any fi_addr_t passed into a data transfer operation will be treated as a
+multicast address.
 .SH NOTES
 .PP
 Users should call fi_close to release all resources allocated to the
diff --git a/man/man3/fi_eq.3 b/man/man3/fi_eq.3
index b36806b..a15b3b0 100644
--- a/man/man3/fi_eq.3
+++ b/man/man3/fi_eq.3
@@ -1,4 +1,4 @@
-.TH "fi_eq" "3" "2016\-06\-23" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_eq" "3" "2017\-03\-13" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_eq \- Event queue operations
@@ -130,6 +130,7 @@ associated with an EQ:
 (wait) for events on the EQ.
 When FI_WAIT_NONE is specified, the application may not call
 fi_eq_sread.
+This is the default is no wait object is specified.
 .IP \[bu] 2
 \f[I]FI_WAIT_UNSPEC\f[] : Specifies that the user will only wait on the
 EQ using fabric interface calls, such as fi_eq_sread.
@@ -223,8 +224,8 @@ information regarding the format associated with each event.
 \f[I]Asynchronous Control Operations\f[] : Asynchronous control
 operations are basic requests that simply need to generate an event to
 indicate that they have completed.
-These include the following types of events: memory registration and
-address vector resolution.
+These include the following types of events: memory registration,
+address vector resolution, and multicast joins.
 .PP
 Control requests report their completion by inserting a
 \f[C]struct\ \ \ fi_eq_entry\f[] into the EQ.
@@ -244,8 +245,9 @@ For the completion of basic asynchronous control operations, the
 returned event will indicate the operation that has completed, and the
 fid will reference the fabric descriptor associated with the event.
 For memory registration, this will be an FI_MR_COMPLETE event and the
-fid_mr; address resolution will reference an FI_AV_COMPLETE event and
-fid_av.
+fid_mr.
+Address resolution will reference an FI_AV_COMPLETE event and fid_av.
+Multicast joins will report an FI_JOIN_COMPLETE and fid_mc.
 The context field will be set to the context specified as part of the
 operation, if available, otherwise the context will be associated with
 the fabric descriptor.
@@ -402,12 +404,92 @@ through the prov_errno and err_data fields.
 Users may call fi_eq_strerror to convert provider specific error
 information into a printable string for debugging purposes.
 .PP
-If err_data_size is > 0, then the buffer referenced by err_data is
-directly user\-accessible.
+On input, err_data_size indicates the size of the err_data buffer in
+bytes.
+On output, err_data_size will be set to the number of bytes copied to
+the err_data buffer.
+The err_data information is typically used with fi_eq_strerror to
+provide details about the type of error that occurred.
+.PP
+For compatibility purposes, if err_data_size is 0 on input, or the
+fabric was opened with release < 1.5, err_data will be set to a data
+buffer owned by the provider.
+The contents of the buffer will remain valid until a subsequent read
+call against the EQ.
+Applications must serialize access to the EQ when processing errors to
+ensure that the buffer referenced by err_data does not change.
+.SH EVENT FIELDS
+.PP
+The EQ entry data structures share many of the same fields.
+The meanings are the same or similar for all EQ structure formats, with
+specific details described below.
+.PP
+\f[I]fid\f[] : This corresponds to the fabric descriptor associated with
+the event.
+The type of fid depends on the event being reported.
+For FI_CONNREQ this will be the fid of the passive endpoint.
+FI_CONNECTED and FI_SHUTDOWN will reference the active endpoint.
+FI_MR_COMPLETE and FI_AV_COMPLETE will refer to the MR or AV fabric
+descriptor, respectively.
+FI_JOIN_COMPLETE will point to the multicast descriptor returned as part
+of the join operation.
+Applications can use fid\->context value to retreive the context
+associated with the fabric descriptor.
+.PP
+\f[I]context\f[] : The context value is set to the context parameter
+specified with the operation that generated the event.
+If no context parameter is associated with the operation, this field
+will be NULL.
+.PP
+\f[I]data\f[] : Data is an operation specific value or set of bytes.
+For connection events, data is application data exchanged as part of the
+connection protocol.
+.PP
+\f[I]err\f[] : This err code is a positive fabric errno associated with
+an event.
+The err value indicates the general reason for an error, if one
+occurred.
+See fi_errno.3 for a list of possible error codes.
+.PP
+\f[I]prov_errno\f[] : On an error, prov_errno may contain a provider
+specific error code.
+The use of this field and its meaning is provider specific.
+It is intended to be used as a debugging aid.
+See fi_eq_strerror for additional details on converting this error value
+into a human readable string.
+.PP
+\f[I]err_data\f[] : On an error, err_data may reference a provider
+specific amount of data associated with an error.
+The use of this field and its meaning is provider specific.
+It is intended to be used as a debugging aid.
+See fi_eq_strerror for additional details on converting this error data
+into a human readable string.
+.PP
+\f[I]err_data_size\f[] : On input, err_data_size indicates the size of
+the err_data buffer in bytes.
+On output, err_data_size will be set to the number of bytes copied to
+the err_data buffer.
+The err_data information is typically used with fi_eq_strerror to
+provide details about the type of error that occurred.
+.PP
+For compatibility purposes, if err_data_size is 0 on input, or the
+fabric was opened with release < 1.5, err_data will be set to a data
+buffer owned by the provider.
 The contents of the buffer will remain valid until a subsequent read
 call against the EQ.
-Applications which read the err_data buffer must ensure that they do not
-read past the end of the referenced buffer.
+Applications must serialize access to the EQ when processing errors to
+ensure that the buffer referenced by err_data does no change.
+.SH NOTES
+.PP
+If an event queue has been overrun, it will be placed into an
+\[aq]overrun\[aq] state.
+Write operations against an overrun EQ will fail with \-FI_EOVERRUN.
+Read operations will continue to return any valid, non\-corrupted
+events, if available.
+After all valid events have been retrieved, any attempt to read the EQ
+will result in it returning an FI_EOVERRUN error event.
+Overrun event queues are considered fatal and may not be used to report
+additional events once the overrun occurs.
 .SH RETURN VALUES
 .PP
 fi_eq_open : Returns 0 on success.
diff --git a/man/man3/fi_errno.3 b/man/man3/fi_errno.3
index af82e16..5be41f6 100644
--- a/man/man3/fi_errno.3
+++ b/man/man3/fi_errno.3
@@ -1,4 +1,4 @@
-.TH "fi_errno" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_errno" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_errno \- fabric errors
diff --git a/man/man3/fi_fabric.3 b/man/man3/fi_fabric.3
index cc289cd..0706ce8 100644
--- a/man/man3/fi_fabric.3
+++ b/man/man3/fi_fabric.3
@@ -1,4 +1,4 @@
-.TH "fi_fabric" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_fabric" "3" "2017\-07\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_fabric \- Fabric domain operations
@@ -114,6 +114,7 @@ struct\ fi_fabric_attr\ {
 \ \ \ \ char\ \ \ \ \ \ \ \ \ \ \ \ \ \ *name;
 \ \ \ \ char\ \ \ \ \ \ \ \ \ \ \ \ \ \ *prov_name;
 \ \ \ \ uint32_t\ \ \ \ \ \ \ \ \ \ prov_version;
+\ \ \ \ uint32_t\ \ \ \ \ \ \ \ \ \ api_version;
 };
 \f[]
 .fi
@@ -128,10 +129,16 @@ If no instance has been opened, this field will be NULL.
 .SS name
 .PP
 A fabric identifier.
-.SS prov_name
+.SS prov_name \- Provider Name
 .PP
 The name of the underlying fabric provider.
 .PP
+To request an utility provider layered over a specific core provider,
+both the provider names have to be specified using ";" as delimiter.
+.PP
+e.g.
+"ofi_rxm;verbs" or "verbs;ofi_rxm"
+.PP
 For debugging and administrative purposes, environment variables can be
 used to control which fabric providers will be registered with
 libfabric.
@@ -144,9 +151,16 @@ results.
 Applications which need a specific set of providers should implement
 their own filtering of fi_getinfo\[aq]s results rather than relying on
 these environment variables in a production setting.
-.SS prov_version
+.SS prov_version \- Provider Version
 .PP
 Version information for the fabric provider.
+In case of an utility provider layered over a core provider, the version
+would always refer to that of the utility provider.
+.SS api_version
+.PP
+The interface version requested by the application.
+This value corresponds to the version parameter passed into
+\f[C]fi_getinfo(3)\f[].
 .SH RETURN VALUE
 .PP
 Returns FI_SUCCESS on success.
diff --git a/man/man3/fi_getinfo.3 b/man/man3/fi_getinfo.3
index 508db3e..6623b73 100644
--- a/man/man3/fi_getinfo.3
+++ b/man/man3/fi_getinfo.3
@@ -1,4 +1,4 @@
-.TH "fi_getinfo" "3" "2016\-10\-27" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_getinfo" "3" "2017\-07\-25" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_getinfo / fi_freeinfo \- Obtain / free fabric interface information
@@ -82,6 +82,15 @@ If node is provided, fi_getinfo will attempt to resolve the fabric
 address to the given node.
 If node is not given, fi_getinfo will attempt to resolve the fabric
 addressing information based on the provided hints.
+Node is commonly used to provide a network address (such as an IP
+address) or hostname.
+Service is usually associated with a transport address (such as a TCP
+port number).
+Node and service parameters may be mapped by providers to native fabric
+addresses.
+Applications may also pass in an FI_ADDR_STR formatted address (see
+format details below) as the node parameter.
+In such cases, the service parameter must be NULL.
 .PP
 The hints parameter, if provided, may be used to limit the resulting
 output as indicated below.
@@ -159,13 +168,21 @@ NULL.
 address.
 This field will be ignored in hints if FI_SOURCE flag is set.
 On output a provider shall return an address that corresponds to the
-indicated fabric or domain, with the format indicated by the returned
+indicated fabric, domain, node, and/or service fields.
+The format of the address is indicated by the returned
 \f[I]addr_format\f[] field.
+Note that any returned address is only used when opening a local
+endpoint.
+The address is not guaranteed to be usable by a peer process.
 .PP
 \f[I]dest_addr \- destination address\f[] : If specified, indicates the
 destination address.
 This field will be ignored in hints unless the node and service
 parameters are NULL or FI_SOURCE flag is set.
+If FI_SOURCE is not specified, on output a provider shall return an
+address the corresponds to the indicated node and/or service fields,
+relative to the fabric and domain.
+Note that any returned address is only usable locally.
 .PP
 \f[I]handle \- provider context handle\f[] : References a provider
 specific handle.
@@ -290,6 +307,12 @@ Applications can use the FI_READ, FI_WRITE, FI_REMOTE_READ, and
 FI_REMOTE_WRITE flags to restrict the types of atomic operations
 supported by an endpoint.
 .PP
+\f[I]FI_MULTICAST\f[] : Indicates that the endpoint support multicast
+data transfers.
+This capability must be paired with at least one other data transfer
+capability, (e.g.
+FI_MSG, FI_SEND, FI_RECV, ...).
+.PP
 \f[I]FI_NAMED_RX_CTX\f[] : Requests that endpoints which support
 multiple receive contexts allow an initiator to target (or name) a
 specific receive context as part of a data transfer operation.
@@ -310,6 +333,8 @@ Note that returning source address information may require that the
 provider perform address translation and/or look\-up based on data
 available in the underlying protocol in order to provide the requested
 data, which may adversely affect performance.
+The performance impact may be greater for address vectors of type
+FI_AV_TABLE.
 .PP
 \f[I]FI_READ\f[] : Indicates that the user requires an endpoint capable
 of initiating reads against remote memory regions.
@@ -343,6 +368,9 @@ operation.
 This flag requires that FI_REMOTE_READ and/or FI_REMOTE_WRITE be enabled
 on the endpoint.
 .PP
+\f[I]FI_SHARED_AV\f[] : Requests or indicates support for address
+vectors which may be shared among multiple processes.
+.PP
 \f[I]FI_TRIGGER\f[] : Indicates that the endpoint should support
 triggered operations.
 Endpoints support this capability must meet the usage model as described
@@ -357,6 +385,33 @@ Fenced operations are often used to enforce ordering between operations
 that are not otherwise guaranteed by the underlying provider or
 protocol.
 .PP
+\f[I]FI_LOCAL_COMM\f[] : Indicates that the endpoint support host local
+communication.
+This flag may be used in conjunction with FI_REMOTE_COMM to indicate
+that local and remote communication are required.
+If neither FI_LOCAL_COMM or FI_REMOTE_COMM are specified, then the
+provider will indicate support for the configuration that minimally
+affects performance.
+Providers that set FI_LOCAL_COMM but not FI_REMOTE_COMM, for example a
+shared memory provider, may only be used to communication between
+processes on the same system.
+.PP
+\f[I]FI_REMOTE_COMM\f[] : Indicates that the endpoint support
+communication with endpoints located at remote nodes (across the
+fabric).
+See FI_LOCAL_COMM for additional details.
+Providers that set FI_REMOTE_COMM but not FI_LOCAL_COMM, for example
+NICs that lack loopback support, cannot be used to communicate with
+processes on the same system.
+.PP
+\f[I]FI_SOURCE_ERR\f[] : Must be paired with FI_SOURCE.
+When specified, this requests that raw source addressing data be
+returned as part of completion data for any address that has not been
+inserted into the local address vector.
+Use of this capability may require the provider to validate incoming
+source address data against addresses stored in the local address
+vector, which may adversely affect performance.
+.PP
 Capabilities may be grouped into two general categories: primary and
 secondary.
 Primary capabilities must explicitly be requested by an application, and
@@ -369,11 +424,12 @@ A provider may optionally report non\-selected secondary capabilities if
 doing so would not compromise performance or security.
 .PP
 Primary capabilities: FI_MSG, FI_RMA, FI_TAGGED, FI_ATOMIC,
-FI_NAMED_RX_CTX, FI_DIRECTED_RECV, FI_READ, FI_WRITE, FI_RECV, FI_SEND,
-FI_REMOTE_READ, and FI_REMOTE_WRITE.
+FI_MULTICAST, FI_NAMED_RX_CTX, FI_DIRECTED_RECV, FI_READ, FI_WRITE,
+FI_RECV, FI_SEND, FI_REMOTE_READ, and FI_REMOTE_WRITE.
 .PP
 Secondary capabilities: FI_MULTI_RECV, FI_SOURCE, FI_RMA_EVENT,
-FI_TRIGGER, FI_FENCE.
+FI_SHARED_AV, FI_TRIGGER, FI_FENCE, FI_LOCAL_COMM, FI_REMOTE_COMM,
+FI_SOURCE_ERR.
 .SH MODE
 .PP
 The operational mode bits are used to convey requirements that an
@@ -411,11 +467,26 @@ Users should not update or interpret the fields in this structure, or
 reuse it until the original operation has completed.
 The structure is specified in rdma/fabric.h.
 .PP
+\f[I]FI_CONTEXT2\f[] : This bit is similar to FI_CONTEXT, but doubles
+the provider\[aq]s requirement on the size of the per context structure.
+When set, this specifies that the provider requires that applications
+use struct fi_context2 as their per operation context parameter.
+Or, optionally, an application can provide an array of two fi_context
+structures (e.g.
+struct fi_context[2]) instead.
+The requirements for using struct fi_context2 are identical as defined
+for FI_CONTEXT above.
+.PP
 \f[I]FI_LOCAL_MR\f[] : The provider is optimized around having
 applications register memory for locally accessed data buffers.
 Data buffers used in send and receive operations and as the source
 buffer for RMA and atomic operations must be registered by the
 application for access domains opened with this capability.
+This flag is defined for compatibility and is ignored if the application
+version is 1.5 or later and the domain mr_mode is set to anything other
+than FI_MR_BASIC or FI_MR_SCALABLE.
+See the domain attribute mr_mode \f[C]fi_domain\f[](3) and
+\f[C]fi_mr\f[](3).
 .PP
 \f[I]FI_MSG_PREFIX\f[] : Message prefix mode indicates that an
 application will provide buffer space in front of all message send and
@@ -473,6 +544,22 @@ When set, a data transfer that carries remote CQ data will consume a
 receive buffer at the target.
 This is true even for operations that would normally not consume posted
 receive buffers, such as RMA write operations.
+.PP
+\f[I]FI_NOTIFY_FLAGS_ONLY\f[] : This bit indicates that general
+completion flags may not be set by the provider, and are not needed by
+the application.
+If specified, completion flags which simply report the type of operation
+that completed (e.g.
+send or receive) may not be set.
+However, completion flags that are used for remote notifications will
+still be set when applicable.
+See \f[C]fi_cq\f[](3) for details on which completion flags are valid
+when this mode bit is enabled.
+.PP
+\f[I]FI_RESTRICTED_COMP\f[] : This bit indicates that the application
+will only share completion queues and counters among endpoints, transmit
+contexts, and receive contexts that have the same set of capability
+flags.
 .SH ADDRESSING FORMATS
 .PP
 Multiple fabric interfaces take as input either a source or destination
@@ -515,6 +602,20 @@ used with their PSMX (extended performance scaled messaging) protocol.
 .PP
 \f[I]FI_ADDR_GNI\f[] : Address is a Cray proprietary format that is used
 with their GNI protocol.
+.PP
+\f[I]FI_ADDR_STR\f[] : Address is a formatted character string.
+The length and content of the string is address and/or provider
+specific, but in general follows a URI model:
+.PP
+address_format[://[node][:[service][/[field3]...][?[key=value][&k2=v2]...]]]
+.PP
+Examples: \- fi_sockaddr://10.31.6.12:7471 \-
+fi_sockaddr_in6://[fe80::6:12]:7471 \-
+fi_sockaddr://10.31.6.12:7471?qos=3
+.PP
+Since the string formatted address does not contain any provider
+information, the prov_name field of the fabric attribute structure
+should be used to filter by provider if necessary.
 .SH FLAGS
 .PP
 The operation of the fi_getinfo call may be controlled through the use
diff --git a/man/man3/fi_mr.3 b/man/man3/fi_mr.3
index 94ab392..9ef9b27 100644
--- a/man/man3/fi_mr.3
+++ b/man/man3/fi_mr.3
@@ -1,4 +1,4 @@
-.TH "fi_mr" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_mr" "3" "2017\-06\-06" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_mr \- Memory region operations
@@ -14,8 +14,20 @@ memory region
 fi_mr_key : Return the remote key needed to access a registered memory
 region
 .PP
+fi_mr_raw_attr : Return raw memory region attributes.
+.PP
+fi_mr_map_raw : Converts a raw memory region key into a key that is
+usable for data transfer operations.
+.PP
+fi_mr_unmap_key : Releases a previously mapped raw memory region key.
+.PP
 fi_mr_bind : Associate a registered memory region with a completion
 counter.
+.PP
+fi_mr_refresh : Updates the memory pages associated with a memory
+region.
+.PP
+fi_mr_enable : Enables a memory region for use.
 .SH SYNOPSIS
 .IP
 .nf
@@ -39,7 +51,20 @@ void\ *\ fi_mr_desc(struct\ fid_mr\ *mr);
 
 uint64_t\ fi_mr_key(struct\ fid_mr\ *mr);
 
+int\ fi_mr_raw_attr(struct\ fid_mr\ *mr,\ uint64_t\ *base_addr,
+\ \ \ \ uint8_t\ *raw_key,\ size_t\ *key_size,\ uint64_t\ flags);
+
+int\ fi_mr_map_raw(struct\ fid_domain\ *domain,\ uint64_t\ base_addr,
+\ \ \ \ uint8_t\ *raw_key,\ size_t\ key_size,\ uint64_t\ *key,\ uint64_t\ flags);
+
+int\ fi_mr_unmap_key(struct\ fid_domain\ *domain,\ uint64_t\ key);
+
 int\ fi_mr_bind(struct\ fid_mr\ *mr,\ struct\ fid\ *bfid,\ uint64_t\ flags);
+
+int\ fi_mr_refresh(struct\ fid_mr\ *mr,\ const\ struct\ iovec\ *iov,\ size,\ count,
+\ \ \ \ uint64_t\ flags)
+
+int\ fi_mr_enable(struct\ fid_mr\ *mr);
 \f[]
 .fi
 .SH ARGUMENTS
@@ -81,6 +106,53 @@ A memory buffer must be registered with a resource domain before it can
 be used as the target of a remote RMA or atomic data transfer.
 Additionally, a fabric provider may require that data buffers be
 registered before being used in local transfers.
+Memory registration restrictions are controlled using a separate set of
+mode bits, specified through the domain attributes (mr_mode field).
+.PP
+The following apply to memory registration.
+.PP
+\f[I]Scalable Memory Registration\f[] : By default, memory registration
+is considered scalable.
+(For library versions 1.4 and earlier, this is indicated by setting
+mr_mode to FI_MR_SCALABLE, with the fi_info mode bit FI_LOCAL_MR set to
+0).
+For versions 1.5 and later, scalable is implied by the lack of any
+mr_mode bits being set.
+The setting of mr_mode bits therefore adjusts application behavior as
+described below.
+Default, scalable registration has several properties.
+.PP
+In scalable mode, registration occurs on memory address ranges.
+Because registration refers to memory regions, versus data buffers, the
+address ranges given for a registration request do not need to map to
+data buffers allocated by the application at the time the registration
+call is made.
+That is, an application can register any range of addresses in their
+virtual address space, whether or not those addresses are backed by
+physical pages or have been allocated.
+.PP
+The resulting memory regions are accessible by peers starting at a base
+address of 0.
+That is, the target address that is specified is a byte offset into the
+registered region.
+.PP
+The application also selects the access key associated with the MR.
+The key size is restricted to a maximum of 8 bytes.
+.PP
+With scalable registration, locally accessed data buffers are not
+registered.
+This includes source buffers for all transmit operations \-\- sends,
+tagged sends, RMA, and atomics \-\- as well as buffers posted for
+receive and tagged receive operations.
+.PP
+\f[I]FI_MR_LOCAL\f[] : When the FI_MR_LOCAL mode bit is set,
+applications must register all data buffers that will be accessed by the
+local hardware and provide a valid mem_desc parameter into applicable
+data transfer operations.
+When FI_MR_LOCAL is zero, applications are not required to register data
+buffers before using them for local operations (e.g.
+send and receive data buffers), and the mem_desc parameter into data
+transfer operations is ignored.
 .PP
 A provider may hide local registration requirements from applications by
 making use of an internal registration cache or similar mechanisms.
@@ -90,54 +162,90 @@ In order to support as broad range of applications as possible, without
 unduly affecting their performance, applications that wish to manage
 their own local memory registrations may do so by using the memory
 registration calls.
-Applications may use the FI_LOCAL_MR domain mode bit as a guide.
 .PP
-When the FI_LOCAL_MR mode bit is set, applications must register all
-data buffers that will be accessed by the local hardware and provide a
-valid mem_desc parameter into applicable data transfer operations.
-When FI_LOCAL_MR is zero, applications are not required to register data
-buffers before using them for local operations (e.g.
-send and receive data buffers), and the mem_desc parameter into data
-transfer operations is ignored.
-.PP
-Further behavior of memory registration operations is controlled based
-on the mr_mode field in the domain attribute.
-.PP
-\f[I]Basic Memory Registration Mode\f[] : If the mr_mode field is set to
-FI_MR_BASIC, then memory registration operations are set to basic mode.
-In basic mode, registration occurs on allocated data buffers, and the MR
-attributes are selected by the provider.
-.PP
-Basic mode uses provider assigned attributes for the registered buffers.
-The local memory descriptor and remote memory key are selected by the
-provider.
-The address used to access a buffer as the target of an RMA or atomic
-operation is the same as the virtual address of the buffer.
-.PP
-Applications that support the basic registration mode will need to
-exchange MR parameters with remote peers for RMA and atomic operations.
-The exchanged data should include both the address of the memory region
-as well as the MR key.
-.PP
-\f[I]Scalable Memory Registration Mode\f[] : If the mr_mode field is set
-to FI_MR_SCALABLE, then memory registration operations are set to
-scalable mode.
-In scalable mode, registration occurs on memory address ranges, and the
-MR attributes are selected by the user.
-.PP
-Memory regions registered as the target of RMA and atomic operations are
-associated with a MR key selected by the application.
-If local registrations are required (see FI_LOCAL_MR mode), the local
-descriptor will be the same as the remote key.
-The resulting memory region will be accessible by remote peers starting
-at a base address of 0.
-Because scalable registration mode refers to memory regions, versus data
-buffers, the address ranges given for a registration request do not need
-to map to data buffers allocated by the application at the time the
-registration call is made.
-That is, an application can register any range of addresses in their
-virtual address space, whether or not those addresses are backed by
-physical pages or have been allocated.
+Note: the FI_MR_LOCAL mr_mode bit replaces the FI_LOCAL_MR fi_info mode
+bit.
+When FI_MR_LOCAL is set, FI_LOCAL_MR is ignored.
+.PP
+\f[I]FI_MR_RAW\f[] : Raw memory regions are used to support providers
+with keys larger than 64\-bits or require setup at the peer.
+When the FI_MR_RAW bit is set, applications must use fi_mr_raw_attr()
+locally and fi_mr_map_raw() at the peer before targeting a memory region
+as part of any data transfer request.
+.PP
+\f[I]FI_MR_VIRT_ADDR\f[] : The FI_MR_VIRT_ADDR bit indicates that the
+provider references memory regions by virtual address, rather than a
+0\-based offset.
+Peers that target memory regions registered with FI_MR_VIRT_ADDR specify
+the destination memory buffer using the target\[aq]s virtual address,
+with any offset into the region specified as virtual address + offset.
+Support of this bit typically implies that peers must exchange
+addressing data prior to initiating any RMA or atomic operation.
+.PP
+\f[I]FI_MR_ALLOCATED\f[] : When set, all registered memory regions must
+be backed by physical memory pages at the time the registration call is
+made.
+.PP
+\f[I]FI_MR_PROV_KEY\f[] : This memory region mode indicates that the
+provider does not support application requested MR keys.
+MR keys are returned by the provider.
+Applications that support FI_MR_PROV_KEY can obtain the provider key
+using fi_mr_key(), unless FI_MR_RAW is also set.
+The returned key should then be exchanged with peers prior to initiating
+an RMA or atomic operation.
+.PP
+\f[I]FI_MR_MMU_NOTIFY\f[] : FI_MR_MMU_NOTIFY is typically set by
+providers that support memory registration against memory regions that
+are not necessarily backed by allocated physical pages at the time the
+memory registration occurs.
+(That is, FI_MR_ALLOCATED is typically 0).
+However, such providers require that applications notify the provider
+prior to the MR being accessed as part of a data transfer operation.
+This notification informs the provider that all necessary physical pages
+now back the region.
+The notification is necessary for providers that cannot hook directly
+into the operating system page tables or memory management unit.
+See fi_mr_refresh() for notification details.
+.PP
+\f[I]FI_MR_RMA_EVENT\f[] : This mode bit indicates that the provider
+must configure memory regions that are associated with RMA events prior
+to their use.
+This includes all memory regions that are associated with completion
+counters.
+When set, applications must indicate if a memory region will be
+associated with a completion counter as part of the region\[aq]s
+creation.
+This is done by passing in the FI_RMA_EVENT flag to the memory
+registration call.
+.PP
+Such memory regions will be created in a disabled state and must be
+associated with all completion counters prior to being enabled.
+To enable a memory region, the application must call fi_mr_enable().
+After calling fi_mr_enable(), no further resource bindings may be made
+to the memory region.
+.PP
+\f[I]FI_MR_ENDPOINT\f[] : This mode bit indicates that the provider
+associates memory regions with endpoints rather than domains.
+Memory regions that are registered with the provider are created in a
+disabled state and must be bound to an endpoint prior to being enabled.
+To bind the MR with an endpoint, the application must use fi_mr_bind().
+To enable the memory region, the application must call fi_mr_enable().
+.PP
+\f[I]Basic Memory Registration\f[] : Basic memory registration is
+indicated by the FI_MR_BASIC mr_mode bit.
+FI_MR_BASIC is maintained for backwards compatibility (libfabric version
+1.4 or earlier).
+The behavior of basic registration is equivalent to setting the
+following mr_mode bits to one: FI_MR_VIRT_ADDR, FI_MR_ALLOCATED, and
+FI_MR_PROV_KEY.
+Additionally, providers that support basic registation usually required
+FI_MR_LOCAL.
+FI_MR_BASIC must either be set alone, or in conjunction with
+FI_MR_LOCAL.
+Other mr_mode bit pairings are invalid.
+Unlike other mr_mode bits, if FI_MR_BASIC is set on input to
+fi_getinfo(), it will not be cleared by the provider.
+That is, setting FI_MR_BASIC to one requests basic registration.
 .PP
 The registrations functions \-\- fi_mr_reg, fi_mr_regv, and
 fi_mr_regattr \-\- are used to register one or more memory regions with
@@ -166,27 +274,7 @@ The fi_mr_reg call registers the user\-specified memory buffer with the
 resource domain.
 The buffer is enabled for access by the fabric hardware based on the
 provided access permissions.
-Supported access permissions are the bitwise OR of the following:
-.PP
-\f[I]FI_SEND\f[] : The memory buffer may be used in outgoing message
-data transfers.
-This includes fi_msg and fi_tagged operations.
-.PP
-\f[I]FI_RECV\f[] : The memory buffer may be used to receive inbound
-message transfers.
-This includes fi_msg and fi_tagged operations.
-.PP
-\f[I]FI_READ\f[] : The memory buffer may be used as the result buffer
-for RMA read and atomic operations on the initiator side.
-.PP
-\f[I]FI_WRITE\f[] : The memory buffer may be used as the source buffer
-for RMA write and atomic operations on the initiator side.
-.PP
-\f[I]FI_REMOTE_READ\f[] : The memory buffer may be used as the source
-buffer of an RMA read operation on the target side.
-.PP
-\f[I]FI_REMOTE_WRITE\f[] : The memory buffer may be used as the target
-buffer of an RMA write or atomic operation.
+See the access field description for memory region attributes below.
 .PP
 Registered memory is associated with a local memory descriptor and,
 optionally, a remote memory key.
@@ -231,49 +319,239 @@ Otherwise, the operation is the same.
 .PP
 The fi_mr_regattr call is a more generic, extensible registration call
 that allows the user to specify the registration request using a struct
-fi_mr_attr.
-.IP
-.nf
-\f[C]
-struct\ fi_mr_attr\ {
-\ \ \ \ const\ struct\ iovec\ *mr_iov;\ \ \ \ \ \ \ /*\ scatter\-gather\ array\ */
-\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ iov_count;\ \ \ \ \ /*\ #\ elements\ in\ mr_iov\ */
-\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ access;\ \ \ \ \ \ \ \ /*\ access\ permission\ flags\ */
-\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ requested_key;\ /*\ requested\ remote\ key\ */
-\ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *context;\ \ \ \ \ \ /*\ user\-defined\ context\ */
-};
-\f[]
-.fi
+fi_mr_attr (defined below).
 .SS fi_close
 .PP
 Fi_close is used to release all resources associated with a registering
 a memory region.
 Once unregistered, further access to the registered memory is not
 guaranteed.
+Active or queued operations that reference a memory region being closed
+may fail or result in accesses to invalid memory.
+Applications are responsible for ensuring that a MR is no longer needed
+prior to closing it.
+Note that accesses to a closed MR from a remote peer will result in an
+error at the peer.
+The state of the local endpoint will be unaffected.
 .PP
 When closing the MR, there must be no opened endpoints or counters
 associated with the MR.
 If resources are still associated with the MR when attempting to close,
 the call will return \-FI_EBUSY.
-.SS fi_mr_desc / fi_mr_key
+.SS fi_mr_desc
+.PP
+Obtains the local memory descriptor associated with a MR.
+The memory registration must have completed successfully before invoking
+this call.
+.SS fi_mr_key
 .PP
-The local memory descriptor and remote protection key associated with a
-MR may be obtained by calling fi_mr_desc and fi_mr_key, respectively.
+Returns the remote protection key associated with a MR.
 The memory registration must have completed successfully before invoking
-these calls.
+this.
+The returned key may be used in data transfer operations at a peer.
+If the FI_RAW_MR mode bit has been set for the domain, then the memory
+key must be obtained using the fi_mr_raw_key function instead.
+A return value of FI_KEY_NOTAVAIL will be returned if the registration
+has not completed or a raw memory key is required.
+.SS fi_mr_raw_attr
+.PP
+Returns the raw, remote protection key and base address associated with
+a MR.
+The memory registration must have completed successfully before invoking
+this routine.
+Use of this call is required if the FI_RAW_MR mode bit has been set by
+the provider; however, it is safe to use this call with any memory
+region.
+.PP
+A raw key must be mapped by a peer before it can be used in data
+transfer operations.
+See fi_mr_map_key below.
+.SS fi_mr_map_raw
+.PP
+Raw protection keys must be mapped to a usable key value before they can
+be used for data transfer operations.
+The mapping is done by the peer that initiates the RMA or atomic
+operation.
+The mapping function takes as input the raw key and its size, and
+returns the mapped key.
+Use of the fi_mr_map_raw function is required if the peer has the
+FI_RAW_MR mode bit set, but this routine may be called on any valid key.
+All mapped keys must be freed by calling fi_mr_unmap_key when access to
+the peer memory region is no longer necessary.
+.SS fi_mr_unmap_key
+.PP
+This call releases any resources that may have been allocated as part of
+mapping a raw memory key.
+All mapped keys must be freed before the corresponding domain is closed.
 .SS fi_mr_bind
 .PP
-The fi_mr_bind function associates a memory region with a counter, for
-providers that support the generation of completions based on fabric
-operations.
-The type of events tracked against the memory region is based on the
-bitwise OR of the following flags.
+The fi_mr_bind function associates a memory region with a counter or
+endpoint.
+Counter bindings are needed by providers that support the generation of
+completions based on fabric operations.
+Endpoint bindings are needed if the provider associates memory regions
+with endpoints (see FI_MR_ENDPOINT).
+.PP
+When binding with a counter, the type of events tracked against the
+memory region is based on the bitwise OR of the following flags.
 .PP
 \f[I]FI_REMOTE_WRITE\f[] : Generates an event whenever a remote RMA
-write or atomic operation modify the memory region.
+write or atomic operation modifies the memory region.
+Use of this flag requires that the endpoint through which the MR is
+accessed be created with the FI_RMA_EVENT capability.
+.PP
+When binding the memory region to an endpoint, flags should be 0.
+.SS fi_mr_refresh
+.PP
+The use of this call is required to notify the provider of any change to
+the physical pages backing a registered memory region if the
+FI_MR_MMU_NOTIFY mode bit has been set.
+This call informs the provider that the page table entries associated
+with the region may have been modified, and the provider should verify
+and update the registered region accordingly.
+The iov parameter is optional and may be used to specify which portions
+of the registered region requires updating.
+If provider, providers are only guaranteed to update the specified
+address ranges.
+.PP
+The refresh operation has the effect of disabling and re\-enabling
+access to the registered region.
+Any operations from peers that attempt to access the region will fail
+while the refresh is occurring.
+Additionally, attempts to access the region by the local process through
+libfabric APIs may result in a page fault or other fatal operation.
+.PP
+The fi_mr_refresh call is only needed if the physical pages might have
+been updated after the memory region was created.
+.SS fi_mr_enable
+.PP
+The enable call is used with memory registration associated with the
+FI_MR_RMA_EVENT mode bit.
+Memory regions created in the disabled state must be explicitly enabled
+after being fully configured by the application.
+Any resource bindings to the MR must be done prior to enabling the MR.
+.SH MEMORY REGION ATTRIBUTES
+.PP
+Memory regions are created using the following attributes.
+The struct fi_mr_attr is passed into fi_mr_regattr, but individual
+fields also apply to other memory registration calls, with the fields
+passed directly into calls as function parameters.
+.IP
+.nf
+\f[C]
+struct\ fi_mr_attr\ {
+\ \ \ \ const\ struct\ iovec\ *mr_iov;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ iov_count;
+\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ access;
+\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ requested_key;
+\ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *context;
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ auth_key_size;
+\ \ \ \ uint8_t\ \ \ \ \ \ \ \ \ \ \ \ *auth_key;
+};
+\f[]
+.fi
+.SS mr_iov
+.PP
+This is an IO vector of addresses that will represent a single memory
+region.
+The number of entries in the iovec is specified by iov_count.
+.SS iov_count
+.PP
+The number of entries in the mr_iov array.
+The maximum number of memory buffers that may be associated with a
+single memory region is specified as the mr_iov_limit domain attribute.
+See \f[C]fi_domain(3)\f[].
+.SS access
+.PP
+Indicates the type of access that the local or a peer endpoint has to
+the registered memory region.
+Supported access permissions are the bitwise OR of the following flags:
+.PP
+\f[I]FI_SEND\f[] : The memory buffer may be used in outgoing message
+data transfers.
+This includes fi_msg and fi_tagged operations.
+.PP
+\f[I]FI_RECV\f[] : The memory buffer may be used to receive inbound
+message transfers.
+This includes fi_msg and fi_tagged operations.
+.PP
+\f[I]FI_READ\f[] : The memory buffer may be used as the result buffer
+for RMA read and atomic operations on the initiator side.
+.PP
+\f[I]FI_WRITE\f[] : The memory buffer may be used as the source buffer
+for RMA write and atomic operations on the initiator side.
+.PP
+\f[I]FI_REMOTE_READ\f[] : The memory buffer may be used as the source
+buffer of an RMA read operation on the target side.
+.PP
+\f[I]FI_REMOTE_WRITE\f[] : The memory buffer may be used as the target
+buffer of an RMA write or atomic operation.
+.SS requested_key
+.PP
+An application specified access key associated with the memory region.
+The MR key must be provided by a remote process when performing RMA or
+atomic operations to a memory region.
+Applications can use the requested_key field to indicate that a specific
+key be used by the provider.
+This allows applications to use well known key values, which can avoid
+applications needing to exchange and store keys.
+Support for user requested keys is provider specific and is determined
+by the mr_mode domain attribute.
+.SS context
+.PP
+Application context associated with asynchronous memory registration
+operations.
+This value is returned as part of any asynchronous event associated with
+the registration.
+This field is ignored for synchronous registration calls.
+.SS auth_key_size
+.PP
+The size of key referenced by the auth_key field in bytes, or 0 if no
+authorization key is given.
+This field is ignored unless the fabric is opened with API version 1.5
+or greater.
+.SS auth_key
+.PP
+Indicates the key to associate with this memory registration.
+Authorization keys are used to limit communication between endpoints.
+Only peer endpoints that are programmed to use the same authorization
+key may access the memory region.
+The domain authorization key will be used if the auth_key_size provided
+is 0.
+This field is ignored unless the fabric is opened with API version 1.5
+or greater.
+.SH NOTES
+.PP
+Direct access to an application\[aq]s memory by a remote peer requires
+that the application register the targeted memory buffer(s).
+This is typically done by calling one of the fi_mr_reg* routines.
+For FI_MR_PROV_KEY, the provider will return a key that must be used by
+the peer when accessing the memory region.
+The application is responsible for transferring this key to the peer.
+If FI_MR_RAW mode has been set, the key must be retrieved using the
+fi_mr_raw_attr function.
+.PP
+FI_RAW_MR allows support for providers that require more than 8\-bytes
+for their protection keys or need additional setup before a key can be
+used for transfers.
+After a raw key has been retrieved, it must be exchanged with the remote
+peer.
+The peer must use fi_mr_map_raw to convert the raw key into a usable
+64\-bit key.
+The mapping must be done even if the raw key is 64\-bits or smaller.
+.PP
+The raw key support functions are usable with all registered memory
+regions, even if FI_MR_RAW has not been set.
+It is recommended that portable applications target using those
+interfaces; however, their use does carry extra message and memory
+footprint overhead, making it less desirable for highly scalable apps.
 .SH FLAGS
 .PP
-Flags are reserved for future use and must be 0.
+The follow flag may be specified to any memory registration call.
+.PP
+\f[I]FI_RMA_EVENT\f[] : This flag indicates that the specified memory
+region will be associated with a completion counter used to count RMA
+operations that access the MR.
 .SH RETURN VALUES
 .PP
 Returns 0 on success.
diff --git a/man/man3/fi_msg.3 b/man/man3/fi_msg.3
index dd2a4d2..48cae08 100644
--- a/man/man3/fi_msg.3
+++ b/man/man3/fi_msg.3
@@ -1,4 +1,4 @@
-.TH "fi_msg" "3" "2016\-09\-19" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_msg" "3" "2017\-06\-06" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_msg \- Message data transfer operations
@@ -100,6 +100,13 @@ asynchronously.
 Users should not touch the posted data buffer(s) until the receive
 operation has completed.
 .PP
+An endpoint must be enabled before an application can post send or
+receive operations to it.
+For connected endpoints, receive buffers may be posted prior to connect
+or accept being called on the endpoint.
+This ensures that buffers are available to receive incoming data
+immediately after the connection has been established.
+.PP
 Completed message operations are reported to the user through one or
 more event collectors associated with the endpoint.
 Users provide context which are associated with each operation, and is
@@ -110,8 +117,8 @@ See fi_cq for completion event details.
 The call fi_send transfers the data contained in the user\-specified
 data buffer to a remote endpoint, with message boundaries being
 maintained.
-The local endpoint must be connected to a remote endpoint or destination
-before fi_send is called.
+For connection based endpoints (FI_EP_MSG) the local endpoint must be
+connected to a remote endpoint or destination before fi_send is called.
 Unless the endpoint has been configured differently, the data buffer
 passed into fi_send must not be touched by the application until the
 fi_send call completes asynchronously.
@@ -227,9 +234,14 @@ Use of this flag may cause a single posted receive operation to generate
 multiple events as messages are placed into the buffer.
 The placement of received data into the buffer may be subjected to
 provider specific alignment restrictions.
-The buffer will be freed from the endpoint when the available buffer
-space falls below the network\[aq]s MTU size (see
-FI_OPT_MIN_MULTI_RECV).
+.PP
+The buffer will be released by the provider when the available buffer
+space falls below the specified minimum (see FI_OPT_MIN_MULTI_RECV).
+Note that an entry to the associated receive completion queue will
+always be generated when the buffer has been consumed, even if other
+receive completions have been suppressed (i.e.
+the Rx context has been configured for FI_SELECTIVE_COMPLETION).
+See the FI_MULTI_RECV completion flag \f[C]fi_cq\f[](3).
 .PP
 \f[I]FI_INJECT_COMPLETE\f[] : Applies to fi_sendmsg.
 Indicates that a completion should be generated when the source
@@ -248,6 +260,12 @@ been processed by the destination.
 Indicates that the requested operation, also known as the fenced
 operation, be deferred until all previous operations targeting the same
 target endpoint have completed.
+.PP
+\f[I]FI_MULTICAST\f[] : Applies to transmits.
+This flag indicates that the address specified as the data transfer
+destination is a multicast address.
+This flag must be used in all multicast transfers, in conjunction with a
+multicast fi_addr_t.
 .SH NOTES
 .PP
 If an endpoint has been configured with FI_MSG_PREFIX, the application
diff --git a/man/man3/fi_poll.3 b/man/man3/fi_poll.3
index ec29dfd..1b53125 100644
--- a/man/man3/fi_poll.3
+++ b/man/man3/fi_poll.3
@@ -1,4 +1,4 @@
-.TH "fi_poll" "3" "2016\-09\-30" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_poll" "3" "2016\-12\-07" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_poll \- Polling and wait set operations
@@ -106,7 +106,7 @@ being closed, otherwise the call will return \-FI_EBUSY.
 Associates a completion queue or counter with a poll set.
 .SS fi_poll_del
 .PP
-Removes an completion queue or counter from a poll set.
+Removes a completion queue or counter from a poll set.
 .SS fi_poll
 .PP
 Progresses all completion queues and counters associated with a poll set
diff --git a/man/man3/fi_rma.3 b/man/man3/fi_rma.3
index ab468a5..e91883d 100644
--- a/man/man3/fi_rma.3
+++ b/man/man3/fi_rma.3
@@ -1,4 +1,4 @@
-.TH "fi_rma" "3" "2016\-10\-26" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_rma" "3" "2016\-11\-09" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_rma \- Remote memory access operations
@@ -67,6 +67,9 @@ Valid transfers are from 0 bytes up to the endpoint\[aq]s max_msg_size.
 \f[I]count\f[] : Count of vectored data entries.
 .PP
 \f[I]addr\f[] : Address of remote memory to access.
+This will be the virtual address of the remote region in the case of
+FI_MR_BASIC, or the offset from the starting address in the case of
+FI_MR_SCALABLE.
 .PP
 \f[I]key\f[] : Protection key associated with the remote memory.
 .PP
diff --git a/man/man3/fi_tagged.3 b/man/man3/fi_tagged.3
index d2749bc..895e78f 100644
--- a/man/man3/fi_tagged.3
+++ b/man/man3/fi_tagged.3
@@ -1,4 +1,4 @@
-.TH "fi_tagged" "3" "2016\-09\-19" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_tagged" "3" "2017\-03\-20" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_tagged \- Tagged data transfer operations
@@ -123,6 +123,13 @@ operation has completed.
 Posted receive buffers are matched with inbound send messages based on
 the tags associated with the send and receive buffers.
 .PP
+An endpoint must be enabled before an application can post send or
+receive operations to it.
+For connected endpoints, receive buffers may be posted prior to connect
+or accept being called on the endpoint.
+This ensures that buffers are available to receive incoming data
+immediately after the connection has been established.
+.PP
 Completed message operations are reported to the user through one or
 more event collectors associated with the endpoint.
 Users provide context which are associated with each operation, and is
@@ -155,8 +162,8 @@ The fi_tsendmsg function takes a struct fi_msg_tagged as input.
 struct\ fi_msg_tagged\ {
 \ \ \ \ const\ struct\ iovec\ *msg_iov;\ /*\ scatter\-gather\ array\ */
 \ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *desc;\ \ \ \ /*\ data\ descriptor\ */
-\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ iov_count;/*\ #\ elements\ in\ msg_iov\ *
-\ \ \ \ const\ void\ \ \ \ \ \ \ \ \ *addr;\ \ \ \ /*\ optional\ endpoint\ address\ */
+\ \ \ \ size_t\ \ \ \ \ \ \ \ \ \ \ \ \ iov_count;/*\ #\ elements\ in\ msg_iov\ */
+\ \ \ \ fi_addr_t\ \ \ \ \ \ \ \ \ \ addr;\ \ \ \ /*\ optional\ endpoint\ address\ */
 \ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ tag;\ \ \ \ \ \ /*\ tag\ associated\ with\ message\ */
 \ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ ignore;\ \ \ /*\ mask\ applied\ to\ tag\ for\ receives\ */
 \ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *context;\ /*\ user\-defined\ context\ */
@@ -319,7 +326,8 @@ This flag may also be used in conjunction with FI_CLAIM in order to
 retrieve and discard a message previously claimed using an FI_PEEK +
 FI_CLAIM request.
 .PP
-If this flag is set, the input buffer(s) and length parameters.
+If this flag is set, the input buffer(s) and length parameters are
+ignored.
 .SH RETURN VALUE
 .PP
 The tagged send and receive calls return 0 on success.
diff --git a/man/man3/fi_trigger.3 b/man/man3/fi_trigger.3
index a719f00..1690071 100644
--- a/man/man3/fi_trigger.3
+++ b/man/man3/fi_trigger.3
@@ -1,4 +1,4 @@
-.TH "fi_trigger" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_trigger" "3" "2017\-05\-30" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_trigger \- Triggered operations
@@ -28,28 +28,38 @@ Trigger\-able endpoints are initialized such that only those interfaces
 supported by the provider which are trigger\-able are available.
 .PP
 Triggered operations require that applications use struct
-fi_triggered_context as their per operation context parameter.
-The use of struct fi_triggered_context replaces struct fi_context, if
-required by the provider.
-Although struct fi_triggered_context is not opaque to the application,
-the contents of the structure may be modified by the provider.
-This structure has similar requirements as struct fi_context.
+fi_triggered_context as their per operation context parameter, or if the
+provider requires the FI_CONTEXT2 mode, struct fi_trigger_context2.
+The use of struct fi_triggered_context[2] replaces struct fi_context[2],
+if required by the provider.
+Although struct fi_triggered_context[2] is not opaque to the
+application, the contents of the structure may be modified by the
+provider once it has been submitted as an operation.
+This structure has similar requirements as struct fi_context[2].
 It must be allocated by the application and remain valid until the
 corresponding operation completes or is successfully canceled.
 .PP
-Struct fi_triggered_context is used to specify the condition that must
-be met before the triggered data transfer is initiated.
+Struct fi_triggered_context[2] is used to specify the condition that
+must be met before the triggered data transfer is initiated.
 If the condition is met when the request is made, then the data transfer
 may be initiated immediately.
-The format of struct fi_triggered_context is described below.
+The format of struct fi_triggered_context[2] is described below.
 .IP
 .nf
 \f[C]
 struct\ fi_triggered_context\ {
-\ \ \ \ enum\ fi_trigger_event\ \ \ event_type;\ \ \ /*\ trigger\ type\ */
+\ \ \ \ enum\ fi_trigger_event\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ event_type;\ \ \ /*\ trigger\ type\ */
 \ \ \ \ union\ {
 \ \ \ \ \ \ \ \ struct\ fi_trigger_threshold\ threshold;
-\ \ \ \ \ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *internal[3];\ /*\ reserved\ */
+\ \ \ \ \ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *internal[3];\ /*\ reserved\ */
+\ \ \ \ }\ trigger;
+};
+
+struct\ fi_triggered_context2\ {
+\ \ \ \ enum\ fi_trigger_event\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ event_type;\ \ \ /*\ trigger\ type\ */
+\ \ \ \ union\ {
+\ \ \ \ \ \ \ \ struct\ fi_trigger_threshold\ threshold;
+\ \ \ \ \ \ \ \ void\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ *internal[7];\ /*\ reserved\ */
 \ \ \ \ }\ trigger;
 };
 \f[]
@@ -66,20 +76,109 @@ The following trigger events are defined.
 operation will be deferred until an event counter crosses an application
 specified threshold value.
 The threshold is specified using struct fi_trigger_threshold:
+.PP
+\f[C]c\ \ \ struct\ fi_trigger_threshold\ {\ \ \ \ \ struct\ fid_cntr\ *cntr;\ /*\ event\ counter\ to\ check\ */\ \ \ \ \ size_t\ threshold;\ \ \ \ \ \ /*\ threshold\ value\ */\ \ \ };\f[]
+.PP
+Threshold operations are triggered in the order of the threshold values.
+This is true even if the counter increments by a value greater than 1.
+If two triggered operations have the same threshold, they will be
+triggered in the order in which they were submitted to the endpoint.
+.SH EXPERIMENTAL DEFERRED WORK QUEUES
+.PP
+The following feature and description are enhancements to triggered
+operation support, but should be considered experimental.
+Until the experimental tag is removed, the interfaces, semantics, and
+data structures defined below may change between library versions.
+.PP
+The deferred work queue interface is designed as primitive constructs
+that can be used to implement application\-level collective operations.
+They are a more advanced form of triggered operation.
+They allow an application to queue operations to a deferred work queue
+that is associated with the domain.
+Note that the deferred work queue is a conceptual construct, rather than
+an implementation requirement.
+Deferred work requests consist of three main components: an event or
+condition that must first be met, an operation to perform, and a
+completion notification.
+.PP
+Because deferred work requests are posted directly to the domain, they
+can support a broader set of conditions and operations.
+Deferred work requests are submitted using struct fi_deferred_work.
+That structure, along with the corresponding operation structures
+(referenced through the op union) used to describe the work must remain
+valid until the operation completes or is canceled.
+The format of the deferred work request is as follows:
 .IP
 .nf
 \f[C]
-struct\ fi_trigger_threshold\ {
-\ \ \ \ struct\ fid_cntr\ *cntr;\ /*\ event\ counter\ to\ check\ */
-\ \ \ \ size_t\ threshold;\ \ \ \ \ \ /*\ threshold\ value\ */
+struct\ fi_deferred_work\ {
+\ \ \ \ struct\ fi_context2\ \ \ \ context;
+
+\ \ \ \ uint64_t\ \ \ \ \ \ \ \ \ \ \ \ \ \ threshold;
+\ \ \ \ struct\ fid_cntr\ \ \ \ \ \ \ *triggering_cntr;
+\ \ \ \ struct\ fid_cntr\ \ \ \ \ \ \ *completion_cntr;
+
+\ \ \ \ enum\ fi_trigger_op\ \ \ \ op_type;
+
+\ \ \ \ union\ {
+\ \ \ \ \ \ \ \ struct\ fi_op_msg\ \ \ \ \ \ \ \ \ \ \ \ *msg;
+\ \ \ \ \ \ \ \ struct\ fi_op_tagged\ \ \ \ \ \ \ \ \ *tagged;
+\ \ \ \ \ \ \ \ struct\ fi_op_rma\ \ \ \ \ \ \ \ \ \ \ \ *rma;
+\ \ \ \ \ \ \ \ struct\ fi_op_atomic\ \ \ \ \ \ \ \ \ *atomic;
+\ \ \ \ \ \ \ \ struct\ fi_op_fetch_atomic\ \ \ *fetch_atomic;
+\ \ \ \ \ \ \ \ struct\ fi_op_compare_atomic\ *compare_atomic;
+\ \ \ \ \ \ \ \ struct\ fi_op_cntr\ \ \ \ \ \ \ \ \ \ \ *cntr;
+\ \ \ \ }\ op;
 };
 \f[]
 .fi
 .PP
-Threshold operations are triggered in the order of the threshold values.
-This is true even if the counter increments by a value greater than 1.
-If two triggered operations have the same threshold, they will be
-triggered in the order in which they were submitted to the endpoint.
+Once a work request has been posted to the deferred work queue, it will
+remain on the queue until the triggering counter (success plus error
+counter values) has reached the indicated threshold.
+If the triggering condition has already been met at the time the work
+request is queued, the operation will be initiated immediately.
+.PP
+On the completion of a deferred data transfer, the specified completion
+counter will be incremented by one.
+Note that deferred counter operations do not update the completion
+counter; only the counter specified through the fi_op_cntr is modified.
+The completion_cntr field must be NULL for counter operations.
+.PP
+Because deferred work targets support of collective communication
+operations, posted work requests do not generate any completions at the
+endpoint by default.
+For example, completed operations are not written to the EP\[aq]s
+completion queue or update the EP counter (unless the EP counter is
+explicitly referenced as the completion_cntr).
+An application may request EP completions by specifying the
+FI_COMPLETION flag as part of the operation.
+.PP
+It is the responsibility of the application to detect and handle
+situations that occur which could result in a deferred work
+request\[aq]s condition not being met.
+For example, if a work request is dependent upon the successful
+completion of a data transfer operation, which fails, then the
+application must cancel the work request.
+.PP
+To submit a deferred work request, applications should use the
+domain\[aq]s fi_control function with command FI_QUEUE_WORK and struct
+fi_deferred_work as the fi_control arg parameter.
+To cancel a deferred work request, use fi_control with command
+FI_CANCEL_WORK and the corresponding struct fi_deferred_work to cancel.
+The fi_control command FI_FLUSH_WORK will cancel all queued work
+requests.
+FI_FLUSH_WORK may be used to flush all work queued to the domain, or may
+be used to cancel all requests waiting on a specific triggering_cntr.
+.PP
+Deferred work requests are not acted upon by the provider until the
+associated event has occurred; although, certain validation checks may
+still occur when a request is submitted.
+Referenced data buffers are not read or otherwise accessed.
+But the provider may validate fabric objects, such as endpoints and
+counters, and that input parameters fall within supported ranges.
+If a specific request is not supported by the provider, it will fail the
+operation with \-FI_ENOSYS.
 .SH SEE ALSO
 .PP
 \f[C]fi_getinfo\f[](3), \f[C]fi_endpoint\f[](3), \f[C]fi_alias\f[](3),
diff --git a/man/man3/fi_version.3 b/man/man3/fi_version.3
index c215253..fc96007 100644
--- a/man/man3/fi_version.3
+++ b/man/man3/fi_version.3
@@ -1,4 +1,4 @@
-.TH "fi_version" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_version" "3" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 fi_version \- Version of the library interfaces
diff --git a/man/man7/fabric.7 b/man/man7/fabric.7
index e4ead2e..10edc07 100644
--- a/man/man7/fabric.7
+++ b/man/man7/fabric.7
@@ -1,4 +1,4 @@
-.TH "fabric" "7" "2016\-06\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fabric" "7" "2016\-06\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 Fabric Interface Library
diff --git a/man/man7/fi_bgq.7 b/man/man7/fi_bgq.7
new file mode 100644
index 0000000..7170d73
--- /dev/null
+++ b/man/man7/fi_bgq.7
@@ -0,0 +1,124 @@
+.TH "fi_bgq" "7" "2017\-02\-27" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
+.SH NAME
+.PP
+The Blue Gene/Q Fabric Provider
+.SH OVERVIEW
+.PP
+The bgq provider is a native implementation of the libfabric interfaces
+that makes direct use of the unique hardware features such as the
+Messaging Unit (MU), Base Address Table (BAT), and L2 Atomics.
+.PP
+The purpose of this provider is to demonstrate the scalability and
+performance of libfabric, providing an "extreme scale" development
+environment for applications and middleware using the libfabric API, and
+to support a functional and performant version of MPI3 on Blue Gene/Q
+via MPICH CH4.
+.SH SUPPORTED FEATURES
+.PP
+The bgq provider supports most features defined for the libfabric API.
+Key features include:
+.PP
+\f[I]Endpoint types\f[] : The Blue Gene/Q hardware is connectionless and
+reliable.
+Therefore, the bgq provider only supports the \f[I]FI_EP_RDM\f[]
+endpoint type.
+.PP
+\f[I]Capabilities\f[] : Supported capabilities include \f[I]FI_MSG\f[],
+\f[I]FI_RMA\f[], \f[I]FI_TAGGED\f[], \f[I]FI_ATOMIC\f[],
+\f[I]FI_NAMED_RX_CTX\f[], \f[I]FI_READ\f[], \f[I]FI_WRITE\f[],
+\f[I]FI_SEND\f[], \f[I]FI_RECV\f[], \f[I]FI_REMOTE_READ\f[],
+\f[I]FI_REMOTE_WRITE\f[], \f[I]FI_MULTI_RECV\f[],
+\f[I]FI_DIRECTED_RECV\f[], \f[I]FI_SOURCE\f[] and \f[I]FI_FENCE\f[].
+.PP
+Notes on FI_DIRECTED_RECV capability: The immediate data which is sent
+within the \f[I]senddata\f[] call to support FI_DIRECTED_RECV for BGQ
+must be exactly 4 bytes, which BGQ uses to completely identify the
+source address to an exascale\-level number of ranks for tag matching on
+the recv and can be managed within the MU packet.
+Therefore the domain attribute cq_data_size is set to 4 which is the OFI
+standard minimum.
+.PP
+\f[I]Modes\f[] : The bgq provider requires \f[I]FI_CONTEXT\f[] and
+\f[I]FI_ASYNC_IOV\f[]
+.PP
+\f[I]Memory registration modes\f[] : Both FI_MR_SCALABLE and FI_MR_BASIC
+are supported, specified at configuration time with the
+"\-\-with\-bgq\-mr" configure option.
+The base address table utilized by FI_MR_SCALABLE for rdma transfers is
+completely software emulated, supporting FI_ATOMIC, FI_READ, FI_WRITE,
+FI_REMOTE_READ, and FI_REMOTE_WRITE capabilities.
+With FI_MR_BASIC the FI_WRITE is completely hardware accelerated, the
+other rdma transfers are still software emulated but the use of a base
+address table is no longer required as the offset is now the virtual
+address of the memory from the application and the key is the delta from
+which the physical address can be computed if necessary.
+.PP
+\f[I]Additional features\f[] : Supported additional features include
+\f[I]FABRIC_DIRECT\f[], \f[I]scalable endpoints\f[], and
+\f[I]counters\f[].
+.PP
+\f[I]Progress\f[] : Both progress modes, \f[I]FI_PROGRESS_AUTO\f[] and
+\f[I]FI_PROGRESS_MANUAL\f[], are supported.
+The progress mode may be specified via the "\-\-with\-bgq\-progress"
+configure option.
+.PP
+\f[I]Address vector\f[] : Only the \f[I]FI_AV_MAP\f[] address vector
+format is supported.
+.SH UNSUPPORTED FEATURES
+.PP
+\f[I]Endpoint types\f[] : Unsupported endpoint types include
+\f[I]FI_EP_DGRAM\f[] and \f[I]FI_EP_MSG\f[]
+.PP
+\f[I]Capabilities\f[] : The bgq provider does not support the
+\f[I]FI_RMA_EVENT\f[], and \f[I]FI_TRIGGER\f[] capabilities.
+.PP
+\f[I]Address vector\f[] : The bgq provider does not support the
+\f[I]FI_AV_TABLE\f[] address vector format.
+Support for \f[I]FI_AV_TABLE\f[] may be added in the future.
+.SH LIMITATIONS
+.PP
+The bgq provider only supports \f[I]FABRIC_DIRECT\f[].
+The size of the fi_context structure for \f[I]FI_CONTEXT\f[] is too
+small to be useful.
+In the \[aq]direct\[aq] mode the bgq provider can re\-define the struct
+fi_context to a larger size \- currently 64 bytes which is the L1 cache
+size.
+.PP
+The fi_context structure for \f[I]FI_CONTEXT\f[] must be aligned to 8
+bytes.
+This requirement is because the bgq provider will use MU network atomics
+to track completions and the memory used with MU atomic operations must
+be aligned to 8 bytes.
+Unfortunately, the libfabric API has no mechanism for applications to
+programmatically determine these alignment requirements.
+Because unaligned MU atomics operations are a fatal error, the bgq
+provider will assert on the alignment for "debug" builds (i.e., the
+\[aq]\-DNDEBUG\[aq] pre\-processor flag is not specified).
+.PP
+The progress thread used for \f[I]FI_PROGRESS_AUTO\f[] effectively
+limits the maximum number of ranks\-per\-node to 32.
+However for FI_PROGRESS_MANUAL the maximum is 64.
+.PP
+For FI_MR_SCALABLE mr mode the memory region key size (mr_key_size) is 2
+\f[I]bytes\f[]; Valid key values are 0..2^16\-1.
+.PP
+It is invalid to register memory at the base virtual address "0" with a
+length of "UINTPTR_MAX" (or equivalent).
+The Blue Gene/Q hardware operates on 37\-bit physical addresses and all
+virtual addresses specified in the libfabric API, such as the location
+of source/destination data and remote memory locations, must be
+converted to a physical address before use.
+A 64\-bit virtual address space will not fit into a 37\-bit physical
+address space.
+.PP
+fi_trecvmsg() fnd fi_recvmsg() unctions do not support non\-contiguous
+receives and the iovec count must be 1.
+The fi_trecvv() and fi_recvv() functions are currently not supported.
+.SH RUNTIME PARAMETERS
+.PP
+No runtime parameters are currently defined.
+.SH SEE ALSO
+.PP
+\f[C]fabric\f[](7), \f[C]fi_provider\f[](7), \f[C]fi_getinfo\f[](3)
+.SH AUTHORS
+OpenFabrics.
diff --git a/man/man7/fi_direct.7 b/man/man7/fi_direct.7
index 05cd6bc..75b1284 100644
--- a/man/man7/fi_direct.7
+++ b/man/man7/fi_direct.7
@@ -1,4 +1,4 @@
-.TH "fi_direct" "7" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_direct" "7" "2017\-04\-13" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 Direct fabric provider access
@@ -57,9 +57,11 @@ modes, if those capabilities are supported.
 The following #define values may be used by an application to test for
 provider support of supported features.
 .PP
-\f[I]FI_DIRECT_CONTEXT\f[] : The provider sets FI_CONTEXT for
-fi_info:mode.
+\f[I]FI_DIRECT_CONTEXT\f[] : The provider sets FI_CONTEXT or FI_CONTEXT2
+for fi_info:mode.
 See fi_getinfo for additional details.
+When FI_DIRECT_CONTEXT is defined, applications should use struct
+fi_context in their definitions, even if FI_CONTEXT2 is set.
 .PP
 \f[I]FI_DIRECT_LOCAL_MR\f[] : The provider sets FI_LOCAL_MR for
 fi_info:mode.
diff --git a/man/man7/fi_gni.7 b/man/man7/fi_gni.7
index d956f3c..62bc1fd 100644
--- a/man/man7/fi_gni.7
+++ b/man/man7/fi_gni.7
@@ -1,4 +1,4 @@
-.TH "fi_gni" "7" "2016\-10\-07" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_gni" "7" "2017\-07\-21" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The GNI Fabric Provider
@@ -14,45 +14,59 @@ and optimized collectives.
 .PP
 The GNI provider runs on Cray XC systems running CLE 5.2 UP04 or higher
 using gcc version 4.9 or higher.
+.PP
+When using the fi_mr_regattr() and fi_mr_regv() functions to register
+multiple region, users must register the memory region with 4K page
+alignment.
+Any other page address alignment will result in a return value of
+\-FI_EINVAL.
 .SH SUPPORTED FEATURES
 .PP
 The GNI provider supports the following features defined for the
 libfabric API:
 .PP
-\f[I]Endpoint types\f[] : The provider supports the \f[I]FI_EP_RDM\f[]
-and \f[I]FI_EP_DGRAM\f[] endpoint types.
+\f[I]Endpoint types\f[] : The provider supports the \f[I]FI_EP_RDM\f[],
+\f[I]FI_EP_DGRAM\f[], \f[I]FI_EP_MSG\f[] endpoint types, including
+scalable endpoints.
 .PP
 \f[I]Address vectors\f[] : The provider implements both the
 \f[I]FI_AV_MAP\f[] and \f[I]FI_AV_TABLE\f[] address vector types.
+FI_EVENT is unsupported.
 .PP
 \f[I]Memory registration modes\f[] : The provider implements the
 \f[I]FI_MR_BASIC\f[] memory registration mode.
 .PP
-\f[I]Data transfer operations\f[]
-.PP
-: The following data transfer interfaces are supported for all endpoint
-types: \f[I]FI_ATOMIC\f[], \f[I]FI_MSG\f[], \f[I]FI_RMA\f[],
-\f[I]FI_TAGGED\f[].
+\f[I]Data transfer operations\f[] : The following data transfer
+interfaces are supported for all endpoint types: \f[I]FI_ATOMIC\f[],
+\f[I]FI_MSG\f[], \f[I]FI_RMA\f[], \f[I]FI_TAGGED\f[].
 See DATA TRANSFER OPERATIONS below for more details.
 .PP
 \f[I]Completion events\f[] : The GNI provider supports
 \f[I]FI_CQ_FORMAT_CONTEXT\f[], \f[I]FI_CQ_FORMAT_MSG\f[],
 \f[I]FI_CQ_FORMAT_DATA\f[] and \f[I]FI_CQ_FORMAT_TAGGED\f[] with wait
-objects of type \f[I]FI_WAIT_NONE\f[], \f[I]FI_WAIT_FD\f[], and
-\f[I]FI_WAIT_MUTEX_COND\f[].
+objects of type \f[I]FI_WAIT_NONE\f[], \f[I]FI_WAIT_UNSPEC\f[],
+\f[I]FI_WAIT_SET\f[].
 .PP
 \f[I]Modes\f[] : The GNI provider does not require any operation modes.
 .PP
-\f[I]Progress\f[]
+\f[I]Progress\f[] : For both control and data progress, the GNI provider
+supports both \f[I]FI_PROGRESS_AUTO\f[] and \f[I]FI_PROGRESS_MANUAL\f[],
+with a default set to \f[I]FI_PROGRESS_AUTO\f[].
+Note that for data progress, progression is only performed when data
+transfers use the rendezvous protocol.
 .PP
-: For both control and data progress, the GNI provider supports both
-\f[I]FI_PROGRESS_AUTO\f[] and \f[I]FI_PROGRESS_MANUAL\f[], with a
-default set to \f[I]FI_PROGRESS_AUTO\f[].
+\f[I]Wait Objects\f[] : The GNI provider specifically supports wait
+object types \f[I]FI_WAIT_UNSPEC\f[], and \f[I]FI_WAIT_SET\f[].
+A wait object must be used when calling fi_cntr_wait, fi_cq_sread/from,
+fi_eq_sread/from, fi_wait.
+The GNI provider spawns an internal wait progress thread that is woken
+up when clients utilize the wait system (e.g., calling fi_wait).
 .PP
 \f[I]Additional Features\f[] : The GNI provider also supports the
 following capabilities and features: \- \f[I]FI_MULTI_RECV\f[] \-
 \f[I]FI_SOURCE\f[] \- \f[I]FI_FENCE\f[] \- \f[I]FI_RM_ENABLED\f[] \-
-\f[I]FABRIC_DIRECT\f[] compilation mode
+\f[I]FI_RMA_EVENT\f[] \- \f[I]FI_REMOTE_CQ_DATA\f[] \-
+\f[I]FABRIC_DIRECT\f[] compilation mode \- \f[I]FI_MORE\f[] (For FI_RMA)
 .SH DATA TRANSFER OPERATIONS
 .SS FI_ATOMIC
 .PP
@@ -212,6 +226,10 @@ The value must be greater than 0.
 messages using the GNI provider internal rendezvous protocol.
 The value is of type bool.
 .PP
+\f[I]GNI_DGRAM_PROGRESS_TIMEOUT\f[] : Controls timeout value in
+milliseconds for the control progress thread.
+The value is of type uint32_t.
+.PP
 The \f[C]flush_cache\f[] function allows the user to flush any stale
 registration cache entries from the cache.
 This has the effect of removing registrations from the cache that have
@@ -242,6 +260,53 @@ adds the following parameter:
 with this call are GNIX_FAB_RQ_NAMO_AX (AND and XOR), and
 GNIX_FAB_RQ_NAMO_AX_S (AND and XOR 32 bit), GNIX_FAB_RQ_NAMO_FAX (Fetch
 AND and XOR) and GNIX_FAB_RQ_NAMO_FAX_S (Fetch AND and XOR 32 bit).
+.SH NOTES
+.PP
+The default address format is FI_ADDR_GNI.
+This is the only address format used within the GNI provider for message
+passing.
+FI_ADDR_STR is always parsed and converted to FI_ADDR_GNI for use within
+the GNI provider.
+.PP
+\f[I]FI_ADDR_STR\f[] is formatted as follows:
+gni;node;service;GNIX_AV_STR_ADDR_VERSION;device_addr;cdm_id;name_type;cm_nic_cdm_id;cookie;rx_ctx_cnt
+.PP
+The GNI provider sets the domain attribute \f[I]cntr_cnt\f[] to the the
+CQ limit divided by 2.
+.PP
+The GNI provider sets the domain attribute \f[I]cq_cnt\f[] to the CQ
+limit divided by 2.
+.PP
+The GNI provider sets the domain attribute \f[I]ep_cnt\f[] to SIZE_MAX.
+.PP
+Completion queue events may report unknown source address information
+when using \f[I]FI_SOURCE\f[].
+The source address information will be reported in the err_data member
+of the struct fi_cq_err_entry populated by fi_cq_readerr.
+The err_data member will contain the source address information in the
+FI_ADDR_GNI address format.
+In order to populate the remote peer\[aq]s address vector with this
+mechanism, the application must call fi_cq_readerr to get the source
+address followed by fi_av_insert on the populated err_data member.
+.PP
+For FI_MULTI_RECV, the GNI provider generates a separate FI_MULTI_RECV
+CQ event once the receive buffer has been consumed.
+Also, owing to the out\-or\-order nature of the Cray network, the CQ
+events associated with individual messages arriving in the receive
+buffer may be generated out of order with respect to the offset into the
+buffer into which the messages were received.
+.SH KNOWN BUGS
+.PP
+The GNI provider currently treats the fi_shutdown() interface as a
+strictly local operation.
+That is, fi_shutdown() causes the local endpoint to be shut down, and a
+shutdown event to be generated on the local EQ.
+However, a connected remote peer endpoint is not notified of a call to
+fi_shutdown().
+.PP
+The GNI provider does not currently handle the case when
+FI_OPT_MULTI_RECV is set to 0 and will return \-FI_EINVAL if an
+application attempts to set this value to zero.
 .SH SEE ALSO
 .PP
 \f[C]fabric\f[](7), \f[C]fi_open_ops\f[](3), \f[C]fi_provider\f[](7),
diff --git a/man/man7/fi_mxm.7 b/man/man7/fi_mlx.7
similarity index 53%
rename from man/man7/fi_mxm.7
rename to man/man7/fi_mlx.7
index d75f096..d56ecbc 100644
--- a/man/man7/fi_mxm.7
+++ b/man/man7/fi_mlx.7
@@ -1,21 +1,19 @@
-.TH "fi_mxm" "7" "2016\-09\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_mlx" "7" "2017\-04\-18" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
-The MXM Fabric Provider
+The MLX Fabric Provider
 .SH OVERVIEW
 .PP
-The mxm provider is deprecated and will be replaced in a future release
-of libfabric.
-.PP
-The \f[I]mxm\f[] provider runs over the MXM (Mellanox messaging)
-interface that is currently supported by the Mellanox infiniband
-fabrics.
-The \f[I]mxm\f[] provider makes use of MXM tag matching API in order to
+The \f[I]mlx\f[] provider runs over the UCX library that is currently
+supported by the Mellanox infiniband fabrics.
+The \f[I]mlx\f[] provider makes use of UCX tag matching API in order to
 implement a limited set of the libfabric data transfer APIs, namely,
 tagged message queue.
+.PP
+Supported UCP API version: 1.0
 .SH LIMITATIONS
 .PP
-The \f[I]mxm\f[] provider doesn\[aq]t support all the features defined
+The \f[I]mlx\f[] provider doesn\[aq]t support all the features defined
 in the libfabric API.
 Here are some of the limitations:
 .PP
@@ -30,17 +28,11 @@ pointer to type \f[I]struct fi_context\f[] passed as the operation
 context.
 .PP
 Threading : The supported mode is FI_THREAD_DOMAIN, i.e.
-the \f[I]mxm\f[] provider is not thread safe.
+the \f[I]mlx\f[] provider is not thread safe.
 .PP
 Unsupported features : These features are unsupported: connection
 management, event queue, scalable endpoint, passive endpoint, shared
 receive context, rma, atomics.
-.PP
-Mem tag format : MXM library provides a tag matching interface with just
-32 bits wide tag.
-Another 16 bits are available for matching via specifying an MXM MQ.
-Hence total maximum available matching bits equal 48.
-This is why the only allowed mem_tag_format is 0xFFFF00000000.
 .SH RUNTIME PARAMETERS
 .SH SEE ALSO
 .PP
diff --git a/man/man7/fi_provider.7 b/man/man7/fi_provider.7
index 16b35f9..7fea95d 100644
--- a/man/man7/fi_provider.7
+++ b/man/man7/fi_provider.7
@@ -1,4 +1,4 @@
-.TH "fi_provider" "7" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_provider" "7" "2017\-07\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 Fabric Interface Providers
@@ -15,6 +15,7 @@ referred to as fabric providers, or simply providers.
 .PP
 This distribution of libfabric contains the following providers
 (although more may be available via run\-time plug\-ins):
+.SS Core providers
 .PP
 \f[I]GNI\f[] : A provider for the Aries interconnect in Cray XC(TM)
 systems utilizing the user\-space \f[I]Generic Networking Interface\f[].
@@ -43,6 +44,38 @@ Analogous to the Sockets provider, the Verbs provider is intended to
 enable developers to write, test, and debug application code on
 platforms that only have Linux Verbs\-based networking.
 See \f[C]fi_verbs\f[](7) for more information.
+.PP
+\f[I]Blue Gene/Q\f[] : See \f[C]fi_bgq\f[](7) for more information.
+.SS Utility providers
+.PP
+\f[I]RxM\f[] : The RxM provider (ofi_rxm) is an utility provider that
+supports RDM endpoints emulated over MSG endpoints of a core provider.
+See \f[C]fi_rxm\f[](7) for more information.
+.SH CORE VERSUS UTILITY PROVIDERS
+.PP
+Core providers implement the libfabric interfaces directly over
+low\-level hardware and software interfaces.
+They are designed to support a specific class of hardware, and may be
+limited to supporting a single NIC.
+Core providers often only support libfabric features and interfaces that
+map efficiently to their underlying hardware.
+.PP
+Utility providers are distinct from core providers in that they are not
+associated with specific classes of devices.
+They instead work with core providers to expand their features, and
+interact with core providers through libfabric interfaces internally.
+Utility providers are often used to support a specific endpoint type
+over a simpler endpoint type.
+For example, the RXD provider implements reliability over unreliable
+datagram endpoints.
+The utility providers will not layer over the sockets provider unless it
+is explicitly requested.
+.PP
+Utility providers show up as a component in the core provider\[aq]s
+component list.
+See \f[C]fi_fabric\f[](3).
+Utility providers are enabled automatically for core providers that do
+not support the feature set requested by an application.
 .SH PROVIDER REQUIREMENTS
 .PP
 Libfabric provides a general framework for supporting multiple types of
@@ -173,6 +206,6 @@ flag.
 .SH SEE ALSO
 .PP
 \f[C]fi_gni\f[](7), \f[C]fi_psm\f[](7), \f[C]fi_sockets\f[](7),
-\f[C]fi_usnic\f[](7), \f[C]fi_verbs\f[](7),
+\f[C]fi_usnic\f[](7), \f[C]fi_verbs\f[](7), \f[C]fi_bgq\f[](7),
 .SH AUTHORS
 OpenFabrics.
diff --git a/man/man7/fi_psm.7 b/man/man7/fi_psm.7
index 4ba7fa7..d716f4a 100644
--- a/man/man7/fi_psm.7
+++ b/man/man7/fi_psm.7
@@ -1,4 +1,4 @@
-.TH "fi_psm" "7" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_psm" "7" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The PSM Fabric Provider
diff --git a/man/man7/fi_psm2.7 b/man/man7/fi_psm2.7
index 2a908d6..1fd3159 100644
--- a/man/man7/fi_psm2.7
+++ b/man/man7/fi_psm2.7
@@ -1,4 +1,4 @@
-.TH "fi_psm2" "7" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_psm2" "7" "2017\-07\-05" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The PSM2 Fabric Provider
@@ -30,8 +30,16 @@ direction of operations.
 .PP
 \f[I]FI_MULTI_RECV\f[] is supported for non\-tagged message queue only.
 .PP
+Scalable endpoints are supported if the underlying PSM2 library supports
+multiple endpoints.
+This condition must be satisfied both when the provider is built and
+when the provider is used.
+See the \f[I]Scalable endpoints\f[] section for more information.
+.PP
 Other supported capabilities include \f[I]FI_TRIGGER\f[],
 \f[I]FI_REMOTE_CQ_DATA\f[], and \f[I]FI_SOURCE\f[].
+Furthermore, \f[I]FI_NAMED_RX_CTX\f[] is supported when scalable
+endpoints are enabled.
 .PP
 Modes : \f[I]FI_CONTEXT\f[] is required for the \f[I]FI_TAGGED\f[] and
 \f[I]FI_MSG\f[] capabilities.
@@ -50,9 +58,46 @@ The provider does support auto progress mode.
 However, the performance can be significantly impacted if the
 application purely depends on the provider to make auto progress.
 .PP
+Scalable endpoints : Scalable endpoints support depends on the multi\-EP
+feature of the \f[I]PSM2\f[] library.
+If the \f[I]PSM2\f[] library has this feature, the availability is
+further controlled by an environment variable \f[I]PSM2_MULTI_EP\f[],
+which by default is 0 (disabled).
+It is important to set the environment variable to 1 before using the
+scalable endpoint with the \f[I]psm2\f[] provider.
+.PP
+For convenience, the \f[I]psm2\f[] provider has a mechanism for
+application to turn on the \f[I]PSM2\f[] multi\-EP feature
+programmatically, thus avoid the need of manually setting the
+environment variable.
+To use this feature, when the application calls fi_getinfo() the first
+time, it should pass a non\-NULL "hints" parameter with non\-NULL
+"ep_attr" field and with "hints\->ep_attr\->tx_ctx_cnt" set to be
+greater than 1.
+The \f[I]psm2\f[] provider treats this as a request to use scalable
+endpoint and thus sets the default value of \f[I]PSM2_MULTI_EP\f[] to 1.
+This mechanism, however, has no effect if \f[I]PSM2_MULTI_EP\f[] has
+already been set.
+.PP
+When creating a scalable endpoint, the actual number of contexts needed
+should be set in the "fi_info" structure passed to the
+\f[I]fi_scalable_ep\f[] function.
+This number should be set in "fi_info\->ep_attr\->tx_ctx_cnt" or
+"fi_info\->ep_attr\->rx_ctx_cnt" or both, whichever greater is used.
+The \f[I]psm2\f[] provider allocates all asked contexts upfront when the
+scalable endpoint is created.
+The same context is used for both Tx and Rx.
+.PP
+It is important to notice that each context requires a dedicated
+completion queue or counter.
+Any attempt to bind to a context a completion queue or counter that has
+already been bound to another context or endpoint will fail.
+For optimal performance, it is also advised to avoid having multiple
+threads accessing the same context.
+.PP
 Unsupported features : These features are unsupported: connection
-management, scalable endpoint, passive endpoint, shared receive context,
-and send/inject with immediate data over tagged message queue.
+management, passive endpoint, shared receive context, and send/inject
+with immediate data over tagged message queue.
 .SH RUNTIME PARAMETERS
 .PP
 The \f[I]psm2\f[] provider checks for the following environment
@@ -76,7 +121,7 @@ The default UUID is 00FF00FF\-0000\-0000\-0000\-00FF0F0F00FF.
 built\-in name server that can be used to resolve an IP address or host
 name into a transport address needed by the \f[I]fi_av_insert\f[] call.
 The main purpose of this name server is to allow simple client\-server
-type applications (such as those in \f[I]fabtest\f[]) to be written
+type applications (such as those in \f[I]fabtests\f[]) to be written
 purely with libfabric, without using any out\-of\-band communication
 mechanism.
 For such applications, the server would run first, and the client would
@@ -109,7 +154,7 @@ However, the bandwidth is sub\-optimal by doing this way.
 .PP
 The \f[I]psm2\f[] provider use PSM tag\-matching message queue functions
 to achieve higher bandwidth for large size RMA.
-It takes avdantage of the extra tag bits available in PSM2 to separate
+It takes advantage of the extra tag bits available in PSM2 to separate
 the RMA traffic from the regular tagged message queue.
 .PP
 The option is on by default.
@@ -132,7 +177,7 @@ via the hints to \f[I]fi_getinfo\f[]), a progress thread is created to
 make progress calls from time to time.
 This option set the interval (microseconds) between progress calls.
 .PP
-The default setting is 1 if affininty is set, or 1000 if not.
+The default setting is 1 if affinity is set, or 1000 if not.
 See \f[I]FI_PSM2_PROG_AFFINITY\f[].
 .PP
 \f[I]FI_PSM2_PROG_AFFINITY\f[] : When set, specify the set of CPU cores
@@ -146,6 +191,29 @@ Both \f[C]<start>\f[] and \f[C]<end>\f[] can be either the
 <0).
 .PP
 By default affinity is not set.
+.PP
+\f[I]FI_PSM2_INJECT_SIZE\f[] : Maximum message size allowed for
+fi_inject and fi_tinject calls.
+This is an experimental feature to allow some applications to override
+default inject size limitation.
+This is only effective for messages.
+Inject size for RMA operations is still limited to the default setting.
+.PP
+The default setting is 64.
+.PP
+\f[I]FI_PSM2_LOCK_LEVEL\f[] : When set, dictate the level of locking
+being used by the provider.
+Level 2 means all locks are enabled.
+Level 1 disables some locks and is suitable for runs that limit the
+access to each PSM2 context to a single thread.
+Level 0 disables all locks and thus is only suitable for single threaded
+runs.
+.PP
+To use level 0 or level 1, wait object and auto progress mode cannot be
+used because they introduce internal threads that may break the
+conditions needed for these levels.
+.PP
+The default setting is 2.
 .SH SEE ALSO
 .PP
 \f[C]fabric\f[](7), \f[C]fi_provider\f[](7), \f[C]fi_psm\f[](7),
diff --git a/man/man7/fi_sockets.7 b/man/man7/fi_sockets.7
index df9d751..e5a1387 100644
--- a/man/man7/fi_sockets.7
+++ b/man/man7/fi_sockets.7
@@ -1,4 +1,4 @@
-.TH "fi_sockets" "7" "2016\-03\-29" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_sockets" "7" "2017\-08\-09" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The Sockets Fabric Provider
@@ -44,6 +44,8 @@ implemented over TCP sockets.
 As a result, the performance numbers are lower compared to other
 providers implemented over high\-speed fabric, and lower than what an
 application might see implementing to sockets directly.
+.PP
+Does not support FI_ADDR_STR address format.
 .SH RUNTIME PARAMETERS
 .PP
 The sockets provider checks for the following environment variables \-
diff --git a/man/man7/fi_udp.7 b/man/man7/fi_udp.7
index 1b7e434..7ae32bc 100644
--- a/man/man7/fi_udp.7
+++ b/man/man7/fi_udp.7
@@ -1,4 +1,4 @@
-.TH "fi_udp" "7" "2016\-02\-28" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_udp" "7" "2017\-07\-27" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The UDP Fabric Provider
@@ -21,6 +21,8 @@ and receiving datagram messages over an unreliable endpoint.
 .PP
 \f[I]Endpoint capabilities\f[] : The following data transfer interface
 is supported: \f[I]fi_msg\f[].
+The provider supports standard unicast datagram transfers, as well as
+multicast operations.
 .PP
 \f[I]Modes\f[] : The provider does not require the use of any mode bits.
 .PP
diff --git a/man/man7/fi_usnic.7 b/man/man7/fi_usnic.7
index e3b3591..c518631 100644
--- a/man/man7/fi_usnic.7
+++ b/man/man7/fi_usnic.7
@@ -1,4 +1,4 @@
-.TH "fi_usnic" "7" "2016\-10\-11" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_usnic" "7" "2017\-07\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The usNIC Fabric Provider
@@ -84,6 +84,16 @@ usage is limited to releases 1.1 and beyond.
 fi_control with FI_GETWAIT may only be used on CQs that have been bound
 to an endpoint.
 If fi_control is used on an unbound CQ, it will return \-FI_EOPBADSTATE.
+.IP \[bu] 2
+There is limited support for data returned as part of an erroneous
+asynchronous operation.
+EQs will return error data for CM operations, CQs do not support
+returning error data.
+.IP \[bu] 2
+As of 1.5, usNIC supports fi_mr_regv, and fi_mr_regattr.
+Support is limited to a single iov.
+.IP \[bu] 2
+Atomic operations are not supported.
 .RE
 .IP \[bu] 2
 Resource management is not supported.
diff --git a/man/man7/fi_verbs.7 b/man/man7/fi_verbs.7
index 466eb82..562871e 100644
--- a/man/man7/fi_verbs.7
+++ b/man/man7/fi_verbs.7
@@ -1,4 +1,4 @@
-.TH "fi_verbs" "7" "2016\-10\-19" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.4.0"
+.TH "fi_verbs" "7" "2017\-07\-24" "Libfabric Programmer\[aq]s Manual" "Libfabric v1.5.2"
 .SH NAME
 .PP
 The Verbs Fabric Provider
@@ -46,10 +46,11 @@ Verbs provider supports FI_PROGRESS_AUTO: Asynchronous operations make
 forward progress automatically.
 .SS Operation flags
 .PP
-Verbs provider supports FI_INJECT, FI_COMPLETION, FI_REMOTE_CQ_DATA.
+Verbs provider supports FI_INJECT, FI_COMPLETION, FI_REMOTE_CQ_DATA,
+FI_TRANSMIT_COMPLETE.
 .SS Msg Ordering
 .PP
-Verbs provider support the following messaging ordering on the TX side:
+Verbs provider support the following message ordering:
 .IP \[bu] 2
 Read after Read
 .IP \[bu] 2
@@ -64,6 +65,12 @@ Write after Send
 Send after Write
 .IP \[bu] 2
 Send after Send
+.PP
+and the following completion ordering:
+.IP \[bu] 2
+TX contexts: FI_ORDER_STRICT
+.IP \[bu] 2
+RX contexts: FI_ORDER_DATA
 .SS Fork
 .PP
 Verbs provider supports the fork system call by default.
@@ -76,12 +83,12 @@ makes the use of fork unsafe.
 .SS Memory Regions
 .PP
 Only FI_MR_BASIC mode is supported.
-Adding regions via s/g list is not supported.
-Generic fi_mr_regattr is not supported.
+Adding regions via s/g list is supported only upto s/g list size of 1.
 No support for binding memory regions to a counter.
 .SS Wait objects
 .PP
-Only FI_WAIT_FD wait object is supported.
+Only FI_WAIT_FD wait object is supported only for FI_EP_MSG endpoint
+type.
 Wait sets are not supported.
 .SS Resource Management
 .PP
@@ -96,14 +103,17 @@ FI_EP_DGRAM
 .SS Unsupported Capabilities
 .PP
 FI_NAMED_RX_CTX, FI_DIRECTED_RECV, FI_TRIGGER, FI_MULTI_RECV,
-FI_RMA_EVENT, FI_FENCE
+FI_RMA_EVENT
 .SS Other unsupported features
 .PP
 Scalable endpoints, FABRIC_DIRECT
 .SS Unsupported features specific to MSG endpoints
-.PP
+.IP \[bu] 2
 Counters, FI_SOURCE, FI_TAGGED, FI_PEEK, FI_CLAIM, fi_cancel,
 fi_ep_alias, shared TX context, cq_readfrom operations.
+.IP \[bu] 2
+Completion flags are not reported if a request posted to an endpoint
+completes in error.
 .SS Unsupported features specific to RDM endpoints
 .PP
 The RDM support for verbs have the following limitations:
@@ -126,6 +136,19 @@ to be re\-mapped when the process is forked (MADV_DONTFORK).
 .SH RUNTIME PARAMETERS
 .PP
 The verbs provider checks for the following environment variables.
+.SS Variables specific to MSG endpoints
+.PP
+\f[I]FI_VERBS_TX_SIZE\f[] : Default maximum tx context size (default:
+384)
+.PP
+\f[I]FI_VERBS_RX_SIZE\f[] : Default maximum rx context size (default:
+384)
+.PP
+\f[I]FI_VERBS_TX_IOV_LIMIT\f[] : Default maximum tx iov_limit (default:
+4)
+.PP
+\f[I]FI_VERBS_RX_IOV_LIMIT\f[] : Default maximum rx iov_limit (default:
+4)
 .SS Variables specific to RDM endpoints
 .PP
 \f[I]FI_VERBS_IFACE\f[] : The prefix or the full name of the network
@@ -156,6 +179,12 @@ The last one is not applicable for iWarp.
 .PP
 The fi_info utility would give the up\-to\-date information on
 environment variables: fi_info \-p verbs \-e
+.SH Troubleshooting / Known issues
+.PP
+When running an app over verbs provider with valgrind, there may be
+reports of memory leak in functions from dependent libraries (e.g.
+libibverbs, librdmacm).
+These leaks are safe to ignore.
 .SH SEE ALSO
 .PP
 \f[C]fabric\f[](7), \f[C]fi_provider\f[](7),
diff --git a/prov/bgq/Makefile.include b/prov/bgq/Makefile.include
new file mode 100644
index 0000000..f85dc48
--- /dev/null
+++ b/prov/bgq/Makefile.include
@@ -0,0 +1,111 @@
+#
+# Copyright (C) 2016 by Argonne National Laboratory.
+#
+# This software is available to you under a choice of one of two
+# licenses.  You may choose to be licensed under the terms of the GNU
+# General Public License (GPL) Version 2, available from the file
+# COPYING in the main directory of this source tree, or the
+# BSD license below:
+#
+#     Redistribution and use in source and binary forms, with or
+#     without modification, are permitted provided that the following
+#     conditions are met:
+#
+#      - Redistributions of source code must retain the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer.
+#
+#      - Redistributions in binary form must reproduce the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer in the documentation and/or other materials
+#        provided with the distribution.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+if HAVE_BGQ
+bgq_files = prov/bgq/src/fi_bgq_atomic.c \
+		prov/bgq/src/fi_bgq_av.c \
+		prov/bgq/src/fi_bgq_spi.c \
+		prov/bgq/src/fi_bgq_cm.c \
+		prov/bgq/src/fi_bgq_cntr.c \
+		prov/bgq/src/fi_bgq_cq.c \
+		prov/bgq/src/fi_bgq_domain.c \
+		prov/bgq/src/fi_bgq_ep.c \
+		prov/bgq/src/fi_bgq_fabric.c \
+		prov/bgq/src/fi_bgq_info.c \
+		prov/bgq/src/fi_bgq_init.c \
+		prov/bgq/src/fi_bgq_mr.c \
+		prov/bgq/src/fi_bgq_msg.c \
+		prov/bgq/src/fi_bgq_rma.c \
+		prov/bgq/src/fi_bgq_sep.c \
+		prov/bgq/src/fi_bgq_tagged.c \
+		prov/bgq/src/fi_bgq_node.c \
+		prov/bgq/src/fi_bgq_progress.c \
+		prov/bgq/src/fi_bgq_pmi.c
+
+bgq_files_nodist = prov/bgq/external/memory_impl.c
+
+bgq_CPPFLAGS = -I at bgq_driver@ -I at bgq_driver@/spi/include/kernel/cnk -I$(builddir)/prov/bgq/include -I$(srcdir)/prov/bgq/include
+bgq_LDFLAGS = -static
+
+prov/bgq/external/memory_impl.c: @bgq_external_source@/spi/src/kernel/cnk/memory_impl.c
+	@${MKDIR_P} $(@D)
+	@cp $< $@
+
+if HAVE_BGQ_DL
+pkglib_LTLIBRARIES += libbgq-fi.la
+libbgq_fi_la_SOURCES = $(bgq_files) $(common_srcs)
+nodist_libbgq_fi_la_SOURCES = $(bgq_files_nodist)
+libbgq_fi_la_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+libbgq_fi_la_LDFLAGS = \
+    -module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+libbgq_fi_la_LIBADD = $(linkback) $(bgq_LIBS)
+libbgq_fi_la_DEPENDENCIES = $(linkback)
+else
+src_libfabric_la_SOURCES += $(bgq_files)
+nodist_src_libfabric_la_SOURCES += $(bgq_files_nodist)
+src_libfabric_la_CPPFLAGS += $(bgq_CPPFLAGS)
+src_libfabric_la_LDFLAGS += $(bgq_LDFLAGS)
+src_libfabric_la_LIBADD += $(bgq_LIBS)
+endif
+
+sbin_PROGRAMS = fi_bgq_agent0 fi_bgq_agent1
+fi_bgq_agent1_SOURCES = prov/bgq/src/fi_bgq_agent.c
+fi_bgq_agent1_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+fi_bgq_agent1_LDFLAGS = -all-static $(bgq_LDFLAGS) -Wl,--script=@bgq_driver@/cnk/tools/AppAgent1.lds
+fi_bgq_agent0_SOURCES = $(fi_bgq_agent1_SOURCES)
+fi_bgq_agent0_CPPFLAGS = $(fi_bgq_agent1_CPPFLAGS)
+fi_bgq_agent0_LDFLAGS = -all-static $(bgq_LDFLAGS) -Wl,--script=@bgq_driver@/cnk/tools/AppAgent0.lds
+
+include $(top_srcdir)/prov/bgq/src/test/Makefile.include
+
+rdma_bgqincludedir = $(includedir)/rdma/bgq
+
+rdma_bgqinclude_HEADERS =
+
+# internal utility functions shared by in-tree providers:
+if HAVE_DIRECT
+nodist_rdma_bgqinclude_HEADERS = \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_compiler.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_hwi.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_mu.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_spi.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_node.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_progress.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_flight_recorder.h \
+	$(top_srcdir)/prov/$(PROVIDER_DIRECT)/include/rdma/bgq/fi_bgq_l2atomic.h
+endif HAVE_DIRECT
+
+prov_install_man_pages += man/man7/fi_bgq.7
+
+endif #HAVE_BGQ
+
+prov_dist_man_pages += man/man7/fi_bgq.7
diff --git a/prov/bgq/configure.m4 b/prov/bgq/configure.m4
new file mode 100644
index 0000000..4a02059
--- /dev/null
+++ b/prov/bgq/configure.m4
@@ -0,0 +1,135 @@
+dnl
+dnl Copyright (C) 2016 by Argonne National Laboratory.
+dnl
+dnl This software is available to you under a choice of one of two
+dnl licenses.  You may choose to be licensed under the terms of the GNU
+dnl General Public License (GPL) Version 2, available from the file
+dnl COPYING in the main directory of this source tree, or the
+dnl BSD license below:
+dnl
+dnl     Redistribution and use in source and binary forms, with or
+dnl     without modification, are permitted provided that the following
+dnl     conditions are met:
+dnl
+dnl      - Redistributions of source code must retain the above
+dnl        copyright notice, this list of conditions and the following
+dnl        disclaimer.
+dnl
+dnl      - Redistributions in binary form must reproduce the above
+dnl        copyright notice, this list of conditions and the following
+dnl        disclaimer in the documentation and/or other materials
+dnl        provided with the distribution.
+dnl
+dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+dnl NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+dnl BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+dnl ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+dnl CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+dnl SOFTWARE.
+dnl
+dnl Configury specific to the libfabrics BGQ provider
+
+dnl Called to configure this provider
+dnl
+dnl Arguments:
+dnl
+dnl $1: action if configured successfully
+dnl $2: action if not configured successfully
+dnl
+AC_DEFUN([FI_BGQ_CONFIGURE],[
+	# Determine if we can support the bgq provider
+	bgq_happy=0
+	bgq_direct=0
+
+	AS_IF([test x"$enable_bgq" != x"no"],[
+		AC_MSG_CHECKING([for direct bgq provider])
+		AS_IF([test x"$enable_direct" != x"bgq"],
+			[AC_MSG_RESULT([no])],
+			[AC_MSG_RESULT([yes])
+
+			bgq_driver=/bgsys/drivers/ppcfloor
+			AC_SUBST(bgq_driver)
+			AC_ARG_WITH([bgq-driver],
+				[AS_HELP_STRING([--with-bgq-driver=@<:@BGQ driver installation path@:>@],
+					[Provide path to where BGQ system headers are installed])
+				],
+				[bgq_driver=$with_bgq_driver])
+
+			bgq_driver_CPPFLAGS="-I$bgq_driver -I$bgq_driver/spi/include/kernel/cnk"
+			CPPFLAGS="$bgq_driver_CPPFLAGS $CPPFLAGS"
+
+			AC_CHECK_HEADER(hwi/include/bqc/MU_Descriptor.h,
+				[bgq_happy=1],
+				[bgq_happy=0])
+
+			bgq_external_source=auto
+			AC_SUBST(bgq_external_source)
+			AC_ARG_WITH([bgq-src],
+				[AS_HELP_STRING([--with-bgq-src(=DIR)],
+					[bgq opensource distribution @<:@default=auto@:>@])
+				],
+				[bgq_external_source=$with_bgq_src])
+
+			AS_IF([test x"$bgq_external_source" == x"auto"], [
+				for bgq_dir in `ls -r /bgsys/source`; do
+					AC_MSG_CHECKING([for bgq opensource distribution])
+					AS_IF([test -f /bgsys/source/$bgq_dir/spi/src/kernel/cnk/memory_impl.c],
+						bgq_external_source="/bgsys/source/$bgq_dir"
+						AC_MSG_RESULT([$bgq_external_source])
+						break)
+				done
+				AS_IF([test x"$bgq_external_source" == x"auto"], [
+					bgq_happy=0
+					AC_MSG_RESULT([no])])
+			])
+
+			AS_IF([test ! -f $bgq_external_source/spi/src/kernel/cnk/memory_impl.c], [
+				AC_MSG_ERROR([unable to locate the bgq opensource distribution])])
+
+			AC_ARG_WITH([bgq-progress],
+				[AS_HELP_STRING([--with-bgq-progress(=auto|manual|runtime)],
+					[Specify the bgq FABRIC_DIRECT progess mode  @<:@default=manual@:>@])
+				])
+
+			AS_CASE([$with_bgq_progress],
+				[auto], [BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_AUTO],
+				[manual], [BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_MANUAL],
+				[runtime], [BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_UNSPEC],
+				[BGQ_FABRIC_DIRECT_PROGRESS=FI_PROGRESS_MANUAL])
+
+			AC_SUBST(bgq_fabric_direct_progress, [$BGQ_FABRIC_DIRECT_PROGRESS])
+
+			dnl Only FI_AV_MAP is supported by the bgq provider
+			BGQ_FABRIC_DIRECT_AV=FI_AV_MAP
+			AC_SUBST(bgq_fabric_direct_av, [$BGQ_FABRIC_DIRECT_AV])
+
+			AC_ARG_WITH([bgq-mr],
+				[AS_HELP_STRING([--with-bgq-mr(=scalable|basic)],
+					[Specify the bgq FABRIC_DIRECT mr mode  @<:@default=scalable@:>@])
+				])
+
+			AS_CASE([$with_bgq_mr],
+				[scalable], [BGQ_FABRIC_DIRECT_MR=FI_MR_SCALABLE],
+				[basic], [BGQ_FABRIC_DIRECT_MR=FI_MR_BASIC],
+				[BGQ_FABRIC_DIRECT_MR=FI_MR_SCALABLE])
+
+			AC_SUBST(bgq_fabric_direct_mr, [$BGQ_FABRIC_DIRECT_MR])
+
+			dnl Only FI_THREAD_ENDPOINT is supported by the bgq provider
+			BGQ_FABRIC_DIRECT_THREAD=FI_THREAD_ENDPOINT
+			AC_SUBST(bgq_fabric_direct_thread, [$BGQ_FABRIC_DIRECT_THREAD])
+
+
+			AC_CONFIG_FILES([prov/bgq/include/rdma/fi_direct.h])
+		])
+	])
+
+	AS_IF([test $bgq_happy -eq 1], [$1], [$2])
+])
+
+dnl A separate macro for AM CONDITIONALS, since they cannot be invoked
+dnl conditionally
+AC_DEFUN([FI_BGQ_CONDITIONALS],[
+])
diff --git a/prov/bgq/include/rdma/fi_direct.h.in b/prov/bgq/include/rdma/fi_direct.h.in
new file mode 100644
index 0000000..5755cae
--- /dev/null
+++ b/prov/bgq/include/rdma/fi_direct.h.in
@@ -0,0 +1,378 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#ifndef _FI_BGQ_DIRECT_H_
+#define _FI_BGQ_DIRECT_H_
+
+#ifdef FABRIC_DIRECT
+#define FABRIC_DIRECT_ 1
+
+#include "rdma/fabric.h"
+
+struct fi_context {
+	void			*internal[8];
+};
+
+#endif
+
+static const uint64_t FI_BGQ_MAX_MSG_SIZE	= (0x7FFFFFFFULL);	/* 2^31-1 */
+static const uint64_t FI_BGQ_MAX_PREFIX_SIZE	= (0ULL);
+static const uint64_t FI_BGQ_INJECT_SIZE	= (512ULL);
+static const uint64_t FI_BGQ_MAX_ORDER_RAW_SIZE	= (256ULL);		/* FI_MR_BASIC: 2^37 */
+static const uint64_t FI_BGQ_MAX_ORDER_WAR_SIZE	= (256ULL);		/* FI_MR_BASIC: 2^37 */
+static const uint64_t FI_BGQ_MAX_ORDER_WAW_SIZE	= (256ULL);		/* FI_MR_BASIC: 2^37 */
+static const size_t FI_BGQ_TOTAL_BUFFERED_RECV	= (512ULL);
+static const uint64_t FI_BGQ_TX_SIZE		= (16*1024);
+static const uint64_t FI_BGQ_RX_SIZE		= (16*1024);
+static const uint64_t FI_BGQ_MR_KEY_SIZE	= (2);
+static const size_t   FI_BGQ_REMOTE_CQ_DATA_SIZE= 4;
+/* TODO: revisit these values, these are just placeholders now */
+/*
+static const uint64_t FI_BGQ_CMD_SLOT_AVAIL_POLL= (1ULL<<10);
+static const uint64_t FI_BGQ_LE_ME_COUNT	= (1ULL<<8);
+static const uint64_t FI_BGQ_UNEXPECTED_COUNT	= (1ULL<<8);
+static const uint64_t FI_BGQ_TRIG_OP_COUNT	= (0);
+static const uint64_t FI_BGQ_MAX_NUM_EP		= (1ULL<<10); // TODO: is it needed?
+static const size_t   FI_BGQ_CACHE_LINE_SIZE	= 128;
+static const size_t   FI_BGQ_DEFAULT_CQ_DEPTH   = 32768;
+*/
+static const uint64_t FI_BGQ_MEM_TAG_FORMAT	= (0xFFFFFFFFFFFFFFFFULL);
+
+static const uint64_t FI_BGQ_DEFAULT_MSG_ORDER = (FI_ORDER_RAR |
+							FI_ORDER_RAW |
+							FI_ORDER_WAW |
+							FI_ORDER_WAS |
+							FI_ORDER_SAW |
+							FI_ORDER_SAS);
+
+static const uint64_t FI_BGQ_DEFAULT_CAPS = (FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMIC |
+						FI_SEND | FI_RECV | FI_READ | FI_WRITE | FI_REMOTE_READ | FI_REMOTE_WRITE |
+						FI_NAMED_RX_CTX | FI_DIRECTED_RECV |
+						FI_MULTI_RECV | FI_SOURCE);
+
+#define FI_BGQ_FABRIC_DIRECT_PROGRESS	@bgq_fabric_direct_progress@
+#define FI_BGQ_FABRIC_DIRECT_AV		@bgq_fabric_direct_av@
+#define FI_BGQ_FABRIC_DIRECT_MR		@bgq_fabric_direct_mr@
+#define FI_BGQ_FABRIC_DIRECT_THREAD	@bgq_fabric_direct_thread@
+
+
+/* Macro indirection in order to support other macros as arguments
+ * C requires another indirection for expanding macros since
+ * operands of the token pasting operator are not expanded */
+
+#define FI_BGQ_RMA_SPECIALIZED_FUNC(LOCK)				\
+	FI_BGQ_RMA_SPECIALIZED_FUNC_(LOCK)
+
+#define FI_BGQ_RMA_SPECIALIZED_FUNC_(LOCK)				\
+	static inline ssize_t						\
+	fi_bgq_writemsg_ ## LOCK					\
+		(struct fid_ep *ep, const struct fi_msg_rma *msg,	\
+			uint64_t flags)					\
+	{								\
+		return fi_bgq_writemsg_generic(ep, msg, flags,		\
+				LOCK);					\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_writev_ ## LOCK						\
+		(struct fid_ep *ep, const struct iovec *iov,		\
+			void **desc, size_t count, fi_addr_t dest_addr,	\
+			uint64_t addr, uint64_t key, void *context)	\
+	{								\
+		return fi_bgq_writev_generic(ep, iov, desc, count,	\
+				dest_addr, addr, key, context, LOCK);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_write_ ## LOCK						\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			void *desc, fi_addr_t dst_addr, uint64_t addr,	\
+			uint64_t key, void *context)			\
+	{								\
+		return fi_bgq_write_generic(ep, buf, len, desc,		\
+				dst_addr, addr, key, context, LOCK);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_inject_write_ ## LOCK 					\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			fi_addr_t dst_addr, uint64_t addr,		\
+			uint64_t key)					\
+	{								\
+		return fi_bgq_inject_write_generic(ep, buf, len,	\
+				dst_addr, addr, key, LOCK);		\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_readmsg_ ## LOCK						\
+		(struct fid_ep *ep, const struct fi_msg_rma *msg,	\
+			uint64_t flags)					\
+	{								\
+		return fi_bgq_readmsg_generic(ep, msg, flags,		\
+				LOCK);					\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_readv_ ## LOCK						\
+		(struct fid_ep *ep, const struct iovec *iov,		\
+			void **desc, size_t count, fi_addr_t src_addr,	\
+			uint64_t addr, uint64_t key, void *context)	\
+	{								\
+		return fi_bgq_writev_generic(ep, iov, desc, count,	\
+				src_addr, addr, key, context, LOCK);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_read_ ## LOCK						\
+		(struct fid_ep *ep, void *buf, size_t len,		\
+			void *desc, fi_addr_t src_addr, uint64_t addr,	\
+			uint64_t key, void *context)			\
+	{								\
+		return fi_bgq_read_generic(ep, buf, len, desc,		\
+				src_addr, addr, key, context, LOCK);	\
+	}
+
+#define FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(TYPE, LOCK)			\
+	FI_BGQ_RMA_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)
+
+#define FI_BGQ_RMA_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)			\
+		fi_bgq_ ## TYPE ## _ ## LOCK
+
+
+
+#define FI_BGQ_CQ_SPECIALIZED_FUNC(FORMAT, LOCK)			\
+	FI_BGQ_CQ_SPECIALIZED_FUNC_(FORMAT, LOCK)
+
+#define FI_BGQ_CQ_SPECIALIZED_FUNC_(FORMAT, LOCK)			\
+	static inline ssize_t						\
+	fi_bgq_cq_read_ ## FORMAT ## _ ## LOCK				\
+		(struct fid_cq *cq, void *buf, size_t count)		\
+	{								\
+		return fi_bgq_cq_read_generic(cq, buf, count,		\
+				FORMAT, LOCK);				\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_cq_readfrom_ ## FORMAT ## _ ## LOCK			\
+		(struct fid_cq *cq, void *buf, size_t count,		\
+			fi_addr_t *src_addr)				\
+	{								\
+		return fi_bgq_cq_readfrom_generic(cq, buf, count, src_addr,	\
+				FORMAT, LOCK);				\
+	}								\
+
+#define FI_BGQ_CQ_SPECIALIZED_FUNC_NAME(TYPE, FORMAT, LOCK)		\
+	FI_BGQ_CQ_SPECIALIZED_FUNC_NAME_(TYPE, FORMAT, LOCK)
+
+#define FI_BGQ_CQ_SPECIALIZED_FUNC_NAME_(TYPE, FORMAT, LOCK)		\
+		fi_bgq_ ## TYPE ## _ ## FORMAT ## _ ## LOCK
+
+
+
+
+#define FI_BGQ_ATOMIC_SPECIALIZED_FUNC(LOCK)				\
+	FI_BGQ_ATOMIC_SPECIALIZED_FUNC_(LOCK)
+
+#define FI_BGQ_ATOMIC_SPECIALIZED_FUNC_(LOCK)				\
+	static inline ssize_t						\
+	fi_bgq_atomic_ ## LOCK 						\
+		(struct fid_ep *ep, const void *buf, size_t count,	\
+			void *desc, fi_addr_t dst_addr, uint64_t addr,	\
+			uint64_t key, enum fi_datatype datatype,	\
+			enum fi_op op, void *context)			\
+	{								\
+		return fi_bgq_atomic_generic(ep, buf, count,		\
+				dst_addr, addr, key, datatype, op,	\
+				context, LOCK);				\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_inject_atomic_ ## LOCK					\
+		(struct fid_ep *ep, const void *buf, size_t count,	\
+			fi_addr_t dst_addr, uint64_t addr,		\
+			uint64_t key, enum fi_datatype datatype,	\
+			enum fi_op op)					\
+	{								\
+		return fi_bgq_inject_atomic_generic(ep, buf, count,	\
+				dst_addr, addr, key, datatype, op,	\
+				LOCK);					\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_fetch_atomic_ ## LOCK 					\
+		(struct fid_ep *ep, const void *buf, size_t count,	\
+		 void *desc, void *result, void *result_desc,		\
+		 fi_addr_t dest_addr, uint64_t addr,			\
+		 uint64_t key, enum fi_datatype datatype,		\
+		 enum fi_op op, void *context)				\
+	{								\
+		return fi_bgq_fetch_atomic_generic(ep, buf, count, desc,\
+				result, result_desc, dest_addr, addr,	\
+				key, datatype, op, context,		\
+				LOCK);					\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_compare_atomic_ ## LOCK					\
+		(struct fid_ep *ep, const void *buf, size_t count,	\
+			void *desc, const void *compare,		\
+			void *compare_desc, void *result,		\
+			void *result_desc, fi_addr_t dest_addr,		\
+			uint64_t addr, uint64_t key,			\
+			enum fi_datatype datatype, enum fi_op op,	\
+			void *context)					\
+	{								\
+		return fi_bgq_compare_atomic_generic(ep, buf, count,	\
+				desc, compare, compare_desc, result,	\
+				result_desc, dest_addr, addr, key,	\
+				datatype, op, context, LOCK);		\
+	}
+
+#define FI_BGQ_ATOMIC_SPECIALIZED_FUNC_NAME(TYPE, LOCK)			\
+	FI_BGQ_ATOMIC_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)
+
+#define FI_BGQ_ATOMIC_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)		\
+		fi_bgq_ ## TYPE ## _ ## LOCK
+
+
+#define FI_BGQ_MSG_SPECIALIZED_FUNC(LOCK)				\
+	FI_BGQ_MSG_SPECIALIZED_FUNC_(LOCK)
+
+#define FI_BGQ_MSG_SPECIALIZED_FUNC_(LOCK)				\
+	static inline ssize_t						\
+	fi_bgq_send_ ## LOCK						\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			void *desc, fi_addr_t dst_addr, void *context)	\
+	{								\
+		return fi_bgq_send_generic(ep, buf, len, desc,		\
+				dst_addr, 0, context, LOCK, 1);		\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_recv_ ## LOCK 						\
+		(struct fid_ep *ep, void *buf, size_t len,		\
+			void *desc, fi_addr_t src_addr, void *context)	\
+	{								\
+		return fi_bgq_recv_generic(ep, buf, len, desc,		\
+				src_addr, 0, (uint64_t)-1, context, LOCK, 1);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_inject_ ## LOCK						\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			fi_addr_t dst_addr)				\
+	{								\
+		return fi_bgq_inject(ep, buf, len,			\
+				dst_addr, LOCK);			\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_recvmsg_ ## LOCK 					\
+		(struct fid_ep *ep, const struct fi_msg *msg,		\
+			uint64_t flags)					\
+	{								\
+		return fi_bgq_recvmsg_generic(ep, msg, flags,		\
+				LOCK);					\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_senddata_ ## LOCK					\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			void *desc, uint64_t data, fi_addr_t dest_addr,	\
+			void *context)					\
+	{								\
+		return fi_bgq_senddata_generic(ep, buf, len, desc, data,\
+				dest_addr, 0, context, LOCK, 1);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_injectdata_ ## LOCK					\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			uint64_t data, fi_addr_t dest_addr)		\
+	{								\
+		return fi_bgq_injectdata_generic(ep, buf, len, data,	\
+				dest_addr, 0, LOCK, 1);			\
+	}
+
+#define FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(TYPE, LOCK)			\
+	FI_BGQ_MSG_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)
+
+#define FI_BGQ_MSG_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)			\
+		fi_bgq_ ## TYPE ## _ ## LOCK
+
+
+#define FI_BGQ_TAGGED_SPECIALIZED_FUNC(LOCK)				\
+	FI_BGQ_TAGGED_SPECIALIZED_FUNC_(LOCK)
+
+#define FI_BGQ_TAGGED_SPECIALIZED_FUNC_(LOCK)				\
+	static inline ssize_t						\
+	fi_bgq_tsend_ ## LOCK						\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			void *desc, fi_addr_t dst_addr, uint64_t tag, void *context)	\
+	{								\
+		return fi_bgq_send_generic(ep, buf, len, desc,		\
+				dst_addr, tag, context, LOCK, 0);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_trecv_ ## LOCK						\
+		(struct fid_ep *ep, void *buf, size_t len,		\
+			void *desc, fi_addr_t src_addr, uint64_t tag, uint64_t ignore, void *context)	\
+	{								\
+		return fi_bgq_recv_generic(ep, buf, len, desc,		\
+				src_addr, tag, ignore, context, LOCK, 0);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_tinject_ ## LOCK						\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			fi_addr_t dst_addr, uint64_t tag)		\
+	{								\
+		return fi_bgq_tinject(ep, buf, len,			\
+				dst_addr, tag, LOCK);			\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_tsenddata_ ## LOCK					\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			void *desc, uint64_t data, fi_addr_t dest_addr,	\
+			uint64_t tag, void *context)			\
+	{								\
+		return fi_bgq_senddata_generic(ep, buf, len, desc, data,\
+				dest_addr, tag, context, LOCK, 0);	\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_tinjectdata_ ## LOCK					\
+		(struct fid_ep *ep, const void *buf, size_t len,	\
+			uint64_t data, fi_addr_t dest_addr,		\
+			uint64_t tag)					\
+	{								\
+		return fi_bgq_injectdata_generic(ep, buf, len, data,	\
+				dest_addr, tag, LOCK, 0);		\
+	}								\
+	static inline ssize_t						\
+	fi_bgq_trecvmsg_ ## LOCK					\
+		(struct fid_ep *ep, const struct fi_msg_tagged *msg,	\
+			uint64_t flags)					\
+	{								\
+		return fi_bgq_trecvmsg_generic(ep, msg, flags,		\
+				LOCK);					\
+	}
+
+#define FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(TYPE, LOCK)			\
+	FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)
+
+#define FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME_(TYPE, LOCK)		\
+		fi_bgq_ ## TYPE ## _ ## LOCK
+
+#endif /* _FI_BGQ_DIRECT_H_ */
diff --git a/include/fi_osd.h b/prov/bgq/src/fi_bgq_agent.c
similarity index 78%
copy from include/fi_osd.h
copy to prov/bgq/src/fi_bgq_agent.c
index cc2db36..68d980a 100644
--- a/include/fi_osd.h
+++ b/prov/bgq/src/fi_bgq_agent.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (C) 2016 by Argonne National Laboratory.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -30,20 +30,15 @@
  * SOFTWARE.
  */
 
-#ifndef _FI_OSD_H_
-#define _FI_OSD_H_
+#include <stdio.h>
+#include <unistd.h>
 
-#ifdef __APPLE__
-#include <osx/osd.h>
-#include <unix/osd.h>
-#elif defined __FreeBSD__
-#include <freebsd/osd.h>
-#include <unix/osd.h>
-#elif defined _WIN32
-#include <windows/osd.h>
-#else
-#include <linux/osd.h>
-#include <unix/osd.h>
-#endif
+int main (int argc, char ** argv) {
 
-#endif /* _FI_OSD_H_ */
+	setbuf(stdout, NULL);
+	setbuf(stderr, NULL);
+
+	while (1) usleep(1000);
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_atomic.c b/prov/bgq/src/fi_bgq_atomic.c
new file mode 100644
index 0000000..276e669
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_atomic.c
@@ -0,0 +1,856 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+
+#include <complex.h>
+
+/*
+ * --------------------------- begin: rx atomics ------------------------------
+ */
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_MACRO_NAME(OP)				\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_MACRO_NAME_(OP)
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_MACRO_NAME_(OP)				\
+	FI_BGQ_RX_ATOMIC_DO_ ## OP
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(OP, DT, CTYPE)			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_(OP, DT, CTYPE)
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_(OP, DT, CTYPE)			\
+	void fi_bgq_rx_atomic_ ## OP ## _ ## DT					\
+		(void * buf, void * addr, size_t nbytes)			\
+	{									\
+		FI_BGQ_RX_ATOMIC_SPECIALIZED_MACRO_NAME(OP)(buf, addr, CTYPE)	\
+	}
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(OP, DT)				\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME_(OP, DT)
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME_(OP, DT)				\
+	fi_bgq_rx_atomic_ ## OP ## _ ## DT
+
+
+#define FI_BGQ_RX_ATOMIC_DO_MIN(buf_, addr_, ctype)				\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (buf__[i] < addr__[i])					\
+			addr__[i] = buf__[i];					\
+
+#define FI_BGQ_RX_ATOMIC_DO_MAX(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (buf__[i] > addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_SUM(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] += buf__[i];						\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_PROD(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] = addr__[i] * buf__[i];				\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_LOR(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] = (addr__[i] || buf__[i]);				\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_LAND(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] = (addr__[i] && buf__[i]);				\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_BOR_(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] |= buf__[i];						\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_BOR(buf_, addr_, ctype)				\
+{										\
+	if (sizeof(uint8_t) == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(buf_, addr_, uint8_t);			\
+	} else if (sizeof(uint16_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(buf_, addr_, uint16_t);		\
+	} else if (sizeof(uint32_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(buf_, addr_, uint32_t);		\
+	} else if (sizeof(uint64_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(buf_, addr_, uint64_t);		\
+	} else if (16 == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BOR_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+	} else if (32 == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);		\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);		\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(&(((uint64_t*)buf_)[2]), &(((uint64_t*)addr_)[2]), uint64_t);		\
+		FI_BGQ_RX_ATOMIC_DO_BOR_(&(((uint64_t*)buf_)[3]), &(((uint64_t*)addr_)[3]), uint64_t);		\
+	} else {								\
+		assert(0);							\
+	}									\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_BAND_(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] &= buf__[i];						\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_BAND(buf_, addr_, ctype)				\
+{										\
+	if (sizeof(uint8_t) == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BAND_(buf_, addr_, uint8_t);		\
+	} else if (sizeof(uint16_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BAND_(buf_, addr_, uint16_t);		\
+	} else if (sizeof(uint32_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BAND_(buf_, addr_, uint32_t);		\
+	} else if (sizeof(uint64_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BAND_(buf_, addr_, uint64_t);		\
+	} else if (16 == sizeof(ctype)) {			\
+		FI_BGQ_RX_ATOMIC_DO_BAND_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BAND_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+	} else if (32 == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BAND_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BAND_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BAND_(&(((uint64_t*)buf_)[2]), &(((uint64_t*)addr_)[2]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BAND_(&(((uint64_t*)buf_)[3]), &(((uint64_t*)addr_)[3]), uint64_t);          \
+	} else {								\
+		assert(0);							\
+	}									\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_LXOR(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] = ((addr__[i] && !buf__[i]) ||			\
+			(!addr__[i] && buf__[i]));				\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_BXOR_(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] = addr__[i] ^ buf__[i];				\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_BXOR(buf_, addr_, ctype)				\
+{										\
+	if (sizeof(uint8_t) == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(buf_, addr_, uint8_t);		\
+	} else if (sizeof(uint16_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(buf_, addr_, uint16_t);		\
+	} else if (sizeof(uint32_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(buf_, addr_, uint32_t);		\
+	} else if (sizeof(uint64_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(buf_, addr_, uint64_t);		\
+	} else if (16 == sizeof(ctype)) {			\
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+	} else if (32 == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(&(((uint64_t*)buf_)[2]), &(((uint64_t*)addr_)[2]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_BXOR_(&(((uint64_t*)buf_)[3]), &(((uint64_t*)addr_)[3]), uint64_t);          \
+	} else {								\
+		assert(0);							\
+	}									\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_ATOMIC_READ(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		buf__[i] = addr__[i];						\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_ATOMIC_WRITE(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] = buf__[i];						\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_CSWAP(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (compare__[i] == addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_CSWAP_NE(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (compare__[i] != addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_CSWAP_LE(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (compare__[i] <= addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_CSWAP_LT(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (compare__[i] < addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_CSWAP_GE(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (compare__[i] >= addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_CSWAP_GT(buf_, addr_, ctype)			\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		if (compare__[i] > addr__[i])					\
+			addr__[i] = buf__[i];					\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_MSWAP_(buf_, addr_, ctype)				\
+{										\
+	ctype * buf__ = (ctype *)buf_;						\
+	ctype * addr__ = (ctype *)addr_;					\
+	const size_t count = nbytes / sizeof(ctype);				\
+	const ctype * compare__ = &buf__[count];				\
+	unsigned i;								\
+	for (i=0; i<count; ++i)							\
+		addr__[i] =							\
+			(buf__[i] & compare__[i]) |				\
+			(addr__[i] & ~compare__[i]);				\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_MSWAP(buf_, addr_, ctype)				\
+{										\
+	if (sizeof(uint8_t) == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(buf_, addr_, uint8_t);		\
+	} else if (sizeof(uint16_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(buf_, addr_, uint16_t);		\
+	} else if (sizeof(uint32_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(buf_, addr_, uint32_t);		\
+	} else if (sizeof(uint64_t) == sizeof(ctype)) {				\
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(buf_, addr_, uint64_t);		\
+	} else if (16 == sizeof(ctype)) {			\
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+	} else if (32 == sizeof(ctype)) {					\
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(&(((uint64_t*)buf_)[0]), &(((uint64_t*)addr_)[0]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(&(((uint64_t*)buf_)[1]), &(((uint64_t*)addr_)[1]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(&(((uint64_t*)buf_)[2]), &(((uint64_t*)addr_)[2]), uint64_t);          \
+		FI_BGQ_RX_ATOMIC_DO_MSWAP_(&(((uint64_t*)buf_)[3]), &(((uint64_t*)addr_)[3]), uint64_t);          \
+	} else {								\
+		assert(0);							\
+	}									\
+}
+
+#define FI_BGQ_RX_ATOMIC_DO_NOOP(buf_, addr_, ctype) {}
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(DT, CTYPE)				\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(MIN, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(MAX, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(SUM, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(PROD, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(LOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(LAND, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(BOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(BAND, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(LXOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(BXOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(ATOMIC_READ, DT, CTYPE);		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(ATOMIC_WRITE, DT, CTYPE);		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP_NE, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP_LE, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP_LT, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP_GE, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP_GT, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(MSWAP, DT, CTYPE);
+
+#define FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS_COMPLEX(DT, CTYPE)			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(SUM, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(PROD, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(LOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(LAND, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(BOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(LXOR, DT, CTYPE);			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(ATOMIC_READ, DT, CTYPE);		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(ATOMIC_WRITE, DT, CTYPE);		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC(CSWAP, DT, CTYPE);
+
+void fi_bgq_rx_atomic_NOOP (void * addr, void * buf, size_t nbytes) {}
+
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(INT8, int8_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(UINT8, uint8_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(INT16, int16_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(UINT16, uint16_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(INT32, int32_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(UINT32, uint32_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(INT64, int64_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(UINT64, uint64_t)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(FLOAT, float)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(DOUBLE, double)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS_COMPLEX(FLOAT_COMPLEX, complex float)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS_COMPLEX(DOUBLE_COMPLEX, complex double)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS(LONG_DOUBLE, long double)
+FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNCS_COMPLEX(LONG_DOUBLE_COMPLEX, complex long double)
+
+#define FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(DT)				\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(MIN, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(MAX, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(SUM, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(PROD, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(LOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(LAND, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(BOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(BAND, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(LXOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(BXOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(ATOMIC_READ, DT),		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(ATOMIC_WRITE, DT),		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP_NE, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP_LE, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP_LT, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP_GE, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP_GT, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(MSWAP, DT)
+
+#define FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES_COMPLEX(DT)			\
+	fi_bgq_rx_atomic_NOOP,							\
+	fi_bgq_rx_atomic_NOOP,							\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(SUM, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(PROD, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(LOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(LAND, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(BOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(BAND, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(LXOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(BXOR, DT),			\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(ATOMIC_READ, DT),		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(ATOMIC_WRITE, DT),		\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(CSWAP, DT),			\
+	fi_bgq_rx_atomic_NOOP,							\
+	fi_bgq_rx_atomic_NOOP,							\
+	fi_bgq_rx_atomic_NOOP,							\
+	fi_bgq_rx_atomic_NOOP,							\
+	fi_bgq_rx_atomic_NOOP,							\
+	FI_BGQ_RX_ATOMIC_SPECIALIZED_FUNC_NAME(MSWAP, DT)
+
+void
+fi_bgq_rx_atomic_dispatch (void * buf, void * addr, size_t nbytes,
+	enum fi_datatype dt, enum fi_op op)
+{
+	static void (*fi_bgq_rx_atomic_dispatch_table[FI_DATATYPE_LAST][FI_ATOMIC_OP_LAST])(void*, void*, size_t) =
+	{
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(INT8) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(UINT8) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(INT16) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(UINT16) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(INT32) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(UINT32) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(INT64) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(UINT64) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(FLOAT) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(DOUBLE) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES_COMPLEX(FLOAT) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES_COMPLEX(DOUBLE) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES(LONG_DOUBLE) },
+		{ FI_BGQ_RX_ATOMIC_DISPATCH_FUNC_NAMES_COMPLEX(LONG_DOUBLE) }
+	};
+
+	fi_bgq_rx_atomic_dispatch_table[dt][op](buf, addr, nbytes);
+}
+/*
+ * --------------------------- end: rx atomics --------------------------------
+ */
+
+ssize_t fi_bgq_atomic(struct fid_ep *ep,
+		const void *buf, size_t count, void *desc,
+		fi_addr_t dst_addr, uint64_t addr,
+		uint64_t key, enum fi_datatype datatype,
+		enum fi_op op, void* context)
+{
+	int lock_required = 0;
+
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+                lock_required = 0;
+                break;
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+                lock_required = 1;
+                break;
+        default:
+                return -FI_EINVAL;
+        }
+
+	return fi_bgq_atomic_generic(ep, buf, count, dst_addr,
+			addr, key, datatype, op, context,
+			lock_required);
+
+}
+
+ssize_t fi_bgq_fetch_atomic(struct fid_ep *ep,
+		const void *buf, size_t count,
+		void *desc,
+		void *result, void *result_desc,
+		fi_addr_t dest_addr, uint64_t addr,
+		uint64_t key, enum fi_datatype datatype,
+		enum fi_op op, void *context)
+{
+	int lock_required = 0;
+
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+                lock_required = 0;
+                break;
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+                lock_required = 1;
+                break;
+        default:
+                return -FI_EINVAL;
+	}
+
+	return fi_bgq_fetch_atomic_generic(ep,
+			buf, count, desc,
+			result, result_desc, dest_addr, addr,
+			key, datatype, op, context,
+			lock_required);
+}
+
+ssize_t fi_bgq_compare_atomic(struct fid_ep *ep,
+		const void *buf, size_t count, void *desc,
+		const void *compare, void *compare_desc,
+		void  *result, void *result_desc,
+		fi_addr_t dest_addr, uint64_t addr,
+		uint64_t key, enum fi_datatype datatype,
+		enum fi_op op, void *context)
+{
+	int lock_required = 0;
+
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+                lock_required = 0;
+                break;
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+                lock_required = 1;
+                break;
+        default:
+                return -FI_EINVAL;
+	}
+
+	return fi_bgq_compare_atomic_generic(ep,
+			buf, count, desc,
+			compare, compare_desc,
+			result, result_desc, dest_addr, addr,
+			key, datatype, op, context,
+			lock_required);
+}
+
+ssize_t fi_bgq_inject_atomic(struct fid_ep *ep,
+                const void *buf, size_t count,
+                fi_addr_t dest_addr, uint64_t addr, uint64_t key,
+                enum fi_datatype datatype, enum fi_op op)
+{
+	int lock_required = 0;
+
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+                lock_required = 0;
+                break;
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+                lock_required = 1;
+                break;
+        default:
+                return -FI_EINVAL;
+	}
+
+	return fi_bgq_inject_atomic_generic(ep,
+			buf, count,
+			dest_addr, addr,
+			key, datatype, op,
+			lock_required);
+}
+
+ssize_t	fi_bgq_atomicv(struct fid_ep *ep,
+			const struct fi_ioc *iov, void **desc, size_t count,
+			uint64_t addr, uint64_t key,
+			enum fi_datatype datatype, enum fi_op op, void *context)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+ssize_t fi_bgq_atomic_writemsg(struct fid_ep *ep,
+	const struct fi_msg_atomic *msg, uint64_t flags)
+{
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+		return fi_bgq_atomic_writemsg_generic(ep, msg, flags,
+				0);
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+		return fi_bgq_atomic_writemsg_generic(ep, msg, flags,
+				1);
+	}
+
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+ssize_t	fi_bgq_atomic_readwritemsg(struct fid_ep *ep,
+		const struct fi_msg_atomic *msg,
+		struct fi_ioc *resultv,
+	       	void **result_desc, size_t result_count,
+		uint64_t flags)
+{
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+		return fi_bgq_atomic_readwritemsg_generic(ep, msg,
+				resultv, result_count, flags,
+				0);
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+		return fi_bgq_atomic_readwritemsg_generic(ep, msg,
+				resultv, result_count, flags,
+				1);
+	}
+
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+ssize_t	fi_bgq_atomic_compwritemsg(struct fid_ep *ep,
+		const struct fi_msg_atomic *msg,
+		const struct fi_ioc *comparev,
+	       	void **compare_desc, size_t compare_count,
+		struct fi_ioc *resultv, void **result_desc,
+	       	size_t result_count,
+		uint64_t flags)
+{
+	struct fi_bgq_ep * bgq_ep;
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+        switch (bgq_ep->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+		return fi_bgq_atomic_compwritemsg_generic(ep, msg,
+				comparev, compare_count,
+				resultv, result_count,
+				flags, 0);
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+		return fi_bgq_atomic_compwritemsg_generic(ep, msg,
+				comparev, compare_count,
+				resultv, result_count,
+				flags, 1);
+	}
+
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_atomic_writevalid(struct fid_ep *ep, enum fi_datatype datatype,
+		enum fi_op op, size_t *count)
+{
+	static size_t sizeofdt[FI_DATATYPE_LAST] = {
+		sizeof(int8_t),			/* FI_INT8 */
+		sizeof(uint8_t),		/* FI_UINT8 */
+		sizeof(int16_t),		/* FI_INT16 */
+		sizeof(uint16_t),		/* FI_UINT16 */
+		sizeof(int32_t),		/* FI_INT32 */
+		sizeof(uint32_t),		/* FI_UINT32 */
+		sizeof(int64_t),		/* FI_INT64 */
+		sizeof(uint64_t),		/* FI_UINT64 */
+		sizeof(float),			/* FI_FLOAT */
+		sizeof(double),			/* FI_DOUBLE */
+		sizeof(complex float),		/* FI_FLOAT_COMPLEX */
+		sizeof(complex double),		/* FI_DOUBLE_COMPLEX */
+		sizeof(long double),		/* FI_LONG_DOUBLE */
+		sizeof(complex long double)	/* FI_LONG_DOUBLE_COMPLEX */
+	};
+
+	if ((op > FI_ATOMIC_WRITE) || (datatype >= FI_DATATYPE_LAST)) {
+		*count = 0;
+		errno = FI_EOPNOTSUPP;
+		return -errno;
+	}
+
+	*count = sizeof(union fi_bgq_mu_packet_payload) / sizeofdt[datatype];
+	return 0;
+}
+
+int fi_bgq_atomic_readwritevalid(struct fid_ep *ep,
+	       	enum fi_datatype datatype,
+		enum fi_op op, size_t *count)
+{
+	static size_t sizeofdt[FI_DATATYPE_LAST] = {
+		sizeof(int8_t),			/* FI_INT8 */
+		sizeof(uint8_t),		/* FI_UINT8 */
+		sizeof(int16_t),		/* FI_INT16 */
+		sizeof(uint16_t),		/* FI_UINT16 */
+		sizeof(int32_t),		/* FI_INT32 */
+		sizeof(uint32_t),		/* FI_UINT32 */
+		sizeof(int64_t),		/* FI_INT64 */
+		sizeof(uint64_t),		/* FI_UINT64 */
+		sizeof(float),			/* FI_FLOAT */
+		sizeof(double),			/* FI_DOUBLE */
+		sizeof(complex float),		/* FI_FLOAT_COMPLEX */
+		sizeof(complex double),		/* FI_DOUBLE_COMPLEX */
+		sizeof(long double),		/* FI_LONG_DOUBLE */
+		sizeof(complex long double)	/* FI_LONG_DOUBLE_COMPLEX */
+	};
+
+	if ((op > FI_ATOMIC_WRITE) || (datatype >= FI_DATATYPE_LAST)) {
+		*count = 0;
+		errno = FI_EOPNOTSUPP;
+		return -errno;
+	}
+
+	*count = (sizeof(union fi_bgq_mu_packet_payload) - sizeof(struct fi_bgq_mu_fetch_metadata)) / sizeofdt[datatype];
+	return 0;
+}
+
+int fi_bgq_atomic_compwritevalid(struct fid_ep *ep,
+	       	enum fi_datatype datatype,
+		enum fi_op op, size_t *count)
+{
+	static size_t sizeofdt[FI_DATATYPE_LAST] = {
+		sizeof(int8_t),			/* FI_INT8 */
+		sizeof(uint8_t),		/* FI_UINT8 */
+		sizeof(int16_t),		/* FI_INT16 */
+		sizeof(uint16_t),		/* FI_UINT16 */
+		sizeof(int32_t),		/* FI_INT32 */
+		sizeof(uint32_t),		/* FI_UINT32 */
+		sizeof(int64_t),		/* FI_INT64 */
+		sizeof(uint64_t),		/* FI_UINT64 */
+		sizeof(float),			/* FI_FLOAT */
+		sizeof(double),			/* FI_DOUBLE */
+		sizeof(complex float),		/* FI_FLOAT_COMPLEX */
+		sizeof(complex double),		/* FI_DOUBLE_COMPLEX */
+		sizeof(long double),		/* FI_LONG_DOUBLE */
+		sizeof(complex long double)	/* FI_LONG_DOUBLE_COMPLEX */
+	};
+
+	if ((op < FI_CSWAP) || (op >= FI_ATOMIC_OP_LAST) || (datatype >= FI_DATATYPE_LAST)) {
+		*count = 0;
+		errno = FI_EOPNOTSUPP;
+		return -errno;
+	}
+
+	*count = (sizeof(union fi_bgq_mu_packet_payload) / 2) / sizeofdt[datatype];
+	return 0;
+}
+
+static struct fi_ops_atomic fi_bgq_ops_atomic = {
+	.size		= sizeof(struct fi_ops_atomic),
+	.write		= fi_no_atomic_write,
+	.writev		= fi_no_atomic_writev,
+	.writemsg	= fi_bgq_atomic_writemsg,
+	.inject		= fi_no_atomic_inject,
+	.readwrite      = fi_no_atomic_readwrite,
+	.readwritev     = fi_no_atomic_readwritev,
+	.readwritemsg	= fi_bgq_atomic_readwritemsg,
+	.compwrite	= fi_no_atomic_compwrite,
+	.compwritev	= fi_no_atomic_compwritev,
+	.compwritemsg	= fi_bgq_atomic_compwritemsg,
+	.writevalid	= fi_bgq_atomic_writevalid,
+	.readwritevalid	= fi_bgq_atomic_readwritevalid,
+	.compwritevalid = fi_bgq_atomic_compwritevalid
+};
+
+
+int fi_bgq_init_atomic_ops(struct fi_bgq_ep *bgq_ep, struct fi_info *info)
+{
+	if (!info || !bgq_ep)
+		goto err;
+
+	if (info->caps & FI_ATOMICS ||
+			(info->tx_attr &&
+			 (info->tx_attr->caps & FI_ATOMICS))) {
+		bgq_ep->ep_fid.atomic = &fi_bgq_ops_atomic;
+	}
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_enable_atomic_ops(struct fi_bgq_ep *bgq_ep)
+{
+	if (!bgq_ep || !bgq_ep->domain)
+		goto err;
+
+	if (!bgq_ep->ep_fid.atomic) {
+		/* atomic ops not enabled on this endpoint */
+		return 0;
+	}
+	/* fill in atomic formats */
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+
+int fi_bgq_finalize_atomic_ops(struct fi_bgq_ep *bgq_ep)
+{
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_av.c b/prov/bgq/src/fi_bgq_av.c
new file mode 100644
index 0000000..e140c9a
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_av.c
@@ -0,0 +1,494 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+
+#include "rdma/bgq/fi_bgq_spi.h"
+
+static int fi_bgq_close_av(fid_t fid)
+{
+	int ret;
+	struct fi_bgq_av *bgq_av =
+		container_of(fid, struct fi_bgq_av, av_fid);
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_AV, "address vector");
+	if (ret)
+		return ret;
+
+	if (bgq_av->map_addr) free(bgq_av->map_addr);
+
+	ret = fi_bgq_ref_dec(&bgq_av->domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_finalize(&bgq_av->ref_cnt, "address vector");
+	if (ret)
+		return ret;
+
+	free(bgq_av);
+	return 0;
+}
+
+/*
+ * The 'addr' is a representation of the address - not a string
+ *
+ * 'flags' is allowed to be ignored
+ * 'context' is not used ... what is the purpose?
+ */
+static int
+fi_bgq_av_insert(struct fid_av *av, const void *addr, size_t count,
+	     fi_addr_t *fi_addr, uint64_t flags, void *context)
+{
+	struct fi_bgq_av *bgq_av =
+		container_of(av, struct fi_bgq_av, av_fid);
+
+	if (!bgq_av) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	switch (bgq_av->type) {
+	case FI_AV_TABLE:
+		/* The address table is internal and the application uses a
+		 * 'monotonically increasing integer' to index the table and
+		 * retrieve the actual internal address
+		 */
+		errno = FI_ENOSYS;
+		return -errno;
+		break;
+	case FI_AV_MAP:
+		/* The address map is maintained by the application ('fi_addr') and
+		 * the provider must fill in the map with the actual network
+		 * address of each .
+		 */
+		if (!addr) {
+			errno = FI_EINVAL;
+			return -errno;
+		}
+		break;
+	default:
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	BG_CoordinateMapping_t my_coords = bgq_av->domain->my_coords;
+	BG_CoordinateMapping_t * your_coords = (BG_CoordinateMapping_t *) addr;
+	union fi_bgq_addr * output = (union fi_bgq_addr *) fi_addr;
+	uint32_t ppn = Kernel_ProcessCount();
+
+	Personality_t personality;
+	int rc;
+	rc = Kernel_GetPersonality(&personality, sizeof(Personality_t));
+	if (rc) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+	uint64_t dcr_value = DCRReadUser(ND_500_DCR(CTRL_CUTOFFS));
+
+
+	uint32_t n;
+	for (n=0; n<count; ++n) {
+
+		const uint32_t fifo_map =
+			fi_bgq_mu_calculate_fifo_map(my_coords, your_coords[n],
+					&personality, dcr_value);
+
+		const MUHWI_Destination_t destination =
+			fi_bgq_spi_coordinates_to_destination(your_coords[n]);
+
+		const uint32_t base_rx =
+			fi_bgq_addr_calculate_base_rx(your_coords[n].t, ppn);
+
+		output[n].fi = fi_bgq_addr_create(destination, fifo_map, base_rx);
+	}
+
+	return count;
+}
+
+static int
+fi_bgq_av_insertsvc(struct fid_av *av, const char *node, const char *service,
+		fi_addr_t *fi_addr, uint64_t flags, void *context)
+{
+	struct fi_bgq_av *bgq_av =
+		container_of(av, struct fi_bgq_av, av_fid);
+
+	if (!bgq_av) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	switch (bgq_av->type) {
+	case FI_AV_TABLE:
+		/* The address table is internal and the application uses a
+		 * 'monotonically increasing integer' to index the table and
+		 * retrieve the actual internal address
+		 */
+		errno = FI_ENOSYS;
+		return -errno;
+		break;
+	case FI_AV_MAP:
+		/* The address map is maintained by the application ('fi_addr') and
+		 * the provider must fill in the map with the actual network
+		 * address of each .
+		 */
+
+		break;
+	default:
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	/*
+	 * convert the string representation of the node ("#.#.#.#.#.#") into
+	 * torus coordinates and the 't' coordinate.
+	 */
+	uint32_t a, b, c, d, e, t;
+	const char * node_str = (const char *) node;
+	sscanf(node_str, "%u.%u.%u.%u.%u.%u", &a, &b, &c, &d, &e, &t);
+	BG_CoordinateMapping_t your_coords;
+	your_coords.a = a;
+	your_coords.b = b;
+	your_coords.c = c;
+	your_coords.d = d;
+	your_coords.e = e;
+	your_coords.t = t;
+
+	BG_CoordinateMapping_t my_coords = bgq_av->domain->my_coords;
+
+	const uint32_t fifo_map =
+		fi_bgq_mu_calculate_fifo_map_single(my_coords, your_coords);
+
+	const MUHWI_Destination_t destination =
+		fi_bgq_spi_coordinates_to_destination(your_coords);
+
+	const uint32_t base_rx =
+		fi_bgq_addr_calculate_base_rx(your_coords.t, Kernel_ProcessCount());
+
+	*fi_addr = fi_bgq_addr_create(destination, fifo_map, base_rx);
+
+	return 0;
+}
+
+/*
+ * This is similar to "ranks to coords" syscall. The "node" is the string
+ * representation of the torus coordinates of a node and the 't' coordinate,
+ * such as "0.0.0.0.0.0", and the "service" is the string representation of
+ * what could be considered a pami-style "client id". Currently, only a single
+ * "service" per "node" is supported - the service parameter is ignored and
+ * a svccnt != 1 is considered an error.
+ *
+ * If the "node" parameter is NULL, then the insert begins at coordinate
+ * 0.0.0.0.0.0 and increments according to the default ABCDET map order until
+ * "nodecnt" addresses have been inserted. In this respect, "nodecnt" is the
+ * same as the job size.
+ *
+ * The bgq provider does not support rank reorder via mapfiles.
+ */
+static int
+fi_bgq_av_insertsym(struct fid_av *av, const char *node, size_t nodecnt,
+		const char *service, size_t svccnt,
+		fi_addr_t *fi_addr, uint64_t flags, void *context)
+{
+	struct fi_bgq_av *bgq_av =
+		container_of(av, struct fi_bgq_av, av_fid);
+
+	if (!bgq_av) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (svccnt != 1) {
+		fprintf(stderr, "Error. Only one 'service' per 'node' is supported by the bgq provider\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	switch (bgq_av->type) {
+	case FI_AV_TABLE:
+		/* The address table is internal and the application uses a
+		 * 'monotonically increasing integer' to index the table and
+		 * retrieve the actual internal address
+		 */
+		errno = FI_ENOSYS;
+		return -errno;
+		break;
+	case FI_AV_MAP:
+		/* The address map is maintained by the application ('fi_addr') and
+		 * the provider must fill in the map with the actual network
+		 * address of each .
+		 */
+
+		break;
+	default:
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	/*
+	 * convert the string representation of the node ("#.#.#.#.#") into
+	 * torus coordinates and convert the string representation of the
+	 * service, a.k.a. "process", into a t coordinate.
+	 */
+	uint32_t a, b, c, d, e, t;
+	if (node)
+		sscanf(node, "%u.%u.%u.%u.%u.%u", &a, &b, &c, &d, &e, &t);
+	else
+		a = b = c = d = e = t = 0;
+
+	Personality_t personality;
+	int rc;
+	rc = Kernel_GetPersonality(&personality, sizeof(Personality_t));
+	if (rc) {
+		errno = FI_EINVAL;	/* is this the correct errno? */
+		return -errno;
+	}
+	uint32_t ppn = Kernel_ProcessCount();
+	size_t node_count = personality.Network_Config.Anodes *
+		personality.Network_Config.Bnodes *
+		personality.Network_Config.Cnodes *
+		personality.Network_Config.Dnodes *
+		personality.Network_Config.Enodes *
+		ppn;
+
+	uint32_t maximum_to_insert = (node_count < nodecnt) ? node_count : nodecnt;
+
+	BG_CoordinateMapping_t my_coords = bgq_av->domain->my_coords;
+	BG_CoordinateMapping_t your_coords;
+	uint64_t dcr_value = DCRReadUser(ND_500_DCR(CTRL_CUTOFFS));
+
+	int n = 0;
+	uint32_t _a, _b, _c, _d, _e, _t;
+	union fi_bgq_addr * output = (union fi_bgq_addr *) fi_addr;
+	for (_a = a; _a < personality.Network_Config.Anodes; ++_a) {
+		your_coords.a = _a;
+	for (_b = b; _b < personality.Network_Config.Bnodes; ++_b) {
+		your_coords.b = _b;
+	for (_c = c; _c < personality.Network_Config.Cnodes; ++_c) {
+		your_coords.c = _c;
+	for (_d = d; _d < personality.Network_Config.Dnodes; ++_d) {
+		your_coords.d = _d;
+	for (_e = e; _e < personality.Network_Config.Enodes; ++_e) {
+		your_coords.e = _e;
+	for (_t = t; _t < ppn; ++_t) {
+		your_coords.t = _t;
+
+		if (n == maximum_to_insert) break;
+
+		const uint32_t fifo_map =
+			fi_bgq_mu_calculate_fifo_map(my_coords, your_coords,
+				&personality, dcr_value);
+
+		const MUHWI_Destination_t destination =
+			fi_bgq_spi_coordinates_to_destination(your_coords);
+
+		const uint32_t base_rx =
+			fi_bgq_addr_calculate_base_rx(your_coords.t, ppn);
+
+		fi_addr[n++] = fi_bgq_addr_create(destination, fifo_map, base_rx);
+
+	}}}}}}
+
+	return n;
+}
+
+static int
+fi_bgq_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count, uint64_t flags)
+{
+	return 0;	/* noop on bgq */
+}
+
+static int
+fi_bgq_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr, size_t *addrlen)
+{
+	const union fi_bgq_addr bgq_addr = {.fi=fi_addr};
+
+	BG_CoordinateMapping_t tmp;
+	tmp.a = bgq_addr.uid.a;
+	tmp.b = bgq_addr.uid.b;
+	tmp.c = bgq_addr.uid.c;
+	tmp.d = bgq_addr.uid.d;
+	tmp.e = bgq_addr.uid.e;
+
+	const uint32_t ppn = Kernel_ProcessCount();
+	const uint32_t rx_per_node = ((BGQ_MU_NUM_REC_FIFO_GROUPS-1) * BGQ_MU_NUM_REC_FIFOS_PER_GROUP) / 2;	/* each rx uses two mu reception fifos */
+	const uint32_t rx_per_process = rx_per_node / ppn;
+	tmp.t = fi_bgq_addr_rec_fifo_id(bgq_addr.fi) / rx_per_process;
+
+	memcpy(addr, (const void *)&tmp, *addrlen);
+
+	*addrlen = sizeof(BG_CoordinateMapping_t);
+
+	return 0;
+}
+
+static const char *
+fi_bgq_av_straddr(struct fid_av *av, const void *addr,
+			char *buf, size_t *len)
+{
+	BG_CoordinateMapping_t * input = (BG_CoordinateMapping_t *) addr;
+	snprintf(buf, *len, "%u.%u.%u.%u.%u.%u", input->a, input->b, input->c,
+		input->d, input->e, input->t);
+
+	*len = 16;	/* "aa.bb.cc.dd.e.tt" */
+	return buf;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_av,
+	.bind		= fi_no_bind,
+	.control	= fi_no_control,
+	.ops_open	= fi_no_ops_open
+};
+
+int fi_bgq_bind_ep_av(struct fi_bgq_ep *bgq_ep,
+		struct fi_bgq_av *bgq_av, uint64_t flags)
+{
+	if (bgq_ep->av) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+			"Address vector already bound to TX endpoint\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	bgq_ep->av = bgq_av;
+
+	fi_bgq_ref_inc(&bgq_av->ref_cnt, "address vector");
+
+	return 0;
+}
+
+static struct fi_ops_av fi_bgq_av_ops = {
+	.size		= sizeof(struct fi_ops_av),
+	.insert		= fi_bgq_av_insert,
+	.insertsvc	= fi_bgq_av_insertsvc,
+	.insertsym	= fi_bgq_av_insertsym,
+	.remove		= fi_bgq_av_remove,
+	.lookup		= fi_bgq_av_lookup,
+	.straddr	= fi_bgq_av_straddr
+};
+
+int fi_bgq_av_open(struct fid_domain *dom,
+		struct fi_av_attr *attr, struct fid_av **av,
+		void *context)
+{
+	int ret;
+	struct fi_bgq_av *bgq_av = NULL;
+
+	if (!attr) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_AV,
+				"no attr provided\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	ret = fi_bgq_fid_check(&dom->fid, FI_CLASS_DOMAIN, "domain");
+	if (ret)
+		return ret;
+
+	bgq_av = calloc(1, sizeof(*bgq_av));
+	if (!bgq_av) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+
+	bgq_av->av_fid.fid.fclass = FI_CLASS_AV;
+	bgq_av->av_fid.fid.context= context;
+	bgq_av->av_fid.fid.ops    = &fi_bgq_fi_ops;
+	bgq_av->av_fid.ops 	  = &fi_bgq_av_ops;
+
+	bgq_av->domain = (struct fi_bgq_domain *) dom;
+	bgq_av->type = attr->type;
+
+	bgq_av->map_addr = NULL;
+	if (attr->name != NULL && (attr->flags & FI_READ)) {
+
+		assert(0 == attr->map_addr);
+
+
+		Personality_t personality;
+		int rc;
+		rc = Kernel_GetPersonality(&personality, sizeof(Personality_t));
+		if (rc) {
+			errno = FI_EINVAL;
+			return -errno;
+		}
+
+		const uint32_t ppn = Kernel_ProcessCount();
+		const size_t node_count = personality.Network_Config.Anodes *
+			personality.Network_Config.Bnodes *
+			personality.Network_Config.Cnodes *
+			personality.Network_Config.Dnodes *
+			personality.Network_Config.Enodes;
+
+		size_t mapsize = node_count * ppn;
+		BG_CoordinateMapping_t map[mapsize];
+		uint64_t ep_count;	/* one endpoint per process */
+		rc = Kernel_RanksToCoords(sizeof(map), map, &ep_count);
+
+		fi_addr_t *addr = (fi_addr_t *)malloc(sizeof(fi_addr_t)*ep_count);	/* TODO - mmap this into shared memory */
+
+		size_t n = 0;
+		int i;
+
+		BG_CoordinateMapping_t my_coords = bgq_av->domain->my_coords;
+		uint64_t dcr_value = DCRReadUser(ND_500_DCR(CTRL_CUTOFFS));
+		for (i=0;i<ep_count;i++) {
+
+			const uint32_t fifo_map =
+				fi_bgq_mu_calculate_fifo_map(my_coords, map[i],
+					&personality, dcr_value);
+
+			const MUHWI_Destination_t destination =
+				fi_bgq_spi_coordinates_to_destination(map[i]);
+
+			const uint32_t base_rx =
+				fi_bgq_addr_calculate_base_rx(map[i].t, ppn);
+
+			addr[n++] = fi_bgq_addr_create(destination, fifo_map, base_rx);
+		}
+
+		bgq_av->map_addr = (void *)addr;
+		attr->map_addr = (void *)addr;
+	}
+
+	*av = &bgq_av->av_fid;
+
+	fi_bgq_ref_init(&bgq_av->domain->fabric->node, &bgq_av->ref_cnt, "address vector");
+	fi_bgq_ref_inc(&bgq_av->domain->ref_cnt, "domain");
+
+	return 0;
+err:
+	if (bgq_av)
+		free(bgq_av);
+	return -errno;
+}
diff --git a/prov/util/src/util_fabric.c b/prov/bgq/src/fi_bgq_cm.c
similarity index 50%
copy from prov/util/src/util_fabric.c
copy to prov/bgq/src/fi_bgq_cm.c
index 6dfe3d4..e34a014 100644
--- a/prov/util/src/util_fabric.c
+++ b/prov/bgq/src/fi_bgq_cm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (C) 2016 by Argonne National Laboratory.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -29,51 +29,77 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-
-#include <stdlib.h>
-#include <string.h>
-
+#include "rdma/bgq/fi_bgq.h"
 #include <fi_enosys.h>
-#include <fi_util.h>
 
-int ofi_fabric_close(struct util_fabric *fabric)
+int fi_bgq_getname(fid_t fid, void *addr, size_t *addrlen)
 {
-	if (atomic_get(&fabric->ref))
-		return -FI_EBUSY;
 
-	fi_fabric_remove(fabric);
-	fastlock_destroy(&fabric->lock);
+	if (*addrlen == 0) {
+		*addrlen = 24;
+		return 0;
+	}
+
+	struct fi_bgq_ep *bgq_ep;
+
+	if (!fid || !addr || !addrlen) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (*addrlen < 24) {
+		errno = FI_ETOOSMALL;
+		return -errno;
+	}
+	switch(fid->fclass) {
+	case FI_CLASS_EP:
+		bgq_ep = container_of(fid, struct fi_bgq_ep, ep_fid);
+		char * addr_str = (char *) addr;
+		sprintf(addr_str, "%u.%u.%u.%u.%u.%u",
+			bgq_ep->domain->my_coords.a,
+			bgq_ep->domain->my_coords.b,
+			bgq_ep->domain->my_coords.c,
+			bgq_ep->domain->my_coords.d,
+			bgq_ep->domain->my_coords.e,
+			bgq_ep->domain->my_coords.t);
+		break;
+	case FI_CLASS_SEP:
+		/* TODO: handle scalable endpoints */
+	default:
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	*addrlen = 24;
+
 	return 0;
 }
 
-static void util_fabric_init(struct util_fabric *fabric, const char *name)
-{
-	atomic_initialize(&fabric->ref, 0);
-	dlist_init(&fabric->domain_list);
-	fastlock_init(&fabric->lock);
-	fabric->name = name;
-}
+static struct fi_ops_cm fi_bgq_cm_ops = {
+	.size		= sizeof(struct fi_ops_cm),
+	.getname 	= fi_bgq_getname,
+	.getpeer 	= fi_no_getpeer,
+	.connect 	= fi_no_connect,
+	.listen  	= fi_no_listen,
+	.accept  	= fi_no_accept,
+	.reject  	= fi_no_reject,
+	.shutdown 	= fi_no_shutdown,
+};
 
-int ofi_fabric_init(const struct fi_provider *prov,
-		   struct fi_fabric_attr *prov_attr,
-		   struct fi_fabric_attr *user_attr,
-		   struct util_fabric *fabric, void *context,
-		   enum fi_match_type type)
+int fi_bgq_init_cm_ops(struct fi_bgq_ep *bgq_ep, struct fi_info *info)
 {
-	int ret;
+	if (!bgq_ep || !info)
+		goto err;
 
-	ret = fi_check_fabric_attr(prov, prov_attr, user_attr, type);
-	if (ret)
-		return ret;
+	bgq_ep->ep_fid.cm	   = &fi_bgq_cm_ops;
 
-	fabric->prov = prov;
-	util_fabric_init(fabric, prov_attr->name);
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
 
-	fabric->fabric_fid.fid.fclass = FI_CLASS_FABRIC;
-	fabric->fabric_fid.fid.context = context;
-	/*
-	 * fabric ops set by provider
-	 */
-	fi_fabric_insert(fabric);
+int fi_bgq_finalize_cm_ops(struct fi_bgq_ep *bgq_ep)
+{
 	return 0;
 }
diff --git a/prov/bgq/src/fi_bgq_cntr.c b/prov/bgq/src/fi_bgq_cntr.c
new file mode 100644
index 0000000..1bda377
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_cntr.c
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi.h>
+#include <fi_enosys.h>
+#include <stdlib.h>
+
+static int fi_bgq_close_cntr(struct fid *fid)
+{
+	int ret;
+	struct fi_bgq_cntr *bgq_cntr =
+		container_of(fid, struct fi_bgq_cntr, cntr_fid);
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_CNTR, "counter");
+	if (ret)
+		return ret;
+
+	struct l2atomic_lock * lock = &bgq_cntr->domain->mu.lock;
+	struct fi_bgq_node * node = &bgq_cntr->domain->fabric->node;
+	fi_bgq_node_bat_free(node, lock, bgq_cntr->std.batid);
+	fi_bgq_node_bat_free(node, lock, bgq_cntr->err.batid);
+
+	ret = fi_bgq_ref_dec(&bgq_cntr->domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	free(bgq_cntr->attr);
+	free(bgq_cntr);
+	return 0;
+}
+
+static int fi_bgq_bind_cntr(struct fid *fid, struct fid *bfid, uint64_t flags)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+static uint64_t fi_bgq_cntr_read(struct fid_cntr *cntr)
+{
+	struct fi_bgq_cntr *bgq_cntr =
+		container_of(cntr, struct fi_bgq_cntr, cntr_fid);
+
+	const uint64_t value = L2_AtomicLoad(bgq_cntr->std.l2_vaddr);
+
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) {
+		const uint64_t count = bgq_cntr->progress.ep_count;
+		uint64_t i;
+		for (i=0; i<count; ++i) {
+			fi_bgq_ep_progress_manual(bgq_cntr->progress.ep[i]);
+		}
+	}
+
+	return value;
+}
+
+static uint64_t fi_bgq_cntr_readerr(struct fid_cntr *cntr)
+{
+	struct fi_bgq_cntr *bgq_cntr =
+		container_of(cntr, struct fi_bgq_cntr, cntr_fid);
+
+	return L2_AtomicLoad(bgq_cntr->err.l2_vaddr);
+}
+
+static int fi_bgq_cntr_add(struct fid_cntr *cntr, uint64_t value)
+{
+	struct fi_bgq_cntr *bgq_cntr =
+		container_of(cntr, struct fi_bgq_cntr, cntr_fid);
+
+	L2_AtomicStoreAdd(bgq_cntr->std.l2_vaddr, value);
+
+	return 0;
+}
+
+static int fi_bgq_cntr_set(struct fid_cntr *cntr, uint64_t value)
+{
+	struct fi_bgq_cntr *bgq_cntr =
+		container_of(cntr, struct fi_bgq_cntr, cntr_fid);
+
+	L2_AtomicStore(bgq_cntr->std.l2_vaddr, value);
+
+	return 0;
+}
+
+static int
+fi_bgq_cntr_wait(struct fid_cntr *cntr, uint64_t threshold, int timeout)
+{
+	struct fi_bgq_cntr *bgq_cntr =
+		container_of(cntr, struct fi_bgq_cntr, cntr_fid);
+
+	uint64_t timeout_cycles = (timeout < 0) ?
+		ULLONG_MAX :
+		GetTimeBase() + (1600UL * 1000 * timeout);
+
+	uint64_t current_value = 0;
+	do {
+		current_value = L2_AtomicLoad(bgq_cntr->std.l2_vaddr);
+
+		if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) {
+			const uint64_t count = bgq_cntr->progress.ep_count;
+			uint64_t i;
+			for (i=0; i<count; ++i) {
+				fi_bgq_ep_progress_manual(bgq_cntr->progress.ep[i]);
+			}
+		}
+
+		if (threshold <= current_value) return 0;
+	} while (GetTimeBase() < timeout_cycles);
+
+	errno = FI_ETIMEDOUT;
+	return -errno;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_cntr,
+	.bind		= fi_bgq_bind_cntr,
+	.control	= fi_no_control,
+	.ops_open	= fi_no_ops_open
+};
+
+int fi_bgq_bind_ep_cntr(struct fi_bgq_ep *bgq_ep,
+		struct fi_bgq_cntr *bgq_cntr, uint64_t flags)
+{
+	if (!(flags & (FI_WRITE |
+			FI_READ |
+			FI_SEND |
+			FI_RECV |
+			FI_REMOTE_READ |
+			FI_REMOTE_WRITE))) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_CQ,
+				"unclear flags while binding counter\n");
+		goto err;
+	}
+
+	if (flags & FI_WRITE)
+		bgq_ep->write_cntr = bgq_cntr;
+	if (flags & FI_READ)
+		bgq_ep->read_cntr = bgq_cntr;
+	if (flags & FI_SEND)
+		bgq_ep->send_cntr = bgq_cntr;
+	if (flags & FI_RECV)
+		bgq_ep->recv_cntr = bgq_cntr;
+
+	bgq_cntr->ep[(bgq_cntr->ep_bind_count)++] = bgq_ep;
+
+	if (ofi_recv_allowed(bgq_ep->rx.caps) || ofi_rma_target_allowed(bgq_ep->rx.caps)) {
+		bgq_cntr->progress.ep[(bgq_cntr->progress.ep_count)++] = bgq_ep;
+	}
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+static struct fi_ops_cntr fi_bgq_ops_cntr = {
+	.size		= sizeof(struct fi_ops_cntr),
+	.read		= fi_bgq_cntr_read,
+	.readerr	= fi_bgq_cntr_readerr,
+	.add		= fi_bgq_cntr_add,
+	.set		= fi_bgq_cntr_set,
+	.wait		= fi_bgq_cntr_wait
+};
+
+int fi_bgq_cntr_open(struct fid_domain *domain,
+		struct fi_cntr_attr *attr,
+		struct fid_cntr **cntr, void *context)
+{
+	int ret;
+	struct fi_bgq_cntr *bgq_cntr;
+
+	if (!attr) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_CQ,
+				"no attr supplied\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+	ret = fi_bgq_fid_check(&domain->fid, FI_CLASS_DOMAIN, "domain");
+	if (ret)
+		return ret;
+
+	bgq_cntr = calloc(1, sizeof(*bgq_cntr));
+	if (!bgq_cntr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+
+	bgq_cntr->cntr_fid.fid.fclass	= FI_CLASS_CNTR;
+	bgq_cntr->cntr_fid.fid.context	= context;
+	bgq_cntr->cntr_fid.fid.ops	= &fi_bgq_fi_ops;
+	bgq_cntr->cntr_fid.ops		= &fi_bgq_ops_cntr;
+
+	bgq_cntr->domain = (struct fi_bgq_domain *) domain;
+
+	/* ---- allocate and initialize the "std" and "err" mu/l2 counters ---- */
+	{
+		uint32_t cnk_rc __attribute__ ((unused));
+		struct l2atomic_lock * lock = &bgq_cntr->domain->mu.lock;
+		struct fi_bgq_node * node = &bgq_cntr->domain->fabric->node;
+
+		/* ---- initialize the "std" counter ---- */
+		bgq_cntr->std.batid =
+			fi_bgq_node_bat_allocate(node, lock);
+
+		bgq_cntr->std.paddr =
+			node->bat.l2_cntr_paddr[bgq_cntr->std.batid];
+
+		cnk_rc = Kernel_Physical2Virtual(
+			(void *)bgq_cntr->std.paddr,
+			(void**)&bgq_cntr->std.l2_vaddr);
+		assert(cnk_rc == 0);
+
+		L2_AtomicStore(bgq_cntr->std.l2_vaddr, 0);
+
+		fi_bgq_node_bat_write(node, lock,
+			bgq_cntr->std.batid,
+			bgq_cntr->std.paddr);
+
+		/* ---- initialize the "err" counter ---- */
+		bgq_cntr->err.batid =
+			fi_bgq_node_bat_allocate(node, lock);
+
+		bgq_cntr->err.paddr =
+			node->bat.l2_cntr_paddr[bgq_cntr->err.batid];
+
+		cnk_rc = Kernel_Physical2Virtual(
+			(void *)bgq_cntr->err.paddr,
+			(void**)&bgq_cntr->err.l2_vaddr);
+		assert(cnk_rc == 0);
+
+		L2_AtomicStore(bgq_cntr->err.l2_vaddr, 0);
+
+		fi_bgq_node_bat_write(node, lock,
+			bgq_cntr->err.batid,
+			bgq_cntr->err.paddr);
+	}
+
+	bgq_cntr->ep_bind_count = 0;
+	bgq_cntr->progress.ep_count = 0;
+	unsigned i;
+	for (i=0; i<64; ++i) {			/* TODO - check this array size */
+		bgq_cntr->ep[i] = NULL;
+		bgq_cntr->progress.ep[i] = NULL;
+	}
+
+	fi_bgq_ref_inc(&bgq_cntr->domain->ref_cnt, "domain");
+
+	*cntr = &bgq_cntr->cntr_fid;
+	return 0;
+err:
+	if (bgq_cntr)
+		free(bgq_cntr);
+	return -errno;
+}
diff --git a/prov/bgq/src/fi_bgq_cq.c b/prov/bgq/src/fi_bgq_cq.c
new file mode 100644
index 0000000..2c327a6
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_cq.c
@@ -0,0 +1,596 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+#include <stdlib.h>
+
+#include <fi.h>
+
+#include "rdma/bgq/fi_bgq_spi.h"
+
+#define FI_BGQ_DEFAULT_CQ_DEPTH (8192)
+#define FI_BGQ_MAXIMUM_CQ_DEPTH (8192)
+
+#define FI_BGQ_L2ATOMIC_ERR_FIFO_DATA_SIZE (512)
+
+struct fi_cq_bgq_l2atomic_data {
+	struct l2atomic_boundedcounter_data	entry_counter;
+	struct l2atomic_boundedcounter_data	bounded_counter;
+	struct l2atomic_fifo_data		err_fifo_data;
+	uint64_t				err_packet[FI_BGQ_L2ATOMIC_ERR_FIFO_DATA_SIZE];
+	struct l2atomic_fifo_data		std_fifo_data;
+	uint64_t				std_packet[0];
+} __attribute((aligned(32)));
+
+static int fi_bgq_close_cq(fid_t fid)
+{
+	int ret;
+	struct fi_bgq_cq *bgq_cq =
+		container_of(fid, struct fi_bgq_cq, cq_fid);
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_CQ, "completion queue");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_dec(&bgq_cq->domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_finalize(&bgq_cq->ref_cnt, "completion queue");
+	if (ret)
+		return ret;
+
+	free(bgq_cq);
+
+	return 0;
+}
+
+static int fi_bgq_bind_cq(struct fid *fid, struct fid *bfid,
+		uint64_t flags)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+static int fi_bgq_control_cq(fid_t fid, int command, void *arg)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+static int fi_bgq_ops_open_cq(struct fid *fid, const char *name,
+		uint64_t flags, void **ops, void *context)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_cq,
+	.bind		= fi_bgq_bind_cq,
+	.control	= fi_bgq_control_cq,
+	.ops_open	= fi_bgq_ops_open_cq
+};
+
+static ssize_t fi_bgq_cq_read(struct fid_cq *cq, void *buf, size_t count)
+{
+	int lock_required;
+	int ret;
+	struct fi_bgq_cq *bgq_cq = container_of(cq, struct fi_bgq_cq, cq_fid);
+
+	switch (bgq_cq->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	ret = fi_bgq_cq_read_generic(cq, buf, count, bgq_cq->format, lock_required);
+	return ret;
+}
+
+static ssize_t
+fi_bgq_cq_readfrom(struct fid_cq *cq, void *buf, size_t count, fi_addr_t *src_addr)
+{
+	int lock_required;
+	int ret;
+	struct fi_bgq_cq *bgq_cq = container_of(cq, struct fi_bgq_cq, cq_fid);
+
+	switch (bgq_cq->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+		break;
+	default:
+		lock_required = 1;
+		break;
+	}
+
+	ret = fi_bgq_cq_readfrom_generic(cq, buf, count, src_addr, bgq_cq->format, lock_required);
+	if (ret > 0) {
+		unsigned n;
+		for (n=0; n<ret; ++n) src_addr[n] = FI_ADDR_NOTAVAIL;
+	}
+
+	return ret;
+}
+
+static ssize_t
+fi_bgq_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf, uint64_t flags)
+{
+	struct fi_bgq_cq *bgq_cq = container_of(cq, struct fi_bgq_cq, cq_fid);
+
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) {
+
+		struct fi_bgq_context_ext * ext = bgq_cq->err_head;
+		if (NULL == ext) {
+			errno = FI_EAGAIN;
+			return -errno;
+		}
+
+		if (ext->bgq_context.byte_counter != 0) {
+			/* perhaps an in-progress truncated rendezvous receive? */
+			errno = FI_EAGAIN;
+			return -errno;
+		}
+
+		assert(ext->bgq_context.flags & FI_BGQ_CQ_CONTEXT_EXT);	/* DEBUG */
+
+		int lock_required = 0;
+		switch (bgq_cq->domain->threading) {
+		case FI_THREAD_ENDPOINT:
+		case FI_THREAD_DOMAIN:
+			lock_required = 0;
+			break;
+		default:
+			lock_required = 1;
+			break;
+		}
+
+		int ret;
+		ret = fi_bgq_lock_if_required(&bgq_cq->lock, lock_required);
+		if (ret) return ret;
+
+		bgq_cq->err_head = (struct fi_bgq_context_ext *)ext->bgq_context.next;
+		if (NULL == bgq_cq->err_head)
+			bgq_cq->err_tail = NULL;
+
+		*buf = ext->err_entry;
+		free(ext);
+
+		ret = fi_bgq_unlock_if_required(&bgq_cq->lock, lock_required);
+		if (ret) return ret;
+
+	} else {
+
+		uint64_t value = 0;
+		if (l2atomic_fifo_peek(&bgq_cq->err_consumer, &value) != 0) {
+			errno = FI_EAGAIN;
+			return -errno;
+		}
+
+		/* const uint64_t flags = value & 0xE000000000000000ull; -- currently not used */
+
+		/* convert the fifo value into a context pointer */
+		struct fi_bgq_context_ext * ext = (struct fi_bgq_context_ext *) (value << 3);
+
+		if (ext->bgq_context.byte_counter != 0) {
+			/* perhaps an in-progress truncated rendezvous receive? */
+			errno = FI_EAGAIN;
+			return -errno;
+		}
+
+		assert(ext->bgq_context.flags & FI_BGQ_CQ_CONTEXT_EXT);	/* DEBUG */
+
+		*buf = ext->err_entry;
+		free(ext);
+
+		l2atomic_fifo_advance(&bgq_cq->err_consumer);
+	}
+
+	return 1;
+}
+
+static ssize_t
+fi_bgq_cq_sread(struct fid_cq *cq, void *buf, size_t len, const void *cond, int timeout)
+{
+	int lock_required;
+	struct fi_bgq_cq *bgq_cq = container_of(cq, struct fi_bgq_cq, cq_fid);
+
+	switch (bgq_cq->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	uint64_t timeout_cycles = (timeout < 0) ?
+		ULLONG_MAX :
+		GetTimeBase() + (1600UL * 1000 * timeout);
+	do {
+		ssize_t count = fi_bgq_cq_read_generic(cq, buf, len, bgq_cq->format, lock_required);
+		if (count) return count;
+
+	} while (GetTimeBase() < timeout_cycles);
+	errno = FI_EAGAIN;
+	return -errno;
+}
+
+static ssize_t
+fi_bgq_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t len,
+		   fi_addr_t *src_addr, const void *cond, int timeout)
+{
+	int lock_required;
+	struct fi_bgq_cq *bgq_cq = container_of(cq, struct fi_bgq_cq, cq_fid);
+
+	switch (bgq_cq->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	uint64_t timeout_cycles = (timeout < 0) ?
+		ULLONG_MAX :
+		GetTimeBase() + (1600UL * 1000 * timeout);
+	do {
+		ssize_t count = fi_bgq_cq_readfrom_generic(cq, buf, len, src_addr, bgq_cq->format, lock_required);
+		if (count) return count;
+
+	} while (GetTimeBase() < timeout_cycles);
+	errno = FI_EAGAIN;
+	return -errno;
+}
+
+static const char *
+fi_bgq_cq_strerror(struct fid_cq *cq, int prov_errno, const void *err_data,
+	       char *buf, size_t len)
+{
+	errno = FI_ENOSYS;
+	return NULL;
+}
+
+int fi_bgq_bind_ep_cq(struct fi_bgq_ep *bgq_ep,
+		struct fi_bgq_cq *bgq_cq, uint64_t flags)
+{
+	if (!(flags & (FI_SEND | FI_RECV)))
+		goto err;
+
+	if (flags & FI_SEND) {
+		fi_bgq_ref_inc(&bgq_cq->ref_cnt, "completion queue");
+		bgq_ep->send_cq = bgq_cq;
+		bgq_ep->tx.send.local_completion_model = bgq_cq->local_completion_model;
+	}
+	if (flags & FI_RECV) {
+		fi_bgq_ref_inc(&bgq_cq->ref_cnt, "completion queue");
+		bgq_ep->recv_cq = bgq_cq;
+	}
+	bgq_cq->bflags = flags;
+
+	if (FI_CLASS_RX_CTX == bgq_ep->ep_fid.fid.fclass ||
+			FI_CLASS_EP == bgq_ep->ep_fid.fid.fclass) {
+		bgq_cq->ep[(bgq_cq->ep_bind_count)++] = bgq_ep;
+	}
+
+	if (ofi_recv_allowed(bgq_ep->rx.caps) || ofi_rma_target_allowed(bgq_ep->rx.caps)) {
+		bgq_cq->progress.ep[(bgq_cq->progress.ep_count)++] = bgq_ep;
+	}
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_cq_enqueue_err (struct fi_bgq_cq * bgq_cq,
+		struct fi_bgq_context_ext * ext,
+		const int lock_required)
+{
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) {
+
+		int lock_required = 0;
+		switch (bgq_cq->domain->threading) {
+		case FI_THREAD_ENDPOINT:
+		case FI_THREAD_DOMAIN:
+			lock_required = 0;
+		default:
+			lock_required = 0;
+		}
+
+		int ret;
+		ret = fi_bgq_lock_if_required(&bgq_cq->lock, lock_required);
+		if (ret) return ret;
+
+		struct fi_bgq_context_ext * tail = bgq_cq->err_tail;
+		if (tail) {
+			assert(NULL != bgq_cq->err_head);
+
+			tail->bgq_context.next = (union fi_bgq_context *)ext;
+			bgq_cq->err_tail = ext;
+
+		} else {
+			assert(NULL == bgq_cq->err_head);
+
+			bgq_cq->err_tail = ext;
+			bgq_cq->err_head = ext;
+		}
+		ext->bgq_context.next = NULL;
+
+		ret = fi_bgq_unlock_if_required(&bgq_cq->lock, lock_required);
+		if (ret) return ret;
+
+	} else {
+
+		struct l2atomic_fifo_producer * err_producer = &bgq_cq->err_producer;
+		uint64_t ext_rsh3b = (uint64_t)ext >> 3;
+		while(0 != l2atomic_fifo_produce(err_producer, ext_rsh3b));
+	}
+
+	return 0;
+}
+
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_UNSPEC, 0)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_UNSPEC, 1)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_CONTEXT, 0)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_CONTEXT, 1)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_MSG, 0)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_MSG, 1)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_DATA, 0)
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_DATA, 1)
+/* "FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_TAGGED, 0)" is already declared via FABRIC_DIRECT */
+FI_BGQ_CQ_SPECIALIZED_FUNC(FI_CQ_FORMAT_TAGGED, 1)
+
+#define FI_BGQ_CQ_OPS_STRUCT_NAME(FORMAT, LOCK)					\
+  fi_bgq_ops_cq_ ## FORMAT ## _ ## LOCK						\
+
+#define FI_BGQ_CQ_OPS_STRUCT(FORMAT, LOCK)					\
+static struct fi_ops_cq								\
+	FI_BGQ_CQ_OPS_STRUCT_NAME(FORMAT, LOCK) = {				\
+    .size    = sizeof(struct fi_ops_cq),					\
+    .read      = FI_BGQ_CQ_SPECIALIZED_FUNC_NAME(cq_read, FORMAT, LOCK),	\
+    .readfrom  = FI_BGQ_CQ_SPECIALIZED_FUNC_NAME(cq_readfrom, FORMAT, LOCK),	\
+    .readerr   = fi_bgq_cq_readerr,						\
+    .sread     = fi_bgq_cq_sread,						\
+    .sreadfrom = fi_bgq_cq_sreadfrom,						\
+    .signal    = fi_no_cq_signal,						\
+    .strerror  = fi_bgq_cq_strerror,						\
+}
+
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_UNSPEC, 0);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_UNSPEC, 1);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_CONTEXT, 0);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_CONTEXT, 1);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_MSG, 0);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_MSG, 1);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_DATA, 0);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_DATA, 1);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_TAGGED, 0);
+FI_BGQ_CQ_OPS_STRUCT(FI_CQ_FORMAT_TAGGED, 1);
+
+
+static struct fi_ops_cq fi_bgq_ops_cq_default = {
+	.size		= sizeof(struct fi_ops_cq),
+	.read		= fi_bgq_cq_read,
+	.readfrom	= fi_bgq_cq_readfrom,
+	.readerr	= fi_bgq_cq_readerr,
+	.signal		= fi_no_cq_signal,
+	.sread		= fi_bgq_cq_sread,
+	.sreadfrom	= fi_bgq_cq_sreadfrom,
+	.strerror	= fi_bgq_cq_strerror
+};
+
+
+int fi_bgq_cq_open(struct fid_domain *dom,
+		struct fi_cq_attr *attr,
+		struct fid_cq **cq, void *context)
+{
+	int ret;
+	struct fi_bgq_cq *bgq_cq;
+	int lock_required;
+
+	if (!attr) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_CQ,
+				"no attr supplied\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+	ret = fi_bgq_fid_check(&dom->fid, FI_CLASS_DOMAIN, "domain");
+	if (ret)
+		return ret;
+
+	bgq_cq = calloc(1, sizeof(*bgq_cq));
+	if (!bgq_cq) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+
+	bgq_cq->cq_fid.fid.fclass = FI_CLASS_CQ;
+	bgq_cq->cq_fid.fid.context= context;
+	bgq_cq->cq_fid.fid.ops    = &fi_bgq_fi_ops;
+
+	bgq_cq->size = attr->size ? attr->size : FI_BGQ_DEFAULT_CQ_DEPTH;
+
+	bgq_cq->domain = (struct fi_bgq_domain *) dom;
+
+	bgq_cq->format = attr->format ? attr->format : FI_CQ_FORMAT_CONTEXT;
+
+	bgq_cq->pending_head = NULL;
+	bgq_cq->pending_tail = NULL;
+	bgq_cq->completed_head = NULL;
+	bgq_cq->completed_tail = NULL;
+	bgq_cq->err_head = NULL;
+	bgq_cq->err_tail = NULL;
+
+	switch (bgq_cq->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+	case FI_THREAD_COMPLETION:
+		lock_required = 0;
+		break;
+	case FI_THREAD_FID:
+	case FI_THREAD_UNSPEC:
+	case FI_THREAD_SAFE:
+		lock_required = 1;
+		break;
+	default:
+		errno = FI_EINVAL;
+	goto err;
+	}
+
+	if (lock_required == 0 &&
+			bgq_cq->format == FI_CQ_FORMAT_UNSPEC) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_UNSPEC, 0);
+	} else if (lock_required == 0 &&
+			bgq_cq->format == FI_CQ_FORMAT_CONTEXT) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_CONTEXT, 0);
+	} else if (lock_required == 0 &&
+			bgq_cq->format == FI_CQ_FORMAT_MSG) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_MSG, 0);
+	} else if (lock_required == 0 &&
+			bgq_cq->format == FI_CQ_FORMAT_DATA) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_DATA, 0);
+	} else if (lock_required == 0 &&
+			bgq_cq->format == FI_CQ_FORMAT_TAGGED) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_TAGGED, 0);
+	} else if (lock_required == 1 &&
+			bgq_cq->format == FI_CQ_FORMAT_UNSPEC) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_UNSPEC, 1);
+	} else if (lock_required == 1 &&
+			bgq_cq->format == FI_CQ_FORMAT_CONTEXT) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_CONTEXT, 1);
+	} else if (lock_required == 1 &&
+			bgq_cq->format == FI_CQ_FORMAT_MSG) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_MSG, 1);
+	} else if (lock_required == 1 &&
+			bgq_cq->format == FI_CQ_FORMAT_DATA) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_DATA, 1);
+	} else if (lock_required == 1 &&
+			bgq_cq->format == FI_CQ_FORMAT_TAGGED) {
+		bgq_cq->cq_fid.ops =
+			&FI_BGQ_CQ_OPS_STRUCT_NAME(FI_CQ_FORMAT_TAGGED, 1);
+
+	} else {
+		bgq_cq->cq_fid.ops =
+			&fi_bgq_ops_cq_default;
+	}
+
+	/* initialize the 'local completion' direct-put descriptor model */
+	{
+		MUHWI_Descriptor_t * desc = &bgq_cq->local_completion_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only = MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt = MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Pa_Payload = 0;				/* specified at injection time */
+		desc->Message_Length = sizeof(uint64_t);
+		desc->Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type = MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Hints = 
+			MUHWI_PACKET_HINT_A_NONE |
+			MUHWI_PACKET_HINT_B_NONE |
+			MUHWI_PACKET_HINT_C_NONE |
+			MUHWI_PACKET_HINT_D_NONE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte2.Byte2 = 0;
+
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = 0;	/* not used for local transfers */
+
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 = MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id = FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing = MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_MSB = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_LSB = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Unused1 = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id = FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Valid_Bytes_In_Payload = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Unused2 = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+	}
+
+	/* allocate the 'std' and 'err' l2atomic fifos */
+	{
+		struct fi_cq_bgq_l2atomic_data * memptr = NULL;
+		size_t bytes = sizeof(struct fi_cq_bgq_l2atomic_data) +
+			sizeof(uint64_t) * bgq_cq->size;
+		if (posix_memalign((void **)&memptr, 32, bytes)) {
+			errno = FI_ENOMEM;
+			goto err;
+		}
+		memset((void*)memptr, 0, bytes);
+		bgq_cq->fifo_memptr = (void*)memptr;
+
+		l2atomic_fifo_initialize(&bgq_cq->err_consumer,
+			&bgq_cq->err_producer,
+			&memptr->err_fifo_data, FI_BGQ_L2ATOMIC_ERR_FIFO_DATA_SIZE);
+		l2atomic_fifo_initialize(&bgq_cq->std_consumer,
+			&bgq_cq->std_producer,
+			&memptr->std_fifo_data, bgq_cq->size);
+	};
+
+	bgq_cq->ep_bind_count = 0;
+	bgq_cq->progress.ep_count = 0;
+	unsigned i;
+	for (i=0; i<64; ++i) {		/* TODO - check this array size */
+		bgq_cq->ep[i] = NULL;
+		bgq_cq->progress.ep[i] = NULL;
+	}
+
+
+	fi_bgq_ref_init(&bgq_cq->domain->fabric->node, &bgq_cq->ref_cnt, "completion queue");
+	fi_bgq_ref_inc(&bgq_cq->domain->ref_cnt, "domain");
+
+	*cq = &bgq_cq->cq_fid;
+
+	return 0;
+err:
+	if(bgq_cq)
+		free(bgq_cq);
+	return -errno;
+}
diff --git a/prov/bgq/src/fi_bgq_domain.c b/prov/bgq/src/fi_bgq_domain.c
new file mode 100644
index 0000000..ae2245c
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_domain.c
@@ -0,0 +1,585 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <unistd.h>
+#include <limits.h>
+
+#include "rdma/bgq/fi_bgq_spi.h"
+
+uint64_t fi_bgq_global_reception_counter __attribute__((__aligned__(L2_CACHE_LINE_SIZE)));
+
+static int fi_bgq_close_domain(fid_t fid)
+{
+	int ret;
+	struct fi_bgq_domain *bgq_domain =
+		container_of(fid, struct fi_bgq_domain, domain_fid);
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_DOMAIN, "domain");
+	if (ret)
+		return ret;
+
+
+	/* close/finalize/deallocate the MU hardware? */
+
+	ret = fi_bgq_finalize_mr_ops(bgq_domain);
+	if (ret)
+		return ret;
+
+	unsigned i;
+	for (i=0; i<bgq_domain->progress.max_threads; ++i) {
+		ret = fi_bgq_progress_disable(bgq_domain, i);
+		if (ret)
+			return ret;
+	}
+
+	ret = fi_bgq_progress_fini(bgq_domain);
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_finalize(&bgq_domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_dec(&bgq_domain->fabric->ref_cnt, "fabric");
+	if (ret)
+		return ret;
+
+
+	free(bgq_domain);
+
+	return 0;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_domain,
+	.bind		= fi_no_bind,
+	.control	= fi_no_control,
+	.ops_open	= fi_no_ops_open
+};
+
+static struct fi_ops_domain fi_bgq_domain_ops = {
+	.size		= sizeof(struct fi_ops_domain),
+	.av_open	= fi_bgq_av_open,
+	.cq_open	= fi_bgq_cq_open,
+	.endpoint	= fi_bgq_endpoint,
+	.scalable_ep	= fi_bgq_scalable_ep,
+	.cntr_open	= fi_bgq_cntr_open,
+	.poll_open	= fi_no_poll_open,
+	.stx_ctx	= fi_bgq_stx_context,
+	.srx_ctx	= fi_no_srx_context
+};
+
+static int fi_bgq_mu_init(struct fi_bgq_domain *bgq_domain,
+		struct fi_info *info)
+{
+	int rc;
+	rc = fi_bgq_node_mu_lock_init(&bgq_domain->fabric->node, &bgq_domain->mu.lock);
+	if (rc) {
+		goto err;
+	}
+	l2atomic_lock_acquire(&bgq_domain->mu.lock);
+
+	const uint32_t ppn = Kernel_ProcessCount();
+	const uint32_t tcoord = Kernel_MyTcoord();
+	const uint32_t subgroup_total = BGQ_MU_NUM_REC_FIFO_SUBGROUPS*(BGQ_MU_NUM_REC_FIFO_GROUPS-1);	/* do not consider 17th core subgroups */
+	const uint32_t subgroups_per_process = subgroup_total / ppn;
+	const uint32_t subgroup_offset = subgroups_per_process * tcoord;
+	const uint32_t recfifo_total = BGQ_MU_NUM_REC_FIFOS_PER_GROUP*(BGQ_MU_NUM_REC_FIFO_GROUPS-1);	/* do not mess with 17th core group recfifos */
+
+	/*
+	 * Create four mu reception fifos in each of the subgroups "owned" by
+	 * this process.
+	 */
+	uint8_t * memptr;
+	size_t nbytes = FI_BGQ_MU_RECFIFO_BYTES * BGQ_MU_NUM_REC_FIFOS_PER_SUBGROUP * subgroups_per_process;
+	rc = posix_memalign((void**)&memptr, 32, nbytes);
+	if (rc) goto err;
+
+	Kernel_MemoryRegion_t mregion;
+	rc = Kernel_CreateMemoryRegion(&mregion, (void*)memptr, nbytes);
+	if (rc) goto err;
+
+	bgq_domain->rfifo_mem = (void*)memptr;
+
+	bgq_domain->rx.max = 0;
+	bgq_domain->rx.count = 0;
+
+	uint32_t n;
+	for (n = 0; n < recfifo_total; ++n) {
+		bgq_domain->rx.rfifo[n] = NULL;
+	}
+
+	const uint32_t subgroups_to_allocate_per_process = ppn == 64 ? 1 : ppn == 32 ? 2 : 4;
+	for (n = 0; n < subgroups_to_allocate_per_process; ++n) {
+
+		const uint32_t requested_subgroup = subgroup_offset + n;
+
+		uint32_t free_fifo_num;
+		uint32_t free_fifo_ids[BGQ_MU_NUM_REC_FIFOS_PER_SUBGROUP];
+		rc = Kernel_QueryRecFifos(requested_subgroup, &free_fifo_num, free_fifo_ids);
+		if (rc) goto err;
+		if (free_fifo_num < 4) goto err;
+		if (free_fifo_ids[0] != 0) goto err;
+		if (free_fifo_ids[1] != 1) goto err;
+		if (free_fifo_ids[2] != 2) goto err;
+		if (free_fifo_ids[3] != 3) goto err;
+
+		Kernel_RecFifoAttributes_t rfifo_attrs[4];
+		memset((void*)&rfifo_attrs[0], 0, sizeof(Kernel_RecFifoAttributes_t)*4);
+		rc = Kernel_AllocateRecFifos(requested_subgroup,
+			&bgq_domain->rfifo_subgroup[requested_subgroup],
+			4, free_fifo_ids, rfifo_attrs);
+		if (rc) goto err;
+
+		uint32_t i;
+		for (i = 0; i < BGQ_MU_NUM_REC_FIFOS_PER_SUBGROUP; ++i) {
+			rc = Kernel_RecFifoInit(&bgq_domain->rfifo_subgroup[requested_subgroup],
+				i,
+				&mregion,
+				((uint64_t)memptr) - (uint64_t)mregion.BaseVa,
+				FI_BGQ_MU_RECFIFO_BYTES - 1);
+			if (rc) goto err;
+
+			memptr += FI_BGQ_MU_RECFIFO_BYTES;
+		}
+
+		uint64_t shift = (BGQ_MU_NUM_REC_FIFOS_PER_GROUP-1) -
+			((requested_subgroup&3)*BGQ_MU_NUM_FIFO_SUBGROUPS);
+		rc = Kernel_RecFifoEnable(requested_subgroup>>2, 0x01ULL << shift);
+		if (rc) goto err;
+		rc = Kernel_RecFifoEnable(requested_subgroup>>2, 0x01ULL << (shift-1));
+		if (rc) goto err;
+		rc = Kernel_RecFifoEnable(requested_subgroup>>2, 0x01ULL << (shift-2));
+		if (rc) goto err;
+		rc = Kernel_RecFifoEnable(requested_subgroup>>2, 0x01ULL << (shift-3));
+		if (rc) goto err;
+
+		for (i = 0; i< BGQ_MU_NUM_REC_FIFOS_PER_SUBGROUP; ++i) {
+			bgq_domain->rx.rfifo[requested_subgroup*BGQ_MU_NUM_REC_FIFOS_PER_SUBGROUP+i] = 
+				 &bgq_domain->rfifo_subgroup[requested_subgroup]._recfifos[i];
+		}
+
+		bgq_domain->rx.max += 4;	/* initialized 4 mu reception fifos, 1 mu reception fifo is used in each fi rx ctx */
+	}
+
+	bgq_domain->tx.count = 0;
+
+	/* initialize the mu gi barrier */
+	bgq_domain->gi.leader_tcoord = bgq_domain->fabric->node.leader_tcoord;
+	bgq_domain->gi.is_leader = bgq_domain->fabric->node.is_leader;
+	if (bgq_domain->gi.is_leader) {
+		rc = MUSPI_GIBarrierInit(&bgq_domain->gi.barrier, 0);
+		assert(rc==0);
+	}
+
+	bgq_domain->subgroups_per_process = 64 / Kernel_ProcessCount();
+
+	l2atomic_lock_release(&bgq_domain->mu.lock);
+
+
+	/* global barrier after mu initialization is complete */
+	l2atomic_barrier_enter(&bgq_domain->fabric->node.barrier);
+	if (bgq_domain->gi.is_leader) {
+		rc = MUSPI_GIBarrierEnterAndWait(&bgq_domain->gi.barrier);
+		assert(rc==0);
+	}
+	l2atomic_barrier_enter(&bgq_domain->fabric->node.barrier);
+
+	return 0;
+err:
+	if (l2atomic_lock_isbusy(&bgq_domain->mu.lock)) {
+		l2atomic_lock_release(&bgq_domain->mu.lock);
+	}
+	return -1;
+}
+
+int fi_bgq_alloc_default_domain_attr(struct fi_domain_attr **domain_attr)
+{
+	struct fi_domain_attr *attr;
+
+	attr = calloc(1, sizeof(*attr));
+	if (!attr)
+		goto err;
+
+	uint32_t ppn = Kernel_ProcessCount();
+
+	/*
+	 * See: fi_bgq_stx_init() for the number of mu injection fifos
+	 * allocated for each tx context. Each rx context uses one
+	 * mu injection fifo and one mu reception fifo.
+	 */
+	const unsigned tx_ctx_cnt = (((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) / 3) / ppn;
+
+	/*
+	 * The number of rx contexts on a node is the minimum of:
+	 * 1. number of mu injection fifos on the node not used by tx contexts
+	 * 2. total number mu reception fifos on the node
+	 */
+	const unsigned rx_ctx_cnt = MIN((((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) - (tx_ctx_cnt * ppn)), ((BGQ_MU_NUM_REC_FIFO_GROUPS-1) * BGQ_MU_NUM_REC_FIFOS_PER_GROUP)) / ppn;
+
+	attr->domain		= NULL;
+	attr->name		= NULL;
+
+	attr->threading		= FI_THREAD_ENDPOINT;
+	attr->control_progress 	= FI_PROGRESS_MANUAL;
+	attr->data_progress	= FI_BGQ_FABRIC_DIRECT_PROGRESS;
+	attr->resource_mgmt	= FI_RM_DISABLED;
+	attr->av_type		= FI_AV_MAP;
+	attr->mr_mode		= FI_BGQ_FABRIC_DIRECT_MR;
+	attr->mr_key_size 	= 2;			/* 2^16 keys */
+	attr->cq_data_size 	= FI_BGQ_REMOTE_CQ_DATA_SIZE;
+	attr->cq_cnt		= 128 / ppn;
+	attr->ep_cnt		= 1;			/* TODO - what about endpoints that only use a shared receive context and a shared transmit context? */
+	attr->tx_ctx_cnt	= tx_ctx_cnt;
+	attr->rx_ctx_cnt	= rx_ctx_cnt;
+
+	attr->max_ep_tx_ctx	= ((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) / ppn / 2;
+	attr->max_ep_rx_ctx	= ((BGQ_MU_NUM_REC_FIFO_GROUPS-1) * BGQ_MU_NUM_REC_FIFOS_PER_GROUP) / ppn;
+
+	attr->max_ep_stx_ctx	= attr->max_ep_tx_ctx;
+	attr->max_ep_srx_ctx	= 0;	/* TODO - reserve some mu reception fifos for use as shared receive context ... how to address? */
+	attr->mr_iov_limit	= 1;
+	attr->mr_cnt		= 1 << (attr->mr_key_size << 3);
+
+	*domain_attr = attr;
+
+	return 0;
+err:
+	*domain_attr = NULL;
+	errno = FI_ENOMEM;
+	return -1;
+}
+
+int fi_bgq_choose_domain(uint64_t caps, struct fi_domain_attr *domain_attr, struct fi_domain_attr *hints)
+{
+	if (!domain_attr) {
+		goto err;
+	}
+
+	*domain_attr = *fi_bgq_global.default_domain_attr;
+	/* Set the data progress mode to the option used in the configure.
+ 	 * Ignore any setting by the application.
+ 	 */
+	domain_attr->data_progress = FI_BGQ_FABRIC_DIRECT_PROGRESS;
+
+	/* Set the mr_mode to the option used in the configure.
+ 	 * Ignore any setting by the application - the checkinfo should have verified
+ 	 * it was set to the same setting.
+ 	 */
+	domain_attr->mr_mode = FI_BGQ_FABRIC_DIRECT_MR;
+ 
+	if (hints) {
+		if (hints->domain) {
+			struct fi_bgq_domain *bgq_domain = bgq_domain = container_of(hints->domain, struct fi_bgq_domain, domain_fid);
+
+			domain_attr->threading		= bgq_domain->threading;
+			domain_attr->resource_mgmt	= bgq_domain->resource_mgmt;
+			domain_attr->tx_ctx_cnt		= fi_bgq_domain_get_tx_max(bgq_domain);
+			domain_attr->rx_ctx_cnt		= fi_bgq_domain_get_rx_max(bgq_domain);
+			domain_attr->max_ep_tx_ctx	= fi_bgq_domain_get_tx_max(bgq_domain);
+			domain_attr->max_ep_rx_ctx	= fi_bgq_domain_get_rx_max(bgq_domain);
+			domain_attr->max_ep_stx_ctx	= fi_bgq_domain_get_tx_max(bgq_domain);
+
+		} else {
+
+			if (hints->threading)		domain_attr->threading = hints->threading;
+			if (hints->control_progress)	domain_attr->control_progress = hints->control_progress;
+			if (hints->resource_mgmt)	domain_attr->resource_mgmt = hints->resource_mgmt;
+			if (hints->av_type)		domain_attr->av_type = hints->av_type;
+			if (hints->mr_key_size)		domain_attr->mr_key_size = hints->mr_key_size;
+			if (hints->cq_data_size)	domain_attr->cq_data_size = hints->cq_data_size;
+			if (hints->cq_cnt)		domain_attr->cq_cnt = hints->cq_cnt;
+			if (hints->ep_cnt)		domain_attr->ep_cnt = hints->ep_cnt;
+			if (hints->tx_ctx_cnt)		domain_attr->tx_ctx_cnt = hints->tx_ctx_cnt;
+			if (hints->rx_ctx_cnt)		domain_attr->rx_ctx_cnt = hints->rx_ctx_cnt;
+			if (hints->max_ep_tx_ctx)	domain_attr->max_ep_tx_ctx = hints->max_ep_tx_ctx;
+			if (hints->max_ep_rx_ctx)	domain_attr->max_ep_rx_ctx = hints->max_ep_rx_ctx;
+			if (hints->max_ep_stx_ctx)	domain_attr->max_ep_stx_ctx = hints->max_ep_stx_ctx;
+			if (hints->max_ep_srx_ctx)	domain_attr->max_ep_srx_ctx = hints->max_ep_srx_ctx;
+			if (hints->mr_iov_limit)	domain_attr->mr_iov_limit = hints->mr_iov_limit;
+		}
+	}
+
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_AUTO)
+		if (Kernel_ProcessCount() > 16) {
+			fprintf(stderr,"BGQ Provider configure in FI_PROGRESS_AUTO mode and cannot be run higher than 16 ppn due to need for progress thread\n");
+			assert(0);
+			exit(1);
+		}
+
+
+	domain_attr->name = strdup(FI_BGQ_PROVIDER_NAME);
+	if (!domain_attr->name) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"no memory\n");
+		errno = FI_ENOMEM;
+		return -errno;
+	}
+
+	domain_attr->cq_data_size = FI_BGQ_REMOTE_CQ_DATA_SIZE;
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_check_domain_attr(struct fi_domain_attr *attr)
+{
+	switch(attr->threading) {
+	case FI_THREAD_UNSPEC:
+	case FI_THREAD_SAFE:
+	case FI_THREAD_FID:
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_COMPLETION:
+	case FI_THREAD_DOMAIN:
+		break;
+	default:
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"incorrect threading level\n");
+		goto err;
+	}
+	if (attr->control_progress &&
+			attr->control_progress != FI_PROGRESS_MANUAL) {
+		fprintf(stderr,"BGQ Provider only supports control_progress of FI_PROGRESS_MANUAL\n");
+		assert(0);
+		exit(1);
+	}
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_AUTO) {
+		if (attr->data_progress &&
+				attr->data_progress == FI_PROGRESS_MANUAL) {
+			fprintf(stderr,"BGQ Provider configured with data progress mode of FI_PROGRESS_AUTO but application specified FI_PROGRESS_MANUAL\n");
+			fflush(stderr);
+			assert(0);
+			exit(1);
+		}
+	}
+	else if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) {
+		if (attr->data_progress &&
+				attr->data_progress == FI_PROGRESS_AUTO) {
+			fprintf(stderr,"BGQ Provider configured with data progress mode of FI_PROGRESS_MANUAL but application specified FI_PROGRESS_AUTO\n");
+			fflush(stderr);
+			assert(0);
+			exit(1);
+		}
+	}
+	else {
+		fprintf(stderr,"BGQ Provider progress mode not properly configured.\n");
+		fflush(stderr);
+		assert(0);
+		exit(1);
+	}
+
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+		if (attr->mr_mode != FI_MR_SCALABLE) {
+			fprintf(stderr,"BGQ Provider configured with mr mode of FI_MR_SCALABLE but application specified something else.\n");
+			fflush(stderr);
+			assert(0);
+			exit(1);
+		}
+	}
+	else if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_BASIC) {
+		if (attr->mr_mode != FI_MR_BASIC) {
+			fprintf(stderr,"BGQ Provider configured with mr mode of FI_MR_BASIC but application specified something else.\n");
+			fflush(stderr);
+			assert(0);
+			exit(1);
+		}
+	}
+	else {
+		fprintf(stderr,"BGQ Provider mr mode not properly configured.\n");
+		fflush(stderr);
+		assert(0);
+		exit(1);
+	}
+	if (attr->mr_key_size) {
+		if (attr->mr_key_size > FI_BGQ_MR_KEY_SIZE) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+					"memory key size too large\n");
+			goto err;
+		}
+	}
+	if (attr->cq_data_size) {
+		if (attr->cq_data_size > FI_BGQ_REMOTE_CQ_DATA_SIZE) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+					"max cq data supported is %d\n",
+					FI_BGQ_REMOTE_CQ_DATA_SIZE);
+			goto err;
+		}
+	}
+
+	return 0;
+
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_domain(struct fid_fabric *fabric,
+		struct fi_info *info,
+		struct fid_domain **dom, void *context)
+{
+	int ret;
+	struct fi_bgq_domain 	*bgq_domain = NULL;
+	struct fi_bgq_fabric 	*bgq_fabric =
+		container_of(fabric, struct fi_bgq_fabric, fabric_fid);
+
+	if (!info) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"no info supplied\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	ret = fi_bgq_fid_check(&fabric->fid, FI_CLASS_FABRIC, "fabric");
+	if (ret)
+		return ret;
+
+	bgq_domain = calloc(1, sizeof(struct fi_bgq_domain));
+	if (!bgq_domain) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+
+	/* fill in default domain attributes */
+	bgq_domain->threading		= fi_bgq_global.default_domain_attr->threading;
+	bgq_domain->resource_mgmt	= fi_bgq_global.default_domain_attr->resource_mgmt;
+
+	if (info->domain_attr) {
+		if (info->domain_attr->domain) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+					"domain cannot be supplied\n");
+			goto err;
+		}
+		ret = fi_bgq_check_domain_attr(info->domain_attr);
+		if (ret)
+			goto err;
+		bgq_domain->threading = info->domain_attr->threading;
+		bgq_domain->resource_mgmt = info->domain_attr->resource_mgmt;
+	}
+
+        /* Set the data progress mode to the option used in the configure.
+	 * Ignore any setting by the application.
+ 	 */
+        bgq_domain->data_progress = FI_BGQ_FABRIC_DIRECT_PROGRESS;
+
+
+	uint32_t ppn = Kernel_ProcessCount();
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_AUTO) {
+		uint32_t ppn = Kernel_ProcessCount();
+ 		if (ppn > 16) {
+			fprintf(stderr,"BGQ Provider configure in FI_PROGRESS_AUTO mode and cannot be run higher than 16 ppn due to need for progress thread\n");
+			assert(0);
+			exit(1);
+		}
+	}
+
+	bgq_domain->fabric = bgq_fabric;
+
+
+	Personality_t personality;
+	if (Kernel_GetPersonality(&personality, sizeof(Personality_t))) goto err;
+	bgq_domain->my_coords.a = personality.Network_Config.Acoord;
+	bgq_domain->my_coords.b = personality.Network_Config.Bcoord;
+	bgq_domain->my_coords.c = personality.Network_Config.Ccoord;
+	bgq_domain->my_coords.d = personality.Network_Config.Dcoord;
+	bgq_domain->my_coords.e = personality.Network_Config.Ecoord;
+	bgq_domain->my_coords.t = Kernel_MyTcoord();
+
+	bgq_domain->zero.value = 0;
+	fi_bgq_cnk_vaddr2paddr((const void *)&bgq_domain->zero.value,
+		sizeof(uint64_t), &bgq_domain->zero.paddr);
+
+	bgq_domain->one.value = 1;
+	fi_bgq_cnk_vaddr2paddr((const void *)&bgq_domain->one.value,
+		sizeof(uint64_t), &bgq_domain->one.paddr);
+
+	ret = fi_bgq_mu_init(bgq_domain, info);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"error initializing the MU\n");
+		errno = FI_EOTHER;
+		goto err;
+	}
+
+	fi_bgq_ref_init(&bgq_fabric->node, &bgq_domain->ref_cnt, "domain");
+
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_AUTO) {
+		uint32_t ppn = Kernel_ProcessCount();
+		fi_bgq_progress_init(bgq_domain, 64/ppn - 1);	/* TODO - what should the "max threads" be? */
+		if (0 != fi_bgq_progress_enable(bgq_domain, 0)) {
+
+			/* Unable to start progress threads! */
+			fprintf(stderr,"BGQ Provider unable to start progress thread for FI_PROGRESS_AUTO mode\n");
+			assert(0);
+			exit(1);
+		}
+	} else {
+		fi_bgq_progress_init(bgq_domain, 0);
+	}
+
+
+	bgq_domain->domain_fid.fid.fclass  = FI_CLASS_DOMAIN;
+	bgq_domain->domain_fid.fid.context = context;
+	bgq_domain->domain_fid.fid.ops     = &fi_bgq_fi_ops;
+	bgq_domain->domain_fid.ops	   = &fi_bgq_domain_ops;
+
+	ret = fi_bgq_init_mr_ops(bgq_domain, info);
+	if (ret)
+		goto err;
+
+	unsigned i = 0;
+	for (i = 0; i < FI_BGQ_DOMAIN_MAX_RX_CTX; ++i) {
+		bgq_domain->rx.ctx[i] = NULL;
+	}
+
+	if (fi_bgq_node_lock_allocate(&bgq_fabric->node, &bgq_domain->lock)) goto err;
+
+	fi_bgq_ref_inc(&bgq_fabric->ref_cnt, "fabric");
+
+	*dom = &bgq_domain->domain_fid;
+
+	return 0;
+
+err:
+	fi_bgq_finalize_mr_ops(bgq_domain);
+	if (bgq_domain)
+		free(bgq_domain);
+	return -errno;
+}
diff --git a/prov/bgq/src/fi_bgq_ep.c b/prov/bgq/src/fi_bgq_ep.c
new file mode 100644
index 0000000..e50f1a4
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_ep.c
@@ -0,0 +1,2023 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+
+#include <fi.h>
+#include <fi_enosys.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <unistd.h>
+#include <limits.h>
+
+#include "rdma/bgq/fi_bgq_spi.h"
+#include "rdma/bgq/fi_bgq_rx.h"
+
+static int fi_bgq_close_stx_nofree(struct fi_bgq_stx *bgq_stx)
+{
+	int ret;
+
+	ret = fi_bgq_ref_finalize(&bgq_stx->ref_cnt, "shared context");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_dec(&bgq_stx->domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+static int fi_bgq_close_stx(fid_t fid)
+{
+	int ret;
+	ret = fi_bgq_fid_check(fid, FI_CLASS_STX_CTX, "shared context");
+	if (ret)
+		return ret;
+
+	struct fi_bgq_stx *bgq_stx =
+		container_of(fid, struct fi_bgq_stx, stx_fid);
+
+	ret = fi_bgq_close_stx_nofree(bgq_stx);
+	if (ret)
+		return ret;
+
+	free(bgq_stx);
+	return 0;
+}
+
+int fi_bgq_bind_ep_stx(struct fi_bgq_ep *bgq_ep,
+		struct fi_bgq_stx *bgq_stx, uint64_t flags)
+{
+	if (!bgq_ep || !bgq_stx)
+		goto err;
+
+	bgq_ep->tx.stx = bgq_stx;
+
+	fi_bgq_ref_inc(&bgq_stx->ref_cnt, "shared context");
+
+	return 0;
+
+err:
+	return -errno;
+}
+
+static struct fi_ops fi_bgq_stx_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_stx,
+	.bind		= fi_no_bind,
+	.control	= fi_no_control,
+	.ops_open	= fi_no_ops_open
+};
+
+static struct fi_ops_ep fi_bgq_stx_ep_ops = {
+	.size		= sizeof(struct fi_ops_ep),
+	.cancel		= fi_no_cancel,
+	.getopt		= fi_no_getopt,
+	.setopt		= fi_no_setopt,
+	.tx_ctx		= fi_no_tx_ctx,
+	.rx_ctx		= fi_no_rx_ctx
+};
+
+int fi_bgq_stx_init (struct fi_bgq_domain *bgq_domain, struct fi_tx_attr *attr,
+		struct fi_bgq_stx *bgq_stx, void *context) {
+
+	bgq_stx->stx_fid.fid.fclass = FI_CLASS_STX_CTX;
+	bgq_stx->stx_fid.fid.context= context;
+	bgq_stx->stx_fid.fid.ops    = &fi_bgq_stx_ops;
+	bgq_stx->stx_fid.ops 	    = &fi_bgq_stx_ep_ops;
+
+	bgq_stx->domain = bgq_domain;
+
+	bgq_stx->attr = attr ? *attr : *fi_bgq_global.default_tx_attr;
+
+	l2atomic_lock_acquire(&bgq_domain->mu.lock);
+
+	/*
+	 * Three options for number of rget fifos to allocate for each tx context:
+	 *
+	 * 1. 1 rget fifo
+	 *    - same for all ppn (1..64)
+	 *    - maximizes the number of tx contexts that can be created
+	 *    - simplest implementation
+	 *    - lowest off-node bandwidth
+	 *    - can support multiple domains at all ppn
+	 *
+	 * 2. 6 rget fifos (a,b,c,d,e,local)
+	 *    - same for all ppn (1..64)
+	 *    - one subgroup for each tx context (including a single tx injfifo)
+	 *    - best for 64 ppn, half off-node bandwidth for all other ppn
+	 *    - can only support one domain at 64 ppn
+	 *    - requires rget fifo hash algorithm
+	 *
+	 * 3. 11 rget fifos (+a,-a,+b,-b,+c,-c,+d,-d,+e,-e,local)
+	 *    - must use 6 rget fifos (option 1) for 64 ppn
+	 *    - complex implementation
+	 *    - optimial off-node bandwidth
+	 *    - can only support one domain at 64 ppn and 32 ppn
+	 *    - requires rget fifo hash algorithm
+	 *
+	 * Allocating per-tx rget injection fifos could eliminate potential
+	 * "rget injection fifo full" MU errors if the number of outstanding
+	 * rget injection payload descriptors can be determined. This will
+	 * limit the maximum number of tx contexts, and each individual rget
+	 * injection fifo will not be saturated - only 11 rget injection fifos
+	 * FOR EACH NODE are needed to maximize off-node aggregate bandwidth.
+	 *
+	 * For now, use option 1.
+	 */
+	uint32_t rget_fifos_to_allocate = 1;
+
+	/*
+	 * initialize the rget injection fifo(s) used for rendezvous; begin at
+	 * fifo 0 of subgroup 0 and iterate *up* until an unallocated rget fifo
+	 * is found
+	 */
+	if (rget_fifos_to_allocate !=
+		fi_bgq_spi_injfifo_init(&bgq_stx->rgetfifo,
+			&bgq_stx->rgetfifo_subgroup,
+			rget_fifos_to_allocate,
+			FI_BGQ_TX_SIZE,
+			0,	/* immediate_payload_sizeof */
+			1,	/* is_remote_get */
+			0))	/* is_top_down */
+	{
+		goto err;
+	}
+
+	/*
+	 * Three options for number of injection fifos to allocate for each tx context:
+	 *
+	 * 1. 1 injection fifo
+	 *    - same for all ppn (1..64)
+	 *    - maximizes the number of tx contexts that can be created
+	 *    - simplest implementation
+	 *    - lowest off-node bandwidth
+	 *    - can support multiple domains at all ppn
+	 *    - may be sufficient because only single-packet messages are injected
+	 *
+	 * 2. 11 injection fifos (+a,-a,+b,-b,+c,-c,+d,-d,+e,-e,local)
+	 *    - must use 6 rget fifos (option 1) for 64 ppn
+	 *    - complex implementation
+	 *    - optimial off-node bandwidth
+	 *    - can only support one domain at 64 ppn and 32 ppn
+	 *    - requires injection fifo pinning algorithm
+	 *
+	 * For now, use option 1.
+	 */
+	uint32_t inj_fifos_to_allocate = 1;
+
+	/*
+	 * initialize the transmit injection fifo; begin at fifo 7 of subgroup 15
+	 * and iterate *down* until an unallocated fifo is found
+	 */
+	if (inj_fifos_to_allocate !=
+		fi_bgq_spi_injfifo_init(&bgq_stx->injfifo,
+			&bgq_stx->injfifo_subgroup,
+			inj_fifos_to_allocate,
+			FI_BGQ_TX_SIZE,
+			sizeof(union fi_bgq_mu_packet_payload),
+			0,	/* is_remote_get */
+			1))	/* is_top_down */
+	{
+		goto err;
+	}
+
+	l2atomic_lock_release(&bgq_domain->mu.lock);
+
+	fi_bgq_ref_init(&bgq_domain->fabric->node, &bgq_stx->ref_cnt, "shared context");
+	fi_bgq_ref_inc(&bgq_domain->ref_cnt, "domain");
+
+	return 0;
+err:
+	if (l2atomic_lock_isbusy(&bgq_domain->mu.lock)) {
+		l2atomic_lock_release(&bgq_domain->mu.lock);
+	}
+	/* TODO  - other cleanup */
+	return -1;
+}
+
+int fi_bgq_stx_context(struct fid_domain *domain, struct fi_tx_attr *attr,
+	       struct fid_stx **stx, void *context)
+{
+	int ret;
+	errno = 0;
+	struct fi_bgq_stx *bgq_stx = NULL;
+	struct fi_bgq_domain *bgq_domain =
+		container_of(domain, struct fi_bgq_domain, domain_fid);
+
+	if (!domain || !stx) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	ret = fi_bgq_fid_check(&domain->fid, FI_CLASS_DOMAIN, "domain");
+	if (ret)
+		return ret;
+
+	bgq_stx = calloc(1, sizeof *bgq_stx);
+	if (!bgq_stx) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+
+	if (fi_bgq_stx_init(bgq_domain, attr, bgq_stx, context)) {
+		errno = FI_EOTHER;
+		goto err;
+	}
+
+	*stx = &bgq_stx->stx_fid;
+	return FI_SUCCESS;
+
+err:
+	if (bgq_stx) {
+		free(bgq_stx);
+		bgq_stx = NULL;
+	}
+	return -errno;
+}
+
+static int fi_bgq_close_ep(fid_t fid)
+{
+	if (!fid) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"NULL ep object");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (fid->fclass != FI_CLASS_EP &&
+			fid->fclass != FI_CLASS_TX_CTX &&
+			fid->fclass != FI_CLASS_RX_CTX) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+			"wrong type of object. expected (FI_CLASS_EP), got (%d)\n",
+			fid->fclass);
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	int ret;
+	struct fi_bgq_ep *bgq_ep = container_of(fid, struct fi_bgq_ep, ep_fid);
+
+	/* disable async progress threads */
+	fi_bgq_progress_ep_disable(bgq_ep);
+
+	ret = fi_bgq_ref_dec(&bgq_ep->domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	/* av is only valid/required if tx capability is enabled */
+	if (bgq_ep->av) {
+		ret = fi_bgq_ref_dec(&bgq_ep->av->ref_cnt, "address vector");
+		if (ret) return ret;
+	}
+
+	if (bgq_ep->sep) {
+		ret = fi_bgq_ref_dec(&bgq_ep->sep->ref_cnt, "scalable endpoint");
+		if (ret) return ret;
+	}
+
+	if (bgq_ep->tx.stx) {
+		ret = fi_bgq_ref_dec(&bgq_ep->tx.stx->ref_cnt, "shared tx context");
+		if (ret) return ret;
+
+		if (bgq_ep->tx.stx == &bgq_ep->tx.exclusive_stx) {
+			ret = fi_bgq_close_stx_nofree(bgq_ep->tx.stx);
+			if (ret) return ret;
+		}
+		bgq_ep->tx.stx = NULL;
+	}
+
+	if (bgq_ep->send_cq) {
+		ret = fi_bgq_ref_dec(&bgq_ep->send_cq->ref_cnt, "completion queue");
+		if (ret) return ret;
+	}
+	if (bgq_ep->recv_cq) {
+		ret = fi_bgq_ref_dec(&bgq_ep->recv_cq->ref_cnt, "completion queue");
+		if (ret) return ret;
+	}
+
+	if (ofi_recv_allowed(bgq_ep->rx.caps) ||
+		ofi_rma_target_allowed(bgq_ep->rx.caps)) {
+	}
+
+	fi_bgq_finalize_cm_ops(bgq_ep);
+	fi_bgq_finalize_msg_ops(bgq_ep);
+	fi_bgq_finalize_rma_ops(bgq_ep);
+	fi_bgq_finalize_tagged_ops(bgq_ep);
+	fi_bgq_finalize_atomic_ops(bgq_ep);
+
+	void *mem = bgq_ep->mem;
+	free(mem);
+
+	return 0;
+}
+
+static int fi_bgq_bind_ep(struct fid *fid, struct fid *bfid,
+		uint64_t flags)
+{
+if (!bfid) return 0;
+	int ret = 0;
+	struct fi_bgq_ep *bgq_ep = container_of(fid, struct fi_bgq_ep, ep_fid);
+
+	switch (bfid->fclass) {
+	case FI_CLASS_CNTR:
+		ret = fi_bgq_bind_ep_cntr(bgq_ep,
+				container_of(bfid, struct fi_bgq_cntr, cntr_fid), flags);
+		if (ret)
+			goto err;
+		break;
+	case FI_CLASS_CQ:
+		ret = fi_bgq_bind_ep_cq(bgq_ep,
+				container_of(bfid, struct fi_bgq_cq, cq_fid), flags);
+		if (ret)
+			goto err;
+		break;
+	case FI_CLASS_AV:
+		ret = fi_bgq_bind_ep_av(bgq_ep,
+				container_of(bfid, struct fi_bgq_av, av_fid), flags);
+		if (ret)
+			goto err;
+		break;
+	case FI_CLASS_MR:
+		ret = fi_bgq_bind_ep_mr(bgq_ep,
+				container_of(bfid, struct fi_bgq_mr, mr_fid), flags);
+		if (ret)
+			goto err;
+		break;
+	case FI_CLASS_STX_CTX:
+		ret = fi_bgq_bind_ep_stx(bgq_ep,
+				container_of(bfid, struct fi_bgq_stx, stx_fid),
+				flags);
+		if (ret)
+			goto err;
+		break;
+	default:
+		errno = FI_ENOSYS;
+		goto err;
+	}
+	return ret;
+err:
+	return -errno;
+}
+
+static int fi_bgq_check_ep(struct fi_bgq_ep *bgq_ep)
+{
+
+
+	switch (bgq_ep->ep_fid.fid.fclass) {
+	case FI_CLASS_EP:
+		if (!bgq_ep->av) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"no AV supplied");
+			goto err;
+		}
+		break;
+	case FI_CLASS_RX_CTX:
+	case FI_CLASS_TX_CTX:
+		if (!bgq_ep->sep) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"no Scalable Endpoint supplied");
+			goto err;
+		}
+		bgq_ep->av = bgq_ep->sep->av;
+		if (!bgq_ep->sep->av) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"no AV supplied on Scalable Endpoint");
+			goto err;
+		}
+		break;
+	default:
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"Invalid EP class %lu",
+				bgq_ep->ep_fid.fid.fclass);
+		goto err;
+	}
+
+	if (!bgq_ep->domain) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"no domain supplied\n");
+		goto err;
+	}
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+static int fi_bgq_ep_tx_init (struct fi_bgq_ep *bgq_ep,
+		struct fi_bgq_domain *bgq_domain)
+{
+	assert(bgq_ep);
+	assert(bgq_domain);
+	assert(bgq_ep->tx.state == FI_BGQ_EP_UNINITIALIZED);
+
+	if (bgq_ep->tx.stx) {
+
+		assert(bgq_domain == bgq_ep->tx.stx->domain);
+
+	} else {
+		/*
+		 * A shared transmit context was not provided; create an
+		 * "exclusive" shared transmit context for use by only this
+		 * endpoint transmit context
+		 */
+
+		if (fi_bgq_stx_init(bgq_domain, 0, &bgq_ep->tx.exclusive_stx, NULL)) {
+			return -1;
+		}
+		bgq_ep->tx.stx = &bgq_ep->tx.exclusive_stx;
+		fi_bgq_ref_inc(&bgq_ep->tx.stx->ref_cnt, "exclusive shared context");
+	}
+
+	bgq_ep->threading = (uint32_t) bgq_domain->threading;
+	bgq_ep->av_type = (uint32_t) bgq_ep->av->type;
+	bgq_ep->mr_mode = (uint32_t) bgq_domain->mr_mode;
+
+	/* copy the 'shared tx' resources and information */
+	fi_bgq_spi_injfifo_clone(&bgq_ep->tx.injfifo, &bgq_ep->tx.stx->injfifo);
+
+	BG_CoordinateMapping_t my_coords = bgq_domain->my_coords;
+
+	const uint32_t fifo_map =
+		fi_bgq_mu_calculate_fifo_map_single(my_coords, my_coords);
+
+	const MUHWI_Destination_t destination =
+		fi_bgq_spi_coordinates_to_destination(my_coords);
+
+	const uint32_t base_rx =
+		fi_bgq_addr_calculate_base_rx(my_coords.t, Kernel_ProcessCount());
+
+	const union fi_bgq_addr self = {.fi=fi_bgq_addr_create(destination, fifo_map, base_rx)};
+
+#ifdef FI_BGQ_TRACE
+	fprintf(stderr,"fi_bgq_ep_tx_init created addr:\n");
+	FI_BGQ_ADDR_DUMP((fi_addr_t *)&self.fi);
+#endif
+	/*
+	 *  fi_[t]send*() descriptor models
+	 */
+	{	/* send model */
+		MUHWI_Descriptor_t * desc = &bgq_ep->tx.send.send_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_FIFO;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+		union fi_bgq_mu_packet_hdr * hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_TAG|FI_BGQ_MU_PACKET_TYPE_EAGER);
+
+		hdr->pt2pt.uid.fi = self.uid.fi;
+		hdr->pt2pt.immediate_data = 0;
+		hdr->pt2pt.ofi_tag = (uint64_t)-1;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->Torus_FIFO_Map = 0;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = -1;
+
+
+		/* send rendezvous models */
+		desc = &bgq_ep->tx.send.rzv_model[0];	/* "internode" */	/* TODO - use an enum */
+		*desc = bgq_ep->tx.send.send_model;
+
+		desc->Message_Length = sizeof(struct fi_bgq_mu_iov) + offsetof(union fi_bgq_mu_packet_payload, rendezvous.mu_iov);
+
+		hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_TAG|FI_BGQ_MU_PACKET_TYPE_RENDEZVOUS);
+		hdr->pt2pt.rendezvous.is_local = 0;
+		hdr->pt2pt.rendezvous.niov_minus_1 = 0;
+		hdr->pt2pt.rendezvous.rget_inj_fifo_id = bgq_ep->tx.stx->rgetfifo.node_scoped_fifo_id;
+
+		desc = &bgq_ep->tx.send.rzv_model[1];	/* "intranode" */	/* TODO - use an enum */
+		*desc = bgq_ep->tx.send.rzv_model[0];
+		hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		hdr->pt2pt.rendezvous.is_local = 1;
+
+#ifdef FI_BGQ_REMOTE_COMPLETION
+		/* remote completion model - used for FI_DELIVERY_COMPLETE */
+		desc = &bgq_ep->tx.send.remote_completion_model;
+		*desc = bgq_ep->tx.send.send_model;
+
+		hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_EAGER|FI_BGQ_MU_PACKET_TYPE_ACK);
+		hdr->completion.origin = fi_bgq_uid_get_destination(self.uid.fi);
+
+		/* specified at injection time */
+		hdr->completion.is_local = 0;
+		hdr->completion.cntr_paddr_rsh3b = 0;
+#endif
+	}
+
+	/*
+	 * fi_write*() descriptor models
+	 */
+	{	/*
+		 * "direct" model(s) for FI_MR_BASIC
+		 */
+
+		/* direct-put model */
+		MUHWI_Descriptor_t * desc = &bgq_ep->tx.write.direct.dput_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_GLOBAL;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->Torus_FIFO_Map = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_MSB = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_LSB = 0;
+
+		/*
+		 *  "emulation" model(s) for FI_MR_SCALABLE
+		 */
+
+		/* memory-fifo model */
+		desc = &bgq_ep->tx.write.emulation.mfifo_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_FIFO;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+		/* specified at injection time */
+		desc->Torus_FIFO_Map = -1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = -1;
+
+		union fi_bgq_mu_packet_hdr * hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_RMA);
+
+		/* remote-get model */
+		desc = &bgq_ep->tx.write.emulation.rget_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_GET;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Remote_Get.Rget_Inj_FIFO_Id =
+			bgq_ep->tx.stx->rgetfifo.node_scoped_fifo_id;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->Torus_FIFO_Map = -1;
+
+		/* direct-put model */
+		desc = &bgq_ep->tx.write.emulation.dput_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_GLOBAL;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+
+		union fi_bgq_mu_descriptor * fi_desc = (union fi_bgq_mu_descriptor *)desc;
+		fi_desc->rma.update_type = FI_BGQ_MU_DESCRIPTOR_UPDATE_BAT_TYPE_DST;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->Torus_FIFO_Map = -1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+
+		/* TODO counter update model */
+
+	}
+
+	/*
+	 * fi_read*() descriptor models
+	 */
+	{
+		bgq_ep->tx.read.global_one_paddr =
+			fi_bgq_node_bat_read(&bgq_domain->fabric->node,
+			FI_BGQ_MU_BAT_ID_ONE);
+
+		bgq_ep->tx.read.global_zero_paddr =
+			fi_bgq_node_bat_read(&bgq_domain->fabric->node,
+			FI_BGQ_MU_BAT_ID_ZERO);
+
+		MUHWI_Descriptor_t * desc = NULL;
+		union fi_bgq_mu_packet_hdr * hdr = NULL;
+
+		/* memory-fifo model */
+		desc = &bgq_ep->tx.read.emulation.mfifo_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_FIFO;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+		hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_RMA);
+		hdr->rma.nbytes = 0;		/* no immediate bytes to 'put' for a read operation */
+		hdr->rma.key = (uint64_t)-1;	/* not used when nbytes == 0 */
+		hdr->rma.offset = 0;		/* not used when nbytes == 0 */
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = -1;
+		/* ==== specified at injection time ==== */
+
+		/* direct-put model */
+		desc = &bgq_ep->tx.read.emulation.dput_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_GLOBAL;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+
+		union fi_bgq_mu_descriptor * fi_desc = (union fi_bgq_mu_descriptor *)desc;
+		fi_desc->rma.update_type = FI_BGQ_MU_DESCRIPTOR_UPDATE_BAT_TYPE_SRC;
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		desc->Message_Length = 0;
+		desc->Pa_Payload = 0;
+		fi_desc->rma.key_msb = 0;	/* TODO - change this when key size > 48b */
+		fi_desc->rma.key_lsb = -1;
+		/* ==== specified at injection time ==== */
+
+		/* "counter" completion direct-put model */
+		desc = &bgq_ep->tx.read.cntr_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->Pa_Payload = bgq_ep->tx.read.global_one_paddr;
+		desc->Message_Length = 8;
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0); /* offset will add atomic-ness at runtime */
+		/* ==== specified at injection time ==== */
+
+		/* "cq" completion direct-put model */
+		desc = &bgq_ep->tx.read.cq_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->Pa_Payload = bgq_ep->tx.read.global_zero_paddr;
+		desc->Message_Length = 8;
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
+		/* ==== specified at injection time ==== */
+	}
+
+	/*
+	 * fi_atomic*() descriptor models
+	 */
+	{
+		MUHWI_Descriptor_t * desc = NULL;
+		union fi_bgq_mu_packet_hdr * hdr = NULL;
+
+		/*
+		 * emulation memory-fifo model
+		 */
+		desc = &bgq_ep->tx.atomic.emulation.mfifo_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_FIFO;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+		desc->Message_Length = sizeof(MUHWI_Descriptor_t);
+
+		hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_ATOMIC);
+		hdr->atomic.origin = fi_bgq_uid_get_destination(self.uid.fi);
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->Pa_Payload = 0;
+
+		/* emulation memory-fifo fence model */
+		desc = &bgq_ep->tx.atomic.emulation.fence.mfifo_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_FIFO;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+		desc->Message_Length = sizeof(MUHWI_Descriptor_t);
+
+		hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_RMA);
+		hdr->rma.nbytes = 0;		/* no immediate bytes to 'put' for a fence operation */
+		hdr->rma.key = (uint64_t)-1;	/* not used when nbytes == 0 */
+		hdr->rma.offset = 0;		/* not used when nbytes == 0 */
+		hdr->rma.ndesc = 1;
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->Pa_Payload = 0;
+
+		/* emulation direct-put fi_cntr increment model */
+		desc = &bgq_ep->tx.atomic.emulation.fence.cntr_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->Pa_Payload = bgq_ep->tx.read.global_one_paddr;
+		desc->Message_Length = 8;
+
+		/* ==== specified at fi_cntr bind time ==== */
+//		MUSPI_SetRecPayloadBaseAddressInfo(desc, write_cntr->std.batid,
+//			MUSPI_GetAtomicAddress(0, MUHWI_ATOMIC_OPCODE_STORE_ADD));
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
+
+		/* emulation direct-put cq byte counter clear model */
+		desc = &bgq_ep->tx.atomic.emulation.fence.cq_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(self.uid.fi);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->Pa_Payload = bgq_ep->tx.read.global_zero_paddr;
+		desc->Message_Length = 8;
+
+		/* ==== specified at injection time ==== */
+		desc->Torus_FIFO_Map = -1;
+		MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
+	}
+
+	bgq_ep->tx.state = FI_BGQ_EP_INITITALIZED_ENABLED;
+	return 0;
+}
+
+
+
+static int fi_bgq_ep_rx_init(struct fi_bgq_ep *bgq_ep)
+{
+	assert(FI_SHARED_CONTEXT != bgq_ep->rx.index);
+
+	struct fi_bgq_domain * bgq_domain = bgq_ep->domain;
+
+	BG_CoordinateMapping_t my_coords = bgq_domain->my_coords;
+
+	const uint32_t fifo_map =
+		fi_bgq_mu_calculate_fifo_map_single(my_coords, my_coords);
+
+	const MUHWI_Destination_t destination =
+		fi_bgq_spi_coordinates_to_destination(my_coords);
+
+	const uint32_t rx =
+		fi_bgq_addr_calculate_base_rx(my_coords.t, Kernel_ProcessCount()) + bgq_ep->rx.index;
+
+	bgq_ep->rx.self.fi = fi_bgq_addr_create(destination, fifo_map, rx);
+
+#ifdef FI_BGQ_TRACE
+	fprintf(stderr,"fi_bgq_ep_rx_init created addr:\n");
+	FI_BGQ_ADDR_DUMP(&bgq_ep->rx.self.fi);
+#endif
+	/* assign the mu reception fifos - all potential
+	 * reception fifos were allocated at domain initialization */
+	if (NULL == bgq_domain->rx.rfifo[fi_bgq_uid_get_rx(bgq_ep->rx.self.uid.fi)]) {
+		assert(0);
+		goto err;
+	}
+
+	if (NULL != bgq_ep->rx.poll.muspi_recfifo) {
+		assert(0);
+		goto err;
+	}
+
+	bgq_ep->rx.poll.muspi_recfifo = bgq_domain->rx.rfifo[fi_bgq_uid_get_rx(bgq_ep->rx.self.uid.fi)];
+
+	bgq_ep->rx.poll.bat = bgq_domain->bat;
+
+	/* **** acquire the mu lock (node scoped) **** */
+	l2atomic_lock_acquire(&bgq_domain->mu.lock);
+
+	/* create an injection fifo for rendezvous and ack messages */
+
+	const int num_fifos_to_allocate = 1;
+	if (num_fifos_to_allocate !=
+		fi_bgq_spi_injfifo_init(&bgq_ep->rx.poll.injfifo,
+			&bgq_ep->rx.poll.injfifo_subgroup,
+			num_fifos_to_allocate,
+			FI_BGQ_RX_SIZE,
+			sizeof(union fi_bgq_mu_packet_payload),
+			0 /* is_remote_get */,
+			1 /* is_top_down */)) {
+		assert(0);
+		goto err;
+	}
+
+	/*
+	 * fi_atomic*() descriptor models
+	 */
+	{
+		MUHWI_Descriptor_t * desc = NULL;
+
+		/*
+		 * fi_atomic*() direct-put fetch response model
+		 */
+		desc = &bgq_ep->rx.poll.atomic_dput_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_GLOBAL;
+
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset =
+			fi_bgq_node_bat_read(&bgq_domain->fabric->node,
+				FI_BGQ_MU_BAT_ID_COUNTER);
+
+		/* specified at injection time */
+		desc->Torus_FIFO_Map = -1;
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id = -1;
+		MUSPI_SetRecPayloadBaseAddressInfo(desc, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
+
+		/*
+		 * fi_atomic*() direct-put fi_cntr completion model
+		 */
+		desc = &bgq_ep->rx.poll.atomic_cntr_update_model[0];	/* intranode .. TODO - use an enum */
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+
+		desc->Pa_Payload = bgq_ep->tx.read.global_one_paddr;
+		desc->Message_Length = 8;
+		desc->Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+
+		MUSPI_SetRecPayloadBaseAddressInfo(desc,
+			FI_BGQ_MU_BAT_ID_GLOBAL,	/* the bat id will be updated at injection time */
+			MUSPI_GetAtomicAddress(0,
+				MUHWI_ATOMIC_OPCODE_STORE_ADD));
+
+		/* specified at injection time */
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id = -1;
+
+		/* initialize the "intranode" version of the descriptor model */
+		bgq_ep->rx.poll.atomic_cntr_update_model[1] = *desc;		/* internode .. TODO - use an enum */
+		bgq_ep->rx.poll.atomic_cntr_update_model[1].Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
+	}
+
+	/*
+	 * initialize the remote-get descriptor models - used for
+	 * the "rendezvous" protocol
+	 */
+	{
+		/* initialize the "internode" version of the descriptor model */
+		MUHWI_Descriptor_t * desc = &bgq_ep->rx.poll.rzv.rget_model[0];	/* TODO - use an enum */
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_GET;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+		desc->Message_Length = sizeof(MUHWI_Descriptor_t);
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Remote_Get.Rget_Inj_FIFO_Id = -1;
+
+		/* initialize the "intranode" version of the descriptor model */
+		bgq_ep->rx.poll.rzv.rget_model[1] = *desc;		/* TODO - use an enum */
+		bgq_ep->rx.poll.rzv.rget_model[1].Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
+	}
+
+	/*
+	 * initialize the direct-put descriptor models - used
+	 * to transfer the application data in the "rendezvous"
+	 * protocol
+	 */
+	{
+		/* initialize the "internode" version of the descriptor model */
+		MUHWI_Descriptor_t * desc = &bgq_ep->rx.poll.rzv.dput_model[0];	/* TODO - use an enum */
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(bgq_ep->rx.self.uid.fi);
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_GLOBAL;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+		desc->Message_Length = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_MSB = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_LSB = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+
+		/* initialize the "intranode" version of the descriptor model */
+		bgq_ep->rx.poll.rzv.dput_model[1] = *desc;		/* TODO - use an enum */
+		bgq_ep->rx.poll.rzv.dput_model[1].Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
+	}
+
+	/*
+	 * initialize the 'local completion' direct-put
+	 * descriptor model - used to zero the byte counter
+	 * of the send operation on the origin for the
+	 * "rendezvous" protocol
+	 *
+	 * see also -> fi_bgq_cq::local_completion_model
+	 */
+	{
+		MUHWI_Descriptor_t * desc = &bgq_ep->rx.poll.rzv.dput_completion_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only = MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt = MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Message_Length = sizeof(uint64_t);
+		desc->Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Payload_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = 0;
+
+		/* specified at injection time */
+		desc->Pa_Payload = 0;
+	}
+
+	{
+		MUHWI_Descriptor_t * desc = &bgq_ep->rx.poll.rzv.multi_recv_ack_model;
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Message_Length = 0;
+		desc->Pa_Payload = 0;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_FIFO;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination =
+			fi_bgq_uid_get_destination(bgq_ep->rx.self.uid.fi);
+
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id =
+			fi_bgq_uid_get_rx(bgq_ep->rx.self.uid.fi);
+
+		union fi_bgq_mu_packet_hdr * hdr = (union fi_bgq_mu_packet_hdr *) &desc->PacketHeader;
+		fi_bgq_mu_packet_type_set(hdr, FI_BGQ_MU_PACKET_TYPE_ACK);
+
+		/* specified at injection time */
+		desc->Torus_FIFO_Map = 0;
+		hdr->ack.context = 0;
+	}
+
+	/*
+	 * initialize the direct-put descriptor models used to zero an arbitrary
+	 * 8 byte variable - used to implement FI_DELIVERY_COMPLETE
+	 */
+	{
+		/* initialize the "internode" version of the descriptor model */
+		MUHWI_Descriptor_t * desc = &bgq_ep->rx.poll.ack_model[0];	/* TODO - use an enum */
+		MUSPI_DescriptorZeroOut(desc);
+
+		desc->Half_Word0.Prefetch_Only =
+			MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+		desc->Half_Word1.Interrupt =
+			MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+		desc->Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+		desc->PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type =
+			MUHWI_PT2PT_DATA_PACKET_TYPE;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 =
+			MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 =
+			MUHWI_PACKET_TYPE_PUT;
+		desc->PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing =
+			MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+		desc->Pa_Payload = bgq_domain->zero.paddr;
+		desc->Message_Length = sizeof(uint64_t);
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id =
+			FI_BGQ_MU_BAT_ID_COUNTER;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+
+		/* specified at injection time - not used for local transfers */
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_MSB = 0;
+		desc->PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_LSB = 0;
+		desc->PacketHeader.NetworkHeader.pt2pt.Destination.Destination.Destination = -1;
+
+		/* initialize the "intranode" version of the descriptor model */
+		bgq_ep->rx.poll.ack_model[1] = *desc;		/* TODO - use an enum */
+		bgq_ep->rx.poll.ack_model[1].Torus_FIFO_Map =
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL0 |
+			MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_LOCAL1;
+	}
+
+
+	/* allocate the l2atomic fifos for match information and control information */
+	{
+		struct l2atomic_fifo_data * memptr = NULL;
+		size_t bytes = (sizeof(struct l2atomic_fifo_data) + sizeof(uint64_t) * bgq_ep->recv_cq->size) * 2;
+		bytes += sizeof(struct l2atomic_fifo_data) + sizeof(uint64_t) * FI_BGQ_L2FIFO_CTL_SIZE;
+
+		if (posix_memalign((void **)&memptr, 32, bytes)) {
+			errno = FI_ENOMEM;
+			goto err;
+		}
+		memset((void*)memptr, 0, bytes);
+		bgq_ep->rx.l2atomic_memptr = (void*)memptr;
+
+		l2atomic_fifo_initialize(&bgq_ep->rx.poll.rfifo[IS_TAG].match,
+			&bgq_ep->rx.post.match[IS_TAG],
+			memptr, bgq_ep->recv_cq->size);
+
+		memptr = (struct l2atomic_fifo_data *)((uintptr_t)memptr + sizeof(struct l2atomic_fifo_data) + sizeof(uint64_t) * bgq_ep->recv_cq->size);
+		l2atomic_fifo_initialize(&bgq_ep->rx.poll.rfifo[IS_MSG].match,
+			&bgq_ep->rx.post.match[IS_MSG],
+			memptr, bgq_ep->recv_cq->size);
+
+		memptr = (struct l2atomic_fifo_data *)((uintptr_t)memptr + sizeof(struct l2atomic_fifo_data) + sizeof(uint64_t) * bgq_ep->recv_cq->size);
+		l2atomic_fifo_initialize(&bgq_ep->rx.poll.control,
+			&bgq_ep->rx.post.control,
+			memptr, FI_BGQ_L2FIFO_CTL_SIZE);
+	}
+
+	/* **** release the mu lock (node scoped) **** */
+	l2atomic_lock_release(&bgq_domain->mu.lock);
+
+	bgq_ep->rx.state = FI_BGQ_EP_INITITALIZED_ENABLED;
+	return 0;
+err:
+	return 1;
+}
+
+static int fi_bgq_open_command_queues(struct fi_bgq_ep *bgq_ep)
+{
+	struct fi_bgq_domain *bgq_domain;
+
+	if (!bgq_ep) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	bgq_domain = bgq_ep->domain;
+
+	if (ofi_send_allowed(bgq_ep->tx.caps) || ofi_rma_initiate_allowed(bgq_ep->tx.caps)) {
+
+		/* verify there is a completion queue associated with the tx context */
+		if (!bgq_ep->send_cq) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"No completion queue bound to send context");
+			goto err;
+		}
+
+		/* verify there is a shared tx context associated with the endpoint - if so configured */
+		if (FI_SHARED_CONTEXT == bgq_ep->tx.index && !bgq_ep->tx.stx) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"No shared tx context bound to endpoint as configured");
+			goto err;
+		}
+
+
+		if (fi_bgq_ep_tx_init(bgq_ep, bgq_domain)) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"Too many tx contexts");
+			goto err;
+		}
+	}
+
+	if (ofi_recv_allowed(bgq_ep->rx.caps) || ofi_rma_target_allowed(bgq_ep->rx.caps)) {
+
+		/* verify there is a completion queue associated with the rx context */
+		if (!bgq_ep->recv_cq) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"No completion queue bound to receive context");
+			goto err;
+		}
+
+		if (FI_SHARED_CONTEXT == bgq_ep->rx.index) {
+			/* verify there is a shared rx context associated with the endpoint */
+			if (!bgq_ep->rx.srx) {
+				FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"No shared rx context bound to endpoint as configured");
+				goto err;
+			}
+
+		} else if (bgq_ep->rx.index >= bgq_domain->rx.max) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"Invalid rx context index (exceeds maximum)");
+			goto err;
+
+		} else if (bgq_ep->rx.index < 0) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"Invalid rx context index (exceeds minimum)");
+			goto err;
+
+		} else if (NULL != bgq_domain->rx.ctx[bgq_ep->rx.index]) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"Invalid rx context index (existing allocation)");
+			goto err;
+		}
+
+		if (0 != fi_bgq_ep_rx_init(bgq_ep)) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"Error during rx context initialization");
+			goto err;
+		}
+
+		bgq_domain->rx.ctx[bgq_ep->rx.index] = bgq_ep;
+	}
+
+	return 0;
+err:
+	return -1;
+}
+
+static int fi_bgq_enable_ep(struct fid_ep *ep)
+{
+	int ret;
+	struct fi_bgq_ep *bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+	ret = fi_bgq_check_ep(bgq_ep);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"ep enable failed\n");
+		return -errno;
+	}
+
+	ret = fi_bgq_open_command_queues(bgq_ep);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"failed to assign command queues\n");
+		return -errno;
+	}
+
+	ret = fi_bgq_enable_msg_ops(bgq_ep);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+			"failed to enable msg ops\n");
+		return -errno;
+	}
+
+	ret = fi_bgq_enable_rma_ops(bgq_ep);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+			"failed to enable rma ops\n");
+		return -errno;
+	}
+
+	ret = fi_bgq_enable_atomic_ops(bgq_ep);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+			"failed to enable rma ops\n");
+		return -errno;
+	}
+
+	ret = fi_bgq_enable_tagged_ops(bgq_ep);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+			"failed to enable rma ops\n");
+		return -errno;
+	}
+
+	bgq_ep->state = FI_BGQ_EP_INITITALIZED_ENABLED;
+
+	/* create an async progress thread for the receive context for FI_PROGRESS_AUTO mode*/
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_AUTO)
+	if (ofi_recv_allowed(bgq_ep->rx.caps)) {
+
+		if (bgq_ep->domain->rx.count == 1) {
+
+			/*
+			 * This is the first endpoint to be assigned to a
+			 * progress thread. The first progress thread is
+			 * started at domain initialization time
+			 */
+
+			ret = fi_bgq_progress_ep_enable(&bgq_ep->domain->progress.thread[0], bgq_ep);
+			if (ret) {
+				FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"failed to enable async progress on endpoint\n");
+				return -errno;
+			}
+
+		} else if (bgq_ep->domain->progress.num_threads_active < bgq_ep->domain->progress.max_threads) {
+
+			const unsigned n = bgq_ep->domain->progress.num_threads_active;
+			ret = fi_bgq_progress_enable(bgq_ep->domain, n);
+			if (ret) {
+				FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"failed to enable progress thread\n");
+				return -errno;
+			}
+
+			ret = fi_bgq_progress_ep_enable(&bgq_ep->domain->progress.thread[n], bgq_ep);
+			if (ret) {
+				FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"failed to enable async progress on endpoint\n");
+				return -errno;
+			}
+
+		} else {
+
+			/*
+			 * Assign endpoint to progress thread in a round-robin fashion.
+			 *
+			 * TODO - better assignment algorithm
+			 */
+
+			const unsigned t = bgq_ep->domain->rx.count % bgq_ep->domain->progress.max_threads;
+			ret = fi_bgq_progress_ep_enable(&bgq_ep->domain->progress.thread[t], bgq_ep);
+			if (ret) {
+				FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"failed to enable async progress on endpoint\n");
+				return -errno;
+			}
+
+		}
+	}
+
+	return 0;
+}
+
+static int fi_bgq_control_ep(fid_t fid, int command, void *arg)
+{
+	struct fid_ep *ep;
+	ep = container_of(fid, struct fid_ep, fid);
+
+	switch (command) {
+	case FI_ENABLE:
+		return fi_bgq_enable_ep(ep);
+	default:
+		return -FI_ENOSYS;
+	}
+
+	return 0;
+}
+
+static int fi_bgq_getopt_ep(fid_t fid, int level, int optname,
+			void *optval, size_t *optlen)
+{
+	struct fi_bgq_ep *bgq_ep = container_of(fid, struct fi_bgq_ep, ep_fid);
+
+	if (level != FI_OPT_ENDPOINT)
+		return -FI_ENOPROTOOPT;
+
+	switch (optname) {
+	case FI_OPT_MIN_MULTI_RECV:
+		*(size_t *)optval = bgq_ep->rx.min_multi_recv;
+		*optlen = sizeof(size_t);
+		break;
+	case FI_OPT_CM_DATA_SIZE:
+		*(size_t *)optval = 0;
+		*optlen = sizeof(size_t);
+		break;
+	default:
+		return -FI_ENOPROTOOPT;
+	}
+
+	return 0;
+}
+
+static int fi_bgq_setopt_ep(fid_t fid, int level, int optname,
+			const void *optval, size_t optlen)
+{
+	struct fi_bgq_ep *bgq_ep = container_of(fid, struct fi_bgq_ep, ep_fid);
+
+	if (level != FI_OPT_ENDPOINT)
+		return -FI_ENOPROTOOPT;
+
+	switch (optname) {
+	case FI_OPT_MIN_MULTI_RECV:
+		bgq_ep->rx.min_multi_recv = *(size_t *)optval;
+		bgq_ep->rx.poll.min_multi_recv = bgq_ep->rx.min_multi_recv;
+		break;
+
+	default:
+		return -FI_ENOPROTOOPT;
+	}
+
+	return 0;
+}
+
+static
+ssize_t fi_bgq_cancel(fid_t fid, void *context)
+{
+	struct fi_bgq_ep *bgq_ep = container_of(fid, struct fi_bgq_ep, ep_fid);
+
+	if (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) {	/* TODO - FI_PROGRESS_AUTO + 64 ppn */
+		const enum fi_threading threading = bgq_ep->domain->threading;
+		const int lock_required =
+			(threading == FI_THREAD_FID) ||
+			(threading == FI_THREAD_UNSPEC) ||
+			(threading == FI_THREAD_SAFE);
+
+		int ret;
+		ret = fi_bgq_lock_if_required(&bgq_ep->lock, lock_required);
+		if (ret) return ret;
+
+		fi_bgq_ep_progress_manual_cancel(bgq_ep, (const uint64_t)context);
+
+		ret = fi_bgq_unlock_if_required(&bgq_ep->lock, lock_required);
+		if (ret) return ret;
+
+	} else {
+
+		/* context must be 8 byte aligned */
+		assert(((uint64_t)context & 0x07ull) == 0);
+		uint64_t value = (uint64_t)context >> 3;
+
+		struct l2atomic_fifo_producer * fifo = &bgq_ep->rx.post.control;
+		while (0 != l2atomic_fifo_produce(fifo, value));
+	}
+
+	return 0;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_ep,
+	.bind		= fi_bgq_bind_ep,
+	.control	= fi_bgq_control_ep,
+	.ops_open	= fi_no_ops_open
+};
+
+static struct fi_ops_ep fi_bgq_ep_ops = {
+	.size		= sizeof(struct fi_ops_ep),
+	.cancel		= fi_bgq_cancel,
+	.getopt		= fi_bgq_getopt_ep,
+	.setopt		= fi_bgq_setopt_ep,
+	.tx_ctx		= fi_no_tx_ctx,
+	.rx_ctx		= fi_no_rx_ctx,
+	.rx_size_left   = fi_no_rx_size_left,
+	.tx_size_left   = fi_no_tx_size_left
+};
+
+int fi_bgq_alloc_default_rx_attr(struct fi_rx_attr **rx_attr)
+{
+	struct fi_rx_attr *attr;
+
+	attr = calloc(1, sizeof(*attr));
+	if (!attr)
+		goto err;
+
+	attr->caps 	= FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMIC | FI_RECV | FI_REMOTE_READ | FI_REMOTE_WRITE | FI_NAMED_RX_CTX | FI_DIRECTED_RECV | FI_MULTI_RECV | FI_SOURCE;
+	attr->mode 	= FI_ASYNC_IOV;
+	attr->op_flags 	= 0;
+	attr->msg_order = FI_BGQ_DEFAULT_MSG_ORDER;
+	attr->comp_order = FI_ORDER_NONE;
+	attr->total_buffered_recv = FI_BGQ_TOTAL_BUFFERED_RECV;
+	attr->size 	= FI_BGQ_RX_SIZE;
+	attr->iov_limit = SIZE_MAX;
+
+	*rx_attr = attr;
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_check_rx_attr(struct fi_rx_attr *attr)
+{
+	/* TODO: more error checking of rx_attr */
+#ifdef TODO
+	if (attr->total_buffered_recv > FI_BGQ_TOTAL_BUFFERED_RECV) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad total_buffered_recv (%lu)]",
+				attr->total_buffered_recv);
+		goto err;
+	}
+#endif
+	if (attr->comp_order && attr->comp_order == FI_ORDER_STRICT) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad rx comp_order (%lx)] ",
+				attr->comp_order);
+		goto err;
+       }
+
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_alloc_default_tx_attr(struct fi_tx_attr **tx_attr)
+{
+	struct fi_tx_attr *attr;
+
+	attr = calloc(1, sizeof(*attr));
+	if (!attr)
+		goto err;
+
+	attr->caps	= FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMIC | FI_SEND | FI_READ | FI_WRITE;
+	attr->mode	= FI_CONTEXT | FI_ASYNC_IOV;
+	attr->op_flags	= FI_TRANSMIT_COMPLETE;
+	attr->msg_order	= FI_BGQ_DEFAULT_MSG_ORDER;
+	attr->comp_order = FI_ORDER_NONE;
+	attr->inject_size = FI_BGQ_INJECT_SIZE;
+	attr->size	= FI_BGQ_TX_SIZE;
+	attr->iov_limit = SIZE_MAX;
+	attr->rma_iov_limit = 1;
+
+	*tx_attr = attr;
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_check_tx_attr(struct fi_tx_attr *attr)
+{
+	if (attr->inject_size > FI_BGQ_INJECT_SIZE) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad inject_size (%lu)]",
+				attr->inject_size);
+		goto err;
+	}
+	/* TODO: more error checking of tx_attr */
+
+	if (attr->comp_order && attr->comp_order == FI_ORDER_STRICT) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad tx comp_order (%lx)] ",
+				attr->comp_order);
+		goto err;
+       }
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_alloc_default_ep_attr(struct fi_ep_attr **ep_attr)
+{
+	struct fi_ep_attr *attr;
+
+	attr = calloc(1, sizeof(*attr));
+	if (!attr)
+		goto err;
+
+	uint32_t ppn = Kernel_ProcessCount();
+
+	/*
+	 * See: fi_bgq_stx_init() for the number of mu injection fifos
+	 * allocated for each tx context. Each rx context uses one
+	 * mu injection fifo and one mu reception fifo.
+	 */
+	const unsigned tx_ctx_cnt = (((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) / 3) / ppn;
+
+	/*
+	 * The number of rx contexts on a node is the minimum of:
+	 * 1. number of mu injection fifos on the node not used by tx contexts
+	 * 2. total number mu reception fifos on the node
+	 */
+	const unsigned rx_ctx_cnt = MIN((((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) - (tx_ctx_cnt * ppn)), ((BGQ_MU_NUM_REC_FIFO_GROUPS-1) * BGQ_MU_NUM_REC_FIFOS_PER_GROUP)) / ppn;
+
+	attr->type		= FI_EP_RDM;
+	attr->protocol		= FI_BGQ_PROTOCOL;
+	attr->protocol_version	= FI_BGQ_PROTOCOL_VERSION;
+	attr->max_msg_size	= FI_BGQ_MAX_MSG_SIZE;
+	attr->msg_prefix_size 	= 0;
+	attr->max_order_raw_size= FI_BGQ_MAX_ORDER_RAW_SIZE;
+	attr->max_order_war_size= FI_BGQ_MAX_ORDER_WAR_SIZE;
+	attr->max_order_waw_size= FI_BGQ_MAX_ORDER_WAW_SIZE;
+	attr->mem_tag_format 	= FI_BGQ_MEM_TAG_FORMAT;
+	attr->tx_ctx_cnt	= tx_ctx_cnt;
+	attr->rx_ctx_cnt	= rx_ctx_cnt;
+
+	*ep_attr = attr;
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_check_ep_attr(struct fi_ep_attr *attr)
+{
+	switch(attr->protocol) {
+		case FI_PROTO_UNSPEC:
+		case FI_BGQ_PROTOCOL:
+			break;
+		default:
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+					"unavailable [bad protocol (%u)]",
+					attr->protocol);
+			goto err;
+	}
+	if (attr->max_msg_size > FI_BGQ_MAX_MSG_SIZE) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad max_msg_size (%lu)]",
+				attr->max_msg_size);
+		goto err;
+	}
+	if (attr->max_order_raw_size > FI_BGQ_MAX_ORDER_RAW_SIZE) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad max_order_raw_size (%lu)",
+				attr->max_order_raw_size);
+		goto err;
+	}
+	if (attr->max_order_war_size > FI_BGQ_MAX_ORDER_WAR_SIZE) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad max_order_war_size (%lu)",
+				attr->max_order_war_size);
+		goto err;
+	}
+	if (attr->max_order_waw_size > FI_BGQ_MAX_ORDER_WAW_SIZE) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad max_order_waw_size (%lu)",
+				attr->max_order_waw_size);
+		goto err;
+	}
+	if (attr->mem_tag_format &&
+			attr->mem_tag_format & ~FI_BGQ_MEM_TAG_FORMAT) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"unavailable [bad mem_tag_format (%lx)",
+				attr->mem_tag_format);
+		goto err;
+	}
+	/* TODO: what msg orders do we not support? */
+
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_endpoint_rx_tx (struct fid_domain *dom, struct fi_info *info,
+		struct fid_ep **ep, void *context, const ssize_t rx_index, const ssize_t tx_index)
+{
+	int ret;
+	struct fi_bgq_ep *bgq_ep = NULL;
+	struct fi_bgq_domain *bgq_domain = NULL;
+
+	if (!info || !dom) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"no info/domain supplied\n");
+		errno = FI_EINVAL;
+		goto err;
+	}
+
+	ret = fi_bgq_fid_check(&dom->fid, FI_CLASS_DOMAIN, "domain");
+	if (ret) return ret;
+
+	ret = fi_bgq_check_info(info);
+	if (ret)
+		return ret;
+
+	void *mem = NULL;
+	mem = malloc(sizeof(struct fi_bgq_ep) + FI_BGQ_CACHE_LINE_SIZE);
+	if (!mem) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_EP_DATA,
+				"no memory for endpoint");
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	bgq_ep = (struct fi_bgq_ep *)(((uintptr_t)mem + FI_BGQ_CACHE_LINE_SIZE) & ~(FI_BGQ_CACHE_LINE_SIZE - 1));
+	memset(bgq_ep, 0, sizeof(struct fi_bgq_ep));
+	bgq_ep->mem = mem;
+
+	bgq_ep->ep_fid.fid.fclass  = FI_CLASS_EP;
+	bgq_ep->ep_fid.fid.context = context;
+	bgq_ep->ep_fid.fid.ops     = &fi_bgq_fi_ops;
+	bgq_ep->ep_fid.ops 	   = &fi_bgq_ep_ops;
+
+	ret = fi_bgq_init_cm_ops(bgq_ep, info);
+	if (ret)
+		goto err;
+
+	ret = fi_bgq_init_msg_ops(bgq_ep, info);
+	if (ret)
+		goto err;
+
+	ret = fi_bgq_init_rma_ops(bgq_ep, info);
+	if (ret)
+		goto err;
+
+	ret = fi_bgq_init_tagged_ops(bgq_ep, info);
+	if (ret)
+		goto err;
+
+	ret = fi_bgq_init_atomic_ops(bgq_ep, info);
+	if (ret)
+		goto err;
+
+	bgq_ep->rx.index = rx_index;
+	bgq_ep->tx.index = tx_index;
+	bgq_ep->rx.caps = info->rx_attr ? info->rx_attr->caps : info->caps;
+	bgq_ep->rx.caps |= FI_RECV;
+
+	bgq_ep->tx.caps = info->tx_attr ? info->tx_attr->caps : info->caps;
+
+	bgq_ep->tx.mode = info->tx_attr ? info->tx_attr->mode : 0;
+	bgq_ep->rx.mode = info->rx_attr ? info->rx_attr->mode : 0;
+
+	bgq_ep->tx.op_flags = info->tx_attr ? info->tx_attr->op_flags : 0;
+	bgq_ep->rx.op_flags = info->rx_attr ? info->rx_attr->op_flags : 0;
+
+	bgq_ep->rx.total_buffered_recv = info->rx_attr ?
+			info->rx_attr->total_buffered_recv : 0;
+
+	bgq_domain = container_of(dom, struct fi_bgq_domain, domain_fid);
+	bgq_ep->domain = bgq_domain;
+	fi_bgq_ref_inc(&bgq_domain->ref_cnt, "domain");
+
+	*ep = &bgq_ep->ep_fid;
+
+	return 0;
+err:
+	fi_bgq_finalize_cm_ops(bgq_ep);
+	fi_bgq_finalize_msg_ops(bgq_ep);
+	fi_bgq_finalize_rma_ops(bgq_ep);
+	fi_bgq_finalize_tagged_ops(bgq_ep);
+	fi_bgq_finalize_atomic_ops(bgq_ep);
+	if (bgq_domain)
+		fi_bgq_ref_dec(&bgq_domain->ref_cnt, "domain");
+	if (bgq_ep)
+		free(bgq_ep->mem);
+	return -errno;
+}
+
+int fi_bgq_endpoint (struct fid_domain *dom, struct fi_info *info,
+		struct fid_ep **ep, void *context)
+{
+	ssize_t rx_index = 0;
+	ssize_t tx_index = 0;
+
+	if (info && info->ep_attr) {
+
+		if (FI_SHARED_CONTEXT == info->ep_attr->tx_ctx_cnt)
+			tx_index = FI_SHARED_CONTEXT;
+
+		if (FI_SHARED_CONTEXT == info->ep_attr->rx_ctx_cnt)
+			rx_index = FI_SHARED_CONTEXT;
+	}
+
+	return fi_bgq_endpoint_rx_tx(dom, info, ep, context, rx_index, tx_index);
+}
+
+/* ************************************************************************* */
+/* These functions are only be used in FI_PROGRESS_MANUAL mode               */
+/* ************************************************************************* */
+
+void fi_bgq_ep_progress_manual_cancel (struct fi_bgq_ep * bgq_ep, const uint64_t cancel_context) {
+
+	if (bgq_ep->rx.caps & FI_MSG) {
+		cancel_match_queue(bgq_ep, 1, cancel_context);
+	}
+
+	if (bgq_ep->rx.caps & FI_TAGGED) {
+		cancel_match_queue(bgq_ep, 0, cancel_context);
+	}
+}
+
+
+int fi_bgq_ep_progress_manual_recv (struct fi_bgq_ep *bgq_ep,
+		const uint64_t is_msg,
+		union fi_bgq_context * context,
+		const uint64_t rx_op_flags,
+		const uint64_t is_context_ext) {
+
+	assert(bgq_ep->rx.poll.injfifo.muspi_injfifo);
+	return process_mfifo_context(bgq_ep, is_msg, 0, context, rx_op_flags, is_context_ext, 1);
+}
+
+
+int fi_bgq_ep_progress_manual_recv_fast (struct fi_bgq_ep *bgq_ep,
+		const uint64_t is_msg,
+		union fi_bgq_context * context) {
+
+	return process_mfifo_context(bgq_ep, is_msg, 0, context, 0, 0, 1);
+}
+
+
+int fi_bgq_ep_progress_manual (struct fi_bgq_ep *bgq_ep) {
+
+
+	poll_rfifo(bgq_ep, 1);
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_fabric.c b/prov/bgq/src/fi_bgq_fabric.c
new file mode 100644
index 0000000..a67e397
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_fabric.c
@@ -0,0 +1,152 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+static int fi_bgq_close_fabric(struct fid *fid)
+{
+	int ret;
+	struct fi_bgq_fabric *bgq_fabric =
+		container_of(fid, struct fi_bgq_fabric, fabric_fid);
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_FABRIC, "fabric");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_finalize(&bgq_fabric->ref_cnt, "fabric");
+	if (ret)
+		return ret;
+
+	free(bgq_fabric);
+	return 0;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_fabric,
+	.bind		= fi_no_bind,
+	.control	= fi_no_control,
+	.ops_open	= fi_no_ops_open
+};
+
+static struct fi_ops_fabric fi_bgq_ops_fabric = {
+	.size		= sizeof(struct fi_ops_fabric),
+	.domain		= fi_bgq_domain,
+	.passive_ep	= fi_no_passive_ep,
+	.eq_open	= fi_no_eq_open
+};
+
+int fi_bgq_check_fabric_attr(struct fi_fabric_attr *attr)
+{
+	if (attr->name) {
+		if (strcmp(attr->name, FI_BGQ_FABRIC_NAME)) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+					"attr->name (%s) doesn't match fabric (%s)\n",
+					attr->name, FI_BGQ_FABRIC_NAME);
+			errno = FI_EINVAL;
+			return -errno;
+		}
+	}
+	if (attr->prov_name) {
+		if (strcmp(attr->prov_name, FI_BGQ_PROVIDER_NAME)) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+					"attr->prov_name (%s) doesn't match prov (%s)\n",
+					attr->prov_name, FI_BGQ_PROVIDER_NAME);
+			errno = FI_EINVAL;
+			return -errno;
+		}
+	}
+	if (attr->prov_version) {
+		if (attr->prov_version != FI_BGQ_PROVIDER_VERSION) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+					"attr->prov_version (%u) doesn't match prov (%u) "
+					"backward/forward compatibility support not implemented\n",
+					attr->prov_version, FI_BGQ_PROVIDER_VERSION);
+			errno = FI_ENOSYS;
+			return -errno;
+		}
+	}
+	return 0;
+}
+
+int fi_bgq_fabric(struct fi_fabric_attr *attr,
+		struct fid_fabric **fabric, void *context)
+{
+	int ret;
+	struct fi_bgq_fabric *bgq_fabric;
+
+	if (attr) {
+		if (attr->fabric) {
+			FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"attr->fabric only valid on getinfo\n");
+			errno = FI_EINVAL;
+			return -errno;
+		}
+
+		ret = fi_bgq_check_fabric_attr(attr);
+		if (ret)
+			return ret;
+	}
+
+	bgq_fabric = calloc(1, sizeof(*bgq_fabric));
+	if (!bgq_fabric)
+		goto err;
+
+	bgq_fabric->fabric_fid.fid.fclass = FI_CLASS_FABRIC;
+	bgq_fabric->fabric_fid.fid.context = context;
+	bgq_fabric->fabric_fid.fid.ops = &fi_bgq_fi_ops;
+	bgq_fabric->fabric_fid.ops = &fi_bgq_ops_fabric;
+
+	ret = fi_bgq_node_init(&bgq_fabric->node);
+        if (ret) {
+                FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+                                "error initializing the bgq node manager\n");
+                errno = FI_EOTHER;
+                goto err;
+        }
+
+	fi_bgq_mu_checks();
+
+	*fabric = &bgq_fabric->fabric_fid;
+
+	fi_bgq_ref_init(&bgq_fabric->node, &bgq_fabric->ref_cnt, "fabric");
+
+	return 0;
+err:
+	errno = FI_ENOMEM;
+	return -errno;
+}
diff --git a/prov/bgq/src/fi_bgq_info.c b/prov/bgq/src/fi_bgq_info.c
new file mode 100644
index 0000000..9889974
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_info.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+
+int fi_bgq_set_default_info()
+{
+	struct fi_info *fi;
+	uint32_t ppn = Kernel_ProcessCount();
+
+	/*
+	 * See: fi_bgq_stx_init() for the number of mu injection fifos
+	 * allocated for each tx context. Each rx context uses one
+	 * mu injection fifo and one mu reception fifo.
+	 */
+	const unsigned tx_ctx_cnt = (((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) / 3) / ppn;
+
+	/*
+	 * The number of rx contexts on a node is the minimum of:
+	 * 1. number of mu injection fifos on the node not used by tx contexts
+	 * 2. total number mu reception fifos on the node
+	 */
+	const unsigned rx_ctx_cnt = MIN((((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) - (tx_ctx_cnt * ppn)), ((BGQ_MU_NUM_REC_FIFO_GROUPS-1) * BGQ_MU_NUM_REC_FIFOS_PER_GROUP)) / ppn;
+
+	fi = fi_dupinfo(NULL);
+	if (!fi) {
+		errno = FI_ENOMEM;
+		return -errno;
+	}
+
+	fi_bgq_global.info = fi;
+
+	*fi->tx_attr = (struct fi_tx_attr) {
+		.caps		= FI_RMA | FI_ATOMIC | FI_TRANSMIT_COMPLETE,
+		.mode		= FI_ASYNC_IOV,
+		.op_flags	= FI_TRANSMIT_COMPLETE,
+		.msg_order	= FI_ORDER_SAS | FI_ORDER_WAW | FI_ORDER_RAW | FI_ORDER_RAR,
+		.comp_order	= FI_ORDER_NONE,
+		.inject_size	= FI_BGQ_INJECT_SIZE,
+		.size		= FI_BGQ_TX_SIZE,
+		.iov_limit	= SIZE_MAX,
+		.rma_iov_limit  = 0
+	};
+
+	*fi->rx_attr = (struct fi_rx_attr) {
+		.caps		= FI_RMA | FI_ATOMIC | FI_NAMED_RX_CTX,
+		.mode		= FI_ASYNC_IOV,
+		.op_flags	= 0,
+		.msg_order	= 0,
+		.comp_order	= FI_ORDER_NONE,
+		.total_buffered_recv = FI_BGQ_TOTAL_BUFFERED_RECV,
+		.size		= FI_BGQ_RX_SIZE,
+		.iov_limit	= SIZE_MAX
+	};
+
+	*fi->ep_attr = (struct fi_ep_attr) {
+		.type			= FI_EP_RDM,
+		.protocol		= FI_BGQ_PROTOCOL,
+		.protocol_version	= FI_BGQ_PROTOCOL_VERSION,
+		.max_msg_size		= FI_BGQ_MAX_MSG_SIZE,
+		.msg_prefix_size	= FI_BGQ_MAX_PREFIX_SIZE,
+		.max_order_raw_size	= FI_BGQ_MAX_ORDER_RAW_SIZE,
+		.max_order_war_size	= FI_BGQ_MAX_ORDER_WAR_SIZE,
+		.max_order_waw_size	= FI_BGQ_MAX_ORDER_WAW_SIZE,
+		.mem_tag_format		= FI_BGQ_MEM_TAG_FORMAT,
+		.tx_ctx_cnt		= tx_ctx_cnt,
+		.rx_ctx_cnt		= rx_ctx_cnt,
+	};
+
+	*fi->domain_attr = (struct fi_domain_attr) {
+		.domain		= NULL,
+		.name		= NULL, /* TODO: runtime query for name? */
+		.threading	= FI_THREAD_FID,
+		.control_progress = FI_PROGRESS_MANUAL,
+		.data_progress	= FI_BGQ_FABRIC_DIRECT_PROGRESS,
+		.resource_mgmt	= FI_RM_DISABLED,
+		.av_type	= FI_AV_MAP,
+		.mr_mode	= FI_BGQ_FABRIC_DIRECT_MR,
+		.mr_key_size	= 2,
+		.cq_data_size	= FI_BGQ_REMOTE_CQ_DATA_SIZE,
+		.cq_cnt		= 128 / ppn,
+		.ep_cnt		= SIZE_MAX,
+		.tx_ctx_cnt	= tx_ctx_cnt,
+		.rx_ctx_cnt	= rx_ctx_cnt,
+
+		.max_ep_tx_ctx	= ((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) / ppn / 2,
+		.max_ep_rx_ctx	= ((BGQ_MU_NUM_REC_FIFO_GROUPS-1) * BGQ_MU_NUM_REC_FIFOS_PER_GROUP) / ppn,
+		.max_ep_stx_ctx	= ((BGQ_MU_NUM_INJ_FIFO_GROUPS-1) * BGQ_MU_NUM_INJ_FIFOS_PER_GROUP) / ppn / 2,
+		.max_ep_srx_ctx	= 0
+	};
+
+	*fi->fabric_attr = (struct fi_fabric_attr) {
+		.fabric		= NULL,
+		.name		= strdup(FI_BGQ_FABRIC_NAME),
+		.prov_name	= strdup(FI_BGQ_PROVIDER_NAME),
+		.prov_version	= FI_BGQ_PROVIDER_VERSION
+	};
+
+	fi->caps		= FI_BGQ_DEFAULT_CAPS;
+	fi->mode		= FI_ASYNC_IOV;
+	fi->mode		|= (FI_CONTEXT);
+	fi->mode		&= (~FI_LOCAL_MR);
+	fi->mode		&= (~FI_MSG_PREFIX);
+
+	fi->addr_format		= FI_ADDR_BGQ;
+	fi->src_addrlen		= 24; // includes null
+	fi->dest_addrlen	= 24; // includes null
+	fi->dest_addr = NULL;
+	fi->next = NULL;
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_init.c b/prov/bgq/src/fi_bgq_init.c
new file mode 100644
index 0000000..5b27f59
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_init.c
@@ -0,0 +1,365 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include "prov.h"
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+static int fi_bgq_init;
+static int fi_bgq_count;
+
+int fi_bgq_check_info(struct fi_info *info)
+{
+	int ret;
+
+	/* TODO: check caps, mode */
+
+	if ((info->tx_attr) && ((info->tx_attr->caps | info->caps) != info->caps)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"The tx_attr capabilities (0x%016lx) must be a subset of those requested of the associated endpoint (0x%016lx)",
+				info->tx_attr->caps, info->caps);
+		goto err;
+	}
+
+	if ((info->rx_attr) && ((info->rx_attr->caps | info->caps) != info->caps)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"The rx_attr capabilities (0x%016lx) must be a subset of those requested of the associated endpoint (0x%016lx)",
+				info->rx_attr->caps, info->caps);
+		goto err;
+	}
+
+
+	switch (info->addr_format) {
+	case FI_FORMAT_UNSPEC:
+	case FI_ADDR_BGQ:
+		break;
+	default:
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"unavailable [bad info->addr_format (%u)]",
+				info->addr_format);
+		goto err;
+	}
+
+	if (info->tx_attr) {
+		ret = fi_bgq_check_tx_attr(info->tx_attr);
+		if (ret)
+			return ret;
+	}
+
+	if (info->rx_attr) {
+		ret = fi_bgq_check_rx_attr(info->rx_attr);
+		if (ret)
+			return ret;
+	}
+
+	if (info->ep_attr) {
+		ret = fi_bgq_check_ep_attr(info->ep_attr);
+		if (ret)
+			return ret;
+	}
+
+	if (info->domain_attr) {
+		ret = fi_bgq_check_domain_attr(info->domain_attr);
+		if (ret)
+			return ret;
+	}
+	if (info->fabric_attr) {
+		ret = fi_bgq_check_fabric_attr(info->fabric_attr);
+		if (ret)
+			return ret;
+	}
+
+	return 0;
+
+err:
+	errno = FI_ENODATA;
+	return -errno;
+}
+
+static int fi_bgq_fillinfo(struct fi_info *fi, const char *node,
+		const char* service, struct fi_info *hints,
+	        uint64_t flags)
+{
+	int ret;
+	uint64_t caps;
+
+	if (!fi)
+		goto err;
+
+	if (!hints && !node && !service)
+		goto err;
+
+	if (hints->dest_addr) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"cannot support dest_addr lookups now");
+		errno = FI_ENOSYS;
+		return -errno;
+	}
+
+	fi->next = NULL;
+	fi->caps = FI_BGQ_DEFAULT_CAPS;
+
+	/* set the mode that we require */
+	fi->mode = FI_ASYNC_IOV;
+	fi->mode |= (FI_CONTEXT);
+
+	/* clear modes that we do not require */
+	fi->mode &= (~FI_LOCAL_MR);
+	fi->mode &= (~FI_MSG_PREFIX);
+
+	fi->addr_format = FI_ADDR_BGQ;
+	fi->src_addrlen = 24; // includes null
+	fi->dest_addrlen = 24; // includes null
+#ifdef TODO
+	if (flags & FI_SOURCE) {
+		fi->src_addr = strdup(service);
+		if (!fi->src_addr) {
+			goto err;
+		}
+	}
+#endif
+	fi->dest_addr = NULL;
+
+	/*
+	 * man/fi_fabric.3
+	 *
+	 * On input to fi_getinfo, a user may set this (fi_fabric_attr::fabric)
+	 * to an opened fabric instance to restrict output to the given fabric.
+	 * On output from fi_getinfo, if no fabric was specified, but the user
+	 * has an opened instance of the named fabric, this (fi_fabric_attr::fabric)
+	 * will reference the first opened instance. If no instance has been
+	 * opened, this field will be NULL.
+	 */
+
+	fi->fabric_attr->name = strdup(FI_BGQ_FABRIC_NAME);
+	if (!fi->fabric_attr->name) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"memory allocation failed");
+		goto err;
+	}
+	fi->fabric_attr->prov_version = FI_BGQ_PROVIDER_VERSION;
+
+	memcpy(fi->tx_attr, fi_bgq_global.default_tx_attr, sizeof(*fi->tx_attr));
+
+	if (hints->tx_attr) {
+
+		/*
+		 * man/fi_endpoint.3
+		 *
+		 *   fi_tx_attr::caps
+		 *
+		 *   "... If the caps field is 0 on input to fi_getinfo(3), the
+		 *   caps value from the fi_info structure will be used."
+		 */
+		if (hints->tx_attr->caps) {
+			fi->tx_attr->caps = hints->tx_attr->caps;
+		}
+
+		/* adjust parameters down from what requested if required */
+		fi->tx_attr->op_flags = hints->tx_attr->op_flags;
+	} else if (hints->caps) {
+		fi->tx_attr->caps = hints->caps;
+	}
+
+	memcpy(fi->rx_attr, fi_bgq_global.default_rx_attr, sizeof(*fi->rx_attr));
+	if (hints->rx_attr) {
+
+		/*
+		 * man/fi_endpoint.3
+		 *
+		 *   fi_rx_attr::caps
+		 *
+		 *   "... If the caps field is 0 on input to fi_getinfo(3), the
+		 *   caps value from the fi_info structure will be used."
+		 */
+		if (hints->rx_attr->caps) {
+			fi->rx_attr->caps = hints->rx_attr->caps;
+		}
+
+		/* adjust parameters down from what requested if required */
+		fi->rx_attr->op_flags = hints->rx_attr->op_flags;
+		if (hints->rx_attr->total_buffered_recv > 0 &&
+			hints->rx_attr->total_buffered_recv < fi_bgq_global.default_rx_attr->total_buffered_recv)
+				fi->rx_attr->total_buffered_recv = hints->rx_attr->total_buffered_recv;
+	} else if (hints->caps) {
+		fi->rx_attr->caps = hints->caps;
+	}
+
+	caps = fi->caps | fi->tx_attr->caps | fi->rx_attr->caps;
+
+	/*
+	 * man/fi_domain.3
+	 *
+	 * On input to fi_getinfo, a user may set this (fi_domain_attr::domain)
+	 * to an opened domain instance to restrict output to the given domain.
+	 * On output from fi_getinfo, if no domain was specified, but the user
+	 * has an opened instance of the named domain, this (fi_domain_attr::domain)
+	 * will reference the first opened instance. If no instance has been
+	 * opened, this field will be NULL.
+	 */
+
+	ret = fi_bgq_choose_domain(caps, fi->domain_attr, hints->domain_attr);
+	if (ret) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_FABRIC,
+				"cannot find appropriate domain");
+		goto err;
+	}
+
+	memcpy(fi->ep_attr, fi_bgq_global.default_ep_attr, sizeof(*fi->ep_attr));
+	if (hints->ep_attr) {
+		/* adjust parameters down from what requested if required */
+		fi->ep_attr->type	= hints->ep_attr->type;
+		if (hints->ep_attr->max_msg_size > 0 &&
+			hints->ep_attr->max_msg_size <= fi_bgq_global.default_ep_attr->max_msg_size)
+				fi->ep_attr->max_msg_size = hints->ep_attr->max_msg_size;
+
+		if (0 != hints->ep_attr->tx_ctx_cnt && hints->ep_attr->tx_ctx_cnt <= fi->ep_attr->tx_ctx_cnt)
+			fi->ep_attr->tx_ctx_cnt = hints->ep_attr->tx_ctx_cnt;	/* TODO - check */
+
+		if (0 != hints->ep_attr->rx_ctx_cnt && hints->ep_attr->rx_ctx_cnt <= fi->ep_attr->rx_ctx_cnt)
+			fi->ep_attr->rx_ctx_cnt = hints->ep_attr->rx_ctx_cnt;	/* TODO - check */
+	}
+
+
+
+	return 0;
+err:
+	if (fi->domain_attr->name) free(fi->domain_attr->name);
+	if (fi->fabric_attr->name) free(fi->fabric_attr->name);
+	if (fi->fabric_attr->prov_name) free(fi->fabric_attr->prov_name);
+	errno = FI_ENODATA;
+	return -errno;
+}
+
+struct fi_bgq_global_data fi_bgq_global;
+
+static int fi_bgq_getinfo(uint32_t version, const char *node,
+		const char *service, uint64_t flags,
+		struct fi_info *hints, struct fi_info **info)
+{
+
+	if (!((FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_MANUAL) || (FI_BGQ_FABRIC_DIRECT_PROGRESS == FI_PROGRESS_AUTO))){
+		fprintf(stderr,"BGQ Provider must be configured with either auto or manual progresss mode specified\n");
+		exit(1);
+		assert(0);
+	}
+
+	BG_JobCoords_t jobCoords;
+	uint32_t jcrc = Kernel_JobCoords(&jobCoords);
+	if (jobCoords.isSubBlock) {
+		fprintf(stderr,"BGQ Provider cannot be run in a sub-block.\n");
+		fflush(stderr);
+		exit(1);
+	}
+
+	int ret;
+	struct fi_info *fi, *prev_fi, *curr;
+
+	if (!fi_bgq_count) {
+		errno = FI_ENODATA;
+		return -errno;
+	}
+
+	if (hints) {
+		ret = fi_bgq_check_info(hints);
+		if (ret) {
+			return ret;
+		}
+		if (!(fi = fi_allocinfo())) {
+			return -FI_ENOMEM;
+		}
+		if (fi_bgq_fillinfo(fi, node, service,
+					hints, flags)) {
+			return -errno;
+		}
+		*info = fi;
+	} else {
+		if(node || service) {
+			errno = FI_ENODATA;
+			return -errno;
+		} else {
+			if (!(fi = fi_dupinfo(fi_bgq_global.info))) {
+				return -FI_ENOMEM;
+			}
+			*info = fi;
+		}
+	}
+
+	return 0;
+}
+
+static void fi_bgq_fini()
+{
+	always_assert(fi_bgq_init == 1,
+		"BGQ provider finalize called before initialize\n");
+	fi_freeinfo(fi_bgq_global.info);
+}
+
+static struct fi_provider fi_bgq_provider = {
+	.name 		= FI_BGQ_PROVIDER_NAME,
+	.version 	= FI_VERSION(0, 1),
+	.fi_version 	= FI_VERSION(1,5),
+	.getinfo	= fi_bgq_getinfo,
+	.fabric		= fi_bgq_fabric,
+	.cleanup	= fi_bgq_fini
+};
+
+BGQ_INI
+{
+	fi_bgq_count = 1;
+	fi_bgq_set_default_info(); // TODO: fold into fi_bgq_set_defaults
+
+	if (fi_bgq_alloc_default_domain_attr(&fi_bgq_global.default_domain_attr)) {
+		return NULL;
+	}
+
+	if (fi_bgq_alloc_default_ep_attr(&fi_bgq_global.default_ep_attr)) {
+		return NULL;
+	}
+
+	if (fi_bgq_alloc_default_tx_attr(&fi_bgq_global.default_tx_attr)) {
+		return NULL;
+	}
+
+	if (fi_bgq_alloc_default_rx_attr(&fi_bgq_global.default_rx_attr)) {
+		return NULL;
+	}
+
+	fi_bgq_global.prov = &fi_bgq_provider;
+
+	fi_bgq_init = 1;
+
+	return (&fi_bgq_provider);
+}
diff --git a/prov/bgq/src/fi_bgq_mr.c b/prov/bgq/src/fi_bgq_mr.c
new file mode 100644
index 0000000..bd53c5a
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_mr.c
@@ -0,0 +1,207 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+
+static int fi_bgq_close_mr(fid_t fid)
+{
+	struct fi_bgq_domain *bgq_domain;
+	struct fi_bgq_mr *bgq_mr = (struct fi_bgq_mr *) fid;
+
+	bgq_domain = bgq_mr->domain;
+
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+	int ret;
+	fi_bgq_domain_bat_clear(bgq_domain, bgq_mr->mr_fid.key);
+
+	ret = fi_bgq_ref_dec(&bgq_domain->ref_cnt, "domain");
+	if (ret) return ret;
+	}
+	free(bgq_mr);
+	return 0;
+}
+
+static int fi_bgq_bind_mr(struct fid *fid,
+		struct fid *bfid, uint64_t flags)
+{
+	int ret;
+	struct fi_bgq_mr *bgq_mr =
+		(struct fi_bgq_mr *) fid;
+	struct fi_bgq_cntr *bgq_cntr;
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_MR, "memory region");
+	if (ret)
+		return ret;
+
+	switch (bfid->fclass) {
+	case FI_CLASS_CNTR:
+		bgq_cntr = (struct fi_bgq_cntr *) bfid;
+		bgq_mr->cntr = bgq_cntr;
+		bgq_mr->cntr_bflags = flags;
+		break;
+	default:
+		errno = FI_ENOSYS;
+		return -errno;
+	}
+	return 0;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_mr,
+	.bind		= fi_bgq_bind_mr,
+	.control	= fi_no_control,
+	.ops_open	= fi_no_ops_open
+};
+
+static int fi_bgq_mr_reg(struct fid *fid, const void *buf,
+		size_t len, uint64_t access, uint64_t offset,
+		uint64_t requested_key, uint64_t flags,
+		struct fid_mr **mr, void *context)
+{
+	int ret;
+
+	struct fi_bgq_mr *bgq_mr;
+	struct fi_bgq_domain *bgq_domain;
+
+	if (!fid || !mr) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_DOMAIN, "domain");
+	if (ret) return ret;
+
+	if (flags != 0) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_MR,
+				"Flags for fi_mr_reg must be 0\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	bgq_domain = (struct fi_bgq_domain *) container_of(fid, struct fid_domain, fid);
+
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+		if (requested_key >= bgq_domain->num_mr_keys) {
+			/* requested key is too large */
+			errno = FI_EKEYREJECTED;
+			return -errno;
+		}
+	}
+	bgq_mr = calloc(1, sizeof(*bgq_mr));
+	if (!bgq_mr) {
+		errno = FI_ENOMEM;
+		return -errno;
+	}
+
+	bgq_mr->mr_fid.fid.fclass	= FI_CLASS_MR;
+	bgq_mr->mr_fid.fid.context	= context;
+	bgq_mr->mr_fid.fid.ops		= &fi_bgq_fi_ops;
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+		bgq_mr->mr_fid.key		= requested_key;
+	}
+	else if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_BASIC) {
+
+		uint64_t paddr = 0;
+
+		fi_bgq_cnk_vaddr2paddr(buf,1,&paddr);
+		bgq_mr->mr_fid.key		= ((uint64_t)buf - paddr);
+#ifdef FI_BGQ_TRACE
+        fprintf(stderr,"fi_bgq_mr_reg - FI_MR_BASIC virtual addr is 0x%016lx physical addr is 0x%016lx key is %lu  \n",(uint64_t)buf,paddr,(uint64_t)((uint64_t)buf - paddr));
+fflush(stderr);
+
+#endif
+
+	}
+	bgq_mr->buf 	= buf;
+	bgq_mr->len	= len;
+	bgq_mr->offset	= offset;
+	bgq_mr->access	= FI_SEND | FI_RECV | FI_READ | FI_WRITE | FI_REMOTE_READ | FI_REMOTE_WRITE;
+	bgq_mr->flags	= flags;
+	bgq_mr->domain  = bgq_domain;
+
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+		fi_bgq_domain_bat_write(bgq_domain, requested_key, buf, len);
+
+		fi_bgq_ref_inc(&bgq_domain->ref_cnt, "domain");
+	}
+
+	*mr = &bgq_mr->mr_fid;
+
+	return 0;
+}
+
+int fi_bgq_bind_ep_mr(struct fi_bgq_ep *bgq_ep,
+		struct fi_bgq_mr *bgq_mr, uint64_t flags)
+{
+	return 0;
+}
+
+static struct fi_ops_mr fi_bgq_mr_ops = {
+	.size		= sizeof(struct fi_ops_mr),
+	.reg 		= fi_bgq_mr_reg,
+	.regv 		= fi_no_mr_regv,
+	.regattr	= fi_no_mr_regattr
+};
+
+int fi_bgq_init_mr_ops(struct fi_bgq_domain *bgq_domain, struct fi_info *info)
+{
+	if (!bgq_domain || !info) {
+		goto err;
+	}
+
+	if (info->domain_attr->mr_mode == FI_MR_UNSPEC) goto err; 
+
+	bgq_domain->domain_fid.mr	   = &fi_bgq_mr_ops;
+
+	bgq_domain->mr_mode = info->domain_attr->mr_mode;
+
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+	bgq_domain->num_mr_keys = (1<<(8*info->domain_attr->mr_key_size));
+	bgq_domain->bat = (struct fi_bgq_bat_entry *) calloc(bgq_domain->num_mr_keys, sizeof(struct fi_bgq_bat_entry));
+
+	}
+	return 0;
+err:
+	errno = FI_EINVAL;
+	return -errno;
+}
+
+int fi_bgq_finalize_mr_ops(struct fi_bgq_domain *bgq_domain)
+{
+	if (FI_BGQ_FABRIC_DIRECT_MR == FI_MR_SCALABLE) {
+	free((void*)bgq_domain->bat);
+	bgq_domain->bat = (void*)NULL;
+	bgq_domain->num_mr_keys = 0;
+	}
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_msg.c b/prov/bgq/src/fi_bgq_msg.c
new file mode 100644
index 0000000..da3874e
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_msg.c
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+
+ssize_t fi_bgq_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
+			uint64_t flags)
+{
+	struct fi_bgq_ep * bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+	const enum fi_threading threading = bgq_ep->threading;
+
+	return fi_bgq_send_generic_flags(ep, msg->msg_iov, msg->iov_count,
+		msg->desc, msg->addr, 0, msg->context, msg->data,
+		(threading != FI_THREAD_ENDPOINT && threading != FI_THREAD_DOMAIN),	/* "lock required"? */
+		1 /* is_msg */,
+		0 /* is_contiguous */,
+		1 /* override the default tx flags */,
+		flags);
+}
+
+ssize_t fi_bgq_sendv(struct fid_ep *ep, const struct iovec *iov,
+			void **desc, size_t count, fi_addr_t dest_addr,
+			void *context)
+{
+	struct fi_bgq_ep * bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+	const enum fi_threading threading = bgq_ep->threading;
+
+	return fi_bgq_send_generic_flags(ep, iov, count,
+		desc, dest_addr, 0, context, 0,
+		(threading != FI_THREAD_ENDPOINT && threading != FI_THREAD_DOMAIN),	/* "lock required"? */
+		1 /* is_msg */,
+		0 /* is_contiguous */,
+		0 /* do not override flags */,
+		0);
+}
+
+
+ssize_t fi_bgq_senddata(struct fid_ep *ep, const void *buf, size_t len, void *desc,
+			uint64_t data, void *context)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+/* "FI_BGQ_MSG_SPECIALIZED_FUNC(0)" is already declared via FABRIC_DIRECT */
+FI_BGQ_MSG_SPECIALIZED_FUNC(1)
+
+#define FI_BGQ_MSG_OPS_STRUCT_NAME(LOCK)				\
+	fi_bgq_ops_msg_ ## LOCK
+
+#define FI_BGQ_MSG_OPS_STRUCT(LOCK)					\
+static struct fi_ops_msg						\
+	FI_BGQ_MSG_OPS_STRUCT_NAME(LOCK) = {				\
+	.size		= sizeof(struct fi_ops_msg),			\
+	.recv		=						\
+		FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(recv, LOCK),		\
+	.recvv		= fi_no_msg_recvv,				\
+	.recvmsg	=						\
+		FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(recvmsg, LOCK),	\
+	.send		=						\
+		FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(send, LOCK),		\
+	.sendv		= fi_bgq_sendv,					\
+	.sendmsg	= fi_bgq_sendmsg,				\
+	.inject		=						\
+		FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(inject, LOCK),		\
+	.senddata	=						\
+		FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(senddata, LOCK),	\
+	.injectdata	=						\
+		FI_BGQ_MSG_SPECIALIZED_FUNC_NAME(injectdata, LOCK),	\
+}
+
+FI_BGQ_MSG_OPS_STRUCT(0);
+FI_BGQ_MSG_OPS_STRUCT(1);
+
+static struct fi_ops_msg fi_bgq_no_msg_ops = {
+	.size		= sizeof(struct fi_ops_msg),
+	.recv		= fi_no_msg_recv,
+	.recvv		= fi_no_msg_recvv,
+	.recvmsg	= fi_no_msg_recvmsg,
+	.send		= fi_no_msg_send,
+	.sendv		= fi_no_msg_sendv,
+	.sendmsg	= fi_no_msg_sendmsg,
+	.inject		= fi_no_msg_inject,
+	.senddata	= fi_no_msg_senddata,
+	.injectdata	= fi_no_msg_injectdata
+};
+
+int fi_bgq_init_msg_ops(struct fi_bgq_ep *bgq_ep, struct fi_info *info)
+{
+	if (!info || !bgq_ep) {
+		errno = FI_EINVAL;
+		goto err;
+	}
+	if (info->caps & FI_MSG ||
+			(info->tx_attr &&
+			 (info->tx_attr->caps & FI_MSG))) {
+
+		bgq_ep->rx.min_multi_recv = sizeof(union fi_bgq_mu_packet_payload);
+		bgq_ep->rx.poll.min_multi_recv = bgq_ep->rx.min_multi_recv;
+
+	}
+
+	return 0;
+
+err:
+	return -errno;
+}
+
+int fi_bgq_enable_msg_ops(struct fi_bgq_ep *bgq_ep)
+{
+	if (!bgq_ep || !bgq_ep->domain)
+		return -FI_EINVAL;
+
+	if (!(bgq_ep->tx.caps & FI_MSG)) {
+		/* Messaging ops not enabled on this endpoint */
+		bgq_ep->ep_fid.msg =
+			&fi_bgq_no_msg_ops;
+		return 0;
+	}
+
+
+	switch (bgq_ep->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+	case FI_THREAD_COMPLETION:
+		bgq_ep->ep_fid.msg = &FI_BGQ_MSG_OPS_STRUCT_NAME(0);
+		break;
+	case FI_THREAD_FID:
+	case FI_THREAD_UNSPEC:
+	case FI_THREAD_SAFE:
+		bgq_ep->ep_fid.msg = &FI_BGQ_MSG_OPS_STRUCT_NAME(1);
+		break;
+	default:
+		return -FI_EINVAL;
+	}
+
+	return 0;
+}
+
+int fi_bgq_finalize_msg_ops(struct fi_bgq_ep *bgq_ep)
+{
+	if (!bgq_ep) {
+		return 0;
+	}
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_node.c b/prov/bgq/src/fi_bgq_node.c
new file mode 100644
index 0000000..a1b4ff6
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_node.c
@@ -0,0 +1,486 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "rdma/bgq/fi_bgq_hwi.h"
+#include "rdma/bgq/fi_bgq_spi.h"
+
+#include "rdma/bgq/fi_bgq_mu.h"
+#include "rdma/bgq/fi_bgq_node.h"
+
+uint64_t fi_bgq_node_bat_allocate_id (struct fi_bgq_node * node, struct l2atomic_lock * lock, uint64_t index);
+
+#define FI_BGQ_NODE_COUNTER_SIZE ((1 << 13))	/* 8192 counters per node */
+#define FI_BGQ_NODE_LOCK_SIZE ((1 << 13))	/* 8192 locks per node */
+
+enum bat_variable {
+	BAT_VARIABLE_GLOBAL = 0,
+	BAT_VARIABLE_COUNTER,
+	BAT_VARIABLE_ONE,
+	BAT_VARIABLE_ZERO,
+	BAT_VARIABLE_BLACKHOLE,
+	BAT_VARIABLE_NUM
+};
+
+struct fi_bgq_node_shared {
+	volatile uint64_t	init_counter;
+	volatile uint64_t	is_initialized;
+	uint64_t		pad;
+	volatile uint64_t	global_variables[BAT_VARIABLE_NUM];
+	struct {
+		struct l2atomic_lock_data	lock_data;
+	} mu;
+	struct {
+		struct l2atomic_counter_data	allocator_data;
+		struct l2atomic_counter_data	counter_data[FI_BGQ_NODE_COUNTER_SIZE];
+	} counter;
+	struct {
+		struct l2atomic_counter_data	allocator_data;
+		struct l2atomic_lock_data	lock_data[FI_BGQ_NODE_LOCK_SIZE];
+	} lock;
+	struct l2atomic_barrier_data		barrier_data;
+	uint32_t				leader_tcoord;
+	volatile uint64_t	bat_shadow[FI_BGQ_NODE_BAT_SIZE];
+	volatile uint64_t	bat_cntr[FI_BGQ_NODE_APPLICATION_BAT_SIZE];
+};
+
+
+#define FI_BGQ_NODE_SHM_FILENAME "/fi_bgq_node"
+#define FI_BGQ_NODE_SHM_FILESIZE (sizeof(struct fi_bgq_node_shared) + L2_CACHE_LINE_SIZE)
+
+void calculate_local_process_count (uint64_t * local_process_count, uint32_t * leader_tcoord) {
+
+	int cnk_rc __attribute__ ((unused));
+
+	Personality_t personality;
+	cnk_rc = Kernel_GetPersonality(&personality, sizeof(Personality_t));
+	assert(cnk_rc==0);
+
+	BG_CoordinateMapping_t local_coords;
+	local_coords.a = personality.Network_Config.Acoord;
+	local_coords.b = personality.Network_Config.Bcoord;
+	local_coords.c = personality.Network_Config.Ccoord;
+	local_coords.d = personality.Network_Config.Dcoord;
+	local_coords.e = personality.Network_Config.Ecoord;
+	local_coords.t = 0;
+	local_coords.reserved = 0;
+	const uint32_t * const local_coords_uint32 = (uint32_t *)&local_coords;
+
+	size_t node_count = personality.Network_Config.Anodes *
+		personality.Network_Config.Bnodes *
+		personality.Network_Config.Cnodes *
+		personality.Network_Config.Dnodes *
+		personality.Network_Config.Enodes;
+
+	uint32_t ppn = Kernel_ProcessCount();
+
+	/*
+	 * read the ranks2coords mapping on to the stack
+	 */
+	size_t mapsize = node_count * ppn;
+	BG_CoordinateMapping_t map[mapsize];
+	uint64_t numentries = 0;
+	cnk_rc = Kernel_RanksToCoords(mapsize*sizeof(BG_CoordinateMapping_t), map, &numentries);
+	assert(cnk_rc==0);
+
+	/*
+	 * scan the mapping for all ranks on the local node
+	 *
+	 * the last rank encountered, the highest global rank, will be the
+	 * node "leader" regardless of its t coordinate
+	 *
+	 * calculate the number of active processes on the local node
+	 */
+	*local_process_count = 0;
+	uint64_t n;
+	const uint32_t * const map_uint32 = (uint32_t *)map;
+	for (n = 0; n < numentries; ++n) {
+		const uint32_t bg_coordinatemapping = map_uint32[n];
+		if ((bg_coordinatemapping & 0xBFFFFFC0) == *local_coords_uint32) {
+			*local_process_count += 1;
+			*leader_tcoord = map[n].t;
+		}
+	}
+}
+
+int fi_bgq_node_init (struct fi_bgq_node * node) {
+
+	/* open and create the shared memory segment */
+	int _fd = -1;
+	_fd = shm_open(FI_BGQ_NODE_SHM_FILENAME, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
+	if (_fd == -1) goto err;
+
+	/* set this shared memory as l2 atomic */
+	uint64_t foo=1;
+	int rc;
+	rc = ioctl(_fd, FIOBGQATOMIC, &foo);
+	if (rc) goto err;
+
+	/* set the size of the shared memory segment */
+	size_t nbytes = FI_BGQ_NODE_SHM_FILESIZE;
+	if (ftruncate(_fd, nbytes) == -1) goto err;
+
+	/* map the shared memory segment and get the virtual address */
+	void * _ptr = MAP_FAILED;
+	_ptr = mmap(NULL, nbytes, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0);
+	if (_ptr == MAP_FAILED) goto err;
+
+	/* align to L2 cache */
+	node->abs_ptr = _ptr;
+	_ptr = (void *)(((uint64_t)_ptr+L2_CACHE_LINE_SIZE) & ~(L2_CACHE_LINE_SIZE-1));
+	node->shm_ptr = _ptr;
+
+	struct fi_bgq_node_shared * shared = (struct fi_bgq_node_shared *) node->shm_ptr;
+
+	uint32_t cnk_rc __attribute__ ((unused));
+	cnk_rc = Kernel_L2AtomicsAllocate((void *)shared, FI_BGQ_NODE_SHM_FILESIZE);
+	assert(cnk_rc==0);
+
+	uint64_t value = L2_AtomicLoadIncrement(&shared->init_counter);
+	if (value == 0) {
+
+		/* initialize the mu lock */
+		L2_AtomicStore(&shared->mu.lock_data.ticket, 0);
+		L2_AtomicStore(&shared->mu.lock_data.serving, 0);
+
+		/* initialize the counter allocater .. er .. counter */
+		l2atomic_counter_initialize(&node->counter.allocator, &shared->counter.allocator_data);
+
+		/* initialize the lock allocator counter */
+		l2atomic_counter_initialize(&node->lock.allocator, &shared->lock.allocator_data);
+
+		uint64_t local_process_count = 0;
+		shared->leader_tcoord = (uint32_t)-1;
+		calculate_local_process_count(&local_process_count, &shared->leader_tcoord);
+
+		l2atomic_barrier_initialize(&node->barrier, &shared->barrier_data, local_process_count);
+
+#ifdef TODO
+		/* verify that the MU and ND are not in reset. they must be out
+		 * of reset in order to set up the MU resources or a machine
+		 * check will occur - this would impact a future job using ofi-bgq. */
+		uint64_t val1, val2, val3;
+		val1 = DCRReadUser(MU_DCR(RESET));
+		val2 = DCRReadUser(ND_X2_DCR(RESET));
+		val3 = DCRReadUser(ND_500_DCR(RESET));
+		if ((MU_DCR__RESET__DCRS_OUT_get(val1)) ||
+			(ND_X2_DCR__RESET__DCRS_OUT_get(val2)) ||
+			(ND_500_DCR__RESET__DCRS_OUT_get(val3))) {
+			assert(0);
+		}
+#endif
+
+		/* Initialize the Base Address Table shadow */
+		{
+			node->bat.shadow = &shared->bat_shadow[0];
+			unsigned index;
+			for (index=0; index<FI_BGQ_NODE_BAT_SIZE; ++index) {
+				node->bat.shadow[index] = 0xFFFFFFFFFFFFFFFFull;
+			}
+		}
+
+		/*
+		 * Initialize the FI_BGQ_MU_BAT_ID_GLOBAL entry to the base
+		 * physical address 0x00 which will be used by MU operations
+		 * that specify the actual physical addresss
+		 *
+		 * Initialize the FI_BGQ_MU_BAT_ID_COUNTER entry to a global
+		 * variable which will be used by MU "direct put" operations
+		 * that choose to disregard reception counter completions.
+		 *
+		 * Initialize the FI_BGQ_MU_BAT_ID_ZERO entry to a global
+		 * variable which is set to the constant value 'zero'.
+		 *
+		 * Initialize the FI_BGQ_MU_BAT_ID_ONE entry to a global
+		 * variable which is set to the constant value 'one'.
+		 *
+		 * Initialize the FI_BGQ_MU_BAT_ID_BLACKHOLE entry to a global
+		 * variable which is used as a 'garbage' location to write
+		 * data that is to be ignored.
+		 */
+		uint64_t rc __attribute__ ((unused));
+
+		rc = fi_bgq_node_bat_allocate_id(node, NULL, FI_BGQ_MU_BAT_ID_GLOBAL);
+		assert(rc == 0);
+		fi_bgq_node_bat_write(node, NULL, FI_BGQ_MU_BAT_ID_GLOBAL, 0);
+
+		rc = fi_bgq_node_bat_allocate_id(node, NULL, FI_BGQ_MU_BAT_ID_COUNTER);
+		assert(rc == 0);
+
+		rc = fi_bgq_node_bat_allocate_id(node, NULL, FI_BGQ_MU_BAT_ID_ZERO);
+		assert(rc == 0);
+
+		rc = fi_bgq_node_bat_allocate_id(node, NULL, FI_BGQ_MU_BAT_ID_ONE);
+		assert(rc == 0);
+
+		rc = fi_bgq_node_bat_allocate_id(node, NULL, FI_BGQ_MU_BAT_ID_BLACKHOLE);
+		assert(rc == 0);
+
+		uint64_t base_paddr = (uint64_t)-1;
+		{
+			void * vaddr = (void *)shared->global_variables;
+
+			Kernel_MemoryRegion_t cnk_mr;
+			Kernel_CreateMemoryRegion(&cnk_mr, vaddr, sizeof(uint64_t)*5);
+			uint64_t offset = (uint64_t)vaddr - (uint64_t)cnk_mr.BaseVa;
+			base_paddr = (uint64_t)cnk_mr.BasePa + offset;
+		}
+
+		shared->global_variables[BAT_VARIABLE_COUNTER] = 0;
+		uint64_t mu_atomic_paddr =
+			MUSPI_GetAtomicAddress(base_paddr + sizeof(uint64_t) * BAT_VARIABLE_COUNTER,
+				MUHWI_ATOMIC_OPCODE_STORE_ADD);
+		fi_bgq_node_bat_write(node, NULL, FI_BGQ_MU_BAT_ID_COUNTER, mu_atomic_paddr);
+
+		shared->global_variables[BAT_VARIABLE_ZERO] = 0;
+		fi_bgq_node_bat_write(node, NULL, FI_BGQ_MU_BAT_ID_ZERO,
+			base_paddr + sizeof(uint64_t) * BAT_VARIABLE_ZERO);
+
+		shared->global_variables[BAT_VARIABLE_ONE] = 1;
+		fi_bgq_node_bat_write(node, NULL, FI_BGQ_MU_BAT_ID_ONE,
+			base_paddr + sizeof(uint64_t) * BAT_VARIABLE_ONE);
+
+		shared->global_variables[BAT_VARIABLE_BLACKHOLE] = 0;
+		fi_bgq_node_bat_write(node, NULL, FI_BGQ_MU_BAT_ID_BLACKHOLE,
+			base_paddr + sizeof(uint64_t) * BAT_VARIABLE_BLACKHOLE);
+
+
+		/* finally, update the shared state to "initialized" */
+		L2_AtomicStore(&shared->is_initialized, 1);
+
+	} else {
+		/* all other processes will wait until the first process
+		 * updates the shared state to "initialized" */
+		while (L2_AtomicLoad(&shared->is_initialized) == 0) {
+			usleep(1);
+		}
+
+		/* clone the counter allocator counter ... <sigh> */
+		node->counter.allocator.value_l2vaddr = (uintptr_t)&shared->counter.allocator_data.value;
+
+		/* clone the lock allocator counter */
+		node->lock.allocator.value_l2vaddr = (uintptr_t)&shared->lock.allocator_data.value;
+
+		/* set the pointer to the shared base address table shadow */
+		node->bat.shadow = &shared->bat_shadow[0];
+
+		l2atomic_barrier_clone(&node->barrier, &shared->barrier_data);
+	}
+
+	node->leader_tcoord = shared->leader_tcoord;
+	node->is_leader = node->leader_tcoord == Kernel_MyTcoord();
+
+	/* get the paddr of the bat counters in l2 atomic shared memory */
+	void * vaddr = (void *)&shared->bat_cntr[0];
+	Kernel_MemoryRegion_t cnk_mr;
+	Kernel_CreateMemoryRegion(&cnk_mr, vaddr, sizeof(uint64_t)*FI_BGQ_NODE_APPLICATION_BAT_SIZE);
+	uint64_t offset = (uint64_t)vaddr - (uint64_t)cnk_mr.BaseVa;
+	uint64_t paddr = (uint64_t)cnk_mr.BasePa + offset;
+	unsigned i;
+	for (i=0; i<FI_BGQ_NODE_APPLICATION_BAT_SIZE; ++i) {
+		node->bat.l2_cntr_paddr[i] = paddr + sizeof(uint64_t)*i;
+	}
+
+	l2atomic_barrier_enter(&node->barrier);
+
+	return 0;
+err:
+	if (_fd != -1) close(_fd);
+	return -errno;
+}
+
+int fi_bgq_node_mu_lock_init (struct fi_bgq_node * node, struct l2atomic_lock * lock) {
+
+	struct fi_bgq_node_shared * shared = (struct fi_bgq_node_shared *) node->shm_ptr;
+
+	/* do not use 'l2atomic_lock_initialize()' because it clears the
+	 * 'ticket' and 'serving' values each time */
+	lock->ticket_l2vaddr = (uintptr_t)&shared->mu.lock_data.ticket;
+	lock->serving_l2vaddr = (uintptr_t)&shared->mu.lock_data.serving;
+
+	return 0;
+}
+
+int fi_bgq_node_counter_allocate (struct fi_bgq_node * node, struct l2atomic_counter * counter) {
+
+	uint64_t index = l2atomic_counter_increment(&node->counter.allocator);
+	if (index == 0x8000000000000000ull)
+		return -1;
+
+	struct fi_bgq_node_shared * shared = (struct fi_bgq_node_shared *) node->shm_ptr;
+
+	counter->value_l2vaddr = (uintptr_t)&shared->counter.counter_data[index].value;
+	l2atomic_counter_set(counter, 0);
+
+	return 0;
+}
+
+int fi_bgq_node_lock_allocate (struct fi_bgq_node * node, struct l2atomic_lock * lock) {
+
+	uint64_t index = l2atomic_counter_increment(&node->lock.allocator);
+	if (index == 0x8000000000000000ull)
+		return -1;
+
+	struct fi_bgq_node_shared * shared = (struct fi_bgq_node_shared *) node->shm_ptr;
+	l2atomic_lock_initialize(lock, &shared->lock.lock_data[index]);
+
+	return 0;
+}
+
+
+void fi_bgq_node_bat_write (struct fi_bgq_node * node, struct l2atomic_lock * lock, uint64_t index, uint64_t offset) {
+
+	assert(index < FI_BGQ_NODE_BAT_SIZE);
+
+	uint32_t requested_bat_id = index & 0x07;
+
+	if (lock) l2atomic_lock_acquire(lock);
+
+	int32_t cnk_rc __attribute__ ((unused));
+	cnk_rc = MUSPI_SetBaseAddress(&node->bat.subgroup[index], requested_bat_id, offset);
+	assert(cnk_rc == 0);
+
+	node->bat.shadow[index] = offset;
+
+	{	/* this "l1p flush" hack is only needed to flush *writes* from a processor cache to the memory system */
+		volatile uint64_t *mu_register =
+			(volatile uint64_t *)(BGQ_MU_STATUS_CONTROL_REGS_START_OFFSET(0, 0) +
+			0x030 - PHYMAP_PRIVILEGEDOFFSET);
+		*mu_register = 0;
+	}
+	ppc_msync();
+
+	if (lock) l2atomic_lock_release(lock);
+}
+
+void fi_bgq_node_bat_clear (struct fi_bgq_node * node, struct l2atomic_lock * lock, uint64_t index) {
+	fi_bgq_node_bat_write(node, lock, index, 0xFFFFFFFFFFFFFFFFull);
+}
+
+
+uint64_t fi_bgq_node_bat_allocate (struct fi_bgq_node * node, struct l2atomic_lock * lock) {
+
+	if (lock) l2atomic_lock_acquire(lock);
+
+	uint32_t subgroup_id;
+	for (subgroup_id = 0; subgroup_id < FI_BGQ_NODE_NUM_USER_SUBGROUPS; ++subgroup_id) {
+
+		uint32_t nbatids;
+		uint32_t batids[BGQ_MU_NUM_DATA_COUNTERS_PER_SUBGROUP];
+		int32_t cnk_rc __attribute__ ((unused));
+		cnk_rc = Kernel_QueryBaseAddressTable(subgroup_id, &nbatids, batids);
+		assert(cnk_rc == 0);
+
+		if (nbatids > 0) {
+
+			uint64_t index = (subgroup_id << 3) | batids[0];
+
+			cnk_rc = Kernel_AllocateBaseAddressTable(subgroup_id,
+				&node->bat.subgroup[index], 1, &batids[0], 0);
+			assert(cnk_rc == 0);
+
+			uint64_t bat_offset __attribute__ ((unused));
+			bat_offset = fi_bgq_node_bat_read(node, index);
+			assert(bat_offset == 0xFFFFFFFFFFFFFFFFull);
+
+			if (lock) l2atomic_lock_release(lock);
+
+			return index;
+		}
+	}
+
+	if (lock) l2atomic_lock_release(lock);
+
+	return 0xFFFFFFFFFFFFFFFFull;	/* error! */
+}
+
+uint64_t fi_bgq_node_bat_allocate_id (struct fi_bgq_node * node, struct l2atomic_lock * lock, uint64_t index) {
+
+	assert(index < FI_BGQ_NODE_BAT_SIZE);
+
+	uint32_t requested_subgroup_id = index >> 3;
+	uint32_t requested_bat_id = index & 0x07;
+
+	if (lock) l2atomic_lock_acquire(lock);
+
+	uint32_t nbatids;
+	uint32_t batids[BGQ_MU_NUM_DATA_COUNTERS_PER_SUBGROUP];
+	int32_t cnk_rc __attribute__ ((unused));
+	cnk_rc = Kernel_QueryBaseAddressTable(requested_subgroup_id, &nbatids, batids);
+	assert(cnk_rc == 0);
+	assert(nbatids > 0);
+
+	unsigned i;
+	for (i=0; i<nbatids; ++i) {
+		if (batids[i] == requested_bat_id) {
+
+			uint64_t index = (requested_subgroup_id << 3) | batids[i];
+
+			cnk_rc = Kernel_AllocateBaseAddressTable(requested_subgroup_id,
+				&node->bat.subgroup[index], 1, &batids[i], 0);
+			assert(cnk_rc == 0);
+
+			uint64_t bat_offset __attribute__ ((unused));
+			bat_offset = fi_bgq_node_bat_read(node, index);
+			assert(bat_offset == 0xFFFFFFFFFFFFFFFFull);
+
+			if (lock) l2atomic_lock_release(lock);
+
+			return 0;
+		}
+	}
+
+	if (lock) l2atomic_lock_release(lock);
+
+	return 0xFFFFFFFFFFFFFFFFull;	/* error! */
+}
+
+void fi_bgq_node_bat_free (struct fi_bgq_node * node, struct l2atomic_lock * lock, uint64_t index) {
+
+	assert(index < FI_BGQ_NODE_APPLICATION_BAT_SIZE);
+
+	if (lock) l2atomic_lock_acquire(lock);
+
+	fi_bgq_node_bat_clear(node, NULL, index);
+
+	uint32_t batid = index & 0x07;
+
+	int32_t cnk_rc  __attribute__ ((unused));
+	cnk_rc = Kernel_DeallocateBaseAddressTable(&node->bat.subgroup[index], 1, &batid);
+	assert(cnk_rc == 0);
+
+	if (lock) l2atomic_lock_release(lock);
+}
diff --git a/prov/bgq/src/fi_bgq_pmi.c b/prov/bgq/src/fi_bgq_pmi.c
new file mode 100644
index 0000000..a9c32f6
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_pmi.c
@@ -0,0 +1,364 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include <stdlib.h>
+
+#define PMI_TRUE			(1)
+#define PMI_FALSE			(0)
+
+#define PMI_SUCCESS			0
+#define PMI_FAIL			-1
+#define PMI_ERR_INIT			1
+#define PMI_ERR_NOMEM			2
+#define PMI_ERR_INVALID_ARG		3
+#define PMI_ERR_INVALID_KEY		4
+#define PMI_ERR_INVALID_KEY_LENGTH	5
+#define PMI_ERR_INVALID_VAL		6
+#define PMI_ERR_INVALID_VAL_LENGTH	7
+#define PMI_ERR_INVALID_LENGTH		8
+#define PMI_ERR_INVALID_NUM_ARGS	9
+#define PMI_ERR_INVALID_ARGS		10
+#define PMI_ERR_INVALID_NUM_PARSED	11
+#define PMI_ERR_INVALID_KEYVALP		12
+#define PMI_ERR_INVALID_SIZE		13
+
+#define BGQ_PMI_NAME_MAXLEN		128
+#define BGQ_PMI_KEY_MAXLEN		128
+#define BGQ_PMI_VALUE_MAXLEN		128
+#define BGQ_SINGLE_ENTRY_NODE_BLOCK_MAX_LEN		16
+
+#include "rdma/bgq/fi_bgq_spi.h"
+
+static inline void node_block_write(char *value, char *current_node_block_value, int current_block_id, int current_node_block_count, int proc_count) {
+	sprintf(current_node_block_value,",(%d,%d,%d)",current_block_id,current_node_block_count,proc_count);
+	strcat(value,current_node_block_value);
+}
+
+static inline void *
+convert_virtual_address_to_global_virtual_address (void * vaddr, size_t len)
+{
+	uint64_t paddr = 0;
+	void * global_vaddr = NULL;
+	uint32_t cnk_rc __attribute__ ((unused));
+
+	Kernel_MemoryRegion_t cnk_mr;
+	cnk_rc = Kernel_CreateMemoryRegion(&cnk_mr, (void *)vaddr, len);
+	assert(cnk_rc == 0);
+
+	paddr = (uint64_t)cnk_mr.BasePa + ((uint64_t)vaddr - (uint64_t)cnk_mr.BaseVa);
+
+	cnk_rc = Kernel_Physical2GlobalVirtual((void *)paddr, &global_vaddr);
+	assert(cnk_rc == 0);
+
+	return global_vaddr;
+}
+
+static int pmi_rank = INT_MAX;
+static int pmi_size = INT_MAX;
+static int pmi_local_size = INT_MAX;
+static int bgq_pmi_value_maxlen;
+static uint32_t my_bgq_rank_node_id;
+
+uint32_t *bgq_node_list;
+
+int PMI_Init (int *spawned)
+{
+	if (!spawned) return PMI_ERR_INVALID_ARG;
+	*spawned = PMI_FALSE;
+
+	if (pmi_rank != INT_MAX) return PMI_FAIL;
+	if (pmi_size != INT_MAX) return PMI_FAIL;
+
+	Personality_t pers;
+	int rc = 0;
+	rc = Kernel_GetPersonality(&pers, sizeof(pers));
+	if (rc) return PMI_FAIL;
+
+	/* calculate the maximum number of ranks from the torus dimensions */
+	Personality_Networks_t *net = &pers.Network_Config;
+	uint32_t max_ranks = net->Anodes * net->Bnodes * net->Cnodes *
+		net->Dnodes * net->Enodes * Kernel_ProcessCount();
+	uint64_t numentries = 0;
+
+	BG_CoordinateMapping_t mapping[max_ranks];
+	rc = Kernel_RanksToCoords(sizeof(mapping), mapping, &numentries);
+	bgq_node_list = (uint32_t *) malloc(sizeof(uint32_t) * max_ranks);
+	uint32_t tcoord32bitmask = 0xFFFFFFC0;
+	uint32_t origcoord;
+
+	/* while populating the rank map also determine how many local ranks on
+	   my node - pmi_local_size */
+	BG_CoordinateMapping_t my_bgq_coords;
+	my_bgq_coords.e = net->Ecoord;
+	my_bgq_coords.reserved = mapping[0].reserved;
+	my_bgq_coords.a = net->Acoord;
+	my_bgq_coords.b = net->Bcoord;
+	my_bgq_coords.c = net->Ccoord;
+	my_bgq_coords.d = net->Dcoord;
+	my_bgq_coords.t = 0;
+
+	memcpy(&my_bgq_rank_node_id,&my_bgq_coords,sizeof(BG_CoordinateMapping_t));
+	pmi_local_size = 0;
+
+	int i;
+	for (i=0;i<numentries;i++) {
+		memcpy(&origcoord, &(mapping[i]),sizeof(BG_CoordinateMapping_t));
+		bgq_node_list[i]  = origcoord & tcoord32bitmask;
+		if (my_bgq_rank_node_id == bgq_node_list[i])
+			pmi_local_size++;
+	}
+	pmi_size = (int) numentries;
+	pmi_rank = (int) Kernel_GetRank();
+	// the largest possible key value is the number of nodes * the space for a node block def
+	bgq_pmi_value_maxlen = net->Anodes * net->Bnodes * net->Cnodes *
+		net->Dnodes * net->Enodes * BGQ_SINGLE_ENTRY_NODE_BLOCK_MAX_LEN;
+	if (bgq_pmi_value_maxlen < BGQ_PMI_VALUE_MAXLEN)
+		bgq_pmi_value_maxlen = BGQ_PMI_VALUE_MAXLEN;
+	return PMI_SUCCESS;
+}
+
+
+int PMI_Initialized (int *initialized)
+{
+	if (!initialized) return PMI_ERR_INVALID_ARG;
+
+	return (pmi_size != INT_MAX && pmi_rank != INT_MAX) ? PMI_TRUE : PMI_FALSE;
+}
+
+
+int PMI_Finalize ()
+{
+	free(bgq_node_list);
+	if (pmi_rank == INT_MAX) return PMI_ERR_INIT;
+	if (pmi_size == INT_MAX) return PMI_ERR_INIT;
+
+	pmi_rank = INT_MAX;
+	pmi_size = INT_MAX;
+	return PMI_SUCCESS;
+}
+
+
+int PMI_Get_size (int *size)
+{
+	if (pmi_size == INT_MAX) return PMI_ERR_INIT;
+
+	if (!size) return PMI_ERR_INVALID_ARG;
+	*size = pmi_size;
+	return PMI_SUCCESS;
+}
+
+
+int PMI_Get_rank (int *rank)
+{
+	if (pmi_rank == INT_MAX) return PMI_ERR_INIT;
+
+	if (!rank) return PMI_ERR_INVALID_ARG;
+	*rank = pmi_rank;
+	return PMI_SUCCESS;
+}
+
+int PMI_Get_universe_size (int *size)
+{
+	return PMI_Get_size(size);
+}
+
+int PMI_Get_appnum (int *appnum)
+{
+	if (pmi_rank == INT_MAX) return PMI_ERR_INIT;
+	if (pmi_size == INT_MAX) return PMI_ERR_INIT;
+
+	if (!appnum) return PMI_ERR_INVALID_ARG;
+	*appnum = 0;
+	return PMI_SUCCESS;
+}
+
+int PMI_Publish_name (const char service_name[], const char port[])
+{
+	return PMI_FAIL;
+}
+
+int PMI_Unpublish_name (const char service_name[])
+{
+	return PMI_FAIL;
+}
+
+int PMI_Lookup_name (const char service_name[], char port[])
+{
+	return PMI_FAIL;
+}
+
+int PMI_Barrier ()
+{
+//	abort();
+//	return PMI_FAIL;
+	return PMI_SUCCESS;
+}
+
+int PMI_Abort (int exit_code, const char error_msg[])
+{
+	abort();
+	return PMI_SUCCESS;
+}
+
+int PMI_KVS_Get_my_name (char kvsname[], int length)
+{
+	/* obtain the name of the keyval space the local process group has access to */
+	kvsname[0] = 0;
+	return PMI_SUCCESS;
+}
+
+int PMI_KVS_Get_name_length_max (int *length)
+{
+	/* obtain the length necessary to store a kvsname */
+	if (!length) return PMI_ERR_INVALID_ARG;
+	*length = BGQ_PMI_NAME_MAXLEN;
+
+	return PMI_SUCCESS;
+}
+
+int PMI_KVS_Get_key_length_max (int *length)
+{
+	/* obtain the length necessary to store a key */
+	if (!length) return PMI_ERR_INVALID_ARG;
+	*length = BGQ_PMI_KEY_MAXLEN;
+
+	return PMI_SUCCESS;
+}
+
+int PMI_KVS_Get_value_length_max (int *length)
+{
+	/* obtain the length necessary to store a value */
+	if (!length) return PMI_ERR_INVALID_ARG;
+	*length = bgq_pmi_value_maxlen;
+
+	return PMI_SUCCESS;
+}
+
+
+int PMI_KVS_Put (const char kvsname[], const char key[], const char value[])
+{
+	/* unimplemented put -- we are not really maintaining a keyval space */
+	return PMI_SUCCESS;
+}
+
+int PMI_KVS_Commit (const char kvsname[])
+{
+	/* unimplemented commit -- we are not really maintaining a keyval space */
+	return PMI_SUCCESS;
+}
+
+int PMI_KVS_Get (const char kvsname[], const char key[], char value[], int length)
+{
+	/* get a key/value pair from a keyval space */
+	if (0 == strncmp(key, "PMI_local_size", 14)) {
+		snprintf(value, length, "%d", pmi_local_size);
+		return PMI_SUCCESS;
+	}
+	else if (0 == strncmp(key, "PMI_process_mapping", 19)) {
+
+		/* Build the pmi node block list from the bgq node list computed
+		   in the PMI_Init. */
+		char current_node_block_value[BGQ_SINGLE_ENTRY_NODE_BLOCK_MAX_LEN*2];
+		strcpy(value,"(vector");
+
+		/* These are the variables holding values written out as a tuple
+		   for a node block. */
+		int current_block_id = 0;
+		int current_proc_count = 0;
+		int prev_proc_count = -1;
+		int current_node_block_count = 1;
+
+		/* This is the current node being analyzed. */
+		uint32_t current_node_id = bgq_node_list[0];
+
+		int i;
+		for (i=0;i<pmi_size;i++) {
+			if (bgq_node_list[i] == current_node_id) {
+				// count the procs on this node
+				current_proc_count++;
+			}
+			else {
+				/* proc counting done for previous node, moving on to next node in the list. */
+				if (current_node_id == bgq_node_list[0]) {
+					/* Special case for first node. */
+					current_node_id = bgq_node_list[i];
+					prev_proc_count = current_proc_count;
+					current_proc_count = 1;
+					current_node_block_count = 1;
+				}
+				else {
+					current_node_id = bgq_node_list[i];
+					if (prev_proc_count == current_proc_count) {
+						/* This node has same number of procs as last node just increment
+						   the node block count. */
+						current_node_block_count++;
+						current_proc_count = 1;
+					}
+					else {
+						/* new node with different proc count than previous - write out the previous
+						   node block and advance to next node. */
+						node_block_write(value, current_node_block_value, current_block_id, current_node_block_count, prev_proc_count);
+						prev_proc_count = current_proc_count;
+						current_proc_count = 1;
+						current_block_id += current_node_block_count;
+						current_node_block_count = 1;
+						current_node_id = bgq_node_list[i];
+					}
+				}
+			}
+		}
+		/* After the bgq node list loop write out last node blocks. */
+		if (current_node_id == bgq_node_list[0]) {
+			/* If only 1 node this is simple. */
+			node_block_write(value, current_node_block_value, current_block_id, 1, current_proc_count);
+		}
+		else {
+			if (prev_proc_count == current_proc_count) {
+				/* Loop ended with last two nodes having equal number of procs. */
+				current_node_block_count++;
+				node_block_write(value, current_node_block_value, current_block_id, current_node_block_count, prev_proc_count);
+			}
+			else {
+				/* Loop ended with last node having different number of procs than
+				   second-to-last node. */
+				node_block_write(value, current_node_block_value, current_block_id, current_node_block_count, prev_proc_count);
+				current_block_id += current_node_block_count;
+				node_block_write(value, current_node_block_value, current_block_id, 1, current_proc_count);
+			}
+		}
+		// add closing bracket to value
+		strcat(value,")");
+		return PMI_SUCCESS;
+	}
+	else
+		return PMI_FAIL;
+
+}
diff --git a/prov/bgq/src/fi_bgq_progress.c b/prov/bgq/src/fi_bgq_progress.c
new file mode 100644
index 0000000..1a8a5b1
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_progress.c
@@ -0,0 +1,384 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include "rdma/bgq/fi_bgq_progress.h"
+#include "rdma/bgq/fi_bgq_rx.h"
+
+/* internal */
+union fi_bgq_progress_data {
+	struct l2atomic_fifo_data	l2atomic;
+	struct {
+		uint64_t		cacheline[16];
+		uint64_t		data[MAX_ENDPOINTS*2];
+	};
+};
+
+/* internal function */
+void update_progress_thread (struct fi_bgq_progress * progress) {
+
+
+	struct l2atomic_fifo_consumer * consumer = &progress->consumer;
+	uint64_t value_rsh3b = 0;
+
+	/* Check if another endpoint should be managed by this progress thread
+	 */
+	if (l2atomic_fifo_consume(consumer, &value_rsh3b) == 0) {
+		struct fi_bgq_ep *bgq_ep = (struct fi_bgq_ep *)(value_rsh3b << 3);
+
+		assert(L2_AtomicLoad(&bgq_ep->async.enabled) != 0);
+		assert(L2_AtomicLoad(&bgq_ep->async.active) == 0);
+
+		progress->all_ep[(progress->all_ep_count)++] = bgq_ep;
+
+		if (bgq_ep->rx.caps & FI_TAGGED) {
+			progress->tag_ep[(progress->tag_ep_count)++] = bgq_ep;
+		}
+		if (bgq_ep->rx.caps & FI_MSG) {
+			progress->msg_ep[(progress->msg_ep_count)++] = bgq_ep;
+		}
+		L2_AtomicStore(&bgq_ep->async.active, 1);
+	}
+
+	/*
+	 * Advance control code path for each endpoint once and check
+	 * each endpoint if async progress is disabled
+	 */
+	unsigned i = 0;
+	while (i < progress->all_ep_count) {
+
+		struct fi_bgq_ep *bgq_ep = progress->all_ep[i];
+		poll_cfifo(bgq_ep, 0);
+
+		if (L2_AtomicLoad(&bgq_ep->async.enabled) == 0) {
+			L2_AtomicStore(&bgq_ep->async.active, 0);
+
+			if (bgq_ep->rx.caps & FI_MSG) {
+				unsigned n = 0;
+				while (progress->msg_ep[n] != bgq_ep) ++n;
+				progress->msg_ep[n] = progress->msg_ep[--(progress->msg_ep_count)];
+			}
+
+			if (bgq_ep->rx.caps & FI_TAGGED) {
+				unsigned n = 0;
+				while (progress->tag_ep[n] != bgq_ep) ++n;
+				progress->tag_ep[n] = progress->tag_ep[--(progress->tag_ep_count)];
+			}
+
+			progress->all_ep[i] = progress->all_ep[--(progress->all_ep_count)];
+		} else {
+			++i;
+		}
+	}
+
+	return;
+}
+
+/* internal function */
+void poll_noinline (struct fi_bgq_ep *bgq_ep, const unsigned poll_msg, const uint64_t cancel_context) {
+
+	poll_mfifo(bgq_ep, poll_msg, cancel_context, 0);
+	poll_rfifo(bgq_ep, 0);
+}
+
+/* internal function */
+void * progress_fn (void *arg) {
+
+	struct fi_bgq_progress * progress = (struct fi_bgq_progress *)arg;
+
+	struct fi_bgq_ep ** tag_ep = progress->tag_ep;
+	struct fi_bgq_ep ** msg_ep = progress->msg_ep;
+	struct fi_bgq_ep ** all_ep = progress->all_ep;
+
+	struct l2atomic_fifo_consumer * consumer = &progress->consumer;
+	struct l2atomic_fifo_producer * producer = &progress->producer;
+	uint64_t value_rsh3b = 0;
+
+	const unsigned tag_loop = 16;
+	const unsigned msg_loop = 4;
+
+	unsigned m, j, i;
+
+	/* first, enable the progress thread control fifo by setting the
+	 * HEAD and TAIL to zero and setting the BOUNDS to FIFO_SIZE-1
+	 */
+	l2atomic_fifo_enable(consumer, producer);
+
+
+	progress->active = 1;
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	while (progress->enabled) {
+
+		/* Advance performance critical code path for each endpoint multiple times */
+
+		const unsigned tag_ep_count = progress->tag_ep_count;
+		const unsigned msg_ep_count = progress->msg_ep_count;
+
+		for (m=0; m<msg_loop; ++m) {
+			for (j=0; j<tag_loop; ++j) {
+				for (i=0; i<tag_ep_count; ++i) {
+					poll_mfifo(tag_ep[i], 0, 0, 0);
+					poll_rfifo(tag_ep[i], 0);
+				}
+			}
+			for (i=0; i<msg_ep_count; ++i) {
+				poll_noinline(msg_ep[i], 1, 0);
+			}
+		}
+
+		update_progress_thread(progress);		
+	}
+
+	/*
+	 * This progress thread has been disabled. Before setting the thread to inactive:
+	 * 1. disable the progress thread control fifo by setting the BOUNDS to zero
+	 * 2. drain the progress thread control fifo of endpoints
+	 * 3. Attempt to transfer any endpoints managed by this progress thread to another progress thread
+	 * 4. If no active progress threads, disable and deactivate remaining endpoints
+	 */
+	l2atomic_fifo_disable(consumer, producer);
+
+	while (0 == l2atomic_fifo_drain(consumer, producer, &value_rsh3b)) {
+		progress->all_ep[(progress->all_ep_count)++] = (struct fi_bgq_ep *)(value_rsh3b << 3);
+	}
+
+	struct fi_bgq_domain *bgq_domain = progress->bgq_domain;
+	const unsigned max_threads = bgq_domain->progress.max_threads;
+
+	for (i=0; i<progress->all_ep_count; ++i) {
+
+		value_rsh3b = ((uint64_t)(all_ep[i])) >> 3;
+
+		unsigned p;
+		for (p=0; p<max_threads; ++p) {
+			if (0 == l2atomic_fifo_produce(&bgq_domain->progress.thread[p].producer, value_rsh3b)) {
+				all_ep[i] = NULL;
+				break;
+			}
+		}
+
+		if (all_ep[i] != NULL) {
+			/* No active progress threads; disable async progress on this endpoint */
+			L2_AtomicStore(&all_ep[i]->async.enabled, 0);
+			L2_AtomicStore(&all_ep[i]->async.active, 0);
+			all_ep[i] = NULL;
+			/* TODO - is this an error or something? */
+		}
+	}
+
+	/* Deactivate this progress thread and exit */
+	progress->active = 0;
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	return NULL;
+};
+
+int fi_bgq_progress_init (struct fi_bgq_domain *bgq_domain, const uint64_t max_threads) {
+
+	assert(max_threads < (64/Kernel_ProcessCount()));
+
+	bgq_domain->progress.max_threads = max_threads;
+	bgq_domain->progress.num_threads_active = 0;
+	bgq_domain->progress.memptr = NULL;
+
+	if (0 == max_threads) return 0;
+
+	size_t i, j;
+
+	const size_t bytes = sizeof(union fi_bgq_progress_data) * max_threads;
+	const size_t alignment = 128;
+
+	void * memptr = malloc(bytes+alignment);
+	uint32_t cnk_rc = 0;
+	cnk_rc = Kernel_L2AtomicsAllocate(memptr, bytes+alignment);
+	assert(0==cnk_rc);
+	if (cnk_rc != 0) {
+		/* Error allocating l2atomic memory */
+		free(memptr);
+		bgq_domain->progress.memptr = NULL;
+		return -1;
+	}
+
+	union fi_bgq_progress_data *data = (union fi_bgq_progress_data *)(((uintptr_t)memptr + alignment) & (~(alignment-1)));
+	const uint64_t npackets = sizeof(data[0].data) / sizeof(uint64_t);
+	const size_t nep = sizeof(bgq_domain->progress.thread[0].tag_ep) / sizeof(struct fi_bgq_ep *);
+	for (i=0; i<max_threads; ++i) {
+		l2atomic_fifo_initialize(&bgq_domain->progress.thread[i].consumer,
+			&bgq_domain->progress.thread[i].producer,
+			&data[i].l2atomic, npackets);
+
+		bgq_domain->progress.thread[i].tag_ep_count = 0;
+		bgq_domain->progress.thread[i].msg_ep_count = 0;
+		bgq_domain->progress.thread[i].all_ep_count = 0;
+		bgq_domain->progress.thread[i].pthread = 0;
+		bgq_domain->progress.thread[i].enabled = 0;
+		bgq_domain->progress.thread[i].active = 0;
+
+		fi_bgq_ref_inc(&bgq_domain->ref_cnt, "domain");
+		bgq_domain->progress.thread[i].bgq_domain = bgq_domain;
+
+		for (j=0; j<nep; ++j) {
+			bgq_domain->progress.thread[i].tag_ep[j] = NULL;
+			bgq_domain->progress.thread[i].msg_ep[j] = NULL;
+			bgq_domain->progress.thread[i].all_ep[j] = NULL;
+		}
+	}
+
+	bgq_domain->progress.memptr = memptr;
+
+	return 0;
+}
+
+int fi_bgq_progress_enable (struct fi_bgq_domain *bgq_domain, const unsigned id) {
+
+	assert(id < (64/Kernel_ProcessCount()-1));
+	assert(id < bgq_domain->progress.max_threads);
+
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_RO);
+	if (bgq_domain->progress.thread[id].enabled) {
+		assert(bgq_domain->progress.thread[id].active);
+		return 0;
+	}
+
+	bgq_domain->progress.thread[id].enabled = 1;
+	bgq_domain->progress.thread[id].active = 0;
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	int rc = 0;
+	rc = pthread_create(&bgq_domain->progress.thread[id].pthread, NULL, progress_fn, (void *)&bgq_domain->progress.thread[id]);
+	if (rc) {
+		/* Error starting this progress thread */
+		bgq_domain->progress.thread[id].enabled = 0;
+		bgq_domain->progress.thread[id].active = 0;
+		return -1;
+	}
+
+	/* Wait until the progress thread is active */
+	while (0 == bgq_domain->progress.thread[id].active) {
+		fi_bgq_msync(FI_BGQ_MSYNC_TYPE_RO);
+	}
+
+	++(bgq_domain->progress.num_threads_active);
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	return 0;
+}
+
+int fi_bgq_progress_disable (struct fi_bgq_domain *bgq_domain, const unsigned id) {
+
+	assert(id < (64/Kernel_ProcessCount()-1));
+	assert(id < bgq_domain->progress.max_threads);
+
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_RO);
+	if (0 == bgq_domain->progress.thread[id].enabled) {
+		assert(0 == bgq_domain->progress.thread[id].active);
+		return 0;
+	}
+
+	bgq_domain->progress.thread[id].enabled = 0;
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	/* Wait until the progress thread is active */
+	while (bgq_domain->progress.thread[id].active) {
+		fi_bgq_msync(FI_BGQ_MSYNC_TYPE_RO);
+	}
+
+	int rc __attribute__ ((unused));
+	void *retval = NULL;
+	rc = pthread_join(bgq_domain->progress.thread[id].pthread, &retval);
+	assert(0 == rc);
+	bgq_domain->progress.thread[id].pthread = 0;
+
+	l2atomic_fifo_disable(&bgq_domain->progress.thread[id].consumer,
+		&bgq_domain->progress.thread[id].producer);
+
+	--(bgq_domain->progress.num_threads_active);
+
+	return 0;
+}
+
+int fi_bgq_progress_fini (struct fi_bgq_domain *bgq_domain) {
+
+	assert(0==bgq_domain->progress.num_threads_active);
+
+	int i;
+	for (i=0; i<bgq_domain->progress.max_threads; ++i) {
+		assert(0 == bgq_domain->progress.thread[i].enabled);
+		assert(0 == bgq_domain->progress.thread[i].active);
+		//l2atomic_fifo_finalize(&bgq_domain->progress.thread[i].consumer,
+		//	&bgq_domain->progress.thread[i].producer);
+		bgq_domain->progress.thread[i].bgq_domain = NULL;
+		fi_bgq_ref_dec(&bgq_domain->ref_cnt, "domain");
+	}
+
+	free(bgq_domain->progress.memptr);
+	bgq_domain->progress.memptr = NULL;
+
+	return 0;
+}
+
+int fi_bgq_progress_ep_enable (struct fi_bgq_progress *thread, struct fi_bgq_ep *bgq_ep) {
+
+	bgq_ep->async.active = 0;
+	bgq_ep->async.enabled = 1;
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	uint64_t value_rsh3b = ((uint64_t)bgq_ep) >> 3;
+	if (0 == l2atomic_fifo_produce(&thread->producer, value_rsh3b)) {
+
+		/* Wait until async progress on the endpoint is activated */
+		while (0 == bgq_ep->async.active) {
+			fi_bgq_msync(FI_BGQ_MSYNC_TYPE_RW);
+		}
+
+	} else {
+
+		/* "fifo is full" means that the progress thread has been disabled */
+		assert(0);
+		return -1;
+	}
+
+	return 0;
+}
+
+int fi_bgq_progress_ep_disable (struct fi_bgq_ep *bgq_ep) {
+
+	bgq_ep->async.enabled = 0;
+	fi_bgq_msync(FI_BGQ_MSYNC_TYPE_WO);
+
+	/* Wait until async progress on the endpoint is deactivated */
+	while (0 != bgq_ep->async.active) {
+		fi_bgq_msync(FI_BGQ_MSYNC_TYPE_RO);
+	}
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_rma.c b/prov/bgq/src/fi_bgq_rma.c
new file mode 100644
index 0000000..86065bf
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_rma.c
@@ -0,0 +1,257 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+#include <fi_enosys.h>
+#include <errno.h>
+
+/* "FI_BGQ_RMA_SPECIALIZED_FUNC(0)" is already declared via FABRIC_DIRECT */
+FI_BGQ_RMA_SPECIALIZED_FUNC(1)
+
+#define FI_BGQ_RMA_OPS_STRUCT_NAME(LOCK)			\
+	fi_bgq_ops_rma_ ## LOCK
+
+#define FI_BGQ_RMA_OPS_STRUCT(LOCK)				\
+static struct fi_ops_rma					\
+	FI_BGQ_RMA_OPS_STRUCT_NAME(LOCK) = {			\
+	.size	= sizeof(struct fi_ops_rma),			\
+	.read	= FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(read, LOCK),	\
+	.readv	= fi_no_rma_readv,				\
+	.readmsg = FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(readmsg,	\
+			LOCK),					\
+	.write	= FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(write,	\
+			LOCK),					\
+	.inject = FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(inject_write,\
+			LOCK),					\
+	.writev = FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(writev,	\
+			LOCK),					\
+	.writemsg = FI_BGQ_RMA_SPECIALIZED_FUNC_NAME(writemsg,	\
+			LOCK),					\
+	.writedata = fi_no_rma_writedata,			\
+}
+
+FI_BGQ_RMA_OPS_STRUCT(0);
+FI_BGQ_RMA_OPS_STRUCT(1);
+
+static inline ssize_t fi_bgq_rma_read(struct fid_ep *ep,
+		void *buf, size_t len, void *desc,
+		fi_addr_t src_addr, uint64_t addr,
+		uint64_t key, void *context)
+{
+	int lock_required;
+	struct fi_bgq_ep *bgq_ep;
+
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+	switch (bgq_ep->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	return fi_bgq_read_generic(ep, buf, len, desc, src_addr,
+			addr, key, context, lock_required);
+}
+
+static inline ssize_t fi_bgq_rma_readmsg(struct fid_ep *ep,
+		const struct fi_msg_rma *msg, uint64_t flags)
+{
+	int lock_required;
+	struct fi_bgq_ep *bgq_ep;
+
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+	switch (bgq_ep->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	return fi_bgq_readmsg_generic(ep, msg, flags,
+			lock_required);
+}
+
+static inline ssize_t fi_bgq_rma_inject_write(struct fid_ep *ep,
+		const void *buf, size_t len,
+		fi_addr_t dst_addr, uint64_t addr, uint64_t key)
+{
+	int lock_required;
+	struct fi_bgq_ep *bgq_ep;
+
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+	switch (bgq_ep->threading) {
+		case FI_THREAD_ENDPOINT:
+		case FI_THREAD_DOMAIN:
+			lock_required = 0;
+		default:
+			lock_required = 1;
+	}
+
+	return fi_bgq_inject_write_generic(ep, buf, len, dst_addr,
+			addr, key, lock_required);
+}
+
+static inline ssize_t fi_bgq_rma_write(struct fid_ep *ep,
+		const void *buf, size_t len, void *desc,
+		fi_addr_t dst_addr, uint64_t addr,
+		uint64_t key, void *context)
+{
+	int lock_required;
+	struct fi_bgq_ep *bgq_ep;
+
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+	switch (bgq_ep->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	return fi_bgq_write_generic(ep, buf, len, desc, dst_addr,
+			addr, key, context, lock_required);
+}
+
+static inline ssize_t fi_bgq_rma_writev(struct fid_ep *ep,
+		const struct iovec *iov, void **desc,
+		size_t count, fi_addr_t dest_addr, uint64_t addr,
+		uint64_t key, void *context)
+{
+	int lock_required;
+	struct fi_bgq_ep *bgq_ep;
+
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+	switch (bgq_ep->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	return fi_bgq_writev_generic(ep, iov, desc, count, dest_addr, addr,
+			key, context, lock_required);
+}
+
+static inline ssize_t fi_bgq_rma_writemsg(struct fid_ep *ep,
+		const struct fi_msg_rma *msg, uint64_t flags)
+{
+	int lock_required;
+	struct fi_bgq_ep *bgq_ep;
+
+	bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+
+	switch (bgq_ep->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+		lock_required = 0;
+	default:
+		lock_required = 1;
+	}
+
+	return fi_bgq_writemsg_generic(ep, msg, flags,
+			lock_required);
+}
+
+static struct fi_ops_rma fi_bgq_ops_rma_default = {
+	.size		= sizeof(struct fi_ops_rma),
+	.read		= fi_bgq_rma_read,
+	.readv		= fi_no_rma_readv,
+	.readmsg	= fi_bgq_rma_readmsg,
+	.write		= fi_bgq_rma_write,
+	.inject		= fi_bgq_rma_inject_write,
+	.writev		= fi_bgq_rma_writev,
+	.writemsg	= fi_bgq_rma_writemsg,
+	.writedata	= fi_no_rma_writedata,
+};
+
+int fi_bgq_init_rma_ops(struct fi_bgq_ep *bgq_ep, struct fi_info *info)
+{
+	if (!bgq_ep || !info) {
+		errno = FI_EINVAL;
+		goto err;
+	}
+
+	return 0;
+err:
+	return -errno;
+}
+
+int fi_bgq_enable_rma_ops(struct fi_bgq_ep *bgq_ep)
+{
+	if (!bgq_ep || !bgq_ep->domain) {
+		errno = FI_EINVAL;
+		goto err;
+	}
+
+	if (!(bgq_ep->tx.caps & FI_RMA)) {
+		/* rma ops not enabled on this endpoint */
+		return 0;
+	}
+
+	switch (bgq_ep->domain->threading) {
+	case FI_THREAD_ENDPOINT:
+	case FI_THREAD_DOMAIN:
+	case FI_THREAD_COMPLETION:
+		bgq_ep->ep_fid.rma = &FI_BGQ_RMA_OPS_STRUCT_NAME(0);
+		break;
+	case FI_THREAD_FID:
+	case FI_THREAD_UNSPEC:
+	case FI_THREAD_SAFE:
+		bgq_ep->ep_fid.rma = &FI_BGQ_RMA_OPS_STRUCT_NAME(1);
+		break;
+	default:
+		/*bgq_ep->ep_fid.rma = &fi_bgq_ops_rma_default;*/
+		errno = FI_EINVAL;
+		goto err;
+	}
+
+
+	return 0;
+err:
+	return -errno;
+}
+
+int fi_bgq_finalize_rma_ops(struct fi_bgq_ep *bgq_ep)
+{
+	if (!bgq_ep) {
+		return 0;
+	}
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_sep.c b/prov/bgq/src/fi_bgq_sep.c
new file mode 100644
index 0000000..bdbe47a
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_sep.c
@@ -0,0 +1,456 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+
+#include <fi.h>
+#include <fi_enosys.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <errno.h>
+#include <unistd.h>
+#include <limits.h>
+
+/* forward declaration */
+int fi_bgq_endpoint_rx_tx (struct fid_domain *dom, struct fi_info *info,
+		struct fid_ep **ep, void *context, const int rx_index, const int tx_index);
+
+static int fi_bgq_close_sep(fid_t fid)
+{
+	int ret;
+	struct fi_bgq_sep *bgq_sep = container_of(fid, struct fi_bgq_sep, ep_fid);
+
+	ret = fi_bgq_fid_check(fid, FI_CLASS_SEP, "scalable endpoint");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_dec(&bgq_sep->av->ref_cnt, "address vector");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_finalize(&bgq_sep->ref_cnt, "scalable endpoint");
+	if (ret)
+		return ret;
+
+	ret = fi_bgq_ref_dec(&bgq_sep->domain->ref_cnt, "domain");
+	if (ret)
+		return ret;
+
+	free(bgq_sep->info->ep_attr);
+	free(bgq_sep->info);
+	void * memptr = bgq_sep->memptr;
+	free(memptr);
+
+	return 0;
+}
+
+static int fi_bgq_control_sep(fid_t fid, int command, void *arg)
+{
+	struct fid_ep *ep __attribute__ ((unused));
+	ep = container_of(fid, struct fid_ep, fid);
+	return 0;
+}
+
+static int fi_bgq_tx_ctx(struct fid_ep *sep, int index,
+			struct fi_tx_attr *attr, struct fid_ep **tx_ep,
+			void *context)
+{
+	int ret;
+	struct fi_info info = {0};
+	struct fi_tx_attr tx_attr = {0};
+	struct fi_ep_attr ep_attr = {0};
+	struct fi_domain_attr dom_attr = {0};
+	struct fi_fabric_attr fab_attr = {0};
+	struct fi_bgq_sep *bgq_sep;
+	struct fi_bgq_ep  *bgq_tx_ep;
+
+	if (!sep || !attr || !tx_ep) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	bgq_sep = container_of(sep, struct fi_bgq_sep, ep_fid);
+
+	uint64_t caps = attr->caps;	/* TODO - "By default, a transmit context inherits the properties of its associated endpoint. However, applications may request context specific attributes through the attr parameter." */
+
+	if ((caps & FI_MSG || caps & FI_TAGGED) && (caps & FI_RECV)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"FI_MSG|FI_TAGGED with FI_RECV capability specified for a TX context\n");
+		caps &= ~FI_RECV;
+	}
+
+	if ((caps & FI_RMA || caps & FI_ATOMIC) && (caps & FI_REMOTE_READ || caps & FI_REMOTE_WRITE)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"FI_RMA|FI_ATOMIC with FI_REMOTE_READ|FI_REMOTE_WRITE capability specified for a TX context\n");
+		caps &= ~FI_REMOTE_READ;
+		caps &= ~FI_REMOTE_WRITE;
+	}
+
+	if (caps & FI_MSG || caps & FI_TAGGED) {
+		caps |= FI_SEND;
+	}
+
+	if (caps & FI_RMA || caps & FI_ATOMIC) {
+		caps |= FI_READ;
+		caps |= FI_WRITE;
+	}
+
+	if (ofi_recv_allowed(caps) || ofi_rma_target_allowed(caps)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"RX capabilities specified for TX context\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (!ofi_send_allowed(caps) && !ofi_rma_initiate_allowed(caps)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"TX capabilities not specified for TX context\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (bgq_sep->domain->tx.count >= fi_bgq_domain_get_tx_max(bgq_sep->domain)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"TX ctx count exceeded (max %lu, created %lu)\n",
+				fi_bgq_domain_get_tx_max(bgq_sep->domain), bgq_sep->domain->tx.count);
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	info.caps = caps;
+	info.mode = attr->mode;
+
+	info.tx_attr = &tx_attr;
+	memcpy(info.tx_attr, attr, sizeof(*info.tx_attr));
+
+	info.ep_attr = &ep_attr;
+	memcpy(info.ep_attr, bgq_sep->info->ep_attr, sizeof(*info.ep_attr));
+
+	info.domain_attr = &dom_attr;
+	memcpy(info.domain_attr, bgq_sep->info->domain_attr, sizeof(*info.domain_attr));
+
+	info.fabric_attr = &fab_attr;
+	memcpy(info.fabric_attr, bgq_sep->info->fabric_attr, sizeof(*info.fabric_attr));
+
+	ret = fi_bgq_endpoint_rx_tx((struct fid_domain *)bgq_sep->domain,
+		&info, tx_ep, context, -1, index);
+	if (ret) {
+		goto err;
+	}
+
+	bgq_tx_ep = container_of(*tx_ep, struct fi_bgq_ep, ep_fid);
+	bgq_tx_ep->ep_fid.fid.fclass = FI_CLASS_TX_CTX;
+
+	bgq_tx_ep->av = bgq_sep->av;
+	fi_bgq_ref_inc(&bgq_tx_ep->av->ref_cnt, "address vector");
+
+	bgq_tx_ep->sep = container_of(sep, struct fi_bgq_sep, ep_fid);
+
+	++ bgq_sep->domain->tx.count;
+
+	fi_bgq_ref_inc(&bgq_sep->ref_cnt, "scalable endpoint");
+
+	attr->caps = caps;
+
+	return 0;
+
+err:
+	return -errno;
+}
+
+static int fi_bgq_rx_ctx(struct fid_ep *sep, int index,
+			struct fi_rx_attr *attr, struct fid_ep **rx_ep,
+			void *context)
+{
+	int ret;
+	struct fi_info info = {0};
+	struct fi_bgq_sep *bgq_sep;
+	struct fi_bgq_ep  *bgq_rx_ep;
+
+	if (!sep || !attr || !rx_ep) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	bgq_sep = container_of(sep, struct fi_bgq_sep, ep_fid);
+
+	uint64_t caps = attr->caps;	/* TODO - "By default, a receive context inherits the properties of its associated endpoint. However, applications may request context specific attributes through the attr parameter." */
+
+	if ((caps & FI_MSG || caps & FI_TAGGED) && (caps & FI_SEND)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"FI_MSG|FI_TAGGED with FI_SEND capability specified for a RX context\n");
+		caps &= ~FI_SEND;
+	}
+
+	if ((caps & FI_RMA || caps & FI_ATOMIC) && (caps & FI_READ || caps & FI_WRITE)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"FI_RMA|FI_ATOMIC with FI_READ|FI_WRITE capability specified for a RX context\n");
+		caps &= ~FI_READ;
+		caps &= ~FI_WRITE;
+	}
+
+	if (caps & FI_MSG || caps & FI_TAGGED) {
+		caps |= FI_RECV;
+	}
+
+	if (caps & FI_RMA || caps & FI_ATOMIC) {
+		caps |= FI_REMOTE_READ;
+		caps |= FI_REMOTE_WRITE;
+	}
+
+	if (ofi_send_allowed(caps) || ofi_rma_initiate_allowed(caps)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"TX capabilities specified for RX context\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (!ofi_recv_allowed(caps) && !ofi_rma_target_allowed(caps)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"RX capabilities not specified for RX context\n");
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	if (bgq_sep->domain->rx.count >= fi_bgq_domain_get_rx_max(bgq_sep->domain)) {
+		FI_LOG(fi_bgq_global.prov, FI_LOG_DEBUG, FI_LOG_DOMAIN,
+				"RX ctx count exceeded (max %lu, created %lu)\n",
+				fi_bgq_domain_get_rx_max(bgq_sep->domain), bgq_sep->domain->rx.count);
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	info.caps = caps;
+	info.mode = attr->mode;
+
+	info.rx_attr = calloc(1, sizeof(*info.rx_attr));
+	if (!info.rx_attr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+
+	info.rx_attr->caps     = caps;
+	info.rx_attr->mode     = attr->mode;
+	info.rx_attr->op_flags = attr->op_flags;
+	info.rx_attr->msg_order = attr->msg_order;
+	info.rx_attr->total_buffered_recv = attr->total_buffered_recv;
+	info.rx_attr->iov_limit = attr->iov_limit;
+
+	info.ep_attr = calloc(1, sizeof(*info.ep_attr));
+	if (!info.ep_attr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	memcpy(info.ep_attr, bgq_sep->info->ep_attr,
+			sizeof(*info.ep_attr));
+
+	info.domain_attr = calloc(1, sizeof(*info.domain_attr));
+	if (!info.domain_attr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	memcpy(info.domain_attr, bgq_sep->info->domain_attr,
+			sizeof(*info.domain_attr));
+
+	info.fabric_attr = calloc(1, sizeof(*info.fabric_attr));
+	if (!info.fabric_attr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	memcpy(info.fabric_attr, bgq_sep->info->fabric_attr,
+			sizeof(*info.fabric_attr));
+
+	ret = fi_bgq_endpoint_rx_tx(&bgq_sep->domain->domain_fid, &info,
+			rx_ep, context, index, -1);
+	if (ret) {
+		goto err;
+	}
+
+	bgq_rx_ep = container_of(*rx_ep, struct fi_bgq_ep, ep_fid);
+	bgq_rx_ep->ep_fid.fid.fclass = FI_CLASS_RX_CTX;
+
+	bgq_rx_ep->sep = container_of(sep, struct fi_bgq_sep, ep_fid);
+
+	bgq_rx_ep->av = bgq_sep->av;
+	fi_bgq_ref_inc(&bgq_rx_ep->av->ref_cnt, "address vector");
+
+	++ bgq_sep->domain->rx.count;
+
+	fi_bgq_ref_inc(&bgq_sep->ref_cnt, "scalable endpoint");
+
+	return 0;
+
+err:
+	if (info.fabric_attr)
+		free(info.fabric_attr);
+	if (info.domain_attr)
+		free(info.domain_attr);
+	if (info.ep_attr)
+		free(info.ep_attr);
+	if (info.tx_attr)
+		free(info.tx_attr);
+	return -errno;
+}
+
+static int fi_bgq_bind_sep(struct fid *fid, struct fid *bfid,
+		uint64_t flags)
+{
+	int ret = 0;
+	struct fi_bgq_sep *bgq_sep = container_of(fid, struct fi_bgq_sep, ep_fid);
+	struct fi_bgq_av *bgq_av;
+
+	if (!fid || !bfid) {
+		errno = FI_EINVAL;
+		return -errno;
+	}
+
+	switch (bfid->fclass) {
+	case FI_CLASS_AV:
+		bgq_av = container_of(bfid, struct fi_bgq_av, av_fid);
+		fi_bgq_ref_inc(&bgq_av->ref_cnt, "address vector");
+		bgq_sep->av = bgq_av;
+		break;
+	default:
+		errno = FI_ENOSYS;
+		return -errno;
+	}
+
+	return ret;
+}
+
+static struct fi_ops fi_bgq_fi_ops = {
+	.size		= sizeof(struct fi_ops),
+	.close		= fi_bgq_close_sep,
+	.bind		= fi_bgq_bind_sep,
+	.control	= fi_bgq_control_sep,
+	.ops_open	= fi_no_ops_open
+};
+
+static struct fi_ops_ep fi_bgq_sep_ops = {
+	.size		= sizeof(struct fi_ops_ep),
+	.cancel		= fi_no_cancel,
+	.getopt		= fi_no_getopt,
+	.setopt		= fi_no_setopt,
+	.tx_ctx		= fi_bgq_tx_ctx,
+	.rx_ctx		= fi_bgq_rx_ctx,
+	.rx_size_left   = fi_no_rx_size_left,
+	.tx_size_left   = fi_no_tx_size_left
+};
+
+int fi_bgq_scalable_ep (struct fid_domain *domain,
+	struct fi_info *info,
+	struct fid_ep **sep,
+	void *context)
+{
+	struct fi_bgq_sep *bgq_sep = NULL;
+
+	if (!info || !domain) {
+		errno = FI_EINVAL;
+		goto err;
+	}
+
+	void * memptr = NULL;
+	memptr = malloc(sizeof(struct fi_bgq_sep)+L2_CACHE_LINE_SIZE);
+	if (!memptr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	memset(memptr, 0, sizeof(struct fi_bgq_sep)+L2_CACHE_LINE_SIZE);
+	bgq_sep = (struct fi_bgq_sep *)(((uintptr_t)memptr+L2_CACHE_LINE_SIZE) & ~(L2_CACHE_LINE_SIZE-1));
+	bgq_sep->memptr = memptr;
+	memptr = NULL;
+
+	bgq_sep->domain = (struct fi_bgq_domain *) domain;
+
+	bgq_sep->ep_fid.fid.fclass	= FI_CLASS_SEP;
+	bgq_sep->ep_fid.fid.context	= context;
+	bgq_sep->ep_fid.fid.ops		= &fi_bgq_fi_ops;
+	bgq_sep->ep_fid.ops		= &fi_bgq_sep_ops;
+
+	bgq_sep->info = calloc(1, sizeof (struct fi_info));
+	if (!bgq_sep->info) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	memcpy(bgq_sep->info, info, sizeof (struct fi_info));
+	bgq_sep->info->next = NULL;
+	bgq_sep->info->ep_attr = calloc(1, sizeof(struct fi_ep_attr));
+	if (!bgq_sep->info->ep_attr) {
+		errno = FI_ENOMEM;
+		goto err;
+	}
+	memcpy(bgq_sep->info->ep_attr, info->ep_attr, sizeof(struct fi_ep_attr));
+
+	/*
+	 * fi_endpoint.3
+	 *
+	 * "tx_ctx_cnt - Transmit Context Count
+	 * 	Number of transmit contexts to associate with the endpoint. If
+	 * 	not specified (0), 1 context will be assigned if the endpoint
+	 * 	supports outbound transfers."
+	 */
+	if (0 == bgq_sep->info->ep_attr->tx_ctx_cnt) {
+		bgq_sep->info->ep_attr->tx_ctx_cnt = 1;
+	}
+
+	/*
+	 * fi_endpoint.3
+	 *
+	 * "rx_ctx_cnt - Receive Context Count
+	 * 	Number of receive contexts to associate with the endpoint. If
+	 * 	not specified, 1 context will be assigned if the endpoint
+	 * 	supports inbound transfers."
+	 */
+	if (0 == bgq_sep->info->ep_attr->rx_ctx_cnt) {
+		bgq_sep->info->ep_attr->rx_ctx_cnt = 1;
+	}
+
+	fi_bgq_ref_init(&bgq_sep->domain->fabric->node, &bgq_sep->ref_cnt, "scalable endpoint");
+	fi_bgq_ref_inc(&bgq_sep->domain->ref_cnt, "domain");
+
+	*sep = &bgq_sep->ep_fid;
+
+	return 0;
+err:
+	if (bgq_sep) {
+		if (bgq_sep->info) {
+			if (bgq_sep->info->ep_attr)
+				free(bgq_sep->info->ep_attr);
+			free(bgq_sep->info);
+		}
+		memptr = bgq_sep->memptr;
+		free(memptr);
+	}
+	return -errno;
+}
diff --git a/prov/bgq/src/fi_bgq_spi.c b/prov/bgq/src/fi_bgq_spi.c
new file mode 100644
index 0000000..0c2feb5
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_spi.c
@@ -0,0 +1,211 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "rdma/bgq/fi_bgq_spi.h"
+
+#include <stdlib.h>
+
+/* internal function */
+int fi_bgq_spi_injfifo_subgrp_init (struct fi_bgq_spi_injfifo *f,
+		MUSPI_InjFifoSubGroup_t *subgrp,
+		unsigned num_fifos_to_allocate,
+		const size_t injfifo_size,
+		const unsigned immediate_payload_sizeof,
+		const unsigned is_remote_get,
+		const int subgrp_id) {
+
+	assert(num_fifos_to_allocate > 0);
+	assert(is_remote_get == 0 || is_remote_get == 1);
+
+	uint32_t available;
+	uint32_t fifo_ids[BGQ_MU_NUM_INJ_FIFOS_PER_SUBGROUP];
+	Kernel_MemoryRegion_t mregion;
+	int rc = 0;
+
+	memset((void*)f, 0x00, sizeof(*f));
+	f->node_scoped_fifo_id = ~(0ull);
+
+	Kernel_InjFifoAttributes_t attr;
+	memset(&attr, 0x00, sizeof(attr));
+	attr.RemoteGet = is_remote_get;
+	attr.System = 0;
+
+	rc = Kernel_QueryInjFifos(subgrp_id, &available, fifo_ids);
+	if (rc) {
+		goto err;
+	}
+	if (!available) {
+		return 0;
+	}
+
+	uint32_t subgrp_fifo_id = fifo_ids[0];
+
+	if ((rc = Kernel_AllocateInjFifos(subgrp_id,
+			subgrp,
+			1,
+			&subgrp_fifo_id,
+			&attr)) != 0) {
+		goto err;
+	}
+
+	size_t bytes = injfifo_size * sizeof(MUHWI_Descriptor_t);
+	if (posix_memalign((void**) &f->memory, 64, bytes + 64 /* force alignment */)) {
+		errno = ENOMEM;
+		goto err;
+	}
+
+	/* FORCE a 64-byte alignment (?!?!) */
+	void * injfifo_memory = (void *)(((uintptr_t)f->memory+64) & (~63));
+
+	if (Kernel_CreateMemoryRegion(&mregion, injfifo_memory, bytes)) {
+		goto err;
+	}
+
+	if (Kernel_InjFifoInit(subgrp, subgrp_fifo_id, &mregion,
+			(uint64_t)injfifo_memory - (uint64_t)mregion.BaseVa,
+			bytes-1)) {
+		goto err;
+	}
+
+	if (Kernel_InjFifoActivate(subgrp, 1, &subgrp_fifo_id,
+			KERNEL_INJ_FIFO_ACTIVATE)) {
+		goto err;
+	}
+
+	f->muspi_injfifo = MUSPI_IdToInjFifo(subgrp_fifo_id, subgrp);
+	f->sw_freeSpace = &f->muspi_injfifo->freeSpace;
+	f->sw_tailva = (uint64_t*)&f->muspi_injfifo->_fifo.va_tail;
+	f->hw_injfifo = f->muspi_injfifo->hw_injfifo;
+	f->node_scoped_fifo_id = subgrp_id * BGQ_MU_NUM_INJ_FIFO_SUBGROUPS + subgrp_fifo_id;
+
+
+	if (!is_remote_get && immediate_payload_sizeof > 0) {
+
+		f->immediate_payload_sizeof = immediate_payload_sizeof;
+
+		bytes = injfifo_size * immediate_payload_sizeof;
+		if (posix_memalign((void**) &f->immediate_payload_memory, 64, bytes + 64 /* force alignment */)) {
+			errno = ENOMEM;
+			goto err;
+		}
+
+		/* FORCE a 64-byte alignment (?!?!) */
+		f->immediate_payload_base_vaddr = (uintptr_t)f->immediate_payload_memory & ~63ull;
+
+		Kernel_MemoryRegion_t cnk_mr;
+		uint32_t cnk_rc = 0;
+		cnk_rc = Kernel_CreateMemoryRegion(&cnk_mr, (void*)f->immediate_payload_base_vaddr, bytes);
+		if (cnk_rc) {
+			goto err;
+		}
+
+		f->immediate_payload_base_paddr =
+			(uint64_t)cnk_mr.BasePa +
+			((uint64_t)f->immediate_payload_base_vaddr - (uint64_t)cnk_mr.BaseVa);
+
+		f->va_start = (uintptr_t)f->muspi_injfifo->_fifo.va_start;
+
+	}
+
+	return 1;
+err:
+
+	if (f->memory) free(f->memory);
+	if (f->immediate_payload_memory) free(f->immediate_payload_memory);
+	memset((void*)f, 0x00, sizeof(*f));
+	f->node_scoped_fifo_id = ~(0ull);
+	return 0;
+}
+
+int fi_bgq_spi_injfifo_init (struct fi_bgq_spi_injfifo *f,
+		MUSPI_InjFifoSubGroup_t *injfifo_subgroup,
+		unsigned num_fifos_to_allocate,
+		const size_t injfifo_size,
+		const unsigned immediate_payload_sizeof,
+		const unsigned is_remote_get,
+		const unsigned is_top_down) {
+
+	assert(num_fifos_to_allocate > 0);
+	assert(is_top_down == 0 || is_top_down == 1);
+
+	int subgrp_id;
+
+	unsigned n, total_fifos_allocated = 0;
+	if (is_top_down) {
+		for (subgrp_id = BGQ_MU_NUM_FIFO_SUBGROUPS_PER_NODE-BGQ_MU_NUM_FIFO_SUBGROUPS-1; (subgrp_id >= 0) && (num_fifos_to_allocate > 0); --subgrp_id) {
+			n = fi_bgq_spi_injfifo_subgrp_init(f,
+				injfifo_subgroup,
+				num_fifos_to_allocate,
+				injfifo_size,
+				immediate_payload_sizeof,
+				is_remote_get,
+				subgrp_id);
+			num_fifos_to_allocate -= n;
+			total_fifos_allocated += n;
+		}
+	} else {
+		for (subgrp_id = 0; (subgrp_id < (BGQ_MU_NUM_FIFO_SUBGROUPS_PER_NODE-BGQ_MU_NUM_FIFO_SUBGROUPS)) && (num_fifos_to_allocate > 0); ++subgrp_id) {
+			n = fi_bgq_spi_injfifo_subgrp_init(f,
+				injfifo_subgroup,
+				num_fifos_to_allocate,
+				injfifo_size,
+				immediate_payload_sizeof,
+				is_remote_get,
+				subgrp_id);
+			num_fifos_to_allocate -= n;
+			total_fifos_allocated += n;
+		}
+	}
+
+	return total_fifos_allocated;
+}
+
+void fi_bgq_spi_injfifo_clone (struct fi_bgq_spi_injfifo *dst, struct fi_bgq_spi_injfifo *src) {
+
+	assert(dst);
+	assert(src);
+
+	/* TODO - set an "is clone" variable to remeber not to free this */
+	*dst = *src;
+}
+
+int fi_bgq_spi_injfifo_fini (struct fi_bgq_spi_injfifo *f) {
+
+	/* TODO ..... */
+
+	if (f->memory) free(f->memory);
+	if (f->immediate_payload_memory) free(f->immediate_payload_memory);
+	memset((void*)f, 0x00, sizeof(*f));
+	f->node_scoped_fifo_id = ~(0ull);
+
+	return 0;
+}
diff --git a/prov/bgq/src/fi_bgq_tagged.c b/prov/bgq/src/fi_bgq_tagged.c
new file mode 100644
index 0000000..13c291a
--- /dev/null
+++ b/prov/bgq/src/fi_bgq_tagged.c
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "rdma/bgq/fi_bgq.h"
+
+#include <fi_enosys.h>
+
+ssize_t fi_bgq_trecvmsg(struct fid_ep *ep,
+		const struct fi_msg_tagged *msg, uint64_t flags)
+{
+	struct fi_bgq_ep * bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+	const enum fi_threading threading = bgq_ep->domain->threading;
+	const int lock_required =
+		(threading == FI_THREAD_FID) ||
+		(threading == FI_THREAD_UNSPEC) ||
+		(threading == FI_THREAD_SAFE);
+
+	return fi_bgq_trecvmsg_generic(ep, msg, flags, lock_required);
+}
+
+ssize_t fi_bgq_tsendmsg(struct fid_ep *ep,
+		const struct fi_msg_tagged *msg, uint64_t flags)
+{
+	const size_t niov = msg->iov_count;
+
+	if (niov > 32) {
+
+		/* ---------------------------------------------------------
+		 * a single torus packet payload can only transfer 32
+		 * 'struct fi_bgq_mu_iov' elements - this is the current
+		 * limit for non-contiguous rendezvous operations
+		 *
+		 * TODO - support >32 iov elements?
+		 * --------------------------------------------------------- */
+		return -FI_EINVAL;
+
+	} else {
+
+		struct fi_bgq_ep * bgq_ep = container_of(ep, struct fi_bgq_ep, ep_fid);
+		const enum fi_threading threading = bgq_ep->threading;
+
+		return fi_bgq_send_generic_flags(ep, msg->msg_iov, niov,
+			msg->desc, msg->addr, msg->tag, msg->context, msg->data,
+			(threading != FI_THREAD_ENDPOINT && threading != FI_THREAD_DOMAIN),
+			0 /* is_msg */,
+			0 /* is_contiguous */,
+			1 /* override flags */,
+			flags);
+	}
+}
+
+ssize_t fi_bgq_tsenddata(struct fid_ep *ep, const void *buf, size_t len,
+		void *desc, uint64_t data, fi_addr_t dest_addr, uint64_t tag,
+		void *context)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+/* "FI_BGQ_TAGGED_SPECIALIZED_FUNC(0)" is already declared via FABRIC_DIRECT */
+FI_BGQ_TAGGED_SPECIALIZED_FUNC(1)
+
+#define FI_BGQ_TAGGED_OPS_STRUCT_NAME(LOCK)				\
+	fi_bgq_ops_tagged_ ## LOCK
+
+#define FI_BGQ_TAGGED_OPS_STRUCT(LOCK)					\
+static struct fi_ops_tagged						\
+	FI_BGQ_TAGGED_OPS_STRUCT_NAME(LOCK) = {				\
+	.size		= sizeof(struct fi_ops_tagged),			\
+	.recv		=						\
+		FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(trecv, LOCK),	\
+	.recvv		= fi_no_tagged_recvv,				\
+	.recvmsg	=						\
+		FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(trecvmsg, LOCK),	\
+	.send		=						\
+		FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(tsend, LOCK),	\
+	.sendv		= fi_no_tagged_sendv,				\
+	.sendmsg	= fi_bgq_tsendmsg,				\
+	.inject 	=						\
+		FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(tinject, LOCK),	\
+	.senddata	=						\
+		FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(tsenddata, LOCK),	\
+	.injectdata	=						\
+		FI_BGQ_TAGGED_SPECIALIZED_FUNC_NAME(tinjectdata, LOCK),	\
+}
+
+FI_BGQ_TAGGED_OPS_STRUCT(0);
+FI_BGQ_TAGGED_OPS_STRUCT(1);
+
+ssize_t fi_bgq_tsearch(struct fid_ep *ep, uint64_t *tag,
+		uint64_t ignore, uint64_t flags,
+		fi_addr_t *src_addr, size_t *len, void *context)
+{
+	errno = FI_ENOSYS;
+	return -errno;
+}
+
+static struct fi_ops_tagged fi_bgq_no_tagged_ops = {
+        .size           = sizeof(struct fi_ops_tagged),
+        .recv           = fi_no_tagged_recv,
+        .recvv          = fi_no_tagged_recvv,
+        .recvmsg        = fi_no_tagged_recvmsg,
+        .send           = fi_no_tagged_send,
+        .sendv          = fi_no_tagged_sendv,
+        .sendmsg        = fi_no_tagged_sendmsg,
+        .inject         = fi_no_tagged_inject,
+        .senddata       = fi_no_tagged_senddata,
+        .injectdata     = fi_no_tagged_injectdata
+};
+
+int fi_bgq_init_tagged_ops(struct fi_bgq_ep *bgq_ep, struct fi_info *info)
+{
+        if (!info || !bgq_ep)
+                goto err;
+
+        if (info->caps & FI_TAGGED ||
+                        (info->tx_attr &&
+                         (info->tx_attr->caps & FI_TAGGED))) {
+        }
+
+        return 0;
+
+err:
+        errno = FI_EINVAL;
+        return -errno;
+}
+
+int fi_bgq_enable_tagged_ops(struct fi_bgq_ep *bgq_ep)
+{
+        if (!bgq_ep || !bgq_ep->domain)
+                goto err;
+
+        if (!(bgq_ep->tx.caps & FI_TAGGED)) {
+                /* Tagged ops not enabled on this endpoint */
+                bgq_ep->ep_fid.tagged =
+                        &fi_bgq_no_tagged_ops;
+                return 0;
+        }
+
+        switch (bgq_ep->domain->threading) {
+        case FI_THREAD_ENDPOINT:
+        case FI_THREAD_DOMAIN:
+        case FI_THREAD_COMPLETION:
+		bgq_ep->ep_fid.tagged = &FI_BGQ_TAGGED_OPS_STRUCT_NAME(0);
+                break;
+        case FI_THREAD_FID:
+        case FI_THREAD_UNSPEC:
+        case FI_THREAD_SAFE:
+		bgq_ep->ep_fid.tagged = &FI_BGQ_TAGGED_OPS_STRUCT_NAME(1);
+                break;
+        default:
+                bgq_ep->ep_fid.tagged = &fi_bgq_no_tagged_ops;
+                FI_WARN(fi_bgq_global.prov, FI_LOG_EP_DATA,
+                                "Tagged ops not enabled on EP\n");
+		break;
+        }
+
+	return 0;
+err:
+        errno = FI_EINVAL;
+        return -errno;
+}
+
+int fi_bgq_finalize_tagged_ops(struct fi_bgq_ep *bgq_ep)
+{
+	if (!bgq_ep) {
+		return 0;
+	}
+
+	return 0;
+}
diff --git a/prov/bgq/src/test/Makefile.include b/prov/bgq/src/test/Makefile.include
new file mode 100644
index 0000000..2174587
--- /dev/null
+++ b/prov/bgq/src/test/Makefile.include
@@ -0,0 +1,139 @@
+#
+# Copyright (C) 2016 by Argonne National Laboratory.
+#
+# This software is available to you under a choice of one of two
+# licenses.  You may choose to be licensed under the terms of the GNU
+# General Public License (GPL) Version 2, available from the file
+# COPYING in the main directory of this source tree, or the
+# BSD license below:
+#
+#     Redistribution and use in source and binary forms, with or
+#     without modification, are permitted provided that the following
+#     conditions are met:
+#
+#      - Redistributions of source code must retain the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer.
+#
+#      - Redistributions in binary form must reproduce the above
+#        copyright notice, this list of conditions and the following
+#        disclaimer in the documentation and/or other materials
+#        provided with the distribution.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+#
+
+testdir = @bindir@/test
+test_PROGRAMS =
+
+#bin_PROGRAMS += test_l2alloc_simple
+#test_l2alloc_simple_SOURCES = prov/bgq/src/test/l2alloc_simple.c \
+#		prov/bgq/src/l2atomic.c
+#test_l2alloc_simple_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_l2alloc_simple_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_l2alloc_single
+#test_l2alloc_single_SOURCES = prov/bgq/src/test/l2alloc_single.c \
+#		prov/bgq/src/l2atomic.c
+#test_l2alloc_single_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_l2alloc_single_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_l2alloc_func
+#test_l2alloc_func_SOURCES = prov/bgq/src/test/l2alloc_func.c \
+#		prov/bgq/src/l2atomic.c
+#test_l2alloc_func_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_l2alloc_func_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_l2lock_init
+#test_l2lock_init_SOURCES = prov/bgq/src/test/l2lock_init.c \
+#		prov/bgq/src/l2atomic.c
+#test_l2lock_init_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_l2lock_init_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_l2lock_func
+#test_l2lock_func_SOURCES = prov/bgq/src/test/l2lock_func.c \
+#		prov/bgq/src/l2atomic.c
+#test_l2lock_func_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_l2lock_func_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_l2barrier_func
+#test_l2barrier_func_SOURCES = prov/bgq/src/test/l2barrier_func.c \
+#		prov/bgq/src/l2atomic.c
+#test_l2barrier_func_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_l2barrier_func_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_cq_mfifo_init
+#test_cq_mfifo_init_SOURCES = prov/bgq/src/test/cq_mfifo_init.c \
+#		prov/bgq/src/l2atomic.c \
+#		prov/bgq/src/fi_bgq_memfifo.c
+#test_cq_mfifo_init_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_cq_mfifo_init_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_cq_mfifo_overflow
+#test_cq_mfifo_overflow_SOURCES = prov/bgq/src/test/cq_mfifo_overflow.c \
+#		prov/bgq/src/l2atomic.c \
+#		prov/bgq/src/fi_bgq_memfifo.c
+#test_cq_mfifo_overflow_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_cq_mfifo_overflow_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_cq_mfifo_multithreaded
+#test_cq_mfifo_multithreaded_SOURCES = prov/bgq/src/test/cq_mfifo_multithreaded.c \
+#		prov/bgq/src/l2atomic.c \
+#		prov/bgq/src/fi_bgq_memfifo.c
+#test_cq_mfifo_multithreaded_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_cq_mfifo_multithreaded_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+#bin_PROGRAMS += test_cq_mfifo_multithreaded_perf
+#test_cq_mfifo_multithreaded_perf_SOURCES = prov/bgq/src/test/cq_mfifo_multithreaded_perf.c \
+#		prov/bgq/src/l2atomic.c \
+#		prov/bgq/src/fi_bgq_memfifo.c
+#test_cq_mfifo_multithreaded_perf_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_cq_mfifo_multithreaded_perf_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+
+
+test_PROGRAMS += l2atomic_fifo_perf
+l2atomic_fifo_perf_SOURCES = prov/bgq/src/test/l2atomic_fifo_perf.c
+l2atomic_fifo_perf_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+l2atomic_fifo_perf_LDFLAGS = \
+		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+test_PROGRAMS += spi_pingpong
+spi_pp_files = prov/bgq/src/test/spi_pingpong.c \
+		prov/bgq/src/fi_bgq_spi.c
+spi_pp_files_nodist = prov/bgq/external/memory_impl.c
+
+spi_pingpong_SOURCES = $(spi_pp_files)
+nodist_spi_pingpong_SOURCES = $(spi_pp_files_nodist)
+spi_pingpong_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+spi_pingpong_LDFLAGS = \
+		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+
+
+#bin_PROGRAMS += test_cq_agent_init
+#test_cq_agent_init_SOURCES = prov/bgq/src/test/cq_agent_init.c \
+#		prov/bgq/src/l2atomic.c \
+#		prov/bgq/src/cq_agent_client.c \
+#		prov/bgq/src/agent/cq_agent.c \
+#		prov/bgq/src/fi_bgq_memfifo.c
+#test_cq_agent_init_CPPFLAGS = $(AM_CPPFLAGS) $(bgq_CPPFLAGS)
+#test_cq_agent_init_LDFLAGS = \
+#		-module -avoid-version -export-dynamic $(bgq_LDFLAGS)
+#test_cq_agent_init_LDADD = $(bgq_LIBS)
diff --git a/prov/bgq/src/test/l2atomic_fifo_perf.c b/prov/bgq/src/test/l2atomic_fifo_perf.c
new file mode 100644
index 0000000..f5140e7
--- /dev/null
+++ b/prov/bgq/src/test/l2atomic_fifo_perf.c
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2016 by Argonne National Laboratory.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef N_PACKETS_LOG2
+#define N_PACKETS_LOG2 (16)
+#endif
+
+#define N_PACKETS (1ull << N_PACKETS_LOG2)
+
+#define N_THREADS (16)
+
+#ifndef N_MESSAGES
+#define N_MESSAGES 1000000
+#endif
+
+#include <stdlib.h>
+#include <pthread.h>
+
+#define L2ATOMIC_FIFO_NPACKETS			N_PACKETS
+#define L2ATOMIC_FIFO_MSYNC_CONSUMER
+#define L2ATOMIC_FIFO_PRODUCER_STORE_FAST
+#define L2ATOMIC_FIFO_CONSUMER_MULTIPLE
+#include "rdma/bgq/fi_bgq_l2atomic.h"
+
+struct my_fifo {
+	struct l2atomic_fifo_consumer 	consumer;
+	uint64_t			pad_0[16];
+	struct l2atomic_fifo_data 	data;
+	uint64_t			element[N_PACKETS];
+} __attribute__((__aligned__(32)));
+
+struct global {
+	struct my_fifo				fifo[N_THREADS];
+	struct l2atomic_barrier_data		barrier_data;
+	struct {
+		struct l2atomic_fifo_producer	producer[N_THREADS];
+		struct l2atomic_barrier		barrier;
+	} worker[N_THREADS];
+} __attribute__((__aligned__(32)));
+
+struct results {
+	double		mmps;
+	uint16_t	n_consumers;
+	uint16_t	n_producers;
+	uint16_t	is_consumer;
+	uint16_t	is_producer;
+	uint64_t	count;
+};
+
+struct results result[N_THREADS][N_THREADS*N_THREADS];
+
+struct global *global;
+
+pthread_t info[N_THREADS];
+
+
+static uint64_t producer_fn (uintptr_t pid, struct l2atomic_fifo_producer *producer, unsigned n_consumers) {
+
+	uint64_t i, full_count = 0;
+	do {
+		/* choose fifo */
+		const uint64_t f = (i+pid)%n_consumers;
+		l2atomic_fifo_produce_wait(&producer[f], i);
+
+	} while (++i<(n_consumers*N_MESSAGES));
+
+	return full_count;
+}
+
+static uint64_t consumer_fn (uintptr_t pid, struct l2atomic_fifo_consumer *consumer, unsigned n_producers) {
+
+	const unsigned t_messages = N_MESSAGES * n_producers;
+	uint64_t data[32], empty_count = 0, i = 0;
+	do {
+		i += l2atomic_fifo_consume16(consumer, data);
+	} while (i < t_messages);
+
+	return empty_count;
+}
+
+
+static void * worker_fn (void * arg) {
+
+	uintptr_t pid = (uintptr_t)arg;
+
+	struct l2atomic_barrier *barrier = &global->worker[pid].barrier;
+	struct l2atomic_fifo_consumer *consumer = &global->fifo[pid].consumer;
+	struct l2atomic_fifo_producer *producer = &global->worker[pid].producer[0];
+
+	unsigned n_consumers, n_producers, test = 0;
+	for (n_consumers = 1; n_consumers <= N_THREADS; ++n_consumers) {
+
+		const unsigned max_producers = N_THREADS - n_consumers;
+
+		for (n_producers = 1; n_producers <= max_producers; ++n_producers) {
+
+			uint64_t count = 0;
+
+			l2atomic_barrier_enter(barrier);
+			uint64_t start_time = GetTimeBase();
+
+			if (pid < n_consumers) {
+				count = consumer_fn(pid, consumer, n_producers);
+			} else if (pid < (n_consumers + n_producers)) {
+				count = producer_fn(pid, producer, n_consumers);
+			}
+
+			uint64_t end_time = GetTimeBase();
+			l2atomic_barrier_enter(barrier);
+
+			uint64_t total_time = end_time - start_time;
+			double total_usec = (double)total_time / 1600.0;
+
+			result[pid][test].n_consumers = n_consumers;
+			result[pid][test].n_producers = n_producers;
+			result[pid][test].count = count;
+
+			if (pid < n_consumers) {
+				result[pid][test].is_consumer = 1;
+				result[pid][test].is_producer = 0;
+
+				result[pid][test].mmps = ((double)(N_MESSAGES*n_producers)) / total_usec; /* same as million messages per second */
+			} else if (pid < (n_producers+n_consumers)) {
+				result[pid][test].is_consumer = 0;
+				result[pid][test].is_producer = 1;
+
+				result[pid][test].mmps = ((double)(N_MESSAGES*n_consumers)) / total_usec; /* same as million messages per second */
+			} else {
+				result[pid][test].is_consumer = 0;
+				result[pid][test].is_producer = 0;
+				result[pid][test].mmps = 0.0;
+			}
+
+			l2atomic_barrier_enter(barrier); ppc_msync();
+
+			if (pid == 0) {
+				char out[1024*10];
+				char * ptr = &out[0];
+				unsigned n;
+				unsigned i;
+
+				double all_consumer_mmps = 0.0;
+				double all_producer_mmps = 0.0;
+				for (i = 0; i < N_THREADS; ++i) {
+
+					if (i>0 && result[i-1][test].is_consumer && !result[i][test].is_consumer) {
+						n = sprintf(ptr, ":: "); ptr += n; 
+					}
+
+					if (result[i][test].is_consumer)
+						all_consumer_mmps += result[i][test].mmps;
+
+					if (result[i][test].is_producer)
+						all_producer_mmps += result[i][test].mmps;
+#ifdef DISPLAY_EMPTY_FULL_COUNT
+					n = sprintf(ptr, "%5.2f(%5.2f) ", result[i][test].mmps, (double)result[i][test].count/10000000.0);
+#else
+					n = sprintf(ptr, "%5.2f ", result[i][test].mmps);
+#endif
+					ptr += n;
+				}
+				fprintf(stdout, "consumers=%-2u (%5.2f) producers=%-2u (%5.2f) :: %s\n", n_consumers, all_consumer_mmps, n_producers, all_producer_mmps, out);
+			}
+
+			++test;
+
+			l2atomic_barrier_enter(barrier);
+		}
+	}
+
+	return NULL;
+}
+
+int main (int argc, char *argv[]) {
+
+	int lineno, retval = 0;
+
+	const size_t bytes_to_allocate = 128 * 2 + sizeof(struct global);
+	void *memptr = calloc(bytes_to_allocate, 1);
+	global = (struct global *)(((uintptr_t)memptr + 128) & ~127);
+
+	uintptr_t pid, w;
+	for (pid = 0; pid < N_THREADS; ++pid) {
+		l2atomic_fifo_initialize(&global->fifo[pid].consumer,
+			&global->worker[0].producer[pid], &global->fifo[pid].data, N_PACKETS);
+
+		for (w = 1; w < N_THREADS; ++w) {
+			global->worker[w].producer[pid] = global->worker[0].producer[pid];
+		}
+	}
+
+	l2atomic_barrier_initialize(&global->worker[0].barrier, &global->barrier_data, N_THREADS);
+
+	for (pid=1; pid<N_THREADS; ++pid) {
+		l2atomic_barrier_clone(&global->worker[pid].barrier, &global->barrier_data);
+		if (pthread_create(&info[pid], NULL, &worker_fn, (void*)pid)) { lineno = __LINE__; goto err; }
+	}
+
+	worker_fn((void *)0);
+
+ret:
+	return retval;
+
+err:
+	fprintf(stderr, "%s:%s():%d\n", __FILE__, __func__, lineno); retval = -1;
+	goto ret;
+
+};
diff --git a/prov/bgq/src/test/spi_pingpong.c b/prov/bgq/src/test/spi_pingpong.c
new file mode 100644
index 0000000..fee872a
--- /dev/null
+++ b/prov/bgq/src/test/spi_pingpong.c
@@ -0,0 +1,476 @@
+
+/*
+ * /////////////////////////////////////////////////////
+ * //   "Speed of Light" Memory Fifo Ping Pong test   //
+ * /////////////////////////////////////////////////////
+ */
+
+
+/*
+Idea: set up an injection fifo and pre-fill in all of the descriptors
+for the number of messages to send in a round For each iteration, only
+need to advance the injection fifo then poll on reception fifo. Between
+message sizes update all injection fifo descriptors with the new message
+size to test.  Ideally, the size of the injection fifo should be the
+same as the number of messages to send in each round.
+
+Receive (pong) side polls on the reception fifo and counts the number
+of packets received, when the count for a message size is reached it
+will advance its injection fifo to send the "pong". The "ping" side
+similarly waits on the reception fifo for each "pong" before sending
+the next "ping" in the round.
+
+No memory is copied. No rendezvous. Just trying to measure how fast
+the network is....
+*/
+
+
+#include "rdma/bgq/fi_bgq_mu.h"
+
+
+
+#define NUM_LOOPS   			1024
+
+#define MAX_MESSAGE_SIZE		2097152
+
+#define BYTE_COUNTER_BAT_ID		(0)
+#define RECEIVE_BUFFER_BAT_ID		(1)
+
+uint64_t sbuf[MAX_MESSAGE_SIZE/sizeof(uint64_t)];
+uint64_t rbuf[MAX_MESSAGE_SIZE/sizeof(uint64_t)];
+
+MUHWI_Descriptor_t desc[NUM_LOOPS] __attribute__((__aligned__(64)));
+
+
+
+
+static inline void bat_allocate (MUSPI_BaseAddressTableSubGroup_t * bat_subgroup)
+{
+	uint32_t nbatids;
+	uint32_t batids[BGQ_MU_NUM_DATA_COUNTERS_PER_SUBGROUP];
+	int32_t cnk_rc __attribute__ ((unused));
+	cnk_rc = Kernel_QueryBaseAddressTable(0, &nbatids, batids);
+	assert(cnk_rc == 0);
+	assert(nbatids > 0);
+
+	cnk_rc = Kernel_AllocateBaseAddressTable(0, bat_subgroup, nbatids, &batids[0], 0);
+	assert(cnk_rc == 0);
+}
+
+static inline void bat_write (MUSPI_BaseAddressTableSubGroup_t * bat_subgroup, uint64_t index, uint64_t offset)
+{
+
+	int32_t cnk_rc __attribute__ ((unused));
+	cnk_rc = MUSPI_SetBaseAddress(bat_subgroup, index, offset);
+	assert(cnk_rc == 0);
+
+}
+
+
+static inline void init_gi_barrier (MUSPI_GIBarrier_t * GIBarrier)
+{
+	int rc;
+	rc = MUSPI_GIBarrierInit(GIBarrier, 0);
+	if (rc) exit(1);
+}
+
+
+static inline void do_gi_barrier (MUSPI_GIBarrier_t * GIBarrier)
+{
+	int rc;
+	uint64_t gi_timeout = 1600000000;	/* about 1 sec at 16 mhz */
+	gi_timeout *= 30;
+  
+	rc = MUSPI_GIBarrierEnter(GIBarrier);
+	if (rc) exit(1);
+
+	rc = MUSPI_GIBarrierPollWithTimeout(GIBarrier, gi_timeout);
+	if (rc) exit(1);
+}
+
+
+static inline void do_gi_barrier_no_timeout (MUSPI_GIBarrier_t * GIBarrier)
+{
+	int rc;
+	rc = MUSPI_GIBarrierEnter(GIBarrier);
+	if (rc) exit(1);
+
+	rc = MUSPI_GIBarrierPoll(GIBarrier);
+	if (rc) exit(1);
+}
+
+
+static inline MUSPI_RecFifo_t * allocate_reception_fifo (MUSPI_RecFifoSubGroup_t * rfifo_subgroup)
+{
+
+	int rc __attribute__ ((unused));
+	uint8_t * memptr;
+
+	size_t nbytes = 8 * 1024 * 1024;
+	rc = posix_memalign((void**)&memptr, 32, nbytes);
+	assert(0 == rc);
+
+	Kernel_MemoryRegion_t mregion;
+	rc = Kernel_CreateMemoryRegion(&mregion, (void*)memptr, nbytes);
+	assert(0 == rc);
+
+	uint32_t free_fifo_num;
+	uint32_t free_fifo_ids[BGQ_MU_NUM_REC_FIFOS_PER_SUBGROUP];
+	rc = Kernel_QueryRecFifos(0, &free_fifo_num, free_fifo_ids);
+	assert(0 == rc);
+	assert(0 < free_fifo_num);
+	assert(0 == free_fifo_ids[0]);
+
+	Kernel_RecFifoAttributes_t attr;
+	memset(&attr, 0x00, sizeof(attr));
+	rc = Kernel_AllocateRecFifos(0, rfifo_subgroup, 1, free_fifo_ids, &attr);
+	assert(0 == rc);
+
+	rc = Kernel_RecFifoInit(rfifo_subgroup, 0, &mregion,
+		((uint64_t)memptr) - (uint64_t)mregion.BaseVa,
+		nbytes-1);
+	assert(0 == rc);
+
+	rc = Kernel_RecFifoEnable(0, 0x08000ull);
+	assert(0 == rc);
+
+	assert(rfifo_subgroup->_recfifos[0]._fifo.hwfifo);
+
+	return &rfifo_subgroup->_recfifos[0];
+}
+
+
+static inline void inject (struct fi_bgq_spi_injfifo * ififo, MUHWI_Descriptor_t * model)
+{
+
+	MUSPI_InjFifo_t * muspi_injfifo = ififo->muspi_injfifo;
+	MUHWI_Descriptor_t * d = fi_bgq_spi_injfifo_tail_wait(ififo);
+	*d = *model;
+
+	MUSPI_InjFifoAdvanceDesc(muspi_injfifo);
+	return;
+}
+
+
+/* return the number of *chunks* consumed */
+static inline uint64_t receive (MUSPI_RecFifo_t * recfifo)
+{
+	MUSPI_Fifo_t * fifo = (MUSPI_Fifo_t *)recfifo;
+
+	const uintptr_t pa_start = MUSPI_getStartPa(fifo);
+	const uintptr_t va_head = (uintptr_t) MUSPI_getHeadVa(fifo);
+	const uintptr_t va_start = (uintptr_t) MUSPI_getStartVa(fifo);
+	const uintptr_t offset_head = va_head - va_start;
+
+	uintptr_t offset_tail = MUSPI_getHwTail(fifo) - pa_start;
+
+	/*
+	 * wait until the head does not equal the tail; this signifies that
+	 * a packet has been received
+	 */
+	while (offset_head == offset_tail) {
+		offset_tail =  MUSPI_getHwTail(fifo) - pa_start;
+	}
+
+	uint64_t bytes_consumed;
+	if (offset_head < offset_tail) {
+
+		MUSPI_setHeadVa(fifo, (void*)(va_start + offset_tail));
+		MUSPI_setHwHead(fifo, offset_tail);
+
+		bytes_consumed = offset_tail - offset_head;
+
+	} else {
+
+		MUSPI_setHeadVa(fifo, (void*)(va_start));
+		MUSPI_setHwHead(fifo, 0);
+
+		const uintptr_t va_end = (uintptr_t) fifo->va_end;
+		bytes_consumed = va_end - va_head;
+	}
+
+	return bytes_consumed >> 5;	/* each chunk is 32 bytes */
+}
+
+
+
+
+int main (int argc, char **argv)
+{
+	Personality_t pers;
+	Kernel_GetPersonality(&pers, sizeof(pers));
+
+	BG_CoordinateMapping_t local;
+	local.a = pers.Network_Config.Acoord;
+	local.b = pers.Network_Config.Bcoord;
+	local.c = pers.Network_Config.Ccoord;
+	local.d = pers.Network_Config.Dcoord;
+	local.e = pers.Network_Config.Ecoord;
+	local.t = Kernel_PhysicalProcessorID();
+
+	int is_root = 0;
+	int is_neighbor = 0;
+	if (local.t == 0 && local.a == 0 && local.b == 0 && local.c == 0 && local.d == 0) {
+
+		is_root = (local.e == 0);
+		is_neighbor = (local.e == 1);
+	}
+
+
+	MUSPI_BaseAddressTableSubGroup_t bat_subgroup;
+	bat_allocate(&bat_subgroup);
+
+	volatile uint64_t byte_counter __attribute__((__aligned__(64)));
+	byte_counter = 0;
+
+	uint64_t byte_counter_paddr = 0;
+	fi_bgq_cnk_vaddr2paddr((const void *)&byte_counter, sizeof(uint64_t), &byte_counter_paddr);
+	uint64_t atomic_byte_counter_paddr = MUSPI_GetAtomicAddress(byte_counter_paddr, MUHWI_ATOMIC_OPCODE_STORE_ADD);
+	bat_write(&bat_subgroup, BYTE_COUNTER_BAT_ID, atomic_byte_counter_paddr);
+
+	uint64_t rbuf_paddr = 0;
+	fi_bgq_cnk_vaddr2paddr((const void *)&rbuf[0], MAX_MESSAGE_SIZE, &rbuf_paddr);
+	bat_write(&bat_subgroup, RECEIVE_BUFFER_BAT_ID, rbuf_paddr);
+	
+
+	struct fi_bgq_spi_injfifo rget_ififo;
+	MUSPI_InjFifoSubGroup_t rget_ififo_subgroup;
+	fi_bgq_spi_injfifo_init(&rget_ififo, &rget_ififo_subgroup, 1, NUM_LOOPS, 0, 1, 0);
+
+	struct fi_bgq_spi_injfifo ififo;
+	MUSPI_InjFifoSubGroup_t ififo_subgroup;
+	fi_bgq_spi_injfifo_init(&ififo, &ififo_subgroup, 1, NUM_LOOPS, 0, 0, 1);
+
+	MUSPI_RecFifoSubGroup_t rfifo_subgroup;
+	MUSPI_RecFifo_t * recfifo = allocate_reception_fifo(&rfifo_subgroup);
+
+
+	/*
+	 * Create the 'memory fifo' descriptor - used for eager-style transfers
+	 * and rendezvous-style RTS messages.
+	 */
+	MUHWI_Descriptor_t fifo_model __attribute__((__aligned__(64)));
+	MUSPI_DescriptorZeroOut(&fifo_model);
+
+	fifo_model.Half_Word0.Prefetch_Only = MUHWI_DESCRIPTOR_PRE_FETCH_ONLY_NO;
+	fifo_model.Half_Word1.Interrupt = MUHWI_DESCRIPTOR_DO_NOT_INTERRUPT_ON_PACKET_ARRIVAL;
+	fi_bgq_cnk_vaddr2paddr((const void *)&sbuf[0], MAX_MESSAGE_SIZE+64, &fifo_model.Pa_Payload);
+	fifo_model.Message_Length = 0;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Data_Packet_Type = MUHWI_PT2PT_DATA_PACKET_TYPE;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Byte3.Byte3 = MUHWI_PACKET_VIRTUAL_CHANNEL_DETERMINISTIC;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 = MUHWI_PACKET_TYPE_FIFO;
+	fifo_model.PacketHeader.messageUnitHeader.Packet_Types.Memory_FIFO.Rec_FIFO_Id = 0;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.A_Destination = 0;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.B_Destination = 0;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.C_Destination = 0;
+	fifo_model.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.D_Destination = 0;
+
+	if (is_root) {
+
+		fifo_model.Torus_FIFO_Map = MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+		fifo_model.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.E_Destination = 1;
+
+	} else if (is_neighbor) {
+
+		fifo_model.Torus_FIFO_Map = MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM;
+		fifo_model.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.E_Destination = 0;
+	}
+
+
+	MUHWI_Descriptor_t dput __attribute__((__aligned__(64)));
+	MUSPI_DescriptorZeroOut(&dput);
+
+	dput = fifo_model;
+	dput.Torus_FIFO_Map =
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+	dput.PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 = MUHWI_PACKET_TYPE_PUT;
+	dput.PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Pacing = MUHWI_PACKET_DIRECT_PUT_IS_NOT_PACED;
+	MUSPI_SetRecPayloadBaseAddressInfo(&dput, RECEIVE_BUFFER_BAT_ID, 0);
+	dput.PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Rec_Counter_Base_Address_Id = BYTE_COUNTER_BAT_ID;
+	dput.PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Counter_Offset = 0;
+
+	dput.Message_Length = 0;	/* updated during the test */
+	dput.PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_MSB = 0;
+	dput.PacketHeader.messageUnitHeader.Packet_Types.Direct_Put.Put_Offset_LSB = 0;
+
+	dput.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.A_Destination = local.a;
+	dput.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.B_Destination = local.b;
+	dput.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.C_Destination = local.c;
+	dput.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.D_Destination = local.d;
+	dput.PacketHeader.NetworkHeader.pt2pt.Destination.Destination.E_Destination = local.e;
+	dput.PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+
+	MUHWI_Descriptor_t rget_model __attribute__((__aligned__(64)));
+	MUSPI_DescriptorZeroOut(&rget_model);
+
+	rget_model = fifo_model;
+	rget_model.Torus_FIFO_Map =
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_AP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_BP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_CP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_DP |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EM |
+		MUHWI_DESCRIPTOR_TORUS_FIFO_MAP_EP;
+	rget_model.PacketHeader.NetworkHeader.pt2pt.Byte8.Byte8 = MUHWI_PACKET_TYPE_GET;
+	fi_bgq_cnk_vaddr2paddr((const void *)&dput, sizeof(MUHWI_Descriptor_t), &rget_model.Pa_Payload);
+	rget_model.Message_Length = sizeof(MUHWI_Descriptor_t);
+
+	rget_model.PacketHeader.NetworkHeader.pt2pt.Byte8.Size = 16;
+
+
+	/*
+	 * Barrier
+	 */
+	MUSPI_GIBarrier_t GIBarrier;
+	init_gi_barrier(&GIBarrier);
+	do_gi_barrier(&GIBarrier);
+
+
+	if (is_root) {
+
+		fprintf(stdout, "#                       eager            rendezvous\n");
+		fprintf(stdout, "# %10s %10s %9s %10s %9s\n", "bytes", "cycles", "usec", "cycles", "usec");
+		fprintf(stdout, "# ====================================================\n");
+
+	}
+
+	const uint64_t num_loops = NUM_LOOPS;
+
+	uint64_t i = 0;
+	uint64_t msg_size = 0;
+	while (msg_size <= MAX_MESSAGE_SIZE) {
+
+		fifo_model.Message_Length = msg_size;
+		dput.Message_Length = msg_size;
+
+		uint64_t eager_cycles = 0;
+		uint64_t rendezvous_cycles = 0;
+
+		/*
+		 * each torus chunk is 32 bytes and the first 32 bytes in each
+		 * packet is header
+		 */
+		const uint64_t npackets = msg_size == 0 ? 1 : (msg_size / 512) + (msg_size % 512 != 0);
+		const uint64_t nchunks = npackets + (msg_size / 32) + (msg_size % 32 != 0);
+		if (is_root) {
+
+			Delay(500000);	/* make sure receiver is ready */
+
+			const unsigned long long t0 = GetTimeBase();
+			for (i=0; i<num_loops; ++i) {
+
+				inject(&ififo, &fifo_model);
+
+				unsigned n = nchunks;
+				while (n > 0) {
+					n -= receive(recfifo);
+				}
+			}
+			const unsigned long long t1 = GetTimeBase();
+			eager_cycles = t1 - t0;
+
+		} else if (is_neighbor) {
+			for (i=0; i<num_loops; ++i) {
+
+				unsigned n = nchunks;
+				while (n > 0) {
+					n -= receive(recfifo);
+				}
+
+				inject(&ififo, &fifo_model);
+			}
+
+			Delay(500000);	/* make sure sender is finished */
+		}
+
+
+		/*
+		 * rendezvous
+		 */
+		if (msg_size > 0) {
+
+			fifo_model.Message_Length = 0;
+
+			if (is_root) {
+
+				Delay(500000);	/* make sure receiver is ready */
+
+				const unsigned long long t0 = GetTimeBase();
+				for (i=0; i<num_loops; ++i) {
+
+					/* inject the 'ping' rts */
+					inject(&ififo, &fifo_model);
+
+					/* wait for the 'pong' rts */
+					unsigned n = 1;
+					while (n > 0) {
+						unsigned chunks = receive(recfifo);
+						n -= chunks;
+					}
+
+					/* transfer the 'pong' data */
+					byte_counter = msg_size;
+					inject(&ififo, &rget_model);
+
+					/* wait until all 'pong' data is delivered */
+					while (byte_counter > 0);
+				}
+				const unsigned long long t1 = GetTimeBase();
+				rendezvous_cycles = t1 - t0;
+
+			} else if (is_neighbor) {
+
+				for (i=0; i<num_loops; ++i) {
+
+					/* wait for the 'ping' rts */
+					unsigned n = 1;
+					while (n > 0) {
+						unsigned chunks = receive(recfifo);
+						n -= chunks;
+					}
+
+					/* transfer the 'ping' data */
+					byte_counter = msg_size;
+					inject(&ififo, &rget_model);
+
+					/* wait until all 'ping' data is delivered */
+					while (byte_counter > 0);
+
+					/* inject the 'pong' rts */
+					inject(&ififo, &fifo_model);
+				}
+
+				Delay(500000);	/* make sure sender is finished */
+			}
+		}
+
+		if (is_root) {
+
+			/* report half pingpong */
+			fprintf(stdout, "  %10lu %10lu %9.2f %10lu %9.2f\n", msg_size,
+				(eager_cycles)/(num_loops*2), (((eager_cycles)*1.0)/1600.0) / (num_loops * 2.0),
+				(rendezvous_cycles)/(num_loops*2), (((rendezvous_cycles)*1.0)/1600.0) / (num_loops * 2.0));
+		}
+
+		msg_size = msg_size == 0 ? 1 : msg_size*2;
+	}
+
+	return 0;
+}
+
diff --git a/prov/gni/Makefile.include b/prov/gni/Makefile.include
index d6afb28..82c2b65 100644
--- a/prov/gni/Makefile.include
+++ b/prov/gni/Makefile.include
@@ -11,6 +11,7 @@ AM_CPPFLAGS += -I$(top_srcdir)/prov/gni/include -I$(top_srcdir)/prov/gni
 
 _gni_files = \
 	prov/gni/src/gnix_atomic.c \
+	prov/gni/src/gnix_auth_key.c \
 	prov/gni/src/gnix_av.c \
 	prov/gni/src/gnix_bitmap.c \
 	prov/gni/src/gnix_buddy_allocator.c \
@@ -34,8 +35,10 @@ _gni_files = \
 	prov/gni/src/gnix_nameserver.c \
 	prov/gni/src/gnix_nic.c \
 	prov/gni/src/gnix_poll.c \
+	prov/gni/src/gnix_progress.c \
 	prov/gni/src/gnix_queue.c \
 	prov/gni/src/gnix_rma.c \
+	prov/gni/src/gnix_sep.c \
 	prov/gni/src/gnix_tags.c \
 	prov/gni/src/gnix_trigger.c \
 	prov/gni/src/gnix_util.c \
@@ -47,9 +50,11 @@ _gni_files = \
 _gni_headers = \
 	prov/gni/include/fi_ext_gni.h \
 	prov/gni/include/gnix_atomic.h \
+	prov/gni/include/gnix_auth_key.h \
 	prov/gni/include/gnix_av.h \
 	prov/gni/include/gnix_bitmap.h \
 	prov/gni/include/gnix_buddy_allocator.h \
+	prov/gni/include/gnix_cm.h \
 	prov/gni/include/gnix_cm_nic.h \
 	prov/gni/include/gnix_cntr.h \
 	prov/gni/include/gnix_cq.h \
@@ -67,6 +72,7 @@ _gni_headers = \
 	prov/gni/include/gnix_nameserver.h \
 	prov/gni/include/gnix_nic.h \
 	prov/gni/include/gnix_poll.h \
+	prov/gni/include/gnix_progress.h \
 	prov/gni/include/gnix_priv.h \
 	prov/gni/include/gnix_queue.h \
 	prov/gni/include/gnix_rma.h \
@@ -78,12 +84,14 @@ _gni_headers = \
 	prov/gni/include/gnix_xpmem.h \
 	prov/gni/include/gnix_wait.h
 
+
 if HAVE_CRITERION
 bin_PROGRAMS += prov/gni/test/gnitest
 bin_SCRIPTS += prov/gni/test/run_gnitest
 nodist_prov_gni_test_gnitest_SOURCES = \
 	prov/gni/test/allocator.c \
 	prov/gni/test/av.c \
+	prov/gni/test/auth_key.c \
 	prov/gni/test/bitmap.c \
 	prov/gni/test/buddy_allocator.c \
 	prov/gni/test/cancel.c \
@@ -94,6 +102,8 @@ nodist_prov_gni_test_gnitest_SOURCES = \
 	prov/gni/test/dom.c \
 	prov/gni/test/ep.c \
 	prov/gni/test/eq.c \
+	prov/gni/test/fabric.c \
+	prov/gni/test/fi_addr_str.c \
 	prov/gni/test/freelist.c \
 	prov/gni/test/hashtable.c \
 	prov/gni/test/mr.c \
@@ -111,11 +121,14 @@ nodist_prov_gni_test_gnitest_SOURCES = \
 	prov/gni/test/api.c \
 	prov/gni/test/api_cq.c \
 	prov/gni/test/api_cntr.c \
+	prov/gni/test/sep.c \
 	prov/gni/test/utils.c \
 	prov/gni/test/vc.c \
 	prov/gni/test/vc_lookup.c \
 	prov/gni/test/vector.c \
 	prov/gni/test/wait.c \
+	prov/gni/test/rdm_dgram_stx.c \
+	prov/gni/test/cm.c \
 	prov/gni/test/common.c
 
 prov_gni_test_gnitest_LDFLAGS = $(CRAY_PMI_LIBS) $(gnitest_LDFLAGS) -static
diff --git a/prov/gni/configure.m4 b/prov/gni/configure.m4
index 7e7d6d6..7b74468 100644
--- a/prov/gni/configure.m4
+++ b/prov/gni/configure.m4
@@ -1,3 +1,41 @@
+dnl
+dnl Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+dnl Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+dnl                         All rights reserved.
+dnl
+dnl This software is available to you under a choice of one of two
+dnl licenses.  You may choose to be licensed under the terms of the GNU
+dnl General Public License (GPL) Version 2, available from the file
+dnl COPYING in the main directory of this source tree, or the
+dnl BSD license below:
+dnl
+dnl     Redistribution and use in source and binary forms, with or
+dnl     without modification, are permitted provided that the following
+dnl     conditions are met:
+dnl
+dnl      - Redistributions of source code must retain the above
+dnl        copyright notice, this list of conditions and the following
+dnl        disclaimer.
+dnl
+dnl      - Redistributions in binary form must reproduce the above
+dnl        copyright notice, this list of conditions and the following
+dnl        disclaimer in the documentation and/or other materials
+dnl        provided with the distribution.
+dnl
+dnl THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+dnl "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+dnl LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+dnl FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+dnl COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+dnl INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+dnl BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+dnl LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+dnl CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+dnl LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+dnl ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+dnl POSSIBILITY OF SUCH DAMAGE.
+dnl
+
 dnl Configury specific to the libfabrics GNI provider
 
 dnl Called to configure this provider
@@ -19,6 +57,8 @@ AC_DEFUN([FI_GNI_CONFIGURE],[
 	gnitest_CPPFLAGS=
 	gnitest_LDFLAGS=
         gnitest_LIBS=
+        xpmem_happy=0
+        kdreg_happy=0
 
 
         AC_ARG_ENABLE([xpmem],
@@ -26,22 +66,30 @@ AC_DEFUN([FI_GNI_CONFIGURE],[
                                       [Enable xpmem (gni provider) @<:@default=yes@:>@])],
                       )
 
+        AC_ARG_ENABLE([ugni-static],
+                      [AS_HELP_STRING([--enable-ugni-static],
+                                      [Enable static linking with uGNI.  Recommended for KNL.])],
+                     )
+
         AS_IF([test x"$enable_gni" != x"no"],
                [FI_PKG_CHECK_MODULES([CRAY_GNI_HEADERS], [cray-gni-headers],
                                  [gni_header_happy=1
                                   gni_CPPFLAGS="$CRAY_GNI_HEADERS_CFLAGS $gni_CPPFLAGS"
-                                  gni_LDFLAGS="$CRAY_GNI_HEADER_LIBS $gni_LDFLAGS"
                                  ],
                                  [gni_header_happy=0])
               ])
 
         AS_IF([test "$gni_header_happy" -eq 1],
-              [FI_PKG_CHECK_MODULES([CRAY_UGNI], [cray-ugni],
+              [FI_PKG_CHECK_MODULES_STATIC([CRAY_UGNI], [cray-ugni],
                                  [ugni_lib_happy=1
                                   gni_CPPFLAGS=$CRAY_UGNI_CFLAGS
                                   gni_LDFLAGS=$CRAY_UGNI_LIBS
                                  ],
                                  [ugni_lib_happy=0])
+
+               AS_IF([test x"$enable_ugni_static" == x"yes" && test $ugni_lib_happy -eq 1],
+                     [gni_LDFLAGS=$(echo $gni_LDFLAGS | sed -e 's/lugni/l:libugni.a/')],[])
+
                FI_PKG_CHECK_MODULES_STATIC([CRAY_ALPS_LLI], [cray-alpslli],
                                  [alps_lli_happy=1
                                   gni_CPPFLAGS="$CRAY_ALPS_LLI_CFLAGS $gni_CPPFLAGS"
@@ -66,7 +114,7 @@ AC_DEFUN([FI_GNI_CONFIGURE],[
                                   gni_CPPFLAGS="$CRAY_XPMEM_CFLAGS $gni_CPPFLAGS"
                                   gni_LDFLAGS="$CRAY_XPMEM_LIBS $gni_LDFLAGS"
                                  ],
-                                 [])
+                                 [xpmem_happy=0])
                       ],
                       [AC_DEFINE_UNQUOTED([HAVE_XPMEM], [0], [Define to 1 if xpmem available])
                       ])
@@ -128,17 +176,36 @@ dnl looks like we need to get rid of some white space
                               AC_MSG_WARN(["$cc_version" doesn't support native atomics.  Disabling GNI provider.])
                               ugni_lib_happy=0])
 
-        ])
 
-	AC_ARG_WITH([kdreg], [AS_HELP_STRING([--with-kdreg],
-                                             [Install directory for kdreg headers])])
 
-        if test "$with_kdreg" != "" && test "$with_kdreg" != "no"; then
-		    gni_CPPFLAGS="-I$with_kdreg/include -DHAVE_KDREG $gni_CPPFLAGS"
-        fi
+dnl kdreg configury handling:
+dnl First check to see config line has --with-kdreg arg.  If yes and something other than
+dnl no, use the old way, otherwise if with_kdreg is not equal to no, try pkg-config method.
+dnl Note kdreg only supplies an include file, no library
+
+                AC_ARG_WITH([kdreg], [AS_HELP_STRING([--with-kdreg],
+                             [Install directory for kdreg headers])])
+
+                AS_IF([test "$with_kdreg" != "" && test "$with_kdreg" != "no"],
+                      [gni_CPPFLAGS="-I$with_kdreg/include $gni_CPPFLAGS"
+                       gnitest_CPPFLAGS="-I$with_kdreg/include $gnitest_CPPFLAGS"
+                       kdreg_happy=1],
+                      [AS_IF([test "$with_kdreg" != "no"],
+                       [FI_PKG_CHECK_MODULES([CRAY_KDREG], [cray-kdreg],
+                                             [kdreg_happy=1
+                                              gni_CPPFLAGS="$CRAY_KDREG_CFLAGS $gni_CPPFLAGS"
+                                              gnitest_CPPFLAGS="$CRAY_KDREG_CFLAGS $gnitest_CPPFLAGS"],
+                                             [kdreg_happy=0])])])
+
+                AC_DEFINE_UNQUOTED([HAVE_KDREG],[$kdreg_happy], [Define to 1 if kdreg available])
+
+        ])
 
 
         AM_CONDITIONAL([HAVE_CRITERION], [test "x$have_criterion" = "xtrue"])
+        AS_IF([test "x$have_criterion" = "xtrue"],
+              [AC_DEFINE_UNQUOTED([HAVE_CRITERION], [1], [Define to 1 if criterion requested and available])],
+              [AC_DEFINE_UNQUOTED([HAVE_CRITERION], [0], [Define to 1 if criterion requested and available])])
 
         AC_SUBST(gni_CPPFLAGS)
         AC_SUBST(gni_LDFLAGS)
diff --git a/prov/gni/include/fi_ext_gni.h b/prov/gni/include/fi_ext_gni.h
index c41037b..03251e2 100644
--- a/prov/gni/include/fi_ext_gni.h
+++ b/prov/gni/include/fi_ext_gni.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -65,6 +65,8 @@ typedef enum dom_ops_val { GNI_MSG_RENDEZVOUS_THRESHOLD,
 			   GNI_MR_HARD_REG_LIMIT,
 			   GNI_MR_HARD_STALE_REG_LIMIT,
 			   GNI_XPMEM_ENABLE,
+			   GNI_DGRAM_PROGRESS_TIMEOUT,
+			   GNI_EAGER_AUTO_PROGRESS,
 			   GNI_NUM_DOM_OPS
 } dom_ops_val_t;
 
@@ -74,6 +76,14 @@ typedef enum ep_ops_val {
 	GNI_NUM_EP_OPS,
 } ep_ops_val_t;
 
+#define FI_GNI_FAB_OPS_1 "fab ops 1"
+typedef enum fab_ops_val {
+	GNI_WAIT_THREAD_SLEEP = 0,
+	GNI_DEFAULT_USER_REGISTRATION_LIMIT,
+	GNI_DEFAULT_PROV_REGISTRATION_LIMIT,
+	GNI_NUM_FAB_OPS,
+} fab_ops_val_t;
+
 /* per domain gni provider specific ops */
 struct fi_gni_ops_domain {
 	int (*set_val)(struct fid *fid, dom_ops_val_t t, void *val);
@@ -117,6 +127,58 @@ struct gnix_ops_domain {
 	uint32_t max_retransmits;
 	int32_t err_inject_count;
 	bool xpmem_enabled;
+	uint32_t dgram_progress_timeout;
+	uint32_t eager_auto_progress;
+};
+
+struct fi_gni_ops_fab {
+	int (*set_val)(struct fid *fid, fab_ops_val_t t, void *val);
+	int (*get_val)(struct fid *fid, fab_ops_val_t t, void *val);
+};
+
+typedef enum gnix_auth_key_opt {
+	GNIX_USER_KEY_LIMIT = 0,
+	GNIX_PROV_KEY_LIMIT,
+	GNIX_TOTAL_KEYS_NEEDED,
+	GNIX_MAX_AUTH_KEY_OPTS,
+} gnix_auth_key_opt_t;
+
+struct gnix_auth_key_attr {
+	int user_key_limit;
+	int prov_key_limit;
+};
+
+enum {
+	GNIX_AKT_RAW = 0,
+	GNIX_MAX_AKT_TYPES,
+};
+
+struct fi_gni_raw_auth_key {
+	uint32_t protection_key;
+};
+
+struct fi_gni_auth_key {
+	uint32_t type;
+	union {
+		struct fi_gni_raw_auth_key raw;
+	};
+};
+
+#define GNIX_PROV_DEFAULT_AUTH_KEY NULL
+#define GNIX_PROV_DEFAULT_AUTH_KEYLEN 0
+
+#define FI_GNI_FAB_OPS_2 "fab ops 2"
+struct fi_gni_auth_key_ops_fab {
+	int (*set_val)(
+			uint8_t *auth_key,
+			size_t auth_key_size,
+			gnix_auth_key_opt_t opt,
+			void *val);
+	int (*get_val)(
+			uint8_t *auth_key,
+			size_t auth_key_size,
+			gnix_auth_key_opt_t opt,
+			void *val);
 };
 
 #ifdef __cplusplus
diff --git a/prov/gni/include/gnix.h b/prov/gni/include/gnix.h
index 02ff3d1..e1fdbd4 100644
--- a/prov/gni/include/gnix.h
+++ b/prov/gni/include/gnix.h
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc.  All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  * Copyright (c) 2015-2016 Cisco Systems, Inc.  All rights reserved.
  *
@@ -42,6 +42,7 @@
 
 #include <stdlib.h>
 #include <stdbool.h>
+#include <inttypes.h>
 
 #include <rdma/fabric.h>
 #include <rdma/fi_atomic.h>
@@ -56,8 +57,8 @@
 #include <rdma/fi_trigger.h>
 
 #include <fi.h>
+#include <ofi_atomic.h>
 #include <fi_enosys.h>
-#include <fi_indexer.h>
 #include <fi_rbuf.h>
 #include <fi_list.h>
 #include <fi_file.h>
@@ -76,9 +77,10 @@
 #include "gnix_mr_cache.h"
 #include "gnix_mr_notifier.h"
 #include "gnix_nic.h"
+#include "gnix_auth_key.h"
 
 #define GNI_MAJOR_VERSION 1
-#define GNI_MINOR_VERSION 0
+#define GNI_MINOR_VERSION 1
 
 /*
  * useful macros
@@ -135,7 +137,7 @@
  *
  * Note: "* 2" for head and tail
  */
-#define GNIX_HTD_BUF_SZ (GNIX_MAX_MSG_IOV_LIMIT * GNI_READ_ALIGN * 2)
+#define GNIX_INT_TX_BUF_SZ (GNIX_MAX_MSG_IOV_LIMIT * GNI_READ_ALIGN * 2)
 
 /*
  * Flags
@@ -153,7 +155,6 @@
 
 #define GNIX_MSG_RENDEZVOUS		(1ULL << 61)	/* MSG only flag */
 #define GNIX_MSG_GET_TAIL		(1ULL << 62)	/* MSG only flag */
-#define GNIX_MSG_MULTI_RECV_SUP		(1ULL << 63)	/* MSG only flag */
 
 /*
  * Cray gni provider supported flags for fi_getinfo argument for now, needs
@@ -173,24 +174,26 @@
  * See capabilities section in fi_getinfo.3.
  */
 
+#define GNIX_DOM_CAPS (FI_REMOTE_COMM)
+
 /* Primary capabilities.  Each must be explicitly requested (unless the full
  * set is requested by setting input hints->caps to NULL). */
-#define GNIX_EP_RDM_PRIMARY_CAPS                                               \
+#define GNIX_EP_PRIMARY_CAPS                                               \
 	(FI_MSG | FI_RMA | FI_TAGGED | FI_ATOMICS |                            \
-	 FI_DIRECTED_RECV | FI_READ |                                          \
+	 FI_DIRECTED_RECV | FI_READ | FI_NAMED_RX_CTX |                        \
 	 FI_WRITE | FI_SEND | FI_RECV | FI_REMOTE_READ | FI_REMOTE_WRITE)
 
 /* No overhead secondary capabilities.  These can be silently enabled by the
  * provider. */
-#define GNIX_EP_RDM_SEC_CAPS (FI_MULTI_RECV | FI_TRIGGER | FI_FENCE)
+#define GNIX_EP_SEC_CAPS (FI_MULTI_RECV | FI_TRIGGER | FI_FENCE)
 
 /* Secondary capabilities that introduce overhead.  Must be requested. */
-#define GNIX_EP_RDM_SEC_CAPS_OH (FI_SOURCE | FI_RMA_EVENT)
+#define GNIX_EP_SEC_CAPS_OH (FI_SOURCE | FI_RMA_EVENT | FI_SOURCE_ERR)
 
 /* FULL set of capabilities for the provider.  */
-#define GNIX_EP_RDM_CAPS_FULL (GNIX_EP_RDM_PRIMARY_CAPS | \
-			       GNIX_EP_RDM_SEC_CAPS | \
-			       GNIX_EP_RDM_SEC_CAPS_OH)
+#define GNIX_EP_CAPS_FULL (GNIX_EP_PRIMARY_CAPS | \
+			   GNIX_EP_SEC_CAPS | \
+			   GNIX_EP_SEC_CAPS_OH)
 
 /*
  * see Operations flags in fi_endpoint.3
@@ -215,7 +218,7 @@
 #define GNIX_WRITEMSG_FLAGS	(FI_REMOTE_CQ_DATA | FI_COMPLETION | \
 				 FI_MORE | FI_INJECT | FI_INJECT_COMPLETE | \
 				 FI_TRANSMIT_COMPLETE | FI_FENCE | FI_TRIGGER)
-#define GNIX_READMSG_FLAGS	(FI_REMOTE_CQ_DATA | FI_COMPLETION | FI_MORE | \
+#define GNIX_READMSG_FLAGS	(FI_COMPLETION | FI_MORE | \
 				 FI_FENCE | FI_TRIGGER)
 #define GNIX_ATOMICMSG_FLAGS	(FI_COMPLETION | FI_MORE | FI_INJECT | \
 				 FI_FENCE | FI_TRIGGER)
@@ -235,13 +238,15 @@
  */
 #define GNIX_TX_SIZE_DEFAULT	500
 #define GNIX_RX_SIZE_DEFAULT	500
+/*
+ * based on the max number of fma descriptors without fma sharing
+ */
+#define GNIX_RX_CTX_MAX_BITS	8
+#define GNIX_SEP_MAX_CNT	(1 << (GNIX_RX_CTX_MAX_BITS - 1))
 
 /*
  * if this has to be changed, check gnix_getinfo, etc.
  */
-#define GNIX_EP_MSG_CAPS GNIX_EP_RDM_CAPS
-#define GNIX_EP_MSG_SEC_CAPS GNIX_EP_RDM_SEC_CAPS
-
 #define GNIX_MAX_MSG_SIZE ((0x1ULL << 32) - 1)
 #define GNIX_CACHELINE_SIZE (64)
 #define GNIX_INJECT_SIZE GNIX_CACHELINE_SIZE
@@ -257,8 +262,14 @@
  */
 #define GNIX_FAB_MODES_CLEAR (FI_MSG_PREFIX | FI_ASYNC_IOV)
 
-/*
- * gnix address format - used for fi_send/fi_recv, etc.
+/**
+ * gnix_address struct
+ *
+ * @note - gnix address format - used for fi_send/fi_recv, etc.
+ *         These values are passed to GNI_EpBind
+ *
+ * @var device_addr     physical NIC address of the remote peer
+ * @var cdm_id          user supplied id of the remote instance
  */
 struct gnix_address {
 	uint32_t device_addr;
@@ -278,13 +289,25 @@ struct gnix_address {
 #define GNIX_ADDR_EQUAL(a, b) (((a).device_addr == (b).device_addr) && \
 				((a).cdm_id == (b).cdm_id))
 
+#define GNIX_CREATE_CDM_ID	0
 
-#define GNIX_EPN_TYPE_UNBOUND	0
-#define GNIX_EPN_TYPE_BOUND	1
+#define GNIX_EPN_TYPE_UNBOUND	(1 << 0)
+#define GNIX_EPN_TYPE_BOUND	(1 << 1)
+#define GNIX_EPN_TYPE_SEP	(1 << 2)
 
-/*
- * info returned by fi_getname/fi_getpeer - has enough
- * side band info for RDM ep's to be able to connect, etc.
+/**
+ * gnix_ep_name struct
+ *
+ * @note - info returned by fi_getname/fi_getpeer - has enough
+ *         side band info for RDM ep's to be able to connect, etc.
+ *
+ * @var gnix_addr       address of remote peer
+ * @var name_type       bound, unbound, scalable endpoint name types
+ * @var cm_nic_cdm_id   id of the cm nic associated with this endpoint
+ * @var cookie          communication domain identifier
+ * @var rx_ctx_cnt      number of contexts associated with this endpoint
+ * @var unused1/2       for future use
+ * @var reserved        for future use
  */
 struct gnix_ep_name {
 	struct gnix_address gnix_addr;
@@ -293,17 +316,22 @@ struct gnix_ep_name {
 		uint32_t cm_nic_cdm_id : 24;
 		uint32_t cookie;
 	};
-	uint64_t reserved[4];
+	struct {
+		uint32_t rx_ctx_cnt : 8;
+		uint32_t unused1 : 24;
+		uint32_t unused2;
+	};
+	uint64_t reserved[3];
 };
 
 /* AV address string revision. */
 #define GNIX_AV_STR_ADDR_VERSION  1
 
 /*
- * 49 is the number of characters printed out in gnix_av_straddr.
+ * 52 is the number of characters printed out in gnix_av_straddr.
  *  1 is for the null terminator
  */
-#define GNIX_AV_MAX_STR_ADDR_LEN  (49 + 1)
+#define GNIX_AV_MAX_STR_ADDR_LEN  (52 + 1)
 
 /*
  * 15 is the number of characters for the device addr.
@@ -312,6 +340,12 @@ struct gnix_ep_name {
 #define GNIX_AV_MIN_STR_ADDR_LEN  (15 + 1)
 
 /*
+ * 69 is the number of characters for the printable portion of the address
+ *  1 is for the null terminator
+ */
+#define GNIX_FI_ADDR_STR_LEN (69 + 1)
+
+/*
  * enum for blocking/non-blocking progress
  */
 enum gnix_progress_type {
@@ -339,7 +373,11 @@ struct gnix_fid_fabric {
 	struct gnix_mr_notifier mr_notifier;
 };
 
-extern struct fi_ops_cm gnix_cm_ops;
+extern struct fi_ops_cm gnix_ep_msg_ops_cm;
+extern struct fi_ops_cm gnix_ep_ops_cm;
+
+#define GNIX_GET_MR_CACHE_INFO(domain, auth_key) \
+	({ &(domain)->mr_cache_info[(auth_key)->ptag]; })
 
 /*
  * a gnix_fid_domain is associated with one or more gnix_nic's.
@@ -356,15 +394,10 @@ struct gnix_fid_domain {
 	struct gnix_fid_fabric *fabric;
 	struct gnix_cm_nic *cm_nic;
 	fastlock_t cm_nic_lock;
-	uint8_t ptag;
-	uint32_t cookie;
 	uint32_t cdm_id_seed;
+	uint32_t addr_format;
 	/* user tunable parameters accessed via open_ops functions */
 	struct gnix_ops_domain params;
-	/* size of gni tx cqs for this domain */
-	uint32_t gni_tx_cq_size;
-	/* size of gni rx cqs for this domain */
-	uint32_t gni_rx_cq_size;
 	/* additional gni cq modes to use for this domain */
 	gni_cq_mode_t gni_cq_modes;
 	/* additional gni cq modes to use for this domain */
@@ -373,18 +406,49 @@ struct gnix_fid_domain {
 	enum fi_threading thread_model;
 	struct gnix_reference ref_cnt;
 	gnix_mr_cache_attr_t mr_cache_attr;
-	gnix_mr_cache_t *mr_cache;
-	fastlock_t mr_cache_lock;
+	struct gnix_mr_cache_info *mr_cache_info;
 	struct gnix_mr_ops *mr_ops;
+	fastlock_t mr_cache_lock;
 	int mr_cache_type;
 	/* flag to indicate that memory registration is initialized and should not
 	 * be changed at this point.
 	 */
 	int mr_is_init;
+	int mr_iov_limit;
 	int udreg_reg_limit;
+	struct gnix_auth_key *auth_key;
 #ifdef HAVE_UDREG
 	udreg_cache_handle_t udreg_cache;
 #endif
+	uint32_t num_allocd_stxs;
+};
+
+/**
+ * gnix_fid_pep structure - GNIX passive endpoint
+ *
+ * @var pep_fid		libfabric passive EP fid structure
+ * @var fabric		Fabric associated with this endpoint
+ * @var eq		Event queue bound to this endpoint
+ * @var src_addr	Source address of this endpoint
+ * @var lock		Lock protecting all endpoint fields
+ * @var listen_fd	TCP socket used to listen for connections
+ * @var backlog		Maximum number of pending connetions
+ * @var bound		Flag indicating if the endpoint source address is set
+ * @var cm_data_size	Maximum size of CM data
+ * @var ref_cnt		Endpoint reference count
+ */
+struct gnix_fid_pep {
+	struct fid_pep pep_fid;
+	struct gnix_fid_fabric *fabric;
+	struct fi_info *info;
+	struct gnix_fid_eq *eq;
+	struct gnix_ep_name src_addr;
+	fastlock_t lock;
+	int listen_fd;
+	int backlog;
+	int bound;
+	size_t cm_data_size;
+	struct gnix_reference ref_cnt;
 };
 
 #define GNIX_CQS_PER_EP		8
@@ -400,20 +464,28 @@ struct gnix_fid_ep_ops_en {
 	uint32_t atomic_write_allowed: 1;
 };
 
-#define GNIX_HTD_POOL_SIZE 128
+#define GNIX_INT_TX_POOL_SIZE 128
+#define GNIX_INT_TX_POOL_COUNT 256
 
-struct gnix_htd_buf {
+struct gnix_int_tx_buf {
 	struct slist_entry e;
 	uint8_t *buf;
+	struct gnix_fid_mem_desc *md;
+};
+
+struct gnix_int_tx_ptrs {
+	struct slist_entry e;
+	void *sl_ptr;
+	void *buf_ptr;
+	struct gnix_fid_mem_desc *md;
 };
 
-struct gnix_htd_pool {
+struct gnix_int_tx_pool {
 	bool enabled;
+	int nbufs;
 	fastlock_t lock;
-	struct gnix_fid_mem_desc *md;
 	struct slist sl;
-	void *buf_ptr;
-	void *sl_ptr;
+	struct slist bl;
 };
 
 struct gnix_addr_cache_entry {
@@ -421,6 +493,15 @@ struct gnix_addr_cache_entry {
 	struct gnix_vc *vc;
 };
 
+enum gnix_conn_state {
+	GNIX_EP_UNCONNECTED,
+	GNIX_EP_CONNECTING,
+	GNIX_EP_CONNECTED,
+	GNIX_EP_SHUTDOWN
+};
+
+#define GNIX_EP_CONNECTED(ep)	((ep)->conn_state == GNIX_EP_CONNECTED)
+
 /*
  *   gnix endpoint structure
  *
@@ -445,24 +526,14 @@ struct gnix_fid_ep {
 	struct gnix_fid_cntr *rread_cntr;
 	struct gnix_fid_av *av;
 	struct gnix_fid_stx *stx_ctx;
-	struct gnix_ep_name my_name;
 	struct gnix_cm_nic *cm_nic;
 	struct gnix_nic *nic;
 	fastlock_t vc_lock;
-	union {
-		struct gnix_hashtable *vc_ht;	/* FI_AV_MAP */
-		struct gnix_vector *vc_table;	/* FI_AV_TABLE */
-	};
-	struct gnix_vc *vc;		/* used for FI_EP_MSG */
-	struct dlist_entry unmapped_vcs;
-	/* lock for unexp and posted recv queue */
-	fastlock_t recv_queue_lock;
 	/* used for unexpected receives */
 	struct gnix_tag_storage unexp_recv_queue;
 	/* used for posted receives */
 	struct gnix_tag_storage posted_recv_queue;
 
-	fastlock_t tagged_queue_lock;
 	struct gnix_tag_storage tagged_unexp_recv_queue;
 	struct gnix_tag_storage tagged_posted_recv_queue;
 
@@ -473,7 +544,9 @@ struct gnix_fid_ep {
 	struct gnix_xpmem_handle *xpmem_hndl;
 	bool tx_enabled;
 	bool rx_enabled;
+	bool shared_tx;
 	bool requires_lock;
+	struct gnix_auth_key *auth_key;
 	int last_cached;
 	struct gnix_addr_cache_entry addr_cache[GNIX_ADDR_CACHE_SIZE];
 	int send_selective_completion;
@@ -481,9 +554,31 @@ struct gnix_fid_ep {
 	int min_multi_recv;
 	/* note this free list will be initialized for thread safe */
 	struct gnix_freelist fr_freelist;
-	struct gnix_htd_pool htd_pool;
+	struct gnix_int_tx_pool int_tx_pool;
 	struct gnix_reference ref_cnt;
 	struct gnix_fid_ep_ops_en ep_ops;
+
+	struct fi_info *info;
+	struct fi_ep_attr ep_attr;
+	struct gnix_ep_name src_addr;
+
+	/* FI_EP_MSG specific. */
+	struct gnix_vc *vc;
+	int conn_fd;
+	int conn_state;
+	struct gnix_ep_name dest_addr;
+	struct gnix_fid_eq *eq;
+
+	/* Unconnected EP specific. */
+	union {
+		struct gnix_hashtable *vc_ht;	/* FI_AV_MAP */
+		struct gnix_vector *vc_table;	/* FI_AV_TABLE */
+	};
+	struct dlist_entry unmapped_vcs;
+
+	/* FI_MORE specific. */
+	struct slist more_read;
+	struct slist more_write;
 };
 
 #define GNIX_EP_RDM(type)         (type == FI_EP_RDM)
@@ -498,24 +593,103 @@ struct gnix_fid_ep {
 				   (type == FI_EP_MSG))
 
 /**
+ * gnix_fid_sep struct
+ *
+ * @var ep_fid          embedded struct fid_ep field
+ * @var domain          pointer to domain used to create the sep instance
+ * @var info            pointer to dup of info struct supplied to fi_scalable_ep
+ *                      operation
+ * @var op_flags        quick access for op_flags for tx/rx contexts
+ *                      instantiated using this sep
+ * @var caps            quick access for caps for tx/rx contexts instantiated
+ *                      using this sep
+ * @var cdm_id_base     base cdm id to use for tx/rx contexts instantiated
+ *                      using this sep
+ * @var ep_table        array of pointers to EPs used by the rx/tx contexts
+ *                      instantiated using this sep
+ * @var tx_ep_table     array of pointers to tx contexts instantiated using
+ *                      this sep
+ * @var rx_ep_table     array of pointers to rx contexts instantiated using
+ *                      this sep
+ * @var cm_nic          gnix cm nic associated with this SEP.
+ * @var av              address vector bound to this SEP
+ * @var my_name         ep name for this endpoint
+ * @var sep_lock        lock protecting this sep object
+ * @var ref_cnt         ref cnt on this object
+ * @var auth_key		GNIX authorization key
+ */
+struct gnix_fid_sep {
+	struct fid_ep ep_fid;
+	enum fi_ep_type type;
+	struct fid_domain *domain;
+	struct fi_info *info;
+	uint64_t caps;
+	uint32_t cdm_id_base;
+	struct fid_ep **ep_table;
+	struct fid_ep **tx_ep_table;
+	struct fid_ep **rx_ep_table;
+	struct gnix_cm_nic *cm_nic;
+	struct gnix_fid_av *av;
+	struct gnix_ep_name my_name;
+	fastlock_t sep_lock;
+	struct gnix_reference ref_cnt;
+	struct gnix_auth_key *auth_key;
+};
+
+/**
+ * gnix_fid_trx struct
+ *
+ * @var ep_fid          embedded struct fid_ep field
+ * @var ep              pointer to gnix_fid_ep used by this tx/rx context
+ * @var sep             pointer to associated gnix_fid_sep for this context
+ * @var op_flags        op flags for this tx context
+ * @var caps            caps for this tx context
+ * @var ref_cnt         ref cnt on this object
+ */
+struct gnix_fid_trx {
+	struct fid_ep ep_fid;
+	struct gnix_fid_ep *ep;
+	struct gnix_fid_sep *sep;
+	uint64_t op_flags;
+	uint64_t caps;
+	struct gnix_reference ref_cnt;
+};
+
+/**
  * gnix_fid_stx struct
- * @note - this is essentially a dummy structure for the GNI
- *         provider.  Added as a convenience for those consumers
- *         who need to use the fid_stx construct for other
- *         providers.
+ * @note - another way to associated gnix_nic's with an ep
  *
  * @var stx_fid              embedded struct fid_stx field
  * @var domain               pointer to domain used to create the stx instance
+ * @var nic                  pointer to gnix_nic associated with this stx
  * @var ref_cnt              ref cnt on this object
  */
 struct gnix_fid_stx {
 	struct fid_stx stx_fid;
 	struct gnix_fid_domain *domain;
+	struct gnix_nic *nic;
+	struct gnix_auth_key *auth_key;
 	struct gnix_reference ref_cnt;
 };
 
-/*
- * TODO: Support shared named AVs
+/**
+ * gnix_fid_av struct
+ * @TODO - Support shared named AVs
+ *
+ * @var fid_av          embedded struct fid_stx field
+ * @var domain          pointer to domain used to create the av
+ * @var type            the type of the AV, FI_AV_{TABLE,MAP}
+ * @var table
+ * @var valid_entry_vec
+ * @var addrlen
+ * @var capacity        current size of AV
+ * @var count           number of address are currently stored in AV
+ * @var rx_ctx_bits     address bits to identify an rx context
+ * @var mask            mask of the fi_addr to resolve the base address
+ * @var map_ht          Hash table for mapping FI_AV_MAP
+ * @var block_list      linked list of blocks used for allocating entries
+ *                      for FI_AV_MAP
+ * @var ref_cnt         ref cnt on this object
  */
 struct gnix_fid_av {
 	struct fid_av av_fid;
@@ -524,16 +698,11 @@ struct gnix_fid_av {
 	struct gnix_av_addr_entry* table;
 	int *valid_entry_vec;
 	size_t addrlen;
-	/* How many addresses AV can hold before it needs to be resized */
 	size_t capacity;
-	/* How many address are currently stored in AV */
 	size_t count;
-	/* Hash table for mapping FI_AV_MAP */
+	uint64_t rx_ctx_bits;
+	uint64_t mask;
 	struct gnix_hashtable *map_ht;
-	/*
-	 * linked list of blocks used for allocating entries
-	 *  for FI_AV_MAP
-	 */
 	struct slist block_list;
 	struct gnix_reference ref_cnt;
 };
@@ -549,6 +718,7 @@ enum gnix_fab_req_type {
 	GNIX_FAB_RQ_RECVV,
 	GNIX_FAB_RQ_TRECV,
 	GNIX_FAB_RQ_TRECVV,
+	GNIX_FAB_RQ_MRECV,
 	GNIX_FAB_RQ_AMO,
 	GNIX_FAB_RQ_FAMO,
 	GNIX_FAB_RQ_CAMO,
@@ -568,8 +738,9 @@ struct gnix_fab_req_rma {
 	uint64_t                 rem_addr;
 	uint64_t                 rem_mr_key;
 	uint64_t                 imm;
-	atomic_t                 outstanding_txds;
+	ofi_atomic32_t           outstanding_txds;
 	gni_return_t             status;
+	struct slist_entry       sle;
 };
 
 struct gnix_fab_req_msg {
@@ -586,6 +757,9 @@ struct gnix_fab_req_msg {
 	size_t                       send_iov_cnt;
 	uint64_t                     send_flags;
 	size_t			     cum_send_len;
+	struct gnix_fab_req 	     *parent;
+	size_t                       mrecv_space_left;
+	uint64_t                     mrecv_buf_addr;
 
 	struct recv_info_t {
 		uint64_t	 recv_addr;
@@ -602,17 +776,12 @@ struct gnix_fab_req_msg {
 	uint64_t                     recv_flags; /* protocol, API info */
 	size_t			     cum_recv_len;
 
-	/* @var htd_buf->buf "head(H) tail(T) data buf" layout: '[T|T|...|H|H]' */
-	struct slist_entry	     *htd_buf_e;
-	uint8_t			     *htd_buf;
-	gni_mem_handle_t	     htd_mdh;
-
 	uint64_t                     tag;
 	uint64_t                     ignore;
 	uint64_t                     imm;
 	gni_mem_handle_t             rma_mdh;
 	uint64_t                     rma_id;
-	atomic_t                     outstanding_txds;
+	ofi_atomic32_t               outstanding_txds;
 	gni_return_t                 status;
 };
 
@@ -627,7 +796,6 @@ struct gnix_fab_req_amo {
 	enum fi_op               op;
 	uint64_t                 first_operand;
 	uint64_t                 second_operand;
-	void                     *read_buf;
 };
 
 /*
@@ -837,6 +1005,9 @@ static inline int gnix_ops_allowed(struct gnix_fid_ep *ep,
  * @var work_fn	     the function called by the nic progress loop to initiate
  * the fabric request.
  * @var flags	      a set of bit patterns that apply to all message types
+ * @cb                optional call back to be invoked when ref cnt on this
+ *                    object drops to zero
+ * @ref_cnt           ref cnt for this object
  * @var iov_txds      A list of pending Rdma/CtFma GET txds.
  * @var iov_txd_cnt   The count of outstanding iov txds.
  * @var tx_failures   tx failure bits.
@@ -853,8 +1024,13 @@ struct gnix_fab_req {
 	struct gnix_vc            *vc;
 	int                       (*work_fn)(void *);
 	uint64_t                  flags;
+	void                      (*cb)(void *);
+	struct gnix_reference     ref_cnt;
+
+	struct slist_entry           *int_tx_buf_e;
+	uint8_t                      *int_tx_buf;
+	gni_mem_handle_t             int_tx_mdh;
 
-	/* TODO: change the size of this for unaligned data? */
 	struct gnix_tx_descriptor *iov_txds[GNIX_MAX_MSG_IOV_LIMIT];
 	/*
 	 * special value of UINT_MAX is used to indicate
@@ -865,9 +1041,9 @@ struct gnix_fab_req {
 
 	/* common to rma/amo/msg */
 	union {
-		struct gnix_fab_req_rma rma;
-		struct gnix_fab_req_msg msg;
-		struct gnix_fab_req_amo amo;
+		struct gnix_fab_req_rma   rma;
+		struct gnix_fab_req_msg   msg;
+		struct gnix_fab_req_amo   amo;
 	};
 	char inject_buf[GNIX_INJECT_SIZE];
 };
@@ -917,6 +1093,15 @@ static inline int _gnix_req_inject_smsg_err(struct gnix_fab_req *req)
 	}
 }
 
+extern int gnix_default_user_registration_limit;
+extern int gnix_default_prov_registration_limit;
+extern int gnix_dealloc_aki_on_fabric_close;
+
+/* This is a per-node limitation of the GNI provider. Each process
+   should request only as many registrations as it intends to use
+   and no more than that. */
+#define GNIX_MAX_SCALABLE_REGISTRATIONS 4096
+
 /*
  * work queue struct, used for handling delay ops, etc. in a generic wat
  */
@@ -942,7 +1127,7 @@ struct gnix_work_req {
 extern const char gnix_fab_name[];
 extern const char gnix_dom_name[];
 extern uint32_t gnix_cdm_modes;
-extern atomic_t gnix_id_counter;
+extern ofi_atomic32_t gnix_id_counter;
 
 
 /*
@@ -969,7 +1154,11 @@ int gnix_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		 struct fid_cq **cq, void *context);
 
 int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
-		 struct fid_ep **ep, void *context);
+		   struct fid_ep **ep, void *context);
+
+int gnix_pep_open(struct fid_fabric *fabric,
+		  struct fi_info *info, struct fid_pep **pep,
+		  void *context);
 
 int gnix_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 		 struct fid_eq **eq, void *context);
@@ -978,9 +1167,28 @@ int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
 		uint64_t access, uint64_t offset, uint64_t requested_key,
 		uint64_t flags, struct fid_mr **mr_o, void *context);
 
+int gnix_mr_regv(struct fid *fid, const struct iovec *iov,
+                 size_t count, uint64_t access,
+                 uint64_t offset, uint64_t requested_key,
+                 uint64_t flags, struct fid_mr **mr, void *context);
+
+int gnix_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
+                    uint64_t flags, struct fid_mr **mr);
+
 int gnix_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 		 struct fid_cntr **cntr, void *context);
 
+int gnix_sep_open(struct fid_domain *domain, struct fi_info *info,
+		 struct fid_ep **sep, void *context);
+
+int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags);
+
+int gnix_ep_close(fid_t fid);
+
+/*
+ * prototype for static data initialization method
+ */
+void _gnix_init(void);
 
 /* Prepend DIRECT_FN to provider specific API functions for global visibility
  * when using fabric direct.  If the API function is static use the STATIC
diff --git a/prov/gni/include/gnix_atomic.h b/prov/gni/include/gnix_atomic.h
index d928f5b..56e3f29 100644
--- a/prov/gni/include/gnix_atomic.h
+++ b/prov/gni/include/gnix_atomic.h
@@ -34,6 +34,9 @@
 #ifndef _GNIX_ATOMIC_H_
 #define _GNIX_ATOMIC_H_
 
+#define GNIX_ATOMIC_WRITE_FLAGS_DEF	(FI_ATOMIC | FI_WRITE)
+#define GNIX_ATOMIC_READ_FLAGS_DEF	(FI_ATOMIC | FI_READ)
+
 int _gnix_atomic_cmd(enum fi_datatype dt, enum fi_op op,
 		     enum gnix_fab_req_type fr_type);
 ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
diff --git a/prov/gni/include/gnix_auth_key.h b/prov/gni/include/gnix_auth_key.h
new file mode 100644
index 0000000..233412b
--- /dev/null
+++ b/prov/gni/include/gnix_auth_key.h
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2017 Cray Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef PROV_GNI_INCLUDE_GNIX_AUTH_KEY_H_
+#define PROV_GNI_INCLUDE_GNIX_AUTH_KEY_H_
+
+#include <fi_lock.h>
+
+#include "fi_ext_gni.h"
+#include "gnix_bitmap.h"
+
+/*
+ * GNIX Authorization keys are directly associated with a specific GNI network
+ * key. There are some limitations to GNI network keys that should be noted.
+ *
+ * GNI network keys are directly associated with memory registrations, and
+ * can only support a single type of memory mode at a time. This means that
+ * the memory mode must be tracked with the authorization key, and must exist
+ * as globally known information. Since references to objects may still exist
+ * after the fabric is closed, this information must persist unless the
+ * application has promised not to open any more GNI fabric instances.
+ * See fi_gni man page for guidance on GNI_DEALLOC_AKI_ON_FABRIC_CLOSE.
+ */
+
+/**
+ * GNIX authorization key construct
+ *
+ * @var lock      lock for data structure
+ * @var attr      authorization key attributes
+ * @var enabled   Is this authorization key live? If so, refuse changes to limits
+ * @var mr_mode   mr_mode bits associated with the authorization key
+ * @var prov      bitmap for detecting provider key usage
+ * @var user      bitmap for detecting user key usage
+ */
+struct gnix_auth_key {
+	fastlock_t lock;
+	struct gnix_auth_key_attr attr;
+	int enabled;
+	uint8_t ptag;
+	uint32_t cookie;
+	int mr_mode;
+	gnix_bitmap_t prov;
+	gnix_bitmap_t user;
+};
+
+/**
+ * Allocates an authorization key structure, if possible
+ *
+ * @return  non-NULL pointer to initialized memory on success
+ *          NULL on failure
+ */
+struct gnix_auth_key *_gnix_auth_key_alloc();
+
+/**
+ * Frees an authorization key structure
+ *
+ * @param key    A GNI authorization key structure to free
+ * @return       0 on success
+ *               -FI_EINVAL, if invalid parameter passed as key
+ */
+int _gnix_auth_key_free(struct gnix_auth_key *key);
+
+/**
+ * Lookup an authorization key in global data storage
+ *
+ * @param auth_key     authorization key
+ * @param auth_key_size  length of authorization key in bytes
+ * @return             non-NULL pointer on success
+ *                     NULL pointer if not found
+ */
+struct gnix_auth_key *_gnix_auth_key_lookup(
+		uint8_t *auth_key,
+		size_t auth_key_size);
+
+/**
+ * Enables and prevents further limit modifications for an authorization key
+ *
+ * @param key  GNI authorization key
+ * @return     FI_SUCCESS on success
+ *             -FI_EINVAL, if bad parameters were passed
+ *             -FI_EBUSY, if already enabled
+ */
+
+int _gnix_auth_key_enable(struct gnix_auth_key *key);
+
+/**
+ * Retrieves the next available provider-reserved key for a given
+ * authorization key
+ *
+ * @param info  A GNI authorization key
+ * @return      FI_SUCCESS on success
+ *              -FI_EINVAL, if bad parameters were passed
+ *              -FI_EAGAIN, if no available key could be foundi
+ */
+int _gnix_get_next_reserved_key(struct gnix_auth_key *info);
+
+/**
+ * Releases a reserved key back to the bitset to be reused
+ *
+ * @param info          A GNI authorization key
+ * @param reserved_key  index of the reserved key
+ * @return              FI_SUCCESS on success
+ *                      -FI_EINVAL, if invalid parameters were passed
+ *                      -FI_EBUSY, if reserved key was already released
+ */
+int _gnix_release_reserved_key(struct gnix_auth_key *info, int reserved_key);
+
+/**
+ * Creates an authorization key from default configuration
+ *
+ * @param auth_key     authorization key
+ * @param auth_key_size  length of authorization key in bytes
+ * @return             non-NULL pointer on success
+ *                     NULL pointer on failure
+ */
+struct gnix_auth_key *_gnix_auth_key_create(
+		uint8_t *auth_key,
+		size_t auth_key_size);
+
+/**
+ * Inserts an authorization key into global data storage
+ *
+ * @param auth_key     authorization key
+ * @param auth_key_size  length of authorization key in bytes
+ * @param to_insert    GNI authorization key structure to insert
+ * @return             FI_SUCCESS on success
+ *                     -FI_EINVAL, if to_insert is NULL or global data
+ *                                 storage is destroyed
+ *                     -FI_ENOSPC, if auth key exists in global data
+ *                                 storage
+ */
+int _gnix_auth_key_insert(
+		uint8_t *auth_key,
+		size_t auth_key_size,
+		struct gnix_auth_key *to_insert);
+
+#define GNIX_GET_AUTH_KEY(auth_key, auth_key_size) \
+	({ \
+		struct gnix_auth_key *_tmp; \
+		_tmp  = _gnix_auth_key_lookup((auth_key), (auth_key_size)); \
+		int _tmp_ret; \
+		if (!_tmp) { \
+			GNIX_INFO(FI_LOG_FABRIC, \
+				"failed to find authorization " \
+				"key, creating new authorization key\n"); \
+			_tmp = _gnix_auth_key_create( \
+				(auth_key), (auth_key_size)); \
+			if (!_tmp) { \
+				GNIX_DEBUG(FI_LOG_FABRIC, \
+					"failed to create new " \
+					"authorization key, "\
+					"another thread beat us to the insert " \
+					"- searching again\n"); \
+				_tmp = _gnix_auth_key_lookup((auth_key), \
+					(auth_key_size)); \
+				assert(_tmp); \
+			} \
+			_tmp_ret = _gnix_auth_key_enable(_tmp); \
+			if (_tmp_ret) { \
+				GNIX_WARN(FI_LOG_FABRIC, \
+					"failed to enable new " \
+					"authorization key\n"); \
+			} \
+		} \
+		_tmp; \
+	})
+
+/* provider subsystem initialization and teardown functions */
+int _gnix_auth_key_subsys_init(void);
+int _gnix_auth_key_subsys_fini(void);
+
+#endif /* PROV_GNI_INCLUDE_GNIX_AUTH_KEY_H_ */
diff --git a/prov/gni/include/gnix_av.h b/prov/gni/include/gnix_av.h
index 95b7f99..0bebdff 100644
--- a/prov/gni/include/gnix_av.h
+++ b/prov/gni/include/gnix_av.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -55,6 +55,7 @@
  *                           is associated
  * @var cookie               RDMA cookie credential for the endpoint
  *                           this entry corresponds to
+ * @var rx_ctx_cnt           number of contexts associated with this AV
  */
 struct gnix_av_addr_entry {
 	struct gnix_address gnix_addr;
@@ -63,6 +64,10 @@ struct gnix_av_addr_entry {
 		uint32_t cm_nic_cdm_id : 24;
 		uint32_t cookie;
 	};
+	struct {
+		uint32_t rx_ctx_cnt : 8;
+		uint32_t unused1 : 24;
+	};
 };
 
 /*
@@ -99,36 +104,6 @@ int _gnix_av_reverse_lookup(struct gnix_fid_av *gnix_av,
  ******************************************************************************/
 
 /**
- * @brief (FI_AV_TABLE) Return the gnix address using its corresponding
- * fi_addr.
- *
- * @param[in] int_av		The AV to use for the lookup.
- * @param[in] fi_addr		The corresponding fi_addr_t.
- * @param[in/out] entry_ptr	pointer to an av entry struct
- *
- * @return FI_SUCCESS on successfully looking up the entry in the entry table.
- * @return -FI_EINVAL upon passing an invalid parameter.
- */
-int _gnix_table_lookup(struct gnix_fid_av *int_av,
-		       fi_addr_t fi_addr,
-		       struct gnix_av_addr_entry *entry_ptr);
-
-/**
- * @brief (FI_AV_MAP) Return the gnix address using its corresponding
- * fi_addr.
- *
- * @param[in] int_av		The AV to use for the lookup.
- * @param[in] fi_addr		The corresponding fi_addr_t.
- * @param[in/out] entry_ptr	pointer to an av entry struct
- *
- * @return FI_SUCCESS on successfully looking up the entry in the entry table.
- * @return -FI_EINVAL upon passing an invalid parameter.
- */
-int _gnix_map_lookup(struct gnix_fid_av *int_av,
-		     fi_addr_t fi_addr,
-		     struct gnix_av_addr_entry *entry_ptr);
-
-/**
  * @brief (FI_AV_TABLE) Return fi_addr using its corresponding gnix address.
  *
  * @param[in] int_av		The AV to use for the lookup.
diff --git a/prov/gni/include/gnix_cm.h b/prov/gni/include/gnix_cm.h
new file mode 100644
index 0000000..0ca7bb3
--- /dev/null
+++ b/prov/gni/include/gnix_cm.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2017 Los Alamos National Security, LLC. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef _GNIX_CM_H_
+#define _GNIX_CM_H_
+
+#include "gnix.h"
+
+#define GNIX_CM_DATA_MAX_SIZE	256
+#define GNIX_CM_EQE_BUF_SIZE	(sizeof(struct fi_eq_cm_entry) + \
+				 GNIX_CM_DATA_MAX_SIZE)
+
+struct gnix_pep_sock_connreq {
+	struct fi_info info;
+	struct gnix_ep_name src_addr;
+	struct gnix_ep_name dest_addr;
+	struct fi_tx_attr tx_attr;
+	struct fi_rx_attr rx_attr;
+	struct fi_ep_attr ep_attr;
+	struct fi_domain_attr domain_attr;
+	struct fi_fabric_attr fabric_attr;
+	int vc_id;
+	gni_smsg_attr_t vc_mbox_attr;
+	gni_mem_handle_t cq_irq_mdh;
+	uint64_t peer_caps;
+	size_t cm_data_len;
+	char eqe_buf[GNIX_CM_EQE_BUF_SIZE];
+};
+
+enum gnix_pep_sock_resp_cmd {
+	GNIX_PEP_SOCK_RESP_ACCEPT,
+	GNIX_PEP_SOCK_RESP_REJECT
+};
+
+struct gnix_pep_sock_connresp {
+	enum gnix_pep_sock_resp_cmd cmd;
+	int vc_id;
+	gni_smsg_attr_t vc_mbox_attr;
+	gni_mem_handle_t cq_irq_mdh;
+	uint64_t peer_caps;
+	size_t cm_data_len;
+	char eqe_buf[GNIX_CM_EQE_BUF_SIZE];
+};
+
+struct gnix_pep_sock_conn {
+	struct fid fid;
+	struct dlist_entry list;
+	int sock_fd;
+	struct gnix_pep_sock_connreq req;
+	int bytes_read;
+	struct fi_info *info;
+};
+
+int _gnix_pep_progress(struct gnix_fid_pep *pep);
+int _gnix_ep_progress(struct gnix_fid_ep *ep);
+
+/**
+ * Parse a given address (of format FI_ADDR_GNI) into FI_ADDR_STR.
+ * @param ep_name [IN]     the FI_ADDR_GNI address.
+ * @param out_buf [IN/OUT] the FI_ADDR_STR address.
+ * @return either FI_SUCCESS or a negative integer on failure.
+ */
+int _gnix_ep_name_to_str(struct gnix_ep_name *ep_name, char **out_buf);
+
+/**
+ * Parse a given address (of format FI_ADDR_STR) into FI_ADDR_GNI.
+ * @param addr[IN]           the FI_ADDR_STR address.
+ * @param resolved_addr[OUT] the FI_ADDR_GNI address.
+ * @return either FI_SUCCESS or a negative integer on failure.
+ */
+int _gnix_ep_name_from_str(const char *addr,
+			    struct gnix_ep_name *resolved_addr);
+
+/**
+ * Find a FI_ADDR_GNI.
+ * @param ep_name[IN]  the array of addresses.
+ * @param idx    [IN]  the index of the desired address.
+ * @param addr   [OUT] the desired address.
+ */
+static inline void
+_gnix_resolve_gni_ep_name(const char *ep_name, int idx,
+			   struct gnix_ep_name *addr)
+{
+	static size_t addr_size = sizeof(struct gnix_ep_name);
+
+	GNIX_TRACE(FI_LOG_TRACE, "\n");
+
+	/*TODO (optimization): Just return offset into ep_name */
+	memcpy(addr, &ep_name[addr_size * idx], addr_size);
+}
+
+/**
+ * Find and convert a FI_ADDR_STR to FI_ADDR_GNI.
+ * @param ep_name [IN]  the FI_ADDR_STR address.
+ * @param idx     [IN]  the index of the desired address.
+ * @param addr    [OUT] the desired address converted to FI_ADDR_GNI.
+ */
+static inline void
+_gnix_resolve_str_ep_name(const char *ep_name, int idx,
+			   struct gnix_ep_name *addr)
+{
+	static size_t addr_size = GNIX_FI_ADDR_STR_LEN;
+
+	GNIX_TRACE(FI_LOG_TRACE, "\n");
+
+	_gnix_ep_name_from_str(&ep_name[addr_size * idx], addr);
+}
+
+/**
+ * Find and resolve the given ep_name.
+ *
+ * @param ep_name [IN]  the ep name to resolve.
+ * @param idx     [IN]  the index of the desired address.
+ * @param addr    [OUT] the desired address.
+ * @param domain  [IN]  the given domain.
+ */
+static inline void
+_gnix_get_ep_name(const char *ep_name, int idx, struct gnix_ep_name *addr,
+		  struct gnix_fid_domain *domain)
+{
+	/* Use a function pointer to resolve the address */
+	if (domain->addr_format == FI_ADDR_STR) {
+		_gnix_resolve_str_ep_name(ep_name, idx, addr);
+	} else {
+		_gnix_resolve_gni_ep_name(ep_name, idx, addr);
+	}
+}
+#endif
+
diff --git a/prov/gni/include/gnix_cm_nic.h b/prov/gni/include/gnix_cm_nic.h
index 5a7e1b7..5500651 100644
--- a/prov/gni/include/gnix_cm_nic.h
+++ b/prov/gni/include/gnix_cm_nic.h
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -39,6 +39,9 @@
 
 #define GNIX_CM_NIC_MAX_MSG_SIZE (GNI_DATAGRAM_MAXSIZE - sizeof(uint8_t))
 
+extern struct dlist_entry gnix_cm_nic_list;
+extern pthread_mutex_t gnix_cm_nic_list_lock;
+
 typedef int gnix_cm_nic_rcv_cb_func(struct gnix_cm_nic *cm_nic,
 				    char *rbuf,
 				    struct gnix_address addr);
@@ -46,6 +49,7 @@ typedef int gnix_cm_nic_rcv_cb_func(struct gnix_cm_nic *cm_nic,
 /**
  * @brief GNI provider connection management (cm) nic structure
  *
+ * @var cm_nic_list    global CM NIC list element
  * @var nic            pointer to gnix_nic associated with this cm nic
  * @var dgram_hndl     handle to dgram allocator associated with this nic
  * @var fabric         GNI provider fabric associated with this nic
@@ -64,9 +68,10 @@ typedef int gnix_cm_nic_rcv_cb_func(struct gnix_cm_nic *cm_nic,
  * @var device_id      local Aries device id associated with this nic.
  */
 struct gnix_cm_nic {
+	struct dlist_entry cm_nic_list;
 	struct gnix_nic *nic;
 	struct gnix_dgram_hndl *dgram_hndl;
-	struct gnix_fid_fabric *fabric;
+	struct gnix_fid_domain *domain;
 	struct gnix_hashtable *addr_to_ep_ht;
 	fastlock_t wq_lock;
 	struct dlist_entry cm_nic_wq;
@@ -128,6 +133,7 @@ int _gnix_cm_nic_free(struct gnix_cm_nic *cm_nic);
  * @param[in]  domain   pointer to a previously allocated gnix_fid_domain struct
  * @param[in]  info     pointer to fi_info struct returned from fi_getinfo (may
  *                      be NULL)
+ * @param[in]  cdm_id   cdm id to be used for this cm nic
  * @param[out] cm_nic   pointer to address where address of the allocated
  *                      cm nic structure should be returned
  * @return              FI_SUCCESS on success, -EINVAL on invalid argument,
@@ -137,6 +143,7 @@ int _gnix_cm_nic_free(struct gnix_cm_nic *cm_nic);
 int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 		       struct fi_info *info,
 		       uint32_t cdm_id,
+			   struct gnix_auth_key *auth_key,
 		       struct gnix_cm_nic **cm_nic);
 
 /**
@@ -150,13 +157,13 @@ int _gnix_cm_nic_enable(struct gnix_cm_nic *cm_nic);
 /**
  * @brief poke the cm nic's progress engine
  *
- * @param[in] cm_nic   pointer to previously allocated gnix_cm_nic struct
- * @return              FI_SUCCESS on success, -EINVAL on invalid argument.
+ * @param[in] arg      pointer to previously allocated gnix_cm_nic struct
+ * @return             FI_SUCCESS on success, -EINVAL on invalid argument.
  *                     Other error codes may be returned depending on the
  *                     error codes returned from callback function
  *                     that had been added to the nic's work queue.
  */
-int _gnix_cm_nic_progress(struct gnix_cm_nic *cm_nic);
+int _gnix_cm_nic_progress(void *arg);
 
 /**
  * @brief generate a cdm_id to be used in call to  GNI_CdmCreate based on a seed
@@ -179,4 +186,29 @@ int _gnix_cm_nic_create_cdm_id(struct gnix_fid_domain *domain, uint32_t *id);
 int _gnix_get_new_cdm_id_set(struct gnix_fid_domain *domain, int nids,
 				uint32_t *id);
 
+/**
+ * @brief helper function to quickly check whether progress is required on
+ *        a cm_nic
+ *
+ * @param cm_nic  pointer to previously allocated gnix_cm_nic struct
+ * @return true if progress is needed, otherwise false
+ */
+static inline bool _gnix_cm_nic_need_progress(struct gnix_cm_nic *cm_nic)
+{
+	bool ret;
+
+	/*
+	 * if control progress is manual, always need to progress
+	 */
+	if (cm_nic->domain->control_progress == FI_PROGRESS_MANUAL)
+		return true;
+
+	/*
+	 * otherwise we only need to see if the wq has stuff to
+	 * progress
+	 */
+	ret = (dlist_empty(&cm_nic->cm_nic_wq)) ? false : true;
+	return ret;
+}
+
 #endif /* _GNIX_CM_NIC_H_ */
diff --git a/prov/gni/include/gnix_cntr.h b/prov/gni/include/gnix_cntr.h
index 2b32247..597e061 100644
--- a/prov/gni/include/gnix_cntr.h
+++ b/prov/gni/include/gnix_cntr.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -37,28 +37,21 @@
 #include <fi.h>
 
 #include "gnix.h"
+#include "gnix_progress.h"
 #include "gnix_wait.h"
 #include "gnix_util.h"
 
-/* many to many relationship between counters and polled NICs */
-struct gnix_cntr_poll_nic {
-	struct dlist_entry list;
-	int ref_cnt;
-	struct gnix_nic *nic;
-};
-
 struct gnix_fid_cntr {
 	struct fid_cntr cntr_fid;
 	struct gnix_fid_domain *domain;
 	struct fid_wait *wait;
 	struct fi_cntr_attr attr;
-	rwlock_t nic_lock;
-	struct dlist_entry poll_nics;
-	atomic_t cnt;
-	atomic_t cnt_err;
+	ofi_atomic32_t cnt;
+	ofi_atomic32_t cnt_err;
 	struct gnix_reference ref_cnt;
 	struct dlist_entry trigger_list;
 	fastlock_t trigger_lock;
+	struct gnix_prog_set pset;
 	bool requires_lock;
 };
 
@@ -79,21 +72,25 @@ int _gnix_cntr_inc(struct gnix_fid_cntr *cntr);
 int _gnix_cntr_inc_err(struct gnix_fid_cntr *cntr);
 
 /**
- * @brief              Add a nic to the set of nics progressed when fi_cntr_read
+ * @brief              Add an object to the list progressed when fi_cntr_read
  *                     and related functions are called.
  * @param[in] cntr     pointer to previously allocated gnix_fid_cntr structure
- * @param[in] nic      pointer to previously allocated gnix_nic structure
+ * @param[in] obj      pointer to object to add to the progress list.
+ * @param[in] prog_fn  object progress function
  * @return             FI_SUCCESS on success, -FI_EINVAL on invalid argument
  */
-int _gnix_cntr_poll_nic_add(struct gnix_fid_cntr *cntr, struct gnix_nic *nic);
+int _gnix_cntr_poll_obj_add(struct gnix_fid_cntr *cntr, void *obj,
+			    int (*prog_fn)(void *data));
 
 /**
- * @brief              remove a nic from the set of nics progressed when fi_cntr_read
- *                     and related functions are called.
+ * @brief              Remove an object from the list progressed when
+ *                     fi_cntr_read and related functions are called.
  * @param[in] cntr     pointer to previously allocated gnix_fid_cntr structure
- * @param[in] nic      pointer to previously allocated gnix_nic structure
+ * @param[in] obj      pointer to previously added object
+ * @param[in] prog_fn  object progress function
  * @return             FI_SUCCESS on success, -FI_EINVAL on invalid argument
  */
-int _gnix_cntr_poll_nic_rem(struct gnix_fid_cntr *cntr, struct gnix_nic *nic);
+int _gnix_cntr_poll_obj_rem(struct gnix_fid_cntr *cntr, void *obj,
+			    int (*prog_fn)(void *data));
 
 #endif
diff --git a/prov/gni/include/gnix_cq.h b/prov/gni/include/gnix_cq.h
index aade2c9..ba281a7 100644
--- a/prov/gni/include/gnix_cq.h
+++ b/prov/gni/include/gnix_cq.h
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -36,6 +37,7 @@
 
 #include <fi.h>
 
+#include "gnix_progress.h"
 #include "gnix_queue.h"
 #include "gnix_wait.h"
 #include "gnix_util.h"
@@ -44,6 +46,10 @@
 
 #define GNIX_CQ_DEFAULT_FORMAT struct fi_cq_entry
 #define GNIX_CQ_DEFAULT_SIZE   256
+#define GNIX_CQ_MAX_ERR_DATA_SIZE 64
+
+/* forward declaration */
+struct gnix_fid_ep;
 
 struct gnix_cq_entry {
 	void *the_entry;
@@ -51,13 +57,6 @@ struct gnix_cq_entry {
 	struct slist_entry item;
 };
 
-/* many to many relationship between CQs and polled NICs */
-struct gnix_cq_poll_nic {
-	struct dlist_entry list;
-	int ref_cnt;
-	struct gnix_nic *nic;
-};
-
 struct gnix_fid_cq {
 	struct fid_cq cq_fid;
 	struct gnix_fid_domain *domain;
@@ -73,22 +72,26 @@ struct gnix_fid_cq {
 	fastlock_t lock;
 	struct gnix_reference ref_cnt;
 
-	struct dlist_entry poll_nics;
-	rwlock_t nic_lock;
+	struct gnix_prog_set pset;
+
 	bool requires_lock;
+	char err_data[GNIX_CQ_MAX_ERR_DATA_SIZE];
 };
 
-
-ssize_t _gnix_cq_add_event(struct gnix_fid_cq *cq, void *op_context,
-			  uint64_t flags, size_t len, void *buf,
-			  uint64_t data, uint64_t tag, fi_addr_t src_addr);
+ssize_t _gnix_cq_add_event(struct gnix_fid_cq *cq, struct gnix_fid_ep *ep,
+			   void *op_context, uint64_t flags, size_t len,
+			   void *buf, uint64_t data, uint64_t tag,
+			   fi_addr_t src_addr);
 
 ssize_t _gnix_cq_add_error(struct gnix_fid_cq *cq, void *op_context,
 			  uint64_t flags, size_t len, void *buf,
 			  uint64_t data, uint64_t tag, size_t olen,
-			  int err, int prov_errno, void *err_data);
+			  int err, int prov_errno, void *err_data,
+			  size_t err_data_size);
 
-int _gnix_cq_poll_nic_add(struct gnix_fid_cq *cq, struct gnix_nic *nic);
-int _gnix_cq_poll_nic_rem(struct gnix_fid_cq *cq, struct gnix_nic *nic);
+int _gnix_cq_poll_obj_add(struct gnix_fid_cq *cq, void *obj,
+			  int (*prog_fn)(void *data));
+int _gnix_cq_poll_obj_rem(struct gnix_fid_cq *cq, void *obj,
+			  int (*prog_fn)(void *data));
 
 #endif
diff --git a/prov/gni/include/gnix_datagram.h b/prov/gni/include/gnix_datagram.h
index ab57ba2..f67adff 100644
--- a/prov/gni/include/gnix_datagram.h
+++ b/prov/gni/include/gnix_datagram.h
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -64,6 +64,29 @@
  */
 
 /**
+ * Set of attributes that can be used as an argument to gnix_dgram_hndl_alloc
+ *
+ * @var timeout_needed       pointer to a function which returns true
+ *                           if a timeout is needed in the call to
+ *                           GNI_EpPostdataWaitById to insure progress
+ * @var timeout_progress     pointer to a function should be invoked
+ *                           by the datagram engine to progress
+ *                           the state of the consumer of the datagram
+ *                           functionality.
+ * @var timeout_data         pointer to data supplied as the argument to
+ *                           the timeout_needed and timeout_progress methods
+ * @var timeout              the timeout value in milliseconds to be
+ *                           supplied to GNI_EpPostdataWaitById if
+ *                           timeout_needed returns to true
+ */
+struct gnix_dgram_hndl_attr {
+	bool (*timeout_needed)(void *);
+	void (*timeout_progress)(void *);
+	void *timeout_data;
+	uint32_t timeout;
+};
+
+/**
  * Datagram allocator struct
  *
  * @var cm_nic               pointer to a previously allocated cm_nic with
@@ -74,6 +97,11 @@
  * @var wc_dgram_active_list head of active list of wildcard datagrams
  * @var dgram_base           starting address of memory block from
  *                           which datagram structures are allocated
+ * @var timeout_needed       In the case of FI_PROGRESS_AUTO, invoke this
+ *                           method prior to call to GNI_EpPostDataWaitById
+ *                           to check if we need to timeout in order to
+ *                           progress datagrams which had been stalled
+ *                           due to GNI_RC_ERROR_RESOURCE.
  * @var lock                 lock to protect dgram lists
  * @var progress_thread      pthread id of progress thread for this
  *                           datagram allocator
@@ -81,6 +109,11 @@
  *                           datagram allocator
  * @var n_wc_dgrams          number of wildcard datagrams managed by
  *                           the datagram allocator
+ * @var timeout              time in milliseconds to wait for datagram to
+ *                           complete. By default set to -1 (infinite timeout),
+ *                           but can be set to handle cases where a timeout
+ *                           is required when using FI_PROGRESS_AUTO for
+ *                           control progress.
  */
 struct gnix_dgram_hndl {
 	struct gnix_cm_nic *cm_nic;
@@ -89,10 +122,14 @@ struct gnix_dgram_hndl {
 	struct dlist_entry wc_dgram_free_list;
 	struct dlist_entry wc_dgram_active_list;
 	struct gnix_datagram *dgram_base;
+	bool (*timeout_needed)(void *);
+	void (*timeout_progress)(void *);
+	void *timeout_data;
 	fastlock_t lock;
 	pthread_t progress_thread;
 	int n_dgrams;
 	int n_wc_dgrams;
+	uint32_t timeout;
 };
 
 enum gnix_dgram_type {
@@ -195,8 +232,9 @@ struct gnix_datagram {
 /**
  * @brief Allocates a handle to a datagram allocator instance
  *
- * @param[in]  fabric     pointer to previously allocated gnix_fid_fabric object
  * @param[in]  cm_nic     pointer to previously allocated gnix_cm_nic object
+ * @param[in]  attr       optional pointer to a gnix_dgram_hndl_attr
+ *                        structure
  * @param[in]  progress   progress model to be used for this cm_nic
  *                        (see fi_domain man page)
  * @param[out] handl_ptr  location in which the address of the allocated
@@ -207,10 +245,10 @@ struct gnix_datagram {
  * @return -FI_EAGAIN     In the case of FI_PROGRESS_AUTO, system lacked
  *                        resources to spawn a progress thread.
  */
-int _gnix_dgram_hndl_alloc(const struct gnix_fid_fabric *fabric,
-				struct gnix_cm_nic *cm_nic,
-				enum fi_progress progress,
-				struct gnix_dgram_hndl **hndl_ptr);
+int _gnix_dgram_hndl_alloc(struct gnix_cm_nic *cm_nic,
+			   enum fi_progress progress,
+			   const struct gnix_dgram_hndl_attr *attr,
+			   struct gnix_dgram_hndl **hndl_ptr);
 
 /**
  * @brief Frees a handle to a datagram allocator and associated internal
diff --git a/prov/gni/include/gnix_ep.h b/prov/gni/include/gnix_ep.h
index 17e5185..732e583 100644
--- a/prov/gni/include/gnix_ep.h
+++ b/prov/gni/include/gnix_ep.h
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -63,6 +64,33 @@ enum {
 	GNIX_SMSG_T_RNDZV_IOV_START
 };
 
+/**
+ * Set of attributes that can be passed to the _gnix_alloc_ep
+ *
+ * @var cm_ops               pointer to connection management interface
+ * @var msg_ops              pointer to message transfer interface
+ * @var rma_ops              pointer to rma transfer interface
+ * @var tagged_ops           pointer to tagged message transfer interface
+ * @var atomic_ops           pointer to atomic interface
+ * @var cm_nic               cm_nic associated with this EP
+ * @var nic                  gnix nic associated with this EP
+ * @var gni_cdm_modes        The mode bits gni_cdm_hndl was created with.
+ * @var use_cdm_id           true if the cdm_id field should be used for
+ *                           initializing underlying gni cdm, etc.
+ * @var cdm_id               user supplied cmd_id to use for this endpoint
+ */
+struct gnix_ep_attr {
+	struct fi_ops_cm *cm_ops;
+	struct fi_ops_msg *msg_ops;
+	struct fi_ops_rma *rma_ops;
+	struct fi_ops_tagged *tagged_ops;
+	struct fi_ops_atomic *atomic_ops;
+	struct gnix_cm_nic *cm_nic;
+	struct gnix_nic  *nic;
+	bool use_cdm_id;
+	uint32_t cdm_id;
+};
+
 extern smsg_completer_fn_t gnix_ep_smsg_completers[];
 extern smsg_callback_fn_t gnix_ep_smsg_callbacks[];
 
@@ -138,48 +166,69 @@ typedef ssize_t (*trecvmsg_func_t)(struct fid_ep *ep,
 				   const struct fi_msg_tagged *msg,
 				   uint64_t flags);
 
+/**
+ * Internal function for growing tx buffer pool
+ *
+ * @param[in] ep	pointer to a EP
+ */
+int  _gnix_ep_int_tx_pool_grow(struct gnix_fid_ep *ep);
+
 /*
  * inline functions
  */
 
-static inline struct slist_entry *_gnix_ep_get_htd_buf(struct gnix_fid_ep *ep)
+static inline struct slist_entry
+*_gnix_ep_get_int_tx_buf(struct gnix_fid_ep *ep)
 {
 	struct slist_entry *e;
 
-	fastlock_acquire(&ep->htd_pool.lock);
+	fastlock_acquire(&ep->int_tx_pool.lock);
+
+	e = slist_remove_head(&ep->int_tx_pool.sl);
 
-	e = slist_remove_head(&ep->htd_pool.sl);
+	fastlock_release(&ep->int_tx_pool.lock);
 
-	fastlock_release(&ep->htd_pool.lock);
+	if (e == NULL) {
+		int ret;
+
+		ret = _gnix_ep_int_tx_pool_grow(ep);
+		if (ret != FI_SUCCESS)
+			return NULL;
+
+		fastlock_acquire(&ep->int_tx_pool.lock);
+		e = slist_remove_head(&ep->int_tx_pool.sl);
+		fastlock_release(&ep->int_tx_pool.lock);
+	}
 
 	return e;
 }
 
-static inline gni_mem_handle_t _gnix_ep_get_htd_mdh(struct gnix_fid_ep *ep)
+static inline gni_mem_handle_t _gnix_ep_get_int_tx_mdh(void *e)
 {
-	return ep->htd_pool.md->mem_hndl;
+	return ((struct gnix_int_tx_buf *)e)->md->mem_hndl;
 }
 
-static inline void _gnix_ep_release_htd_buf(struct gnix_fid_ep *ep, struct slist_entry *e)
+static inline void _gnix_ep_release_int_tx_buf(struct gnix_fid_ep *ep,
+					       struct slist_entry *e)
 {
-	fastlock_acquire(&ep->htd_pool.lock);
+	fastlock_acquire(&ep->int_tx_pool.lock);
 
-	GNIX_DEBUG(FI_LOG_EP_DATA, "sl.head = %p, sl.tail = %p\n", ep->htd_pool.sl.head,
-		   ep->htd_pool.sl.tail);
+	GNIX_DEBUG(FI_LOG_EP_DATA, "sl.head = %p, sl.tail = %p\n",
+		   ep->int_tx_pool.sl.head, ep->int_tx_pool.sl.tail);
 
-	slist_insert_head(e, &ep->htd_pool.sl);
+	slist_insert_head(e, &ep->int_tx_pool.sl);
 
-	fastlock_release(&ep->htd_pool.lock);
+	fastlock_release(&ep->int_tx_pool.lock);
 }
 
 static inline struct gnix_fab_req *
 _gnix_fr_alloc(struct gnix_fid_ep *ep)
 {
-	struct dlist_entry *de;
+	struct dlist_entry *de = NULL;
 	struct gnix_fab_req *fr = NULL;
 	int ret = _gnix_fl_alloc(&de, &ep->fr_freelist);
 
-	while (ret == -FI_EAGAIN)
+	while (unlikely(ret == -FI_EAGAIN))
 		ret = _gnix_fl_alloc(&de, &ep->fr_freelist);
 
 	if (ret == FI_SUCCESS) {
@@ -187,11 +236,37 @@ _gnix_fr_alloc(struct gnix_fid_ep *ep)
 		fr->gnix_ep = ep;
 		dlist_init(&fr->dlist);
 		dlist_init(&fr->msg.tle.free);
+
+		/* reset common fields */
+		fr->tx_failures = 0;
+		_gnix_ref_get(ep);
 	}
 
-	/* reset common fields */
-	fr->tx_failures = 0;
-	_gnix_ref_get(ep);
+	return fr;
+}
+
+static inline struct gnix_fab_req *
+_gnix_fr_alloc_w_cb(struct gnix_fid_ep *ep, void (*cb)(void *))
+{
+	struct dlist_entry *de = NULL;
+	struct gnix_fab_req *fr = NULL;
+	int ret = _gnix_fl_alloc(&de, &ep->fr_freelist);
+
+	while (unlikely(ret == -FI_EAGAIN))
+		ret = _gnix_fl_alloc(&de, &ep->fr_freelist);
+
+	if (ret == FI_SUCCESS) {
+		fr = container_of(de, struct gnix_fab_req, dlist);
+		fr->gnix_ep = ep;
+		fr->cb = cb;
+		_gnix_ref_init(&fr->ref_cnt, 1, cb);
+		dlist_init(&fr->dlist);
+		dlist_init(&fr->msg.tle.free);
+
+		/* reset common fields */
+		fr->tx_failures = 0;
+		_gnix_ref_get(ep);
+	}
 
 	return fr;
 }
@@ -201,10 +276,10 @@ _gnix_fr_free(struct gnix_fid_ep *ep, struct gnix_fab_req *fr)
 {
 	assert(fr->gnix_ep == ep);
 
-	if (fr->msg.htd_buf_e != NULL) {
-		_gnix_ep_release_htd_buf(ep, fr->msg.htd_buf_e);
-		fr->msg.htd_buf_e = NULL;
-		fr->msg.htd_buf = NULL;
+	if (fr->int_tx_buf_e != NULL) {
+		_gnix_ep_release_int_tx_buf(ep, fr->int_tx_buf_e);
+		fr->int_tx_buf_e = NULL;
+		fr->int_tx_buf = NULL;
 	}
 
 	_gnix_fl_free(&fr->dlist, &ep->fr_freelist);
@@ -223,13 +298,65 @@ __msg_match_fab_req(struct dlist_entry *item, const void *arg)
 				(GNIX_ADDR_EQUAL(req->addr, *addr_ptr)));
 }
 
+/*
+ * EP related internal helper functions
+ */
+
+ssize_t _ep_recv(struct fid_ep *ep, void *buf, size_t len,
+		 void *desc, fi_addr_t src_addr, void *context,
+		 uint64_t flags, uint64_t tag, uint64_t ignore);
+ssize_t _ep_recvv(struct fid_ep *ep, const struct iovec *iov,
+		  void **desc, size_t count, fi_addr_t src_addr,
+		  void *context, uint64_t flags, uint64_t tag,
+		  uint64_t ignore);
+ssize_t _ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
+		    uint64_t flags, uint64_t tag,
+		    uint64_t ignore);
+ssize_t _ep_send(struct fid_ep *ep, const void *buf, size_t len,
+		 void *desc, fi_addr_t dest_addr, void *context,
+		 uint64_t flags, uint64_t tag);
+ssize_t _ep_sendv(struct fid_ep *ep, const struct iovec *iov,
+		  void **desc, size_t count, fi_addr_t dest_addr,
+		  void *context, uint64_t flags, uint64_t tag);
+ssize_t _ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
+		    uint64_t flags, uint64_t tag);
+ssize_t _ep_inject(struct fid_ep *ep, const void *buf,
+		   size_t len, uint64_t data, fi_addr_t dest_addr,
+		   uint64_t flags, uint64_t tag);
+ssize_t _ep_senddata(struct fid_ep *ep, const void *buf,
+		     size_t len, void *desc, uint64_t data,
+		     fi_addr_t dest_addr, void *context,
+		     uint64_t flags, uint64_t tag);
+
+/**
+ * Allocate a gnix ep struct
+ *
+ * @param[in] domain	the domain from which this EP is being created
+ * @param[in] info	details about the domain endpoint to be opened
+ * @param[in] attr	attributes to be used for allocating the EP
+ * @param[out] ep	the endpoint to open
+ * @param[in] context	the context associated with the endpoint
+ *
+ * @return FI_SUCCESS	upon successfully opening a passive endpoint
+ * @return -FI_EINVAL	invalid input arguments supplied
+ * @return -FI_ENOMEM	no memory to allocate EP struct
+ */
+int _gnix_ep_alloc(struct fid_domain *domain, struct fi_info *info,
+			   struct gnix_ep_attr *attr,
+			   struct fid_ep **ep, void *context);
+
+int _gnix_ep_init_vc(struct gnix_fid_ep *ep_priv);
+
+/**
+ * Internal function for enabling an ep
+ *
+ * @param[in] ep_priv	 pointer to a previously allocated EP
+ */
+int _gnix_ep_enable(struct gnix_fid_ep *ep_priv);
+
 /*******************************************************************************
  * API Functions
  ******************************************************************************/
-int gnix_scalable_ep_open(struct fid_domain *domain,
-			  struct fi_info *info,
-			  struct fid_ep **ep, void *context);
-
 /**
  * Allocates a new passive endpoint.
  *
@@ -242,9 +369,9 @@ int gnix_scalable_ep_open(struct fid_domain *domain,
  * @return -FI_ERRNO	upon an error
  * @return -FI_ENOSYS	if this operation is not supported
  */
-int gnix_passive_ep_open(struct fid_fabric *fabric,
-			 struct fi_info *info, struct fid_pep **pep,
-			 void *context);
+int gnix_pep_open(struct fid_fabric *fabric,
+		  struct fi_info *info, struct fid_pep **pep,
+		  void *context);
 
 int gnix_scalable_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags);
 
@@ -259,6 +386,17 @@ int gnix_scalable_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags);
  * @return -FI_ERRNO	upon an error
  * @return -FI_ENOSYS	if this operation is not supported
  */
-int gnix_pep_bind(fid_t fid, fid_t *bfid, uint64_t flags);
+int gnix_pep_bind(fid_t fid, struct fid *bfid, uint64_t flags);
+
+DIRECT_FN int gnix_ep_atomic_valid(struct fid_ep *ep,
+				   enum fi_datatype datatype,
+				   enum fi_op op, size_t *count);
+
+DIRECT_FN int gnix_ep_fetch_atomic_valid(struct fid_ep *ep,
+					 enum fi_datatype datatype,
+					 enum fi_op op, size_t *count);
 
-#endif /* _GNIX_EP_H_ */
+DIRECT_FN int gnix_ep_cmp_atomic_valid(struct fid_ep *ep,
+				       enum fi_datatype datatype,
+				       enum fi_op op, size_t *count);
+#endif /* _GN IX_EP_H_ */
diff --git a/prov/gni/include/gnix_eq.h b/prov/gni/include/gnix_eq.h
index 2e0c7cd..ba37073 100644
--- a/prov/gni/include/gnix_eq.h
+++ b/prov/gni/include/gnix_eq.h
@@ -35,6 +35,7 @@
 #define _GNIX_EQ_H_
 
 #include <rdma/fi_eq.h>
+#include <stdbool.h>
 
 #include "gnix_queue.h"
 #include "gnix_wait.h"
@@ -42,10 +43,8 @@
 
 #define GNIX_EQ_DEFAULT_SIZE 256
 
-ssize_t _gnix_eq_write_error(struct fid_eq *eq, fid_t fid,
-			     void *context, uint64_t index, int err,
-			     int prov_errno, void *err_data,
-			     size_t err_size);
+extern struct dlist_entry gnix_eq_list;
+extern pthread_mutex_t gnix_eq_list_lock;
 
 /*
  * Stores events inside of the event queue.
@@ -65,6 +64,17 @@ struct gnix_eq_entry {
 	struct slist_entry item;
 };
 
+struct gnix_eq_poll_obj {
+	struct dlist_entry list;
+	struct fid *obj_fid;
+};
+
+struct gnix_eq_err_buf {
+	struct dlist_entry dlist;
+	int do_free;
+	char buf[];
+};
+
 /*
  * EQ structure. Contains error and event queue.
  */
@@ -72,6 +82,8 @@ struct gnix_fid_eq {
 	struct fid_eq eq_fid;
 	struct gnix_fid_fabric *fabric;
 
+	bool requires_lock;
+
 	struct gnix_queue *events;
 	struct gnix_queue *errors;
 
@@ -81,6 +93,22 @@ struct gnix_fid_eq {
 
 	fastlock_t lock;
 	struct gnix_reference ref_cnt;
+
+	rwlock_t poll_obj_lock;
+	struct dlist_entry poll_objs;
+	struct dlist_entry gnix_fid_eq_list;
+
+	struct dlist_entry err_bufs;
 };
 
+ssize_t _gnix_eq_write_error(struct gnix_fid_eq *eq, fid_t fid,
+			     void *context, uint64_t index, int err,
+			     int prov_errno, void *err_data,
+			     size_t err_size);
+
+int _gnix_eq_progress(struct gnix_fid_eq *eq);
+
+int _gnix_eq_poll_obj_add(struct gnix_fid_eq *eq, struct fid *obj_fid);
+int _gnix_eq_poll_obj_rem(struct gnix_fid_eq *eq, struct fid *obj_fid);
+
 #endif /* _GNIX_EQ_H_ */
diff --git a/prov/gni/include/gnix_freelist.h b/prov/gni/include/gnix_freelist.h
index b6d9c34..1a0ec62 100644
--- a/prov/gni/include/gnix_freelist.h
+++ b/prov/gni/include/gnix_freelist.h
@@ -36,11 +36,10 @@
 
 #include <fi.h>
 #include <fi_list.h>
+#include "include/gnix_util.h"
 
 /* Number of elements to seed the freelist with */
 #define GNIX_FL_INIT_SIZE 100
-/* Initial refill size */
-#define GNIX_FL_INIT_REFILL_SIZE 10
 /* Refill growth factor */
 #define GNIX_FL_GROWTH_FACTOR 2
 
@@ -76,6 +75,7 @@ struct gnix_freelist {
  * @param max_refill_size   Max refill size
  * @param fl                gnix_freelist
  * @return                  FI_SUCCESS on success, -FI_ENOMEM on failure
+ * @note - If the refill_size is zero, then the freelist is not growable.
  */
 int _gnix_fl_init(int elem_size, int offset, int init_size,
 		   int refill_size, int growth_factor,
@@ -91,6 +91,7 @@ int _gnix_fl_init(int elem_size, int offset, int init_size,
  * @param max_refill_size   Max refill size
  * @param fl                gnix_freelist
  * @return                  FI_SUCCESS on success, -FI_ENOMEM on failure
+ * @note - If the refill_size is zero, then the freelist is not growable.
  */
 int _gnix_fl_init_ts(int elem_size, int offset, int init_size,
 		      int refill_size, int growth_factor,
@@ -102,20 +103,85 @@ int _gnix_fl_init_ts(int elem_size, int offset, int init_size,
  */
 void _gnix_fl_destroy(struct gnix_freelist *fl);
 
+extern int __gnix_fl_refill(struct gnix_freelist *fl, int n);
+
 /** Return an item from the freelist
  *
  * @param e     item
  * @param fl    gnix_freelist
- * @return      FI_SUCCESS on success, -FI_ENOMEM or -FI_EAGAIN on failure
+ * @return      FI_SUCCESS on success, -FI_ENOMEM or -FI_EAGAIN on failure,
+ *              or -FI_ECANCELED if the refill size is zero.
  */
-int _gnix_fl_alloc(struct dlist_entry **e, struct gnix_freelist *fl);
+__attribute__((unused))
+static inline int _gnix_fl_alloc(struct dlist_entry **e, struct gnix_freelist *fl)
+{
+    int ret = FI_SUCCESS;
+    struct dlist_entry *de = NULL;
+
+    assert(fl);
+
+    if (fl->ts)
+	    fastlock_acquire(&fl->lock);
+
+    if (dlist_empty(&fl->freelist)) {
+
+        if (fl->refill_size == 0) {
+                ret = -FI_ECANCELED;
+
+                GNIX_DEBUG(FI_LOG_DEBUG, "Freelist not growable (refill "
+                                   "size is 0\n");
+
+                goto err;
+        }
+
+        ret = __gnix_fl_refill(fl, fl->refill_size);
+        if (ret != FI_SUCCESS)
+            goto err;
+        if (fl->refill_size < fl->max_refill_size) {
+            int ns = fl->refill_size *= fl->growth_factor;
+
+            fl->refill_size = (ns >= fl->max_refill_size ?
+                            fl->max_refill_size : ns);
+        }
+
+        if (dlist_empty(&fl->freelist)) {
+            /* Can't happen unless multithreaded */
+            ret = -FI_EAGAIN;
+            goto err;
+        }
+    }
+
+    de = fl->freelist.next;
+    dlist_remove_init(de);
+
+    *e = de;
+err:
+    if (fl->ts)
+        fastlock_release(&fl->lock);
+    return ret;
+}
 
 /** Return an item to the free list
  *
  * @param e     item
  * @param fl    gnix_freelist
  */
-void _gnix_fl_free(struct dlist_entry *e, struct gnix_freelist *fl);
+__attribute__((unused))
+static inline void _gnix_fl_free(struct dlist_entry *e, struct gnix_freelist *fl)
+{
+    assert(e);
+    assert(fl);
+
+    e->next = NULL;  /* keep slist implementation happy */
+
+    if (fl->ts)
+        fastlock_acquire(&fl->lock);
+    dlist_init(e);
+    dlist_insert_head(e, &fl->freelist);
+    if (fl->ts)
+        fastlock_release(&fl->lock);
+}
+
 
 /** Is freelist empty (primarily used for testing
  *
diff --git a/prov/gni/include/gnix_hashtable.h b/prov/gni/include/gnix_hashtable.h
index e5bf2f3..7af25aa 100644
--- a/prov/gni/include/gnix_hashtable.h
+++ b/prov/gni/include/gnix_hashtable.h
@@ -143,9 +143,9 @@ typedef struct gnix_hashtable {
 	gnix_ht_state_e ht_state;
 	gnix_hashtable_attr_t ht_attr;
 	gnix_hashtable_ops_t *ht_ops;
-	atomic_t ht_elements;
-	atomic_t ht_collisions;
-	atomic_t ht_insertions;
+	ofi_atomic32_t ht_elements;
+	ofi_atomic32_t ht_collisions;
+	ofi_atomic32_t ht_insertions;
 	int ht_size;
 	union {
 		gnix_ht_lf_lh_t *ht_lf_tbl;
diff --git a/prov/gni/include/gnix_mbox_allocator.h b/prov/gni/include/gnix_mbox_allocator.h
index d149350..f83ae99 100644
--- a/prov/gni/include/gnix_mbox_allocator.h
+++ b/prov/gni/include/gnix_mbox_allocator.h
@@ -188,6 +188,6 @@ int _gnix_mbox_free(struct gnix_mbox *ptr);
  * Initialized in gnix_init.c, used for updating filename when creating
  * hugepages.
  */
-extern atomic_t file_id_counter;
+extern ofi_atomic32_t file_id_counter;
 
 #endif /* _GNIX_MBOX_ALLOCATOR_ */
diff --git a/prov/gni/include/gnix_mr.h b/prov/gni/include/gnix_mr.h
index ed14485..a477136 100644
--- a/prov/gni/include/gnix_mr.h
+++ b/prov/gni/include/gnix_mr.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -45,7 +45,6 @@
 #include "gnix_priv.h"
 #include "gnix_mr_cache.h"
 
-
 #define GNIX_MR_PAGE_SHIFT 12
 #define GNIX_MR_PFN_BITS 37
 #define GNIX_MR_MDD_BITS 12
@@ -57,6 +56,23 @@
 	(GNIX_MR_KEY_BITS + GNIX_MR_FLAG_BITS + GNIX_MR_FMT_BITS)
 #define GNIX_MR_PADDING_LENGTH (64 - GNIX_MR_RESERVED_BITS)
 
+/* TODO: optimize to save space by using a union to combine the two
+ * independent sets of data
+ */
+struct gnix_mr_cache_info {
+	/* used only with internal mr cache */
+	gnix_mr_cache_t *mr_cache_rw;
+	gnix_mr_cache_t *mr_cache_ro;
+
+	/* used only with udreg */
+	struct udreg_cache *udreg_cache;
+	struct gnix_fid_domain *domain;
+	struct gnix_auth_key *auth_key;
+
+	fastlock_t mr_cache_lock;
+	int inuse;
+};
+
 enum {
 	GNIX_MR_FLAG_READONLY = 1 << 0
 };
@@ -88,6 +104,7 @@ struct gnix_fid_mem_desc {
 	struct gnix_fid_domain *domain;
 	gni_mem_handle_t mem_hndl;
 	struct gnix_nic *nic;
+	struct gnix_auth_key *auth_key;
 #ifdef HAVE_UDREG
 	udreg_entry_t *entry;
 #endif
@@ -105,10 +122,8 @@ struct gnix_fid_mem_desc {
 typedef struct gnix_mr_key {
 	union {
 		struct {
-			struct {
-				uint64_t pfn: GNIX_MR_PFN_BITS;
-				uint64_t mdd: GNIX_MR_MDD_BITS;
-			};
+			uint64_t pfn: GNIX_MR_PFN_BITS;
+			uint64_t mdd: GNIX_MR_MDD_BITS;
 			uint64_t format : GNIX_MR_FMT_BITS;
 			uint64_t flags : GNIX_MR_FLAG_BITS;
 			uint64_t padding: GNIX_MR_PADDING_LENGTH;
@@ -121,14 +136,17 @@ typedef struct gnix_mr_key {
  *
  */
 struct gnix_mr_ops {
-	int (*init)(struct gnix_fid_domain *domain);
-	int (*is_init)(struct gnix_fid_domain *domain);
+	int (*init)(struct gnix_fid_domain *domain,
+			struct gnix_auth_key *auth_key);
+	int (*is_init)(struct gnix_fid_domain *domain,
+			struct gnix_auth_key *auth_key);
 	int (*reg_mr)(struct gnix_fid_domain *domain, uint64_t address,
 			uint64_t length, struct _gnix_fi_reg_context *fi_reg_context,
 			void **handle);
 	int (*dereg_mr)(struct gnix_fid_domain *domain,
 			struct gnix_fid_mem_desc *md);
-	int (*destroy_cache)(struct gnix_fid_domain *domain);
+	int (*destroy_cache)(struct gnix_fid_domain *domain,
+			struct gnix_mr_cache_info *info);
 	int (*flush_cache)(struct gnix_fid_domain *domain);
 };
 
@@ -166,7 +184,8 @@ uint64_t _gnix_convert_mhdl_to_key(gni_mem_handle_t *mhdl);
 int _gnix_open_cache(struct gnix_fid_domain *domain, int type);
 
 /* destroys mr cache for a given domain */
-int _gnix_close_cache(struct gnix_fid_domain *domain);
+int _gnix_close_cache(struct gnix_fid_domain *domain,
+	struct gnix_mr_cache_info *info);
 
 /* flushes the memory registration cache for a given domain */
 int _gnix_flush_registration_cache(struct gnix_fid_domain *domain);
diff --git a/prov/gni/include/gnix_mr_cache.h b/prov/gni/include/gnix_mr_cache.h
index d8336a3..7933cb7 100644
--- a/prov/gni/include/gnix_mr_cache.h
+++ b/prov/gni/include/gnix_mr_cache.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -118,6 +118,7 @@ struct _gnix_fi_reg_context {
 	uint64_t requested_key;
 	uint64_t flags;
 	void *context;
+	struct gnix_auth_key *auth_key;
 };
 
 /**
@@ -169,7 +170,7 @@ typedef enum {
  * @brief  gnix memory registration cache entry storage
  */
 struct gnix_mrce_storage {
-	atomic_t elements;
+	ofi_atomic32_t elements;
 	RbtHandle rb_tree;
 };
 
diff --git a/prov/gni/include/gnix_mr_notifier.h b/prov/gni/include/gnix_mr_notifier.h
index 159b864..e56c8df 100644
--- a/prov/gni/include/gnix_mr_notifier.h
+++ b/prov/gni/include/gnix_mr_notifier.h
@@ -37,8 +37,9 @@
 #include <stdint.h>
 #include <stddef.h>
 #include "rdma/fi_errno.h"
+#include "config.h"
 
-#ifdef HAVE_KDREG
+#if HAVE_KDREG
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -67,16 +68,15 @@ struct gnix_mr_notifier {
 	int fd;
 	kdreg_user_delta_t *cntr;
 	fastlock_t lock;
+	int ref_cnt;
 };
 
 /**
- * @brief initialize the gnix_mr_notifier struct
+ * @brief initialize the process for use of the notifier
  *
- * @param[out] k        Empty (zeroed) gnix_mr_notifier struct
  * @return              FI_SUCESSS on success
- *                      -FI_EINVAL if k == NULL
  */
-int _gnix_notifier_init(struct gnix_mr_notifier *mrn);
+int _gnix_notifier_init(void);
 
 /**
  * @brief open the kdreg device and prepare for notifications
@@ -87,7 +87,7 @@ int _gnix_notifier_init(struct gnix_mr_notifier *mrn);
  *                      -FI_ENODATA if user delta unavailable
  *                      -fi_errno or -errno on other failures
  */
-int _gnix_notifier_open(struct gnix_mr_notifier *mrn);
+int _gnix_notifier_open(struct gnix_mr_notifier **mrn);
 
 /**
  * @brief close the kdreg device and zero the notifier
@@ -142,13 +142,13 @@ struct gnix_mr_notifier {
 };
 
 static inline int
-_gnix_notifier_init(struct gnix_mr_notifier *mrn)
+_gnix_notifier_init(void)
 {
 	return FI_SUCCESS;
 }
 
 static inline int
-_gnix_notifier_open(struct gnix_mr_notifier *mrn)
+_gnix_notifier_open(struct gnix_mr_notifier **mrn)
 {
 	return FI_SUCCESS;
 }
diff --git a/prov/gni/include/gnix_msg.h b/prov/gni/include/gnix_msg.h
index 9e0153f..3632a0d 100644
--- a/prov/gni/include/gnix_msg.h
+++ b/prov/gni/include/gnix_msg.h
@@ -36,7 +36,11 @@
 
 ssize_t _gnix_recv(struct gnix_fid_ep *ep, uint64_t buf, size_t len, void *desc,
 		   uint64_t src_addr, void *context, uint64_t flags,
-		   uint64_t tag, uint64_t ignore);
+		   uint64_t tag, uint64_t ignore, struct gnix_fab_req *req);
+
+ssize_t _gnix_recv_mr(struct gnix_fid_ep *ep, uint64_t buf, size_t len, void *desc,
+		      uint64_t src_addr, void *context, uint64_t flags,
+		      uint64_t tag, uint64_t ignore);
 
 ssize_t _gnix_send(struct gnix_fid_ep *ep, uint64_t loc_addr, size_t len,
 		   void *mdesc, uint64_t dest_addr, void *context,
diff --git a/prov/gni/include/gnix_nameserver.h b/prov/gni/include/gnix_nameserver.h
index 7956985..df4abf5 100644
--- a/prov/gni/include/gnix_nameserver.h
+++ b/prov/gni/include/gnix_nameserver.h
@@ -44,8 +44,15 @@
  * prototypes
  */
 
-int gnix_resolve_name(IN const char *node, IN const char *service,
-		      IN uint64_t flags, INOUT struct gnix_ep_name
-		      *resolved_addr);
+int _gnix_local_ipaddr(struct sockaddr_in *sin);
+
+int _gnix_pe_to_ip(const struct gnix_ep_name *ep_name,
+		   struct sockaddr_in *saddr);
+
+int _gnix_resolve_name(IN const char *node, IN const char *service,
+		       IN uint64_t flags, INOUT struct gnix_ep_name
+		       *resolved_addr);
+
+int _gnix_src_addr(struct gnix_ep_name *resolved_addr);
 
 #endif /* _GNIX_NAMESERVER_H_ */
diff --git a/prov/gni/include/gnix_nic.h b/prov/gni/include/gnix_nic.h
index 3dbb989..729ed97 100644
--- a/prov/gni/include/gnix_nic.h
+++ b/prov/gni/include/gnix_nic.h
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc.  All rights reserved.
+ * Copyright (c) 2015-2016 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -47,7 +47,14 @@
 
 #define GNIX_DEF_MAX_NICS_PER_PTAG	4
 
+/*
+ * globals
+ */
+
 extern uint32_t gnix_max_nics_per_ptag;
+extern struct dlist_entry gnix_nic_list_ptag[];
+extern struct dlist_entry gnix_nic_list;
+extern pthread_mutex_t gnix_nic_list_lock;
 
 /*
  * allocation flags for cleaning up GNI resources
@@ -65,6 +72,8 @@ extern uint32_t gnix_max_nics_per_ptag;
  */
 typedef int (*smsg_callback_fn_t)(void  *ptr, void *msg);
 
+extern smsg_callback_fn_t gnix_ep_smsg_callbacks[];
+
 /*
  * typedef for completer functions invoked
  * at initiator when local CQE (tx) is processed
@@ -89,14 +98,16 @@ struct gnix_nic_attr {
 	gni_nic_handle_t gni_nic_hndl;
 	bool use_cdm_id;
 	uint32_t cdm_id;
+	bool must_alloc;
+	struct gnix_auth_key *auth_key;
 };
 
 /**
  * GNIX nic struct
  *
  * @var gnix_nic_list        list element used for global NIC list
- * @var dom_nic_list         list element used for nic linked list associated
- *                           with a given gnix_fid_domain
+ * @var ptag_nic_list        list element used for NIC linked list associated
+ *                           with a given PTAG.
  * @var lock                 lock used for serializing access to
  *                           gni_nic_hndl, rx_cq, and tx_cq
  * @var gni_cdm_hndl         handle for the GNI communication domain (CDM)
@@ -114,6 +125,8 @@ struct gnix_nic_attr {
  *                           with this nic
  * @var tx_desc_base         base address for the block of memory from which
  *                           tx descriptors were allocated
+ * @var prog_vcs_lock        lock for prog_vcs
+ * @var prog_vcs             list of VCs needing progress
  * @var wq_lock              lock for serializing access to the nic's work queue
  * @var nic_wq               head of linked list of work queue elements
  *                           associated with this nic
@@ -152,7 +165,8 @@ struct gnix_nic_attr {
  */
 struct gnix_nic {
 	struct dlist_entry gnix_nic_list; /* global NIC list */
-	struct dlist_entry dom_nic_list;  /* domain NIC list */
+	struct dlist_entry ptag_nic_list; /* global PTAG NIC list */
+	struct dlist_entry gnix_nic_prog_list; /* temporary list for nic progression */
 	fastlock_t lock;
 	uint32_t allocd_gni_res;
 	gni_cdm_handle_t gni_cdm_hndl;
@@ -167,12 +181,10 @@ struct gnix_nic {
 	struct dlist_entry tx_desc_active_list;
 	struct dlist_entry tx_desc_free_list;
 	struct gnix_tx_descriptor *tx_desc_base;
-	fastlock_t rx_vc_lock;
-	struct dlist_entry rx_vcs;
-	fastlock_t work_vc_lock;
-	struct dlist_entry work_vcs;
-	fastlock_t tx_vc_lock;
-	struct dlist_entry tx_vcs;
+	fastlock_t prog_vcs_lock;
+	struct dlist_entry prog_vcs;
+	/* note this free list will be initialized for thread safe */
+	struct gnix_freelist vc_freelist;
 	uint8_t ptag;
 	uint32_t cookie;
 	uint32_t device_id;
@@ -191,8 +203,6 @@ struct gnix_nic {
 	struct gnix_reference ref_cnt;
 	smsg_callback_fn_t const *smsg_callbacks;
 	struct slist err_txds;
-	void *int_bufs;
-	gni_mem_handle_t int_bufs_mdh;
 	gni_mem_handle_t irq_mem_hndl;
 	void *irq_mmap_addr;
 	size_t irq_mmap_len;
@@ -307,6 +317,8 @@ struct gnix_smsg_amo_cntr_hdr {
  * @var gni_desc         embedded GNI post descriptor
  * @var gnix_ct_descs    embedded GNI post descriptors for concatenated gets
  *                       used for unaligned gets
+ * @var gni_more_ct_descs embedded GNI post descriptors for concatenated puts
+			  or gets for FI_MORE.
  * @var gnix_smsg_eager_hdr embedded header for SMSG eager protocol
  * @var gnix_smsg_rndzv_start_hdr embedded header for rendezvous protocol
  * @var gnix_smsg_rndzv_iov_start_hdr embedded header for iovec rndzv protocol
@@ -320,7 +332,6 @@ struct gnix_smsg_amo_cntr_hdr {
  * @var id               the id of this descriptor - the value returned
  *                       from GNI_CQ_MSG_ID
  * @var err_list         Error TXD list entry
- * @var int_buf          Intermediate buffer for landing unaligned data, etc.
  * @var tx_failures	 Number of times this transmission descriptor failed.
  */
 struct gnix_tx_descriptor {
@@ -329,6 +340,7 @@ struct gnix_tx_descriptor {
 		struct {
 			gni_post_descriptor_t        gni_desc;
 			gni_ct_get_post_descriptor_t gni_ct_descs[2];
+			void			     *gni_more_ct_descs;
 		};
 		struct gnix_smsg_eager_hdr           eager_hdr;
 		struct gnix_smsg_rndzv_start_hdr     rndzv_start_hdr;
@@ -341,16 +353,9 @@ struct gnix_tx_descriptor {
 	int  (*completer_fn)(void *, gni_return_t);
 	int id;
 	struct slist_entry err_list;
-	void *int_buf;
 };
 
 /*
- * globals
- */
-
-extern uint32_t gnix_def_max_nics_per_ptag;
-
-/*
  * prototypes
  */
 
@@ -362,7 +367,26 @@ extern uint32_t gnix_def_max_nics_per_ptag;
  *                     is to be stored
  * @return             FI_SUCCESS on success, -FI_ENOSPC no free tx descriptors
  */
-int _gnix_nic_tx_alloc(struct gnix_nic *nic, struct gnix_tx_descriptor **tdesc);
+static inline int _gnix_nic_tx_alloc(struct gnix_nic *nic,
+               struct gnix_tx_descriptor **desc)
+{
+    struct dlist_entry *entry;
+
+    COND_ACQUIRE(nic->requires_lock, &nic->tx_desc_lock);
+    if (dlist_empty(&nic->tx_desc_free_list)) {
+        COND_RELEASE(nic->requires_lock, &nic->tx_desc_lock);
+        return -FI_ENOSPC;
+    }
+
+    entry = nic->tx_desc_free_list.next;
+    dlist_remove_init(entry);
+    dlist_insert_head(entry, &nic->tx_desc_active_list);
+    *desc = dlist_entry(entry, struct gnix_tx_descriptor, list);
+    COND_RELEASE(nic->requires_lock, &nic->tx_desc_lock);
+
+    return FI_SUCCESS;
+}
+
 
 /**
  * @brief frees a previously allocated tx descriptor
@@ -372,7 +396,17 @@ int _gnix_nic_tx_alloc(struct gnix_nic *nic, struct gnix_tx_descriptor **tdesc);
  * @param[in] tdesc    pointer to previously allocated tx descriptor
  * @return             FI_SUCCESS on success
  */
-int _gnix_nic_tx_free(struct gnix_nic *nic, struct gnix_tx_descriptor *tdesc);
+static inline int _gnix_nic_tx_free(struct gnix_nic *nic,
+                                struct gnix_tx_descriptor *desc)
+{
+    COND_ACQUIRE(nic->requires_lock, &nic->tx_desc_lock);
+    dlist_remove_init(&desc->list);
+    dlist_insert_head(&desc->list, &nic->tx_desc_free_list);
+    COND_RELEASE(nic->requires_lock, &nic->tx_desc_lock);
+
+    return FI_SUCCESS;
+}
+
 
 /**
  * @brief allocate a gnix_nic struct
@@ -406,12 +440,12 @@ int _gnix_nic_free(struct gnix_nic *nic);
 /**
  * @brief progresses control/data operations associated with the nic
  *
- * @param[in] nic      pointer to previously allocated gnix_nic struct
+ * @param[in] arg      pointer to previously allocated gnix_nic struct
  * @return             FI_SUCCESS on success, -FI_EINVAL if an invalid
  *                     nic struct was supplied. TODO: a lot more error
  *                     values can be returned.
  */
-int _gnix_nic_progress(struct gnix_nic *nic);
+int _gnix_nic_progress(void *arg);
 
 /**
  * @brief allocate a remote id for an object, used for looking up an object
@@ -453,13 +487,26 @@ int _gnix_nic_free_rem_id(struct gnix_nic *nic, int remote_id);
  */
 static inline void *__gnix_nic_elem_by_rem_id(struct gnix_nic *nic, int rem_id)
 {
+	void *elem;
+
 	assert(nic);
+
+	COND_ACQUIRE(nic->requires_lock, &nic->vc_id_lock);
+
 	assert(rem_id <= nic->vc_id_table_count);
-	return nic->vc_id_table[rem_id];
-	return 0;
+	elem = nic->vc_id_table[rem_id];
+
+	COND_RELEASE(nic->requires_lock, &nic->vc_id_lock);
+
+	return elem;
 }
 
 void _gnix_nic_txd_err_inject(struct gnix_nic *nic,
 			      struct gnix_tx_descriptor *txd);
 
+/**
+ * @brief Initialize global NIC data.
+ */
+void _gnix_nic_init(void);
+
 #endif /* _GNIX_NIC_H_ */
diff --git a/prov/gni/include/gnix_nameserver.h b/prov/gni/include/gnix_progress.h
similarity index 68%
copy from prov/gni/include/gnix_nameserver.h
copy to prov/gni/include/gnix_progress.h
index 7956985..b6941ee 100644
--- a/prov/gni/include/gnix_nameserver.h
+++ b/prov/gni/include/gnix_progress.h
@@ -1,6 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -31,21 +30,28 @@
  * SOFTWARE.
  */
 
-#ifndef _GNIX_NAMESERVER_H_
-#define _GNIX_NAMESERVER_H_
+#ifndef _GNIX_PROGRESS_H_
+#define _GNIX_PROGRESS_H_
 
-#include "gnix.h"
+#include "gnix_util.h"
 
 /*
- * defines, data structs, and prototypes for gnix nameserver
+ * Progress common code
  */
 
-/*
- * prototypes
- */
+struct gnix_prog_set {
+	struct dlist_entry prog_objs;
+	rwlock_t lock;
+	int requires_lock;
+};
+
+int _gnix_prog_progress(struct gnix_prog_set *set);
+int _gnix_prog_obj_add(struct gnix_prog_set *set, void *obj,
+		       int (*prog_fn)(void *data));
+int _gnix_prog_obj_rem(struct gnix_prog_set *set, void *obj,
+		       int (*prog_fn)(void *data));
+int _gnix_prog_init(struct gnix_prog_set *set);
+int _gnix_prog_fini(struct gnix_prog_set *set);
 
-int gnix_resolve_name(IN const char *node, IN const char *service,
-		      IN uint64_t flags, INOUT struct gnix_ep_name
-		      *resolved_addr);
+#endif /* _GNIX_PROGRESS_H_ */
 
-#endif /* _GNIX_NAMESERVER_H_ */
diff --git a/prov/gni/include/gnix_rma.h b/prov/gni/include/gnix_rma.h
index 55ebe77..34ecaea 100644
--- a/prov/gni/include/gnix_rma.h
+++ b/prov/gni/include/gnix_rma.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Cray Inc.  All rights reserved.
+ * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -34,6 +34,9 @@
 #ifndef _GNIX_RMA_H_
 #define _GNIX_RMA_H_
 
+#define GNIX_RMA_READ_FLAGS_DEF  (FI_RMA | FI_READ)
+#define GNIX_RMA_WRITE_FLAGS_DEF (FI_RMA | FI_WRITE)
+
 ssize_t _gnix_rma(struct gnix_fid_ep *ep, enum gnix_fab_req_type fr_type,
 		  uint64_t loc_addr, size_t len, void *mdesc,
 		  uint64_t dest_addr, uint64_t rem_addr, uint64_t mkey,
diff --git a/prov/gni/include/gnix_tags.h b/prov/gni/include/gnix_tags.h
index 3fb03a1..7a7094b 100644
--- a/prov/gni/include/gnix_tags.h
+++ b/prov/gni/include/gnix_tags.h
@@ -301,7 +301,7 @@ struct gnix_tag_kdtree {
  *                  data structure to use for storing data
  */
 struct gnix_tag_storage {
-	atomic_t seq;
+	ofi_atomic32_t seq;
 	int state;
 	int gen;
 	int (*match_func)(struct dlist_entry *entry, const void *arg);
diff --git a/prov/gni/include/gnix_util.h b/prov/gni/include/gnix_util.h
index 41106f9..40b9985 100644
--- a/prov/gni/include/gnix_util.h
+++ b/prov/gni/include/gnix_util.h
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -43,12 +44,15 @@
 #include <fi.h>
 
 extern struct fi_provider gnix_prov;
+#if HAVE_CRITERION
+extern int gnix_first_pe_on_node; /* globally visible for  criterion */
+#endif
 
 /*
- * For debug logging (#undef NDEBUG)
+ * For debug logging (ENABLE_DEBUG)
  * Q: should this just always be available?
  */
-#ifdef NDEBUG
+#ifndef ENABLE_DEBUG
 
 #define GNIX_LOG_INTERNAL(FI_LOG_FN, LEVEL, subsystem, fmt, ...)	\
 	FI_LOG_FN(&gnix_prov, subsystem, fmt, ##__VA_ARGS__)
@@ -60,7 +64,7 @@ extern struct fi_provider gnix_prov;
 /* defined in gnix_init.c */
 extern __thread pid_t gnix_debug_pid;
 extern __thread uint32_t gnix_debug_tid;
-extern atomic_t gnix_debug_next_tid;
+extern ofi_atomic32_t gnix_debug_next_tid;
 
 #define GNIX_FI_PRINT(prov, subsystem, ...)				\
 	do {								\
@@ -79,13 +83,13 @@ extern atomic_t gnix_debug_next_tid;
 			const int fmt_len = 256;			\
 			char new_fmt[fmt_len];				\
 			if (gnix_debug_tid  == ~(uint32_t) 0) {		\
-				gnix_debug_tid = atomic_inc(&gnix_debug_next_tid); \
+				gnix_debug_tid = ofi_atomic_inc32(&gnix_debug_next_tid); \
 			}						\
 			if (gnix_debug_pid == ~(uint32_t) 0) {		\
 				gnix_debug_pid = getpid();		\
 			}						\
 			snprintf(new_fmt, fmt_len, "[%%d:%%d] %s", fmt);	\
-			FI_LOG_FN(&gnix_prov, subsystem, new_fmt,		\
+			FI_LOG_FN(&gnix_prov, subsystem, new_fmt,	\
 				  gnix_debug_pid, gnix_debug_tid, ##__VA_ARGS__); \
 		} \
 	} while (0)
@@ -220,6 +224,7 @@ static inline void dlist_splice_tail(
 /*
  * prototypes
  */
+int _gnix_get_cq_limit(void);
 int gnixu_get_rdma_credentials(void *addr, uint8_t *ptag, uint32_t *cookie);
 int gnixu_to_fi_errno(int err);
 
@@ -233,12 +238,13 @@ void _gnix_app_cleanup(void);
 int _gnix_job_fma_limit(uint32_t dev_id, uint8_t ptag, uint32_t *limit);
 int _gnix_job_cq_limit(uint32_t dev_id, uint8_t ptag, uint32_t *limit);
 int _gnix_pes_on_node(uint32_t *num_pes);
+int _gnix_pe_node_rank(int *pe_node_rank);
 int _gnix_nics_per_rank(uint32_t *nics_per_rank);
 void _gnix_dump_gni_res(uint8_t ptag);
 int _gnix_get_num_corespec_cpus(uint32_t *num_core_spec_cpus);
 
 struct gnix_reference {
-	atomic_t references;
+	ofi_atomic32_t references;
 	void (*destruct)(void *obj);
 };
 
@@ -248,14 +254,18 @@ struct gnix_reference {
 #define __ref_get(ptr, var) \
 	({ \
 		struct gnix_reference *ref = &(ptr)->var; \
-		int references_held = atomic_inc(&ref->references); \
+		int references_held = ofi_atomic_inc32(&ref->references); \
+		GNIX_DEBUG(FI_LOG_CORE, "%p refs %d\n", \
+			   ref, references_held); \
 		assert(references_held > 0); \
 		references_held; })
 
 #define __ref_put(ptr, var) \
 	({ \
 		struct gnix_reference *ref = &(ptr)->var; \
-		int references_held = atomic_dec(&ref->references); \
+		int references_held = ofi_atomic_dec32(&ref->references); \
+		GNIX_DEBUG(FI_LOG_CORE, "%p refs %d\n", \
+			   ref, references_held); \
 		assert(references_held >= 0); \
 		if (references_held == 0) \
 			ref->destruct((void *) (ptr)); \
@@ -267,12 +277,23 @@ struct gnix_reference {
 #define _gnix_ref_get(ptr) __ref_get(ptr, ref_cnt)
 #define _gnix_ref_put(ptr) __ref_put(ptr, ref_cnt)
 
+/**
+ * Only allow FI_REMOTE_CQ_DATA when the EP cap, FI_RMA_EVENT, is also set.
+ *
+ * @return zero if FI_REMOTE_CQ_DATA is not permitted; otherwise one.
+ */
+#define GNIX_ALLOW_FI_REMOTE_CQ_DATA(_flags, _ep_caps) \
+					(((_flags) & FI_REMOTE_CQ_DATA) && \
+					 ((_ep_caps) & FI_RMA_EVENT))
+
 static inline void _gnix_ref_init(
 		struct gnix_reference *ref,
 		int initial_value,
 		void (*destruct)(void *))
 {
-	atomic_initialize(&ref->references, initial_value);
+	ofi_atomic_initialize32(&ref->references, initial_value);
+	GNIX_DEBUG(FI_LOG_CORE, "%p refs %d\n",
+		   ref, initial_value);
 	ref->destruct = destruct;
 }
 
@@ -299,7 +320,7 @@ static inline void _gnix_ref_init(
 	__COND_FUNC((cond), (lock), rwlock_unlock)
 #ifdef __GNUC__
 #define __PREFETCH(addr, rw, locality) __builtin_prefetch(addr, rw, locality)
-#else 
+#else
 #define __PREFETCH(addr, rw, locality) ((void *) 0)
 #endif
 
diff --git a/prov/gni/include/gnix_vc.h b/prov/gni/include/gnix_vc.h
index 2636e75..cea1e71 100644
--- a/prov/gni/include/gnix_vc.h
+++ b/prov/gni/include/gnix_vc.h
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc.  All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -42,6 +43,7 @@
 #include "gnix_bitmap.h"
 #include "gnix_av.h"
 #include "gnix_xpmem.h"
+#include "gnix_cm_nic.h"
 
 /*
  * mode bits
@@ -58,6 +60,7 @@
 #define GNIX_VC_FLAG_RX_SCHEDULED	0
 #define GNIX_VC_FLAG_WORK_SCHEDULED	1
 #define GNIX_VC_FLAG_TX_SCHEDULED	2
+#define GNIX_VC_FLAG_SCHEDULED		4
 
 /*
  * defines for connection state for gnix VC
@@ -80,15 +83,13 @@ enum gnix_vc_conn_req_type {
 #define REMOTE_MBOX_RCVD (1UL << 1)
 
 /**
- * Virual Connection (VC) struct
+ * Virtual Connection (VC) struct
  *
- * @var rx_list              NIC RX VC list
+ * @var prog_list            NIC VC progress list
  * @var work_queue           Deferred work request queue
- * @var work_queue_lock      Deferred work request queue lock
- * @var work_list            NIC work VC list
  * @var tx_queue             TX request queue
- * @var tx_queue_lock        TX request queue lock
- * @var tx_list              NIC TX VC list
+ * @var list                 used for unmapped vc list
+ * @var fr_list              used for vc free list
  * @var entry                used internally for managing linked lists
  *                           of vc structs that require O(1) insertion/removal
  * @var peer_fi_addr         FI address of peer with which this VC is connected
@@ -100,7 +101,6 @@ enum gnix_vc_conn_req_type {
  *                           associated
  * @var smsg_mbox            pointer to GNI SMSG mailbox used by this VC
  *                           to exchange SMSG messages with its peer
- * @var dgram                pointer to dgram - used in connection setup
  * @var gni_ep               GNI endpoint for this VC
  * @var outstanding_fab_reqs Count of outstanding libfabric level requests
  *                           associated with this endpoint.
@@ -114,27 +114,23 @@ enum gnix_vc_conn_req_type {
  * @var flags                Bitmap used to hold vc schedule state
  * @var peer_irq_mem_hndl    peer GNI memhndl used for delivering
  *                           GNI_PostCqWrite requests to remote peer
+ * @var peer_caps            peer capability flags
  */
 struct gnix_vc {
-	struct dlist_entry rx_list;	/* RX VC list entry */
-
+	struct dlist_entry prog_list;	/* NIC VC progress list entry */
 	struct dlist_entry work_queue;	/* Work reqs */
-	fastlock_t work_queue_lock;	/* Work req lock */
-	struct dlist_entry work_list;	/* Work VC list entry */
-
 	struct dlist_entry tx_queue;	/* TX reqs */
-	fastlock_t tx_queue_lock;	/* TX reqs lock */
-	struct dlist_entry tx_list;	/* TX VC list entry */
 
 	struct dlist_entry list;	/* General purpose list */
+	struct dlist_entry fr_list;	/* fr list */
 	fi_addr_t peer_fi_addr;
 	struct gnix_address peer_addr;
 	struct gnix_address peer_cm_nic_addr;
 	struct gnix_fid_ep *ep;
 	void *smsg_mbox;
-	struct gnix_datagram *dgram;
+	void *gnix_ep_name;
 	gni_ep_handle_t gni_ep;
-	atomic_t outstanding_tx_reqs;
+	ofi_atomic32_t outstanding_tx_reqs;
 	enum gnix_vc_conn_state conn_state;
 	uint32_t post_state;
 	int vc_id;
@@ -174,33 +170,6 @@ int _gnix_vc_alloc(struct gnix_fid_ep *ep_priv,
  */
 int _gnix_vc_connect(struct gnix_vc *vc);
 
-
-/**
- * @brief Sets up an accepting vc - one accepting vc can accept a
- *        single incoming connection request
- *
- * @param[in]  vc   pointer to previously allocated vc struct with
- *                  FI_ADDR_UNSPEC value supplied for the fi_addr_t
- *                  argument
- *
- * @return FI_SUCCESS on success, -FI_EINVAL if an invalid field in the vc
- *         struct is encountered, -ENOMEM if insufficient memory to initiate
- *         accept request.
- */
-int _gnix_vc_accept(struct gnix_vc *vc);
-
-/**
- * @brief Initiates a non-blocking disconnect of a vc from its peer
- *
- * @param[in]  vc   pointer to previously allocated and connected vc struct
- *
- * @return FI_SUCCESS on success, -FI_EINVAL if an invalid field in the vc
- *         struct is encountered, -ENOMEM if insufficient memory to initiate
- *         connection request.
- */
-int _gnix_vc_disconnect(struct gnix_vc *vc);
-
-
 /**
  * @brief Destroys a previously allocated vc and cleans up resources
  *        associated with the vc
@@ -250,6 +219,14 @@ int _gnix_vc_rx_schedule(struct gnix_vc *vc);
 int _gnix_vc_queue_work_req(struct gnix_fab_req *req);
 
 /**
+ * @brief Requeue a request with deferred work.  Used only in TX completers
+ * where the VC lock is not yet held.
+ *
+ * @param[in] req The GNIX fabric request to requeue.
+ */
+int _gnix_vc_requeue_work_req(struct gnix_fab_req *req);
+
+/**
  * @brief Schedule a VC for TX progress.
  *
  * The VC will have it's tx_queue progressed while the NIC is being progressed
@@ -325,6 +302,10 @@ fi_addr_t _gnix_vc_peer_fi_addr(struct gnix_vc *vc);
 
 int _gnix_vc_cm_init(struct gnix_cm_nic *cm_nic);
 int _gnix_vc_schedule(struct gnix_vc *vc);
+int _gnix_vc_smsg_init(struct gnix_vc *vc,
+		       int peer_id,
+		       gni_smsg_attr_t *peer_smsg_attr,
+		       gni_mem_handle_t *peer_irq_mem_hndl);
 
 /*
  * inline functions
@@ -342,5 +323,4 @@ static inline enum gnix_vc_conn_state _gnix_vc_state(struct gnix_vc *vc)
 	return vc->conn_state;
 }
 
-
 #endif /* _GNIX_VC_H_ */
diff --git a/prov/gni/include/gnix_wait.h b/prov/gni/include/gnix_wait.h
index 3a29ff0..431b67b 100644
--- a/prov/gni/include/gnix_wait.h
+++ b/prov/gni/include/gnix_wait.h
@@ -68,6 +68,8 @@ struct gnix_fid_wait {
 	struct slist set;
 };
 
+extern uint32_t gnix_wait_thread_sleep_time;
+
 /*
  * API Functions
  */
diff --git a/prov/gni/src/gnix_atomic.c b/prov/gni/src/gnix_atomic.c
index d60e76a..3b76f29 100644
--- a/prov/gni/src/gnix_atomic.c
+++ b/prov/gni/src/gnix_atomic.c
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -53,7 +54,7 @@ static int __gnix_amo_send_err(struct gnix_fid_ep *ep,
 	if (ep->send_cq) {
 		rc = _gnix_cq_add_error(ep->send_cq, req->user_context,
 					flags, 0, 0, 0, 0, 0, error,
-					GNI_RC_TRANSACTION_ERROR, NULL);
+					GNI_RC_TRANSACTION_ERROR, NULL, 0);
 		if (rc) {
 			GNIX_WARN(FI_LOG_EP_DATA,
 				  "_gnix_cq_add_error() failed: %d\n", rc);
@@ -91,7 +92,7 @@ static int __gnix_amo_send_completion(struct gnix_fid_ep *ep,
 	uint64_t flags = req->flags & GNIX_AMO_COMPLETION_FLAGS;
 
 	if ((req->flags & FI_COMPLETION) && ep->send_cq) {
-		rc = _gnix_cq_add_event(ep->send_cq, req->user_context,
+		rc = _gnix_cq_add_event(ep->send_cq, ep, req->user_context,
 					flags, 0, 0, 0, 0, FI_ADDR_NOTAVAIL);
 		if (rc) {
 			GNIX_WARN(FI_LOG_EP_DATA,
@@ -130,7 +131,7 @@ static void __gnix_amo_fr_complete(struct gnix_fab_req *req)
 		fi_close(&req->amo.loc_md->mr_fid.fid);
 	}
 
-	atomic_dec(&req->vc->outstanding_tx_reqs);
+	ofi_atomic_dec32(&req->vc->outstanding_tx_reqs);
 
 	/* Schedule VC TX queue in case the VC is 'fenced'. */
 	_gnix_vc_tx_schedule(req->vc);
@@ -274,8 +275,6 @@ static int __gnix_amo_txd_complete(void *arg, gni_return_t tx_status)
 	struct gnix_tx_descriptor *txd = (struct gnix_tx_descriptor *)arg;
 	struct gnix_fab_req *req = txd->req;
 	int rc = FI_SUCCESS;
-	uint32_t read_data32;
-	uint64_t read_data64;
 
 	_gnix_nic_tx_free(req->vc->ep->nic, txd);
 
@@ -283,25 +282,6 @@ static int __gnix_amo_txd_complete(void *arg, gni_return_t tx_status)
 		return __gnix_amo_post_err(req, FI_ECANCELED);
 	}
 
-	/* FI_ATOMIC_READ data is delivered to operand buffer in addition to
-	 * the results buffer. */
-	if (req->amo.op == FI_ATOMIC_READ) {
-		switch(fi_datatype_size(req->amo.datatype)) {
-		case sizeof(uint32_t):
-			read_data32 = *(uint32_t *)req->amo.loc_addr;
-			*(uint32_t *)req->amo.read_buf = read_data32;
-			break;
-		case sizeof(uint64_t):
-			read_data64 = *(uint64_t *)req->amo.loc_addr;
-			*(uint64_t *)req->amo.read_buf = read_data64;
-			break;
-		default:
-			GNIX_FATAL(FI_LOG_EP_DATA, "Invalid datatype: %d\n",
-				   req->amo.datatype);
-			break;
-		}
-	}
-
 	if (req->vc->peer_caps & FI_RMA_EVENT) {
 		/* control message needed for a counter event. */
 		req->work_fn = __gnix_amo_send_cntr_req;
@@ -381,16 +361,16 @@ int _gnix_atomic_cmd(enum fi_datatype dt, enum fi_op op,
 	      (fr_type == GNIX_FAB_RQ_NAMO_AX_S) ||
 	      (fr_type == GNIX_FAB_RQ_NAMO_FAX_S)) &&
 	    (dt >= FI_DATATYPE_LAST || op >= FI_ATOMIC_OP_LAST)) {
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 	}
 
 	switch(fr_type) {
 	case GNIX_FAB_RQ_AMO:
-		return __gnix_amo_cmds[op][dt] ?: -FI_ENOENT;
+		return __gnix_amo_cmds[op][dt] ?: -FI_EOPNOTSUPP;
 	case GNIX_FAB_RQ_FAMO:
-		return __gnix_fetch_amo_cmds[op][dt] ?: -FI_ENOENT;
+		return __gnix_fetch_amo_cmds[op][dt] ?: -FI_EOPNOTSUPP;
 	case GNIX_FAB_RQ_CAMO:
-		return __gnix_cmp_amo_cmds[op][dt] ?: -FI_ENOENT;
+		return __gnix_cmp_amo_cmds[op][dt] ?: -FI_EOPNOTSUPP;
 	case GNIX_FAB_RQ_NAMO_AX:
 		return GNI_FMA_ATOMIC2_AX;
 	case GNIX_FAB_RQ_NAMO_AX_S:
@@ -403,7 +383,7 @@ int _gnix_atomic_cmd(enum fi_datatype dt, enum fi_op op,
 		break;
 	}
 
-	return -FI_ENOENT;
+	return -FI_EOPNOTSUPP;
 }
 
 int _gnix_amo_post_req(void *data)
@@ -516,6 +496,7 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 	uint64_t compare_operand = 0;
 	void *loc_addr = NULL;
 	int dt_len, dt_align;
+	int connected;
 
 	if (!(flags & FI_INJECT) && !ep->send_cq &&
 	    (((fr_type == GNIX_FAB_RQ_AMO ||
@@ -532,12 +513,19 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 
 
 	if (!ep || !msg || !msg->msg_iov ||
-	    !msg->msg_iov[0].addr ||
 	    msg->msg_iov[0].count != 1 ||
 	    msg->iov_count != GNIX_MAX_ATOMIC_IOV_LIMIT ||
 	    !msg->rma_iov || !msg->rma_iov[0].addr)
 		return -FI_EINVAL;
 
+	/*
+	 * see fi_atomic man page
+	 */
+
+	if ((msg->op != FI_ATOMIC_READ) &&
+		!msg->msg_iov[0].addr)
+		return -FI_EINVAL;
+
 	if (flags & FI_TRIGGER) {
 		struct fi_triggered_context *trigger_context =
 				(struct fi_triggered_context *)msg->context;
@@ -554,7 +542,7 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 		compare_operand = *(uint64_t *)comparev[0].addr;
 	}
 
-	dt_len = fi_datatype_size(msg->datatype);
+	dt_len = ofi_datatype_size(msg->datatype);
 	dt_align = dt_len - 1;
 	len = dt_len * msg->msg_iov->count;
 
@@ -601,15 +589,6 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 		}
 	}
 
-	/* find VC for target */
-	rc = _gnix_vc_ep_get_vc(ep, msg->addr, &vc);
-	if (rc) {
-		GNIX_INFO(FI_LOG_EP_DATA,
-			  "_gnix_vc_ep_get_vc() failed, addr: %lx, rc:\n",
-			  msg->addr, rc);
-		goto err_get_vc;
-	}
-
 	/* setup fabric request */
 	req = _gnix_fr_alloc(ep);
 	if (!req) {
@@ -620,7 +599,6 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 
 	req->type = fr_type;
 	req->gnix_ep = ep;
-	req->vc = vc;
 	req->user_context = msg->context;
 	req->work_fn = _gnix_amo_post_req;
 
@@ -639,13 +617,7 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 		req->amo.second_operand =
 			*((uint64_t *)(msg->msg_iov[0].addr) + 1);
 	} else if (msg->op == FI_ATOMIC_READ) {
-		/* Atomic reads are the only AMO which write to the operand
-		 * buffer.  It's assumed that this is in addition to writing
-		 * fetched data to the result buffer.  Make the NIC write to
-		 * the result buffer, like all other AMOS, and copy read data
-		 * to the operand buffer after the completion is received. */
 		req->amo.first_operand = 0xFFFFFFFFFFFFFFFF; /* operand to FAND */
-		req->amo.read_buf = msg->msg_iov[0].addr;
 	} else if (msg->op == FI_CSWAP) {
 		req->amo.first_operand = compare_operand;
 		req->amo.second_operand = *(uint64_t *)msg->msg_iov[0].addr;
@@ -675,10 +647,40 @@ ssize_t _gnix_atomic(struct gnix_fid_ep *ep,
 		req->flags |= FI_COMPLETION;
 	}
 
-	return _gnix_vc_queue_tx_req(req);
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
+
+	/* find VC for target */
+	rc = _gnix_vc_ep_get_vc(ep, msg->addr, &vc);
+	if (rc) {
+		GNIX_INFO(FI_LOG_EP_DATA,
+			  "_gnix_vc_ep_get_vc() failed, addr: %lx, rc:\n",
+			  msg->addr, rc);
+		goto err_get_vc;
+	}
+
+	req->vc = vc;
+
+	rc = _gnix_vc_queue_tx_req(req);
+	connected = (vc->conn_state == GNIX_VC_CONNECTED);
+
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
+	/*
+	 *If a new VC was allocated, progress CM before returning.
+	 * If the VC is connected and there's a backlog, poke
+	 * the nic progress engine befure returning.
+	 */
+	if (!connected) {
+		_gnix_cm_nic_progress(ep->cm_nic);
+	} else if (!dlist_empty(&vc->tx_queue)) {
+		_gnix_nic_progress(vc->ep->nic);
+	}
+
+	return rc;
 
-err_fr_alloc:
 err_get_vc:
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+err_fr_alloc:
 	if (auto_mr) {
 		fi_close(&auto_mr->fid);
 	}
diff --git a/prov/gni/src/gnix_auth_key.c b/prov/gni/src/gnix_auth_key.c
new file mode 100644
index 0000000..7b6e6f9
--- /dev/null
+++ b/prov/gni/src/gnix_auth_key.c
@@ -0,0 +1,350 @@
+/*
+ * Copyright (c) 2017 Cray Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "rdma/fabric.h"
+#include "rdma/fi_errno.h"
+#include "fi_ext_gni.h"
+
+#include "gnix_auth_key.h"
+#include "gnix_hashtable.h"
+#include "gnix.h"
+
+#define GNIX_AUTH_KEY_HASHSEED 0xdeadbeef
+
+/* Global data storage for authorization key information */
+gnix_hashtable_t __gnix_auth_key_ht;
+
+int _gnix_get_next_reserved_key(struct gnix_auth_key *info)
+{
+	int reserved_key;
+	int offset = info->attr.user_key_limit;
+	int retry_limit = 10; /* randomly picked */
+	int ret;
+
+	if (!info) {
+		GNIX_WARN(FI_LOG_MR, "bad authorization key, key=%p\n",
+			info);
+		return -FI_EINVAL;
+	}
+
+	do {
+		reserved_key = _gnix_find_first_zero_bit(&info->prov);
+		if (reserved_key >= 0) {
+			ret = _gnix_test_and_set_bit(&info->prov, reserved_key);
+			if (ret)
+				reserved_key = -FI_EAGAIN;
+		}
+		retry_limit--;
+	} while (reserved_key < 0 && retry_limit > 0);
+
+	ret = (reserved_key < 0) ? reserved_key : (offset + reserved_key);
+
+	GNIX_INFO(FI_LOG_DOMAIN, "returning key=%d offset=%d\n", ret, offset);
+
+	return ret;
+}
+
+int _gnix_release_reserved_key(struct gnix_auth_key *info, int reserved_key)
+{
+	int offset = info->attr.user_key_limit;
+	int ret;
+
+	if (!info || reserved_key < 0) {
+		GNIX_WARN(FI_LOG_MR, "bad authorization key or reserved key,"
+			" auth_key=%p requested_key=%d\n",
+			info, reserved_key);
+		return -FI_EINVAL;
+	}
+
+	ret = _gnix_test_and_clear_bit(&info->prov, reserved_key - offset);
+	assert(ret == 1);
+
+	return (ret == 1) ? FI_SUCCESS : -FI_EBUSY;
+}
+
+int _gnix_auth_key_enable(struct gnix_auth_key *info)
+{
+	int ret = -FI_EBUSY;
+
+	if (!info) {
+		GNIX_WARN(FI_LOG_MR, "bad authorization key, key=%p\n",
+			info);
+		return -FI_EINVAL;
+	}
+
+	fastlock_acquire(&info->lock);
+	if (!info->enabled) {
+		info->enabled = 1;
+
+		ret = _gnix_alloc_bitmap(&info->prov,
+			info->attr.prov_key_limit);
+		assert(ret == FI_SUCCESS);
+
+		ret = _gnix_alloc_bitmap(&info->user,
+			info->attr.user_key_limit);
+		assert(ret == FI_SUCCESS);
+
+		GNIX_INFO(FI_LOG_DOMAIN,
+				"set resource limits: pkey=%08x ptag=%d "
+				"reserved=%d registration_limit=%d "
+				"reserved_keys=%d-%d\n",
+				info->cookie,
+				info->ptag,
+				info->attr.prov_key_limit,
+				info->attr.user_key_limit,
+				info->attr.user_key_limit,
+				(info->attr.prov_key_limit +
+				info->attr.user_key_limit - 1));
+		ret = FI_SUCCESS;
+	}
+	fastlock_release(&info->lock);
+
+	if (ret == -FI_EBUSY) {
+		GNIX_DEBUG(FI_LOG_MR, "authorization key already enabled, "
+			"auth_key=%p\n", info);
+	}
+
+	return ret;
+}
+
+struct gnix_auth_key *_gnix_auth_key_alloc()
+{
+	struct gnix_auth_key *auth_key = NULL;
+
+	auth_key = calloc(1, sizeof(*auth_key));
+	if (auth_key) {
+		fastlock_init(&auth_key->lock);
+	} else {
+		GNIX_WARN(FI_LOG_MR, "failed to allocate memory for "
+			"authorization key\n");
+	}
+
+	return auth_key;
+}
+
+int _gnix_auth_key_insert(
+		uint8_t *auth_key,
+		size_t auth_key_size,
+		struct gnix_auth_key *to_insert)
+{
+	int ret;
+	gnix_ht_key_t key;
+	struct fi_gni_auth_key *gni_auth_key =
+		(struct fi_gni_auth_key *) auth_key;
+
+	if (!to_insert) {
+		GNIX_WARN(FI_LOG_MR, "bad parameters, to_insert=%p\n",
+			to_insert);
+		return -FI_EINVAL;
+	}
+
+	if (auth_key_size == GNIX_PROV_DEFAULT_AUTH_KEYLEN)
+		key = 0;
+	else {
+		if (!auth_key) {
+			GNIX_INFO(FI_LOG_FABRIC, "auth key is null\n");
+			return -FI_EINVAL;
+		}
+
+		switch (gni_auth_key->type) {
+		case GNIX_AKT_RAW:
+			key = (gnix_ht_key_t) gni_auth_key->raw.protection_key;
+			break;
+		default:
+			GNIX_INFO(FI_LOG_FABRIC, "unrecognized auth key "
+				"type, type=%d\n",
+				gni_auth_key->type);
+			return -FI_EINVAL;
+		}
+	}
+
+	ret = _gnix_ht_insert(&__gnix_auth_key_ht, key, to_insert);
+	if (ret) {
+		GNIX_WARN(FI_LOG_MR, "failed to insert entry, ret=%d\n",
+			ret);
+	}
+
+	return ret;
+}
+
+int _gnix_auth_key_free(struct gnix_auth_key *key)
+{
+	int ret;
+
+	if (!key) {
+		GNIX_WARN(FI_LOG_MR, "bad parameters, key=%p\n", key);
+		return -FI_EINVAL;
+	}
+
+	fastlock_destroy(&key->lock);
+
+	if (key->enabled) {
+		ret = _gnix_free_bitmap(&key->user);
+		assert(ret == FI_SUCCESS);
+		if (ret) {
+			GNIX_ERR(FI_LOG_MR, "failed to free bitmap, bitmap=%p\n",
+				&key->user);
+		}
+
+		ret = _gnix_free_bitmap(&key->prov);
+		assert(ret == FI_SUCCESS);
+		if (ret) {
+			GNIX_ERR(FI_LOG_MR, "failed to free bitmap, bitmap=%p\n",
+				&key->prov);
+		}
+	}
+	key->enabled = 0;
+
+	free(key);
+
+	return FI_SUCCESS;
+}
+
+struct gnix_auth_key *
+_gnix_auth_key_lookup(uint8_t *auth_key, size_t auth_key_size)
+{
+	gnix_ht_key_t key;
+	struct gnix_auth_key *ptr = NULL;
+	struct fi_gni_auth_key *gni_auth_key;
+
+	if (auth_key_size == GNIX_PROV_DEFAULT_AUTH_KEYLEN) {
+		key = 0;
+	} else {
+		if (!auth_key) {
+			GNIX_INFO(FI_LOG_FABRIC,
+				"null auth key provided, cannot find entry\n");
+			return NULL;
+		}
+
+		gni_auth_key = (struct fi_gni_auth_key *) auth_key;
+		switch (gni_auth_key->type) {
+		case GNIX_AKT_RAW:
+			key = (gnix_ht_key_t) gni_auth_key->raw.protection_key;
+			break;
+		default:
+			GNIX_INFO(FI_LOG_FABRIC, "unrecognized auth key type, "
+				"type=%d\n", gni_auth_key->type);
+			return NULL;
+		}
+
+	}
+
+	ptr = (struct gnix_auth_key *) _gnix_ht_lookup(
+		&__gnix_auth_key_ht, key);
+
+	return ptr;
+}
+
+int _gnix_auth_key_subsys_init(void)
+{
+	int ret = FI_SUCCESS;
+
+	gnix_hashtable_attr_t attr = {
+			.ht_initial_size     = 8,
+			.ht_maximum_size     = 256,
+			.ht_increase_step    = 2,
+			.ht_increase_type    = GNIX_HT_INCREASE_MULT,
+			.ht_collision_thresh = 400,
+			.ht_hash_seed        = 0xcafed00d,
+			.ht_internal_locking = 1,
+			.destructor          = NULL
+	};
+
+	ret = _gnix_ht_init(&__gnix_auth_key_ht, &attr);
+	assert(ret == FI_SUCCESS);
+
+	return ret;
+}
+
+int _gnix_auth_key_subsys_fini(void)
+{
+	return FI_SUCCESS;
+}
+
+struct gnix_auth_key *_gnix_auth_key_create(
+		uint8_t *auth_key,
+		size_t auth_key_size)
+{
+	struct gnix_auth_key *to_insert;
+	struct fi_gni_auth_key *gni_auth_key;
+	int ret;
+	gni_return_t grc;
+	uint8_t ptag;
+	uint32_t cookie;
+
+	if (auth_key_size == GNIX_PROV_DEFAULT_AUTH_KEYLEN) {
+		gnixu_get_rdma_credentials(NULL, &ptag, &cookie);
+	} else {
+		gni_auth_key = (struct fi_gni_auth_key *) auth_key;
+		switch (gni_auth_key->type) {
+		case GNIX_AKT_RAW:
+			cookie = gni_auth_key->raw.protection_key;
+			break;
+		default:
+			GNIX_WARN(FI_LOG_FABRIC,
+				"unrecognized auth key type, type=%d\n",
+				gni_auth_key->type);
+			return NULL;
+		}
+
+		grc = GNI_GetPtag(0, cookie, &ptag);
+		if (grc) {
+			GNIX_WARN(FI_LOG_FABRIC,
+				"could not retrieve ptag, "
+				"cookie=%d ret=%d\n", cookie, grc);
+			return NULL;
+		}
+	}
+
+	to_insert = _gnix_auth_key_alloc();
+	if (!to_insert) {
+		GNIX_WARN(FI_LOG_MR, "failed to allocate memory for "
+			"auth key\n");
+		return NULL;
+	}
+
+	to_insert->attr.prov_key_limit = gnix_default_prov_registration_limit;
+	to_insert->attr.user_key_limit = gnix_default_user_registration_limit;
+	to_insert->ptag = ptag;
+	to_insert->cookie = cookie;
+
+	ret = _gnix_auth_key_insert(auth_key, auth_key_size, to_insert);
+	if (ret) {
+		GNIX_INFO(FI_LOG_MR, "failed to insert authorization key, "
+			"key=%p len=%d to_insert=%p ret=%d\n",
+			auth_key, auth_key_size, to_insert, ret);
+		_gnix_auth_key_free(to_insert);
+		to_insert = NULL;
+	}
+
+	return to_insert;
+}
diff --git a/prov/gni/src/gnix_av.c b/prov/gni/src/gnix_av.c
index 570a6a0..fb507a4 100644
--- a/prov/gni/src/gnix_av.c
+++ b/prov/gni/src/gnix_av.c
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -36,13 +37,13 @@
 //
 #include <stdlib.h>
 #include <string.h>
-#include <inttypes.h>
 #include <assert.h>
 
 #include "gnix.h"
 #include "gnix_util.h"
 #include "gnix_hashtable.h"
 #include "gnix_av.h"
+#include "gnix_cm.h"
 
 /*
  * local variables and structs
@@ -65,13 +66,15 @@ static struct fi_ops gnix_fi_av_ops;
 /*******************************************************************************
  * Helper functions.
  ******************************************************************************/
-/*
- * TODO: Check RX CTX bits.
- */
 static int gnix_verify_av_attr(struct fi_av_attr *attr)
 {
 	int ret = FI_SUCCESS;
 
+	if (attr->rx_ctx_bits > GNIX_RX_CTX_MAX_BITS) {
+		GNIX_WARN(FI_LOG_AV, "rx_ctx_bits too big\n");
+		return -FI_EINVAL;
+	}
+
 	switch (attr->type) {
 	case FI_AV_TABLE:
 	case FI_AV_MAP:
@@ -153,32 +156,52 @@ static int table_insert(struct gnix_fid_av *av_priv, const void *addr,
 			size_t count, fi_addr_t *fi_addr, uint64_t flags,
 			void *context)
 {
-	struct gnix_ep_name *temp = NULL;
+	struct gnix_ep_name ep_name;
 	int ret = count;
-	size_t index;
-	size_t i;
+	size_t index, i;
+	int *entry_err = context;
 
 	if (gnix_check_capacity(av_priv, count)) {
-		ret = -FI_ENOMEM;
-		goto err;
+		return -FI_ENOMEM;
 	}
 
 	assert(av_priv->table);
+
 	for (index = av_priv->count, i = 0; i < count; index++, i++) {
-		temp = &((struct gnix_ep_name *)addr)[i];
-		av_priv->table[index].gnix_addr = temp->gnix_addr;
+		_gnix_get_ep_name(addr, i, &ep_name, av_priv->domain);
+
+		/* check if this ep_name fits in the av context bits */
+		if (ep_name.name_type & GNIX_EPN_TYPE_SEP) {
+			if ((1 << av_priv->rx_ctx_bits) < ep_name.rx_ctx_cnt) {
+				if (flags && FI_SYNC_ERR) {
+					entry_err[i] = -FI_EINVAL;
+					fi_addr[i] = FI_ADDR_NOTAVAIL;
+					ret = -FI_EINVAL;
+					continue;
+				}
+				GNIX_DEBUG(FI_LOG_AV, "ep_name doesn't fit "
+					"into the av context bits\n");
+				return -FI_EINVAL;
+			}
+		}
+
+		av_priv->table[index].gnix_addr = ep_name.gnix_addr;
 		av_priv->valid_entry_vec[index] = 1;
-		av_priv->table[index].name_type = temp->name_type;
-		av_priv->table[index].cookie = temp->cookie;
+		av_priv->table[index].name_type = ep_name.name_type;
+		av_priv->table[index].cookie = ep_name.cookie;
+		av_priv->table[index].rx_ctx_cnt = ep_name.rx_ctx_cnt;
 		av_priv->table[index].cm_nic_cdm_id =
-				temp->cm_nic_cdm_id;
+			ep_name.cm_nic_cdm_id;
 		if (fi_addr)
 			fi_addr[i] = index;
+
+		if (flags && FI_SYNC_ERR) {
+			entry_err[i] = FI_SUCCESS;
+		}
 	}
 
 	av_priv->count += count;
 
-err:
 	return ret;
 }
 
@@ -248,7 +271,21 @@ static int table_reverse_lookup(struct gnix_fid_av *av_priv,
 
 	for (i = 0; i < av_priv->count; i++) {
 		entry = &av_priv->table[i];
-		if (GNIX_ADDR_EQUAL(entry->gnix_addr, gnix_addr)) {
+		/*
+		 * for SEP endpoint entry we may have a delta in the cdm_id
+		 * component of the address to process
+		 */
+		if ((entry->name_type & GNIX_EPN_TYPE_SEP) &&
+		    (entry->gnix_addr.device_addr == gnix_addr.device_addr)) {
+			int index = gnix_addr.cdm_id - entry->gnix_addr.cdm_id;
+
+			if ((index >= 0) && (index < entry->rx_ctx_cnt)) {
+				/* we have a match */
+				*fi_addr = fi_rx_addr(i, index,
+						      av_priv->rx_ctx_bits);
+				return FI_SUCCESS;
+			}
+		} else if (GNIX_ADDR_EQUAL(entry->gnix_addr, gnix_addr)) {
 			*fi_addr = i;
 			return FI_SUCCESS;
 		}
@@ -266,11 +303,13 @@ static int map_insert(struct gnix_fid_av *av_priv, const void *addr,
 		      void *context)
 {
 	int ret;
-	struct gnix_ep_name *temp = NULL;
+	struct gnix_ep_name ep_name;
 	struct gnix_av_addr_entry *the_entry;
 	gnix_ht_key_t key;
 	size_t i;
 	struct gnix_av_block *blk = NULL;
+	int ret_cnt = count;
+	int *entry_err = context;
 
 	assert(av_priv->map_ht != NULL);
 
@@ -290,18 +329,40 @@ static int map_insert(struct gnix_fid_av *av_priv, const void *addr,
 	slist_insert_tail(&blk->slist, &av_priv->block_list);
 
 	for (i = 0; i < count; i++) {
-		temp = &((struct gnix_ep_name *)addr)[i];
-		((struct gnix_address *)fi_addr)[i] = temp->gnix_addr;
+		_gnix_get_ep_name(addr, i, &ep_name, av_priv->domain);
+
+		/* check if this ep_name fits in the av context bits */
+		if (ep_name.name_type & GNIX_EPN_TYPE_SEP) {
+			if ((1 << av_priv->rx_ctx_bits) < ep_name.rx_ctx_cnt) {
+				if (flags && FI_SYNC_ERR) {
+					entry_err[i] = -FI_EINVAL;
+					fi_addr[i] = FI_ADDR_NOTAVAIL;
+					ret_cnt = -FI_EINVAL;
+					continue;
+				}
+				GNIX_DEBUG(FI_LOG_DEBUG, "ep_name doesn't fit "
+					"into the av context bits\n");
+				return -FI_EINVAL;
+			}
+		}
+
+		((struct gnix_address *)fi_addr)[i] = ep_name.gnix_addr;
 		the_entry =  &blk->base[i];
-		memcpy(&the_entry->gnix_addr, &temp->gnix_addr,
+		memcpy(&the_entry->gnix_addr, &ep_name.gnix_addr,
 		       sizeof(struct gnix_address));
-		the_entry->name_type = temp->name_type;
-		the_entry->cm_nic_cdm_id = temp->cm_nic_cdm_id;
-		the_entry->cookie = temp->cookie;
-		memcpy(&key, &temp->gnix_addr, sizeof(gnix_ht_key_t));
+		the_entry->name_type = ep_name.name_type;
+		the_entry->cm_nic_cdm_id = ep_name.cm_nic_cdm_id;
+		the_entry->cookie = ep_name.cookie;
+		the_entry->rx_ctx_cnt = ep_name.rx_ctx_cnt;
+		memcpy(&key, &ep_name.gnix_addr, sizeof(gnix_ht_key_t));
 		ret = _gnix_ht_insert(av_priv->map_ht,
 				      key,
 				      the_entry);
+
+		if (flags && FI_SYNC_ERR) {
+			entry_err[i] = FI_SUCCESS;
+		}
+
 		/*
 		 * we are okay with user trying to add more
 		 * entries with same key.
@@ -310,12 +371,17 @@ static int map_insert(struct gnix_fid_av *av_priv, const void *addr,
 			GNIX_WARN(FI_LOG_AV,
 				  "_gnix_ht_insert failed %d\n",
 				  ret);
+			if (flags && FI_SYNC_ERR) {
+				entry_err[i] = ret;
+				fi_addr[i] = FI_ADDR_NOTAVAIL;
+				ret_cnt = ret;
+				continue;
+			}
 			return ret;
 		}
-
 	}
 
-	return count;
+	return ret_cnt;
 }
 
 /*
@@ -356,7 +422,7 @@ static int map_lookup(struct gnix_fid_av *av_priv, fi_addr_t fi_addr,
 	gnix_ht_key_t *key = (gnix_ht_key_t *)&fi_addr;
 	struct gnix_av_addr_entry *entry;
 
-	entry = _gnix_ht_lookup(av_priv->map_ht, *key);
+	entry = _gnix_ht_lookup(av_priv->map_ht, *key & av_priv->mask);
 	if (entry == NULL)
 		return -FI_ENOENT;
 
@@ -371,28 +437,40 @@ static int map_reverse_lookup(struct gnix_fid_av *av_priv,
 {
 	GNIX_HASHTABLE_ITERATOR(av_priv->map_ht, iter);
 	struct gnix_av_addr_entry *entry;
+	fi_addr_t rx_addr;
 
 	while ((entry = _gnix_ht_iterator_next(&iter))) {
-		if (GNIX_ADDR_EQUAL(entry->gnix_addr, gnix_addr)) {
-			*fi_addr = GNIX_HASHTABLE_ITERATOR_KEY(iter);
-			return FI_SUCCESS;
+		/*
+		 * for SEP endpoint entry we may have a delta in the cdm_id
+		 * component of the address to process
+		 */
+		if ((entry->name_type & GNIX_EPN_TYPE_SEP) &&
+		    (entry->gnix_addr.device_addr == gnix_addr.device_addr)) {
+			int index = gnix_addr.cdm_id - entry->gnix_addr.cdm_id;
+
+			if ((index >= 0) && (index < entry->rx_ctx_cnt)) {
+				/* we have a match */
+				memcpy(&rx_addr, &entry->gnix_addr,
+					sizeof(fi_addr_t));
+				*fi_addr = fi_rx_addr(rx_addr,
+						      index,
+						      av_priv->rx_ctx_bits);
+				return FI_SUCCESS;
+			}
+		} else {
+			if (GNIX_ADDR_EQUAL(entry->gnix_addr, gnix_addr)) {
+				*fi_addr = GNIX_HASHTABLE_ITERATOR_KEY(iter);
+				return FI_SUCCESS;
+			}
 		}
 	}
 
-	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
 	return -FI_ENOENT;
 }
 
 /*******************************************************************************
  * FI_AV API implementations.
  ******************************************************************************/
-int _gnix_table_lookup(struct gnix_fid_av *av_priv,
-		       fi_addr_t fi_addr,
-		       struct gnix_av_addr_entry *entry_ptr)
-{
-	return table_lookup(av_priv, fi_addr, entry_ptr);
-}
-
 int _gnix_table_reverse_lookup(struct gnix_fid_av *av_priv,
 			       struct gnix_address gnix_addr,
 			       fi_addr_t *fi_addr)
@@ -400,13 +478,6 @@ int _gnix_table_reverse_lookup(struct gnix_fid_av *av_priv,
 	return table_reverse_lookup(av_priv, gnix_addr, fi_addr);
 }
 
-int _gnix_map_lookup(struct gnix_fid_av *av_priv,
-		     fi_addr_t fi_addr,
-		     struct gnix_av_addr_entry *entry_ptr)
-{
-	return map_lookup(av_priv, fi_addr, entry_ptr);
-}
-
 int _gnix_map_reverse_lookup(struct gnix_fid_av *av_priv,
 			     struct gnix_address gnix_addr,
 			     fi_addr_t *fi_addr)
@@ -418,6 +489,7 @@ int _gnix_av_lookup(struct gnix_fid_av *gnix_av, fi_addr_t fi_addr,
 		    struct gnix_av_addr_entry *entry_ptr)
 {
 	int ret = FI_SUCCESS;
+	fi_addr_t addr = fi_addr & gnix_av->mask;
 
 	GNIX_TRACE(FI_LOG_AV, "\n");
 
@@ -428,16 +500,21 @@ int _gnix_av_lookup(struct gnix_fid_av *gnix_av, fi_addr_t fi_addr,
 
 	switch (gnix_av->type) {
 	case FI_AV_TABLE:
-		ret = table_lookup(gnix_av, fi_addr, entry_ptr);
+		ret = table_lookup(gnix_av, addr, entry_ptr);
 		break;
 	case FI_AV_MAP:
-		ret = map_lookup(gnix_av, fi_addr, entry_ptr);
+		ret = map_lookup(gnix_av, addr, entry_ptr);
 		break;
 	default:
 		ret = -FI_EINVAL;
 		break;
 	}
 
+	if (fi_addr & ~gnix_av->mask) {
+		entry_ptr->gnix_addr.cdm_id +=
+				fi_addr >> (64 - gnix_av->rx_ctx_bits);
+	}
+
 err:
 	return ret;
 }
@@ -468,7 +545,6 @@ int _gnix_av_reverse_lookup(struct gnix_fid_av *gnix_av,
 	}
 
 err:
-	GNIX_TRACE(FI_LOG_AV, "\n");
 	return ret;
 }
 
@@ -531,16 +607,17 @@ DIRECT_FN STATIC int gnix_av_insert(struct fid_av *av, const void *addr,
 
 	GNIX_TRACE(FI_LOG_AV, "\n");
 
-	if (!av) {
-		ret = -FI_EINVAL;
-		goto err;
-	}
+	if (!av)
+		return -FI_EINVAL;
 
 	av_priv = container_of(av, struct gnix_fid_av, av_fid);
 
-	if (!av_priv) {
-		ret = -FI_EINVAL;
-		goto err;
+	if (!av_priv)
+		return -FI_EINVAL;
+
+	if ((flags & FI_SYNC_ERR) && (context == NULL)) {
+		GNIX_WARN(FI_LOG_AV, "FI_SYNC_ERR requires context\n");
+		return -FI_EINVAL;
 	}
 
 	switch (av_priv->type) {
@@ -556,7 +633,6 @@ DIRECT_FN STATIC int gnix_av_insert(struct fid_av *av, const void *addr,
 		break;
 	}
 
-err:
 	return ret;
 }
 
@@ -623,7 +699,20 @@ DIRECT_FN const char *gnix_av_straddr(struct fid_av *av,
 {
 	char int_buf[GNIX_AV_MAX_STR_ADDR_LEN];
 	int size;
-	const struct gnix_ep_name *gnix_ep = addr;
+	struct gnix_ep_name ep_name;
+	struct gnix_fid_av *av_priv;
+
+	if (!av || !addr || !buf || !len) {
+		GNIX_DEBUG(FI_LOG_DEBUG, "NULL parameter in gnix_av_straddr\n");
+		return NULL;
+	}
+
+	av_priv = container_of(av, struct gnix_fid_av, av_fid);
+
+	if (av_priv->domain->addr_format == FI_ADDR_STR)
+		_gnix_resolve_str_ep_name(addr, 0, &ep_name);
+	else
+		ep_name = ((struct gnix_ep_name *) addr)[0];
 
 	/*
 	 * if additional information is added to this string, then
@@ -632,13 +721,14 @@ DIRECT_FN const char *gnix_av_straddr(struct fid_av *av,
 	 *   GNIX_AV_MAX_STR_ADDR_LEN, to be the number of characters printed
 	 */
 	size = snprintf(int_buf, sizeof(int_buf), "%04i:0x%08" PRIx32 ":0x%08"
-			PRIx32 ":%02i:0x%06" PRIx32 ":0x%08" PRIx32,
-			GNIX_AV_STR_ADDR_VERSION,
-			gnix_ep->gnix_addr.device_addr,
-			gnix_ep->gnix_addr.cdm_id,
-			gnix_ep->name_type,
-			gnix_ep->cm_nic_cdm_id,
-			gnix_ep->cookie);
+			PRIx32 ":%02i:0x%06" PRIx32 ":0x%08" PRIx32
+			":%02i", GNIX_AV_STR_ADDR_VERSION,
+			ep_name.gnix_addr.device_addr,
+			ep_name.gnix_addr.cdm_id,
+			ep_name.name_type,
+			ep_name.cm_nic_cdm_id,
+			ep_name.cookie,
+			ep_name.rx_ctx_cnt);
 
 	/*
 	 * snprintf returns the number of character written
@@ -741,6 +831,7 @@ DIRECT_FN int gnix_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 
 	enum fi_av_type type = FI_AV_TABLE;
 	size_t count = 128;
+	int rx_ctx_bits = 0;
 	int ret = FI_SUCCESS;
 
 	GNIX_TRACE(FI_LOG_AV, "\n");
@@ -772,11 +863,15 @@ DIRECT_FN int gnix_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 			type = attr->type;
 		}
 		count = attr->count;
+		rx_ctx_bits = attr->rx_ctx_bits;
 	}
 
 	av_priv->domain = int_dom;
 	av_priv->type = type;
 	av_priv->addrlen = sizeof(struct gnix_address);
+	av_priv->rx_ctx_bits = rx_ctx_bits;
+	av_priv->mask = rx_ctx_bits ?
+			((uint64_t)1 << (64 - attr->rx_ctx_bits)) - 1 : ~0;
 
 	av_priv->capacity = count;
 	if (type == FI_AV_TABLE) {
diff --git a/prov/gni/src/gnix_buddy_allocator.c b/prov/gni/src/gnix_buddy_allocator.c
index 0304142..6374799 100644
--- a/prov/gni/src/gnix_buddy_allocator.c
+++ b/prov/gni/src/gnix_buddy_allocator.c
@@ -245,13 +245,14 @@ int _gnix_buddy_allocator_create(void *base, uint32_t len, uint32_t max,
 {
 	char err_buf[256] = {0}, *error = NULL;
 	int fi_errno;
+	uint32_t size_check = len / MIN_BLOCK_SIZE * 2;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
 	/* Ensure parameters are valid */
-	if (unlikely(!base || !len || !max || max > len || !alloc_handle ||
-		     IS_NOT_POW_TWO(max) || (len % max) ||
-		     !(len / MIN_BLOCK_SIZE * 2))) {
+	if (OFI_UNLIKELY(!base || !len || !max || max > len || !alloc_handle ||
+			 IS_NOT_POW_TWO(max) || (len % max) ||
+			 !size_check)) {
 
 		GNIX_WARN(FI_LOG_EP_CTRL,
 			  "Invalid parameter to _gnix_buddy_allocator_create."
diff --git a/prov/gni/src/gnix_cm.c b/prov/gni/src/gnix_cm.c
index 8a14491..f19aef1 100644
--- a/prov/gni/src/gnix_cm.c
+++ b/prov/gni/src/gnix_cm.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc.  All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -31,129 +31,1302 @@
  * SOFTWARE.
  */
 
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include "gnix_cm.h"
 #include "gnix.h"
 #include "gnix_util.h"
 #include "gnix_nic.h"
 #include "gnix_cm_nic.h"
+#include "gnix_nameserver.h"
+#include "gnix_eq.h"
+#include "gnix_vc.h"
+#include "gnix_av.h"
+
+struct fi_ops gnix_pep_fi_ops;
+struct fi_ops_ep gnix_pep_ops_ep;
+struct fi_ops_cm gnix_pep_ops_cm;
+
+int _gnix_ep_name_to_str(struct gnix_ep_name *ep_name, char **out_buf)
+{
+	char *str;
+	size_t len = GNIX_FI_ADDR_STR_LEN;
+
+	GNIX_TRACE(FI_LOG_TRACE, "\n");
+
+	if (*out_buf == NULL) {
+		str = calloc(len, sizeof(char));
+		if (str == NULL) {
+			GNIX_WARN(FI_LOG_FABRIC, fi_strerror(FI_ENOMEM));
+			return -FI_ENOMEM;
+		}
+	} else {
+		str = *out_buf;
+	}
+
+	/* Convert raw address info to string */
+	snprintf(str, len, "gni;NONE;NONE;%04i;0x%08" PRIx32 ";0x%08" PRIx32
+		";%02i;0x%06" PRIx32 ";0x%08" PRIx32 ";%02i",
+		 GNIX_AV_STR_ADDR_VERSION,
+		 ep_name->gnix_addr.device_addr,
+		 ep_name->gnix_addr.cdm_id,
+		 ep_name->name_type,
+		 ep_name->cm_nic_cdm_id,
+		 ep_name->cookie,
+		 ep_name->rx_ctx_cnt);
+
+	return FI_SUCCESS;
+}
+
+int _gnix_ep_name_from_str(const char *addr,
+			    struct gnix_ep_name *resolved_addr)
+{
+	char *tok, *endptr;
+	int ret;
+	struct gnix_ep_name ep_name;
+	long tok_val;
+	char *dup_addr;
+
+	GNIX_TRACE(FI_LOG_TRACE, "\n");
+
+	if (!addr || !resolved_addr) {
+		GNIX_WARN(FI_LOG_WARN, "NULL parameter in "
+			"__gnix_resolved_name_from_str");
+		return -FI_EINVAL;
+	}
+
+	dup_addr = strdup(addr);
+	if (!dup_addr) {
+		return -FI_ENOMEM;
+	}
+
+	tok = strtok(dup_addr, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		return -FI_EINVAL;
+	}
+
+	ret = memcmp(tok, "gni", 3);
+	if (ret) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+
+	tok = strtok(NULL, ";");/*node*/
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+
+	tok = strtok(NULL, ";");/*service*/
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+
+	tok = strtok(NULL, ";");/*GNIX_AV_STR_ADDR_VERSION*/
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+
+	/*device_addr*/
+	tok = strtok(NULL, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	tok_val = strtol(tok, &endptr, 16);
+	if (*endptr) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid device_addr.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	ep_name.gnix_addr.device_addr = (uint32_t) tok_val;
+
+	/*cdm_id*/
+	tok = strtok(NULL, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	tok_val = strtol(tok, &endptr, 16);
+	if (*endptr) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid cdm_id.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	ep_name.gnix_addr.cdm_id = (uint32_t) tok_val;
+
+	/*name_type*/
+	tok = strtok(NULL, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	tok_val = strtol(tok, &endptr, 10);
+	if (*endptr) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid name_type.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	ep_name.name_type = (uint32_t) tok_val;
+
+	/*cm_nic_cdm_id*/
+	tok = strtok(NULL, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	tok_val = strtol(tok, &endptr, 16);
+	if (*endptr) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid cm_nic_cdm_id.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	ep_name.cm_nic_cdm_id = (uint32_t) tok_val;
+
+	/*cookie*/
+	tok = strtok(NULL, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	tok_val = strtol(tok, &endptr, 16);
+	if (*endptr) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid cookie.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	ep_name.cookie = (uint32_t) tok_val;
+
+	/*rx_ctx_cnt*/
+	tok = strtok(NULL, ";");
+	if (!tok) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid address.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	tok_val = strtol(tok, &endptr, 10);
+	if (*endptr) {
+		GNIX_WARN(FI_LOG_WARN, "Invalid rx_ctx_cnt.\n");
+		free(dup_addr);
+		return -FI_EINVAL;
+	}
+	ep_name.rx_ctx_cnt = (uint32_t) tok_val;
+
+	*resolved_addr = ep_name;
+	free(dup_addr);
+
+	return FI_SUCCESS;
+}
+
+/******************************************************************************
+ *
+ * Common CM handling (supported for all types of endpoints).
+ *
+ *****************************************************************************/
 
-/*******************************************************************************
- * API function implementations.
- ******************************************************************************/
 /**
  * Retrieve the local endpoint address.
  *
  * addrlen: Should indicate the size of the addr buffer. On output will contain
  *     the size necessary to copy the proper address structure.
  *
- * addr: Pointer to memory that will conatin the address structure. Should be
+ * addr: Pointer to memory that will contain the address structure. Should be
  *     allocated and of size addrlen. If addrlen is less than necessary to copy
  *     the proper address structure then addr will contain a truncated address.
+ *     Depending on what hints were used during setup, addr will either be in
+ *     the FI_ADDR_STR or FI_ADDR_GNI format.
  *
  * return: FI_SUCCESS or negative error value.
  */
 DIRECT_FN STATIC int gnix_getname(fid_t fid, void *addr, size_t *addrlen)
 {
-	struct gnix_ep_name name = {{0}};
 	struct gnix_fid_ep *ep = NULL;
-	int ret = FI_SUCCESS;
-	size_t copy_size;
-
-	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+	struct gnix_fid_sep *sep = NULL;
+	struct gnix_fid_pep *pep = NULL;
+	size_t len = 0, cpylen;
+	bool is_fi_addr_str;
+	struct fi_info *info;
+	struct gnix_ep_name *ep_name;
+	int ret;
 
-	copy_size = sizeof(struct gnix_ep_name);
+	if (unlikely(addrlen == NULL)) {
+		GNIX_INFO(FI_LOG_EP_CTRL, "parameter \"addrlen\" is NULL in "
+			"gnix_getname\n");
+		return -FI_EINVAL;
+	}
 
-	/*
-	 * If addrlen is less than the size necessary then continue copying with
-	 * truncation and return error value -FI_ETOOSMALL.
-	 */
-	if (*addrlen < copy_size) {
-		copy_size = *addrlen;
-		ret = -FI_ETOOSMALL;
+	switch (fid->fclass) {
+	case FI_CLASS_EP:
+		ep = container_of(fid, struct gnix_fid_ep, ep_fid.fid);
+		info = ep->info;
+		ep_name = &ep->src_addr;
+		break;
+	case FI_CLASS_SEP:
+		sep = container_of(fid, struct gnix_fid_sep, ep_fid);
+		info = sep->info;
+		ep_name = &sep->my_name;
+		break;
+	case FI_CLASS_PEP:
+		pep = container_of(fid, struct gnix_fid_pep,
+				   pep_fid.fid);
+		info = pep->info;
+		ep_name = &pep->src_addr;
+		break;
+	default:
+		GNIX_INFO(FI_LOG_EP_CTRL,
+			  "Invalid fid class: %d\n",
+			  fid->fclass);
+		return -FI_EINVAL;
 	}
 
-	/* copy the address length */
-	*addrlen = sizeof(struct gnix_ep_name);
+	is_fi_addr_str = info->addr_format == FI_ADDR_STR;
 
 	if (!addr) {
-		if (copy_size >= *addrlen) {
-			ret = -FI_EINVAL;
+		if (unlikely(is_fi_addr_str)) {
+			*addrlen = GNIX_FI_ADDR_STR_LEN;
+		} else {
+			*addrlen = sizeof(struct gnix_ep_name);
 		}
 
-		goto err;
+		return -FI_ETOOSMALL;
 	}
 
-	if (!fid) {
-		ret = -FI_EINVAL;
-		goto err;
+	if (unlikely(is_fi_addr_str)) {
+		ret = _gnix_ep_name_to_str(ep_name, (char **) &addr);
+
+		if (ret)
+			return ret;
+
+		len = GNIX_FI_ADDR_STR_LEN;
+		cpylen = MIN(len, *addrlen);
+	} else {
+		len = sizeof(struct gnix_ep_name);
+		cpylen = MIN(len, *addrlen);
+		memcpy(addr, ep_name, cpylen);
+	}
+
+	*addrlen = len;
+	return (len == cpylen) ? FI_SUCCESS : -FI_ETOOSMALL;
+}
+
+DIRECT_FN STATIC int gnix_setname(fid_t fid, void *addr, size_t addrlen)
+{
+	struct gnix_fid_ep *ep = NULL;
+	struct gnix_fid_sep *sep = NULL;
+	struct gnix_fid_pep *pep = NULL;
+	struct fi_info *info;
+	struct gnix_ep_name *ep_name;
+	size_t len;
+	int ret;
+
+	if (unlikely(addr == NULL)) {
+		GNIX_INFO(FI_LOG_EP_CTRL, "parameter \"addr\" is NULL in "
+			"gnix_setname\n");
+		return -FI_EINVAL;
+	}
+
+	len = sizeof(struct gnix_ep_name);
+
+	switch (fid->fclass) {
+	case FI_CLASS_EP:
+		ep = container_of(fid, struct gnix_fid_ep, ep_fid.fid);
+		info = ep->info;
+		ep_name = &ep->src_addr;
+		break;
+	case FI_CLASS_SEP:
+		sep = container_of(fid, struct gnix_fid_sep, ep_fid);
+		info = sep->info;
+		ep_name = &sep->my_name;
+		break;
+	case FI_CLASS_PEP:
+		pep = container_of(fid, struct gnix_fid_pep, pep_fid.fid);
+		/* TODO: make sure we're unconnected. */
+		pep->bound = 1;
+		info = pep->info;
+		ep_name = &pep->src_addr;
+		break;
+	default:
+		GNIX_INFO(FI_LOG_EP_CTRL, "Invalid fid class: %d\n",
+			  fid->fclass);
+		return -FI_EINVAL;
+	}
+
+	if (unlikely(info->addr_format == FI_ADDR_STR)) {
+		len = GNIX_FI_ADDR_STR_LEN;
+
+		if (addrlen != len)
+			return -FI_EINVAL;
+
+		ret = _gnix_ep_name_from_str((const char *) addr,
+					     ep_name);
+
+		if (ret)
+			return ret;
+
+		return FI_SUCCESS;
+	}
+
+	if (addrlen != len)
+		return -FI_EINVAL;
+
+	memcpy(ep_name, addr, len);
+
+	return FI_SUCCESS;
+}
+
+DIRECT_FN STATIC int gnix_getpeer(struct fid_ep *ep, void *addr,
+				  size_t *addrlen)
+{
+	struct gnix_fid_ep *ep_priv = NULL;
+	struct gnix_fid_sep *sep_priv = NULL;
+	struct gnix_ep_name *ep_name = NULL;
+	size_t len = 0, cpylen = 0;
+	struct fi_info *info = NULL;
+	int ret;
+
+	if (unlikely(addrlen == NULL || addr == NULL)) {
+		GNIX_INFO(FI_LOG_EP_CTRL,
+			  "parameter is NULL in gnix_getpeer\n");
+		return -FI_EINVAL;
 	}
 
-	ep = container_of(fid, struct gnix_fid_ep, ep_fid.fid);
-	if (!ep || !ep->nic || !ep->domain) {
+	switch (ep->fid.fclass) {
+	case FI_CLASS_EP:
+		ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid.fid);
+		info = ep_priv->info;
+		ep_name = &ep_priv->dest_addr;
+		break;
+
+	case FI_CLASS_SEP:
+		sep_priv = container_of(ep, struct gnix_fid_sep, ep_fid);
+		info = sep_priv->info;
+		ep_name = info->dest_addr;
+		break;
+
+	default:
+		GNIX_INFO(FI_LOG_EP_CTRL, "Invalid fid class: %d\n",
+			  ep->fid.fclass);
+			return -FI_EINVAL;
+	}
+
+	if (info->addr_format == FI_ADDR_STR) {
+		ret = _gnix_ep_name_to_str(ep_name, (char **) &addr);
+
+		if (ret)
+			return ret;
+
+		len = GNIX_FI_ADDR_STR_LEN;
+		cpylen = MIN(len, *addrlen);
+	} else {
+		len = sizeof(struct gnix_ep_name);
+		cpylen = MIN(len, *addrlen);
+		memcpy(addr, ep_name, cpylen);
+	}
+
+	*addrlen = len;
+
+	return (len == cpylen) ? FI_SUCCESS : -FI_ETOOSMALL;
+}
+
+struct fi_ops_cm gnix_ep_ops_cm = {
+	.size = sizeof(struct fi_ops_cm),
+	.setname = gnix_setname,
+	.getname = gnix_getname,
+	.getpeer = gnix_getpeer,
+	.connect = fi_no_connect,
+	.listen = fi_no_listen,
+	.accept = fi_no_accept,
+	.reject = fi_no_reject,
+	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
+};
+
+/******************************************************************************
+ *
+ * FI_EP_MSG endpoint handling
+ *
+ *****************************************************************************/
+
+/* Process a connection response on an FI_EP_MSG. */
+static int __gnix_ep_connresp(struct gnix_fid_ep *ep,
+			      struct gnix_pep_sock_connresp *resp)
+{
+	int ret = FI_SUCCESS;
+	struct fi_eq_cm_entry *eq_entry;
+	int eqe_size;
+
+	switch (resp->cmd) {
+	case GNIX_PEP_SOCK_RESP_ACCEPT:
+		ep->vc->peer_caps = resp->peer_caps;
+		ep->vc->peer_id = resp->vc_id;
+
+		/* Initialize the GNI connection. */
+		ret = _gnix_vc_smsg_init(ep->vc, resp->vc_id,
+					 &resp->vc_mbox_attr,
+					 &resp->cq_irq_mdh);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "_gnix_vc_smsg_init returned %s\n",
+				  fi_strerror(-ret));
+			return ret;
+		}
+
+		ep->vc->conn_state = GNIX_VC_CONNECTED;
+		ep->conn_state = GNIX_EP_CONNECTED;
+
+		/* Notify user that this side is connected. */
+		eq_entry = (struct fi_eq_cm_entry *)resp->eqe_buf;
+		eq_entry->fid = &ep->ep_fid.fid;
+
+		eqe_size = sizeof(*eq_entry) + resp->cm_data_len;
+		ret = fi_eq_write(&ep->eq->eq_fid, FI_CONNECTED, eq_entry,
+				  eqe_size, 0);
+		if (ret != eqe_size) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "fi_eq_write failed, err: %d\n", ret);
+			return ret;
+		}
+
+		GNIX_DEBUG(FI_LOG_EP_CTRL, "Received conn accept: %p\n", ep);
+
+		break;
+	case GNIX_PEP_SOCK_RESP_REJECT:
+		/* Undo the connect and generate a failure EQE. */
+		close(ep->conn_fd);
+		ep->conn_fd = -1;
+
+		_gnix_mbox_free(ep->vc->smsg_mbox);
+		ep->vc->smsg_mbox = NULL;
+
+		_gnix_vc_destroy(ep->vc);
+		ep->vc = NULL;
+
+		ep->conn_state = GNIX_EP_UNCONNECTED;
+
+		/* Generate EQE. */
+		eq_entry = (struct fi_eq_cm_entry *)resp->eqe_buf;
+		eq_entry->fid = &ep->ep_fid.fid;
+
+		eq_entry = (struct fi_eq_cm_entry *)resp->eqe_buf;
+		ret = _gnix_eq_write_error(ep->eq, &ep->ep_fid.fid, NULL, 0,
+					   FI_ECONNREFUSED, FI_ECONNREFUSED,
+					   &eq_entry->data, resp->cm_data_len);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "fi_eq_write failed, err: %d\n", ret);
+			return ret;
+		}
+
+		GNIX_DEBUG(FI_LOG_EP_CTRL, "Conn rejected: %p\n", ep);
+
+		break;
+	default:
+		GNIX_INFO(FI_LOG_EP_CTRL, "Invalid response command: %d\n",
+			  resp->cmd);
+		return -FI_EINVAL;
+	}
+
+	return FI_SUCCESS;
+}
+
+/* Check for a connection response on an FI_EP_MSG. */
+int _gnix_ep_progress(struct gnix_fid_ep *ep)
+{
+	int ret, bytes_read, errno_keep;
+	struct gnix_pep_sock_connresp resp;
+
+	/* No lock, fast exit. */
+	if (ep->conn_state != GNIX_EP_CONNECTING) {
+		return FI_SUCCESS;
+	}
+
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
+
+	if (ep->conn_state != GNIX_EP_CONNECTING) {
+		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+		return FI_SUCCESS;
+	}
+
+	/* Check for a connection response. */
+	bytes_read = read(ep->conn_fd, &resp, sizeof(resp));
+	if (bytes_read >= 0) {
+		if (bytes_read == sizeof(resp)) {
+			/* Received response. */
+			ret = __gnix_ep_connresp(ep, &resp);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "__gnix_pep_connreq failed, %d\n",
+					  ret);
+			}
+		} else {
+			errno_keep = errno;
+			GNIX_FATAL(FI_LOG_EP_CTRL,
+				   "Unexpected read size: %d err: %s\n",
+				   bytes_read, strerror(errno_keep));
+		}
+	} else if (errno != EAGAIN) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL, "Read error: %s\n",
+				strerror(errno_keep));
+	}
+
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
+	return FI_SUCCESS;
+}
+
+DIRECT_FN STATIC int gnix_connect(struct fid_ep *ep, const void *addr,
+				  const void *param, size_t paramlen)
+{
+	int ret, errno_keep;
+	struct gnix_fid_ep *ep_priv;
+	struct sockaddr_in saddr;
+	struct gnix_pep_sock_connreq req;
+	struct fi_eq_cm_entry *eqe_ptr;
+	struct gnix_vc *vc;
+	struct gnix_mbox *mbox = NULL;
+	struct gnix_av_addr_entry av_entry;
+
+	if (!ep || !addr || (paramlen && !param) ||
+	    paramlen > GNIX_CM_DATA_MAX_SIZE)
+		return -FI_EINVAL;
+
+	ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid.fid);
+
+	COND_ACQUIRE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	if (ep_priv->conn_state != GNIX_EP_UNCONNECTED) {
 		ret = -FI_EINVAL;
-		goto err;
+		goto err_unlock;
+	}
+
+	ret = _gnix_pe_to_ip(addr, &saddr);
+	if (ret != FI_SUCCESS) {
+		GNIX_INFO(FI_LOG_EP_CTRL,
+			  "Failed to translate gnix_ep_name to IP\n");
+		goto err_unlock;
 	}
 
-	/*
-	 * Retrieve the cdm_id & device_addr from the gnix_cm_nic structure.
+	/* Create new VC without CM data. */
+	av_entry.gnix_addr = ep_priv->dest_addr.gnix_addr;
+	av_entry.cm_nic_cdm_id = ep_priv->dest_addr.cm_nic_cdm_id;
+	ret = _gnix_vc_alloc(ep_priv, &av_entry, &vc);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to create VC:: %d\n",
+			  ret);
+		goto err_unlock;
+	}
+	ep_priv->vc = vc;
+
+	ret = _gnix_mbox_alloc(vc->ep->nic->mbox_hndl, &mbox);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_DATA,
+			  "_gnix_mbox_alloc returned %s\n",
+			  fi_strerror(-ret));
+		goto err_mbox_alloc;
+	}
+	vc->smsg_mbox = mbox;
+
+	ep_priv->conn_fd = socket(AF_INET, SOCK_STREAM, 0);
+	if (ep_priv->conn_fd < 0) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to create connect socket, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_ENOSPC;
+		goto err_socket;
+	}
+
+	/* Currently blocks until connected. */
+	ret = connect(ep_priv->conn_fd, (struct sockaddr *)&saddr,
+		      sizeof(saddr));
+	if (ret) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to connect, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_EIO;
+		goto err_connect;
+	}
+
+	memset(&req, 0, sizeof(req));
+	req.info = *ep_priv->info;
+
+	/* Note addrs are swapped. */
+	memcpy(&req.dest_addr, (void *)&ep_priv->src_addr,
+	       sizeof(req.dest_addr));
+	memcpy(&ep_priv->dest_addr, addr, sizeof(ep_priv->dest_addr));
+	memcpy(&req.src_addr, addr, sizeof(req.src_addr));
+
+	if (ep_priv->info->tx_attr)
+		req.tx_attr = *ep_priv->info->tx_attr;
+	if (ep_priv->info->rx_attr)
+		req.rx_attr = *ep_priv->info->rx_attr;
+	if (ep_priv->info->ep_attr)
+		req.ep_attr = *ep_priv->info->ep_attr;
+	if (ep_priv->info->domain_attr)
+		req.domain_attr = *ep_priv->info->domain_attr;
+	if (ep_priv->info->fabric_attr)
+		req.fabric_attr = *ep_priv->info->fabric_attr;
+
+	req.vc_id = vc->vc_id;
+	req.vc_mbox_attr.msg_type = GNI_SMSG_TYPE_MBOX_AUTO_RETRANSMIT;
+	req.vc_mbox_attr.msg_buffer = mbox->base;
+	req.vc_mbox_attr.buff_size =  vc->ep->nic->mem_per_mbox;
+	req.vc_mbox_attr.mem_hndl = *mbox->memory_handle;
+	req.vc_mbox_attr.mbox_offset = (uint64_t)mbox->offset;
+	req.vc_mbox_attr.mbox_maxcredit =
+			ep_priv->domain->params.mbox_maxcredit;
+	req.vc_mbox_attr.msg_maxsize = ep_priv->domain->params.mbox_msg_maxsize;
+	req.cq_irq_mdh = ep_priv->nic->irq_mem_hndl;
+	req.peer_caps = ep_priv->caps;
+
+	req.cm_data_len = paramlen;
+	if (paramlen) {
+		eqe_ptr = (struct fi_eq_cm_entry *)req.eqe_buf;
+		memcpy(eqe_ptr->data, param, paramlen);
+	}
+
+	ret = write(ep_priv->conn_fd, &req, sizeof(req));
+	if (ret != sizeof(req)) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to send req, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_EIO;
+		goto err_write;
+	}
+	/* set fd to non-blocking now since we can't block within the eq
+	 * progress system
 	 */
+	fi_fd_nonblock(ep_priv->conn_fd);
+
+	ep_priv->conn_state = GNIX_EP_CONNECTING;
+
+	COND_RELEASE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL, "Sent conn req: %p, %s\n",
+		   ep_priv, inet_ntoa(saddr.sin_addr));
+
+	return FI_SUCCESS;
+
+err_write:
+err_connect:
+	close(ep_priv->conn_fd);
+	ep_priv->conn_fd = -1;
+err_socket:
+	_gnix_mbox_free(ep_priv->vc->smsg_mbox);
+	ep_priv->vc->smsg_mbox = NULL;
+err_mbox_alloc:
+	_gnix_vc_destroy(ep_priv->vc);
+	ep_priv->vc = NULL;
+err_unlock:
+	COND_RELEASE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	return ret;
+}
+
+DIRECT_FN STATIC int gnix_accept(struct fid_ep *ep, const void *param,
+				 size_t paramlen)
+{
+	int ret, errno_keep;
+	struct gnix_vc *vc;
+	struct gnix_fid_ep *ep_priv;
+	struct gnix_pep_sock_conn *conn;
+	struct gnix_pep_sock_connresp resp;
+	struct fi_eq_cm_entry eq_entry, *eqe_ptr;
+	struct gnix_mbox *mbox = NULL;
+	struct gnix_av_addr_entry av_entry;
+
+	if (!ep || (paramlen && !param) || paramlen > GNIX_CM_DATA_MAX_SIZE)
+		return -FI_EINVAL;
+
+	ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid.fid);
+
+	COND_ACQUIRE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	/* Look up and unpack the connection request used to create this EP. */
+	conn = (struct gnix_pep_sock_conn *)ep_priv->info->handle;
+	if (!conn || conn->fid.fclass != FI_CLASS_CONNREQ) {
+		ret = -FI_EINVAL;
+		goto err_unlock;
+	}
+
+	/* Create new VC without CM data. */
+	av_entry.gnix_addr = ep_priv->dest_addr.gnix_addr;
+	av_entry.cm_nic_cdm_id = ep_priv->dest_addr.cm_nic_cdm_id;
+	ret = _gnix_vc_alloc(ep_priv, &av_entry, &vc);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "Failed to create VC: %d\n", ret);
+		goto err_unlock;
+	}
+	ep_priv->vc = vc;
+	ep_priv->vc->peer_caps = conn->req.peer_caps;
+	ep_priv->vc->peer_id = conn->req.vc_id;
+
+	ret = _gnix_mbox_alloc(vc->ep->nic->mbox_hndl, &mbox);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_DATA, "_gnix_mbox_alloc returned %s\n",
+			  fi_strerror(-ret));
+		goto err_mbox_alloc;
+	}
+	vc->smsg_mbox = mbox;
+
+	/* Initialize the GNI connection. */
+	ret = _gnix_vc_smsg_init(vc, conn->req.vc_id,
+				 &conn->req.vc_mbox_attr,
+				 &conn->req.cq_irq_mdh);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "_gnix_vc_smsg_init returned %s\n",
+			  fi_strerror(-ret));
+		goto err_smsg_init;
+	}
+
+	vc->conn_state = GNIX_VC_CONNECTED;
+
+	/* Send ACK with VC attrs to allow peer to initialize GNI connection. */
+	resp.cmd = GNIX_PEP_SOCK_RESP_ACCEPT;
+
+	resp.vc_id = vc->vc_id;
+	resp.vc_mbox_attr.msg_type = GNI_SMSG_TYPE_MBOX_AUTO_RETRANSMIT;
+	resp.vc_mbox_attr.msg_buffer = mbox->base;
+	resp.vc_mbox_attr.buff_size =  vc->ep->nic->mem_per_mbox;
+	resp.vc_mbox_attr.mem_hndl = *mbox->memory_handle;
+	resp.vc_mbox_attr.mbox_offset = (uint64_t)mbox->offset;
+	resp.vc_mbox_attr.mbox_maxcredit =
+			ep_priv->domain->params.mbox_maxcredit;
+	resp.vc_mbox_attr.msg_maxsize =
+			ep_priv->domain->params.mbox_msg_maxsize;
+	resp.cq_irq_mdh = ep_priv->nic->irq_mem_hndl;
+	resp.peer_caps = ep_priv->caps;
+
+	resp.cm_data_len = paramlen;
+	if (paramlen) {
+		eqe_ptr = (struct fi_eq_cm_entry *)resp.eqe_buf;
+		memcpy(eqe_ptr->data, param, paramlen);
+	}
+
+	ret = write(conn->sock_fd, &resp, sizeof(resp));
+	if (ret != sizeof(resp)) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to send resp, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_EIO;
+		goto err_write;
+	}
+
+	/* Notify user that this side is connected. */
+	eq_entry.fid = &ep_priv->ep_fid.fid;
+
+	ret = fi_eq_write(&ep_priv->eq->eq_fid, FI_CONNECTED, &eq_entry,
+			  sizeof(eq_entry), 0);
+	if (ret != sizeof(eq_entry)) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "fi_eq_write failed, err: %d\n", ret);
+		goto err_eq_write;
+	}
+
+	/* Free the connection request. */
+	free(conn);
+
+	ep_priv->conn_state = GNIX_EP_CONNECTED;
+
+	COND_RELEASE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL, "Sent conn accept: %p\n", ep_priv);
+
+	return FI_SUCCESS;
+
+err_eq_write:
+err_write:
+err_smsg_init:
+	_gnix_mbox_free(ep_priv->vc->smsg_mbox);
+	ep_priv->vc->smsg_mbox = NULL;
+err_mbox_alloc:
+	_gnix_vc_destroy(ep_priv->vc);
+	ep_priv->vc = NULL;
+err_unlock:
+	COND_RELEASE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	return ret;
+}
+
+DIRECT_FN STATIC int gnix_shutdown(struct fid_ep *ep, uint64_t flags)
+{
+	int ret;
+	struct gnix_fid_ep *ep_priv;
+	struct fi_eq_cm_entry eq_entry = {0};
+
+	if (!ep)
+		return -FI_EINVAL;
 
-	if (GNIX_EP_RDM_DGM(ep->type)) {
-		name = ep->my_name;
+	ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid.fid);
+
+	COND_ACQUIRE(ep_priv->requires_lock, &ep_priv->vc_lock);
+
+	eq_entry.fid = &ep_priv->ep_fid.fid;
+
+	ret = fi_eq_write(&ep_priv->eq->eq_fid, FI_SHUTDOWN, &eq_entry,
+			  sizeof(eq_entry), 0);
+	if (ret != sizeof(eq_entry)) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "fi_eq_write failed, err: %d\n", ret);
 	} else {
-		return -FI_ENOSYS;  /*TODO: need to implement FI_EP_MSG */
+		ret = FI_SUCCESS;
 	}
 
-	memcpy(addr, &name, copy_size);
+	COND_RELEASE(ep_priv->requires_lock, &ep_priv->vc_lock);
 
-err:
 	return ret;
 }
 
-DIRECT_FN STATIC int gnix_setname(fid_t fid, void *addr, size_t addrlen)
+struct fi_ops_cm gnix_ep_msg_ops_cm = {
+	.size = sizeof(struct fi_ops_cm),
+	.setname = gnix_setname,
+	.getname = gnix_getname,
+	.getpeer = gnix_getpeer,
+	.connect = gnix_connect,
+	.listen = fi_no_listen,
+	.accept = gnix_accept,
+	.reject = fi_no_reject,
+	.shutdown = gnix_shutdown,
+	.join = fi_no_join,
+};
+
+/******************************************************************************
+ *
+ * Passive endpoint handling
+ *
+ *****************************************************************************/
+
+DIRECT_FN STATIC int gnix_pep_getopt(fid_t fid, int level, int optname,
+				     void *optval, size_t *optlen)
 {
-	return -FI_ENOSYS;
+	if (!fid || !optval || !optlen)
+		return -FI_EINVAL;
+	else if (level != FI_OPT_ENDPOINT)
+		return -FI_ENOPROTOOPT;
+
+	switch (optname) {
+	case FI_OPT_CM_DATA_SIZE:
+		*(size_t *)optval = GNIX_CM_DATA_MAX_SIZE;
+		*optlen = sizeof(size_t);
+		break;
+	default:
+		return -FI_ENOPROTOOPT;
+	}
+
+	return 0;
 }
 
-DIRECT_FN STATIC int gnix_getpeer(struct fid_ep *ep, void *addr, size_t *addrlen)
+/* Process an incoming connection request at a listening PEP. */
+static int __gnix_pep_connreq(struct gnix_fid_pep *pep, int fd)
 {
-	return -FI_ENOSYS;
+	int ret;
+	struct gnix_pep_sock_conn *conn;
+	struct fi_eq_cm_entry *eq_entry;
+	int eqe_size;
+
+	/* Create and initialize a new connection request. */
+	conn = calloc(1, sizeof(*conn));
+	if (!conn) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to alloc accepted socket conn\n");
+		return -FI_ENOMEM;
+	}
+
+	conn->fid.fclass = FI_CLASS_CONNREQ;
+	conn->fid.context = pep;
+	conn->sock_fd = fd;
+
+	/* Pull request data from the listening socket. */
+	conn->bytes_read += read(fd, &conn->req, sizeof(conn->req));
+	if (conn->bytes_read != sizeof(conn->req)) {
+		/* TODO Wait for more bytes. */
+		GNIX_FATAL(FI_LOG_EP_CTRL, "Unexpected read size\n");
+	}
+
+	conn->req.info.src_addr = &conn->req.src_addr;
+	conn->req.info.dest_addr = &conn->req.dest_addr;
+	conn->req.info.tx_attr = &conn->req.tx_attr;
+	conn->req.info.rx_attr = &conn->req.rx_attr;
+	conn->req.info.ep_attr = &conn->req.ep_attr;
+	conn->req.info.domain_attr = &conn->req.domain_attr;
+	conn->req.info.fabric_attr = &conn->req.fabric_attr;
+	conn->req.info.domain_attr->name = NULL;
+	conn->req.info.fabric_attr->name = NULL;
+	conn->req.info.fabric_attr->prov_name = NULL;
+
+	conn->info = &conn->req.info;
+	conn->info->handle = &conn->fid;
+
+	/* Tell user of a new conn req via the EQ. */
+	eq_entry = (struct fi_eq_cm_entry *)conn->req.eqe_buf;
+	eq_entry->fid = &pep->pep_fid.fid;
+	eq_entry->info = fi_dupinfo(conn->info);
+
+	eqe_size = sizeof(*eq_entry) + conn->req.cm_data_len;
+	ret = fi_eq_write(&pep->eq->eq_fid, FI_CONNREQ, eq_entry, eqe_size, 0);
+	if (ret != eqe_size) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "fi_eq_write failed, err: %d\n", ret);
+		fi_freeinfo(conn->info);
+		free(conn);
+		return ret;
+	}
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL, "Added FI_CONNREQ EQE: %p, %p\n",
+		   pep->eq, pep);
+
+	return FI_SUCCESS;
 }
 
-DIRECT_FN STATIC int gnix_connect(struct fid_ep *ep, const void *addr,
-			   const void *param, size_t paramlen)
+/* Process incoming connection requests on a listening PEP. */
+int _gnix_pep_progress(struct gnix_fid_pep *pep)
 {
-	return -FI_ENOSYS;
+	int accept_fd, ret, errno_keep;
+
+	fastlock_acquire(&pep->lock);
+
+	accept_fd = accept(pep->listen_fd, NULL, NULL);
+	if (accept_fd >= 0) {
+		/* New Connection. */
+		ret = __gnix_pep_connreq(pep, accept_fd);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "__gnix_pep_connreq failed, err: %d\n",
+				  ret);
+		}
+	} else if (errno != EAGAIN) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "(accept) Unexpected errno on listen socket: %s\n",
+			  strerror(errno_keep));
+	}
+
+	fastlock_release(&pep->lock);
+
+	return FI_SUCCESS;
 }
 
-DIRECT_FN STATIC int gnix_listen(struct fid_pep *pep)
+static void __pep_destruct(void *obj)
 {
-	return -FI_ENOSYS;
+	struct gnix_fid_pep *pep = (struct gnix_fid_pep *)obj;
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL, "Destroying PEP: %p\n", pep);
+
+	fastlock_destroy(&pep->lock);
+
+	if (pep->listen_fd >= 0)
+		close(pep->listen_fd);
+
+	if (pep->eq) {
+		_gnix_eq_poll_obj_rem(pep->eq, &pep->pep_fid.fid);
+		_gnix_ref_put(pep->eq);
+	}
+
+	free(pep);
 }
 
-DIRECT_FN STATIC int gnix_accept(struct fid_ep *ep, const void *param, size_t paramlen)
+static int gnix_pep_close(fid_t fid)
 {
-	return -FI_ENOSYS;
+	int ret = FI_SUCCESS;
+	struct gnix_fid_pep *pep;
+	int references_held;
+
+	pep = container_of(fid, struct gnix_fid_pep, pep_fid.fid);
+
+	references_held = _gnix_ref_put(pep);
+	if (references_held)
+		GNIX_INFO(FI_LOG_EP_CTRL, "failed to fully close pep due "
+			  "to lingering references. references=%i pep=%p\n",
+			  references_held, pep);
+
+	return ret;
+}
+
+DIRECT_FN int gnix_pep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
+{
+	int ret = FI_SUCCESS;
+	struct gnix_fid_pep  *pep;
+	struct gnix_fid_eq *eq;
+
+	if (!fid || !bfid)
+		return -FI_EINVAL;
+
+	pep = container_of(fid, struct gnix_fid_pep, pep_fid.fid);
+
+	fastlock_acquire(&pep->lock);
+
+	switch (bfid->fclass) {
+	case FI_CLASS_EQ:
+		eq = container_of(bfid, struct gnix_fid_eq, eq_fid.fid);
+		if (pep->fabric != eq->fabric) {
+			ret = -FI_EINVAL;
+			break;
+		}
+
+		if (pep->eq) {
+			ret = -FI_EINVAL;
+			break;
+		}
+
+		pep->eq = eq;
+		_gnix_eq_poll_obj_add(eq, &pep->pep_fid.fid);
+		_gnix_ref_get(eq);
+
+		GNIX_DEBUG(FI_LOG_EP_CTRL, "Bound EQ to PEP: %p, %p\n",
+			   eq, pep);
+		break;
+	default:
+		ret = -FI_ENOSYS;
+		break;
+	}
+
+	fastlock_release(&pep->lock);
+
+	return ret;
+}
+
+DIRECT_FN int gnix_pep_listen(struct fid_pep *pep)
+{
+	int ret, errno_keep;
+	struct gnix_fid_pep *pep_priv;
+	struct sockaddr_in saddr;
+	int sockopt = 1;
+
+	if (!pep)
+		return -FI_EINVAL;
+
+	pep_priv = container_of(pep, struct gnix_fid_pep, pep_fid.fid);
+
+	fastlock_acquire(&pep_priv->lock);
+
+	if (!pep_priv->eq) {
+		ret = -FI_EINVAL;
+		goto err_unlock;
+	}
+
+	pep_priv->listen_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
+	if (pep_priv->listen_fd < 0) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to create listening socket, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_ENOSPC;
+		goto err_unlock;
+	}
+
+	ret = setsockopt(pep_priv->listen_fd, SOL_SOCKET, SO_REUSEADDR,
+			 &sockopt, sizeof(sockopt));
+	if (ret < 0) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "setsockopt(SO_REUSEADDR) failed, err: %s\n",
+			  strerror(errno_keep));
+	}
+
+	/* Bind to the ipogif interface using resolved service number as CDM
+	 * ID. */
+	ret = _gnix_local_ipaddr(&saddr);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "Failed to find local IP\n");
+		ret = -FI_ENOSPC;
+		goto err_sock;
+	}
+
+	/* If source addr was not specified, use auto assigned port. */
+	if (pep_priv->bound)
+		saddr.sin_port = pep_priv->src_addr.gnix_addr.cdm_id;
+	else
+		saddr.sin_port = 0;
+
+	ret = bind(pep_priv->listen_fd, &saddr, sizeof(struct sockaddr_in));
+	if (ret < 0) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to bind listening socket, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_ENOSPC;
+		goto err_sock;
+	}
+
+	ret = listen(pep_priv->listen_fd, pep_priv->backlog);
+	if (ret < 0) {
+		errno_keep = errno;
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to start listening socket, err: %s\n",
+			  strerror(errno_keep));
+		ret = -FI_ENOSPC;
+		goto err_sock;
+	}
+
+	fastlock_release(&pep_priv->lock);
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL,
+		   "Configured PEP for listening: %p (%s:%d)\n",
+		   pep, inet_ntoa(saddr.sin_addr), saddr.sin_port);
+
+	return FI_SUCCESS;
+
+err_sock:
+	close(pep_priv->listen_fd);
+err_unlock:
+	fastlock_release(&pep_priv->lock);
+	return ret;
+}
+
+__attribute__((unused))
+DIRECT_FN STATIC int gnix_listen(struct fid_pep *pep)
+{
+        return -FI_ENOSYS;
 }
 
 DIRECT_FN STATIC int gnix_reject(struct fid_pep *pep, fid_t handle,
 				 const void *param, size_t paramlen)
 {
-	return -FI_ENOSYS;
+	struct gnix_fid_pep *pep_priv;
+	struct gnix_pep_sock_conn *conn;
+	struct gnix_pep_sock_connresp resp;
+	struct fi_eq_cm_entry *eqe_ptr;
+	int ret;
+
+	if (!pep)
+		return -FI_EINVAL;
+
+	pep_priv = container_of(pep, struct gnix_fid_pep, pep_fid.fid);
+
+	fastlock_acquire(&pep_priv->lock);
+
+	conn = (struct gnix_pep_sock_conn *)handle;
+	if (!conn || conn->fid.fclass != FI_CLASS_CONNREQ) {
+		fastlock_release(&pep_priv->lock);
+		return -FI_EINVAL;
+	}
+
+	resp.cmd = GNIX_PEP_SOCK_RESP_REJECT;
+
+	resp.cm_data_len = paramlen;
+	if (paramlen) {
+		eqe_ptr = (struct fi_eq_cm_entry *)resp.eqe_buf;
+		memcpy(eqe_ptr->data, param, paramlen);
+	}
+
+	ret = write(conn->sock_fd, &resp, sizeof(resp));
+	if (ret != sizeof(resp)) {
+		fastlock_release(&pep_priv->lock);
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "Failed to send resp, errno: %d\n",
+			  errno);
+		return -FI_EIO;
+	}
+
+	close(conn->sock_fd);
+	free(conn);
+
+	fastlock_release(&pep_priv->lock);
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL, "Sent conn reject: %p\n", pep_priv);
+
+	return FI_SUCCESS;
 }
 
-DIRECT_FN STATIC int gnix_shutdown(struct fid_ep *ep, uint64_t flags)
+DIRECT_FN int gnix_pep_open(struct fid_fabric *fabric,
+			    struct fi_info *info, struct fid_pep **pep,
+			    void *context)
 {
-	return -FI_ENOSYS;
+	struct gnix_fid_fabric *fabric_priv;
+	struct gnix_fid_pep *pep_priv;
+	struct gnix_ep_name *ep_name;
+
+	if (!fabric || !info || !pep)
+		return -FI_EINVAL;
+
+	fabric_priv = container_of(fabric, struct gnix_fid_fabric, fab_fid);
+
+	pep_priv = calloc(1, sizeof(*pep_priv));
+	if (!pep_priv)
+		return -FI_ENOMEM;
+
+	pep_priv->pep_fid.fid.fclass = FI_CLASS_PEP;
+	pep_priv->pep_fid.fid.context = context;
+
+	pep_priv->pep_fid.fid.ops = &gnix_pep_fi_ops;
+	pep_priv->pep_fid.ops = &gnix_pep_ops_ep;
+	pep_priv->pep_fid.cm = &gnix_pep_ops_cm;
+	pep_priv->fabric = fabric_priv;
+	pep_priv->info = fi_dupinfo(info);
+	pep_priv->info->addr_format = info->addr_format;
+
+	pep_priv->listen_fd = -1;
+	pep_priv->backlog = 5; /* TODO set via fi_control parameter. */
+	fastlock_init(&pep_priv->lock);
+
+	if (info->src_addr) {
+		ep_name = info->src_addr;
+		info->src_addrlen = sizeof(struct sockaddr_in);
+
+		pep_priv->bound = 1;
+		memcpy(&pep_priv->src_addr, ep_name, info->src_addrlen);
+	} else {
+		pep_priv->bound = 0;
+	}
+
+	_gnix_ref_init(&pep_priv->ref_cnt, 1, __pep_destruct);
+
+	*pep = &pep_priv->pep_fid;
+
+	GNIX_DEBUG(FI_LOG_EP_CTRL, "Opened PEP: %p\n", pep_priv);
+
+	return FI_SUCCESS;
 }
 
-struct fi_ops_cm gnix_cm_ops = {
+struct fi_ops gnix_pep_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = gnix_pep_close,
+	.bind = gnix_pep_bind,
+	.control = fi_no_control,
+	.ops_open = fi_no_ops_open,
+};
+
+struct fi_ops_ep gnix_pep_ops_ep = {
+	.size = sizeof(struct fi_ops_ep),
+	.cancel = fi_no_cancel,
+	.getopt = gnix_pep_getopt,
+	.setopt = fi_no_setopt,
+	.tx_ctx = fi_no_tx_ctx,
+	.rx_ctx = fi_no_rx_ctx,
+	.rx_size_left = fi_no_rx_size_left,
+	.tx_size_left = fi_no_tx_size_left,
+};
+
+struct fi_ops_cm gnix_pep_ops_cm = {
 	.size = sizeof(struct fi_ops_cm),
 	.setname = gnix_setname,
 	.getname = gnix_getname,
-	.getpeer = gnix_getpeer,
-	.connect = gnix_connect,
-	.listen = gnix_listen,
-	.accept = gnix_accept,
+	.getpeer = fi_no_getpeer,
+	.connect = fi_no_connect,
+	.listen = gnix_pep_listen,
+	.accept = fi_no_accept,
 	.reject = gnix_reject,
-	.shutdown = gnix_shutdown
+	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
+
diff --git a/prov/gni/src/gnix_cm_nic.c b/prov/gni/src/gnix_cm_nic.c
index f6d7e87..6f9f411 100644
--- a/prov/gni/src/gnix_cm_nic.c
+++ b/prov/gni/src/gnix_cm_nic.c
@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
- * Copyright (c) 2015 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -42,6 +42,7 @@
 #include "gnix.h"
 #include "gnix_datagram.h"
 #include "gnix_cm_nic.h"
+#include "gnix_cm.h"
 #include "gnix_nic.h"
 #include "gnix_hashtable.h"
 
@@ -49,6 +50,9 @@
 #define GNIX_CM_NIC_BND_TAG (100)
 #define GNIX_CM_NIC_WC_TAG (99)
 
+DLIST_HEAD(gnix_cm_nic_list);
+pthread_mutex_t gnix_cm_nic_list_lock = PTHREAD_MUTEX_INITIALIZER;
+
 /*******************************************************************************
  * Helper functions
  ******************************************************************************/
@@ -155,6 +159,12 @@ static int __process_datagram(struct gnix_datagram *dgram,
 				fi_strerror(-ret));
 			goto err;
 		}
+
+		ret = _gnix_cm_nic_progress(cm_nic);
+		if (ret != FI_SUCCESS)
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "_gnix_cm_nic_progress returned %s\n",
+				  fi_strerror(-ret));
 	}
 
 	/*
@@ -188,6 +198,24 @@ err:
 	return ret;
 }
 
+static bool __gnix_cm_nic_timeout_needed(void *data)
+{
+	struct gnix_cm_nic *cm_nic = (struct gnix_cm_nic *)data;
+	return _gnix_cm_nic_need_progress(cm_nic);
+}
+
+static void __gnix_cm_nic_timeout_progress(void *data)
+{
+	int ret;
+	struct gnix_cm_nic *cm_nic = (struct gnix_cm_nic *)data;
+	ret = _gnix_cm_nic_progress(cm_nic);
+	if (ret != FI_SUCCESS)
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			"_gnix_cm_nic_progress returned %s\n",
+			fi_strerror(-ret));
+}
+
+
 /*******************************************************************************
  * Internal API functions
  ******************************************************************************/
@@ -197,31 +225,55 @@ int _gnix_cm_nic_create_cdm_id(struct gnix_fid_domain *domain, uint32_t *id)
 	uint32_t cdm_id;
 	int v;
 
-/*
- * generate a cdm_id, use the 16 LSB of base_id from domain
- * with 16 MSBs being obtained from atomic increment of
- * a local variable.
- */
-	v = atomic_inc(&gnix_id_counter);
+	if (*id != GNIX_CREATE_CDM_ID) {
+		return FI_SUCCESS;
+	}
+
+	/*
+	 * generate a cdm_id, use the 16 LSB of base_id from domain
+	 * with 16 MSBs being obtained from atomic increment of
+	 * a local variable.
+	 */
+
+	v = ofi_atomic_inc32(&gnix_id_counter);
+
 	cdm_id = ((domain->cdm_id_seed & 0xFFF) << 12) | v;
 	*id = cdm_id;
 	return FI_SUCCESS;
 }
 
+/**
+ * This function will return a block of id's starting at id through nids
+ *
+ * @param domain  gnix domain
+ * @param nids    number of id's
+ * @param id      if -1 return an id based on the counter and seed
+ */
 int _gnix_get_new_cdm_id_set(struct gnix_fid_domain *domain, int nids,
 			     uint32_t *id)
 {
 	uint32_t cdm_id;
 	int v;
 
-	v = atomic_add(&gnix_id_counter, nids);
-	cdm_id = ((domain->cdm_id_seed & 0xFFF) << 12) | v;
-	*id = cdm_id;
+	if (*id == -1) {
+		v = ofi_atomic_add32(&gnix_id_counter, nids);
+		cdm_id = ((domain->cdm_id_seed & 0xFFF) << 12) | v;
+		*id = cdm_id;
+	} else {
+		/*
+		 * asking for a block starting at a chosen base
+		 * TODO: sanity check that requested base is reasonable
+		 */
+		if (*id <= ofi_atomic_get32(&gnix_id_counter))
+			return -FI_ENOSPC;
+		ofi_atomic_set32(&gnix_id_counter, (*(int *)id + nids));
+	}
 	return FI_SUCCESS;
 }
 
-int _gnix_cm_nic_progress(struct gnix_cm_nic *cm_nic)
+int _gnix_cm_nic_progress(void *arg)
 {
+	struct gnix_cm_nic *cm_nic = (struct gnix_cm_nic *)arg;
 	int ret = FI_SUCCESS;
 	int complete;
 	struct gnix_work_req *p = NULL;
@@ -293,6 +345,8 @@ check_again:
 					  fi_strerror(-ret));
 				goto err;
 			}
+		} else {
+			free(p);
 		}
 		goto check_again;
 	} else {
@@ -312,6 +366,10 @@ static void  __cm_nic_destruct(void *obj)
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
+	pthread_mutex_lock(&gnix_cm_nic_list_lock);
+	dlist_remove(&cm_nic->cm_nic_list);
+	pthread_mutex_unlock(&gnix_cm_nic_list_lock);
+
 	if (cm_nic->dgram_hndl != NULL) {
 		ret = _gnix_dgram_hndl_free(cm_nic->dgram_hndl);
 		if (ret != FI_SUCCESS)
@@ -330,9 +388,12 @@ static void  __cm_nic_destruct(void *obj)
 		cm_nic->addr_to_ep_ht = NULL;
 	}
 
-	if (cm_nic->nic != NULL)
+	if (cm_nic->nic != NULL) {
 		_gnix_ref_put(cm_nic->nic);
+		cm_nic->nic = NULL;
+	}
 
+	cm_nic->domain->cm_nic = NULL;
 	free(cm_nic);
 }
 
@@ -464,8 +525,15 @@ int _gnix_cm_nic_enable(struct gnix_cm_nic *cm_nic)
 	if (cm_nic == NULL)
 		return -FI_EINVAL;
 
-	fabric = cm_nic->fabric;
-	assert(fabric != NULL);
+	if (cm_nic->domain == NULL) {
+		GNIX_FATAL(FI_LOG_EP_CTRL, "domain is NULL\n");
+	}
+
+	if (cm_nic->domain->fabric == NULL) {
+		GNIX_FATAL(FI_LOG_EP_CTRL, "fabric is NULL\n");
+	}
+
+	fabric = cm_nic->domain->fabric;
 
 	assert(cm_nic->dgram_hndl != NULL);
 
@@ -526,6 +594,7 @@ int _gnix_cm_nic_free(struct gnix_cm_nic *cm_nic)
 int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 		       struct fi_info *info,
 		       uint32_t cdm_id,
+			   struct gnix_auth_key *auth_key,
 		       struct gnix_cm_nic **cm_nic_ptr)
 {
 	int ret = FI_SUCCESS;
@@ -533,6 +602,9 @@ int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 	gnix_hashtable_attr_t gnix_ht_attr = {0};
 	uint32_t name_type = GNIX_EPN_TYPE_UNBOUND;
 	struct gnix_nic_attr nic_attr = {0};
+	struct gnix_ep_name ep_name;
+	struct gnix_dgram_hndl_attr dgram_hndl_attr = {0};
+	struct gnix_dgram_hndl_attr *dgram_hndl_attr_ptr = NULL;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
@@ -546,14 +618,14 @@ int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 	 * and just use it.
 	 */
 
-	if (info->src_addr &&
-	    info->src_addrlen == sizeof(struct gnix_ep_name)) {
-		name_type = ((struct gnix_ep_name *)(info->src_addr))->
-								name_type;
+	if (info->src_addr) {
+		/*TODO (optimization): strchr to name_type and strtol */
+		_gnix_get_ep_name(info->src_addr, 0, &ep_name, domain);
+		name_type = ep_name.name_type;
 	}
 
 	GNIX_INFO(FI_LOG_EP_CTRL, "creating cm_nic for %u/0x%x/%u\n",
-		      domain->ptag, domain->cookie, cdm_id);
+			auth_key->ptag, auth_key->cookie, cdm_id);
 
 	cm_nic = (struct gnix_cm_nic *)calloc(1, sizeof(*cm_nic));
 	if (cm_nic == NULL) {
@@ -561,8 +633,14 @@ int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 		goto err;
 	}
 
+	/*
+	 * we have to force allocation of a new nic since we want
+	 * an a particulard cdm id
+	 */
+	nic_attr.must_alloc = true;
 	nic_attr.use_cdm_id = true;
 	nic_attr.cdm_id = cdm_id;
+	nic_attr.auth_key = auth_key;
 
 	ret = gnix_nic_alloc(domain, &nic_attr, &cm_nic->nic);
 	if (ret != FI_SUCCESS) {
@@ -573,11 +651,10 @@ int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 	}
 
 	cm_nic->my_name.gnix_addr.cdm_id = cdm_id;
-	cm_nic->ptag = domain->ptag;
-	cm_nic->my_name.cookie = domain->cookie;
-	cm_nic->my_name.gnix_addr.device_addr =
-	cm_nic->nic->device_addr;
-	cm_nic->fabric = domain->fabric;
+	cm_nic->ptag = auth_key->ptag;
+	cm_nic->my_name.cookie = auth_key->cookie;
+	cm_nic->my_name.gnix_addr.device_addr = cm_nic->nic->device_addr;
+	cm_nic->domain = domain;
 	cm_nic->ctrl_progress = domain->control_progress;
 	cm_nic->my_name.name_type = name_type;
 	cm_nic->poll_cnt = 0;
@@ -587,9 +664,17 @@ int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 	/*
 	 * prep the cm nic's dgram component
 	 */
-	ret = _gnix_dgram_hndl_alloc(domain->fabric,
-				     cm_nic,
+	if (domain->control_progress == FI_PROGRESS_AUTO) {
+		dgram_hndl_attr.timeout_needed = __gnix_cm_nic_timeout_needed;
+		dgram_hndl_attr.timeout_progress = __gnix_cm_nic_timeout_progress;
+		dgram_hndl_attr.timeout_data = (void *)cm_nic;
+		dgram_hndl_attr.timeout = domain->params.dgram_progress_timeout;
+		dgram_hndl_attr_ptr = &dgram_hndl_attr;
+	};
+
+	ret = _gnix_dgram_hndl_alloc(cm_nic,
 				     domain->control_progress,
+				     dgram_hndl_attr_ptr,
 				     &cm_nic->dgram_hndl);
 	if (ret != FI_SUCCESS)
 		goto err;
@@ -625,6 +710,11 @@ int _gnix_cm_nic_alloc(struct gnix_fid_domain *domain,
 	_gnix_ref_init(&cm_nic->ref_cnt, 1, __cm_nic_destruct);
 
 	*cm_nic_ptr = cm_nic;
+
+	pthread_mutex_lock(&gnix_cm_nic_list_lock);
+	dlist_insert_tail(&cm_nic->cm_nic_list, &gnix_cm_nic_list);
+	pthread_mutex_unlock(&gnix_cm_nic_list_lock);
+
 	return ret;
 
 err:
diff --git a/prov/gni/src/gnix_cntr.c b/prov/gni/src/gnix_cntr.c
index b857954..c6ff306 100644
--- a/prov/gni/src/gnix_cntr.c
+++ b/prov/gni/src/gnix_cntr.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -73,47 +73,55 @@ static int __verify_cntr_attr(struct fi_cntr_attr *attr)
 		return -FI_EINVAL;
 	}
 
-	/* TODO: Wait objects are not yet implemented. */
-	if (attr->wait_obj != FI_WAIT_NONE) {
-		return -FI_ENOSYS;
-	}
-
 	switch (attr->wait_obj) {
 	case FI_WAIT_UNSPEC:
 	case FI_WAIT_NONE:
-		break;
 	case FI_WAIT_SET:
+		break;
 	case FI_WAIT_FD:
 	case FI_WAIT_MUTEX_COND:
 	default:
 		GNIX_WARN(FI_LOG_CQ, "wait type: %d unsupported.\n",
 			  attr->wait_obj);
 		return -FI_EINVAL;
-		ret = -FI_ENOSYS;
-		break;
 	}
 
 	return ret;
 }
 
-static int __gnix_cntr_progress(struct gnix_fid_cntr *cntr)
+static int gnix_cntr_set_wait(struct gnix_fid_cntr *cntr)
 {
-	struct gnix_cq_poll_nic *pnic, *tmp;
-	int rc = FI_SUCCESS;
+	int ret = FI_SUCCESS;
 
-	COND_READ_ACQUIRE(cntr->requires_lock, &cntr->nic_lock);
+	GNIX_TRACE(FI_LOG_EQ, "\n");
 
-	dlist_for_each_safe(&cntr->poll_nics, pnic, tmp, list) {
-		rc = _gnix_nic_progress(pnic->nic);
-		if (rc) {
-			GNIX_WARN(FI_LOG_CQ,
-				  "_gnix_nic_progress failed: %d\n", rc);
-		}
+	struct fi_wait_attr requested = {
+		.wait_obj = cntr->attr.wait_obj,
+		.flags = 0
+	};
+
+	switch (cntr->attr.wait_obj) {
+	case FI_WAIT_UNSPEC:
+		ret = gnix_wait_open(&cntr->domain->fabric->fab_fid,
+				&requested, &cntr->wait);
+		break;
+	case FI_WAIT_SET:
+		ret = _gnix_wait_set_add(cntr->attr.wait_set,
+					 &cntr->cntr_fid.fid);
+
+		if (!ret)
+			cntr->wait = cntr->attr.wait_set;
+		break;
+	default:
+		break;
 	}
 
-	COND_RW_RELEASE(cntr->requires_lock, &cntr->nic_lock);
+	return ret;
+}
 
-	return rc;
+static int __gnix_cntr_progress(struct gnix_fid_cntr *cntr)
+{
+	return _gnix_prog_progress(&cntr->pset);
 }
 
 /*******************************************************************************
@@ -125,7 +133,7 @@ int _gnix_cntr_inc(struct gnix_fid_cntr *cntr)
 	if (cntr == NULL)
 		return -FI_EINVAL;
 
-	atomic_inc(&cntr->cnt);
+	ofi_atomic_inc32(&cntr->cnt);
 
 	if (cntr->wait)
 		_gnix_signal_wait_obj(cntr->wait);
@@ -141,7 +149,7 @@ int _gnix_cntr_inc_err(struct gnix_fid_cntr *cntr)
 	if (cntr == NULL)
 		return -FI_EINVAL;
 
-	atomic_inc(&cntr->cnt_err);
+	ofi_atomic_inc32(&cntr->cnt_err);
 
 	if (cntr->wait)
 		_gnix_signal_wait_obj(cntr->wait);
@@ -149,65 +157,16 @@ int _gnix_cntr_inc_err(struct gnix_fid_cntr *cntr)
 	return FI_SUCCESS;
 }
 
-int _gnix_cntr_poll_nic_add(struct gnix_fid_cntr *cntr, struct gnix_nic *nic)
+int _gnix_cntr_poll_obj_add(struct gnix_fid_cntr *cntr, void *obj,
+			    int (*prog_fn)(void *data))
 {
-	struct gnix_cntr_poll_nic *pnic, *tmp;
-
-	COND_WRITE_ACQUIRE(cntr->requires_lock, &cntr->nic_lock);
-
-	dlist_for_each_safe(&cntr->poll_nics, pnic, tmp, list) {
-		if (pnic->nic == nic) {
-			pnic->ref_cnt++;
-			COND_RW_RELEASE(cntr->requires_lock, &cntr->nic_lock);
-			return FI_SUCCESS;
-		}
-	}
-
-	pnic = malloc(sizeof(struct gnix_cntr_poll_nic));
-	if (!pnic) {
-		GNIX_WARN(FI_LOG_CQ, "Failed to add NIC to CNTR poll list.\n");
-		COND_RW_RELEASE(cntr->requires_lock, &cntr->nic_lock);
-		return -FI_ENOMEM;
-	}
-
-	/* EP holds a ref count on the NIC */
-	pnic->nic = nic;
-	pnic->ref_cnt = 1;
-	dlist_init(&pnic->list);
-	dlist_insert_tail(&pnic->list, &cntr->poll_nics);
-
-	COND_RW_RELEASE(cntr->requires_lock, &cntr->nic_lock);
-
-	GNIX_INFO(FI_LOG_CQ, "Added NIC(%p) to CNTR(%p) poll list\n",
-		  nic, cntr);
-
-	return FI_SUCCESS;
+	return _gnix_prog_obj_add(&cntr->pset, obj, prog_fn);
 }
 
-int _gnix_cntr_poll_nic_rem(struct gnix_fid_cntr *cntr, struct gnix_nic *nic)
+int _gnix_cntr_poll_obj_rem(struct gnix_fid_cntr *cntr, void *obj,
+			    int (*prog_fn)(void *data))
 {
-	struct gnix_cntr_poll_nic *pnic, *tmp;
-
-	COND_WRITE_ACQUIRE(cntr->requires_lock, &cntr->nic_lock);
-
-	dlist_for_each_safe(&cntr->poll_nics, pnic, tmp, list) {
-		if (pnic->nic == nic) {
-			if (!--pnic->ref_cnt) {
-				dlist_remove(&pnic->list);
-				free(pnic);
-				GNIX_INFO(FI_LOG_CQ,
-					  "Removed NIC(%p) from CNTR(%p) poll list\n",
-					  nic, cntr);
-			}
-			COND_RW_RELEASE(cntr->requires_lock, &cntr->nic_lock);
-			return FI_SUCCESS;
-		}
-	}
-
-	COND_RW_RELEASE(cntr->requires_lock, &cntr->nic_lock);
-
-	GNIX_WARN(FI_LOG_CQ, "NIC not found on CNTR poll list.\n");
-	return -FI_EINVAL;
+	return _gnix_prog_obj_rem(&cntr->pset, obj, prog_fn);
 }
 
 /*******************************************************************************
@@ -218,21 +177,42 @@ static int gnix_cntr_wait_sleep(struct gnix_fid_cntr *cntr_priv,
 				uint64_t threshold, int timeout)
 {
 	int ret = FI_SUCCESS;
+	struct timespec ts0, ts;
+	int msec_passed = 0;
+
+	clock_gettime(CLOCK_REALTIME, &ts0);
+	while (ofi_atomic_get32(&cntr_priv->cnt) < threshold &&
+	       ofi_atomic_get32(&cntr_priv->cnt_err) == 0) {
 
-	while (atomic_get(&cntr_priv->cnt) < threshold) {
 		ret = gnix_wait_wait((struct fid_wait *)cntr_priv->wait,
-					timeout);
+					timeout - msec_passed);
 		if (ret == -FI_ETIMEDOUT)
 			break;
+
 		if (ret) {
 			GNIX_WARN(FI_LOG_CQ,
-				" gnix_wait_wait returned %d.\n",
+				" fi_wait returned %d.\n",
 				  ret);
 			break;
 		}
+
+		if (ofi_atomic_get32(&cntr_priv->cnt) >= threshold)
+			break;
+
+		if (timeout < 0)
+			continue;
+
+		clock_gettime(CLOCK_REALTIME, &ts);
+		msec_passed = (ts.tv_sec - ts0.tv_sec) * 1000 +
+			      (ts.tv_nsec - ts0.tv_nsec) / 100000;
+
+		if (msec_passed >= timeout) {
+			ret = -FI_ETIMEDOUT;
+			break;
+		}
 	}
 
-	return ret;
+	return (ofi_atomic_get32(&cntr_priv->cnt_err)) ? -FI_EAVAIL : ret;
 }
 
 
@@ -240,29 +220,49 @@ DIRECT_FN STATIC int gnix_cntr_wait(struct fid_cntr *cntr, uint64_t threshold,
 				    int timeout)
 {
 	struct gnix_fid_cntr *cntr_priv;
-	int ret = 0;
 
 	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
+	if (!cntr_priv->wait)
+		return -FI_EINVAL;
 
-	if (!cntr_priv->wait) {
-		while (atomic_get(&cntr_priv->cnt) < threshold) {
-			ret = __gnix_cntr_progress(cntr_priv);
-			if (ret != FI_SUCCESS) {
-				GNIX_WARN(FI_LOG_CQ,
-					" __gnix_cntr_progress returned %d.\n",
-					  ret);
-				break;
-			}
+	if (cntr_priv->attr.wait_obj == FI_WAIT_SET ||
+	    cntr_priv->attr.wait_obj == FI_WAIT_NONE)
+		return -FI_EINVAL;
 
-			if (atomic_get(&cntr_priv->cnt) >= threshold)
-				break;
+	return gnix_cntr_wait_sleep(cntr_priv, threshold, timeout);
+}
 
-		}
-	} else  {
-		ret = gnix_cntr_wait_sleep(cntr_priv, threshold, timeout);
-	}
+DIRECT_FN STATIC int gnix_cntr_adderr(struct fid_cntr *cntr, uint64_t value)
+{
+	struct gnix_fid_cntr *cntr_priv;
 
-	return ret;
+	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
+	if (FI_VERSION_LT(cntr_priv->domain->fabric->fab_fid.api_version, FI_VERSION(1, 5)))
+		return -FI_EOPNOTSUPP;
+
+	ofi_atomic_add32(&cntr_priv->cnt_err, (int)value);
+
+	if (cntr_priv->wait)
+		_gnix_signal_wait_obj(cntr_priv->wait);
+
+	return FI_SUCCESS;
+}
+
+DIRECT_FN STATIC int gnix_cntr_seterr(struct fid_cntr *cntr, uint64_t value)
+{
+	struct gnix_fid_cntr *cntr_priv;
+
+	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
+
+	if (FI_VERSION_LT(cntr_priv->domain->fabric->fab_fid.api_version, FI_VERSION(1, 5)))
+		return -FI_EOPNOTSUPP;
+
+	ofi_atomic_set32(&cntr_priv->cnt_err, (int)value);
+
+	if (cntr_priv->wait)
+		_gnix_signal_wait_obj(cntr_priv->wait);
+
+	return FI_SUCCESS;
 }
 
 static void __cntr_destruct(void *obj)
@@ -289,6 +289,8 @@ static void __cntr_destruct(void *obj)
 		break;
 	}
 
+	_gnix_prog_fini(&cntr->pset);
+
 	free(cntr);
 }
 
@@ -321,7 +323,7 @@ DIRECT_FN STATIC uint64_t gnix_cntr_readerr(struct fid_cntr *cntr)
 		return -FI_EINVAL;
 
 	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
-	v = atomic_get(&cntr_priv->cnt_err);
+	v = ofi_atomic_get32(&cntr_priv->cnt_err);
 
 	ret = __gnix_cntr_progress(cntr_priv);
 	if (ret != FI_SUCCESS)
@@ -340,13 +342,17 @@ DIRECT_FN STATIC uint64_t gnix_cntr_read(struct fid_cntr *cntr)
 		return -FI_EINVAL;
 
 	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
-	v = atomic_get(&cntr_priv->cnt);
+
+	if (cntr_priv->wait)
+		gnix_wait_wait((struct fid_wait *)cntr_priv->wait, 0);
 
 	ret = __gnix_cntr_progress(cntr_priv);
 	if (ret != FI_SUCCESS)
 		GNIX_WARN(FI_LOG_CQ, " __gnix_cntr_progress returned %d.\n",
 			  ret);
 
+	v = ofi_atomic_get32(&cntr_priv->cnt);
+
 	return (uint64_t)v;
 }
 
@@ -358,7 +364,7 @@ DIRECT_FN STATIC int gnix_cntr_add(struct fid_cntr *cntr, uint64_t value)
 		return -FI_EINVAL;
 
 	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
-	atomic_add(&cntr_priv->cnt, (int)value);
+	ofi_atomic_add32(&cntr_priv->cnt, (int)value);
 
 	if (cntr_priv->wait)
 		_gnix_signal_wait_obj(cntr_priv->wait);
@@ -376,7 +382,7 @@ DIRECT_FN STATIC int gnix_cntr_set(struct fid_cntr *cntr, uint64_t value)
 		return -FI_EINVAL;
 
 	cntr_priv = container_of(cntr, struct gnix_fid_cntr, cntr_fid);
-	atomic_set(&cntr_priv->cnt, (int)value);
+	ofi_atomic_set32(&cntr_priv->cnt, (int)value);
 
 	if (cntr_priv->wait)
 		_gnix_signal_wait_obj(cntr_priv->wait);
@@ -451,22 +457,31 @@ DIRECT_FN int gnix_cntr_open(struct fid_domain *domain,
 	_gnix_ref_init(&cntr_priv->ref_cnt, 1, __cntr_destruct);
 
 	/* initialize atomics */
-	atomic_initialize(&cntr_priv->cnt, 0);
-	atomic_initialize(&cntr_priv->cnt_err, 0);
+	ofi_atomic_initialize32(&cntr_priv->cnt, 0);
+	ofi_atomic_initialize32(&cntr_priv->cnt_err, 0);
 
 	_gnix_ref_get(cntr_priv->domain);
-	dlist_init(&cntr_priv->poll_nics);
-	rwlock_init(&cntr_priv->nic_lock);
+
+	_gnix_prog_init(&cntr_priv->pset);
+
 	dlist_init(&cntr_priv->trigger_list);
 	fastlock_init(&cntr_priv->trigger_lock);
 
+	ret = gnix_cntr_set_wait(cntr_priv);
+	if (ret)
+		goto err_wait;
+
 	cntr_priv->cntr_fid.fid.fclass = FI_CLASS_CNTR;
 	cntr_priv->cntr_fid.fid.context = context;
 	cntr_priv->cntr_fid.fid.ops = &gnix_cntr_fi_ops;
 	cntr_priv->cntr_fid.ops = &gnix_cntr_ops;
 
 	*cntr = &cntr_priv->cntr_fid;
+	return ret;
 
+err_wait:
+	_gnix_ref_put(cntr_priv->domain);
+	free(cntr_priv);
 err:
 	return ret;
 }
@@ -490,4 +505,6 @@ static struct fi_ops_cntr gnix_cntr_ops = {
 	.add = gnix_cntr_add,
 	.set = gnix_cntr_set,
 	.wait = gnix_cntr_wait,
+	.adderr = gnix_cntr_adderr,
+	.seterr = gnix_cntr_seterr
 };
diff --git a/prov/gni/src/gnix_cq.c b/prov/gni/src/gnix_cq.c
index 2f024e7..31cb319 100644
--- a/prov/gni/src/gnix_cq.c
+++ b/prov/gni/src/gnix_cq.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -71,7 +71,7 @@ static const struct fi_ops_cq gnix_cq_ops;
 /*******************************************************************************
  * Size array corresponding format type to format size.
  ******************************************************************************/
-static const size_t const format_sizes[] = {
+static const size_t format_sizes[] = {
 	[FI_CQ_FORMAT_UNSPEC]  = sizeof(GNIX_CQ_DEFAULT_FORMAT),
 	[FI_CQ_FORMAT_CONTEXT] = sizeof(struct fi_cq_entry),
 	[FI_CQ_FORMAT_MSG]     = sizeof(struct fi_cq_msg_entry),
@@ -79,7 +79,7 @@ static const size_t const format_sizes[] = {
 	[FI_CQ_FORMAT_TAGGED]  = sizeof(struct fi_cq_tagged_entry)
 };
 
-static const fill_entry const fill_function[] = {
+static const fill_entry fill_function[] = {
 	[FI_CQ_FORMAT_UNSPEC]  = fill_cq_entry,
 	[FI_CQ_FORMAT_CONTEXT] = fill_cq_entry,
 	[FI_CQ_FORMAT_MSG]     = fill_cq_msg,
@@ -158,11 +158,6 @@ static int verify_cq_attr(struct fi_cq_attr *attr, struct fi_ops_cq *ops,
 		return -FI_EINVAL;
 	}
 
-	/* TODO: Wait objects are not yet implemented. */
-	if (attr->wait_obj != FI_WAIT_NONE) {
-		return -FI_ENOSYS;
-	}
-
 	switch (attr->wait_obj) {
 	case FI_WAIT_NONE:
 		ops->sread = fi_no_cq_sread;
@@ -178,10 +173,9 @@ static int verify_cq_attr(struct fi_cq_attr *attr, struct fi_ops_cq *ops,
 		}
 		break;
 	case FI_WAIT_UNSPEC:
-		attr->wait_obj = FI_WAIT_FD;
+		break;
 	case FI_WAIT_FD:
 	case FI_WAIT_MUTEX_COND:
-		break;
 	default:
 		GNIX_WARN(FI_LOG_CQ, "wait type: %d unsupported.\n",
 			  attr->wait_obj);
@@ -203,15 +197,14 @@ static int gnix_cq_set_wait(struct gnix_fid_cq *cq)
 	};
 
 	switch (cq->attr.wait_obj) {
+	case FI_WAIT_UNSPEC:
 	case FI_WAIT_FD:
 	case FI_WAIT_MUTEX_COND:
 		ret = gnix_wait_open(&cq->domain->fabric->fab_fid,
 				&requested, &cq->wait);
 		break;
 	case FI_WAIT_SET:
-		cq->wait = cq->attr.wait_set;
-		ret = _gnix_wait_set_add(cq->wait, &cq->cq_fid.fid);
-
+		ret = _gnix_wait_set_add(cq->attr.wait_set, &cq->cq_fid.fid);
 		if (!ret)
 			cq->wait = cq->attr.wait_set;
 
@@ -258,50 +251,42 @@ err:
 
 static int __gnix_cq_progress(struct gnix_fid_cq *cq)
 {
-	struct gnix_cq_poll_nic *pnic, *tmp;
-	int rc;
-
-	COND_READ_ACQUIRE(cq->requires_lock, &cq->nic_lock);
-
-	dlist_for_each_safe(&cq->poll_nics, pnic, tmp, list) {
-		rc = _gnix_nic_progress(pnic->nic);
-		if (rc) {
-			GNIX_WARN(FI_LOG_CQ,
-				  "_gnix_nic_progress failed: %d\n", rc);
-		}
-	}
-
-	COND_RW_RELEASE(cq->requires_lock, &cq->nic_lock);
-
-	if (unlikely(cq->domain->control_progress != FI_PROGRESS_AUTO)) {
-		if (cq->domain->cm_nic != NULL) {
-			rc = _gnix_cm_nic_progress(cq->domain->cm_nic);
-			if (rc)
-				GNIX_WARN(FI_LOG_CQ,
-				  "_gnix_cm_nic_progress returned: %d\n", rc);
-		}
-	}
-
-	return FI_SUCCESS;
+	return _gnix_prog_progress(&cq->pset);
 }
 
-
 /*******************************************************************************
  * Exposed helper functions
  ******************************************************************************/
-ssize_t _gnix_cq_add_event(struct gnix_fid_cq *cq, void *op_context,
-			   uint64_t flags, size_t len, void *buf,
-			   uint64_t data, uint64_t tag, fi_addr_t src_addr)
+ssize_t _gnix_cq_add_event(struct gnix_fid_cq *cq, struct gnix_fid_ep *ep,
+			   void *op_context, uint64_t flags, size_t len,
+			   void *buf, uint64_t data, uint64_t tag,
+			   fi_addr_t src_addr)
 {
 	struct gnix_cq_entry *event;
 	struct slist_entry *item;
+	uint64_t mask;
+	ssize_t ret = FI_SUCCESS;
+
+	if (ep) {
+		if (ep->info && ep->info->mode & FI_NOTIFY_FLAGS_ONLY) {
+			mask = (FI_REMOTE_CQ_DATA | FI_MULTI_RECV);
+
+			if (flags & FI_RMA_EVENT) {
+				mask |= (FI_REMOTE_READ | FI_REMOTE_WRITE |
+					 FI_RMA);
+			}
+
+			flags &= mask;
+		}
+	}
 
 	COND_ACQUIRE(cq->requires_lock, &cq->lock);
 
 	item = _gnix_queue_get_free(cq->events);
 	if (!item) {
 		GNIX_WARN(FI_LOG_CQ, "error creating cq_entry\n");
-		return -FI_ENOMEM;
+		ret = -FI_ENOMEM;
+		goto err;
 	}
 
 	event = container_of(item, struct gnix_cq_entry, item);
@@ -318,15 +303,17 @@ ssize_t _gnix_cq_add_event(struct gnix_fid_cq *cq, void *op_context,
 	if (cq->wait)
 		_gnix_signal_wait_obj(cq->wait);
 
+err:
 	COND_RELEASE(cq->requires_lock, &cq->lock);
 
-	return FI_SUCCESS;
+	return ret;
 }
 
 ssize_t _gnix_cq_add_error(struct gnix_fid_cq *cq, void *op_context,
 			   uint64_t flags, size_t len, void *buf,
 			   uint64_t data, uint64_t tag, size_t olen,
-			   int err, int prov_errno, void *err_data)
+			   int err, int prov_errno, void *err_data,
+			   size_t err_data_size)
 {
 	struct fi_cq_err_entry *error;
 	struct gnix_cq_entry *event;
@@ -360,6 +347,7 @@ ssize_t _gnix_cq_add_error(struct gnix_fid_cq *cq, void *op_context,
 	error->err = err;
 	error->prov_errno = prov_errno;
 	error->err_data = err_data;
+	error->err_data_size = err_data_size;
 
 	_gnix_queue_enqueue(cq->errors, &event->item);
 
@@ -369,65 +357,16 @@ err:
 	return ret;
 }
 
-int _gnix_cq_poll_nic_add(struct gnix_fid_cq *cq, struct gnix_nic *nic)
+int _gnix_cq_poll_obj_add(struct gnix_fid_cq *cq, void *obj,
+			  int (*prog_fn)(void *data))
 {
-	struct gnix_cq_poll_nic *pnic, *tmp;
-
-	COND_WRITE_ACQUIRE(cq->requires_lock, &cq->nic_lock);
-
-	dlist_for_each_safe(&cq->poll_nics, pnic, tmp, list) {
-		if (pnic->nic == nic) {
-			pnic->ref_cnt++;
-			rwlock_unlock(&cq->nic_lock);
-			return FI_SUCCESS;
-		}
-	}
-
-	pnic = malloc(sizeof(struct gnix_cq_poll_nic));
-	if (!pnic) {
-		GNIX_WARN(FI_LOG_CQ, "Failed to add NIC to CQ poll list.\n");
-		COND_RW_RELEASE(cq->requires_lock, &cq->nic_lock);
-		return -FI_ENOMEM;
-	}
-
-	/* EP holds a ref count on the NIC */
-	pnic->nic = nic;
-	pnic->ref_cnt = 1;
-	dlist_init(&pnic->list);
-	dlist_insert_tail(&pnic->list, &cq->poll_nics);
-
-	COND_RW_RELEASE(cq->requires_lock, &cq->nic_lock);
-
-	GNIX_INFO(FI_LOG_CQ, "Added NIC(%p) to CQ(%p) poll list\n",
-		  nic, cq);
-
-	return FI_SUCCESS;
+	return _gnix_prog_obj_add(&cq->pset, obj, prog_fn);
 }
 
-int _gnix_cq_poll_nic_rem(struct gnix_fid_cq *cq, struct gnix_nic *nic)
+int _gnix_cq_poll_obj_rem(struct gnix_fid_cq *cq, void *obj,
+			  int (*prog_fn)(void *data))
 {
-	struct gnix_cq_poll_nic *pnic, *tmp;
-
-	COND_WRITE_ACQUIRE(cq->requires_lock, &cq->nic_lock);
-
-	dlist_for_each_safe(&cq->poll_nics, pnic, tmp, list) {
-		if (pnic->nic == nic) {
-			if (!--pnic->ref_cnt) {
-				dlist_remove(&pnic->list);
-				free(pnic);
-				GNIX_INFO(FI_LOG_CQ,
-					  "Removed NIC(%p) from CQ(%p) poll list\n",
-					  nic, cq);
-			}
-			rwlock_unlock(&cq->nic_lock);
-			return FI_SUCCESS;
-		}
-	}
-
-	COND_RW_RELEASE(cq->requires_lock, &cq->nic_lock);
-
-	GNIX_WARN(FI_LOG_CQ, "NIC not found on CQ poll list.\n");
-	return -FI_EINVAL;
+	return _gnix_prog_obj_rem(&cq->pset, obj, prog_fn);
 }
 
 static void __cq_destruct(void *obj)
@@ -454,6 +393,8 @@ static void __cq_destruct(void *obj)
 		break;
 	}
 
+	_gnix_prog_fini(&cq->pset);
+
 	_gnix_queue_destroy(cq->events);
 	_gnix_queue_destroy(cq->errors);
 
@@ -486,7 +427,7 @@ static int gnix_cq_close(fid_t fid)
 	return FI_SUCCESS;
 }
 
-DIRECT_FN STATIC ssize_t gnix_cq_readfrom(struct fid_cq *cq, void *buf,
+static ssize_t __gnix_cq_readfrom(struct fid_cq *cq, void *buf,
 					  size_t count, fi_addr_t *src_addr)
 {
 	struct gnix_fid_cq *cq_priv;
@@ -528,48 +469,53 @@ DIRECT_FN STATIC ssize_t gnix_cq_readfrom(struct fid_cq *cq, void *buf,
 	return read_count ?: -FI_EAGAIN;
 }
 
-DIRECT_FN STATIC ssize_t gnix_cq_read(struct fid_cq *cq, void *buf, size_t count)
+static ssize_t __gnix_cq_sreadfrom(int blocking, struct fid_cq *cq, void *buf,
+				     size_t count, fi_addr_t *src_addr,
+				     const void *cond, int timeout)
 {
-	return gnix_cq_readfrom(cq, buf, count, NULL);
-}
+	struct gnix_fid_cq *cq_priv;
 
-DIRECT_FN STATIC ssize_t gnix_cq_sreadfrom(struct fid_cq *cq, void *buf,
-					   size_t count, fi_addr_t *src_addr,
-					   const void *cond, int timeout)
-{
-	double start_ms = 0.0, end_ms = 0.0;
-	int ret;
+	cq_priv = container_of(cq, struct gnix_fid_cq, cq_fid);
+	if ((blocking && !cq_priv->wait) ||
+	    (blocking && cq_priv->attr.wait_obj == FI_WAIT_SET))
+		return -FI_EINVAL;
 
-	ret = gnix_cq_readfrom(cq, buf, count, NULL);
-	if (ret != -FI_EAGAIN)
-		return ret;
+	if (_gnix_queue_peek(cq_priv->errors))
+		return -FI_EAVAIL;
 
-	if (timeout > 0)
-		start_ms = fi_gettime_ms();
+	if (cq_priv->wait)
+		gnix_wait_wait((struct fid_wait *)cq_priv->wait, timeout);
 
-	do {
-		usleep(1000);
 
-		ret = gnix_cq_readfrom(cq, buf, count, NULL);
-		if (ret != -FI_EAGAIN)
-			return ret;
+	return __gnix_cq_readfrom(cq, buf, count, src_addr);
 
-		if (timeout > 0) {
-			end_ms = fi_gettime_ms();
-			timeout -=  (end_ms - start_ms);
-			timeout = timeout < 0 ? 0 : timeout;
-			start_ms = end_ms;
-		}
-	} while (timeout);
+}
+
+DIRECT_FN STATIC ssize_t gnix_cq_sreadfrom(struct fid_cq *cq, void *buf,
+					   size_t count, fi_addr_t *src_addr,
+					   const void *cond, int timeout)
+{
+	return __gnix_cq_sreadfrom(1, cq, buf, count, src_addr, cond, timeout);
+}
 
-	return -FI_EAGAIN;
+DIRECT_FN STATIC ssize_t gnix_cq_read(struct fid_cq *cq,
+				      void *buf,
+				      size_t count)
+{
+	return __gnix_cq_sreadfrom(0, cq, buf, count, NULL, NULL, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_cq_sread(struct fid_cq *cq, void *buf,
 				       size_t count, const void *cond,
 				       int timeout)
 {
-	return gnix_cq_sreadfrom(cq, buf, count, NULL, cond, timeout);
+	return __gnix_cq_sreadfrom(1, cq, buf, count, NULL, cond, timeout);
+}
+
+DIRECT_FN STATIC ssize_t gnix_cq_readfrom(struct fid_cq *cq, void *buf,
+					  size_t count, fi_addr_t *src_addr)
+{
+	return __gnix_cq_sreadfrom(0, cq, buf, count, src_addr, NULL, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_cq_readerr(struct fid_cq *cq,
@@ -579,6 +525,8 @@ DIRECT_FN STATIC ssize_t gnix_cq_readerr(struct fid_cq *cq,
 	struct gnix_fid_cq *cq_priv;
 	struct gnix_cq_entry *event;
 	struct slist_entry *entry;
+	size_t err_data_cpylen;
+	struct fi_cq_err_entry *gnix_cq_err;
 
 	ssize_t read_count = 0;
 
@@ -587,6 +535,13 @@ DIRECT_FN STATIC ssize_t gnix_cq_readerr(struct fid_cq *cq,
 
 	cq_priv = container_of(cq, struct gnix_fid_cq, cq_fid);
 
+	/*
+	 * we need to progress cq.  some apps may be only using
+	 * cq to check for errors.
+	 */
+
+	_gnix_prog_progress(&cq_priv->pset);
+
 	COND_ACQUIRE(cq_priv->requires_lock, &cq_priv->lock);
 
 	entry = _gnix_queue_dequeue(cq_priv->errors);
@@ -596,8 +551,51 @@ DIRECT_FN STATIC ssize_t gnix_cq_readerr(struct fid_cq *cq,
 	}
 
 	event = container_of(entry, struct gnix_cq_entry, item);
-
-	memcpy(buf, event->the_entry, sizeof(struct fi_cq_err_entry));
+	gnix_cq_err = event->the_entry;
+
+	buf->op_context = gnix_cq_err->op_context;
+	buf->flags = gnix_cq_err->flags;
+	buf->len = gnix_cq_err->len;
+	buf->buf = gnix_cq_err->buf;
+	buf->data = gnix_cq_err->data;
+	buf->tag = gnix_cq_err->tag;
+	buf->olen = gnix_cq_err->olen;
+	buf->err = gnix_cq_err->err;
+	buf->prov_errno = gnix_cq_err->prov_errno;
+
+	if (gnix_cq_err->err_data != NULL) {
+		/*
+		 * Note: If the api version is >= 1.5 then copy err_data into
+		 * buf->err_data and copy at most buf->err_data_size.
+		 * If buf->err_data_size is zero or the api version is < 1.5,
+		 * use the old method of allocating space in provider.
+		 */
+		if (FI_VERSION_LT(cq_priv->domain->fabric->fab_fid.api_version,
+		    FI_VERSION(1, 5)) || buf->err_data_size == 0) {
+			err_data_cpylen = sizeof(cq_priv->err_data);
+
+			memcpy(cq_priv->err_data, gnix_cq_err->err_data,
+				err_data_cpylen);
+
+			buf->err_data = cq_priv->err_data;
+		} else {
+			if (buf->err_data == NULL)
+				return -FI_EINVAL;
+
+			err_data_cpylen = MIN(buf->err_data_size, sizeof(cq_priv->err_data));
+			memcpy(buf->err_data, gnix_cq_err->err_data, err_data_cpylen);
+			buf->err_data_size = err_data_cpylen;
+		}
+		free(gnix_cq_err->err_data);
+		gnix_cq_err->err_data = NULL;
+	} else {
+		if (FI_VERSION_LT(cq_priv->domain->fabric->fab_fid.api_version,
+		    FI_VERSION(1, 5))) {
+			buf->err_data = NULL;
+		} else {
+			buf->err_data_size = 0;
+		}
+	}
 
 	_gnix_queue_enqueue_free(cq_priv->errors, &event->item);
 
@@ -630,15 +628,9 @@ DIRECT_FN STATIC int gnix_cq_signal(struct fid_cq *cq)
 
 static int gnix_cq_control(struct fid *cq, int command, void *arg)
 {
-	/* disabled until new trywait interface is implemented
-	struct gnix_fid_cq *cq_priv;
-
-	cq_priv = container_of(cq, struct gnix_fid_cq, cq_fid);
-	*/
 
 	switch (command) {
 	case FI_GETWAIT:
-		/* return _gnix_get_wait_obj(cq_priv->wait, arg); */
 		return -FI_ENOSYS;
 	default:
 		return -FI_EINVAL;
@@ -660,14 +652,13 @@ DIRECT_FN int gnix_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 
 	cq_ops = calloc(1, sizeof(*cq_ops));
 	if (!cq_ops) {
-		ret = -FI_ENOMEM;
-		goto err;
+		return -FI_ENOMEM;
 	}
 
 	fi_cq_ops = calloc(1, sizeof(*fi_cq_ops));
 	if (!fi_cq_ops) {
 		ret = -FI_ENOMEM;
-		goto err1;
+		goto free_cq_ops;
 	}
 
 	*cq_ops = gnix_cq_ops;
@@ -675,18 +666,18 @@ DIRECT_FN int gnix_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 
 	ret = verify_cq_attr(attr, cq_ops, fi_cq_ops);
 	if (ret)
-		goto err2;
+		goto free_fi_cq_ops;
 
 	domain_priv = container_of(domain, struct gnix_fid_domain, domain_fid);
 	if (!domain_priv) {
 		ret = -FI_EINVAL;
-		goto err2;
+		goto free_fi_cq_ops;
 	}
 
 	cq_priv = calloc(1, sizeof(*cq_priv));
 	if (!cq_priv) {
 		ret = -FI_ENOMEM;
-		goto err2;
+		goto free_fi_cq_ops;
 	}
 
 	cq_priv->requires_lock = (domain_priv->thread_model !=
@@ -697,8 +688,8 @@ DIRECT_FN int gnix_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 
 	_gnix_ref_init(&cq_priv->ref_cnt, 1, __cq_destruct);
 	_gnix_ref_get(cq_priv->domain);
-	dlist_init(&cq_priv->poll_nics);
-	rwlock_init(&cq_priv->nic_lock);
+
+	_gnix_prog_init(&cq_priv->pset);
 
 	cq_priv->cq_fid.fid.fclass = FI_CLASS_CQ;
 	cq_priv->cq_fid.fid.context = context;
@@ -712,40 +703,37 @@ DIRECT_FN int gnix_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	 */
 	cq_priv->entry_size = format_sizes[cq_priv->attr.format];
 
-
+	fastlock_init(&cq_priv->lock);
 	ret = gnix_cq_set_wait(cq_priv);
 	if (ret)
-		goto err3;
-
-	fastlock_init(&cq_priv->lock);
+		goto free_cq_priv;
 
 	ret = _gnix_queue_create(&cq_priv->events, alloc_cq_entry,
 				 free_cq_entry, cq_priv->entry_size,
 				 cq_priv->attr.size);
 	if (ret)
-		goto err4;
+		goto free_cq_priv;
 
 	ret = _gnix_queue_create(&cq_priv->errors, alloc_cq_entry,
 				 free_cq_entry, sizeof(struct fi_cq_err_entry),
 				 0);
 	if (ret)
-		goto err5;
+		goto free_gnix_queue;
 
 	*cq = &cq_priv->cq_fid;
 	return ret;
 
-err5:
+free_gnix_queue:
 	_gnix_queue_destroy(cq_priv->events);
-err4:
+free_cq_priv:
 	_gnix_ref_put(cq_priv->domain);
 	fastlock_destroy(&cq_priv->lock);
-err3:
 	free(cq_priv);
-err2:
+free_fi_cq_ops:
 	free(fi_cq_ops);
-err1:
+free_cq_ops:
 	free(cq_ops);
-err:
+
 	return ret;
 }
 
diff --git a/prov/gni/src/gnix_datagram.c b/prov/gni/src/gnix_datagram.c
index d414918..6687817 100644
--- a/prov/gni/src/gnix_datagram.c
+++ b/prov/gni/src/gnix_datagram.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
@@ -366,11 +366,11 @@ int _gnix_dgram_bnd_post(struct gnix_datagram *d)
 	if (post) {
 		/*
 		 * if we get GNI_RC_ERROR_RESOURCE status return from
-		 * GNI_EpPostDataWId  that means that a previously posted
+		 * GNI_EpPostDataWId  that means that either a previously posted
 		 * wildcard datagram has matched up with an incoming
-		 * connect request from the rank we are trying to send
-		 * a connect request to.  Don't treat this case as an
-		 * error.
+		 * bound datagram or we have a previously posted bound
+		 * datagram whose transfer to the target node has
+		 * not yet completed.  Don't treat this case as an error.
 		 */
 		status = GNI_EpPostDataWId(d->gni_ep,
 					   d->dgram_in_buf,
@@ -420,6 +420,7 @@ int  _gnix_dgram_poll(struct gnix_dgram_hndl *hndl,
 	gni_return_t status;
 	gni_post_state_t post_state = GNI_POST_PENDING;
 	uint32_t responding_remote_id;
+	uint32_t timeout = -1;
 	unsigned int responding_remote_addr;
 	struct gnix_datagram *dg_ptr;
 	uint64_t datagram_id = 0UL;
@@ -435,8 +436,12 @@ int  _gnix_dgram_poll(struct gnix_dgram_hndl *hndl,
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
 	if (type == GNIX_DGRAM_BLOCK) {
+		if (hndl->timeout_needed &&
+			(hndl->timeout_needed(hndl->timeout_data) == true))
+				timeout = hndl->timeout;
+
 		status = GNI_PostdataProbeWaitById(nic->gni_nic_hndl,
-						   -1,
+						   timeout,
 						   &datagram_id);
 		if ((status != GNI_RC_SUCCESS) &&
 			(status  != GNI_RC_TIMEOUT)) {
@@ -459,8 +464,8 @@ int  _gnix_dgram_poll(struct gnix_dgram_hndl *hndl,
 		}
 	}
 
-	if (status == GNI_RC_SUCCESS) {
-
+	switch (status) {
+	case GNI_RC_SUCCESS:
 		dg_ptr = (struct gnix_datagram *)datagram_id;
 		assert(dg_ptr != NULL);
 
@@ -537,21 +542,34 @@ int  _gnix_dgram_poll(struct gnix_dgram_hndl *hndl,
 				   post_state);
 			break;
 		}
+		break;
+	case GNI_RC_TIMEOUT:
+		/* call progress function */
+		if (hndl->timeout_progress)
+			hndl->timeout_progress(hndl->timeout_data);
+		break;
+	case GNI_RC_NO_MATCH:
+		break;
+	default:
+		/* an error */
+		break;
 	}
 
 err:
 	return ret;
 }
 
-int _gnix_dgram_hndl_alloc(const struct gnix_fid_fabric *fabric,
-				struct gnix_cm_nic *cm_nic,
-				enum fi_progress progress,
-				struct gnix_dgram_hndl **hndl_ptr)
+int _gnix_dgram_hndl_alloc(struct gnix_cm_nic *cm_nic,
+			   enum fi_progress progress,
+			   const struct gnix_dgram_hndl_attr *attr,
+			   struct gnix_dgram_hndl **hndl_ptr)
 {
 	int i, ret = FI_SUCCESS;
 	int n_dgrams_tot;
 	struct gnix_datagram *dgram_base = NULL, *dg_ptr;
 	struct gnix_dgram_hndl *the_hndl = NULL;
+	struct gnix_fid_domain *dom = cm_nic->domain;
+	struct gnix_fid_fabric *fabric = NULL;
 	struct gnix_nic *nic;
 	gni_return_t status;
 	uint32_t num_corespec_cpus = 0;
@@ -560,6 +578,11 @@ int _gnix_dgram_hndl_alloc(const struct gnix_fid_fabric *fabric,
 
 	nic = cm_nic->nic;
 
+	if (dom == NULL)
+		return -FI_EINVAL;
+
+	fabric = dom->fabric;
+
 	the_hndl = calloc(1, sizeof(struct gnix_dgram_hndl));
 	if (the_hndl == NULL) {
 		ret = -FI_ENOMEM;
@@ -574,6 +597,8 @@ int _gnix_dgram_hndl_alloc(const struct gnix_fid_fabric *fabric,
 	dlist_init(&the_hndl->wc_dgram_free_list);
 	dlist_init(&the_hndl->wc_dgram_active_list);
 
+	the_hndl->timeout = -1;
+
 	/*
 	 * inherit some stuff from the fabric object being
 	 * used to open the domain which will use this cm nic.
@@ -644,6 +669,13 @@ int _gnix_dgram_hndl_alloc(const struct gnix_fid_fabric *fabric,
 
 	if (progress == FI_PROGRESS_AUTO) {
 
+		if (attr != NULL) {
+			the_hndl->timeout_needed = attr->timeout_needed;
+			the_hndl->timeout_progress = attr->timeout_progress;
+			the_hndl->timeout_data = attr->timeout_data;
+			the_hndl->timeout = attr->timeout;
+		}
+
 		/*
 		 * tell CLE job container that next thread should be
 		 * runnable anywhere in the cpuset, don't treat as
diff --git a/prov/gni/src/gnix_dom.c b/prov/gni/src/gnix_dom.c
index 4bc6840..bfbd8cb 100644
--- a/prov/gni/src/gnix_dom.c
+++ b/prov/gni/src/gnix_dom.c
@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -43,6 +43,11 @@
 #include "gnix_nic.h"
 #include "gnix_util.h"
 #include "gnix_xpmem.h"
+#include "gnix_hashtable.h"
+#include "gnix_auth_key.h"
+
+#define GNIX_MR_MODE_DEFAULT FI_MR_BASIC
+#define GNIX_NUM_PTAGS 256
 
 gni_cq_mode_t gnix_def_gni_cq_modes = GNI_CQ_PHYS_PAGES;
 
@@ -64,23 +69,30 @@ static struct fi_ops_domain gnix_domain_ops;
 static void __domain_destruct(void *obj)
 {
 	int ret = FI_SUCCESS;
-	struct gnix_nic *p, *next;
 	struct gnix_fid_domain *domain = (struct gnix_fid_domain *) obj;
+	struct gnix_mr_cache_info *info;
+	int i;
 
 	GNIX_TRACE(FI_LOG_DOMAIN, "\n");
 
-	ret = _gnix_close_cache(domain);
-	if (ret != FI_SUCCESS)
-		GNIX_FATAL(FI_LOG_MR, "failed to close memory registration cache\n");
-	/*
-	 * Drop a reference to each NIC used by this domain.
-	 */
+	for (i = 0; i < GNIX_NUM_PTAGS; i++) {
+		info = &domain->mr_cache_info[i];
+
+		fastlock_acquire(&info->mr_cache_lock);
+		ret = _gnix_close_cache(domain, info);
+		fastlock_release(&info->mr_cache_lock);
 
-	dlist_for_each_safe(&domain->nic_list, p, next, dom_nic_list) {
-		dlist_remove(&p->dom_nic_list);
-		_gnix_ref_put(p);
+		if (ret != FI_SUCCESS)
+			GNIX_FATAL(FI_LOG_MR,
+					"failed to close memory "
+					"registration cache\n");
 	}
 
+	/* TODO: known issue of multiple consumers of notifier notifications */
+	ret = _gnix_notifier_close(domain->mr_cache_attr.notifier);
+	if (ret != FI_SUCCESS)
+		GNIX_FATAL(FI_LOG_MR, "failed to close MR notifier\n");
+
 	/*
 	 * remove from the list of cdms attached to fabric
 	 */
@@ -95,10 +107,19 @@ static void __domain_destruct(void *obj)
 
 static void __stx_destruct(void *obj)
 {
+	int ret;
 	struct gnix_fid_stx *stx = (struct gnix_fid_stx *) obj;
 
 	GNIX_TRACE(FI_LOG_DOMAIN, "\n");
 
+	if (stx->nic) {
+		ret = _gnix_nic_free(stx->nic);
+		if (ret != FI_SUCCESS)
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				    "_gnix_nic_free call returned %s\n",
+			     fi_strerror(-ret));
+	}
+
 	memset(stx, 0, sizeof(*stx));
 	free(stx);
 }
@@ -109,7 +130,6 @@ static void __stx_destruct(void *obj)
 
 /**
  * Creates a shared transmit context.
- * @note This is basically a no-op for the GNI provider.
  *
  * @param[in]  val  value to be sign extended
  * @param[in]  len  length to sign extend the value
@@ -140,6 +160,9 @@ DIRECT_FN STATIC int gnix_stx_open(struct fid_domain *dom,
 	}
 
 	stx_priv->domain = domain;
+	stx_priv->auth_key = NULL;
+	stx_priv->nic = NULL;
+
 	_gnix_ref_init(&stx_priv->ref_cnt, 1, __stx_destruct);
 
 	_gnix_ref_get(stx_priv->domain);
@@ -148,6 +171,7 @@ DIRECT_FN STATIC int gnix_stx_open(struct fid_domain *dom,
 	stx_priv->stx_fid.fid.context = context;
 	stx_priv->stx_fid.fid.ops = &gnix_stx_ops;
 	stx_priv->stx_fid.ops = NULL;
+	domain->num_allocd_stxs++;
 
 	*stx = &stx_priv->stx_fid;
 
@@ -187,6 +211,8 @@ static int gnix_domain_close(fid_t fid)
 {
 	int ret = FI_SUCCESS, references_held;
 	struct gnix_fid_domain *domain;
+	int i;
+	struct gnix_mr_cache_info *info;
 
 	GNIX_TRACE(FI_LOG_DOMAIN, "\n");
 
@@ -196,17 +222,38 @@ static int gnix_domain_close(fid_t fid)
 		goto err;
 	}
 
-	/* before checking the refcnt, flush the memory registration cache */
-	if (domain->mr_cache) {
-		fastlock_acquire(&domain->mr_cache_lock);
-		ret = _gnix_mr_cache_flush(domain->mr_cache);
-		if (ret != FI_SUCCESS) {
-			GNIX_WARN(FI_LOG_DOMAIN,
-				  "failed to flush memory cache on domain close\n");
-			fastlock_release(&domain->mr_cache_lock);
-			goto err;
+	for (i = 0; i < GNIX_NUM_PTAGS; i++) {
+		info = &domain->mr_cache_info[i];
+
+		if (!domain->mr_cache_info[i].inuse)
+			continue;
+
+		/* before checking the refcnt,
+		 * flush the memory registration cache
+		 */
+		if (info->mr_cache_ro) {
+			fastlock_acquire(&info->mr_cache_lock);
+			ret = _gnix_mr_cache_flush(info->mr_cache_ro);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_DOMAIN,
+					  "failed to flush memory cache on domain close\n");
+				fastlock_release(&info->mr_cache_lock);
+				goto err;
+			}
+			fastlock_release(&info->mr_cache_lock);
+		}
+
+		if (info->mr_cache_rw) {
+			fastlock_acquire(&info->mr_cache_lock);
+			ret = _gnix_mr_cache_flush(info->mr_cache_rw);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_DOMAIN,
+					  "failed to flush memory cache on domain close\n");
+				fastlock_release(&info->mr_cache_lock);
+				goto err;
+			}
+			fastlock_release(&info->mr_cache_lock);
 		}
-		fastlock_release(&domain->mr_cache_lock);
 	}
 
 	/*
@@ -250,6 +297,8 @@ static const uint32_t default_rx_cq_size = 16384;
 static const uint32_t default_tx_cq_size = 2048;
 static const uint32_t default_max_retransmits = 5;
 static const int32_t default_err_inject_count; /* static var is zeroed */
+static const uint32_t default_dgram_progress_timeout = 100;
+static const uint32_t default_eager_auto_progress = 0;
 
 static int __gnix_string_to_mr_type(const char *name)
 {
@@ -361,6 +410,12 @@ __gnix_dom_ops_get_val(struct fid *fid, dom_ops_val_t t, void *val)
 			  "GNI provider XPMEM support not configured\n");
 #endif
 		break;
+	case GNI_DGRAM_PROGRESS_TIMEOUT:
+		*(uint32_t *)val = domain->params.dgram_progress_timeout;
+		break;
+	case GNI_EAGER_AUTO_PROGRESS:
+		*(uint32_t *)val = domain->params.eager_auto_progress;
+		break;
 	default:
 		GNIX_WARN(FI_LOG_DOMAIN, ("Invalid dom_ops_val\n"));
 		return -FI_EINVAL;
@@ -372,8 +427,6 @@ __gnix_dom_ops_get_val(struct fid *fid, dom_ops_val_t t, void *val)
 static int
 __gnix_dom_ops_set_val(struct fid *fid, dom_ops_val_t t, void *val)
 {
-	gni_return_t grc = GNI_RC_SUCCESS;
-	struct gnix_nic *nic;
 	struct gnix_fid_domain *domain;
 	int ret, type;
 
@@ -426,21 +479,6 @@ __gnix_dom_ops_set_val(struct fid *fid, dom_ops_val_t t, void *val)
 		break;
 	case GNI_MAX_RETRANSMITS:
 		domain->params.max_retransmits = *(uint32_t *)val;
-		dlist_for_each(&domain->nic_list, nic, dom_nic_list)
-		{
-			COND_ACQUIRE(nic->requires_lock, &nic->lock);
-			grc = GNI_SmsgSetMaxRetrans(nic->gni_nic_hndl,
-						    *(uint16_t *)val);
-			fastlock_release(&nic->lock);
-			if (grc != GNI_RC_SUCCESS)
-				break;
-		}
-
-		if (unlikely(grc != GNI_RC_SUCCESS)) {
-			GNIX_WARN(FI_LOG_DOMAIN, "failed to set smsg max "
-				  "retrans, ret=%s\n", gni_err_str[grc]);
-			return gnixu_to_fi_errno(grc);
-		}
 		break;
 	case GNI_ERR_INJECT_COUNT:
 		domain->params.err_inject_count = *(int32_t *)val;
@@ -487,6 +525,12 @@ __gnix_dom_ops_set_val(struct fid *fid, dom_ops_val_t t, void *val)
 			  "GNI provider XPMEM support not configured\n");
 #endif
 		break;
+	case GNI_DGRAM_PROGRESS_TIMEOUT:
+		domain->params.dgram_progress_timeout = *(uint32_t *)val;
+		break;
+	case GNI_EAGER_AUTO_PROGRESS:
+		domain->params.eager_auto_progress = *(uint32_t *)val;
+		break;
 	default:
 		GNIX_WARN(FI_LOG_DOMAIN, ("Invalid dom_ops_val\n"));
 		return -FI_EINVAL;
@@ -495,7 +539,6 @@ __gnix_dom_ops_set_val(struct fid *fid, dom_ops_val_t t, void *val)
 	return FI_SUCCESS;
 }
 
-
 static struct fi_gni_ops_domain gnix_ops_domain = {
 	.set_val = __gnix_dom_ops_set_val,
 	.get_val = __gnix_dom_ops_get_val,
@@ -527,42 +570,26 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 {
 	struct gnix_fid_domain *domain = NULL;
 	int ret = FI_SUCCESS;
-	uint8_t ptag;
-	uint32_t cookie;
 	struct gnix_fid_fabric *fabric_priv;
+	struct gnix_auth_key *auth_key = NULL;
+	int i;
 
 	GNIX_TRACE(FI_LOG_DOMAIN, "\n");
 
 	fabric_priv = container_of(fabric, struct gnix_fid_fabric, fab_fid);
-	if (!info->domain_attr->name ||
-	    strncmp(info->domain_attr->name, gnix_dom_name,
-		    strlen(gnix_dom_name))) {
-		ret = -FI_EINVAL;
-		goto err;
-	}
 
-	/*
-	 * check cookie/ptag credentials - for FI_EP_MSG we may be creating a
-	 * domain
-	 * using a cookie supplied being used by the server.  Otherwise, we use
-	 * use the cookie/ptag supplied by the job launch system.
-	 */
-	if (info->dest_addr) {
-		ret =
-		    gnixu_get_rdma_credentials(info->dest_addr, &ptag, &cookie);
-		if (ret) {
-			GNIX_WARN(FI_LOG_DOMAIN,
-				   "gnixu_get_rdma_credentials returned ptag %u cookie 0x%x\n",
-				   ptag, cookie);
-			goto err;
-		}
-	} else {
-		ret = gnixu_get_rdma_credentials(NULL, &ptag, &cookie);
-	}
+	if (FI_VERSION_LT(fabric->api_version, FI_VERSION(1, 5)) &&
+		(info->domain_attr->auth_key_size || info->domain_attr->auth_key))
+			return -FI_EINVAL;
+
+	auth_key = GNIX_GET_AUTH_KEY(info->domain_attr->auth_key,
+			info->domain_attr->auth_key_size);
+	if (!auth_key)
+		return -FI_EINVAL;
 
 	GNIX_INFO(FI_LOG_DOMAIN,
-		  "gnix rdma credentials returned ptag %u cookie 0x%x\n",
-		  ptag, cookie);
+		  "authorization key=%p ptag %u cookie 0x%x\n",
+		  auth_key, auth_key->ptag, auth_key->cookie);
 
 	domain = calloc(1, sizeof *domain);
 	if (domain == NULL) {
@@ -570,13 +597,30 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 		goto err;
 	}
 
+	domain->mr_cache_info = calloc(sizeof(*domain->mr_cache_info),
+		GNIX_NUM_PTAGS);
+	if (!domain->mr_cache_info) {
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	domain->auth_key = auth_key;
+
 	domain->mr_cache_attr = _gnix_default_mr_cache_attr;
 	domain->mr_cache_attr.reg_context = (void *) domain;
 	domain->mr_cache_attr.dereg_context = NULL;
 	domain->mr_cache_attr.destruct_context = NULL;
-	domain->mr_cache_attr.notifier = &fabric_priv->mr_notifier;
-	domain->mr_cache = NULL;
+
+	ret = _gnix_notifier_open(&domain->mr_cache_attr.notifier);
+	if (ret != FI_SUCCESS)
+		goto err;
+
 	fastlock_init(&domain->mr_cache_lock);
+	for (i = 0; i < GNIX_NUM_PTAGS; i++) {
+		domain->mr_cache_info[i].inuse = 0;
+		domain->mr_cache_info[i].domain = domain;
+		fastlock_init(&domain->mr_cache_info[i].mr_cache_lock);
+	}
 
 	domain->udreg_reg_limit = 4096;
 
@@ -588,9 +632,8 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	domain->fabric = fabric_priv;
 	_gnix_ref_get(domain->fabric);
 
-	domain->ptag = ptag;
-	domain->cookie = cookie;
 	domain->cdm_id_seed = getpid();  /* TODO: direct syscall better */
+	domain->addr_format = info->addr_format;
 
 	/* user tunables */
 	domain->params.msg_rendezvous_thresh = default_msg_rendezvous_thresh;
@@ -603,6 +646,8 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	domain->params.mbox_num_per_slab = default_mbox_num_per_slab;
 	domain->params.mbox_maxcredit = default_mbox_maxcredit;
 	domain->params.mbox_msg_maxsize = default_mbox_msg_maxsize;
+	domain->params.rx_cq_size = default_rx_cq_size;
+	domain->params.tx_cq_size = default_tx_cq_size;
 	domain->params.max_retransmits = default_max_retransmits;
 	domain->params.err_inject_count = default_err_inject_count;
 #if HAVE_XPMEM
@@ -610,9 +655,9 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 #else
 	domain->params.xpmem_enabled = false;
 #endif
+	domain->params.dgram_progress_timeout = default_dgram_progress_timeout;
+	domain->params.eager_auto_progress = default_eager_auto_progress;
 
-	domain->gni_tx_cq_size = default_tx_cq_size;
-	domain->gni_rx_cq_size = default_rx_cq_size;
 	domain->gni_cq_modes = gnix_def_gni_cq_modes;
 	_gnix_ref_init(&domain->ref_cnt, 1, __domain_destruct);
 
@@ -626,6 +671,7 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	domain->data_progress = info->domain_attr->data_progress;
 	domain->thread_model = info->domain_attr->threading;
 	domain->mr_is_init = 0;
+	domain->mr_iov_limit = info->domain_attr->mr_iov_limit;
 
 	fastlock_init(&domain->cm_nic_lock);
 
@@ -635,6 +681,9 @@ DIRECT_FN int gnix_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	return FI_SUCCESS;
 
 err:
+	if (domain && domain->mr_cache_info)
+		free(domain->mr_cache_info);
+
 	if (domain != NULL) {
 		free(domain);
 	}
@@ -648,18 +697,6 @@ DIRECT_FN int gnix_srx_context(struct fid_domain *domain,
 	return -FI_ENOSYS;
 }
 
-DIRECT_FN int gnix_scalable_ep_open(struct fid_domain *domain,
-				    struct fi_info *info,
-				    struct fid_ep **sep, void *context)
-{
-	return -FI_ENOSYS;
-}
-
-DIRECT_FN int gnix_scalable_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
-{
-	return -FI_ENOSYS;
-}
-
 /*******************************************************************************
  * FI_OPS_* data structures.
  ******************************************************************************/
@@ -682,8 +719,8 @@ static struct fi_ops gnix_domain_fi_ops = {
 static struct fi_ops_mr gnix_domain_mr_ops = {
 	.size = sizeof(struct fi_ops_mr),
 	.reg = gnix_mr_reg,
-	.regv = fi_no_mr_regv,
-	.regattr = fi_no_mr_regattr
+	.regv = gnix_mr_regv,
+	.regattr = gnix_mr_regattr,
 };
 
 static struct fi_ops_domain gnix_domain_ops = {
@@ -691,7 +728,7 @@ static struct fi_ops_domain gnix_domain_ops = {
 	.av_open = gnix_av_open,
 	.cq_open = gnix_cq_open,
 	.endpoint = gnix_ep_open,
-	.scalable_ep = fi_no_scalable_ep,
+	.scalable_ep = gnix_sep_open,
 	.cntr_open = gnix_cntr_open,
 	.poll_open = fi_no_poll_open,
 	.stx_ctx = gnix_stx_open,
diff --git a/prov/gni/src/gnix_ep.c b/prov/gni/src/gnix_ep.c
index e43c730..963a5f5 100644
--- a/prov/gni/src/gnix_ep.c
+++ b/prov/gni/src/gnix_ep.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -52,7 +52,9 @@
 #include "gnix_atomic.h"
 #include "gnix_cntr.h"
 #include "gnix_xpmem.h"
-
+#include "gnix_eq.h"
+#include "gnix_cm.h"
+#include "gnix_auth_key.h"
 
 /*******************************************************************************
  * gnix_fab_req freelist functions
@@ -64,79 +66,146 @@
 #define GNIX_FAB_REQ_FL_MIN_SIZE 100
 #define GNIX_FAB_REQ_FL_REFILL_SIZE 10
 
-void _gnix_ep_htd_pool_init(struct gnix_fid_ep *ep)
+int _gnix_ep_int_tx_pool_grow(struct gnix_fid_ep *ep)
 {
 	int ret, i;
+	uint8_t *tx_bufs;
 	struct fid_mr *auto_mr = NULL;
-	uint8_t *htd_bufs;
-	struct gnix_htd_buf *htd_buf_list;
+	struct gnix_fid_mem_desc *md = NULL;
+	struct gnix_int_tx_buf *tx_buf_list;
+	struct gnix_int_tx_ptrs *tx_ptrs;
 
 	assert(ep);
 
-	htd_bufs = malloc(GNIX_HTD_POOL_SIZE * GNIX_HTD_BUF_SZ);
-	if (htd_bufs == NULL) {
-		GNIX_FATAL(FI_LOG_EP_DATA, "\n");
+	if (ep->int_tx_pool.nbufs >= GNIX_INT_TX_POOL_COUNT) {
+		GNIX_WARN(FI_LOG_EP_DATA, "int_tx_pool is at max size\n");
+		return -FI_ENOSPC;
+	}
+
+	tx_bufs = malloc(GNIX_INT_TX_POOL_SIZE * GNIX_INT_TX_BUF_SZ);
+	if (tx_bufs == NULL) {
+		GNIX_WARN(FI_LOG_EP_DATA, "tx_bufs allocation failed\n");
+		goto tx_buf_err;
 	}
 
-	htd_buf_list = malloc(GNIX_HTD_POOL_SIZE * sizeof(struct gnix_htd_buf));
-	if (htd_buf_list == NULL) {
-		GNIX_FATAL(FI_LOG_EP_DATA, "\n");
+	tx_buf_list = malloc(GNIX_INT_TX_POOL_SIZE *
+				 sizeof(struct gnix_int_tx_buf));
+	if (tx_buf_list == NULL) {
+		GNIX_WARN(FI_LOG_EP_DATA, "tx_bufs_list allocation failed\n");
+		goto tx_buf_list_err;
 	}
 
-	ep->htd_pool.buf_ptr = (void *) htd_bufs;
-	ep->htd_pool.sl_ptr = (void *) htd_buf_list;
+	tx_ptrs = malloc(sizeof(struct gnix_int_tx_ptrs));
+	if (tx_buf_list == NULL) {
+		GNIX_WARN(FI_LOG_EP_DATA, "tx_ptrs allocation failed\n");
+		goto tx_ptrs_err;
+	}
 
-	ret = gnix_mr_reg(&ep->domain->domain_fid.fid, htd_bufs,
-	      		  GNIX_HTD_BUF_SZ * GNIX_HTD_POOL_SIZE,
-			  FI_READ | FI_WRITE, 0, 0, 0, &auto_mr, NULL);
+	ret = gnix_mr_reg(&ep->domain->domain_fid.fid, tx_bufs,
+			GNIX_INT_TX_BUF_SZ * GNIX_INT_TX_POOL_SIZE,
+			FI_READ | FI_WRITE, 0, 0, 0, &auto_mr, NULL);
 
 	if (unlikely(ret != FI_SUCCESS)) {
-		GNIX_DEBUG(FI_LOG_EP_DATA, "gnix_mr_req returned: %s\n",
+		GNIX_WARN(FI_LOG_EP_DATA, "gnix_mr_req returned: %s\n",
 			   fi_strerror(-ret));
-	} else {
-		ep->htd_pool.md = container_of(auto_mr, struct gnix_fid_mem_desc, mr_fid);
+		goto reg_err;
 	}
 
-	slist_init(&ep->htd_pool.sl);
+	md = container_of(auto_mr, struct gnix_fid_mem_desc, mr_fid);
+
+	fastlock_acquire(&ep->int_tx_pool.lock);
 
-	for (i = 0; i < GNIX_HTD_POOL_SIZE; i++) {
-		GNIX_DEBUG(FI_LOG_EP_DATA, "htd_bufs + (%d * GNIX_HTD_BUF_SZ) = %p\n",
-			   i, htd_bufs + (i * GNIX_HTD_BUF_SZ));
-		htd_buf_list[i].buf = htd_bufs + (i * GNIX_HTD_BUF_SZ);
-		slist_insert_tail(&htd_buf_list[i].e, &ep->htd_pool.sl);
+	for (i = 0; i < GNIX_INT_TX_POOL_SIZE; i++) {
+		GNIX_DEBUG(FI_LOG_EP_DATA,
+			"tx_bufs + (%d * GNIX_INT_TX_BUF_SZ) = %p\n",
+			i, tx_bufs + (i * GNIX_INT_TX_BUF_SZ));
+		tx_buf_list[i].buf = tx_bufs + (i * GNIX_INT_TX_BUF_SZ);
+		tx_buf_list[i].md = md;
+		slist_insert_tail(&tx_buf_list[i].e, &ep->int_tx_pool.sl);
 	}
 
-	fastlock_init(&ep->htd_pool.lock);
+	tx_ptrs->md = md;
+	tx_ptrs->buf_ptr = (void *) tx_bufs;
+	tx_ptrs->sl_ptr = (void *) tx_buf_list;
+	slist_insert_tail(&tx_ptrs->e, &ep->int_tx_pool.bl);
+
+	ep->int_tx_pool.nbufs++;
+
+	fastlock_release(&ep->int_tx_pool.lock);
+
+	return FI_SUCCESS;
+
+reg_err:
+	free(tx_ptrs);
+tx_ptrs_err:
+	free(tx_buf_list);
+tx_buf_list_err:
+	free(tx_bufs);
+tx_buf_err:
+	return -FI_ENOSPC;
+}
+
+int _gnix_ep_int_tx_pool_init(struct gnix_fid_ep *ep)
+{
+	int ret;
+
+	assert(ep);
+
+	ep->int_tx_pool.nbufs = 0;
+	slist_init(&ep->int_tx_pool.sl);
+	slist_init(&ep->int_tx_pool.bl);
+	fastlock_init(&ep->int_tx_pool.lock);
+
+	ret = _gnix_ep_int_tx_pool_grow(ep);
+	if (ret != FI_SUCCESS)
+		return ret;
+
+	ep->int_tx_pool.enabled = true;
 
-	ep->htd_pool.enabled = true;
+	return FI_SUCCESS;
 }
 
-void _gnix_ep_htd_pool_fini(struct gnix_fid_ep *ep)
+void _gnix_ep_int_tx_pool_fini(struct gnix_fid_ep *ep)
 {
 	int ret;
+	struct slist_entry *e;
+	struct gnix_int_tx_ptrs *tx_ptrs;
 
 	assert(ep);
 
-	if (ep->htd_pool.enabled == false)
+	if (ep->int_tx_pool.enabled == false)
 		return;
 
-	ret = fi_close(&ep->htd_pool.md->mr_fid.fid);
+	fastlock_acquire(&ep->int_tx_pool.lock);
 
-	if (ret != FI_SUCCESS) {
-		GNIX_DEBUG(FI_LOG_EP_DATA, "fi_close returned: %s\n", fi_strerror(-ret));
-	}
+	while (!slist_empty(&ep->int_tx_pool.bl)) {
+		e = slist_remove_head(&ep->int_tx_pool.bl);
+		tx_ptrs = (struct gnix_int_tx_ptrs *)e;
 
-	if (ep->htd_pool.buf_ptr != NULL) {
-		free(ep->htd_pool.buf_ptr);
-		ep->htd_pool.buf_ptr = NULL;
-	}
+		ret = fi_close(&tx_ptrs->md->mr_fid.fid);
+
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_DATA, "fi_close returned: %s\n",
+				   fi_strerror(-ret));
+		}
+
+		if (tx_ptrs->buf_ptr != NULL) {
+			free(tx_ptrs->buf_ptr);
+			tx_ptrs->buf_ptr = NULL;
+		}
 
-	if (ep->htd_pool.sl_ptr != NULL) {
-		free(ep->htd_pool.sl_ptr);
-		ep->htd_pool.sl_ptr = NULL;
+		if (tx_ptrs->sl_ptr != NULL) {
+			free(tx_ptrs->sl_ptr);
+			tx_ptrs->sl_ptr = NULL;
+		}
+
+		free(tx_ptrs);
+		ep->int_tx_pool.nbufs--;
 	}
 
-	ep->htd_pool.enabled = false;
+	ep->int_tx_pool.enabled = false;
+
+	fastlock_release(&ep->int_tx_pool.lock);
 }
 
 static int __fr_freelist_init(struct gnix_fid_ep *ep)
@@ -166,8 +235,83 @@ static void __fr_freelist_destroy(struct gnix_fid_ep *ep)
 	_gnix_fl_destroy(&ep->fr_freelist);
 }
 
+int _gnix_ep_enable(struct gnix_fid_ep *ep)
+{
+	/*
+	 * set enable flags and add nic to poll lists
+	 */
+
+	if (ep->send_cq) {
+		_gnix_cq_poll_obj_add(ep->send_cq, ep->nic,
+				      _gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cq_poll_obj_add(ep->send_cq, ep->cm_nic,
+					      _gnix_cm_nic_progress);
+		ep->tx_enabled = true;
+	}
+
+	if (ep->recv_cq) {
+		_gnix_cq_poll_obj_add(ep->recv_cq, ep->nic,
+				      _gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cq_poll_obj_add(ep->recv_cq, ep->cm_nic,
+					      _gnix_cm_nic_progress);
+		ep->rx_enabled = true;
+	}
+
+	if (ep->send_cntr) {
+		_gnix_cntr_poll_obj_add(ep->send_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_add(ep->send_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
+	}
+
+	if (ep->recv_cntr) {
+		_gnix_cntr_poll_obj_add(ep->recv_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_add(ep->recv_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
+	}
+
+	if (ep->write_cntr) {
+		_gnix_cntr_poll_obj_add(ep->write_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_add(ep->write_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
+	}
+
+	if (ep->read_cntr) {
+		_gnix_cntr_poll_obj_add(ep->read_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_add(ep->read_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
+	}
+
+	if (ep->rwrite_cntr) {
+		_gnix_cntr_poll_obj_add(ep->rwrite_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_add(ep->rwrite_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
+	}
+
+	if (ep->rread_cntr) {
+		_gnix_cntr_poll_obj_add(ep->rread_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_add(ep->rread_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
+	}
+
+	return FI_SUCCESS;
+}
+
 /*******************************************************************************
- * Forward declaration for ops structures.
+ * Forward declaration for ops structures
  ******************************************************************************/
 
 static struct fi_ops gnix_ep_fi_ops;
@@ -180,10 +324,9 @@ struct fi_ops_atomic gnix_ep_atomic_ops;
 /*******************************************************************************
  * EP common messaging wrappers.
  ******************************************************************************/
-
-static inline ssize_t __ep_recv(struct fid_ep *ep, void *buf, size_t len,
-				void *desc, fi_addr_t src_addr, void *context,
-				uint64_t flags, uint64_t tag, uint64_t ignore)
+ssize_t _ep_recv(struct fid_ep *ep, void *buf, size_t len,
+		 void *desc, fi_addr_t src_addr, void *context,
+		 uint64_t flags, uint64_t tag, uint64_t ignore)
 {
 	struct gnix_fid_ep *ep_priv;
 
@@ -194,14 +337,33 @@ static inline ssize_t __ep_recv(struct fid_ep *ep, void *buf, size_t len,
 	ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid);
 	assert(GNIX_EP_RDM_DGM_MSG(ep_priv->type));
 
-	return _gnix_recv(ep_priv, (uint64_t)buf, len, desc, src_addr, context,
-			  ep_priv->op_flags | flags, tag, ignore);
-}
-
-static inline ssize_t __ep_recvv(struct fid_ep *ep, const struct iovec *iov,
-				 void **desc, size_t count, fi_addr_t src_addr,
-				 void *context, uint64_t flags, uint64_t tag,
-				 uint64_t ignore)
+	if (!(ep_priv->op_flags & FI_MULTI_RECV)) {
+		return _gnix_recv(ep_priv,
+				  (uint64_t)buf,
+				  len, desc,
+				  src_addr,
+				  context,
+				  ep_priv->op_flags | flags,
+				  tag,
+				  ignore,
+				  NULL);
+	 } else {
+		return _gnix_recv_mr(ep_priv,
+				     (uint64_t)buf,
+				     len,
+				     desc,
+				     src_addr,
+				     context,
+				     ep_priv->op_flags | flags,
+				     tag,
+				     ignore);
+	}
+}
+
+ssize_t _ep_recvv(struct fid_ep *ep, const struct iovec *iov,
+		  void **desc, size_t count, fi_addr_t src_addr,
+		  void *context, uint64_t flags, uint64_t tag,
+		  uint64_t ignore)
 {
 	struct gnix_fid_ep *ep_priv;
 
@@ -213,21 +375,43 @@ static inline ssize_t __ep_recvv(struct fid_ep *ep, const struct iovec *iov,
 	assert(GNIX_EP_RDM_DGM_MSG(ep_priv->type));
 
 	if (count <= 1) {
-		return _gnix_recv(ep_priv, (uint64_t)iov[0].iov_base,
-				  iov[0].iov_len, desc ? desc[0] : NULL,
-				  src_addr, context,
-				  ep_priv->op_flags | flags, tag, ignore);
+		if (!(ep_priv->op_flags & FI_MULTI_RECV)) {
+			return _gnix_recv(ep_priv,
+					  (uint64_t)iov[0].iov_base,
+					  iov[0].iov_len,
+					  desc ? desc[0] : NULL,
+					  src_addr,
+					  context,
+					  ep_priv->op_flags | flags,
+					  tag,
+					  ignore,
+					  NULL);
+		} else {
+			return _gnix_recv_mr(ep_priv,
+					  (uint64_t)iov[0].iov_base,
+					  iov[0].iov_len,
+					  desc ? desc[0] : NULL,
+					  src_addr,
+					  context,
+					  ep_priv->op_flags | flags,
+					  tag,
+					  ignore);
+		}
 	}
 
 	return _gnix_recvv(ep_priv, iov, desc, count, src_addr,
 			   context, ep_priv->op_flags | flags, ignore, tag);
 }
 
-static inline ssize_t __ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
-				   uint64_t flags, uint64_t tag,
-				   uint64_t ignore)
+ssize_t _ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
+		    uint64_t flags, uint64_t tag,
+		    uint64_t ignore)
 {
 	struct iovec iov;
+	struct gnix_fid_ep *ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid);
+
+	ep_priv = container_of(ep, struct gnix_fid_ep, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(ep_priv->type));
 
 	iov.iov_base = NULL;
 	iov.iov_len = 0;
@@ -236,15 +420,27 @@ static inline ssize_t __ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		return -FI_EINVAL;
 	}
 
+	if (flags & FI_MULTI_RECV) {
+		return _gnix_recv_mr(ep_priv,
+				     (uint64_t)msg->msg_iov[0].iov_base,
+				     msg->msg_iov[0].iov_len,
+				     msg->desc[0],
+				     msg->addr,
+				     msg->context,
+				     ep_priv->op_flags | flags,
+				     tag,
+				     ignore);
+	}
+
 	/* msg_iov can be undefined when using FI_PEEK, etc. */
-	return __ep_recvv(ep, msg->msg_iov ? msg->msg_iov : &iov, msg->desc,
-			  msg->iov_count, msg->addr, msg->context, flags, tag,
-			  ignore);
+	return _ep_recvv(ep, msg->msg_iov ? msg->msg_iov : &iov, msg->desc,
+			 msg->iov_count, msg->addr, msg->context, flags, tag,
+			 ignore);
 }
 
-static inline ssize_t __ep_send(struct fid_ep *ep, const void *buf, size_t len,
-				void *desc, fi_addr_t dest_addr, void *context,
-				uint64_t flags, uint64_t tag)
+ssize_t _ep_send(struct fid_ep *ep, const void *buf, size_t len,
+		 void *desc, fi_addr_t dest_addr, void *context,
+		 uint64_t flags, uint64_t tag)
 {
 	struct gnix_fid_ep *gnix_ep;
 
@@ -259,9 +455,9 @@ static inline ssize_t __ep_send(struct fid_ep *ep, const void *buf, size_t len,
 			  gnix_ep->op_flags | flags, 0, tag);
 }
 
-static inline ssize_t __ep_sendv(struct fid_ep *ep, const struct iovec *iov,
-				 void **desc, size_t count, fi_addr_t dest_addr,
-				 void *context, uint64_t flags, uint64_t tag)
+ssize_t _ep_sendv(struct fid_ep *ep, const struct iovec *iov,
+		  void **desc, size_t count, fi_addr_t dest_addr,
+		  void *context, uint64_t flags, uint64_t tag)
 {
 	struct gnix_fid_ep *gnix_ep;
 
@@ -283,8 +479,8 @@ static inline ssize_t __ep_sendv(struct fid_ep *ep, const struct iovec *iov,
 			   gnix_ep->op_flags | flags, tag);
 }
 
-static inline ssize_t __ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
-				   uint64_t flags, uint64_t tag)
+ssize_t _ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
+		     uint64_t flags, uint64_t tag)
 {
 	struct gnix_fid_ep *gnix_ep;
 
@@ -294,8 +490,8 @@ static inline ssize_t __ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 
 	/* Must check the iov count here, can't send msg->data to sendv */
 	if (msg->iov_count > 1) {
-		return __ep_sendv(ep, msg->msg_iov, msg->desc, msg->iov_count,
-				  msg->addr, msg->context, flags, tag);
+		return _ep_sendv(ep, msg->msg_iov, msg->desc, msg->iov_count,
+				 msg->addr, msg->context, flags, tag);
 	}
 
 	gnix_ep = container_of(ep, struct gnix_fid_ep, ep_fid);
@@ -307,9 +503,9 @@ static inline ssize_t __ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 			  msg->context, flags, msg->data, tag);
 }
 
-static inline ssize_t __ep_inject(struct fid_ep *ep, const void *buf,
-				  size_t len, uint64_t data, fi_addr_t dest_addr,
-				  uint64_t flags, uint64_t tag)
+ssize_t _ep_inject(struct fid_ep *ep, const void *buf,
+		   size_t len, uint64_t data, fi_addr_t dest_addr,
+		   uint64_t flags, uint64_t tag)
 {
 	struct gnix_fid_ep *gnix_ep;
 	uint64_t inject_flags;
@@ -328,10 +524,10 @@ static inline ssize_t __ep_inject(struct fid_ep *ep, const void *buf,
 			  NULL, inject_flags, data, tag);
 }
 
-static inline ssize_t __ep_senddata(struct fid_ep *ep, const void *buf,
-				    size_t len, void *desc, uint64_t data,
-				    fi_addr_t dest_addr, void *context,
-				    uint64_t flags, uint64_t tag)
+ssize_t _ep_senddata(struct fid_ep *ep, const void *buf,
+		     size_t len, void *desc, uint64_t data,
+		     fi_addr_t dest_addr, void *context,
+		     uint64_t flags, uint64_t tag)
 {
 	struct gnix_fid_ep *gnix_ep;
 	uint64_t sd_flags;
@@ -360,16 +556,18 @@ static void __gnix_vc_destroy_ht_entry(void *val)
  * EP vc initialization helper
  ******************************************************************************/
 
-static inline int __gnix_ep_init_vc(struct gnix_fid_ep *ep_priv)
+int _gnix_ep_init_vc(struct gnix_fid_ep *ep_priv)
 {
 	int ret;
-	enum fi_av_type type;
 	gnix_hashtable_attr_t gnix_ht_attr;
 	gnix_vec_attr_t gnix_vec_attr;
 
-	type = ep_priv->av->type;
+	if (ep_priv->av == NULL) {
+		GNIX_FATAL(FI_LOG_EP_CTRL,
+			   "_gnix_ep_init_vc av field NULL\n");
+	}
 
-	if (type == FI_AV_TABLE) {
+	if (ep_priv->av->type == FI_AV_TABLE) {
 		/* Use array to store EP VCs when using FI_AV_TABLE. */
 		ep_priv->vc_table = calloc(1, sizeof(struct gnix_vector));
 		if(ep_priv->vc_table == NULL)
@@ -387,7 +585,7 @@ static inline int __gnix_ep_init_vc(struct gnix_fid_ep *ep_priv)
 		GNIX_DEBUG(FI_LOG_EP_CTRL,
 			   "ep_priv->vc_table = %p, ep_priv->vc_table->vector = %p\n",
 			   ep_priv->vc_table, ep_priv->vc_table->vector);
-                if (ret != FI_SUCCESS) {
+		if (ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL, "_gnix_vec_init returned %s\n",
 				  fi_strerror(ret));
 			goto err;
@@ -424,7 +622,7 @@ static inline int __gnix_ep_init_vc(struct gnix_fid_ep *ep_priv)
 	return FI_SUCCESS;
 
 err:
-	if (type == FI_AV_TABLE) {
+	if (ep_priv->av->type == FI_AV_TABLE) {
 		free(ep_priv->vc_table);
 		ep_priv->vc_table = NULL;
 	} else {
@@ -494,7 +692,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_recv(struct fid_ep *ep, void *buf, size_t len,
 				      void *desc, fi_addr_t src_addr,
 				      void *context)
 {
-	return __ep_recv(ep, buf, len, desc, src_addr, context, 0, 0, 0);
+	return _ep_recv(ep, buf, len, desc, src_addr, context, 0, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_recvv(struct fid_ep *ep,
@@ -503,21 +701,21 @@ DIRECT_FN STATIC ssize_t gnix_ep_recvv(struct fid_ep *ep,
 				       fi_addr_t src_addr,
 				       void *context)
 {
-	return __ep_recvv(ep, iov, desc, count, src_addr, context, 0, 0, 0);
+	return _ep_recvv(ep, iov, desc, count, src_addr, context, 0, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_recvmsg(struct fid_ep *ep,
 					 const struct fi_msg *msg,
 					 uint64_t flags)
 {
-	return __ep_recvmsg(ep, msg, flags & GNIX_RECVMSG_FLAGS, 0, 0);
+	return _ep_recvmsg(ep, msg, flags & GNIX_RECVMSG_FLAGS, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_send(struct fid_ep *ep, const void *buf,
 				      size_t len, void *desc,
 				      fi_addr_t dest_addr, void *context)
 {
-	return __ep_send(ep, buf, len, desc, dest_addr, context, 0, 0);
+	return _ep_send(ep, buf, len, desc, dest_addr, context, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_sendv(struct fid_ep *ep,
@@ -526,28 +724,27 @@ DIRECT_FN STATIC ssize_t gnix_ep_sendv(struct fid_ep *ep,
 				       fi_addr_t dest_addr,
 				       void *context)
 {
-	return __ep_sendv(ep, iov, desc, count, dest_addr, context, 0, 0);
+	return _ep_sendv(ep, iov, desc, count, dest_addr, context, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_sendmsg(struct fid_ep *ep,
 					 const struct fi_msg *msg,
 					 uint64_t flags)
 {
-	return __ep_sendmsg(ep, msg, flags & GNIX_SENDMSG_FLAGS, 0);
+	return _ep_sendmsg(ep, msg, flags & GNIX_SENDMSG_FLAGS, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_msg_inject(struct fid_ep *ep, const void *buf,
 					    size_t len, fi_addr_t dest_addr)
 {
-	return __ep_inject(ep, buf, len, 0, dest_addr, 0, 0);
+	return _ep_inject(ep, buf, len, 0, dest_addr, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_senddata(struct fid_ep *ep, const void *buf,
 					  size_t len, void *desc, uint64_t data,
 					  fi_addr_t dest_addr, void *context)
 {
-	return __ep_senddata(ep, buf, len, desc, data, dest_addr,
-			     context, 0, 0);
+	return _ep_senddata(ep, buf, len, desc, data, dest_addr, context, 0, 0);
 }
 
 DIRECT_FN STATIC ssize_t
@@ -571,14 +768,10 @@ gnix_ep_msg_injectdata(struct fid_ep *ep, const void *buf, size_t len,
 			  NULL, flags, data, 0);
 }
 
-
 /*******************************************************************************
  * EP RMA API function implementations.
  ******************************************************************************/
 
-#define GNIX_RMA_READ_FLAGS_DEF		(FI_RMA | FI_READ)
-#define GNIX_RMA_WRITE_FLAGS_DEF	(FI_RMA | FI_WRITE)
-
 DIRECT_FN STATIC ssize_t gnix_ep_read(struct fid_ep *ep, void *buf, size_t len,
 				      void *desc, fi_addr_t src_addr, uint64_t addr,
 				      uint64_t key, void *context)
@@ -794,7 +987,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_trecv(struct fid_ep *ep, void *buf, size_t len,
 				       uint64_t tag, uint64_t ignore,
 				       void *context)
 {
-	return __ep_recv(ep, buf, len, desc, src_addr, context,
+	return _ep_recv(ep, buf, len, desc, src_addr, context,
 			FI_TAGGED, tag, ignore);
 }
 
@@ -805,7 +998,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_trecvv(struct fid_ep *ep,
 					uint64_t tag, uint64_t ignore,
 					void *context)
 {
-	return __ep_recvv(ep, iov, desc, count, src_addr, context,
+	return _ep_recvv(ep, iov, desc, count, src_addr, context,
 			  FI_TAGGED, tag, ignore);
 }
 
@@ -813,8 +1006,6 @@ DIRECT_FN STATIC ssize_t gnix_ep_trecvmsg(struct fid_ep *ep,
 					  const struct fi_msg_tagged *msg,
 					  uint64_t flags)
 {
-	uint64_t clean_flags;
-
 	const struct fi_msg _msg = {
 			.msg_iov = msg->msg_iov,
 			.desc = msg->desc,
@@ -824,7 +1015,8 @@ DIRECT_FN STATIC ssize_t gnix_ep_trecvmsg(struct fid_ep *ep,
 			.data = msg->data
 	};
 
-	clean_flags = (flags & (GNIX_TRECVMSG_FLAGS)) | FI_TAGGED;
+	if (flags & ~GNIX_TRECVMSG_FLAGS)
+		return -FI_EINVAL;
 
 	/* From the fi_tagged man page regarding the use of FI_CLAIM:
 	 *
@@ -847,7 +1039,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_trecvmsg(struct fid_ep *ep,
 	if ((flags & FI_DISCARD) && !(flags & (FI_PEEK | FI_CLAIM)))
 		return -FI_EINVAL;
 
-	return __ep_recvmsg(ep, &_msg, clean_flags, msg->tag,
+	return _ep_recvmsg(ep, &_msg, flags | FI_TAGGED, msg->tag,
 			msg->ignore);
 }
 
@@ -856,7 +1048,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_tsend(struct fid_ep *ep, const void *buf,
 				       fi_addr_t dest_addr, uint64_t tag,
 				       void *context)
 {
-	return __ep_send(ep, buf, len, desc, dest_addr, context,
+	return _ep_send(ep, buf, len, desc, dest_addr, context,
 			FI_TAGGED, tag);
 }
 
@@ -866,16 +1058,14 @@ DIRECT_FN STATIC ssize_t gnix_ep_tsendv(struct fid_ep *ep,
 					fi_addr_t dest_addr,
 					uint64_t tag, void *context)
 {
-	return __ep_sendv(ep, iov, desc, count, dest_addr, context,
-			  FI_TAGGED, tag);
+	return _ep_sendv(ep, iov, desc, count, dest_addr, context,
+			 FI_TAGGED, tag);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_tsendmsg(struct fid_ep *ep,
 					  const struct fi_msg_tagged *msg,
 					  uint64_t flags)
 {
-	uint64_t clean_flags;
-
 	const struct fi_msg _msg = {
 			.msg_iov = msg->msg_iov,
 			.desc = msg->desc,
@@ -885,16 +1075,17 @@ DIRECT_FN STATIC ssize_t gnix_ep_tsendmsg(struct fid_ep *ep,
 			.data = msg->data
 	};
 
-	clean_flags = (flags & GNIX_SENDMSG_FLAGS) | FI_TAGGED;
+	if (flags & ~(GNIX_SENDMSG_FLAGS))
+		return -FI_EINVAL;
 
-	return __ep_sendmsg(ep, &_msg, clean_flags, msg->tag);
+	return _ep_sendmsg(ep, &_msg, flags | FI_TAGGED, msg->tag);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_tinject(struct fid_ep *ep, const void *buf,
 					 size_t len, fi_addr_t dest_addr,
 					 uint64_t tag)
 {
-	return __ep_inject(ep, buf, len, 0, dest_addr, FI_TAGGED, tag);
+	return _ep_inject(ep, buf, len, 0, dest_addr, FI_TAGGED, tag);
 }
 
 DIRECT_FN STATIC ssize_t gnix_ep_tsenddata(struct fid_ep *ep, const void *buf,
@@ -902,7 +1093,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_tsenddata(struct fid_ep *ep, const void *buf,
 					   uint64_t data, fi_addr_t dest_addr,
 					   uint64_t tag, void *context)
 {
-	return __ep_senddata(ep, buf, len, desc, data, dest_addr, context,
+	return _ep_senddata(ep, buf, len, desc, data, dest_addr, context,
 			FI_TAGGED, tag);
 }
 
@@ -924,19 +1115,15 @@ DIRECT_FN STATIC ssize_t gnix_ep_tinjectdata(struct fid_ep *ep, const void *buf,
 					     size_t len, uint64_t data,
 					     fi_addr_t dest_addr, uint64_t tag)
 {
-	return __ep_inject(ep, buf, len, data, dest_addr,
+	return _ep_inject(ep, buf, len, data, dest_addr,
 			  FI_TAGGED | FI_REMOTE_CQ_DATA, tag);
 }
 
-
 /*******************************************************************************
  * EP atomic API implementation.
  ******************************************************************************/
 
-#define GNIX_ATOMIC_WRITE_FLAGS_DEF	(FI_ATOMIC | FI_WRITE)
-#define GNIX_ATOMIC_READ_FLAGS_DEF	(FI_ATOMIC | FI_READ)
-
-DIRECT_FN STATIC int gnix_ep_atomic_valid(struct fid_ep *ep,
+DIRECT_FN int gnix_ep_atomic_valid(struct fid_ep *ep,
 					  enum fi_datatype datatype,
 					  enum fi_op op, size_t *count)
 {
@@ -944,10 +1131,10 @@ DIRECT_FN STATIC int gnix_ep_atomic_valid(struct fid_ep *ep,
 		*count = 1;
 
 	return _gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_AMO) >= 0 ?
-		0 : -FI_ENOENT;
+		0 : -FI_EOPNOTSUPP;
 }
 
-DIRECT_FN STATIC int gnix_ep_fetch_atomic_valid(struct fid_ep *ep,
+DIRECT_FN int gnix_ep_fetch_atomic_valid(struct fid_ep *ep,
 						enum fi_datatype datatype,
 						enum fi_op op, size_t *count)
 {
@@ -955,10 +1142,10 @@ DIRECT_FN STATIC int gnix_ep_fetch_atomic_valid(struct fid_ep *ep,
 		*count = 1;
 
 	return _gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_FAMO) >= 0 ?
-		0 : -FI_ENOENT;
+		0 : -FI_EOPNOTSUPP;
 }
 
-DIRECT_FN STATIC int gnix_ep_cmp_atomic_valid(struct fid_ep *ep,
+DIRECT_FN int gnix_ep_cmp_atomic_valid(struct fid_ep *ep,
 					      enum fi_datatype datatype,
 					      enum fi_op op, size_t *count)
 {
@@ -966,7 +1153,7 @@ DIRECT_FN STATIC int gnix_ep_cmp_atomic_valid(struct fid_ep *ep,
 		*count = 1;
 
 	return _gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_CAMO) >= 0 ?
-		0 : -FI_ENOENT;
+		0 : -FI_EOPNOTSUPP;
 }
 
 size_t
@@ -987,8 +1174,8 @@ __gnix_fabric_ops_native_amo(struct fid_ep *ep, const void *buf, size_t count,
 
 	if (!ep)
 		return -FI_EINVAL;
-	if ((req_type < 0) || (req_type > GNIX_FAB_RQ_MAX_TYPES) || 
-		(req_type >= GNIX_FAB_RQ_END_NON_NATIVE && 
+	if ((req_type < 0) || (req_type > GNIX_FAB_RQ_MAX_TYPES) ||
+		(req_type >= GNIX_FAB_RQ_END_NON_NATIVE &&
 		 req_type < GNIX_FAB_RQ_START_NATIVE))
 		return -FI_EINVAL;
 
@@ -1030,7 +1217,7 @@ gnix_ep_atomic_write(struct fid_ep *ep, const void *buf, size_t count,
 	uint64_t flags;
 
 	if (gnix_ep_atomic_valid(ep, datatype, op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1081,7 +1268,7 @@ gnix_ep_atomic_writemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg,
 	struct gnix_fid_ep *gnix_ep;
 
 	if (gnix_ep_atomic_valid(ep, msg->datatype, msg->op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1107,7 +1294,7 @@ gnix_ep_atomic_inject(struct fid_ep *ep, const void *buf, size_t count,
 	uint64_t flags;
 
 	if (gnix_ep_atomic_valid(ep, datatype, op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1150,7 +1337,7 @@ gnix_ep_atomic_readwrite(struct fid_ep *ep, const void *buf, size_t count,
 	uint64_t flags;
 
 	if (gnix_ep_fetch_atomic_valid(ep, datatype, op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1209,7 +1396,7 @@ gnix_ep_atomic_readwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg,
 	struct gnix_fid_ep *gnix_ep;
 
 	if (gnix_ep_fetch_atomic_valid(ep, msg->datatype, msg->op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1241,7 +1428,7 @@ gnix_ep_atomic_compwrite(struct fid_ep *ep, const void *buf, size_t count,
 	uint64_t flags;
 
 	if (gnix_ep_cmp_atomic_valid(ep, datatype, op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1317,7 +1504,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_atomic_compwritemsg(struct fid_ep *ep,
 	struct gnix_fid_ep *gnix_ep;
 
 	if (gnix_ep_cmp_atomic_valid(ep, msg->datatype, msg->op, NULL))
-		return -FI_ENOENT;
+		return -FI_EOPNOTSUPP;
 
 	if (!ep)
 		return -FI_EINVAL;
@@ -1337,7 +1524,6 @@ DIRECT_FN STATIC ssize_t gnix_ep_atomic_compwritemsg(struct fid_ep *ep,
  * Base EP API function implementations.
  ******************************************************************************/
 
-
 DIRECT_FN STATIC int gnix_ep_control(fid_t fid, int command, void *arg)
 {
 	int ret = FI_SUCCESS;
@@ -1353,6 +1539,7 @@ DIRECT_FN STATIC int gnix_ep_control(fid_t fid, int command, void *arg)
 	 * with this ep.
 	 */
 	case FI_ENABLE:
+
 		if (GNIX_EP_RDM_DGM(ep->type)) {
 			if ((ep->send_cq && ep->tx_enabled)) {
 				ret = -FI_EOPBADSTATE;
@@ -1376,13 +1563,17 @@ DIRECT_FN STATIC int gnix_ep_control(fid_t fid, int command, void *arg)
 					ret);
 				goto err;
 			}
-			if (ep->send_cq)
-				ep->tx_enabled = true;
-			if (ep->recv_cq)
-				ep->rx_enabled = true;
 		}
 
-		_gnix_ep_htd_pool_init(ep);
+		ret = _gnix_ep_enable(ep);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+			     "_gnix_ep_enable call returned %d\n",
+				ret);
+			goto err;
+		}
+
+		ret = _gnix_ep_int_tx_pool_init(ep);
 		break;
 
 	case FI_GETOPSFLAG:
@@ -1396,7 +1587,6 @@ err:
 	return ret;
 }
 
-
 static int __destruct_tag_storages(struct gnix_fid_ep *ep)
 {
 	int ret;
@@ -1424,17 +1614,25 @@ static void __ep_destruct(void *obj)
 {
 	int ret;
 	struct gnix_fid_domain *domain;
-	struct gnix_nic *nic;
 	struct gnix_fid_av *av;
-	struct gnix_cm_nic *cm_nic;
 	gnix_ht_key_t *key_ptr;
 	struct gnix_fid_ep *ep = (struct gnix_fid_ep *) obj;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
-	if (ep->av) {
+	if (ep->type == FI_EP_MSG) {
+		if (GNIX_EP_CONNECTED(ep)) {
+			assert(ep->vc);
+			ret = _gnix_vc_destroy(ep->vc);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "_gnix_vc_destroy returned %s\n",
+					  fi_strerror(-ret));
+			}
+		}
+	} else if (ep->av) {
 		/* Remove EP from CM NIC lookup list. */
-		key_ptr = (gnix_ht_key_t *)&ep->my_name.gnix_addr;
+		key_ptr = (gnix_ht_key_t *)&ep->src_addr.gnix_addr;
 		ret =  _gnix_ht_remove(ep->cm_nic->addr_to_ep_ht,
 				       *key_ptr);
 		if (ret != FI_SUCCESS) {
@@ -1452,43 +1650,80 @@ static void __ep_destruct(void *obj)
 		}
 	}
 
+	if (ep->eq) {
+		_gnix_eq_poll_obj_rem(ep->eq, &ep->ep_fid.fid);
+		_gnix_ref_put(ep->eq);
+	}
+
 	if (ep->send_cq) {
-		_gnix_cq_poll_nic_rem(ep->send_cq, ep->nic);
+		_gnix_cq_poll_obj_rem(ep->send_cq, ep->nic,
+				      _gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cq_poll_obj_rem(ep->send_cq, ep->cm_nic,
+					      _gnix_cm_nic_progress);
 		_gnix_ref_put(ep->send_cq);
 	}
 
 	if (ep->recv_cq) {
-		_gnix_cq_poll_nic_rem(ep->recv_cq, ep->nic);
+		_gnix_cq_poll_obj_rem(ep->recv_cq, ep->nic,
+				       _gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cq_poll_obj_rem(ep->recv_cq, ep->cm_nic,
+					      _gnix_cm_nic_progress);
 		_gnix_ref_put(ep->recv_cq);
 	}
 
 	if (ep->send_cntr) {
-		_gnix_cntr_poll_nic_rem(ep->send_cntr, ep->nic);
+		_gnix_cntr_poll_obj_rem(ep->send_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_rem(ep->send_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
 		_gnix_ref_put(ep->send_cntr);
 	}
 
 	if (ep->recv_cntr) {
-		_gnix_cntr_poll_nic_rem(ep->recv_cntr, ep->nic);
+		_gnix_cntr_poll_obj_rem(ep->recv_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_rem(ep->recv_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
 		_gnix_ref_put(ep->recv_cntr);
 	}
 
 	if (ep->write_cntr) {
-		_gnix_cntr_poll_nic_rem(ep->write_cntr, ep->nic);
+		_gnix_cntr_poll_obj_rem(ep->write_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_rem(ep->write_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
 		_gnix_ref_put(ep->write_cntr);
 	}
 
 	if (ep->read_cntr) {
-		_gnix_cntr_poll_nic_rem(ep->read_cntr, ep->nic);
+		_gnix_cntr_poll_obj_rem(ep->read_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_rem(ep->read_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
 		_gnix_ref_put(ep->read_cntr);
 	}
 
 	if (ep->rwrite_cntr) {
-		_gnix_cntr_poll_nic_rem(ep->rwrite_cntr, ep->nic);
+		_gnix_cntr_poll_obj_rem(ep->rwrite_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_rem(ep->rwrite_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
 		_gnix_ref_put(ep->rwrite_cntr);
 	}
 
 	if (ep->rread_cntr) {
-		_gnix_cntr_poll_nic_rem(ep->rread_cntr, ep->nic);
+		_gnix_cntr_poll_obj_rem(ep->rread_cntr, ep->nic,
+					_gnix_nic_progress);
+		if (ep->cm_nic) /* No CM NIC for MSG EPs */
+			_gnix_cntr_poll_obj_rem(ep->rread_cntr, ep->cm_nic,
+						_gnix_cm_nic_progress);
 		_gnix_ref_put(ep->rread_cntr);
 	}
 
@@ -1507,25 +1742,23 @@ static void __ep_destruct(void *obj)
 	assert(domain != NULL);
 	_gnix_ref_put(domain);
 
-	cm_nic = ep->cm_nic;
-	assert(cm_nic != NULL);
-
-	nic = ep->nic;
-	assert(nic != NULL);
-
 	av = ep->av;
 	if (av != NULL)
 		_gnix_ref_put(av);
 
-	/* There is no other choice here, we need to assert if we can't free */
-	ret = _gnix_nic_free(nic);
-	assert(ret == FI_SUCCESS);
-
-	ep->nic = NULL;
+	if (ep->nic) {
+		ret = _gnix_nic_free(ep->nic);
+		if (ret != FI_SUCCESS)
+			GNIX_FATAL(FI_LOG_EP_CTRL,
+				   "_gnix_nic_free failed: %d\n");
+	}
 
-	/* This currently always returns FI_SUCCESS */
-	ret = _gnix_cm_nic_free(cm_nic);
-	assert(ret == FI_SUCCESS);
+	if (ep->cm_nic) {
+		ret = _gnix_cm_nic_free(ep->cm_nic);
+		if (ret != FI_SUCCESS)
+			GNIX_FATAL(FI_LOG_EP_CTRL,
+				   "_gnix_cm_nic_free failed: %d\n");
+	}
 
 	__destruct_tag_storages(ep);
 
@@ -1534,12 +1767,14 @@ static void __ep_destruct(void *obj)
 	 */
 
 	__fr_freelist_destroy(ep);
-	_gnix_ep_htd_pool_fini(ep);
+	_gnix_ep_int_tx_pool_fini(ep);
+
+	fi_freeinfo(ep->info);
 
 	free(ep);
 }
 
-static int gnix_ep_close(fid_t fid)
+int gnix_ep_close(fid_t fid)
 {
 	int ret = FI_SUCCESS;
 	struct gnix_fid_ep *ep;
@@ -1558,26 +1793,77 @@ static int gnix_ep_close(fid_t fid)
 	return ret;
 }
 
-DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
+DIRECT_FN int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 {
-	int ret;
+	int ret = FI_SUCCESS;
 	struct gnix_fid_ep  *ep;
+	struct gnix_fid_eq *eq;
 	struct gnix_fid_av  *av;
 	struct gnix_fid_cq  *cq;
 	struct gnix_fid_stx *stx;
 	struct gnix_fid_cntr *cntr;
+	struct gnix_fid_trx *trx_priv;
+	struct gnix_nic_attr nic_attr = {0};
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
-	ep = container_of(fid, struct gnix_fid_ep, ep_fid.fid);
+	switch (fid->fclass) {
+	case FI_CLASS_TX_CTX:
+	case FI_CLASS_RX_CTX:
+		trx_priv = container_of(fid, struct gnix_fid_trx, ep_fid);
+		ep = trx_priv->ep;
+		break;
+	default:
+		ep = container_of(fid, struct gnix_fid_ep, ep_fid.fid);
+	}
+
 	ret = ofi_ep_bind_valid(&gnix_prov, bfid, flags);
 	if (ret)
 		return ret;
 
+	/*
+	 * Per fi_endpoint man page, can't bind an object
+	 * to an ep after its been enabled.
+	 * For scalable endpoints, the rx/tx contexts are bound to the same
+	 * gnix_ep so we allow enabling of the tx before binding the rx and
+	 * vice versa.
+	 */
+	switch (fid->fclass) {
+	case FI_CLASS_TX_CTX:
+		if (ep->send_cq && ep->tx_enabled) {
+			return -FI_EOPBADSTATE;
+		}
+		break;
+	case FI_CLASS_RX_CTX:
+		if (ep->recv_cq && ep->rx_enabled) {
+			return -FI_EOPBADSTATE;
+		}
+		break;
+	default:
+		if ((ep->send_cq && ep->tx_enabled) ||
+			(ep->recv_cq && ep->rx_enabled)) {
+			return -FI_EOPBADSTATE;
+		}
+	}
+
 	switch (bfid->fclass) {
 	case FI_CLASS_EQ:
-		ret = -FI_ENOSYS;
-		goto err;
+		eq = container_of(bfid, struct gnix_fid_eq, eq_fid.fid);
+		if (ep->domain->fabric != eq->fabric) {
+			ret = -FI_EINVAL;
+			break;
+		}
+
+		if (ep->eq) {
+			ret = -FI_EINVAL;
+			break;
+		}
+
+		ep->eq = eq;
+		_gnix_eq_poll_obj_add(eq, &ep->ep_fid.fid);
+		_gnix_ref_get(eq);
+
+		GNIX_DEBUG(FI_LOG_EP_CTRL, "Bound EQ to EP: %p, %p\n", eq, ep);
 		break;
 	case FI_CLASS_CQ:
 		cq = container_of(bfid, struct gnix_fid_cq, cq_fid.fid);
@@ -1597,7 +1883,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				ep->send_selective_completion = 1;
 			}
 
-			_gnix_cq_poll_nic_add(cq, ep->nic);
 			_gnix_ref_get(cq);
 		}
 		if (flags & FI_RECV) {
@@ -1612,7 +1897,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				ep->recv_selective_completion = 1;
 			}
 
-			_gnix_cq_poll_nic_add(cq, ep->nic);
 			_gnix_ref_get(cq);
 		}
 		break;
@@ -1623,7 +1907,7 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 			break;
 		}
 		ep->av = av;
-		__gnix_ep_init_vc(ep);
+		_gnix_ep_init_vc(ep);
 		_gnix_ref_get(ep->av);
 		break;
 	case FI_CLASS_CNTR:
@@ -1643,7 +1927,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				break;
 			}
 			ep->send_cntr = cntr;
-			_gnix_cntr_poll_nic_add(cntr, ep->nic);
 			_gnix_ref_get(cntr);
 		}
 
@@ -1657,7 +1940,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				break;
 			}
 			ep->recv_cntr = cntr;
-			_gnix_cntr_poll_nic_add(cntr, ep->nic);
 			_gnix_ref_get(cntr);
 		}
 
@@ -1671,7 +1953,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				break;
 			}
 			ep->write_cntr = cntr;
-			_gnix_cntr_poll_nic_add(cntr, ep->nic);
 			_gnix_ref_get(cntr);
 		}
 
@@ -1685,7 +1966,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				break;
 			}
 			ep->read_cntr = cntr;
-			_gnix_cntr_poll_nic_add(cntr, ep->nic);
 			_gnix_ref_get(cntr);
 		}
 
@@ -1699,7 +1979,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				break;
 			}
 			ep->rwrite_cntr = cntr;
-			_gnix_cntr_poll_nic_add(cntr, ep->nic);
 			_gnix_ref_get(cntr);
 		}
 
@@ -1713,7 +1992,6 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 				break;
 			}
 			ep->rread_cntr = cntr;
-			_gnix_cntr_poll_nic_add(cntr, ep->nic);
 			_gnix_ref_get(cntr);
 		}
 
@@ -1725,93 +2003,58 @@ DIRECT_FN STATIC int gnix_ep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
 			ret = -FI_EINVAL;
 			break;
 		}
-		ep->stx_ctx = stx;
-		_gnix_ref_get(ep->stx_ctx);
-		break;
-
-	case FI_CLASS_MR:/*TODO: got to figure this one out */
-	default:
-		ret = -FI_ENOSYS;
-		break;
-	}
-
-err:
-	return ret;
-}
-
-DIRECT_FN int gnix_pep_bind(fid_t fid, fid_t *bfid, uint64_t flags)
-{
-	return -FI_ENOSYS;
-}
 
-static int __gnix_ep_cm_nic_prep(struct gnix_fid_domain *domain,
-				 struct fi_info *info,
-				 uint32_t *cdm_id)
-{
-	int ret = FI_SUCCESS;
-	uint32_t name_type = GNIX_EPN_TYPE_UNBOUND;
-	struct gnix_ep_name *name;
+		/*
+		 * can only bind an STX to an ep opened with
+		 * FI_SHARED_CONTEXT ep_attr->tx_ctx_cnt and also
+		 * if a nic has not been previously bound
+		 */
 
-	if (info->src_addr &&
-	    info->src_addrlen == sizeof(struct gnix_ep_name)) {
-		name = (struct gnix_ep_name *)info->src_addr;
-		if (name->name_type == GNIX_EPN_TYPE_BOUND) {
-			/* EP name includes user specified service/port */
-			*cdm_id = name->gnix_addr.cdm_id;
-			name_type = name->name_type;
+		if (ep->shared_tx == false || ep->nic) {
+			ret =  -FI_EOPBADSTATE;
+			break;
 		}
-	}
 
-	if (name_type == GNIX_EPN_TYPE_UNBOUND) {
-		ret = _gnix_cm_nic_create_cdm_id(domain, cdm_id);
-		if (ret != FI_SUCCESS) {
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				"gnix_cm_nic_create_cdm_id returned %s\n",
-				  fi_strerror(-ret));
-			return ret;
+		/*
+		 * we force allocation of a nic to make semantics
+		 * match the intent fi_endpoint man page, provide
+		 * a TX context (aka gnix nic) that can be shared
+		 * explicitly amongst endpoints
+		 */
+		if (stx->auth_key && ep->auth_key != stx->auth_key) {
+			ret = -FI_EINVAL;
+			break;
 		}
-	}
 
-	return ret;
-}
-
-/*
- * helper function for initializing an ep of type
- * GNIX_EPN_TYPE_BOUND
- */
-static int __gnix_ep_bound_prep(struct gnix_fid_domain *domain,
-				struct fi_info *info,
-				struct gnix_fid_ep *ep)
-{
-	int ret = FI_SUCCESS;
-	uint32_t cdm_id;
-
-	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+		if (!stx->nic) {
+			nic_attr.must_alloc = true;
+			nic_attr.auth_key = ep->auth_key;
+			ret = gnix_nic_alloc(ep->domain, &nic_attr,
+				&stx->nic);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					 "_gnix_nic_alloc call returned %d\n",
+					ret);
+					break;
+			}
+			stx->auth_key = nic_attr.auth_key;
+		}
 
-	assert(domain != NULL);
-	assert(info != NULL);
-	assert(ep != NULL);
+		ep->stx_ctx = stx;
+		_gnix_ref_get(ep->stx_ctx);
 
-	ret = __gnix_ep_cm_nic_prep(domain, info, &cdm_id);
-	if (ret != FI_SUCCESS) {
-		return ret;
-	}
+		ep->nic = stx->nic;
+		if (ep->nic->smsg_callbacks == NULL)
+			ep->nic->smsg_callbacks = gnix_ep_smsg_callbacks;
+		_gnix_ref_get(ep->nic);
+		break;
 
-	ret = _gnix_cm_nic_alloc(domain,
-				 info,
-				 cdm_id,
-				 &ep->cm_nic);
-	if (ret != FI_SUCCESS) {
-		GNIX_WARN(FI_LOG_EP_CTRL,
-			  "_gnix_cm_nic_alloc returned %s\n",
-			  fi_strerror(-ret));
-		return ret;
+	case FI_CLASS_MR:/*TODO: got to figure this one out */
+	default:
+		ret = -FI_ENOSYS;
+		break;
 	}
 
-	ep->my_name = ep->cm_nic->my_name;
-	ep->nic = ep->cm_nic->nic;
-	_gnix_ref_get(ep->nic);
-
 	return ret;
 }
 
@@ -1831,16 +2074,17 @@ static void gnix_ep_caps(struct gnix_fid_ep *ep_priv, uint64_t caps)
 
 }
 
-
-static int __init_tag_storages(struct gnix_fid_ep *ep, int tag_type)
+static int __init_tag_storages(struct gnix_fid_ep *ep, int tag_type,
+			       int use_addrs)
 {
 	int tsret;
 	struct gnix_tag_storage_attr untagged_attr = {
 			.type = tag_type,
-			.use_src_addr_matching = 1,
+			.use_src_addr_matching = use_addrs,
 	};
 	struct gnix_tag_storage_attr tagged_attr = {
 			.type = tag_type,
+			.use_src_addr_matching = use_addrs,
 	};
 
 	GNIX_INFO(FI_LOG_EP_CTRL, "initializing tag storage, tag_type=%d\n",
@@ -1869,17 +2113,183 @@ static int __init_tag_storages(struct gnix_fid_ep *ep, int tag_type)
 	return tsret;
 }
 
+static int _gnix_ep_nic_init(struct gnix_fid_domain *domain,
+			     struct fi_info *info,
+			     struct gnix_fid_ep *ep)
+{
+	int ret = FI_SUCCESS;
+	uint32_t cdm_id = GNIX_CREATE_CDM_ID;
+	struct gnix_ep_name *name;
+	struct gnix_nic_attr nic_attr = {0};
+
+	if (ep->type == FI_EP_MSG) {
+		if (ep->shared_tx == false) {
+			nic_attr.auth_key = ep->auth_key;
+
+			ret = gnix_nic_alloc(domain, &nic_attr,
+				&ep->nic);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "_gnix_nic_alloc call returned %d\n",
+					  ret);
+			}
+		}
+		return ret;
+	}
+
+	name = (struct gnix_ep_name *)info->src_addr;
+	if (name && name->name_type == GNIX_EPN_TYPE_BOUND) {
+		/* Endpoint was bound to a specific source address.  Create a
+		 * new CM NIC to listen on this address. */
+		ret = _gnix_cm_nic_alloc(domain, info, name->gnix_addr.cdm_id,
+				ep->auth_key, &ep->cm_nic);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "_gnix_cm_nic_alloc returned %s\n",
+				  fi_strerror(-ret));
+			return ret;
+		}
+
+		ep->src_addr = ep->cm_nic->my_name;
+
+		/*
+		 * if this endpoint is not going to use a shared TX
+		 * aka gnix_nic, link its nic with the one being
+		 * used for the cm_nic to reduce pressure on underlying
+		* hardware resources.
+		*/
+		if (ep->shared_tx == false) {
+			ep->nic = ep->cm_nic->nic;
+			_gnix_ref_get(ep->nic);
+
+			GNIX_INFO(FI_LOG_EP_CTRL,
+				  "Allocated new NIC for bound EP: %p (ID:%d)\n",
+				  ep->src_addr.gnix_addr.cdm_id);
+			}
+	} else {
+		fastlock_acquire(&domain->cm_nic_lock);
+
+		/* Allocate a domain CM NIC, if needed. */
+		if (domain->cm_nic == NULL) {
+			ret = _gnix_cm_nic_create_cdm_id(domain, &cdm_id);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "gnix_cm_nic_create_cdm_id returned %s\n",
+					  fi_strerror(-ret));
+				return ret;
+			}
+
+			ret = _gnix_cm_nic_alloc(domain, info, cdm_id,
+					ep->auth_key, &domain->cm_nic);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "_gnix_cm_nic_alloc returned %s\n",
+					  fi_strerror(-ret));
+				fastlock_release(&domain->cm_nic_lock);
+				return ret;
+			}
+
+			/* Use the newly allocated domain CM NIC for data
+			 * movement on this EP if not using STX. */
+			ep->cm_nic = domain->cm_nic;
+			if (ep->shared_tx == false) {
+				ep->nic = ep->cm_nic->nic;
+				_gnix_ref_get(ep->nic);
+			}
+
+			GNIX_INFO(FI_LOG_EP_CTRL,
+				  "Allocated new NIC for EP: %p (ID:%d)\n",
+				  ep->src_addr.gnix_addr.cdm_id);
+		} else {
+			/* Re-use the existing domain CM NIC. */
+			ep->cm_nic = domain->cm_nic;
+			_gnix_ref_get(ep->cm_nic);
+
+			if (ep->shared_tx == false) {
+				nic_attr.auth_key = ep->auth_key;
+
+				/* Allocate a new NIC for data
+				   movement on this EP. */
+				ret = gnix_nic_alloc(domain,
+					&nic_attr, &ep->nic);
+				if (ret != FI_SUCCESS) {
+					GNIX_WARN(FI_LOG_EP_CTRL,
+					    "_gnix_nic_alloc call returned %d\n",
+					     ret);
+					fastlock_release(&domain->cm_nic_lock);
+					return ret;
+				}
+
+				GNIX_INFO(FI_LOG_EP_CTRL,
+					  "Allocated new NIC for xfers: %p (ID:%d)\n",
+					  ep->src_addr.gnix_addr.cdm_id);
+			}
+		}
+
+		fastlock_release(&domain->cm_nic_lock);
+
+		ep->src_addr.gnix_addr.device_addr =
+			ep->cm_nic->my_name.gnix_addr.device_addr;
+		ep->src_addr.cm_nic_cdm_id =
+			ep->cm_nic->my_name.gnix_addr.cdm_id;
+
+		ret = _gnix_cm_nic_create_cdm_id(domain, &cdm_id);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "gnix_cm_nic_create_cdm_id returned %s\n",
+				  fi_strerror(-ret));
+			if(ep->nic != NULL)
+				_gnix_ref_put(ep->nic);
+			return ret;
+		}
+		ep->src_addr.gnix_addr.cdm_id = cdm_id;
+	}
+
+	return FI_SUCCESS;
+}
+
+static int _gnix_ep_msg_open(struct gnix_fid_domain *domain,
+			     struct fi_info *info,
+			     struct gnix_fid_ep *ep)
+{
+	ep->ep_fid.cm = &gnix_ep_msg_ops_cm;
+	ep->conn_fd = -1;
+	ep->conn_state = GNIX_EP_UNCONNECTED;
+
+	return FI_SUCCESS;
+}
+
+static int _gnix_ep_unconn_open(struct gnix_fid_domain *domain,
+				struct fi_info *info,
+				struct gnix_fid_ep *ep)
+{
+	int ret;
+	gnix_ht_key_t *key_ptr;
+
+	key_ptr = (gnix_ht_key_t *)&ep->src_addr.gnix_addr;
+	ret = _gnix_ht_insert(ep->cm_nic->addr_to_ep_ht,
+			      *key_ptr, ep);
+	if ((ret != FI_SUCCESS) && (ret != -FI_ENOSPC)) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "__gnix_ht_insert returned %d\n",
+			  ret);
+		return ret;
+	}
+
+	/* Unconnected endpoints use a limited set of CM ops. */
+	ep->ep_fid.cm = &gnix_ep_ops_cm;
+
+	return FI_SUCCESS;
+}
+
 DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 			   struct fid_ep **ep, void *context)
 {
 	int ret = FI_SUCCESS;
 	int err_ret;
-	uint32_t cdm_id;
 	struct gnix_fid_domain *domain_priv;
 	struct gnix_fid_ep *ep_priv;
-	struct gnix_ep_name *name;
-	gnix_ht_key_t *key_ptr;
-	bool free_list_inited = false;
+	struct gnix_auth_key *auth_key;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
@@ -1887,25 +2297,207 @@ DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 	    (info->ep_attr == NULL))
 		return -FI_EINVAL;
 
+	domain_priv = container_of(domain, struct gnix_fid_domain, domain_fid);
+
+	if (FI_VERSION_LT(domain_priv->fabric->fab_fid.api_version,
+		FI_VERSION(1, 5)) &&
+		(info->ep_attr->auth_key || info->ep_attr->auth_key_size))
+		return -FI_EINVAL;
+
+	if (info->ep_attr->auth_key_size) {
+		auth_key = GNIX_GET_AUTH_KEY(info->ep_attr->auth_key,
+				info->ep_attr->auth_key_size);
+		if (!auth_key)
+			return -FI_EINVAL;
+	} else {
+		auth_key = domain_priv->auth_key;
+		assert(auth_key);
+	}
+
+	ep_priv = calloc(1, sizeof *ep_priv);
+	if (!ep_priv)
+		return -FI_ENOMEM;
+
+	/* Set up libfabric fid data. */
+	ep_priv->ep_fid.fid.fclass = FI_CLASS_EP;
+	ep_priv->ep_fid.fid.context = context;
+	ep_priv->ep_fid.fid.ops = &gnix_ep_fi_ops;
+	ep_priv->ep_fid.ops = &gnix_ep_ops;
+	ep_priv->ep_fid.msg = &gnix_ep_msg_ops;
+	ep_priv->ep_fid.rma = &gnix_ep_rma_ops;
+	ep_priv->ep_fid.tagged = &gnix_ep_tagged_ops;
+	ep_priv->ep_fid.atomic = &gnix_ep_atomic_ops;
+
+	/* Init GNIX data. */
+	ep_priv->auth_key = auth_key;
+	ep_priv->type = info->ep_attr->type;
+	ep_priv->domain = domain_priv;
+	_gnix_ref_init(&ep_priv->ref_cnt, 1, __ep_destruct);
+	ep_priv->min_multi_recv = GNIX_OPT_MIN_MULTI_RECV_DEFAULT;
+	fastlock_init(&ep_priv->vc_lock);
+	ep_priv->progress_fn = NULL;
+	ep_priv->rx_progress_fn = NULL;
+	ep_priv->tx_enabled = false;
+	ep_priv->rx_enabled = false;
+	ep_priv->requires_lock = (domain_priv->thread_model !=
+				  FI_THREAD_COMPLETION);
+	ep_priv->info = fi_dupinfo(info);
+	ep_priv->info->addr_format = info->addr_format;
+
+	GNIX_DEBUG(FI_LOG_DEBUG, "ep(%p) is using addr_format(%s)\n", ep_priv,
+		  ep_priv->info->addr_format == FI_ADDR_STR ? "FI_ADDR_STR" :
+		  "FI_ADDR_GNI");
+
+	if (info->src_addr) {
+		memcpy(&ep_priv->src_addr, info->src_addr,
+		       sizeof(struct gnix_ep_name));
+	}
+
+	if (info->dest_addr) {
+		memcpy(&ep_priv->dest_addr, info->dest_addr,
+		       sizeof(struct gnix_ep_name));
+	}
+
+	ret = __init_tag_storages(ep_priv, GNIX_TAG_LIST,
+				  ep_priv->type == FI_EP_MSG ? 0 : 1);
+	if (ret)
+		goto err_tag_init;
+
+	ret = __fr_freelist_init(ep_priv);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			 "Error allocating gnix_fab_req freelist (%s)",
+			 fi_strerror(-ret));
+		goto err_fl_init;
+	}
+
+	ep_priv->shared_tx = (info->ep_attr->tx_ctx_cnt == FI_SHARED_CONTEXT) ?
+				true : false;
 	/*
-	 * TODO: need to implement other endpoint types
+	 * try out XPMEM
 	 */
-	if (!GNIX_EP_RDM_DGM(info->ep_attr->type))
-		return -FI_ENOSYS;
+	ret = _gnix_xpmem_handle_create(domain_priv,
+					&ep_priv->xpmem_hndl);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "_gnix_xpmem_handl_create returned %s\n",
+			  fi_strerror(-ret));
+	}
+
+	/* Initialize caps, modes, permissions, behaviors. */
+	ep_priv->caps = info->caps & GNIX_EP_CAPS_FULL;
+
+	if (ep_priv->info->tx_attr)
+		ep_priv->op_flags = ep_priv->info->tx_attr->op_flags;
+	if (ep_priv->info->rx_attr)
+		ep_priv->op_flags |= ep_priv->info->rx_attr->op_flags;
+	ep_priv->op_flags &= GNIX_EP_OP_FLAGS;
+
+	gnix_ep_caps(ep_priv, ep_priv->caps);
+
+	ret = _gnix_ep_nic_init(domain_priv, ep_priv->info, ep_priv);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "_gnix_ep_nic_init returned %d\n",
+			  ret);
+		goto err_nic_init;
+	}
+
+	/* Do EP type specific initialization. */
+	switch (ep_priv->type) {
+	case FI_EP_DGRAM:
+	case FI_EP_RDM:
+		ret = _gnix_ep_unconn_open(domain_priv, ep_priv->info, ep_priv);
+		if (ret != FI_SUCCESS) {
+			GNIX_INFO(FI_LOG_EP_CTRL,
+				  "_gnix_ep_unconn_open() failed, err: %d\n",
+				  ret);
+			goto err_type_init;
+		}
+		break;
+	case FI_EP_MSG:
+		ret = _gnix_ep_msg_open(domain_priv, ep_priv->info, ep_priv);
+		if (ret != FI_SUCCESS) {
+			GNIX_INFO(FI_LOG_EP_CTRL,
+				  "_gnix_ep_msg_open() failed, err: %d\n",
+				  ret);
+			goto err_type_init;
+		}
+		break;
+	default:
+		ret = -FI_EINVAL;
+		goto err_type_init;
+	}
+
+	_gnix_ref_get(ep_priv->domain);
+
+	*ep = &ep_priv->ep_fid;
+
+	return ret;
+
+err_type_init:
+	if (ep_priv->nic)
+		_gnix_nic_free(ep_priv->nic);
+	_gnix_cm_nic_free(ep_priv->cm_nic);
+err_nic_init:
+	if (ep_priv->xpmem_hndl) {
+		err_ret = _gnix_xpmem_handle_destroy(ep_priv->xpmem_hndl);
+		if (err_ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "_gnix_xpmem_handle_destroy returned %s\n",
+				  fi_strerror(-err_ret));
+		}
+	}
+
+	__fr_freelist_destroy(ep_priv);
+err_fl_init:
+	__destruct_tag_storages(ep_priv);
+err_tag_init:
+	free(ep_priv);
+
+	return ret;
+}
+
+int _gnix_ep_alloc(struct fid_domain *domain, struct fi_info *info,
+			   struct gnix_ep_attr *attr,
+			   struct fid_ep **ep, void *context)
+{
+	int ret = FI_SUCCESS;
+	int err_ret;
+	struct gnix_fid_domain *domain_priv;
+	struct gnix_fid_ep *ep_priv;
+	gnix_ht_key_t *key_ptr;
+	struct gnix_auth_key *auth_key;
+	uint32_t cdm_id;
+	bool free_list_inited = false;
+	struct gnix_nic_attr nic_attr = {0};
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	if ((domain == NULL) || (info == NULL) || (ep == NULL) ||
+	    (info->ep_attr == NULL))
+		return -FI_EINVAL;
 
 	domain_priv = container_of(domain, struct gnix_fid_domain, domain_fid);
 
-	ep_priv = calloc(1, sizeof *ep_priv);
+	if (info->ep_attr->auth_key_size) {
+		auth_key = GNIX_GET_AUTH_KEY(info->ep_attr->auth_key,
+				info->ep_attr->auth_key_size);
+		if (!auth_key)
+			return -FI_EINVAL;
+	} else {
+		auth_key = domain_priv->auth_key;
+		assert(auth_key);
+	}
+
+	ep_priv = calloc(1, sizeof(*ep_priv));
 	if (!ep_priv)
 		return -FI_ENOMEM;
 
+	ep_priv->auth_key = auth_key;
 
 	ep_priv->requires_lock = (domain_priv->thread_model !=
 				FI_THREAD_COMPLETION);
-	ret = __init_tag_storages(ep_priv, GNIX_TAG_LIST);
-	if (ret) {
-		goto err;
-	}
 
 	ep_priv->ep_fid.fid.fclass = FI_CLASS_EP;
 	ep_priv->ep_fid.fid.context = context;
@@ -1914,13 +2506,11 @@ DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 	ep_priv->ep_fid.ops = &gnix_ep_ops;
 	ep_priv->domain = domain_priv;
 	ep_priv->type = info->ep_attr->type;
+	ep_priv->info = fi_dupinfo(info);
 
 	_gnix_ref_init(&ep_priv->ref_cnt, 1, __ep_destruct);
 
-	fastlock_init(&ep_priv->recv_queue_lock);
-	fastlock_init(&ep_priv->tagged_queue_lock);
-
-	ep_priv->caps = info->caps & GNIX_EP_RDM_CAPS_FULL;
+	ep_priv->caps = info->caps & GNIX_EP_CAPS_FULL;
 
 	if (info->tx_attr)
 		ep_priv->op_flags = info->tx_attr->op_flags;
@@ -1930,6 +2520,38 @@ DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 
 	ep_priv->min_multi_recv = GNIX_OPT_MIN_MULTI_RECV_DEFAULT;
 
+	if (attr && attr->msg_ops)
+		ep_priv->ep_fid.msg = attr->msg_ops;
+	else
+		ep_priv->ep_fid.msg = &gnix_ep_msg_ops;
+
+	if (attr && attr->rma_ops)
+		ep_priv->ep_fid.rma = attr->rma_ops;
+	else
+		ep_priv->ep_fid.rma = &gnix_ep_rma_ops;
+
+	if (attr && attr->tagged_ops)
+		ep_priv->ep_fid.tagged = attr->tagged_ops;
+	else
+		ep_priv->ep_fid.tagged = &gnix_ep_tagged_ops;
+
+	if (attr && attr->atomic_ops)
+		ep_priv->ep_fid.atomic = attr->atomic_ops;
+	else
+		ep_priv->ep_fid.atomic = &gnix_ep_atomic_ops;
+
+	if (attr && attr->cm_ops)
+		ep_priv->ep_fid.cm = attr->cm_ops;
+	else
+		ep_priv->ep_fid.cm = &gnix_ep_ops_cm;
+
+	gnix_ep_caps(ep_priv, ep_priv->caps);
+
+	ret = __init_tag_storages(ep_priv, GNIX_TAG_LIST, 1);
+	if (ret) {
+		goto err;
+	}
+
 	ret = __fr_freelist_init(ep_priv);
 	if (ret != FI_SUCCESS) {
 		GNIX_WARN(FI_LOG_EP_CTRL,
@@ -1939,14 +2561,6 @@ DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 	} else
 		free_list_inited = true;
 
-	ep_priv->ep_fid.msg = &gnix_ep_msg_ops;
-	ep_priv->ep_fid.rma = &gnix_ep_rma_ops;
-	ep_priv->ep_fid.tagged = &gnix_ep_tagged_ops;
-	ep_priv->ep_fid.atomic = &gnix_ep_atomic_ops;
-	gnix_ep_caps(ep_priv, ep_priv->caps);
-
-	ep_priv->ep_fid.cm = &gnix_cm_ops;
-
 	/*
 	 * try out XPMEM
 	 */
@@ -1954,92 +2568,77 @@ DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 	ret = _gnix_xpmem_handle_create(domain_priv,
 					&ep_priv->xpmem_hndl);
 	if (ret != FI_SUCCESS) {
-		GNIX_WARN(FI_LOG_EP_CTRL, "_gnix_xpmem_handl_create returned %s\n",
+		GNIX_WARN(FI_LOG_EP_CTRL, "xpmem_handl_create returned %s\n",
 			  fi_strerror(-ret));
 	}
 
-	if (GNIX_EP_RDM_DGM(ep_priv->type)) {
-		name = (struct gnix_ep_name *)info->src_addr;
-		if ((name != NULL) &&
-			(name->name_type == GNIX_EPN_TYPE_BOUND)) {
+	if (attr && attr->cm_nic) {
+		ep_priv->cm_nic = attr->cm_nic;
+		_gnix_ref_get(ep_priv->cm_nic);
+	} else {
 
-			ret = __gnix_ep_bound_prep(domain_priv,
-						   info,
-						   ep_priv);
+		/*
+		 * if a cm_nic has not yet been allocated for this
+		 * domain, do it now.  Reuse the embedded gnix_nic
+		 * in the cm_nic as the nic for this endpoint
+		 * to reduce demand on Aries hw resources.
+		 */
+
+		fastlock_acquire(&domain_priv->cm_nic_lock);
+		if (domain_priv->cm_nic == NULL) {
+			ret = _gnix_cm_nic_alloc(domain_priv, info,
+						 cdm_id,
+						 ep_priv->auth_key,
+						 &domain_priv->cm_nic);
 			if (ret != FI_SUCCESS) {
 				GNIX_WARN(FI_LOG_EP_CTRL,
-				 "__gnix_ep_bound_prep returned error (%s)",
-				 fi_strerror(-ret));
+					"_gnix_cm_nic_alloc returned %s\n",
+					fi_strerror(-ret));
+				fastlock_release(
+					 &domain_priv->cm_nic_lock);
 				goto err;
 			}
+			ep_priv->cm_nic = domain_priv->cm_nic;
+			ep_priv->nic = ep_priv->cm_nic->nic;
+			_gnix_ref_get(ep_priv->nic);
 		} else {
-			fastlock_acquire(&domain_priv->cm_nic_lock);
-
-			/*
-			 * if a cm_nic has not yet been allocated for this
-			 * domain, do it now.  Reuse the embedded gnix_nic
-			 * in the cm_nic as the nic for this endpoint
-			 * to reduce demand on Aries hw resources.
-			 */
-			if (domain_priv->cm_nic == NULL) {
-				__gnix_ep_cm_nic_prep(domain_priv, info,
-						      &cdm_id);
-				if (ret != FI_SUCCESS) {
-					fastlock_release(
-						 &domain_priv->cm_nic_lock);
-					goto err;
-				}
-				ret = _gnix_cm_nic_alloc(domain_priv,
-							 info,
-							 cdm_id,
-							 &domain_priv->cm_nic);
-				if (ret != FI_SUCCESS) {
-					GNIX_WARN(FI_LOG_EP_CTRL,
-						"_gnix_cm_nic_alloc returned %s\n",
-						fi_strerror(-ret));
-					fastlock_release(
-						 &domain_priv->cm_nic_lock);
-					goto err;
-				}
-				ep_priv->cm_nic = domain_priv->cm_nic;
-				ep_priv->nic = ep_priv->cm_nic->nic;
-				_gnix_ref_get(ep_priv->nic);
-			} else {
-				ep_priv->cm_nic = domain_priv->cm_nic;
-				_gnix_ref_get(ep_priv->cm_nic);
-			}
+			ep_priv->cm_nic = domain_priv->cm_nic;
+			_gnix_ref_get(ep_priv->cm_nic);
+		}
 
-			fastlock_release(&domain_priv->cm_nic_lock);
+		fastlock_release(&domain_priv->cm_nic_lock);
 
-			ep_priv->my_name.gnix_addr.device_addr =
-				ep_priv->cm_nic->my_name.gnix_addr.device_addr;
-			ep_priv->my_name.cm_nic_cdm_id =
-				ep_priv->cm_nic->my_name.gnix_addr.cdm_id;
+	}
 
-			ret = _gnix_cm_nic_create_cdm_id(domain_priv, &cdm_id);
-			if (ret != FI_SUCCESS) {
-				GNIX_WARN(FI_LOG_EP_CTRL,
-					    "gnix_cm_nic_create_cdm_id returned %s\n",
-					     fi_strerror(-ret));
-				goto err;
-			}
-			ep_priv->my_name.gnix_addr.cdm_id = cdm_id;
-		}
+	ep_priv->src_addr.gnix_addr.device_addr =
+		ep_priv->cm_nic->my_name.gnix_addr.device_addr;
+	ep_priv->src_addr.cm_nic_cdm_id =
+		ep_priv->cm_nic->my_name.gnix_addr.cdm_id;
 
-		key_ptr = (gnix_ht_key_t *)&ep_priv->my_name.gnix_addr;
-		ret = _gnix_ht_insert(ep_priv->cm_nic->addr_to_ep_ht,
-				      *key_ptr,
-				      ep_priv);
-		if ((ret != FI_SUCCESS) && (ret != -FI_ENOSPC)) {
+	if (attr && attr->use_cdm_id) {
+		cdm_id = attr->cdm_id;
+	} else {
+		ret = _gnix_cm_nic_create_cdm_id(domain_priv, &cdm_id);
+		if (ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
-				  "__gnix_ht_insert returned %d\n",
-				  ret);
+				    "gnix_cm_nic_create_cdm_id returned %s\n",
+				     fi_strerror(-ret));
 			goto err;
 		}
-	} else {
-		ep_priv->cm_nic = NULL;
-		ep_priv->vc = NULL;
 	}
+	ep_priv->src_addr.gnix_addr.cdm_id = cdm_id;
+
+	key_ptr = (gnix_ht_key_t *)&ep_priv->src_addr.gnix_addr;
+	ret = _gnix_ht_insert(ep_priv->cm_nic->addr_to_ep_ht,
+			      *key_ptr,
+			      ep_priv);
+	if ((ret != FI_SUCCESS) && (ret != -FI_ENOSPC)) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "__gnix_ht_insert returned %d\n",
+			  ret);
+		goto err;
+	}
+
 	fastlock_init(&ep_priv->vc_lock);
 
 	ep_priv->progress_fn = NULL;
@@ -2047,14 +2646,23 @@ DIRECT_FN int gnix_ep_open(struct fid_domain *domain, struct fi_info *info,
 	ep_priv->tx_enabled = false;
 	ep_priv->rx_enabled = false;
 
-	if (ep_priv->nic == NULL) {
-		ret = gnix_nic_alloc(domain_priv, NULL, &ep_priv->nic);
+	if (attr && attr->nic) {
+		ep_priv->nic = attr->nic;
+	} else {
+		assert(ep_priv->nic == NULL);
+		nic_attr.auth_key = ep_priv->auth_key;
+
+		ret = gnix_nic_alloc(domain_priv, &nic_attr,
+			&ep_priv->nic);
 		if (ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
-				    "_gnix_nic_alloc call returned %d\n",
-				     ret);
+				    "gnix_nic_alloc call returned %d\n", ret);
 			goto err;
 		}
+		if (!(attr && attr->cm_nic)) {
+			ep_priv->cm_nic = domain_priv->cm_nic;
+		}
+		_gnix_ref_get(ep_priv->nic);
 	}
 
 	/*
@@ -2073,16 +2681,16 @@ err:
 		err_ret = _gnix_xpmem_handle_destroy(ep_priv->xpmem_hndl);
 		if (err_ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
-				  "_gnix_xpmem_handle_destroy returned %s\n",
-				  fi_strerror(-err_ret));
+					"_gnix_xpmem_handle_destroy returned %s\n",
+					fi_strerror(-err_ret));
 		}
 	}
 
 	err_ret = __destruct_tag_storages(ep_priv);
 	if (err_ret != FI_SUCCESS) {
 		GNIX_WARN(FI_LOG_EP_CTRL,
-			  "__destruct_tag_stroages returned %s\n",
-			  fi_strerror(-err_ret));
+				"__destruct_tag_stroages returned %s\n",
+				fi_strerror(-err_ret));
 	}
 
 	if (free_list_inited == true)
@@ -2092,8 +2700,8 @@ err:
 		err_ret = _gnix_cm_nic_free(ep_priv->cm_nic);
 		if (err_ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
-				  "_gnix_cm_nic_free returned %s\n",
-				  fi_strerror(-err_ret));
+					"_gnix_cm_nic_free returned %s\n",
+					fi_strerror(-err_ret));
 		}
 	}
 
@@ -2101,21 +2709,13 @@ err:
 		err_ret = _gnix_nic_free(ep_priv->nic);
 		if (err_ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
-				  "_gnix_nic_free returned %s\n",
-				  fi_strerror(-err_ret));
+					"_gnix_nic_free returned %s\n",
+					fi_strerror(-err_ret));
 		}
 	}
 
 	free(ep_priv);
 	return ret;
-
-}
-
-DIRECT_FN int gnix_passive_ep_open(struct fid_fabric *fabric,
-				   struct fi_info *info, struct fid_pep **pep,
-				   void *context)
-{
-	return -FI_ENOSYS;
 }
 
 static int __match_context(struct dlist_entry *item, const void *arg)
@@ -2145,13 +2745,9 @@ static inline struct gnix_fab_req *__find_tx_req(
 
 		while ((vc = (struct gnix_vc *)
 				_gnix_vec_iterator_next(&iter))) {
-			COND_ACQUIRE(vc->ep->requires_lock,
-				     &vc->tx_queue_lock);
 			entry = dlist_remove_first_match(&vc->tx_queue,
 							 __match_context,
 							 context);
-			COND_RELEASE(vc->ep->requires_lock,
-				     &vc->tx_queue_lock);
 
 			if (entry) {
 				req = container_of(entry,
@@ -2164,13 +2760,9 @@ static inline struct gnix_fab_req *__find_tx_req(
 		GNIX_HASHTABLE_ITERATOR(ep->vc_ht, iter);
 
 		while ((vc = _gnix_ht_iterator_next(&iter))) {
-			COND_ACQUIRE(vc->ep->requires_lock,
-				     &vc->tx_queue_lock);
 			entry = dlist_remove_first_match(&vc->tx_queue,
 							 __match_context,
 							 context);
-			COND_RELEASE(vc->ep->requires_lock,
-				     &vc->tx_queue_lock);
 
 			if (entry) {
 				req = container_of(entry,
@@ -2192,17 +2784,16 @@ static inline struct gnix_fab_req *__find_rx_req(
 {
 	struct gnix_fab_req *req = NULL;
 
-	COND_ACQUIRE(ep->requires_lock, &ep->recv_queue_lock);
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
 	req = _gnix_remove_req_by_context(&ep->posted_recv_queue, context);
-	COND_RELEASE(ep->requires_lock, &ep->recv_queue_lock);
-
-	if (req)
+	if (req) {
+		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
 		return req;
+	}
 
-	COND_ACQUIRE(ep->requires_lock, &ep->tagged_queue_lock);
 	req = _gnix_remove_req_by_context(&ep->tagged_posted_recv_queue,
 			context);
-	COND_RELEASE(ep->requires_lock, &ep->tagged_queue_lock);
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
 
 	return req;
 }
@@ -2269,7 +2860,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_cancel(fid_t fid, void *context)
 		flags = req->flags;
 
 		_gnix_cq_add_error(err_cq, context, flags, len, addr, 0 /* data */,
-				tag, len, FI_ECANCELED, FI_ECANCELED, 0);
+				tag, len, FI_ECANCELED, FI_ECANCELED, 0, 0);
 
 	}
 
@@ -2375,7 +2966,7 @@ __gnix_ep_ops_set_val(struct fid *fid, ep_ops_val_t t, void *val)
 
 			tag_type = (v) ? GNIX_TAG_HLIST : GNIX_TAG_LIST;
 
-			ret = __init_tag_storages(ep, tag_type);
+			ret = __init_tag_storages(ep, tag_type, 1);
 			if (ret)
 				return ret;
 
@@ -2427,6 +3018,10 @@ DIRECT_FN STATIC int gnix_ep_getopt(fid_t fid, int level, int optname,
 		*(size_t *)optval = gnix_ep->min_multi_recv;
 		*optlen = sizeof(size_t);
 		break;
+	case FI_OPT_CM_DATA_SIZE:
+		*(size_t *)optval = GNIX_CM_DATA_MAX_SIZE;
+		*optlen = sizeof(size_t);
+		break;
 	default:
 		return -FI_ENOPROTOOPT;
 	}
@@ -2450,6 +3045,11 @@ DIRECT_FN STATIC int gnix_ep_setopt(fid_t fid, int level, int optname,
 	case FI_OPT_MIN_MULTI_RECV:
 		if (optlen != sizeof(size_t))
 			return -FI_EINVAL;
+		/*
+		 * see issue 1120
+		 */
+		if (*(size_t *)optval == 0UL)
+			return -FI_EINVAL;
 		gnix_ep->min_multi_recv = *(size_t *)optval;
 		break;
 	default:
@@ -2470,7 +3070,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_rx_size_left(struct fid_ep *ep)
 						   ep_fid);
 
 	/* A little arbitrary... */
-	if (ep_priv->htd_pool.enabled == false) {
+	if (ep_priv->int_tx_pool.enabled == false) {
 		return -FI_EOPBADSTATE;
 	}
 
@@ -2500,7 +3100,7 @@ DIRECT_FN STATIC ssize_t gnix_ep_tx_size_left(struct fid_ep *ep)
 						   ep_fid);
 
 	/* A little arbitrary... */
-	if (ep_priv->htd_pool.enabled == false) {
+	if (ep_priv->int_tx_pool.enabled == false) {
 		return -FI_EOPBADSTATE;
 	}
 
@@ -2528,7 +3128,7 @@ DIRECT_FN STATIC int gnix_tx_context(struct fid_ep *ep, int index,
 
 __attribute__((unused))
 DIRECT_FN STATIC int gnix_rx_context(struct fid_ep *ep, int index,
-				     struct fi_tx_attr *attr,
+				     struct fi_rx_attr *attr,
 				     struct fid_ep **rx_ep, void *context)
 {
 	return -FI_ENOSYS;
diff --git a/prov/gni/src/gnix_eq.c b/prov/gni/src/gnix_eq.c
index 0fdd9b6..2a9be64 100644
--- a/prov/gni/src/gnix_eq.c
+++ b/prov/gni/src/gnix_eq.c
@@ -38,6 +38,13 @@
 #include "gnix.h"
 #include "gnix_eq.h"
 #include "gnix_util.h"
+#include "gnix_cm.h"
+
+/*******************************************************************************
+ * Global declarations
+ ******************************************************************************/
+DLIST_HEAD(gnix_eq_list);
+pthread_mutex_t gnix_eq_list_lock = PTHREAD_MUTEX_INITIALIZER;
 
 /*******************************************************************************
  * Forward declaration for ops structures.
@@ -49,6 +56,19 @@ static struct fi_ops gnix_fi_eq_ops;
 /*******************************************************************************
  * Helper functions.
  ******************************************************************************/
+
+static void gnix_eq_cleanup_err_bufs(struct gnix_fid_eq *eq, int free_all)
+{
+	struct gnix_eq_err_buf *ebuf, *tmp;
+
+	dlist_for_each_safe(&eq->err_bufs, ebuf, tmp, dlist) {
+		if (free_all || ebuf->do_free) {
+			dlist_remove(&ebuf->dlist);
+			free(ebuf);
+		}
+	}
+}
+
 static int gnix_eq_set_wait(struct gnix_fid_eq *eq)
 {
 	int ret = FI_SUCCESS;
@@ -61,18 +81,14 @@ static int gnix_eq_set_wait(struct gnix_fid_eq *eq)
 	};
 
 	switch (eq->attr.wait_obj) {
-	case FI_WAIT_FD:
-	case FI_WAIT_MUTEX_COND:
+	case FI_WAIT_UNSPEC:
 		ret = gnix_wait_open(&eq->fabric->fab_fid, &requested,
 				     &eq->wait);
 		break;
 	case FI_WAIT_SET:
 		ret = _gnix_wait_set_add(eq->attr.wait_set, &eq->eq_fid.fid);
-
-		if (ret)
-			return ret;
-
-		eq->wait = eq->attr.wait_set;
+		if (!ret)
+			eq->wait = eq->attr.wait_set;
 		break;
 	default:
 		break;
@@ -93,7 +109,7 @@ static int gnix_verify_eq_attr(struct fi_eq_attr *attr)
 		attr->size = GNIX_EQ_DEFAULT_SIZE;
 
 	/*
-	 * Initial implementation doesn't support any type of wait object.
+	 * We only support FI_WAIT_SET and FI_WAIT_UNSPEC
 	 */
 	switch (attr->wait_obj) {
 	case FI_WAIT_NONE:
@@ -106,15 +122,13 @@ static int gnix_verify_eq_attr(struct fi_eq_attr *attr)
 		}
 		break;
 	case FI_WAIT_UNSPEC:
-		attr->wait_obj = FI_WAIT_FD;
 		break;
 	case FI_WAIT_FD:
 	case FI_WAIT_MUTEX_COND:
-		break;
 	default:
 		GNIX_WARN(FI_LOG_EQ, "wait type: %d unsupported.\n",
 			  attr->wait_obj);
-		return -FI_EINVAL;
+		return -FI_ENOSYS;
 	}
 
 	return FI_SUCCESS;
@@ -155,26 +169,24 @@ err:
 	return NULL;
 }
 
-ssize_t _gnix_eq_write_error(struct fid_eq *eq, fid_t fid,
+ssize_t _gnix_eq_write_error(struct gnix_fid_eq *eq, fid_t fid,
 			     void *context, uint64_t index, int err,
 			     int prov_errno, void *err_data,
 			     size_t err_size)
 {
 	struct fi_eq_err_entry *error;
 	struct gnix_eq_entry *event;
-	struct gnix_fid_eq *eq_priv;
 	struct slist_entry *item;
+	struct gnix_eq_err_buf *err_buf;
 
 	ssize_t ret = FI_SUCCESS;
 
 	if (!eq)
 		return -FI_EINVAL;
 
-	eq_priv = container_of(eq, struct gnix_fid_eq, eq_fid);
+	fastlock_acquire(&eq->lock);
 
-	fastlock_acquire(&eq_priv->lock);
-
-	item = _gnix_queue_get_free(eq_priv->errors);
+	item = _gnix_queue_get_free(eq->errors);
 	if (!item) {
 		GNIX_WARN(FI_LOG_EQ, "error creating error entry\n");
 		ret = -FI_ENOMEM;
@@ -190,13 +202,33 @@ ssize_t _gnix_eq_write_error(struct fid_eq *eq, fid_t fid,
 	error->data = index;
 	error->err = err;
 	error->prov_errno = prov_errno;
-	error->err_data = err_data;
-	error->err_data_size = err_size;
 
-	_gnix_queue_enqueue(eq_priv->errors, &event->item);
+	if (err_size) {
+		err_buf = malloc(sizeof(struct gnix_eq_err_buf) + err_size);
+		if (!err_buf) {
+			_gnix_queue_enqueue_free(eq->errors, &event->item);
+			ret = -FI_ENOMEM;
+			goto err;
+		}
+		err_buf->do_free = 0;
+
+		memcpy(err_buf->buf, err_data, err_size);
+		error->err_data = err_buf->buf;
+		error->err_data_size = err_size;
+
+		dlist_insert_tail(&err_buf->dlist, &eq->err_bufs);
+	} else {
+		error->err_data = NULL;
+		error->err_data_size = 0;
+	}
+
+	_gnix_queue_enqueue(eq->errors, &event->item);
+
+	if (eq->wait)
+		_gnix_signal_wait_obj(eq->wait);
 
 err:
-	fastlock_release(&eq_priv->lock);
+	fastlock_release(&eq->lock);
 
 	return ret;
 }
@@ -204,6 +236,9 @@ err:
 static void __eq_destruct(void *obj)
 {
 	struct gnix_fid_eq *eq = (struct gnix_fid_eq *) obj;
+	pthread_mutex_lock(&gnix_eq_list_lock);
+	dlist_remove(&eq->gnix_fid_eq_list);
+	pthread_mutex_unlock(&gnix_eq_list_lock);
 
 	_gnix_ref_put(eq->fabric);
 
@@ -230,9 +265,104 @@ static void __eq_destruct(void *obj)
 	_gnix_queue_destroy(eq->events);
 	_gnix_queue_destroy(eq->errors);
 
+	gnix_eq_cleanup_err_bufs(eq, 1);
+
 	free(eq);
 }
 
+int _gnix_eq_poll_obj_add(struct gnix_fid_eq *eq, struct fid *obj_fid)
+{
+	struct gnix_eq_poll_obj *pobj;
+
+	COND_WRITE_ACQUIRE(eq->requires_lock, &eq->poll_obj_lock);
+
+	pobj = malloc(sizeof(struct gnix_eq_poll_obj));
+	if (!pobj) {
+		GNIX_WARN(FI_LOG_EQ, "Failed to add object to EQ poll list.\n");
+		COND_RW_RELEASE(eq->requires_lock, &eq->poll_obj_lock);
+		return -FI_ENOMEM;
+	}
+
+	pobj->obj_fid = obj_fid;
+	dlist_init(&pobj->list);
+	dlist_insert_tail(&pobj->list, &eq->poll_objs);
+
+	COND_RW_RELEASE(eq->requires_lock, &eq->poll_obj_lock);
+
+	GNIX_INFO(FI_LOG_EQ, "Added object(%d, %p) to EQ(%p) poll list\n",
+		  obj_fid->fclass, obj_fid, eq);
+
+	return FI_SUCCESS;
+}
+
+int _gnix_eq_poll_obj_rem(struct gnix_fid_eq *eq, struct fid *obj_fid)
+{
+	struct gnix_eq_poll_obj *pobj, *tmp;
+
+	COND_WRITE_ACQUIRE(eq->requires_lock, &eq->poll_obj_lock);
+
+	dlist_for_each_safe(&eq->poll_objs, pobj, tmp, list) {
+		if (pobj->obj_fid == obj_fid) {
+			dlist_remove(&pobj->list);
+			free(pobj);
+			GNIX_INFO(FI_LOG_EQ,
+				  "Removed object(%d, %p) from EQ(%p) poll list\n",
+				  pobj->obj_fid->fclass, pobj, eq);
+			COND_RW_RELEASE(eq->requires_lock, &eq->poll_obj_lock);
+			return FI_SUCCESS;
+		}
+	}
+
+	COND_RW_RELEASE(eq->requires_lock, &eq->poll_obj_lock);
+
+	GNIX_WARN(FI_LOG_EQ, "object not found on EQ poll list.\n");
+	return -FI_EINVAL;
+}
+
+int _gnix_eq_progress(struct gnix_fid_eq *eq)
+{
+	struct gnix_eq_poll_obj *pobj, *tmp;
+	int rc;
+	struct gnix_fid_pep *pep;
+	struct gnix_fid_ep *ep;
+
+	COND_READ_ACQUIRE(eq->requires_lock, &eq->poll_obj_lock);
+
+	dlist_for_each_safe(&eq->poll_objs, pobj, tmp, list) {
+		switch (pobj->obj_fid->fclass) {
+		case FI_CLASS_PEP:
+			pep = container_of(pobj->obj_fid, struct gnix_fid_pep,
+					   pep_fid.fid);
+			rc = _gnix_pep_progress(pep);
+			if (rc) {
+				GNIX_WARN(FI_LOG_EQ,
+					  "_gnix_pep_progress failed: %d\n",
+					  rc);
+			}
+			break;
+		case FI_CLASS_EP:
+			ep = container_of(pobj->obj_fid, struct gnix_fid_ep,
+					  ep_fid.fid);
+			rc = _gnix_ep_progress(ep);
+			if (rc) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "_gnix_ep_progress failed: %d\n",
+					  rc);
+			}
+			break;
+		default:
+			GNIX_WARN(FI_LOG_EQ,
+				  "invalid poll object: %d %p\n",
+				  pobj->obj_fid->fclass, pobj);
+			break;
+		}
+	}
+
+	COND_RW_RELEASE(eq->requires_lock, &eq->poll_obj_lock);
+
+	return FI_SUCCESS;
+}
+
 /*******************************************************************************
  * API function implementations.
  ******************************************************************************/
@@ -271,10 +401,16 @@ DIRECT_FN int gnix_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 	eq_priv->eq_fid.fid.context = context;
 	eq_priv->eq_fid.fid.ops = &gnix_fi_eq_ops;
 	eq_priv->eq_fid.ops = &gnix_eq_ops;
+	eq_priv->requires_lock = 1;
 	eq_priv->attr = *attr;
 
 	fastlock_init(&eq_priv->lock);
 
+	rwlock_init(&eq_priv->poll_obj_lock);
+	dlist_init(&eq_priv->poll_objs);
+
+	dlist_init(&eq_priv->err_bufs);
+
 	ret = gnix_eq_set_wait(eq_priv);
 	if (ret)
 		goto err1;
@@ -291,6 +427,11 @@ DIRECT_FN int gnix_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 		goto err2;
 
 	*eq = &eq_priv->eq_fid;
+
+	pthread_mutex_lock(&gnix_eq_list_lock);
+	dlist_insert_tail(&eq_priv->gnix_fid_eq_list, &gnix_eq_list);
+	pthread_mutex_unlock(&gnix_eq_list_lock);
+
 	return ret;
 
 err2:
@@ -325,8 +466,9 @@ DIRECT_FN STATIC int gnix_eq_close(struct fid *fid)
 	return FI_SUCCESS;
 }
 
-DIRECT_FN STATIC ssize_t gnix_eq_read(struct fid_eq *eq, uint32_t *event,
-				      void *buf, size_t len, uint64_t flags)
+static ssize_t __gnix_eq_sread(int blocking, struct fid_eq *eq,
+			       uint32_t *event, void *buf, size_t len,
+			       uint64_t flags, int timeout)
 {
 	struct gnix_fid_eq *eq_priv;
 	struct gnix_eq_entry *entry;
@@ -338,11 +480,29 @@ DIRECT_FN STATIC ssize_t gnix_eq_read(struct fid_eq *eq, uint32_t *event,
 
 	eq_priv = container_of(eq, struct gnix_fid_eq, eq_fid);
 
+	if ((blocking && !eq_priv->wait) ||
+	    (blocking && eq_priv->attr.wait_obj == FI_WAIT_SET)) {
+		GNIX_WARN(FI_LOG_EQ, "Invalid wait type\n");
+		return -FI_EINVAL;
+	}
+
+	gnix_eq_cleanup_err_bufs(eq_priv, 0);
+
+	_gnix_eq_progress(eq_priv);
+
 	if (_gnix_queue_peek(eq_priv->errors))
 		return -FI_EAVAIL;
 
+	if (eq_priv->wait)
+		gnix_wait_wait((struct fid_wait *) eq_priv->wait, timeout);
+
 	fastlock_acquire(&eq_priv->lock);
 
+	if (_gnix_queue_peek(eq_priv->errors)) {
+		read_size = -FI_EAVAIL;
+		goto err;
+	}
+
 	item = _gnix_queue_peek(eq_priv->events);
 
 	if (!item) {
@@ -377,36 +537,17 @@ err:
 	return read_size;
 }
 
+DIRECT_FN STATIC ssize_t gnix_eq_read(struct fid_eq *eq, uint32_t *event,
+				      void *buf, size_t len, uint64_t flags)
+{
+	return __gnix_eq_sread(0, eq, event, buf, len, flags, 0);
+}
+
 DIRECT_FN STATIC ssize_t gnix_eq_sread(struct fid_eq *eq, uint32_t *event,
 				       void *buf, size_t len, int timeout,
 				       uint64_t flags)
 {
-	double start_ms = 0.0, end_ms = 0.0;
-	int ret;
-
-	ret = gnix_eq_read(eq, event, buf, len, flags);
-	if (ret != -FI_EAGAIN)
-		return ret;
-
-	if (timeout > 0)
-		start_ms = fi_gettime_ms();
-
-	do {
-		usleep(1000);
-
-		ret = gnix_eq_read(eq, event, buf, len, flags);
-		if (ret != -FI_EAGAIN)
-			return ret;
-
-		if (timeout > 0) {
-			end_ms = fi_gettime_ms();
-			timeout -=  (end_ms - start_ms);
-			timeout = timeout < 0 ? 0 : timeout;
-			start_ms = end_ms;
-		}
-	} while (timeout);
-
-	return -FI_EAGAIN;
+	return __gnix_eq_sread(1, eq, event, buf, len, flags, timeout);
 }
 
 DIRECT_FN STATIC int gnix_eq_control(struct fid *eq, int command, void *arg)
@@ -416,7 +557,6 @@ DIRECT_FN STATIC int gnix_eq_control(struct fid *eq, int command, void *arg)
 
 	eq_priv = container_of(eq, struct gnix_fid_eq, eq_fid);
 	*/
-
 	switch (command) {
 	case FI_GETWAIT:
 		/* return _gnix_get_wait_obj(eq_priv->wait, arg); */
@@ -433,6 +573,8 @@ DIRECT_FN STATIC ssize_t gnix_eq_readerr(struct fid_eq *eq,
 	struct gnix_fid_eq *eq_priv;
 	struct gnix_eq_entry *entry;
 	struct slist_entry *item;
+	struct gnix_eq_err_buf *err_buf;
+	struct fi_eq_err_entry *fi_err;
 
 	ssize_t read_size = sizeof(*buf);
 
@@ -451,9 +593,18 @@ DIRECT_FN STATIC ssize_t gnix_eq_readerr(struct fid_eq *eq,
 	}
 
 	entry = container_of(item, struct gnix_eq_entry, item);
+	fi_err = (struct fi_eq_err_entry *)entry->the_entry;
 
 	memcpy(buf, entry->the_entry, read_size);
 
+	/* If removing an event with err_data, mark err buf to be freed during
+	 * the next EQ read. */
+	if (!(flags & FI_PEEK) && fi_err->err_data) {
+		err_buf = container_of(fi_err->err_data,
+				       struct gnix_eq_err_buf, buf);
+		err_buf->do_free = 1;
+	}
+
 	_gnix_queue_enqueue_free(eq_priv->errors, &entry->item);
 
 err:
@@ -487,6 +638,7 @@ DIRECT_FN STATIC ssize_t gnix_eq_write(struct fid_eq *eq, uint32_t event,
 
 	entry->the_entry = calloc(1, len);
 	if (!entry->the_entry) {
+		_gnix_queue_enqueue_free(eq_priv->events, &entry->item);
 		GNIX_WARN(FI_LOG_EQ, "error allocating buffer\n");
 		ret = -FI_ENOMEM;
 		goto err;
diff --git a/prov/gni/src/gnix_fabric.c b/prov/gni/src/gnix_fabric.c
index b677e59..3cb24b3 100644
--- a/prov/gni/src/gnix_fabric.c
+++ b/prov/gni/src/gnix_fabric.c
@@ -1,7 +1,8 @@
 /*
  * Copyright (c) 2014 Intel Corporation, Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -55,6 +56,7 @@
 
 #include "gnix.h"
 #include "gnix_nic.h"
+#include "gnix_cm.h"
 #include "gnix_cm_nic.h"
 #include "gnix_util.h"
 #include "gnix_nameserver.h"
@@ -76,6 +78,40 @@ static int gnix_def_gni_n_dgrams = 128;
 static int gnix_def_gni_n_wc_dgrams = 4;
 static uint64_t gnix_def_gni_datagram_timeouts = -1;
 
+static struct fi_ops gnix_fab_fi_ops;
+static struct fi_gni_ops_fab gnix_ops_fab;
+static struct fi_gni_auth_key_ops_fab gnix_fab_ak_ops;
+
+static int __gnix_auth_key_initialize(
+		uint8_t *auth_key,
+		size_t auth_key_size,
+		struct gnix_auth_key_attr *attr);
+static int __gnix_auth_key_set_val(
+		uint8_t *auth_key,
+		size_t auth_key_size,
+		gnix_auth_key_opt_t opt,
+		void *val);
+static int __gnix_auth_key_get_val(
+		uint8_t *auth_key,
+		size_t auth_key_size,
+		gnix_auth_key_opt_t opt,
+		void *val);
+
+#define GNIX_DEFAULT_USER_REGISTRATION_LIMIT 192
+#define GNIX_DEFAULT_PROV_REGISTRATION_LIMIT 64
+
+int gnix_default_user_registration_limit = GNIX_DEFAULT_USER_REGISTRATION_LIMIT;
+int gnix_default_prov_registration_limit = GNIX_DEFAULT_PROV_REGISTRATION_LIMIT;
+
+/* assume that the user will open additional fabrics later and that
+   ptag information will need to be retained for the lifetime of the
+   process. If the user sets this value, we can assume that they
+   intend to be done with libfabric when the last fabric instance
+   closes so that we can free the ptag information. */
+/* TODO: implement this such that the user give us more information
+	about teardown */
+int gnix_dealloc_aki_on_fabric_close = 0;
+
 const struct fi_fabric_attr gnix_fabric_attr = {
 	.fabric = NULL,
 	.name = NULL,
@@ -91,7 +127,7 @@ DIRECT_FN int gnix_fabric_trywait(struct fid_fabric *fabric, struct fid **fids,
 static struct fi_ops_fabric gnix_fab_ops = {
 	.size = sizeof(struct fi_ops_fabric),
 	.domain = gnix_domain_open,
-	.passive_ep = fi_no_passive_ep,
+	.passive_ep = gnix_pep_open,
 	.eq_open = gnix_eq_open,
 	.wait_open = gnix_wait_open,
 	.trywait = gnix_fabric_trywait
@@ -101,16 +137,24 @@ static void __fabric_destruct(void *obj)
 {
 	struct gnix_fid_fabric *fab = (struct gnix_fid_fabric *) obj;
 
-	/*
-	 * close the MR notifier
-	 */
-	(void) _gnix_notifier_close(&fab->mr_notifier);
-
 	_gnix_app_cleanup();
 
 	free(fab);
 }
 
+static int gnix_fab_ops_open(struct fid *fid, const char *ops_name,
+				uint64_t flags, void **ops, void *context)
+{
+	if (strcmp(ops_name, FI_GNI_FAB_OPS_1) == 0)
+		*ops = &gnix_ops_fab;
+	else if (strcmp(ops_name, FI_GNI_FAB_OPS_2) == 0)
+		*ops = &gnix_fab_ak_ops;
+	else
+		return -FI_EINVAL;
+
+	return 0;
+}
+
 static int gnix_fabric_close(fid_t fid)
 {
 	struct gnix_fid_fabric *fab;
@@ -127,14 +171,6 @@ static int gnix_fabric_close(fid_t fid)
 	return FI_SUCCESS;
 }
 
-static struct fi_ops gnix_fab_fi_ops = {
-	.size = sizeof(struct fi_ops),
-	.close = gnix_fabric_close,
-	.bind = fi_no_bind,
-	.control = fi_no_control,
-	.ops_open = fi_no_ops_open,
-};
-
 /*
  * define methods needed for the GNI fabric provider
  */
@@ -142,7 +178,6 @@ static int gnix_fabric_open(struct fi_fabric_attr *attr,
 			    struct fid_fabric **fabric,
 			    void *context)
 {
-	int ret;
 	struct gnix_fid_fabric *fab;
 
 	if (strcmp(attr->name, gnix_fab_name)) {
@@ -168,131 +203,21 @@ static int gnix_fabric_open(struct fi_fabric_attr *attr,
 	_gnix_ref_init(&fab->ref_cnt, 1, __fabric_destruct);
 	dlist_init(&fab->domain_list);
 
-	ret = _gnix_notifier_init(&fab->mr_notifier);
-	if (ret != FI_SUCCESS) {
-		return ret;
-	}
-
-	// TODO: open dynamically as needed
-	ret = _gnix_notifier_open(&fab->mr_notifier);
-	if (ret != FI_SUCCESS && ret != -FI_EBUSY) {
-		return ret;
-	}
-
 	*fabric = &fab->fab_fid;
 
 	return FI_SUCCESS;
 }
 
-static int gnix_getinfo(uint32_t version, const char *node, const char *service,
-			uint64_t flags, struct fi_info *hints,
-			struct fi_info **info)
+static struct fi_info *_gnix_allocinfo(void)
 {
-	int ret = 0;
-	uint32_t pe = -1;
-	uint32_t cpu_id = -1;
-	int ep_type_unspec = 1;
-	uint64_t mode = GNIX_FAB_MODES;
-	struct fi_info *gnix_info = NULL;
-	struct gnix_ep_name *dest_addr = NULL;
-	struct gnix_ep_name *src_addr = NULL;
-	struct gnix_ep_name *addr = NULL;
-	gni_return_t status;
+	struct fi_info *gnix_info;
 
-	/*
-	 * do an early check of hints if an app is trying to use
-	 * an addressing format we don't handle
-	 */
-
-	if (hints) {
-		switch (hints->addr_format) {
-		case FI_FORMAT_UNSPEC:
-		case FI_ADDR_GNI:
-			break;
-		default:
-			GNIX_INFO(FI_LOG_FABRIC,
-				"hints->addr_format=%d, supported=%d,%d.\n",
-				hints->addr_format, FI_FORMAT_UNSPEC, FI_ADDR_GNI);
-			ret = -FI_EADDRNOTAVAIL;
-			goto err;
-		}
-	}
-
-	addr = malloc(sizeof(*addr));
-	if (!addr) {
-		goto err;
-	}
-
-	/*
-	 * the code below for resolving a node/service to what
-	 * will be a gnix_ep_name address is not fully implemented,
-	 * but put a place holder in place
-	 */
-	if (node) {
-
-		/* resolve node/service to gnix_ep_name */
-		ret = gnix_resolve_name(node, service, flags, addr);
-		if (ret) {
-			goto err;
-		}
-
-		if (flags & FI_SOURCE) {
-			/* resolved address is the local address */
-			src_addr = addr;
-			if (hints && hints->dest_addr)
-				dest_addr = hints->dest_addr;
-		} else {
-			/* resolved address is a peer */
-			dest_addr = addr;
-			if (hints && hints->src_addr)
-				src_addr = hints->src_addr;
-		}
-	} else {
-		/*
-		 * okay per the man page, just fill in the src_addr
-		 */
-		src_addr = addr;
-
-		status = GNI_CdmGetNicAddress(0, &pe, &cpu_id);
-		if(status != GNI_RC_SUCCESS) {
-			GNIX_WARN(FI_LOG_FABRIC,
-				  "Unable to get NIC address.");
-				  ret = gnixu_to_fi_errno(status);
-			goto err;
-		}
-
-		if (pe == -1) {
-			GNIX_WARN(FI_LOG_FABRIC,
-				"Unable to acquire valid address for local Aries\n");
-			ret = -FI_EADDRNOTAVAIL;
-			goto err;
-		}
-
-		src_addr->gnix_addr.device_addr = pe;
-		src_addr->gnix_addr.cdm_id = 0;  /* just set this to zero */
-		src_addr->name_type = GNIX_EPN_TYPE_UNBOUND;
-	}
-
-	if (src_addr)
-		GNIX_INFO(FI_LOG_FABRIC, "src_pe: 0x%x src_port: 0x%lx\n",
-			  src_addr->gnix_addr.device_addr,
-			  src_addr->gnix_addr.cdm_id);
-	if (dest_addr)
-		GNIX_INFO(FI_LOG_FABRIC, "dest_pe: 0x%x dest_port: 0x%lx\n",
-			  dest_addr->gnix_addr.device_addr,
-			  dest_addr->gnix_addr.cdm_id);
-
-	/*
-	 * fill in the gnix_info struct
-	 */
 	gnix_info = fi_allocinfo();
 	if (gnix_info == NULL) {
-		goto err;
+		return NULL;
 	}
 
-	/*
-	 * Set the default values
-	 */
+	gnix_info->caps = GNIX_EP_CAPS_FULL;
 	gnix_info->tx_attr->op_flags = 0;
 	gnix_info->rx_attr->op_flags = 0;
 	gnix_info->ep_attr->type = FI_EP_RDM;
@@ -307,22 +232,35 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 	gnix_info->domain_attr->control_progress = FI_PROGRESS_AUTO;
 	gnix_info->domain_attr->data_progress = FI_PROGRESS_AUTO;
 	gnix_info->domain_attr->av_type = FI_AV_UNSPEC;
-	gnix_info->domain_attr->tx_ctx_cnt = gnix_max_nics_per_ptag;
-	/* only one aries per node */
+	/*
+	 * the cm_nic currently sucks up one of the gnix_nic's so
+	 * we have to subtract one from the gnix_max_nics_per_ptag.
+	 */
+	gnix_info->domain_attr->tx_ctx_cnt = (gnix_max_nics_per_ptag == 1) ?
+						1 : gnix_max_nics_per_ptag - 1;
+	gnix_info->domain_attr->rx_ctx_cnt = gnix_max_nics_per_ptag;
+	gnix_info->domain_attr->cntr_cnt = _gnix_get_cq_limit() / 2;
+	gnix_info->domain_attr->cq_cnt = _gnix_get_cq_limit() / 2;
+	gnix_info->domain_attr->ep_cnt = SIZE_MAX;
+
 	gnix_info->domain_attr->name = strdup(gnix_dom_name);
 	gnix_info->domain_attr->cq_data_size = sizeof(uint64_t);
-	gnix_info->domain_attr->mr_mode = FI_MR_BASIC;
+	gnix_info->domain_attr->mr_mode = FI_MR_BASIC | OFI_MR_BASIC_MAP;
 	gnix_info->domain_attr->resource_mgmt = FI_RM_ENABLED;
-	gnix_info->domain_attr->mr_key_size = sizeof(uint64_t),
+	gnix_info->domain_attr->mr_key_size = sizeof(uint64_t);
+	gnix_info->domain_attr->max_ep_tx_ctx = GNIX_SEP_MAX_CNT;
+	gnix_info->domain_attr->max_ep_rx_ctx = GNIX_SEP_MAX_CNT;
+	gnix_info->domain_attr->mr_iov_limit = 1;
+	gnix_info->domain_attr->caps = GNIX_DOM_CAPS;
+	gnix_info->domain_attr->mode = 0;
+	gnix_info->domain_attr->mr_cnt = 65535;
 
 	gnix_info->next = NULL;
 	gnix_info->addr_format = FI_ADDR_GNI;
 	gnix_info->src_addrlen = sizeof(struct gnix_ep_name);
 	gnix_info->dest_addrlen = sizeof(struct gnix_ep_name);
-	gnix_info->src_addr = src_addr;
-	gnix_info->dest_addr = dest_addr;
-	/* prov_name gets filled in by fi_getinfo from the gnix_prov struct */
-	/* let's consider gni copyrighted :) */
+	gnix_info->src_addr = NULL;
+	gnix_info->dest_addr = NULL;
 
 	gnix_info->tx_attr->msg_order = FI_ORDER_SAS;
 	gnix_info->tx_attr->comp_order = FI_ORDER_NONE;
@@ -335,26 +273,180 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 	gnix_info->rx_attr->size = GNIX_RX_SIZE_DEFAULT;
 	gnix_info->rx_attr->iov_limit = GNIX_MAX_MSG_IOV_LIMIT;
 
-	if (hints) {
-		if (hints->ep_attr) {
-			/*
-			 * support FI_EP_RDM, FI_EP_DGRAM endpoint types
-			 */
-			switch (hints->ep_attr->type) {
-			case FI_EP_UNSPEC:
-				break;
-			case FI_EP_RDM:
-			case FI_EP_DGRAM:
-				gnix_info->ep_attr->type = hints->ep_attr->type;
-				ep_type_unspec = 0;
-				break;
-			default:
+	return gnix_info;
+}
+
+static int __gnix_getinfo_resolve_node(const char *node, const char *service,
+				       uint64_t flags, struct fi_info *hints,
+				       struct fi_info *info)
+{
+	int ret;
+	struct gnix_ep_name *dest_addr = NULL;
+	struct gnix_ep_name *src_addr = NULL;
+	bool is_fi_addr_str = false;
+
+	/* TODO: Add version check when we decide on how to do it */
+	if (hints && hints->addr_format == FI_ADDR_STR) {
+		is_fi_addr_str = true;
+	}
+
+	if (unlikely(is_fi_addr_str && node && service)) {
+		GNIX_WARN(FI_LOG_FABRIC, "service parameter must be NULL when "
+			"node parameter is not and using FI_ADDR_STR.\n");
+		return -FI_EINVAL;
+	}
+
+	if (flags & FI_SOURCE) {
+		/* -resolve node/port to make info->src_addr
+		 * -ignore hints->src_addr
+		 * -copy hints->dest_addr to output info */
+		src_addr = malloc(sizeof(*src_addr));
+		if (!src_addr) {
+			ret = -FI_ENOMEM;
+			goto err;
+		}
+
+		if (is_fi_addr_str) {
+			ret = _gnix_ep_name_from_str(node, src_addr);
+		} else {
+			ret = _gnix_resolve_name(node, service, flags,
+						 src_addr);
+		}
+
+		if (ret != FI_SUCCESS) {
+			ret = -FI_ENODATA;
+			goto err;
+		}
+
+		if (hints && hints->dest_addr) {
+			dest_addr = malloc(sizeof(*dest_addr));
+			if (!dest_addr) {
+				ret = -FI_ENOMEM;
 				goto err;
 			}
 
-			/*
-			 * only support FI_PROTO_GNI protocol
-			 */
+			memcpy(dest_addr, hints->dest_addr,
+			       hints->dest_addrlen);
+		}
+	} else {
+		/* -try to resolve node/port to make info->dest_addr
+		 * -fallback to copying hints->dest_addr to output info
+		 * -try to copy hints->src_addr to output info
+		 * -falback to finding src_addr for output info */
+		if (node || service) {
+			dest_addr = malloc(sizeof(*dest_addr));
+			if (!dest_addr) {
+				ret = -FI_ENOMEM;
+				goto err;
+			}
+
+			if (is_fi_addr_str) {
+				ret = _gnix_ep_name_from_str(node, dest_addr);
+			} else {
+				ret = _gnix_resolve_name(node, service, flags,
+							 dest_addr);
+			}
+
+			if (ret != FI_SUCCESS) {
+				ret = -FI_ENODATA;
+				goto err;
+			}
+		} else {
+			if (hints && hints->dest_addr) {
+				dest_addr = malloc(sizeof(*dest_addr));
+				if (!dest_addr) {
+					ret = -FI_ENOMEM;
+					goto err;
+				}
+
+				memcpy(dest_addr, hints->dest_addr,
+				       hints->dest_addrlen);
+			}
+		}
+
+		if (hints && hints->src_addr) {
+			src_addr = malloc(sizeof(*src_addr));
+			if (!src_addr) {
+				ret = -FI_ENOMEM;
+				goto err;
+			}
+
+			memcpy(src_addr, hints->src_addr, hints->src_addrlen);
+		} else {
+			src_addr = malloc(sizeof(*src_addr));
+			if (!src_addr) {
+				ret = -FI_ENOMEM;
+				goto err;
+			}
+
+			ret = _gnix_src_addr(src_addr);
+			if (ret != FI_SUCCESS)
+				goto err;
+		}
+	}
+
+	GNIX_INFO(FI_LOG_FABRIC, "%snode: %s service: %s\n",
+		  flags & FI_SOURCE ? "(FI_SOURCE) " : "", node, service);
+
+	if (src_addr)
+		GNIX_INFO(FI_LOG_FABRIC, "src_pe: 0x%x src_port: 0x%lx\n",
+			  src_addr->gnix_addr.device_addr,
+			  src_addr->gnix_addr.cdm_id);
+	if (dest_addr)
+		GNIX_INFO(FI_LOG_FABRIC, "dest_pe: 0x%x dest_port: 0x%lx\n",
+			  dest_addr->gnix_addr.device_addr,
+			  dest_addr->gnix_addr.cdm_id);
+
+	if (src_addr) {
+		info->src_addr = src_addr;
+		info->src_addrlen = sizeof(*src_addr);
+	}
+
+	if (dest_addr) {
+		info->dest_addr = dest_addr;
+		info->dest_addrlen = sizeof(*dest_addr);
+	}
+
+	return FI_SUCCESS;
+
+err:
+	free(src_addr);
+	free(dest_addr);
+
+	return ret;
+}
+
+static int _gnix_ep_getinfo(enum fi_ep_type ep_type, uint32_t version,
+			    const char *node, const char *service,
+			    uint64_t flags, struct fi_info *hints,
+			    struct fi_info **info)
+{
+	uint64_t mode = GNIX_FAB_MODES;
+	struct fi_info *gnix_info = NULL;
+	int ret = -FI_ENODATA;
+
+	GNIX_TRACE(FI_LOG_FABRIC, "\n");
+
+	if ((hints && hints->ep_attr) &&
+	    (hints->ep_attr->type != FI_EP_UNSPEC &&
+	     hints->ep_attr->type != ep_type)) {
+		return -FI_ENODATA;
+	}
+
+	gnix_info = _gnix_allocinfo();
+	if (!gnix_info)
+		return -FI_ENOMEM;
+
+	gnix_info->ep_attr->type = ep_type;
+
+	if (hints) {
+		/* TODO: Add version check when we decide on how to do it */
+		if (hints->addr_format == FI_ADDR_STR) {
+			gnix_info->addr_format = FI_ADDR_STR;
+		}
+
+		if (hints->ep_attr) {
+			/* Only support FI_PROTO_GNI protocol. */
 			switch (hints->ep_attr->protocol) {
 			case FI_PROTO_UNSPEC:
 			case FI_PROTO_GNI:
@@ -363,19 +455,28 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 				goto err;
 			}
 
-			if (hints->ep_attr->tx_ctx_cnt > 1) {
+			if ((hints->ep_attr->tx_ctx_cnt > GNIX_SEP_MAX_CNT) &&
+				(hints->ep_attr->tx_ctx_cnt !=
+						FI_SHARED_CONTEXT)) {
 				goto err;
 			}
 
-			if (hints->ep_attr->rx_ctx_cnt > 1) {
+			if (hints->ep_attr->rx_ctx_cnt > GNIX_SEP_MAX_CNT)
 				goto err;
-			}
 
-			if (hints->ep_attr->max_msg_size > GNIX_MAX_MSG_SIZE) {
+			if (hints->ep_attr->tx_ctx_cnt)
+				gnix_info->ep_attr->tx_ctx_cnt =
+					hints->ep_attr->tx_ctx_cnt;
+			if (hints->ep_attr->rx_ctx_cnt)
+				gnix_info->ep_attr->rx_ctx_cnt =
+					hints->ep_attr->rx_ctx_cnt;
+
+			if (hints->ep_attr->max_msg_size > GNIX_MAX_MSG_SIZE)
 				goto err;
-			}
 		}
 
+		GNIX_DEBUG(FI_LOG_FABRIC, "Passed EP attributes check\n");
+
 		/*
 		 * check the mode field
 		 */
@@ -384,24 +485,23 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 				goto err;
 			}
 			mode = hints->mode & ~GNIX_FAB_MODES_CLEAR;
+			if (FI_VERSION_LT(version, FI_VERSION(1, 5))) {
+				mode = hints->mode & ~FI_NOTIFY_FLAGS_ONLY;
+			}
 		}
 
-		if (!hints->caps) {
-			/* Return all supported capabilities. */
-			gnix_info->caps = GNIX_EP_RDM_CAPS_FULL;
-		} else {
+		GNIX_DEBUG(FI_LOG_FABRIC, "Passed mode check\n");
+
+		if (hints->caps) {
 			/* The provider must support all requested
 			 * capabilities. */
-			if ((hints->caps & GNIX_EP_RDM_CAPS_FULL) !=
-			    hints->caps) {
+			if ((hints->caps & GNIX_EP_CAPS_FULL) != hints->caps)
 				goto err;
-			}
-
-			/* The provider may silently enable secondary
-			 * capabilities that do not introduce any overhead. */
-			gnix_info->caps = hints->caps | GNIX_EP_RDM_SEC_CAPS;
 		}
 
+		GNIX_DEBUG(FI_LOG_FABRIC, "Passed caps check gnix_info->caps = 0x%016lx\n",
+			   gnix_info->caps);
+
 		if (hints->tx_attr) {
 			if ((hints->tx_attr->op_flags & GNIX_EP_OP_FLAGS) !=
 				hints->tx_attr->op_flags) {
@@ -415,6 +515,8 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 				hints->tx_attr->op_flags & GNIX_EP_OP_FLAGS;
 		}
 
+		GNIX_DEBUG(FI_LOG_FABRIC, "Passed TX attributes check\n");
+
 		if (hints->rx_attr) {
 			if ((hints->rx_attr->op_flags & GNIX_EP_OP_FLAGS) !=
 					hints->rx_attr->op_flags) {
@@ -431,6 +533,8 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 			goto err;
 		}
 
+		GNIX_DEBUG(FI_LOG_FABRIC, "Passed fabric name check\n");
+
 		if (hints->domain_attr) {
 			if (hints->domain_attr->name &&
 			    strncmp(hints->domain_attr->name, gnix_dom_name,
@@ -448,16 +552,20 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 				gnix_info->domain_attr->data_progress =
 					hints->domain_attr->data_progress;
 
-			switch (hints->domain_attr->mr_mode) {
-			case FI_MR_UNSPEC:
-			case FI_MR_BASIC:
-				gnix_info->domain_attr->mr_mode =
-					hints->domain_attr->mr_mode;
-				break;
-			case FI_MR_SCALABLE:
+			if (ofi_check_mr_mode(version,
+					gnix_info->domain_attr->mr_mode,
+					hints->domain_attr->mr_mode) != FI_SUCCESS) {
+				GNIX_DEBUG(FI_LOG_FABRIC,
+					"failed mr_mode check\n");
 				goto err;
 			}
 
+			if (FI_VERSION_LT(version, FI_VERSION(1, 5)))
+				gnix_info->domain_attr->mr_mode = FI_MR_BASIC;
+			else
+				gnix_info->domain_attr->mr_mode =
+					hints->domain_attr->mr_mode;
+
 			switch (hints->domain_attr->threading) {
 			case FI_THREAD_COMPLETION:
 				gnix_info->domain_attr->threading =
@@ -467,15 +575,44 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 				break;
 			}
 
-			ret = fi_check_domain_attr(&gnix_prov,
-						   gnix_info->domain_attr,
-						   hints->domain_attr,
-						   FI_MATCH_EXACT);
-			if (ret)
+			if (hints->domain_attr->caps) {
+				if (hints->domain_attr->caps & ~GNIX_DOM_CAPS) {
+					GNIX_WARN(FI_LOG_FABRIC,
+						  "Invalid domain caps\n");
+					goto err;
+				}
+
+				gnix_info->domain_attr->caps =
+					hints->domain_attr->caps;
+			}
+
+			ret = ofi_check_domain_attr(&gnix_prov, version,
+						    gnix_info->domain_attr,
+						    hints->domain_attr);
+			if (ret) {
+				GNIX_WARN(FI_LOG_FABRIC,
+						  "GNI failed domain attributes check\n");
 				goto err;
+			}
+
+			GNIX_DEBUG(FI_LOG_FABRIC, "Passed the domain attributes check\n");
 		}
 	}
 
+	ret = __gnix_getinfo_resolve_node(node, service, flags, hints,
+					  gnix_info);
+	if (ret != FI_SUCCESS)
+		goto err;
+
+	ofi_alter_info(gnix_info, hints, version);
+
+	/* The provider may silently enable secondary
+	 * capabilities that do not introduce any overhead. */
+	if (hints && hints->caps)
+	    gnix_info->caps = hints->caps | GNIX_EP_SEC_CAPS;
+	else
+		gnix_info->caps = GNIX_EP_CAPS_FULL | GNIX_EP_SEC_CAPS;
+
 	gnix_info->mode = mode;
 	gnix_info->fabric_attr->name = strdup(gnix_fab_name);
 	gnix_info->tx_attr->caps = gnix_info->caps;
@@ -483,37 +620,50 @@ static int gnix_getinfo(uint32_t version, const char *node, const char *service,
 	gnix_info->rx_attr->caps = gnix_info->caps;
 	gnix_info->rx_attr->mode = gnix_info->mode;
 
-	if (ep_type_unspec) {
-		struct fi_info *dg_info = fi_dupinfo(gnix_info);
+	*info = gnix_info;
 
-		if (!dg_info) {
-			GNIX_WARN(FI_LOG_FABRIC, "cannot copy info\n");
-			goto err;
-		}
+	GNIX_DEBUG(FI_LOG_FABRIC, "Returning EP type: %s\n",
+		   fi_tostr(&ep_type, FI_TYPE_EP_TYPE));
+	return FI_SUCCESS;
+err:
+	fi_freeinfo(gnix_info);
+	return ret;
+}
 
-		dg_info->ep_attr->type = FI_EP_DGRAM;
-		gnix_info->next = dg_info;
+static int gnix_getinfo(uint32_t version, const char *node, const char *service,
+			uint64_t flags, struct fi_info *hints,
+			struct fi_info **info)
+{
+	int ret = 0;
+	struct fi_info *info_ptr;
+
+	/* Note that info entries are added to the head of 'info', that is,
+	 * they are preferred in the reverse order shown here. */
+
+	*info = NULL;
+
+	ret = _gnix_ep_getinfo(FI_EP_MSG, version, node, service, flags,
+			       hints, &info_ptr);
+	if (ret == FI_SUCCESS) {
+		info_ptr->next = *info;
+		*info = info_ptr;
 	}
 
-	*info = gnix_info;
+	ret = _gnix_ep_getinfo(FI_EP_DGRAM, version, node, service, flags,
+			       hints, &info_ptr);
+	if (ret == FI_SUCCESS) {
+		info_ptr->next = *info;
+		*info = info_ptr;
+	}
 
-	return 0;
-err:
-	if (gnix_info) {
-		if (gnix_info->tx_attr) free(gnix_info->tx_attr);
-		if (gnix_info->rx_attr) free(gnix_info->rx_attr);
-		if (gnix_info->ep_attr) free(gnix_info->ep_attr);
-		if (gnix_info->domain_attr) free(gnix_info->domain_attr);
-		if (gnix_info->fabric_attr) free(gnix_info->fabric_attr);
-		free(gnix_info);
+	ret = _gnix_ep_getinfo(FI_EP_RDM, version, node, service, flags,
+			       hints, &info_ptr);
+	if (ret == FI_SUCCESS) {
+		info_ptr->next = *info;
+		*info = info_ptr;
 	}
 
-	/*
-	 *  for the getinfo method, we need to return -FI_ENODATA  otherwise
-	 *  the fi_getinfo call will make an early exit without querying
-	 *  other providers which may be avaialble.
-	 */
-	return -FI_ENODATA;
+	return *info ? FI_SUCCESS : -FI_ENODATA;
 }
 
 static void gnix_fini(void)
@@ -523,7 +673,7 @@ static void gnix_fini(void)
 struct fi_provider gnix_prov = {
 	.name = gnix_prov_name,
 	.version = FI_VERSION(GNI_MAJOR_VERSION, GNI_MINOR_VERSION),
-	.fi_version = FI_VERSION(1, 3),
+	.fi_version = FI_VERSION(1, 5),
 	.getinfo = gnix_getinfo,
 	.fabric = gnix_fabric_open,
 	.cleanup = gnix_fini
@@ -535,7 +685,6 @@ GNI_INI
 	gni_return_t status;
 	gni_version_info_t lib_version;
 	int num_devices;
-	int rc;
 
 	/*
 	 * if no GNI devices available, don't register as provider
@@ -545,6 +694,11 @@ GNI_INI
 		return NULL;
 	}
 
+	/*
+	 * ensure all globals are properly initialized
+	 */
+	_gnix_init();
+
 	/* sanity check that the 1 aries/node holds */
 	assert(num_devices == 1);
 
@@ -559,30 +713,261 @@ GNI_INI
 		provider = &gnix_prov;
 	}
 
-	rc = _gnix_nics_per_rank(&gnix_max_nics_per_ptag);
-	if (rc == FI_SUCCESS) {
-		GNIX_INFO(FI_LOG_FABRIC, "gnix_max_nics_per_ptag: %u\n",
-			  gnix_max_nics_per_ptag);
-	} else {
-		GNIX_WARN(FI_LOG_FABRIC, "_gnix_nics_per_rank failed: %d\n",
-			  rc);
-	}
+	/* Initialize global MR notifier. */
+	_gnix_notifier_init();
 
-	if (getenv("GNIX_MAX_NICS") != NULL)
-		gnix_max_nics_per_ptag = atoi(getenv("GNIX_MAX_NICS"));
+	/* Initialize global NIC data. */
+	_gnix_nic_init();
 
 	if (getenv("GNIX_DISABLE_XPMEM") != NULL)
 		gnix_xpmem_disabled = true;
 
-	/*
-	 * well if we didn't get 1 nic, that means we must really be doing
-	 * FMA sharing.
-	 */
+	return (provider);
+}
+
+static int
+__gnix_fab_ops_get_val(struct fid *fid, fab_ops_val_t t, void *val)
+{
+	GNIX_TRACE(FI_LOG_FABRIC, "\n");
+
+	assert(val);
 
-	if (gnix_max_nics_per_ptag == 0) {
-		gnix_max_nics_per_ptag = 1;
-		GNIX_WARN(FI_LOG_FABRIC, "Using inter-procss FMA sharing\n");
+	if (fid->fclass != FI_CLASS_FABRIC) {
+		GNIX_WARN(FI_LOG_FABRIC, "Invalid fabric\n");
+		return -FI_EINVAL;
 	}
 
-	return (provider);
+	switch (t) {
+	case GNI_WAIT_THREAD_SLEEP:
+		*(uint32_t *)val = gnix_wait_thread_sleep_time;
+		break;
+	case GNI_DEFAULT_USER_REGISTRATION_LIMIT:
+		*(uint32_t *)val = gnix_default_user_registration_limit;
+		break;
+	case GNI_DEFAULT_PROV_REGISTRATION_LIMIT:
+		*(uint32_t *)val = gnix_default_prov_registration_limit;
+		break;
+	default:
+		GNIX_WARN(FI_LOG_FABRIC, ("Invalid fab_ops_val\n"));
+	}
+
+	return FI_SUCCESS;
+}
+
+static int
+__gnix_fab_ops_set_val(struct fid *fid, fab_ops_val_t t, void *val)
+{
+	int v;
+
+	assert(val);
+
+	if (fid->fclass != FI_CLASS_FABRIC) {
+		GNIX_WARN(FI_LOG_FABRIC, "Invalid fabric\n");
+		return -FI_EINVAL;
+	}
+
+	switch (t) {
+	case GNI_WAIT_THREAD_SLEEP:
+		v = *(uint32_t *) val;
+		gnix_wait_thread_sleep_time = v;
+		break;
+	case GNI_DEFAULT_USER_REGISTRATION_LIMIT:
+		v = *(uint32_t *) val;
+		if (v > GNIX_MAX_SCALABLE_REGISTRATIONS) {
+			GNIX_ERR(FI_LOG_FABRIC,
+				"User specified an invalid user registration "
+				"limit, requested=%d maximum=%d\n",
+				v, GNIX_MAX_SCALABLE_REGISTRATIONS);
+			return -FI_EINVAL;
+		}
+		gnix_default_user_registration_limit = v;
+		break;
+	case GNI_DEFAULT_PROV_REGISTRATION_LIMIT:
+		v = *(uint32_t *) val;
+		if (v > GNIX_MAX_SCALABLE_REGISTRATIONS) {
+			GNIX_ERR(FI_LOG_FABRIC,
+				"User specified an invalid prov registration "
+				"limit, requested=%d maximum=%d\n",
+				v, GNIX_MAX_SCALABLE_REGISTRATIONS);
+			return -FI_EINVAL;
+		}
+		gnix_default_prov_registration_limit = v;
+		break;
+	default:
+		GNIX_WARN(FI_LOG_FABRIC, ("Invalid fab_ops_val\n"));
+		return -FI_EINVAL;
+	}
+
+	return FI_SUCCESS;
 }
+
+static int __gnix_auth_key_initialize(
+	uint8_t *auth_key,
+	size_t auth_key_size,
+	struct gnix_auth_key_attr *attr)
+{
+	struct gnix_auth_key *info = NULL;
+	int ret = FI_SUCCESS;
+
+	info = _gnix_auth_key_lookup(auth_key, auth_key_size);
+
+	if (info) {
+		GNIX_WARN(FI_LOG_FABRIC, "authorization key is already "
+			"initialized, auth_key=%d auth_key_size=%d\n",
+			auth_key, auth_key_size);
+		return -FI_ENOSPC; /* already initialized*/
+	}
+
+	info = _gnix_auth_key_alloc();
+	if (!info)
+		return -FI_ENOMEM;
+
+	if (attr)
+		info->attr = *attr;
+	else {
+		info->attr.user_key_limit =
+			gnix_default_user_registration_limit;
+		info->attr.prov_key_limit =
+			gnix_default_prov_registration_limit;
+	}
+
+	ret = _gnix_auth_key_insert(auth_key, auth_key_size, info);
+	if (ret) {
+		GNIX_INFO(FI_LOG_FABRIC, "failed to insert authorization key"
+			", key=%p len=%d ret=%d\n",
+			auth_key, auth_key_size, ret);
+		_gnix_auth_key_free(info);
+		info = NULL;
+	}
+
+	return ret;
+}
+
+static int __gnix_auth_key_set_val(
+	uint8_t *auth_key,
+	size_t auth_key_size,
+	gnix_auth_key_opt_t opt,
+	void *val)
+{
+	struct gnix_auth_key *info;
+	int v;
+	int ret = FI_SUCCESS;
+
+	if (!val)
+		return -FI_EINVAL;
+
+	info = _gnix_auth_key_lookup(auth_key, auth_key_size);
+
+	if (!info) {
+		ret = __gnix_auth_key_initialize(auth_key, auth_key_size, NULL);
+		assert(ret == FI_SUCCESS);
+
+		info = _gnix_auth_key_lookup(auth_key, auth_key_size);
+		assert(info);
+	}
+
+	/* if the limits have already been set, and the user is
+	 * trying to modify it, kick it back */
+	if (opt == GNIX_USER_KEY_LIMIT || opt == GNIX_PROV_KEY_LIMIT) {
+		fastlock_acquire(&info->lock);
+		if (info->enabled) {
+			fastlock_release(&info->lock);
+			GNIX_INFO(FI_LOG_FABRIC, "authorization key already "
+				"enabled and cannot be modified\n");
+			return -FI_EAGAIN;
+		}
+	}
+
+	switch (opt) {
+	case GNIX_USER_KEY_LIMIT:
+		v = *(int *) val;
+		if (v >= GNIX_MAX_SCALABLE_REGISTRATIONS) {
+			GNIX_ERR(FI_LOG_FABRIC,
+				"User is requesting more registrations than is present on node\n");
+			ret = -FI_EINVAL;
+		} else
+			info->attr.user_key_limit = v;
+		fastlock_release(&info->lock);
+		break;
+	case GNIX_PROV_KEY_LIMIT:
+		v = *(int *) val;
+		if (v >= GNIX_MAX_SCALABLE_REGISTRATIONS) {
+			GNIX_ERR(FI_LOG_FABRIC,
+				"User is requesting more registrations than is present on node\n");
+			ret = -FI_EINVAL;
+		}
+		info->attr.prov_key_limit = v;
+		fastlock_release(&info->lock);
+		break;
+	case GNIX_TOTAL_KEYS_NEEDED:
+		GNIX_WARN(FI_LOG_FABRIC,
+			"GNIX_TOTAL_KEYS_NEEDED is not a definable value.\n");
+		return -FI_EOPNOTSUPP;
+	default:
+		GNIX_WARN(FI_LOG_FABRIC, ("Invalid fab_ops_val\n"));
+		return -FI_EINVAL;
+	}
+
+	return ret;
+}
+
+static int __gnix_auth_key_get_val(
+	uint8_t *auth_key,
+	size_t auth_key_size,
+	gnix_auth_key_opt_t opt,
+	void *val)
+{
+	struct gnix_auth_key *info;
+
+	if (!val)
+		return -FI_EINVAL;
+
+	info = _gnix_auth_key_lookup(auth_key, auth_key_size);
+
+	switch (opt) {
+	case GNIX_USER_KEY_LIMIT:
+		*(int *)val = (info) ?
+			info->attr.user_key_limit :
+			gnix_default_user_registration_limit;
+		break;
+	case GNIX_PROV_KEY_LIMIT:
+		*(int *)val = (info) ?
+			info->attr.prov_key_limit :
+			gnix_default_prov_registration_limit;
+		break;
+	case GNIX_TOTAL_KEYS_NEEDED:
+		*(uint32_t *)val = ((info) ?
+			(info->attr.user_key_limit +
+			info->attr.prov_key_limit) :
+			(gnix_default_user_registration_limit +
+			 gnix_default_prov_registration_limit));
+	break;
+	default:
+		GNIX_WARN(FI_LOG_FABRIC, ("Invalid fab_ops_val\n"));
+		return -FI_EINVAL;
+	}
+
+	return FI_SUCCESS;
+}
+
+/*******************************************************************************
+ * FI_OPS_* data structures.
+ ******************************************************************************/
+
+static struct fi_gni_ops_fab gnix_ops_fab = {
+	.set_val = __gnix_fab_ops_set_val,
+	.get_val = __gnix_fab_ops_get_val
+};
+
+static struct fi_ops gnix_fab_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = gnix_fabric_close,
+	.bind = fi_no_bind,
+	.control = fi_no_control,
+	.ops_open = gnix_fab_ops_open,
+};
+
+static struct fi_gni_auth_key_ops_fab gnix_fab_ak_ops = {
+	.set_val = __gnix_auth_key_set_val,
+	.get_val = __gnix_auth_key_get_val,
+};
diff --git a/prov/gni/src/gnix_freelist.c b/prov/gni/src/gnix_freelist.c
index 9445847..e95bdc7 100644
--- a/prov/gni/src/gnix_freelist.c
+++ b/prov/gni/src/gnix_freelist.c
@@ -57,7 +57,7 @@
  * it just has to be at least as big as an slist_entry.
  */
 
-static int __gnix_fl_refill(struct gnix_freelist *fl, int n)
+int __gnix_fl_refill(struct gnix_freelist *fl, int n)
 {	int i, ret = FI_SUCCESS;
 	unsigned char *elems;
 
@@ -103,9 +103,7 @@ int _gnix_fl_init(int elem_size, int offset, int init_size,
 
 	int fill_size = init_size != 0 ? init_size : GNIX_FL_INIT_SIZE;
 
-	fl->refill_size = (refill_size != 0 ?
-			   refill_size :
-			   GNIX_FL_INIT_REFILL_SIZE);
+	fl->refill_size = refill_size;
 	fl->growth_factor = (growth_factor != 0 ?
 			     growth_factor :
 			     GNIX_FL_GROWTH_FACTOR);
@@ -160,57 +158,4 @@ void _gnix_fl_destroy(struct gnix_freelist *fl)
 		fastlock_destroy(&fl->lock);
 }
 
-int _gnix_fl_alloc(struct dlist_entry **e, struct gnix_freelist *fl)
-{
-	int ret = FI_SUCCESS;
-	struct dlist_entry *de;
-
-	assert(fl);
-
-	if (fl->ts)
-		fastlock_acquire(&fl->lock);
-
-	if (dlist_empty(&fl->freelist)) {
-		ret = __gnix_fl_refill(fl, fl->refill_size);
-		if (ret != FI_SUCCESS)
-			goto err;
-		if (fl->refill_size < fl->max_refill_size) {
-			int ns = fl->refill_size *= fl->growth_factor;
-
-			fl->refill_size = (ns >= fl->max_refill_size ?
-					   fl->max_refill_size :
-					   ns);
-		}
-
-		if (dlist_empty(&fl->freelist)) {
-			/* Can't happen unless multithreaded */
-			ret = -FI_EAGAIN;
-			goto err;
-		}
-	}
-
-	de = fl->freelist.next;
-	dlist_remove_init(de);
-
-	*e = de;
-err:
-	if (fl->ts)
-		fastlock_release(&fl->lock);
-	return ret;
-}
-
-void _gnix_fl_free(struct dlist_entry *e, struct gnix_freelist *fl)
-{
-	assert(e);
-	assert(fl);
-
-	e->next = NULL;  /* keep slist implementation happy */
-
-	if (fl->ts)
-		fastlock_acquire(&fl->lock);
-	dlist_init(e);
-	dlist_insert_head(e, &fl->freelist);
-	if (fl->ts)
-		fastlock_release(&fl->lock);
-}
 
diff --git a/prov/gni/src/gnix_hashtable.c b/prov/gni/src/gnix_hashtable.c
index d334a6f..a573d94 100644
--- a/prov/gni/src/gnix_hashtable.c
+++ b/prov/gni/src/gnix_hashtable.c
@@ -287,13 +287,13 @@ static inline void __gnix_ht_resize_hashtable_dec(gnix_hashtable_t *ht)
 static inline void __gnix_ht_common_init(gnix_hashtable_t *ht)
 {
 	if (ht->ht_state == GNIX_HT_STATE_UNINITIALIZED) {
-		atomic_initialize(&ht->ht_elements, 0);
-		atomic_initialize(&ht->ht_collisions, 0);
-		atomic_initialize(&ht->ht_insertions, 0);
+		ofi_atomic_initialize32(&ht->ht_elements, 0);
+		ofi_atomic_initialize32(&ht->ht_collisions, 0);
+		ofi_atomic_initialize32(&ht->ht_insertions, 0);
 	} else {
-		atomic_set(&ht->ht_elements, 0);
-		atomic_set(&ht->ht_collisions, 0);
-		atomic_set(&ht->ht_insertions, 0);
+		ofi_atomic_set32(&ht->ht_elements, 0);
+		ofi_atomic_set32(&ht->ht_collisions, 0);
+		ofi_atomic_set32(&ht->ht_insertions, 0);
 	}
 
 	ht->ht_state = GNIX_HT_STATE_READY;
@@ -302,9 +302,9 @@ static inline void __gnix_ht_common_init(gnix_hashtable_t *ht)
 static inline void __gnix_ht_common_destroy(gnix_hashtable_t *ht)
 {
 	ht->ht_size = 0;
-	atomic_set(&ht->ht_collisions, 0);
-	atomic_set(&ht->ht_insertions, 0);
-	atomic_set(&ht->ht_elements, 0);
+	ofi_atomic_set32(&ht->ht_collisions, 0);
+	ofi_atomic_set32(&ht->ht_insertions, 0);
+	ofi_atomic_set32(&ht->ht_elements, 0);
 	ht->ht_state = GNIX_HT_STATE_DEAD;
 }
 
@@ -344,7 +344,7 @@ static int __gnix_ht_lf_destroy(gnix_hashtable_t *ht)
 		freed_entries = __gnix_ht_destroy_list(ht, &lh->head);
 
 		if (freed_entries)
-			atomic_sub(&ht->ht_elements, freed_entries);
+			ofi_atomic_sub32(&ht->ht_elements, freed_entries);
 	}
 
 	free(ht->ht_lf_tbl);
@@ -478,7 +478,7 @@ static int __gnix_ht_lk_destroy(gnix_hashtable_t *ht)
 		freed_entries = __gnix_ht_destroy_list(ht, &lh->head);
 
 		if (freed_entries)
-			atomic_sub(&ht->ht_elements, freed_entries);
+			ofi_atomic_sub32(&ht->ht_elements, freed_entries);
 	}
 
 	free(ht->ht_lk_tbl);
@@ -613,7 +613,7 @@ static inline int __gnix_ht_should_decrease_size(gnix_hashtable_t *ht)
 	/* This is just an approximation of the collision rate since we
 	 *     don't track collisions on removal
 	 */
-	return ((atomic_get(&ht->ht_elements) * 100) /
+	return ((ofi_atomic_get32(&ht->ht_elements) * 100) /
 			(ht->ht_size - decrease)) <= desired_thresh;
 }
 
@@ -676,20 +676,20 @@ int _gnix_ht_insert(gnix_hashtable_t *ht, gnix_ht_key_t key, void *value)
 	}
 
 	if (ht->ht_size < ht->ht_attr.ht_maximum_size) {
-		collisions = atomic_add(&ht->ht_collisions, hits);
-		insertions = atomic_inc(&ht->ht_insertions);
+		collisions = ofi_atomic_add32(&ht->ht_collisions, hits);
+		insertions = ofi_atomic_inc32(&ht->ht_insertions);
 		if (insertions > 10 &&
 				((collisions * 100) / insertions)
 				> ht->ht_attr.ht_collision_thresh) {
 
-			atomic_set(&ht->ht_collisions, 0);
-			atomic_set(&ht->ht_insertions, 0);
+			ofi_atomic_set32(&ht->ht_collisions, 0);
+			ofi_atomic_set32(&ht->ht_insertions, 0);
 
 			__gnix_ht_resize_hashtable_inc(ht);
 		}
 	}
 
-	atomic_inc(&ht->ht_elements);
+	ofi_atomic_inc32(&ht->ht_elements);
 
 	return ret;
 }
@@ -705,7 +705,7 @@ int _gnix_ht_remove(gnix_hashtable_t *ht, gnix_ht_key_t key)
 
 	/* on success, we may have to resize */
 	if (ret == 0) {
-		atomic_dec(&ht->ht_elements);
+		ofi_atomic_dec32(&ht->ht_elements);
 
 		if (ht->ht_size > ht->ht_attr.ht_initial_size &&
 				__gnix_ht_should_decrease_size(ht)) {
@@ -713,8 +713,8 @@ int _gnix_ht_remove(gnix_hashtable_t *ht, gnix_ht_key_t key)
 			/* since we are resizing the table,
 			 * reset the collision info
 			 */
-			atomic_set(&ht->ht_collisions, 0);
-			atomic_set(&ht->ht_insertions, 0);
+			ofi_atomic_set32(&ht->ht_collisions, 0);
+			ofi_atomic_set32(&ht->ht_insertions, 0);
 
 			__gnix_ht_resize_hashtable_dec(ht);
 		}
@@ -730,7 +730,7 @@ void *_gnix_ht_lookup(gnix_hashtable_t *ht, gnix_ht_key_t key)
 
 int _gnix_ht_empty(gnix_hashtable_t *ht)
 {
-	return atomic_get(&ht->ht_elements) == 0;
+	return ofi_atomic_get32(&ht->ht_elements) == 0;
 }
 
 void *__gnix_ht_lf_iter_next(struct gnix_hashtable_iter *iter)
diff --git a/prov/gni/src/gnix_init.c b/prov/gni/src/gnix_init.c
index 9f29aa7..ce77688 100644
--- a/prov/gni/src/gnix_init.c
+++ b/prov/gni/src/gnix_init.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -35,6 +35,7 @@
 #include <stdlib.h>
 #include <gni_pub.h>
 #include "gnix.h"
+#include "gnix_auth_key.h"
 #include "gnix_util.h"
 #include "fi.h"
 #include "prov.h"
@@ -46,17 +47,62 @@
  *        ctor will run even with static linking.
  */
 
-atomic_t gnix_id_counter;
-atomic_t file_id_counter;
-#ifndef NDEBUG
+ofi_atomic32_t gnix_id_counter;
+ofi_atomic32_t file_id_counter;
+#ifdef ENABLE_DEBUG
 /* don't think this needs to be in tls */
 __thread pid_t gnix_debug_pid = ~(uint32_t) 0;
 __thread uint32_t gnix_debug_tid = ~(uint32_t) 0;
-atomic_t gnix_debug_next_tid;
+ofi_atomic32_t gnix_debug_next_tid;
 #endif
 
-uint8_t precomputed_crc_results[256];
+extern fastlock_t __gnix_alps_lock;
+
+/**
+ * Helper for static computation of GNI CRC updating an intermediate crc
+ * value based on the status of one bit in the data value.
+ *
+ * @param[in]  data  value to compute crc for
+ * @param[in]  lcrc  intermediate crc to update
+ * @param[in]  bit   which bit (in range [0-7]) of 'data' to test
+ * @param[in]  xor   value to 'xor' into 'lcrc' iff bit 'bit' of 'data' is set
+ *
+ * @return updated intermediate crc
+ */
+#define CRC_HELPER(data, lcrc, bit, xor) (((((data)>>(bit))&1)*(xor))^(lcrc))
+
+/* Parameterized helpers for each bit in GNI CRC */
+#define CRC_80(data, lcrc)              CRC_HELPER(data, lcrc, 7, 0x8c)
+#define CRC_40(data, lcrc) CRC_80(data, CRC_HELPER(data, lcrc, 6, 0x46))
+#define CRC_20(data, lcrc) CRC_40(data, CRC_HELPER(data, lcrc, 5, 0x23))
+#define CRC_10(data, lcrc) CRC_20(data, CRC_HELPER(data, lcrc, 4, 0x9d))
+#define CRC_08(data, lcrc) CRC_10(data, CRC_HELPER(data, lcrc, 3, 0xc2))
+#define CRC_04(data, lcrc) CRC_08(data, CRC_HELPER(data, lcrc, 2, 0x61))
+#define CRC_02(data, lcrc) CRC_04(data, CRC_HELPER(data, lcrc, 1, 0xbc))
+#define CRC_01(data, lcrc) CRC_02(data, CRC_HELPER(data, lcrc, 0, 0x5e))
+
+/* Static computation of 8-bit GNI CRC of one 8-bit value */
+#define CRC(data) ((uint8_t)CRC_01(data, 0))
+
+/* Helpers for declaring large array of precomputed CRCs */
+/* 4 elements starting at x */
+#define CRCS_4(x)   CRC((x)), CRC((x)+1), CRC((x)+2), CRC((x)+3)
+
+/* 16 elements starting at x: ie, CRC(x),...,CRC(x+15) */
+#define CRCS_16(x)  CRCS_4((x)), CRCS_4((x)+4), \
+		    CRCS_4((x)+8), CRCS_4((x)+12)
 
+/* 64 elements starting at x: ie, CRC(x),...,CRC(x+63) */
+#define CRCS_64(x)  CRCS_16((x)), CRCS_16((x)+16), \
+		    CRCS_16((x)+32), CRCS_16((x)+48)
+
+/* 256 elements starting at x: ie, CRC(x),...,CRC(x+255) */
+#define CRCS_256(x) CRCS_64((x)), CRCS_64((x)+64), \
+		    CRCS_64((x)+128), CRCS_64((x)+192)
+
+uint8_t precomputed_crc_results[256] = { CRCS_256(0) };
+
+#ifndef NDEBUG
 static inline uint8_t __gni_crc_bits(uint8_t data)
 {
   uint8_t lcrc = 0;
@@ -81,26 +127,51 @@ static inline uint8_t __gni_crc_bits(uint8_t data)
   return lcrc;
 }
 
-void __setup_precomputed_crcs(void)
+static void __validate_precomputed_crcs(void)
 {
 	int i;
+	uint8_t crc_i;
 
-	for (i = 0; i < 256; i++)
-	{
-		precomputed_crc_results[i] = __gni_crc_bits(i);
+	for (i = 0; i < 256; i++) {
+		crc_i = __gni_crc_bits(i);
+		if (precomputed_crc_results[i] != crc_i) {
+			GNIX_WARN(FI_LOG_FABRIC, "precomputed_crc_results[%d]"
+				" initialized to 0x%x, expected 0x%x\n",
+				i, (int)precomputed_crc_results[i], (int)crc_i);
+			precomputed_crc_results[i] = crc_i;
+		}
 	}
 }
+#endif /* NDEBUG */
 
 /**
  * Initialization function for performing global setup
  */
 __attribute__((constructor))
-void gnix_init(void)
+void _gnix_init(void)
 {
-	__setup_precomputed_crcs();
-	atomic_initialize(&gnix_id_counter, 0);
-	atomic_initialize(&file_id_counter, 0);
+	static int called=0;
+
+	if (called==0) {
+		fastlock_init(&__gnix_alps_lock);
+
+		if (sizeof(struct gnix_mr_key) != sizeof(uint64_t)) {
+			GNIX_FATAL(FI_LOG_FABRIC,
+				"gnix_mr_key size is invalid, "
+				"size=%d expected=%d\n",
+				sizeof(struct gnix_mr_key),
+				sizeof(uint64_t));
+			assert(0);
+		}
+
+		_gnix_auth_key_subsys_init();
+
+		ofi_atomic_initialize32(&gnix_id_counter, 0);
+		ofi_atomic_initialize32(&file_id_counter, 0);
 #ifndef NDEBUG
-	atomic_initialize(&gnix_debug_next_tid, 0);
+		__validate_precomputed_crcs();
+		ofi_atomic_initialize32(&gnix_debug_next_tid, 0);
 #endif
+		called = 1;
+	}
 }
diff --git a/prov/gni/src/gnix_mbox_allocator.c b/prov/gni/src/gnix_mbox_allocator.c
index 2a3d99c..def1e98 100644
--- a/prov/gni/src/gnix_mbox_allocator.c
+++ b/prov/gni/src/gnix_mbox_allocator.c
@@ -136,7 +136,7 @@ static int __generate_file_name(size_t page_size, char **filename)
 		goto err_invalid;
 	}
 
-	my_file_id = atomic_inc(&file_id_counter);
+	my_file_id = ofi_atomic_inc32(&file_id_counter);
 	size = snprintf(NULL, 0, "%s/%s.%d.%d", huge_page, basename, getpid(),
 			my_file_id);
 	if (size < 0) {
diff --git a/prov/gni/src/gnix_mr.c b/prov/gni/src/gnix_mr.c
index 4fb177b..c8c7ec2 100644
--- a/prov/gni/src/gnix_mr.c
+++ b/prov/gni/src/gnix_mr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
  *
  *
@@ -85,7 +85,7 @@ void _gnix_convert_key_to_mhdl_no_crc(
 	uint8_t flags = 0;
 
 	va = (uint64_t) __sign_extend(va << GNIX_MR_PAGE_SHIFT,
-				      GNIX_MR_VA_BITS);
+		GNIX_MR_VA_BITS);
 
 	if (key->flags & GNIX_MR_FLAG_READONLY)
 		flags |= GNI_MEMHNDL_ATTR_READONLY;
@@ -105,8 +105,8 @@ void _gnix_convert_key_to_mhdl_no_crc(
  * @param mhdl  gni memory handle
  */
 void _gnix_convert_key_to_mhdl(
-		gnix_mr_key_t *key,
-		gni_mem_handle_t *mhdl)
+	gnix_mr_key_t *key,
+	gni_mem_handle_t *mhdl)
 {
 	_gnix_convert_key_to_mhdl_no_crc(key, mhdl);
 	compiler_barrier();
@@ -121,12 +121,11 @@ void _gnix_convert_key_to_mhdl(
  */
 uint64_t _gnix_convert_mhdl_to_key(gni_mem_handle_t *mhdl)
 {
-	gnix_mr_key_t key = {{{{0}}}};
+	gnix_mr_key_t key = {{{0}}};
 	key.pfn = GNI_MEMHNDL_GET_VA((*mhdl)) >> GNIX_MR_PAGE_SHIFT;
 	key.mdd = GNI_MEMHNDL_GET_MDH((*mhdl));
 	//key->format = GNI_MEMHNDL_NEW_FRMT((*mhdl));
 	key.flags = 0;
-
 	if (GNI_MEMHNDL_GET_FLAGS((*mhdl)) & GNI_MEMHNDL_FLAG_READONLY)
 		key.flags |= GNIX_MR_FLAG_READONLY;
 
@@ -159,14 +158,14 @@ static inline uint64_t __calculate_length(
 	return pages * pagesize;
 }
 
-DIRECT_FN int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
+static int __mr_reg(struct fid *fid, const void *buf, size_t len,
 			  uint64_t access, uint64_t offset,
 			  uint64_t requested_key, uint64_t flags,
-			  struct fid_mr **mr_o, void *context)
+			  struct fid_mr **mr_o, void *context,
+			  struct gnix_auth_key *auth_key)
 {
 	struct gnix_fid_mem_desc *mr = NULL;
 	struct gnix_fid_domain *domain;
-	struct gnix_nic *nic;
 	int rc;
 	uint64_t reg_addr, reg_len;
 	struct _gnix_fi_reg_context fi_reg_context = {
@@ -175,7 +174,9 @@ DIRECT_FN int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
 			.requested_key = requested_key,
 			.flags = flags,
 			.context = context,
+			.auth_key = auth_key,
 	};
+	struct gnix_mr_cache_info *info;
 
 	GNIX_TRACE(FI_LOG_MR, "\n");
 
@@ -188,39 +189,31 @@ DIRECT_FN int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
 	 *   correct fclass on associated fid
 	 */
 	if (offset || !buf || !mr_o || !access ||
-			(access & ~(FI_READ | FI_WRITE | FI_RECV | FI_SEND |
+		(access & ~(FI_READ | FI_WRITE | FI_RECV | FI_SEND |
 						FI_REMOTE_READ |
 						FI_REMOTE_WRITE)) ||
-			(fid->fclass != FI_CLASS_DOMAIN))
-
+		(fid->fclass != FI_CLASS_DOMAIN))
 		return -FI_EINVAL;
 
 	domain = container_of(fid, struct gnix_fid_domain, domain_fid.fid);
 
-	/* If the nic list is empty, create a nic */
-	if (unlikely(dlist_empty(&domain->nic_list))) {
-		rc = gnix_nic_alloc(domain, NULL, &nic);
-		if (rc) {
-			GNIX_INFO(FI_LOG_MR,
-				  "could not allocate nic to do mr_reg,"
-				  " ret=%i\n", rc);
-			goto err;
-		}
-	}
+	info = &domain->mr_cache_info[auth_key->ptag];
 
 	reg_addr = ((uint64_t) buf) & ~((1 << GNIX_MR_PAGE_SHIFT) - 1);
 	reg_len = __calculate_length((uint64_t) buf, len,
 			1 << GNIX_MR_PAGE_SHIFT);
 
 	/* call cache register op to retrieve the right entry */
-	fastlock_acquire(&domain->mr_cache_lock);
+	fastlock_release(&domain->mr_cache_lock);
+	fastlock_acquire(&info->mr_cache_lock);
 	if (unlikely(!domain->mr_ops))
 		_gnix_open_cache(domain, GNIX_DEFAULT_CACHE_TYPE);
+	fastlock_release(&domain->mr_cache_lock);
 
-	if (unlikely(!domain->mr_ops->is_init(domain))) {
-		rc = domain->mr_ops->init(domain);
+	if (unlikely(!domain->mr_ops->is_init(domain, auth_key))) {
+		rc = domain->mr_ops->init(domain, auth_key);
 		if (rc != FI_SUCCESS) {
-			fastlock_release(&domain->mr_cache_lock);
+			fastlock_release(&info->mr_cache_lock);
 			goto err;
 		}
 	}
@@ -228,7 +221,7 @@ DIRECT_FN int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
 	rc = domain->mr_ops->reg_mr(domain,
 			(uint64_t) reg_addr, reg_len, &fi_reg_context,
 			(void **) &mr);
-	fastlock_release(&domain->mr_cache_lock);
+	fastlock_release(&info->mr_cache_lock);
 
 	/* check retcode */
 	if (unlikely(rc != FI_SUCCESS))
@@ -242,9 +235,9 @@ DIRECT_FN int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
 
 	/* setup internal key structure */
 	mr->mr_fid.key = _gnix_convert_mhdl_to_key(&mr->mem_hndl);
+	mr->auth_key = auth_key;
 
 	_gnix_ref_get(mr->domain);
-	_gnix_ref_get(mr->nic);
 
 	/* set up mr_o out pointer */
 	*mr_o = &mr->mr_fid;
@@ -254,6 +247,86 @@ err:
 	return rc;
 }
 
+DIRECT_FN int gnix_mr_reg(struct fid *fid, const void *buf, size_t len,
+	uint64_t access, uint64_t offset,
+	uint64_t requested_key, uint64_t flags,
+	struct fid_mr **mr, void *context)
+{
+	const struct iovec mr_iov = {
+		.iov_base = (void *) buf,
+		.iov_len = len,
+	};
+	const struct fi_mr_attr attr = {
+		.mr_iov = &mr_iov,
+		.iov_count = 1,
+		.access = access,
+		.offset = offset,
+		.requested_key = requested_key,
+		.context = context,
+		.auth_key = NULL,
+		.auth_key_size = 0,
+	};
+
+	return gnix_mr_regattr(fid, &attr, flags, mr);
+}
+
+DIRECT_FN int gnix_mr_regv(struct fid *fid, const struct iovec *iov,
+	size_t count, uint64_t access,
+	uint64_t offset, uint64_t requested_key,
+	uint64_t flags, struct fid_mr **mr, void *context)
+{
+	const struct fi_mr_attr attr = {
+		.mr_iov = iov,
+		.iov_count = count,
+		.access = access,
+		.offset = offset,
+		.requested_key = requested_key,
+		.context = context,
+		.auth_key = NULL,
+		.auth_key_size = 0,
+	};
+
+	return gnix_mr_regattr(fid, &attr, flags, mr);
+}
+
+DIRECT_FN int gnix_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
+	uint64_t flags, struct fid_mr **mr)
+{
+	struct gnix_fid_domain *domain = container_of(fid,
+		struct gnix_fid_domain, domain_fid.fid);
+	struct gnix_auth_key *auth_key;
+
+	if (!attr)
+		return -FI_EINVAL;
+	if (!attr->mr_iov || !attr->iov_count)
+		return -FI_EINVAL;
+
+	if (domain->mr_iov_limit < attr->iov_count)
+		return -FI_EOPNOTSUPP;
+
+	if (FI_VERSION_LT(domain->fabric->fab_fid.api_version,
+		FI_VERSION(1, 5)) &&
+		(attr->auth_key || attr->auth_key_size))
+		return -FI_EINVAL;
+
+	if (attr->auth_key_size) {
+		auth_key = GNIX_GET_AUTH_KEY(attr->auth_key, attr->auth_key_size);
+		if (!auth_key)
+			return -FI_EINVAL;
+	} else {
+		auth_key = domain->auth_key;
+	}
+
+	if (attr->iov_count == 1)
+		return __mr_reg(fid, attr->mr_iov[0].iov_base,
+			attr->mr_iov[0].iov_len, attr->access, attr->offset,
+			attr->requested_key, flags, mr,
+			attr->context, auth_key);
+
+	/* regv limited to one iov at this time */
+	return -FI_EOPNOTSUPP;
+}
+
 /**
  * Closes and deallocates a libfabric memory registration in the internal cache
  *
@@ -270,7 +343,7 @@ static int fi_gnix_mr_close(fid_t fid)
 	struct gnix_fid_mem_desc *mr;
 	gni_return_t ret;
 	struct gnix_fid_domain *domain;
-	struct gnix_nic *nic;
+	struct gnix_mr_cache_info *info;
 
 	GNIX_TRACE(FI_LOG_MR, "\n");
 
@@ -280,18 +353,17 @@ static int fi_gnix_mr_close(fid_t fid)
 	mr = container_of(fid, struct gnix_fid_mem_desc, mr_fid.fid);
 
 	domain = mr->domain;
-	nic = mr->nic;
+	info = &domain->mr_cache_info[mr->auth_key->ptag];
 
 	/* call cache deregister op */
-	fastlock_acquire(&domain->mr_cache_lock);
+	fastlock_acquire(&info->mr_cache_lock);
 	ret = domain->mr_ops->dereg_mr(domain, mr);
-	fastlock_release(&domain->mr_cache_lock);
+	fastlock_release(&info->mr_cache_lock);
 
 	/* check retcode */
 	if (likely(ret == FI_SUCCESS)) {
 		/* release references to the domain and nic */
 		_gnix_ref_put(domain);
-		_gnix_ref_put(nic);
 	} else {
 		GNIX_INFO(FI_LOG_MR, "failed to deregister memory, "
 			  "ret=%i\n", ret);
@@ -307,25 +379,55 @@ static inline void *__gnix_generic_register(
 		size_t length,
 		gni_cq_handle_t dst_cq_hndl,
 		int flags,
-		int vmdh_index)
+		int vmdh_index,
+		struct gnix_auth_key *auth_key)
 {
 	struct gnix_nic *nic;
+	struct gnix_nic_attr nic_attr = {0};
 	gni_return_t grc = GNI_RC_SUCCESS;
+	int rc;
 
-	dlist_for_each(&domain->nic_list, nic, dom_nic_list)
-	{
-		COND_ACQUIRE(nic->requires_lock, &nic->lock);
-		grc = GNI_MemRegister(nic->gni_nic_hndl, (uint64_t) address,
-					  length,	dst_cq_hndl, flags,
-					  vmdh_index, &md->mem_hndl);
-		COND_RELEASE(nic->requires_lock, &nic->lock);
-		if (grc == GNI_RC_SUCCESS)
-			break;
-	}
+	pthread_mutex_lock(&gnix_nic_list_lock);
+
+	/* If the nic list is empty, create a nic */
+	if (unlikely((dlist_empty(&gnix_nic_list_ptag[auth_key->ptag])))) {
+		/* release the lock because we are not checking the list after
+			this point. Additionally, gnix_nic_alloc takes the
+			lock to add the nic. */
+		pthread_mutex_unlock(&gnix_nic_list_lock);
+		nic_attr.auth_key = auth_key;
+
+		rc = gnix_nic_alloc(domain, &nic_attr, &nic);
+		if (rc) {
+			GNIX_INFO(FI_LOG_MR,
+				  "could not allocate nic to do mr_reg,"
+				  " ret=%i\n", rc);
+			return NULL;
+		}
+	} else {
+		nic = dlist_first_entry(&gnix_nic_list_ptag[auth_key->ptag],
+			struct gnix_nic, ptag_nic_list);
+		if (unlikely(nic == NULL)) {
+			GNIX_ERR(FI_LOG_MR, "Failed to find nic on "
+				"ptag list\n");
+			pthread_mutex_unlock(&gnix_nic_list_lock);
+			return NULL;
+		}
+		_gnix_ref_get(nic);
+		pthread_mutex_unlock(&gnix_nic_list_lock);
+	    }
+
+	COND_ACQUIRE(nic->requires_lock, &nic->lock);
+	grc = GNI_MemRegister(nic->gni_nic_hndl, (uint64_t) address,
+				  length,	dst_cq_hndl, flags,
+				  vmdh_index, &md->mem_hndl);
+	COND_RELEASE(nic->requires_lock, &nic->lock);
 
 	if (unlikely(grc != GNI_RC_SUCCESS)) {
 		GNIX_INFO(FI_LOG_MR, "failed to register memory with uGNI, "
 			  "ret=%s\n", gni_err_str[grc]);
+		_gnix_ref_put(nic);
+
 		return NULL;
 	}
 
@@ -333,9 +435,8 @@ static inline void *__gnix_generic_register(
 	md->nic = nic;
 	md->domain = domain;
 
-	/* take references on domain and nic */
+	/* take references on domain */
 	_gnix_ref_get(md->domain);
-	_gnix_ref_get(md->nic);
 
 	return md;
 }
@@ -359,8 +460,10 @@ static void *__gnix_register_region(
 	else
 		flags |= GNI_MEM_READ_ONLY;
 
+	GNIX_DEBUG(FI_LOG_MR, "addr %p len %d flags 0x%x\n", address, length,
+		   flags);
 	return __gnix_generic_register(domain, md, address, length, dst_cq_hndl,
-			flags, vmdh_index);
+			flags, vmdh_index, fi_reg_context->auth_key);
 }
 
 static int __gnix_deregister_region(
@@ -415,46 +518,53 @@ static int __gnix_destruct_registration(void *context)
 	return GNI_RC_SUCCESS;
 }
 
-
 #ifdef HAVE_UDREG
 void *__udreg_register(void *addr, uint64_t length, void *context)
 {
 	struct gnix_fid_mem_desc *md;
-	struct gnix_fid_domain *domain;
+	struct gnix_mr_cache_info *info = (struct gnix_mr_cache_info *) context;
+	struct gnix_auth_key *auth_key = info->auth_key;
+	struct gnix_fid_domain *domain = info->domain;
 
-	domain = (struct gnix_fid_domain *) context;
+	/* Allocate an udreg info block for this registration. */
+	md = calloc(1, sizeof(*md));
+	if (!md) {
+		GNIX_WARN(FI_LOG_MR,
+			"failed to allocate memory for registration\n");
+		return NULL;
+	}
 
-    /* Allocate an udreg info block for this registration. */
-    md = calloc(1, sizeof(*md));
-    if (!md) {
-	GNIX_WARN(FI_LOG_MR, "failed to allocate memory for registration\n");
-	return NULL;
-    }
+	GNIX_INFO(FI_LOG_MR, "info=%p auth_key=%p\n",
+		info, auth_key);
+	GNIX_INFO(FI_LOG_MR, "ptag=%d\n", auth_key->ptag);
 
-    return __gnix_generic_register(domain, md, addr, length, NULL,
-		GNI_MEM_READWRITE, -1);
+	return __gnix_generic_register(domain, md, addr, length, NULL,
+		GNI_MEM_READWRITE, -1, auth_key);
 }
 
-
 uint32_t __udreg_deregister(void *registration, void *context)
 {
 	gni_return_t grc;
 
 	grc = __gnix_deregister_region(registration, NULL);
 
+	free(registration);
+
 	return (grc == GNI_RC_SUCCESS) ? 0 : 1;
 }
 
-
 /* Called via dreg when a cache is destroyed. */
 void __udreg_cache_destructor(void *context)
 {
-    /*  Nothing needed here. */
+	/*  Nothing needed here. */
 }
 
-static int __udreg_init(struct gnix_fid_domain *domain)
+static int __udreg_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
 {
 	udreg_return_t urc;
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain, auth_key);
 
 	udreg_cache_attr_t udreg_cache_attr = {
 		.cache_name =           {"gnix_app_cache"},
@@ -462,7 +572,7 @@ static int __udreg_init(struct gnix_fid_domain *domain)
 		.modes =                UDREG_CC_MODE_USE_LARGE_PAGES,
 		.debug_mode =           0,
 		.debug_rank =           0,
-		.reg_context =          (void *) domain,
+		.reg_context =          (void *) info,
 		.dreg_context =         (void *) domain,
 		.destructor_context =   (void *) domain,
 		.device_reg_func =      __udreg_register,
@@ -483,21 +593,29 @@ static int __udreg_init(struct gnix_fid_domain *domain)
 				urc);
 	}
 
-	urc = UDREG_CacheAccess(udreg_cache_attr.cache_name, &domain->udreg_cache);
+	urc = UDREG_CacheAccess(udreg_cache_attr.cache_name,
+		&info->udreg_cache);
 	if (urc != UDREG_RC_SUCCESS) {
 		GNIX_FATAL(FI_LOG_MR,
 				"Could not access udreg application cache, urc=%d",
 				urc);
 	}
 
-	domain->mr_is_init = 1;
+	info->inuse = 1;
+	info->auth_key = auth_key;
+	GNIX_INFO(FI_LOG_MR, "info=%p auth_key=%p ptag=%d\n",
+		info, info->auth_key, auth_key->ptag);
 
 	return FI_SUCCESS;
 }
 
-static int __udreg_is_init(struct gnix_fid_domain *domain)
+static int __udreg_is_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
 {
-	return domain->udreg_cache != NULL;
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain, auth_key);
+
+	return info->inuse;
 }
 
 static int __udreg_reg_mr(
@@ -510,8 +628,12 @@ static int __udreg_reg_mr(
 	udreg_return_t urc;
 	udreg_entry_t *udreg_entry;
 	struct gnix_fid_mem_desc *md;
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain,
+			fi_reg_context->auth_key);
 
-	urc = UDREG_Register(domain->udreg_cache, (void *) address, length, &udreg_entry);
+	urc = UDREG_Register(info->udreg_cache, (void *) address,
+			length, &udreg_entry);
 	if (unlikely(urc != UDREG_RC_SUCCESS))
 		return -FI_EIO;
 
@@ -527,8 +649,11 @@ static int __udreg_dereg_mr(struct gnix_fid_domain *domain,
 		struct gnix_fid_mem_desc *md)
 {
 	udreg_return_t urc;
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain,
+			md->auth_key);
 
-	urc = UDREG_Unregister(domain->udreg_cache,
+	urc = UDREG_Unregister(info->udreg_cache,
 			(udreg_entry_t *) md->entry);
 	if (urc != UDREG_RC_SUCCESS) {
 		GNIX_WARN(FI_LOG_MR, "UDREG_Unregister() returned %d\n", urc);
@@ -538,33 +663,41 @@ static int __udreg_dereg_mr(struct gnix_fid_domain *domain,
 	return urc;
 }
 
-static int __udreg_close(struct gnix_fid_domain *domain)
+static int __udreg_close(struct gnix_fid_domain *domain,
+		struct gnix_mr_cache_info *info)
 {
 	udreg_return_t ret;
 
-	if (domain->udreg_cache) {
-		ret = UDREG_CacheRelease(domain->udreg_cache);
+	if (!info->inuse)
+		return FI_SUCCESS; /* nothing to close */
+
+	if (info->udreg_cache) {
+		ret = UDREG_CacheRelease(info->udreg_cache);
 		if (unlikely(ret != UDREG_RC_SUCCESS))
 			GNIX_FATAL(FI_LOG_DOMAIN, "failed to release from "
 					"mr cache during domain destruct, dom=%p rc=%d\n",
 					domain, ret);
 
-		ret = UDREG_CacheDestroy(domain->udreg_cache);
+		ret = UDREG_CacheDestroy(info->udreg_cache);
 		if (unlikely(ret != UDREG_RC_SUCCESS))
 			GNIX_FATAL(FI_LOG_DOMAIN, "failed to destroy mr "
 					"cache during domain destruct, dom=%p rc=%d\n",
 					domain, ret);
 	}
 
+	info->inuse = 0;
+
 	return FI_SUCCESS;
 }
 #else
-static int __udreg_init(struct gnix_fid_domain *domain)
+static int __udreg_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
 {
 	return -FI_ENOSYS;
 }
 
-static int __udreg_is_init(struct gnix_fid_domain *domain)
+static int __udreg_is_init(struct gnix_fid_domain *domain
+		struct gnix_auth_key *auth_key)
 {
 	return FI_SUCCESS;
 }
@@ -584,7 +717,8 @@ static int __udreg_dereg_mr(struct gnix_fid_domain *domain,
 	return -FI_ENOSYS;
 }
 
-static int __udreg_close(struct gnix_fid_domain *domain)
+static int __udreg_close(struct gnix_fid_domain *domain,
+		struct gnix_mr_cache_info *info)
 {
 	return FI_SUCCESS;
 }
@@ -599,19 +733,35 @@ struct gnix_mr_ops udreg_mr_ops = {
 	.flush_cache = NULL, // UDREG doesn't support cache flush
 };
 
-static int __cache_init(struct gnix_fid_domain *domain) {
+static int __cache_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
+{
 	int ret;
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain, auth_key);
 
-	ret = _gnix_mr_cache_init(&domain->mr_cache,
+	ret = _gnix_mr_cache_init(&info->mr_cache_ro,
 			&domain->mr_cache_attr);
+
+	if (ret)
+		return ret;
+
+	ret = _gnix_mr_cache_init(&info->mr_cache_rw,
+				&domain->mr_cache_attr);
+
 	if (ret == FI_SUCCESS)
-		domain->mr_is_init = 1;
+		info->inuse = 1;
 
 	return ret;
 }
 
-static int __cache_is_init(struct gnix_fid_domain *domain) {
-	return domain->mr_cache != NULL;
+static int __cache_is_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
+{
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain, auth_key);
+
+	return info->inuse;
 }
 
 static int __cache_reg_mr(
@@ -619,39 +769,98 @@ static int __cache_reg_mr(
 		uint64_t                    address,
 		uint64_t                    length,
 		struct _gnix_fi_reg_context *fi_reg_context,
-		void                        **handle) {
+		void                        **handle)
+{
+	struct gnix_mr_cache *cache;
+	struct gnix_auth_key *auth_key = fi_reg_context->auth_key;
+	struct gnix_mr_cache_info *info =
+		GNIX_GET_MR_CACHE_INFO(domain, auth_key);
 
-	return _gnix_mr_cache_register(domain->mr_cache, address, length,
+	if (fi_reg_context->access & (FI_RECV | FI_READ | FI_REMOTE_WRITE))
+		cache = info->mr_cache_rw;
+	else
+		cache = info->mr_cache_ro;
+
+	return _gnix_mr_cache_register(cache, address, length,
 			fi_reg_context, handle);
 }
 
 static int __cache_dereg_mr(struct gnix_fid_domain *domain,
 		struct gnix_fid_mem_desc *md)
 {
-	return _gnix_mr_cache_deregister(domain->mr_cache, md);
+	gnix_mr_cache_t *cache;
+	struct gnix_mr_cache_info *info = GNIX_GET_MR_CACHE_INFO(domain,
+			md->auth_key);
+
+	if (GNI_MEMHNDL_GET_FLAGS((md->mem_hndl)) &
+	    GNI_MEMHNDL_FLAG_READONLY)
+		cache = info->mr_cache_ro;
+	else
+		cache = info->mr_cache_rw;
+
+	return _gnix_mr_cache_deregister(cache, md);
 }
 
-static int __cache_close(struct gnix_fid_domain *domain)
+static int __cache_close(struct gnix_fid_domain *domain,
+		struct gnix_mr_cache_info *info)
 {
 	int ret;
 
-	if (domain->mr_cache) {
-		ret = _gnix_mr_cache_destroy(domain->mr_cache);
+	if (!info->inuse)
+		return FI_SUCCESS;
+
+	if (info->mr_cache_ro) {
+		ret = _gnix_mr_cache_destroy(info->mr_cache_ro);
+		if (ret != FI_SUCCESS)
+			GNIX_FATAL(FI_LOG_DOMAIN, "failed to destroy ro mr "
+					"cache dom=%p ret=%d\n",
+					domain, ret);
+	}
+
+	if (info->mr_cache_rw) {
+		ret = _gnix_mr_cache_destroy(info->mr_cache_rw);
 		if (ret != FI_SUCCESS)
-			GNIX_FATAL(FI_LOG_DOMAIN, "failed to destroy mr cache "
-					"during domain destruct, dom=%p ret=%d\n",
+			GNIX_FATAL(FI_LOG_DOMAIN, "failed to destroy rw mr "
+					"cache dom=%p ret=%d\n",
 					domain, ret);
 	}
 
+	info->inuse = 0;
 	return FI_SUCCESS;
 }
 
 static int __cache_flush(struct gnix_fid_domain *domain)
 {
-	int ret;
+	int ret = FI_SUCCESS;
+	int i;
+	struct gnix_mr_cache_info *info;
 
 	fastlock_acquire(&domain->mr_cache_lock);
-	ret = _gnix_mr_cache_flush(domain->mr_cache);
+
+	for (i = 0; i < 256; i++) {
+		info = &domain->mr_cache_info[i];
+
+		fastlock_acquire(&info->mr_cache_lock);
+		if (!info->inuse) {
+			fastlock_release(&info->mr_cache_lock);
+			continue;
+		}
+
+		ret = _gnix_mr_cache_flush(info->mr_cache_ro);
+		if (ret) {
+			fastlock_release(&info->mr_cache_lock);
+			break;
+		}
+
+		ret = _gnix_mr_cache_flush(info->mr_cache_rw);
+		if (ret) {
+			fastlock_release(&info->mr_cache_lock);
+			break;
+		}
+
+		fastlock_release(&info->mr_cache_lock);
+	}
+
 	fastlock_release(&domain->mr_cache_lock);
 
 	return ret;
@@ -666,14 +875,21 @@ struct gnix_mr_ops cache_mr_ops = {
 	.flush_cache = __cache_flush,
 };
 
+static int __basic_mr_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
+{
+	struct gnix_mr_cache_info *info = domain->mr_cache_info;
 
-static int __basic_mr_init(struct gnix_fid_domain *domain) {
-	domain->mr_is_init = 1;
+	info->inuse = 1;
 	return FI_SUCCESS;
 }
 
-static int __basic_mr_is_init(struct gnix_fid_domain *domain) {
-	return domain->mr_is_init;
+static int __basic_mr_is_init(struct gnix_fid_domain *domain,
+		struct gnix_auth_key *auth_key)
+{
+	struct gnix_mr_cache_info *info = domain->mr_cache_info;
+
+	return info->inuse;
 }
 
 static int __basic_mr_reg_mr(
@@ -681,8 +897,8 @@ static int __basic_mr_reg_mr(
 		uint64_t                    address,
 		uint64_t                    length,
 		struct _gnix_fi_reg_context *fi_reg_context,
-		void                        **handle) {
-
+		void                        **handle)
+{
 	struct gnix_fid_mem_desc *md, *ret;
 
 	md = calloc(1, sizeof(*md));
@@ -690,6 +906,7 @@ static int __basic_mr_reg_mr(
 		GNIX_WARN(FI_LOG_MR, "failed to allocate memory");
 		return -FI_ENOMEM;
 	}
+
 	ret = __gnix_register_region((void *) md, (void *) address, length,
 			fi_reg_context, (void *) domain);
 	if (!ret) {
@@ -706,8 +923,8 @@ static int __basic_mr_reg_mr(
 static int __basic_mr_dereg_mr(struct gnix_fid_domain *domain,
 		struct gnix_fid_mem_desc *md)
 {
-	int ret; 
-	
+	int ret;
+
 	ret = __gnix_deregister_region((void *) md, NULL);
 	if (ret == FI_SUCCESS)
 		free((void *) md);
@@ -723,13 +940,12 @@ struct gnix_mr_ops basic_mr_ops = {
 	.flush_cache = NULL, // unsupported since there is no caching here
 };
 
-
 int _gnix_open_cache(struct gnix_fid_domain *domain, int type)
 {
 	if (type < 0 || type >= GNIX_MR_MAX_TYPE)
 		return -FI_EINVAL;
 
-	if (domain->mr_ops && domain->mr_ops->is_init(domain))
+	if (domain->mr_ops && domain->mr_ops->is_init(domain, domain->auth_key))
 		return -FI_EBUSY;
 
 	switch(type) {
@@ -748,7 +964,6 @@ int _gnix_open_cache(struct gnix_fid_domain *domain, int type)
 	return FI_SUCCESS;
 }
 
-
 int _gnix_flush_registration_cache(struct gnix_fid_domain *domain)
 {
 	if (domain->mr_ops && domain->mr_ops->flush_cache)
@@ -757,13 +972,14 @@ int _gnix_flush_registration_cache(struct gnix_fid_domain *domain)
 	return FI_SUCCESS;  // if no flush was present, silently pass
 }
 
-int _gnix_close_cache(struct gnix_fid_domain *domain)
+int _gnix_close_cache(struct gnix_fid_domain *domain,
+		struct gnix_mr_cache_info *info)
 {
 	/* if the domain isn't being destructed by close, we need to check the
 	 * cache again. This isn't a likely case. Destroy must succeed since we
 	 * are in the destruct path */
 	if (domain->mr_ops && domain->mr_ops->destroy_cache)
-		return domain->mr_ops->destroy_cache(domain);
+		return domain->mr_ops->destroy_cache(domain, info);
 
 	return FI_SUCCESS;
 }
diff --git a/prov/gni/src/gnix_mr_cache.c b/prov/gni/src/gnix_mr_cache.c
index 14a2725..66ac649 100644
--- a/prov/gni/src/gnix_mr_cache.c
+++ b/prov/gni/src/gnix_mr_cache.c
@@ -78,7 +78,7 @@ typedef struct gnix_mr_cache_key {
 typedef struct gnix_mr_cache_entry {
 	cache_entry_state_t state;
 	gnix_mr_cache_key_t key;
-	atomic_t ref_cnt;
+	ofi_atomic32_t ref_cnt;
 	struct dlist_entry lru_entry;
 	struct dlist_entry siblings;
 	struct dlist_entry children;
@@ -538,7 +538,7 @@ __clear_notifier_events(gnix_mr_cache_t *cache)
 						   entry, entry->key.address,
 						   entry->key.length);
 
-					atomic_dec(&cache->stale.elements);
+					ofi_atomic_dec32(&cache->stale.elements);
 
 				} else {
 					GNIX_WARN(FI_LOG_MR, "Failed to remove"
@@ -719,7 +719,7 @@ static inline int __insert_entry_into_stale(
 			   entry->key.address, entry->key.length);
 
 		__mr_cache_lru_enqueue(cache, entry);
-		atomic_inc(&cache->stale.elements);
+		ofi_atomic_inc32(&cache->stale.elements);
 		switch (__entry_get_state(entry)) {
 		case  GNIX_CES_INUSE:
 			__entry_set_state(entry, GNIX_CES_STALE);
@@ -802,7 +802,7 @@ static inline void __resolve_stale_entry_collision(
 				  " from lru list (%p)\n",
 				  c_entry);
 		}
-		atomic_dec(&cache->stale.elements);
+		ofi_atomic_dec32(&cache->stale.elements);
 		dlist_remove(&c_entry->siblings);
 		__mr_cache_entry_destroy(cache, c_entry);
 	}
@@ -851,7 +851,7 @@ static inline int __mr_cache_entry_get(
 {
 	GNIX_TRACE(FI_LOG_MR, "\n");
 
-	return atomic_inc(&entry->ref_cnt);
+	return ofi_atomic_inc32(&entry->ref_cnt);
 }
 
 /**
@@ -879,7 +879,7 @@ static inline int __mr_cache_entry_put(
 		__clear_notifier_events(cache);
 	}
 
-	if (atomic_dec(&entry->ref_cnt) == 0) {
+	if (ofi_atomic_dec32(&entry->ref_cnt) == 0) {
 		next = entry->siblings.next;
 		dlist_remove(&entry->children);
 		dlist_remove(&entry->siblings);
@@ -896,11 +896,11 @@ static inline int __mr_cache_entry_put(
 						"failed to release reference to parent, "
 						"parent=%p refs=%d\n",
 						parent,
-						atomic_get(&parent->ref_cnt));
+						ofi_atomic_get32(&parent->ref_cnt));
 			}
 		}
 
-		atomic_dec(&cache->inuse.elements);
+		ofi_atomic_dec32(&cache->inuse.elements);
 
 		if (!__entry_is_retired(entry)) {
 			iter = rbtFind(cache->inuse.rb_tree, &entry->key);
@@ -1030,8 +1030,8 @@ int _gnix_mr_cache_init(
 	 *   destroy will have already set the element counts
 	 */
 	if (cache_p->state == GNIX_MRC_STATE_UNINITIALIZED) {
-		atomic_initialize(&cache_p->inuse.elements, 0);
-		atomic_initialize(&cache_p->stale.elements, 0);
+		ofi_atomic_initialize32(&cache_p->inuse.elements, 0);
+		ofi_atomic_initialize32(&cache_p->stale.elements, 0);
 	}
 
 	cache_p->hits = 0;
@@ -1069,7 +1069,7 @@ int _gnix_mr_cache_destroy(gnix_mr_cache_t *cache)
 	 *   then someone forgot to deregister memory.
 	 *   We probably shouldn't destroy the cache at this point.
 	 */
-	if (atomic_get(&cache->inuse.elements) != 0) {
+	if (ofi_atomic_get32(&cache->inuse.elements) != 0) {
 		return -FI_EAGAIN;
 	}
 
@@ -1141,10 +1141,10 @@ int __mr_cache_flush(gnix_mr_cache_t *cache, int flush_count) {
 
 	GNIX_DEBUG(FI_LOG_MR, "flushed %i of %i entries from memory "
 		   "registration cache\n", destroyed,
-		   atomic_get(&cache->stale.elements));
+		   ofi_atomic_get32(&cache->stale.elements));
 
 	if (destroyed > 0) {
-		atomic_sub(&cache->stale.elements, destroyed);
+		ofi_atomic_sub32(&cache->stale.elements, destroyed);
 	}
 
 	return FI_SUCCESS;
@@ -1361,7 +1361,7 @@ static int __mr_cache_search_stale(
 			} else {
 				if (__mr_cache_lru_remove(cache, mr_entry)
 				    == FI_SUCCESS) {
-					atomic_dec(&cache->stale.elements);
+					ofi_atomic_dec32(&cache->stale.elements);
 				} else {
 					GNIX_WARN(FI_LOG_MR, "Failed to remove"
 						  " entry (%p) from lru list\n",
@@ -1390,7 +1390,7 @@ static int __mr_cache_search_stale(
 					  mr_entry);
 			}
 
-			atomic_dec(&cache->stale.elements);
+			ofi_atomic_dec32(&cache->stale.elements);
 
 			/* if we made it to this point, there weren't
 			 * any entries in the inuse tree that would
@@ -1404,8 +1404,8 @@ static int __mr_cache_search_stale(
 					   "inuse tree\n");
 			}
 
-			atomic_set(&mr_entry->ref_cnt, 1);
-			atomic_inc(&cache->inuse.elements);
+			ofi_atomic_set32(&mr_entry->ref_cnt, 1);
+			ofi_atomic_inc32(&cache->inuse.elements);
 
 			*entry = mr_entry;
 		}
@@ -1478,8 +1478,8 @@ static int __mr_cache_create_registration(
 		   current_entry->key.address, current_entry->key.length);
 
 
-	atomic_inc(&cache->inuse.elements);
-	atomic_initialize(&current_entry->ref_cnt, 1);
+	ofi_atomic_inc32(&cache->inuse.elements);
+	ofi_atomic_initialize32(&current_entry->ref_cnt, 1);
 
 	*entry = current_entry;
 
@@ -1534,7 +1534,7 @@ int _gnix_mr_cache_register(
 
 	/* if we shouldn't introduce any new elements, return -FI_ENOSPC */
 	if (unlikely(cache->attr.hard_reg_limit > 0 &&
-			(atomic_get(&cache->inuse.elements) >=
+			(ofi_atomic_get32(&cache->inuse.elements) >=
 			 cache->attr.hard_reg_limit))) {
 		ret = -FI_ENOSPC;
 		goto err;
@@ -1558,8 +1558,8 @@ int _gnix_mr_cache_register(
 	 *   room for the new entry. This works because we check above to see if
 	 *   the number of inuse entries exceeds the hard reg limit
 	 */
-	if ((atomic_get(&cache->inuse.elements) +
-			atomic_get(&cache->stale.elements)) == cache->attr.hard_reg_limit)
+	if ((ofi_atomic_get32(&cache->inuse.elements) +
+			ofi_atomic_get32(&cache->stale.elements)) == cache->attr.hard_reg_limit)
 		__mr_cache_flush(cache, 1);
 
 	ret = __mr_cache_create_registration(cache, address, length,
@@ -1611,14 +1611,14 @@ int _gnix_mr_cache_deregister(
 	}
 
 	GNIX_DEBUG(FI_LOG_MR, "entry found, entry=%p refs=%d\n",
-		   entry, atomic_get(&entry->ref_cnt));
+		   entry, ofi_atomic_get32(&entry->ref_cnt));
 
 	grc = __mr_cache_entry_put(cache, entry);
 
 	/* Since we check this on each deregistration, the amount of elements
 	 * over the limit should always be 1
 	 */
-	if (atomic_get(&cache->stale.elements) > cache->attr.hard_stale_limit)
+	if (ofi_atomic_get32(&cache->stale.elements) > cache->attr.hard_stale_limit)
 		__mr_cache_flush(cache, 1);
 
 	return gnixu_to_fi_errno(grc);
diff --git a/prov/gni/src/gnix_mr_notifier.c b/prov/gni/src/gnix_mr_notifier.c
index 174cc6c..0ae333f 100644
--- a/prov/gni/src/gnix_mr_notifier.c
+++ b/prov/gni/src/gnix_mr_notifier.c
@@ -30,10 +30,13 @@
  * SOFTWARE.
  */
 
-#ifdef HAVE_KDREG
 
 #include "gnix_mr_notifier.h"
 
+#if HAVE_KDREG
+
+struct gnix_mr_notifier global_mr_not;
+
 static inline int
 notifier_verify_stuff(struct gnix_mr_notifier *mrn) {
 	/* Can someone confirm that these values are POSIX so we can
@@ -55,69 +58,68 @@ notifier_verify_stuff(struct gnix_mr_notifier *mrn) {
 }
 
 int
-_gnix_notifier_init(struct gnix_mr_notifier *mrn)
+_gnix_notifier_init(void)
 {
-	if (mrn == NULL) {
-		GNIX_INFO(FI_LOG_MR, "mr notifier NULL\n");
-		return -FI_EINVAL;
-	}
-
-	mrn->fd = 0;
-	mrn->cntr = NULL;
-	fastlock_init(&mrn->lock);
+	global_mr_not.fd = -1;
+	global_mr_not.cntr = NULL;
+	fastlock_init(&global_mr_not.lock);
+	global_mr_not.ref_cnt = 0;
 
 	return FI_SUCCESS;
 }
 
 int
-_gnix_notifier_open(struct gnix_mr_notifier *mrn)
+_gnix_notifier_open(struct gnix_mr_notifier **mrn)
 {
 	int ret = FI_SUCCESS;
 	int kdreg_fd, ret_errno;
         kdreg_get_user_delta_args_t get_user_delta_args;
 
-	if ((mrn->fd != 0) || (mrn->cntr != NULL)) {
-		GNIX_INFO(FI_LOG_MR, "mr notifier already open\n");
-		return -FI_EBUSY;
-	}
+	fastlock_acquire(&global_mr_not.lock);
 
-	fastlock_acquire(&mrn->lock);
+	if (!global_mr_not.ref_cnt) {
+		kdreg_fd = open(KDREG_DEV, O_RDWR | O_NONBLOCK);
+		if (kdreg_fd < 0) {
+			ret_errno = errno;
+			if (ret_errno != FI_EBUSY) {
+				GNIX_INFO(FI_LOG_MR,
+					  "kdreg device open failed: %s\n",
+					  strerror(ret_errno));
+			}
+			/* Not all of these map to fi_errno values */
+			ret = -ret_errno;
+			goto err_exit;
+		}
 
-	kdreg_fd = open(KDREG_DEV, O_RDWR | O_NONBLOCK);
-	if (kdreg_fd < 0) {
-		ret_errno = errno;
-		if (ret_errno != FI_EBUSY) {
-			GNIX_INFO(FI_LOG_MR, "kdreg device open failed: %s\n",
+		memset(&get_user_delta_args, 0, sizeof(get_user_delta_args));
+		if (ioctl(kdreg_fd, KDREG_IOC_GET_USER_DELTA,
+			  &get_user_delta_args) < 0) {
+			ret_errno = errno;
+			GNIX_INFO(FI_LOG_MR,
+				  "kdreg get_user_delta failed: %s\n",
 				  strerror(ret_errno));
+			close(kdreg_fd);
+			/* Not all of these map to fi_errno values */
+			ret = -ret_errno;
+			goto err_exit;
 		}
-		// Not all of these map to fi_errno values
-		ret = -ret_errno;
-		goto err_exit;
-	}
 
-	(void) memset(&get_user_delta_args,0,sizeof(get_user_delta_args));
-	if (ioctl(kdreg_fd, KDREG_IOC_GET_USER_DELTA,
-		  &get_user_delta_args) < 0) {
-		ret_errno = errno;
-		GNIX_INFO(FI_LOG_MR, "kdreg get_user_delta failed: %s\n",
-			  strerror(ret_errno));
-		close(kdreg_fd);
-		// Not all of these map to fi_errno values
-		ret = -ret_errno;
-		goto err_exit;
-	}
+		if (get_user_delta_args.user_delta == NULL) {
+			GNIX_INFO(FI_LOG_MR, "kdreg get_user_delta is NULL\n");
+			ret = -FI_ENODATA;
+			goto err_exit;
+		}
 
-	if (get_user_delta_args.user_delta == NULL) {
-		GNIX_INFO(FI_LOG_MR, "kdreg get_user_delta is NULL\n");
-		ret = -FI_ENODATA;
-		goto err_exit;
+		global_mr_not.fd = kdreg_fd;
+		global_mr_not.cntr = (kdreg_user_delta_t *)
+				get_user_delta_args.user_delta;
 	}
 
-	mrn->fd = kdreg_fd;
-	mrn->cntr = (kdreg_user_delta_t *) get_user_delta_args.user_delta;
+	global_mr_not.ref_cnt++;
+	*mrn = &global_mr_not;
 
 err_exit:
-	fastlock_release(&mrn->lock);
+	fastlock_release(&global_mr_not.lock);
 
 	return ret;
 }
@@ -128,30 +130,39 @@ _gnix_notifier_close(struct gnix_mr_notifier *mrn)
 	int ret = FI_SUCCESS;
 	int ret_errno;
 
-	ret = notifier_verify_stuff(mrn);
+	fastlock_acquire(&mrn->lock);
 
-	if (ret == 0) {
-		fastlock_acquire(&mrn->lock);
+	ret = notifier_verify_stuff(mrn);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_MR, "Invalid MR notifier\n");
+		goto err_exit;
+	}
 
-		if (close(mrn->fd) != 0) {
-			ret_errno = errno;
-			GNIX_INFO(FI_LOG_MR, "error closing kdreg device: %s\n",
-				  strerror(ret_errno));
-			// Not all of these map to fi_errno values
-			ret = -ret_errno;
-			goto err_exit;
-		}
+	assert(mrn->ref_cnt > 0);
+	if (--mrn->ref_cnt) {
+		goto err_exit;
+	}
 
-		mrn->cntr = NULL;
-	err_exit:
-		fastlock_release(&mrn->lock);
+	if (close(mrn->fd) != 0) {
+		ret_errno = errno;
+		GNIX_INFO(FI_LOG_MR, "error closing kdreg device: %s\n",
+			  strerror(ret_errno));
+		/* Not all of these map to fi_errno values */
+		ret = -ret_errno;
+		goto err_exit;
 	}
 
+	mrn->fd = -1;
+	mrn->cntr = NULL;
+err_exit:
+	fastlock_release(&mrn->lock);
+
 	return ret;
 }
 
 static inline int
-kdreg_write(struct gnix_mr_notifier *mrn, void *buf, size_t len) {
+kdreg_write(struct gnix_mr_notifier *mrn, void *buf, size_t len)
+{
 	int ret;
 
 	ret = write(mrn->fd, buf, len);
@@ -173,7 +184,13 @@ _gnix_notifier_monitor(struct gnix_mr_notifier *mrn,
 	int ret;
 	struct registration_monitor rm;
 
+	fastlock_acquire(&mrn->lock);
+
 	ret = notifier_verify_stuff(mrn);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_MR, "Invalid MR notifier\n");
+		goto err_exit;
+	}
 
 	if (ret == 0) {
 		GNIX_DEBUG(FI_LOG_MR, "monitoring %p (len=%lu) cookie=%lu\n",
@@ -188,6 +205,9 @@ _gnix_notifier_monitor(struct gnix_mr_notifier *mrn,
 		ret = kdreg_write(mrn, &rm, sizeof(rm));
 	}
 
+err_exit:
+	fastlock_release(&mrn->lock);
+
 	return ret;
 }
 
@@ -197,17 +217,25 @@ _gnix_notifier_unmonitor(struct gnix_mr_notifier *mrn, uint64_t cookie)
 	int ret;
 	struct registration_monitor rm;
 
+	fastlock_acquire(&mrn->lock);
+
 	ret = notifier_verify_stuff(mrn);
-	if (ret == 0) {
-		GNIX_DEBUG(FI_LOG_MR, "unmonitoring cookie=%lu\n", cookie);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_MR, "Invalid MR notifier\n");
+		goto err_exit;
+	}
 
-		memset(&rm, 0, sizeof(rm));
+	GNIX_DEBUG(FI_LOG_MR, "unmonitoring cookie=%lu\n", cookie);
 
-		rm.type = REGISTRATION_UNMONITOR;
-		rm.u.unmon.user_cookie = cookie;
+	memset(&rm, 0, sizeof(rm));
 
-		ret = kdreg_write(mrn, &rm, sizeof(rm));
-	}
+	rm.type = REGISTRATION_UNMONITOR;
+	rm.u.unmon.user_cookie = cookie;
+
+	ret = kdreg_write(mrn, &rm, sizeof(rm));
+
+err_exit:
+	fastlock_release(&mrn->lock);
 
 	return ret;
 }
@@ -223,25 +251,29 @@ _gnix_notifier_get_event(struct gnix_mr_notifier *mrn, void* buf, size_t len)
 		return -FI_EINVAL;
 	}
 
+	fastlock_acquire(&mrn->lock);
+
 	if (*(mrn->cntr) > 0) {
 		GNIX_DEBUG(FI_LOG_MR, "reading kdreg event\n");
 		ret = read(mrn->fd, buf, len);
-		if (ret >= 0) {
-			return ret;
-		} else {
+		if (ret < 0) {
 			ret_errno = errno;
 			if (ret_errno != EAGAIN) {
 				GNIX_WARN(FI_LOG_MR,
 					  "kdreg event read failed: %s\n",
 					  strerror(ret_errno));
 			}
-			// Not all of these map to fi_errno values
-			return -ret_errno;
+			/* Not all of these map to fi_errno values */
+			ret = -ret_errno;
 		}
 	} else {
 		GNIX_DEBUG(FI_LOG_MR, "nothing to read from kdreg :(\n");
-		return -FI_EAGAIN;
+		ret = -FI_EAGAIN;
 	}
+
+	fastlock_release(&mrn->lock);
+
+	return ret;
 }
 
 #endif /* HAVE_KDREG */
diff --git a/prov/gni/src/gnix_msg.c b/prov/gni/src/gnix_msg.c
index 7678b1d..fe1de27 100644
--- a/prov/gni/src/gnix_msg.c
+++ b/prov/gni/src/gnix_msg.c
@@ -1,6 +1,7 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -52,6 +53,8 @@
 
 #define GNIX_TAGGED_PCD_COMPLETION_FLAGS	(FI_MSG | FI_RECV | FI_TAGGED)
 
+smsg_completer_fn_t gnix_ep_smsg_completers[];
+
 /*******************************************************************************
  * helper functions
  ******************************************************************************/
@@ -205,6 +208,51 @@ static void __gnix_msg_pack_data_from_iov(uint64_t dest, size_t dest_len,
 	}
 }
 
+
+/*
+ * TODO: this can eventually be used in more places in this
+ * but the msg component of the fab request structure would
+ * need to be refactored.
+ */
+static inline int __gnix_msg_register_iov(struct gnix_fid_domain *dom,
+					  const struct iovec *iov,
+					  size_t count,
+					  struct gnix_fid_mem_desc **md_vec)
+{
+	int i, ret = FI_SUCCESS;
+	struct fid_mr *auto_mr = NULL;
+
+	for (i = 0; i < count; i++) {
+		ret = gnix_mr_reg(&dom->domain_fid.fid,
+				  iov[i].iov_base,
+				  iov[i].iov_len,
+				  FI_READ | FI_WRITE, 0,
+				  0, 0, &auto_mr,
+				  NULL);
+
+		if (ret != FI_SUCCESS) {
+			GNIX_DEBUG(FI_LOG_EP_DATA,
+				   "Failed to "
+				   "auto-register"
+				   " local buffer: %s\n",
+				   fi_strerror(-ret));
+
+			for (i--; i >= 0; i--) {
+				fi_close(&md_vec[i]->mr_fid.fid);
+			}
+
+			goto fn_exit;
+		}
+
+		md_vec[i] = container_of((void *) auto_mr,
+					struct gnix_fid_mem_desc,
+					mr_fid);
+	}
+
+fn_exit:
+	return ret;
+}
+
 static void __gnix_msg_copy_data_to_recv_addr(struct gnix_fab_req *req,
 					      void *data)
 {
@@ -230,34 +278,15 @@ static void __gnix_msg_copy_data_to_recv_addr(struct gnix_fab_req *req,
 	}
 }
 
-static struct gnix_fab_req *__gnix_msg_dup_req(struct gnix_fab_req *req)
-{
-	struct gnix_fab_req *new_req;
-
-	new_req = _gnix_fr_alloc(req->gnix_ep);
-	if (new_req == NULL) {
-		GNIX_WARN(FI_LOG_EP_DATA, "Failed to allocate request\n");
-		return NULL;
-	}
-
-	/* TODO: selectively copy fields. */
-	memcpy((void *)new_req, (void *)req, sizeof(*req));
-
-	return new_req;
-}
-
 static void __gnix_msg_queues(struct gnix_fid_ep *ep,
 			      int tagged,
-			      fastlock_t **queue_lock,
 			      struct gnix_tag_storage **posted_queue,
 			      struct gnix_tag_storage **unexp_queue)
 {
 	if (tagged) {
-		*queue_lock = &ep->tagged_queue_lock;
 		*posted_queue = &ep->tagged_posted_recv_queue;
 		*unexp_queue = &ep->tagged_unexp_recv_queue;
 	} else {
-		*queue_lock = &ep->recv_queue_lock;
 		*posted_queue = &ep->posted_recv_queue;
 		*unexp_queue = &ep->unexp_recv_queue;
 	}
@@ -268,26 +297,26 @@ static void __gnix_msg_send_fr_complete(struct gnix_fab_req *req,
 {
 	struct gnix_vc *vc = req->vc;
 
-	atomic_dec(&vc->outstanding_tx_reqs);
+	ofi_atomic_dec32(&vc->outstanding_tx_reqs);
 	_gnix_nic_tx_free(req->gnix_ep->nic, txd);
 
 	_gnix_fr_free(req->gnix_ep, req);
 
 	/* Schedule VC TX queue in case the VC is 'fenced'. */
 	_gnix_vc_tx_schedule(vc);
-
 }
 
 static int __recv_err(struct gnix_fid_ep *ep, void *context, uint64_t flags,
 		      size_t len, void *addr, uint64_t data, uint64_t tag,
-		      size_t olen, int err, int prov_errno, void *err_data)
+		      size_t olen, int err, int prov_errno, void *err_data,
+		      size_t err_data_size)
 {
 	int rc;
 
 	if (ep->recv_cq) {
 		rc = _gnix_cq_add_error(ep->recv_cq, context, flags, len,
 					addr, data, tag, olen, err,
-					prov_errno, err_data);
+					prov_errno, err_data, err_data_size);
 		if (rc != FI_SUCCESS)  {
 			GNIX_WARN(FI_LOG_EP_DATA,
 				  "_gnix_cq_add_error returned %d\n",
@@ -312,29 +341,86 @@ static int __gnix_msg_recv_err(struct gnix_fid_ep *ep, struct gnix_fab_req *req)
 
 	flags |= req->msg.send_flags & FI_TAGGED;
 
-	/* TODO: Check for FI_MULTI_RECV? */
 	return __recv_err(ep, req->user_context, flags, req->msg.cum_recv_len,
 			  (void *)req->msg.recv_info[0].recv_addr, req->msg.imm,
 			  req->msg.tag, 0, FI_ECANCELED,
-			  GNI_RC_TRANSACTION_ERROR, NULL);
+			  GNI_RC_TRANSACTION_ERROR, NULL, 0);
 }
 
 static int __recv_completion(
 		struct gnix_fid_ep *ep,
 		struct gnix_fab_req *req,
-		void *context,
+		uint64_t flags,
+		size_t len,
+		void *addr)
+{
+	ssize_t rc;
+
+	if ((req->msg.recv_flags & FI_COMPLETION) && ep->recv_cq) {
+		rc = _gnix_cq_add_event(ep->recv_cq,
+					ep,
+					req->user_context,
+					flags,
+					len,
+					addr,
+					req->msg.imm,
+					req->msg.tag,
+					FI_ADDR_NOTAVAIL);
+		if (rc != FI_SUCCESS)  {
+			GNIX_WARN(FI_LOG_EP_DATA,
+				"_gnix_cq_add_event returned %d\n",
+				rc);
+		}
+	}
+
+	if (ep->recv_cntr) {
+		rc = _gnix_cntr_inc(ep->recv_cntr);
+		if (rc != FI_SUCCESS)
+			GNIX_WARN(FI_LOG_EP_DATA,
+				  "_gnix_cntr_inc() failed: %d\n",
+				  rc);
+	}
+
+	return FI_SUCCESS;
+}
+
+static int __recv_completion_src(
+		struct gnix_fid_ep *ep,
+		struct gnix_fab_req *req,
 		uint64_t flags,
 		size_t len,
 		void *addr,
-		uint64_t data,
-		uint64_t tag,
 		fi_addr_t src_addr)
 {
-	int rc;
+	ssize_t rc;
+
+	GNIX_TRACE(FI_LOG_TRACE, "\n");
 
 	if ((req->msg.recv_flags & FI_COMPLETION) && ep->recv_cq) {
-		rc = _gnix_cq_add_event(ep->recv_cq, context, flags, len,
-					addr, data, tag, src_addr);
+		if (src_addr == FI_ADDR_NOTAVAIL) {
+			rc = _gnix_cq_add_error(ep->recv_cq,
+						req->user_context,
+						flags,
+						len,
+						addr,
+						req->msg.imm,
+						req->msg.tag,
+						0,
+						FI_EADDRNOTAVAIL,
+						0,
+						req->vc->gnix_ep_name,
+						sizeof(struct gnix_ep_name));
+		} else {
+			rc = _gnix_cq_add_event(ep->recv_cq,
+						ep,
+						req->user_context,
+						flags,
+						len,
+						addr,
+						req->msg.imm,
+						req->msg.tag,
+						src_addr);
+		}
 		if (rc != FI_SUCCESS)  {
 			GNIX_WARN(FI_LOG_EP_DATA,
 					"_gnix_cq_add_event returned %d\n",
@@ -353,28 +439,70 @@ static int __recv_completion(
 	return FI_SUCCESS;
 }
 
+/*
+ * GNI provider generates a separate CQE to indicate
+ * its releasing a FI_MULTI_RECV receive buffer back to
+ * the application.
+ */
+static void __gnix_msg_mrecv_completion(void *obj)
+{
+	int ret;
+	struct gnix_fab_req *req = (struct gnix_fab_req *)obj;
+
+	ret = __recv_completion(req->gnix_ep,
+				req,
+				FI_MULTI_RECV,
+				0UL,
+				NULL);
+	if (ret != FI_SUCCESS) {
+		GNIX_DEBUG(FI_LOG_EP_DATA,
+			  "__recv_completion failed for multi recv"
+			  " complete: %d\n",
+				  ret);
+	}
+}
+
 static inline int __gnix_msg_recv_completion(struct gnix_fid_ep *ep,
 					     struct gnix_fab_req *req)
 {
+	int ret;
 	uint64_t flags = FI_RECV | FI_MSG;
+	size_t len;
+	void *recv_addr = NULL;
+	fi_addr_t src_addr;
 
 	flags |= req->msg.send_flags & (FI_TAGGED | FI_REMOTE_CQ_DATA);
-	flags |= req->msg.recv_flags & (FI_PEEK | FI_CLAIM | FI_DISCARD |
-					FI_MULTI_RECV);
+	flags |= req->msg.recv_flags & (FI_PEEK | FI_CLAIM | FI_DISCARD);
+
+	len = MIN(req->msg.cum_send_len, req->msg.cum_recv_len);
+
+	if (unlikely(req->msg.recv_flags & FI_MULTI_RECV))
+		recv_addr = (void *)req->msg.recv_info[0].recv_addr;
+
+	if (likely(!(ep->caps & FI_SOURCE))) {
+		ret = __recv_completion(ep,
+					 req,
+					 flags,
+					 len,
+					 recv_addr);
+	} else {
+		src_addr = _gnix_vc_peer_fi_addr(req->vc);
+		ret = __recv_completion_src(ep,
+					     req,
+					     flags,
+					     len,
+					     recv_addr,
+					     src_addr);
+	}
 
 	/*
-	 * see fi_cq man page
+	 * if i'm child of a FI_MULTI_RECV request, decrement
+	 * ref count
 	 */
-	if (req->msg.recv_flags & GNIX_MSG_MULTI_RECV_SUP)
-		flags &= ~FI_MULTI_RECV;
-
-	return __recv_completion(ep, req, req->user_context, flags,
-				 MIN(req->msg.cum_send_len, req->msg.cum_recv_len),
-				 req->msg.recv_flags & FI_MULTI_RECV ?
-				 (void *)req->msg.recv_info[0].recv_addr :
-				 NULL,
-				 req->msg.imm, req->msg.tag,
-				 _gnix_vc_peer_fi_addr(req->vc));
+	if (req->msg.parent != NULL) {
+		_gnix_ref_put(req->msg.parent);
+	}
+	return ret;
 }
 
 static int __gnix_msg_send_err(struct gnix_fid_ep *ep, struct gnix_fab_req *req)
@@ -387,7 +515,7 @@ static int __gnix_msg_send_err(struct gnix_fid_ep *ep, struct gnix_fab_req *req)
 	if (ep->send_cq) {
 		rc = _gnix_cq_add_error(ep->send_cq, req->user_context,
 					flags, 0, 0, 0, 0, 0, FI_ECANCELED,
-					GNI_RC_TRANSACTION_ERROR, NULL);
+					GNI_RC_TRANSACTION_ERROR, NULL, 0);
 		if (rc != FI_SUCCESS)  {
 			GNIX_WARN(FI_LOG_EP_DATA,
 				   "_gnix_cq_add_error() returned %d\n",
@@ -417,9 +545,8 @@ static int __gnix_msg_send_completion(struct gnix_fid_ep *ep,
 	GNIX_DEBUG(FI_LOG_EP_DATA, "send_cq = %p\n", ep->send_cq);
 
 	if ((req->msg.send_flags & FI_COMPLETION) && ep->send_cq) {
-		rc = _gnix_cq_add_event(ep->send_cq,
-				req->user_context,
-				flags, 0, 0, 0, 0, FI_ADDR_NOTAVAIL);
+		rc = _gnix_cq_add_event(ep->send_cq, ep, req->user_context,
+					flags, 0, 0, 0, 0, FI_ADDR_NOTAVAIL);
 		if (rc != FI_SUCCESS)  {
 			GNIX_WARN(FI_LOG_EP_DATA,
 					"_gnix_cq_add_event returned %d\n",
@@ -480,6 +607,7 @@ static int __gnix_rndzv_req_send_fin(void *arg)
 	if ((status == GNI_RC_SUCCESS) &&
 		(ep->domain->data_progress == FI_PROGRESS_AUTO))
 		_gnix_rma_post_irq(req->vc);
+
 	COND_RELEASE(nic->requires_lock, &nic->lock);
 
 	if (status == GNI_RC_NOT_DONE) {
@@ -595,7 +723,8 @@ static inline void __gnix_msg_iov_cpy_unaligned_head_tail_data(struct gnix_fab_r
 	/* Copy out the "middle" head and tail data found when building the iov request */
 	for (i = 0; i < req->msg.recv_iov_cnt; i++) {
 		if (req->msg.recv_info[i].tail_len) {
-			addr = (void *) ((uint8_t *) req->msg.htd_buf + (GNI_READ_ALIGN * i));
+			addr = (void *) ((uint8_t *) req->int_tx_buf +
+			       (GNI_READ_ALIGN * i));
 
 			recv_addr = (void *) (req->msg.recv_info[i].recv_addr +
 					      req->msg.recv_info[i].recv_len -
@@ -612,10 +741,10 @@ static inline void __gnix_msg_iov_cpy_unaligned_head_tail_data(struct gnix_fab_r
 		if (req->msg.recv_info[i].head_len) {
 			/* Since we move the remote addr backwards to a four
 			 * byte address and read four bytes, ensure that
-			 * what we read from the htd_buf is just the actual head
-			 * data we are interested in.
+			 * what we read from the int_tx_buf is just the actual
+			 * head data we are interested in.
 			 */
-			addr = (void *) ((uint8_t *) req->msg.htd_buf +
+			addr = (void *) ((uint8_t *) req->int_tx_buf +
 			     (GNI_READ_ALIGN * (i + GNIX_MAX_MSG_IOV_LIMIT)) +
 			     GNI_READ_ALIGN - req->msg.recv_info[i].head_len);
 			recv_addr = (void *) req->msg.recv_info[i].recv_addr;
@@ -643,13 +772,14 @@ static int __gnix_rndzv_req_complete(void *arg, gni_return_t tx_status)
 		 * unaligned bytes.  Bytes are copied from the request to the
 		 * user buffer once both TXDs arrive. */
 		if (txd->gni_desc.type == GNI_POST_FMA_GET)
-			req->msg.send_info[0].tail = *(uint32_t *)txd->int_buf;
+			req->msg.send_info[0].tail =
+				*(uint32_t *)req->int_tx_buf;
 
 		/* Remember any failure.  Retransmit both TXDs once both are
 		 * complete. */
 		req->msg.status |= tx_status;
 
-		if (atomic_dec(&req->msg.outstanding_txds) == 1) {
+		if (ofi_atomic_dec32(&req->msg.outstanding_txds) == 1) {
 			_gnix_nic_tx_free(req->gnix_ep->nic, txd);
 			GNIX_INFO(FI_LOG_EP_DATA,
 				  "Received first RDMA chain TXD, req: %p\n",
@@ -668,7 +798,7 @@ static int __gnix_rndzv_req_complete(void *arg, gni_return_t tx_status)
 			req->tx_failures++;
 			GNIX_INFO(FI_LOG_EP_DATA,
 				  "Requeueing failed request: %p\n", req);
-			return _gnix_vc_queue_work_req(req);
+			return _gnix_vc_requeue_work_req(req);
 		}
 
 		if (!GNIX_EP_DGM(req->gnix_ep->type)) {
@@ -686,7 +816,7 @@ static int __gnix_rndzv_req_complete(void *arg, gni_return_t tx_status)
 
 		req->msg.status = tx_status;
 		req->work_fn = __gnix_rndzv_req_send_fin;
-		return _gnix_vc_queue_work_req(req);
+		return _gnix_vc_requeue_work_req(req);
 	}
 
 	__gnix_msg_copy_unaligned_get_data(req);
@@ -700,9 +830,7 @@ static int __gnix_rndzv_req_complete(void *arg, gni_return_t tx_status)
 	}
 
 	req->work_fn = __gnix_rndzv_req_send_fin;
-	ret = _gnix_vc_queue_work_req(req);
-
-	return ret;
+	return _gnix_vc_requeue_work_req(req);
 }
 
 /*
@@ -722,13 +850,13 @@ static int __gnix_rndzv_iov_req_complete(void *arg, gni_return_t tx_status)
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
 
 	GNIX_DEBUG(FI_LOG_EP_DATA, "req->msg.outstanding_txds = %d\n",
-		   atomic_get(&req->msg.outstanding_txds));
+		   ofi_atomic_get32(&req->msg.outstanding_txds));
 
 	req->msg.status |= tx_status;
 
 	__gnix_msg_free_rma_txd(req, txd);
 
-	if (atomic_dec(&req->msg.outstanding_txds) == 0) {
+	if (ofi_atomic_dec32(&req->msg.outstanding_txds) == 0) {
 
 		/* All the txd's are complete, we just need our unaligned heads
 		 * and tails now
@@ -747,7 +875,7 @@ static int __gnix_rndzv_iov_req_complete(void *arg, gni_return_t tx_status)
 				/* Build and re-tx the entire iov request if the
 				 * ep type is "reliable datagram" */
 				req->work_fn = __gnix_rndzv_iov_req_build;
-				return _gnix_vc_queue_work_req(req);
+				return _gnix_vc_requeue_work_req(req);
 			}
 
 			if (!GNIX_EP_DGM(req->gnix_ep->type)) {
@@ -775,7 +903,7 @@ static int __gnix_rndzv_iov_req_complete(void *arg, gni_return_t tx_status)
 
 		/* Generate remote CQE and send fin msg back to sender */
 		req->work_fn = __gnix_rndzv_req_send_fin;
-		return _gnix_vc_queue_work_req(req);
+		return _gnix_vc_requeue_work_req(req);
 	}
 
 	/*
@@ -787,7 +915,7 @@ static int __gnix_rndzv_iov_req_complete(void *arg, gni_return_t tx_status)
 
 static int __gnix_rndzv_req_xpmem(struct gnix_fab_req *req)
 {
-	int ret = FI_SUCCESS, send_idx = 0, recv_idx = 0;
+	int ret = FI_SUCCESS, send_idx = 0, recv_idx = 0, i;
 	size_t cpy_len, recv_len;
 	uint64_t recv_ptr = 0UL;
 	struct gnix_xpmem_access_handle *access_hndl;
@@ -795,6 +923,19 @@ static int __gnix_rndzv_req_xpmem(struct gnix_fab_req *req)
 	recv_len = req->msg.recv_info[0].recv_len;
 	recv_ptr = req->msg.recv_info[0].recv_addr;
 
+	/* to avoid small xpmem cross maps first get/release
+	 * xpmem handles for all of the send_iov_cnt bufs
+	 */
+
+	for (i = 0; i < req->msg.send_iov_cnt; i++) {
+		ret = _gnix_xpmem_access_hndl_get(req->gnix_ep->xpmem_hndl,
+						  req->vc->peer_apid,
+						  req->msg.send_info[i].send_addr,
+						  req->msg.send_info[i].send_len,
+						  &access_hndl);
+		ret = _gnix_xpmem_access_hndl_put(access_hndl);
+	}
+
 	/* Copy data from/to (>=1) iovec entries */
 	while (send_idx < req->msg.send_iov_cnt) {
 		cpy_len = MIN(recv_len, req->msg.send_info[send_idx].send_len);
@@ -861,7 +1002,8 @@ static int __gnix_rndzv_req_xpmem(struct gnix_fab_req *req)
 			send_idx++;
 			recv_ptr += cpy_len;
 		}
-		GNIX_DEBUG(FI_LOG_EP_DATA, "send_idx = %d, recv_idx = %d\n", send_idx, recv_idx);
+		GNIX_DEBUG(FI_LOG_EP_DATA, "send_idx = %d, recv_idx = %d\n",
+				send_idx, recv_idx);
 	}
 
 	/*
@@ -888,9 +1030,6 @@ static int __gnix_rndzv_req(void *arg)
 	void *tail_data = NULL;
 
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
-	/*
-	 * TODO: xpmem intercept here
-	 */
 
 	if (req->vc->modes & GNIX_VC_MODE_XPMEM)
 		return  __gnix_rndzv_req_xpmem(req);
@@ -960,6 +1099,19 @@ static int __gnix_rndzv_req(void *arg)
 			return -FI_ENOSPC;
 		}
 
+		if (req->int_tx_buf_e == NULL) {
+			req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
+			if (req->int_tx_buf_e == NULL) {
+				GNIX_FATAL(FI_LOG_EP_DATA,
+					  "RAN OUT OF INT_TX_BUFS");
+				/* TODO return error */
+			}
+		}
+
+		req->int_tx_buf = ((struct gnix_int_tx_buf *)
+				   req->int_tx_buf_e)->buf;
+		req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(req->int_tx_buf_e);
+
 		tail_txd->completer_fn = __gnix_rndzv_req_complete;
 		tail_txd->req = req;
 
@@ -970,11 +1122,11 @@ static int __gnix_rndzv_req(void *arg)
 		tail_txd->gni_desc.type = GNI_POST_FMA_GET;
 		tail_txd->gni_desc.cq_mode = GNI_CQMODE_GLOBAL_EVENT;
 		tail_txd->gni_desc.dlvr_mode = GNI_DLVMODE_PERFORMANCE;
-		tail_txd->gni_desc.local_mem_hndl = nic->int_bufs_mdh;
+		tail_txd->gni_desc.local_mem_hndl = req->int_tx_mdh;
 		tail_txd->gni_desc.remote_mem_hndl = req->msg.rma_mdh;
 		tail_txd->gni_desc.rdma_mode = 0;
 		tail_txd->gni_desc.src_cq_hndl = nic->tx_cq;
-		tail_txd->gni_desc.local_addr = (uint64_t)tail_txd->int_buf;
+		tail_txd->gni_desc.local_addr = (uint64_t)req->int_tx_buf;
 		tail_txd->gni_desc.remote_addr = (uint64_t)tail_data;
 		tail_txd->gni_desc.length = GNI_READ_ALIGN;
 
@@ -1017,7 +1169,7 @@ static int __gnix_rndzv_req(void *arg)
 
 			/* Wait for the first TX to complete, then retransmit
 			 * the entire thing. */
-			atomic_set(&req->msg.outstanding_txds, 1);
+			ofi_atomic_set32(&req->msg.outstanding_txds, 1);
 			req->msg.status = GNI_RC_TRANSACTION_ERROR;
 
 			GNIX_INFO(FI_LOG_EP_DATA, "GNI_PostFma() failed: %s\n",
@@ -1026,7 +1178,7 @@ static int __gnix_rndzv_req(void *arg)
 		}
 
 		/* Wait for both TXs to complete, then process the request. */
-		atomic_set(&req->msg.outstanding_txds, 2);
+		ofi_atomic_set32(&req->msg.outstanding_txds, 2);
 		req->msg.status = GNI_RC_SUCCESS;
 
 	}
@@ -1045,7 +1197,7 @@ static int __gnix_rndzv_iov_req_post(void *arg)
 	struct gnix_tx_descriptor *txd;
 	gni_return_t status;
 	struct gnix_nic *nic = req->gnix_ep->nic;
-	int i, iov_txd_cnt = atomic_get(&req->msg.outstanding_txds);
+	int i, iov_txd_cnt = ofi_atomic_get32(&req->msg.outstanding_txds);
 
 	assert(nic != NULL);
 
@@ -1103,11 +1255,9 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 	gni_ct_get_post_descriptor_t *cur_ct = NULL;
 	void **next_ct = NULL;
 	int head_off, head_len, tail_len;
+	struct fid_mr *auto_mr;
 
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
-	/*
-	 * TODO: xpmem intercept here
-	 */
 
 	if (req->vc->modes & GNIX_VC_MODE_XPMEM)
 		return  __gnix_rndzv_req_xpmem(req);
@@ -1129,7 +1279,6 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 
 	/* Ensure the user's recv buffer is registered for recv/recvv */
 	if (!req->msg.recv_md[0]) {
-		struct fid_mr *auto_mr;
 
 		for (recv_idx = 0; recv_idx < recv_cnt; recv_idx++) {
 			auto_mr = NULL;
@@ -1188,19 +1337,22 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 		 */
 		if (send_ptr & GNI_READ_ALIGN_MASK ||
 		    (send_ptr + get_len) & GNI_READ_ALIGN_MASK) {
-			if (req->msg.htd_buf_e == NULL) {
-				req->msg.htd_buf_e = _gnix_ep_get_htd_buf(ep);
+			if (req->int_tx_buf_e == NULL) {
+				req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
 
-				/* There are no available htd bufs */
-				if (req->msg.htd_buf_e == NULL) {
-					atomic_set(&req->msg.outstanding_txds, 0);
+				/* There are no available int_tx bufs */
+				if (req->int_tx_buf_e == NULL) {
+					ofi_atomic_set32(&req->msg.outstanding_txds, 0);
 					req->work_fn = __gnix_rndzv_iov_req_post;
 					return _gnix_vc_queue_work_req(req);
 				}
 
-				req->msg.htd_buf = ((struct gnix_htd_buf *) req->msg.htd_buf_e)->buf;
-				req->msg.htd_mdh = _gnix_ep_get_htd_mdh(ep);
-				GNIX_DEBUG(FI_LOG_EP_DATA, "req->msg.htd_buf = %p\n", req->msg.htd_buf);
+				req->int_tx_buf = ((struct gnix_int_tx_buf *)
+						req->int_tx_buf_e)->buf;
+				req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(
+						req->int_tx_buf_e);
+				GNIX_DEBUG(FI_LOG_EP_DATA,
+				    "req->int_tx_buf = %p\n", req->int_tx_buf);
 			}
 
 			head_off = send_ptr & GNI_READ_ALIGN_MASK;
@@ -1251,10 +1403,10 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 
 					cur_ct->ep_hndl = gni_ep;
 					cur_ct->remote_mem_hndl = req->msg.send_info[send_idx].mem_hndl;
-					cur_ct->local_mem_hndl = req->msg.htd_mdh;
+					cur_ct->local_mem_hndl = req->int_tx_mdh;
 					cur_ct->length = GNI_READ_ALIGN;
 					cur_ct->remote_addr = (send_ptr + get_len + tail_len) & ~GNI_READ_ALIGN_MASK;
-					cur_ct->local_addr = (uint64_t) (((uint8_t *) req->msg.htd_buf) + (GNI_READ_ALIGN * recv_idx));
+					cur_ct->local_addr = (uint64_t) (((uint8_t *) req->int_tx_buf) + (GNI_READ_ALIGN * recv_idx));
 					next_ct = &cur_ct->next_descr;
 				}
 
@@ -1275,10 +1427,10 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 
 					cur_ct->ep_hndl = gni_ep;
 					cur_ct->remote_mem_hndl = req->msg.send_info[send_idx].mem_hndl;
-					cur_ct->local_mem_hndl = req->msg.htd_mdh;
+					cur_ct->local_mem_hndl = req->int_tx_mdh;
 					cur_ct->length = GNI_READ_ALIGN;
 					cur_ct->remote_addr = send_ptr - GNI_READ_ALIGN;
-					cur_ct->local_addr = (uint64_t) (((uint8_t *) req->msg.htd_buf) +
+					cur_ct->local_addr = (uint64_t) (((uint8_t *) req->int_tx_buf) +
 						(GNI_READ_ALIGN * (recv_idx + GNIX_MAX_MSG_IOV_LIMIT)));
 					next_ct = &cur_ct->next_descr;
 				}
@@ -1311,8 +1463,8 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 					ct_txd->gni_desc.remote_addr = (send_ptr + get_len + tail_len) & ~GNI_READ_ALIGN_MASK;
 					ct_txd->gni_desc.remote_mem_hndl = req->msg.send_info[send_idx].mem_hndl;
 
-					ct_txd->gni_desc.local_addr = (uint64_t) ((uint8_t *) req->msg.htd_buf + (GNI_READ_ALIGN * recv_idx));
-					ct_txd->gni_desc.local_mem_hndl = req->msg.htd_mdh;
+					ct_txd->gni_desc.local_addr = (uint64_t) ((uint8_t *) req->int_tx_buf + (GNI_READ_ALIGN * recv_idx));
+					ct_txd->gni_desc.local_mem_hndl = req->int_tx_mdh;
 
 					ct_txd->gni_desc.length = GNI_READ_ALIGN;
 
@@ -1336,10 +1488,10 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 
 						cur_ct->ep_hndl = gni_ep;
 						cur_ct->remote_mem_hndl = req->msg.send_info[send_idx].mem_hndl;
-						cur_ct->local_mem_hndl = req->msg.htd_mdh;
+						cur_ct->local_mem_hndl = req->int_tx_mdh;
 						cur_ct->length = GNI_READ_ALIGN;
 						cur_ct->remote_addr = send_ptr - GNI_READ_ALIGN;
-						cur_ct->local_addr = (uint64_t) (((uint8_t *) req->msg.htd_buf) +
+						cur_ct->local_addr = (uint64_t) (((uint8_t *) req->int_tx_buf) +
 								(GNI_READ_ALIGN * (recv_idx + GNIX_MAX_MSG_IOV_LIMIT)));
 						next_ct = &cur_ct->next_descr;
 					} else { /* New FMA ct */
@@ -1370,9 +1522,9 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 						ct_txd->gni_desc.remote_addr = send_ptr - GNI_READ_ALIGN;
 						ct_txd->gni_desc.remote_mem_hndl = req->msg.send_info[send_idx].mem_hndl;
 
-						ct_txd->gni_desc.local_addr = (uint64_t) ((uint8_t *) req->msg.htd_buf +
+						ct_txd->gni_desc.local_addr = (uint64_t) ((uint8_t *) req->int_tx_buf +
 								(GNI_READ_ALIGN * (recv_idx + GNIX_MAX_MSG_IOV_LIMIT)));
-						ct_txd->gni_desc.local_mem_hndl = req->msg.htd_mdh;
+						ct_txd->gni_desc.local_mem_hndl = req->int_tx_mdh;
 
 						ct_txd->gni_desc.length = GNI_READ_ALIGN;
 
@@ -1536,7 +1688,7 @@ static int __gnix_rndzv_iov_req_build(void *arg)
 	}
 
 	GNIX_DEBUG(FI_LOG_EP_DATA, "txd_cnt = %lu\n", txd_cnt);
-	atomic_set(&req->msg.outstanding_txds, txd_cnt);
+	ofi_atomic_set32(&req->msg.outstanding_txds, txd_cnt);
 
 	/* All the txd's are built, update the work_fn */
 	req->work_fn = __gnix_rndzv_iov_req_post;
@@ -1715,6 +1867,56 @@ smsg_completer_fn_t gnix_ep_smsg_completers[] = {
  * Handle SMSG message with tag GNIX_SMSG_T_EGR_W_DATA
  */
 
+static inline struct gnix_fab_req *
+		__handle_mrecv_req(struct gnix_fab_req *mrecv_req,
+				   struct gnix_fid_ep *ep,
+				   uint64_t len,
+				   struct gnix_tag_storage *queue)
+{
+	struct gnix_fab_req *req = NULL;
+
+	req = _gnix_fr_alloc(ep);
+	if (req == NULL) {
+		return NULL;
+	}
+
+	/*
+	 * set recv related fields in request,
+	 * and adjust mrecv buffer pointer and
+	 * space remaining
+	 */
+
+	req->type = GNIX_FAB_RQ_RECV;
+	req->msg.recv_flags = mrecv_req->msg.recv_flags;
+	req->msg.recv_flags |= FI_MULTI_RECV;
+	req->msg.recv_info[0].recv_addr =
+			mrecv_req->msg.mrecv_buf_addr;
+	req->msg.recv_info[0].recv_len =
+			mrecv_req->msg.mrecv_space_left;
+	req->user_context = mrecv_req->user_context;
+	req->msg.cum_recv_len = mrecv_req->msg.mrecv_space_left;
+
+	req->msg.parent = mrecv_req;
+	if (req->msg.parent)
+		_gnix_ref_get(req->msg.parent);
+
+	mrecv_req->msg.mrecv_space_left -= len;
+	mrecv_req->msg.mrecv_buf_addr += len;
+
+	if ((int64_t)mrecv_req->msg.mrecv_space_left  <
+			ep->min_multi_recv) {
+		_gnix_remove_tag(queue, mrecv_req);
+		_gnix_ref_put(mrecv_req);
+		_gnix_fr_free(ep, mrecv_req);
+		mrecv_req = NULL;
+	} else {
+		GNIX_DEBUG(FI_LOG_EP_DATA,
+			"Re-using multi-recv req: %p\n", mrecv_req);
+	}
+
+	return req;
+}
+
 static int __smsg_eager_msg_w_data(void *data, void *msg)
 {
 	int ret = FI_SUCCESS;
@@ -1726,8 +1928,8 @@ static int __smsg_eager_msg_w_data(void *data, void *msg)
 	void *data_ptr;
 	struct gnix_tag_storage *unexp_queue;
 	struct gnix_tag_storage *posted_queue;
-	fastlock_t *queue_lock;
 	int tagged;
+	bool multi_recv = false;
 
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
 
@@ -1737,14 +1939,20 @@ static int __smsg_eager_msg_w_data(void *data, void *msg)
 	data_ptr = (void *)((char *)msg + sizeof(*hdr));
 
 	tagged = !!(hdr->flags & FI_TAGGED);
-	__gnix_msg_queues(ep, tagged, &queue_lock, &posted_queue, &unexp_queue);
-
-	COND_ACQUIRE(ep->requires_lock, queue_lock);
+	__gnix_msg_queues(ep, tagged, &posted_queue, &unexp_queue);
 
 	/* Lookup a matching posted request. */
 	req = _gnix_match_tag(posted_queue, hdr->msg_tag, 0, FI_PEEK, NULL,
 			      &vc->peer_addr);
 	if (req) {
+		if (req->type == GNIX_FAB_RQ_MRECV) {
+			req = __handle_mrecv_req(req, ep, hdr->len, posted_queue);
+			if (req == NULL) {
+				return -FI_ENOMEM;
+			}
+			multi_recv = true;
+		}
+
 		req->addr = vc->peer_addr;
 		req->gnix_ep = ep;
 		req->vc = vc;
@@ -1761,43 +1969,29 @@ static int __smsg_eager_msg_w_data(void *data, void *msg)
 
 		__gnix_msg_copy_data_to_recv_addr(req, data_ptr);
 
-		if ((req->msg.recv_flags & FI_MULTI_RECV) &&
-		    ((req->msg.cum_recv_len - req->msg.cum_send_len) <
-			ep->min_multi_recv))
-			req->msg.recv_flags &= ~GNIX_MSG_MULTI_RECV_SUP;
-
 		__gnix_msg_recv_completion(ep, req);
 
-		/* Check if we're using FI_MULTI_RECV and there is space left
-		 * in the receive buffer. */
-		if ((req->msg.recv_flags & FI_MULTI_RECV) &&
-		    ((req->msg.cum_recv_len - req->msg.cum_send_len) >=
-			     ep->min_multi_recv)) {
-			GNIX_DEBUG(FI_LOG_EP_DATA, "Re-using req: %p\n", req);
-
-			/* Adjust receive buffer for the next match. */
-			req->msg.recv_info[0].recv_addr += req->msg.cum_send_len;
-			req->msg.recv_info[0].recv_len -= req->msg.cum_send_len;
-			req->msg.cum_recv_len = req->msg.recv_info[0].recv_len;
-		} else {
-			GNIX_DEBUG(FI_LOG_EP_DATA, "Freeing req: %p\n", req);
+		GNIX_DEBUG(FI_LOG_EP_DATA, "Freeing req: %p\n", req);
 
-			/* Dequeue and free the request. */
+		/*
+		 * Dequeue and free the request if not
+		 * matching a FI_MULTI_RECV buffer.
+		 */
+		if (multi_recv == false) {
 			_gnix_remove_tag(posted_queue, req);
 			_gnix_fr_free(ep, req);
 		}
+
 	} else {
 		/* Add new unexpected receive request. */
 		req = _gnix_fr_alloc(ep);
 		if (req == NULL) {
-			COND_RELEASE(ep->requires_lock, queue_lock);
 			return -FI_ENOMEM;
 		}
 
 		/* TODO: Buddy alloc */
 		req->msg.send_info[0].send_addr = (uint64_t)malloc(hdr->len);
 		if (unlikely(req->msg.send_info[0].send_addr == 0ULL)) {
-			COND_RELEASE(ep->requires_lock, queue_lock);
 			_gnix_fr_free(ep, req);
 			return -FI_ENOMEM;
 		}
@@ -1813,6 +2007,7 @@ static int __smsg_eager_msg_w_data(void *data, void *msg)
 		req->msg.send_flags = hdr->flags;
 		req->msg.tag = hdr->msg_tag;
 		req->msg.imm = hdr->imm;
+		req->msg.parent = NULL;
 
 		memcpy((void *)req->msg.send_info[0].send_addr, data_ptr, hdr->len);
 		req->addr = vc->peer_addr;
@@ -1823,8 +2018,6 @@ static int __smsg_eager_msg_w_data(void *data, void *msg)
 			  req, req->msg.cum_send_len);
 	}
 
-	COND_RELEASE(ep->requires_lock, queue_lock);
-
 	status = GNI_SmsgRelease(vc->gni_ep);
 	if (unlikely(status != GNI_RC_SUCCESS)) {
 		GNIX_WARN(FI_LOG_EP_DATA,
@@ -1898,11 +2091,11 @@ static int __smsg_rndzv_start(void *data, void *msg)
 	struct gnix_smsg_rndzv_start_hdr *hdr =
 			(struct gnix_smsg_rndzv_start_hdr *)msg;
 	struct gnix_fid_ep *ep;
-	struct gnix_fab_req *req = NULL, *dup_req;
+	struct gnix_fab_req *req = NULL;
 	struct gnix_tag_storage *unexp_queue;
 	struct gnix_tag_storage *posted_queue;
-	fastlock_t *queue_lock;
 	int tagged;
+	bool multi_recv = false;
 
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
 
@@ -1910,14 +2103,21 @@ static int __smsg_rndzv_start(void *data, void *msg)
 	assert(ep);
 
 	tagged = !!(hdr->flags & FI_TAGGED);
-	__gnix_msg_queues(ep, tagged, &queue_lock, &posted_queue, &unexp_queue);
-
-	COND_ACQUIRE(ep->requires_lock, queue_lock);
+	__gnix_msg_queues(ep, tagged, &posted_queue, &unexp_queue);
 
 	req = _gnix_match_tag(posted_queue, hdr->msg_tag, 0, FI_PEEK, NULL,
 			      &vc->peer_addr);
 
 	if (req) {
+		if (req->type == GNIX_FAB_RQ_MRECV) {
+			req = __handle_mrecv_req(req, ep, hdr->len,
+						 posted_queue);
+			if (req == NULL) {
+				return -FI_ENOMEM;
+			}
+			multi_recv = true;
+		}
+
 		req->addr = vc->peer_addr;
 		req->gnix_ep = ep;
 		req->vc = vc;
@@ -1963,35 +2163,8 @@ static int __smsg_rndzv_start(void *data, void *msg)
 			  req, req->msg.recv_info[0].recv_addr,
 			  req->msg.send_info[0].send_len);
 
-		/* Check if we're using FI_MULTI_RECV and there is space left
-		 * in the receive buffer. */
-		if (req->type == GNIX_FAB_RQ_RECV &&
-		    (req->msg.recv_flags & FI_MULTI_RECV) &&
-		    ((req->msg.cum_recv_len - req->msg.cum_send_len) >=
-			     ep->min_multi_recv)) {
-			/* Allocate new request for this transfer. */
-			dup_req = __gnix_msg_dup_req(req);
-			if (!dup_req) {
-				COND_RELEASE(ep->requires_lock, queue_lock);
-				return -FI_ENOMEM;
-			}
-
-			/* Adjust receive buffer for the next match. */
-			req->msg.recv_info[0].recv_addr += req->msg.send_info[0].send_len;
-			req->msg.recv_info[0].recv_len -= req->msg.send_info[0].send_len;
-			req->msg.cum_recv_len = req->msg.recv_info[0].recv_len;
-
-			/* 'req' remains queued for more matches while the
-			 * duplicated request is processed. */
-			req = dup_req;
-		} else {
-			/*
-			 * doesn't hurt if its not FI_MULI_RECV
-			 */
-			req->msg.recv_flags &= ~GNIX_MSG_MULTI_RECV_SUP;
-			/* Dequeue the request. */
+		if (multi_recv == false)
 			_gnix_remove_tag(posted_queue, req);
-		}
 
 		/* Queue request to initiate pull of source data. */
 		ret = _gnix_vc_queue_work_req(req);
@@ -2003,7 +2176,6 @@ static int __smsg_rndzv_start(void *data, void *msg)
 		/* Add new unexpected receive request. */
 		req = _gnix_fr_alloc(ep);
 		if (req == NULL) {
-			COND_RELEASE(ep->requires_lock, queue_lock);
 			return -FI_ENOMEM;
 		}
 
@@ -2024,7 +2196,8 @@ static int __smsg_rndzv_start(void *data, void *msg)
 		req->msg.rma_id = hdr->req_addr;
 		req->msg.send_info[0].head = hdr->head;
 		req->msg.send_info[0].tail = hdr->tail;
-		atomic_initialize(&req->msg.outstanding_txds, 0);
+		ofi_atomic_initialize32(&req->msg.outstanding_txds, 0);
+		req->msg.parent = NULL;
 
 		_gnix_insert_tag(unexp_queue, req->msg.tag, req, ~0);
 
@@ -2032,8 +2205,6 @@ static int __smsg_rndzv_start(void *data, void *msg)
 			  req, req->msg.send_info[0].send_len);
 	}
 
-	COND_RELEASE(ep->requires_lock, queue_lock);
-
 	status = GNI_SmsgRelease(vc->gni_ep);
 	if (unlikely(status != GNI_RC_SUCCESS)) {
 		GNIX_WARN(FI_LOG_EP_DATA,
@@ -2056,7 +2227,6 @@ static int __smsg_rndzv_iov_start(void *data, void *msg)
 	struct gnix_fab_req *req = NULL;
 	struct gnix_tag_storage *unexp_queue;
 	struct gnix_tag_storage *posted_queue;
-	fastlock_t *queue_lock;
 	char is_req_posted = 0;
 
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
@@ -2073,11 +2243,9 @@ static int __smsg_rndzv_iov_start(void *data, void *msg)
 	ep = vc->ep;
 	assert(ep != NULL);
 
-	__gnix_msg_queues(ep, hdr->flags & FI_TAGGED, &queue_lock,
+	__gnix_msg_queues(ep, hdr->flags & FI_TAGGED,
 			  &posted_queue, &unexp_queue);
 
-	COND_ACQUIRE(ep->requires_lock, queue_lock);
-
 	req = _gnix_match_tag(posted_queue, hdr->msg_tag, 0, FI_PEEK, NULL,
 			      &vc->peer_addr);
 
@@ -2092,11 +2260,10 @@ static int __smsg_rndzv_iov_start(void *data, void *msg)
 	} else {		/* Unexpected receive, enqueue it */
 		req = _gnix_fr_alloc(ep);
 		if (req == NULL) {
-			COND_RELEASE(ep->requires_lock, queue_lock);
 			return -FI_ENOMEM;
 		}
 
-		atomic_initialize(&req->msg.outstanding_txds, 0);
+		ofi_atomic_initialize32(&req->msg.outstanding_txds, 0);
 
 		GNIX_INFO(FI_LOG_EP_DATA, "New req: %p (%u)\n",
 			  req, hdr->send_len);
@@ -2114,6 +2281,7 @@ static int __smsg_rndzv_iov_start(void *data, void *msg)
 	req->msg.tag = hdr->msg_tag;
 	req->msg.send_iov_cnt = hdr->iov_cnt;
 	req->msg.rma_id = hdr->req_addr;
+	req->msg.parent = NULL;
 	memcpy(req->msg.send_info, data_ptr,
 	       sizeof(struct send_info_t) * hdr->iov_cnt);
 
@@ -2122,9 +2290,6 @@ static int __smsg_rndzv_iov_start(void *data, void *msg)
 	else
 		_gnix_insert_tag(unexp_queue, req->msg.tag, req, ~0);
 
-
-	COND_RELEASE(ep->requires_lock, queue_lock);
-
 	/*
 	 * Release the message buffer on the nic, need to copy the data
 	 * section out before this.
@@ -2195,7 +2360,7 @@ static int __smsg_rndzv_fin(void *data, void *msg)
 		}
 	}
 
-	atomic_dec(&req->vc->outstanding_tx_reqs);
+	ofi_atomic_dec32(&req->vc->outstanding_tx_reqs);
 
 	/* Schedule VC TX queue in case the VC is 'fenced'. */
 	_gnix_vc_tx_schedule(req->vc);
@@ -2366,10 +2531,8 @@ static int __gnix_msg_addr_lookup(struct gnix_fid_ep *ep, uint64_t src_addr,
 		} else {
 			*(uint64_t *)gnix_addr = FI_ADDR_UNSPEC;
 		}
-	} else {
-		assert(ep->vc != NULL);
-		*gnix_addr = ep->vc->peer_addr;
 	}
+	/* NOP for MSG EPs. */
 
 	return FI_SUCCESS;
 }
@@ -2380,18 +2543,17 @@ static int __gnix_msg_addr_lookup(struct gnix_fid_ep *ep, uint64_t src_addr,
 
 ssize_t _gnix_recv(struct gnix_fid_ep *ep, uint64_t buf, size_t len,
 		   void *mdesc, uint64_t src_addr, void *context,
-		   uint64_t flags, uint64_t tag, uint64_t ignore)
+		   uint64_t flags, uint64_t tag, uint64_t ignore,
+		   struct gnix_fab_req *mrecv_req)
 {
-	int ret;
+	int ret = FI_SUCCESS;
 	struct gnix_fab_req *req = NULL;
 	struct gnix_address gnix_addr;
-	fastlock_t *queue_lock = NULL;
 	struct gnix_tag_storage *posted_queue = NULL;
 	struct gnix_tag_storage *unexp_queue = NULL;
 	uint64_t match_flags;
 	struct gnix_fid_mem_desc *md = NULL;
 	int tagged = !!(flags & FI_TAGGED);
-	bool try_again = false;
 
 	if (!ep->recv_cq && !ep->recv_cntr) {
 		return -FI_ENOCQ;
@@ -2405,13 +2567,13 @@ ssize_t _gnix_recv(struct gnix_fid_ep *ep, uint64_t buf, size_t len,
 			return -FI_EOPNOTSUPP;
 	}
 
-	match_flags = flags & (FI_CLAIM | FI_DISCARD | FI_PEEK);
-
 	ret = __gnix_msg_addr_lookup(ep, src_addr, &gnix_addr);
 	if (ret != FI_SUCCESS)
 		return ret;
 
-	__gnix_msg_queues(ep, tagged, &queue_lock, &posted_queue, &unexp_queue);
+	match_flags = flags & (FI_CLAIM | FI_DISCARD | FI_PEEK);
+
+	__gnix_msg_queues(ep, tagged, &posted_queue, &unexp_queue);
 
 	GNIX_DEBUG(FI_LOG_EP_DATA, "posted_queue = %p\n", posted_queue);
 
@@ -2420,15 +2582,29 @@ ssize_t _gnix_recv(struct gnix_fid_ep *ep, uint64_t buf, size_t len,
 		ignore = ~0;
 	}
 
-	COND_ACQUIRE(ep->requires_lock, queue_lock);
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
 
-retry_match:
-	try_again = false;
 	/* Look for a matching unexpected receive request. */
 	req = _gnix_match_tag(unexp_queue, tag, ignore,
 			      match_flags, context, &gnix_addr);
 	if (req) {
+		/*
+		 * if we posted a multi-recv buffer and we can't
+		 * hold the matched message, stop dequeuing and
+		 * return.
+		 */
+		if (unlikely(mrecv_req != NULL)) {
+
+			mrecv_req->msg.mrecv_space_left -=
+				req->msg.cum_send_len;
+			mrecv_req->msg.mrecv_buf_addr +=
+				req->msg.cum_send_len;
+			req->msg.parent = mrecv_req;
+			_gnix_ref_get(mrecv_req);
+		}
+
 		/* Found matching request, populate local fields. */
+
 		req->gnix_ep = ep;
 		req->user_context = context;
 		req->msg.recv_info[0].recv_addr = (uint64_t)buf;
@@ -2444,8 +2620,6 @@ retry_match:
 		req->msg.recv_md[0] = md;
 		req->msg.recv_iov_cnt = 1;
 		req->msg.recv_flags = flags;
-		if (flags & FI_MULTI_RECV)
-			req->msg.recv_flags |= GNIX_MSG_MULTI_RECV_SUP;
 		req->msg.ignore = ignore;
 
 		if ((flags & GNIX_SUPPRESS_COMPLETION) ||
@@ -2494,26 +2668,8 @@ retry_match:
 			req->work_fn = req->msg.send_iov_cnt == 1 ?
 				__gnix_rndzv_req : __gnix_rndzv_iov_req_build;
 
-
-			/*
-			 * Check if we're using FI_MULTI_RECV and there is
-			 * space left in the receive buffer.
-			 */
-
-			if ((req->msg.recv_flags & FI_MULTI_RECV) &&
-			    ((len - req->msg.cum_send_len) >= ep->min_multi_recv)) {
-
-				buf += req->msg.cum_send_len;
-				len -= req->msg.cum_send_len;
-				try_again = true;
-
-			} else {
-				req->msg.recv_flags &= ~GNIX_MSG_MULTI_RECV_SUP;
-			}
-
+			_gnix_remove_tag(unexp_queue, req);
 			ret = _gnix_vc_queue_work_req(req);
-			if (try_again)
-				goto retry_match;
 
 		} else {
 			/* Matched eager request.  Copy data and generate
@@ -2533,40 +2689,27 @@ retry_match:
 			       req->msg.send_info[0].send_len);
 			free((void *)req->msg.send_info[0].send_addr);
 
-			if ((req->msg.recv_flags & FI_MULTI_RECV) &&
-			    ((len - req->msg.cum_send_len) <
-						ep->min_multi_recv))
-				req->msg.recv_flags &= ~GNIX_MSG_MULTI_RECV_SUP;
-
+			_gnix_remove_tag(unexp_queue, req);
 			__gnix_msg_recv_completion(ep, req);
 
-			/* If using FI_MULTI_RECV and there is space left in
-			 * the receive buffer, try to match another unexpected
-			 * request. */
-			if ((req->msg.recv_flags & FI_MULTI_RECV) &&
-			    ((len - req->msg.cum_send_len) >= ep->min_multi_recv)) {
-				buf += req->msg.cum_send_len;
-				len -= req->msg.cum_send_len;
-				req->msg.recv_info[0].recv_addr = buf;
-				req->msg.recv_info[0].recv_len -= req->msg.cum_send_len;
-				req->msg.cum_recv_len = req->msg.recv_info[0].recv_len;
-				GNIX_DEBUG(FI_LOG_EP_DATA,
-					  "Attempting additional matches, "
-					  "req: %p (%p %u)\n",
-					  req, buf, len);
-				goto retry_match;
-			}
-
 			_gnix_fr_free(ep, req);
 		}
 	} else {
+
+		/*
+		 * if handling a multi receive request,
+		 * just return
+		 */
+		if (mrecv_req)
+			goto mrecv_exit;
+
 		/* if peek/claim/discard, we didn't find what we
 		 * were looking for, return FI_ENOMSG
 		 */
 		if (match_flags) {
 			__recv_err(ep, context, flags, len,
 				   (void *)buf, 0, tag, len, FI_ENOMSG,
-				   FI_ENOMSG, NULL);
+				   FI_ENOMSG, NULL, 0);
 
 			/* if handling trecvmsg flags, return here
 			 * Never post a receive request from this type of context
@@ -2575,7 +2718,6 @@ retry_match:
 			goto pdc_exit;
 		}
 
-		/* Add new posted receive request. */
 		req = _gnix_fr_alloc(ep);
 		if (req == NULL) {
 			ret = -FI_EAGAIN;
@@ -2605,11 +2747,9 @@ retry_match:
 		req->msg.recv_md[0] = md;
 		req->msg.send_iov_cnt = req->msg.recv_iov_cnt = 1;
 		req->msg.recv_flags = flags;
-		if (flags & FI_MULTI_RECV)
-			req->msg.recv_flags |= GNIX_MSG_MULTI_RECV_SUP;
 		req->msg.tag = tag;
 		req->msg.ignore = ignore;
-		atomic_initialize(&req->msg.outstanding_txds, 0);
+		ofi_atomic_initialize32(&req->msg.outstanding_txds, 0);
 
 		if ((flags & GNIX_SUPPRESS_COMPLETION) ||
 		    (ep->recv_selective_completion &&
@@ -2621,9 +2761,108 @@ retry_match:
 		_gnix_insert_tag(posted_queue, tag, req, ignore);
 	}
 
+mrecv_exit:
 pdc_exit:
 err:
-	COND_RELEASE(ep->requires_lock, queue_lock);
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
+	return ret;
+}
+
+ssize_t _gnix_recv_mr(struct gnix_fid_ep *ep, uint64_t buf, size_t len,
+		      void *mdesc, uint64_t src_addr, void *context,
+		      uint64_t flags, uint64_t tag, uint64_t ignore)
+{
+	int ret;
+	int tagged = !!(flags & FI_TAGGED);
+	struct gnix_fab_req *mrecv_req = NULL;
+	struct gnix_address gnix_addr;
+	struct gnix_fid_mem_desc *md = NULL;
+	struct gnix_tag_storage *posted_queue = NULL;
+	struct gnix_tag_storage *unexp_queue = NULL;
+	uint64_t last_space_left;
+
+	assert(flags & FI_MULTI_RECV);
+
+	mrecv_req = _gnix_fr_alloc_w_cb(ep, __gnix_msg_mrecv_completion);
+	if (mrecv_req == NULL) {
+		return -FI_ENOMEM;
+	}
+
+	mrecv_req->type = GNIX_FAB_RQ_MRECV;
+
+	ret = __gnix_msg_addr_lookup(ep, src_addr, &gnix_addr);
+	if (ret != FI_SUCCESS)
+		return ret;
+
+	mrecv_req->addr = gnix_addr;
+	mrecv_req->gnix_ep = ep;
+	mrecv_req->user_context = context;
+
+	mrecv_req->msg.mrecv_buf_addr = (uint64_t)buf;
+	mrecv_req->msg.mrecv_space_left = len;
+
+	if (mdesc) {
+		md = container_of(mdesc,
+				struct gnix_fid_mem_desc,
+				mr_fid);
+
+		mrecv_req->msg.recv_info[0].mem_hndl = md->mem_hndl;
+	}
+
+	mrecv_req->msg.recv_md[0] = md;
+	mrecv_req->msg.recv_flags = flags;
+
+	if (!tagged) {
+		mrecv_req->msg.tag = 0;
+		mrecv_req->msg.ignore = ~0;
+	} else {
+		mrecv_req->msg.tag = tag;
+		mrecv_req->msg.ignore = ignore;
+	}
+
+	if ((flags & GNIX_SUPPRESS_COMPLETION) ||
+	    (ep->recv_selective_completion &&
+	    !(flags & FI_COMPLETION))) {
+		mrecv_req->msg.recv_flags &= ~FI_COMPLETION;
+	} else {
+		mrecv_req->msg.recv_flags |= FI_COMPLETION;
+	}
+
+	last_space_left = mrecv_req->msg.mrecv_space_left;
+
+	do {
+		ret = _gnix_recv(ep,
+				 mrecv_req->msg.mrecv_buf_addr,
+				 mrecv_req->msg.mrecv_space_left,
+				 mdesc,
+				 src_addr,
+				 context,
+				 mrecv_req->msg.recv_flags,
+				 mrecv_req->msg.tag,
+				 mrecv_req->msg.ignore,
+				 mrecv_req);
+		if (ret != FI_SUCCESS) {
+			_gnix_fr_free(ep, mrecv_req);
+			return ret;
+		}
+		if ((last_space_left == mrecv_req->msg.mrecv_space_left) ||
+			(mrecv_req->msg.mrecv_space_left < ep->min_multi_recv))
+			break;
+		last_space_left = mrecv_req->msg.mrecv_space_left;
+	} while (1);
+
+	/*
+	 * if space left in multi receive request
+	 * add to posted receive queue, else free request.
+	 */
+	if ((int64_t)mrecv_req->msg.mrecv_space_left > ep->min_multi_recv) {
+		__gnix_msg_queues(ep, tagged, &posted_queue, &unexp_queue);
+		_gnix_insert_tag(posted_queue, tag, mrecv_req, ignore);
+	} else {
+		_gnix_ref_put(mrecv_req);
+		_gnix_fr_free(ep, mrecv_req);
+	}
 
 	return ret;
 }
@@ -2820,6 +3059,7 @@ ssize_t _gnix_send(struct gnix_fid_ep *ep, uint64_t loc_addr, size_t len,
 	struct gnix_fid_mem_desc *md = NULL;
 	int rendezvous;
 	struct fid_mr *auto_mr = NULL;
+	int connected;
 
 	if (!ep->send_cq && !ep->send_cntr) {
 		return -FI_ENOCQ;
@@ -2867,20 +3107,13 @@ ssize_t _gnix_send(struct gnix_fid_ep *ep, uint64_t loc_addr, size_t len,
 		GNIX_DEBUG(FI_LOG_EP_DATA, "auto-reg MR: %p\n", auto_mr);
 	}
 
-	ret = _gnix_vc_ep_get_vc(ep, dest_addr, &vc);
-	if (ret) {
-		goto err_get_vc;
-	}
-
 	req = _gnix_fr_alloc(ep);
 	if (req == NULL) {
-		ret = -FI_ENOSPC;
-		goto err_fr_alloc;
+		return -FI_ENOSPC;
 	}
 
 	req->type = GNIX_FAB_RQ_SEND;
 	req->gnix_ep = ep;
-	req->vc = vc;
 	req->user_context = context;
 	req->work_fn = _gnix_send_req;
 
@@ -2901,12 +3134,11 @@ ssize_t _gnix_send(struct gnix_fid_ep *ep, uint64_t loc_addr, size_t len,
 	req->msg.send_info[0].send_len = len;
 	req->msg.cum_send_len = len;
 	req->msg.imm = data;
-	req->flags = 0;
+	req->flags = flags;
 
 	if (flags & FI_INJECT) {
 		memcpy(req->inject_buf, (void *)loc_addr, len);
 		req->msg.send_info[0].send_addr = (uint64_t)req->inject_buf;
-		req->flags |= FI_INJECT;
 	} else {
 		req->msg.send_info[0].send_addr = loc_addr;
 	}
@@ -2925,20 +3157,45 @@ ssize_t _gnix_send(struct gnix_fid_ep *ep, uint64_t loc_addr, size_t len,
 		 * but is a place holder in the event a RDMA write
 		 * path is implemented for rendezvous
 		 */
-		atomic_initialize(&req->msg.outstanding_txds, 0);
+		ofi_atomic_initialize32(&req->msg.outstanding_txds, 0);
 		req->msg.send_flags |= GNIX_MSG_RENDEZVOUS;
 	}
 
 	GNIX_DEBUG(FI_LOG_EP_DATA, "Queuing (%p %d)\n",
 		  (void *)loc_addr, len);
 
-	return _gnix_vc_queue_tx_req(req);
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
+
+	ret = _gnix_vc_ep_get_vc(ep, dest_addr, &vc);
+	if (ret) {
+		goto err_get_vc;
+	}
+
+	req->vc = vc;
+
+	ret = _gnix_vc_queue_tx_req(req);
+	connected = (vc->conn_state == GNIX_VC_CONNECTED);
+
+	COND_RELEASE(vc->ep->requires_lock, &vc->ep->vc_lock);
+
+	/*
+	 * If a new VC was allocated, progress CM before returning.
+	 * If the VC is connected and there's a backlog, poke
+	 * the nic progress engine befure returning.
+	 */
+	if (!connected) {
+		_gnix_cm_nic_progress(ep->cm_nic);
+	} else if (!dlist_empty(&vc->tx_queue)) {
+		_gnix_nic_progress(vc->ep->nic);
+	}
+
+	return ret;
 
-err_fr_alloc:
 err_get_vc:
-	if (auto_mr) {
+	COND_RELEASE(vc->ep->requires_lock, &vc->ep->vc_lock);
+	_gnix_fr_free(ep, req);
+	if (flags & FI_LOCAL_MR)
 		fi_close(&auto_mr->fid);
-	}
 	return ret;
 }
 
@@ -2950,12 +3207,10 @@ ssize_t _gnix_recvv(struct gnix_fid_ep *ep, const struct iovec *iov,
 	size_t cum_len = 0;
 	struct gnix_fab_req *req = NULL;
 	struct gnix_address gnix_addr;
-	fastlock_t *queue_lock = NULL;
 	struct gnix_tag_storage *posted_queue = NULL;
 	struct gnix_tag_storage *unexp_queue = NULL;
 	uint64_t match_flags;
 	int tagged = flags & FI_TAGGED;
-	struct fid_mr *auto_mr;
 
 	if (!ep->recv_cq && !ep->recv_cntr) {
 		return -FI_ENOCQ;
@@ -3009,9 +3264,9 @@ ssize_t _gnix_recvv(struct gnix_fid_ep *ep, const struct iovec *iov,
 	 * in the posted queue (i.e. no fi_recvs have been called (or posted)
 	 * on the remote endpoint).
 	 */
-	__gnix_msg_queues(ep, tagged, &queue_lock, &posted_queue, &unexp_queue);
+	__gnix_msg_queues(ep, tagged, &posted_queue, &unexp_queue);
 
-	COND_ACQUIRE(ep->requires_lock, queue_lock);
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
 
 	/*
 	 * Posting a recv, look for an existing request in the
@@ -3059,76 +3314,55 @@ ssize_t _gnix_recvv(struct gnix_fid_ep *ep, const struct iovec *iov,
 			goto pdc_exit;
 		}
 
+		for (i = 0; i < count; i++) {
+			req->msg.recv_info[i].recv_addr = (uint64_t) iov[i].iov_base;
+			req->msg.recv_info[i].recv_len = iov[i].iov_len;
+		}
+
 		if (req->msg.send_flags & GNIX_MSG_RENDEZVOUS) {
 			req->work_fn = __gnix_rndzv_iov_req_build;
-			if (!desc) {	/* Register the memory for the user */
-				for (i = 0; i < count; i++) {
-					auto_mr = NULL;
-					ret = gnix_mr_reg(&ep->domain->
-							  domain_fid.fid,
-							  iov[i].iov_base,
-							  iov[i].iov_len,
-							  FI_READ | FI_WRITE, 0,
-							  0, 0, &auto_mr,
-							  NULL);
-
+			if (!(req->vc->modes & GNIX_VC_MODE_XPMEM)) {
+				if (!desc) {
+					ret = __gnix_msg_register_iov(ep->domain,
+								      iov,
+								      count,
+								      req->msg.recv_md);
 					if (ret != FI_SUCCESS) {
 						GNIX_DEBUG(FI_LOG_EP_DATA,
 							   "Failed to "
 							   "auto-register"
 							   " local buffer: %s\n"
 							   , fi_strerror(-ret));
-
-						for (i--; i >= 0; i--) {
-							fi_close(&req->msg.recv_md[i]->mr_fid.fid);
+						goto err;
+					}
+					req->msg.send_flags |= FI_LOCAL_MR;
+
+				} else {	/* User registered their memory */
+
+					for (i = 0; i < count; i++) {
+						if (!desc[i]) {
+							GNIX_WARN(FI_LOG_EP_DATA,
+								  "invalid memory reg"
+								  "istration (%p).\n",
+								  desc[i]);
+							ret = -FI_EINVAL;
+							goto err;
 						}
 
-						return ret;
+						req->msg.recv_md[i] =
+							container_of(desc[i],
+							struct gnix_fid_mem_desc,
+							mr_fid);
 					}
-
-					req->msg.recv_md[i] = container_of(
-						(void *) auto_mr,
-						struct gnix_fid_mem_desc,
-						mr_fid);
-
-					req->msg.recv_info[i].recv_addr = (uint64_t) iov[i].iov_base;
-					req->msg.recv_info[i].recv_len = iov[i].iov_len;
-					req->msg.recv_info[i].mem_hndl =
-						req->msg.recv_md[i]->mem_hndl;
-
-					GNIX_DEBUG(FI_LOG_EP_DATA, "auto-reg MR"
-						   ": %p\n",
-						   req->msg.recv_md[i]);
-
 				}
 
-				req->msg.send_flags |= FI_LOCAL_MR;
-			} else {	/* User registered their memory */
-				for (i = 0; i < count; i++) {
-					if (!desc[i]) {
-						GNIX_WARN(FI_LOG_EP_DATA,
-							  "invalid memory reg"
-							  "istration (%p).\n",
-							  desc[i]);
-						return -FI_EINVAL;
-					}
-
-					req->msg.recv_md[i] =
-						container_of(desc[i],
-						struct gnix_fid_mem_desc,
-						mr_fid);
-
+				for (i = 0; i < count; i++)
 					req->msg.recv_info[i].mem_hndl =
 						req->msg.recv_md[i]->mem_hndl;
-				}
 			}
 
 			ret = _gnix_vc_queue_work_req(req);
 		} else {
-			for (i = 0; i < count; i++) {
-				req->msg.recv_info[i].recv_addr = (uint64_t) iov[i].iov_base;
-				req->msg.recv_info[i].recv_len = iov[i].iov_len;
-			}
 
 			/*
 			 * This request is associate with a regular eager smsg,
@@ -3150,7 +3384,7 @@ ssize_t _gnix_recvv(struct gnix_fid_ep *ep, const struct iovec *iov,
 		if (match_flags) {
 			__recv_err(ep, context, flags, cum_len,
 				   (void *) iov, 0, tag, cum_len, FI_ENOMSG,
-				   FI_ENOMSG, NULL);
+				   FI_ENOMSG, NULL, 0);
 
 			/* if handling trecvmsg flags, return here
 			 * Never post a receive request from this type of
@@ -3202,7 +3436,7 @@ ssize_t _gnix_recvv(struct gnix_fid_ep *ep, const struct iovec *iov,
 		req->msg.cum_recv_len = cum_len;
 		req->msg.tag = tag;
 		req->msg.ignore = ignore;
-		atomic_initialize(&req->msg.outstanding_txds, 0);
+		ofi_atomic_initialize32(&req->msg.outstanding_txds, 0);
 
 
 		if ((flags & GNIX_SUPPRESS_COMPLETION) ||
@@ -3218,7 +3452,7 @@ ssize_t _gnix_recvv(struct gnix_fid_ep *ep, const struct iovec *iov,
 
 pdc_exit:
 err:
-	COND_RELEASE(ep->requires_lock, queue_lock);
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
 
 	return ret;
 }
@@ -3233,6 +3467,7 @@ ssize_t _gnix_sendv(struct gnix_fid_ep *ep, const struct iovec *iov,
 	struct gnix_vc *vc = NULL;
 	struct gnix_fab_req *req = NULL;
 	struct fid_mr *auto_mr;
+	int connected;
 
 	GNIX_DEBUG(FI_LOG_EP_DATA, "iov_count = %lu\n", count);
 
@@ -3248,11 +3483,6 @@ ssize_t _gnix_sendv(struct gnix_fid_ep *ep, const struct iovec *iov,
 			return -FI_EOPNOTSUPP;
 	}
 
-	ret = _gnix_vc_ep_get_vc(ep, dest_addr, &vc);
-	if (ret != FI_SUCCESS) {
-		return ret;
-	}
-
 	req = _gnix_fr_alloc(ep);
 	if (req == NULL) {
 		return -FI_ENOSPC;
@@ -3281,9 +3511,8 @@ ssize_t _gnix_sendv(struct gnix_fid_ep *ep, const struct iovec *iov,
 
 	req->gnix_ep = ep;
 	req->user_context = context;
-	req->vc = vc;
 	req->work_fn = _gnix_send_req;
-	req->flags = 0; /* Flags that apply to all message types? */
+	req->flags = flags;
 	req->msg.send_flags = flags;
 	req->msg.imm = 0;
 
@@ -3317,7 +3546,7 @@ ssize_t _gnix_sendv(struct gnix_fid_ep *ep, const struct iovec *iov,
 						fi_close(&req->msg.send_md[i]->mr_fid.fid);
 					}
 
-					return ret;
+					goto err_mr_reg;
 				}
 
 				req->msg.send_md[i] = container_of(
@@ -3354,7 +3583,8 @@ ssize_t _gnix_sendv(struct gnix_fid_ep *ep, const struct iovec *iov,
 						  "invalid memory reg"
 						  "istration (%p).\n",
 						  mdesc[i]);
-					return -FI_EINVAL;
+					ret = -FI_EINVAL;
+					goto err_mr_reg;
 				}
 
 				req->msg.send_md[i] =
@@ -3396,5 +3626,42 @@ ssize_t _gnix_sendv(struct gnix_fid_ep *ep, const struct iovec *iov,
 
 	req->msg.cum_send_len = (size_t) cum_len;
 
-	return _gnix_vc_queue_tx_req(req);
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
+
+	ret = _gnix_vc_ep_get_vc(ep, dest_addr, &vc);
+	if (ret != FI_SUCCESS) {
+		goto err_get_vc;
+	}
+
+	req->vc = vc;
+
+	ret = _gnix_vc_queue_tx_req(req);
+	connected = (vc->conn_state == GNIX_VC_CONNECTED);
+
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
+	/*
+	 * If a new VC was allocated, progress CM before returning.
+	 * If the VC is connected and there's a backlog, poke
+	 * the nic progress engine befure returning.
+	 */
+	if (!connected) {
+		_gnix_cm_nic_progress(ep->cm_nic);
+	} else if (!dlist_empty(&vc->tx_queue)) {
+		_gnix_nic_progress(vc->ep->nic);
+	}
+
+	return ret;
+
+err_get_vc:
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+	if (req->msg.send_flags & FI_LOCAL_MR) {
+		for (i = 0; i < count; i++) {
+			fi_close(&req->msg.send_md[i]->mr_fid.fid);
+		}
+	}
+err_mr_reg:
+	_gnix_fr_free(ep, req);
+
+	return ret;
 }
diff --git a/prov/gni/src/gnix_nameserver.c b/prov/gni/src/gnix_nameserver.c
index 488eeab..94c90f7 100644
--- a/prov/gni/src/gnix_nameserver.c
+++ b/prov/gni/src/gnix_nameserver.c
@@ -105,6 +105,111 @@ exit_w_sock:
 
 }
 
+int _gnix_local_ipaddr(struct sockaddr_in *sin)
+{
+	int ret;
+
+	/*
+	 * Get the address for the ipogif0 interface.  On nodes with KNC
+	 * accelerators, the iface is br0.
+	 */
+
+	ret =  __gnix_ipaddr_from_iface("ipogif0", sin);
+	if (ret != FI_SUCCESS)
+		ret =  __gnix_ipaddr_from_iface("br0", sin);
+
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_FABRIC,
+			  "Unable to obtain local iface addr\n");
+	}
+
+	return ret;
+}
+
+static inline uint64_t __gnix_pe_to_mac(const uint32_t pe)
+{
+	 return ((pe & 0x3ffff) | 0x000101000000);
+}
+
+union mac_addr {
+	uint8_t octets[8];
+	uint64_t u64;
+};
+
+/*
+ * IP address       HW type     Flags       HW address            Mask     Device
+ * 10.128.0.9       0x1         0x6         00:01:01:00:00:08     *        ipogif0
+ */
+#define ARP_TABLE_FILE		"/proc/net/arp"
+#define ARP_TABLE_FORMAT	"%s %*s %*s %s %*s %*s"
+
+int _gnix_pe_to_ip(const struct gnix_ep_name *ep_name,
+		   struct sockaddr_in *saddr)
+{
+	int ret = -FI_EIO;
+	FILE *arp_table;
+	char buf[1024];
+	char ip_str[128], mac_str[128];
+	union mac_addr mac;
+	union mac_addr tmp_mac = {0};
+	gni_return_t status;
+	uint32_t pe, cpu_id;
+
+	status = GNI_CdmGetNicAddress(0, &pe, &cpu_id);
+	if (status == GNI_RC_SUCCESS &&
+	    ep_name->gnix_addr.device_addr == pe) {
+		ret = _gnix_local_ipaddr(saddr);
+		saddr->sin_port = ep_name->gnix_addr.cdm_id;
+		return ret;
+	}
+
+	arp_table = fopen(ARP_TABLE_FILE, "r");
+	if (!arp_table) {
+		GNIX_WARN(FI_LOG_FABRIC, "Failed to fopen(): %s\n",
+			  ARP_TABLE_FILE);
+		return -FI_EIO;
+	}
+
+	/* Eat header line. */
+	if (!fgets(buf, sizeof(buf), arp_table)) {
+		GNIX_WARN(FI_LOG_FABRIC, "Failed to fgets(): %s\n",
+			  ARP_TABLE_FILE);
+		return -FI_EIO;
+	}
+
+	mac.u64 = __gnix_pe_to_mac(ep_name->gnix_addr.device_addr);
+
+	while (fscanf(arp_table, ARP_TABLE_FORMAT, ip_str, mac_str) == 2) {
+		ret = sscanf(mac_str, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
+			     &tmp_mac.octets[5], &tmp_mac.octets[4],
+			     &tmp_mac.octets[3], &tmp_mac.octets[2],
+			     &tmp_mac.octets[1], &tmp_mac.octets[0]);
+		if (ret == 6) {
+			GNIX_DEBUG(FI_LOG_FABRIC,
+				   "Comparing 0x%llx, 0x%llx\n",
+				   mac.u64, tmp_mac.u64);
+			if (mac.u64 == tmp_mac.u64) {
+				saddr->sin_family = AF_INET;
+				saddr->sin_port = ep_name->gnix_addr.cdm_id;
+				saddr->sin_addr.s_addr = inet_addr(ip_str);
+				ret = FI_SUCCESS;
+				GNIX_DEBUG(FI_LOG_FABRIC,
+					   "Translated %s->%s\n",
+					   ip_str, mac_str);
+				break;
+			}
+		} else {
+			GNIX_WARN(FI_LOG_FABRIC, "Parse error: %d : %s\n",
+				  ret, mac_str);
+			break;
+		}
+	}
+
+	fclose(arp_table);
+
+	return ret;
+}
+
 /*
  * get gni nic addr from AF_INET  ip addr, also return local device id on same
  *subnet
@@ -113,8 +218,8 @@ exit_w_sock:
  * returns 0 if ipogif entry found
  * otherwise  -errno
  */
-static int gnixu_get_pe_from_ip(const char *iface_name, const char *ip_addr,
-				uint32_t *gni_nic_addr)
+static int __gnix_get_pe_from_ip(const char *iface_name, const char *ip_addr,
+				 uint32_t *gni_nic_addr)
 {
 	int scount;
 	/* return this if no ipgogif for this ip-addr found */
@@ -193,9 +298,9 @@ err:
  * resolved_addr (IN/OUT) : Pointer that must be provided to contain the
  *	resolved address.
  */
-int gnix_resolve_name(IN const char *node, IN const char *service,
-		      IN uint64_t flags, INOUT struct gnix_ep_name
-		      *resolved_addr)
+int _gnix_resolve_name(IN const char *node, IN const char *service,
+		       IN uint64_t flags,
+		       INOUT struct gnix_ep_name *resolved_addr)
 {
 	uint32_t pe = -1;
 	uint32_t cpu_id = -1;
@@ -211,7 +316,6 @@ int gnix_resolve_name(IN const char *node, IN const char *service,
 	struct addrinfo hints = {
 		.ai_family = AF_INET,
 		.ai_socktype = SOCK_DGRAM,
-		.ai_flags = AI_CANONNAME
 	};
 
 	GNIX_TRACE(FI_LOG_FABRIC, "\n");
@@ -229,27 +333,15 @@ int gnix_resolve_name(IN const char *node, IN const char *service,
 		goto err;
 	}
 
-	/*
-	 * Get the address for the ipogif0 interface
-	 * On nodes with KNC accelerators, the iface is br0
-	 */
-
-	ret =  __gnix_ipaddr_from_iface("ipogif0", &sin);
+	ret = _gnix_local_ipaddr(&sin);
 	if (ret != FI_SUCCESS)
-		ret =  __gnix_ipaddr_from_iface("br0", &sin);
-
-	if (ret != FI_SUCCESS) {
-		GNIX_WARN(FI_LOG_FABRIC,
-			  "Unable to obtain local iface addr\n");
 		goto err;
-	}
-
 
 	ret = getaddrinfo(node, service, &hints, &result);
 	if (ret != 0) {
 		GNIX_WARN(FI_LOG_FABRIC,
 			  "Failed to get address for node provided: %s\n",
-			  strerror(errno));
+			  gai_strerror(ret));
 		ret = -FI_EINVAL;
 		goto err;
 	}
@@ -273,15 +365,13 @@ int gnix_resolve_name(IN const char *node, IN const char *service,
 				goto err;
 			}
 		} else {
-			ret =
-			    gnixu_get_pe_from_ip("ipogif0",
-						 inet_ntoa(sa->sin_addr), &pe);
+			ret = __gnix_get_pe_from_ip("ipogif0",
+					inet_ntoa(sa->sin_addr), &pe);
 			if (ret == 0) {
 				break;
 			} else  {
-			    ret = gnixu_get_pe_from_ip("br0",
-						       inet_ntoa(sa->sin_addr),
-						       &pe);
+				ret = __gnix_get_pe_from_ip("br0",
+						inet_ntoa(sa->sin_addr), &pe);
 			}
 			if (ret == 0)
 				break;
@@ -323,3 +413,25 @@ err:
 	}
 	return ret;
 }
+
+int _gnix_src_addr(struct gnix_ep_name *resolved_addr)
+{
+	gni_return_t status;
+	uint32_t pe = -1;
+	uint32_t cpu_id = -1;
+
+	assert(resolved_addr);
+	memset(resolved_addr, 0, sizeof(*resolved_addr));
+
+	status = GNI_CdmGetNicAddress(0, &pe, &cpu_id);
+	if (status != GNI_RC_SUCCESS) {
+		GNIX_WARN(FI_LOG_FABRIC,
+			  "Unable to get NIC address.");
+		return -FI_ENODATA;
+	}
+
+	resolved_addr->gnix_addr.device_addr = pe;
+	resolved_addr->name_type = GNIX_EPN_TYPE_UNBOUND;
+
+	return FI_SUCCESS;
+}
diff --git a/prov/gni/src/gnix_nic.c b/prov/gni/src/gnix_nic.c
index 8933ea9..d0494d3 100644
--- a/prov/gni/src/gnix_nic.c
+++ b/prov/gni/src/gnix_nic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
@@ -44,9 +44,16 @@
 #include "gnix_vc.h"
 #include "gnix_mbox_allocator.h"
 
-static int gnix_nics_per_ptag[GNI_PTAG_USER_END];
-static DLIST_HEAD(gnix_nic_list);
-static pthread_mutex_t gnix_nic_list_lock = PTHREAD_MUTEX_INITIALIZER;
+/*
+ * TODO: make this a domain parameter
+ */
+#define GNIX_VC_FL_MIN_SIZE 128
+#define GNIX_VC_FL_INIT_REFILL_SIZE 10
+
+static int gnix_nics_per_ptag[GNI_PTAG_MAX];
+struct dlist_entry gnix_nic_list_ptag[GNI_PTAG_MAX];
+DLIST_HEAD(gnix_nic_list);
+pthread_mutex_t gnix_nic_list_lock = PTHREAD_MUTEX_INITIALIZER;
 
 /*
  * globals
@@ -143,13 +150,15 @@ try_again:
 		/*
 		 * first dequeue RX CQEs
 		 */
-		if (which == 1) {
+		if (nic->rx_cq_blk != nic->rx_cq && which == 1) {
 			do {
 				status = GNI_CqGetEvent(nic->rx_cq_blk,
 							&cqe);
 			} while (status == GNI_RC_SUCCESS);
 		}
+		pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &prev_state);
 		_gnix_nic_progress(nic);
+		pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &prev_state);
 		retry = 1;
 		break;
 	case GNI_RC_TIMEOUT:
@@ -252,13 +261,16 @@ static int __nic_teardown_irq_cq(struct gnix_nic *nic)
 	if (nic->irq_mmap_addr == NULL)
 		return ret;
 
-	status = GNI_MemDeregister(nic->gni_nic_hndl,
-				  &nic->irq_mem_hndl);
-	if (status != GNI_RC_SUCCESS) {
-		ret = gnixu_to_fi_errno(status);
-		GNIX_WARN(FI_LOG_EP_CTRL,
-			  "GNI_MemDeregister returned %s\n",
-			  gni_err_str[status]);
+	if ((nic->irq_mem_hndl.qword1) ||
+		(nic->irq_mem_hndl.qword2)) {
+		status = GNI_MemDeregister(nic->gni_nic_hndl,
+					  &nic->irq_mem_hndl);
+		if (status != GNI_RC_SUCCESS) {
+			ret = gnixu_to_fi_errno(status);
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "GNI_MemDeregister returned %s\n",
+				  gni_err_str[status]);
+		}
 	}
 
 	munmap(nic->irq_mmap_addr,
@@ -315,12 +327,8 @@ static int __nic_rx_overrun(struct gnix_nic *nic)
 		ret = _gnix_test_bit(&nic->vc_id_bitmap, i);
 		if (ret) {
 			vc = __gnix_nic_elem_by_rem_id(nic, i);
-			ret = _gnix_vc_dequeue_smsg(vc);
-			if (ret != FI_SUCCESS) {
-				GNIX_WARN(FI_LOG_EP_DATA,
-					  "_gnix_vc_dqueue_smsg returned %d\n",
-					  ret);
-			}
+			ret = _gnix_vc_rx_schedule(vc);
+			assert(ret == FI_SUCCESS);
 		}
 	}
 
@@ -333,30 +341,34 @@ static int __process_rx_cqe(struct gnix_nic *nic, gni_cq_entry_t cqe)
 	struct gnix_vc *vc;
 
 	vc_id =  GNI_CQ_GET_INST_ID(cqe);
-	vc = __gnix_nic_elem_by_rem_id(nic, vc_id);
 
-#if 1 /* Process RX inline with arrival of an RX CQE. */
-	if (unlikely(vc->conn_state != GNIX_VC_CONNECTED)) {
-		GNIX_DEBUG(FI_LOG_EP_DATA,
-			  "Scheduling VC for RX processing (%p)\n",
-			  vc);
-		ret = _gnix_vc_rx_schedule(vc);
-		assert(ret == FI_SUCCESS);
-	} else {
-		GNIX_DEBUG(FI_LOG_EP_DATA,
-			  "Processing VC RX (%p)\n",
-			  vc);
-		ret = _gnix_vc_dequeue_smsg(vc);
-		if (ret != FI_SUCCESS) {
-			GNIX_WARN(FI_LOG_EP_DATA,
-					"_gnix_vc_dqueue_smsg returned %d\n",
-					ret);
+	/*
+	 * its possible this vc has been destroyed, so may get NULL
+	 * back.
+	 */
+
+	vc = __gnix_nic_elem_by_rem_id(nic, vc_id);
+	if (vc != NULL) {
+		switch (vc->conn_state) {
+		case GNIX_VC_CONNECTING:
+			GNIX_DEBUG(FI_LOG_EP_DATA,
+				  "Scheduling VC for RX processing (%p)\n",
+				  vc);
+			ret = _gnix_vc_rx_schedule(vc);
+			assert(ret == FI_SUCCESS);
+			break;
+		case GNIX_VC_CONNECTED:
+			GNIX_DEBUG(FI_LOG_EP_DATA,
+				  "Processing VC RX (%p)\n",
+				  vc);
+			ret = _gnix_vc_rx_schedule(vc);
+			assert(ret == FI_SUCCESS);
+			break;
+		default:
+			break;  /* VC not in a state for scheduling or
+				   SMSG processing */
 		}
 	}
-#else /* Defer RX processing until after the RX CQ is cleared. */
-	ret = _gnix_vc_rx_schedule(vc);
-	assert(ret == FI_SUCCESS);
-#endif
 
 	return ret;
 }
@@ -545,15 +557,16 @@ static int __nic_tx_progress(struct gnix_nic *nic, gni_cq_handle_t cq)
 	return ret;
 }
 
-int _gnix_nic_progress(struct gnix_nic *nic)
+int _gnix_nic_progress(void *arg)
 {
+	struct gnix_nic *nic = (struct gnix_nic *)arg;
 	int ret = FI_SUCCESS;
 
 	ret =  __nic_tx_progress(nic, nic->tx_cq);
 	if (unlikely(ret != FI_SUCCESS))
 		return ret;
 
-	if (nic->tx_cq_blk) {
+	if (nic->tx_cq_blk && nic->tx_cq_blk != nic->tx_cq) {
 		ret =  __nic_tx_progress(nic, nic->tx_cq_blk);
 		if (unlikely(ret != FI_SUCCESS))
 			return ret;
@@ -637,46 +650,6 @@ err:
 }
 
 /*
- * allocate a tx desc for this nic
- */
-
-int _gnix_nic_tx_alloc(struct gnix_nic *nic,
-		       struct gnix_tx_descriptor **desc)
-{
-	struct dlist_entry *entry;
-
-	COND_ACQUIRE(nic->requires_lock, &nic->tx_desc_lock);
-	if (dlist_empty(&nic->tx_desc_free_list)) {
-		COND_RELEASE(nic->requires_lock, &nic->tx_desc_lock);
-		return -FI_ENOSPC;
-	}
-
-	entry = nic->tx_desc_free_list.next;
-	dlist_remove_init(entry);
-	dlist_insert_head(entry, &nic->tx_desc_active_list);
-	*desc = dlist_entry(entry, struct gnix_tx_descriptor, list);
-	COND_RELEASE(nic->requires_lock, &nic->tx_desc_lock);
-
-	return FI_SUCCESS;
-}
-
-/*
- * free a tx desc for this nic - the nic is not embedded in the
- * descriptor to help keep it small
- */
-
-int _gnix_nic_tx_free(struct gnix_nic *nic,
-		      struct gnix_tx_descriptor *desc)
-{
-	COND_ACQUIRE(nic->requires_lock, &nic->tx_desc_lock);
-	dlist_remove_init(&desc->list);
-	dlist_insert_head(&desc->list, &nic->tx_desc_free_list);
-	COND_RELEASE(nic->requires_lock, &nic->tx_desc_lock);
-
-	return FI_SUCCESS;
-}
-
-/*
  * allocate a free list of tx descs for a gnix_nic struct.
  */
 
@@ -684,8 +657,6 @@ static int __gnix_nic_tx_freelist_init(struct gnix_nic *nic, int n_descs)
 {
 	int i, ret = FI_SUCCESS;
 	struct gnix_tx_descriptor *desc_base, *desc_ptr;
-	void *int_bufs;
-	gni_return_t status;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
@@ -699,29 +670,11 @@ static int __gnix_nic_tx_freelist_init(struct gnix_nic *nic, int n_descs)
 		goto err;
 	}
 
-	int_bufs = calloc(n_descs, GNIX_CACHELINE_SIZE);
-	if (int_bufs == NULL) {
-		ret = -FI_ENOMEM;
-		goto err_buf_alloc;
-	}
-
-	/* We don't have a domain here to use for caching the registration. */
-	status = GNI_MemRegister(nic->gni_nic_hndl, (uint64_t)int_bufs,
-				 n_descs * GNIX_CACHELINE_SIZE, NULL,
-				 GNI_MEM_READWRITE, 0, &nic->int_bufs_mdh);
-	if (status != GNI_RC_SUCCESS) {
-		ret = gnixu_to_fi_errno(status);
-		goto err_buf_reg;
-	}
-	nic->int_bufs = int_bufs;
-
 	dlist_init(&nic->tx_desc_free_list);
 	dlist_init(&nic->tx_desc_active_list);
 
 	for (i = 0, desc_ptr = desc_base; i < n_descs; i++, desc_ptr++) {
 		desc_ptr->id = i;
-		desc_ptr->int_buf = (void *) ((uint8_t *) int_bufs +
-					      (i * GNIX_CACHELINE_SIZE));
 		dlist_insert_tail(&desc_ptr->list,
 				  &nic->tx_desc_free_list);
 	}
@@ -733,10 +686,6 @@ static int __gnix_nic_tx_freelist_init(struct gnix_nic *nic, int n_descs)
 
 	return ret;
 
-err_buf_reg:
-	free(int_bufs);
-err_buf_alloc:
-	free(desc_base);
 err:
 	return ret;
 
@@ -747,16 +696,8 @@ err:
  */
 static void __gnix_nic_tx_freelist_destroy(struct gnix_nic *nic)
 {
-	gni_return_t status;
-
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
-	status = GNI_MemDeregister(nic->gni_nic_hndl, &nic->int_bufs_mdh);
-	if (status != GNI_RC_SUCCESS)
-		GNIX_WARN(FI_LOG_DOMAIN, "GNI_MemDeregister() failed: %s\n",
-			  gni_err_str[status]);
-	free(nic->int_bufs);
-
 	free(nic->tx_desc_base);
 	fastlock_destroy(&nic->tx_desc_lock);
 }
@@ -773,6 +714,17 @@ static void __nic_destruct(void *obj)
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
+	/* Get us out of the progression tables we are destroying the nic
+	 * and we don't want the wait progression thread to progress us
+	 * after our structures are destroyed.
+	 */
+	pthread_mutex_lock(&gnix_nic_list_lock);
+
+	dlist_remove(&nic->gnix_nic_list);
+	--gnix_nics_per_ptag[nic->ptag];
+	dlist_remove(&nic->ptag_nic_list);
+
+	pthread_mutex_unlock(&gnix_nic_list_lock);
 	__gnix_nic_tx_freelist_destroy(nic);
 
 	/*
@@ -818,6 +770,11 @@ static void __nic_destruct(void *obj)
 			  "_gnix_mbox_allocator_destroy returned %s\n",
 			  fi_strerror(-ret));
 
+	/*
+	 * see comments in the nic constructor about why
+	 * the following code section is currently stubbed out.
+	 */
+#if 0
 	ret = _gnix_mbox_allocator_destroy(nic->s_rdma_buf_hndl);
 	if (ret != FI_SUCCESS)
 		GNIX_WARN(FI_LOG_EP_CTRL,
@@ -829,6 +786,7 @@ static void __nic_destruct(void *obj)
 		GNIX_WARN(FI_LOG_EP_CTRL,
 			  "_gnix_mbox_allocator_destroy returned %s\n",
 			  fi_strerror(-ret));
+#endif
 
 	if (!nic->gni_cdm_hndl) {
 		GNIX_WARN(FI_LOG_EP_CTRL, "No CDM attached to nic, nic=%p");
@@ -836,8 +794,8 @@ static void __nic_destruct(void *obj)
 
 	assert(nic->gni_cdm_hndl != NULL);
 
-	if (nic->rx_cq_blk != NULL) {
-		status = GNI_CqDestroy(nic->rx_cq_blk);
+	if (nic->rx_cq != NULL && nic->rx_cq != nic->rx_cq_blk) {
+		status = GNI_CqDestroy(nic->rx_cq);
 		if (status != GNI_RC_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "GNI_CqDestroy returned %s\n",
@@ -847,8 +805,8 @@ static void __nic_destruct(void *obj)
 		}
 	}
 
-	if (nic->rx_cq != NULL) {
-		status = GNI_CqDestroy(nic->rx_cq);
+	if (nic->rx_cq_blk != NULL) {
+		status = GNI_CqDestroy(nic->rx_cq_blk);
 		if (status != GNI_RC_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "GNI_CqDestroy returned %s\n",
@@ -858,8 +816,8 @@ static void __nic_destruct(void *obj)
 		}
 	}
 
-	if (nic->tx_cq_blk != NULL) {
-		status = GNI_CqDestroy(nic->tx_cq_blk);
+	if (nic->tx_cq != NULL && nic->tx_cq != nic->tx_cq_blk) {
+		status = GNI_CqDestroy(nic->tx_cq);
 		if (status != GNI_RC_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "GNI_CqDestroy returned %s\n",
@@ -869,8 +827,8 @@ static void __nic_destruct(void *obj)
 		}
 	}
 
-	if (nic->tx_cq != NULL) {
-		status = GNI_CqDestroy(nic->tx_cq);
+	if (nic->tx_cq_blk != NULL) {
+		status = GNI_CqDestroy(nic->tx_cq_blk);
 		if (status != GNI_RC_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "GNI_CqDestroy returned %s\n",
@@ -898,6 +856,12 @@ static void __nic_destruct(void *obj)
 	}
 
 	/*
+	 * destroy VC free list associated with this nic
+	 */
+
+	_gnix_fl_destroy(&nic->vc_freelist);
+
+	/*
 	 * remove the nic from the linked lists
 	 * for the domain and the global nic list
 	 */
@@ -905,14 +869,6 @@ static void __nic_destruct(void *obj)
 err:
 	_gnix_free_bitmap(&nic->vc_id_bitmap);
 
-	pthread_mutex_lock(&gnix_nic_list_lock);
-
-	dlist_remove(&nic->gnix_nic_list);
-	--gnix_nics_per_ptag[nic->ptag];
-	dlist_remove(&nic->dom_nic_list);
-
-	pthread_mutex_unlock(&gnix_nic_list_lock);
-
 	free(nic);
 }
 
@@ -940,11 +896,13 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 	struct gnix_nic *nic = NULL;
 	uint32_t device_addr;
 	gni_return_t status;
-	uint32_t fake_cdm_id;
+	uint32_t fake_cdm_id = GNIX_CREATE_CDM_ID;
 	gni_smsg_attr_t smsg_mbox_attr;
 	struct gnix_nic_attr *nic_attr = &default_attr;
 	uint32_t num_corespec_cpus = 0;
 	bool must_alloc_nic = false;
+	bool free_list_inited = false;
+	struct gnix_auth_key *auth_key;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
@@ -956,10 +914,11 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 		if (ret != FI_SUCCESS)
 			return ret;
 		nic_attr = attr;
-		if (nic_attr->use_cdm_id == true)
-			must_alloc_nic = true;
+		must_alloc_nic = nic_attr->must_alloc;
 	}
 
+	auth_key = nic_attr->auth_key;
+
 	/*
 	 * If we've maxed out the number of nics for this domain/ptag,
 	 * search the list of existing nics.  Take the gnix_nic_list_lock
@@ -980,17 +939,18 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 
 	/*
 	 * we can reuse previously allocated nics as long as a
-	 * cdm_id is not specified in the nic_attr arg.
+	 * must_alloc is not specified in the nic_attr arg.
 	 */
 
-	if ((must_alloc_nic == false) && (gnix_nics_per_ptag[domain->ptag] >=
-					 gnix_max_nics_per_ptag)) {
-		assert(!dlist_empty(&domain->nic_list));
+	if ((must_alloc_nic == false) &&
+	    (gnix_nics_per_ptag[auth_key->ptag] >= gnix_max_nics_per_ptag)) {
+		assert(!dlist_empty(&gnix_nic_list_ptag[auth_key->ptag]));
 
-		nic = dlist_first_entry(&domain->nic_list, struct gnix_nic,
-					dom_nic_list);
-		dlist_remove(&nic->dom_nic_list);
-		dlist_insert_tail(&nic->dom_nic_list, &domain->nic_list);
+		nic = dlist_first_entry(&gnix_nic_list_ptag[auth_key->ptag],
+					struct gnix_nic, ptag_nic_list);
+		dlist_remove(&nic->ptag_nic_list);
+		dlist_insert_tail(&nic->ptag_nic_list,
+				  &gnix_nic_list_ptag[auth_key->ptag]);
 		_gnix_ref_get(nic);
 
 		GNIX_INFO(FI_LOG_EP_CTRL, "Reusing NIC:%p\n", nic);
@@ -1021,8 +981,8 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 
 		if (nic_attr->gni_cdm_hndl == NULL) {
 			status = GNI_CdmCreate(fake_cdm_id,
-						domain->ptag,
-						domain->cookie,
+						auth_key->ptag,
+						auth_key->cookie,
 						gnix_cdm_modes,
 						&nic->gni_cdm_hndl);
 			if (status != GNI_RC_SUCCESS) {
@@ -1048,7 +1008,7 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 			if (status != GNI_RC_SUCCESS) {
 				GNIX_WARN(FI_LOG_EP_CTRL, "GNI_CdmAttach returned %s\n",
 					 gni_err_str[status]);
-				_gnix_dump_gni_res(domain->ptag);
+				_gnix_dump_gni_res(auth_key->ptag);
 				ret = gnixu_to_fi_errno(status);
 				goto err1;
 			}
@@ -1060,81 +1020,92 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 		 */
 
 		status = GNI_CqCreate(nic->gni_nic_hndl,
-					domain->gni_tx_cq_size,
+					domain->params.tx_cq_size,
 					0,                  /* no delay count */
-					GNI_CQ_NOBLOCK |
-					domain->gni_cq_modes,
+					GNI_CQ_BLOCKING |
+						domain->gni_cq_modes,
 					NULL,              /* useless handler */
 					NULL,               /* useless handler
 								context */
-					&nic->tx_cq);
+					&nic->tx_cq_blk);
 		if (status != GNI_RC_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "GNI_CqCreate returned %s\n",
 				  gni_err_str[status]);
-			_gnix_dump_gni_res(domain->ptag);
+			_gnix_dump_gni_res(auth_key->ptag);
 			ret = gnixu_to_fi_errno(status);
 			goto err1;
 		}
 
-		status = GNI_CqCreate(nic->gni_nic_hndl,
-					domain->gni_tx_cq_size,
-					0,
-					GNI_CQ_BLOCKING |
+		/* Use blocking CQs for all operations if eager_auto_progress
+		 * is used.  */
+		if (domain->params.eager_auto_progress) {
+			nic->tx_cq = nic->tx_cq_blk;
+		} else {
+			status = GNI_CqCreate(nic->gni_nic_hndl,
+						domain->params.tx_cq_size,
+						0, /* no delay count */
 						domain->gni_cq_modes,
-					NULL,
-					NULL,
-					&nic->tx_cq_blk);
-		if (status != GNI_RC_SUCCESS) {
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				  "GNI_CqCreate returned %s\n",
-				  gni_err_str[status]);
-			_gnix_dump_gni_res(domain->ptag);
-			ret = gnixu_to_fi_errno(status);
-			goto err1;
+						NULL, /* useless handler */
+						NULL, /* useless handler ctx */
+						&nic->tx_cq);
+			if (status != GNI_RC_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "GNI_CqCreate returned %s\n",
+					  gni_err_str[status]);
+				_gnix_dump_gni_res(auth_key->ptag);
+				ret = gnixu_to_fi_errno(status);
+				goto err1;
+			}
 		}
 
+
 		/*
 		 * create RX CQs - first polling, then blocking
 		 */
 
 		status = GNI_CqCreate(nic->gni_nic_hndl,
-					domain->gni_rx_cq_size,
+					domain->params.rx_cq_size,
 					0,
-					GNI_CQ_NOBLOCK |
+					GNI_CQ_BLOCKING |
 						domain->gni_cq_modes,
 					NULL,
 					NULL,
-					&nic->rx_cq);
+					&nic->rx_cq_blk);
 		if (status != GNI_RC_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "GNI_CqCreate returned %s\n",
 				  gni_err_str[status]);
-			_gnix_dump_gni_res(domain->ptag);
+			_gnix_dump_gni_res(auth_key->ptag);
 			ret = gnixu_to_fi_errno(status);
 			goto err1;
 		}
 
-		status = GNI_CqCreate(nic->gni_nic_hndl,
-					domain->gni_rx_cq_size,
-					0,
-					GNI_CQ_BLOCKING |
-					domain->gni_cq_modes,
-					NULL,
-					NULL,
-					&nic->rx_cq_blk);
-		if (status != GNI_RC_SUCCESS) {
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				  "GNI_CqCreate returned %s\n",
-				  gni_err_str[status]);
-			_gnix_dump_gni_res(domain->ptag);
-			ret = gnixu_to_fi_errno(status);
-			goto err1;
+		/* Use blocking CQs for all operations if eager_auto_progress
+		 * is used.  */
+		if (domain->params.eager_auto_progress) {
+			nic->rx_cq = nic->rx_cq_blk;
+		} else {
+			status = GNI_CqCreate(nic->gni_nic_hndl,
+						domain->params.rx_cq_size,
+						0,
+						domain->gni_cq_modes,
+						NULL,
+						NULL,
+						&nic->rx_cq);
+			if (status != GNI_RC_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "GNI_CqCreate returned %s\n",
+					  gni_err_str[status]);
+				_gnix_dump_gni_res(auth_key->ptag);
+				ret = gnixu_to_fi_errno(status);
+				goto err1;
+			}
 		}
 
 		nic->device_addr = device_addr;
-		nic->ptag = domain->ptag;
-		nic->cookie = domain->cookie;
+		nic->ptag = auth_key->ptag;
+		nic->cookie = auth_key->cookie;
 
 		nic->vc_id_table_capacity = domain->params.vc_id_table_capacity;
 		nic->vc_id_table = malloc(sizeof(void *) *
@@ -1155,18 +1126,47 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 		}
 		fastlock_init(&nic->vc_id_lock);
 
+		/*
+		 * initialize free list for VC's
+		 * In addition to hopefully allowing for a more compact
+		 * allocation of VC structs, the free list is also import
+		 * because there is a window of time when using auto progress
+		 * that a thread may be going through the progress engine
+		 * while one of the application threads is actively tearing
+		 * down an endpoint (and hence its associated VCs) before the
+		 * rem_id for the vc is removed from the vector.
+		 * As a consequence, it is important that
+		 * the memory allocated within the freelist allocator not be
+		 * returned to the system prior to the freelist being destroyed
+		 * as part of the nic destructor procedure.  The freelist is
+		 * destroyed in that procedure after the progress thread
+		 * has been joined.
+		 */
+
+		ret = _gnix_fl_init_ts(sizeof(struct gnix_vc),
+				       offsetof(struct gnix_vc, fr_list),
+				       GNIX_VC_FL_MIN_SIZE,
+				       GNIX_VC_FL_INIT_REFILL_SIZE,
+				       0,
+				       0,
+				       &nic->vc_freelist);
+		if (ret == FI_SUCCESS) {
+			free_list_inited = true;
+		} else {
+			GNIX_DEBUG(FI_LOG_EP_DATA, "_gnix_fl_init returned: %s\n",
+				   fi_strerror(-ret));
+			goto err1;
+		}
+
 		fastlock_init(&nic->lock);
 
-		ret = __gnix_nic_tx_freelist_init(nic, domain->gni_tx_cq_size);
+		ret = __gnix_nic_tx_freelist_init(nic,
+						  domain->params.tx_cq_size);
 		if (ret != FI_SUCCESS)
 			goto err1;
 
-		fastlock_init(&nic->rx_vc_lock);
-		dlist_init(&nic->rx_vcs);
-		fastlock_init(&nic->work_vc_lock);
-		dlist_init(&nic->work_vcs);
-		fastlock_init(&nic->tx_vc_lock);
-		dlist_init(&nic->tx_vcs);
+		fastlock_init(&nic->prog_vcs_lock);
+		dlist_init(&nic->prog_vcs);
 
 		_gnix_ref_init(&nic->ref_cnt, 1, __nic_destruct);
 
@@ -1216,8 +1216,11 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 		 * TODO: hardwired constants, uff
 		 * TODO: better to use a buddy allocator or some other
 		 * allocator
+		 * Disable these for now as we're not using and they
+		 * chew up a lot of IOMMU space per nic.
 		 */
 
+#if 0
 		ret = _gnix_mbox_allocator_create(nic,
 						  NULL,
 						  GNIX_PAGE_2MB,
@@ -1228,6 +1231,7 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "_gnix_mbox_alloc returned %s\n",
 				  fi_strerror(-ret));
+			_gnix_dump_gni_res(domain->ptag);
 			goto err1;
 		}
 
@@ -1241,14 +1245,17 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "_gnix_mbox_alloc returned %s\n",
 				  fi_strerror(-ret));
+			_gnix_dump_gni_res(domain->ptag);
 			goto err1;
 		}
+#endif
 
 		ret =  __nic_setup_irq_cq(nic);
 		if (ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "__nic_setup_irq_cq returned %s\n",
 				  fi_strerror(-ret));
+			_gnix_dump_gni_res(auth_key->ptag);
 			goto err1;
 		}
 
@@ -1291,9 +1298,12 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 		}
 
 		dlist_insert_tail(&nic->gnix_nic_list, &gnix_nic_list);
-		dlist_insert_tail(&nic->dom_nic_list, &domain->nic_list);
+		dlist_insert_tail(&nic->ptag_nic_list,
+				  &gnix_nic_list_ptag[auth_key->ptag]);
+
+		nic->smsg_callbacks = gnix_ep_smsg_callbacks;
 
-		++gnix_nics_per_ptag[domain->ptag];
+		++gnix_nics_per_ptag[auth_key->ptag];
 
 		GNIX_INFO(FI_LOG_EP_CTRL, "Allocated NIC:%p\n", nic);
 	}
@@ -1306,7 +1316,7 @@ int gnix_nic_alloc(struct gnix_fid_domain *domain,
 	goto out;
 
 err1:
-	atomic_dec(&gnix_id_counter);
+	ofi_atomic_dec32(&gnix_id_counter);
 err:
 	if (nic != NULL) {
 		__nic_teardown_irq_cq(nic);
@@ -1316,17 +1326,19 @@ err:
 			_gnix_mbox_allocator_destroy(nic->s_rdma_buf_hndl);
 		if (nic->mbox_hndl != NULL)
 			_gnix_mbox_allocator_destroy(nic->mbox_hndl);
+		if (nic->rx_cq != NULL && nic->rx_cq != nic->rx_cq_blk)
+			GNI_CqDestroy(nic->rx_cq);
 		if (nic->rx_cq_blk != NULL)
 			GNI_CqDestroy(nic->rx_cq_blk);
-		if (nic->rx_cq != NULL)
-			GNI_CqDestroy(nic->rx_cq);
+		if (nic->tx_cq != NULL && nic->tx_cq != nic->tx_cq_blk)
+			GNI_CqDestroy(nic->tx_cq);
 		if (nic->tx_cq_blk != NULL)
 			GNI_CqDestroy(nic->tx_cq_blk);
-		if (nic->tx_cq != NULL)
-			GNI_CqDestroy(nic->tx_cq);
 		if ((nic->gni_cdm_hndl != NULL) && (nic->allocd_gni_res &
 		    GNIX_NIC_CDM_ALLOCD))
 			GNI_CdmDestroy(nic->gni_cdm_hndl);
+		if (free_list_inited == true)
+			_gnix_fl_destroy(&nic->vc_freelist);
 		free(nic);
 	}
 
@@ -1334,3 +1346,35 @@ out:
 	pthread_mutex_unlock(&gnix_nic_list_lock);
 	return ret;
 }
+
+void _gnix_nic_init(void)
+{
+	int i, rc;
+
+	for (i = 0; i < GNI_PTAG_MAX; i++) {
+		dlist_init(&gnix_nic_list_ptag[i]);
+	}
+
+	rc = _gnix_nics_per_rank(&gnix_max_nics_per_ptag);
+	if (rc == FI_SUCCESS) {
+		GNIX_DEBUG(FI_LOG_FABRIC, "gnix_max_nics_per_ptag: %u\n",
+			   gnix_max_nics_per_ptag);
+	} else {
+		GNIX_WARN(FI_LOG_FABRIC, "_gnix_nics_per_rank failed: %d\n",
+			  rc);
+	}
+
+	if (getenv("GNIX_MAX_NICS") != NULL)
+		gnix_max_nics_per_ptag = atoi(getenv("GNIX_MAX_NICS"));
+
+	/*
+	 * Well if we didn't get 1 nic, that means we must really be doing
+	 * FMA sharing.
+	 */
+
+	if (gnix_max_nics_per_ptag == 0) {
+		gnix_max_nics_per_ptag = 1;
+		GNIX_WARN(FI_LOG_FABRIC, "Using inter-procss FMA sharing\n");
+	}
+}
+
diff --git a/prov/gni/src/gnix_progress.c b/prov/gni/src/gnix_progress.c
new file mode 100644
index 0000000..523e374
--- /dev/null
+++ b/prov/gni/src/gnix_progress.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2017 Cray Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Progress common code
+ */
+
+#include <stdlib.h>
+
+#include "gnix_progress.h"
+
+struct gnix_prog_obj {
+	struct dlist_entry list;
+	int ref_cnt;
+	void *obj;
+	int (*prog_fn)(void *data);
+};
+
+
+int _gnix_prog_progress(struct gnix_prog_set *set)
+{
+	struct gnix_prog_obj *pobj, *tmp;
+	int rc;
+
+	COND_READ_ACQUIRE(set->requires_lock, &set->lock);
+
+	dlist_for_each_safe(&set->prog_objs, pobj, tmp, list) {
+		rc = pobj->prog_fn(pobj->obj);
+		if (rc) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "Obj(%p) prog function failed: %d\n",
+				  pobj, rc);
+		}
+	}
+
+	COND_RW_RELEASE(set->requires_lock, &set->lock);
+
+	return FI_SUCCESS;
+}
+
+int _gnix_prog_obj_add(struct gnix_prog_set *set, void *obj,
+		       int (*prog_fn)(void *data))
+{
+	struct gnix_prog_obj *pobj, *tmp;
+
+	COND_WRITE_ACQUIRE(set->requires_lock, &set->lock);
+
+	dlist_for_each_safe(&set->prog_objs, pobj, tmp, list) {
+		if (obj == pobj->obj && prog_fn == pobj->prog_fn) {
+			pobj->ref_cnt++;
+			COND_RW_RELEASE(set->requires_lock, &set->lock);
+			return FI_SUCCESS;
+		}
+	}
+
+	pobj = malloc(sizeof(struct gnix_prog_obj));
+	if (!pobj) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "Failed to add OBJ to prog set.\n");
+		COND_RW_RELEASE(set->requires_lock, &set->lock);
+		return -FI_ENOMEM;
+	}
+
+	pobj->obj = obj;
+	pobj->prog_fn = prog_fn;
+	pobj->ref_cnt = 1;
+	dlist_init(&pobj->list);
+	dlist_insert_tail(&pobj->list, &set->prog_objs);
+
+	COND_RW_RELEASE(set->requires_lock, &set->lock);
+
+	GNIX_INFO(FI_LOG_EP_CTRL, "Added obj(%p) to set(%p)\n",
+		  obj, set);
+
+	return FI_SUCCESS;
+}
+
+int _gnix_prog_obj_rem(struct gnix_prog_set *set, void *obj,
+		       int (*prog_fn)(void *data))
+{
+	struct gnix_prog_obj *pobj, *tmp;
+
+	COND_WRITE_ACQUIRE(set->requires_lock, &set->lock);
+
+	dlist_for_each_safe(&set->prog_objs, pobj, tmp, list) {
+		if (obj == pobj->obj && prog_fn == pobj->prog_fn) {
+			if (!--pobj->ref_cnt) {
+				dlist_remove(&pobj->list);
+				free(pobj);
+				GNIX_INFO(FI_LOG_EP_CTRL,
+					  "Removed obj(%p) from set(%p)\n",
+					  obj, set);
+			}
+			COND_RW_RELEASE(set->requires_lock, &set->lock);
+			return FI_SUCCESS;
+		}
+	}
+
+	COND_RW_RELEASE(set->requires_lock, &set->lock);
+
+	GNIX_WARN(FI_LOG_EP_CTRL, "Object not found on prog set.\n");
+	return -FI_EINVAL;
+}
+
+int _gnix_prog_init(struct gnix_prog_set *set)
+{
+	dlist_init(&set->prog_objs);
+	rwlock_init(&set->lock);
+	set->requires_lock = 1;
+
+	return FI_SUCCESS;
+}
+
+int _gnix_prog_fini(struct gnix_prog_set *set)
+{
+	struct gnix_prog_obj *pobj, *tmp;
+
+	COND_WRITE_ACQUIRE(set->requires_lock, &set->lock);
+
+	dlist_for_each_safe(&set->prog_objs, pobj, tmp, list) {
+		dlist_remove(&pobj->list);
+		free(pobj);
+	}
+
+	COND_RW_RELEASE(set->requires_lock, &set->lock);
+
+	rwlock_destroy(&set->lock);
+
+	return FI_SUCCESS;
+}
+
diff --git a/prov/gni/src/gnix_rma.c b/prov/gni/src/gnix_rma.c
index 7fd4f5f..ae48fe8 100644
--- a/prov/gni/src/gnix_rma.c
+++ b/prov/gni/src/gnix_rma.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -50,6 +50,8 @@
 /* Threshold to switch from indirect transfer to chained transfer to move
  * unaligned read data. */
 #define GNIX_RMA_UREAD_CHAINED_THRESH		60
+#define slist_entry_foreach(head, item)\
+	for (item = head; item; item = item->next)
 
 static int __gnix_rma_send_err(struct gnix_fid_ep *ep,
 			       struct gnix_fab_req *req,
@@ -62,7 +64,7 @@ static int __gnix_rma_send_err(struct gnix_fid_ep *ep,
 	if (ep->send_cq) {
 		rc = _gnix_cq_add_error(ep->send_cq, req->user_context,
 					flags, 0, 0, 0, 0, 0, error,
-					GNI_RC_TRANSACTION_ERROR, NULL);
+					GNI_RC_TRANSACTION_ERROR, NULL, 0);
 		if (rc) {
 			GNIX_WARN(FI_LOG_EP_DATA,
 				  "_gnix_cq_add_error() failed: %d\n", rc);
@@ -91,11 +93,11 @@ static int __gnix_rma_send_completion(struct gnix_fid_ep *ep,
 				      struct gnix_fab_req *req)
 {
 	struct gnix_fid_cntr *cntr = NULL;
-	int rc = FI_SUCCESS;
+	int rc;
 	uint64_t flags = req->flags & GNIX_RMA_COMPLETION_FLAGS;
 
 	if ((req->flags & FI_COMPLETION) && ep->send_cq) {
-		rc = _gnix_cq_add_event(ep->send_cq, req->user_context,
+		rc = _gnix_cq_add_event(ep->send_cq, ep, req->user_context,
 					flags, 0, 0, 0, 0, FI_ADDR_NOTAVAIL);
 		if (rc) {
 			GNIX_WARN(FI_LOG_EP_DATA,
@@ -123,19 +125,16 @@ static int __gnix_rma_send_completion(struct gnix_fid_ep *ep,
 	return FI_SUCCESS;
 }
 
-static void __gnix_rma_copy_indirect_get_data(struct gnix_tx_descriptor *txd)
+static inline void __gnix_rma_copy_indirect_get_data(struct gnix_fab_req *req)
 {
-	struct gnix_fab_req *req = txd->req;
 	int head_off = req->rma.rem_addr & GNI_READ_ALIGN_MASK;
-
 	memcpy((void *)req->rma.loc_addr,
-	       (void *) ((uint8_t *) txd->int_buf + head_off),
+	       (void *) ((uint8_t *) req->int_tx_buf + head_off),
 	       req->rma.len);
 }
 
-static void __gnix_rma_copy_chained_get_data(struct gnix_tx_descriptor *txd)
+static void __gnix_rma_copy_chained_get_data(struct gnix_fab_req *req)
 {
-	struct gnix_fab_req *req = txd->req;
 	int head_off, head_len, tail_len;
 	void *addr;
 
@@ -147,7 +146,7 @@ static void __gnix_rma_copy_chained_get_data(struct gnix_tx_descriptor *txd)
 		GNIX_INFO(FI_LOG_EP_DATA, "writing %d bytes to %p\n",
 			  head_len, req->rma.loc_addr);
 		memcpy((void *)req->rma.loc_addr,
-		       (void *) ((uint8_t *) txd->int_buf + head_off),
+		       (void *) ((uint8_t *) req->int_tx_buf + head_off),
 		       head_len);
 	}
 
@@ -159,11 +158,25 @@ static void __gnix_rma_copy_chained_get_data(struct gnix_tx_descriptor *txd)
 		GNIX_INFO(FI_LOG_EP_DATA, "writing %d bytes to %p\n",
 			  tail_len, addr);
 		memcpy((void *)addr,
-		       (void *) ((uint8_t *) txd->int_buf + GNI_READ_ALIGN),
+		       (void *) ((uint8_t *) req->int_tx_buf + GNI_READ_ALIGN),
 		       tail_len);
 	}
 }
 
+static void __gnix_rma_more_fr_complete(struct gnix_fab_req *req)
+{
+	if (req->flags & FI_LOCAL_MR) {
+		GNIX_INFO(FI_LOG_EP_DATA, "freeing auto-reg MR: %p\n",
+			  req->rma.loc_md);
+		fi_close(&req->rma.loc_md->mr_fid.fid);
+	}
+
+	/* Schedule VC TX queue in case the VC is 'fenced'. */
+	_gnix_vc_tx_schedule(req->vc);
+
+	_gnix_fr_free(req->vc->ep, req);
+}
+
 static void __gnix_rma_fr_complete(struct gnix_fab_req *req)
 {
 	if (req->flags & FI_LOCAL_MR) {
@@ -172,7 +185,7 @@ static void __gnix_rma_fr_complete(struct gnix_fab_req *req)
 		fi_close(&req->rma.loc_md->mr_fid.fid);
 	}
 
-	atomic_dec(&req->vc->outstanding_tx_reqs);
+	ofi_atomic_dec32(&req->vc->outstanding_tx_reqs);
 
 	/* Schedule VC TX queue in case the VC is 'fenced'. */
 	_gnix_vc_tx_schedule(req->vc);
@@ -201,7 +214,7 @@ static int __gnix_rma_post_err(struct gnix_fab_req *req, int error)
 		req->tx_failures++;
 		GNIX_INFO(FI_LOG_EP_DATA,
 			  "Requeueing failed request: %p\n", req);
-		return _gnix_vc_queue_work_req(req);
+		return _gnix_vc_requeue_work_req(req);
 	}
 
 	GNIX_WARN(FI_LOG_EP_DATA, "Failed %u transmits: %p error: %d\n",
@@ -237,9 +250,9 @@ int __smsg_rma_data(void *data, void *msg)
 	struct gnix_fid_ep *ep = vc->ep;
 	gni_return_t status;
 
-	if (hdr->flags & FI_REMOTE_CQ_DATA && ep->recv_cq) {
-		ret = _gnix_cq_add_event(ep->recv_cq, NULL, hdr->user_flags, 0,
-					 0, hdr->user_data, 0,
+	if (GNIX_ALLOW_FI_REMOTE_CQ_DATA(hdr->flags, ep->caps) && ep->recv_cq) {
+		ret = _gnix_cq_add_event(ep->recv_cq, ep, NULL, hdr->user_flags,
+					 0, 0, hdr->user_data, 0,
 					 FI_ADDR_NOTAVAIL);
 		if (ret != FI_SUCCESS)  {
 			GNIX_WARN(FI_LOG_EP_DATA,
@@ -322,7 +335,7 @@ static int __gnix_rma_send_data_req(void *arg)
 	txd->completer_fn = __gnix_rma_txd_data_complete;
 	txd->rma_data_hdr.flags = 0;
 
-	if (req->flags & FI_REMOTE_CQ_DATA) {
+	if (GNIX_ALLOW_FI_REMOTE_CQ_DATA(req->flags, ep->caps)) {
 		txd->rma_data_hdr.flags |= FI_REMOTE_CQ_DATA;
 		txd->rma_data_hdr.user_flags = FI_RMA | FI_REMOTE_CQ_DATA;
 		if (req->type == GNIX_FAB_RQ_RDMA_WRITE) {
@@ -371,6 +384,64 @@ static int __gnix_rma_send_data_req(void *arg)
 	return gnixu_to_fi_errno(status);
 }
 
+static int __gnix_rma_more_txd_complete(void *arg, gni_return_t tx_status)
+{
+	struct gnix_tx_descriptor *txd = (struct gnix_tx_descriptor *)arg;
+	struct gnix_fab_req *req = txd->req;
+	struct gnix_fab_req *more_req;
+	struct slist_entry *item;
+	int rc = FI_SUCCESS;
+
+	if (tx_status != GNI_RC_SUCCESS) {
+		return __gnix_rma_post_err(req, FI_ECANCELED);
+	}
+
+	free(txd->gni_more_ct_descs);
+	_gnix_nic_tx_free(req->gnix_ep->nic, txd);
+
+	/* Successful Delivery. Copy any unaligned data if read req. */
+	if ((req->flags & FI_MORE) && (req->type == GNIX_FAB_RQ_RDMA_READ)) {
+		if (req->flags & GNIX_RMA_INDIRECT) {
+			GNIX_DEBUG(FI_LOG_EP_DATA,
+				"Top TXD is Indirect. Copying\n");
+			__gnix_rma_copy_indirect_get_data(req);
+		} else {
+			__gnix_rma_copy_chained_get_data(req);
+		}
+		slist_entry_foreach(req->rma.sle.next, item) {
+			more_req = container_of(item, struct gnix_fab_req,
+						rma.sle);
+			if (more_req->flags & GNIX_RMA_INDIRECT) {
+				GNIX_DEBUG(FI_LOG_EP_DATA,
+				"Chain Element is Indirect. Copying\n");
+				__gnix_rma_copy_indirect_get_data(more_req);
+			} else {
+				__gnix_rma_copy_chained_get_data(more_req);
+			}
+		}
+	}
+	/* Completion event for top level request */
+	rc = __gnix_rma_send_completion(req->vc->ep, req);
+	if (rc != FI_SUCCESS)
+		GNIX_WARN(FI_LOG_EP_DATA,
+			  "__gnix_rma_send_completion() failed: %d\n",
+			  rc);
+	__gnix_rma_fr_complete(req);
+
+	/* Create completion events for each fab request */
+	slist_entry_foreach(req->rma.sle.next, item) {
+		more_req = container_of(item, struct gnix_fab_req, rma.sle);
+
+		rc = __gnix_rma_send_completion(more_req->vc->ep, more_req);
+		if (rc != FI_SUCCESS)
+		GNIX_WARN(FI_LOG_EP_DATA,
+			  "__gnix_rma_send_completion() failed: %d\n",
+			  rc);
+		__gnix_rma_more_fr_complete(more_req);
+	}
+	return FI_SUCCESS;
+}
+
 static int __gnix_rma_txd_complete(void *arg, gni_return_t tx_status)
 {
 	struct gnix_tx_descriptor *txd = (struct gnix_tx_descriptor *)arg;
@@ -384,14 +455,14 @@ static int __gnix_rma_txd_complete(void *arg, gni_return_t tx_status)
 		 * move unaligned head and/or tail.  If this is the FMA TXD,
 		 * copy the unaligned data to the user buffer. */
 		if (txd->gni_desc.type == GNI_POST_FMA_GET)
-			__gnix_rma_copy_chained_get_data(txd);
+			__gnix_rma_copy_chained_get_data(req);
 
 		/* Remember any failure.  Retransmit both TXDs once both are
 		 * complete. */
 		req->rma.status |= tx_status;
 
-		atomic_dec(&req->rma.outstanding_txds);
-		if (atomic_get(&req->rma.outstanding_txds)) {
+		ofi_atomic_dec32(&req->rma.outstanding_txds);
+		if (ofi_atomic_get32(&req->rma.outstanding_txds)) {
 			_gnix_nic_tx_free(req->gnix_ep->nic, txd);
 			GNIX_INFO(FI_LOG_EP_DATA,
 				  "Received first RDMA chain TXD, req: %p\n",
@@ -409,20 +480,20 @@ static int __gnix_rma_txd_complete(void *arg, gni_return_t tx_status)
 
 	/* Successful delivery.  Progress request. */
 	if (req->flags & GNIX_RMA_INDIRECT) {
-		__gnix_rma_copy_indirect_get_data(txd);
+		__gnix_rma_copy_indirect_get_data(req);
 	} else if (req->flags & GNIX_RMA_CHAINED &&
 		   !(req->flags & GNIX_RMA_RDMA)) {
-		__gnix_rma_copy_chained_get_data(txd);
+		__gnix_rma_copy_chained_get_data(req);
 	}
 
 	_gnix_nic_tx_free(req->gnix_ep->nic, txd);
 
-	if (req->flags & FI_REMOTE_CQ_DATA ||
+	if (GNIX_ALLOW_FI_REMOTE_CQ_DATA(req->flags, req->gnix_ep->caps) ||
 	    req->vc->peer_caps & FI_RMA_EVENT) {
 		/* control message needed for imm. data or a counter event. */
 		req->tx_failures = 0;
 		req->work_fn = __gnix_rma_send_data_req;
-		_gnix_vc_queue_work_req(req);
+		_gnix_vc_requeue_work_req(req);
 	} else {
 		/* complete request */
 		rc = __gnix_rma_send_completion(req->vc->ep, req);
@@ -457,6 +528,19 @@ static void __gnix_rma_fill_pd_chained_get(struct gnix_fab_req *req,
 					   gni_mem_handle_t *rem_mdh)
 {
 	int head_off, head_len, tail_len, desc_idx = 0;
+	struct gnix_fid_mem_desc *loc_md;
+	struct gnix_fid_ep *ep = req->gnix_ep;
+
+	if (req->int_tx_buf_e == NULL) {
+		req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
+		if (req->int_tx_buf_e == NULL) {
+			GNIX_FATAL(FI_LOG_EP_DATA, "RAN OUT OF INT_TX_BUFS");
+			/* TODO return error */
+		}
+	}
+
+	req->int_tx_buf = ((struct gnix_int_tx_buf *) req->int_tx_buf_e)->buf;
+	req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(req->int_tx_buf_e);
 
 	/* Copy head and tail through intermediate buffer.  Copy
 	 * aligned data directly to user buffer. */
@@ -465,6 +549,8 @@ static void __gnix_rma_fill_pd_chained_get(struct gnix_fab_req *req,
 	tail_len = (req->rma.rem_addr + req->rma.len) & GNI_READ_ALIGN_MASK;
 
 	/* Use full post descriptor for aligned data */
+	loc_md = (struct gnix_fid_mem_desc *)req->rma.loc_md;
+	txd->gni_desc.local_mem_hndl = loc_md->mem_hndl;
 	txd->gni_desc.local_addr = (uint64_t)req->rma.loc_addr + head_len;
 	txd->gni_desc.remote_addr = (uint64_t)req->rma.rem_addr + head_len;
 	txd->gni_desc.length = req->rma.len - head_len - tail_len;
@@ -477,10 +563,8 @@ static void __gnix_rma_fill_pd_chained_get(struct gnix_fab_req *req,
 		txd->gni_ct_descs[0].remote_addr =
 				req->rma.rem_addr & ~GNI_READ_ALIGN_MASK;
 		txd->gni_ct_descs[0].remote_mem_hndl = *rem_mdh;
-		txd->gni_ct_descs[0].local_addr =
-				(uint64_t)txd->int_buf;
-		txd->gni_ct_descs[0].local_mem_hndl =
-				req->vc->ep->nic->int_bufs_mdh;
+		txd->gni_ct_descs[0].local_addr = (uint64_t)req->int_tx_buf;
+		txd->gni_ct_descs[0].local_mem_hndl = req->int_tx_mdh;
 
 		if (tail_len)
 			txd->gni_ct_descs[0].next_descr =
@@ -499,9 +583,8 @@ static void __gnix_rma_fill_pd_chained_get(struct gnix_fab_req *req,
 				 req->rma.len) & ~GNI_READ_ALIGN_MASK;
 		txd->gni_ct_descs[desc_idx].remote_mem_hndl = *rem_mdh;
 		txd->gni_ct_descs[desc_idx].local_addr =
-				(uint64_t)txd->int_buf + GNI_READ_ALIGN;
-		txd->gni_ct_descs[desc_idx].local_mem_hndl =
-				req->vc->ep->nic->int_bufs_mdh;
+				(uint64_t)req->int_tx_buf + GNI_READ_ALIGN;
+		txd->gni_ct_descs[desc_idx].local_mem_hndl = req->int_tx_mdh;
 		txd->gni_ct_descs[desc_idx].next_descr = NULL;
 	}
 
@@ -517,15 +600,54 @@ static void __gnix_rma_fill_pd_indirect_get(struct gnix_fab_req *req,
 					    struct gnix_tx_descriptor *txd)
 {
 	int head_off = req->rma.rem_addr & GNI_READ_ALIGN_MASK;
+	struct gnix_fid_ep *ep = req->gnix_ep;
+
+	if (req->int_tx_buf_e == NULL) {
+		req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
+		if (req->int_tx_buf_e == NULL) {
+			GNIX_FATAL(FI_LOG_EP_DATA, "RAN OUT OF INT_TX_BUFS");
+			/* TODO return error */
+		}
+	}
+
+	req->int_tx_buf = ((struct gnix_int_tx_buf *) req->int_tx_buf_e)->buf;
+	req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(req->int_tx_buf_e);
 
 	/* Copy all data through an intermediate buffer. */
-	txd->gni_desc.local_addr = (uint64_t)txd->int_buf;
-	txd->gni_desc.local_mem_hndl = req->vc->ep->nic->int_bufs_mdh;
+	txd->gni_desc.local_addr = (uint64_t)req->int_tx_buf;
+	txd->gni_desc.local_mem_hndl = req->int_tx_mdh;
 	txd->gni_desc.length = CEILING(req->rma.len + head_off, GNI_READ_ALIGN);
 	txd->gni_desc.remote_addr =
 			(uint64_t)req->rma.rem_addr & ~GNI_READ_ALIGN_MASK;
 }
 
+static void __gnix_rma_more_fill_pd_indirect_get(struct gnix_fab_req *req,
+						 gni_ct_get_post_descriptor_t
+						 *more_get, int idx)
+{
+	int head_off = req->rma.rem_addr & GNI_READ_ALIGN_MASK;
+	struct gnix_fid_ep *ep = req->gnix_ep;
+
+	GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: filling indirect get\n");
+	if (req->int_tx_buf_e == NULL) {
+		req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
+		if (req->int_tx_buf_e == NULL) {
+			GNIX_FATAL(FI_LOG_EP_DATA, "RAN OUT OF INT_TX_BUFS");
+			/* TODO return error */
+		}
+	}
+
+	req->int_tx_buf = ((struct gnix_int_tx_buf *) req->int_tx_buf_e)->buf;
+	req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(req->int_tx_buf_e);
+
+	/* Copy all data through an intermediate buffer. */
+	more_get[idx].local_addr = (uint64_t)req->int_tx_buf;
+	more_get[idx].local_mem_hndl = req->int_tx_mdh;
+	more_get[idx].length = CEILING(req->rma.len + head_off, GNI_READ_ALIGN);
+	more_get[idx].remote_addr =
+			(uint64_t)req->rma.rem_addr & ~GNI_READ_ALIGN_MASK;
+}
+
 int _gnix_rma_post_irq(struct gnix_vc *vc)
 {
 	int rc = FI_SUCCESS;
@@ -586,6 +708,17 @@ int _gnix_rma_post_rdma_chain_req(void *data)
 	int head_off, head_len, tail_len;
 	int fma_chain = 0;
 
+	if (req->int_tx_buf_e == NULL) {
+		req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
+		if (req->int_tx_buf_e == NULL) {
+			GNIX_WARN(FI_LOG_EP_DATA, "RAN OUT OF INT_TX_BUFS");
+			return -FI_ENOSPC;
+		}
+	}
+
+	req->int_tx_buf = ((struct gnix_int_tx_buf *) req->int_tx_buf_e)->buf;
+	req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(req->int_tx_buf_e);
+
 	if (!gnix_ops_allowed(ep, req->vc->peer_caps, req->flags)) {
 		rc = __gnix_rma_post_err_no_retrans(req, FI_EOPNOTSUPP);
 		if (rc != FI_SUCCESS)
@@ -648,13 +781,13 @@ int _gnix_rma_post_rdma_chain_req(void *data)
 	ct_txd->gni_desc.remote_mem_hndl = mdh;
 	ct_txd->gni_desc.rdma_mode = 0; /* check flags */
 	ct_txd->gni_desc.src_cq_hndl = nic->tx_cq; /* check flags */
-	ct_txd->gni_desc.local_mem_hndl = nic->int_bufs_mdh;
+	ct_txd->gni_desc.local_mem_hndl = req->int_tx_mdh;
 	ct_txd->gni_desc.length = GNI_READ_ALIGN;
 
 	if (head_off) {
 		ct_txd->gni_desc.remote_addr =
 				req->rma.rem_addr & ~GNI_READ_ALIGN_MASK;
-		ct_txd->gni_desc.local_addr = (uint64_t)ct_txd->int_buf;
+		ct_txd->gni_desc.local_addr = (uint64_t)req->int_tx_buf;
 
 		if (tail_len) {
 			ct_txd->gni_desc.next_descr = &ct_txd->gni_ct_descs[0];
@@ -665,10 +798,10 @@ int _gnix_rma_post_rdma_chain_req(void *data)
 					 req->rma.len) & ~GNI_READ_ALIGN_MASK;
 			ct_txd->gni_ct_descs[0].remote_mem_hndl = mdh;
 			ct_txd->gni_ct_descs[0].local_addr =
-					(uint64_t)ct_txd->int_buf +
+					(uint64_t)req->int_tx_buf +
 					GNI_READ_ALIGN;
 			ct_txd->gni_ct_descs[0].local_mem_hndl =
-					nic->int_bufs_mdh;
+					req->int_tx_mdh;
 			ct_txd->gni_ct_descs[0].next_descr = NULL;
 			fma_chain = 1;
 		}
@@ -677,7 +810,7 @@ int _gnix_rma_post_rdma_chain_req(void *data)
 				(req->rma.rem_addr +
 				 req->rma.len) & ~GNI_READ_ALIGN_MASK;
 		ct_txd->gni_desc.local_addr =
-				(uint64_t)ct_txd->int_buf + GNI_READ_ALIGN;
+				(uint64_t)req->int_tx_buf + GNI_READ_ALIGN;
 	}
 
 	GNIX_LOG_DUMP_TXD(ct_txd);
@@ -723,7 +856,7 @@ int _gnix_rma_post_rdma_chain_req(void *data)
 
 		/* Wait for the first TX to complete, then retransmit the
 		 * entire thing. */
-		atomic_set(&req->rma.outstanding_txds, 1);
+		ofi_atomic_set32(&req->rma.outstanding_txds, 1);
 		req->rma.status = GNI_RC_TRANSACTION_ERROR;
 
 		GNIX_INFO(FI_LOG_EP_DATA, "GNI_Post*() failed: %s\n",
@@ -734,12 +867,323 @@ int _gnix_rma_post_rdma_chain_req(void *data)
 	COND_RELEASE(nic->requires_lock, &nic->lock);
 
 	/* Wait for both TXs to complete, then process the request. */
-	atomic_set(&req->rma.outstanding_txds, 2);
+	ofi_atomic_set32(&req->rma.outstanding_txds, 2);
 	req->rma.status = 0;
 
 	return FI_SUCCESS;
 }
 
+/* Fill head and tail descriptors for chained gets */
+static void __gnix_rma_more_fill_sub_htd(struct gnix_fab_req *req,
+					gni_ct_get_post_descriptor_t *more_get,
+					gni_mem_handle_t *rem_mdh,
+					int *idx, int *entries)
+{
+	int head_off, tail_len;
+	struct gnix_fid_ep *ep = req->gnix_ep;
+	int indirect = !!(req->flags & GNIX_RMA_INDIRECT);
+
+	head_off = req->rma.rem_addr & GNI_READ_ALIGN_MASK;
+	tail_len = (req->rma.rem_addr + req->rma.len)
+		& GNI_READ_ALIGN_MASK;
+
+	/* Get int_tx_buf if unaligned and not indirect size. */
+	if ((req->int_tx_buf_e == NULL) &&
+			(head_off || tail_len) && !(indirect)) {
+		req->int_tx_buf_e = _gnix_ep_get_int_tx_buf(ep);
+		if (req->int_tx_buf_e == NULL) {
+			GNIX_FATAL(FI_LOG_EP_DATA, "RAN OUT OF INT_TX_BUFS");
+			/* TODO return error */
+		}
+	} else {
+		return;
+	}
+
+	req->int_tx_buf = ((struct gnix_int_tx_buf *)
+				req->int_tx_buf_e)->buf;
+	req->int_tx_mdh = _gnix_ep_get_int_tx_mdh(req->int_tx_buf_e);
+
+	if (head_off) {
+		assert(*idx < *entries);
+		GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: Chain Head Off\n");
+		more_get[*idx].ep_hndl = req->vc->gni_ep;
+		more_get[*idx].length = GNI_READ_ALIGN;
+		more_get[*idx].remote_addr =
+				req->rma.rem_addr & ~GNI_READ_ALIGN_MASK;
+		more_get[*idx].remote_mem_hndl = *rem_mdh;
+		more_get[*idx].local_addr = (uint64_t)req->int_tx_buf;
+		more_get[*idx].local_mem_hndl = req->int_tx_mdh;
+
+		if (*idx < (*entries) - 1)
+			more_get[*idx].next_descr = &more_get[(*idx) + 1];
+		else
+			more_get[*idx].next_descr = NULL;
+
+		(*idx)++;
+	}
+	if (tail_len) {
+		assert(*idx < *entries);
+		GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: Chain Tail Off\n");
+		more_get[*idx].ep_hndl = req->vc->gni_ep;
+		more_get[*idx].length = GNI_READ_ALIGN;
+		more_get[*idx].remote_addr =
+				(req->rma.rem_addr +
+				 req->rma.len) & ~GNI_READ_ALIGN_MASK;
+		more_get[*idx].remote_mem_hndl = *rem_mdh;
+		more_get[*idx].local_addr =
+				(uint64_t)req->int_tx_buf + GNI_READ_ALIGN;
+		more_get[*idx].local_mem_hndl = req->int_tx_mdh;
+		more_get[*idx].next_descr = NULL;
+
+		if (*idx < (*entries) - 1)
+				more_get[*idx].next_descr = &more_get[(*idx) + 1];
+			else
+				more_get[*idx].next_descr = NULL;
+		(*idx)++;
+	}
+}
+
+static void __gnix_rma_more_fill_pd(struct gnix_fab_req *req,
+				    struct gnix_tx_descriptor *txd)
+{
+	gni_ct_put_post_descriptor_t *more_put = NULL;
+	gni_ct_get_post_descriptor_t *more_get = NULL;
+	gni_mem_handle_t mdh;
+	struct gnix_fab_req *more_req;
+	struct gnix_fid_mem_desc *loc_md;
+	struct slist_entry *item;
+	int head_off, head_len = 0, tail_len = 0, entries = 0, idx = 0;
+	int indirect = !!(req->flags & GNIX_RMA_INDIRECT);
+	int sub_indirect;
+
+	GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: Filling PD\n");
+	/* If top level fab_req is unaligned, increment entries. */
+	if (req->type == GNIX_FAB_RQ_RDMA_READ) {
+		head_off = req->rma.rem_addr & GNI_READ_ALIGN_MASK;
+		head_len = head_off ? GNI_READ_ALIGN - head_off : 0;
+		tail_len = (req->rma.rem_addr + req->rma.len)
+			& GNI_READ_ALIGN_MASK;
+		if (!indirect) {
+			if (head_off) {
+				entries++;
+				GNIX_DEBUG(FI_LOG_EP_DATA,
+				"FI_MORE: Txd Head Off\n");
+			}
+			if (tail_len) {
+				entries++;
+				GNIX_DEBUG(FI_LOG_EP_DATA,
+				"FI_MORE: Txd Tail Off\n");
+			}
+		}
+		/* Populate txd */
+		if (indirect) {
+			GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: Txd Indirect\n");
+			__gnix_rma_fill_pd_indirect_get(req, txd);
+		} else {
+			txd->gni_desc.local_addr = (uint64_t)req->rma.loc_addr + head_len;
+			txd->gni_desc.remote_addr = (uint64_t)req->rma.rem_addr + head_len;
+			txd->gni_desc.length = req->rma.len - head_len - tail_len;
+			assert(txd->gni_desc.length);
+		}
+	}
+
+	/* Count number of sub post-descriptors to be chained. */
+	slist_entry_foreach(req->rma.sle.next, item) {
+		entries++; /* Increment regardless of type */
+		/* Get fab_req pointer */
+		if (req->type == GNIX_FAB_RQ_RDMA_READ) {
+			more_req = container_of(item, struct gnix_fab_req,
+						rma.sle);
+			sub_indirect = !!(more_req->flags & GNIX_RMA_INDIRECT);
+			head_off = more_req->rma.rem_addr & GNI_READ_ALIGN_MASK;
+			head_len = head_off ? GNI_READ_ALIGN - head_off : 0;
+			tail_len = (more_req->rma.rem_addr + more_req->rma.len)
+				& GNI_READ_ALIGN_MASK;
+
+			/* Additional increments if unaligned */
+			if (!sub_indirect) {
+				if (head_off) {
+					entries++;
+					GNIX_DEBUG(FI_LOG_EP_DATA,
+					"FI_MORE: Chain Req Head off++\n");
+				}
+				if (tail_len) {
+					entries++;
+					GNIX_DEBUG(FI_LOG_EP_DATA,
+					"FI_MORE: Chaing Req Tail off++\n");
+				}
+			}
+		}
+	}
+
+	GNIX_INFO(FI_LOG_EP_DATA, "FI_MORE: %d sub descs to be populated\n",
+		  entries);
+
+	/* Allocate space for sub descriptors */
+	if (entries > 0) {
+		if (req->type == GNIX_FAB_RQ_RDMA_WRITE) {
+			txd->gni_more_ct_descs = malloc(entries *
+					 sizeof(gni_ct_put_post_descriptor_t));
+			more_put = (gni_ct_put_post_descriptor_t *)
+				   txd->gni_more_ct_descs;
+		} else {
+			txd->gni_more_ct_descs = malloc(entries *
+				sizeof(gni_ct_get_post_descriptor_t));
+			more_get = (gni_ct_get_post_descriptor_t *)
+				   txd->gni_more_ct_descs;
+			/* Populate Head/Tail of TOP Req if req is unaligned */
+			 __gnix_rma_more_fill_sub_htd(req, more_get,
+				&txd->gni_desc.remote_mem_hndl, &idx, &entries);
+		}
+	}
+
+	/* Populate sub descriptors */
+	slist_entry_foreach(req->rma.sle.next, item) {
+		/* Get fab_req pointer */
+		more_req = container_of(item, struct gnix_fab_req, rma.sle);
+		sub_indirect = !!(more_req->flags & GNIX_RMA_INDIRECT);
+
+		/* Populate  based on type */
+		if (req->type == GNIX_FAB_RQ_RDMA_WRITE) {
+			assert(more_put);
+			more_put[idx].ep_hndl = more_req->vc->gni_ep;
+			more_put[idx].length = more_req->rma.len;
+			more_put[idx].remote_addr = more_req->rma.rem_addr;
+			more_put[idx].local_addr = (uint64_t)more_req->
+								rma.loc_addr;
+
+			_gnix_convert_key_to_mhdl_no_crc(
+				(gnix_mr_key_t *)&more_req->rma.rem_mr_key,
+				&mdh);
+			more_put[idx].remote_mem_hndl = mdh;
+
+			if (idx < entries - 1)
+				more_put[idx].next_descr = &more_put[idx + 1];
+			else
+				more_put[idx].next_descr = NULL;
+			idx++;
+		} else {
+			assert(more_get);
+			_gnix_convert_key_to_mhdl_no_crc(
+				(gnix_mr_key_t *)&more_req->rma.rem_mr_key,
+				&mdh);
+			more_get[idx].remote_mem_hndl = mdh;
+			more_get[idx].ep_hndl = more_req->vc->gni_ep;
+
+			if (sub_indirect) {
+				__gnix_rma_more_fill_pd_indirect_get(more_req, more_get, idx);
+				if (idx < entries - 1) {
+					more_get[idx].next_descr = &more_get[idx + 1];
+				} else {
+					more_get[idx].next_descr = NULL;
+				}
+				idx++;
+
+			} else {
+				/* get main aligned data in first transaction */
+				loc_md = (struct gnix_fid_mem_desc *)more_req->rma.loc_md;
+				more_get[idx].local_mem_hndl = loc_md->mem_hndl;
+				more_get[idx].local_addr = (uint64_t)more_req->rma.loc_addr + head_len;
+				more_get[idx].remote_addr = (uint64_t)more_req->rma.rem_addr + head_len;
+				more_get[idx].length = more_req->rma.len - head_len - tail_len;
+				GNIX_DEBUG(FI_LOG_EP_DATA, "rma.len: %d - head_len:%d - tail_len:%d\n",
+					more_req->rma.len, head_len, tail_len);
+				assert(more_get[idx].length);
+
+				if (idx < entries - 1) {
+					more_get[idx].next_descr = &more_get[idx + 1];
+				} else {
+					more_get[idx].next_descr = NULL;
+				}
+				idx++;
+				/* head/tail function */
+				__gnix_rma_more_fill_sub_htd(more_req, more_get, &mdh,
+						&idx, &entries);
+			}
+		}
+	}
+	if (entries > 0) {
+		if (req->type == GNIX_FAB_RQ_RDMA_WRITE) {
+			txd->gni_desc.next_descr = &more_put[0];
+		} else {
+			txd->gni_desc.next_descr = &more_get[0];
+		}
+	}
+}
+
+int _gnix_rma_more_post_req(void *data)
+{
+	struct gnix_fab_req *fab_req = (struct gnix_fab_req *)data;
+	struct gnix_fid_ep *ep = fab_req->gnix_ep;
+	struct gnix_nic *nic = ep->nic;
+	struct gnix_fid_mem_desc *loc_md;
+	struct gnix_tx_descriptor *txd;
+	gni_mem_handle_t mdh;
+	gni_return_t status;
+	int rc;
+
+	if (!gnix_ops_allowed(ep, fab_req->vc->peer_caps, fab_req->flags)) {
+		rc = __gnix_rma_post_err_no_retrans(fab_req, FI_EOPNOTSUPP);
+		if (rc != FI_SUCCESS)
+			GNIX_WARN(FI_LOG_EP_DATA,
+				  "__gnix_rma_post_err_no_retrans() failed: %d\n",
+				  rc);
+		return -FI_ECANCELED;
+	}
+
+	rc = _gnix_nic_tx_alloc(nic, &txd);
+	if (rc) {
+		GNIX_WARN(FI_LOG_EP_DATA,
+				"_gnix_nic_tx_alloc() failed: %d\n",
+				rc);
+		return -FI_ENOSPC;
+	}
+
+	txd->completer_fn = __gnix_rma_more_txd_complete;
+	txd->req = fab_req;
+
+	_gnix_convert_key_to_mhdl_no_crc(
+			(gnix_mr_key_t *)&fab_req->rma.rem_mr_key,
+			&mdh);
+
+	txd->gni_desc.type = __gnix_fr_post_type(fab_req->type, 0);
+	txd->gni_desc.cq_mode = GNI_CQMODE_GLOBAL_EVENT; /* check flags */
+	txd->gni_desc.dlvr_mode = GNI_DLVMODE_PERFORMANCE; /* check flags */
+
+	if (fab_req->type == GNIX_FAB_RQ_RDMA_WRITE) {
+		txd->gni_desc.local_addr = (uint64_t)fab_req->rma.loc_addr;
+		txd->gni_desc.length = fab_req->rma.len;
+		assert(txd->gni_desc.length);
+		txd->gni_desc.remote_addr = (uint64_t)fab_req->rma.rem_addr;
+	}
+
+	loc_md = (struct gnix_fid_mem_desc *)fab_req->rma.loc_md;
+	txd->gni_desc.local_mem_hndl = loc_md->mem_hndl; /* assert? */
+	txd->gni_desc.remote_mem_hndl = mdh;
+	txd->gni_desc.rdma_mode = 0; /* check flags */
+	txd->gni_desc.src_cq_hndl = nic->tx_cq; /* check flags */
+	txd->gni_desc.next_descr = NULL; /*Assume no sub descs */
+	txd->gni_desc.prev_descr = NULL;
+
+	__gnix_rma_more_fill_pd(fab_req, txd);
+
+	GNIX_LOG_DUMP_TXD(txd);
+
+	COND_ACQUIRE(nic->requires_lock, &nic->lock);
+	status = GNI_CtPostFma(fab_req->vc->gni_ep, &txd->gni_desc);
+	GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: Returned from GNI_CtPostFma\n");
+
+	COND_RELEASE(nic->requires_lock, &nic->lock);
+
+	if (status != GNI_RC_SUCCESS) {
+		free(txd->gni_more_ct_descs);
+		_gnix_nic_tx_free(nic, txd);
+		GNIX_WARN(FI_LOG_EP_DATA, "GNI_Post*() failed: %s\n",
+			  gni_err_str[status]);
+	}
+
+	return gnixu_to_fi_errno(status);
+}
 int _gnix_rma_post_req(void *data)
 {
 	struct gnix_fab_req *fab_req = (struct gnix_fab_req *)data;
@@ -881,6 +1325,9 @@ ssize_t _gnix_rma(struct gnix_fid_ep *ep, enum gnix_fab_req_type fr_type,
 	int rc;
 	int rdma;
 	struct fid_mr *auto_mr = NULL;
+	struct gnix_fab_req *more_req;
+	struct slist_entry *sle;
+	int connected;
 
 	if (!(flags & FI_INJECT) && !ep->send_cq &&
 	    (((fr_type == GNIX_FAB_RQ_RDMA_WRITE) && !ep->write_cntr) ||
@@ -904,15 +1351,6 @@ ssize_t _gnix_rma(struct gnix_fid_ep *ep, enum gnix_fab_req_type fr_type,
 		return -FI_EINVAL;
 	}
 
-	/* find VC for target */
-	rc = _gnix_vc_ep_get_vc(ep, dest_addr, &vc);
-	if (rc) {
-		GNIX_INFO(FI_LOG_EP_DATA,
-			  "_gnix_vc_ep_get_vc() failed, addr: %lx, rc:\n",
-			  dest_addr, rc);
-		return rc;
-	}
-
 	/* setup fabric request */
 	req = _gnix_fr_alloc(ep);
 	if (!req) {
@@ -924,10 +1362,10 @@ ssize_t _gnix_rma(struct gnix_fid_ep *ep, enum gnix_fab_req_type fr_type,
 
 	req->type = fr_type;
 	req->gnix_ep = ep;
-	req->vc = vc;
 	req->user_context = context;
 	req->work_fn = _gnix_rma_post_req;
-	atomic_initialize(&req->rma.outstanding_txds, 0);
+	req->rma.sle.next = NULL;
+	ofi_atomic_initialize32(&req->rma.outstanding_txds, 0);
 
 	if (fr_type == GNIX_FAB_RQ_RDMA_READ &&
 	    (rem_addr & GNI_READ_ALIGN_MASK || len & GNI_READ_ALIGN_MASK)) {
@@ -947,7 +1385,7 @@ ssize_t _gnix_rma(struct gnix_fid_ep *ep, enum gnix_fab_req_type fr_type,
 			req->work_fn = _gnix_rma_post_rdma_chain_req;
 	}
 
-	if (!(flags & GNIX_RMA_INDIRECT) && !mdesc &&
+	if (!(flags & (GNIX_RMA_INDIRECT | FI_INJECT)) && !mdesc &&
 	    (rdma || fr_type == GNIX_FAB_RQ_RDMA_READ)) {
 		/* We need to auto-register the source buffer. */
 		rc = gnix_mr_reg(&ep->domain->domain_fid.fid, (void *)loc_addr,
@@ -995,11 +1433,115 @@ ssize_t _gnix_rma(struct gnix_fid_ep *ep, enum gnix_fab_req_type fr_type,
 		req->flags |= GNIX_RMA_RDMA;
 	}
 
+	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
+
+	/* find VC for target */
+	rc = _gnix_vc_ep_get_vc(ep, dest_addr, &vc);
+	if (rc) {
+		GNIX_INFO(FI_LOG_EP_DATA,
+			  "_gnix_vc_ep_get_vc() failed, addr: %lx, rc:\n",
+			  dest_addr, rc);
+		goto err_get_vc;
+	}
+
+	req->vc = vc;
+	connected = (vc->conn_state == GNIX_VC_CONNECTED);
+
+	/* Adding FI_FENCE to an FI_MORE list will break the FI_MORE Chain.
+	 * Current FI_MORE implementation does not create remote CQ events.
+	 * Remove FI_MORE flag when FI_FENCE or REMOTE EP requirements are
+	 * present. We will also only allow FI_MORE if a prior connection has
+	 * been established, so that the peer capabilities can be determined.*/
+	if ((flags & FI_FENCE) || (flags & FI_REMOTE_CQ_DATA) ||
+	    !connected || (req->vc->peer_caps & FI_RMA_EVENT)) {
+		flags &= ~FI_MORE;
+	}
+
+	/* Add reads/writes to slist when FI_MORE is present, Or
+	 * if this is the first message in the chain without FI_MORE.
+	 * When FI_MORE is not present, if the slists are not empty
+	 * it is the first message without FI_MORE.
+	 * Do not add reqs with FI_FENCE or REMOTE EP requirements requirements
+	 * to the fi_more list. */
+	if ((flags & FI_MORE) ||
+	    (!(flags & FI_MORE) && connected &&
+	    (!slist_empty(&ep->more_write) || !slist_empty(&ep->more_read)) &&
+	     !(flags & FI_FENCE || flags & FI_REMOTE_CQ_DATA ||
+	       req->vc->peer_caps & FI_RMA_EVENT))) {
+		if (fr_type == GNIX_FAB_RQ_RDMA_WRITE) {
+			slist_insert_tail(&req->rma.sle, &ep->more_write);
+			req->work_fn = _gnix_rma_more_post_req;
+		} else if (fr_type == GNIX_FAB_RQ_RDMA_READ) {
+			slist_insert_tail(&req->rma.sle, &ep->more_read);
+			req->work_fn = _gnix_rma_more_post_req;
+		}
+
+		if (flags & FI_MORE) {
+			COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+			return FI_SUCCESS;
+		}
+	}
+
+	/* Initiate read/write chains on first message without FI_MORE. */
+	if (!(flags & FI_MORE) &&
+	    (!(slist_empty(&ep->more_write)) ||
+	     !(slist_empty(&ep->more_read)))) {
+		if (!(slist_empty(&ep->more_write))) {
+			sle = ep->more_write.head;
+			more_req = container_of(sle, struct gnix_fab_req,
+						rma.sle);
+			GNIX_DEBUG(FI_LOG_EP_DATA,
+				   "FI_MORE: got fab_request from more_write. Queuing Request\n");
+			_gnix_vc_queue_tx_req(more_req);
+			slist_init(&ep->more_write); /* For future reqs */
+		}
+		if (!(slist_empty(&ep->more_read))) {
+			sle = ep->more_read.head;
+			more_req = container_of(sle, struct gnix_fab_req,
+						rma.sle);
+			GNIX_DEBUG(FI_LOG_EP_DATA,
+				   "FI_MORE: got fab_request from more_read. Queuing Request\n");
+			_gnix_vc_queue_tx_req(more_req);
+			slist_init(&ep->more_read);
+		}
+
+		/* Requests with FI_FENCE or REMOTE EP requirements are not
+		 * added to the FI_MORE List. They must be queued separately. */
+		if ((flags & FI_FENCE) || (flags & FI_REMOTE_CQ_DATA) ||
+		    (req->vc->peer_caps & FI_RMA_EVENT)) {
+			rc = _gnix_vc_queue_tx_req(req);
+			COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+			return rc;
+		}
+		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+		return FI_SUCCESS;
+	}
+
 	GNIX_DEBUG(FI_LOG_EP_DATA, "Queuing (%p %p %d)\n",
-		  (void *)loc_addr, (void *)rem_addr, len);
+			(void *)loc_addr, (void *)rem_addr, len);
 
-	return _gnix_vc_queue_tx_req(req);
+	rc = _gnix_vc_queue_tx_req(req);
+	connected = (vc->conn_state == GNIX_VC_CONNECTED);
+
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
+	/*
+	 * If a new VC was allocated, progress CM before returning.
+	 * If the VC is connected and there's a backlog, poke
+	 * the nic progress engine befure returning.
+	 */
+	if (!connected) {
+		_gnix_cm_nic_progress(ep->cm_nic);
+	} else if (!dlist_empty(&vc->tx_queue)) {
+		_gnix_nic_progress(vc->ep->nic);
+	}
+
+	return rc;
 
+err_get_vc:
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+	if (flags & FI_LOCAL_MR)
+		fi_close(&auto_mr->fid);
 err_auto_reg:
 	_gnix_fr_free(req->vc->ep, req);
 	return rc;
diff --git a/prov/gni/src/gnix_sep.c b/prov/gni/src/gnix_sep.c
new file mode 100644
index 0000000..65b8eaf
--- /dev/null
+++ b/prov/gni/src/gnix_sep.c
@@ -0,0 +1,1637 @@
+/*
+ * Copyright (c) 2016-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * Endpoint common code
+ */
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#include "gnix.h"
+#include "gnix_cm_nic.h"
+#include "gnix_ep.h"
+#include "gnix_vc.h"
+#include "gnix_util.h"
+#include "gnix_msg.h"
+#include "gnix_cntr.h"
+#include "gnix_rma.h"
+#include "gnix_atomic.h"
+
+/******************************************************************************
+ * Forward declaration for ops structures.
+ ******************************************************************************/
+
+static struct fi_ops gnix_sep_fi_ops;
+static struct fi_ops_ep gnix_sep_ops;
+/*
+static struct fi_ops gnix_tx_fi_ops;
+static struct fi_ops_ep gnix_tx_ops;
+*/
+static struct fi_ops_cm gnix_sep_rxtx_cm_ops;
+static struct fi_ops_msg gnix_sep_msg_ops;
+static struct fi_ops_rma gnix_sep_rma_ops;
+static struct fi_ops_tagged gnix_sep_tagged_ops;
+static struct fi_ops_atomic gnix_sep_atomic_ops;
+
+/*******************************************************************************
+ * SEP(EP) OPS API function implementations.
+ ******************************************************************************/
+/* TODO:
+	initialize capabilities for tx_priv?
+	initialize attr?
+*/
+
+static void __trx_destruct(void *obj)
+{
+	int index, n_ids;
+	int __attribute__((unused)) ret;
+	struct gnix_fid_trx *trx = (struct gnix_fid_trx *) obj;
+	struct gnix_fid_ep *ep_priv;
+	struct gnix_fid_sep *sep_priv;
+	int refs_held;
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	ep_priv = trx->ep;
+	assert(ep_priv != NULL);
+	sep_priv = trx->sep;
+	assert(sep_priv != NULL);
+
+	/* These assignments must be done before we free ep_priv */
+	index = ep_priv->src_addr.gnix_addr.cdm_id -
+		sep_priv->cdm_id_base;
+
+	n_ids = MAX(sep_priv->info->ep_attr->tx_ctx_cnt,
+		    sep_priv->info->ep_attr->rx_ctx_cnt);
+
+	refs_held = _gnix_ref_put(ep_priv);
+
+	if (refs_held == 0) {
+		_gnix_ref_put(sep_priv->cm_nic);
+		/* Remove the context from the sep's list */
+		if ((index >= 0) && (index < n_ids)) {
+			if (sep_priv->ep_table[index]) {
+				sep_priv->ep_table[index] = NULL;
+			} else {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+					  "rx/tx context already freed\n");
+			}
+		} else {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "rx/tx context index out of range\n");
+		}
+	}
+
+	_gnix_ref_put(sep_priv);
+
+	free(trx);
+}
+
+static int gnix_sep_tx_ctx(struct fid_ep *sep, int index,
+			   struct fi_tx_attr *attr,
+			   struct fid_ep **tx_ep, void *context)
+{
+	int ret = FI_SUCCESS;
+	struct gnix_fid_sep *sep_priv;
+	struct gnix_fid_ep *ep_priv = NULL;
+	struct gnix_fid_trx *tx_priv = NULL;
+	struct fid_ep *ep_ptr;
+	struct gnix_ep_attr ep_attr = {0};
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	sep_priv = container_of(sep, struct gnix_fid_sep, ep_fid);
+
+	if (!sep_priv) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "endpoint is not initialized\n");
+		return -FI_EINVAL;
+	}
+
+	if ((sep_priv->ep_fid.fid.fclass != FI_CLASS_SEP) ||
+		(index >= sep_priv->info->ep_attr->tx_ctx_cnt))
+		return -FI_EINVAL;
+
+	if (attr && attr->op_flags & ~GNIX_EP_OP_FLAGS) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "invalid op_flags\n");
+		return -FI_EINVAL;
+	}
+
+	/* caps and mode bits are required to be a subset of info */
+	if (attr && attr->caps && (attr->caps & ~sep_priv->info->caps)) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "invalid capabilities\n");
+		return -FI_EINVAL;
+	}
+
+	if (attr && attr->mode && (attr->mode & ~sep_priv->info->mode)) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "invalid mode\n");
+		return -FI_EINVAL;
+	}
+
+	/*
+	 * check to see if the tx context was already
+	 * allocated
+	 */
+
+	fastlock_acquire(&sep_priv->sep_lock);
+
+	if (sep_priv->tx_ep_table[index] != NULL) {
+		ret = -FI_EBUSY;
+		goto err;
+	}
+
+	tx_priv = calloc(1, sizeof(struct gnix_fid_trx));
+	if (!tx_priv) {
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	tx_priv->ep_fid.fid.fclass = FI_CLASS_TX_CTX;
+	tx_priv->ep_fid.fid.context = context;
+	tx_priv->ep_fid.fid.ops = &gnix_sep_fi_ops;
+	tx_priv->ep_fid.ops = &gnix_sep_ops;
+	tx_priv->ep_fid.msg = &gnix_sep_msg_ops;
+	tx_priv->ep_fid.rma = &gnix_sep_rma_ops;
+	tx_priv->ep_fid.tagged = &gnix_sep_tagged_ops;
+	tx_priv->ep_fid.atomic = &gnix_sep_atomic_ops;
+	tx_priv->ep_fid.cm = &gnix_sep_rxtx_cm_ops;
+
+	/* if an EP already allocated for this index, use it */
+	if (sep_priv->ep_table[index] != NULL) {
+		ep_priv = container_of(sep_priv->ep_table[index],
+				       struct gnix_fid_ep, ep_fid);
+		sep_priv->tx_ep_table[index] = sep_priv->ep_table[index];
+		_gnix_ref_get(ep_priv);
+
+	} else {
+
+		/*
+		 * allocate the underlying gnix_fid_ep struct
+		 */
+
+		ep_attr.use_cdm_id = true;
+		ep_attr.cdm_id = sep_priv->cdm_id_base + index;
+		ep_attr.cm_nic = sep_priv->cm_nic;
+		ep_attr.cm_ops = &gnix_sep_rxtx_cm_ops;
+		/* TODO: clean up this cm_nic */
+		_gnix_ref_get(sep_priv->cm_nic);
+		ret = _gnix_ep_alloc(sep_priv->domain,
+				     sep_priv->info,
+				     &ep_attr,
+				     &ep_ptr, context);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "gnix_ep_alloc returned %s\n",
+				  fi_strerror(-ret));
+			goto err;
+		}
+
+		sep_priv->ep_table[index] = ep_ptr;
+		sep_priv->tx_ep_table[index] = ep_ptr;
+		ep_priv = container_of(ep_ptr, struct gnix_fid_ep, ep_fid);
+		if (sep_priv->av != NULL) {
+			ep_priv->av = sep_priv->av;
+			_gnix_ref_get(ep_priv->av);
+			_gnix_ep_init_vc(ep_priv);
+		}
+	}
+
+	_gnix_ref_init(&tx_priv->ref_cnt, 1, __trx_destruct);
+	tx_priv->ep = ep_priv;
+	tx_priv->sep = sep_priv;
+	_gnix_ref_get(sep_priv);
+	tx_priv->caps = ep_priv->caps;
+	*tx_ep = &tx_priv->ep_fid;
+	tx_priv->op_flags = ep_priv->op_flags;
+
+	if (attr) {
+		tx_priv->op_flags |= attr->op_flags;
+		memcpy(attr, sep_priv->info->tx_attr,
+		       sizeof(struct fi_tx_attr));
+		attr->op_flags = tx_priv->op_flags;
+	}
+err:
+	fastlock_release(&sep_priv->sep_lock);
+
+	return ret;
+}
+
+static int gnix_sep_rx_ctx(struct fid_ep *sep, int index,
+			   struct fi_rx_attr *attr,
+			   struct fid_ep **rx_ep, void *context)
+{
+	int ret = FI_SUCCESS;
+	struct gnix_fid_sep *sep_priv;
+	struct gnix_fid_ep *ep_priv = NULL;
+	struct gnix_fid_trx *rx_priv = NULL;
+	struct fid_ep *ep_ptr;
+	struct gnix_ep_attr ep_attr = {0};
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	sep_priv = container_of(sep, struct gnix_fid_sep, ep_fid);
+
+	if (!sep_priv) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "endpoint is not initialized\n");
+		return -FI_EINVAL;
+	}
+
+	if ((sep_priv->ep_fid.fid.fclass != FI_CLASS_SEP) ||
+		(index >= sep_priv->info->ep_attr->rx_ctx_cnt))
+		return -FI_EINVAL;
+
+	if (attr && attr->op_flags & ~GNIX_EP_OP_FLAGS) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "invalid op_flags\n");
+		return -FI_EINVAL;
+	}
+
+	/* caps and mode bits are required to be a subset of info */
+	if (attr && attr->caps && (attr->caps & ~sep_priv->info->caps)) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "invalid capabilities\n");
+		return -FI_EINVAL;
+	}
+
+	if (attr && attr->mode && (attr->mode & ~sep_priv->info->mode)) {
+		GNIX_WARN(FI_LOG_EP_CTRL, "invalid mode\n");
+		return -FI_EINVAL;
+	}
+
+	/*
+	 * check to see if the rx context was already
+	 * allocated
+	 */
+
+	fastlock_acquire(&sep_priv->sep_lock);
+
+	if (sep_priv->rx_ep_table[index] != NULL) {
+		ret = -FI_EBUSY;
+		goto err;
+	}
+
+	rx_priv = calloc(1, sizeof(struct gnix_fid_trx));
+	if (!rx_priv) {
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	rx_priv->ep_fid.fid.fclass = FI_CLASS_RX_CTX;
+	rx_priv->ep_fid.fid.context = context;
+	rx_priv->ep_fid.fid.ops = &gnix_sep_fi_ops;
+	rx_priv->ep_fid.ops = &gnix_sep_ops;
+	rx_priv->ep_fid.msg = &gnix_sep_msg_ops;
+	rx_priv->ep_fid.rma = &gnix_sep_rma_ops;
+	rx_priv->ep_fid.tagged = &gnix_sep_tagged_ops;
+	rx_priv->ep_fid.atomic = &gnix_sep_atomic_ops;
+	rx_priv->ep_fid.cm = &gnix_sep_rxtx_cm_ops;
+
+	/* if an EP already allocated for this index, use it */
+	if (sep_priv->ep_table[index] != NULL) {
+		ep_priv = container_of(sep_priv->ep_table[index],
+				       struct gnix_fid_ep, ep_fid);
+		sep_priv->rx_ep_table[index] = sep_priv->ep_table[index];
+		_gnix_ref_get(ep_priv);
+	} else {
+
+		/*
+		 * compute cdm_id and allocate an EP.
+		 */
+
+		ep_attr.use_cdm_id = true;
+		ep_attr.cdm_id = sep_priv->cdm_id_base + index;
+		ep_attr.cm_nic = sep_priv->cm_nic;
+		ep_attr.cm_ops = &gnix_sep_rxtx_cm_ops;
+		_gnix_ref_get(sep_priv->cm_nic);
+		ret = _gnix_ep_alloc(sep_priv->domain,
+				     sep_priv->info,
+				     &ep_attr,
+				     &ep_ptr, context);
+		if (ret != FI_SUCCESS) {
+			GNIX_WARN(FI_LOG_EP_CTRL,
+				  "gnix_ep_alloc returned %s\n",
+				  fi_strerror(-ret));
+			goto err;
+		}
+
+		sep_priv->ep_table[index] = ep_ptr;
+		sep_priv->rx_ep_table[index] = ep_ptr;
+		ep_priv = container_of(ep_ptr, struct gnix_fid_ep, ep_fid);
+		if (sep_priv->av != NULL) {
+			ep_priv->av = sep_priv->av;
+			_gnix_ref_get(ep_priv->av);
+			_gnix_ep_init_vc(ep_priv);
+		}
+	}
+
+	_gnix_ref_init(&rx_priv->ref_cnt, 1, __trx_destruct);
+	rx_priv->ep = ep_priv;
+	rx_priv->sep = sep_priv;
+	_gnix_ref_get(sep_priv);
+	rx_priv->caps = ep_priv->caps;
+	*rx_ep = &rx_priv->ep_fid;
+	rx_priv->op_flags = ep_priv->op_flags;
+
+	if (attr) {
+		rx_priv->op_flags |= attr->op_flags;
+		memcpy(attr, sep_priv->info->rx_attr,
+		       sizeof(struct fi_rx_attr));
+		attr->op_flags = rx_priv->op_flags;
+	}
+err:
+	fastlock_release(&sep_priv->sep_lock);
+
+	return ret;
+}
+
+DIRECT_FN STATIC int gnix_sep_bind(fid_t fid, struct fid *bfid, uint64_t flags)
+{
+	int i, ret, n_ids;
+	struct gnix_fid_ep  *ep;
+	struct gnix_fid_av  *av;
+	struct gnix_fid_sep *sep;
+	struct gnix_fid_domain *domain_priv;
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	switch (fid->fclass) {
+	case FI_CLASS_SEP:
+		break;
+	case FI_CLASS_TX_CTX:
+	case FI_CLASS_RX_CTX:
+		return gnix_ep_bind(fid, bfid, flags);
+	default:
+		return -FI_ENOSYS;
+	}
+
+	sep = container_of(fid, struct gnix_fid_sep, ep_fid);
+	domain_priv = container_of(sep->domain, struct gnix_fid_domain,
+				   domain_fid);
+
+	ret = ofi_ep_bind_valid(&gnix_prov, bfid, flags);
+	if (ret)
+		return ret;
+
+	switch (bfid->fclass) {
+	case FI_CLASS_AV:
+
+		n_ids = MAX(sep->info->ep_attr->tx_ctx_cnt,
+			    sep->info->ep_attr->rx_ctx_cnt);
+
+		av = container_of(bfid, struct gnix_fid_av, av_fid.fid);
+		if (domain_priv != av->domain) {
+			return -FI_EINVAL;
+		}
+
+		/*
+		 * can't bind more than one AV
+		 */
+
+		if (sep->av != NULL)
+			return -FI_EINVAL;
+
+		sep->av = av;
+		_gnix_ref_get(sep->av);
+
+		for (i = 0; i < n_ids; i++) {
+			ep = container_of(sep->ep_table[i],
+					  struct gnix_fid_ep, ep_fid);
+			if (ep != NULL && ep->av == NULL) {
+				ep->av = av;
+				_gnix_ep_init_vc(ep);
+				_gnix_ref_get(ep->av);
+			}
+		}
+
+		break;
+
+	default:
+		ret = -FI_ENOSYS;
+		break;
+	}
+
+	return ret;
+}
+
+/*******************************************************************************
+ * Base SEP API function implementations.
+ ******************************************************************************/
+static int gnix_sep_control(fid_t fid, int command, void *arg)
+{
+	int ret = FI_SUCCESS;
+	struct gnix_fid_ep *ep;
+	struct gnix_fid_trx *trx_priv;
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	switch (fid->fclass) {
+	case FI_CLASS_SEP:
+		/* nothing to do for scalable endpoints */
+		return FI_SUCCESS;
+	case FI_CLASS_TX_CTX:
+	case FI_CLASS_RX_CTX:
+		trx_priv = container_of(fid, struct gnix_fid_trx, ep_fid);
+		ep = trx_priv->ep;
+		break;
+	default:
+		return -FI_EINVAL;
+	}
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	switch (command) {
+	case FI_ENABLE:
+		if (GNIX_EP_RDM_DGM(ep->type)) {
+			if (ep->cm_nic == NULL) {
+				ret = -FI_EOPBADSTATE;
+				goto err;
+			}
+			ret = _gnix_vc_cm_init(ep->cm_nic);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+				     "_gnix_vc_cm_nic_init call returned %d\n",
+					ret);
+				goto err;
+			}
+			ret = _gnix_cm_nic_enable(ep->cm_nic);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+				     "_gnix_cm_nic_enable call returned %d\n",
+					ret);
+				goto err;
+			}
+
+			/*
+			 * enable the EP
+			 */
+			ret = _gnix_ep_enable(ep);
+			if (ret != FI_SUCCESS) {
+				GNIX_WARN(FI_LOG_EP_CTRL,
+				     "_gnix_ep_enable call returned %d\n",
+					ret);
+				goto err;
+			}
+		}
+
+		break;
+	case FI_GETFIDFLAG:
+	case FI_SETFIDFLAG:
+	case FI_ALIAS:
+	default:
+		return -FI_ENOSYS;
+	}
+err:
+	return ret;
+}
+
+static void __sep_destruct(void *obj)
+{
+	int i;
+	struct fid_domain *domain;
+	struct gnix_fid_ep *ep;
+	struct gnix_fid_domain *domain_priv;
+	struct gnix_fid_sep *sep = (struct gnix_fid_sep *) obj;
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	domain = sep->domain;
+	assert(domain != NULL);
+	domain_priv = container_of(domain, struct gnix_fid_domain, domain_fid);
+
+	_gnix_ref_put(domain_priv);
+
+	/*
+	 * For now GNI provider doesn't require that an AV have been bound
+	 * to the SEP itself.
+	 */
+	if (sep->av != NULL) {
+		_gnix_ref_put(sep->av);
+		sep->av = NULL;
+	}
+
+	if (sep->ep_table) {
+		for (i = 0; i < sep->info->ep_attr->tx_ctx_cnt; i++) {
+			ep = container_of(sep->ep_table[i],
+					  struct gnix_fid_ep, ep_fid);
+			if (ep == NULL) {
+				continue;
+			}
+
+			/* tx/rx contexts still open.  This should
+			 * warn in gnix_sep_close, but we will still
+			 * try to clean up a bit. */
+			if (ep->av) {
+				_gnix_ref_put(ep->av);
+				ep->av = NULL;
+			}
+		}
+
+		free(sep->ep_table);
+	}
+
+	if (sep->tx_ep_table)
+		free(sep->tx_ep_table);
+	if (sep->rx_ep_table)
+		free(sep->rx_ep_table);
+	fi_freeinfo(sep->info);
+	free(sep);
+}
+
+static int gnix_sep_close(fid_t fid)
+{
+	int ret = FI_SUCCESS;
+	struct gnix_fid_sep *sep;
+	struct gnix_fid_trx *trx_priv;
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	switch (fid->fclass) {
+	case FI_CLASS_SEP:
+		sep = container_of(fid, struct gnix_fid_sep, ep_fid.fid);
+		if (ofi_atomic_get32(&sep->ref_cnt.references) > 1) {
+			GNIX_WARN(FI_LOG_EP_CTRL, "Contexts associated with "
+				  "this endpoint are still open\n");
+			return -FI_EBUSY;
+		}
+		_gnix_ref_put(sep);
+		break;
+	case FI_CLASS_TX_CTX:
+	case FI_CLASS_RX_CTX:
+		trx_priv = container_of(fid, struct gnix_fid_trx, ep_fid);
+		_gnix_ref_put(trx_priv);
+		break;
+	default:
+		return -FI_EINVAL;
+	}
+
+	return ret;
+}
+
+int gnix_sep_open(struct fid_domain *domain, struct fi_info *info,
+		 struct fid_ep **sep, void *context)
+{
+	struct gnix_fid_sep *sep_priv = NULL;
+	struct gnix_fid_domain *domain_priv = NULL;
+	int ret = FI_SUCCESS;
+	int n_ids = GNIX_SEP_MAX_CNT;
+	uint32_t cdm_id, cdm_id_base;
+	struct gnix_ep_name *name;
+	struct gnix_auth_key *auth_key;
+	uint32_t name_type = GNIX_EPN_TYPE_UNBOUND;
+
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	if ((domain == NULL) || (info == NULL) || (sep == NULL) ||
+	    (info->ep_attr == NULL))
+		return -FI_EINVAL;
+
+	if (!GNIX_EP_RDM_DGM(info->ep_attr->type))
+		return -FI_ENOSYS;
+
+	/*
+	 * check limits for rx and tx ctx's
+	 */
+
+	if ((info->ep_attr->tx_ctx_cnt > n_ids) ||
+	    (info->ep_attr->rx_ctx_cnt > n_ids))
+		return -FI_EINVAL;
+
+	n_ids = MAX(info->ep_attr->tx_ctx_cnt, info->ep_attr->rx_ctx_cnt);
+
+	domain_priv = container_of(domain, struct gnix_fid_domain, domain_fid);
+
+	if (info->ep_attr->auth_key_size) {
+		auth_key = GNIX_GET_AUTH_KEY(info->ep_attr->auth_key,
+			info->ep_attr->auth_key_size);
+		if (!auth_key)
+			return -FI_EINVAL;
+	} else {
+		auth_key = domain_priv->auth_key;
+		assert(auth_key);
+	}
+
+	sep_priv = calloc(1, sizeof(*sep_priv));
+	if (!sep_priv)
+		return -FI_ENOMEM;
+
+	sep_priv->auth_key = auth_key;
+	sep_priv->type = info->ep_attr->type;
+	sep_priv->ep_fid.fid.fclass = FI_CLASS_SEP;
+	sep_priv->ep_fid.fid.context = context;
+
+	sep_priv->ep_fid.fid.ops = &gnix_sep_fi_ops;
+	sep_priv->ep_fid.ops = &gnix_sep_ops;
+	sep_priv->ep_fid.cm = &gnix_ep_ops_cm;
+	sep_priv->domain = domain;
+
+	sep_priv->info = fi_dupinfo(info);
+	sep_priv->info->addr_format = info->addr_format;
+	if (!sep_priv->info) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			    "fi_dupinfo NULL\n");
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	_gnix_ref_init(&sep_priv->ref_cnt, 1, __sep_destruct);
+
+	sep_priv->caps = info->caps & GNIX_EP_PRIMARY_CAPS;
+
+	sep_priv->ep_table = calloc(n_ids, sizeof(struct gnix_fid_ep *));
+	if (sep_priv->ep_table == NULL) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			    "call returned NULL\n");
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	sep_priv->tx_ep_table = calloc(n_ids, sizeof(struct gnix_fid_ep *));
+	if (sep_priv->tx_ep_table == NULL) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			    "call returned NULL\n");
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	sep_priv->rx_ep_table = calloc(n_ids, sizeof(struct gnix_fid_ep *));
+	if (sep_priv->rx_ep_table == NULL) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			    "call returned NULL\n");
+		ret = -FI_ENOMEM;
+		goto err;
+	}
+
+	/*
+	 * allocate a block of cm nic ids for both tx/rx ctx - first
+	 * checking to see if the application has specified a base
+	 * via a node/service option to fi_getinfo
+	 */
+
+	if (info->src_addr != NULL) {
+		name = (struct gnix_ep_name *) info->src_addr;
+
+		if (name->name_type & GNIX_EPN_TYPE_BOUND) {
+			cdm_id_base = name->gnix_addr.cdm_id;
+			name_type = name->name_type;
+		}
+	}
+
+	name_type |= GNIX_EPN_TYPE_SEP;
+
+	cdm_id = (name_type & GNIX_EPN_TYPE_UNBOUND) ? -1 : cdm_id_base;
+
+	ret = _gnix_get_new_cdm_id_set(domain_priv, n_ids, &cdm_id);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			  "_gnix_get_new_cdm_id_set call returned %s\n",
+			  fi_strerror(-ret));
+		goto err;
+	}
+
+	sep_priv->cdm_id_base = cdm_id;
+
+	/*
+	 * allocate cm_nic for this SEP
+	 */
+	ret = _gnix_cm_nic_alloc(domain_priv,
+				 sep_priv->info,
+				 cdm_id,
+				 sep_priv->auth_key,
+				 &sep_priv->cm_nic);
+	if (ret != FI_SUCCESS) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			    "gnix_cm_nic_alloc call returned %s\n",
+			     fi_strerror(-ret));
+		goto err;
+	}
+
+	/*
+	 * ep name of SEP is the same as the cm_nic
+	 * since there's a one-to-one relationship
+	 * between a given SEP and its cm_nic.
+	 */
+	sep_priv->my_name = sep_priv->cm_nic->my_name;
+	sep_priv->my_name.cm_nic_cdm_id =
+				sep_priv->cm_nic->my_name.gnix_addr.cdm_id;
+	sep_priv->my_name.rx_ctx_cnt = info->ep_attr->rx_ctx_cnt;
+	sep_priv->my_name.name_type = name_type;
+
+	fastlock_init(&sep_priv->sep_lock);
+	_gnix_ref_get(domain_priv);
+
+	*sep = &sep_priv->ep_fid;
+	return ret;
+
+err:
+	if (sep_priv->ep_table)
+		free(sep_priv->ep_table);
+	if (sep_priv->tx_ep_table)
+		free(sep_priv->tx_ep_table);
+	if (sep_priv->rx_ep_table)
+		free(sep_priv->rx_ep_table);
+	if (sep_priv)
+		free(sep_priv);
+	return ret;
+
+}
+
+/*******************************************************************************
+ssize_t (*recv)(struct fid_ep *ep, void *buf, size_t len, void *desc,
+		fi_addr_t src_addr, void *context);
+ssize_t (*send)(struct fid_ep *ep, const void *buf, size_t len, void *desc,
+		fi_addr_t dest_addr, void *context);
+ ******************************************************************************/
+
+/*
+ * TODO: need to define the other msg/rma/amo methods for tx/rx contexts
+ */
+
+DIRECT_FN STATIC ssize_t gnix_sep_recv(struct fid_ep *ep, void *buf,
+				       size_t len, void *desc,
+				       fi_addr_t src_addr, void *context)
+{
+	struct gnix_fid_trx *rx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_recv(&rx_ep->ep->ep_fid, buf, len, desc, src_addr,
+			context, 0, 0, 0);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_recvv(struct fid_ep *ep,
+					const struct iovec *iov,
+					void **desc, size_t count,
+					fi_addr_t src_addr,
+					void *context)
+{
+	struct gnix_fid_trx *rx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_recvv(&rx_ep->ep->ep_fid, iov, desc, count, src_addr,
+			 context, 0, 0, 0);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_recvmsg(struct fid_ep *ep,
+					 const struct fi_msg *msg,
+					 uint64_t flags)
+{
+	struct gnix_fid_trx *rx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_recvmsg(&rx_ep->ep->ep_fid, msg, flags & GNIX_RECVMSG_FLAGS,
+			   0, 0);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_send(struct fid_ep *ep, const void *buf,
+				       size_t len, void *desc,
+				       fi_addr_t dest_addr, void *context)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_send(&tx_ep->ep->ep_fid, buf, len, desc, dest_addr,
+			context, 0, 0);
+}
+
+DIRECT_FN ssize_t gnix_sep_sendv(struct fid_ep *ep,
+				 const struct iovec *iov,
+				 void **desc, size_t count,
+				 fi_addr_t dest_addr,
+				 void *context)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_sendv(&tx_ep->ep->ep_fid, iov, desc, count, dest_addr,
+			 context, 0, 0);
+}
+
+DIRECT_FN ssize_t gnix_sep_sendmsg(struct fid_ep *ep,
+				  const struct fi_msg *msg,
+				  uint64_t flags)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_sendmsg(&tx_ep->ep->ep_fid, msg,
+			   flags & GNIX_SENDMSG_FLAGS, 0);
+}
+
+DIRECT_FN ssize_t gnix_sep_msg_inject(struct fid_ep *ep, const void *buf,
+				      size_t len, fi_addr_t dest_addr)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_inject(&tx_ep->ep->ep_fid, buf, len, 0, dest_addr, 0, 0);
+}
+
+DIRECT_FN ssize_t gnix_sep_senddata(struct fid_ep *ep, const void *buf,
+				    size_t len, void *desc, uint64_t data,
+				    fi_addr_t dest_addr, void *context)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_senddata(&tx_ep->ep->ep_fid, buf, len, desc, data,
+			    dest_addr, context, 0, 0);
+}
+
+DIRECT_FN ssize_t
+gnix_sep_msg_injectdata(struct fid_ep *ep, const void *buf, size_t len,
+			uint64_t data, fi_addr_t dest_addr)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *tx_ep;
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	tx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(tx_ep->ep->type));
+
+	flags = tx_ep->op_flags | FI_INJECT | FI_REMOTE_CQ_DATA |
+		GNIX_SUPPRESS_COMPLETION;
+
+	return _gnix_send(tx_ep->ep, (uint64_t)buf, len, NULL, dest_addr,
+			  NULL, flags, data, 0);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_trecv(struct fid_ep *ep, void *buf,
+					size_t len,
+					void *desc, fi_addr_t src_addr,
+					uint64_t tag, uint64_t ignore,
+					void *context)
+{
+	struct gnix_fid_trx *rx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_recv(&rx_ep->ep->ep_fid, buf, len, desc, src_addr, context,
+			FI_TAGGED, tag, ignore);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_trecvv(struct fid_ep *ep,
+					 const struct iovec *iov,
+					 void **desc, size_t count,
+					 fi_addr_t src_addr,
+					 uint64_t tag, uint64_t ignore,
+					 void *context)
+{
+	struct gnix_fid_trx *rx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_recvv(&rx_ep->ep->ep_fid, iov, desc, count, src_addr,
+			 context, FI_TAGGED, tag, ignore);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_trecvmsg(struct fid_ep *ep,
+					   const struct fi_msg_tagged *msg,
+					   uint64_t flags)
+{
+	const struct fi_msg _msg = {
+			.msg_iov = msg->msg_iov,
+			.desc = msg->desc,
+			.iov_count = msg->iov_count,
+			.addr = msg->addr,
+			.context = msg->context,
+			.data = msg->data
+	};
+
+	if (flags & ~GNIX_TRECVMSG_FLAGS)
+		return -FI_EINVAL;
+
+	if ((flags & FI_CLAIM) && _msg.context == NULL)
+		return -FI_EINVAL;
+
+	if ((flags & FI_DISCARD) && !(flags & (FI_PEEK | FI_CLAIM)))
+		return -FI_EINVAL;
+
+	struct gnix_fid_trx *rx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_recvmsg(&rx_ep->ep->ep_fid, &_msg, flags | FI_TAGGED,
+			   msg->tag, msg->ignore);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_tsend(struct fid_ep *ep, const void *buf,
+					size_t len, void *desc,
+					fi_addr_t dest_addr, uint64_t tag,
+					void *context)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_send(&tx_ep->ep->ep_fid, buf, len, desc, dest_addr,
+			context, FI_TAGGED, tag);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_tsendv(struct fid_ep *ep,
+					 const struct iovec *iov,
+					 void **desc, size_t count,
+					 fi_addr_t dest_addr,
+					 uint64_t tag, void *context)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_sendv(&tx_ep->ep->ep_fid, iov, desc, count, dest_addr,
+			 context, FI_TAGGED, tag);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_tsendmsg(struct fid_ep *ep,
+					   const struct fi_msg_tagged *msg,
+					   uint64_t flags)
+{
+	const struct fi_msg _msg = {
+			.msg_iov = msg->msg_iov,
+			.desc = msg->desc,
+			.iov_count = msg->iov_count,
+			.addr = msg->addr,
+			.context = msg->context,
+			.data = msg->data
+	};
+
+	if (flags & ~GNIX_SENDMSG_FLAGS)
+		return -FI_EINVAL;
+
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_sendmsg(&tx_ep->ep->ep_fid, &_msg, flags | FI_TAGGED,
+			   msg->tag);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_tinject(struct fid_ep *ep, const void *buf,
+					  size_t len, fi_addr_t dest_addr,
+					  uint64_t tag)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_inject(&tx_ep->ep->ep_fid, buf, len, 0, dest_addr, FI_TAGGED,
+			  tag);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_tsenddata(struct fid_ep *ep, const void *buf,
+					    size_t len, void *desc,
+					    uint64_t data, fi_addr_t dest_addr,
+					    uint64_t tag, void *context)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_senddata(&tx_ep->ep->ep_fid, buf, len, desc, data,
+			    dest_addr, context, FI_TAGGED, tag);
+}
+
+DIRECT_FN STATIC ssize_t gnix_sep_tinjectdata(struct fid_ep *ep,
+					      const void *buf,
+					      size_t len, uint64_t data,
+					      fi_addr_t dest_addr, uint64_t tag)
+{
+	struct gnix_fid_trx *tx_ep = container_of(ep, struct gnix_fid_trx,
+						  ep_fid);
+
+	return _ep_inject(&tx_ep->ep->ep_fid, buf, len, data, dest_addr,
+			  FI_TAGGED | FI_REMOTE_CQ_DATA, tag);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_read(struct fid_ep *ep, void *buf, size_t len,
+	      void *desc, fi_addr_t src_addr, uint64_t addr,
+	      uint64_t key, void *context)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *rx_ep;
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	rx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(rx_ep->ep->type));
+	flags = rx_ep->op_flags | GNIX_RMA_READ_FLAGS_DEF;
+
+	return _gnix_rma(rx_ep->ep, GNIX_FAB_RQ_RDMA_READ,
+			 (uint64_t)buf, len, desc,
+			 src_addr, addr, key,
+			 context, flags, 0);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_readv(struct fid_ep *ep, const struct iovec *iov, void **desc,
+	       size_t count, fi_addr_t src_addr, uint64_t addr, uint64_t key,
+	       void *context)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *rx_ep;
+
+	if (!ep || !iov || !desc || count > GNIX_MAX_RMA_IOV_LIMIT) {
+		return -FI_EINVAL;
+	}
+
+	rx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(rx_ep->ep->type));
+	flags = rx_ep->op_flags | GNIX_RMA_READ_FLAGS_DEF;
+
+	return _gnix_rma(rx_ep->ep, GNIX_FAB_RQ_RDMA_READ,
+			 (uint64_t)iov[0].iov_base, iov[0].iov_len, desc[0],
+			 src_addr, addr, key,
+			 context, flags, 0);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
+		 uint64_t flags)
+{
+	struct gnix_fid_trx *rx_ep;
+
+	if (!ep || !msg || !msg->msg_iov || !msg->rma_iov || !msg->desc ||
+	    msg->iov_count != 1 || msg->rma_iov_count != 1 ||
+	    msg->rma_iov[0].len > msg->msg_iov[0].iov_len) {
+		return -FI_EINVAL;
+	}
+
+	rx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(rx_ep->ep->type));
+
+	flags = (flags & GNIX_READMSG_FLAGS) | GNIX_RMA_READ_FLAGS_DEF;
+
+	return _gnix_rma(rx_ep->ep, GNIX_FAB_RQ_RDMA_READ,
+			 (uint64_t)msg->msg_iov[0].iov_base,
+			 msg->msg_iov[0].iov_len, msg->desc[0],
+			 msg->addr, msg->rma_iov[0].addr, msg->rma_iov[0].key,
+			 msg->context, flags, msg->data);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_write(struct fid_ep *ep, const void *buf, size_t len, void *desc,
+	       fi_addr_t dest_addr, uint64_t addr, uint64_t key, void *context)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *tx_ep;
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	tx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(tx_ep->ep->type));
+	flags = tx_ep->op_flags | GNIX_RMA_WRITE_FLAGS_DEF;
+
+	return _gnix_rma(tx_ep->ep, GNIX_FAB_RQ_RDMA_WRITE,
+			 (uint64_t)buf, len, desc, dest_addr, addr, key,
+			 context, flags, 0);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_writev(struct fid_ep *ep, const struct iovec *iov, void **desc,
+		size_t count, fi_addr_t dest_addr, uint64_t addr, uint64_t key,
+		void *context)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *tx_ep;
+
+	if (!ep || !iov || !desc || count > GNIX_MAX_RMA_IOV_LIMIT) {
+		return -FI_EINVAL;
+	}
+
+	tx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(tx_ep->ep->type));
+	flags = tx_ep->op_flags | GNIX_RMA_WRITE_FLAGS_DEF;
+
+	return _gnix_rma(tx_ep->ep, GNIX_FAB_RQ_RDMA_WRITE,
+			 (uint64_t)iov[0].iov_base, iov[0].iov_len, desc[0],
+			 dest_addr, addr, key, context, flags, 0);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_writemsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
+		  uint64_t flags)
+{
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep || !msg || !msg->msg_iov || !msg->rma_iov ||
+	    msg->iov_count != 1 ||
+		msg->rma_iov_count > GNIX_MAX_RMA_IOV_LIMIT ||
+	    msg->rma_iov[0].len > msg->msg_iov[0].iov_len) {
+		return -FI_EINVAL;
+	}
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = (flags & GNIX_WRITEMSG_FLAGS) | GNIX_RMA_WRITE_FLAGS_DEF;
+
+	return _gnix_rma(trx_ep->ep, GNIX_FAB_RQ_RDMA_WRITE,
+			 (uint64_t)msg->msg_iov[0].iov_base,
+			 msg->msg_iov[0].iov_len,
+			 msg->desc ? msg->desc[0] : NULL,
+			 msg->addr, msg->rma_iov[0].addr, msg->rma_iov[0].key,
+			 msg->context, flags, msg->data);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_rma_inject(struct fid_ep *ep, const void *buf,
+		    size_t len, fi_addr_t dest_addr,
+		    uint64_t addr, uint64_t key)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = trx_ep->op_flags | FI_INJECT | GNIX_SUPPRESS_COMPLETION |
+			GNIX_RMA_WRITE_FLAGS_DEF;
+
+	return _gnix_rma(trx_ep->ep, GNIX_FAB_RQ_RDMA_WRITE,
+			 (uint64_t)buf, len, NULL,
+			 dest_addr, addr, key,
+			 NULL, flags, 0);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_writedata(struct fid_ep *ep, const void *buf, size_t len, void *desc,
+		   uint64_t data, fi_addr_t dest_addr, uint64_t addr,
+		   uint64_t key, void *context)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = trx_ep->op_flags | FI_REMOTE_CQ_DATA | GNIX_RMA_WRITE_FLAGS_DEF;
+
+	return _gnix_rma(trx_ep->ep, GNIX_FAB_RQ_RDMA_WRITE,
+			 (uint64_t)buf, len, desc,
+			 dest_addr, addr, key,
+			 context, flags, data);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_rma_injectdata(struct fid_ep *ep, const void *buf, size_t len,
+			uint64_t data, fi_addr_t dest_addr, uint64_t addr,
+			uint64_t key)
+{
+	uint64_t flags;
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep) {
+		return -FI_EINVAL;
+	}
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = trx_ep->op_flags | FI_INJECT | FI_REMOTE_CQ_DATA |
+			GNIX_SUPPRESS_COMPLETION | GNIX_RMA_WRITE_FLAGS_DEF;
+
+	return _gnix_rma(trx_ep->ep, GNIX_FAB_RQ_RDMA_WRITE,
+			 (uint64_t)buf, len, NULL,
+			 dest_addr, addr, key,
+			 NULL, flags, data);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_write(struct fid_ep *ep, const void *buf, size_t count,
+		      void *desc, fi_addr_t dest_addr, uint64_t addr,
+		      uint64_t key, enum fi_datatype datatype, enum fi_op op,
+		      void *context)
+{
+	struct gnix_fid_trx *trx_ep;
+
+	struct fi_msg_atomic msg;
+	struct fi_ioc msg_iov;
+	struct fi_rma_ioc rma_iov;
+	uint64_t flags;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	if (_gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_AMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	msg_iov.addr = (void *)buf;
+	msg_iov.count = count;
+	msg.msg_iov = &msg_iov;
+	msg.desc = &desc;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	rma_iov.addr = addr;
+	rma_iov.count = 1;
+	rma_iov.key = key;
+	msg.rma_iov = &rma_iov;
+	msg.datatype = datatype;
+	msg.op = op;
+	msg.context = context;
+
+	flags = trx_ep->op_flags | GNIX_ATOMIC_WRITE_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_AMO, &msg,
+			    NULL, NULL, 0, NULL, NULL, 0, flags);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_writev(struct fid_ep *ep, const struct fi_ioc *iov, void **desc,
+		      size_t count, fi_addr_t dest_addr, uint64_t addr,
+		      uint64_t key, enum fi_datatype datatype, enum fi_op op,
+		      void *context)
+{
+	if (!ep || !iov || count > 1)
+		return -FI_EINVAL;
+
+	return gnix_sep_atomic_write(ep, iov[0].addr,
+				     iov[0].count, desc ? desc[0] : NULL,
+				     dest_addr, addr, key, datatype, op,
+				     context);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_writemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg,
+			uint64_t flags)
+{
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	if (_gnix_atomic_cmd(msg->datatype, msg->op, GNIX_FAB_RQ_AMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = (flags & GNIX_ATOMICMSG_FLAGS) | GNIX_ATOMIC_WRITE_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_AMO, msg,
+			    NULL, NULL, 0, NULL, NULL, 0, flags);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_inject(struct fid_ep *ep, const void *buf, size_t count,
+		       fi_addr_t dest_addr, uint64_t addr, uint64_t key,
+		       enum fi_datatype datatype, enum fi_op op)
+{
+	struct gnix_fid_trx *trx_ep;
+	struct fi_msg_atomic msg;
+	struct fi_ioc msg_iov;
+	struct fi_rma_ioc rma_iov;
+	uint64_t flags;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	if (_gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_AMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	msg_iov.addr = (void *)buf;
+	msg_iov.count = count;
+	msg.msg_iov = &msg_iov;
+	msg.desc = NULL;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	rma_iov.addr = addr;
+	rma_iov.count = 1;
+	rma_iov.key = key;
+	msg.rma_iov = &rma_iov;
+	msg.datatype = datatype;
+	msg.op = op;
+
+	flags = trx_ep->op_flags | FI_INJECT | GNIX_SUPPRESS_COMPLETION |
+			GNIX_ATOMIC_WRITE_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_AMO, &msg,
+			    NULL, NULL, 0, NULL, NULL, 0, flags);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_readwrite(struct fid_ep *ep, const void *buf, size_t count,
+			 void *desc, void *result, void *result_desc,
+			 fi_addr_t dest_addr, uint64_t addr, uint64_t key,
+			 enum fi_datatype datatype, enum fi_op op,
+			 void *context)
+{
+	struct gnix_fid_trx *trx_ep;
+	struct fi_msg_atomic msg;
+	struct fi_ioc msg_iov;
+	struct fi_rma_ioc rma_iov;
+	struct fi_ioc result_iov;
+	uint64_t flags;
+
+	if (_gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_FAMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	msg_iov.addr = (void *)buf;
+	msg_iov.count = count;
+	msg.msg_iov = &msg_iov;
+	msg.desc = &desc;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	rma_iov.addr = addr;
+	rma_iov.count = 1;
+	rma_iov.key = key;
+	msg.rma_iov = &rma_iov;
+	msg.datatype = datatype;
+	msg.op = op;
+	msg.context = context;
+	result_iov.addr = result;
+	result_iov.count = 1;
+
+	flags = trx_ep->op_flags | GNIX_ATOMIC_READ_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_FAMO, &msg,
+			    NULL, NULL, 0,
+			    &result_iov, &result_desc, 1,
+			    flags);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_readwritev(struct fid_ep *ep, const struct fi_ioc *iov,
+			  void **desc, size_t count, struct fi_ioc *resultv,
+			  void **result_desc, size_t result_count,
+			  fi_addr_t dest_addr, uint64_t addr, uint64_t key,
+			  enum fi_datatype datatype, enum fi_op op,
+			  void *context)
+{
+	if (!iov || count > 1 || !resultv)
+		return -FI_EINVAL;
+
+	return gnix_sep_atomic_readwrite(ep, iov[0].addr, iov[0].count,
+					desc ? desc[0] : NULL,
+					resultv[0].addr,
+					result_desc ? result_desc[0] : NULL,
+					dest_addr, addr, key, datatype, op,
+					context);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_readwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg,
+			    struct fi_ioc *resultv, void **result_desc,
+			    size_t result_count, uint64_t flags)
+{
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	if (_gnix_atomic_cmd(msg->datatype, msg->op, GNIX_FAB_RQ_FAMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = (flags & GNIX_FATOMICMSG_FLAGS) | GNIX_ATOMIC_READ_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_FAMO, msg, NULL, NULL, 0,
+			    resultv, result_desc, result_count, flags);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_compwrite(struct fid_ep *ep, const void *buf, size_t count,
+			  void *desc, const void *compare, void *compare_desc,
+			  void *result, void *result_desc, fi_addr_t dest_addr,
+			  uint64_t addr, uint64_t key,
+			  enum fi_datatype datatype, enum fi_op op,
+			  void *context)
+{
+	struct gnix_fid_trx *trx_ep;
+	struct fi_msg_atomic msg;
+	struct fi_ioc msg_iov;
+	struct fi_rma_ioc rma_iov;
+	struct fi_ioc result_iov;
+	struct fi_ioc compare_iov;
+	uint64_t flags;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	if (_gnix_atomic_cmd(datatype, op, GNIX_FAB_RQ_CAMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	msg_iov.addr = (void *)buf;
+	msg_iov.count = count;
+	msg.msg_iov = &msg_iov;
+	msg.desc = &desc;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	rma_iov.addr = addr;
+	rma_iov.count = 1;
+	rma_iov.key = key;
+	msg.rma_iov = &rma_iov;
+	msg.datatype = datatype;
+	msg.op = op;
+	msg.context = context;
+	result_iov.addr = result;
+	result_iov.count = 1;
+	compare_iov.addr = (void *)compare;
+	compare_iov.count = 1;
+
+	flags = trx_ep->op_flags | GNIX_ATOMIC_READ_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_CAMO, &msg,
+			    &compare_iov, &compare_desc, 1,
+			    &result_iov, &result_desc, 1,
+			    flags);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_compwritev(struct fid_ep *ep, const struct fi_ioc *iov,
+			   void **desc, size_t count,
+			   const struct fi_ioc *comparev,
+			   void **compare_desc, size_t compare_count,
+			   struct fi_ioc *resultv, void **result_desc,
+			   size_t result_count, fi_addr_t dest_addr,
+			   uint64_t addr, uint64_t key,
+			   enum fi_datatype datatype, enum fi_op op,
+			   void *context)
+{
+	if (!iov || count > 1 || !resultv || !comparev)
+		return -FI_EINVAL;
+
+	return gnix_sep_atomic_compwrite(ep, iov[0].addr, iov[0].count,
+					 desc ? desc[0] : NULL,
+					 comparev[0].addr,
+					 compare_desc ? compare_desc[0] : NULL,
+					 resultv[0].addr,
+					 result_desc ? result_desc[0] : NULL,
+					 dest_addr, addr, key, datatype, op,
+					 context);
+}
+
+DIRECT_FN STATIC ssize_t
+gnix_sep_atomic_compwritemsg(struct fid_ep *ep, const struct fi_msg_atomic *msg,
+			     const struct fi_ioc *comparev, void **compare_desc,
+			     size_t compare_count, struct fi_ioc *resultv,
+			     void **result_desc, size_t result_count,
+			     uint64_t flags)
+{
+	struct gnix_fid_trx *trx_ep;
+
+	if (!ep)
+		return -FI_EINVAL;
+
+	if (_gnix_atomic_cmd(msg->datatype, msg->op, GNIX_FAB_RQ_CAMO) < 0)
+		return -FI_EOPNOTSUPP;
+
+	trx_ep = container_of(ep, struct gnix_fid_trx, ep_fid);
+	assert(GNIX_EP_RDM_DGM_MSG(trx_ep->ep->type));
+
+	flags = (flags & GNIX_CATOMICMSG_FLAGS) | GNIX_ATOMIC_READ_FLAGS_DEF;
+
+	return _gnix_atomic(trx_ep->ep, GNIX_FAB_RQ_CAMO, msg,
+			    comparev, compare_desc, compare_count,
+			    resultv, result_desc, result_count,
+			    flags);
+}
+
+/*******************************************************************************
+ * FI_OPS_* data structures.
+ ******************************************************************************/
+
+static struct fi_ops gnix_sep_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = gnix_sep_close,
+	.bind = gnix_sep_bind,
+	.control = gnix_sep_control,
+	.ops_open = fi_no_ops_open
+};
+
+static struct fi_ops_ep gnix_sep_ops = {
+	.size = sizeof(struct fi_ops_ep),
+	.cancel = fi_no_cancel,
+	.getopt = fi_no_getopt,
+	.setopt = fi_no_setopt,
+	.tx_ctx = gnix_sep_tx_ctx,
+	.rx_ctx = gnix_sep_rx_ctx,
+	.rx_size_left = fi_no_rx_size_left,
+	.tx_size_left = fi_no_tx_size_left,
+};
+
+static struct fi_ops_msg gnix_sep_msg_ops = {
+	.size = sizeof(struct fi_ops_msg),
+	.recv = gnix_sep_recv,
+	.recvv = gnix_sep_recvv,
+	.recvmsg = gnix_sep_recvmsg,
+	.send = gnix_sep_send,
+	.sendv = gnix_sep_sendv,
+	.sendmsg = gnix_sep_sendmsg,
+	.inject = gnix_sep_msg_inject,
+	.senddata = gnix_sep_senddata,
+	.injectdata = gnix_sep_msg_injectdata,
+};
+
+static struct fi_ops_rma gnix_sep_rma_ops = {
+	.size = sizeof(struct fi_ops_rma),
+	.read = gnix_sep_read,
+	.readv = gnix_sep_readv,
+	.readmsg = gnix_sep_readmsg,
+	.write = gnix_sep_write,
+	.writev = gnix_sep_writev,
+	.writemsg = gnix_sep_writemsg,
+	.inject = gnix_sep_rma_inject,
+	.writedata = gnix_sep_writedata,
+	.injectdata = gnix_sep_rma_injectdata,
+};
+
+static struct fi_ops_tagged gnix_sep_tagged_ops = {
+	.size = sizeof(struct fi_ops_tagged),
+	.recv = gnix_sep_trecv,
+	.recvv = gnix_sep_trecvv,
+	.recvmsg = gnix_sep_trecvmsg,
+	.send = gnix_sep_tsend,
+	.sendv = gnix_sep_tsendv,
+	.sendmsg = gnix_sep_tsendmsg,
+	.inject = gnix_sep_tinject,
+	.senddata = gnix_sep_tsenddata,
+	.injectdata = gnix_sep_tinjectdata,
+};
+
+static struct fi_ops_atomic gnix_sep_atomic_ops = {
+	.size = sizeof(struct fi_ops_atomic),
+	.write = gnix_sep_atomic_write,
+	.writev = gnix_sep_atomic_writev,
+	.writemsg = gnix_sep_atomic_writemsg,
+	.inject = gnix_sep_atomic_inject,
+	.readwrite = gnix_sep_atomic_readwrite,
+	.readwritev = gnix_sep_atomic_readwritev,
+	.readwritemsg = gnix_sep_atomic_readwritemsg,
+	.compwrite = gnix_sep_atomic_compwrite,
+	.compwritev = gnix_sep_atomic_compwritev,
+	.compwritemsg = gnix_sep_atomic_compwritemsg,
+	.writevalid = gnix_ep_atomic_valid,
+	.readwritevalid = gnix_ep_fetch_atomic_valid,
+	.compwritevalid = gnix_ep_cmp_atomic_valid,
+};
+
+/*
+ * rx/tx contexts don't do any connection management,
+ * nor does the underlying gnix_fid_ep struct
+ */
+static struct fi_ops_cm gnix_sep_rxtx_cm_ops = {
+	.size = sizeof(struct fi_ops_cm),
+	.setname = fi_no_setname,
+	.getname = fi_no_getname,
+	.getpeer = fi_no_getpeer,
+	.connect = fi_no_connect,
+	.listen = fi_no_listen,
+	.accept = fi_no_accept,
+	.reject = fi_no_reject,
+	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
+};
diff --git a/prov/gni/src/gnix_tags.c b/prov/gni/src/gnix_tags.c
index c0e3c0a..95cb882 100644
--- a/prov/gni/src/gnix_tags.c
+++ b/prov/gni/src/gnix_tags.c
@@ -505,7 +505,7 @@ int _gnix_tag_storage_init(
 	 */
 	ts->match_func = match_func;
 
-	atomic_initialize(&ts->seq, 1);
+	ofi_atomic_initialize32(&ts->seq, 1);
 	ts->gen = 0;
 	ts->state = GNIX_TS_STATE_INITIALIZED;
 
diff --git a/prov/gni/src/gnix_trigger.c b/prov/gni/src/gnix_trigger.c
index 2e2c223..50f3bdb 100644
--- a/prov/gni/src/gnix_trigger.c
+++ b/prov/gni/src/gnix_trigger.c
@@ -53,7 +53,7 @@ int _gnix_trigger_queue_req(struct gnix_fab_req *req)
 	threshold = &trigger_context->trigger.threshold;
 	cntr = container_of(threshold->cntr, struct gnix_fid_cntr, cntr_fid);
 
-	if (atomic_get(&cntr->cnt) >= threshold->threshold) {
+	if (ofi_atomic_get32(&cntr->cnt) >= threshold->threshold) {
 		GNIX_INFO(FI_LOG_EP_DATA,
 			  "Trigger condition met: %p\n",
 			  req);
@@ -104,7 +104,7 @@ void _gnix_trigger_check_cntr(struct gnix_fid_cntr *cntr)
 		return;
 	}
 
-	 count = atomic_get(&cntr->cnt);
+	 count = ofi_atomic_get32(&cntr->cnt);
 
 	fastlock_acquire(&cntr->trigger_lock);
 	dlist_for_each_safe(&cntr->trigger_list, req, req2, dlist) {
diff --git a/prov/gni/src/gnix_util.c b/prov/gni/src/gnix_util.c
index 8782003..6ee5f89 100644
--- a/prov/gni/src/gnix_util.c
+++ b/prov/gni/src/gnix_util.c
@@ -1,7 +1,8 @@
 /*
  * Copyright (c) 2014 Intel Corporation, Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
+ *                         All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -68,6 +69,12 @@ static bool app_init;
 static uint8_t gnix_app_ptag;
 static uint32_t gnix_app_cookie;
 static uint32_t gnix_pes_on_node;
+static int gnix_pe_node_rank = -1;
+#if HAVE_CRITERION
+int gnix_first_pe_on_node; /* globally visible for  criterion */
+#else
+static int gnix_first_pe_on_node;
+#endif
 /* CCM/ccmlogin specific stuff */
 static bool ccm_init;
 /* This file provides ccm_alps_info */
@@ -83,6 +90,7 @@ typedef struct ccm_alps_info {
 static uint64_t gnix_apid;
 static alpsAppLayout_t gnix_appLayout;
 static uint32_t gnix_device_id;
+static int gnix_cq_limit;
 /* These are not used currently and could be static to gnix_alps_init */
 static int alps_init;
 static int *gnix_app_placementList;
@@ -95,6 +103,12 @@ static int *gnix_app_totalPes;
 static int *gnix_app_nodePes;
 static int *gnix_app_peCpus;
 
+fastlock_t __gnix_alps_lock;
+
+int _gnix_get_cq_limit(void)
+{
+	return gnix_cq_limit;
+}
 
 static inline void __gnix_ccm_cleanup(void)
 {
@@ -147,8 +161,9 @@ static int __gnix_ccm_init(void)
 {
 	int rc, fd;
 	FILE *f;
-	char ccm_nodelist[PATH_MAX];
-	const char *home, *jobid;
+	char *nodefile;
+	char nodelist[PATH_MAX];
+	const char *home;
 	ccm_alps_info_t info;
 	uint32_t num_nids = 0;
 
@@ -172,18 +187,18 @@ static int __gnix_ccm_init(void)
 		   gnix_app_ptag, gnix_app_cookie);
 
 	home = getenv("HOME");
-	jobid = getenv("PBS_JOBID");
-	if (!jobid) {
-		/* This path hasn't been tested yet (no access to resources) */
-		jobid = getenv("SLURM_JOB_ID");
+	/* use the WLM node file if using PBS */
+	nodefile = getenv("PBS_NODEFILE");
+	if (!nodefile) {
+		const char *jobid = getenv("SLURM_JOB_ID");
 		if (!jobid) {
 			jobid = getenv("SLURM_JOBID");
 		}
-		/* Should we do something else if this fails? */
+		snprintf(nodelist, PATH_MAX, "%s/%s%s", home ? home : ".",
+			 CCM_NODELIST_FN, jobid ? jobid : "sdb");
+		nodefile = nodelist;
 	}
-	snprintf(ccm_nodelist, PATH_MAX, "%s/%s%s", home ? home : ".",
-		 CCM_NODELIST_FN, jobid ? jobid : "sdb");
-	f = fopen(ccm_nodelist, "r");
+	f = fopen(nodefile, "r");
 	if (f) {
 		char mynid[PATH_MAX];
 		char next_nid[PATH_MAX];
@@ -210,7 +225,7 @@ static int __gnix_ccm_init(void)
 	} else {
 		/* what would be a better default? */
 		GNIX_WARN(FI_LOG_FABRIC,
-			  "CCM nodelist not found.  Assuming 1 PE per node");
+			  "CCM nodelist not found.  Assuming 1 PE per node\n");
 		gnix_pes_on_node = 1;
 	}
 	GNIX_DEBUG(FI_LOG_FABRIC, "pes per node=%u\n", gnix_pes_on_node);
@@ -232,18 +247,22 @@ static int __gnix_ccm_init(void)
 
 static int __gnix_alps_init(void)
 {
+	char *cptr = NULL;
 	int ret = FI_SUCCESS;
+	int my_pe = -1;
 	int alps_status = 0;
 	size_t alps_count;
 	alpsAppLLIGni_t *rdmacred_rsp = NULL;
 	alpsAppGni_t *rdmacred_buf = NULL;
 
+	fastlock_acquire(&__gnix_alps_lock);
 	/* lli_lock doesn't return anything useful */
 	ret = alps_app_lli_lock();
 
 	if (alps_init) {
 		/* alps lli lock protects alps_init for now */
 		alps_app_lli_unlock();
+		fastlock_release(&__gnix_alps_lock);
 		return ret;
 	}
 
@@ -347,12 +366,30 @@ static int __gnix_alps_init(void)
 	}
 
 	gnix_pes_on_node = gnix_appLayout.numPesHere;
+	gnix_first_pe_on_node = gnix_appLayout.firstPe;
+
+	if ((cptr = getenv("PMI_FORK_RANK")) != NULL) {
+		my_pe = atoi(cptr);
+	} else {
+		if ((cptr = getenv("ALPS_APP_PE")) != NULL) {
+			my_pe = atoi(cptr);
+		}
+	}
+
+	/*
+ 	 * compute local pe rank, assuming we got our global PE rank
+ 	 * via either an ALPS (or ALPS SLURM plugin) or Cray PMI,
+ 	 * otherwise set to -1.
+ 	 */
+	if (my_pe != -1)
+		gnix_pe_node_rank = my_pe - gnix_first_pe_on_node;
 
 	alps_init = true;
 
 	ret = 0;
 err:
 	alps_app_lli_unlock();
+	fastlock_release(&__gnix_alps_lock);
 	if (rdmacred_rsp != NULL) {
 		free(rdmacred_rsp);
 	}
@@ -387,6 +424,8 @@ int gnixu_get_rdma_credentials(void *addr, uint8_t *ptag, uint32_t *cookie)
 {
 	int ret = FI_SUCCESS;
 
+	/*TODO: If addr is used, ensure that ep->info->addr_format is checked*/
+
 	if ((ptag == NULL) || (cookie == NULL)) {
 		return -FI_EINVAL;
 	}
@@ -590,6 +629,33 @@ int _gnix_pes_on_node(uint32_t *num_pes)
 	return FI_SUCCESS;
 }
 
+int _gnix_pe_node_rank(int *pe_node_rank)
+{
+	int rc;
+
+	if (!pe_node_rank) {
+		return -FI_EINVAL;
+	}
+
+	rc = __gnix_app_init();
+	if (rc) {
+		GNIX_WARN(FI_LOG_FABRIC,
+			  "__gnix_app_init() failed, ret=%d(%s)\n",
+			  rc, strerror(errno));
+		return rc;
+	}
+
+	if (gnix_pe_node_rank != -1) {
+		*pe_node_rank = gnix_pe_node_rank;
+		rc = FI_SUCCESS;
+	} else
+		rc = -FI_EADDRNOTAVAIL;
+
+	GNIX_INFO(FI_LOG_FABRIC, "pe_node_rank: %u\n", gnix_pe_node_rank);
+
+	return rc;
+}
+
 int _gnix_nics_per_rank(uint32_t *nics_per_rank)
 {
 	int rc;
@@ -616,6 +682,8 @@ int _gnix_nics_per_rank(uint32_t *nics_per_rank)
 	if (rc) {
 		return rc;
 	}
+
+	gnix_cq_limit = cqs;
 	cqs /= GNIX_CQS_PER_EP;
 
 	rc = _gnix_pes_on_node(&npes);
@@ -655,10 +723,11 @@ void _gnix_dump_gni_res(uint8_t ptag)
 					    dev_res_desc.reserved,
 					    dev_res_desc.held,
 					    dev_res_desc.total);
-			GNIX_WARN(FI_LOG_FABRIC, "%s", buf);
 		}
 	}
 
+	GNIX_WARN(FI_LOG_FABRIC, "%s", buf);
+
 	written = 0;
 	written += snprintf(buf + written, size - written,
 			    "Job Resources:\n");
@@ -670,9 +739,10 @@ void _gnix_dump_gni_res(uint8_t ptag)
 					    ptag, gni_job_res_to_str(i),
 					    job_res_desc.used,
 					    job_res_desc.limit);
-			GNIX_WARN(FI_LOG_FABRIC, "%s", buf);
 		}
 	}
+
+	GNIX_WARN(FI_LOG_FABRIC, "%s", buf);
 }
 
 int _gnix_get_num_corespec_cpus(uint32_t *num_core_spec_cpus)
diff --git a/prov/gni/src/gnix_vc.c b/prov/gni/src/gnix_vc.c
index e908b9d..7fd3ef3 100644
--- a/prov/gni/src/gnix_vc.c
+++ b/prov/gni/src/gnix_vc.c
@@ -1,6 +1,6 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
- * Copyright (c) 2015-2016 Los Alamos National Security, LLC.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Los Alamos National Security, LLC.
  *                         All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -71,6 +71,9 @@ static int __gnix_vc_conn_ack_prog_fn(void *data, int *complete_ptr);
 static int __gnix_vc_conn_ack_comp_fn(void *data);
 static int __gnix_vc_push_tx_reqs(struct gnix_vc *vc);
 
+static int __gnix_vc_work_schedule(struct gnix_vc *vc);
+static int _gnix_vc_sched_new_conn(struct gnix_vc *vc);
+
 /*******************************************************************************
  * Helper functions
  ******************************************************************************/
@@ -100,7 +103,7 @@ static struct gnix_vc *_gnix_ep_vc_lookup(struct gnix_fid_ep *ep, uint64_t key)
 	for (i = 0; i < GNIX_ADDR_CACHE_SIZE; i++)
 	{
 		if (ep->addr_cache[i].addr == key && ep->addr_cache[i].vc != NULL)
-			return ep->addr_cache[i].vc;		
+			return ep->addr_cache[i].vc;
 	}
 
 	if (ep->av->type == FI_AV_TABLE) {
@@ -115,7 +118,7 @@ static struct gnix_vc *_gnix_ep_vc_lookup(struct gnix_fid_ep *ep, uint64_t key)
 	if (vc) {
 		ep->addr_cache[ep->last_cached].addr = key;
 		ep->addr_cache[ep->last_cached].vc = vc;
-		ep->last_cached = (ep->last_cached + 1) % 5; 	
+		ep->last_cached = (ep->last_cached + 1) % 5;
 	}
 
 	return vc;
@@ -145,7 +148,9 @@ static int __gnix_vc_gnix_addr_equal(struct dlist_entry *item, const void *arg)
 }
 
 /* Find an unmapped VC that matches 'dest_addr' and map it into the EP's VC
- * look up table.  VC lock must be held. */
+ * look up table.
+ *
+ * Note: EP must be locked. */
 static struct gnix_vc *__gnix_vc_lookup_unmapped(struct gnix_fid_ep *ep,
 						 fi_addr_t dest_addr)
 {
@@ -199,6 +204,8 @@ static struct gnix_vc *__gnix_vc_lookup_unmapped(struct gnix_fid_ep *ep,
  * assumptions: ep is non-null;
  * dest_addr is valid;
  * vc_ptr is non-null.
+ *
+ * Note: EP must be locked.
  */
 static int __gnix_vc_get_vc_by_fi_addr(struct gnix_fid_ep *ep, fi_addr_t dest_addr,
 				       struct gnix_vc **vc_ptr)
@@ -220,12 +227,9 @@ static int __gnix_vc_get_vc_by_fi_addr(struct gnix_fid_ep *ep, fi_addr_t dest_ad
 		return -FI_EINVAL;
 	}
 
-	COND_ACQUIRE(ep->requires_lock, &ep->vc_lock);
-
 	/* Use FI address to lookup in EP VC table. */
 	vc = _gnix_ep_vc_lookup(ep, dest_addr);
 	if (vc) {
-		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
 		*vc_ptr = vc;
 		return FI_SUCCESS;
 	}
@@ -239,7 +243,6 @@ static int __gnix_vc_get_vc_by_fi_addr(struct gnix_fid_ep *ep, fi_addr_t dest_ad
 	 * exists and map it into the AV here. */
 	vc = __gnix_vc_lookup_unmapped(ep, dest_addr);
 	if (vc) {
-		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
 		*vc_ptr = vc;
 		return FI_SUCCESS;
 	}
@@ -281,27 +284,10 @@ static int __gnix_vc_get_vc_by_fi_addr(struct gnix_fid_ep *ep, fi_addr_t dest_ad
 		goto err_w_lock;
 	}
 
-	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
-
-	/* If we just initiated an intra-CM NIC connection, run CM progress.
-	 * This will attempt to complete the connection immediately.  This may
-	 * be required if auto-progress is enabled because CM progress would
-	 * not otherwise be run until a datagram is received on the network. */
-	if (GNIX_ADDR_EQUAL(vc->peer_cm_nic_addr,
-			    vc->ep->cm_nic->my_name.gnix_addr)) {
-		ret = _gnix_cm_nic_progress(ep->domain->cm_nic);
-		if (ret != FI_SUCCESS) {
-			GNIX_WARN(FI_LOG_EP_DATA,
-				  "_gnix_cm_nic_progress() returned %s\n",
-				  fi_strerror(-ret));
-		}
-	}
-
 	*vc_ptr = vc;
 	return ret;
 
 err_w_lock:
-	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
 	if (vc != NULL)
 		_gnix_vc_destroy(vc);
 	return ret;
@@ -331,7 +317,9 @@ static void __gnix_vc_pack_conn_req(char *sbuf,
 				    gni_smsg_attr_t *src_smsg_attr,
 				    gni_mem_handle_t *src_irq_cq_mhdl,
 				    uint64_t caps,
-				    xpmem_segid_t my_segid)
+				    xpmem_segid_t my_segid,
+				    uint8_t name_type,
+				    uint8_t rx_ctx_cnt)
 {
 	size_t __attribute__((unused)) len;
 	char *cptr = sbuf;
@@ -349,7 +337,10 @@ static void __gnix_vc_pack_conn_req(char *sbuf,
 	      sizeof(uint64_t) * 2 +
 	      sizeof(gni_smsg_attr_t) +
 	      sizeof(gni_mem_handle_t) +
-	      sizeof(xpmem_segid_t);
+	      sizeof(xpmem_segid_t) +
+	      sizeof(name_type) +
+	      sizeof(rx_ctx_cnt);
+
 	assert(len <= GNIX_CM_NIC_MAX_MSG_SIZE);
 
 	memcpy(cptr, &rtype, sizeof(rtype));
@@ -369,6 +360,10 @@ static void __gnix_vc_pack_conn_req(char *sbuf,
 	memcpy(cptr, &caps, sizeof(uint64_t));
 	cptr += sizeof(xpmem_segid_t);
 	memcpy(cptr, &my_segid, sizeof(xpmem_segid_t));
+	cptr += sizeof(name_type);
+	memcpy(cptr, &name_type, sizeof(name_type));
+	cptr += sizeof(rx_ctx_cnt);
+	memcpy(cptr, &rx_ctx_cnt, sizeof(rx_ctx_cnt));
 }
 
 /*
@@ -382,7 +377,9 @@ static void __gnix_vc_unpack_conn_req(char *rbuf,
 				      gni_smsg_attr_t *src_smsg_attr,
 				      gni_mem_handle_t *src_irq_cq_mhndl,
 				      uint64_t *caps,
-				      xpmem_segid_t *peer_segid)
+				      xpmem_segid_t *peer_segid,
+				      uint8_t *name_type,
+				      uint8_t *rx_ctx_cnt)
 {
 	size_t __attribute__((unused)) len;
 	char *cptr = rbuf;
@@ -409,6 +406,11 @@ static void __gnix_vc_unpack_conn_req(char *rbuf,
 	memcpy(caps, cptr, sizeof(uint64_t));
 	cptr += sizeof(uint64_t);
 	memcpy(peer_segid, cptr, sizeof(xpmem_segid_t));
+	cptr += sizeof(uint8_t);
+	memcpy(name_type, cptr, sizeof(*name_type));
+	cptr += sizeof(uint8_t);
+	memcpy(rx_ctx_cnt, cptr, sizeof(*rx_ctx_cnt));
+
 }
 
 /*
@@ -508,10 +510,9 @@ static void __gnix_vc_get_msg_type(char *rbuf,
  * helper function to initialize an SMSG connection, plus
  * a mem handle to use for delivering IRQs to peer when needed
  */
-static int __gnix_vc_smsg_init(struct gnix_vc *vc,
-				int peer_id,
-				gni_smsg_attr_t *peer_smsg_attr,
-				gni_mem_handle_t *peer_irq_mem_hndl)
+int _gnix_vc_smsg_init(struct gnix_vc *vc, int peer_id,
+		       gni_smsg_attr_t *peer_smsg_attr,
+		       gni_mem_handle_t *peer_irq_mem_hndl)
 {
 	int ret = FI_SUCCESS;
 	struct gnix_fid_ep *ep;
@@ -649,14 +650,13 @@ static int __gnix_vc_connect_to_self(struct gnix_vc *vc)
 	smsg_mbox_attr.mbox_maxcredit = dom->params.mbox_maxcredit;
 	smsg_mbox_attr.msg_maxsize = dom->params.mbox_msg_maxsize;
 
-	ret = __gnix_vc_smsg_init(vc, vc->vc_id, &smsg_mbox_attr, NULL);
+	ret = _gnix_vc_smsg_init(vc, vc->vc_id, &smsg_mbox_attr, NULL);
 	if (ret != FI_SUCCESS) {
 		GNIX_WARN(FI_LOG_EP_DATA,
 			  "_gnix_vc_smsg_init returned %s\n",
 			  fi_strerror(-ret));
 		goto err_mbox_init;
 	}
-	vc->conn_state = GNIX_VC_CONNECTED;
 
 	/* TODO: use special send-to-self mechanism to avoid overhead of XPMEM
 	 * when just sending a message to oneself. */
@@ -678,13 +678,14 @@ static int __gnix_vc_connect_to_self(struct gnix_vc *vc)
 	}
 
 	vc->peer_id = vc->vc_id;
-	vc->peer_caps = ep->caps;
 	vc->peer_irq_mem_hndl = ep->nic->irq_mem_hndl;
+	vc->peer_caps = ep->caps;
+	vc->conn_state = GNIX_VC_CONNECTED;
 
-	ret = _gnix_vc_schedule(vc);
+	ret = _gnix_vc_sched_new_conn(vc);
 	if (ret != FI_SUCCESS)
 		GNIX_WARN(FI_LOG_EP_DATA,
-			  "_gnix_vc_schedule returned %s\n",
+			  "_gnix_vc_sched_new_conn returned %s\n",
 			  fi_strerror(-ret));
 
 	GNIX_DEBUG(FI_LOG_EP_CTRL, "moving vc %p state to connected\n", vc);
@@ -693,7 +694,7 @@ static int __gnix_vc_connect_to_self(struct gnix_vc *vc)
 err_mbox_init:
 	_gnix_mbox_free(vc->smsg_mbox);
 	vc->smsg_mbox = NULL;
-	
+
 	return ret;
 }
 
@@ -759,11 +760,11 @@ static int __gnix_vc_hndl_conn_resp(struct gnix_cm_nic *cm_nic,
 	 * build the SMSG connection
 	 */
 
-	ret = __gnix_vc_smsg_init(vc, peer_id, &peer_smsg_attr,
-				  &tmp_mem_hndl);
+	ret = _gnix_vc_smsg_init(vc, peer_id, &peer_smsg_attr,
+				 &tmp_mem_hndl);
 	if (ret != FI_SUCCESS) {
 		GNIX_WARN(FI_LOG_EP_CTRL,
-			"__gnix_vc_smsg_init returned %s\n",
+			"_gnix_vc_smsg_init returned %s\n",
 			fi_strerror(-ret));
 		goto err;
 	}
@@ -789,20 +790,20 @@ static int __gnix_vc_hndl_conn_resp(struct gnix_cm_nic *cm_nic,
 	 * further processing
 	 */
 
-	vc->conn_state = GNIX_VC_CONNECTED;
+	vc->peer_caps = peer_caps;
 	vc->peer_id = peer_id;
+	vc->conn_state = GNIX_VC_CONNECTED;
 	GNIX_DEBUG(FI_LOG_EP_CTRL,
 		   " moving vc %p to state connected\n",vc);
 
-	vc->peer_caps = peer_caps;
-	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
-
-	ret = _gnix_vc_schedule(vc);
+	ret = _gnix_vc_sched_new_conn(vc);
 	if (ret != FI_SUCCESS)
 		GNIX_WARN(FI_LOG_EP_DATA,
-			  "_gnix_vc_schedule returned %s\n",
+			  "_gnix_vc_sched_new_conn returned %s\n",
 			  fi_strerror(-ret));
 
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
 	return ret;
 err:
 	vc->conn_state = GNIX_VC_CONN_ERROR;
@@ -833,8 +834,10 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 	fi_addr_t fi_addr;
 	xpmem_segid_t peer_segid;
 	xpmem_apid_t peer_apid;
+	uint8_t name_type, rx_ctx_cnt;
 	bool accessible;
 	ssize_t __attribute__((unused)) len;
+	struct gnix_ep_name *error_data;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
@@ -850,7 +853,9 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 				  &src_smsg_attr,
 				  &tmp_mem_hndl,
 				  &peer_caps,
-				  &peer_segid);
+				  &peer_segid,
+				  &name_type,
+				  &rx_ctx_cnt);
 
 
 	GNIX_DEBUG(FI_LOG_EP_CTRL,
@@ -873,8 +878,7 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 	if (ep == NULL) {
 		GNIX_WARN(FI_LOG_EP_DATA,
 			  "_gnix_ht_lookup addr_to_ep failed\n");
-		ret = -FI_ENOENT;
-		goto err;
+		return -FI_ENOENT;
 	}
 
 	/*
@@ -937,10 +941,32 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 					  vc, src_addr);
 
 				dlist_insert_tail(&vc->list, &ep->unmapped_vcs);
+
+				if (vc->ep->caps & FI_SOURCE) {
+					error_data =
+						calloc(1, sizeof(*error_data));
+					if (error_data == NULL) {
+						ret = -FI_ENOMEM;
+						goto err;
+					}
+					vc->gnix_ep_name = (void *) error_data;
+
+					error_data->gnix_addr = src_addr;
+					error_data->name_type = name_type;
+
+					error_data->cm_nic_cdm_id =
+						cm_nic->my_name.cm_nic_cdm_id;
+					error_data->cookie =
+						cm_nic->my_name.cookie;
+
+					error_data->rx_ctx_cnt = rx_ctx_cnt;
+				}
 			}
-		} else
+		} else {
 			vc->conn_state = GNIX_VC_CONNECTING;
+		}
 
+		vc->peer_caps = peer_caps;
 		/*
 		 * prepare a work request to
 		 * initiate an request response
@@ -979,21 +1005,6 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 		fastlock_acquire(&cm_nic->wq_lock);
 		dlist_insert_before(&work_req->list, &cm_nic->cm_nic_wq);
 		fastlock_release(&cm_nic->wq_lock);
-
-		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
-
-		ret = _gnix_vc_schedule(vc);
-		if (ret != FI_SUCCESS)
-			GNIX_WARN(FI_LOG_EP_DATA,
-				  "_gnix_vc_schedule returned %s\n",
-				  fi_strerror(-ret));
-
-		ret = _gnix_cm_nic_progress(cm_nic);
-		if (ret != FI_SUCCESS)
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				"_gnix_cm_nic_progress returned %s\n",
-				fi_strerror(-ret));
-
 	} else {
 
 		/*
@@ -1010,9 +1021,9 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 			goto err;
 		}
 
-		ret = __gnix_vc_smsg_init(vc, src_vc_id,
-					  &src_smsg_attr,
-					  &tmp_mem_hndl);
+		ret = _gnix_vc_smsg_init(vc, src_vc_id,
+					 &src_smsg_attr,
+					 &tmp_mem_hndl);
 		if (ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "_gnix_vc_smsg_init returned %s\n",
@@ -1031,28 +1042,22 @@ static int __gnix_vc_hndl_conn_req(struct gnix_cm_nic *cm_nic,
 			}
 		}
 
-		vc->conn_state = GNIX_VC_CONNECTED;
+		vc->peer_caps = peer_caps;
 		vc->peer_id = src_vc_id;
+		vc->conn_state = GNIX_VC_CONNECTED;
 		GNIX_DEBUG(FI_LOG_EP_CTRL, "moving vc %p state to connected\n",
 			vc);
 
-		COND_RELEASE(ep->requires_lock, &ep->vc_lock);
-
-		ret = _gnix_vc_schedule(vc);
+		ret = _gnix_vc_sched_new_conn(vc);
 		if (ret != FI_SUCCESS)
 			GNIX_WARN(FI_LOG_EP_DATA,
-				  "_gnix_vc_schedule returned %s\n",
+				  "_gnix_vc_sched_new_conn returned %s\n",
 				  fi_strerror(-ret));
-
-		ret = _gnix_cm_nic_progress(cm_nic);
-		if (ret != FI_SUCCESS)
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				"_gnix_cm_nic_progress returned %s\n",
-				fi_strerror(-ret));
 	}
 
-	vc->peer_caps = peer_caps;
 err:
+	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
+
 	return ret;
 }
 
@@ -1206,10 +1211,10 @@ static int __gnix_vc_conn_ack_prog_fn(void *data, int *complete_ptr)
 				GNIX_CM_NIC_MAX_MSG_SIZE,
 				vc->peer_cm_nic_addr);
 	if (ret == FI_SUCCESS) {
-		ret = __gnix_vc_smsg_init(vc,
-					  work_req_data->src_vc_id,
-					  &work_req_data->src_smsg_attr,
-					  &work_req_data->irq_mem_hndl);
+		ret = _gnix_vc_smsg_init(vc,
+					 work_req_data->src_vc_id,
+					 &work_req_data->src_smsg_attr,
+					 &work_req_data->irq_mem_hndl);
 		if (ret != FI_SUCCESS) {
 			GNIX_WARN(FI_LOG_EP_CTRL,
 				  "_gnix_vc_smsg_init returned %s\n",
@@ -1239,18 +1244,13 @@ static int __gnix_vc_conn_ack_prog_fn(void *data, int *complete_ptr)
 		GNIX_DEBUG(FI_LOG_EP_CTRL,
 			   "moving vc %p to connected\n",vc);
 		vc->modes |= GNIX_VC_MODE_DG_POSTED;
-		ret = _gnix_vc_schedule(vc);
-		if (ret != FI_SUCCESS)
-			GNIX_WARN(FI_LOG_EP_DATA,
-				  "_gnix_vc_schedule returned %s\n",
-				  fi_strerror(-ret));
 
-	} else if (ret == -FI_EAGAIN) {
-		ret = _gnix_vc_schedule(vc);
+		ret = _gnix_vc_sched_new_conn(vc);
 		if (ret != FI_SUCCESS)
 			GNIX_WARN(FI_LOG_EP_DATA,
-				  "_gnix_vc_schedule returned %s\n",
+				  "_gnix_vc_sched_new_conn returned %s\n",
 				  fi_strerror(-ret));
+	} else if (ret == -FI_EAGAIN) {
 		ret = FI_SUCCESS;
 	} else {
 		GNIX_FATAL(FI_LOG_EP_CTRL, "_gnix_cm_nic_send returned %s\n",
@@ -1332,8 +1332,8 @@ static int __gnix_vc_conn_req_prog_fn(void *data, int *complete_ptr)
 
 	GNIX_DEBUG(FI_LOG_EP_CTRL,
 		"conn req tx: (From Aries addr 0x%x Id %d to Aries 0x%x Id %d CM NIC Id %d vc %p)\n",
-		 ep->my_name.gnix_addr.device_addr,
-		 ep->my_name.gnix_addr.cdm_id,
+		 ep->src_addr.gnix_addr.device_addr,
+		 ep->src_addr.gnix_addr.cdm_id,
 		 vc->peer_addr.device_addr,
 		 vc->peer_addr.cdm_id,
 		 vc->peer_cm_nic_addr.cdm_id,
@@ -1349,13 +1349,15 @@ static int __gnix_vc_conn_req_prog_fn(void *data, int *complete_ptr)
 
 	__gnix_vc_pack_conn_req(sbuf,
 				&vc->peer_addr,
-				&ep->my_name.gnix_addr,
+				&ep->src_addr.gnix_addr,
 				vc->vc_id,
 				(uint64_t)vc,
 				&smsg_mbox_attr,
 				&ep->nic->irq_mem_hndl,
 				ep->caps,
-				my_segid);
+				my_segid,
+				ep->src_addr.name_type,
+				ep->src_addr.rx_ctx_cnt);
 
 	/*
 	 * try to send the message, if -FI_EAGAIN is returned, okay,
@@ -1378,11 +1380,6 @@ static int __gnix_vc_conn_req_prog_fn(void *data, int *complete_ptr)
 		GNIX_FATAL(FI_LOG_EP_CTRL, "_gnix_cm_nic_send returned %s\n",
 			   fi_strerror(-ret));
 	}
-	ret = _gnix_vc_schedule(vc);
-	if (ret != FI_SUCCESS)
-		GNIX_WARN(FI_LOG_EP_DATA,
-			  "_gnix_vc_schedule returned %s\n",
-			  fi_strerror(-ret));
 
 err:
 	COND_RELEASE(ep->requires_lock, &ep->vc_lock);
@@ -1420,8 +1417,8 @@ int _gnix_vc_alloc(struct gnix_fid_ep *ep_priv,
 	int ret = FI_SUCCESS;
 	int remote_id;
 	struct gnix_vc *vc_ptr = NULL;
-	struct gnix_cm_nic *cm_nic = NULL;
 	struct gnix_nic *nic = NULL;
+	struct dlist_entry *de = NULL;
 
 	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
 
@@ -1429,13 +1426,17 @@ int _gnix_vc_alloc(struct gnix_fid_ep *ep_priv,
 	if (nic == NULL)
 		return -FI_EINVAL;
 
-	cm_nic = ep_priv->cm_nic;
-	if (cm_nic == NULL)
-		return -FI_EINVAL;
+	/*
+	 * allocate VC from domain's vc_freelist
+	 */
 
-	vc_ptr = calloc(1, sizeof(*vc_ptr));
-	if (!vc_ptr)
-		return -FI_ENOMEM;
+	ret = _gnix_fl_alloc(&de, &nic->vc_freelist);
+	while (ret == -FI_EAGAIN)
+		ret = _gnix_fl_alloc(&de, &nic->vc_freelist);
+	if (ret == FI_SUCCESS) {
+		vc_ptr = container_of(de, struct gnix_vc, fr_list);
+	} else
+		return ret;
 
 	vc_ptr->conn_state = GNIX_VC_CONN_NONE;
 	if (entry) {
@@ -1454,18 +1455,15 @@ int _gnix_vc_alloc(struct gnix_fid_ep *ep_priv,
 	}
 	vc_ptr->ep = ep_priv;
 
+	dlist_init(&vc_ptr->prog_list);
 	dlist_init(&vc_ptr->work_queue);
-	fastlock_init(&vc_ptr->work_queue_lock);
 	dlist_init(&vc_ptr->tx_queue);
-	fastlock_init(&vc_ptr->tx_queue_lock);
-	dlist_init(&vc_ptr->rx_list);
-	dlist_init(&vc_ptr->work_list);
-	dlist_init(&vc_ptr->tx_list);
+
 	vc_ptr->peer_fi_addr = FI_ADDR_NOTAVAIL;
 
 	dlist_init(&vc_ptr->list);
 
-	atomic_initialize(&vc_ptr->outstanding_tx_reqs, 0);
+	ofi_atomic_initialize32(&vc_ptr->outstanding_tx_reqs, 0);
 	ret = _gnix_alloc_bitmap(&vc_ptr->flags, 1);
 	assert(!ret);
 
@@ -1493,20 +1491,10 @@ static void __gnix_vc_cancel(struct gnix_vc *vc)
 {
 	struct gnix_nic *nic = vc->ep->nic;
 
-	COND_ACQUIRE(nic->requires_lock, &nic->rx_vc_lock);
-	if (!dlist_empty(&vc->rx_list))
-		dlist_remove(&vc->rx_list);
-	COND_RELEASE(nic->requires_lock, &nic->rx_vc_lock);
-
-	COND_ACQUIRE(nic->requires_lock, &nic->work_vc_lock);
-	if (!dlist_empty(&vc->work_list))
-		dlist_remove(&vc->work_list);
-	COND_RELEASE(nic->requires_lock, &nic->work_vc_lock);
-
-	COND_ACQUIRE(nic->requires_lock, &nic->tx_vc_lock);
-	if (!dlist_empty(&vc->tx_list))
-		dlist_remove(&vc->tx_list);
-	COND_RELEASE(nic->requires_lock, &nic->tx_vc_lock);
+	COND_ACQUIRE(nic->requires_lock, &nic->prog_vcs_lock);
+	if (!dlist_empty(&vc->prog_list))
+		dlist_remove_init(&vc->prog_list);
+	COND_RELEASE(nic->requires_lock, &nic->prog_vcs_lock);
 }
 
 /* Destroy an unconnected VC.  More Support is needed to shutdown and destroy
@@ -1597,12 +1585,10 @@ int _gnix_vc_destroy(struct gnix_vc *vc)
 	if (!dlist_empty(&vc->tx_queue))
 		GNIX_FATAL(FI_LOG_EP_CTRL, "VC TX queue not empty\n");
 
-	if (atomic_get(&vc->outstanding_tx_reqs))
+	if (ofi_atomic_get32(&vc->outstanding_tx_reqs))
 		GNIX_FATAL(FI_LOG_EP_CTRL,
 			   "VC outstanding_tx_reqs out of sync: %d\n",
-			   atomic_get(&vc->outstanding_tx_reqs));
-
-	fastlock_destroy(&vc->tx_queue_lock);
+			   ofi_atomic_get32(&vc->outstanding_tx_reqs));
 
 	if (vc->smsg_mbox != NULL) {
 		ret = _gnix_mbox_free(vc->smsg_mbox);
@@ -1613,15 +1599,6 @@ int _gnix_vc_destroy(struct gnix_vc *vc)
 		vc->smsg_mbox = NULL;
 	}
 
-	if (vc->dgram != NULL) {
-		ret = _gnix_dgram_free(vc->dgram);
-		if (ret != FI_SUCCESS)
-			GNIX_WARN(FI_LOG_EP_CTRL,
-			      "_gnix_dgram_free returned %s\n",
-			      fi_strerror(-ret));
-		vc->dgram = NULL;
-	}
-
 	ret = _gnix_nic_free_rem_id(nic, vc->vc_id);
 	if (ret != FI_SUCCESS)
 		GNIX_WARN(FI_LOG_EP_CTRL,
@@ -1630,7 +1607,12 @@ int _gnix_vc_destroy(struct gnix_vc *vc)
 
 	_gnix_free_bitmap(&vc->flags);
 
-	free(vc);
+	/*
+	 * put VC back on the freelist
+	 */
+
+	vc->conn_state = GNIX_VC_CONN_NONE;
+	_gnix_fl_free(&vc->fr_list, &nic->vc_freelist);
 
 	return ret;
 }
@@ -1673,7 +1655,7 @@ int _gnix_vc_connect(struct gnix_vc *vc)
 	 * check if this EP is connecting to itself
 	 */
 
-	if (GNIX_ADDR_EQUAL(ep->my_name.gnix_addr, vc->peer_addr)) {
+	if (GNIX_ADDR_EQUAL(ep->src_addr.gnix_addr, vc->peer_addr)) {
 		return __gnix_vc_connect_to_self(vc);
 	}
 
@@ -1700,71 +1682,18 @@ int _gnix_vc_connect(struct gnix_vc *vc)
 	dlist_insert_before(&work_req->list, &cm_nic->cm_nic_wq);
 	fastlock_release(&cm_nic->wq_lock);
 
-	ret = _gnix_vc_schedule(vc);
-	if (ret != FI_SUCCESS)
-		GNIX_WARN(FI_LOG_EP_DATA,
-			  "_gnix_vc_schedule returned %s\n",
-			  fi_strerror(-ret));
-
 	return ret;
 }
 
-/*
- * TODO: this is very simple right now and will need more
- * work to propertly disconnect
- */
-
-int _gnix_vc_disconnect(struct gnix_vc *vc)
-{
-	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
-
-	vc->conn_state = GNIX_VC_CONN_TERMINATED;
-	return FI_SUCCESS;
-}
-
-/* Return 0 if VC is connected.  Progress VC CM if not. */
-static int __gnix_vc_connected(struct gnix_vc *vc)
-{
-	struct gnix_cm_nic *cm_nic;
-	int ret;
-
-	if (unlikely(vc->conn_state < GNIX_VC_CONNECTED)) {
-		cm_nic = vc->ep->cm_nic;
-		ret = _gnix_cm_nic_progress(cm_nic);
-		if ((ret != FI_SUCCESS) && (ret != -FI_EAGAIN))
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				"_gnix_cm_nic_progress() failed: %s\n",
-			fi_strerror(-ret));
-		/* waiting to connect, check back later */
-		return -FI_EAGAIN;
-	}
-
-	return 0;
-}
-
-
 /******************************************************************************
  *
  * VC RX progress
  *
  *****************************************************************************/
 
-/* Schedule the VC for RX progress. */
-int _gnix_vc_rx_schedule(struct gnix_vc *vc)
-{
-	struct gnix_nic *nic = vc->ep->nic;
-
-	if (!_gnix_test_and_set_bit(&vc->flags, GNIX_VC_FLAG_RX_SCHEDULED)) {
-		COND_ACQUIRE(nic->requires_lock, &nic->rx_vc_lock);
-		dlist_insert_tail(&vc->rx_list, &nic->rx_vcs);
-		COND_RELEASE(nic->requires_lock, &nic->rx_vc_lock);
-		GNIX_INFO(FI_LOG_EP_CTRL, "Scheduled RX VC (%p)\n", vc);
-	}
-
-	return FI_SUCCESS;
-}
-
-/* Process a VC's SMSG mailbox. */
+/* Process a VC's SMSG mailbox.
+ *
+ * Note: EP must be locked. */
 int _gnix_vc_dequeue_smsg(struct gnix_vc *vc)
 {
 	int ret = FI_SUCCESS;
@@ -1775,12 +1704,6 @@ int _gnix_vc_dequeue_smsg(struct gnix_vc *vc)
 
 	GNIX_TRACE(FI_LOG_EP_DATA, "\n");
 
-	assert(vc->gni_ep != NULL);
-	if (vc->conn_state != GNIX_VC_CONNECTED)
-		GNIX_WARN(FI_LOG_EP_CTRL, "something amiss with vc %p\n",
-			  vc);
-	assert(vc->conn_state == GNIX_VC_CONNECTED);
-
 	nic = vc->ep->nic;
 	assert(nic != NULL);
 
@@ -1813,19 +1736,13 @@ int _gnix_vc_dequeue_smsg(struct gnix_vc *vc)
 	return ret;
 }
 
-/* Progress VC RXs.  Reschedule VC if more there is more work. */
+/* Progress VC RXs.  Reschedule VC if more there is more work.
+ *
+ * Note: EP must be locked. */
 static int __gnix_vc_rx_progress(struct gnix_vc *vc)
 {
 	int ret;
 
-	ret = __gnix_vc_connected(vc);
-	if (ret) {
-		/* The CM will schedule the VC when the connection is
-		 * complete. */
-		_gnix_vc_rx_schedule(vc);
-		return -FI_EAGAIN;
-	}
-
 	/* Process pending RXs */
 	COND_ACQUIRE(vc->ep->nic->requires_lock, &vc->ep->nic->lock);
 	ret = _gnix_vc_dequeue_smsg(vc);
@@ -1843,168 +1760,84 @@ static int __gnix_vc_rx_progress(struct gnix_vc *vc)
 	return FI_SUCCESS;
 }
 
-static struct gnix_vc *__gnix_nic_next_pending_rx_vc(struct gnix_nic *nic)
-{
-	struct gnix_vc *vc = NULL;
-
-	COND_ACQUIRE(nic->requires_lock, &nic->rx_vc_lock);
-	vc = dlist_first_entry(&nic->rx_vcs, struct gnix_vc, rx_list);
-	if (vc)
-		dlist_remove_init(&vc->rx_list);
-	COND_RELEASE(nic->requires_lock, &nic->rx_vc_lock);
-
-	if (vc) {
-		GNIX_INFO(FI_LOG_EP_CTRL, "Dequeued RX VC (%p)\n", vc);
-		_gnix_clear_bit(&vc->flags, GNIX_VC_FLAG_RX_SCHEDULED);
-	}
-
-	return vc;
-}
-
-/* Progress VC RXs.  Exit when all VCs are empty or if an error is encountered
- * during progress.  Failure to process an RX on any VC likely indicates an
- * inability to progress other VCs (due to low memory). */
-static int __gnix_vc_nic_rx_progress(struct gnix_nic *nic)
-{
-	struct gnix_vc *vc;
-
-	while ((vc = __gnix_nic_next_pending_rx_vc(nic))) {
-		if (__gnix_vc_rx_progress(vc) != FI_SUCCESS) {
-			break;
-		}
-	}
-
-	return FI_SUCCESS;
-}
-
-
 /******************************************************************************
  *
  * VC work progress
  *
  *****************************************************************************/
 
-/* Schedule the VC for work progress. */
-static int __gnix_vc_work_schedule(struct gnix_vc *vc)
+/* Schedule deferred request processing.  Usually used in RX completers.
+ *
+ * Note: EP must be locked. */
+int _gnix_vc_queue_work_req(struct gnix_fab_req *req)
 {
-	struct gnix_nic *nic = vc->ep->nic;
-
-	/* Don't bother scheduling if there's no work to do. */
-	if (dlist_empty(&vc->work_queue))
-		return FI_SUCCESS;
+	struct gnix_vc *vc = req->vc;
 
-	if (!_gnix_test_and_set_bit(&vc->flags, GNIX_VC_FLAG_WORK_SCHEDULED)) {
-		COND_ACQUIRE(nic->requires_lock, &nic->work_vc_lock);
-		dlist_insert_tail(&vc->work_list, &nic->work_vcs);
-		COND_RELEASE(nic->requires_lock, &nic->work_vc_lock);
-		GNIX_INFO(FI_LOG_EP_CTRL, "Scheduled work VC (%p)\n", vc);
-	}
+	dlist_insert_tail(&req->dlist, &vc->work_queue);
+	__gnix_vc_work_schedule(vc);
 
 	return FI_SUCCESS;
 }
 
-/* Schedule deferred request processing.  Usually used in RX completers. */
-int _gnix_vc_queue_work_req(struct gnix_fab_req *req)
+/* Schedule deferred request processing.  Used in TX completers where VC lock is
+ * not yet held. */
+int _gnix_vc_requeue_work_req(struct gnix_fab_req *req)
 {
-	struct gnix_vc *vc = req->vc;
+	int ret;
 
-	COND_ACQUIRE(vc->ep->requires_lock, &vc->work_queue_lock);
-	dlist_insert_tail(&req->dlist, &vc->work_queue);
-	__gnix_vc_work_schedule(vc);
-	COND_RELEASE(vc->ep->requires_lock, &vc->work_queue_lock);
+	COND_ACQUIRE(req->gnix_ep->requires_lock, &req->gnix_ep->vc_lock);
+	ret = _gnix_vc_queue_work_req(req);
+	COND_RELEASE(req->gnix_ep->requires_lock, &req->gnix_ep->vc_lock);
 
-	return FI_SUCCESS;
+	return ret;
 }
 
-/* Process deferred request work on the VC. */
+/* Process deferred request work on the VC.
+ *
+ * Note: EP must be locked. */
 static int __gnix_vc_push_work_reqs(struct gnix_vc *vc)
 {
 	int ret, fi_rc = FI_SUCCESS;
 	struct gnix_fab_req *req;
 
-	while (fi_rc == FI_SUCCESS) {
-		COND_ACQUIRE(vc->ep->requires_lock, &vc->work_queue_lock);
+	while (1) {
 		req = dlist_first_entry(&vc->work_queue,
 					struct gnix_fab_req,
 					dlist);
-		if (req)
-			dlist_remove_init(&req->dlist);
-		COND_RELEASE(vc->ep->requires_lock, &vc->work_queue_lock);
-
-		if (req) {
-			ret = req->work_fn(req);
-			if (ret == FI_SUCCESS) {
-				GNIX_INFO(FI_LOG_EP_DATA,
-					  "Request processed: %p\n", req);
-				continue;
-			}
-
-			/* Work failed.  Reschedule to put this VC
-			 * back on the end of the list and return
-			 * -FI_EAGAIN */
-
-			COND_ACQUIRE(vc->ep->requires_lock,
-					&vc->work_queue_lock);
-			dlist_insert_tail(&req->dlist, &vc->work_queue);
-			COND_RELEASE(vc->ep->requires_lock,
-					&vc->work_queue_lock);
+		if (!req)
+			break;
 
-			/* __gnix_vc_work_schedule() must come after the
-			 * request is inserted into the VC's work_queue. */
-			__gnix_vc_work_schedule(vc);
+		dlist_remove_init(&req->dlist);
 
-			fi_rc = -FI_EAGAIN;
+		ret = req->work_fn(req);
+		if (ret != FI_SUCCESS) {
+			/* Re-schedule failed work. */
+			_gnix_vc_queue_work_req(req);
 
 			/* FI_ENOSPC is reserved to indicate a lack of
 			 * TXDs, which are shared by all VCs on the
 			 * NIC.  The other likely error is FI_EAGAIN
 			 * due to a lack of SMSG credits. */
-
 			if ((ret != -FI_ENOSPC) &&
 			    (ret != -FI_EAGAIN)) {
-				/* TODO report error? */
+				/*
+				 * TODO: Report error (via CQ err?)
+				 * Note: This error can't be reported here.
+				 */
 				GNIX_FATAL(FI_LOG_EP_DATA,
 					   "Failed to push request %p: %s\n",
 					   req, fi_strerror(-ret));
 			}
-		} else {
-			break; /* nothing left in the queue */
-		}
-	}
-
-	return fi_rc;
-}
-
-static struct gnix_vc *__gnix_nic_next_pending_work_vc(struct gnix_nic *nic)
-{
-	struct gnix_vc *vc = NULL;
-
-	COND_ACQUIRE(nic->requires_lock, &nic->work_vc_lock);
-	vc = dlist_first_entry(&nic->work_vcs, struct gnix_vc, work_list);
-	if (vc)
-		dlist_remove_init(&vc->work_list);
-	COND_RELEASE(nic->requires_lock, &nic->work_vc_lock);
 
-	if (vc) {
-		GNIX_INFO(FI_LOG_EP_CTRL, "Dequeued work VC (%p)\n", vc);
-		_gnix_clear_bit(&vc->flags, GNIX_VC_FLAG_WORK_SCHEDULED);
-	}
-
-	return vc;
-}
-
-/* Progress VCs with deferred request work. */
-static int __gnix_vc_nic_work_progress(struct gnix_nic *nic)
-{
-	struct gnix_vc *vc;
-
-	while ((vc = __gnix_nic_next_pending_work_vc(nic))) {
-		if (__gnix_vc_push_work_reqs(vc) != FI_SUCCESS) {
+			fi_rc = -FI_EAGAIN;
 			break;
+		} else {
+			GNIX_INFO(FI_LOG_EP_DATA,
+				  "Request processed: %p\n", req);
 		}
 	}
 
-	return FI_SUCCESS;
+	return fi_rc;
 }
 
 /******************************************************************************
@@ -2013,32 +1846,41 @@ static int __gnix_vc_nic_work_progress(struct gnix_nic *nic)
  *
  *****************************************************************************/
 
-/* Schedule the VC for TX progress. */
-int _gnix_vc_tx_schedule(struct gnix_vc *vc)
-{
-	struct gnix_nic *nic = vc->ep->nic;
-
-	/* Don't bother scheduling if there's no work to do. */
-	if (dlist_empty(&vc->tx_queue))
-		return FI_SUCCESS;
-
-	if (!_gnix_test_and_set_bit(&vc->flags, GNIX_VC_FLAG_TX_SCHEDULED)) {
-		COND_ACQUIRE(nic->requires_lock, &nic->tx_vc_lock);
-		dlist_insert_tail(&vc->tx_list, &nic->tx_vcs);
-		COND_RELEASE(nic->requires_lock, &nic->tx_vc_lock);
-		GNIX_INFO(FI_LOG_EP_CTRL, "Scheduled TX VC (%p)\n", vc);
-	}
-
-	return FI_SUCCESS;
-}
-
 /* Attempt to initiate a TX request.  If the TX queue is blocked (due to low
- * resources or a FI_FENCE request), schedule the request to be sent later. */
+ * resources or a FI_FENCE request), schedule the request to be sent later.
+ *
+ * Note: EP must be locked. */
 int _gnix_vc_queue_tx_req(struct gnix_fab_req *req)
 {
 	int rc = FI_SUCCESS, queue_tx = 0;
 	struct gnix_vc *vc = req->vc;
-	int connected, injecting;
+	struct gnix_fid_ep *ep = req->gnix_ep;
+	struct gnix_fab_req *more_req;
+	int connected;
+	struct slist_entry *sle;
+
+	/* Check if there is an outstanding fi_more chain to initiate */
+	if ((!(req->flags & FI_MORE)) && (!(slist_empty(&ep->more_write)) ||
+		!(slist_empty(&ep->more_read)))) {
+		if (!slist_empty(&ep->more_write)) {
+			sle = ep->more_write.head;
+			more_req = container_of(sle, struct gnix_fab_req,
+						rma.sle);
+			GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: got fab_request "
+					"from more_write. Queuing Request\n");
+			_gnix_vc_queue_tx_req(more_req);
+			slist_init(&ep->more_write);
+		}
+		if (!slist_empty(&ep->more_read)) {
+			sle = ep->more_read.head;
+			more_req = container_of(sle, struct gnix_fab_req,
+						rma.sle);
+			GNIX_DEBUG(FI_LOG_EP_DATA, "FI_MORE: got fab_request "
+					"from more_read. Queuing Request\n");
+			_gnix_vc_queue_tx_req(more_req);
+			slist_init(&ep->more_read);
+		}
+	}
 
 	if (req->flags & FI_TRIGGER) {
 		rc = _gnix_trigger_queue_req(req);
@@ -2049,11 +1891,9 @@ int _gnix_vc_queue_tx_req(struct gnix_fab_req *req)
 			return FI_SUCCESS;
 	}
 
-	connected = !__gnix_vc_connected(vc); /* 0 on success */
-	injecting = (req->flags & FI_INJECT) ? 1 : 0;
+	connected = (vc->conn_state == GNIX_VC_CONNECTED);
 
-	COND_ACQUIRE(vc->ep->requires_lock, &vc->tx_queue_lock);
-	if ((req->flags & FI_FENCE) && atomic_get(&vc->outstanding_tx_reqs)) {
+	if ((req->flags & FI_FENCE) && ofi_atomic_get32(&vc->outstanding_tx_reqs)) {
 		/* Fence request must be queued until all outstanding TX
 		 * requests are completed.  Subsequent requests will be queued
 		 * due to non-empty tx_queue. */
@@ -2062,16 +1902,16 @@ int _gnix_vc_queue_tx_req(struct gnix_fab_req *req)
 			  "Queued FI_FENCE request (%p) on VC\n",
 			  req);
 	} else if (connected && dlist_empty(&vc->tx_queue)) {
-		atomic_inc(&vc->outstanding_tx_reqs);
+		ofi_atomic_inc32(&vc->outstanding_tx_reqs);
 
 		/* try to initiate request */
 		rc = req->work_fn(req);
 		if (rc == FI_SUCCESS) {
 			GNIX_DEBUG(FI_LOG_EP_DATA,
 				  "TX request processed: %p (OTX: %d)\n",
-				  req, atomic_get(&vc->outstanding_tx_reqs));
+				  req, ofi_atomic_get32(&vc->outstanding_tx_reqs));
 		} else if (rc != -FI_ECANCELED) {
-			atomic_dec(&vc->outstanding_tx_reqs);
+			ofi_atomic_dec32(&vc->outstanding_tx_reqs);
 			queue_tx = 1;
 			GNIX_DEBUG(FI_LOG_EP_DATA,
 				  "Queued request (%p) on full VC\n",
@@ -2084,91 +1924,43 @@ int _gnix_vc_queue_tx_req(struct gnix_fab_req *req)
 			  req);
 	}
 
-	/*
-	 * if this is an inject request and the vc is
-	 * not connected, and the domain being used has control_progress
-	 * auto enabled,  we will block here till connection is set up.
-	 * We keep the tx_queue_lock for this vc to make sure messages
-	 * stay in correct order.
-	 */
-
-	if (unlikely(!connected)) {
-		if (injecting &&
-		    (vc->ep->domain->control_progress == FI_PROGRESS_AUTO)) {
-			while ((vc->conn_state != GNIX_VC_CONNECTED)) {
-				rc = _gnix_cm_nic_progress(vc->ep->cm_nic);
-				if (rc != FI_SUCCESS) {
-					GNIX_WARN(FI_LOG_EP_CTRL,
-						"_gnix_cm_nic_progress returned %s\n",
-						fi_strerror(-rc));
-					break;
-				}
-			}
-		}
-	}
-
 	if (unlikely(queue_tx)) {
-		/*
-		 * TODO: for auto progress do something here
-		 */
 		dlist_insert_tail(&req->dlist, &vc->tx_queue);
 		_gnix_vc_tx_schedule(vc);
 	}
 
-	COND_RELEASE(vc->ep->requires_lock, &vc->tx_queue_lock);
-
-	/*
-	 * if injecting and queuing, push the tx queue for this vc
-	 * once before returning
-	 */
-	if (unlikely(queue_tx) && injecting) {
-		rc = __gnix_vc_push_tx_reqs(vc);
-		if ((rc != FI_SUCCESS) && (rc != -FI_EAGAIN)) {
-			GNIX_WARN(FI_LOG_EP_CTRL,
-				"__gnix_vc_push_tx_reqs returned %s\n",
-					fi_strerror(-rc));
-		}
-	}
-
 	return FI_SUCCESS;
 }
 
-/* Push TX requests queued on the VC. */
+/* Push TX requests queued on the VC.
+ *
+ * Note: EP must be locked. */
 static int __gnix_vc_push_tx_reqs(struct gnix_vc *vc)
 {
 	int ret, fi_rc = FI_SUCCESS;
 	struct gnix_fab_req *req;
 
-	ret = __gnix_vc_connected(vc); /* 0 on success */
-	if (ret) {
-		/* The CM will schedule the VC when the connection is
-		 * complete.*/
-		_gnix_vc_tx_schedule(vc);
-		return -FI_EAGAIN;
-	}
-
-	COND_ACQUIRE(vc->ep->requires_lock, &vc->tx_queue_lock);
 	req = dlist_first_entry(&vc->tx_queue, struct gnix_fab_req, dlist);
 	while (req) {
 		if ((req->flags & FI_FENCE) &&
-		    atomic_get(&vc->outstanding_tx_reqs)) {
+		    ofi_atomic_get32(&vc->outstanding_tx_reqs)) {
 			GNIX_DEBUG(FI_LOG_EP_DATA,
 				  "TX request queue stalled on FI_FENCE request: %p (%d)\n",
-				  req, atomic_get(&vc->outstanding_tx_reqs));
+				  req, ofi_atomic_get32(&vc->outstanding_tx_reqs));
 			/* Success is returned to allow processing of more VCs.
 			 * This VC will be rescheduled when the fence request
 			 * is completed. */
 			break;
 		}
 
-		atomic_inc(&vc->outstanding_tx_reqs);
+		ofi_atomic_inc32(&vc->outstanding_tx_reqs);
 		dlist_remove_init(&req->dlist);
 
 		ret = req->work_fn(req);
 		if (ret == FI_SUCCESS) {
 			GNIX_DEBUG(FI_LOG_EP_DATA,
 				  "TX request processed: %p (OTX: %d)\n",
-				  req, atomic_get(&vc->outstanding_tx_reqs));
+				  req, ofi_atomic_get32(&vc->outstanding_tx_reqs));
 		} else if (ret != -FI_ECANCELED) {
 			/* Work failed.  Reschedule to put this VC
 			 * back on the end of the list and return
@@ -2192,89 +1984,141 @@ static int __gnix_vc_push_tx_reqs(struct gnix_vc *vc)
 			}
 
 			dlist_insert_head(&req->dlist, &vc->tx_queue);
-			atomic_dec(&vc->outstanding_tx_reqs);
+			ofi_atomic_dec32(&vc->outstanding_tx_reqs);
 
 			/* _gnix_vc_tx_schedule() must come after the request
 			 * is inserted into the VC's tx_queue. */
 			_gnix_vc_tx_schedule(vc);
-
 			break;
+
 		}
 
 		req = dlist_first_entry(&vc->tx_queue,
 					struct gnix_fab_req,
 					dlist);
-		/* Return success if the queue is emptied. */
 	}
 
-	COND_RELEASE(vc->ep->requires_lock, &vc->tx_queue_lock);
-
 	return fi_rc;
 }
 
-static struct gnix_vc *__gnix_nic_next_pending_tx_vc(struct gnix_nic *nic)
+/* Return next VC needing progress on the NIC. */
+static struct gnix_vc *__gnix_nic_next_pending_vc(struct gnix_nic *nic)
 {
 	struct gnix_vc *vc = NULL;
 
-	COND_ACQUIRE(nic->requires_lock, &nic->tx_vc_lock);
-	vc = dlist_first_entry(&nic->tx_vcs, struct gnix_vc, tx_list);
+	COND_ACQUIRE(nic->requires_lock, &nic->prog_vcs_lock);
+	vc = dlist_first_entry(&nic->prog_vcs, struct gnix_vc, prog_list);
 	if (vc)
-		dlist_remove_init(&vc->tx_list);
-	COND_RELEASE(nic->requires_lock, &nic->tx_vc_lock);
+		dlist_remove_init(&vc->prog_list);
+	COND_RELEASE(nic->requires_lock, &nic->prog_vcs_lock);
 
 	if (vc) {
-		GNIX_INFO(FI_LOG_EP_CTRL, "Dequeued TX VC (%p)\n", vc);
-		_gnix_clear_bit(&vc->flags, GNIX_VC_FLAG_TX_SCHEDULED);
+		GNIX_INFO(FI_LOG_EP_CTRL, "Dequeued progress VC (%p)\n", vc);
+		_gnix_clear_bit(&vc->flags, GNIX_VC_FLAG_SCHEDULED);
 	}
 
 	return vc;
 }
 
-/* Progress VC TXs.  Exit when all VCs TX queues are empty or stalled. */
-static int __gnix_vc_nic_tx_progress(struct gnix_nic *nic)
+int _gnix_vc_progress(struct gnix_vc *vc)
 {
-	struct gnix_vc *vc;
+	int ret, ret_tx;
 
-	while ((vc = __gnix_nic_next_pending_tx_vc(nic))) {
-		if (__gnix_vc_push_tx_reqs(vc) != FI_SUCCESS) {
-			break;
-		}
-	}
+	ret = __gnix_vc_rx_progress(vc);
+	if (ret != FI_SUCCESS)
+		GNIX_DEBUG(FI_LOG_EP_CTRL,
+			   "__gnix_vc_rx_progress failed: %d\n", ret);
 
-	return FI_SUCCESS;
+	ret = __gnix_vc_push_work_reqs(vc);
+	if (ret != FI_SUCCESS)
+		GNIX_DEBUG(FI_LOG_EP_CTRL,
+			   "__gnix_vc_push_work_reqs failed: %d\n", ret);
+
+	ret_tx = __gnix_vc_push_tx_reqs(vc);
+	if (ret != FI_SUCCESS)
+		GNIX_DEBUG(FI_LOG_EP_CTRL,
+			   "__gnix_vc_push_tx_reqs failed: %d\n", ret);
+
+	return ret_tx;
 }
 
 /* Progress all NIC VCs needing work. */
 int _gnix_vc_nic_progress(struct gnix_nic *nic)
 {
-	/* Process VCs with RX traffic pending */
-	__gnix_vc_nic_rx_progress(nic);
+	struct gnix_vc *vc;
+	int ret;
+
+	/*
+	 * we can't just spin and spin in this loop because
+	 * none of the functions invoked below end up dequeuing
+	 * GNI CQE's and subsequently freeing up TX descriptors.
+	 * So, if the tx reqs routine returns -FI_EAGAIN, break out.
+	 */
+	while ((vc = __gnix_nic_next_pending_vc(nic))) {
+		COND_ACQUIRE(vc->ep->requires_lock, &vc->ep->vc_lock);
+
+		if (vc->conn_state == GNIX_VC_CONNECTED) {
+			ret = _gnix_vc_progress(vc);
+		}
 
-	/* Process deferred request work (deferred RX processing, etc.) */
-	__gnix_vc_nic_work_progress(nic);
+		COND_RELEASE(vc->ep->requires_lock, &vc->ep->vc_lock);
 
-	/* Process VCs with TX traffic pending */
-	__gnix_vc_nic_tx_progress(nic);
+		if (ret != FI_SUCCESS)
+			break;
+	}
 
 	return FI_SUCCESS;
 }
 
-/* Schedule VC to have all work queues processed.  This should only be needed
- * for newly connected VCs.
+/* Schedule VC for progress.
  *
- * TODO This is currently used to advance CM state.
- */
+ * Note: EP must be locked.
+ * TODO: Better implementation for rx/work/tx VC scheduling. */
 int _gnix_vc_schedule(struct gnix_vc *vc)
 {
-	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+	struct gnix_nic *nic = vc->ep->nic;
 
-	_gnix_vc_rx_schedule(vc);
-	__gnix_vc_work_schedule(vc);
-	_gnix_vc_tx_schedule(vc);
+	if (!_gnix_test_and_set_bit(&vc->flags, GNIX_VC_FLAG_SCHEDULED)) {
+		COND_ACQUIRE(nic->requires_lock, &nic->prog_vcs_lock);
+		dlist_insert_tail(&vc->prog_list, &nic->prog_vcs);
+		COND_RELEASE(nic->requires_lock, &nic->prog_vcs_lock);
+		GNIX_DEBUG(FI_LOG_EP_CTRL, "Scheduled VC (%p)\n", vc);
+	}
 
 	return FI_SUCCESS;
 }
 
+/* Schedule the VC for RX progress. */
+int _gnix_vc_rx_schedule(struct gnix_vc *vc)
+{
+	return _gnix_vc_schedule(vc);
+}
+
+/* Schedule the VC for work progress. */
+static int __gnix_vc_work_schedule(struct gnix_vc *vc)
+{
+	return _gnix_vc_schedule(vc);
+}
+
+/* Schedule the VC for TX progress. */
+int _gnix_vc_tx_schedule(struct gnix_vc *vc)
+{
+	return _gnix_vc_schedule(vc);
+}
+
+/* For a newly scheduled VC.  Do any queued work now that the connection is
+ * complete.
+ *
+ * Note: EP must be locked. */
+int _gnix_vc_sched_new_conn(struct gnix_vc *vc)
+{
+	_gnix_vc_schedule(vc);
+	return _gnix_vc_progress(vc);
+}
+
+/* Look up an EP's VC using fi_addr_t.
+ *
+ * Note: EP must be locked. */
 int _gnix_vc_ep_get_vc(struct gnix_fid_ep *ep, fi_addr_t dest_addr,
 		       struct gnix_vc **vc_ptr)
 {
@@ -2291,7 +2135,11 @@ int _gnix_vc_ep_get_vc(struct gnix_fid_ep *ep, fi_addr_t dest_addr,
 			return ret;
 		}
 	} else if (ep->type == FI_EP_MSG) {
-		*vc_ptr = ep->vc;
+		if (GNIX_EP_CONNECTED(ep)) {
+			*vc_ptr = ep->vc;
+		} else {
+			return -FI_EINVAL;
+		}
 	} else {
 		GNIX_WARN(FI_LOG_EP_DATA, "Invalid endpoint type: %d\n",
 			  ep->type);
@@ -2307,9 +2155,7 @@ fi_addr_t _gnix_vc_peer_fi_addr(struct gnix_vc *vc)
 
 	/* If FI_SOURCE capability was requested, do a reverse lookup of a VC's
 	 * FI address once.  Skip translation on connected EPs (no AV). */
-	if (vc->ep->caps & FI_SOURCE &&
-	    vc->ep->av &&
-	    vc->peer_fi_addr == FI_ADDR_NOTAVAIL) {
+	if (vc->ep->av && vc->peer_fi_addr == FI_ADDR_NOTAVAIL) {
 		rc = _gnix_av_reverse_lookup(vc->ep->av,
 					     vc->peer_addr,
 					     &vc->peer_fi_addr);
@@ -2347,3 +2193,4 @@ int _gnix_vc_cm_init(struct gnix_cm_nic *cm_nic)
 
 	return ret;
 }
+
diff --git a/prov/gni/src/gnix_wait.c b/prov/gni/src/gnix_wait.c
index 232c5e6..21ed40f 100644
--- a/prov/gni/src/gnix_wait.c
+++ b/prov/gni/src/gnix_wait.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
- * Copyright (c) 2015-2016 Cray Inc. All rights reserved.
+ * Copyright (c) 2015-2017 Cray Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -30,9 +30,198 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-
+#include <stdlib.h>
+#include <signal.h>
 #include "gnix.h"
 #include "gnix_wait.h"
+#include "gnix_nic.h"
+#include "gnix_cm_nic.h"
+#include "gnix_eq.h"
+/*
+ * Gnix wait progress thread declarations for making sure nic progress
+ * occurs when inside a gnix_wait call
+ */
+
+static pthread_t        gnix_wait_thread;
+static pthread_mutex_t  gnix_wait_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_cond_t   gnix_wait_cond;
+/* This is protected by the wait mutex and is only operated on under the
+ * mutex, the mutex protects us from losing wake_ups, from the conditional.
+ * This could be changed to an atomic but the variable would still need to
+ * be protected under the mutex.
+ */
+static int              gnix_wait_thread_enabled;
+static ofi_atomic32_t   gnix_wait_refcnt;
+
+uint32_t         gnix_wait_thread_sleep_time = 20;
+
+/*
+ * It is necessary to have a separate thread making progress in order for the
+ * wait functions to succeed. This version of that thread is designed
+ * to always make progress so we don't hard stall while sitting on fi_wait.
+ */
+static void *__gnix_wait_nic_prog_thread_fn(void *the_arg)
+{
+	int ret = FI_SUCCESS, prev_state;
+	struct gnix_nic *nic1, *nic2;
+	struct gnix_fid_eq *eq1, *eq2;
+	struct gnix_cm_nic *cm_nic1, *cm_nic2;
+	sigset_t  sigmask;
+	DLIST_HEAD(gnix_nic_prog_list);
+	GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+	/*
+	 * temporarily disable cancelability while we set up
+	 * some stuff
+	 */
+
+	pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &prev_state);
+
+	/*
+	 * help out Cray core-spec, say we're not an app thread
+	 * and can be run on core-spec cpus.
+	 */
+	ret = _gnix_task_is_not_app();
+	if (ret)
+		GNIX_WARN(FI_LOG_EP_CTRL,
+			"_gnix_task_is_not_app call returned %d\n",
+			ret);
+
+	/*
+	 * block all signals, don't want this thread to catch
+	 * signals that may be for app threads
+	 */
+
+	memset(&sigmask, 0, sizeof(sigset_t));
+	ret = sigfillset(&sigmask);
+	if (ret) {
+		GNIX_WARN(FI_LOG_EP_CTRL,
+		"sigfillset call returned %d\n", ret);
+	} else {
+
+		ret = pthread_sigmask(SIG_SETMASK,
+					&sigmask, NULL);
+		if (ret)
+			GNIX_WARN(FI_LOG_EP_CTRL,
+			"pthread_sigmask call returned %d\n", ret);
+	}
+
+	/*
+	 * okay now we're ready to be cancelable.
+	 */
+
+	pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &prev_state);
+
+	while (1) {
+		/* Check if we're tearing down. */
+		pthread_testcancel();
+
+		/* Wait until we're signaled to poll. */
+		pthread_mutex_lock(&gnix_wait_mutex);
+		if (!gnix_wait_thread_enabled)
+			pthread_cond_wait(&gnix_wait_cond, &gnix_wait_mutex);
+		pthread_mutex_unlock(&gnix_wait_mutex);
+
+		/* Progress all EQs. */
+		pthread_mutex_lock(&gnix_eq_list_lock);
+
+		dlist_for_each_safe(&gnix_eq_list, eq1, eq2, gnix_fid_eq_list) {
+			_gnix_eq_progress(eq1);
+		}
+
+		pthread_mutex_unlock(&gnix_eq_list_lock);
+
+		/* Progress all NICs. */
+		pthread_mutex_lock(&gnix_nic_list_lock);
+
+		dlist_for_each_safe(&gnix_nic_list, nic1, nic2, gnix_nic_list) {
+			dlist_insert_tail(&nic1->gnix_nic_prog_list, &gnix_nic_prog_list);
+			_gnix_ref_get(nic1);
+		}
+
+		pthread_mutex_unlock(&gnix_nic_list_lock);
+
+		dlist_for_each_safe(&gnix_nic_prog_list, nic1, nic2, gnix_nic_prog_list) {
+			_gnix_nic_progress(nic1);
+			dlist_remove_init(&nic1->gnix_nic_prog_list);
+			_gnix_ref_put(nic1);
+		}
+
+		/* Progress all CM NICs. */
+		pthread_mutex_lock(&gnix_cm_nic_list_lock);
+
+		dlist_for_each_safe(&gnix_cm_nic_list, cm_nic1, cm_nic2,
+				    cm_nic_list) {
+			_gnix_cm_nic_progress((void *)cm_nic1);
+		}
+
+		pthread_mutex_unlock(&gnix_cm_nic_list_lock);
+
+		usleep(gnix_wait_thread_sleep_time);
+	}
+
+	return NULL;
+}
+
+static void __gnix_wait_start_progress(void)
+{
+	int ret;
+
+	pthread_mutex_lock(&gnix_wait_mutex);
+	if (!gnix_wait_thread) {
+		GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+		pthread_cond_init(&gnix_wait_cond, NULL);
+		ofi_atomic_initialize32(&gnix_wait_refcnt, 0);
+		ret = _gnix_job_disable_affinity_apply();
+		if (ret != 0)
+			GNIX_WARN(WAIT_SUB,
+				  "_gnix_job_disable call returned %d\n", ret);
+
+		ret = pthread_create(&gnix_wait_thread, NULL,
+				     __gnix_wait_nic_prog_thread_fn, NULL);
+		if (ret)
+			GNIX_WARN(WAIT_SUB,
+				  "pthread_create call returned %d\n", ret);
+	}
+	ofi_atomic_inc32(&gnix_wait_refcnt);
+	pthread_mutex_unlock(&gnix_wait_mutex);
+}
+
+static void __gnix_wait_stop_progress(void)
+{
+	int ret;
+
+	pthread_mutex_lock(&gnix_wait_mutex);
+	if (gnix_wait_thread) {
+		if (ofi_atomic_dec32(&gnix_wait_refcnt) == 0) {
+			ret = pthread_cancel(gnix_wait_thread);
+			if (ret)
+				GNIX_WARN(WAIT_SUB,
+					  "pthread_cancel call returned %d\n",
+					  ret);
+
+			gnix_wait_thread_enabled++;
+			pthread_cond_signal(&gnix_wait_cond);
+			pthread_mutex_unlock(&gnix_wait_mutex);
+
+			GNIX_TRACE(FI_LOG_EP_CTRL, "\n");
+
+			ret = pthread_join(gnix_wait_thread, NULL);
+			if (ret)
+				GNIX_WARN(WAIT_SUB,
+					  "pthread_join call returned %d\n",
+					  ret);
+
+			gnix_wait_thread = 0;
+		} else {
+			pthread_mutex_unlock(&gnix_wait_mutex);
+		}
+	} else
+		pthread_mutex_unlock(&gnix_wait_mutex);
+
+	return;
+
+}
 
 /*******************************************************************************
  * Forward declarations for FI_OPS_* structures.
@@ -148,12 +337,13 @@ void _gnix_signal_wait_obj(struct fid_wait *wait)
 	wait_priv = container_of(wait, struct gnix_fid_wait, wait);
 
 	switch (wait_priv->type) {
-	case FI_WAIT_FD:
-		if (write(wait_priv->fd[WAIT_WRITE], &msg, len) != len)
-			GNIX_WARN(WAIT_SUB, "failed to signal wait object.\n");
-		break;
-	case FI_WAIT_MUTEX_COND:
-		pthread_cond_signal(&wait_priv->cond);
+	case FI_WAIT_UNSPEC:
+		GNIX_TRACE(WAIT_SUB,
+			   "The Read FD is %d Write is %d\n",
+			   wait_priv->fd[WAIT_READ],
+			   wait_priv->fd[WAIT_WRITE]);
+		/* This is a non-blocking write as the fd could become full */
+		write(wait_priv->fd[WAIT_WRITE], &msg, len);
 		break;
 	default:
 		GNIX_WARN(WAIT_SUB,
@@ -175,9 +365,7 @@ static int gnix_verify_wait_attr(struct fi_wait_attr *attr)
 
 	switch (attr->wait_obj) {
 	case FI_WAIT_UNSPEC:
-		attr->wait_obj = FI_WAIT_FD;
-	case FI_WAIT_FD:
-	case FI_WAIT_MUTEX_COND:
+		attr->wait_obj = FI_WAIT_UNSPEC;
 		break;
 	default:
 		GNIX_WARN(WAIT_SUB, "wait type: %d not supported.\n",
@@ -195,16 +383,16 @@ static int gnix_init_wait_obj(struct gnix_fid_wait *wait, enum fi_wait_obj type)
 	wait->type = type;
 
 	switch (type) {
-	case FI_WAIT_FD:
+	case FI_WAIT_UNSPEC:
 		if (socketpair(AF_LOCAL, SOCK_STREAM, 0, wait->fd))
 			goto err;
 
 		if (fi_fd_nonblock(wait->fd[WAIT_READ]))
 			goto cleanup;
-		break;
-	case FI_WAIT_MUTEX_COND:
-		pthread_mutex_init(&wait->mutex, NULL);
-		pthread_cond_init(&wait->cond, NULL);
+
+		if (fi_fd_nonblock(wait->fd[WAIT_WRITE]))
+			goto cleanup;
+
 		break;
 	default:
 		GNIX_WARN(WAIT_SUB, "Invalid wait type: %d\n",
@@ -227,17 +415,16 @@ err:
  ******************************************************************************/
 static int gnix_wait_control(struct fid *wait, int command, void *arg)
 {
-	/* disabled until new trywait interface is implemented
+/*
 	struct fid_wait *wait_fid_priv;
 
 	GNIX_TRACE(WAIT_SUB, "\n");
 
 	wait_fid_priv = container_of(wait, struct fid_wait, fid);
-	*/
+*/
 
 	switch (command) {
 	case FI_GETWAIT:
-		/* return _gnix_get_wait_obj(wait_fid_priv, arg); */
 		return -FI_ENOSYS;
 	default:
 		return -FI_EINVAL;
@@ -256,7 +443,53 @@ static int gnix_wait_control(struct fid *wait, int command, void *arg)
  */
 DIRECT_FN int gnix_wait_wait(struct fid_wait *wait, int timeout)
 {
-	return -FI_ENOSYS;
+	int err = 0, ret;
+	char c;
+	struct gnix_fid_wait *wait_priv;
+
+	GNIX_TRACE(WAIT_SUB, "\n");
+
+	wait_priv = container_of(wait, struct gnix_fid_wait, wait.fid);
+	switch (wait_priv->type) {
+	case FI_WAIT_UNSPEC:
+		pthread_mutex_lock(&gnix_wait_mutex);
+		gnix_wait_thread_enabled++;
+		pthread_cond_signal(&gnix_wait_cond);
+		pthread_mutex_unlock(&gnix_wait_mutex);
+		GNIX_DEBUG(WAIT_SUB,
+			   "Calling fi_poll_fd %d timeout %d\n",
+			   wait_priv->fd[WAIT_READ],
+			   timeout);
+		err = fi_poll_fd(wait_priv->fd[WAIT_READ], timeout);
+		GNIX_DEBUG(WAIT_SUB, "Return code from poll was %d\n", err);
+		if (err == 0) {
+			err = -FI_ETIMEDOUT;
+		} else {
+			while (err > 0) {
+				ret = ofi_read_socket(wait_priv->fd[WAIT_READ],
+						      &c,
+						      1);
+				GNIX_DEBUG(WAIT_SUB, "ret is %d C is %c\n",
+					  ret,
+					  c);
+				if (ret != 1) {
+					GNIX_ERR(WAIT_SUB,
+						 "failed to read wait_fd\n");
+					err = 0;
+					break;
+				}
+				err--;
+			}
+		}
+		break;
+	default:
+		GNIX_WARN(WAIT_SUB, "Invalid wait object type\n");
+		return -FI_EINVAL;
+	}
+	pthread_mutex_lock(&gnix_wait_mutex);
+	gnix_wait_thread_enabled--;
+	pthread_mutex_unlock(&gnix_wait_mutex);
+	return err;
 }
 
 int gnix_wait_close(struct fid *wait)
@@ -282,6 +515,7 @@ int gnix_wait_close(struct fid *wait)
 
 	free(wait_priv);
 
+	__gnix_wait_stop_progress();
 	return FI_SUCCESS;
 }
 
@@ -324,6 +558,7 @@ DIRECT_FN int gnix_wait_open(struct fid_fabric *fabric,
 	_gnix_ref_get(fab_priv);
 	*waitset = &wait_priv->wait;
 
+	__gnix_wait_start_progress();
 	return ret;
 
 cleanup:
diff --git a/prov/gni/src/gnix_xpmem.c b/prov/gni/src/gnix_xpmem.c
index 5206bd4..1a463e9 100644
--- a/prov/gni/src/gnix_xpmem.c
+++ b/prov/gni/src/gnix_xpmem.c
@@ -450,7 +450,7 @@ int _gnix_xpmem_accessible(struct gnix_fid_ep *ep,
 	 * of the supplied address, return true, else false
 	 */
 
-	*accessible = (ep->my_name.gnix_addr.device_addr ==
+	*accessible = (ep->src_addr.gnix_addr.device_addr ==
 			addr.device_addr) ? true : false;
 
 	return FI_SUCCESS;
diff --git a/prov/mlx/Makefile.include b/prov/mlx/Makefile.include
new file mode 100644
index 0000000..260aeee
--- /dev/null
+++ b/prov/mlx/Makefile.include
@@ -0,0 +1,34 @@
+if HAVE_MLX
+_mlx_files = prov/mlx/src/mlx.h \
+    prov/mlx/src/mlx_av.c \
+    prov/mlx/src/mlx_cm.c \
+    prov/mlx/src/mlx_cq.c \
+    prov/mlx/src/mlx_domain.c \
+    prov/mlx/src/mlx_ep.c \
+    prov/mlx/src/mlx_init.c \
+    prov/mlx/src/mlx_tagged.c \
+    prov/mlx/src/mlx_fabric.c \
+    prov/mlx/src/mlx_callbacks.c
+
+
+if HAVE_MLX_DL
+pkglib_LTLIBRARIES += libmlx-fi.la
+libmlx_fi_la_CPPFLAGS = $(AM_CPPFLAGS) $(mlx_CPPFLAGS)
+libmlx_fi_la_SOURCES = $(_mlx_files) $(common_srcs)
+libmlx_fi_la_LDFLAGS = \
+	$(mlx_LDFLAGS) \
+	-module -avoid-version -shared -export-dynamic
+libmlx_fi_la_LIBADD = $(linkback) $(mlx_LIBS)
+libmlx_fi_la_DEPENDENCIES = $(linkback)
+else
+src_libfabric_la_SOURCES += $(_mlx_files)
+src_libfabric_la_CPPFLAGS += $(mlx_CPPFLAGS)
+src_libfabric_la_LDFLAGS += $(mlx_LDFLAGS)
+src_libfabric_la_LIBADD += $(mlx_LIBS)
+endif
+
+prov_install_man_pages += man/man7/fi_mlx.7
+
+endif #HAVE_MLX
+
+prov_dist_man_pages += man/man7/fi_mlx.7
diff --git a/prov/mlx/configure.m4 b/prov/mlx/configure.m4
new file mode 100644
index 0000000..fae5587
--- /dev/null
+++ b/prov/mlx/configure.m4
@@ -0,0 +1,26 @@
+dnl Configury specific to the libfabrics mlx provider
+
+dnl Called to configure this provider
+dnl
+dnl Arguments:
+dnl
+dnl $1: action if configured successfully
+dnl $2: action if not configured successfully
+dnl
+AC_DEFUN([FI_MLX_CONFIGURE],[
+    # Determine if we can support the mxm provider
+    mlx_happy=0
+    AS_IF([test x"$enable_mlx" != x"no"],
+              [FI_CHECK_PACKAGE([mlx],
+                    [ucp/api/ucp.h],
+                    [ucp],
+                    [ucp_get_version_string],
+                    [],
+                    [$mlx_PREFIX],
+                    [$mlx_LIBDIR],
+                    [mlx_happy=1],
+                    [mlx_happy=0])
+         ])
+    AS_IF([test $mlx_happy -eq 1], [$1], [$2])
+])
+
diff --git a/prov/mlx/src/mlx.h b/prov/mlx/src/mlx.h
new file mode 100644
index 0000000..396603e
--- /dev/null
+++ b/prov/mlx/src/mlx.h
@@ -0,0 +1,185 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef _FI_MLX_H
+#define _FI_MLX_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "config.h"
+#include <ucp/api/ucp.h>
+#include <ucm/api/ucm.h>
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <rdma/fabric.h>
+#include <rdma/providers/fi_prov.h>
+#include <rdma/fi_domain.h>
+#include <rdma/fi_endpoint.h>
+#include <rdma/fi_tagged.h>
+#include <rdma/fi_rma.h>
+#include <rdma/fi_cm.h>
+#include <rdma/fi_errno.h>
+#include <rdma/providers/fi_log.h>
+#include <fi.h>
+#include <fi_lock.h>
+#include <fi_list.h>
+#include "fi_enosys.h"
+#include <fi_mem.h>
+#include <fi_atom.h>
+#include <fi_util.h>
+#include <prov.h>
+
+
+#define FI_MLX_FABRIC_NAME "mlx"
+#define FI_MLX_DEFAULT_INJECT_SIZE 1024
+#define FI_MLX_DEF_CQ_SIZE (1024)
+#define FI_MLX_DEF_MR_CNT (1 << 16)
+
+#define FI_MLX_VERSION_MINOR 4
+#define FI_MLX_VERSION_MAJOR 1
+#define FI_MLX_VERSION (FI_VERSION(FI_MLX_VERSION_MAJOR, FI_MLX_VERSION_MINOR))
+
+#define FI_MLX_RKEY_MAX_LEN (256)
+
+#define FI_MLX_MAX_NAME_LEN (1024)
+
+#define FI_MLX_CAPS (FI_TAGGED | FI_SEND | FI_RECV)
+#define FI_MLX_MODE_REQUIRED (0ULL)
+#define FI_MLX_MODE_SUPPORTED (FI_CONTEXT | FI_ASYNC_IOV)
+#define FI_MLX_OP_FLAGS (FI_SEND | FI_RECV)
+
+struct mlx_global_descriptor{
+	ucp_config_t *config;
+};
+
+struct mlx_fabric {
+	struct util_fabric u_fabric;
+};
+
+struct mlx_domain {
+	struct util_domain u_domain;
+	ucp_context_h context;
+
+	struct util_buf_pool *fast_path_pool;
+	fastlock_t fpp_lock;
+};
+
+
+struct mlx_ep {
+	struct util_ep ep;
+	struct mlx_av *av; /*until AV is not implemented via utils*/
+	ucp_worker_h worker;
+};
+
+struct mlx_av {
+	struct fid_av av;
+	struct mlx_domain *domain;
+	struct mlx_ep *ep;
+	struct util_eq *eq;
+	int type;
+	int async;
+	size_t count;
+	size_t addr_len;
+};
+
+typedef enum mlx_req_type {
+	MLX_FI_REQ_UNINITIALIZED = 0,
+	MLX_FI_REQ_REGULAR = 0xFD,
+	MLX_FI_REQ_UNEXPECTED_ERR = 0xFE,
+	MLX_FI_REQ_UNEXPECTED = 0xFF,
+} mlx_req_type_t;
+
+struct mlx_request {
+	mlx_req_type_t type;
+
+	union {
+		struct fi_cq_tagged_entry tagged;
+		struct fi_cq_err_entry error;
+	} completion;
+
+	struct util_cq* cq;
+	struct mlx_ep* ep;
+};
+
+OFI_DECLARE_CIRQUE(struct fi_cq_tagged_entry, mlx_comp_cirq);
+
+extern int mlx_errcode_translation_table[];
+#define MLX_TRANSLATE_ERRCODE(X) mlx_errcode_translation_table[(-X)+1]
+extern struct fi_provider mlx_prov;
+extern struct mlx_global_descriptor mlx_descriptor;
+extern struct util_prov mlx_util_prov;
+
+extern struct fi_ops_cm mlx_cm_ops;
+extern struct fi_ops_tagged mlx_tagged_ops;
+extern struct fi_ops_mr mlx_mr_ops;
+extern struct fi_fabric_attr mlx_fabric_attrs;
+
+int mlx_fabric_open(
+		struct fi_fabric_attr *attr,
+		struct fid_fabric **fabric, 
+		void *context);
+
+int mlx_domain_open(
+		struct fid_fabric *fabric, struct fi_info *info,
+		struct fid_domain **fid, void *context);
+
+int mlx_ep_open(
+		struct fid_domain *domain, struct fi_info *info,
+		struct fid_ep **fid, void *context);
+
+int mlx_cq_open(
+		struct fid_domain *domain, struct fi_cq_attr *attr,
+		struct fid_cq **cq, void *context);
+
+int mlx_av_open(
+		struct fid_domain *domain, struct fi_av_attr *attr,
+		struct fid_av **av, void *context);
+
+/* Callbacks */
+void mlx_send_callback_no_compl( void *request, ucs_status_t status);
+void mlx_send_callback( void *request, ucs_status_t status);
+void mlx_recv_callback_no_compl(void *request, ucs_status_t status,
+				ucp_tag_recv_info_t *info);
+void mlx_recv_callback( void *request, ucs_status_t status,
+			ucp_tag_recv_info_t *info);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/prov/mlx/src/mlx_av.c b/prov/mlx/src/mlx_av.c
new file mode 100644
index 0000000..f73530b
--- /dev/null
+++ b/prov/mlx/src/mlx_av.c
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "mlx.h"
+
+static int mlx_av_write_event(
+				struct mlx_av *av, uint64_t data,
+				int err, void *context)
+{
+	struct fi_eq_err_entry entry;
+	size_t size;
+	uint64_t flags;
+
+	entry.fid = &(av->av.fid);
+	entry.context = context;
+	entry.data = data;
+
+	if (err) {
+		entry.err = err;
+		size = sizeof(struct fi_eq_err_entry);
+		flags = UTIL_FLAG_ERROR;
+	} else {
+		size = sizeof(struct fi_eq_entry);
+		flags = 0;
+	}
+
+	fi_eq_write(
+		&(av->eq->eq_fid), FI_AV_COMPLETE,
+		&entry, size, flags);
+	return FI_SUCCESS;
+}
+
+static int mlx_av_remove(
+			struct fid_av *fi_av, fi_addr_t *fi_addr, size_t count,
+			uint64_t flags)
+{
+	struct mlx_av *av;
+	int i;
+
+	av = container_of(fi_av, struct mlx_av, av);
+	if ((av->async) && (!av->eq)) {
+		return -FI_ENOEQ;
+	}
+
+	for (i = 0; i < count; ++i) {
+		ucp_ep_destroy((ucp_ep_h)(fi_addr[i]));
+	}
+	return FI_SUCCESS;
+}
+
+
+static int mlx_av_insert(
+			struct fid_av *fi_av, const void *addr, size_t count,
+			fi_addr_t *fi_addr, uint64_t flags, void *context)
+{
+	struct mlx_av *av;
+	struct mlx_ep *ep;
+
+	int i;
+	ucs_status_t status = UCS_OK;
+	int added = 0;
+
+	av = container_of(fi_av, struct mlx_av, av);
+	ep = av->ep;
+
+	if ((av->async) && (!av->eq)) {
+		return -FI_ENOEQ;
+	}
+
+	for ( i = 0; i < count ; ++i) {
+		ucp_ep_params_t ep_params;
+		ep_params.address = (const ucp_address_t*)
+					(&(((const char *)addr)[i*FI_MLX_MAX_NAME_LEN]));
+		ep_params.field_mask = UCP_EP_PARAM_FIELD_REMOTE_ADDRESS;
+		FI_WARN( &mlx_prov, FI_LOG_CORE,
+			"Try to insert address #%d, offset=%d (size=%d)"
+			" fi_addr=%p \naddr = %s",
+			i, i*FI_MLX_MAX_NAME_LEN, count,
+			fi_addr, &(((const char *)addr)[i*FI_MLX_MAX_NAME_LEN]));
+
+		status = ucp_ep_create( ep->worker,
+					&ep_params,
+					(ucp_ep_h*)(&(fi_addr[i])));
+
+		FI_WARN( &mlx_prov, FI_LOG_CORE, "address inserted\n");
+		if (status == UCS_OK) {
+			added++;
+		} else {
+			if (av->eq) {
+				mlx_av_write_event( av, i,
+						MLX_TRANSLATE_ERRCODE(status),
+						context);
+			}
+		}
+	}
+
+	if (av->eq) {
+		mlx_av_write_event(av, added, 0, context);
+		count = 0;
+	} else {
+		count = added;
+	}
+	return count;
+}
+
+
+static int mlx_av_close(fid_t fid)
+{
+	struct mlx_av *fid_av;
+	fid_av = container_of(fid, struct mlx_av, av);
+	free (fid_av);
+	return FI_SUCCESS;
+}
+
+static int mlx_av_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
+{
+	struct mlx_av *av;
+	struct util_eq *eq;
+
+	av = container_of(fid, struct mlx_av, av.fid);
+	if ((!(av->async)) || (bfid->fclass != FI_CLASS_EQ)){
+		FI_WARN( &mlx_prov, FI_LOG_EP_CTRL,
+			"Try to bind not a EQ to AV, "
+			"or attemt to bind EQ and syncronious AV\n");
+		return -FI_EINVAL;
+	}
+	eq = container_of(bfid, struct util_eq, eq_fid.fid);
+	av->eq = eq;
+	return FI_SUCCESS;
+}
+
+static struct fi_ops mlx_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = mlx_av_close,
+	.bind = mlx_av_bind,
+};
+
+static struct fi_ops_av mlx_av_ops = {
+	.size = sizeof(struct fi_ops_av),
+	.insert = mlx_av_insert,
+	.remove = mlx_av_remove,
+};
+
+int mlx_av_open(
+		struct fid_domain *fi_domain, struct fi_av_attr *attr,
+		struct fid_av **fi_av, void *context)
+{
+	struct mlx_domain *domain;
+	struct mlx_av *av;
+	int type = FI_AV_MAP;
+	size_t count = 64;
+	domain = container_of(fi_domain, struct mlx_domain, u_domain.domain_fid);
+
+	int is_async = 0;
+	if (attr) {
+		switch (attr->type) {
+		case FI_AV_MAP:
+			type = attr->type;
+			break;
+		default:
+			return -EINVAL;
+		}
+		if (attr->flags & FI_EVENT){
+			is_async = 1;
+		}
+		count = attr->count;
+	}
+
+	av = (struct mlx_av *) calloc(1, sizeof(struct mlx_av));
+	if (!av) {
+		return -ENOMEM;
+	}
+
+	av->domain = domain;
+	av->async = is_async;
+	av->type = type;
+	av->eq = NULL;
+	av->addr_len = FI_MLX_MAX_NAME_LEN;
+	av->count = count;
+	av->av.fid.fclass = FI_CLASS_AV;
+	av->av.fid.context = context;
+	av->av.fid.ops = &mlx_fi_ops;
+	av->av.ops = &mlx_av_ops;
+
+	*fi_av = &av->av;
+	return FI_SUCCESS;
+}
+
+
diff --git a/prov/mlx/src/mlx_callbacks.c b/prov/mlx/src/mlx_callbacks.c
new file mode 100644
index 0000000..1c144b7
--- /dev/null
+++ b/prov/mlx/src/mlx_callbacks.c
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "mlx.h"
+
+/*using for fi_tinject path*/
+/*Using for selective completions scenario*/
+void mlx_send_callback_no_compl( void *request, ucs_status_t status)
+{
+	ucp_request_release(request);
+}
+
+void mlx_send_callback( void *request,
+			ucs_status_t status)
+{
+	struct util_cq *cq;
+	struct mlx_request *mlx_req = request;
+	struct fi_cq_tagged_entry *t_entry;
+	struct util_cq_err_entry *err;
+
+	cq = mlx_req->cq;
+
+	if (status == UCS_ERR_CANCELED) {
+		ucp_request_release(request);
+		return;
+	}
+
+	fastlock_acquire(&cq->cq_lock);
+
+	t_entry = ofi_cirque_tail(cq->cirq);
+	*t_entry = (mlx_req->completion.tagged);
+	ofi_cirque_commit(cq->cirq);
+
+	if (status != UCS_OK){
+		t_entry->flags |= UTIL_FLAG_ERROR;
+		err = calloc(1, sizeof(struct util_cq_err_entry));
+		if (!err) {
+			FI_WARN(&mlx_prov, FI_LOG_CQ,
+				"out of memory, cannot report CQ error\n");
+			return;
+		}
+
+		err->err_entry = (mlx_req->completion.error);
+		err->err_entry.prov_errno = (int)status;
+		err->err_entry.err = MLX_TRANSLATE_ERRCODE(status);
+		err->err_entry.olen = 0;
+		slist_insert_tail(&err->list_entry, &cq->err_list);
+	}
+
+	mlx_req->type = MLX_FI_REQ_UNINITIALIZED;
+
+	fastlock_release(&cq->cq_lock);
+	ucp_request_release(request);
+}
+
+/*Using for selective completions scenario*/
+void mlx_recv_callback_no_compl(void *request,
+				ucs_status_t status,
+				ucp_tag_recv_info_t *info)
+{
+	ucp_request_release(request);
+}
+
+void mlx_recv_callback (
+			void *request,
+			ucs_status_t status,
+			ucp_tag_recv_info_t *info)
+{
+	struct util_cq *cq;
+	struct mlx_request *mlx_req;
+
+	mlx_req = (struct mlx_request*)request;
+	if (status == UCS_ERR_CANCELED) {
+		ucp_request_release(request);
+		return;
+	}
+
+	cq = mlx_req->cq;
+
+	mlx_req->completion.tagged.tag = info->sender_tag;
+	mlx_req->completion.tagged.len = info->length;
+
+	if (status != UCS_OK) {
+		mlx_req->completion.error.prov_errno = (int)status;
+		mlx_req->completion.error.err = MLX_TRANSLATE_ERRCODE(status);
+	}
+
+	fastlock_acquire(&cq->cq_lock);
+	if (mlx_req->type == MLX_FI_REQ_UNINITIALIZED) {
+		if (status != UCS_OK) {
+			mlx_req->completion.error.olen = info->length;
+			mlx_req->type = MLX_FI_REQ_UNEXPECTED_ERR;
+		} else {
+			mlx_req->type = MLX_FI_REQ_UNEXPECTED;
+		}
+	} else {
+		if (status != UCS_OK) {
+			mlx_req->completion.error.olen = info->length -
+						mlx_req->completion.error.len;
+		}
+
+		struct fi_cq_tagged_entry *t_entry;
+		t_entry = ofi_cirque_tail(cq->cirq);
+		*t_entry = (mlx_req->completion.tagged);
+
+		if (status != UCS_OK) {
+			struct util_cq_err_entry* err;
+			t_entry->flags |= UTIL_FLAG_ERROR;
+
+			err = calloc(1, sizeof(struct util_cq_err_entry));
+			if (!err) {
+				FI_WARN(&mlx_prov, FI_LOG_CQ,
+					"out of memory, cannot report CQ error\n");
+				return;
+			}
+
+			err->err_entry = (mlx_req->completion.error);
+			slist_insert_tail(&err->list_entry, &cq->err_list);
+		}
+
+		if (cq->src){
+			cq->src[ofi_cirque_windex((struct mlx_comp_cirq*)(cq->cirq))] =
+					FI_ADDR_NOTAVAIL;
+		}
+
+		if (cq->wait) {
+			cq->wait->signal(cq->wait);
+		}
+
+		mlx_req->type = MLX_FI_REQ_UNINITIALIZED;
+		ofi_cirque_commit(cq->cirq);
+		ucp_request_release(request);
+	}
+	fastlock_release(&cq->cq_lock);
+}
+
diff --git a/prov/mxm/src/mlxm_cm.c b/prov/mlx/src/mlx_cm.c
similarity index 50%
rename from prov/mxm/src/mlxm_cm.c
rename to prov/mlx/src/mlx_cm.c
index 0f3c444..3bb0667 100644
--- a/prov/mxm/src/mlxm_cm.c
+++ b/prov/mlx/src/mlx_cm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -29,37 +29,56 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-#include "mlxm.h"
+#include "mlx.h"
 
-static int mlxm_cm_getname(fid_t fid, void *addr, size_t *addrlen)
+static int mlx_cm_getname(
+			fid_t fid,
+			void *addr,
+			size_t *addrlen)
 {
-        struct mlxm_fid_ep *fid_ep;
-        mxm_error_t   mxm_err;
-        size_t        mxm_addrlen = *addrlen;
+	ucs_status_t status = UCS_OK;
+	void* addr_local = NULL;
+	size_t addr_len_local;
+	struct mlx_ep* ep;
+	int ofi_status = FI_SUCCESS;
 
-        fid_ep = container_of(fid, struct mlxm_fid_ep, ep.fid);
-        if (!fid_ep->domain)
-                return -EBADF;
-        mxm_err = mxm_ep_get_address(mlxm_globals.mxm_ep,
-                                     addr, &mxm_addrlen);
-        if (mxm_err == MXM_ERR_BUFFER_TOO_SMALL) {
-                FI_WARN(&mlxm_prov,FI_LOG_CORE,
-                        "Buffer storage for ep address is too small\n");
-        } else {
-                FI_INFO(&mlxm_prov, FI_LOG_CORE,
-                        "got self ep addr, %s\n",(char*)addr);
-                fid_ep->domain->mxm_addrlen = *addrlen;
-        }
-        return (mxm_err ? mlxm_errno(mxm_err) : 0);
+	ep = container_of(fid, struct mlx_ep, ep.ep_fid.fid); 
+
+	status = ucp_worker_get_address( ep->worker,
+					(ucp_address_t **)&addr_local,
+					(size_t*) &addr_len_local );
+	if (status != UCS_OK) {
+		return MLX_TRANSLATE_ERRCODE(status);
+	}
+
+	if ((*addrlen) < addr_len_local) {
+		FI_WARN( &mlx_prov, FI_LOG_CORE,
+			"Buffer storage for ep address is too small %d "
+			"instead of %d [%s]\n",
+			addrlen, addr_len_local, (char *)addr_local);
+		ofi_status = -FI_ETOOSMALL;
+	}
+	FI_INFO( &mlx_prov, FI_LOG_CORE, 
+		"Loaded UCP adress: [%d]%s\n",
+		addr_len_local, (char *)addr_local);
+
+	memcpy( addr, addr_local,
+		(((*addrlen)<addr_len_local) ? (*addrlen):addr_len_local));
+
+	*addrlen = addr_len_local;
+	ucp_worker_release_address(
+				ep->worker,
+				(ucp_address_t *)addr_local);
+	return ofi_status;
 }
 
-struct fi_ops_cm mlxm_cm_ops = {
-        .size     = sizeof(struct fi_ops_cm),
-        .getname  = mlxm_cm_getname,
-        .getpeer  = fi_no_getpeer,
-        .connect  = fi_no_connect,
-        .listen   = fi_no_listen,
-        .accept   = fi_no_accept,
-        .reject   = fi_no_reject,
-        .shutdown = fi_no_shutdown,
+struct fi_ops_cm mlx_cm_ops = {
+	.size = sizeof(struct fi_ops_cm),
+	.getname = mlx_cm_getname,
+	.getpeer = fi_no_getpeer,
+	.connect = fi_no_connect,
+	.listen = fi_no_listen,
+	.accept = fi_no_accept,
+	.reject = fi_no_reject,
+	.shutdown = fi_no_shutdown,
 };
diff --git a/prov/gni/include/gnix_nameserver.h b/prov/mlx/src/mlx_cq.c
similarity index 70%
copy from prov/gni/include/gnix_nameserver.h
copy to prov/mlx/src/mlx_cq.c
index 7956985..a0e9a5e 100644
--- a/prov/gni/include/gnix_nameserver.h
+++ b/prov/mlx/src/mlx_cq.c
@@ -1,12 +1,11 @@
 /*
- * Copyright (c) 2015-2016 Cray Inc.  All rights reserved.
- * Copyright (c) 2015 Los Alamos National Security, LLC. All rights reserved.
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
  * General Public License (GPL) Version 2, available from the file
  * COPYING in the main directory of this source tree, or the
- * BSD license below:
+ * OpenFabrics.org BSD license below:
  *
  *     Redistribution and use in source and binary forms, with or
  *     without modification, are permitted provided that the following
@@ -30,22 +29,30 @@
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
+#include <assert.h>
+#include "mlx.h"
 
-#ifndef _GNIX_NAMESERVER_H_
-#define _GNIX_NAMESERVER_H_
+int mlx_cq_open (
+		struct fid_domain *domain, struct fi_cq_attr *attr,
+		struct fid_cq **cq_fid, void *context)
+{
+	int status = FI_SUCCESS;
+	struct util_cq *u_cq;
 
-#include "gnix.h"
+	u_cq = calloc(1, sizeof(struct util_cq));
+	if (!u_cq) {
+		return -FI_ENOMEM;
+	}
 
-/*
- * defines, data structs, and prototypes for gnix nameserver
- */
-
-/*
- * prototypes
- */
+	status = ofi_cq_init(
+			&mlx_prov, domain, 
+			attr, u_cq, &ofi_cq_progress, context);
+	if (status) {
+		free(u_cq);
+		return status;
+	}
 
-int gnix_resolve_name(IN const char *node, IN const char *service,
-		      IN uint64_t flags, INOUT struct gnix_ep_name
-		      *resolved_addr);
+	*cq_fid = &(u_cq->cq_fid);
+	return FI_SUCCESS;
+}
 
-#endif /* _GNIX_NAMESERVER_H_ */
diff --git a/prov/mlx/src/mlx_domain.c b/prov/mlx/src/mlx_domain.c
new file mode 100644
index 0000000..35b5694
--- /dev/null
+++ b/prov/mlx/src/mlx_domain.c
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "mlx.h"
+
+static int mlx_domain_close(fid_t fid)
+{
+	struct mlx_domain *domain;
+	int status;
+
+	domain = container_of( fid,
+				struct mlx_domain,
+				u_domain.domain_fid.fid);
+
+	ucp_cleanup(domain->context);
+	status = ofi_domain_close( &(domain->u_domain));
+	if (!status) {
+		util_buf_pool_destroy(domain->fast_path_pool);
+		free(domain);
+	}
+	return status;
+}
+
+static struct fi_ops mlx_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = mlx_domain_close,
+};
+
+struct fi_ops_domain mlx_domain_ops = {
+	.size = sizeof(struct fi_ops_domain),
+	.av_open = mlx_av_open,
+	.cq_open = mlx_cq_open,
+	.endpoint = mlx_ep_open,
+	.poll_open = fi_poll_create,
+};
+
+
+struct fi_ops_mr mlx_mr_ops = {
+	.size = sizeof(struct fi_ops_mr),
+	.reg = fi_no_mr_reg,
+	.regv = fi_no_mr_regv,
+	.regattr = fi_no_mr_regattr,
+};
+
+int mlx_domain_open(struct fid_fabric *fabric, struct fi_info *info,
+                     struct fid_domain **fid, void *context)
+{
+	ucs_status_t status = UCS_OK;
+	int ofi_status;
+	struct mlx_domain* domain;
+	ucp_params_t params;
+
+	if (!info->domain_attr->name ||
+	    strcmp(info->domain_attr->name, FI_MLX_FABRIC_NAME)) {
+		return -FI_EINVAL;
+	}
+
+	ofi_status = ofi_prov_check_info(&mlx_util_prov,
+					 fabric->api_version,
+					 info);
+	if (ofi_status) {
+		return ofi_status;
+	}
+
+	domain = calloc(1, sizeof(struct mlx_domain));
+	if (!domain) {
+		return -ENOMEM;
+	}
+
+	ofi_status = ofi_domain_init(fabric, info,
+				     &(domain->u_domain), context);
+	if (ofi_status) {
+		goto domain_free;
+	}
+
+	params.features = UCP_FEATURE_TAG;
+	params.request_size = sizeof(struct mlx_request);
+	params.request_init = NULL;
+	params.request_cleanup = NULL;
+
+	status = ucp_init(
+			(const ucp_params_t *)&params,
+			mlx_descriptor.config,
+			&(domain->context));
+	if (status != UCS_OK) {
+		ofi_status = MLX_TRANSLATE_ERRCODE(status);
+		goto destroy_domain;
+	}
+	fastlock_init(&(domain->fpp_lock));
+
+	domain->fast_path_pool = util_buf_pool_create(
+						sizeof(struct mlx_request),
+						16, 0, 1024 );
+	if (!domain->fast_path_pool) {
+		ofi_status = -ENOMEM;
+		goto cleanup_mlx;
+	}
+
+	domain->u_domain.domain_fid.fid.ops = &mlx_fi_ops;
+	domain->u_domain.domain_fid.ops = &mlx_domain_ops;
+	domain->u_domain.domain_fid.mr = &mlx_mr_ops;
+
+	*fid = &(domain->u_domain.domain_fid);
+	return FI_SUCCESS;
+
+cleanup_mlx:
+	ucp_cleanup(domain->context);
+destroy_domain:
+	ofi_domain_close(&(domain->u_domain));
+domain_free:
+	free(domain);
+	if (!ofi_status) {
+		ofi_status = FI_ENETUNREACH;
+	}
+	return ofi_status;
+}
+
diff --git a/prov/mlx/src/mlx_ep.c b/prov/mlx/src/mlx_ep.c
new file mode 100644
index 0000000..a8250f6
--- /dev/null
+++ b/prov/mlx/src/mlx_ep.c
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "mlx.h"
+
+static void mlx_ep_progress( struct util_ep *util_ep)
+{
+	struct mlx_ep* ep;
+	ep = container_of(util_ep, struct mlx_ep, ep);
+	ucp_worker_progress(ep->worker);
+}
+
+
+static ssize_t mlx_ep_cancel( fid_t fid, void *ctx)
+{
+	struct mlx_ep *ep;
+	void *req;
+	struct fi_context  *context = (struct fi_context*)ctx;
+
+	ep = container_of( fid, struct mlx_ep, ep.ep_fid.fid);
+	if (!ep->ep.domain)
+		return -EBADF;
+	if (!context)
+		return -EINVAL;
+	if (context->internal[0] == NULL)
+		return -FI_EINVAL;
+
+	req = context->internal[0];
+	ucp_request_cancel(ep->worker, req);
+
+	return FI_SUCCESS;
+}
+
+static int mlx_ep_getopt( fid_t fid, int level, int optname,
+			void *optval, size_t *optlen)
+{
+	return -ENOSYS;
+}
+
+static int mlx_ep_setopt(fid_t fid, int level, int optname,
+		const void *optval, size_t optlen)
+{
+	return FI_SUCCESS;
+}
+
+static int mlx_ep_close(fid_t fid)
+{
+	struct mlx_ep *fid_ep;
+	fid_ep = container_of(fid, struct mlx_ep, ep.ep_fid.fid);
+
+	ucp_worker_flush(fid_ep->worker);
+	ucp_worker_destroy(fid_ep->worker);
+
+	ofi_endpoint_close(&fid_ep->ep);
+	free(fid_ep);
+	return FI_SUCCESS;
+}
+
+static int mlx_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
+{
+	struct mlx_ep *ep;
+	struct util_cq *cq;
+
+	ep = container_of(fid, struct mlx_ep, ep.ep_fid.fid);
+	int status = FI_SUCCESS;
+
+	switch (bfid->fclass) {
+	case FI_CLASS_CQ:
+		status = ofi_ep_bind_cq(&ep->ep, cq, flags);
+		break;
+	case FI_CLASS_AV:
+		if (ep->av) {
+			FI_WARN( &mlx_prov, FI_LOG_EP_CTRL,
+				"AV already binded\n");
+			status = -FI_EINVAL;
+			break;
+		}
+		ep->av = container_of(bfid, struct mlx_av, av.fid);
+		ep->av->ep = ep;
+		break;
+	default:
+		status = -FI_EINVAL;
+		break;
+	}
+	return status;
+}
+
+
+static int mlx_ep_control(fid_t fid, int command, void *arg)
+{
+
+	struct mlx_ep *ep;
+
+	ep = container_of(fid, struct mlx_ep, ep.ep_fid.fid);
+	switch (command) {
+	case FI_ENABLE:
+		if (!ep->ep.rx_cq || !ep->ep.tx_cq)
+			return -FI_ENOCQ;
+		if (!ep->av)
+			return -FI_EOPBADSTATE; /* TODO: Add FI_ENOAV */
+		break;
+	default:
+		return -FI_ENOSYS;
+	}
+	return FI_SUCCESS;
+}
+
+struct fi_ops_ep mlx_ep_ops = {
+	.size = sizeof(struct fi_ops_ep),
+	.cancel = mlx_ep_cancel,
+	.getopt = mlx_ep_getopt,
+	.setopt = mlx_ep_setopt,
+};
+
+static struct fi_ops mlx_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = mlx_ep_close,
+	.bind = mlx_ep_bind,
+	.control = mlx_ep_control,
+};
+
+int mlx_ep_open( struct fid_domain *domain, struct fi_info *info,
+		struct fid_ep **fid, void *context)
+{
+	struct mlx_ep     *ep;
+	struct mlx_domain *u_domain;
+	int ofi_status = FI_SUCCESS;
+	ucs_status_t status = UCS_OK;
+	ucp_worker_params_t worker_params;
+	worker_params.field_mask = UCP_WORKER_PARAM_FIELD_THREAD_MODE;
+	worker_params.thread_mode = UCS_THREAD_MODE_MULTI;
+	u_domain = container_of( domain, struct mlx_domain, u_domain.domain_fid);
+
+	ep = (struct mlx_ep *) calloc(1, sizeof (struct mlx_ep));
+	if (!ep) {
+		return -ENOMEM;
+	}
+
+	ofi_status = ofi_endpoint_init(domain, &mlx_util_prov, info,
+				       &ep->ep, context, mlx_ep_progress);
+	if (ofi_status) {
+		goto free_ep;
+	}
+
+	status = ucp_worker_create( u_domain->context,
+				&worker_params,
+				&(ep->worker));
+	if (status != UCS_OK) {
+		ofi_status = MLX_TRANSLATE_ERRCODE(status);
+		ofi_atomic_dec32(&(u_domain->u_domain.ref));
+		goto free_ep;
+	}
+
+	ep->ep.ep_fid.fid.ops = &mlx_fi_ops;
+	ep->ep.ep_fid.ops = &mlx_ep_ops;
+	ep->ep.ep_fid.cm = &mlx_cm_ops;
+	ep->ep.ep_fid.tagged = &mlx_tagged_ops;
+	ep->ep.flags = info->mode;
+	ep->ep.caps = u_domain->u_domain.info_domain_caps;
+
+	*fid = &(ep->ep.ep_fid);
+
+	return FI_SUCCESS;
+free_ep:
+	free(ep);
+	return ofi_status;
+}
diff --git a/prov/udp/src/udpx_fabric.c b/prov/mlx/src/mlx_fabric.c
similarity index 57%
copy from prov/udp/src/udpx_fabric.c
copy to prov/mlx/src/mlx_fabric.c
index 908510c..c63fe5a 100644
--- a/prov/udp/src/udpx_fabric.c
+++ b/prov/mlx/src/mlx_fabric.c
@@ -1,11 +1,11 @@
 /*
- * Copyright (c) 2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
  * General Public License (GPL) Version 2, available from the file
  * COPYING in the main directory of this source tree, or the
- * BSD license below:
+ * OpenFabrics.org BSD license below:
  *
  *     Redistribution and use in source and binary forms, with or
  *     without modification, are permitted provided that the following
@@ -30,58 +30,64 @@
  * SOFTWARE.
  */
 
-#include <stdlib.h>
-#include <string.h>
+#include "mlx.h"
 
-#include "udpx.h"
-
-
-static struct fi_ops_fabric udpx_fabric_ops = {
-	.size = sizeof(struct fi_ops_fabric),
-	.domain = udpx_domain_open,
-	.passive_ep = fi_no_passive_ep,
-	.eq_open = ofi_eq_create,
-	.wait_open = ofi_wait_fd_open,
-	.trywait = ofi_trywait
-};
-
-static int udpx_fabric_close(fid_t fid)
+int mlx_fabric_close(struct fid *fid)
 {
-	int ret;
-	struct util_fabric *fabric;
-	fabric = container_of(fid, struct util_fabric, fabric_fid.fid);
-	ret = ofi_fabric_close(fabric);
-	if (ret)
-		return ret;
-	free(fabric);
-	return 0;
+	int status;
+	status = ofi_fabric_close(
+			container_of(fid, struct util_fabric, fabric_fid.fid));
+	return status;
 }
 
-static struct fi_ops udpx_fabric_fi_ops = {
+static struct fi_ops mlx_fabric_fi_ops = {
 	.size = sizeof(struct fi_ops),
-	.close = udpx_fabric_close,
+	.close = mlx_fabric_close,
 	.bind = fi_no_bind,
 	.control = fi_no_control,
 	.ops_open = fi_no_ops_open,
 };
 
-int udpx_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
+static struct fi_ops_fabric mlx_fabric_ops = {
+	.size = sizeof(struct fi_ops_fabric),
+	.domain = mlx_domain_open,
+	.passive_ep = fi_no_passive_ep,
+	.eq_open = ofi_eq_create,
+	.wait_open = ofi_wait_fd_open,
+	.trywait = fi_no_trywait,
+};
+
+int mlx_fabric_open(
+		struct fi_fabric_attr *attr,
+		struct fid_fabric **fabric,
 		void *context)
 {
-	int ret;
-	struct util_fabric *util_fabric;
+	struct mlx_fabric *fabric_priv;
+	int status;
+
+	FI_INFO( &mlx_prov, FI_LOG_CORE, "\n" );
 
-	util_fabric = calloc(1, sizeof(*util_fabric));
-	if (!util_fabric)
+	if (strcmp(attr->name, FI_MLX_FABRIC_NAME)) {
+		return -FI_ENODATA;
+	}
+
+	fabric_priv = calloc(1, sizeof(struct mlx_fabric));
+	if (!fabric_priv) {
 		return -FI_ENOMEM;
+	}
+
+	status = ofi_fabric_init(&mlx_prov, &mlx_fabric_attrs, attr,
+				 &(fabric_priv->u_fabric), context);
+	if (status) {
+		FI_INFO( &mlx_prov, FI_LOG_CORE,
+			"Error in ofi_fabric_init: %d\n", status);
+		free(fabric_priv);
+		return status;
+	}
 
-	ret = ofi_fabric_init(&udpx_prov, udpx_info.fabric_attr, attr,
-			     util_fabric, context, FI_MATCH_EXACT);
-	if (ret)
-		return ret;
+	fabric_priv->u_fabric.fabric_fid.fid.ops = &mlx_fabric_fi_ops;
+	fabric_priv->u_fabric.fabric_fid.ops = &mlx_fabric_ops;
+	*fabric = &(fabric_priv->u_fabric.fabric_fid);
 
-	*fabric = &util_fabric->fabric_fid;
-	(*fabric)->fid.ops = &udpx_fabric_fi_ops;
-	(*fabric)->ops = &udpx_fabric_ops;
-	return 0;
+	return FI_SUCCESS;
 }
diff --git a/prov/mlx/src/mlx_init.c b/prov/mlx/src/mlx_init.c
new file mode 100644
index 0000000..36fdcd4
--- /dev/null
+++ b/prov/mlx/src/mlx_init.c
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "mlx.h"
+
+
+int mlx_errcode_translation_table[(-UCS_ERR_LAST)+2];
+
+struct mlx_global_descriptor mlx_descriptor = {
+	.config = NULL,
+};
+
+static int mlx_init_errcodes()
+{
+	memset(mlx_errcode_translation_table, -FI_EOTHER, (-UCS_ERR_LAST)+2);
+	MLX_TRANSLATE_ERRCODE (UCS_OK)                  = -FI_SUCCESS;
+	MLX_TRANSLATE_ERRCODE (UCS_INPROGRESS)          = -FI_EINPROGRESS;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NO_MESSAGE)      = -FI_ENOMSG;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NO_RESOURCE)     = -FI_EINVAL;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_IO_ERROR)        = -FI_EIO;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NO_MEMORY)       = -FI_ENOMEM;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_INVALID_PARAM)   = -FI_EINVAL;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_UNREACHABLE)     = -FI_ENETUNREACH;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_INVALID_ADDR)    = -FI_EINVAL;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NOT_IMPLEMENTED) = -FI_ENOSYS;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_MESSAGE_TRUNCATED) = -FI_EMSGSIZE;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NO_PROGRESS)     = -FI_EAGAIN;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_BUFFER_TOO_SMALL)= -FI_ETOOSMALL;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NO_ELEM)         = -FI_ENOENT;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_SOME_CONNECTS_FAILED)   = -FI_EIO;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_NO_DEVICE)       = -FI_ENODEV;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_BUSY)            = -FI_EBUSY;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_CANCELED)        = -FI_ECANCELED;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_SHMEM_SEGMENT)   = -FI_EINVAL;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_ALREADY_EXISTS)  = -EEXIST;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_OUT_OF_RANGE)    = -FI_EINVAL;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_TIMED_OUT)       = -FI_ETIMEDOUT;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_EXCEEDS_LIMIT)   = -FI_E2BIG;
+	MLX_TRANSLATE_ERRCODE (UCS_ERR_UNSUPPORTED)     = -FI_ENOSYS;
+	return 0;
+}
+
+
+struct fi_domain_attr mlx_domain_attrs = {
+	.domain = NULL,
+	.name = FI_MLX_FABRIC_NAME,
+	.threading = FI_THREAD_SAFE,
+	.control_progress = FI_PROGRESS_AUTO,
+	.data_progress = FI_PROGRESS_MANUAL,
+	.resource_mgmt = FI_RM_DISABLED,
+	.av_type = FI_AV_UNSPEC,
+	.mr_mode = OFI_MR_BASIC_MAP,
+	.mr_key_size = -1, /*Should be setup after init*/
+	.tx_ctx_cnt = 1,
+	.rx_ctx_cnt = 1,
+	.max_ep_tx_ctx = 1,
+	.max_ep_rx_ctx = 1,
+	.mr_cnt = FI_MLX_DEF_MR_CNT;
+};
+
+struct fi_rx_attr mlx_rx_attrs = {
+	.caps = FI_MLX_CAPS,
+	.mode = FI_MLX_MODE_REQUIRED,
+	.op_flags = FI_MLX_OP_FLAGS,
+	.msg_order = FI_ORDER_SAS,
+	.comp_order = FI_ORDER_NONE,
+	.total_buffered_recv = ~(0ULL),
+	.size = UINT64_MAX,
+	.iov_limit = 1
+};
+
+struct fi_tx_attr mlx_tx_attrs = {
+	.caps = FI_MLX_CAPS,
+	.mode = FI_MLX_MODE_REQUIRED,
+	.op_flags = FI_MLX_OP_FLAGS,
+	.msg_order = FI_ORDER_SAS,
+	.comp_order = FI_ORDER_NONE,
+	.inject_size = FI_MLX_DEFAULT_INJECT_SIZE, /*Should be setup after init*/
+	.size = UINT64_MAX,
+	.iov_limit = 1,
+	.rma_iov_limit = 0
+};
+
+struct fi_fabric_attr mlx_fabric_attrs = {
+	.name = FI_MLX_FABRIC_NAME,
+	.prov_name = FI_MLX_FABRIC_NAME,
+	.prov_version = FI_MLX_VERSION,
+	.fabric = NULL
+};
+
+struct fi_ep_attr mlx_ep_attrs = {
+	.type = FI_EP_RDM,
+	.protocol = FI_PROTO_MLX,
+	.protocol_version = UCP_API_RELEASE,
+	.max_msg_size = 0xFFFFFFFF,
+	.mem_tag_format = 0x0,
+	.tx_ctx_cnt = 1,
+	.rx_ctx_cnt = 1,
+};
+
+
+struct fi_info mlx_info = {
+	.caps = FI_MLX_CAPS,
+	.mode = FI_MLX_MODE_REQUIRED,
+	.addr_format = FI_ADDR_MLX,
+	.src_addrlen = 0,
+	.dest_addr = 0,
+	.tx_attr = &mlx_tx_attrs,
+	.rx_attr = &mlx_rx_attrs,
+	.ep_attr = &mlx_ep_attrs,
+	.domain_attr = &mlx_domain_attrs,
+	.fabric_attr = &mlx_fabric_attrs
+};
+
+struct util_prov mlx_util_prov = {
+	.prov = &mlx_prov,
+	.info = &mlx_info,
+	.flags = 0
+};
+
+
+static int mlx_getinfo (
+			uint32_t version, const char *node,
+			const char *service, uint64_t flags,
+			struct fi_info *hints, struct fi_info **info)
+{
+	int status = -ENODATA;
+	FI_INFO(&mlx_prov, FI_LOG_CORE,"\n");
+
+	char *configfile_name = NULL;
+	mlx_descriptor.config=NULL;
+	int inject_thresh =-1;
+
+	status = fi_param_get( &mlx_prov,
+				"mlx_tinject_limit",
+				&inject_thresh);
+	if (!status) {
+		inject_thresh = FI_MLX_DEFAULT_INJECT_SIZE;
+	}
+	FI_INFO( &mlx_prov, FI_LOG_CORE,
+		"used inlect size = %d \n", inject_thresh);
+
+	status = fi_param_get( &mlx_prov, "mlx_config", &configfile_name);
+	if (!status) {
+		configfile_name = NULL;
+	}
+
+	status = ucp_config_read( NULL,
+				status? NULL: configfile_name,
+				&mlx_descriptor.config);
+	if (status != UCS_OK) {
+		FI_WARN( &mlx_prov, FI_LOG_CORE,
+			"MLX error: invalid config file\n\t%d (%s)\n",
+			status, ucs_status_string(status));
+	}
+
+	/*Setup some presets*/
+	status = ucm_config_modify("MLX_MEM_MALLOC_HOOKS", "no");
+	if (status != UCS_OK) {
+		FI_WARN( &mlx_prov, FI_LOG_CORE,
+			"MLX error: failed to switch off UCM memory hooks:\t%d (%s)\n",
+			status, ucs_status_string(status));
+	}
+
+	FI_INFO( &mlx_prov, FI_LOG_CORE,
+		"Loaded MLX version %s\n",
+		ucp_get_version_string());
+
+#if ENABLE_DEBUG
+	if (mlx_descriptor.config &&
+			fi_log_enabled( &mlx_prov, FI_LOG_INFO, FI_LOG_CORE)) {
+		ucp_config_print( mlx_descriptor.config,
+				stderr, "Used MLX configuration", (1<<4)-1);
+	}
+#endif
+
+	*info = NULL;
+	if (node || service) {
+		FI_WARN(&mlx_prov, FI_LOG_CORE,
+		"fi_getinfo with \"node != NULL \" or \"service != NULL \" is not supported\n");
+	}
+
+	status = util_getinfo( &mlx_util_prov, version,
+				NULL, NULL, 0, hints, info);
+
+	return status;
+}
+
+void mlx_cleanup(void)
+{
+	FI_INFO(&mlx_prov, FI_LOG_CORE, "provider goes cleanup sequence\n");
+	if (mlx_descriptor.config) {
+		ucp_config_release(mlx_descriptor.config);
+		mlx_descriptor.config = NULL;
+	}
+}
+
+
+struct fi_provider mlx_prov = {
+	.name = FI_MLX_FABRIC_NAME,
+	.version = FI_MLX_VERSION,
+	.fi_version = FI_VERSION(1, 3),
+	.getinfo = mlx_getinfo,
+	.fabric = mlx_fabric_open,
+	.cleanup = mlx_cleanup,
+};
+
+
+MLX_INI
+{
+	mlx_init_errcodes();
+	fi_param_define( &mlx_prov,
+			"mlx_config", FI_PARAM_STRING,
+			"MLX configuration file name");
+
+	fi_param_define(&mlx_prov,
+			"mlx_tinject_limit", FI_PARAM_INT,
+			"Maximal tinject message size");
+
+
+	return &mlx_prov;
+}
diff --git a/prov/mlx/src/mlx_tagged.c b/prov/mlx/src/mlx_tagged.c
new file mode 100644
index 0000000..4f3d1ab
--- /dev/null
+++ b/prov/mlx/src/mlx_tagged.c
@@ -0,0 +1,367 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * OpenFabrics.org BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+#include "mlx.h"
+
+#define __mlx_get_dstep_from_fi_addr(EP, ADDR) ((ucp_ep_h)(ADDR))
+
+static ssize_t mlx_tagged_recvmsg(
+				struct fid_ep *ep,
+				const struct fi_msg_tagged *msg,
+				uint64_t flags)
+{
+	ucs_status_ptr_t status = NULL;
+	ucs_recv_callback_t cbf;
+	struct mlx_ep* u_ep;
+	struct mlx_request *req;
+	struct util_cq* cq;
+	u_ep = container_of(ep, struct mlx_ep, ep.ep_fid);
+
+	if(flags & FI_REMOTE_CQ_DATA) {
+		return -FI_EBADFLAGS;
+	}
+
+	cbf = ((!(u_ep->ep.rx_op_flags & FI_SELECTIVE_COMPLETION)) 
+			|| (flags & FI_COMPLETION)) ? 
+				mlx_recv_callback : mlx_recv_callback_no_compl;
+
+	if (msg->iov_count == 1) {
+		status = ucp_tag_recv_nb(u_ep->worker, msg->msg_iov[0].iov_base,
+					msg->msg_iov[0].iov_len,
+					ucp_dt_make_contig(1),
+					msg->tag, (~(msg->ignore)), cbf);
+	} else {
+		return -FI_EINVAL; /*Do not return IOV for a while*/
+	}
+
+	if (UCS_PTR_IS_ERR(status)) {
+		FI_DBG( &mlx_prov,FI_LOG_CORE,
+			"Send operation returns error: %s",
+			ucs_status_string(*(ucs_status_t*)status));
+		return MLX_TRANSLATE_ERRCODE(*(ucs_status_t*)status);
+	}
+
+	req = (struct mlx_request *) status;
+	cq = u_ep->ep.rx_cq;
+	req->cq = cq;
+	req->ep =u_ep;
+
+	if (msg->context) {
+		struct fi_context* _ctx =((struct fi_context *)(msg->context)); 
+		_ctx->internal[0] = (void*)req;
+		_ctx->internal[1] = NULL;
+		_ctx->internal[2] = &(cq->cq_fid);
+		_ctx->internal[3] = (void*)FI_RECV;
+	}
+	req->completion.tagged.op_context = msg->context;
+	req->completion.tagged.flags = FI_RECV;
+	req->completion.tagged.buf = msg->msg_iov[0].iov_base;
+	req->completion.tagged.data = 0;
+
+	if (req->type == MLX_FI_REQ_UNINITIALIZED) {
+		req->type = MLX_FI_REQ_REGULAR;
+		req->completion.tagged.tag = msg->tag;
+		req->completion.tagged.len = msg->msg_iov[0].iov_len;
+		goto fence;
+	}
+
+	/*Unexpected path*/
+	struct fi_cq_tagged_entry *t_entry;
+	fastlock_acquire(&cq->cq_lock);
+	t_entry = ofi_cirque_tail(cq->cirq);
+	*t_entry = (req->completion.tagged);
+
+	if(req->type == MLX_FI_REQ_UNEXPECTED_ERR) {
+		struct util_cq_err_entry* err;
+		req->completion.error.olen -= req->completion.tagged.len;
+		t_entry->flags |= UTIL_FLAG_ERROR;
+
+		err = calloc(1, sizeof(struct util_cq_err_entry));
+		if (!err) {
+			FI_WARN(&mlx_prov, FI_LOG_CQ,
+				"out of memory, cannot report CQ error\n");
+			return -FI_ENOMEM;
+		}
+		err->err_entry = (req->completion.error);
+		slist_insert_tail(&err->list_entry, &cq->err_list);
+	}
+
+	//ucp_request_release(req);
+	ofi_cirque_commit(cq->cirq);
+	fastlock_release(&cq->cq_lock);
+
+fence:
+	if(flags & FI_FENCE) {
+		ucs_status_t cstatus;
+		cstatus = ucp_worker_flush(u_ep->worker);
+		if(status != UCS_OK) {
+			return MLX_TRANSLATE_ERRCODE(cstatus);
+		}
+	}
+	return FI_SUCCESS;
+}
+
+static ssize_t mlx_tagged_sendmsg(
+				struct fid_ep *ep,
+				const struct fi_msg_tagged *msg,
+				uint64_t flags)
+{
+	struct mlx_ep* u_ep;
+	ucp_send_callback_t cbf;
+	ucp_ep_h dst_ep;
+	ucs_status_ptr_t status = NULL;
+	ucs_status_t cstatus;
+	struct util_cq *cq;
+
+	u_ep = container_of(ep, struct mlx_ep, ep.ep_fid);
+	dst_ep = __mlx_get_dstep_from_fi_addr(u_ep, msg->addr);
+	cq = u_ep->ep.tx_cq;
+
+	if(flags & FI_REMOTE_CQ_DATA) {
+		return -FI_EBADFLAGS;
+	}
+
+	cbf = ((!(u_ep->ep.tx_op_flags & FI_SELECTIVE_COMPLETION)) 
+			|| (flags & FI_COMPLETION)) ? 
+				mlx_send_callback : mlx_send_callback_no_compl;
+	if (msg->iov_count == 1) {
+		if (flags & FI_TRANSMIT_COMPLETE) {
+			status = ucp_tag_send_sync_nb (
+						dst_ep,
+						msg->msg_iov[0].iov_base,
+						msg->msg_iov[0].iov_len,
+						ucp_dt_make_contig(1),
+						msg->tag, cbf);
+		} else {
+			status = ucp_tag_send_nb(
+						dst_ep,
+						msg->msg_iov[0].iov_base,
+						msg->msg_iov[0].iov_len,
+						ucp_dt_make_contig(1),
+						msg->tag, cbf);
+		}
+	} else {
+		return -FI_EINVAL; /*Do not return IOV for a while*/
+	}
+
+	if (UCS_PTR_IS_ERR(status)) {
+		FI_DBG( &mlx_prov,FI_LOG_CORE,
+			"Send operation returns error: %s",
+			ucs_status_string(*(ucs_status_t*)status));
+		return MLX_TRANSLATE_ERRCODE(*(ucs_status_t*)status);
+	}
+
+	if (flags & FI_INJECT) {
+		while (!ucp_request_is_completed(status)) {
+			ucp_worker_progress(u_ep->worker);
+		}
+		ucp_request_release(status);
+		goto fence;
+	}
+
+	if((u_ep->ep.tx_op_flags & FI_SELECTIVE_COMPLETION)
+			&& !(flags & FI_COMPLETION)) {
+		goto fence;
+	}
+
+	if (msg->context) {
+		struct fi_context* _ctx = ((struct fi_context*)(msg->context));
+		_ctx->internal[0] = status;
+		_ctx->internal[1] = NULL;
+		_ctx->internal[2] = &(cq->cq_fid);
+		_ctx->internal[3] = (void*)FI_SEND;
+	}
+
+
+	if (status != UCS_OK) {
+		struct mlx_request *req;
+		req = (struct mlx_request *) status;
+		req->cq = cq;
+		req->ep = u_ep;
+		req->type = MLX_FI_REQ_REGULAR; 
+		req->completion.tagged.op_context = msg->context;
+		req->completion.tagged.flags = FI_SEND;
+		req->completion.tagged.len = msg->msg_iov[0].iov_len;
+		req->completion.tagged.buf = msg->msg_iov[0].iov_base;
+		req->completion.tagged.data = 0;
+		req->completion.tagged.tag = msg->tag;
+	} else {
+		struct fi_cq_tagged_entry *t_entry;
+		fastlock_acquire(&cq->cq_lock);
+		t_entry = ofi_cirque_tail(cq->cirq);
+		t_entry->op_context = msg->context;
+		t_entry->flags = FI_SEND;
+		t_entry->len = msg->msg_iov[0].iov_len;
+		t_entry->buf = msg->msg_iov[0].iov_base;
+		t_entry->data = 0;
+		t_entry->tag = msg->tag;
+		ofi_cirque_commit(cq->cirq);
+		fastlock_release(&cq->cq_lock);
+	}
+
+fence:
+	if(flags & FI_FENCE) {
+		cstatus = ucp_worker_flush(u_ep->worker);
+		if(status != UCS_OK) {
+			return MLX_TRANSLATE_ERRCODE(cstatus);
+		}
+	}
+	return FI_SUCCESS;
+}
+
+
+static ssize_t mlx_tagged_inject(
+			struct fid_ep *ep, const void *buf, size_t len,
+			fi_addr_t dest_addr, uint64_t tag)
+{
+	struct mlx_ep* u_ep;
+	ucp_ep_h dst_ep;
+	ucs_status_ptr_t status = NULL;
+
+	u_ep = container_of(ep, struct mlx_ep, ep.ep_fid);
+	dst_ep = __mlx_get_dstep_from_fi_addr(u_ep, dest_addr);
+
+	status = ucp_tag_send_nb( dst_ep, buf, len,
+				ucp_dt_make_contig(1),
+				tag, mlx_send_callback_no_compl);
+	if (status == UCS_OK) {
+		return FI_SUCCESS;
+	}
+
+	if (UCS_PTR_IS_ERR(status)) {
+		FI_DBG( &mlx_prov,FI_LOG_CORE,
+			"Send operation returns error: %s",
+			ucs_status_string(*(ucs_status_t*)status));
+		return MLX_TRANSLATE_ERRCODE(*(ucs_status_t*)status);
+	}
+
+	while (!ucp_request_is_completed(status)) {
+		ucp_worker_progress(u_ep->worker);
+	}
+
+	return FI_SUCCESS;
+}
+
+static ssize_t mlx_tagged_send(
+				struct fid_ep *ep, const void *buf,
+				size_t len, void *desc,
+				fi_addr_t dest_addr,
+				uint64_t tag, void *context)
+{
+	struct iovec iov = {
+		.iov_base = (void*)buf,
+		.iov_len = len,
+	};
+
+	struct fi_msg_tagged msg = {
+		.msg_iov = &iov,
+		.desc = desc,
+		.iov_count = 1,
+		.addr = dest_addr,
+		.tag = tag,
+		.context = context,
+	};
+
+	return mlx_tagged_sendmsg( ep, &msg, 0);
+}
+
+static ssize_t mlx_tagged_sendv(
+				struct fid_ep *ep, const struct iovec *iov,
+				void **desc,
+				size_t count, fi_addr_t dest_addr,
+				uint64_t tag, void *context)
+{
+	struct fi_msg_tagged msg = {
+		.msg_iov = iov,
+		.desc = desc,
+		.iov_count = count,
+		.addr = dest_addr,
+		.tag = tag,
+		.context = context,
+	};
+
+	return mlx_tagged_sendmsg( ep, &msg, 0);
+}
+
+static ssize_t mlx_tagged_recvv(
+			struct fid_ep *ep, const struct iovec *iov, void **desc,
+			size_t count, fi_addr_t src_addr,
+			uint64_t tag, uint64_t ignore, void *context)
+{
+	struct fi_msg_tagged msg = {
+		.msg_iov = iov,
+		.desc = desc,
+		.iov_count = count,
+		.addr = src_addr,
+		.tag = tag,
+		.ignore = ignore,
+		.context = context,
+	};
+	return mlx_tagged_recvmsg(ep, &msg, 0);
+}
+
+static ssize_t mlx_tagged_recv(
+			struct fid_ep *ep, void *buf, size_t len, void *desc,
+			fi_addr_t src_addr,
+			uint64_t tag,
+			uint64_t ignore,
+			void *context)
+{
+	struct iovec iov = {
+		.iov_base = buf,
+		.iov_len = len,
+	};
+
+	struct fi_msg_tagged msg = {
+		.msg_iov = &iov,
+		.desc = desc,
+		.iov_count = 1,
+		.addr = src_addr,
+		.tag = tag,
+		.ignore = ignore,
+		.context = context,
+	};
+	return mlx_tagged_recvmsg(ep, &msg, 0);
+}
+
+struct fi_ops_tagged mlx_tagged_ops = {
+	.size = sizeof(struct fi_ops_tagged),
+	.recv = mlx_tagged_recv,
+	.recvv = mlx_tagged_recvv,
+	.recvmsg = mlx_tagged_recvmsg,
+	.send = mlx_tagged_send,
+	.senddata = fi_no_tagged_senddata,
+	.sendv = mlx_tagged_sendv,
+	.inject = mlx_tagged_inject,
+	.sendmsg = mlx_tagged_sendmsg,
+	.injectdata = fi_no_tagged_injectdata,
+};
+
diff --git a/prov/mxm/Makefile.include b/prov/mxm/Makefile.include
deleted file mode 100644
index 897f55f..0000000
--- a/prov/mxm/Makefile.include
+++ /dev/null
@@ -1,37 +0,0 @@
-if HAVE_MXM
-_mxm_files = prov/mxm/src/mlxm.h \
-	prov/mxm/src/uthash.h \
-	prov/mxm/src/mpool.h \
-	prov/mxm/src/mlxm_mq_storage.h \
-	prov/mxm/src/mlxm_helpers.h \
-	prov/mxm/src/mlxm_init.c \
-	prov/mxm/src/mlxm_domain.c \
-	prov/mxm/src/mlxm_cq.c \
-	prov/mxm/src/mlxm_av.c \
-	prov/mxm/src/mlxm_ep.c \
-	prov/mxm/src/mlxm_cm.c \
-	prov/mxm/src/mlxm_tagged.c \
-	prov/mxm/src/mlxm_mr.c
-
-
-if HAVE_MXM_DL
-pkglib_LTLIBRARIES += libmlxm-fi.la
-libmlxm_fi_la_CPPFLAGS = $(AM_CPPFLAGS) $(mxm_CPPFLAGS)
-libmlxm_fi_la_SOURCES = $(_mxm_files) $(common_srcs)
-libmlxm_fi_la_LDFLAGS = \
-	$(mxm_LDFLAGS) \
-	-module -avoid-version -shared -export-dynamic
-libmlxm_fi_la_LIBADD = $(linkback) $(mxm_LIBS)
-libmlxm_fi_la_DEPENDENCIES = $(linkback)
-else
-src_libfabric_la_SOURCES += $(_mxm_files)
-src_libfabric_la_CPPFLAGS += $(mxm_CPPFLAGS)
-src_libfabric_la_LDFLAGS += $(mxm_LDFLAGS)
-src_libfabric_la_LIBADD += $(mxm_LIBS)
-endif
-
-prov_install_man_pages += man/man7/fi_mxm.7
-
-endif #HAVE_MXM
-
-prov_dist_man_pages += man/man7/fi_mxm.7
diff --git a/prov/mxm/configure.m4 b/prov/mxm/configure.m4
deleted file mode 100644
index c792e8a..0000000
--- a/prov/mxm/configure.m4
+++ /dev/null
@@ -1,26 +0,0 @@
-dnl Configury specific to the libfabrics mxm provider
-
-dnl Called to configure this provider
-dnl
-dnl Arguments:
-dnl
-dnl $1: action if configured successfully
-dnl $2: action if not configured successfully
-dnl
-AC_DEFUN([FI_MXM_CONFIGURE],[
-    # Determine if we can support the mxm provider
-    mxm_happy=0
-    AS_IF([test x"$enable_mxm" != x"no"],
-              [FI_CHECK_PACKAGE([mxm],
-                    [mxm/api/mxm_api.h],
-                    [mxm],
-                    [mxm_get_version],
-                    [],
-                    [$mxm_PREFIX],
-                    [$mxm_LIBDIR],
-                    [mxm_happy=1],
-                    [mxm_happy=0])
-         ])
-    AS_IF([test $mxm_happy -eq 1], [$1], [$2])
-])
-
diff --git a/prov/mxm/src/mlxm.h b/prov/mxm/src/mlxm.h
deleted file mode 100644
index 90d5f21..0000000
--- a/prov/mxm/src/mlxm.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#ifndef _FI_MLXM_H
-#define _FI_MLXM_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "config.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <rdma/fabric.h>
-#include <rdma/fi_domain.h>
-#include <rdma/fi_endpoint.h>
-#include <rdma/fi_tagged.h>
-#include <rdma/fi_rma.h>
-#include <rdma/fi_cm.h>
-#include <rdma/fi_errno.h>
-#include <rdma/providers/fi_log.h>
-#include <rdma/providers/fi_prov.h>
-#include "fi_enosys.h"
-#include <mxm/api/mxm_api.h>
-#include "mpool.h"
-#include "uthash.h"
-#include <sys/uio.h>
-#include <fi.h>
-
-extern int mlxm_errno_table[MXM_ERR_LAST];
-static inline
-int mlxm_errno(int err)
-{
-        if (err>=0 && err < MXM_ERR_LAST)
-                return mlxm_errno_table[err];
-        else
-                return -FI_EOTHER;
-}
-
-
-
-#define MLXM_SUPPORTED_FLAGS ( FI_SEND | FI_RECV )
-#define MLXM_DEFAULT_FLAGS   (0)
-extern struct fi_provider mlxm_prov;
-
-struct mlxm_fid_domain {
-        struct fid_domain       domain;
-        size_t                  mxm_addrlen;
-};
-
-struct mlxm_fid_ep {
-        struct fid_ep           ep;
-        struct mlxm_fid_domain  *domain;
-        struct mlxm_fid_cq      *cq;
-        struct mlxm_fid_av      *av;
-        uint64_t                flags;
-        struct mlxm_mq_storage* mxm_mqs;
-};
-
-struct mlxm_fid_av {
-        struct fid_av           av;
-        struct mlxm_fid_domain  *domain;
-        struct mlxm_fid_ep      *ep;
-        int                     type;
-        size_t                  count;
-        size_t                  addrlen;
-};
-
-struct mlxm_fid_fabric {
-        struct fid_fabric       fabric;
-};
-
-struct mlxm_fid_mr {
-        struct fid_mr           mr;
-        struct mlxm_fid_domain  *domain;
-        mxm_mem_key_t mxm_key;
-        size_t iov_count;
-        struct iovec            iov[0]; /* must be the last field */
-};
-
-struct mlxm_cq_entry_queue {
-        size_t                  size;
-        size_t                  n;
-        struct mlxm_cq_entry    *head;
-        struct mlxm_cq_entry    *tail;
-};
-
-struct mlxm_completion_queue {
-        void *head;
-        void *tail;
-};
-
-struct mlxm_fid_cq {
-        struct fid_cq cq;
-        mxm_h mxm_context;
-        struct mlxm_completion_queue ok_q;
-        struct mlxm_completion_queue err_q;
-};
-
-struct mlxm_cq_entry {
-        void                 *ptr;
-        mxm_conn_h            src_addr;
-        struct mlxm_cq_entry *next;
-};
-
-struct mlxm_req {
-        union {
-                mxm_send_req_t  sreq;
-                mxm_recv_req_t  rreq;
-        } mxm_req;
-        struct mpool* pool;
-        uint16_t   mq_id;
-};
-
-struct mlxm_mq_entry {
-        uint16_t mq_key;
-        mxm_mq_h mq;
-        UT_hash_handle hh;
-};
-
-struct mlxm_mq_storage{
-        struct mlxm_mq_entry *hash;
-};
-
-struct mlxm_globals{
-        mxm_h mxm_context;
-        mxm_ep_h mxm_ep;
-        struct mlxm_mq_storage mq_storage;
-        struct mpool *req_pool;
-};
-extern struct mlxm_globals      mlxm_globals;
-extern struct fi_ops_cm         mlxm_cm_ops;
-extern struct fi_ops_tagged     mlxm_tagged_ops;
-extern struct fi_ops_mr         mlxm_mr_ops;
-
-#define MLXM_MEM_TAG_FORMAT (0xFFFF00000000LLU) /* MXM support 16 bit field for MQ, and 32 more bits for tag */
-extern uint64_t mlxm_mem_tag_format;
-
-int mlxm_domain_open(struct fid_fabric *fabric, struct fi_info *info,
-                     struct fid_domain **fid, void *context);
-int mlxm_ep_open(struct fid_domain *domain, struct fi_info *info,
-                 struct fid_ep **fid, void *context);
-int mlxm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
-                 struct fid_cq **cq, void *context);
-int mlxm_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
-                 struct fid_av **av, void *context);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/prov/mxm/src/mlxm_av.c b/prov/mxm/src/mlxm_av.c
deleted file mode 100644
index fe5a16f..0000000
--- a/prov/mxm/src/mlxm_av.c
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "mlxm.h"
-
-static int mlxm_av_insert(struct fid_av *av, const void *addr, size_t count,
-                          fi_addr_t *fi_addr, uint64_t flags, void *context)
-{
-        struct mlxm_fid_av *fid_av;
-        mxm_error_t    mxm_err;
-        void          *mxm_addr;
-        size_t         mxm_addrlen;
-        int            i, err;
-
-        fid_av = container_of(av, struct mlxm_fid_av, av);
-        mxm_addrlen = fid_av->domain->mxm_addrlen;
-
-        for (i = 0; i < count; ++i) {
-                mxm_addr = (void*)&((char *)addr)[i*mxm_addrlen];
-                mxm_err = mxm_ep_connect(mlxm_globals.mxm_ep, mxm_addr,
-                                         (mxm_conn_h*)&fi_addr[i]);
-                if (mxm_err != MXM_OK) {
-                        err = mlxm_errno(mxm_err);
-                        goto err_out;
-                }
-                FI_INFO(&mlxm_prov, FI_LOG_AV, "connected to %s, conn %p\n",
-                        (char*)mxm_addr+8,
-                        *((mxm_conn_h*)&fi_addr[i]));
-        }
-        return count;
-err_out:
-        return err;
-}
-
-static int mlxm_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
-                          uint64_t flags)
-{
-        mxm_error_t   mxm_err;
-        int           i;
-
-        if (mlxm_globals.mxm_ep) {
-                for (i = 0; i < count; ++i) {
-                        mxm_err = mxm_ep_disconnect(((mxm_conn_h *)fi_addr)[i]);
-                        if (mxm_err)
-                                return mlxm_errno(mxm_err);
-                        FI_INFO(&mlxm_prov, FI_LOG_AV,
-                                "disconnected from %p\n",
-                                ((mxm_conn_h *)fi_addr)[i]);
-                }
-        }
-        return 0;
-}
-
-static int mlxm_av_close(fid_t fid)
-{
-        struct mlxm_fid_av *fid_av;
-        fid_av = container_of(fid, struct mlxm_fid_av, av.fid);
-        free(fid_av);
-        return 0;
-}
-
-static int mlxm_av_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
-{
-        /* no need to bind an EQ since insert/remove is synchronous */
-        return -FI_ENOSYS;
-}
-
-static struct fi_ops mlxm_fi_ops = {
-        .size  = sizeof(struct fi_ops),
-        .close = mlxm_av_close,
-        .bind  = mlxm_av_bind,
-};
-
-static struct fi_ops_av mlxm_av_ops = {
-        .size   = sizeof(struct fi_ops_av),
-        .insert = mlxm_av_insert,
-        .remove = mlxm_av_remove,
-};
-
-int mlxm_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
-                 struct fid_av **av, void *context)
-{
-        struct mlxm_fid_domain *fid_domain;
-        struct mlxm_fid_av *fid_av;
-        int type = FI_AV_MAP;
-        size_t count = 64;
-        fid_domain = container_of(domain, struct mlxm_fid_domain, domain);
-
-        if (attr) {
-                switch (attr->type) {
-                case FI_AV_MAP:
-                        type = attr->type;
-                        break;
-                default:
-                        return -EINVAL;
-                }
-                count = attr->count;
-        }
-
-        fid_av = (struct mlxm_fid_av *) calloc(1, sizeof *fid_av);
-        if (!fid_av)
-                return -ENOMEM;
-
-        fid_av->domain  = fid_domain;
-        fid_av->type    = type;
-        fid_av->addrlen = sizeof(mxm_conn_h);
-        fid_av->count   = count;
-        fid_av->av.fid.fclass  = FI_CLASS_AV;
-        fid_av->av.fid.context = context;
-        fid_av->av.fid.ops     = &mlxm_fi_ops;
-        fid_av->av.ops         = &mlxm_av_ops;
-
-        *av = &fid_av->av;
-        return 0;
-}
diff --git a/prov/mxm/src/mlxm_cq.c b/prov/mxm/src/mlxm_cq.c
deleted file mode 100644
index 4f761b9..0000000
--- a/prov/mxm/src/mlxm_cq.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include <assert.h>
-#include "mlxm.h"
-
-static inline void
-__attribute__((always_inline))
-mlxm_cq_dequeue(struct mlxm_completion_queue *queue,
-                struct fi_context **ctx)
-{
-        *ctx = (struct fi_context*)(queue->head);
-        assert(*ctx);
-        if ((*ctx)->internal[0] == *ctx) {
-                queue->head = NULL;
-        } else {
-                queue->head = (*ctx)->internal[0];
-        }
-}
-
-static inline ssize_t
-__attribute__((always_inline))
-_mlxm_cq_readfrom(struct fid_cq *cq, void *buf, size_t len,
-                          fi_addr_t *src_addr)
-{
-        struct mlxm_fid_cq     *fid_cq;
-        struct mlxm_req        *mlxm_req;
-        mxm_send_req_t    *mxm_sreq;
-        mxm_recv_req_t    *mxm_rreq;
-        struct fi_context *ctx;
-        struct fi_cq_tagged_entry *cqe =
-                (struct fi_cq_tagged_entry *) buf;
-
-        fid_cq = container_of(cq, struct mlxm_fid_cq, cq);
-        if (fid_cq->err_q.head)
-                return -FI_EAVAIL;
-        mxm_progress(fid_cq->mxm_context);
-
-        if (!fid_cq->ok_q.head) {
-                return 0;
-        }
-
-        mlxm_cq_dequeue(&fid_cq->ok_q, &ctx);
-        mlxm_req = ctx->internal[1];
-        ctx->internal[1] = NULL;
-        cqe->flags      = 0;
-        cqe->op_context = ctx;
-
-        if ((uint64_t)(ctx->internal[3]) == FI_SEND) {
-                mxm_sreq = &mlxm_req->mxm_req.sreq;
-                assert (mxm_sreq->base.error == MXM_OK);
-                cqe->flags      |= FI_SEND;
-                cqe->len        = mxm_sreq->base.data.buffer.length;
-                cqe->data       = mxm_sreq->op.send.imm_data;
-                cqe->tag        = mxm_sreq->op.send.tag;
-                if (src_addr) {
-                        memcpy(src_addr, &(mxm_sreq->base.conn), sizeof(mxm_conn_h));
-                }
-        } else {
-                mxm_rreq = &mlxm_req->mxm_req.rreq;
-                assert(mxm_rreq->base.error == MXM_OK);
-                cqe->flags      |= FI_RECV;
-                cqe->len        = mxm_rreq->completion.actual_len;
-                cqe->data       = mxm_rreq->completion.sender_imm;
-                cqe->tag        = mxm_rreq->completion.sender_tag;
-                if (src_addr) {
-                        memcpy(src_addr, &(mxm_rreq->completion.source), sizeof(mxm_conn_h));
-                }
-        }
-        cqe->tag |= (((uint64_t)mlxm_req->mq_id) << 32);
-        MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        return 1;
-}
-
-static ssize_t mlxm_cq_readfrom(struct fid_cq *cq, void *buf, size_t len,
-                                fi_addr_t *src_addr)
-{
-        return _mlxm_cq_readfrom(cq, buf, len, src_addr);
-}
-static ssize_t mlxm_cq_read(struct fid_cq *cq, void *buf, size_t len)
-{
-        return _mlxm_cq_readfrom(cq, buf, len, NULL);
-}
-
-static int mlxm_cq_close(fid_t fid)
-{
-        struct mlxm_fid_cq   *fid_cq;
-        fid_cq = container_of(fid, struct mlxm_fid_cq, cq.fid);
-        free(fid_cq);
-        return 0;
-}
-
-static ssize_t  mlxm_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *cqe,
-                                uint64_t flags)
-{
-        struct mlxm_fid_cq              *fid_cq;
-        struct mlxm_req                 *mlxm_req;
-        mxm_send_req_t                  *mxm_sreq = NULL;
-        mxm_recv_req_t                  *mxm_rreq = NULL;
-        struct fi_context *ctx;
-        fid_cq = container_of(cq, struct mlxm_fid_cq, cq);
-        if (!fid_cq->err_q.head) {
-                return 0;
-        }
-
-        mlxm_cq_dequeue(&fid_cq->err_q, &ctx);
-        mlxm_req = ctx->internal[1];
-        ctx->internal[1] = NULL;
-        cqe->op_context = ctx;
-        cqe->flags      = FI_TAGGED;
-        cqe->buf = NULL;
-        if ((uint64_t)(ctx->internal[3]) == FI_SEND) {
-                mxm_sreq = &mlxm_req->mxm_req.sreq;
-                assert(mxm_sreq->base.error != MXM_OK);
-                cqe->prov_errno = mxm_sreq->base.error;
-                cqe->len        = mxm_sreq->base.data.buffer.length;
-                cqe->olen       = 0;
-                cqe->data       = mxm_sreq->op.send.imm_data;
-                cqe->tag        = mxm_sreq->op.send.tag;
-                cqe->flags |= FI_SEND;
-        } else {
-                mxm_rreq = &mlxm_req->mxm_req.rreq;
-                assert(mxm_rreq->base.error != MXM_OK);
-                cqe->prov_errno = mxm_sreq->base.error;
-                cqe->len        = mxm_rreq->completion.actual_len;
-                cqe->olen       = mxm_rreq->completion.sender_len -
-                        cqe->len;
-                cqe->data       = mxm_rreq->completion.sender_imm;
-                cqe->tag        = mxm_rreq->completion.sender_tag;
-                cqe->flags |= FI_RECV;
-        }
-        cqe->err = -mlxm_errno(cqe->prov_errno);
-        cqe->tag |= (((uint64_t)mlxm_req->mq_id) << 32);
-        MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        return 1;
-}
-
-
-
-static const char *mlxm_cq_strerror(struct fid_cq *cq, int prov_errno,
-                                    const void *prov_data, char *buf, size_t len)
-{
-        return mxm_error_string(prov_errno);
-}
-
-
-static int mlxm_cq_control(fid_t fid, int command, void *arg)
-{
-        return -ENOSYS;
-}
-
-static struct fi_ops mlxm_fi_ops = {
-        .size    = sizeof(struct fi_ops),
-        .close   = mlxm_cq_close,
-        .control = mlxm_cq_control,
-};
-
-static struct fi_ops_cq mlxm_cq_ops = {
-        .size     = sizeof(struct fi_ops_cq),
-        .readfrom = mlxm_cq_readfrom,
-        .read     = mlxm_cq_read,
-        .readerr  = mlxm_cq_readerr,
-        .strerror = mlxm_cq_strerror,
-};
-
-int mlxm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
-                 struct fid_cq **cq, void *context)
-{
-        struct mlxm_fid_cq   *fid_cq;
-        fid_cq = (struct mlxm_fid_cq *) calloc(1, sizeof *fid_cq);
-        if (!fid_cq)
-                return -ENOMEM;
-        fid_cq->cq.fid.fclass   = FI_CLASS_CQ;
-        fid_cq->cq.fid.context  = context;
-        fid_cq->cq.fid.ops              = &mlxm_fi_ops;
-        fid_cq->cq.ops          = &mlxm_cq_ops;
-        fid_cq->mxm_context     = mlxm_globals.mxm_context;
-        fid_cq->ok_q.head = NULL;
-        fid_cq->ok_q.tail = NULL;
-        fid_cq->err_q.head = NULL;
-        fid_cq->err_q.tail = NULL;
-
-        *cq = &fid_cq->cq;
-        return 0;
-}
diff --git a/prov/mxm/src/mlxm_domain.c b/prov/mxm/src/mlxm_domain.c
deleted file mode 100644
index edf0e1e..0000000
--- a/prov/mxm/src/mlxm_domain.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "mlxm.h"
-
-static int mlxm_domain_close(fid_t fid)
-{
-        struct mlxm_fid_domain *fid_domain;
-        fid_domain = container_of(fid,
-                                  struct mlxm_fid_domain, domain.fid);
-        free(fid_domain);
-        return 0;
-}
-
-static struct fi_ops mlxm_fi_ops = {
-        .size = sizeof(struct fi_ops),
-        .close = mlxm_domain_close,
-};
-
-static struct fi_ops_domain mlxm_domain_ops = {
-        .size = sizeof(struct fi_ops_domain),
-        .av_open = mlxm_av_open,
-        .cq_open = mlxm_cq_open,
-        .endpoint = mlxm_ep_open,
-};
-
-int mlxm_domain_open(struct fid_fabric *fabric, struct fi_info *info,
-                     struct fid_domain **domain, void *context)
-{
-        struct mlxm_fid_domain *fid_domain;
-        FI_INFO(&mlxm_prov, FI_LOG_DOMAIN, "\n");
-
-        if (!info->domain_attr->name ||
-            strncmp(info->domain_attr->name, "mxm", 3))
-                return -FI_EINVAL;
-        fid_domain = (struct mlxm_fid_domain *) calloc(1, sizeof(*fid_domain));
-        if (!fid_domain)
-                return -ENOMEM;
-        fid_domain->domain.fid.fclass  = FI_CLASS_DOMAIN;
-        fid_domain->domain.fid.context = context;
-        fid_domain->domain.fid.ops     = &mlxm_fi_ops;
-        fid_domain->domain.ops         = &mlxm_domain_ops;
-
-        fid_domain->domain.mr = &mlxm_mr_ops;
-        *domain = &fid_domain->domain;
-        return 0;
-}
diff --git a/prov/mxm/src/mlxm_ep.c b/prov/mxm/src/mlxm_ep.c
deleted file mode 100644
index c7b494c..0000000
--- a/prov/mxm/src/mlxm_ep.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "mlxm.h"
-
-static ssize_t mlxm_ep_cancel(fid_t fid, void *ctx)
-{
-        struct mlxm_fid_ep *fid_ep;
-        struct mlxm_req    *req;
-        struct fi_context  *context = (struct fi_context*)ctx;
-        int err;
-
-        fid_ep = container_of(fid, struct mlxm_fid_ep, ep.fid);
-        if (!fid_ep->domain)
-                return -EBADF;
-        if (!context)
-                return -EINVAL;
-        if (context->internal[1] == NULL)
-                return -FI_EINVAL;
-
-        req =(struct mlxm_req *)context->internal[1];
-        if (FI_RECV == (uint64_t)(context->internal[3])) {
-                err = mxm_req_cancel_recv(&req->mxm_req.rreq);
-        } else {
-                err = mxm_req_cancel_send(&req->mxm_req.sreq);
-        }
-        if (err == MXM_OK) {
-                mxm_req_wait(&req->mxm_req.rreq.base);
-        }
-        return mlxm_errno(err);
-}
-
-static int mlxm_ep_getopt(fid_t fid, int level, int optname,
-                          void *optval, size_t *optlen)
-{
-        return -ENOSYS;
-}
-
-static int mlxm_ep_setopt(fid_t fid, int level, int optname,
-                          const void *optval, size_t optlen)
-{
-        return 0;
-}
-
-static int mlxm_ep_close(fid_t fid)
-{
-        struct mlxm_fid_ep *fid_ep;
-        fid_ep = container_of(fid, struct mlxm_fid_ep, ep.fid);
-        free(fid_ep);
-        return 0;
-}
-
-static int mlxm_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
-{
-        struct mlxm_fid_ep *fid_ep;
-        int ret;
-        fid_ep = container_of(fid, struct mlxm_fid_ep, ep.fid);
-
-	ret = ofi_ep_bind_valid(&mlxm_prov, bfid, flags);
-	if (ret)
-		return ret;
-
-        switch (bfid->fclass) {
-        case FI_CLASS_CQ:
-                /* TODO: check ress flags for send/recv ECs */
-                fid_ep->cq = container_of(bfid, struct mlxm_fid_cq, cq.fid);
-                break;
-        case FI_CLASS_AV:
-                fid_ep->av = container_of(bfid, struct mlxm_fid_av, av.fid);
-                fid_ep->domain = fid_ep->av->domain;
-                fid_ep->av->ep = fid_ep;
-                break;
-        default:
-                return -ENOSYS;
-        }
-        return 0;
-}
-
-
-static int mlxm_ep_control(fid_t fid, int command, void *arg)
-{
-        switch (command) {
-        case FI_ENABLE:
-                return 0;
-        default:
-                return -FI_ENOSYS;
-        }
-}
-
-static struct fi_ops_ep mlxm_ep_ops = {
-        .size   = sizeof(struct fi_ops_ep),
-        .cancel = mlxm_ep_cancel,
-        .getopt = mlxm_ep_getopt,
-        .setopt = mlxm_ep_setopt,
-};
-
-static struct fi_ops mlxm_fi_ops = {
-        .size    = sizeof(struct fi_ops),
-        .close   = mlxm_ep_close,
-        .bind    = mlxm_ep_bind,
-        .control = mlxm_ep_control,
-};
-
-static inline
-int mlxm_check_mem_tag_format(uint64_t format) {
-        if (format == MLXM_MEM_TAG_FORMAT)
-                return 0;
-        else
-                return 1;
-}
-
-int mlxm_ep_open(struct fid_domain *domain, struct fi_info *info,
-                 struct fid_ep **fid, void *context)
-{
-        struct mlxm_fid_ep     *fid_ep;
-        struct mlxm_fid_domain *mlxm_domain;
-
-        if (mlxm_check_mem_tag_format(mlxm_mem_tag_format)) {
-                FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                        "unsupported mem_tag_format: 0x%llx, supported: 0x%llx\n",
-                        (long long unsigned)mlxm_mem_tag_format,
-                        MLXM_MEM_TAG_FORMAT);
-                return -EINVAL;
-        }
-        fid_ep = (struct mlxm_fid_ep *) calloc(1, sizeof *fid_ep);
-        if (!fid_ep)
-                return -ENOMEM;
-
-        mlxm_domain = container_of(domain, struct mlxm_fid_domain, domain);
-        fid_ep->ep.fid.fclass   = FI_CLASS_EP;
-        fid_ep->ep.fid.context  = context;
-        fid_ep->ep.fid.ops      = &mlxm_fi_ops;
-        fid_ep->ep.ops          = &mlxm_ep_ops;
-        fid_ep->ep.cm           = &mlxm_cm_ops;
-        fid_ep->ep.tagged       = &mlxm_tagged_ops;
-        fid_ep->domain          = mlxm_domain;
-
-        if (info) {
-                if (info->tx_attr)
-                        fid_ep->flags = info->tx_attr->op_flags;
-                if (info->rx_attr)
-                        fid_ep->flags |= info->rx_attr->op_flags;
-                
-                if (info->dest_addr) {
-                        /* Connected mode: store the address until bind() */
-                        /* The user passes
-                         * hints.dest_addr = <address given by mxm_ep_address()>
-                         * TODO: clarify this flow */
-                }
-        }
-        *fid = &fid_ep->ep;
-        mpool_init(&mlxm_globals.req_pool, sizeof(struct mlxm_req), 32*4);
-        fid_ep->mxm_mqs = &mlxm_globals.mq_storage;
-        return 0;
-}
diff --git a/prov/mxm/src/mlxm_helpers.h b/prov/mxm/src/mlxm_helpers.h
deleted file mode 100644
index fbea816..0000000
--- a/prov/mxm/src/mlxm_helpers.h
+++ /dev/null
@@ -1,397 +0,0 @@
-#ifndef _MLXM_HELPERS_H
-#define _MLXM_HELPERS_H
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include <assert.h>
-#include "mlxm.h"
-
-static inline void
-__attribute__((always_inline))
-mlxm_cq_enqueue(struct mlxm_completion_queue *queue,
-                struct fi_context *ctx)
-{
-        if (queue->head == NULL) {
-                queue->head = ctx->internal[0];
-                queue->tail = ctx->internal[0];
-        } else {
-                ((struct fi_context *)(queue->tail))->internal[0] =
-                        ctx;
-                queue->tail = ctx;
-        }
-}
-
-static void mlxm_completion_cb(void *context)
-{
-        struct fi_context  *ctx      = (struct fi_context *)context;
-        struct mlxm_req    *mlxm_req = (struct mlxm_req*)ctx->internal[1];
-        struct mlxm_fid_cq *fid_cq   =
-                (struct mlxm_fid_cq *) ctx->internal[2];
-        int err =
-                ((mxm_req_base_t*)&mlxm_req->mxm_req)->error;
-
-        if (err == MXM_OK) {
-                mlxm_cq_enqueue(&fid_cq->ok_q, ctx);
-        } else if (err == MXM_ERR_CANCELED) {
-                MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        } else {
-                mlxm_cq_enqueue(&fid_cq->err_q, ctx);
-        }
-}
-
-static void mlxm_completion_cb_v(void *context)
-{
-        struct fi_context  *ctx      = (struct fi_context *)context;
-        struct mlxm_fid_cq *fid_cq   =
-                (struct mlxm_fid_cq *) ctx->internal[2];
-        struct mlxm_req    *mlxm_req = (struct mlxm_req*)ctx->internal[1];
-        int err;
-
-        free(((mxm_req_base_t*)&mlxm_req->mxm_req)->data.iov.vector);
-        err = ((mxm_req_base_t*)&mlxm_req->mxm_req)->error;
-        if (err == MXM_OK) {
-                mlxm_cq_enqueue(&fid_cq->ok_q, ctx);
-        } else if (err == MXM_ERR_CANCELED) {
-                ctx->internal[1] = NULL;
-                MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        } else {
-                mlxm_cq_enqueue(&fid_cq->err_q, ctx);
-        }
-}
-
-static inline int _mlxm_do_send(struct mlxm_fid_ep *fid_ep, mxm_mq_h mq,
-                                int mq_id,
-                                const void *buf, size_t len,
-                                mxm_conn_h conn, uint32_t mxm_tag,
-                                void *context, uint32_t data,
-                                const int is_blocking)
-{
-        struct mlxm_fid_cq  *fid_cq;
-        struct mlxm_req     *mlxm_req = NULL;
-        mxm_send_req_t      *mxm_req = NULL;
-        mxm_error_t          mxm_err;
-        int                  err;
-        mxm_send_req_t       stack_req;
-        assert(fid_ep->domain);
-        fid_cq = fid_ep->cq;
-
-        if (!is_blocking) {
-                MPOOL_ALLOC(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-                if (!mlxm_req)
-                        return -ENOMEM;
-                mlxm_req->mq_id         = mq_id;
-                mlxm_req->pool = mlxm_globals.req_pool;
-                mxm_req = &mlxm_req->mxm_req.sreq;
-        } else {
-                mxm_req = &stack_req;
-        }
-        mxm_req->base.state                     = MXM_REQ_NEW;
-        mxm_req->base.mq                        = mq;
-        mxm_req->base.conn                      = conn;
-        mxm_req->flags                          =
-                is_blocking ? MXM_REQ_SEND_FLAG_BLOCKING : 0;
-        mxm_req->base.data_type                 = MXM_REQ_DATA_BUFFER;
-        mxm_req->base.data.buffer.ptr           = (void *)buf;
-        mxm_req->base.data.buffer.length        = len;
-        mxm_req->base.data.buffer.memh          = MXM_INVALID_MEM_HANDLE;
-        mxm_req->opcode                         = MXM_REQ_OP_SEND;
-        mxm_req->op.send.tag                    = mxm_tag;
-        mxm_req->op.send.imm_data               = (mxm_imm_t) data;
-
-        if (is_blocking) {
-                mxm_req->base.completed_cb      = NULL;
-                mxm_req->base.context           = NULL;
-        } else {
-                mxm_req->base.completed_cb      = mlxm_completion_cb;
-                mxm_req->base.context           = (void *)context;
-                ((struct fi_context *)context)->internal[0] = context;
-                ((struct fi_context *)context)->internal[1] = mlxm_req;
-                ((struct fi_context *)context)->internal[2] = fid_cq;
-                ((struct fi_context *)context)->internal[3] = (void*)FI_SEND;
-        }
-        FI_DBG(&mlxm_prov,FI_LOG_CORE,
-               "sendto mq 0x%x, conn %p, buf %p,"
-               "len %zd, tag 0x%x, imm 0x%x\n",
-               mq_id, mxm_req->base.conn, buf, len,
-               mxm_req->op.send.tag, mxm_req->op.send.imm_data);
-        mxm_err = mxm_req_send(mxm_req);
-        if (mxm_err != MXM_OK) {
-                err = mlxm_errno(mxm_err);
-                goto err_out_destroy_req;
-        }
-
-        if (is_blocking)  {
-                mxm_req_wait(&mxm_req->base);
-                return 0;
-        }
-        return 0;
-err_out_destroy_req:
-        if (!is_blocking)
-                MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        return err;
-}
-
-static int _mlxm_do_recv(struct mlxm_fid_ep *fid_ep, void *buf, size_t len,
-                         mxm_mq_h mq, int mq_id, mxm_conn_h conn,
-                         uint32_t mxm_tag,
-                         uint32_t mxm_tagmask, void *context)
-{
-        struct mlxm_fid_cq  *fid_cq;
-        struct mlxm_req     *mlxm_req = NULL;
-        mxm_recv_req_t      *mxm_req = NULL;
-        mxm_error_t          mxm_err;
-        int                  err;
-        fid_cq = fid_ep->cq;
-        MPOOL_ALLOC(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        if (!mlxm_req)
-                return -ENOMEM;
-
-        mlxm_req->mq_id         = mq_id;
-        mxm_req = &mlxm_req->mxm_req.rreq;
-        mxm_req->base.state                     = MXM_REQ_NEW;
-        mxm_req->base.mq                        = mq;
-        mxm_req->base.conn                      = conn;
-        mxm_req->base.data_type                 = MXM_REQ_DATA_BUFFER;
-        mxm_req->base.data.buffer.ptr           = buf;
-        mxm_req->base.data.buffer.length        = len;
-        mxm_req->base.data.buffer.memh          = MXM_INVALID_MEM_HANDLE;
-        mxm_req->base.completed_cb              = mlxm_completion_cb;
-        mxm_req->base.context           = (void *)context;
-        ((struct fi_context *)context)->internal[0] = context;
-        ((struct fi_context *)context)->internal[1] = mlxm_req;
-        ((struct fi_context *)context)->internal[2] = fid_cq;
-        ((struct fi_context *)context)->internal[3] = (void*)FI_RECV;
-        mxm_req->tag                            = mxm_tag;
-        mxm_req->tag_mask                       = mxm_tagmask;
-        FI_DBG(&mlxm_prov,FI_LOG_CORE,
-               "recv mq 0x%x, conn %p, buf %p,"
-               "len %zd, tag 0x%x, tagmask 0x%x\n",
-               mq_id, mxm_req->base.conn, buf, len,
-               mxm_req->tag, mxm_req->tag_mask);
-        mxm_err = mxm_req_recv(mxm_req);
-
-        if (mxm_err != MXM_OK) {
-                err = mlxm_errno(mxm_err);
-                goto err_out_destroy_req;
-        }
-        assert(mxm_req->base.state != MXM_REQ_NEW);
-        return 0;
-err_out_destroy_req:
-        if (mlxm_req)
-                MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        return err;
-}
-
-
-static inline int _mlxm_do_send_v(struct mlxm_fid_ep *fid_ep, mxm_mq_h mq,
-                                  int mq_id,
-                                  const int iov_num,
-                                  const struct iovec * iov,
-                                  mxm_conn_h conn, uint32_t mxm_tag,
-                                  void *context, uint32_t data,
-                                  const int is_blocking)
-{
-        struct mlxm_fid_cq  *fid_cq;
-        struct mlxm_req     *mlxm_req = NULL;
-        mxm_send_req_t      *mxm_req = NULL;
-        mxm_error_t          mxm_err;
-        int                  err;
-        mxm_send_req_t       stack_req;
-        int i;
-        assert(fid_ep->domain);
-        fid_cq = fid_ep->cq;
-        if (!is_blocking) {
-                MPOOL_ALLOC(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-                if (!mlxm_req)
-                        return -ENOMEM;
-                mlxm_req->mq_id         = mq_id;
-                mlxm_req->pool = mlxm_globals.req_pool;
-                mxm_req = &mlxm_req->mxm_req.sreq;
-        } else {
-                mxm_req = &stack_req;
-        }
-        mxm_req->base.state                     = MXM_REQ_NEW;
-        mxm_req->base.mq                        = mq;
-        mxm_req->base.conn                      = conn;
-        mxm_req->flags                          =
-                is_blocking ? MXM_REQ_SEND_FLAG_BLOCKING : 0;
-        mxm_req->base.data_type                 = MXM_REQ_DATA_IOV;
-        mxm_req->base.data.iov.count = iov_num;
-        mxm_req->base.data.iov.vector =
-                (mxm_req_buffer_t*)malloc(iov_num*sizeof(mxm_req_buffer_t));
-
-        for (i=0; i<iov_num; i++) {
-                mxm_req->base.data.iov.vector[i].ptr =
-                        iov[i].iov_base;
-                mxm_req->base.data.iov.vector[i].length =
-                        iov[i].iov_len;
-                mxm_req->base.data.iov.vector[i].memh =
-                        MXM_INVALID_MEM_HANDLE;
-        }
-        mxm_req->opcode                         = MXM_REQ_OP_SEND;
-        mxm_req->op.send.tag                    = mxm_tag;
-        mxm_req->op.send.imm_data               = (mxm_imm_t) data;
-
-        if (is_blocking) {
-                mxm_req->base.completed_cb      = NULL;
-                mxm_req->base.context           = NULL;
-        } else {
-                mxm_req->base.completed_cb      = mlxm_completion_cb_v;
-                mxm_req->base.context           = (void *)context;
-                ((struct fi_context *)context)->internal[0] = context;
-                ((struct fi_context *)context)->internal[1] = mlxm_req;
-                ((struct fi_context *)context)->internal[2] = fid_cq;
-                ((struct fi_context *)context)->internal[3] = (void*)FI_SEND;
-        }
-        FI_DBG(&mlxm_prov,FI_LOG_CORE,
-               "sendto mq 0x%x, conn %p, iov_count %d,"
-               "tag 0x%x, imm 0x%x\n",
-               mq_id, mxm_req->base.conn, iov_num,
-               mxm_req->op.send.tag, mxm_req->op.send.imm_data);
-
-        mxm_err = mxm_req_send(mxm_req);
-        if (mxm_err != MXM_OK) {
-                err = mlxm_errno(mxm_err);
-                goto err_out_destroy_req;
-        }
-
-        if (is_blocking)  {
-                mxm_req_wait(&mxm_req->base);
-                return 0;
-        }
-        return 0;
-err_out_destroy_req:
-        if (!is_blocking)
-                MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        return err;
-}
-
-static int _mlxm_do_recv_v(struct mlxm_fid_ep *fid_ep, const int iov_num,
-                           const struct iovec *iov,
-                           mxm_mq_h mq, int mq_id, mxm_conn_h conn,
-                           uint32_t mxm_tag,
-                           uint32_t mxm_tagmask, void *context)
-{
-        struct mlxm_fid_cq  *fid_cq;
-        struct mlxm_req     *mlxm_req = NULL;
-        mxm_recv_req_t      *mxm_req = NULL;
-        mxm_error_t          mxm_err;
-        int                  err, i;
-
-        fid_cq = fid_ep->cq;
-        MPOOL_ALLOC(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        if (!mlxm_req)
-                return -ENOMEM;
-
-        mlxm_req->mq_id         = mq_id;
-        mxm_req = &mlxm_req->mxm_req.rreq;
-        mxm_req->base.state                     = MXM_REQ_NEW;
-        mxm_req->base.mq                        = mq;
-        mxm_req->base.conn                      = conn;
-        mxm_req->base.data_type                 = MXM_REQ_DATA_IOV;
-        mxm_req->base.data.iov.count = iov_num;
-        mxm_req->base.data.iov.vector =
-                (mxm_req_buffer_t*)malloc(iov_num*sizeof(mxm_req_buffer_t));
-
-        for (i=0; i<iov_num; i++) {
-                mxm_req->base.data.iov.vector[i].ptr =
-                        iov[i].iov_base;
-                mxm_req->base.data.iov.vector[i].length =
-                        iov[i].iov_len;
-                mxm_req->base.data.iov.vector[i].memh =
-                        MXM_INVALID_MEM_HANDLE;
-        }
-        mxm_req->base.completed_cb              = mlxm_completion_cb_v;
-        mxm_req->base.context           = (void *)context;
-        ((struct fi_context *)context)->internal[0] = context;
-        ((struct fi_context *)context)->internal[1] = mlxm_req;
-        ((struct fi_context *)context)->internal[2] = fid_cq;
-        ((struct fi_context *)context)->internal[3] = (void*)FI_RECV;
-        mxm_req->tag                            = mxm_tag;
-        mxm_req->tag_mask                       = mxm_tagmask;
-        FI_DBG(&mlxm_prov,FI_LOG_CORE,
-               "recv mq 0x%x, conn %p, iov_num %d,"
-               "tag 0x%x, tagmask 0x%x\n",
-               mq_id, mxm_req->base.conn, iov_num,
-               mxm_req->tag, mxm_req->tag_mask);
-
-        mxm_err = mxm_req_recv(mxm_req);
-        if (mxm_err != MXM_OK) {
-                err = mlxm_errno(mxm_err);
-                goto err_out_destroy_req;
-        }
-        assert(mxm_req->base.state != MXM_REQ_NEW);
-        return 0;
-err_out_destroy_req:
-        if (mlxm_req)
-                MPOOL_RETURN(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        return err;
-}
-
-static ssize_t
-_mlxm_do_probe(struct mlxm_fid_ep *fid_ep, mxm_mq_h mq,
-               int mq_id, mxm_conn_h conn,
-               uint32_t mxm_tag, uint32_t mxm_tagmask,
-               void *context)
-{
-        mxm_error_t        mxm_err;
-        struct mlxm_req   *mlxm_req = NULL;
-        mxm_recv_req_t    *mxm_req = NULL;
-        MPOOL_ALLOC(mlxm_globals.req_pool, struct mlxm_req, mlxm_req);
-        if (!mlxm_req)
-                return -ENOMEM;
-
-        mlxm_req->mq_id         = mq_id;
-        mxm_req = &mlxm_req->mxm_req.rreq;
-        mxm_req->base.state                     = MXM_REQ_NEW;
-        mxm_req->base.mq                        = mq;
-        mxm_req->base.conn                      = conn;
-        mxm_req->base.context           = (void *)context;
-        ((struct fi_context *)context)->internal[0] = context;
-        ((struct fi_context *)context)->internal[1] = mlxm_req;
-        ((struct fi_context *)context)->internal[2] = fid_ep->cq;
-        ((struct fi_context *)context)->internal[3] = (void*)FI_RECV;
-        mxm_req->tag                            = mxm_tag;
-        mxm_req->tag_mask                       = mxm_tagmask;
-        mxm_err = mxm_req_probe(mxm_req);
-        switch (mxm_err) {
-        case MXM_OK:
-                mlxm_completion_cb((void*)context);
-                return 0;
-        case MXM_ERR_NO_MESSAGE:
-                return -FI_ENOMSG;
-        default:
-                return mlxm_errno(mxm_err);
-        }
-}
-#endif
-
-
diff --git a/prov/mxm/src/mlxm_init.c b/prov/mxm/src/mlxm_init.c
deleted file mode 100644
index 75904a7..0000000
--- a/prov/mxm/src/mlxm_init.c
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include <errno.h>
-#include "mlxm.h"
-#include "fi.h"
-#include "prov.h"
-#include "mlxm_mq_storage.h"
-
-#define MLXM_EP_CAP_BASE (FI_TAGGED | FI_SEND | FI_RECV)
-#define MLXM_EP_CAP     (MLXM_EP_CAP_BASE)
-uint64_t mlxm_mem_tag_format;
-struct mlxm_globals mlxm_globals = {0,0};
-int mlxm_errno_table[MXM_ERR_LAST];
-static int mlxm_init_errcodes() {
-        mlxm_errno_table[MXM_OK]                        = 0;
-        mlxm_errno_table[MXM_ERR_NO_MESSAGE]            = -FI_ENOMSG;
-        mlxm_errno_table[MXM_ERR_WOULD_BLOCK]           = -EWOULDBLOCK;
-        mlxm_errno_table[MXM_ERR_IO_ERROR]              = -FI_EIO;
-        mlxm_errno_table[MXM_ERR_NO_MEMORY]             = -FI_ENOMEM;
-        mlxm_errno_table[MXM_ERR_INVALID_PARAM]         = -FI_EINVAL;
-        mlxm_errno_table[MXM_ERR_UNREACHABLE]           = -FI_ENETUNREACH;
-        mlxm_errno_table[MXM_ERR_INVALID_ADDR]          = -FI_EINVAL;
-        mlxm_errno_table[MXM_ERR_NOT_IMPLEMENTED]       = -FI_ENOSYS;
-        mlxm_errno_table[MXM_ERR_MESSAGE_TRUNCATED]     = -FI_EMSGSIZE;
-        mlxm_errno_table[MXM_ERR_NO_PROGRESS]           = 0;
-        mlxm_errno_table[MXM_ERR_BUFFER_TOO_SMALL]      = -FI_ETOOSMALL;
-        mlxm_errno_table[MXM_ERR_NO_ELEM]               = -FI_ENOENT;
-        mlxm_errno_table[MXM_ERR_SOME_CONNECTS_FAILED]  = -FI_EIO;
-        mlxm_errno_table[MXM_ERR_NO_DEVICE]             = -FI_ENODEV;
-        mlxm_errno_table[MXM_ERR_BUSY]                  = -FI_EBUSY;
-        mlxm_errno_table[MXM_ERR_CANCELED]              = -FI_ECANCELED;
-        mlxm_errno_table[MXM_ERR_SHMEM_SEGMENT]         = -FI_EINVAL;
-        mlxm_errno_table[MXM_ERR_ALREADY_EXISTS]        = -EEXIST;
-        mlxm_errno_table[MXM_ERR_OUT_OF_RANGE]          = -FI_EINVAL;
-        mlxm_errno_table[MXM_ERR_TIMED_OUT]             = -FI_ETIMEDOUT;
-        return 0;
-}
-static int mlxm_getinfo(uint32_t version, const char *node,
-                        const char *service, uint64_t flags,
-                        struct fi_info *hints, struct fi_info **info)
-{
-        struct fi_info  *mlxm_info;
-        int type = FI_EP_RDM;
-        int ep_cap = 0;
-        int err = -ENODATA;
-        mlxm_mem_tag_format = MLXM_MEM_TAG_FORMAT;
-        FI_INFO(&mlxm_prov, FI_LOG_CORE,"\n");
-
-        *info = NULL;
-        if (node) {
-                FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                        "fi_getinfo with \"node != NULL \" is not supported\n");
-                /* TODO: clarify "node" parameter usage */
-                goto err_out;
-        }
-
-        if (hints) {
-                if (hints->ep_attr) {
-                        switch (hints->ep_attr->type) {
-                        case FI_EP_UNSPEC:
-                        case FI_EP_RDM:
-                                break;
-                        default:
-                                FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                                        "unsupported ep type required: %d\n",
-                                        (int)hints->ep_attr->type);
-                                goto err_out;
-                        }
-                        if (hints->ep_attr) {
-                                switch (hints->ep_attr->protocol) {
-                                case FI_PROTO_UNSPEC:
-                                case FI_PROTO_MXM:
-                                        break;
-                                default:
-                                        FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                                                "unsupported ep protoclo required:\n hints->protocol=%d, supported=%d %d \n",
-                                                hints->ep_attr->protocol,
-                                                FI_PROTO_UNSPEC, FI_PROTO_MXM);
-                                        goto err_out;
-
-                                }
-                                mlxm_mem_tag_format = hints->ep_attr->mem_tag_format > 0 ?
-                                        hints->ep_attr->mem_tag_format :
-                                        MLXM_MEM_TAG_FORMAT;
-
-                                if (hints->ep_attr->tx_ctx_cnt > 1) {
-                                        FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                                                "hints->ep_attr->tx_ctx_cnt=%d, supported=0,1\n",
-                                                hints->ep_attr->tx_ctx_cnt);
-                                        goto err_out;
-                                }
-                                if (hints->ep_attr->rx_ctx_cnt > 1) {
-                                        FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                                                "hints->ep_attr->rx_ctx_cnt=%d, supported=0,1\n",
-                                                hints->ep_attr->rx_ctx_cnt);
-                                        goto err_out;
-                                }
-                        }
-                }
-                if (hints->tx_attr &&
-                    (hints->tx_attr->op_flags & MLXM_SUPPORTED_FLAGS) !=
-                    hints->tx_attr->op_flags) {
-                        FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                                "unsupported tx_attr->flags required: 0x%llx, supported: 0x%llx\n",
-                                (long long unsigned)hints->tx_attr->op_flags, MLXM_SUPPORTED_FLAGS);
-                        goto err_out;
-
-                }
-                if (hints->rx_attr &&
-                    (hints->rx_attr->op_flags & MLXM_SUPPORTED_FLAGS) !=
-                    hints->rx_attr->op_flags) {
-                        FI_WARN(&mlxm_prov, FI_LOG_CORE,
-                                "unsupported rx_attr->flags required: 0x%llx, supported: 0x%llx\n",
-                                (long long unsigned)hints->rx_attr->op_flags, MLXM_SUPPORTED_FLAGS);
-                        goto err_out;
-
-                }
-                if (hints->domain_attr &&
-                    hints->domain_attr->name &&
-                    strncmp(hints->domain_attr->name, "mxm", 3)) {
-                        FI_WARN(&mlxm_prov, FI_LOG_CORE, "incorrect domain name: %s, correct: mxm\n",
-                                hints->domain_attr->name);
-                        goto err_out;
-                }
-                if ((hints->caps & MLXM_EP_CAP) != hints->caps) {
-                        FI_WARN(&mlxm_prov, FI_LOG_CORE, "unsupported ep caps: 0x%llx, supported: 0x%llx\n",
-                                (long long unsigned)hints->caps, MLXM_EP_CAP);
-                        goto err_out;
-
-                }
-                if ((hints->mode & FI_CONTEXT) != FI_CONTEXT) {
-                        FI_INFO(&mlxm_prov, FI_LOG_CORE,
-                                "hints->mode=0x%llx, required=0x%llx\n",
-                                hints->mode, FI_CONTEXT);
-                        goto err_out;
-                }
-                ep_cap = hints->caps;
-        }
-        mlxm_info = fi_allocinfo();
-        if (!mlxm_info)
-                return -ENOMEM;
-
-        mlxm_info->ep_attr->protocol             = FI_PROTO_MXM;
-        mlxm_info->ep_attr->max_msg_size         = 0xFFFFFFFF;
-        mlxm_info->ep_attr->mem_tag_format       = mlxm_mem_tag_format;
-        mlxm_info->ep_attr->type                 = type;
-        mlxm_info->ep_attr->tx_ctx_cnt           = 1;
-        mlxm_info->ep_attr->rx_ctx_cnt           = 1;
-        mlxm_info->domain_attr->threading        = FI_THREAD_UNSPEC;
-        mlxm_info->domain_attr->control_progress = FI_PROGRESS_MANUAL;
-        mlxm_info->domain_attr->data_progress    = FI_PROGRESS_MANUAL;
-        mlxm_info->domain_attr->name             = strdup("mxm");
-        mlxm_info->next                          = NULL;
-        mlxm_info->caps                          = (hints && hints->caps) ? hints->caps : ep_cap;
-        mlxm_info->mode                          = FI_CONTEXT;
-        mlxm_info->addr_format                   = FI_FORMAT_UNSPEC;
-        mlxm_info->src_addrlen                   = 0;
-        mlxm_info->dest_addrlen                  = 0;
-        mlxm_info->src_addr                      = NULL;
-        mlxm_info->dest_addr                     = NULL;
-        mlxm_info->fabric_attr->name             = strdup("mxm");
-        mlxm_info->fabric_attr->prov_name        = strdup("mxm");
-        mlxm_info->tx_attr->op_flags             = (hints && hints->tx_attr && hints->tx_attr->op_flags) ? hints->tx_attr->op_flags : 0;
-        mlxm_info->tx_attr->caps                 = mlxm_info->caps;
-        mlxm_info->tx_attr->mode                 = mlxm_info->mode;
-        mlxm_info->tx_attr->msg_order            = FI_ORDER_SAS;
-        mlxm_info->tx_attr->comp_order           = FI_ORDER_NONE;
-        mlxm_info->tx_attr->inject_size          = 32; /* imm data ? */
-        mlxm_info->tx_attr->size                 = UINT64_MAX;
-        mlxm_info->tx_attr->iov_limit            = 1; /* TODO : mxm supports any*/
-        mlxm_info->rx_attr->op_flags             = (hints && hints->rx_attr && hints->rx_attr->op_flags) ? hints->rx_attr->op_flags : 0;
-        mlxm_info->rx_attr->caps                 = mlxm_info->caps;
-        mlxm_info->rx_attr->mode                 = mlxm_info->mode;
-        mlxm_info->rx_attr->msg_order            = FI_ORDER_SAS;
-        mlxm_info->rx_attr->comp_order           = FI_ORDER_NONE;
-        mlxm_info->rx_attr->total_buffered_recv  = ~(0ULL); /*TODO: clarify  */
-        mlxm_info->rx_attr->size = UINT64_MAX;
-        mlxm_info->rx_attr->iov_limit = 1; /*TODO */
-        *info = mlxm_info;
-        return 0;
-err_out:
-        return err;
-}
-
-static int mlxm_fabric_close(fid_t fid)
-{
-        mlxm_mq_storage_fini();
-        mxm_ep_powerdown(mlxm_globals.mxm_ep);
-        mxm_ep_destroy(mlxm_globals.mxm_ep);
-        mxm_cleanup(mlxm_globals.mxm_context);
-        free(fid);
-        return 0;
-}
-
-static struct fi_ops mlxm_fabric_fi_ops = {
-        .size  = sizeof(struct fi_ops),
-        .close = mlxm_fabric_close    ,
-        .bind     = fi_no_bind           ,
-        .control  = fi_no_control        ,
-        .ops_open = fi_no_ops_open       ,
-};
-
-static struct fi_ops_fabric mlxm_fabric_ops = {
-        .size   = sizeof(struct fi_ops_fabric),
-        .domain = mlxm_domain_open            ,
-        .passive_ep = fi_no_passive_ep            ,
-        .eq_open    = fi_no_eq_open               ,
-        .wait_open  = fi_no_wait_open             ,
-	.trywait = fi_no_trywait
-};
-
-static int mlxm_fabric(struct fi_fabric_attr *attr,
-                       struct fid_fabric **fabric, void *context)
-{
-        struct mlxm_fid_fabric *fabric_priv;
-        FI_INFO(&mlxm_prov, FI_LOG_CORE, "\n");
-        if (strncmp(attr->name, "mxm", 3))
-                return -FI_ENODATA;
-
-        fabric_priv = calloc(1, sizeof(*fabric_priv));
-        if (!fabric_priv)
-                return -FI_ENOMEM;
-        fabric_priv->fabric.fid.fclass  = FI_CLASS_FABRIC;
-        fabric_priv->fabric.fid.context = context;
-        fabric_priv->fabric.fid.ops     = &mlxm_fabric_fi_ops;
-        fabric_priv->fabric.ops         = &mlxm_fabric_ops;
-        *fabric                         = &fabric_priv->fabric;
-        return 0;
-}
-
-struct fi_provider mlxm_prov = {
-        .name    = "mxm"          ,
-        .getinfo = mlxm_getinfo   ,
-        .version = FI_VERSION(0, 2),
-        .fi_version = FI_VERSION(FI_MAJOR_VERSION,FI_MINOR_VERSION),
-        .fabric  = mlxm_fabric    ,
-};
-
-MXM_INI
-{
-        mxm_context_opts_t *context_opts;
-        mxm_ep_opts_t      *ep_opts;
-        mxm_error_t        mxm_err;
-
-        mlxm_init_errcodes();
-        mxm_err = mxm_config_read_opts(&context_opts, &ep_opts, NULL, NULL, 0);
-        if (mxm_err != MXM_OK) {
-                FI_WARN(&mlxm_prov, FI_LOG_DOMAIN,
-                        "mxm_config_read_opts returns %d, errno %d\n",
-                        mxm_err, errno);
-                goto err_out_free_config;
-        }
-#if 0
-        /* Helps to suppress MXM Warnings*/
-        extern struct mxm_global_opts mxm_global_opts;
-        mxm_global_opts.log_level = MXM_LOG_LEVEL_FATAL;
-#endif
-        mxm_err = mxm_init(context_opts, &mlxm_globals.mxm_context);
-        if (mxm_err != MXM_OK) {
-                FI_WARN(&mlxm_prov,FI_LOG_DOMAIN,
-                        "mxm_init returns %d, errno %d\n",
-                        mxm_err, errno);
-
-                goto err_out_free_config;
-        }
-        FI_TRACE(&mlxm_prov, FI_LOG_DOMAIN,
-                 "MXM context initialized, %p\n",
-                 (void*)mlxm_globals.mxm_context);
-
-        mxm_err = mxm_ep_create(mlxm_globals.mxm_context,
-                                ep_opts, &mlxm_globals.mxm_ep);
-        if (mxm_err != MXM_OK) {
-                FI_WARN(&mlxm_prov, FI_LOG_DOMAIN,
-                        "mxm_ep_create returns %d, errno %d\n",
-                        mxm_err, errno);
-
-                goto err_out_cleanup_context;
-        }
-        FI_TRACE(&mlxm_prov,FI_LOG_DOMAIN,
-                 "MXM endpoint created, %p\n",
-                 (void*)mlxm_globals.mxm_ep);
-
-        mxm_config_free_ep_opts(ep_opts);
-        mxm_config_free_context_opts(context_opts);
-        mlxm_mq_storage_init();
-        FI_TRACE(&mlxm_prov,FI_LOG_DOMAIN,
-                 "MLXM MQ storage initialized\n");
-
-        return &mlxm_prov;
-err_out_cleanup_context:
-        mxm_cleanup(mlxm_globals.mxm_context);
-err_out_free_config:
-        mxm_config_free_context_opts(context_opts);
-        mxm_config_free_ep_opts(ep_opts);
-        return NULL;
-}
-
diff --git a/prov/mxm/src/mlxm_mq_storage.h b/prov/mxm/src/mlxm_mq_storage.h
deleted file mode 100644
index 3e17767..0000000
--- a/prov/mxm/src/mlxm_mq_storage.h
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef _MLXM_MQ_STORAGE_H
-#define _MLXM_MQ_STORAGE_H
-#include "mlxm.h"
-
-static inline
-int mlxm_find_mq(struct mlxm_mq_storage *storage,
-                 uint16_t id, mxm_mq_h *mq) {
-        struct mlxm_mq_entry *mq_e = NULL;
-        HASH_FIND(hh, storage->hash, &id, sizeof(uint16_t), mq_e);
-        if (mq_e) {
-                *mq = mq_e->mq;
-                return 1;
-        } else {
-                return 0;
-        }
-};
-
-static inline
-int mlxm_mq_add_to_storage(struct mlxm_mq_storage *storage,
-                           uint16_t id, mxm_mq_h *mq) {
-        int mxm_err;
-        struct mlxm_mq_entry *mq_entry;
-        mq_entry = (struct mlxm_mq_entry*)malloc(sizeof(*mq_entry));
-        mxm_err = mxm_mq_create(mlxm_globals.mxm_context,
-                                id,
-                                &mq_entry->mq);
-        if (mxm_err) {
-                FI_WARN(&mlxm_prov,FI_LOG_CORE,
-                        "mxm_mq_create failed: mq_id %d, errno %d:%s\n",
-                        id, mxm_err, mxm_error_string(mxm_err));
-                return mlxm_errno(mxm_err);
-        }
-        FI_INFO(&mlxm_prov,FI_LOG_CORE,
-                "MXM mq created, id 0x%x, %p\n",id , mq_entry->mq);
-
-        mq_entry->mq_key = id;
-        HASH_ADD(hh, storage->hash, mq_key, sizeof(uint16_t), mq_entry);
-        *mq = mq_entry->mq;
-        return 0;
-};
-
-static inline
-void mlxm_mq_storage_init() {
-        mlxm_globals.mq_storage.hash = NULL;
-}
-
-static inline
-void mlxm_mq_storage_fini() {
-        struct mlxm_mq_entry *mq_e, *tmp;
-        HASH_ITER(hh, mlxm_globals.mq_storage.hash, mq_e, tmp) {
-                mxm_mq_destroy(mq_e->mq);
-                HASH_DEL(mlxm_globals.mq_storage.hash,
-                         mq_e);
-                free(mq_e);
-        }
-}
-
-#endif
diff --git a/prov/mxm/src/mlxm_mr.c b/prov/mxm/src/mlxm_mr.c
deleted file mode 100644
index 102ea03..0000000
--- a/prov/mxm/src/mlxm_mr.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include "mlxm.h"
-
-static int mlxm_mr_reg(struct fid *domain, const void *buf, size_t len,
-                       uint64_t access, uint64_t offset, uint64_t requested_key,
-                       uint64_t flags, struct fid_mr **mr, void *context) {
-        struct mlxm_fid_domain *domain_priv;
-        struct mlxm_fid_mr     *mr_priv = NULL;
-        uint64_t key;
-        int      err;
-        domain_priv = container_of(domain, struct mlxm_fid_domain, domain);
-
-        mr_priv = (struct mlxm_fid_mr *)
-                calloc(1, sizeof(*mr_priv) + sizeof(struct iovec));
-        if (!mr_priv)
-                return -ENOMEM;
-        mr_priv->mr.fid.fclass = FI_CLASS_MR;
-        mr_priv->mr.fid.context = context;
-        mr_priv->mr.mem_desc = mr_priv;
-        key = (uint64_t)(uintptr_t)mr_priv;
-        mr_priv->mr.key = key;
-        mr_priv->domain = domain_priv;
-        mr_priv->iov_count = 1;
-        mr_priv->iov[0].iov_base = (void *)buf;
-        mr_priv->iov[0].iov_len = len;
-        err = mxm_mem_get_key(mlxm_globals.mxm_context, (void*)buf,
-                              &mr_priv->mxm_key);
-        if (MXM_OK != err) {
-                FI_WARN(&mlxm_prov,FI_LOG_MR,
-                        "Failed to get memory key: %s", mxm_error_string(err));
-                goto error_out;
-        }
-        *mr = &mr_priv->mr;
-        return 0;
-error_out:
-        if (mr_priv)
-                free(mr_priv);
-        return FI_ENOKEY;
-}
-
-struct fi_ops_mr mlxm_mr_ops = {
-        .size = sizeof(struct fi_ops_mr),
-        .reg = mlxm_mr_reg,
-        .regv = fi_no_mr_regv,
-        .regattr = fi_no_mr_regattr,
-};
diff --git a/prov/mxm/src/mlxm_tagged.c b/prov/mxm/src/mlxm_tagged.c
deleted file mode 100644
index c438c42..0000000
--- a/prov/mxm/src/mlxm_tagged.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#include <assert.h>
-#include "mlxm.h"
-#include "mlxm_helpers.h"
-#include "mlxm_mq_storage.h"
-#define GET_MQ_ID(_tag, _mq_id)  do{                                    \
-                (_mq_id) =  (( (_tag) & MLXM_MEM_TAG_FORMAT) >> 32);    \
-        }while(0)
-#define GET_32BIT_TAG(_tag, _tag32) do{                                 \
-                (_tag32) = (uint32_t)(_tag & (~MLXM_MEM_TAG_FORMAT));   \
-        }while(0)
-
-static inline ssize_t _mlxm_tagged_recvfrom(struct fid_ep *ep, void *buf, size_t len,
-                                            void *desc, fi_addr_t src_addr, uint64_t tag,
-                                            uint64_t ignore, void *context, uint64_t flags)
-{
-        struct mlxm_fid_ep *fid_ep;
-        mxm_mq_h       mq = NULL;
-        uint32_t mxm_tag;
-        uint32_t mxm_tagmask;
-        uint16_t mq_id = 0;
-        mxm_conn_h conn = (FI_ADDR_UNSPEC == src_addr) ?
-                NULL : (mxm_conn_h)src_addr;
-
-        fid_ep = container_of(ep, struct mlxm_fid_ep, ep);
-        assert(fid_ep->domain);
-
-        GET_MQ_ID(tag, mq_id);
-        GET_32BIT_TAG(tag, mxm_tag);
-        GET_32BIT_TAG((~ignore), mxm_tagmask);
-        if(!mlxm_find_mq(fid_ep->mxm_mqs, mq_id, &mq)) {
-                mlxm_mq_add_to_storage(fid_ep->mxm_mqs, mq_id, &mq);
-        }
-        return _mlxm_do_recv(fid_ep, buf, len, mq,
-                             mq_id, conn,
-                             mxm_tag, mxm_tagmask, context);
-}
-
-static inline ssize_t _mlxm_tagged_recvfrom_v(struct fid_ep *ep, const int iov_num,
-                                              const struct iovec *iov,
-                                              void *desc, fi_addr_t src_addr, uint64_t tag,
-                                              uint64_t ignore, void *context, uint64_t flags)
-{
-        struct mlxm_fid_ep *fid_ep;
-        mxm_mq_h       mq = NULL;
-        uint32_t mxm_tag;
-        uint32_t mxm_tagmask;
-        uint16_t mq_id = 0;
-        mxm_conn_h conn = (FI_ADDR_UNSPEC == src_addr) ?
-                NULL : (mxm_conn_h)src_addr;
-
-        fid_ep = container_of(ep, struct mlxm_fid_ep, ep);
-        assert(fid_ep->domain);
-
-        GET_MQ_ID(tag, mq_id);
-        GET_32BIT_TAG(tag, mxm_tag);
-        GET_32BIT_TAG((~ignore), mxm_tagmask);
-        if(!mlxm_find_mq(fid_ep->mxm_mqs, mq_id, &mq)) {
-                mlxm_mq_add_to_storage(fid_ep->mxm_mqs, mq_id, &mq);
-        }
-        return _mlxm_do_recv_v(fid_ep, iov_num, iov, mq,
-                               mq_id, conn,
-                               mxm_tag, mxm_tagmask, context);
-}
-
-static ssize_t mlxm_tagged_recv(struct fid_ep *ep, void *buf, size_t len, void *desc,
-                                fi_addr_t src_addr,
-                                uint64_t tag, uint64_t ignore, void *context)
-{
-        struct mlxm_fid_ep *ep_priv;
-        ep_priv = container_of(ep, struct mlxm_fid_ep, ep);
-        return _mlxm_tagged_recvfrom(ep, buf, len, desc, src_addr, tag, ignore,
-                                     context, ep_priv->flags);
-}
-
-static inline
-ssize_t _mlxm_tagged_peek(struct fid_ep *ep, const struct fi_msg_tagged *msg,
-                          uint64_t flags)
-{
-        struct mlxm_fid_ep *fid_ep;
-        mxm_mq_h mq = NULL;
-        uint32_t mxm_tag = 0;
-        uint32_t mxm_tagmask = 0;
-        uint16_t mq_id  = 0;
-        if (flags & (FI_CLAIM | FI_DISCARD))
-                return -FI_EOPNOTSUPP;
-
-        fid_ep = container_of(ep, struct mlxm_fid_ep, ep);
-        assert(fid_ep->domain);
-        GET_MQ_ID(msg->tag, mq_id);
-        GET_32BIT_TAG(msg->tag, mxm_tag);
-        GET_32BIT_TAG((~(msg->ignore)), mxm_tagmask);
-        if(!mlxm_find_mq(fid_ep->mxm_mqs, mq_id, &mq)) {
-                mlxm_mq_add_to_storage(fid_ep->mxm_mqs, mq_id, &mq);
-        }
-        return _mlxm_do_probe(fid_ep, mq, mq_id,
-                              msg->addr == FI_ADDR_UNSPEC ? NULL : (mxm_conn_h)msg->addr,
-                              mxm_tag, mxm_tagmask, msg->context);
-}
-
-static ssize_t mlxm_tagged_recvmsg(struct fid_ep *ep,
-                                   const struct fi_msg_tagged *msg,uint64_t flags)
-{
-        if (flags & FI_PEEK)
-                return _mlxm_tagged_peek(ep,msg,flags);
-        if (msg->iov_count == 1) {
-                return _mlxm_tagged_recvfrom(ep, msg->msg_iov[0].iov_base,
-                                             msg->msg_iov[0].iov_len,
-                                             msg->desc ? msg->desc[0] : NULL,
-                                             msg->addr, msg->tag, msg->ignore,
-                                             msg->context, flags);
-        }else{
-                return _mlxm_tagged_recvfrom_v(ep, msg->iov_count,
-                                               msg->msg_iov,
-                                               msg->desc ? msg->desc[0] : NULL,
-                                               msg->addr, msg->tag, msg->ignore,
-                                               msg->context, flags);
-        }
-}
-
-static ssize_t mlxm_tagged_recvv(struct fid_ep *ep, const struct iovec *iov,
-                                 void **desc, size_t count, fi_addr_t src_addr,
-                                 uint64_t tag, uint64_t ignore, void *context)
-{
-        if (count == 1) {
-                return _mlxm_tagged_recvfrom(ep, iov[0].iov_base,
-                                             iov[0].iov_len,
-                                             desc, src_addr, tag, ignore,
-                                             context, 0);
-        }else{
-                return _mlxm_tagged_recvfrom_v(ep, count,iov,
-                                               desc, src_addr, tag, ignore,
-                                               context, 0);
-        }
-}
-
-
-static inline ssize_t _mlxm_tagged_sendto(struct fid_ep *ep, const void *buf, size_t len,
-                                          void *desc, fi_addr_t dest_addr,
-                                          uint64_t tag, void *context, uint64_t flags,
-                                          uint32_t data, const int is_blocking)
-{
-        struct mlxm_fid_ep   *fid_ep;
-        mxm_mq_h mq = NULL;
-        uint32_t mxm_tag;
-        uint16_t mq_id = 0;
-        fid_ep = container_of(ep, struct mlxm_fid_ep, ep);
-        assert(fid_ep->domain);
-        assert(dest_addr != FI_ADDR_UNSPEC);
-
-        GET_MQ_ID(tag, mq_id);
-        GET_32BIT_TAG(tag, mxm_tag);
-        if(!mlxm_find_mq(fid_ep->mxm_mqs, mq_id, &mq)) {
-                mlxm_mq_add_to_storage(fid_ep->mxm_mqs, mq_id, &mq);
-        }
-        return _mlxm_do_send(fid_ep, mq, mq_id,
-                             buf, len,(mxm_conn_h)dest_addr,
-                             mxm_tag, context, data,
-                             is_blocking);
-}
-
-static inline ssize_t _mlxm_tagged_sendto_v(struct fid_ep *ep, const int iov_num, const struct iovec* iov,
-                                            void *desc, fi_addr_t dest_addr,
-                                            uint64_t tag, void *context, uint64_t flags,
-                                            uint32_t data, const int is_blocking)
-{
-        struct mlxm_fid_ep   *fid_ep;
-        mxm_mq_h mq = NULL;
-        uint32_t mxm_tag;
-        uint16_t mq_id = 0;
-        fid_ep = container_of(ep, struct mlxm_fid_ep, ep);
-        assert(fid_ep->domain);
-        assert(dest_addr != FI_ADDR_UNSPEC);
-
-        GET_MQ_ID(tag, mq_id);
-        GET_32BIT_TAG(tag, mxm_tag);
-        if(!mlxm_find_mq(fid_ep->mxm_mqs, mq_id, &mq)) {
-                mlxm_mq_add_to_storage(fid_ep->mxm_mqs, mq_id, &mq);
-        }
-        return _mlxm_do_send_v(fid_ep, mq, mq_id,
-                               iov_num, iov,(mxm_conn_h)dest_addr,
-                               mxm_tag, context, data,
-                               is_blocking);
-}
-
-
-static ssize_t mlxm_tagged_sendv(struct fid_ep *ep,
-                                 const struct iovec *iov, void **desc,
-                                 size_t count, fi_addr_t src_addr,
-                                 uint64_t tag, void *context)
-{
-        if (count == 1) {
-                return _mlxm_tagged_sendto(ep, iov[0].iov_base, iov[0].iov_len,
-                                           desc, src_addr,
-                                           tag, context, 0, 0,0);
-        } else {
-                return _mlxm_tagged_sendto_v(ep, count, iov,
-                                             desc, src_addr,
-                                             tag, context, 0, 0,0);
-        }
-}
-
-
-
-static ssize_t mlxm_tagged_injectdata(struct fid_ep *ep, const void *buf, size_t len,
-                                      uint64_t data, fi_addr_t dest_addr, uint64_t tag) {
-        return _mlxm_tagged_sendto(ep, buf, len, NULL, dest_addr, tag, NULL,
-                                   0, data,1);
-}
-
-static ssize_t mlxm_tagged_inject(struct fid_ep *ep, const void *buf, size_t len,
-                                     fi_addr_t dest_addr, uint64_t tag) {
-        return _mlxm_tagged_sendto(ep, buf, len, NULL, dest_addr, tag, NULL,
-                                   0, 0,1);
-}
-
-
-static ssize_t mlxm_tagged_sendto(struct fid_ep *ep, const void *buf, size_t len,
-                                  void *desc, fi_addr_t dest_addr,
-                                  uint64_t tag, void *context)
-{
-        return _mlxm_tagged_sendto(ep, buf, len, desc, dest_addr, tag, context,
-                                   0, 0, 0);
-}
-
-static ssize_t mlxm_tagged_senddatato(struct fid_ep *ep, const void *buf, size_t len,
-                                      void *desc, uint64_t data, fi_addr_t dest_addr,
-                                      uint64_t tag, void *context)
-{
-        assert(data < (1ULL << 32));
-        return _mlxm_tagged_sendto(ep, buf, len, desc, dest_addr, tag, context,
-                                   0,  (uint32_t)data, 0);
-}
-
-
-static ssize_t mlxm_tagged_sendmsg(struct fid_ep *ep,
-                                   const struct fi_msg_tagged *msg,uint64_t flags)
-{
-        if (msg->iov_count == 1) {
-                return _mlxm_tagged_sendto(ep, msg->msg_iov[0].iov_base,
-                                           msg->msg_iov[0].iov_len,
-                                           msg->desc ? msg->desc[0] : NULL, msg->addr,
-                                           msg->tag, msg->context, flags,
-                                           (uint32_t)msg->data,flags & FI_INJECT);
-
-        }else{
-                return _mlxm_tagged_sendto_v(ep, msg->iov_count, msg->msg_iov,
-                                             msg->desc ? msg->desc[0] : NULL, msg->addr,
-                                             msg->tag, msg->context, flags,
-                                             (uint32_t)msg->data,flags & FI_INJECT);
-        }
-}
-
-struct fi_ops_tagged mlxm_tagged_ops = {
-        .size = sizeof(struct fi_ops_tagged),
-        .recv = mlxm_tagged_recv,
-        .recvv = mlxm_tagged_recvv,
-        .recvmsg = mlxm_tagged_recvmsg,
-        .send = mlxm_tagged_sendto,
-        .senddata = mlxm_tagged_senddatato,
-        .sendv = mlxm_tagged_sendv, 
-        .inject = mlxm_tagged_inject,
-        .sendmsg = mlxm_tagged_sendmsg,
-        .injectdata = mlxm_tagged_injectdata,
-};
-
diff --git a/prov/mxm/src/mpool.h b/prov/mxm/src/mpool.h
deleted file mode 100644
index 71f6db1..0000000
--- a/prov/mxm/src/mpool.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2015 Intel Corporation. All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * OpenFabrics.org BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-#ifndef __MPOOL_H__
-#define __MPOOL_H__
-#include <stdint.h>
-#include <stdlib.h>
-
-struct mpool {
-        int nkeys;
-        int num;
-        char pool[1];
-};
-
-#define MPOOL_GET_KEY(_pool, _key) ((uint32_t*)_pool->pool)[_key]
-#define MPOOL_GET_OBJ_STORAGE_PTR(_pool) ((void*)(_pool->pool + _pool->nkeys*sizeof(uint32_t)))
-#define MPOOL_GET_OBJ(_pool, _pos, _type_sz)                            \
-        ((char*)MPOOL_GET_OBJ_STORAGE_PTR((_pool)) + _pos*_type_sz)
-
-static inline int
-mpool_init(struct mpool **mpool, size_t el_size, int num) {
-        int nkeys;
-        size_t pool_size;
-        int i;
-        num += (num % 32) ? (32 - (num % 32)) : 0;
-        nkeys = num / 32;
-        pool_size = sizeof(struct mpool) - 1
-                + num*el_size + nkeys*sizeof(uint32_t);
-        *mpool = (struct mpool*)malloc(pool_size);
-
-        (*mpool)->nkeys = nkeys;
-        (*mpool)->num   = num;
-        for (i=0; i<nkeys; i++) {
-                MPOOL_GET_KEY((*mpool), i) = -1;
-        }
-        return 0;
-}
-
-#define MPOOL_ALLOC(_mpool, _type, _ptr)                                \
-        do{                                                             \
-                int __i;                                                \
-                int __pos = -1;                                         \
-                for (__i=0; __i<(_mpool)->nkeys; __i++) {               \
-                        int __bit = __builtin_ffs(MPOOL_GET_KEY(_mpool, \
-                                                                __i));  \
-                        if (__bit) {                                    \
-                                __pos = 32*__i+__bit - 1;               \
-                                MPOOL_GET_KEY(_mpool, __i) &=           \
-                                        ~(1 << (__bit-1));              \
-                                break;                                  \
-                        }                                               \
-                }                                                       \
-                if (__pos != -1) {                                      \
-                        (_ptr) = (_type *)                              \
-                                MPOOL_GET_OBJ((_mpool),                 \
-                                              __pos, sizeof(_type));    \
-                }else{                                                  \
-                        (_ptr) = (_type *)malloc(sizeof(_type));        \
-                }                                                       \
-        }while(0);
-
-#define MPOOL_RETURN(_mpool, _type, _ptr)                               \
-        do {                                                            \
-                char *__start =(char*)MPOOL_GET_OBJ_STORAGE_PTR(_mpool); \
-                if ((char*)_ptr >= __start && (char*)                   \
-                    _ptr < __start + _mpool->num*sizeof(_type)) {       \
-                        int __pos = ((char*)_ptr - (char*)              \
-                                     MPOOL_GET_OBJ_STORAGE_PTR(_mpool))/sizeof(_type); \
-                        int __key = __pos / 32;                         \
-                        int __bit = __pos % 32;                         \
-                        MPOOL_GET_KEY(_mpool, __key) |= (1 << __bit);   \
-                }else{                                                  \
-                        free(_ptr);                                     \
-                }                                                       \
-        }while(0)
-#endif
diff --git a/prov/mxm/src/uthash.h b/prov/mxm/src/uthash.h
deleted file mode 100644
index 7205c67..0000000
--- a/prov/mxm/src/uthash.h
+++ /dev/null
@@ -1,958 +0,0 @@
-/*
-Copyright (c) 2003-2014, Troy D. Hanson     http://troydhanson.github.com/uthash/
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
-PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
-OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifndef UTHASH_H
-#define UTHASH_H
-
-#include <string.h>   /* memcmp,strlen */
-#include <stddef.h>   /* ptrdiff_t */
-#include <stdlib.h>   /* exit() */
-
-/* These macros use decltype or the earlier __typeof GNU extension.
-   As decltype is only available in newer compilers (VS2010 or gcc 4.3+
-   when compiling c++ source) this code uses whatever method is needed
-   or, for VS2008 where neither is available, uses casting workarounds. */
-#if defined(_MSC_VER)   /* MS compiler */
-#if _MSC_VER >= 1600 && defined(__cplusplus)  /* VS2010 or newer in C++ mode */
-#define DECLTYPE(x) (decltype(x))
-#else                   /* VS2008 or older (or VS2010 in C mode) */
-#define NO_DECLTYPE
-#define DECLTYPE(x)
-#endif
-#elif defined(__BORLANDC__) || defined(__LCC__) || defined(__WATCOMC__)
-#define NO_DECLTYPE
-#define DECLTYPE(x)
-#else                   /* GNU, Sun and other compilers */
-#define DECLTYPE(x) (__typeof(x))
-#endif
-
-#ifdef NO_DECLTYPE
-#define DECLTYPE_ASSIGN(dst,src)                                                 \
-do {                                                                             \
-  char **_da_dst = (char**)(&(dst));                                             \
-  *_da_dst = (char*)(src);                                                       \
-} while(0)
-#else
-#define DECLTYPE_ASSIGN(dst,src)                                                 \
-do {                                                                             \
-  (dst) = DECLTYPE(dst)(src);                                                    \
-} while(0)
-#endif
-
-/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */
-#if defined (_WIN32)
-#if defined(_MSC_VER) && _MSC_VER >= 1600
-#include <stdint.h>
-#elif defined(__WATCOMC__)
-#include <stdint.h>
-#else
-typedef unsigned int uint32_t;
-typedef unsigned char uint8_t;
-#endif
-#else
-#include <stdint.h>
-#endif
-
-#define UTHASH_VERSION 1.9.9
-
-#ifndef uthash_fatal
-#define uthash_fatal(msg) exit(-1)        /* fatal error (out of memory,etc) */
-#endif
-#ifndef uthash_malloc
-#define uthash_malloc(sz) malloc(sz)      /* malloc fcn                      */
-#endif
-#ifndef uthash_free
-#define uthash_free(ptr,sz) free(ptr)     /* free fcn                        */
-#endif
-
-#ifndef uthash_noexpand_fyi
-#define uthash_noexpand_fyi(tbl)          /* can be defined to log noexpand  */
-#endif
-#ifndef uthash_expand_fyi
-#define uthash_expand_fyi(tbl)            /* can be defined to log expands   */
-#endif
-
-/* initial number of buckets */
-#define HASH_INITIAL_NUM_BUCKETS 32      /* initial number of buckets        */
-#define HASH_INITIAL_NUM_BUCKETS_LOG2 5  /* lg2 of initial number of buckets */
-#define HASH_BKT_CAPACITY_THRESH 10      /* expand when bucket count reaches */
-
-/* calculate the element whose hash handle address is hhe */
-#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))
-
-#define HASH_FIND(hh,head,keyptr,keylen,out)                                     \
-do {                                                                             \
-  unsigned _hf_bkt,_hf_hashv;                                                    \
-  out=NULL;                                                                      \
-  if (head) {                                                                    \
-     HASH_FCN(keyptr,keylen, (head)->hh.tbl->num_buckets, _hf_hashv, _hf_bkt);   \
-     if (HASH_BLOOM_TEST((head)->hh.tbl, _hf_hashv)) {                           \
-       HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ],  \
-                        keyptr,keylen,out);                                      \
-     }                                                                           \
-  }                                                                              \
-} while (0)
-
-#ifdef HASH_BLOOM
-#define HASH_BLOOM_BITLEN (1ULL << HASH_BLOOM)
-#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8) + ((HASH_BLOOM_BITLEN%8) ? 1:0)
-#define HASH_BLOOM_MAKE(tbl)                                                     \
-do {                                                                             \
-  (tbl)->bloom_nbits = HASH_BLOOM;                                               \
-  (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN);                 \
-  if (!((tbl)->bloom_bv))  { uthash_fatal( "out of memory"); }                   \
-  memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN);                                \
-  (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE;                                       \
-} while (0)
-
-#define HASH_BLOOM_FREE(tbl)                                                     \
-do {                                                                             \
-  uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN);                              \
-} while (0)
-
-#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8] |= (1U << ((idx)%8)))
-#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8] & (1U << ((idx)%8)))
-
-#define HASH_BLOOM_ADD(tbl,hashv)                                                \
-  HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1)))
-
-#define HASH_BLOOM_TEST(tbl,hashv)                                               \
-  HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1)))
-
-#else
-#define HASH_BLOOM_MAKE(tbl)
-#define HASH_BLOOM_FREE(tbl)
-#define HASH_BLOOM_ADD(tbl,hashv)
-#define HASH_BLOOM_TEST(tbl,hashv) (1)
-#define HASH_BLOOM_BYTELEN 0
-#endif
-
-#define HASH_MAKE_TABLE(hh,head)                                                 \
-do {                                                                             \
-  (head)->hh.tbl = (UT_hash_table*)uthash_malloc(                                \
-                  sizeof(UT_hash_table));                                        \
-  if (!((head)->hh.tbl))  { uthash_fatal( "out of memory"); }                    \
-  memset((head)->hh.tbl, 0, sizeof(UT_hash_table));                              \
-  (head)->hh.tbl->tail = &((head)->hh);                                          \
-  (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS;                        \
-  (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2;              \
-  (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head);                    \
-  (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc(                      \
-          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \
-  if (! (head)->hh.tbl->buckets) { uthash_fatal( "out of memory"); }             \
-  memset((head)->hh.tbl->buckets, 0,                                             \
-          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \
-  HASH_BLOOM_MAKE((head)->hh.tbl);                                               \
-  (head)->hh.tbl->signature = HASH_SIGNATURE;                                    \
-} while(0)
-
-#define HASH_ADD(hh,head,fieldname,keylen_in,add)                                \
-        HASH_ADD_KEYPTR(hh,head,&((add)->fieldname),keylen_in,add)
-
-#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced)                   \
-do {                                                                             \
-  replaced=NULL;                                                                 \
-  HASH_FIND(hh,head,&((add)->fieldname),keylen_in,replaced);                     \
-  if (replaced!=NULL) {                                                          \
-     HASH_DELETE(hh,head,replaced);                                              \
-  };                                                                             \
-  HASH_ADD(hh,head,fieldname,keylen_in,add);                                     \
-} while(0)
-
-#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add)                            \
-do {                                                                             \
- unsigned _ha_bkt;                                                               \
- (add)->hh.next = NULL;                                                          \
- (add)->hh.key = (char*)(keyptr);                                                \
- (add)->hh.keylen = (unsigned)(keylen_in);                                       \
- if (!(head)) {                                                                  \
-    head = (add);                                                                \
-    (head)->hh.prev = NULL;                                                      \
-    HASH_MAKE_TABLE(hh,head);                                                    \
- } else {                                                                        \
-    (head)->hh.tbl->tail->next = (add);                                          \
-    (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail);         \
-    (head)->hh.tbl->tail = &((add)->hh);                                         \
- }                                                                               \
- (head)->hh.tbl->num_items++;                                                    \
- (add)->hh.tbl = (head)->hh.tbl;                                                 \
- HASH_FCN(keyptr,keylen_in, (head)->hh.tbl->num_buckets,                         \
-         (add)->hh.hashv, _ha_bkt);                                              \
- HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt],&(add)->hh);                   \
- HASH_BLOOM_ADD((head)->hh.tbl,(add)->hh.hashv);                                 \
- HASH_EMIT_KEY(hh,head,keyptr,keylen_in);                                        \
- HASH_FSCK(hh,head);                                                             \
-} while(0)
-
-#define HASH_TO_BKT( hashv, num_bkts, bkt )                                      \
-do {                                                                             \
-  bkt = ((hashv) & ((num_bkts) - 1));                                            \
-} while(0)
-
-/* delete "delptr" from the hash table.
- * "the usual" patch-up process for the app-order doubly-linked-list.
- * The use of _hd_hh_del below deserves special explanation.
- * These used to be expressed using (delptr) but that led to a bug
- * if someone used the same symbol for the head and deletee, like
- *  HASH_DELETE(hh,users,users);
- * We want that to work, but by changing the head (users) below
- * we were forfeiting our ability to further refer to the deletee (users)
- * in the patch-up process. Solution: use scratch space to
- * copy the deletee pointer, then the latter references are via that
- * scratch pointer rather than through the repointed (users) symbol.
- */
-#define HASH_DELETE(hh,head,delptr)                                              \
-do {                                                                             \
-    unsigned _hd_bkt;                                                            \
-    struct UT_hash_handle *_hd_hh_del;                                           \
-    if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) )  {         \
-        uthash_free((head)->hh.tbl->buckets,                                     \
-                    (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
-        HASH_BLOOM_FREE((head)->hh.tbl);                                         \
-        uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                      \
-        head = NULL;                                                             \
-    } else {                                                                     \
-        _hd_hh_del = &((delptr)->hh);                                            \
-        if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) {     \
-            (head)->hh.tbl->tail =                                               \
-                (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +               \
-                (head)->hh.tbl->hho);                                            \
-        }                                                                        \
-        if ((delptr)->hh.prev) {                                                 \
-            ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +                  \
-                    (head)->hh.tbl->hho))->next = (delptr)->hh.next;             \
-        } else {                                                                 \
-            DECLTYPE_ASSIGN(head,(delptr)->hh.next);                             \
-        }                                                                        \
-        if (_hd_hh_del->next) {                                                  \
-            ((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next +                     \
-                    (head)->hh.tbl->hho))->prev =                                \
-                    _hd_hh_del->prev;                                            \
-        }                                                                        \
-        HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt);   \
-        HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del);        \
-        (head)->hh.tbl->num_items--;                                             \
-    }                                                                            \
-    HASH_FSCK(hh,head);                                                          \
-} while (0)
-
-
-/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */
-#define HASH_FIND_STR(head,findstr,out)                                          \
-    HASH_FIND(hh,head,findstr,strlen(findstr),out)
-#define HASH_ADD_STR(head,strfield,add)                                          \
-    HASH_ADD(hh,head,strfield[0],strlen(add->strfield),add)
-#define HASH_REPLACE_STR(head,strfield,add,replaced)                             \
-    HASH_REPLACE(hh,head,strfield[0],strlen(add->strfield),add,replaced)
-#define HASH_FIND_INT(head,findint,out)                                          \
-    HASH_FIND(hh,head,findint,sizeof(int),out)
-#define HASH_ADD_INT(head,intfield,add)                                          \
-    HASH_ADD(hh,head,intfield,sizeof(int),add)
-#define HASH_REPLACE_INT(head,intfield,add,replaced)                             \
-    HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)
-#define HASH_FIND_PTR(head,findptr,out)                                          \
-    HASH_FIND(hh,head,findptr,sizeof(void *),out)
-#define HASH_ADD_PTR(head,ptrfield,add)                                          \
-    HASH_ADD(hh,head,ptrfield,sizeof(void *),add)
-#define HASH_REPLACE_PTR(head,ptrfield,add,replaced)                             \
-    HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)
-#define HASH_DEL(head,delptr)                                                    \
-    HASH_DELETE(hh,head,delptr)
-
-/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined.
- * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.
- */
-#ifdef HASH_DEBUG
-#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)
-#define HASH_FSCK(hh,head)                                                       \
-do {                                                                             \
-    unsigned _bkt_i;                                                             \
-    unsigned _count, _bkt_count;                                                 \
-    char *_prev;                                                                 \
-    struct UT_hash_handle *_thh;                                                 \
-    if (head) {                                                                  \
-        _count = 0;                                                              \
-        for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) {       \
-            _bkt_count = 0;                                                      \
-            _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head;                      \
-            _prev = NULL;                                                        \
-            while (_thh) {                                                       \
-               if (_prev != (char*)(_thh->hh_prev)) {                            \
-                   HASH_OOPS("invalid hh_prev %p, actual %p\n",                  \
-                    _thh->hh_prev, _prev );                                      \
-               }                                                                 \
-               _bkt_count++;                                                     \
-               _prev = (char*)(_thh);                                            \
-               _thh = _thh->hh_next;                                             \
-            }                                                                    \
-            _count += _bkt_count;                                                \
-            if ((head)->hh.tbl->buckets[_bkt_i].count !=  _bkt_count) {          \
-               HASH_OOPS("invalid bucket count %d, actual %d\n",                 \
-                (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count);              \
-            }                                                                    \
-        }                                                                        \
-        if (_count != (head)->hh.tbl->num_items) {                               \
-            HASH_OOPS("invalid hh item count %d, actual %d\n",                   \
-                (head)->hh.tbl->num_items, _count );                             \
-        }                                                                        \
-        /* traverse hh in app order; check next/prev integrity, count */         \
-        _count = 0;                                                              \
-        _prev = NULL;                                                            \
-        _thh =  &(head)->hh;                                                     \
-        while (_thh) {                                                           \
-           _count++;                                                             \
-           if (_prev !=(char*)(_thh->prev)) {                                    \
-              HASH_OOPS("invalid prev %p, actual %p\n",                          \
-                    _thh->prev, _prev );                                         \
-           }                                                                     \
-           _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh);                    \
-           _thh = ( _thh->next ?  (UT_hash_handle*)((char*)(_thh->next) +        \
-                                  (head)->hh.tbl->hho) : NULL );                 \
-        }                                                                        \
-        if (_count != (head)->hh.tbl->num_items) {                               \
-            HASH_OOPS("invalid app item count %d, actual %d\n",                  \
-                (head)->hh.tbl->num_items, _count );                             \
-        }                                                                        \
-    }                                                                            \
-} while (0)
-#else
-#define HASH_FSCK(hh,head)
-#endif
-
-/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to
- * the descriptor to which this macro is defined for tuning the hash function.
- * The app can #include <unistd.h> to get the prototype for write(2). */
-#ifdef HASH_EMIT_KEYS
-#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)                                   \
-do {                                                                             \
-    unsigned _klen = fieldlen;                                                   \
-    write(HASH_EMIT_KEYS, &_klen, sizeof(_klen));                                \
-    write(HASH_EMIT_KEYS, keyptr, fieldlen);                                     \
-} while (0)
-#else
-#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
-#endif
-
-/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */
-#ifdef HASH_FUNCTION
-#define HASH_FCN HASH_FUNCTION
-#else
-#define HASH_FCN HASH_JEN
-#endif
-
-/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */
-#define HASH_BER(key,keylen,num_bkts,hashv,bkt)                                  \
-do {                                                                             \
-  unsigned _hb_keylen=keylen;                                                    \
-  char *_hb_key=(char*)(key);                                                    \
-  (hashv) = 0;                                                                   \
-  while (_hb_keylen--)  { (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; }   \
-  bkt = (hashv) & (num_bkts-1);                                                  \
-} while (0)
-
-
-/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at
- * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */
-#define HASH_SAX(key,keylen,num_bkts,hashv,bkt)                                  \
-do {                                                                             \
-  unsigned _sx_i;                                                                \
-  char *_hs_key=(char*)(key);                                                    \
-  hashv = 0;                                                                     \
-  for(_sx_i=0; _sx_i < keylen; _sx_i++)                                          \
-      hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i];                     \
-  bkt = hashv & (num_bkts-1);                                                    \
-} while (0)
-/* FNV-1a variation */
-#define HASH_FNV(key,keylen,num_bkts,hashv,bkt)                                  \
-do {                                                                             \
-  unsigned _fn_i;                                                                \
-  char *_hf_key=(char*)(key);                                                    \
-  hashv = 2166136261UL;                                                          \
-  for(_fn_i=0; _fn_i < keylen; _fn_i++)                                          \
-      hashv = hashv ^ _hf_key[_fn_i];                                            \
-      hashv = hashv * 16777619;                                                  \
-  bkt = hashv & (num_bkts-1);                                                    \
-} while(0)
-
-#define HASH_OAT(key,keylen,num_bkts,hashv,bkt)                                  \
-do {                                                                             \
-  unsigned _ho_i;                                                                \
-  char *_ho_key=(char*)(key);                                                    \
-  hashv = 0;                                                                     \
-  for(_ho_i=0; _ho_i < keylen; _ho_i++) {                                        \
-      hashv += _ho_key[_ho_i];                                                   \
-      hashv += (hashv << 10);                                                    \
-      hashv ^= (hashv >> 6);                                                     \
-  }                                                                              \
-  hashv += (hashv << 3);                                                         \
-  hashv ^= (hashv >> 11);                                                        \
-  hashv += (hashv << 15);                                                        \
-  bkt = hashv & (num_bkts-1);                                                    \
-} while(0)
-
-#define HASH_JEN_MIX(a,b,c)                                                      \
-do {                                                                             \
-  a -= b; a -= c; a ^= ( c >> 13 );                                              \
-  b -= c; b -= a; b ^= ( a << 8 );                                               \
-  c -= a; c -= b; c ^= ( b >> 13 );                                              \
-  a -= b; a -= c; a ^= ( c >> 12 );                                              \
-  b -= c; b -= a; b ^= ( a << 16 );                                              \
-  c -= a; c -= b; c ^= ( b >> 5 );                                               \
-  a -= b; a -= c; a ^= ( c >> 3 );                                               \
-  b -= c; b -= a; b ^= ( a << 10 );                                              \
-  c -= a; c -= b; c ^= ( b >> 15 );                                              \
-} while (0)
-
-#define HASH_JEN(key,keylen,num_bkts,hashv,bkt)                                  \
-do {                                                                             \
-  unsigned _hj_i,_hj_j,_hj_k;                                                    \
-  unsigned char *_hj_key=(unsigned char*)(key);                                  \
-  hashv = 0xfeedbeef;                                                            \
-  _hj_i = _hj_j = 0x9e3779b9;                                                    \
-  _hj_k = (unsigned)(keylen);                                                      \
-  while (_hj_k >= 12) {                                                          \
-    _hj_i +=    (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 )                      \
-        + ( (unsigned)_hj_key[2] << 16 )                                         \
-        + ( (unsigned)_hj_key[3] << 24 ) );                                      \
-    _hj_j +=    (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 )                      \
-        + ( (unsigned)_hj_key[6] << 16 )                                         \
-        + ( (unsigned)_hj_key[7] << 24 ) );                                      \
-    hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 )                         \
-        + ( (unsigned)_hj_key[10] << 16 )                                        \
-        + ( (unsigned)_hj_key[11] << 24 ) );                                     \
-                                                                                 \
-     HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                          \
-                                                                                 \
-     _hj_key += 12;                                                              \
-     _hj_k -= 12;                                                                \
-  }                                                                              \
-  hashv += keylen;                                                               \
-  switch ( _hj_k ) {                                                             \
-     case 11: hashv += ( (unsigned)_hj_key[10] << 24 );                          \
-     case 10: hashv += ( (unsigned)_hj_key[9] << 16 );                           \
-     case 9:  hashv += ( (unsigned)_hj_key[8] << 8 );                            \
-     case 8:  _hj_j += ( (unsigned)_hj_key[7] << 24 );                           \
-     case 7:  _hj_j += ( (unsigned)_hj_key[6] << 16 );                           \
-     case 6:  _hj_j += ( (unsigned)_hj_key[5] << 8 );                            \
-     case 5:  _hj_j += _hj_key[4];                                               \
-     case 4:  _hj_i += ( (unsigned)_hj_key[3] << 24 );                           \
-     case 3:  _hj_i += ( (unsigned)_hj_key[2] << 16 );                           \
-     case 2:  _hj_i += ( (unsigned)_hj_key[1] << 8 );                            \
-     case 1:  _hj_i += _hj_key[0];                                               \
-  }                                                                              \
-  HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                             \
-  bkt = hashv & (num_bkts-1);                                                    \
-} while(0)
-
-/* The Paul Hsieh hash function */
-#undef get16bits
-#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__)             \
-  || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
-#define get16bits(d) (*((const uint16_t *) (d)))
-#endif
-
-#if !defined (get16bits)
-#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)             \
-                       +(uint32_t)(((const uint8_t *)(d))[0]) )
-#endif
-#define HASH_SFH(key,keylen,num_bkts,hashv,bkt)                                  \
-do {                                                                             \
-  unsigned char *_sfh_key=(unsigned char*)(key);                                 \
-  uint32_t _sfh_tmp, _sfh_len = keylen;                                          \
-                                                                                 \
-  int _sfh_rem = _sfh_len & 3;                                                   \
-  _sfh_len >>= 2;                                                                \
-  hashv = 0xcafebabe;                                                            \
-                                                                                 \
-  /* Main loop */                                                                \
-  for (;_sfh_len > 0; _sfh_len--) {                                              \
-    hashv    += get16bits (_sfh_key);                                            \
-    _sfh_tmp       = (uint32_t)(get16bits (_sfh_key+2)) << 11  ^ hashv;          \
-    hashv     = (hashv << 16) ^ _sfh_tmp;                                        \
-    _sfh_key += 2*sizeof (uint16_t);                                             \
-    hashv    += hashv >> 11;                                                     \
-  }                                                                              \
-                                                                                 \
-  /* Handle end cases */                                                         \
-  switch (_sfh_rem) {                                                            \
-    case 3: hashv += get16bits (_sfh_key);                                       \
-            hashv ^= hashv << 16;                                                \
-            hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)] << 18);              \
-            hashv += hashv >> 11;                                                \
-            break;                                                               \
-    case 2: hashv += get16bits (_sfh_key);                                       \
-            hashv ^= hashv << 11;                                                \
-            hashv += hashv >> 17;                                                \
-            break;                                                               \
-    case 1: hashv += *_sfh_key;                                                  \
-            hashv ^= hashv << 10;                                                \
-            hashv += hashv >> 1;                                                 \
-  }                                                                              \
-                                                                                 \
-    /* Force "avalanching" of final 127 bits */                                  \
-    hashv ^= hashv << 3;                                                         \
-    hashv += hashv >> 5;                                                         \
-    hashv ^= hashv << 4;                                                         \
-    hashv += hashv >> 17;                                                        \
-    hashv ^= hashv << 25;                                                        \
-    hashv += hashv >> 6;                                                         \
-    bkt = hashv & (num_bkts-1);                                                  \
-} while(0)
-
-#ifdef HASH_USING_NO_STRICT_ALIASING
-/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads.
- * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error.
- * MurmurHash uses the faster approach only on CPU's where we know it's safe.
- *
- * Note the preprocessor built-in defines can be emitted using:
- *
- *   gcc -m64 -dM -E - < /dev/null                  (on gcc)
- *   cc -## a.c (where a.c is a simple test file)   (Sun Studio)
- */
-#if (defined(__i386__) || defined(__x86_64__)  || defined(_M_IX86))
-#define MUR_GETBLOCK(p,i) p[i]
-#else /* non intel */
-#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 0x3) == 0)
-#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 0x3) == 1)
-#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 0x3) == 2)
-#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 0x3) == 3)
-#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))
-#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))
-#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))
-#define MUR_TWO_TWO(p)   ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))
-#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >>  8))
-#else /* assume little endian non-intel */
-#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))
-#define MUR_TWO_TWO(p)   ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))
-#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) <<  8))
-#endif
-#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) :           \
-                            (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \
-                             (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) :  \
-                                                      MUR_ONE_THREE(p))))
-#endif
-#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))
-#define MUR_FMIX(_h) \
-do {                 \
-  _h ^= _h >> 16;    \
-  _h *= 0x85ebca6b;  \
-  _h ^= _h >> 13;    \
-  _h *= 0xc2b2ae35l; \
-  _h ^= _h >> 16;    \
-} while(0)
-
-#define HASH_MUR(key,keylen,num_bkts,hashv,bkt)                        \
-do {                                                                   \
-  const uint8_t *_mur_data = (const uint8_t*)(key);                    \
-  const int _mur_nblocks = (keylen) / 4;                               \
-  uint32_t _mur_h1 = 0xf88D5353;                                       \
-  uint32_t _mur_c1 = 0xcc9e2d51;                                       \
-  uint32_t _mur_c2 = 0x1b873593;                                       \
-  uint32_t _mur_k1 = 0;                                                \
-  const uint8_t *_mur_tail;                                            \
-  const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+_mur_nblocks*4); \
-  int _mur_i;                                                          \
-  for(_mur_i = -_mur_nblocks; _mur_i; _mur_i++) {                      \
-    _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i);                        \
-    _mur_k1 *= _mur_c1;                                                \
-    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \
-    _mur_k1 *= _mur_c2;                                                \
-                                                                       \
-    _mur_h1 ^= _mur_k1;                                                \
-    _mur_h1 = MUR_ROTL32(_mur_h1,13);                                  \
-    _mur_h1 = _mur_h1*5+0xe6546b64;                                    \
-  }                                                                    \
-  _mur_tail = (const uint8_t*)(_mur_data + _mur_nblocks*4);            \
-  _mur_k1=0;                                                           \
-  switch((keylen) & 3) {                                               \
-    case 3: _mur_k1 ^= _mur_tail[2] << 16;                             \
-    case 2: _mur_k1 ^= _mur_tail[1] << 8;                              \
-    case 1: _mur_k1 ^= _mur_tail[0];                                   \
-    _mur_k1 *= _mur_c1;                                                \
-    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \
-    _mur_k1 *= _mur_c2;                                                \
-    _mur_h1 ^= _mur_k1;                                                \
-  }                                                                    \
-  _mur_h1 ^= (keylen);                                                 \
-  MUR_FMIX(_mur_h1);                                                   \
-  hashv = _mur_h1;                                                     \
-  bkt = hashv & (num_bkts-1);                                          \
-} while(0)
-#endif  /* HASH_USING_NO_STRICT_ALIASING */
-
-/* key comparison function; return 0 if keys equal */
-#define HASH_KEYCMP(a,b,len) memcmp(a,b,len)
-
-/* iterate over items in a known bucket to find desired item */
-#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,out)                       \
-do {                                                                             \
- if (head.hh_head) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,head.hh_head));          \
- else out=NULL;                                                                  \
- while (out) {                                                                   \
-    if ((out)->hh.keylen == keylen_in) {                                           \
-        if ((HASH_KEYCMP((out)->hh.key,keyptr,keylen_in)) == 0) break;             \
-    }                                                                            \
-    if ((out)->hh.hh_next) DECLTYPE_ASSIGN(out,ELMT_FROM_HH(tbl,(out)->hh.hh_next)); \
-    else out = NULL;                                                             \
- }                                                                               \
-} while(0)
-
-/* add an item to a bucket  */
-#define HASH_ADD_TO_BKT(head,addhh)                                              \
-do {                                                                             \
- head.count++;                                                                   \
- (addhh)->hh_next = head.hh_head;                                                \
- (addhh)->hh_prev = NULL;                                                        \
- if (head.hh_head) { (head).hh_head->hh_prev = (addhh); }                        \
- (head).hh_head=addhh;                                                           \
- if (head.count >= ((head.expand_mult+1) * HASH_BKT_CAPACITY_THRESH)             \
-     && (addhh)->tbl->noexpand != 1) {                                           \
-       HASH_EXPAND_BUCKETS((addhh)->tbl);                                        \
- }                                                                               \
-} while(0)
-
-/* remove an item from a given bucket */
-#define HASH_DEL_IN_BKT(hh,head,hh_del)                                          \
-    (head).count--;                                                              \
-    if ((head).hh_head == hh_del) {                                              \
-      (head).hh_head = hh_del->hh_next;                                          \
-    }                                                                            \
-    if (hh_del->hh_prev) {                                                       \
-        hh_del->hh_prev->hh_next = hh_del->hh_next;                              \
-    }                                                                            \
-    if (hh_del->hh_next) {                                                       \
-        hh_del->hh_next->hh_prev = hh_del->hh_prev;                              \
-    }
-
-/* Bucket expansion has the effect of doubling the number of buckets
- * and redistributing the items into the new buckets. Ideally the
- * items will distribute more or less evenly into the new buckets
- * (the extent to which this is true is a measure of the quality of
- * the hash function as it applies to the key domain).
- *
- * With the items distributed into more buckets, the chain length
- * (item count) in each bucket is reduced. Thus by expanding buckets
- * the hash keeps a bound on the chain length. This bounded chain
- * length is the essence of how a hash provides constant time lookup.
- *
- * The calculation of tbl->ideal_chain_maxlen below deserves some
- * explanation. First, keep in mind that we're calculating the ideal
- * maximum chain length based on the *new* (doubled) bucket count.
- * In fractions this is just n/b (n=number of items,b=new num buckets).
- * Since the ideal chain length is an integer, we want to calculate
- * ceil(n/b). We don't depend on floating point arithmetic in this
- * hash, so to calculate ceil(n/b) with integers we could write
- *
- *      ceil(n/b) = (n/b) + ((n%b)?1:0)
- *
- * and in fact a previous version of this hash did just that.
- * But now we have improved things a bit by recognizing that b is
- * always a power of two. We keep its base 2 log handy (call it lb),
- * so now we can write this with a bit shift and logical AND:
- *
- *      ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)
- *
- */
-#define HASH_EXPAND_BUCKETS(tbl)                                                 \
-do {                                                                             \
-    unsigned _he_bkt;                                                            \
-    unsigned _he_bkt_i;                                                          \
-    struct UT_hash_handle *_he_thh, *_he_hh_nxt;                                 \
-    UT_hash_bucket *_he_new_buckets, *_he_newbkt;                                \
-    _he_new_buckets = (UT_hash_bucket*)uthash_malloc(                            \
-             2 * tbl->num_buckets * sizeof(struct UT_hash_bucket));              \
-    if (!_he_new_buckets) { uthash_fatal( "out of memory"); }                    \
-    memset(_he_new_buckets, 0,                                                   \
-            2 * tbl->num_buckets * sizeof(struct UT_hash_bucket));               \
-    tbl->ideal_chain_maxlen =                                                    \
-       (tbl->num_items >> (tbl->log2_num_buckets+1)) +                           \
-       ((tbl->num_items & ((tbl->num_buckets*2)-1)) ? 1 : 0);                    \
-    tbl->nonideal_items = 0;                                                     \
-    for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++)                \
-    {                                                                            \
-        _he_thh = tbl->buckets[ _he_bkt_i ].hh_head;                             \
-        while (_he_thh) {                                                        \
-           _he_hh_nxt = _he_thh->hh_next;                                        \
-           HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2, _he_bkt);            \
-           _he_newbkt = &(_he_new_buckets[ _he_bkt ]);                           \
-           if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) {                \
-             tbl->nonideal_items++;                                              \
-             _he_newbkt->expand_mult = _he_newbkt->count /                       \
-                                        tbl->ideal_chain_maxlen;                 \
-           }                                                                     \
-           _he_thh->hh_prev = NULL;                                              \
-           _he_thh->hh_next = _he_newbkt->hh_head;                               \
-           if (_he_newbkt->hh_head) _he_newbkt->hh_head->hh_prev =               \
-                _he_thh;                                                         \
-           _he_newbkt->hh_head = _he_thh;                                        \
-           _he_thh = _he_hh_nxt;                                                 \
-        }                                                                        \
-    }                                                                            \
-    uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \
-    tbl->num_buckets *= 2;                                                       \
-    tbl->log2_num_buckets++;                                                     \
-    tbl->buckets = _he_new_buckets;                                              \
-    tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ?         \
-        (tbl->ineff_expands+1) : 0;                                              \
-    if (tbl->ineff_expands > 1) {                                                \
-        tbl->noexpand=1;                                                         \
-        uthash_noexpand_fyi(tbl);                                                \
-    }                                                                            \
-    uthash_expand_fyi(tbl);                                                      \
-} while(0)
-
-
-/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */
-/* Note that HASH_SORT assumes the hash handle name to be hh.
- * HASH_SRT was added to allow the hash handle name to be passed in. */
-#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)
-#define HASH_SRT(hh,head,cmpfcn)                                                 \
-do {                                                                             \
-  unsigned _hs_i;                                                                \
-  unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize;               \
-  struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail;            \
-  if (head) {                                                                    \
-      _hs_insize = 1;                                                            \
-      _hs_looping = 1;                                                           \
-      _hs_list = &((head)->hh);                                                  \
-      while (_hs_looping) {                                                      \
-          _hs_p = _hs_list;                                                      \
-          _hs_list = NULL;                                                       \
-          _hs_tail = NULL;                                                       \
-          _hs_nmerges = 0;                                                       \
-          while (_hs_p) {                                                        \
-              _hs_nmerges++;                                                     \
-              _hs_q = _hs_p;                                                     \
-              _hs_psize = 0;                                                     \
-              for ( _hs_i = 0; _hs_i  < _hs_insize; _hs_i++ ) {                  \
-                  _hs_psize++;                                                   \
-                  _hs_q = (UT_hash_handle*)((_hs_q->next) ?                      \
-                          ((void*)((char*)(_hs_q->next) +                        \
-                          (head)->hh.tbl->hho)) : NULL);                         \
-                  if (! (_hs_q) ) break;                                         \
-              }                                                                  \
-              _hs_qsize = _hs_insize;                                            \
-              while ((_hs_psize > 0) || ((_hs_qsize > 0) && _hs_q )) {           \
-                  if (_hs_psize == 0) {                                          \
-                      _hs_e = _hs_q;                                             \
-                      _hs_q = (UT_hash_handle*)((_hs_q->next) ?                  \
-                              ((void*)((char*)(_hs_q->next) +                    \
-                              (head)->hh.tbl->hho)) : NULL);                     \
-                      _hs_qsize--;                                               \
-                  } else if ( (_hs_qsize == 0) || !(_hs_q) ) {                   \
-                      _hs_e = _hs_p;                                             \
-                      if (_hs_p){                                                \
-                        _hs_p = (UT_hash_handle*)((_hs_p->next) ?                \
-                                ((void*)((char*)(_hs_p->next) +                  \
-                                (head)->hh.tbl->hho)) : NULL);                   \
-                       }                                                         \
-                      _hs_psize--;                                               \
-                  } else if ((                                                   \
-                      cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \
-                             DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \
-                             ) <= 0) {                                           \
-                      _hs_e = _hs_p;                                             \
-                      if (_hs_p){                                                \
-                        _hs_p = (UT_hash_handle*)((_hs_p->next) ?                \
-                               ((void*)((char*)(_hs_p->next) +                   \
-                               (head)->hh.tbl->hho)) : NULL);                    \
-                       }                                                         \
-                      _hs_psize--;                                               \
-                  } else {                                                       \
-                      _hs_e = _hs_q;                                             \
-                      _hs_q = (UT_hash_handle*)((_hs_q->next) ?                  \
-                              ((void*)((char*)(_hs_q->next) +                    \
-                              (head)->hh.tbl->hho)) : NULL);                     \
-                      _hs_qsize--;                                               \
-                  }                                                              \
-                  if ( _hs_tail ) {                                              \
-                      _hs_tail->next = ((_hs_e) ?                                \
-                            ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL);          \
-                  } else {                                                       \
-                      _hs_list = _hs_e;                                          \
-                  }                                                              \
-                  if (_hs_e) {                                                   \
-                  _hs_e->prev = ((_hs_tail) ?                                    \
-                     ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL);              \
-                  }                                                              \
-                  _hs_tail = _hs_e;                                              \
-              }                                                                  \
-              _hs_p = _hs_q;                                                     \
-          }                                                                      \
-          if (_hs_tail){                                                         \
-            _hs_tail->next = NULL;                                               \
-          }                                                                      \
-          if ( _hs_nmerges <= 1 ) {                                              \
-              _hs_looping=0;                                                     \
-              (head)->hh.tbl->tail = _hs_tail;                                   \
-              DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list));      \
-          }                                                                      \
-          _hs_insize *= 2;                                                       \
-      }                                                                          \
-      HASH_FSCK(hh,head);                                                        \
- }                                                                               \
-} while (0)
-
-/* This function selects items from one hash into another hash.
- * The end result is that the selected items have dual presence
- * in both hashes. There is no copy of the items made; rather
- * they are added into the new hash through a secondary hash
- * hash handle that must be present in the structure. */
-#define HASH_SELECT(hh_dst, dst, hh_src, src, cond)                              \
-do {                                                                             \
-  unsigned _src_bkt, _dst_bkt;                                                   \
-  void *_last_elt=NULL, *_elt;                                                   \
-  UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL;                         \
-  ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst));                 \
-  if (src) {                                                                     \
-    for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) {     \
-      for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head;                \
-          _src_hh;                                                               \
-          _src_hh = _src_hh->hh_next) {                                          \
-          _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh);                       \
-          if (cond(_elt)) {                                                      \
-            _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho);               \
-            _dst_hh->key = _src_hh->key;                                         \
-            _dst_hh->keylen = _src_hh->keylen;                                   \
-            _dst_hh->hashv = _src_hh->hashv;                                     \
-            _dst_hh->prev = _last_elt;                                           \
-            _dst_hh->next = NULL;                                                \
-            if (_last_elt_hh) { _last_elt_hh->next = _elt; }                     \
-            if (!dst) {                                                          \
-              DECLTYPE_ASSIGN(dst,_elt);                                         \
-              HASH_MAKE_TABLE(hh_dst,dst);                                       \
-            } else {                                                             \
-              _dst_hh->tbl = (dst)->hh_dst.tbl;                                  \
-            }                                                                    \
-            HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt);    \
-            HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh);            \
-            (dst)->hh_dst.tbl->num_items++;                                      \
-            _last_elt = _elt;                                                    \
-            _last_elt_hh = _dst_hh;                                              \
-          }                                                                      \
-      }                                                                          \
-    }                                                                            \
-  }                                                                              \
-  HASH_FSCK(hh_dst,dst);                                                         \
-} while (0)
-
-#define HASH_CLEAR(hh,head)                                                      \
-do {                                                                             \
-  if (head) {                                                                    \
-    uthash_free((head)->hh.tbl->buckets,                                         \
-                (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket));      \
-    HASH_BLOOM_FREE((head)->hh.tbl);                                             \
-    uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                          \
-    (head)=NULL;                                                                 \
-  }                                                                              \
-} while(0)
-
-#define HASH_OVERHEAD(hh,head)                                                   \
- (size_t)((((head)->hh.tbl->num_items   * sizeof(UT_hash_handle))   +            \
-           ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket))   +            \
-            (sizeof(UT_hash_table))                                 +            \
-            (HASH_BLOOM_BYTELEN)))
-
-#ifdef NO_DECLTYPE
-#define HASH_ITER(hh,head,el,tmp)                                                \
-for((el)=(head), (*(char**)(&(tmp)))=(char*)((head)?(head)->hh.next:NULL);       \
-  el; (el)=(tmp),(*(char**)(&(tmp)))=(char*)((tmp)?(tmp)->hh.next:NULL))
-#else
-#define HASH_ITER(hh,head,el,tmp)                                                \
-for((el)=(head),(tmp)=DECLTYPE(el)((head)?(head)->hh.next:NULL);                 \
-  el; (el)=(tmp),(tmp)=DECLTYPE(el)((tmp)?(tmp)->hh.next:NULL))
-#endif
-
-/* obtain a count of items in the hash */
-#define HASH_COUNT(head) HASH_CNT(hh,head)
-#define HASH_CNT(hh,head) ((head)?((head)->hh.tbl->num_items):0)
-
-typedef struct UT_hash_bucket {
-   struct UT_hash_handle *hh_head;
-   unsigned count;
-
-   /* expand_mult is normally set to 0. In this situation, the max chain length
-    * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
-    * the bucket's chain exceeds this length, bucket expansion is triggered).
-    * However, setting expand_mult to a non-zero value delays bucket expansion
-    * (that would be triggered by additions to this particular bucket)
-    * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
-    * (The multiplier is simply expand_mult+1). The whole idea of this
-    * multiplier is to reduce bucket expansions, since they are expensive, in
-    * situations where we know that a particular bucket tends to be overused.
-    * It is better to let its chain length grow to a longer yet-still-bounded
-    * value, than to do an O(n) bucket expansion too often.
-    */
-   unsigned expand_mult;
-
-} UT_hash_bucket;
-
-/* random signature used only to find hash tables in external analysis */
-#define HASH_SIGNATURE 0xa0111fe1
-#define HASH_BLOOM_SIGNATURE 0xb12220f2
-
-typedef struct UT_hash_table {
-   UT_hash_bucket *buckets;
-   unsigned num_buckets, log2_num_buckets;
-   unsigned num_items;
-   struct UT_hash_handle *tail; /* tail hh in app order, for fast append    */
-   ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
-
-   /* in an ideal situation (all buckets used equally), no bucket would have
-    * more than ceil(#items/#buckets) items. that's the ideal chain length. */
-   unsigned ideal_chain_maxlen;
-
-   /* nonideal_items is the number of items in the hash whose chain position
-    * exceeds the ideal chain maxlen. these items pay the penalty for an uneven
-    * hash distribution; reaching them in a chain traversal takes >ideal steps */
-   unsigned nonideal_items;
-
-   /* ineffective expands occur when a bucket doubling was performed, but
-    * afterward, more than half the items in the hash had nonideal chain
-    * positions. If this happens on two consecutive expansions we inhibit any
-    * further expansion, as it's not helping; this happens when the hash
-    * function isn't a good fit for the key domain. When expansion is inhibited
-    * the hash will still work, albeit no longer in constant time. */
-   unsigned ineff_expands, noexpand;
-
-   uint32_t signature; /* used only to find hash tables in external analysis */
-#ifdef HASH_BLOOM
-   uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
-   uint8_t *bloom_bv;
-   char bloom_nbits;
-#endif
-
-} UT_hash_table;
-
-typedef struct UT_hash_handle {
-   struct UT_hash_table *tbl;
-   void *prev;                       /* prev element in app order      */
-   void *next;                       /* next element in app order      */
-   struct UT_hash_handle *hh_prev;   /* previous hh in bucket order    */
-   struct UT_hash_handle *hh_next;   /* next hh in bucket order        */
-   void *key;                        /* ptr to enclosing struct's key  */
-   unsigned keylen;                  /* enclosing struct's key len     */
-   unsigned hashv;                   /* result of hash-fcn(key)        */
-} UT_hash_handle;
-
-#endif /* UTHASH_H */
diff --git a/prov/psm/libfabric-psm.spec.in b/prov/psm/libfabric-psm.spec.in
new file mode 100644
index 0000000..ec22cb8
--- /dev/null
+++ b/prov/psm/libfabric-psm.spec.in
@@ -0,0 +1,52 @@
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+%{!?provider: %define provider psm}
+%{!?provider_formal: %define provider_formal PSM}
+
+Name: libfabric-%{provider}
+Version: @VERSION@
+Release: 1%{?dist}
+Summary: Dynamic %{provider_formal} provider for user-space Open Fabric Interfaces
+Group: System Environment/Libraries
+License: GPLv2 or BSD
+Url: http://www.github.com/ofiwg/libfabric
+Source: http://www.github.org/ofiwg/%{name}/releases/download/v{%version}/libfabric-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Requires: libfabric
+BuildRequires: libfabric
+
+%description
+libfabric provides a user-space API to access high-performance fabric
+services, such as RDMA.
+
+This RPM provides the %{provider_formal} provider as a "plugin" to an existing
+libfabric installation.  This plugin will override older %{provider_formal}
+provider functionality in the existing libfabric installation.
+
+%prep
+%setup -q -n libfabric-%{version}
+
+%build
+%configure %{configopts} --enable-%{provider}=dl
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall installdirs
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libfabric/*.so
+
+%exclude %{_libdir}/libfabric.*
+%exclude %{_libdir}/libfabric/*.la
+%exclude %{_libdir}/pkgconfig
+%exclude %{_bindir}
+%exclude %{_mandir}
+%exclude %{_includedir}
+
+%changelog
+* Wed May 24 2017 Open Fabrics Interfaces Working Group <ofiwg at lists.openfabrics.org>
+- First release of specfile for packaging a single dl provider.
diff --git a/prov/psm/src/psmx.h b/prov/psm/src/psmx.h
index b8ff0f9..ebd32f3 100644
--- a/prov/psm/src/psmx.h
+++ b/prov/psm/src/psmx.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -48,6 +48,7 @@ extern "C" {
 #include <errno.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <pthread.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -63,6 +64,7 @@ extern "C" {
 #include <rdma/fi_cm.h>
 #include <rdma/fi_errno.h>
 #include "fi.h"
+#include "ofi_atomic.h"
 #include "fi_enosys.h"
 #include "fi_list.h"
 #include "fi_util.h"
@@ -74,7 +76,7 @@ extern struct fi_provider psmx_prov;
 
 extern int psmx_am_compat_mode;
 
-#define PSMX_VERSION	(FI_VERSION(1,3))
+#define PSMX_VERSION	(FI_VERSION(1,5))
 
 #define PSMX_OP_FLAGS	(FI_INJECT | FI_MULTI_RECV | FI_COMPLETION | \
 			 FI_TRIGGER | FI_INJECT_COMPLETE | \
@@ -91,6 +93,8 @@ extern int psmx_am_compat_mode;
 #define PSMX_SUB_CAPS	(FI_READ | FI_WRITE | FI_REMOTE_READ | FI_REMOTE_WRITE | \
 			 FI_SEND | FI_RECV)
 
+#define PSMX_DOM_CAPS	(FI_LOCAL_COMM | FI_REMOTE_COMM)
+
 #define PSMX_MAX_MSG_SIZE	((0x1ULL << 32) - 1)
 #define PSMX_INJECT_SIZE	(64)
 #define PSMX_MSG_ORDER	FI_ORDER_SAS
@@ -242,7 +246,7 @@ struct psmx_fid_fabric {
 	struct util_fabric	util_fabric;
 	struct psmx_fid_domain	*active_domain;
 	psm_uuid_t		uuid;
-	pthread_t		name_server_thread;
+	struct util_ns		name_server;
 };
 
 struct psmx_fid_domain {
@@ -295,12 +299,13 @@ struct psmx_fid_domain {
 
 #define PSMX_DEFAULT_UNIT	(-1)
 #define PSMX_DEFAULT_PORT	0
-#define PSMX_DEFAULT_SERVICE	0
+#define PSMX_ANY_SERVICE	0
 
 struct psmx_src_name {
-	int	unit;		/* start from 0. -1 means any */
-	int	port;		/* start from 1. 0 means any */
-	int	service;	/* 0 means any */
+	uint16_t	signature;	/* 0xFFFF, different from any valid epid */
+	int8_t		unit;		/* start from 0. -1 means any */
+	uint8_t		port;		/* start from 1. 0 means any */
+	uint32_t	service;	/* 0 means any */
 };
 
 struct psmx_cq_event {
@@ -468,8 +473,8 @@ struct psmx_fid_cntr {
 	struct psmx_fid_domain	*domain;
 	int			events;
 	uint64_t		flags;
-	atomic_t		counter;
-	atomic_t		error_counter;
+	ofi_atomic64_t		counter;
+	ofi_atomic64_t		error_counter;
 	struct util_wait	*wait;
 	int			wait_is_local;
 	struct psmx_trigger	*trigger;
@@ -508,10 +513,11 @@ struct psmx_fid_ep {
 	uint64_t		tx_flags;
 	uint64_t		rx_flags;
 	uint64_t		caps;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	struct fi_context	nocomp_send_context;
 	struct fi_context	nocomp_recv_context;
 	size_t			min_multi_recv;
+	int			service;
 };
 
 struct psmx_fid_stx {
@@ -584,32 +590,50 @@ int	psmx_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 		     struct fid_av **av, void *context);
 int	psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 		       struct fid_cntr **cntr, void *context);
+int	psmx_query_atomic(struct fid_domain *doamin, enum fi_datatype datatype,
+			  enum fi_op op, struct fi_atomic_attr *attr,
+			  uint64_t flags);
 
 static inline void psmx_fabric_acquire(struct psmx_fid_fabric *fabric)
 {
-	atomic_inc(&fabric->util_fabric.ref);
+	ofi_atomic_inc32(&fabric->util_fabric.ref);
 }
 
 static inline void psmx_fabric_release(struct psmx_fid_fabric *fabric)
 {
-	atomic_dec(&fabric->util_fabric.ref);
+	ofi_atomic_dec32(&fabric->util_fabric.ref);
 }
 
 static inline void psmx_domain_acquire(struct psmx_fid_domain *domain)
 {
-	atomic_inc(&domain->util_domain.ref);
+	ofi_atomic_inc32(&domain->util_domain.ref);
 }
 
 static inline void psmx_domain_release(struct psmx_fid_domain *domain)
 {
-	atomic_dec(&domain->util_domain.ref);
+	ofi_atomic_dec32(&domain->util_domain.ref);
 }
 
 int	psmx_domain_check_features(struct psmx_fid_domain *domain, int ep_cap);
 int	psmx_domain_enable_ep(struct psmx_fid_domain *domain, struct psmx_fid_ep *ep);
 void	psmx_domain_disable_ep(struct psmx_fid_domain *domain, struct psmx_fid_ep *ep);
-void 	*psmx_name_server(void *args);
-void	*psmx_resolve_name(const char *servername, int port);
+
+static inline
+int	psmx_ns_service_cmp(void *svc1, void *svc2)
+{
+	int service1 = *(int *)svc1, service2 = *(int *)svc2;
+	if (service1 == PSMX_ANY_SERVICE ||
+	    service2 == PSMX_ANY_SERVICE)
+		return 0;
+	return (service1 < service2) ? -1 : (service1 > service2);
+}
+
+static inline
+int	psmx_ns_is_service_wildcard(void *svc)
+{
+	return (*(int *)svc == PSMX_ANY_SERVICE);
+}
+
 void	psmx_get_uuid(psm_uuid_t uuid);
 int	psmx_uuid_to_port(psm_uuid_t uuid);
 char	*psmx_uuid_to_string(psm_uuid_t uuid);
@@ -654,7 +678,7 @@ void	psmx_cntr_add_trigger(struct psmx_fid_cntr *cntr, struct psmx_trigger *trig
 
 static inline void psmx_cntr_inc(struct psmx_fid_cntr *cntr)
 {
-	atomic_inc(&cntr->counter);
+	ofi_atomic_inc64(&cntr->counter);
 	psmx_cntr_check_trigger(cntr);
 	if (cntr->wait)
 		cntr->wait->signal(cntr->wait);
diff --git a/prov/psm/src/psmx_am.c b/prov/psm/src/psmx_am.c
index ddb032e..a74585e 100644
--- a/prov/psm/src/psmx_am.c
+++ b/prov/psm/src/psmx_am.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm/src/psmx_atomic.c b/prov/psm/src/psmx_atomic.c
index f66bbf6..acedc33 100644
--- a/prov/psm/src/psmx_atomic.c
+++ b/prov/psm/src/psmx_atomic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -397,7 +397,7 @@ int psmx_am_atomic_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 		key = args[3].u64;
 		datatype = args[4].u32w0;
 		op = args[4].u32w1;
-		assert(len == fi_datatype_size(datatype) * count);
+		assert(len == ofi_datatype_size(datatype) * count);
 
 		mr = psmx_mr_get(psmx_active_fabric->active_domain, key);
 		op_error = mr ?
@@ -435,9 +435,9 @@ int psmx_am_atomic_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 		op = args[4].u32w1;
 
 		if (op == FI_ATOMIC_READ)
-			len = fi_datatype_size(datatype) * count;
+			len = ofi_datatype_size(datatype) * count;
 
-		assert(len == fi_datatype_size(datatype) * count);
+		assert(len == ofi_datatype_size(datatype) * count);
 
 		mr = psmx_mr_get(psmx_active_fabric->active_domain, key);
 		op_error = mr ?
@@ -485,7 +485,7 @@ int psmx_am_atomic_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 		datatype = args[4].u32w0;
 		op = args[4].u32w1;
 		len /= 2;
-		assert(len == fi_datatype_size(datatype) * count);
+		assert(len == ofi_datatype_size(datatype) * count);
 
 		mr = psmx_mr_get(psmx_active_fabric->active_domain, key);
 		op_error = mr ?
@@ -526,7 +526,7 @@ int psmx_am_atomic_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 		req = (struct psmx_am_request *)(uintptr_t)args[1].u64;
 		op_error = (int)args[0].u32w1;
 		assert(req->op == PSMX_AM_REQ_ATOMIC_WRITE);
-		if (req->ep->send_cq && !req->no_event) {
+		if (req->ep->send_cq && (!req->no_event || op_error)) {
 			event = psmx_cq_create_event(
 					req->ep->send_cq,
 					req->atomic.context,
@@ -558,7 +558,7 @@ int psmx_am_atomic_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 		if (!op_error)
 			memcpy(req->atomic.result, src, len);
 
-		if (req->ep->send_cq && !req->no_event) {
+		if (req->ep->send_cq && (!req->no_event || op_error)) {
 			event = psmx_cq_create_event(
 					req->ep->send_cq,
 					req->atomic.context,
@@ -616,7 +616,7 @@ static int psmx_atomic_self(int am_cmd,
 	else
 		access = FI_REMOTE_READ | FI_REMOTE_WRITE;
 
-	len = fi_datatype_size(datatype) * count;
+	len = ofi_datatype_size(datatype) * count;
 	mr = psmx_mr_get(psmx_active_fabric->active_domain, key);
 	op_error = mr ?  psmx_mr_validate(mr, addr, len, access) : -FI_EINVAL;
 
@@ -695,7 +695,7 @@ static int psmx_atomic_self(int am_cmd,
 gen_local_event:
 	no_event = ((flags & PSMX_NO_COMPLETION) ||
 		    (ep->send_selective_completion && !(flags & FI_COMPLETION)));
-	if (ep->send_cq && !no_event) {
+	if (ep->send_cq && (!no_event || op_error)) {
 		event = psmx_cq_create_event(
 				ep->send_cq,
 				context,
@@ -778,10 +778,10 @@ ssize_t _psmx_atomic_write(struct fid_ep *ep,
 	if (!buf)
 		return -FI_EINVAL;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EINVAL;
 
-	if (op < 0 || op >= FI_ATOMIC_OP_LAST)
+	if (op >= FI_ATOMIC_OP_LAST)
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
@@ -804,7 +804,7 @@ ssize_t _psmx_atomic_write(struct fid_ep *ep,
 					context, flags);
 
 	chunk_size = MIN(PSMX_AM_CHUNK_SIZE, psmx_am_param.max_request_short);
-	len = fi_datatype_size(datatype)* count;
+	len = ofi_datatype_size(datatype)* count;
 	if (len > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -965,10 +965,10 @@ ssize_t _psmx_atomic_readwrite(struct fid_ep *ep,
 	if (!buf && op != FI_ATOMIC_READ)
 		return -FI_EINVAL;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EINVAL;
 
-	if (op < 0 || op >= FI_ATOMIC_OP_LAST)
+	if (op >= FI_ATOMIC_OP_LAST)
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
@@ -991,7 +991,7 @@ ssize_t _psmx_atomic_readwrite(struct fid_ep *ep,
 					context, flags);
 
 	chunk_size = MIN(PSMX_AM_CHUNK_SIZE, psmx_am_param.max_request_short);
-	len = fi_datatype_size(datatype) * count;
+	len = ofi_datatype_size(datatype) * count;
 	if (len > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1170,10 +1170,10 @@ ssize_t _psmx_atomic_compwrite(struct fid_ep *ep,
 	if (!buf)
 		return -FI_EINVAL;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EINVAL;
 
-	if (op < 0 || op >= FI_ATOMIC_OP_LAST)
+	if (op >= FI_ATOMIC_OP_LAST)
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
@@ -1197,7 +1197,7 @@ ssize_t _psmx_atomic_compwrite(struct fid_ep *ep,
 					context, flags);
 
 	chunk_size = MIN(PSMX_AM_CHUNK_SIZE, psmx_am_param.max_request_short);
-	len = fi_datatype_size(datatype) * count;
+	len = ofi_datatype_size(datatype) * count;
 	if (len * 2 > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1333,7 +1333,7 @@ static int psmx_atomic_writevalid(struct fid_ep *ep,
 {
 	int chunk_size;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EOPNOTSUPP;
 
 	switch (op) {
@@ -1357,7 +1357,7 @@ static int psmx_atomic_writevalid(struct fid_ep *ep,
 	if (count) {
 		chunk_size = MIN(PSMX_AM_CHUNK_SIZE,
 				 psmx_am_param.max_request_short);
-		*count = chunk_size / fi_datatype_size(datatype);
+		*count = chunk_size / ofi_datatype_size(datatype);
 	}
 	return 0;
 }
@@ -1368,7 +1368,7 @@ static int psmx_atomic_readwritevalid(struct fid_ep *ep,
 {
 	int chunk_size;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EOPNOTSUPP;
 
 	switch (op) {
@@ -1393,7 +1393,7 @@ static int psmx_atomic_readwritevalid(struct fid_ep *ep,
 	if (count) {
 		chunk_size = MIN(PSMX_AM_CHUNK_SIZE,
 				 psmx_am_param.max_request_short);
-		*count = chunk_size / fi_datatype_size(datatype);
+		*count = chunk_size / ofi_datatype_size(datatype);
 	}
 	return 0;
 }
@@ -1404,7 +1404,7 @@ static int psmx_atomic_compwritevalid(struct fid_ep *ep,
 {
 	int chunk_size;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EOPNOTSUPP;
 
 	switch (op) {
@@ -1439,11 +1439,38 @@ static int psmx_atomic_compwritevalid(struct fid_ep *ep,
 	if (count) {
 		chunk_size = MIN(PSMX_AM_CHUNK_SIZE,
 				 psmx_am_param.max_request_short);
-		*count = chunk_size / (2 * fi_datatype_size(datatype));
+		*count = chunk_size / (2 * ofi_datatype_size(datatype));
 	}
 	return 0;
 }
 
+int psmx_query_atomic(struct fid_domain *doamin, enum fi_datatype datatype,
+		      enum fi_op op, struct fi_atomic_attr *attr, uint64_t flags)
+{
+	int ret;
+	size_t count;
+
+	if (flags & FI_TAGGED)
+		return -FI_EOPNOTSUPP;
+
+	if (flags & FI_COMPARE_ATOMIC) {
+		if (flags & FI_FETCH_ATOMIC)
+			return -FI_EINVAL;
+		ret = psmx_atomic_compwritevalid(NULL, datatype, op, &count);
+	} else if (flags & FI_FETCH_ATOMIC) {
+		ret = psmx_atomic_readwritevalid(NULL, datatype, op, &count);
+	} else {
+		ret = psmx_atomic_writevalid(NULL, datatype, op, &count);
+	}
+
+	if (attr && !ret) {
+		attr->size = ofi_datatype_size(datatype);
+		attr->count = count;
+	}
+
+	return ret;
+}
+
 struct fi_ops_atomic psmx_atomic_ops = {
 	.size = sizeof(struct fi_ops_atomic),
 	.write = psmx_atomic_write,
diff --git a/prov/psm/src/psmx_av.c b/prov/psm/src/psmx_av.c
index 5411dd2..06ea62d 100644
--- a/prov/psm/src/psmx_av.c
+++ b/prov/psm/src/psmx_av.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -145,7 +145,7 @@ static int psmx_av_insert(struct fid_av *av, const void *addr, size_t count,
 	psm_error_t *errors;
 	int error_count = 0;
 	int *mask;
-	int i, j;
+	int i, j, ret;
 	fi_addr_t *result = NULL;
 	struct psmx_epaddr_context *epaddr_context;
 
@@ -204,13 +204,16 @@ static int psmx_av_insert(struct fid_av *av, const void *addr, size_t count,
 			(psm_epaddr_t *) fi_addr, 30*1e9);
 
 	for (i=0; i<count; i++){
-		if (!mask[i])
+		if (!mask[i]) {
+			errors[i] = PSM_OK;
 			continue;
+		}
 
 		if (errors[i] == PSM_OK || errors[i] == PSM_EPID_ALREADY_CONNECTED) {
 			psmx_set_epaddr_context(av_priv->domain,
 						((psm_epid_t *) addr)[i],
 						((psm_epaddr_t *) fi_addr)[i]);
+			errors[i] = PSM_OK;
 		} else {
 			psm_epconn_t epconn;
 
@@ -222,6 +225,7 @@ static int psmx_av_insert(struct fid_av *av, const void *addr, size_t count,
 				epaddr_context = psm_epaddr_getctxt(epconn.addr);
 				if (epaddr_context && epaddr_context->epid  == ((psm_epid_t *) addr)[i]) {
 					((psm_epaddr_t *) fi_addr)[i] = epconn.addr;
+					errors[i] = PSM_OK;
 					continue;
 				}
 			}
@@ -244,9 +248,6 @@ static int psmx_av_insert(struct fid_av *av, const void *addr, size_t count,
 		}
 	}
 
-	free(mask);
-	free(errors);
-
 	if (av_priv->type == FI_AV_TABLE) {
 		/* NOTE: unresolved addresses are left in the AV table */
 		if (result) {
@@ -261,11 +262,21 @@ static int psmx_av_insert(struct fid_av *av, const void *addr, size_t count,
 		av_priv->last += count;
 	}
 
-	if (!(av_priv->flags & FI_EVENT))
-		return count - error_count;
+	if (av_priv->flags & FI_EVENT) {
+		psmx_av_post_completion(av_priv, context, count - error_count, 0);
+		ret = 0;
+	} else {
+		if (flags & FI_SYNC_ERR) {
+			int *fi_errors = context;
+			for (i=0; i<count; i++)
+				fi_errors[i] = psmx_errno(errors[i]);
+		}
+		ret = count - error_count;
+	}
 
-	psmx_av_post_completion(av_priv, context, count - error_count, 0);
-	return 0;
+	free(mask);
+	free(errors);
+	return ret;
 }
 
 static int psmx_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
@@ -312,17 +323,7 @@ static int psmx_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr,
 static const char *psmx_av_straddr(struct fid_av *av, const void *addr,
 				   char *buf, size_t *len)
 {
-	int n;
-
-	if (!buf || !len)
-		return NULL;
-
-	n = snprintf(buf, *len, "%lx", (uint64_t)(uintptr_t)addr);
-	if (n < 0)
-		return NULL;
-
-	*len = n + 1;
-	return buf;
+	return ofi_straddr(buf, len, FI_ADDR_PSMX, addr);
 }
 
 static int psmx_av_close(fid_t fid)
diff --git a/prov/psm/src/psmx_cm.c b/prov/psm/src/psmx_cm.c
index d81825c..876fcd7 100644
--- a/prov/psm/src/psmx_cm.c
+++ b/prov/psm/src/psmx_cm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -53,6 +53,7 @@ static int psmx_cm_getname(fid_t fid, void *addr, size_t *addrlen)
 
 struct fi_ops_cm psmx_cm_ops = {
 	.size = sizeof(struct fi_ops_cm),
+	.setname = fi_no_setname,
 	.getname = psmx_cm_getname,
 	.getpeer = fi_no_getpeer,
 	.connect = fi_no_connect,
@@ -60,5 +61,6 @@ struct fi_ops_cm psmx_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
diff --git a/prov/psm/src/psmx_cntr.c b/prov/psm/src/psmx_cntr.c
index 186a51d..07f89fb 100644
--- a/prov/psm/src/psmx_cntr.c
+++ b/prov/psm/src/psmx_cntr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -168,7 +168,7 @@ void psmx_cntr_check_trigger(struct psmx_fid_cntr *cntr)
 
 	trigger = cntr->trigger;
 	while (trigger) {
-		if (atomic_get(&cntr->counter) < trigger->threshold)
+		if (ofi_atomic_get64(&cntr->counter) < trigger->threshold)
 			break;
 
 		cntr->trigger = trigger->next;
@@ -223,7 +223,7 @@ static uint64_t psmx_cntr_read(struct fid_cntr *cntr)
 		poll_cnt = 0;
 	}
 
-	return atomic_get(&cntr_priv->counter);
+	return ofi_atomic_get64(&cntr_priv->counter);
 }
 
 static uint64_t psmx_cntr_readerr(struct fid_cntr *cntr)
@@ -232,7 +232,7 @@ static uint64_t psmx_cntr_readerr(struct fid_cntr *cntr)
 
 	cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr);
 
-	return atomic_get(&cntr_priv->error_counter);
+	return ofi_atomic_get64(&cntr_priv->error_counter);
 }
 
 static int psmx_cntr_add(struct fid_cntr *cntr, uint64_t value)
@@ -240,7 +240,7 @@ static int psmx_cntr_add(struct fid_cntr *cntr, uint64_t value)
 	struct psmx_fid_cntr *cntr_priv;
 
 	cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr);
-	atomic_add(&cntr_priv->counter, value);
+	ofi_atomic_add64(&cntr_priv->counter, value);
 
 	psmx_cntr_check_trigger(cntr_priv);
 
@@ -255,7 +255,37 @@ static int psmx_cntr_set(struct fid_cntr *cntr, uint64_t value)
 	struct psmx_fid_cntr *cntr_priv;
 
 	cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr);
-	atomic_set(&cntr_priv->counter, value);
+	ofi_atomic_set64(&cntr_priv->counter, value);
+
+	psmx_cntr_check_trigger(cntr_priv);
+
+	if (cntr_priv->wait)
+		cntr_priv->wait->signal(cntr_priv->wait);
+
+	return 0;
+}
+
+static int psmx_cntr_adderr(struct fid_cntr *cntr, uint64_t value)
+{
+	struct psmx_fid_cntr *cntr_priv;
+
+	cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr);
+	ofi_atomic_add64(&cntr_priv->error_counter, value);
+
+	psmx_cntr_check_trigger(cntr_priv);
+
+	if (cntr_priv->wait)
+		cntr_priv->wait->signal(cntr_priv->wait);
+
+	return 0;
+}
+
+static int psmx_cntr_seterr(struct fid_cntr *cntr, uint64_t value)
+{
+	struct psmx_fid_cntr *cntr_priv;
+
+	cntr_priv = container_of(cntr, struct psmx_fid_cntr, cntr);
+	ofi_atomic_set64(&cntr_priv->error_counter, value);
 
 	psmx_cntr_check_trigger(cntr_priv);
 
@@ -276,7 +306,7 @@ static int psmx_cntr_wait(struct fid_cntr *cntr, uint64_t threshold, int timeout
 
 	clock_gettime(CLOCK_REALTIME, &ts0);
 
-	while (atomic_get(&cntr_priv->counter) < threshold) {
+	while (ofi_atomic_get64(&cntr_priv->counter) < threshold) {
 		if (cntr_priv->wait) {
 			ret = fi_wait((struct fid_wait *)cntr_priv->wait,
 				      timeout - msec_passed);
@@ -286,7 +316,7 @@ static int psmx_cntr_wait(struct fid_cntr *cntr, uint64_t threshold, int timeout
 			psmx_progress(cntr_priv->domain);
 		}
 
-		if (atomic_get(&cntr_priv->counter) >= threshold)
+		if (ofi_atomic_get64(&cntr_priv->counter) >= threshold)
 			break;
 
 		if (timeout < 0)
@@ -371,6 +401,8 @@ static struct fi_ops_cntr psmx_cntr_ops = {
 	.add = psmx_cntr_add,
 	.set = psmx_cntr_set,
 	.wait = psmx_cntr_wait,
+	.adderr = psmx_cntr_adderr,
+	.seterr = psmx_cntr_seterr,
 };
 
 int psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
@@ -404,6 +436,7 @@ int psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 
 	switch (attr->wait_obj) {
 	case FI_WAIT_NONE:
+	case FI_WAIT_UNSPEC:
 		break;
 
 	case FI_WAIT_SET:
@@ -415,7 +448,6 @@ int psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 		wait = attr->wait_set;
 		break;
 
-	case FI_WAIT_UNSPEC:
 	case FI_WAIT_FD:
 	case FI_WAIT_MUTEX_COND:
 		wait_attr.wait_obj = attr->wait_obj;
@@ -450,8 +482,8 @@ int psmx_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 	cntr_priv->cntr.fid.context = context;
 	cntr_priv->cntr.fid.ops = &psmx_fi_ops;
 	cntr_priv->cntr.ops = &psmx_cntr_ops;
-	atomic_initialize(&cntr_priv->counter, 0);
-	atomic_initialize(&cntr_priv->error_counter, 0);
+	ofi_atomic_initialize64(&cntr_priv->counter, 0);
+	ofi_atomic_initialize64(&cntr_priv->error_counter, 0);
 
 	pthread_mutex_init(&cntr_priv->trigger_lock, NULL);
 
diff --git a/prov/psm/src/psmx_cq.c b/prov/psm/src/psmx_cq.c
index 8a11ff0..0033708 100644
--- a/prov/psm/src/psmx_cq.c
+++ b/prov/psm/src/psmx_cq.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -47,10 +47,11 @@ static struct psmx_cq_event *psmx_cq_dequeue_event(struct psmx_fid_cq *cq)
 {
 	struct slist_entry *entry;
 
-	if (slist_empty(&cq->event_queue))
-		return NULL;
-
 	fastlock_acquire(&cq->lock);
+	if (slist_empty(&cq->event_queue)) {
+		fastlock_release(&cq->lock);
+		return NULL;
+	}
 	entry = slist_remove_head(&cq->event_queue);
 	cq->event_count--;
 	fastlock_release(&cq->lock);
@@ -106,6 +107,7 @@ struct psmx_cq_event *psmx_cq_create_event(struct psmx_fid_cq *cq,
 		event->cqe.err.data = data;
 		event->cqe.err.tag = tag;
 		event->cqe.err.olen = olen;
+		event->cqe.err.flags = flags;
 		event->cqe.err.prov_errno = PSM_INTERNAL_ERR;
 		goto out;
 	}
@@ -165,11 +167,22 @@ static struct psmx_cq_event *psmx_cq_create_event_from_status(
 	uint64_t flags;
 
 	switch((int)PSMX_CTXT_TYPE(fi_context)) {
+	case PSMX_NOCOMP_SEND_CONTEXT: /* error only */
+		op_context = NULL;
+		buf = NULL;
+		flags = FI_SEND | FI_MSG;
+		break;
 	case PSMX_SEND_CONTEXT:
 		op_context = fi_context;
 		buf = PSMX_CTXT_USER(fi_context);
 		flags = FI_SEND | FI_MSG;
 		break;
+	case PSMX_NOCOMP_RECV_CONTEXT: /* error only */
+		op_context = NULL;
+		buf = NULL;
+		flags = FI_RECV | FI_MSG;
+		is_recv = 1;
+		break;
 	case PSMX_RECV_CONTEXT:
 		op_context = fi_context;
 		buf = PSMX_CTXT_USER(fi_context);
@@ -196,11 +209,13 @@ static struct psmx_cq_event *psmx_cq_create_event_from_status(
 		flags = FI_RECV | FI_TAGGED;
 		is_recv = 1;
 		break;
+	case PSMX_NOCOMP_READ_CONTEXT: /* error only */
 	case PSMX_READ_CONTEXT:
 		op_context = PSMX_CTXT_USER(fi_context);
 		buf = NULL;
 		flags = FI_READ | FI_RMA;
 		break;
+	case PSMX_NOCOMP_WRITE_CONTEXT: /* error only */
 	case PSMX_WRITE_CONTEXT:
 		op_context = PSMX_CTXT_USER(fi_context);
 		buf = NULL;
@@ -377,8 +392,12 @@ int psmx_cq_poll_mq(struct psmx_fid_cq *cq, struct psmx_fid_domain *domain,
 			case PSMX_SEND_CONTEXT:
 			case PSMX_TSEND_CONTEXT:
 				tmp_cq = tmp_ep->send_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->send_cntr;
+				break;
+
 			case PSMX_NOCOMP_SEND_CONTEXT:
+				if (psm_status.error_code)
+					tmp_cq = tmp_ep->send_cq;
 				tmp_cntr = tmp_ep->send_cntr;
 				break;
 
@@ -388,22 +407,34 @@ int psmx_cq_poll_mq(struct psmx_fid_cq *cq, struct psmx_fid_domain *domain,
 			case PSMX_RECV_CONTEXT:
 			case PSMX_TRECV_CONTEXT:
 				tmp_cq = tmp_ep->recv_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->recv_cntr;
+				break;
+
 			case PSMX_NOCOMP_RECV_CONTEXT:
+				if (psm_status.error_code)
+					tmp_cq = tmp_ep->recv_cq;
 				tmp_cntr = tmp_ep->recv_cntr;
 				break;
 
 			case PSMX_WRITE_CONTEXT:
 				tmp_cq = tmp_ep->send_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->write_cntr;
+				break;
+
 			case PSMX_NOCOMP_WRITE_CONTEXT:
+				if (psm_status.error_code)
+					tmp_cq = tmp_ep->send_cq;
 				tmp_cntr = tmp_ep->write_cntr;
 				break;
 
 			case PSMX_READ_CONTEXT:
 				tmp_cq = tmp_ep->send_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->read_cntr;
+				break;
+
 			case PSMX_NOCOMP_READ_CONTEXT:
+				if (psm_status.error_code)
+					tmp_cq = tmp_ep->send_cq;
 				tmp_cntr = tmp_ep->read_cntr;
 				break;
 
@@ -606,11 +637,18 @@ static ssize_t psmx_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf,
 			       uint64_t flags)
 {
 	struct psmx_fid_cq *cq_priv;
+	uint32_t api_version;
+	size_t size;
 
 	cq_priv = container_of(cq, struct psmx_fid_cq, cq);
 
 	if (cq_priv->pending_error) {
-		memcpy(buf, &cq_priv->pending_error->cqe, sizeof *buf);
+		api_version = cq_priv->domain->fabric->util_fabric.
+			      fabric_fid.api_version;
+		size = FI_VERSION_GE(api_version, FI_VERSION(1, 5)) ?
+			sizeof(*buf) : sizeof(struct fi_cq_err_entry_1_0);
+
+		memcpy(buf, &cq_priv->pending_error->cqe, size);
 		free(cq_priv->pending_error);
 		cq_priv->pending_error = NULL;
 		return 1;
diff --git a/prov/psm/src/psmx_domain.c b/prov/psm/src/psmx_domain.c
index c91f554..5f4011c 100644
--- a/prov/psm/src/psmx_domain.c
+++ b/prov/psm/src/psmx_domain.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -182,7 +182,7 @@ static int psmx_domain_close(fid_t fid)
 			      util_domain.domain_fid.fid);
 
 	FI_INFO(&psmx_prov, FI_LOG_DOMAIN, "refcnt=%d\n",
-		atomic_get(&domain->util_domain.ref));
+		ofi_atomic_get32(&domain->util_domain.ref));
 
 	psmx_domain_release(domain);
 
@@ -245,6 +245,7 @@ static struct fi_ops_domain psmx_domain_ops = {
 	.poll_open = fi_poll_create,
 	.stx_ctx = psmx_stx_ctx,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = psmx_query_atomic,
 };
 
 static int psmx_key_compare(void *key1, void *key2)
diff --git a/prov/psm/src/psmx_ep.c b/prov/psm/src/psmx_ep.c
index 278b12d..efda0b9 100644
--- a/prov/psm/src/psmx_ep.c
+++ b/prov/psm/src/psmx_ep.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -175,17 +175,17 @@ static int psmx_ep_close(fid_t fid)
 	ep = container_of(fid, struct psmx_fid_ep, ep.fid);
 
 	if (ep->base_ep) {
-		atomic_dec(&ep->base_ep->ref);
+		ofi_atomic_dec32(&ep->base_ep->ref);
 		return 0;
 	}
 
-	if (atomic_get(&ep->ref))
+	if (ofi_atomic_get32(&ep->ref))
 		return -FI_EBUSY;
 
+	ofi_ns_del_local_name(&ep->domain->fabric->name_server,
+			      &ep->service, &ep->domain->psm_epid);
 	psmx_domain_disable_ep(ep->domain, ep);
-
 	psmx_domain_release(ep->domain);
-
 	free(ep);
 
 	return 0;
@@ -328,7 +328,7 @@ static int psmx_ep_control(fid_t fid, int command, void *arg)
 			return err;
 		}
 		new_ep->base_ep = ep;
-		atomic_inc(&ep->ref);
+		ofi_atomic_inc32(&ep->ref);
 		psmx_ep_optimize_ops(new_ep);
 		*alias->fid = &new_ep->ep.fid;
 		break;
@@ -418,6 +418,23 @@ int psmx_ep_open(struct fid_domain *domain, struct fi_info *info,
 	if (!domain_priv)
 		return -FI_EINVAL;
 
+	if (info && info->ep_attr && info->ep_attr->auth_key) {
+		if (info->ep_attr->auth_key_size != sizeof(psm_uuid_t)) {
+			FI_WARN(&psmx_prov, FI_LOG_EP_CTRL,
+				"Invalid auth_key_len %d, should be %d.\n",
+				info->ep_attr->auth_key_size,
+				sizeof(psm_uuid_t));
+			return -FI_EINVAL;
+		}
+		if (memcmp(domain_priv->fabric->uuid, info->ep_attr->auth_key,
+			   sizeof(psm_uuid_t))) {
+			FI_WARN(&psmx_prov, FI_LOG_EP_CTRL,
+				"Invalid auth_key: %s\n",
+				psmx_uuid_to_string((void *)info->ep_attr->auth_key));
+			return -FI_EINVAL;
+		}
+	}
+
 	err = psmx_domain_check_features(domain_priv, ep_cap);
 	if (err)
 		return err; 
@@ -432,7 +449,7 @@ int psmx_ep_open(struct fid_domain *domain, struct fi_info *info,
 	ep_priv->ep.ops = &psmx_ep_ops;
 	ep_priv->ep.cm = &psmx_cm_ops;
 	ep_priv->domain = domain_priv;
-	atomic_initialize(&ep_priv->ref, 0);
+	ofi_atomic_initialize32(&ep_priv->ref, 0);
 
 	PSMX_CTXT_TYPE(&ep_priv->nocomp_send_context) = PSMX_NOCOMP_SEND_CONTEXT;
 	PSMX_CTXT_EP(&ep_priv->nocomp_send_context) = ep_priv;
@@ -469,6 +486,17 @@ int psmx_ep_open(struct fid_domain *domain, struct fi_info *info,
 
 	psmx_ep_optimize_ops(ep_priv);
 
+	ep_priv->service = PSMX_ANY_SERVICE;
+	if (info && info->src_addr)
+		ep_priv->service = ((struct psmx_src_name *)info->src_addr)->service;
+
+	if (ep_priv->service == PSMX_ANY_SERVICE)
+		ep_priv->service = ((getpid() & 0x7FFF) << 16) +
+				   ((uintptr_t)ep_priv & 0xFFFF);
+
+	ofi_ns_add_local_name(&ep_priv->domain->fabric->name_server,
+			      &ep_priv->service, &ep_priv->domain->psm_epid);
+
 	*ep = &ep_priv->ep;
 
 	return 0;
diff --git a/prov/psm/src/psmx_fabric.c b/prov/psm/src/psmx_fabric.c
index 9dba71b..b74cdbc 100644
--- a/prov/psm/src/psmx_fabric.c
+++ b/prov/psm/src/psmx_fabric.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -37,38 +37,21 @@ struct psmx_fid_fabric *psmx_active_fabric = NULL;
 static int psmx_fabric_close(fid_t fid)
 {
 	struct psmx_fid_fabric *fabric;
-	void *exit_code;
-	int ret;
 
 	fabric = container_of(fid, struct psmx_fid_fabric,
 			      util_fabric.fabric_fid.fid);
 
 	FI_INFO(&psmx_prov, FI_LOG_CORE, "refcnt=%d\n",
-		atomic_get(&fabric->util_fabric.ref));
+		ofi_atomic_get32(&fabric->util_fabric.ref));
+
+	if (psmx_env.name_server)
+		ofi_ns_stop_server(&fabric->name_server);
 
 	psmx_fabric_release(fabric);
 
 	if (ofi_fabric_close(&fabric->util_fabric))
 		return 0;
 
-	if (psmx_env.name_server &&
-	    !pthread_equal(fabric->name_server_thread, pthread_self())) {
-		ret = pthread_cancel(fabric->name_server_thread);
-		if (ret) {
-			FI_INFO(&psmx_prov, FI_LOG_CORE,
-				"pthread_cancel returns %d\n", ret);
-		}
-		ret = pthread_join(fabric->name_server_thread, &exit_code);
-		if (ret) {
-			FI_INFO(&psmx_prov, FI_LOG_CORE,
-				"pthread_join returns %d\n", ret);
-		} else {
-			FI_INFO(&psmx_prov, FI_LOG_CORE,
-				"name server thread exited with code %ld (%s)\n",
-				(uintptr_t)exit_code,
-				(exit_code == PTHREAD_CANCELED) ? "PTHREAD_CANCELED" : "?");
-		}
-	}
 	if (fabric->active_domain) {
 		FI_WARN(&psmx_prov, FI_LOG_CORE, "forced closing of active_domain\n");
 		fi_close(&fabric->active_domain->util_domain.domain_fid.fid);
@@ -120,11 +103,33 @@ int psmx_fabric(struct fi_fabric_attr *attr,
 	if (!fabric_priv)
 		return -FI_ENOMEM;
 
+	psmx_get_uuid(fabric_priv->uuid);
+	if (psmx_env.name_server) {
+		struct util_ns_attr ns_attr = {
+			.ns_port = psmx_uuid_to_port(fabric_priv->uuid),
+			.name_len = sizeof(psm_epid_t),
+			.service_len = sizeof(int),
+			.service_cmp = psmx_ns_service_cmp,
+			.is_service_wildcard = psmx_ns_is_service_wildcard,
+		};
+		ret = ofi_ns_init(&ns_attr,
+				  &fabric_priv->name_server);
+		if (ret) {
+			FI_INFO(&psmx_prov, FI_LOG_CORE,
+			        "ofi_ns_init returns %d\n", ret);
+			free(fabric_priv);
+			return ret;
+		}
+
+		ofi_ns_start_server(&fabric_priv->name_server);
+	}
+
 	ret = ofi_fabric_init(&psmx_prov, &psmx_fabric_attr, attr,
-			     &fabric_priv->util_fabric, context,
-			     FI_MATCH_EXACT);
+			      &fabric_priv->util_fabric, context);
 	if (ret) {
 		FI_INFO(&psmx_prov, FI_LOG_CORE, "ofi_fabric_init returns %d\n", ret);
+		if (psmx_env.name_server)
+			ofi_ns_stop_server(&fabric_priv->name_server);
 		free(fabric_priv);
 		return ret;
 	}
@@ -133,18 +138,6 @@ int psmx_fabric(struct fi_fabric_attr *attr,
 	fabric_priv->util_fabric.fabric_fid.fid.ops = &psmx_fabric_fi_ops;
 	fabric_priv->util_fabric.fabric_fid.ops = &psmx_fabric_ops;
 
-	psmx_get_uuid(fabric_priv->uuid);
-
-	if (psmx_env.name_server) {
-		ret = pthread_create(&fabric_priv->name_server_thread, NULL,
-				     psmx_name_server, (void *)fabric_priv);
-		if (ret) {
-			FI_INFO(&psmx_prov, FI_LOG_CORE, "pthread_create returns %d\n", ret);
-			/* use the main thread's ID as invalid value for the new thread */
-			fabric_priv->name_server_thread = pthread_self();
-		}
-	}
-
 	psmx_query_mpi();
 
 	/* take the reference to count for multiple fabric open calls */
diff --git a/prov/psm/src/psmx_init.c b/prov/psm/src/psmx_init.c
index d545b82..f3daa08 100644
--- a/prov/psm/src/psmx_init.c
+++ b/prov/psm/src/psmx_init.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -34,6 +34,8 @@
 #include "prov.h"
 
 static int psmx_init_count = 0;
+static int psmx_lib_initialized = 0;
+static pthread_mutex_t psmx_lib_mutex; 
 
 struct psmx_env psmx_env = {
 	.name_server	= 1,
@@ -63,6 +65,51 @@ static void psmx_init_env(void)
 	fi_param_get_str(&psmx_prov, "prog_affinity", &psmx_env.prog_affinity);
 }
 
+static int psmx_init_lib(void)
+{
+	int major, minor;
+	int ret = 0, err;
+
+	if (psmx_lib_initialized)
+		return 0;
+
+	pthread_mutex_lock(&psmx_lib_mutex);
+
+	if (psmx_lib_initialized)
+		goto out;
+
+	psm_error_register_handler(NULL, PSM_ERRHANDLER_NO_HANDLER);
+
+	major = PSM_VERNO_MAJOR;
+	minor = PSM_VERNO_MINOR;
+
+	err = psm_init(&major, &minor);
+	if (err != PSM_OK) {
+		FI_WARN(&psmx_prov, FI_LOG_CORE,
+			"psm_init failed: %s\n", psm_error_get_string(err));
+		ret = err;
+		goto out;
+	}
+
+	FI_INFO(&psmx_prov, FI_LOG_CORE,
+		"PSM header version = (%d, %d)\n", PSM_VERNO_MAJOR, PSM_VERNO_MINOR);
+	FI_INFO(&psmx_prov, FI_LOG_CORE,
+		"PSM library version = (%d, %d)\n", major, minor);
+
+	if (major != PSM_VERNO_MAJOR) {
+		psmx_am_compat_mode = 1;
+		FI_INFO(&psmx_prov, FI_LOG_CORE,
+			"PSM AM compat mode enabled: appliation %d.%d, library %d.%d.\n",
+			PSM_VERNO_MAJOR, PSM_VERNO_MINOR, major, minor);
+	}
+
+	psmx_lib_initialized = 1;
+
+out:
+	pthread_mutex_unlock(&psmx_lib_mutex);
+	return ret;
+}
+
 static int psmx_reserve_tag_bits(int *caps, uint64_t *max_tag_value)
 {
 	uint64_t reserved_bits = 0;
@@ -137,11 +184,18 @@ static int psmx_getinfo(uint32_t version, const char *node, const char *service,
 	int caps = 0;
 	uint64_t max_tag_value = 0;
 	int err = -FI_ENODATA;
+	int svc0, svc = PSMX_ANY_SERVICE;
 
 	FI_INFO(&psmx_prov, FI_LOG_CORE,"\n");
 
 	*info = NULL;
 
+	if (FI_VERSION_GE(version, FI_VERSION(1,5)))
+		mr_mode = 0;
+
+	if (psmx_init_lib())
+		return -FI_ENODATA;
+
 	if (psm_ep_num_devunits(&cnt) || !cnt) {
 		FI_INFO(&psmx_prov, FI_LOG_CORE,
 			"no PSM device is found.\n");
@@ -155,31 +209,52 @@ static int psmx_getinfo(uint32_t version, const char *node, const char *service,
 		FI_INFO(&psmx_prov, FI_LOG_CORE,
 			"failed to allocate src addr.\n");
 		return -FI_ENODATA;
-        }
+	}
+	src_addr->signature = 0xFFFF;
 	src_addr->unit = PSMX_DEFAULT_UNIT;
 	src_addr->port = PSMX_DEFAULT_PORT;
-	src_addr->service = PSMX_DEFAULT_SERVICE;
+	src_addr->service = PSMX_ANY_SERVICE;
+
+	if (flags & FI_SOURCE) {
+		if (node)
+			sscanf(node, "%*[^:]:%" SCNi8 ":%" SCNu8, &src_addr->unit, &src_addr->port);
+		if (service)
+			sscanf(service, "%" SCNu32, &src_addr->service);
+		FI_INFO(&psmx_prov, FI_LOG_CORE,
+			"node '%s' service '%s' converted to <unit=%d, port=%d, service=%d>\n",
+			node, service, src_addr->unit, src_addr->port, src_addr->service);
+	} else if (node) {
+		struct util_ns ns = (const struct util_ns){ 0 };
+		struct util_ns_attr ns_attr = (const struct util_ns_attr){ 0 };
+		psm_uuid_t uuid;
+
+		psmx_get_uuid(uuid);
+		ns_attr.ns_port = psmx_uuid_to_port(uuid);
+		ns_attr.name_len = sizeof(*dest_addr);
+		ns_attr.service_len = sizeof(svc);
+		ns_attr.service_cmp = psmx_ns_service_cmp;
+		ns_attr.is_service_wildcard = psmx_ns_is_service_wildcard;
+		err = ofi_ns_init(&ns_attr, &ns);
+		if (err) {
+			FI_INFO(&psmx_prov, FI_LOG_CORE,
+				"ofi_ns_init returns %d\n", err);
+			err = -FI_ENODATA;
+			goto err_out;
+		}
 
-	if (node) {
-		if (flags & FI_SOURCE) {
-			sscanf(node, "%*[^:]:%d:%d", &src_addr->unit, &src_addr->port);
-			if (service)
-				sscanf(service, "%d", &src_addr->service);
+		if (service)
+			svc = atoi(service);
+		svc0 = svc;
+		dest_addr = (psm_epid_t *)ofi_ns_resolve_name(&ns, node, &svc);
+		if (dest_addr) {
 			FI_INFO(&psmx_prov, FI_LOG_CORE,
-				"node '%s' service '%s' converted to <unit=%d, port=%d, service=%d>\n",
-				node, service, src_addr->unit, src_addr->port, src_addr->service);
+				"'%s:%u' resolved to <epid=0x%llx>:%u\n",
+				node, svc0, *dest_addr, svc);
 		} else {
-			dest_addr = psmx_resolve_name(node, 0);
-			if (dest_addr) {
-				FI_INFO(&psmx_prov, FI_LOG_CORE,
-					"node '%s' resolved to <epid=0x%llx>\n", node,
-					*dest_addr);
-			} else {
-				FI_INFO(&psmx_prov, FI_LOG_CORE,
-					"failed to resolve node '%s'.\n", node);
-				err = -FI_ENODATA;
-				goto err_out;
-			}
+			FI_INFO(&psmx_prov, FI_LOG_CORE,
+				"failed to resolve '%s:%u'.\n", node, svc);
+			err = -FI_ENODATA;
+			goto err_out;
 		}
 	}
 
@@ -221,7 +296,8 @@ static int psmx_getinfo(uint32_t version, const char *node, const char *service,
 				goto err_out;
 			}
 
-			if (hints->ep_attr->tx_ctx_cnt > 1) {
+			if (hints->ep_attr->tx_ctx_cnt > 1 &&
+			    hints->ep_attr->tx_ctx_cnt != FI_SHARED_CONTEXT) {
 				FI_INFO(&psmx_prov, FI_LOG_CORE,
 					"hints->ep_attr->tx_ctx_cnt=%d, supported=0,1\n",
 					hints->ep_attr->tx_ctx_cnt);
@@ -316,20 +392,8 @@ static int psmx_getinfo(uint32_t version, const char *node, const char *service,
 				goto err_out;
 			}
 
-			switch (hints->domain_attr->mr_mode) {
-			case FI_MR_UNSPEC:
-				break;
-			case FI_MR_BASIC:
-			case FI_MR_SCALABLE:
-				mr_mode = hints->domain_attr->mr_mode;
-				break;
-			default:
-				FI_INFO(&psmx_prov, FI_LOG_CORE,
-					"hints->domain_attr->mr_mode=%d, supported=%d %d %d\n",
-					hints->domain_attr->mr_mode, FI_MR_UNSPEC, FI_MR_BASIC,
-					FI_MR_SCALABLE);
-				goto err_out;
-			}
+			if (hints->domain_attr->mr_mode & FI_MR_BASIC)
+				mr_mode = FI_MR_BASIC;
 
 			switch (hints->domain_attr->threading) {
 			case FI_THREAD_UNSPEC:
@@ -378,6 +442,13 @@ static int psmx_getinfo(uint32_t version, const char *node, const char *service,
 					FI_PROGRESS_MANUAL, FI_PROGRESS_AUTO);
 				goto err_out;
 			}
+
+			if (hints->domain_attr->caps & FI_SHARED_AV) {
+				FI_INFO(&psmx_prov, FI_LOG_CORE,
+					"hints->domain_attr->caps=%lx, shared AV is unsupported\n",
+					hints->domain_attr->caps);
+				goto err_out;
+			}
 		}
 
 		if (hints->ep_attr) {
@@ -502,6 +573,11 @@ static int psmx_getinfo(uint32_t version, const char *node, const char *service,
 	psmx_info->domain_attr->max_ep_rx_ctx = 1;
 	psmx_info->domain_attr->max_ep_stx_ctx = 65535;
 	psmx_info->domain_attr->max_ep_srx_ctx = 0;
+	psmx_info->domain_attr->cntr_cnt = 65535;
+	psmx_info->domain_attr->mr_iov_limit = 65535;
+	psmx_info->domain_attr->caps = PSMX_DOM_CAPS;
+	psmx_info->domain_attr->mode = 0;
+	psmx_info->domain_attr->mr_cnt = 65535;
 
 	psmx_info->next = NULL;
 	psmx_info->caps = (hints && hints->caps) ? hints->caps : caps;
@@ -550,7 +626,7 @@ static void psmx_fini(void)
 {
 	FI_INFO(&psmx_prov, FI_LOG_CORE, "\n");
 
-	if (! --psmx_init_count) {
+	if (! --psmx_init_count && psmx_lib_initialized) {
 		/* This function is called from a library destructor, which is called
 		 * automatically when exit() is called. The call to psm_finalize()
 		 * might cause deadlock if the applicaiton is terminated with Ctrl-C
@@ -558,18 +634,20 @@ static void psmx_fini(void)
 		 * psm_finalize() tries to acquire. This can be avoided by only
 		 * calling psm_finalize() when PSM is guaranteed to be unused.
 		 */
-		if (psmx_active_fabric)
+		if (psmx_active_fabric) {
 			FI_INFO(&psmx_prov, FI_LOG_CORE,
 				"psmx_active_fabric != NULL, skip psm_finalize\n");
-		else
+		} else {
 			psm_finalize();
+			psmx_lib_initialized = 0;
+		}
 	}
 }
 
 struct fi_provider psmx_prov = {
 	.name = PSMX_PROV_NAME,
-	.version = FI_VERSION(0, 9),
-	.fi_version = FI_VERSION(1, 3),
+	.version = PSMX_VERSION,
+	.fi_version = PSMX_VERSION,
 	.getinfo = psmx_getinfo,
 	.fabric = psmx_fabric,
 	.cleanup = psmx_fini
@@ -577,9 +655,6 @@ struct fi_provider psmx_prov = {
 
 PROVIDER_INI
 {
-	int major, minor;
-	int err;
-
 	FI_INFO(&psmx_prov, FI_LOG_CORE, "\n");
 
 	fi_param_define(&psmx_prov, "name_server", FI_PARAM_BOOL,
@@ -620,30 +695,7 @@ PROVIDER_INI
 			"(when >=0) or core_id - num_cores (when <0). "
 			"(default: affinity not set)");
 
-        psm_error_register_handler(NULL, PSM_ERRHANDLER_NO_HANDLER);
-
-	major = PSM_VERNO_MAJOR;
-	minor = PSM_VERNO_MINOR;
-
-        err = psm_init(&major, &minor);
-	if (err != PSM_OK) {
-		FI_WARN(&psmx_prov, FI_LOG_CORE,
-			"psm_init failed: %s\n", psm_error_get_string(err));
-		return NULL;
-	}
-
-	FI_INFO(&psmx_prov, FI_LOG_CORE,
-		"PSM header version = (%d, %d)\n", PSM_VERNO_MAJOR, PSM_VERNO_MINOR);
-	FI_INFO(&psmx_prov, FI_LOG_CORE,
-		"PSM library version = (%d, %d)\n", major, minor);
-
-	if (major != PSM_VERNO_MAJOR) {
-		psmx_am_compat_mode = 1;
-		FI_INFO(&psmx_prov, FI_LOG_CORE,
-			"PSM AM compat mode enabled: appliation %d.%d, library %d.%d.\n",
-			PSM_VERNO_MAJOR, PSM_VERNO_MINOR, major, minor);
-	}
-
+	pthread_mutex_init(&psmx_lib_mutex, NULL);
 	psmx_init_count++;
 	return (&psmx_prov);
 }
diff --git a/prov/psm/src/psmx_mr.c b/prov/psm/src/psmx_mr.c
index 4cd69d6..5e71a5d 100644
--- a/prov/psm/src/psmx_mr.c
+++ b/prov/psm/src/psmx_mr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -71,18 +71,18 @@ static int psmx_mr_reserve_key(struct psmx_fid_domain *domain,
 
 	fastlock_acquire(&domain->mr_lock);
 
-	if (domain->mr_mode == FI_MR_SCALABLE) {
-		key = requested_key;
-		try_count = 1;
-	} else {
+	if (domain->mr_mode == FI_MR_BASIC) {
 		key = domain->mr_reserved_key;
 		try_count = 10000; /* large enough */
+	} else {
+		key = requested_key;
+		try_count = 1;
 	}
 
 	for (i=0; i<try_count; i++, key++) {
 		if (!rbtFind(domain->mr_map, (void *)key)) {
 			if (!rbtInsert(domain->mr_map, (void *)key, mr)) {
-				if (domain->mr_mode != FI_MR_SCALABLE)
+				if (domain->mr_mode == FI_MR_BASIC)
 					domain->mr_reserved_key = key + 1;
 				*assigned_key = key;
 				err = 0;
@@ -272,9 +272,8 @@ static int psmx_mr_reg(struct fid *fid, const void *buf, size_t len,
 	mr_priv->iov_count = 1;
 	mr_priv->iov[0].iov_base = (void *)buf;
 	mr_priv->iov[0].iov_len = len;
-	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ?
-				((uint64_t)mr_priv->iov[0].iov_base - offset) :
-				0;
+	mr_priv->offset = (domain_priv->mr_mode == FI_MR_BASIC) ? 0 :
+				((uint64_t)mr_priv->iov[0].iov_base - offset);
 
 	*mr = &mr_priv->mr;
 	return 0;
@@ -327,9 +326,8 @@ static int psmx_mr_regv(struct fid *fid,
 	for (i=0; i<count; i++)
 		mr_priv->iov[i] = iov[i];
 	psmx_mr_normalize_iov(mr_priv->iov, &mr_priv->iov_count);
-	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ?
-				((uint64_t)mr_priv->iov[0].iov_base - offset) :
-				0;
+	mr_priv->offset = (domain_priv->mr_mode == FI_MR_BASIC) ? 0 :
+				((uint64_t)mr_priv->iov[0].iov_base - offset);
 
 	*mr = &mr_priv->mr;
 	return 0;
@@ -383,9 +381,8 @@ static int psmx_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
 	for (i=0; i<attr->iov_count; i++)
 		mr_priv->iov[i] = attr->mr_iov[i];
 	psmx_mr_normalize_iov(mr_priv->iov, &mr_priv->iov_count);
-	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ?
-				((uint64_t)mr_priv->iov[0].iov_base - attr->offset) :
-				0;
+	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ? 0 :
+				((uint64_t)mr_priv->iov[0].iov_base - attr->offset);
 
 	*mr = &mr_priv->mr;
 	return 0;
diff --git a/prov/psm/src/psmx_msg.c b/prov/psm/src/psmx_msg.c
index 5c89eed..f14acea 100644
--- a/prov/psm/src/psmx_msg.c
+++ b/prov/psm/src/psmx_msg.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm/src/psmx_msg2.c b/prov/psm/src/psmx_msg2.c
index 57a4d8d..43eed0a 100644
--- a/prov/psm/src/psmx_msg2.c
+++ b/prov/psm/src/psmx_msg2.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm/src/psmx_rma.c b/prov/psm/src/psmx_rma.c
index 424e447..8a62b68 100644
--- a/prov/psm/src/psmx_rma.c
+++ b/prov/psm/src/psmx_rma.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -252,7 +252,7 @@ int psmx_am_rma_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 		if (!req->error)
 			req->error = op_error;
 		if (eom) {
-			if (req->ep->send_cq && !req->no_event) {
+			if (req->ep->send_cq && (!req->no_event || req->error)) {
 				event = psmx_cq_create_event(
 						req->ep->send_cq,
 						req->write.context,
@@ -288,7 +288,7 @@ int psmx_am_rma_handler(psm_am_token_t token, psm_epaddr_t epaddr,
 			req->read.len_read += len;
 		}
 		if (eom) {
-			if (req->ep->send_cq && !req->no_event) {
+			if (req->ep->send_cq && (!req->no_event || req->error)) {
 				event = psmx_cq_create_event(
 						req->ep->send_cq,
 						req->read.context,
@@ -398,7 +398,7 @@ static ssize_t psmx_rma_self(int am_cmd,
 	no_event = (flags & PSMX_NO_COMPLETION) ||
 		   (ep->send_selective_completion && !(flags & FI_COMPLETION));
 
-	if (ep->send_cq && !no_event) {
+	if (ep->send_cq && (!no_event || op_error)) {
 		event = psmx_cq_create_event(
 				ep->send_cq,
 				context,
diff --git a/prov/psm/src/psmx_tagged.c b/prov/psm/src/psmx_tagged.c
index eb0771a..eb13c1c 100644
--- a/prov/psm/src/psmx_tagged.c
+++ b/prov/psm/src/psmx_tagged.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm/src/psmx_util.c b/prov/psm/src/psmx_util.c
index 492f22b..fcc2af4 100644
--- a/prov/psm/src/psmx_util.c
+++ b/prov/psm/src/psmx_util.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm/src/psmx_wait.c b/prov/psm/src/psmx_wait.c
index 50c0c37..470ce8d 100644
--- a/prov/psm/src/psmx_wait.c
+++ b/prov/psm/src/psmx_wait.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is waitailable to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm/src/version.h b/prov/psm/src/version.h
index d9669d4..fd31733 100644
--- a/prov/psm/src/version.h
+++ b/prov/psm/src/version.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/psm2/libfabric-psm2.spec.in b/prov/psm2/libfabric-psm2.spec.in
new file mode 100644
index 0000000..ea5af61
--- /dev/null
+++ b/prov/psm2/libfabric-psm2.spec.in
@@ -0,0 +1,52 @@
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+%{!?provider: %define provider psm2}
+%{!?provider_formal: %define provider_formal PSM2}
+
+Name: libfabric-%{provider}
+Version: @VERSION@
+Release: 1%{?dist}
+Summary: Dynamic %{provider_formal} provider for user-space Open Fabric Interfaces
+Group: System Environment/Libraries
+License: GPLv2 or BSD
+Url: http://www.github.com/ofiwg/libfabric
+Source: http://www.github.org/ofiwg/%{name}/releases/download/v{%version}/libfabric-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Requires: libfabric
+BuildRequires: libfabric
+
+%description
+libfabric provides a user-space API to access high-performance fabric
+services, such as RDMA.
+
+This RPM provides the %{provider_formal} provider as a "plugin" to an existing
+libfabric installation.  This plugin will override older %{provider_formal}
+provider functionality in the existing libfabric installation.
+
+%prep
+%setup -q -n libfabric-%{version}
+
+%build
+%configure %{configopts} --enable-%{provider}=dl
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall installdirs
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libfabric/*.so
+
+%exclude %{_libdir}/libfabric.*
+%exclude %{_libdir}/libfabric/*.la
+%exclude %{_libdir}/pkgconfig
+%exclude %{_bindir}
+%exclude %{_mandir}
+%exclude %{_includedir}
+
+%changelog
+* Wed May 24 2017 Open Fabrics Interfaces Working Group <ofiwg at lists.openfabrics.org>
+- First release of specfile for packaging a single dl provider.
diff --git a/prov/psm2/src/psmx2.h b/prov/psm2/src/psmx2.h
index fff30b2..abf8ecb 100644
--- a/prov/psm2/src/psmx2.h
+++ b/prov/psm2/src/psmx2.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -48,6 +48,7 @@ extern "C" {
 #include <errno.h>
 #include <unistd.h>
 #include <fcntl.h>
+#include <inttypes.h>
 #include <pthread.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -64,6 +65,7 @@ extern "C" {
 #include <rdma/fi_cm.h>
 #include <rdma/fi_errno.h>
 #include "fi.h"
+#include "ofi_atomic.h"
 #include "fi_enosys.h"
 #include "fi_list.h"
 #include "fi_util.h"
@@ -72,7 +74,7 @@ extern "C" {
 
 extern struct fi_provider psmx2_prov;
 
-#define PSMX2_VERSION	(FI_VERSION(1,3))
+#define PSMX2_VERSION	(FI_VERSION(1,5))
 
 #define PSMX2_OP_FLAGS	(FI_INJECT | FI_MULTI_RECV | FI_COMPLETION | \
 			 FI_TRIGGER | FI_INJECT_COMPLETE | \
@@ -82,12 +84,17 @@ extern struct fi_provider psmx2_prov;
 			 FI_RMA | FI_MULTI_RECV | \
                          FI_READ | FI_WRITE | FI_SEND | FI_RECV | \
                          FI_REMOTE_READ | FI_REMOTE_WRITE | \
-			 FI_TRIGGER | FI_RMA_EVENT | \
-			 FI_REMOTE_CQ_DATA | FI_SOURCE | FI_DIRECTED_RECV)
+			 FI_TRIGGER | FI_RMA_EVENT | FI_REMOTE_CQ_DATA | \
+			 FI_SOURCE | FI_SOURCE_ERR | FI_DIRECTED_RECV | \
+			 FI_NAMED_RX_CTX)
 
 #define PSMX2_SUB_CAPS	(FI_READ | FI_WRITE | FI_REMOTE_READ | FI_REMOTE_WRITE | \
 			 FI_SEND | FI_RECV)
 
+#define PSMX2_DOM_CAPS	(FI_LOCAL_COMM | FI_REMOTE_COMM)
+
+#define PSMX2_MAX_TRX_CTXT	(80)
+#define PSMX2_ALL_TRX_CTXT	((void *)-1)
 #define PSMX2_MAX_MSG_SIZE	((0x1ULL << 32) - 1)
 #define PSMX2_INJECT_SIZE	(64)
 #define PSMX2_MSG_ORDER		FI_ORDER_SAS
@@ -96,6 +103,7 @@ extern struct fi_provider psmx2_prov;
 #define PSMX2_MSG_BIT	(0x80000000)
 #define PSMX2_RMA_BIT	(0x40000000)
 #define PSMX2_IOV_BIT	(0x20000000)
+#define PSMX2_IMM_BIT	(0x10000000)
 #define PSMX2_SEQ_BITS	(0x0FFF0000)
 #define PSMX2_SRC_BITS	(0x0000FF00)
 #define PSMX2_DST_BITS	(0x000000FF)
@@ -116,8 +124,20 @@ extern struct fi_provider psmx2_prov;
 
 #define PSMX2_GET_TAG64(tag96)		(tag96.tag0 | ((uint64_t)tag96.tag1<<32))
 
-/* Canonical virtual address on X86_64 only uses 48 bits and the higher 16 bits
- * are sign extensions. We can put vlane into part of these 16 bits of an epaddr.
+/* When using the long RMA protocol, set a bit in the unused SEQ bits to
+ * indicate whether or not the operation is a read or a write. This prevents tag
+ * collisions. */
+#define PSMX2_TAG32_LONG_WRITE(tag32) PSMX2_TAG32_SET_SEQ(tag32, 0x1)
+#define PSMX2_TAG32_LONG_READ(tag32)  PSMX2_TAG32_SET_SEQ(tag32, 0x2)
+
+/*
+ * Canonical virtual address on X86_64 only uses 48 bits and the higher 16 bits
+ * are sign extensions. We can put some extra information into the 16 bits.
+ *
+ * Here is the layout:  AA-B-C-DDDDDDDDDDDD
+ *
+ * C == 0xE: scalable endpoint, AAB is context index, DDDDDDDDDDDD is the address
+ * C != 0xE: regular endpoint, AA is vlane, BCDDDDDDDDDDDD is epaddr
  */
 #define PSMX2_MAX_VL			(0xFF)
 #define PSMX2_EP_MASK			(0x00FFFFFFFFFFFFFFUL)
@@ -133,6 +153,16 @@ extern struct fi_provider psmx2_prov;
                                                  (addr | PSMX2_SIGN_EXT) : \
                                                  (addr & PSMX2_EP_MASK)))
 
+#define PSMX2_MAX_RX_CTX_BITS		(12)
+#define PSMX2_SEP_ADDR_FLAG		(0x000E000000000000UL)
+#define PSMX2_SEP_ADDR_MASK		(0x000F000000000000UL)
+#define PSMX2_SEP_CTXT_MASK		(0xFFF0000000000000UL)
+#define PSMX2_SEP_IDX_MASK		(0x0000FFFFFFFFFFFFUL)
+#define PSMX2_SEP_ADDR_TEST(addr)	(((addr) & PSMX2_SEP_ADDR_MASK) == PSMX2_SEP_ADDR_FLAG)
+#define PSMX2_SEP_ADDR_CTXT(addr, ctxt_bits) \
+					(((addr) & PSMX2_SEP_CTXT_MASK) >> (64-(ctxt_bits)))
+#define PSMX2_SEP_ADDR_IDX(addr)	((addr) & PSMX2_SEP_IDX_MASK)
+
 /* Bits 60 .. 63 of the flag are provider specific */
 #define PSMX2_NO_COMPLETION	(1ULL << 60)
 
@@ -175,6 +205,7 @@ union psmx2_pi {
 
 #define PSMX2_AM_RMA_HANDLER	0
 #define PSMX2_AM_ATOMIC_HANDLER	1
+#define PSMX2_AM_SEP_HANDLER	2
 
 #define PSMX2_AM_OP_MASK	0x000000FF
 #define PSMX2_AM_DST_MASK	0x0000FF00
@@ -208,6 +239,8 @@ enum {
 	PSMX2_AM_REP_ATOMIC_COMPWRITE,
 	PSMX2_AM_REQ_WRITEV,
 	PSMX2_AM_REQ_READV,
+	PSMX2_AM_REQ_SEP_QUERY,
+	PSMX2_AM_REP_SEP_QUERY,
 };
 
 struct psmx2_am_request {
@@ -325,15 +358,36 @@ struct psmx2_fid_fabric {
 	struct util_fabric	util_fabric;
 	struct psmx2_fid_domain	*active_domain;
 	psm2_uuid_t		uuid;
-	pthread_t		name_server_thread;
+	struct util_ns		name_server;
 };
 
-struct psmx2_fid_domain {
-	struct util_domain	util_domain;
-	struct psmx2_fid_fabric	*fabric;
+struct psmx2_trx_ctxt {
 	psm2_ep_t		psm2_ep;
 	psm2_epid_t		psm2_epid;
 	psm2_mq_t		psm2_mq;
+	int			am_initialized;
+	struct psm2_am_parameters psm2_am_param;
+
+	/* ep bound to this tx/rx context, NULL if multiplexed */
+	struct psmx2_fid_ep	*ep;
+
+	/* incoming req queue for AM based RMA request. */
+	struct psmx2_req_queue	rma_queue;
+
+	/* triggered operations that are ready to be processed */
+	struct psmx2_req_queue	trigger_queue;
+
+	/* lock to prevent the sequence of psm2_mq_ipeek and psm2_mq_test be
+	 * interleaved in a multithreaded environment.
+	 */
+	fastlock_t		poll_lock;
+
+	struct dlist_entry	entry;
+};
+
+struct psmx2_fid_domain {
+	struct util_domain	util_domain;
+	struct psmx2_fid_fabric	*fabric;
 	uint64_t		mode;
 	uint64_t		caps;
 
@@ -342,43 +396,57 @@ struct psmx2_fid_domain {
 	uint64_t		mr_reserved_key;
 	RbtHandle		mr_map;
 
+	/*
+	 * A list of all opened hw contexts, including the base hw context.
+	 * The list is used for making progress.
+	 */
+	fastlock_t		trx_ctxt_lock;
+	struct dlist_entry	trx_ctxt_list;
+
+	/*
+	 * The base hw context is multiplexed for all regular endpoints via
+	 * logical "virtual lanes".
+	 */
+	struct psmx2_trx_ctxt	*base_trx_ctxt;
 	fastlock_t		vl_lock;
 	uint64_t		vl_map[(PSMX2_MAX_VL+1)/sizeof(uint64_t)];
 	int			vl_alloc;
 	struct psmx2_fid_ep	*eps[PSMX2_MAX_VL+1];
 
-	int			am_initialized;
-
-	/* incoming req queue for AM based RMA request. */
-	struct psmx2_req_queue	rma_queue;
-
-	/* triggered operations that are ready to be processed */
-	struct psmx2_req_queue	trigger_queue;
-
-	/* lock to prevent the sequence of psm2_mq_ipeek and psm2_mq_test be
-	 * interleaved in a multithreaded environment.
-	 */
-	fastlock_t		poll_lock;
+	ofi_atomic32_t		sep_cnt;
+	fastlock_t		sep_lock;
+	struct dlist_entry	sep_list;
 
 	int			progress_thread_enabled;
 	pthread_t		progress_thread;
-};
 
-struct psmx2_ep_name {
-	psm2_epid_t		epid;
-	uint8_t			vlane;
+	int			addr_format;
 };
 
+#define PSMX2_EP_REGULAR	0
+#define PSMX2_EP_SCALABLE	1
+#define PSMX2_EP_SRC_ADDR	2
+
+#define PSMX2_RESERVED_EPID	(0xFFFFULL)
 #define PSMX2_DEFAULT_UNIT	(-1)
 #define PSMX2_DEFAULT_PORT	0
-#define PSMX2_DEFAULT_SERVICE	0
+#define PSMX2_ANY_SERVICE	0
 
-struct psmx2_src_name {
-	int	unit;		/* start from 0. -1 means any */
-	int	port;		/* start from 1. 0 means any */
-	int	service;	/* 0 means any */
+struct psmx2_ep_name {
+	psm2_epid_t		epid;
+	uint8_t			type;
+	union {
+		uint8_t		vlane;		/* for regular ep */
+		uint8_t		sep_id;		/* for scalable ep */
+		int8_t		unit;		/* for src addr. start from 0. -1 means any */
+	};
+	uint8_t			port;		/* for src addr. start from 1, 0 means any */
+	uint8_t			padding;
+	uint32_t		service;	/* for src addr. 0 means any */
 };
 
+#define PSMX2_MAX_STRING_NAME_LEN	64	/* "fi_addr_psmx2://<uint64_t>:<uint64_t>"  */
+
 struct psmx2_cq_event {
 	union {
 		struct fi_cq_entry		context;
@@ -388,13 +456,18 @@ struct psmx2_cq_event {
 		struct fi_cq_err_entry		err;
 	} cqe;
 	int error;
+	int source_is_valid;
 	fi_addr_t source;
+	struct psmx2_fid_av *source_av;
 	struct slist_entry list_entry;
 };
 
+#define PSMX2_ERR_DATA_SIZE		64	/* large enough to hold a string address */
+
 struct psmx2_fid_cq {
 	struct fid_cq			cq;
 	struct psmx2_fid_domain		*domain;
+	struct psmx2_trx_ctxt		*trx_ctxt;
 	int 				format;
 	int				entry_size;
 	size_t				event_count;
@@ -405,6 +478,7 @@ struct psmx2_fid_cq {
 	struct util_wait		*wait;
 	int				wait_cond;
 	int				wait_is_local;
+	uint8_t				error_data[PSMX2_ERR_DATA_SIZE];
 };
 
 enum psmx2_triggered_op {
@@ -643,14 +717,25 @@ struct psmx2_fid_cntr {
 		struct util_cntr	util_cntr; /* for util_poll_run */
 	};
 	struct psmx2_fid_domain	*domain;
+	struct psmx2_trx_ctxt	*trx_ctxt;
 	int			events;
 	uint64_t		flags;
-	atomic_t		counter;
-	atomic_t		error_counter;
+	ofi_atomic64_t		counter;
+	ofi_atomic64_t		error_counter;
 	struct util_wait	*wait;
 	int			wait_is_local;
 	struct psmx2_trigger	*trigger;
-	pthread_mutex_t		trigger_lock;
+	fastlock_t		trigger_lock;
+};
+
+struct psmx2_ctxt_addr {
+	psm2_epid_t		epid;
+	psm2_epaddr_t		epaddr;
+};
+
+struct psmx2_sep_addr {
+	int			ctxt_cnt;
+	struct psmx2_ctxt_addr	ctxt_addrs[];
 };
 
 struct psmx2_fid_av {
@@ -658,6 +743,8 @@ struct psmx2_fid_av {
 	struct psmx2_fid_domain	*domain;
 	struct fid_eq		*eq;
 	int			type;
+	int			addr_format;
+	int			rx_ctx_bits;
 	uint64_t		flags;
 	size_t			addrlen;
 	size_t			count;
@@ -665,12 +752,18 @@ struct psmx2_fid_av {
 	psm2_epid_t		*epids;
 	psm2_epaddr_t		*epaddrs;
 	uint8_t			*vlanes;
+	uint8_t			*types;
+	struct psmx2_sep_addr	**sepaddrs;
 };
 
 struct psmx2_fid_ep {
 	struct fid_ep		ep;
-	struct psmx2_fid_ep	*base_ep;
+	int			type;
 	struct psmx2_fid_domain	*domain;
+	/* above fields are common with sep */
+
+	struct psmx2_trx_ctxt	*trx_ctxt;
+	struct psmx2_fid_ep	*base_ep;
 	struct psmx2_fid_av	*av;
 	struct psmx2_fid_cq	*send_cq;
 	struct psmx2_fid_cq	*recv_cq;
@@ -687,13 +780,35 @@ struct psmx2_fid_ep {
 	uint64_t		tx_flags;
 	uint64_t		rx_flags;
 	uint64_t		caps;
-	atomic_t		ref;
+	ofi_atomic32_t		ref;
 	struct fi_context	nocomp_send_context;
 	struct fi_context	nocomp_recv_context;
 	struct slist		free_context_list;
 	fastlock_t		context_lock;
 	size_t			min_multi_recv;
 	uint32_t		iov_seq_num;
+	int			service;
+};
+
+struct psmx2_sep_ctxt {
+	struct psmx2_trx_ctxt	*trx_ctxt;
+	struct psmx2_fid_ep	*ep;
+};
+
+struct psmx2_fid_sep {
+	struct fid_ep		ep;
+	int			type;
+	struct psmx2_fid_domain	*domain;
+	/* above fields are common with regular ep */
+
+	struct dlist_entry	entry;
+
+	ofi_atomic32_t		ref;
+	int			service;
+	uint8_t			id;
+	uint8_t			enabled;
+	size_t			ctxt_cnt;
+	struct psmx2_sep_ctxt	ctxts[]; /* must be last element */
 };
 
 struct psmx2_fid_stx {
@@ -709,11 +824,11 @@ struct psmx2_fid_mr {
 	uint64_t		flags;
 	uint64_t		offset;
 	size_t			iov_count;
-	struct iovec		iov[0];	/* must be the last field */
+	struct iovec		iov[];	/* must be the last field */
 };
 
 struct psmx2_epaddr_context {
-	struct psmx2_fid_domain	*domain;
+	struct psmx2_trx_ctxt	*trx_ctxt;
 	psm2_epid_t		epid;
 };
 
@@ -725,6 +840,11 @@ struct psmx2_env {
 	int timeout;
 	int prog_interval;
 	char *prog_affinity;
+	int sep;
+	int max_trx_ctxt;
+	int num_devunits;
+	int inject_size;
+	int lock_level;
 };
 
 extern struct fi_ops_mr		psmx2_mr_ops;
@@ -742,16 +862,91 @@ extern struct fi_ops_msg	psmx2_msg_ops;
 extern struct fi_ops_msg	psmx2_msg2_ops;
 extern struct fi_ops_rma	psmx2_rma_ops;
 extern struct fi_ops_atomic	psmx2_atomic_ops;
-extern struct psm2_am_parameters psmx2_am_param;
 extern struct psmx2_env		psmx2_env;
 extern struct psmx2_fid_fabric	*psmx2_active_fabric;
 
+/*
+ * Lock levels:
+ *     0 -- always lock
+ *     1 -- lock needed if there is more than one thread (including internal threads)
+ *     2 -- lock needed if more then one thread accesses the same psm2 ep
+ */
+static inline void psmx2_lock(fastlock_t *lock, int lock_level)
+{
+	if (psmx2_env.lock_level >= lock_level)
+		fastlock_acquire(lock);
+}
+
+static inline int psmx2_trylock(fastlock_t *lock, int lock_level)
+{
+	if (psmx2_env.lock_level >= lock_level)
+		return fastlock_tryacquire(lock);
+	else
+		return 0;
+}
+
+static inline void psmx2_unlock(fastlock_t *lock, int lock_level)
+{
+	if (psmx2_env.lock_level >= lock_level)
+		fastlock_release(lock);
+}
+
+#ifdef PSM2_MULTI_EP_CAP
+
+static inline int psmx2_sep_ok(void)
+{
+	uint64_t caps = PSM2_MULTI_EP_CAP;
+	return (psm2_get_capability_mask(caps) == caps);
+}
+
+static inline psm2_error_t psmx2_ep_epid_lookup(psm2_ep_t ep, psm2_epid_t epid,
+						psm2_epconn_t *epconn)
+{
+	return psm2_ep_epid_lookup2(ep, epid, epconn);
+}
+
+static inline psm2_epid_t psmx2_epaddr_to_epid(psm2_epaddr_t epaddr)
+{
+	psm2_epid_t epid;
+
+	/* Caller ensures that epaddr is not NULL */
+	psm2_epaddr_to_epid(epaddr, &epid);
+	return epid;
+}
+
+#else
+
+static inline int psmx2_sep_ok(void)
+{
+	return 0;
+}
+
+static inline psm2_error_t psmx2_ep_epid_lookup(psm2_ep_t ep, psm2_epid_t epid,
+						psm2_epconn_t *epconn)
+{
+	return psm2_ep_epid_lookup(epid, epconn);
+}
+
+static inline psm2_epid_t psmx2_epaddr_to_epid(psm2_epaddr_t epaddr)
+{
+	/*
+	 * This is a hack based on the fact that the internal representation of
+	 * epaddr has epid as the first field. This is a workaround before a PSM2
+	 * function is availale to retrieve this information.
+	 */
+	return *(psm2_epid_t *)epaddr;
+}
+
+#endif /* PSM2_MULTI_EP_CAP */
+
 int	psmx2_fabric(struct fi_fabric_attr *attr,
 		    struct fid_fabric **fabric, void *context);
 int	psmx2_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 			 struct fid_domain **domain, void *context);
 int	psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
 		     struct fid_ep **ep, void *context);
+int	psmx2_sep_open(struct fid_domain *domain, struct fi_info *info,
+		       struct fid_ep **sep, void *context);
 int	psmx2_stx_ctx(struct fid_domain *domain, struct fi_tx_attr *attr,
 		     struct fid_stx **stx, void *context);
 int	psmx2_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
@@ -764,37 +959,60 @@ int	psmx2_wait_open(struct fid_fabric *fabric, struct fi_wait_attr *attr,
 			struct fid_wait **waitset);
 int	psmx2_wait_trywait(struct fid_fabric *fabric, struct fid **fids,
 			   int count);
+int	psmx2_query_atomic(struct fid_domain *doamin, enum fi_datatype datatype,
+			   enum fi_op op, struct fi_atomic_attr *attr,
+			   uint64_t flags);
 
 static inline void psmx2_fabric_acquire(struct psmx2_fid_fabric *fabric)
 {
-	atomic_inc(&fabric->util_fabric.ref);
+	ofi_atomic_inc32(&fabric->util_fabric.ref);
 }
 
 static inline void psmx2_fabric_release(struct psmx2_fid_fabric *fabric)
 {
-	atomic_dec(&fabric->util_fabric.ref);
+	ofi_atomic_dec32(&fabric->util_fabric.ref);
 }
 
 static inline void psmx2_domain_acquire(struct psmx2_fid_domain *domain)
 {
-	atomic_inc(&domain->util_domain.ref);
+	ofi_atomic_inc32(&domain->util_domain.ref);
 }
 
 static inline void psmx2_domain_release(struct psmx2_fid_domain *domain)
 {
-	atomic_dec(&domain->util_domain.ref);
+	ofi_atomic_dec32(&domain->util_domain.ref);
 }
 
 int	psmx2_domain_check_features(struct psmx2_fid_domain *domain, int ep_cap);
 int	psmx2_domain_enable_ep(struct psmx2_fid_domain *domain, struct psmx2_fid_ep *ep);
-void 	*psmx2_name_server(void *args);
-void	*psmx2_resolve_name(const char *servername, int port);
+
+void	psmx2_trx_ctxt_free(struct psmx2_trx_ctxt *trx_ctxt);
+struct	psmx2_trx_ctxt *psmx2_trx_ctxt_alloc(struct psmx2_fid_domain *domain,
+					     struct psmx2_ep_name *src_addr,
+					     int sep_ctxt_idx);
+
+
+static inline
+int	psmx2_ns_service_cmp(void *svc1, void *svc2)
+{
+	int service1 = *(int *)svc1, service2 = *(int *)svc2;
+	if (service1 == PSMX2_ANY_SERVICE ||
+	    service2 == PSMX2_ANY_SERVICE)
+		return 0;
+	return (service1 < service2) ?
+		-1 : (service1 > service2);
+}
+static inline
+int	psmx2_ns_is_service_wildcard(void *svc)
+{
+	return (*(int *)svc == PSMX2_ANY_SERVICE);
+}
 void	psmx2_get_uuid(psm2_uuid_t uuid);
 int	psmx2_uuid_to_port(psm2_uuid_t uuid);
 char	*psmx2_uuid_to_string(psm2_uuid_t uuid);
+void	*psmx2_ep_name_to_string(const struct psmx2_ep_name *name, size_t *len);
+struct	psmx2_ep_name *psmx2_string_to_ep_name(const void *s);
 int	psmx2_errno(int err);
-int	psmx2_epid_to_epaddr(struct psmx2_fid_domain *domain,
-			    psm2_epid_t epid, psm2_epaddr_t *epaddr);
 void	psmx2_query_mpi(void);
 
 struct	fi_context *psmx2_ep_get_op_context(struct psmx2_fid_ep *ep);
@@ -805,24 +1023,33 @@ struct	psmx2_cq_event *psmx2_cq_create_event(struct psmx2_fid_cq *cq,
 					uint64_t flags, size_t len,
 					uint64_t data, uint64_t tag,
 					size_t olen, int err);
-int	psmx2_cq_poll_mq(struct psmx2_fid_cq *cq, struct psmx2_fid_domain *domain,
+int	psmx2_cq_poll_mq(struct psmx2_fid_cq *cq, struct psmx2_trx_ctxt *trx_ctxt,
 			struct psmx2_cq_event *event, int count, fi_addr_t *src_addr);
 
-int	psmx2_am_init(struct psmx2_fid_domain *domain);
-int	psmx2_am_fini(struct psmx2_fid_domain *domain);
-int	psmx2_am_progress(struct psmx2_fid_domain *domain);
-int	psmx2_am_process_send(struct psmx2_fid_domain *domain,
+psm2_epaddr_t psmx2_av_translate_sep(struct psmx2_fid_av *av,
+				     struct psmx2_trx_ctxt *trx_ctxt, fi_addr_t addr);
+
+void	psmx2_am_global_init(void);
+void	psmx2_am_global_fini(void);
+int	psmx2_am_init(struct psmx2_trx_ctxt *trx_ctxt);
+void	psmx2_am_fini(struct psmx2_trx_ctxt *trx_ctxt);
+int	psmx2_am_progress(struct psmx2_trx_ctxt *trx_ctxt);
+int	psmx2_am_process_send(struct psmx2_trx_ctxt *trx_ctxt,
 				struct psmx2_am_request *req);
-int	psmx2_am_process_rma(struct psmx2_fid_domain *domain,
+int	psmx2_am_process_rma(struct psmx2_trx_ctxt *trx_ctxt,
 				struct psmx2_am_request *req);
-int	psmx2_process_trigger(struct psmx2_fid_domain *domain,
+int	psmx2_process_trigger(struct psmx2_trx_ctxt *trx_ctxt,
 				struct psmx2_trigger *trigger);
-int	psmx2_am_rma_handler(psm2_am_token_t token,
-				psm2_amarg_t *args, int nargs, void *src, uint32_t len);
-int	psmx2_am_atomic_handler(psm2_am_token_t token,
-				psm2_amarg_t *args, int nargs, void *src, uint32_t len);
-void	psmx2_atomic_init(void);
-void	psmx2_atomic_fini(void);
+int	psmx2_am_rma_handler_ext(psm2_am_token_t token,
+				 psm2_amarg_t *args, int nargs, void *src, uint32_t len,
+				 struct psmx2_trx_ctxt *trx_ctxt);
+int	psmx2_am_atomic_handler_ext(psm2_am_token_t token,
+				    psm2_amarg_t *args, int nargs, void *src, uint32_t len,
+				    struct psmx2_trx_ctxt *trx_ctxt);
+int	psmx2_am_sep_handler(psm2_am_token_t token, psm2_amarg_t *args, int nargs,
+			     void *src, uint32_t len);
+void	psmx2_atomic_global_init(void);
+void	psmx2_atomic_global_fini(void);
 
 void	psmx2_am_ack_rma(struct psmx2_am_request *req);
 
@@ -836,19 +1063,57 @@ int	psmx2_handle_sendv_req(struct psmx2_fid_ep *ep, psm2_mq_status2_t *psm2_stat
 
 static inline void psmx2_cntr_inc(struct psmx2_fid_cntr *cntr)
 {
-	atomic_inc(&cntr->counter);
+	ofi_atomic_inc64(&cntr->counter);
 	psmx2_cntr_check_trigger(cntr);
 	if (cntr->wait)
 		cntr->wait->signal(cntr->wait);
 }
 
-static inline void psmx2_progress(struct psmx2_fid_domain *domain)
+fi_addr_t psmx2_av_translate_source(struct psmx2_fid_av *av, fi_addr_t source);
+
+static inline void psmx2_get_source_name(fi_addr_t source, struct psmx2_ep_name *name)
+{
+	psm2_epaddr_t epaddr = PSMX2_ADDR_TO_EP(source);
+
+	memset(name, 0, sizeof(*name));
+	name->epid = psmx2_epaddr_to_epid(epaddr);
+	name->vlane = PSMX2_ADDR_TO_VL(source);
+	name->type = PSMX2_EP_REGULAR;
+}
+
+static inline void psmx2_get_source_string_name(fi_addr_t source, char *name, size_t *len)
+{
+	struct psmx2_ep_name ep_name;
+	psm2_epaddr_t epaddr = PSMX2_ADDR_TO_EP(source);
+
+	memset(&ep_name, 0, sizeof(ep_name));
+	ep_name.epid = psmx2_epaddr_to_epid(epaddr);
+	ep_name.vlane = PSMX2_ADDR_TO_VL(source);
+	ep_name.type = PSMX2_EP_REGULAR;
+
+	ofi_straddr(name, len, FI_ADDR_PSMX2, &ep_name);
+}
+
+static inline void psmx2_progress(struct psmx2_trx_ctxt *trx_ctxt)
+{
+	if (trx_ctxt) {
+		psmx2_cq_poll_mq(NULL, trx_ctxt, NULL, 0, NULL);
+		if (trx_ctxt->am_initialized)
+			psmx2_am_progress(trx_ctxt);
+	}
+}
+
+static inline void psmx2_progress_all(struct psmx2_fid_domain *domain)
 {
-	if (domain) {
-		psmx2_cq_poll_mq(NULL, domain, NULL, 0, NULL);
-		if (domain->am_initialized)
-			psmx2_am_progress(domain);
+	struct dlist_entry *item;
+	struct psmx2_trx_ctxt *trx_ctxt;
+
+	psmx2_lock(&domain->trx_ctxt_lock, 1);
+	dlist_foreach(&domain->trx_ctxt_list, item) {
+		trx_ctxt = container_of(item, struct psmx2_trx_ctxt, entry);
+		psmx2_progress(trx_ctxt);
 	}
+	psmx2_unlock(&domain->trx_ctxt_lock, 1);
 }
 
 /* The following functions are used by triggered operations */
diff --git a/prov/psm2/src/psmx2_am.c b/prov/psm2/src/psmx2_am.c
index b120d77..a9d3af8 100644
--- a/prov/psm2/src/psmx2_am.c
+++ b/prov/psm2/src/psmx2_am.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,95 +32,299 @@
 
 #include "psmx2.h"
 
-struct psm2_am_parameters psmx2_am_param;
+#define PSMX2_AM_MAX_TRX_CTXT PSMX2_MAX_TRX_CTXT
+static struct {
+	struct psmx2_trx_ctxt *trx_ctxts[PSMX2_AM_MAX_TRX_CTXT];
+	psm2_am_handler_fn_t rma_handlers[PSMX2_AM_MAX_TRX_CTXT];
+	psm2_am_handler_fn_t atomic_handlers[PSMX2_AM_MAX_TRX_CTXT];
+	fastlock_t lock;
+	int cnt;
+} psmx2_am_global;
 
-static psm2_am_handler_fn_t psmx2_am_handlers[2] = {
-	psmx2_am_rma_handler,
-	psmx2_am_atomic_handler,
-};
+#define DEFINE_AM_HANDLERS(INDEX) \
+	static int psmx2_am_rma_handler_##INDEX( \
+			psm2_am_token_t token, psm2_amarg_t *args, \
+			int nargs, void *src, uint32_t len) \
+	{ \
+		return psmx2_am_rma_handler_ext( \
+				token, args, nargs, src, len, \
+				psmx2_am_global.trx_ctxts[INDEX]); \
+	} \
+	\
+	static int psmx2_am_atomic_handler_##INDEX( \
+			psm2_am_token_t token, psm2_amarg_t *args, \
+			int nargs, void *src, uint32_t len) \
+	{ \
+		return psmx2_am_atomic_handler_ext( \
+				token, args, nargs, src, len, \
+				psmx2_am_global.trx_ctxts[INDEX]); \
+	}
+
+DEFINE_AM_HANDLERS(0)
+DEFINE_AM_HANDLERS(1)
+DEFINE_AM_HANDLERS(2)
+DEFINE_AM_HANDLERS(3)
+DEFINE_AM_HANDLERS(4)
+DEFINE_AM_HANDLERS(5)
+DEFINE_AM_HANDLERS(6)
+DEFINE_AM_HANDLERS(7)
+DEFINE_AM_HANDLERS(8)
+DEFINE_AM_HANDLERS(9)
+DEFINE_AM_HANDLERS(10)
+DEFINE_AM_HANDLERS(11)
+DEFINE_AM_HANDLERS(12)
+DEFINE_AM_HANDLERS(13)
+DEFINE_AM_HANDLERS(14)
+DEFINE_AM_HANDLERS(15)
+DEFINE_AM_HANDLERS(16)
+DEFINE_AM_HANDLERS(17)
+DEFINE_AM_HANDLERS(18)
+DEFINE_AM_HANDLERS(19)
+DEFINE_AM_HANDLERS(20)
+DEFINE_AM_HANDLERS(21)
+DEFINE_AM_HANDLERS(22)
+DEFINE_AM_HANDLERS(23)
+DEFINE_AM_HANDLERS(24)
+DEFINE_AM_HANDLERS(25)
+DEFINE_AM_HANDLERS(26)
+DEFINE_AM_HANDLERS(27)
+DEFINE_AM_HANDLERS(28)
+DEFINE_AM_HANDLERS(29)
+DEFINE_AM_HANDLERS(30)
+DEFINE_AM_HANDLERS(31)
+DEFINE_AM_HANDLERS(32)
+DEFINE_AM_HANDLERS(33)
+DEFINE_AM_HANDLERS(34)
+DEFINE_AM_HANDLERS(35)
+DEFINE_AM_HANDLERS(36)
+DEFINE_AM_HANDLERS(37)
+DEFINE_AM_HANDLERS(38)
+DEFINE_AM_HANDLERS(39)
+DEFINE_AM_HANDLERS(40)
+DEFINE_AM_HANDLERS(41)
+DEFINE_AM_HANDLERS(42)
+DEFINE_AM_HANDLERS(43)
+DEFINE_AM_HANDLERS(44)
+DEFINE_AM_HANDLERS(45)
+DEFINE_AM_HANDLERS(46)
+DEFINE_AM_HANDLERS(47)
+DEFINE_AM_HANDLERS(48)
+DEFINE_AM_HANDLERS(49)
+DEFINE_AM_HANDLERS(50)
+DEFINE_AM_HANDLERS(51)
+DEFINE_AM_HANDLERS(52)
+DEFINE_AM_HANDLERS(53)
+DEFINE_AM_HANDLERS(54)
+DEFINE_AM_HANDLERS(55)
+DEFINE_AM_HANDLERS(56)
+DEFINE_AM_HANDLERS(57)
+DEFINE_AM_HANDLERS(58)
+DEFINE_AM_HANDLERS(59)
+DEFINE_AM_HANDLERS(60)
+DEFINE_AM_HANDLERS(61)
+DEFINE_AM_HANDLERS(62)
+DEFINE_AM_HANDLERS(63)
+DEFINE_AM_HANDLERS(64)
+DEFINE_AM_HANDLERS(65)
+DEFINE_AM_HANDLERS(66)
+DEFINE_AM_HANDLERS(67)
+DEFINE_AM_HANDLERS(68)
+DEFINE_AM_HANDLERS(69)
+DEFINE_AM_HANDLERS(70)
+DEFINE_AM_HANDLERS(71)
+DEFINE_AM_HANDLERS(72)
+DEFINE_AM_HANDLERS(73)
+DEFINE_AM_HANDLERS(74)
+DEFINE_AM_HANDLERS(75)
+DEFINE_AM_HANDLERS(76)
+DEFINE_AM_HANDLERS(77)
+DEFINE_AM_HANDLERS(78)
+DEFINE_AM_HANDLERS(79)
+
+#define ASSIGN_AM_HANDLERS(INDEX) \
+	psmx2_am_global.rma_handlers[INDEX] =  psmx2_am_rma_handler_##INDEX; \
+	psmx2_am_global.atomic_handlers[INDEX] =  psmx2_am_atomic_handler_##INDEX;
+
+void psmx2_am_global_init(void)
+{
+	fastlock_init(&psmx2_am_global.lock);
 
-static int psmx2_am_handlers_idx[2];
-static int psmx2_am_handlers_initialized = 0;
+	ASSIGN_AM_HANDLERS(0)
+	ASSIGN_AM_HANDLERS(1)
+	ASSIGN_AM_HANDLERS(2)
+	ASSIGN_AM_HANDLERS(3)
+	ASSIGN_AM_HANDLERS(4)
+	ASSIGN_AM_HANDLERS(5)
+	ASSIGN_AM_HANDLERS(6)
+	ASSIGN_AM_HANDLERS(7)
+	ASSIGN_AM_HANDLERS(8)
+	ASSIGN_AM_HANDLERS(9)
+	ASSIGN_AM_HANDLERS(10)
+	ASSIGN_AM_HANDLERS(11)
+	ASSIGN_AM_HANDLERS(12)
+	ASSIGN_AM_HANDLERS(13)
+	ASSIGN_AM_HANDLERS(14)
+	ASSIGN_AM_HANDLERS(15)
+	ASSIGN_AM_HANDLERS(16)
+	ASSIGN_AM_HANDLERS(17)
+	ASSIGN_AM_HANDLERS(18)
+	ASSIGN_AM_HANDLERS(19)
+	ASSIGN_AM_HANDLERS(20)
+	ASSIGN_AM_HANDLERS(21)
+	ASSIGN_AM_HANDLERS(22)
+	ASSIGN_AM_HANDLERS(23)
+	ASSIGN_AM_HANDLERS(24)
+	ASSIGN_AM_HANDLERS(25)
+	ASSIGN_AM_HANDLERS(26)
+	ASSIGN_AM_HANDLERS(27)
+	ASSIGN_AM_HANDLERS(28)
+	ASSIGN_AM_HANDLERS(29)
+	ASSIGN_AM_HANDLERS(30)
+	ASSIGN_AM_HANDLERS(31)
+	ASSIGN_AM_HANDLERS(32)
+	ASSIGN_AM_HANDLERS(33)
+	ASSIGN_AM_HANDLERS(34)
+	ASSIGN_AM_HANDLERS(35)
+	ASSIGN_AM_HANDLERS(36)
+	ASSIGN_AM_HANDLERS(37)
+	ASSIGN_AM_HANDLERS(38)
+	ASSIGN_AM_HANDLERS(39)
+	ASSIGN_AM_HANDLERS(40)
+	ASSIGN_AM_HANDLERS(41)
+	ASSIGN_AM_HANDLERS(42)
+	ASSIGN_AM_HANDLERS(43)
+	ASSIGN_AM_HANDLERS(44)
+	ASSIGN_AM_HANDLERS(45)
+	ASSIGN_AM_HANDLERS(46)
+	ASSIGN_AM_HANDLERS(47)
+	ASSIGN_AM_HANDLERS(48)
+	ASSIGN_AM_HANDLERS(49)
+	ASSIGN_AM_HANDLERS(50)
+	ASSIGN_AM_HANDLERS(51)
+	ASSIGN_AM_HANDLERS(52)
+	ASSIGN_AM_HANDLERS(53)
+	ASSIGN_AM_HANDLERS(54)
+	ASSIGN_AM_HANDLERS(55)
+	ASSIGN_AM_HANDLERS(56)
+	ASSIGN_AM_HANDLERS(57)
+	ASSIGN_AM_HANDLERS(58)
+	ASSIGN_AM_HANDLERS(59)
+	ASSIGN_AM_HANDLERS(60)
+	ASSIGN_AM_HANDLERS(61)
+	ASSIGN_AM_HANDLERS(62)
+	ASSIGN_AM_HANDLERS(63)
+	ASSIGN_AM_HANDLERS(64)
+	ASSIGN_AM_HANDLERS(65)
+	ASSIGN_AM_HANDLERS(66)
+	ASSIGN_AM_HANDLERS(67)
+	ASSIGN_AM_HANDLERS(68)
+	ASSIGN_AM_HANDLERS(69)
+	ASSIGN_AM_HANDLERS(70)
+	ASSIGN_AM_HANDLERS(71)
+	ASSIGN_AM_HANDLERS(72)
+	ASSIGN_AM_HANDLERS(73)
+	ASSIGN_AM_HANDLERS(74)
+	ASSIGN_AM_HANDLERS(75)
+	ASSIGN_AM_HANDLERS(76)
+	ASSIGN_AM_HANDLERS(77)
+	ASSIGN_AM_HANDLERS(78)
+	ASSIGN_AM_HANDLERS(79)
+}
 
-int psmx2_am_progress(struct psmx2_fid_domain *domain)
+void psmx2_am_global_fini(void)
+{
+	fastlock_destroy(&psmx2_am_global.lock);
+}
+
+int psmx2_am_progress(struct psmx2_trx_ctxt *trx_ctxt)
 {
 	struct slist_entry *item;
 	struct psmx2_am_request *req;
 	struct psmx2_trigger *trigger;
 
 	if (psmx2_env.tagged_rma) {
-		fastlock_acquire(&domain->rma_queue.lock);
-		while (!slist_empty(&domain->rma_queue.list)) {
-			item = slist_remove_head(&domain->rma_queue.list);
+		psmx2_lock(&trx_ctxt->rma_queue.lock, 2);
+		while (!slist_empty(&trx_ctxt->rma_queue.list)) {
+			item = slist_remove_head(&trx_ctxt->rma_queue.list);
 			req = container_of(item, struct psmx2_am_request, list_entry);
-			fastlock_release(&domain->rma_queue.lock);
-			psmx2_am_process_rma(domain, req);
-			fastlock_acquire(&domain->rma_queue.lock);
+			psmx2_unlock(&trx_ctxt->rma_queue.lock, 2);
+			psmx2_am_process_rma(trx_ctxt, req);
+			psmx2_lock(&trx_ctxt->rma_queue.lock, 2);
 		}
-		fastlock_release(&domain->rma_queue.lock);
+		psmx2_unlock(&trx_ctxt->rma_queue.lock, 2);
 	}
 
-	fastlock_acquire(&domain->trigger_queue.lock);
-	while (!slist_empty(&domain->trigger_queue.list)) {
-		item = slist_remove_head(&domain->trigger_queue.list);
+	psmx2_lock(&trx_ctxt->trigger_queue.lock, 2);
+	while (!slist_empty(&trx_ctxt->trigger_queue.list)) {
+		item = slist_remove_head(&trx_ctxt->trigger_queue.list);
 		trigger = container_of(item, struct psmx2_trigger, list_entry);
-		fastlock_release(&domain->trigger_queue.lock);
-		psmx2_process_trigger(domain, trigger);
-		fastlock_acquire(&domain->trigger_queue.lock);
+		psmx2_unlock(&trx_ctxt->trigger_queue.lock, 2);
+		psmx2_process_trigger(trx_ctxt, trigger);
+		psmx2_lock(&trx_ctxt->trigger_queue.lock, 2);
 	}
-	fastlock_release(&domain->trigger_queue.lock);
+	psmx2_unlock(&trx_ctxt->trigger_queue.lock, 2);
 
 	return 0;
 }
 
-int psmx2_am_init(struct psmx2_fid_domain *domain)
+int psmx2_am_init(struct psmx2_trx_ctxt *trx_ctxt)
 {
-	psm2_ep_t psm2_ep = domain->psm2_ep;
+	psm2_am_handler_fn_t psmx2_am_handlers[3];
+	int psmx2_am_handlers_idx[3];
+	int num_handlers = 3;
+	psm2_ep_t psm2_ep = trx_ctxt->psm2_ep;
 	size_t size;
 	int err = 0;
+	int idx;
 
 	FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n");
 
-	psmx2_atomic_init();
-
-	if (!psmx2_am_handlers_initialized) {
-		err = psm2_am_get_parameters(psm2_ep, &psmx2_am_param,
-					     sizeof(psmx2_am_param), &size);
+	if (!trx_ctxt->am_initialized) {
+		err = psm2_am_get_parameters(psm2_ep, &trx_ctxt->psm2_am_param,
+					     sizeof(struct psm2_am_parameters),
+					     &size);
 		if (err)
 			return psmx2_errno(err);
 
-		err = psm2_am_register_handlers(psm2_ep, psmx2_am_handlers, 2,
-						psmx2_am_handlers_idx);
+		psmx2_lock(&psmx2_am_global.lock, 1);
+		if (psmx2_am_global.cnt >= PSMX2_AM_MAX_TRX_CTXT) {
+			psmx2_unlock(&psmx2_am_global.lock, 1);
+			FI_WARN(&psmx2_prov, FI_LOG_CORE,
+				"number of PSM2 endpoints exceed limit %d.\n"
+				"at indecies %d, %d\n", PSMX2_AM_MAX_TRX_CTXT);
+			return -FI_EBUSY;
+		}
+
+		idx = psmx2_am_global.cnt++;
+		psmx2_am_handlers[0] = psmx2_am_global.rma_handlers[idx];
+		psmx2_am_handlers[1] = psmx2_am_global.atomic_handlers[idx];
+		psmx2_am_handlers[2] = psmx2_am_sep_handler;
+		psmx2_am_global.trx_ctxts[idx] = trx_ctxt;
+		psmx2_unlock(&psmx2_am_global.lock, 1);
+
+		err = psm2_am_register_handlers(psm2_ep, psmx2_am_handlers,
+						num_handlers, psmx2_am_handlers_idx);
 		if (err)
 			return psmx2_errno(err);
 
 		if ((psmx2_am_handlers_idx[0] != PSMX2_AM_RMA_HANDLER) ||
-		    (psmx2_am_handlers_idx[1] != PSMX2_AM_ATOMIC_HANDLER)) {
+		    (psmx2_am_handlers_idx[1] != PSMX2_AM_ATOMIC_HANDLER) ||
+		    (psmx2_am_handlers_idx[2] != PSMX2_AM_SEP_HANDLER)) {
 			FI_WARN(&psmx2_prov, FI_LOG_CORE,
 				"failed to register one or more AM handlers "
-				"at indecies %d, %d\n", PSMX2_AM_RMA_HANDLER,
-				PSMX2_AM_ATOMIC_HANDLER);
+				"at indecies %d, %d, %d\n", PSMX2_AM_RMA_HANDLER,
+				PSMX2_AM_ATOMIC_HANDLER, PSMX2_AM_SEP_HANDLER);
 			return -FI_EBUSY;
 		}
 
-		psmx2_am_handlers_initialized = 1;
+		trx_ctxt->am_initialized = 1;
 	}
 
-	slist_init(&domain->rma_queue.list);
-	slist_init(&domain->trigger_queue.list);
-	fastlock_init(&domain->rma_queue.lock);
-	fastlock_init(&domain->trigger_queue.lock);
-
 	return err;
 }
 
-int psmx2_am_fini(struct psmx2_fid_domain *domain)
+void psmx2_am_fini(struct psmx2_trx_ctxt *trx_ctxt)
 {
-	fastlock_destroy(&domain->rma_queue.lock);
-	fastlock_destroy(&domain->trigger_queue.lock);
-
-	psmx2_atomic_fini();
-
-	return 0;
+	/* there is no way to unregister AM handlers */
 }
 
diff --git a/prov/psm2/src/psmx2_atomic.c b/prov/psm2/src/psmx2_atomic.c
index b72571c..5b40f95 100644
--- a/prov/psm2/src/psmx2_atomic.c
+++ b/prov/psm2/src/psmx2_atomic.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -51,12 +51,12 @@
 
 static fastlock_t psmx2_atomic_lock;
 
-void psmx2_atomic_init(void)
+void psmx2_atomic_global_init(void)
 {
 	fastlock_init(&psmx2_atomic_lock);
 }
 
-void psmx2_atomic_fini(void)
+void psmx2_atomic_global_fini(void)
 {
 	fastlock_destroy(&psmx2_atomic_lock);
 }
@@ -68,7 +68,7 @@ static inline void psmx2_ioc_read(const struct fi_ioc *ioc, size_t count,
 	size_t copy_len;
 
 	for (i=0; i<count && len; i++) {
-		copy_len = fi_datatype_size(datatype) * ioc[i].count;
+		copy_len = ofi_datatype_size(datatype) * ioc[i].count;
 		if (copy_len > len)
 			copy_len = len;
 		memcpy(buf, ioc[i].addr, copy_len);
@@ -84,7 +84,7 @@ static inline void psmx2_ioc_write(struct fi_ioc *ioc, size_t count,
 	size_t copy_len;
 
 	for (i=0; i<count && len; i++) {
-		copy_len = fi_datatype_size(datatype) * ioc[i].count;
+		copy_len = ofi_datatype_size(datatype) * ioc[i].count;
 		if (copy_len > len)
 			copy_len = len;
 		memcpy(ioc[i].addr, buf, copy_len);
@@ -100,7 +100,7 @@ static inline size_t psmx2_ioc_size(const struct fi_ioc *ioc, size_t count,
 	size_t len = 0;
 
 	for (i=0; i<count; i++)
-		len += fi_datatype_size(datatype) * ioc[i].count;
+		len += ofi_datatype_size(datatype) * ioc[i].count;
 
 	return len;
 }
@@ -163,10 +163,10 @@ static inline size_t psmx2_ioc_size(const struct fi_ioc *ioc, size_t count,
 			int i; \
 			TYPE *d = (dst); \
 			TYPE *r = (res); \
-			fastlock_acquire(&psmx2_atomic_lock); \
+			psmx2_lock(&psmx2_atomic_lock, 1); \
 			for (i=0; i<(cnt); i++) \
 				r[i] = d[i]; \
-			fastlock_release(&psmx2_atomic_lock); \
+			psmx2_unlock(&psmx2_atomic_lock, 1); \
 		} while (0)
 
 #define PSMX2_ATOMIC_WRITE(dst,src,cnt,OP,TYPE) \
@@ -174,10 +174,10 @@ static inline size_t psmx2_ioc_size(const struct fi_ioc *ioc, size_t count,
 			int i; \
 			TYPE *d = (dst); \
 			TYPE *s = (src); \
-			fastlock_acquire(&psmx2_atomic_lock); \
+			psmx2_lock(&psmx2_atomic_lock, 1); \
 			for (i=0; i<cnt; i++) \
 				OP(d[i],s[i]); \
-			fastlock_release(&psmx2_atomic_lock); \
+			psmx2_unlock(&psmx2_atomic_lock, 1); \
 		} while (0)
 
 #define PSMX2_ATOMIC_READWRITE(dst,src,res,cnt,OP,TYPE) \
@@ -186,12 +186,12 @@ static inline size_t psmx2_ioc_size(const struct fi_ioc *ioc, size_t count,
 			TYPE *d = (dst); \
 			TYPE *s = (src); \
 			TYPE *r = (res); \
-			fastlock_acquire(&psmx2_atomic_lock); \
+			psmx2_lock(&psmx2_atomic_lock, 1); \
 			for (i=0; i<(cnt); i++) {\
 				r[i] = d[i]; \
 				OP(d[i],s[i]); \
 			} \
-			fastlock_release(&psmx2_atomic_lock); \
+			psmx2_unlock(&psmx2_atomic_lock, 1); \
 		} while (0)
 
 #define PSMX2_ATOMIC_CSWAP(dst,src,cmp,res,cnt,CMP_OP,TYPE) \
@@ -201,13 +201,13 @@ static inline size_t psmx2_ioc_size(const struct fi_ioc *ioc, size_t count,
 			TYPE *s = (src); \
 			TYPE *c = (cmp); \
 			TYPE *r = (res); \
-			fastlock_acquire(&psmx2_atomic_lock); \
+			psmx2_lock(&psmx2_atomic_lock, 1); \
 			for (i=0; i<(cnt); i++) { \
 				r[i] = d[i]; \
 				if (c[i] CMP_OP d[i]) \
 					d[i] = s[i]; \
 			} \
-			fastlock_release(&psmx2_atomic_lock); \
+			psmx2_unlock(&psmx2_atomic_lock, 1); \
 		} while (0)
 
 #define PSMX2_ATOMIC_MSWAP(dst,src,cmp,res,cnt,TYPE) \
@@ -217,12 +217,12 @@ static inline size_t psmx2_ioc_size(const struct fi_ioc *ioc, size_t count,
 			TYPE *s = (src); \
 			TYPE *c = (cmp); \
 			TYPE *r = (res); \
-			fastlock_acquire(&psmx2_atomic_lock); \
+			psmx2_lock(&psmx2_atomic_lock, 1); \
 			for (i=0; i<(cnt); i++) { \
 				r[i] = d[i]; \
 				d[i] = (s[i] & c[i]) | (d[i] & ~c[i]); \
 			} \
-			fastlock_release(&psmx2_atomic_lock); \
+			psmx2_unlock(&psmx2_atomic_lock, 1); \
 		} while (0)
 
 static int psmx2_atomic_do_write(void *dest, void *src,
@@ -415,9 +415,9 @@ static void psmx2_am_atomic_completion(void *buf)
 		free(buf);
 }
 
-int psmx2_am_atomic_handler(psm2_am_token_t token,
-			    psm2_amarg_t *args, int nargs, void *src,
-			    uint32_t len)
+int psmx2_am_atomic_handler_ext(psm2_am_token_t token,
+				psm2_amarg_t *args, int nargs, void *src,
+				uint32_t len, struct psmx2_trx_ctxt *trx_ctxt)
 {
 	psm2_amarg_t rep_args[8];
 	int count;
@@ -441,10 +441,15 @@ int psmx2_am_atomic_handler(psm2_am_token_t token,
 	psm2_am_get_source(token, &epaddr);
 
 	cmd = PSMX2_AM_GET_OP(args[0].u32w0);
-	vlane = PSMX2_AM_GET_DST(args[0].u32w0);
-
 	domain = psmx2_active_fabric->active_domain;
-	target_ep = domain->eps[vlane];
+
+	if (trx_ctxt->ep) {
+		vlane = 0;
+		target_ep = trx_ctxt->ep;
+	} else {
+		vlane = PSMX2_AM_GET_DST(args[0].u32w0);
+		target_ep = domain->eps[vlane];
+	}
 
 	switch (cmd) {
 	case PSMX2_AM_REQ_ATOMIC_WRITE:
@@ -453,7 +458,7 @@ int psmx2_am_atomic_handler(psm2_am_token_t token,
 		key = args[3].u64;
 		datatype = args[4].u32w0;
 		op = args[4].u32w1;
-		assert(len == fi_datatype_size(datatype) * count);
+		assert(len == ofi_datatype_size(datatype) * count);
 
 		mr = psmx2_mr_get(domain, key);
 		op_error = mr ?
@@ -490,9 +495,9 @@ int psmx2_am_atomic_handler(psm2_am_token_t token,
 		op = args[4].u32w1;
 
 		if (op == FI_ATOMIC_READ)
-			len = fi_datatype_size(datatype) * count;
+			len = ofi_datatype_size(datatype) * count;
 
-		assert(len == fi_datatype_size(datatype) * count);
+		assert(len == ofi_datatype_size(datatype) * count);
 
 		mr = psmx2_mr_get(domain, key);
 		op_error = mr ?
@@ -540,7 +545,7 @@ int psmx2_am_atomic_handler(psm2_am_token_t token,
 		datatype = args[4].u32w0;
 		op = args[4].u32w1;
 		len /= 2;
-		assert(len == fi_datatype_size(datatype) * count);
+		assert(len == ofi_datatype_size(datatype) * count);
 
 		mr = psmx2_mr_get(domain, key);
 		op_error = mr ?
@@ -584,7 +589,7 @@ int psmx2_am_atomic_handler(psm2_am_token_t token,
 		req = (struct psmx2_am_request *)(uintptr_t)args[1].u64;
 		op_error = (int)args[0].u32w1;
 		assert(req->op == PSMX2_AM_REQ_ATOMIC_WRITE);
-		if (req->ep->send_cq && !req->no_event) {
+		if (req->ep->send_cq && (!req->no_event || op_error)) {
 			event = psmx2_cq_create_event(
 					req->ep->send_cq,
 					req->atomic.context,
@@ -621,7 +626,7 @@ int psmx2_am_atomic_handler(psm2_am_token_t token,
 						req->atomic.datatype, src, len);
 		}
 
-		if (req->ep->send_cq && !req->no_event) {
+		if (req->ep->send_cq && (!req->no_event || op_error)) {
 			event = psmx2_cq_create_event(
 					req->ep->send_cq,
 					req->atomic.context,
@@ -679,7 +684,7 @@ static int psmx2_atomic_self(int am_cmd,
 	else
 		access = FI_REMOTE_READ | FI_REMOTE_WRITE;
 
-	len = fi_datatype_size(datatype) * count;
+	len = ofi_datatype_size(datatype) * count;
 	mr = psmx2_mr_get(psmx2_active_fabric->active_domain, key);
 	op_error = mr ?  psmx2_mr_validate(mr, addr, len, access) : -FI_EINVAL;
 
@@ -758,7 +763,7 @@ static int psmx2_atomic_self(int am_cmd,
 gen_local_event:
 	no_event = ((flags & PSMX2_NO_COMPLETION) ||
 		    (ep->send_selective_completion && !(flags & FI_COMPLETION)));
-	if (ep->send_cq && !no_event) {
+	if (ep->send_cq && (!no_event || op_error)) {
 		event = psmx2_cq_create_event(
 				ep->send_cq,
 				context,
@@ -850,7 +855,10 @@ ssize_t psmx2_atomic_write_generic(struct fid_ep *ep,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else  if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -866,15 +874,15 @@ ssize_t psmx2_atomic_write_generic(struct fid_ep *ep,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_atomic_self(PSMX2_AM_REQ_ATOMIC_WRITE, ep_priv,
 					 ep_priv->domain->eps[vlane],
 					 buf, count, desc, NULL, NULL, NULL,
 					 NULL, addr, key, datatype, op,
 					 context, flags);
 
-	chunk_size = psmx2_am_param.max_request_short;
-	len = fi_datatype_size(datatype)* count;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
+	len = ofi_datatype_size(datatype)* count;
 	if (len > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -985,7 +993,10 @@ ssize_t psmx2_atomic_writev_generic(struct fid_ep *ep,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1003,7 +1014,7 @@ ssize_t psmx2_atomic_writev_generic(struct fid_ep *ep,
 	len = psmx2_ioc_size(iov, count, datatype);
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid) {
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid) {
 		buf = malloc(len);
 		if (!buf)
 			return -FI_ENOMEM;
@@ -1012,7 +1023,7 @@ ssize_t psmx2_atomic_writev_generic(struct fid_ep *ep,
 
 		err = psmx2_atomic_self(PSMX2_AM_REQ_ATOMIC_WRITE, ep_priv,
 					ep_priv->domain->eps[vlane],
-					buf, len / fi_datatype_size(datatype),
+					buf, len / ofi_datatype_size(datatype),
 					NULL, NULL, NULL, NULL, NULL, addr,
 					key, datatype, op, context, flags);
 
@@ -1020,7 +1031,7 @@ ssize_t psmx2_atomic_writev_generic(struct fid_ep *ep,
 		return err;
 	}
 
-	chunk_size = psmx2_am_param.max_request_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
 	if (len > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1054,7 +1065,7 @@ ssize_t psmx2_atomic_writev_generic(struct fid_ep *ep,
 
 	args[0].u32w0 = PSMX2_AM_REQ_ATOMIC_WRITE;
 	PSMX2_AM_SET_DST(args[0].u32w0, vlane);
-	args[0].u32w1 = len / fi_datatype_size(datatype);
+	args[0].u32w1 = len / ofi_datatype_size(datatype);
 	args[1].u64 = (uint64_t)(uintptr_t)req;
 	args[2].u64 = addr;
 	args[3].u64 = key;
@@ -1214,7 +1225,10 @@ ssize_t psmx2_atomic_readwrite_generic(struct fid_ep *ep,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1230,15 +1244,15 @@ ssize_t psmx2_atomic_readwrite_generic(struct fid_ep *ep,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_atomic_self(PSMX2_AM_REQ_ATOMIC_READWRITE,
 					 ep_priv, ep_priv->domain->eps[vlane],
 					 buf, count, desc, NULL, NULL, result,
 					 result_desc, addr, key, datatype, op,
 					 context, flags);
 
-	chunk_size = psmx2_am_param.max_request_short;
-	len = fi_datatype_size(datatype) * count;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
+	len = ofi_datatype_size(datatype) * count;
 	if (len > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1351,8 +1365,10 @@ ssize_t psmx2_atomic_readwritev_generic(struct fid_ep *ep,
 	    !result_count)
 		return -FI_EINVAL;
 
-	while (count && !iov[count-1].count)
-		count--;
+	if (iov) {
+		while (count && !iov[count-1].count)
+			count--;
+	}
 
 	while (result_count && !resultv[result_count-1].count)
 		result_count--;
@@ -1379,7 +1395,10 @@ ssize_t psmx2_atomic_readwritev_generic(struct fid_ep *ep,
 		return -FI_EINVAL;
 	
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1395,7 +1414,7 @@ ssize_t psmx2_atomic_readwritev_generic(struct fid_ep *ep,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid) {
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid) {
 		if (buf && count > 1) {
 			buf = malloc(len);
 			psmx2_ioc_read(iov, count, datatype, buf, len);
@@ -1417,7 +1436,7 @@ ssize_t psmx2_atomic_readwritev_generic(struct fid_ep *ep,
 
 		err = psmx2_atomic_self(PSMX2_AM_REQ_ATOMIC_READWRITE,
 					ep_priv, ep_priv->domain->eps[vlane],
-					buf, len / fi_datatype_size(datatype),
+					buf, len / ofi_datatype_size(datatype),
 					desc0, NULL, NULL, result, result_desc0,
 					addr, key, datatype, op, context, flags);
 
@@ -1432,7 +1451,7 @@ ssize_t psmx2_atomic_readwritev_generic(struct fid_ep *ep,
 		return err;
 	}
 
-	chunk_size = psmx2_am_param.max_request_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
 	if (len > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1478,7 +1497,7 @@ ssize_t psmx2_atomic_readwritev_generic(struct fid_ep *ep,
 
 	args[0].u32w0 = PSMX2_AM_REQ_ATOMIC_READWRITE;
 	PSMX2_AM_SET_DST(args[0].u32w0, vlane);
-	args[0].u32w1 = len / fi_datatype_size(datatype);
+	args[0].u32w1 = len / ofi_datatype_size(datatype);
 	args[1].u64 = (uint64_t)(uintptr_t)req;
 	args[2].u64 = addr;
 	args[3].u64 = key;
@@ -1583,7 +1602,7 @@ static ssize_t psmx2_atomic_readwritev(struct fid_ep *ep,
 					      dest_addr, addr, key, datatype, op,
 					      context, ep_priv->tx_flags);
 
-	if (FI_ATOMIC_READ) {
+	if (op == FI_ATOMIC_READ) {
 		buf = NULL;
 		count = resultv[0].count;
 		src_desc = result_desc ? result_desc[0] : NULL;
@@ -1666,7 +1685,10 @@ ssize_t psmx2_atomic_compwrite_generic(struct fid_ep *ep,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1682,7 +1704,7 @@ ssize_t psmx2_atomic_compwrite_generic(struct fid_ep *ep,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_atomic_self(PSMX2_AM_REQ_ATOMIC_COMPWRITE,
 					 ep_priv, ep_priv->domain->eps[vlane],
 					 buf, count, desc, compare,
@@ -1690,8 +1712,8 @@ ssize_t psmx2_atomic_compwrite_generic(struct fid_ep *ep,
 					 addr, key, datatype, op,
 					 context, flags);
 
-	chunk_size = psmx2_am_param.max_request_short;
-	len = fi_datatype_size(datatype) * count;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
+	len = ofi_datatype_size(datatype) * count;
 	if (len * 2 > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1845,7 +1867,10 @@ ssize_t psmx2_atomic_compwritev_generic(struct fid_ep *ep,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1861,7 +1886,7 @@ ssize_t psmx2_atomic_compwritev_generic(struct fid_ep *ep,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid) {
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid) {
 		if (count > 1) {
 			buf = malloc(len);
 			if (!buf)
@@ -1904,7 +1929,7 @@ ssize_t psmx2_atomic_compwritev_generic(struct fid_ep *ep,
 
 		err = psmx2_atomic_self(PSMX2_AM_REQ_ATOMIC_COMPWRITE,
 					ep_priv, ep_priv->domain->eps[vlane],
-					buf, len / fi_datatype_size(datatype), desc0,
+					buf, len / ofi_datatype_size(datatype), desc0,
 					compare, compare_desc0, result, result_desc0,
 					addr, key, datatype, op, context, flags);
 
@@ -1922,7 +1947,7 @@ ssize_t psmx2_atomic_compwritev_generic(struct fid_ep *ep,
 		return err;
 	}
 
-	chunk_size = psmx2_am_param.max_request_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
 	if (len * 2 > chunk_size)
 		return -FI_EMSGSIZE;
 
@@ -1967,7 +1992,7 @@ ssize_t psmx2_atomic_compwritev_generic(struct fid_ep *ep,
 
 	args[0].u32w0 = PSMX2_AM_REQ_ATOMIC_COMPWRITE;
 	PSMX2_AM_SET_DST(args[0].u32w0, vlane);
-	args[0].u32w1 = len / fi_datatype_size(datatype);
+	args[0].u32w1 = len / ofi_datatype_size(datatype);
 	args[1].u64 = (uint64_t)(uintptr_t)req;
 	args[2].u64 = addr;
 	args[3].u64 = key;
@@ -2010,7 +2035,7 @@ static ssize_t psmx2_atomic_compwritemsg(struct fid_ep *ep,
 					 size_t result_count,
 					 uint64_t flags)
 {
-	if (!msg || !msg->msg_iov || msg->iov_count != 1 ||
+	if (!msg || !msg->msg_iov || !msg->iov_count ||
 	    !msg->rma_iov || msg->rma_iov_count != 1 ||
 	    !comparev || !compare_count || !resultv || !result_count)
 		return -FI_EINVAL;
@@ -2076,13 +2101,11 @@ static ssize_t psmx2_atomic_compwritev(struct fid_ep *ep,
 					      context, ep_priv->tx_flags);
 }
 
-static int psmx2_atomic_writevalid(struct fid_ep *ep,
-				   enum fi_datatype datatype,
-				   enum fi_op op, size_t *count)
+static int psmx2_atomic_writevalid_internal(size_t chunk_size,
+					    enum fi_datatype datatype,
+					    enum fi_op op, size_t *count)
 {
-	int chunk_size;
-
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EOPNOTSUPP;
 
 	switch (op) {
@@ -2103,20 +2126,17 @@ static int psmx2_atomic_writevalid(struct fid_ep *ep,
 		return -FI_EOPNOTSUPP;
 	}
 
-	if (count) {
-		chunk_size = psmx2_am_param.max_request_short;
-		*count = chunk_size / fi_datatype_size(datatype);
-	}
+	if (count)
+		*count = chunk_size / ofi_datatype_size(datatype);
+
 	return 0;
 }
 
-static int psmx2_atomic_readwritevalid(struct fid_ep *ep,
-				       enum fi_datatype datatype,
-				       enum fi_op op, size_t *count)
+static int psmx2_atomic_readwritevalid_internal(size_t chunk_size,
+						enum fi_datatype datatype,
+						enum fi_op op, size_t *count)
 {
-	int chunk_size;
-
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EOPNOTSUPP;
 
 	switch (op) {
@@ -2138,20 +2158,18 @@ static int psmx2_atomic_readwritevalid(struct fid_ep *ep,
 		return -FI_EOPNOTSUPP;
 	}
 
-	if (count) {
-		chunk_size = psmx2_am_param.max_request_short;
-		*count = chunk_size / fi_datatype_size(datatype);
-	}
+	if (count)
+		*count = chunk_size / ofi_datatype_size(datatype);
+
 	return 0;
 }
 
-static int psmx2_atomic_compwritevalid(struct fid_ep *ep,
-				       enum fi_datatype datatype,
-				       enum fi_op op, size_t *count)
+static int psmx2_atomic_compwritevalid_internal(size_t chunk_size,
+						enum fi_datatype datatype,
+						enum fi_op op, size_t *count)
 {
-	int chunk_size;
 
-	if (datatype < 0 || datatype >= FI_DATATYPE_LAST)
+	if (datatype >= FI_DATATYPE_LAST)
 		return -FI_EOPNOTSUPP;
 
 	switch (op) {
@@ -2183,13 +2201,83 @@ static int psmx2_atomic_compwritevalid(struct fid_ep *ep,
 		return -FI_EOPNOTSUPP;
 	}
 
-	if (count) {
-		chunk_size = psmx2_am_param.max_request_short;
-		*count = chunk_size / (2 * fi_datatype_size(datatype));
-	}
+	if (count)
+		*count = chunk_size / (2 * ofi_datatype_size(datatype));
+
 	return 0;
 }
 
+static int psmx2_atomic_writevalid(struct fid_ep *ep,
+				   enum fi_datatype datatype,
+				   enum fi_op op, size_t *count)
+{
+	struct psmx2_fid_ep *ep_priv;
+	size_t chunk_size;
+
+	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
+	return psmx2_atomic_writevalid_internal(chunk_size, datatype, op, count);
+}
+
+static int psmx2_atomic_readwritevalid(struct fid_ep *ep,
+				       enum fi_datatype datatype,
+				       enum fi_op op, size_t *count)
+{
+	struct psmx2_fid_ep *ep_priv;
+	size_t chunk_size;
+
+	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
+	return psmx2_atomic_readwritevalid_internal(chunk_size, datatype, op, count);
+}
+
+static int psmx2_atomic_compwritevalid(struct fid_ep *ep,
+				       enum fi_datatype datatype,
+				       enum fi_op op, size_t *count)
+{
+	struct psmx2_fid_ep *ep_priv;
+	size_t chunk_size;
+
+	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
+	return psmx2_atomic_compwritevalid_internal(chunk_size, datatype, op, count);
+}
+
+int psmx2_query_atomic(struct fid_domain *domain, enum fi_datatype datatype,
+		       enum fi_op op, struct fi_atomic_attr *attr, uint64_t flags)
+{
+	struct psmx2_fid_domain *domain_priv;
+	size_t chunk_size;
+	size_t count;
+	int ret;
+
+	domain_priv = container_of(domain, struct psmx2_fid_domain, util_domain.domain_fid);
+	chunk_size = domain_priv->base_trx_ctxt->psm2_am_param.max_request_short;
+
+	if (flags & FI_TAGGED)
+		return -FI_EOPNOTSUPP;
+
+	if (flags & FI_COMPARE_ATOMIC) {
+		if (flags & FI_FETCH_ATOMIC)
+			return -FI_EINVAL;
+		ret = psmx2_atomic_compwritevalid_internal(chunk_size, datatype,
+							   op, &count);
+	} else if (flags & FI_FETCH_ATOMIC) {
+		ret = psmx2_atomic_readwritevalid_internal(chunk_size, datatype,
+							   op, &count);
+	} else {
+		ret = psmx2_atomic_writevalid_internal(chunk_size, datatype,
+						       op, &count);
+	}
+
+	if (attr && !ret) {
+		attr->size = ofi_datatype_size(datatype);
+		attr->count = count;
+	}
+
+	return ret;
+}
+
 struct fi_ops_atomic psmx2_atomic_ops = {
 	.size = sizeof(struct fi_ops_atomic),
 	.write = psmx2_atomic_write,
diff --git a/prov/psm2/src/psmx2_av.c b/prov/psm2/src/psmx2_av.c
index 9deb7bd..f90889f 100644
--- a/prov/psm2/src/psmx2_av.c
+++ b/prov/psm2/src/psmx2_av.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,6 +32,142 @@
 
 #include "psmx2.h"
 
+static void psmx2_av_post_completion(struct psmx2_fid_av *av, void *context,
+				     uint64_t data, int prov_errno);
+
+/*
+ * SEP address query protocol:
+ *
+ * SEQ Query REQ:
+ *	args[0].u32w0	cmd
+ *	args[0].u32w1	id
+ *	args[1].u64	req
+ *	args[2].u64	av_idx
+ *
+ * SEP Query REP:
+ *	args[0].u32w0	cmd
+ *	args[0].u32w1	error
+ *	args[1].u64	req
+ *	args[2].u64	av_idx
+ *	args[3].u64	n
+ *	data		epaddrs
+ */
+
+struct psmx2_sep_query {
+	struct psmx2_fid_av	*av;
+	void 			*context;
+	psm2_error_t		*errors;
+	ofi_atomic32_t		error_count;
+	ofi_atomic32_t		pending;
+};
+
+static int psmx2_am_sep_match(struct dlist_entry *entry, const void *arg)
+{
+	struct psmx2_fid_sep *sep;
+
+	sep = container_of(entry, struct psmx2_fid_sep, entry);
+	return ((uintptr_t)sep->id == (uintptr_t)arg);
+}
+
+static void psmx2_am_sep_completion(void *buf)
+{
+	free(buf);
+}
+
+int psmx2_am_sep_handler(psm2_am_token_t token, psm2_amarg_t *args,
+			 int nargs, void *src, uint32_t len)
+{
+	struct psmx2_fid_domain *domain;
+	psm2_amarg_t rep_args[8];
+	int op_error = 0;
+	int err = 0;
+	int cmd;
+	int n, i, j;
+	uint8_t sep_id;
+	struct psmx2_fid_sep *sep;
+	struct psmx2_sep_addr *p;
+	struct psmx2_sep_query *req;
+	struct psmx2_fid_av *av;
+	psm2_epid_t *buf = NULL;
+	int buflen;
+	struct dlist_entry *entry;
+
+	cmd = PSMX2_AM_GET_OP(args[0].u32w0);
+	domain = psmx2_active_fabric->active_domain;
+
+	switch (cmd) {
+	case PSMX2_AM_REQ_SEP_QUERY:
+		sep_id = args[0].u32w1;
+		psmx2_lock(&domain->sep_lock, 1);
+		entry = dlist_find_first_match(&domain->sep_list, psmx2_am_sep_match,
+					       (void *)(uintptr_t)sep_id);
+		if (!entry) {
+			op_error = PSM2_EPID_UNKNOWN;
+			n = 0;
+			buflen = 0;
+		} else {
+			sep = container_of(entry, struct psmx2_fid_sep, entry);
+			n = sep->ctxt_cnt;
+			buflen = n * sizeof(psm2_epid_t);
+			if (n) {
+				buf = malloc(buflen);
+				if (!buf) {
+					op_error = -FI_ENOMEM;
+					buflen = 0;
+					n = 0;
+				}
+				for (i=0; i< n; i++)
+					buf[i] = sep->ctxts[i].trx_ctxt->psm2_epid;
+			}
+		}
+		psmx2_unlock(&domain->sep_lock, 1);
+
+		rep_args[0].u32w0 = PSMX2_AM_REP_SEP_QUERY;
+		rep_args[0].u32w1 = op_error;
+		rep_args[1].u64 = args[1].u64;
+		rep_args[2].u64 = args[2].u64;
+		rep_args[3].u64 = n;
+		err = psm2_am_reply_short(token, PSMX2_AM_SEP_HANDLER,
+					  rep_args, 4, buf, buflen, 0,
+					  psmx2_am_sep_completion, buf);
+		break;
+
+	case PSMX2_AM_REP_SEP_QUERY:
+		op_error = args[0].u32w1;
+		req = (void *)(uintptr_t)args[1].u64;
+		av = req->av;
+		i = args[2].u64;
+		if (op_error) {
+			ofi_atomic_inc32(&req->error_count);
+			if (av->flags & FI_EVENT)
+				psmx2_av_post_completion(av, req->context, i, op_error);
+		} else {
+			n = args[3].u64;
+			p  = calloc(1, sizeof (struct psmx2_sep_addr) +
+				       n * sizeof(struct psmx2_ctxt_addr));
+			if (!p) {
+				ofi_atomic_inc32(&req->error_count);
+				req->errors[i] = PSM2_NO_MEMORY;
+			} else {
+				p->ctxt_cnt = n;
+				for (j=0; j<n; j++) {
+					p->ctxt_addrs[j].epid = ((psm2_epid_t *)src)[j];
+					p->ctxt_addrs[j].epaddr = (psm2_epaddr_t)FI_ADDR_NOTAVAIL;
+				}
+				av->sepaddrs[i] = p;
+			}
+		}
+		ofi_atomic_dec32(&req->pending);
+		break;
+
+	default:
+		err = -FI_EINVAL;
+		break;
+	}
+
+	return err;
+}
+
 #define PSMX2_MIN_CONN_TIMEOUT	5
 #define PSMX2_MAX_CONN_TIMEOUT	30
 
@@ -39,23 +175,23 @@ static inline double psmx2_conn_timeout(int sec)
 {
 	if (sec < PSMX2_MIN_CONN_TIMEOUT)
 		return PSMX2_MIN_CONN_TIMEOUT * 1e9;
-	
+
 	if (sec > PSMX2_MAX_CONN_TIMEOUT)
 		return PSMX2_MAX_CONN_TIMEOUT * 1e9;
 
 	return sec * 1e9;
 }
 
-static void psmx2_set_epaddr_context(struct psmx2_fid_domain *domain,
+static void psmx2_set_epaddr_context(struct psmx2_trx_ctxt *trx_ctxt,
 				     psm2_epid_t epid, psm2_epaddr_t epaddr)
 {
 	struct psmx2_epaddr_context *context;
 
 	context = (void *)psm2_epaddr_getctxt(epaddr);
 	if (context) {
-		if (context->domain != domain || context->epid != epid) {
+		if (context->trx_ctxt != trx_ctxt || context->epid != epid) {
 			FI_WARN(&psmx2_prov, FI_LOG_AV,
-				"domain or epid doesn't match\n");
+				"trx_ctxt or epid doesn't match\n");
 			context = NULL;
 		}
 	}
@@ -70,12 +206,12 @@ static void psmx2_set_epaddr_context(struct psmx2_fid_domain *domain,
 		return;
 	}
 
-	context->domain = domain;
+	context->trx_ctxt = trx_ctxt;
 	context->epid = epid;
 	psm2_epaddr_setctxt(epaddr, context);
 }
 
-int psmx2_epid_to_epaddr(struct psmx2_fid_domain *domain,
+int psmx2_epid_to_epaddr(struct psmx2_trx_ctxt *trx_ctxt,
 			 psm2_epid_t epid, psm2_epaddr_t *epaddr)
 {
         int err;
@@ -83,7 +219,7 @@ int psmx2_epid_to_epaddr(struct psmx2_fid_domain *domain,
 	psm2_epconn_t epconn;
 	struct psmx2_epaddr_context *context;
 
-	err = psm2_ep_epid_lookup(epid, &epconn);
+	err = psmx2_ep_epid_lookup(trx_ctxt->psm2_ep, epid, &epconn);
 	if (err == PSM2_OK) {
 		context = psm2_epaddr_getctxt(epconn.addr);
 		if (context && context->epid  == epid) {
@@ -92,22 +228,60 @@ int psmx2_epid_to_epaddr(struct psmx2_fid_domain *domain,
 		}
 	}
 
-        err = psm2_ep_connect(domain->psm2_ep, 1, &epid, NULL, &errors,
+        err = psm2_ep_connect(trx_ctxt->psm2_ep, 1, &epid, NULL, &errors,
 			      epaddr, psmx2_conn_timeout(1));
-        if (err != PSM2_OK)
+        if (err != PSM2_OK) {
+		FI_WARN(&psmx2_prov, FI_LOG_AV,
+			"psm2_ep_connect retured error %s, remote epid=%lx.\n",
+			psm2_error_get_string(err), epid);
                 return psmx2_errno(err);
+	}
 
-	psmx2_set_epaddr_context(domain,epid,*epaddr);
+	psmx2_set_epaddr_context(trx_ctxt,epid,*epaddr);
 
         return 0;
 }
 
+psm2_epaddr_t psmx2_av_translate_sep(struct psmx2_fid_av *av,
+				     struct psmx2_trx_ctxt *trx_ctxt,
+				     fi_addr_t addr)
+{
+	int idx = PSMX2_SEP_ADDR_IDX(addr);
+	int ctxt = PSMX2_SEP_ADDR_CTXT(addr, av->rx_ctx_bits);
+	psm2_epaddr_t epaddr;
+	int err;
+
+	if (!av->sepaddrs[idx])
+		return NULL;
+
+	if (ctxt >= av->sepaddrs[idx]->ctxt_cnt)
+		return NULL;
+
+	if ((fi_addr_t)av->sepaddrs[idx]->ctxt_addrs[ctxt].epaddr == FI_ADDR_NOTAVAIL) {
+		err = psmx2_epid_to_epaddr(trx_ctxt,
+					   av->sepaddrs[idx]->ctxt_addrs[ctxt].epid,
+					   &epaddr);
+		if (err) {
+			FI_WARN(&psmx2_prov, FI_LOG_AV,
+				"fatal error: unable to translate epid %lx to epaddr.\n",
+				av->sepaddrs[idx]->ctxt_addrs[ctxt].epid);
+			return NULL;
+		}
+
+		av->sepaddrs[idx]->ctxt_addrs[ctxt].epaddr = epaddr;
+	}
+
+	return av->sepaddrs[idx]->ctxt_addrs[ctxt].epaddr;
+}
+
 static int psmx2_av_check_table_size(struct psmx2_fid_av *av, size_t count)
 {
 	size_t new_count;
 	psm2_epid_t *new_epids;
 	psm2_epaddr_t *new_epaddrs;
 	uint8_t *new_vlanes;
+	uint8_t *new_types;
+	struct psmx2_sep_addr **new_sepaddrs;
 
 	new_count = av->count;
 	while (new_count < av->last + count)
@@ -127,10 +301,22 @@ static int psmx2_av_check_table_size(struct psmx2_fid_av *av, size_t count)
 
 	av->epaddrs = new_epaddrs;
 	new_vlanes = realloc(av->vlanes, new_count * sizeof(*new_vlanes));
-	if (!new_vlanes) 
+	if (!new_vlanes)
 		return -FI_ENOMEM;
 
 	av->vlanes = new_vlanes;
+	new_types = realloc(av->types, new_count * sizeof(*new_types));
+	if (!new_types)
+		return -FI_ENOMEM;
+
+	av->types = new_types;
+
+	new_sepaddrs = realloc(av->sepaddrs, new_count * sizeof(*new_sepaddrs));
+	if (!new_sepaddrs)
+		return -FI_ENOMEM;
+
+	av->sepaddrs = new_sepaddrs;
+
 	av->count = new_count;
 	return 0;
 }
@@ -158,20 +344,21 @@ static void psmx2_av_post_completion(struct psmx2_fid_av *av, void *context,
 	}
 }
 
-static int psmx2_av_connet_eps(struct psmx2_fid_av *av, size_t count,
-			       psm2_epid_t *epids, int *mask,
-			       psm2_error_t *errors,
-			       psm2_epaddr_t *epaddrs,
-			       void *context)
+static int psmx2_av_connect_eps(struct psmx2_fid_av *av, size_t count,
+			        psm2_epid_t *epids, int *mask,
+			        psm2_error_t *errors,
+			        psm2_epaddr_t *epaddrs,
+			        void *context)
 {
 	int i;
 	psm2_epconn_t epconn;
 	struct psmx2_epaddr_context *epaddr_context;
 	int error_count = 0;
+	psm2_ep_t ep = av->domain->base_trx_ctxt->psm2_ep;
 
 	/* set up mask to prevent connecting to an already connected ep */
 	for (i=0; i<count; i++) {
-		if (psm2_ep_epid_lookup(epids[i], &epconn) == PSM2_OK) {
+		if (psmx2_ep_epid_lookup(ep, epids[i], &epconn) == PSM2_OK) {
 			epaddr_context = psm2_epaddr_getctxt(epconn.addr);
 			if (epaddr_context && epaddr_context->epid == epids[i])
 				epaddrs[i] = epconn.addr;
@@ -182,27 +369,30 @@ static int psmx2_av_connet_eps(struct psmx2_fid_av *av, size_t count,
 		}
 	}
 
-	psm2_ep_connect(av->domain->psm2_ep, count, epids, mask, errors,
-			epaddrs, psmx2_conn_timeout(count));
+	psm2_ep_connect(ep, count, epids, mask, errors, epaddrs, psmx2_conn_timeout(count));
 
 	for (i=0; i<count; i++){
-		if (!mask[i])
+		if (!mask[i]) {
+			errors[i] = PSM2_OK;
 			continue;
+		}
 
 		if (errors[i] == PSM2_OK ||
 		    errors[i] == PSM2_EPID_ALREADY_CONNECTED) {
-			psmx2_set_epaddr_context(av->domain, epids[i], epaddrs[i]);
+			psmx2_set_epaddr_context(av->domain->base_trx_ctxt, epids[i], epaddrs[i]);
+			errors[i] = PSM2_OK;
 		} else {
 			/* If duplicated addrs are passed to psm2_ep_connect(),
 			 * all but one will fail with error "Endpoint could not
 			 * be reached". This should be treated the same as
 			 * "Endpoint already connected".
 			 */
-			if (psm2_ep_epid_lookup(epids[i], &epconn) == PSM2_OK) {
+			if (psmx2_ep_epid_lookup(ep, epids[i], &epconn) == PSM2_OK) {
 				epaddr_context = psm2_epaddr_getctxt(epconn.addr);
 				if (epaddr_context &&
 				    epaddr_context->epid == epids[i]) {
 					epaddrs[i] = epconn.addr;
+					errors[i] = PSM2_OK;
 					continue;
 				}
 			}
@@ -226,7 +416,64 @@ static int psmx2_av_connet_eps(struct psmx2_fid_av *av, size_t count,
 
 	return error_count;
 }
- 
+
+static int psmx2_av_query_seps(struct psmx2_fid_av *av, size_t count, psm2_epid_t *epids,
+			       uint8_t *sep_ids, uint8_t *types, psm2_error_t *errors,
+			       psm2_epaddr_t *epaddrs, void *context)
+{
+	struct psmx2_sep_query *req;
+	psm2_amarg_t args[8];
+	int error_count = 0;
+	int i;
+
+	req = malloc(sizeof *req);
+
+	if (req) {
+		req->av = av;
+		req->context = context;
+		req->errors = errors;
+		ofi_atomic_initialize32(&req->error_count, 0);
+		ofi_atomic_initialize32(&req->pending, 0);
+	}
+
+	for (i=0; i<count; i++) {
+		if (types[i] != PSMX2_EP_SCALABLE)
+			continue;
+
+		if (errors[i] != PSM2_OK)
+			continue;
+
+		if (!req) {
+			errors[i] = PSM2_NO_MEMORY;
+			error_count++;
+			continue;
+		}
+
+		ofi_atomic_inc32(&req->pending);
+		args[0].u32w0 = PSMX2_AM_REQ_SEP_QUERY;
+		args[0].u32w1 = sep_ids[i];
+		args[1].u64 = (uint64_t)(uintptr_t)req;
+		args[2].u64 = av->last + i;
+		psm2_am_request_short(epaddrs[i], PSMX2_AM_SEP_HANDLER,
+				      args, 3, NULL, 0, 0, NULL, NULL);
+	}
+
+	/*
+	 * make it synchronous for now to:
+	 * (1) ensure array "req->errors" is valid;
+	 * (2) to simplify the logic of generating the final completion event.
+	 */
+
+	if (req) {
+		while (ofi_atomic_get32(&req->pending))
+			psmx2_progress_all(av->domain);
+		error_count = ofi_atomic_get32(&req->error_count);
+		free(req);
+	}
+
+	return error_count;
+}
+
 static int psmx2_av_insert(struct fid_av *av, const void *addr,
 			   size_t count, fi_addr_t *fi_addr,
 			   uint64_t flags, void *context)
@@ -234,12 +481,16 @@ static int psmx2_av_insert(struct fid_av *av, const void *addr,
 	struct psmx2_fid_av *av_priv;
 	psm2_epid_t *epids;
 	uint8_t *vlanes;
+	uint8_t *types;
+	struct psmx2_sep_addr **sepaddrs;
 	psm2_epaddr_t *epaddrs;
 	psm2_error_t *errors;
 	int *mask;
+	struct psmx2_ep_name *ep_name;
 	const struct psmx2_ep_name *names = addr;
+	const char **string_names = (void *)addr;
 	int error_count;
-	int i;
+	int i, ret;
 
 	if (count && !addr) {
 		FI_INFO(&psmx2_prov, FI_LOG_AV,
@@ -258,10 +509,24 @@ static int psmx2_av_insert(struct fid_av *av, const void *addr,
 	epids = av_priv->epids + av_priv->last;
 	epaddrs = av_priv->epaddrs + av_priv->last;
 	vlanes = av_priv->vlanes + av_priv->last;
+	types = av_priv->types + av_priv->last;
+	sepaddrs = av_priv->sepaddrs + av_priv->last;
 
 	for (i=0; i<count; i++) {
-		epids[i] = names[i].epid;
-		vlanes[i] = names[i].vlane;
+		if (av_priv->addr_format == FI_ADDR_STR) {
+			ep_name = psmx2_string_to_ep_name(string_names[i]);
+			if (!ep_name)
+				return -FI_EINVAL;
+			epids[i] = ep_name->epid;
+			vlanes[i] = ep_name->vlane;
+			types[i] = ep_name->type;
+			free(ep_name);
+		} else {
+			epids[i] = names[i].epid;
+			vlanes[i] = names[i].vlane;
+			types[i] = names[i].type;
+		}
+		sepaddrs[i] = NULL;
 	}
 
 	errors = (psm2_error_t *) calloc(count, sizeof *errors);
@@ -272,16 +537,18 @@ static int psmx2_av_insert(struct fid_av *av, const void *addr,
 		return -FI_ENOMEM;
 	}
 
-	error_count = psmx2_av_connet_eps(av_priv, count, epids, mask,
-					  errors, epaddrs, context);
+	error_count = psmx2_av_connect_eps(av_priv, count, epids, mask,
+					   errors, epaddrs, context);
 
-	free(mask);
-	free(errors);
+	error_count += psmx2_av_query_seps(av_priv, count, epids, vlanes, types,
+					   errors, epaddrs, context);
 
 	if (fi_addr) {
 		for (i=0; i<count; i++) {
 			if (epaddrs[i] == (void *)FI_ADDR_NOTAVAIL)
 				fi_addr[i] = FI_ADDR_NOTAVAIL;
+			else if (types[i] == PSMX2_EP_SCALABLE)
+				fi_addr[i] = (av_priv->last + i) | PSMX2_SEP_ADDR_FLAG;
 			else if (av_priv->type == FI_AV_TABLE)
 				fi_addr[i] = av_priv->last + i;
 			else
@@ -289,15 +556,23 @@ static int psmx2_av_insert(struct fid_av *av, const void *addr,
 		}
 	}
 
-	if (av_priv->type == FI_AV_TABLE)
-		av_priv->last += count;
+	av_priv->last += count;
 
-	if (!(av_priv->flags & FI_EVENT))
-		return count - error_count;
-
-	psmx2_av_post_completion(av_priv, context, count - error_count, 0);
+	if (av_priv->flags & FI_EVENT) {
+		psmx2_av_post_completion(av_priv, context, count - error_count, 0);
+		ret = 0;
+	} else {
+		if (flags & FI_SYNC_ERR) {
+			int *fi_errors = context;
+			for (i=0; i<count; i++)
+				fi_errors[i] = psmx2_errno(errors[i]);
+		}
+		ret = count - error_count;
+	}
 
-	return 0;
+	free(mask);
+	free(errors);
+	return ret;
 }
 
 static int psmx2_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
@@ -328,45 +603,66 @@ static int psmx2_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr,
 		name.epid = av_priv->epids[idx];
 		name.vlane = av_priv->vlanes[idx];
 	} else {
-		context = psm2_epaddr_getctxt((void *)fi_addr);
+		context = psm2_epaddr_getctxt(PSMX2_ADDR_TO_EP(fi_addr));
 		name.epid = context->epid;
 		name.vlane = PSMX2_ADDR_TO_VL(fi_addr);
 	}
 
-	if (*addrlen >= sizeof(name))
-		*(struct psmx2_ep_name *)addr = name;
-	else
-		memcpy(addr, &name, *addrlen);
-	*addrlen = sizeof(name);
+	if (av_priv->addr_format == FI_ADDR_STR) {
+		ofi_straddr(addr, addrlen, FI_ADDR_PSMX2, &name);
+	} else {
+		memcpy(addr, &name, MIN(*addrlen, sizeof(name)));
+		*addrlen = sizeof(name);
+	}
 
 	return 0;
 }
 
-static const char *psmx2_av_straddr(struct fid_av *av, const void *addr,
-				    char *buf, size_t *len)
+fi_addr_t psmx2_av_translate_source(struct psmx2_fid_av *av, fi_addr_t source)
 {
-	int n;
+	struct psmx2_epaddr_context *context;
+	psm2_epaddr_t epaddr;
+	int vlane;
+	int i;
 
-	if (!buf || !len)
-		return NULL;
+	epaddr = PSMX2_ADDR_TO_EP(source);
+	vlane = PSMX2_ADDR_TO_VL(source);
 
-	n = snprintf(buf, *len, "%lx", (uint64_t)(uintptr_t)addr);
-	if (n < 0)
-		return NULL;
+	context = psm2_epaddr_getctxt(epaddr);
+	if (!context)
+		return FI_ADDR_NOTAVAIL;
 
-	*len = n + 1;
-	return buf;
+	if (av->type == FI_AV_MAP)
+		return source;
+
+	for (i = av->last - 1; i >= 0; i--) {
+		if (av->epaddrs[i] == epaddr && av->vlanes[i] == vlane)
+			return (fi_addr_t)i;
+	}
+
+	return FI_ADDR_NOTAVAIL;
+}
+
+static const char *psmx2_av_straddr(struct fid_av *av, const void *addr,
+				    char *buf, size_t *len)
+{
+	return ofi_straddr(buf, len, FI_ADDR_PSMX2, addr);
 }
 
 static int psmx2_av_close(fid_t fid)
 {
 	struct psmx2_fid_av *av;
+	int i;
 
 	av = container_of(fid, struct psmx2_fid_av, av.fid);
 	psmx2_domain_release(av->domain);
 	free(av->epids);
 	free(av->epaddrs);
 	free(av->vlanes);
+	free(av->types);
+	for (i=0; i<av->last; i++)
+		free(av->sepaddrs[i]);
+	free(av->sepaddrs);
 	free(av);
 	return 0;
 }
@@ -418,6 +714,7 @@ int psmx2_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 	int type = FI_AV_MAP;
 	size_t count = 64;
 	uint64_t flags = 0;
+	int rx_ctx_bits = PSMX2_MAX_RX_CTX_BITS;
 
 	domain_priv = container_of(domain, struct psmx2_fid_domain,
 				   util_domain.domain_fid);
@@ -454,6 +751,15 @@ int psmx2_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 				attr->name);
 			return -FI_ENOSYS;
 		}
+
+		if (attr->rx_ctx_bits > PSMX2_MAX_RX_CTX_BITS) {
+			FI_INFO(&psmx2_prov, FI_LOG_AV,
+				"attr->rx_ctx_bits=%d, maximum allowed is %d\n",
+				attr->rx_ctx_bits, PSMX2_MAX_RX_CTX_BITS);
+			return -FI_ENOSYS;
+		}
+
+		rx_ctx_bits = attr->rx_ctx_bits;
 	}
 
 	av_priv = (struct psmx2_fid_av *) calloc(1, sizeof *av_priv);
@@ -467,6 +773,8 @@ int psmx2_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 	av_priv->addrlen = sizeof(psm2_epaddr_t);
 	av_priv->count = count;
 	av_priv->flags = flags;
+	av_priv->rx_ctx_bits = rx_ctx_bits;
+	av_priv->addr_format = domain_priv->addr_format;
 
 	av_priv->av.fid.fclass = FI_CLASS_AV;
 	av_priv->av.fid.context = context;
diff --git a/prov/psm2/src/psmx2_cm.c b/prov/psm2/src/psmx2_cm.c
index 69acc0e..2d14634 100644
--- a/prov/psm2/src/psmx2_cm.c
+++ b/prov/psm2/src/psmx2_cm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -35,27 +35,46 @@
 static int psmx2_cm_getname(fid_t fid, void *addr, size_t *addrlen)
 {
 	struct psmx2_fid_ep *ep;
-	struct psmx2_ep_name *epname = addr;
+	struct psmx2_fid_sep *sep;
+	struct psmx2_ep_name epname;
+	size_t	addr_size;
+	int err = 0;
 
 	ep = container_of(fid, struct psmx2_fid_ep, ep.fid);
 	if (!ep->domain)
 		return -FI_EBADF;
 
-	if (*addrlen < sizeof(struct psmx2_ep_name)) {
-		*addrlen = sizeof(struct psmx2_ep_name);
-		return -FI_ETOOSMALL;
+	memset(&epname, 0, sizeof(epname));
+
+	if (ep->type == PSMX2_EP_REGULAR) {
+		epname.epid = ep->trx_ctxt->psm2_epid;
+		epname.vlane = ep->vlane;
+		epname.type = ep->type;
+	} else {
+		sep = (struct psmx2_fid_sep *)ep;
+		epname.epid = sep->domain->base_trx_ctxt->psm2_epid;
+		epname.sep_id = sep->id;
+		epname.type = sep->type;
+	}
+
+	if (ep->domain->addr_format == FI_ADDR_STR) {
+		addr_size = *addrlen;
+		ofi_straddr(addr, &addr_size, FI_ADDR_PSMX2, &epname);
+	} else {
+		addr_size = sizeof(epname);
+		memcpy(addr, &epname, MIN(*addrlen, addr_size));
 	}
 
-	memset(epname, 0, sizeof(*epname));
-	epname->epid = ep->domain->psm2_epid;
-	epname->vlane = ep->vlane;
-	*addrlen = sizeof(struct psmx2_ep_name);
+	if (*addrlen < addr_size)
+		err = -FI_ETOOSMALL;
 
-	return 0;
+	*addrlen = addr_size;
+	return err;
 }
 
 struct fi_ops_cm psmx2_cm_ops = {
 	.size = sizeof(struct fi_ops_cm),
+	.setname = fi_no_setname,
 	.getname = psmx2_cm_getname,
 	.getpeer = fi_no_getpeer,
 	.connect = fi_no_connect,
@@ -63,5 +82,6 @@ struct fi_ops_cm psmx2_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
diff --git a/prov/psm2/src/psmx2_cntr.c b/prov/psm2/src/psmx2_cntr.c
index 49352ae..c38ad4e 100644
--- a/prov/psm2/src/psmx2_cntr.c
+++ b/prov/psm2/src/psmx2_cntr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,7 +32,7 @@
 
 #include "psmx2.h"
 
-int psmx2_process_trigger(struct psmx2_fid_domain *domain,
+int psmx2_process_trigger(struct psmx2_trx_ctxt *trx_ctxt,
 			  struct psmx2_trigger *trigger)
 {
 	switch (trigger->op) {
@@ -216,28 +216,28 @@ void psmx2_cntr_check_trigger(struct psmx2_fid_cntr *cntr)
 	if (!cntr->trigger)
 		return;
 
-	pthread_mutex_lock(&cntr->trigger_lock);
+	psmx2_lock(&cntr->trigger_lock, 2);
 
 	trigger = cntr->trigger;
 	while (trigger) {
-		if (atomic_get(&cntr->counter) < trigger->threshold)
+		if (ofi_atomic_get64(&cntr->counter) < trigger->threshold)
 			break;
 
 		cntr->trigger = trigger->next;
 
-		if (domain->am_initialized) {
-			fastlock_acquire(&domain->trigger_queue.lock);
+		if (domain->base_trx_ctxt->am_initialized) {
+			psmx2_lock(&domain->base_trx_ctxt->trigger_queue.lock, 2);
 			slist_insert_tail(&trigger->list_entry,
-					  &domain->trigger_queue.list);
-			fastlock_release(&domain->trigger_queue.lock);
+					  &domain->base_trx_ctxt->trigger_queue.list);
+			psmx2_unlock(&domain->base_trx_ctxt->trigger_queue.lock, 2);
 		} else {
-			psmx2_process_trigger(domain, trigger);
+			psmx2_process_trigger(domain->base_trx_ctxt, trigger);
 		}
 
 		trigger = cntr->trigger;
 	}
 
-	pthread_mutex_unlock(&cntr->trigger_lock);
+	psmx2_unlock(&cntr->trigger_lock, 2);
 }
 
 void psmx2_cntr_add_trigger(struct psmx2_fid_cntr *cntr,
@@ -245,7 +245,7 @@ void psmx2_cntr_add_trigger(struct psmx2_fid_cntr *cntr,
 {
 	struct psmx2_trigger *p, *q;
 
-	pthread_mutex_lock(&cntr->trigger_lock);
+	psmx2_lock(&cntr->trigger_lock, 2);
 
 	q = NULL;
 	p = cntr->trigger;
@@ -259,7 +259,7 @@ void psmx2_cntr_add_trigger(struct psmx2_fid_cntr *cntr,
 		cntr->trigger = trigger;
 	trigger->next = p;
 
-	pthread_mutex_unlock(&cntr->trigger_lock);
+	psmx2_unlock(&cntr->trigger_lock, 2);
 
 	psmx2_cntr_check_trigger(cntr);
 }
@@ -272,12 +272,15 @@ static uint64_t psmx2_cntr_read(struct fid_cntr *cntr)
 
 	cntr_priv = container_of(cntr, struct psmx2_fid_cntr, cntr);
 
-	if (poll_cnt++ == PSMX2_CNTR_POLL_THRESHOLD) {
-		psmx2_progress(cntr_priv->domain);
+	if (poll_cnt++ >= PSMX2_CNTR_POLL_THRESHOLD) {
+		if (cntr_priv->trx_ctxt == PSMX2_ALL_TRX_CTXT)
+			psmx2_progress_all(cntr_priv->domain);
+		else
+			psmx2_progress(cntr_priv->trx_ctxt);
 		poll_cnt = 0;
 	}
 
-	return atomic_get(&cntr_priv->counter);
+	return ofi_atomic_get64(&cntr_priv->counter);
 }
 
 static uint64_t psmx2_cntr_readerr(struct fid_cntr *cntr)
@@ -286,7 +289,7 @@ static uint64_t psmx2_cntr_readerr(struct fid_cntr *cntr)
 
 	cntr_priv = container_of(cntr, struct psmx2_fid_cntr, cntr);
 
-	return atomic_get(&cntr_priv->error_counter);
+	return ofi_atomic_get64(&cntr_priv->error_counter);
 }
 
 static int psmx2_cntr_add(struct fid_cntr *cntr, uint64_t value)
@@ -294,7 +297,7 @@ static int psmx2_cntr_add(struct fid_cntr *cntr, uint64_t value)
 	struct psmx2_fid_cntr *cntr_priv;
 
 	cntr_priv = container_of(cntr, struct psmx2_fid_cntr, cntr);
-	atomic_add(&cntr_priv->counter, value);
+	ofi_atomic_add64(&cntr_priv->counter, value);
 
 	psmx2_cntr_check_trigger(cntr_priv);
 
@@ -309,7 +312,37 @@ static int psmx2_cntr_set(struct fid_cntr *cntr, uint64_t value)
 	struct psmx2_fid_cntr *cntr_priv;
 
 	cntr_priv = container_of(cntr, struct psmx2_fid_cntr, cntr);
-	atomic_set(&cntr_priv->counter, value);
+	ofi_atomic_set64(&cntr_priv->counter, value);
+
+	psmx2_cntr_check_trigger(cntr_priv);
+
+	if (cntr_priv->wait)
+		cntr_priv->wait->signal(cntr_priv->wait);
+
+	return 0;
+}
+
+static int psmx2_cntr_adderr(struct fid_cntr *cntr, uint64_t value)
+{
+	struct psmx2_fid_cntr *cntr_priv;
+
+	cntr_priv = container_of(cntr, struct psmx2_fid_cntr, cntr);
+	ofi_atomic_add64(&cntr_priv->error_counter, value);
+
+	psmx2_cntr_check_trigger(cntr_priv);
+
+	if (cntr_priv->wait)
+		cntr_priv->wait->signal(cntr_priv->wait);
+
+	return 0;
+}
+
+static int psmx2_cntr_seterr(struct fid_cntr *cntr, uint64_t value)
+{
+	struct psmx2_fid_cntr *cntr_priv;
+
+	cntr_priv = container_of(cntr, struct psmx2_fid_cntr, cntr);
+	ofi_atomic_set64(&cntr_priv->error_counter, value);
 
 	psmx2_cntr_check_trigger(cntr_priv);
 
@@ -330,17 +363,20 @@ static int psmx2_cntr_wait(struct fid_cntr *cntr, uint64_t threshold, int timeou
 
 	clock_gettime(CLOCK_REALTIME, &ts0);
 
-	while (atomic_get(&cntr_priv->counter) < threshold) {
+	while (ofi_atomic_get64(&cntr_priv->counter) < threshold) {
 		if (cntr_priv->wait) {
 			ret = fi_wait((struct fid_wait *)cntr_priv->wait,
 				      timeout - msec_passed);
 			if (ret == -FI_ETIMEDOUT)
 				break;
 		} else {
-			psmx2_progress(cntr_priv->domain);
+			if (cntr_priv->trx_ctxt == PSMX2_ALL_TRX_CTXT)
+				psmx2_progress_all(cntr_priv->domain);
+			else
+				psmx2_progress(cntr_priv->trx_ctxt);
 		}
 
-		if (atomic_get(&cntr_priv->counter) >= threshold)
+		if (ofi_atomic_get64(&cntr_priv->counter) >= threshold)
 			break;
 
 		if (timeout < 0)
@@ -371,7 +407,7 @@ static int psmx2_cntr_close(fid_t fid)
 			fi_close((fid_t)cntr->wait);
 	}
 
-	pthread_mutex_destroy(&cntr->trigger_lock);
+	fastlock_destroy(&cntr->trigger_lock);
 	psmx2_domain_release(cntr->domain);
 	free(cntr);
 
@@ -424,6 +460,8 @@ static struct fi_ops_cntr psmx2_cntr_ops = {
 	.add = psmx2_cntr_add,
 	.set = psmx2_cntr_set,
 	.wait = psmx2_cntr_wait,
+	.adderr = psmx2_cntr_adderr,
+	.seterr = psmx2_cntr_seterr,
 };
 
 int psmx2_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
@@ -457,6 +495,7 @@ int psmx2_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 
 	switch (attr->wait_obj) {
 	case FI_WAIT_NONE:
+	case FI_WAIT_UNSPEC:
 		break;
 
 	case FI_WAIT_SET:
@@ -468,7 +507,6 @@ int psmx2_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 		wait = attr->wait_set;
 		break;
 
-	case FI_WAIT_UNSPEC:
 	case FI_WAIT_FD:
 	case FI_WAIT_MUTEX_COND:
 		wait_attr.wait_obj = attr->wait_obj;
@@ -504,10 +542,10 @@ int psmx2_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 	cntr_priv->cntr.fid.context = context;
 	cntr_priv->cntr.fid.ops = &psmx2_fi_ops;
 	cntr_priv->cntr.ops = &psmx2_cntr_ops;
-	atomic_initialize(&cntr_priv->counter, 0);
-	atomic_initialize(&cntr_priv->error_counter, 0);
+	ofi_atomic_initialize64(&cntr_priv->counter, 0);
+	ofi_atomic_initialize64(&cntr_priv->error_counter, 0);
 
-	pthread_mutex_init(&cntr_priv->trigger_lock, NULL);
+	fastlock_init(&cntr_priv->trigger_lock);
 
 	if (wait)
 		fi_poll_add(&cntr_priv->wait->pollset->poll_fid,
diff --git a/prov/psm2/src/psmx2_cq.c b/prov/psm2/src/psmx2_cq.c
index 6d783fc..0eb4764 100644
--- a/prov/psm2/src/psmx2_cq.c
+++ b/prov/psm2/src/psmx2_cq.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -35,10 +35,10 @@
 void psmx2_cq_enqueue_event(struct psmx2_fid_cq *cq,
 			    struct psmx2_cq_event *event)
 {
-	fastlock_acquire(&cq->lock);
+	psmx2_lock(&cq->lock, 2);
 	slist_insert_tail(&event->list_entry, &cq->event_queue);
 	cq->event_count++;
-	fastlock_release(&cq->lock);
+	psmx2_unlock(&cq->lock, 2);
 
 	if (cq->wait)
 		cq->wait->signal(cq->wait);
@@ -48,13 +48,14 @@ static struct psmx2_cq_event *psmx2_cq_dequeue_event(struct psmx2_fid_cq *cq)
 {
 	struct slist_entry *entry;
 
-	if (slist_empty(&cq->event_queue))
+	psmx2_lock(&cq->lock, 2);
+	if (slist_empty(&cq->event_queue)) {
+		psmx2_unlock(&cq->lock, 2);
 		return NULL;
-
-	fastlock_acquire(&cq->lock);
+	}
 	entry = slist_remove_head(&cq->event_queue);
 	cq->event_count--;
-	fastlock_release(&cq->lock);
+	psmx2_unlock(&cq->lock, 2);
 
 	return container_of(entry, struct psmx2_cq_event, list_entry);
 }
@@ -63,15 +64,15 @@ static struct psmx2_cq_event *psmx2_cq_alloc_event(struct psmx2_fid_cq *cq)
 {
 	struct psmx2_cq_event *event;
 
-	fastlock_acquire(&cq->lock);
+	psmx2_lock(&cq->lock, 2);
 	if (!slist_empty(&cq->free_list)) {
 		event = container_of(slist_remove_head(&cq->free_list),
 				     struct psmx2_cq_event, list_entry);
-		fastlock_release(&cq->lock);
+		psmx2_unlock(&cq->lock, 2);
 		return event;
 	}
 
-	fastlock_release(&cq->lock);
+	psmx2_unlock(&cq->lock, 2);
 	event = calloc(1, sizeof(*event));
 	if (!event)
 		FI_WARN(&psmx2_prov, FI_LOG_CQ, "out of memory.\n");
@@ -84,9 +85,9 @@ static void psmx2_cq_free_event(struct psmx2_fid_cq *cq,
 {
 	memset(event, 0, sizeof(*event));
 
-	fastlock_acquire(&cq->lock);
+	psmx2_lock(&cq->lock, 2);
 	slist_insert_tail(&event->list_entry, &cq->free_list);
-	fastlock_release(&cq->lock);
+	psmx2_unlock(&cq->lock, 2);
 }
 
 struct psmx2_cq_event *psmx2_cq_create_event(struct psmx2_fid_cq *cq,
@@ -107,6 +108,7 @@ struct psmx2_cq_event *psmx2_cq_create_event(struct psmx2_fid_cq *cq,
 		event->cqe.err.data = data;
 		event->cqe.err.tag = tag;
 		event->cqe.err.olen = olen;
+		event->cqe.err.flags = flags;
 		event->cqe.err.prov_errno = PSM2_INTERNAL_ERR;
 		goto out;
 	}
@@ -152,6 +154,7 @@ out:
 
 static struct psmx2_cq_event *
 psmx2_cq_create_event_from_status(struct psmx2_fid_cq *cq,
+				  struct psmx2_fid_av *av,
 				  psm2_mq_status2_t *psm2_status,
 				  uint64_t data,
 				  struct psmx2_cq_event *event_in,
@@ -168,6 +171,11 @@ psmx2_cq_create_event_from_status(struct psmx2_fid_cq *cq,
 	uint64_t flags;
 
 	switch((int)PSMX2_CTXT_TYPE(fi_context)) {
+	case PSMX2_NOCOMP_SEND_CONTEXT: /* error only */
+		op_context = NULL;
+		buf = NULL;
+		flags = FI_SEND | FI_MSG;
+		break;
 	case PSMX2_SEND_CONTEXT:
 		op_context = fi_context;
 		buf = PSMX2_CTXT_USER(fi_context);
@@ -187,10 +195,21 @@ psmx2_cq_create_event_from_status(struct psmx2_fid_cq *cq,
 		flags = FI_RECV | sendv_rep->comp_flag;
 		is_recv = 1;
 		break;
+	case PSMX2_NOCOMP_RECV_CONTEXT: /* error only */
+	case PSMX2_NOCOMP_RECV_CONTEXT_ALLOC: /* error only */
+		op_context = NULL;
+		buf = NULL;
+		flags = FI_RECV | FI_MSG;
+		if (psm2_status->msg_tag.tag2 & PSMX2_IMM_BIT)
+			flags |= FI_REMOTE_CQ_DATA;
+		is_recv = 1;
+		break;
 	case PSMX2_RECV_CONTEXT:
 		op_context = fi_context;
 		buf = PSMX2_CTXT_USER(fi_context);
 		flags = FI_RECV | FI_MSG;
+		if (psm2_status->msg_tag.tag2 & PSMX2_IMM_BIT)
+			flags |= FI_REMOTE_CQ_DATA;
 		is_recv = 1;
 		break;
 	case PSMX2_MULTI_RECV_CONTEXT:
@@ -198,6 +217,8 @@ psmx2_cq_create_event_from_status(struct psmx2_fid_cq *cq,
 		req = PSMX2_CTXT_USER(fi_context);
 		buf = req->buf + req->offset;
 		flags = FI_RECV | FI_MSG;
+		if (psm2_status->msg_tag.tag2 & PSMX2_IMM_BIT)
+			flags |= FI_REMOTE_CQ_DATA;
 		if (req->offset + psm2_status->nbytes + req->min_buf_size > req->len)
 			flags |= FI_MULTI_RECV;	/* buffer used up */
 		is_recv = 1;
@@ -213,11 +234,13 @@ psmx2_cq_create_event_from_status(struct psmx2_fid_cq *cq,
 		flags = FI_RECV | FI_TAGGED;
 		is_recv = 1;
 		break;
+	case PSMX2_NOCOMP_READ_CONTEXT: /* error only */
 	case PSMX2_READ_CONTEXT:
 		op_context = PSMX2_CTXT_USER(fi_context);
 		buf = NULL;
 		flags = FI_READ | FI_RMA;
 		break;
+	case PSMX2_NOCOMP_WRITE_CONTEXT: /* error only */
 	case PSMX2_WRITE_CONTEXT:
 		op_context = PSMX2_CTXT_USER(fi_context);
 		buf = NULL;
@@ -315,10 +338,31 @@ out:
 		uint8_t vlane = PSMX2_TAG32_GET_SRC(psm2_status->msg_tag.tag2);
 		fi_addr_t source = PSMX2_EP_TO_ADDR(psm2_status->msg_peer, vlane);
 		if (event == event_in) {
-			if (src_addr)
-				*src_addr = source;
+			if (src_addr) {
+				*src_addr = psmx2_av_translate_source(av, source);
+				if (*src_addr == FI_ADDR_NOTAVAIL) {
+					event = psmx2_cq_alloc_event(cq);
+					if (!event)
+						return NULL;
+
+					event->cqe = event_in->cqe;
+					event->cqe.err.err = FI_EADDRNOTAVAIL;
+					event->cqe.err.err_data = &cq->error_data;
+					event->error = !!event->cqe.err.err;
+					if (av->addr_format == FI_ADDR_STR) {
+						event->cqe.err.err_data_size = PSMX2_ERR_DATA_SIZE;
+						psmx2_get_source_string_name(source, (void *)&cq->error_data,
+									     &event->cqe.err.err_data_size);
+					} else {
+						psmx2_get_source_name(source, (void *)&cq->error_data);
+						event->cqe.err.err_data_size = sizeof(struct psmx2_ep_name);
+					}
+				}
+			}
 		} else {
+			event->source_is_valid = 1;
 			event->source = source;
+			event->source_av = av;
 		}
 	}
 
@@ -326,7 +370,7 @@ out:
 }
 
 int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
-		     struct psmx2_fid_domain *domain,
+		     struct psmx2_trx_ctxt *trx_ctxt,
 		     struct psmx2_cq_event *event_in,
 		     int count, fi_addr_t *src_addr)
 {
@@ -337,12 +381,14 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 	struct psmx2_fid_cq *tmp_cq;
 	struct psmx2_fid_cntr *tmp_cntr;
 	struct psmx2_cq_event *event;
-	struct psmx2_am_request *read_req;
+	struct psmx2_am_request *read_req, *write_req;
 	int multi_recv;
 	int err;
 	int read_more = 1;
 	int read_count = 0;
 	void *event_buffer = count ? event_in : NULL;
+	struct fi_context dummy_context;
+	void *req_to_free;
 
 	while (1) {
 		/* psm2_mq_ipeek and psm2_mq_test is suposed to be called
@@ -352,20 +398,22 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 		 * freed because the two psm2_mq_ipeek calls may return the
 		 * same request. Use a lock to ensure that won't happen.
 		 */
-		if (fastlock_tryacquire(&domain->poll_lock))
+		if (psmx2_trylock(&trx_ctxt->poll_lock, 2))
 			return read_count;
 
-		err = psm2_mq_ipeek(domain->psm2_mq, &psm2_req, NULL);
+		err = psm2_mq_ipeek(trx_ctxt->psm2_mq, &psm2_req, NULL);
 
 		if (err == PSM2_OK) {
 			err = psm2_mq_test2(&psm2_req, &psm2_status);
-			fastlock_release(&domain->poll_lock);
+			psmx2_unlock(&trx_ctxt->poll_lock, 2);
 
 			fi_context = psm2_status.context;
 
 			if (!fi_context)
 				continue;
 
+			req_to_free = NULL;
+
 			tmp_ep = PSMX2_CTXT_EP(fi_context);
 			tmp_cq = NULL;
 			tmp_cntr = NULL;
@@ -375,8 +423,12 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 			case PSMX2_SEND_CONTEXT:
 			case PSMX2_TSEND_CONTEXT:
 				tmp_cq = tmp_ep->send_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->send_cntr;
+				break;
+
 			case PSMX2_NOCOMP_SEND_CONTEXT:
+				if (psm2_status.error_code)
+					tmp_cq = tmp_ep->send_cq;
 				tmp_cntr = tmp_ep->send_cntr;
 				break;
 
@@ -386,8 +438,12 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 				    !psmx2_handle_sendv_req(tmp_ep, &psm2_status, 0))
 					continue;
 				tmp_cq = tmp_ep->recv_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->recv_cntr;
+				break;
+
 			case PSMX2_NOCOMP_RECV_CONTEXT:
+				if (psm2_status.error_code)
+					tmp_cq = tmp_ep->recv_cq;
 				tmp_cntr = tmp_ep->recv_cntr;
 				break;
 
@@ -397,24 +453,59 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 					psmx2_ep_put_op_context(tmp_ep, fi_context);
 					continue;
 				}
+				if (psm2_status.error_code) {
+					tmp_cq = tmp_ep->recv_cq;
+					PSMX2_CTXT_TYPE(&dummy_context) = PSMX2_NOCOMP_RECV_CONTEXT_ALLOC;
+					psm2_status.context = &dummy_context;
+				}
 				tmp_cntr = tmp_ep->recv_cntr;
 				psmx2_ep_put_op_context(tmp_ep, fi_context);
 				break;
 
 			case PSMX2_WRITE_CONTEXT:
 				tmp_cq = tmp_ep->send_cq;
-				/* Fall through */
+				tmp_cntr = tmp_ep->write_cntr;
+				write_req = container_of(fi_context, struct psmx2_am_request,
+							 fi_context);
+				req_to_free = write_req;
+				break;
+
 			case PSMX2_NOCOMP_WRITE_CONTEXT:
+				if (psm2_status.error_code)
+					tmp_cq = tmp_ep->send_cq;
 				tmp_cntr = tmp_ep->write_cntr;
+				write_req = container_of(fi_context, struct psmx2_am_request,
+							 fi_context);
+				req_to_free = write_req;
 				break;
 
 			case PSMX2_READ_CONTEXT:
 				tmp_cq = tmp_ep->send_cq;
-				/* Fall throigh */
-			case PSMX2_NOCOMP_READ_CONTEXT:
+				tmp_cntr = tmp_ep->read_cntr;
 				read_req = container_of(fi_context, struct psmx2_am_request,
 							fi_context);
+				if (read_req->op == PSMX2_AM_REQ_READV) {
+					read_req->read.len_read += psm2_status.nbytes;
+					if (read_req->read.len_read < read_req->read.len) {
+						FI_INFO(&psmx2_prov, FI_LOG_EP_DATA,
+							"readv: long protocol finishes early\n");
+						tmp_cq = NULL;
+						tmp_cntr = NULL;
+						if (psm2_status.error_code)
+							read_req->error = psmx2_errno(psm2_status.error_code);
+						/* Request to be freed in AM handler */
+						break;
+					}
+				}
+				req_to_free = read_req;
+				break;
+
+			case PSMX2_NOCOMP_READ_CONTEXT:
+				if (psm2_status.error_code)
+					tmp_cq = tmp_ep->send_cq;
 				tmp_cntr = tmp_ep->read_cntr;
+				read_req = container_of(fi_context, struct psmx2_am_request,
+							fi_context);
 				if (read_req->op == PSMX2_AM_REQ_READV) {
 					read_req->read.len_read += psm2_status.nbytes;
 					if (read_req->read.len_read < read_req->read.len) {
@@ -422,8 +513,13 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 							"readv: long protocol finishes early\n");
 						tmp_cq = NULL;
 						tmp_cntr = NULL;
+						if (psm2_status.error_code)
+							read_req->error = psmx2_errno(psm2_status.error_code);
+						/* Request to be freed in AM handler */
+						break;
 					}
 				}
+				req_to_free = read_req;
 				break;
 
 			case PSMX2_MULTI_RECV_CONTEXT:
@@ -450,7 +546,7 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 				  mr = PSMX2_CTXT_USER(fi_context);
 				  if (req->ep->recv_cq && (req->cq_flags & FI_REMOTE_CQ_DATA)) {
 					event = psmx2_cq_create_event_from_status(
-							req->ep->recv_cq,
+							req->ep->recv_cq, req->ep->av,
 							&psm2_status, req->write.data,
 							(req->ep->recv_cq == cq) ?
 								event_buffer : NULL,
@@ -479,6 +575,8 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 				  if (mr->cntr && mr->cntr != req->ep->remote_write_cntr)
 					psmx2_cntr_inc(mr->cntr);
 
+				  free(req);
+
 				  if (read_more)
 					continue;
 
@@ -494,6 +592,8 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 				  if (req->ep->remote_read_cntr)
 					psmx2_cntr_inc(req->ep->remote_read_cntr);
 
+				  free(req);
+
 				  continue;
 				}
 
@@ -555,7 +655,7 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 
 			if (tmp_cq) {
 				event = psmx2_cq_create_event_from_status(
-						tmp_cq, &psm2_status, 0,
+						tmp_cq, tmp_ep->av, &psm2_status, 0,
 						(tmp_cq == cq) ? event_buffer : NULL, count,
 						src_addr);
 				if (!event)
@@ -576,6 +676,8 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 				}
 			}
 
+			free(req_to_free);
+
 			if (tmp_cntr)
 				psmx2_cntr_inc(tmp_cntr);
 
@@ -590,7 +692,7 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 				if (len_remaining >= req->min_buf_size) {
 					if (len_remaining > PSMX2_MAX_MSG_SIZE)
 						len_remaining = PSMX2_MAX_MSG_SIZE;
-					err = psm2_mq_irecv2(tmp_ep->domain->psm2_mq,
+					err = psm2_mq_irecv2(tmp_ep->trx_ctxt->psm2_mq,
 							    req->src_addr, &req->tag,
 							    &req->tagsel, req->flag,
 							    req->buf + req->offset, 
@@ -610,10 +712,10 @@ int psmx2_cq_poll_mq(struct psmx2_fid_cq *cq,
 
 			return read_count;
 		} else if (err == PSM2_MQ_NO_COMPLETIONS) {
-			fastlock_release(&domain->poll_lock);
+			psmx2_unlock(&trx_ctxt->poll_lock, 2);
 			return read_count;
 		} else {
-			fastlock_release(&domain->poll_lock);
+			psmx2_unlock(&trx_ctxt->poll_lock, 2);
 			return psmx2_errno(err);
 		}
 	}
@@ -626,18 +728,23 @@ static ssize_t psmx2_cq_readfrom(struct fid_cq *cq, void *buf, size_t count,
 	struct psmx2_cq_event *event;
 	int ret;
 	ssize_t read_count;
+	fi_addr_t source;
 	int i;
 
 	cq_priv = container_of(cq, struct psmx2_fid_cq, cq);
 
 	if (slist_empty(&cq_priv->event_queue) || !buf) {
-		ret = psmx2_cq_poll_mq(cq_priv, cq_priv->domain,
-				       (struct psmx2_cq_event *)buf, count, src_addr);
-		if (ret > 0)
-			return ret;
-
-		if (cq_priv->domain->am_initialized)
-			psmx2_am_progress(cq_priv->domain);
+		if (cq_priv->trx_ctxt) {
+			ret = psmx2_cq_poll_mq(cq_priv, cq_priv->trx_ctxt,
+					       (struct psmx2_cq_event *)buf, count, src_addr);
+			if (ret > 0)
+				return ret;
+
+			if (cq_priv->trx_ctxt->am_initialized)
+				psmx2_am_progress(cq_priv->trx_ctxt);
+		} else {
+			psmx2_progress_all(cq_priv->domain);
+		}
 	}
 
 	if (cq_priv->pending_error)
@@ -651,10 +758,32 @@ static ssize_t psmx2_cq_readfrom(struct fid_cq *cq, void *buf, size_t count,
 		event = psmx2_cq_dequeue_event(cq_priv);
 		if (event) {
 			if (!event->error) {
-				memcpy(buf, (void *)&event->cqe, cq_priv->entry_size);
-				if (src_addr)
-					*src_addr = event->source;
+				if (src_addr && event->source_is_valid) {
+					source = psmx2_av_translate_source(event->source_av,
+									   event->source);
+					if (source == FI_ADDR_NOTAVAIL) {
+						if (cq_priv->domain->addr_format == FI_ADDR_STR) {
+							event->cqe.err.err_data_size = PSMX2_ERR_DATA_SIZE;
+							psmx2_get_source_string_name(event->source,
+										     (void *)&cq_priv->error_data,
+										     &event->cqe.err.err_data_size);
+						} else {
+							psmx2_get_source_name(event->source, (void *)&cq_priv->error_data);
+							event->cqe.err.err_data_size = sizeof(struct psmx2_ep_name);
+						}
+						event->cqe.err.err_data = &cq_priv->error_data;
+						event->cqe.err.err = FI_EADDRNOTAVAIL;
+						event->error = !!event->cqe.err.err;
+						cq_priv->pending_error = event;
+						if (!read_count)
+							read_count = -FI_EAVAIL;
+						break;
+					}
 
+					*src_addr = source;
+				}
+
+				memcpy(buf, (void *)&event->cqe, cq_priv->entry_size);
 				psmx2_cq_free_event(cq_priv, event);
 
 				read_count++;
@@ -692,11 +821,18 @@ static ssize_t psmx2_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf,
 			        uint64_t flags)
 {
 	struct psmx2_fid_cq *cq_priv;
+	uint32_t api_version;
+	size_t size;
 
 	cq_priv = container_of(cq, struct psmx2_fid_cq, cq);
 
 	if (cq_priv->pending_error) {
-		memcpy(buf, &cq_priv->pending_error->cqe, sizeof *buf);
+		api_version = cq_priv->domain->fabric->util_fabric.
+			      fabric_fid.api_version;
+		size = FI_VERSION_GE(api_version, FI_VERSION(1, 5)) ?
+			sizeof(*buf) : sizeof(struct fi_cq_err_entry_1_0);
+
+		memcpy(buf, &cq_priv->pending_error->cqe, size);
 		free(cq_priv->pending_error);
 		cq_priv->pending_error = NULL;
 		return 1;
@@ -728,8 +864,12 @@ static ssize_t psmx2_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 		} else {
 			clock_gettime(CLOCK_REALTIME, &ts0);
 			while (1) {
-				if (psmx2_cq_poll_mq(cq_priv, cq_priv->domain, NULL, 0, NULL))
-					break;
+				if (cq_priv->trx_ctxt) {
+					if (psmx2_cq_poll_mq(cq_priv, cq_priv->trx_ctxt, NULL, 0, NULL))
+						break;
+				} else {
+					psmx2_progress_all(cq_priv->domain);
+				}
 
 				/* CQ may be updated asynchronously by the AM handlers */
 				if (cq_priv->event_count > event_count)
diff --git a/prov/psm2/src/psmx2_domain.c b/prov/psm2/src/psmx2_domain.c
index 6e5c6d6..bdfcce4 100644
--- a/prov/psm2/src/psmx2_domain.c
+++ b/prov/psm2/src/psmx2_domain.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,6 +32,126 @@
 
 #include "psmx2.h"
 
+void psmx2_trx_ctxt_free(struct psmx2_trx_ctxt *trx_ctxt)
+{
+	int err;
+
+	if (!trx_ctxt)
+		return;
+
+	if (trx_ctxt->am_initialized)
+		psmx2_am_fini(trx_ctxt);
+
+#if 0
+	/* AM messages could arrive after MQ is finalized, causing segfault
+	 * when trying to dereference the MQ pointer. There is no mechanism
+	 * to properly shutdown AM. The workaround is to keep MQ valid.
+	 */
+	psm2_mq_finalize(trx_ctxt->psm2_mq);
+#endif
+
+	/* workaround for:
+	 * Assertion failure at psm2_ep.c:1059: ep->mctxt_master == ep
+	 */
+	sleep(psmx2_env.delay);
+
+	if (psmx2_env.timeout)
+		err = psm2_ep_close(trx_ctxt->psm2_ep, PSM2_EP_CLOSE_GRACEFUL,
+				    (int64_t) psmx2_env.timeout * 1000000000LL);
+	else
+		err = PSM2_EP_CLOSE_TIMEOUT;
+
+	if (err != PSM2_OK)
+		psm2_ep_close(trx_ctxt->psm2_ep, PSM2_EP_CLOSE_FORCE, 0);
+
+	fastlock_destroy(&trx_ctxt->poll_lock);
+	free(trx_ctxt);
+}
+
+struct psmx2_trx_ctxt *psmx2_trx_ctxt_alloc(struct psmx2_fid_domain *domain,
+					    struct psmx2_ep_name *src_addr,
+					    int sep_ctxt_idx)
+{
+	struct psmx2_trx_ctxt *trx_ctxt;
+	struct psm2_ep_open_opts opts;
+	int should_retry = 0;
+	int err;
+
+	trx_ctxt = calloc(1, sizeof(*trx_ctxt));
+	if (!trx_ctxt) {
+		FI_WARN(&psmx2_prov, FI_LOG_CORE,
+			"failed to allocate trx_ctxt.\n");
+		return NULL;
+	}
+
+	psm2_ep_open_opts_get_defaults(&opts);
+	FI_INFO(&psmx2_prov, FI_LOG_CORE,
+		"uuid: %s\n", psmx2_uuid_to_string(domain->fabric->uuid));
+
+	opts.unit = src_addr ? src_addr->unit : PSMX2_DEFAULT_UNIT;
+	opts.port = src_addr ? src_addr->port : PSMX2_DEFAULT_PORT;
+	FI_INFO(&psmx2_prov, FI_LOG_CORE,
+		"ep_open_opts: unit=%d port=%u\n", opts.unit, opts.port);
+
+	if (opts.unit < 0 && sep_ctxt_idx >= 0) {
+		should_retry = 1;
+		opts.unit = sep_ctxt_idx % psmx2_env.num_devunits;
+		FI_INFO(&psmx2_prov, FI_LOG_CORE,
+			"sep %d: ep_open_opts: unit=%d\n", sep_ctxt_idx, opts.unit);
+	}
+
+	err = psm2_ep_open(domain->fabric->uuid, &opts,
+			   &trx_ctxt->psm2_ep, &trx_ctxt->psm2_epid);
+	if (err != PSM2_OK) {
+		FI_WARN(&psmx2_prov, FI_LOG_CORE,
+			"psm2_ep_open returns %d, errno=%d\n", err, errno);
+		if (!should_retry) {
+			err = psmx2_errno(err);
+			goto err_out;
+		}
+
+		/* When round-robin fails, retry w/o explicit assignment */
+		opts.unit = -1;
+		err = psm2_ep_open(domain->fabric->uuid, &opts,
+				   &trx_ctxt->psm2_ep, &trx_ctxt->psm2_epid);
+		if (err != PSM2_OK) {
+			FI_WARN(&psmx2_prov, FI_LOG_CORE,
+				"psm2_ep_open returns %d, errno=%d\n", err, errno);
+			err = psmx2_errno(err);
+			goto err_out;
+		}
+	}
+
+	FI_INFO(&psmx2_prov, FI_LOG_CORE,
+		"epid: 0x%016lx\n", trx_ctxt->psm2_epid);
+
+	err = psm2_mq_init(trx_ctxt->psm2_ep, PSM2_MQ_ORDERMASK_ALL,
+			   NULL, 0, &trx_ctxt->psm2_mq);
+	if (err != PSM2_OK) {
+		FI_WARN(&psmx2_prov, FI_LOG_CORE,
+			"psm2_mq_init returns %d, errno=%d\n", err, errno);
+		err = psmx2_errno(err);
+		goto err_out_close_ep;
+	}
+
+	fastlock_init(&trx_ctxt->poll_lock);
+	fastlock_init(&trx_ctxt->rma_queue.lock);
+	fastlock_init(&trx_ctxt->trigger_queue.lock);
+	slist_init(&trx_ctxt->rma_queue.list);
+	slist_init(&trx_ctxt->trigger_queue.list);
+
+	return trx_ctxt;
+
+err_out_close_ep:
+	if (psm2_ep_close(trx_ctxt->psm2_ep, PSM2_EP_CLOSE_GRACEFUL,
+			  (int64_t) psmx2_env.timeout * 1000000000LL) != PSM2_OK)
+		psm2_ep_close(trx_ctxt->psm2_ep, PSM2_EP_CLOSE_FORCE, 0);
+
+err_out:
+	free(trx_ctxt);
+	return NULL;
+}
+
 static inline int normalize_core_id(int core_id, int num_cores)
 {
 	if (core_id < 0)
@@ -127,7 +247,7 @@ static void *psmx2_progress_func(void *args)
 	ts.tv_nsec = (sleep_usec % 1000000) * 1000;
 
 	while (1) {
-		psmx2_progress(domain);
+		psmx2_progress_all(domain);
 		nanosleep(&ts, NULL);
 	}
 
@@ -177,13 +297,12 @@ static void psmx2_domain_stop_progress(struct psmx2_fid_domain *domain)
 static int psmx2_domain_close(fid_t fid)
 {
 	struct psmx2_fid_domain *domain;
-	int err;
 
 	domain = container_of(fid, struct psmx2_fid_domain,
 			      util_domain.domain_fid.fid);
 
 	FI_INFO(&psmx2_prov, FI_LOG_DOMAIN, "refcnt=%d\n",
-		atomic_get(&domain->util_domain.ref));
+		ofi_atomic_get32(&domain->util_domain.ref));
 
 	psmx2_domain_release(domain);
 
@@ -193,39 +312,18 @@ static int psmx2_domain_close(fid_t fid)
 	if (domain->progress_thread_enabled)
 		psmx2_domain_stop_progress(domain);
 
-	if (domain->am_initialized)
-		psmx2_am_fini(domain);
+	fastlock_destroy(&domain->sep_lock);
 
-	fastlock_destroy(&domain->poll_lock);
 	fastlock_destroy(&domain->vl_lock);
 	rbtDelete(domain->mr_map);
 	fastlock_destroy(&domain->mr_lock);
 
-#if 0
-	/* AM messages could arrive after MQ is finalized, causing segfault
-	 * when trying to dereference the MQ pointer. There is no mechanism
-	 * to properly shutdown AM. The workaround is to keep MQ valid.
-	 */
-	psm2_mq_finalize(domain->psm2_mq);
-#endif
-
-	/* workaround for:
-	 * Assertion failure at psm2_ep.c:1059: ep->mctxt_master == ep
-	 */
-	sleep(psmx2_env.delay);
-
-	if (psmx2_env.timeout)
-		err = psm2_ep_close(domain->psm2_ep, PSM2_EP_CLOSE_GRACEFUL,
-				    (int64_t) psmx2_env.timeout * 1000000000LL);
-	else
-		err = PSM2_EP_CLOSE_TIMEOUT;
-
-	if (err != PSM2_OK)
-		psm2_ep_close(domain->psm2_ep, PSM2_EP_CLOSE_FORCE, 0);
-
+	psmx2_trx_ctxt_free(domain->base_trx_ctxt);
 	domain->fabric->active_domain = NULL;
-
 	free(domain);
+
+	psmx2_atomic_global_fini();
+	psmx2_am_global_fini();
 	return 0;
 }
 
@@ -242,11 +340,12 @@ static struct fi_ops_domain psmx2_domain_ops = {
 	.av_open = psmx2_av_open,
 	.cq_open = psmx2_cq_open,
 	.endpoint = psmx2_ep_open,
-	.scalable_ep = fi_no_scalable_ep,
+	.scalable_ep = psmx2_sep_open,
 	.cntr_open = psmx2_cntr_open,
 	.poll_open = fi_poll_create,
 	.stx_ctx = psmx2_stx_ctx,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = psmx2_query_atomic,
 };
 
 static int psmx2_key_compare(void *key1, void *key2)
@@ -255,50 +354,22 @@ static int psmx2_key_compare(void *key1, void *key2)
 }
 
 static int psmx2_domain_init(struct psmx2_fid_domain *domain,
-			     struct psmx2_src_name *src_addr)
+			     struct psmx2_ep_name *src_addr)
 {
-	struct psmx2_fid_fabric *fabric = domain->fabric;
-	struct psm2_ep_open_opts opts;
 	int err;
 
-	psm2_ep_open_opts_get_defaults(&opts);
-
-	FI_INFO(&psmx2_prov, FI_LOG_CORE,
-		"uuid: %s\n", psmx2_uuid_to_string(fabric->uuid));
+	psmx2_am_global_init();
+	psmx2_atomic_global_init();
 
-	if (src_addr) {
-		opts.unit = src_addr->unit;
-		opts.port = src_addr->port;
-		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"ep_open_opts: unit=%d port=%u\n", opts.unit, opts.port);
-	}
-
-	err = psm2_ep_open(fabric->uuid, &opts,
-			   &domain->psm2_ep, &domain->psm2_epid);
-	if (err != PSM2_OK) {
-		FI_WARN(&psmx2_prov, FI_LOG_CORE,
-			"psm2_ep_open returns %d, errno=%d\n", err, errno);
-		err = psmx2_errno(err);
-		goto err_out;
-	}
-
-	FI_INFO(&psmx2_prov, FI_LOG_CORE,
-		"epid: 0x%016lx\n", domain->psm2_epid);
-
-	err = psm2_mq_init(domain->psm2_ep, PSM2_MQ_ORDERMASK_ALL,
-			   NULL, 0, &domain->psm2_mq);
-	if (err != PSM2_OK) {
-		FI_WARN(&psmx2_prov, FI_LOG_CORE,
-			"psm2_mq_init returns %d, errno=%d\n", err, errno);
-		err = psmx2_errno(err);
-		goto err_out_close_ep;
-	}
+	domain->base_trx_ctxt = psmx2_trx_ctxt_alloc(domain, src_addr, -1);
+	if (!domain->base_trx_ctxt)
+		return -FI_ENODEV;
 
 	err = fastlock_init(&domain->mr_lock);
 	if (err) {
 		FI_WARN(&psmx2_prov, FI_LOG_CORE,
 			"fastlock_init(mr_lock) returns %d\n", err);
-		goto err_out_finalize_mq;
+		goto err_out_free_trx_ctxt;
 	}
 
 	domain->mr_map = rbtNew(&psmx2_key_compare);
@@ -319,12 +390,12 @@ static int psmx2_domain_init(struct psmx2_fid_domain *domain,
 	memset(domain->vl_map, 0, sizeof(domain->vl_map));
 	domain->vl_alloc = 0;
 
-	err = fastlock_init(&domain->poll_lock);
-	if (err) {
-		FI_WARN(&psmx2_prov, FI_LOG_CORE,
-			"fastlock_init(poll_lock) returns %d\n", err);
-		goto err_out_destroy_vl_lock;
-	}
+	ofi_atomic_initialize32(&domain->sep_cnt, 0);
+	fastlock_init(&domain->sep_lock);
+	dlist_init(&domain->sep_list);
+	dlist_init(&domain->trx_ctxt_list);
+	fastlock_init(&domain->trx_ctxt_lock);
+	dlist_insert_before(&domain->base_trx_ctxt->entry, &domain->trx_ctxt_list);
 
 	/* Set active domain before psmx2_domain_enable_ep() installs the
 	 * AM handlers to ensure that psmx2_active_fabric->active_domain
@@ -332,7 +403,7 @@ static int psmx2_domain_init(struct psmx2_fid_domain *domain,
 	 * active_domain becomes NULL again only when the domain is closed.
 	 * At that time the AM handlers are gone with the PSM endpoint.
 	 */
-	fabric->active_domain = domain;
+	domain->fabric->active_domain = domain;
 
 	if (psmx2_domain_enable_ep(domain, NULL) < 0)
 		goto err_out_reset_active_domain;
@@ -340,13 +411,11 @@ static int psmx2_domain_init(struct psmx2_fid_domain *domain,
 	if (domain->progress_thread_enabled)
 		psmx2_domain_start_progress(domain);
 
+	psmx2_am_init(domain->base_trx_ctxt);
 	return 0;
 
 err_out_reset_active_domain:
-	fabric->active_domain = NULL;
-	fastlock_destroy(&domain->poll_lock);
-
-err_out_destroy_vl_lock:
+	domain->fabric->active_domain = NULL;
 	fastlock_destroy(&domain->vl_lock);
 
 err_out_delete_mr_map:
@@ -355,15 +424,8 @@ err_out_delete_mr_map:
 err_out_destroy_mr_lock:
 	fastlock_destroy(&domain->mr_lock);
 
-err_out_finalize_mq:
-	psm2_mq_finalize(domain->psm2_mq);
-
-err_out_close_ep:
-	if (psm2_ep_close(domain->psm2_ep, PSM2_EP_CLOSE_GRACEFUL,
-			  (int64_t) psmx2_env.timeout * 1000000000LL) != PSM2_OK)
-		psm2_ep_close(domain->psm2_ep, PSM2_EP_CLOSE_FORCE, 0);
-
-err_out:
+err_out_free_trx_ctxt:
+	psmx2_trx_ctxt_free(domain->base_trx_ctxt);
 	return err;
 }
 
@@ -372,14 +434,26 @@ int psmx2_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 {
 	struct psmx2_fid_fabric *fabric_priv;
 	struct psmx2_fid_domain *domain_priv;
+	struct psmx2_ep_name *src_addr = info->src_addr;
+	int mr_mode = (info->domain_attr->mr_mode & FI_MR_BASIC) ? FI_MR_BASIC : 0;
 	int err;
 
 	FI_INFO(&psmx2_prov, FI_LOG_DOMAIN, "\n");
 
+	if (!psmx2_env.sep)
+		psmx2_domain_ops.scalable_ep = fi_no_scalable_ep;
+
 	fabric_priv = container_of(fabric, struct psmx2_fid_fabric,
 				   util_fabric.fabric_fid);
 
 	if (fabric_priv->active_domain) {
+		if (mr_mode != fabric_priv->active_domain->mr_mode) {
+			FI_INFO(&psmx2_prov, FI_LOG_DOMAIN,
+				"mr_mode mismatch: expecting %s\n",
+				mr_mode ? "FI_MR_SCALABLE" : "FI_MR_BASIC");
+			return -FI_EINVAL;
+		}
+
 		psmx2_domain_acquire(fabric_priv->active_domain);
 		*domain = &fabric_priv->active_domain->util_domain.domain_fid;
 		return 0;
@@ -405,14 +479,20 @@ int psmx2_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	domain_priv->util_domain.domain_fid.fid.ops = &psmx2_fi_ops;
 	domain_priv->util_domain.domain_fid.ops = &psmx2_domain_ops;
 	domain_priv->util_domain.domain_fid.mr = &psmx2_mr_ops;
-	domain_priv->mr_mode = info->domain_attr->mr_mode;
+	domain_priv->mr_mode = mr_mode;
 	domain_priv->mode = info->mode;
-	domain_priv->caps = info->caps;
+	domain_priv->caps = PSMX2_CAPS | PSMX2_DOM_CAPS;
 	domain_priv->fabric = fabric_priv;
 	domain_priv->progress_thread_enabled =
 		(info->domain_attr->data_progress == FI_PROGRESS_AUTO);
+	domain_priv->addr_format = info->addr_format;
 
-	err = psmx2_domain_init(domain_priv, info->src_addr);
+	if (info->addr_format == FI_ADDR_STR)
+		src_addr = psmx2_string_to_ep_name(info->src_addr);
+
+	err = psmx2_domain_init(domain_priv, src_addr);
+	if (info->addr_format == FI_ADDR_STR)
+		free(src_addr);
 	if (err)
 		goto err_out_close_domain;
 
@@ -463,14 +543,8 @@ int psmx2_domain_enable_ep(struct psmx2_fid_domain *domain,
 		return -FI_EOPNOTSUPP;
 	}
 
-	if (((ep_cap & FI_RMA) || (ep_cap & FI_ATOMICS)) &&
-	    !domain->am_initialized) {
-		int err = psmx2_am_init(domain);
-		if (err)
-			return err;
-
-		domain->am_initialized = 1;
-	}
+	if ((ep_cap & FI_RMA) || (ep_cap & FI_ATOMICS))
+		return psmx2_am_init(ep->trx_ctxt);
 
 	return 0;
 }
diff --git a/prov/psm2/src/psmx2_ep.c b/prov/psm2/src/psmx2_ep.c
index a645faf..a2e4e5a 100644
--- a/prov/psm2/src/psmx2_ep.c
+++ b/prov/psm2/src/psmx2_ep.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -41,7 +41,7 @@ static inline void bitmap_set(uint64_t *map, unsigned id)
 
 	i = id / sizeof(uint64_t);
 	j = id % sizeof(uint64_t);
-	
+
 	map[i] |= BIT(j);
 }
 
@@ -51,7 +51,7 @@ static inline void bitmap_clear(uint64_t *map, unsigned id)
 
 	i = id / sizeof(uint64_t);
 	j = id % sizeof(uint64_t);
-	
+
 	map[i] &= ~BIT(j);
 }
 
@@ -61,15 +61,15 @@ static inline int bitmap_test(uint64_t *map, unsigned id)
 
 	i = id / sizeof(uint64_t);
 	j = id % sizeof(uint64_t);
-	
+
 	return !!(map[i] & BIT(j));
 }
 
 static void psmx2_free_vlane(struct psmx2_fid_domain *domain, uint8_t vl)
 {
-	fastlock_acquire(&domain->vl_lock);
+	psmx2_lock(&domain->vl_lock, 1);
 	bitmap_clear(domain->vl_map, vl);
-	fastlock_release(&domain->vl_lock);
+	psmx2_unlock(&domain->vl_lock, 1);
 }
 
 static int psmx2_alloc_vlane(struct psmx2_fid_domain *domain, uint8_t *vl)
@@ -77,8 +77,8 @@ static int psmx2_alloc_vlane(struct psmx2_fid_domain *domain, uint8_t *vl)
 	int i;
 	int id;
 
-	fastlock_acquire(&domain->vl_lock);
-	for (i=0; i<BITMAP_SIZE; i++) {
+	psmx2_lock(&domain->vl_lock, 1);
+	for (i = 0; i < BITMAP_SIZE; i++) {
 		id = (domain->vl_alloc + i) % BITMAP_SIZE;
 		if (bitmap_test(domain->vl_map, id) == 0) {
 			bitmap_set(domain->vl_map, id);
@@ -86,7 +86,7 @@ static int psmx2_alloc_vlane(struct psmx2_fid_domain *domain, uint8_t *vl)
 			break;
 		}
 	}
-	fastlock_release(&domain->vl_lock);
+	psmx2_unlock(&domain->vl_lock, 1);
 
 	if (i >= BITMAP_SIZE)
 		return -FI_ENOSPC;
@@ -231,24 +231,11 @@ static int psmx2_ep_setopt(fid_t fid, int level, int optname,
 	return 0;
 }
 
-static int psmx2_ep_close(fid_t fid)
+static void psmx2_ep_close_internal(struct psmx2_fid_ep *ep)
 {
-	struct psmx2_fid_ep *ep;
 	struct slist_entry *entry;
 	struct psmx2_context *item;
 
-	ep = container_of(fid, struct psmx2_fid_ep, ep.fid);
-
-	if (ep->base_ep) {
-		atomic_dec(&ep->base_ep->ref);
-		return 0;
-	}
-
-	if (atomic_get(&ep->ref))
-		return -FI_EBUSY;
-
-	ep->domain->eps[ep->vlane] = NULL;
-	psmx2_free_vlane(ep->domain, ep->vlane);
 	psmx2_domain_release(ep->domain);
 
 	while (!slist_empty(&ep->free_context_list)) {
@@ -258,9 +245,34 @@ static int psmx2_ep_close(fid_t fid)
 	}
 
 	fastlock_destroy(&ep->context_lock);
-
 	free(ep);
+}
+
+static int psmx2_ep_close(fid_t fid)
+{
+	struct psmx2_fid_ep *ep;
+	struct psmx2_ep_name ep_name;
 
+	ep = container_of(fid, struct psmx2_fid_ep, ep.fid);
+
+	if (ep->base_ep) {
+		ofi_atomic_dec32(&ep->base_ep->ref);
+		return 0;
+	}
+
+	if (ofi_atomic_get32(&ep->ref))
+		return -FI_EBUSY;
+
+	ep_name.epid = ep->trx_ctxt->psm2_epid;
+	ep_name.vlane = ep->vlane;
+
+	ofi_ns_del_local_name(&ep->domain->fabric->name_server,
+			      &ep->service, &ep_name);
+
+	ep->domain->eps[ep->vlane] = NULL;
+	psmx2_free_vlane(ep->domain, ep->vlane);
+
+	psmx2_ep_close_internal(ep);
 	return 0;
 }
 
@@ -286,6 +298,13 @@ static int psmx2_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 		cq = container_of(bfid, struct psmx2_fid_cq, cq.fid);
 		if (ep->domain != cq->domain)
 			return -FI_EINVAL;
+		if (cq->trx_ctxt == PSMX2_ALL_TRX_CTXT) {
+			/* do nothing */
+		} else if (!cq->trx_ctxt) {
+			cq->trx_ctxt = ep->trx_ctxt;
+		} else if (cq->trx_ctxt != ep->trx_ctxt) {
+			return -FI_EINVAL;
+		}
 		if (flags & FI_SEND) {
 			ep->send_cq = cq;
 			if (flags & FI_SELECTIVE_COMPLETION)
@@ -303,6 +322,13 @@ static int psmx2_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 		cntr = container_of(bfid, struct psmx2_fid_cntr, cntr.fid);
 		if (ep->domain != cntr->domain)
 			return -FI_EINVAL;
+		if (cntr->trx_ctxt == PSMX2_ALL_TRX_CTXT) {
+			/* do nothing */
+		} else if (!cntr->trx_ctxt) {
+			cntr->trx_ctxt = ep->trx_ctxt;
+		} else if (cntr->trx_ctxt != ep->trx_ctxt) {
+			return -FI_EINVAL;
+		}
 		if (flags & FI_SEND)
 			ep->send_cntr = cntr;
 		if (flags & FI_RECV)
@@ -401,7 +427,7 @@ static int psmx2_ep_control(fid_t fid, int command, void *arg)
 			return err;
 		}
 		new_ep->base_ep = ep;
-		atomic_inc(&ep->ref);
+		ofi_atomic_inc32(&ep->ref);
 		psmx2_ep_optimize_ops(new_ep);
 		*alias->fid = &new_ep->ep.fid;
 		break;
@@ -473,13 +499,13 @@ static struct fi_ops_ep psmx2_ep_ops = {
 	.tx_size_left = psmx2_tx_size_left,
 };
 
-int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
-		  struct fid_ep **ep, void *context)
+int psmx2_ep_open_internal(struct psmx2_fid_domain *domain_priv,
+			   struct fi_info *info,
+			   struct psmx2_fid_ep **ep_out, void *context,
+			   struct psmx2_trx_ctxt *trx_ctxt, int vlane)
 {
-	struct psmx2_fid_domain *domain_priv;
 	struct psmx2_fid_ep *ep_priv;
 	struct psmx2_context *item;
-	uint8_t vlane;
 	uint64_t ep_cap;
 	int err = -FI_EINVAL;
 	int i;
@@ -489,23 +515,31 @@ int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
 	else
 		ep_cap = FI_TAGGED;
 
-	domain_priv = container_of(domain, struct psmx2_fid_domain,	
-				   util_domain.domain_fid.fid);
-	if (!domain_priv)
-		goto errout;
+	if (info && info->ep_attr && info->ep_attr->auth_key) {
+		if (info->ep_attr->auth_key_size != sizeof(psm2_uuid_t)) {
+			FI_WARN(&psmx2_prov, FI_LOG_EP_CTRL,
+				"Invalid auth_key_len %d, should be %d.\n",
+				info->ep_attr->auth_key_size,
+				sizeof(psm2_uuid_t));
+			goto errout;
+		}
+		if (memcmp(domain_priv->fabric->uuid, info->ep_attr->auth_key,
+			   sizeof(psm2_uuid_t))) {
+			FI_WARN(&psmx2_prov, FI_LOG_EP_CTRL,
+				"Invalid auth_key: %s\n",
+				psmx2_uuid_to_string((void *)info->ep_attr->auth_key));
+			goto errout;
+		}
+	}
 
 	err = psmx2_domain_check_features(domain_priv, ep_cap);
 	if (err)
 		goto errout;
 
-	err = psmx2_alloc_vlane(domain_priv, &vlane);
-	if (err)
-		goto errout;
-
 	ep_priv = (struct psmx2_fid_ep *) calloc(1, sizeof *ep_priv);
 	if (!ep_priv) {
 		err = -FI_ENOMEM;
-		goto errout_free_vlane;
+		goto errout;
 	}
 
 	ep_priv->ep.fid.fclass = FI_CLASS_EP;
@@ -514,8 +548,9 @@ int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
 	ep_priv->ep.ops = &psmx2_ep_ops;
 	ep_priv->ep.cm = &psmx2_cm_ops;
 	ep_priv->domain = domain_priv;
+	ep_priv->trx_ctxt = trx_ctxt;
 	ep_priv->vlane = vlane;
-	atomic_initialize(&ep_priv->ref, 0);
+	ofi_atomic_initialize32(&ep_priv->ref, 0);
 
 	PSMX2_CTXT_TYPE(&ep_priv->nocomp_send_context) = PSMX2_NOCOMP_SEND_CONTEXT;
 	PSMX2_CTXT_EP(&ep_priv->nocomp_send_context) = ep_priv;
@@ -538,7 +573,6 @@ int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
 		goto errout_free_ep;
 
 	psmx2_domain_acquire(domain_priv);
-	domain_priv->eps[ep_priv->vlane] = ep_priv;
 
 	if (info) {
 		if (info->tx_attr)
@@ -553,7 +587,7 @@ int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
 	fastlock_init(&ep_priv->context_lock);
 
 #define PSMX2_FREE_CONTEXT_LIST_SIZE	64
-	for (i=0; i<PSMX2_FREE_CONTEXT_LIST_SIZE; i++) {
+	for (i = 0; i < PSMX2_FREE_CONTEXT_LIST_SIZE; i++) {
 		item = calloc(1, sizeof(*item));
 		if (!item) {
 			FI_WARN(&psmx2_prov, FI_LOG_EP_CTRL, "out of memory.\n");
@@ -562,15 +596,72 @@ int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
 		slist_insert_tail(&item->list_entry, &ep_priv->free_context_list);
 	}
 
-	*ep = &ep_priv->ep;
 
+	*ep_out = ep_priv;
 	return 0;
 
 errout_free_ep:
 	free(ep_priv);
 
-errout_free_vlane:
-	psmx2_free_vlane(domain_priv, vlane);
+errout:
+	return err;
+}
+
+int psmx2_ep_open(struct fid_domain *domain, struct fi_info *info,
+		  struct fid_ep **ep, void *context)
+{
+	struct psmx2_fid_domain *domain_priv;
+	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_ep_name ep_name;
+	struct psmx2_ep_name *src_addr;
+	uint8_t vlane;
+	int err = -FI_EINVAL;
+
+	domain_priv = container_of(domain, struct psmx2_fid_domain,
+				   util_domain.domain_fid.fid);
+	if (!domain_priv)
+		goto errout;
+
+	err = psmx2_alloc_vlane(domain_priv, &vlane);
+	if (err)
+		goto errout;
+
+	err = psmx2_ep_open_internal(domain_priv, info, &ep_priv, context,
+				     domain_priv->base_trx_ctxt, vlane);
+	if (err) {
+		psmx2_free_vlane(domain_priv, vlane);
+		goto errout;
+	}
+
+	domain_priv->eps[ep_priv->vlane] = ep_priv;
+
+	ep_priv->type = PSMX2_EP_REGULAR;
+	ep_priv->service = PSMX2_ANY_SERVICE;
+	if (info && info->src_addr) {
+		if (info->addr_format == FI_ADDR_STR) {
+			src_addr = psmx2_string_to_ep_name(info->src_addr);
+			if (src_addr) {
+				ep_priv->service = src_addr->service;
+				free(src_addr);
+			}
+		} else {
+			ep_priv->service = ((struct psmx2_ep_name *)info->src_addr)->service;
+		}
+	}
+
+	if (ep_priv->service == PSMX2_ANY_SERVICE)
+		ep_priv->service = ((getpid() & 0x7FFF) << 16) +
+				   ((uintptr_t)ep_priv & 0xFFFF);
+
+	ep_name.epid = domain_priv->base_trx_ctxt->psm2_epid;
+	ep_name.vlane = ep_priv->vlane;
+	ep_name.type = ep_priv->type;
+
+	ofi_ns_add_local_name(&domain_priv->fabric->name_server,
+			      &ep_priv->service, &ep_name);
+
+	*ep = &ep_priv->ep;
+	return 0;
 
 errout:
 	return err;
@@ -630,14 +721,14 @@ struct fi_context *psmx2_ep_get_op_context(struct psmx2_fid_ep *ep)
 {
 	struct psmx2_context *context;
 
-	fastlock_acquire(&ep->context_lock);
+	psmx2_lock(&ep->context_lock, 2);
 	if (!slist_empty(&ep->free_context_list)) {
 		context = container_of(slist_remove_head(&ep->free_context_list),
 				       struct psmx2_context, list_entry);
-		fastlock_release(&ep->context_lock);
+		psmx2_unlock(&ep->context_lock, 2);
 		return &context->fi_context;
 	}
-	fastlock_release(&ep->context_lock);
+	psmx2_unlock(&ep->context_lock, 2);
 
 	context = malloc(sizeof(*context));
 	if (!context)
@@ -656,8 +747,293 @@ void psmx2_ep_put_op_context(struct psmx2_fid_ep *ep,
 
 	context = container_of(fi_context, struct psmx2_context, fi_context);
 	context->list_entry.next = NULL;
-	fastlock_acquire(&ep->context_lock);
+	psmx2_lock(&ep->context_lock, 2);
 	slist_insert_tail(&context->list_entry, &ep->free_context_list);
-	fastlock_release(&ep->context_lock);
+	psmx2_unlock(&ep->context_lock, 2);
+}
+
+/*
+ * Scalable endpoint
+ */
+
+static int psmx2_sep_close(fid_t fid)
+{
+	struct psmx2_fid_sep *sep;
+	struct psmx2_ep_name ep_name;
+	int i;
+
+	sep = container_of(fid, struct psmx2_fid_sep, ep.fid);
+
+	if (ofi_atomic_get32(&sep->ref))
+		return -FI_EBUSY;
+
+	for (i = 0; i < sep->ctxt_cnt; i++) {
+		if (sep->ctxts[i].ep && ofi_atomic_get32(&sep->ctxts[i].ep->ref))
+			return -FI_EBUSY;
+	}
+
+	for (i = 0; i < sep->ctxt_cnt; i++) {
+		if (sep->ctxts[i].ep)
+			psmx2_ep_close_internal(sep->ctxts[i].ep);
+
+		psmx2_lock(&sep->domain->trx_ctxt_lock, 1);
+		dlist_remove(&sep->ctxts[i].trx_ctxt->entry);
+		psmx2_unlock(&sep->domain->trx_ctxt_lock, 1);
+		psmx2_trx_ctxt_free(sep->ctxts[i].trx_ctxt);
+	}
+
+	ep_name.epid = sep->domain->base_trx_ctxt->psm2_epid;
+	ep_name.sep_id = sep->id;
+	ep_name.type = sep->type;
+
+	ofi_ns_del_local_name(&sep->domain->fabric->name_server,
+			      &sep->service, &ep_name);
+
+	psmx2_lock(&sep->domain->sep_lock, 1);
+	dlist_remove(&sep->entry);
+	psmx2_unlock(&sep->domain->sep_lock, 1);
+
+	psmx2_domain_release(sep->domain);
+	free(sep);
+	return 0;
 }
 
+static int psmx2_sep_control(fid_t fid, int command, void *arg)
+{
+	struct psmx2_fid_sep *sep;
+
+	sep = container_of(fid, struct psmx2_fid_sep, ep.fid);
+
+	switch (command) {
+	case FI_ENABLE:
+		sep->enabled = 1;
+		return 0;
+
+	default:
+		return -FI_ENOSYS;
+	}
+
+	return 0;
+}
+
+static int psmx2_sep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
+{
+	struct psmx2_fid_sep *sep;
+	int i, err = 0;
+
+	sep = container_of(fid, struct psmx2_fid_sep, ep.fid);
+
+	for (i = 0; i < sep->ctxt_cnt; i++) {
+		err = psmx2_ep_bind(&sep->ctxts[i].ep->ep.fid, bfid, flags);
+		if (err)
+			break;
+	}
+
+	return err;
+}
+
+static int psmx2_tx_context(struct fid_ep *ep, int index, struct fi_tx_attr *attr,
+			    struct fid_ep **tx_ep, void *context)
+{
+	struct psmx2_fid_sep *sep;
+
+	sep = container_of(ep, struct psmx2_fid_sep, ep);
+
+	if (index < 0 || index > sep->ctxt_cnt)
+		return -FI_EINVAL;
+
+	*tx_ep = &sep->ctxts[index].ep->ep;
+	return 0;
+}
+
+static int psmx2_rx_context(struct fid_ep *ep, int index, struct fi_rx_attr *attr,
+			    struct fid_ep **rx_ep, void *context)
+{
+	struct psmx2_fid_sep *sep;
+
+	sep = container_of(ep, struct psmx2_fid_sep, ep);
+
+	if (index < 0 || index > sep->ctxt_cnt)
+		return -FI_EINVAL;
+
+	*rx_ep = &sep->ctxts[index].ep->ep;
+	return 0;
+}
+
+static int psmx2_sep_ctxt_close(fid_t fid)
+{
+	struct psmx2_fid_ep *ep;
+
+	ep = container_of(fid, struct psmx2_fid_ep, ep.fid);
+
+	if (ep->base_ep)
+		ofi_atomic_dec32(&ep->base_ep->ref);
+
+	return 0;
+}
+
+static struct fi_ops psmx2_fi_ops_sep_ctxt = {
+	.size = sizeof(struct fi_ops),
+	.close = psmx2_sep_ctxt_close,
+	.bind = psmx2_ep_bind,
+	.control = psmx2_ep_control,
+	.ops_open = fi_no_ops_open,
+};
+
+static struct fi_ops psmx2_fi_ops_sep = {
+	.size = sizeof(struct fi_ops),
+	.close = psmx2_sep_close,
+	.bind = psmx2_sep_bind,
+	.control = psmx2_sep_control,
+	.ops_open = fi_no_ops_open,
+};
+
+static struct fi_ops_ep psmx2_sep_ops = {
+	.size = sizeof(struct fi_ops_ep),
+	.cancel = fi_no_cancel,
+	.getopt = fi_no_getopt,
+	.setopt = fi_no_setopt,
+	.tx_ctx = psmx2_tx_context,
+	.rx_ctx = psmx2_rx_context,
+	.rx_size_left = fi_no_rx_size_left,
+	.tx_size_left = fi_no_tx_size_left,
+};
+
+int psmx2_sep_open(struct fid_domain *domain, struct fi_info *info,
+		   struct fid_ep **sep, void *context)
+{
+	struct psmx2_fid_domain *domain_priv;
+	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_fid_sep *sep_priv;
+	struct psmx2_ep_name ep_name;
+	struct psmx2_ep_name *src_addr;
+	struct psmx2_trx_ctxt *trx_ctxt;
+	size_t ctxt_cnt = 1;
+	size_t ctxt_size;
+	int err = -FI_EINVAL;
+	int i;
+
+	domain_priv = container_of(domain, struct psmx2_fid_domain,
+				   util_domain.domain_fid.fid);
+	if (!domain_priv)
+		goto errout;
+
+	if (info && info->ep_attr) {
+		if (info->ep_attr->tx_ctx_cnt > psmx2_env.max_trx_ctxt) {
+			FI_WARN(&psmx2_prov, FI_LOG_EP_CTRL,
+				"tx_ctx_cnt %d exceed limit %d.\n",
+				info->ep_attr->tx_ctx_cnt,
+				psmx2_env.max_trx_ctxt);
+			goto errout;
+		}
+		if (info->ep_attr->rx_ctx_cnt > psmx2_env.max_trx_ctxt) {
+			FI_WARN(&psmx2_prov, FI_LOG_EP_CTRL,
+				"rx_ctx_cnt %d exceed limit %d.\n",
+				info->ep_attr->rx_ctx_cnt,
+				psmx2_env.max_trx_ctxt);
+			goto errout;
+		}
+		ctxt_cnt = info->ep_attr->tx_ctx_cnt;
+		if (ctxt_cnt < info->ep_attr->rx_ctx_cnt)
+			ctxt_cnt = info->ep_attr->rx_ctx_cnt;
+		if (ctxt_cnt == 0) {
+			FI_INFO(&psmx2_prov, FI_LOG_EP_CTRL,
+				"tx_ctx_cnt and rx_ctx_cnt are 0, use 1.\n");
+			ctxt_cnt = 1;
+		}
+	}
+
+	ctxt_size = ctxt_cnt * sizeof(struct psmx2_sep_ctxt);
+	sep_priv = (struct psmx2_fid_sep *) calloc(1, sizeof(*sep_priv) + ctxt_size);
+	if (!sep_priv) {
+		err = -FI_ENOMEM;
+		goto errout;
+	}
+
+	sep_priv->ep.fid.fclass = FI_CLASS_SEP;
+	sep_priv->ep.fid.context = context;
+	sep_priv->ep.fid.ops = &psmx2_fi_ops_sep;
+	sep_priv->ep.ops = &psmx2_sep_ops;
+	sep_priv->ep.cm = &psmx2_cm_ops;
+	sep_priv->domain = domain_priv;
+	sep_priv->ctxt_cnt = ctxt_cnt;
+	ofi_atomic_initialize32(&sep_priv->ref, 0);
+ 
+	src_addr = NULL;
+	if (info && info->src_addr) {
+		if (info->addr_format == FI_ADDR_STR)
+			src_addr = psmx2_string_to_ep_name(info->src_addr);
+		else
+			src_addr = info->src_addr;
+	}
+
+	for (i = 0; i < ctxt_cnt; i++) {
+		trx_ctxt = psmx2_trx_ctxt_alloc(domain_priv, src_addr, i);
+		if (!trx_ctxt)
+			goto errout_free_ctxt;
+
+		sep_priv->ctxts[i].trx_ctxt = trx_ctxt;
+
+		err = psmx2_ep_open_internal(domain_priv, info, &ep_priv, context,
+					     trx_ctxt, 0);
+		if (err)
+			goto errout_free_ctxt;
+
+		/* override the ops so the fid can't be closed individually */
+		ep_priv->ep.fid.ops = &psmx2_fi_ops_sep_ctxt;
+
+		trx_ctxt->ep = ep_priv;
+		sep_priv->ctxts[i].ep = ep_priv;
+	}
+
+	sep_priv->type = PSMX2_EP_SCALABLE;
+	sep_priv->service = PSMX2_ANY_SERVICE;
+	if (src_addr) {
+		sep_priv->service = src_addr->service;
+		if (info->addr_format == FI_ADDR_STR)
+			free(src_addr);
+	}
+
+	if (sep_priv->service == PSMX2_ANY_SERVICE)
+		sep_priv->service = ((getpid() & 0x7FFF) << 16) +
+				   ((uintptr_t)sep_priv & 0xFFFF);
+
+	sep_priv->id = ofi_atomic_inc32(&domain_priv->sep_cnt);
+
+	psmx2_lock(&domain_priv->sep_lock, 1);
+	dlist_insert_before(&sep_priv->entry, &domain_priv->sep_list);
+	psmx2_unlock(&domain_priv->sep_lock, 1);
+
+	psmx2_lock(&domain_priv->trx_ctxt_lock, 1);
+	for (i = 0; i< ctxt_cnt; i++) {
+		dlist_insert_before(&sep_priv->ctxts[i].trx_ctxt->entry,
+				    &domain_priv->trx_ctxt_list);
+	}
+	psmx2_unlock(&domain_priv->trx_ctxt_lock, 1);
+
+	ep_name.epid = domain_priv->base_trx_ctxt->psm2_epid;
+	ep_name.sep_id = sep_priv->id;
+	ep_name.type = sep_priv->type;
+
+	ofi_ns_add_local_name(&domain_priv->fabric->name_server,
+			      &sep_priv->service, &ep_name);
+
+	*sep = &sep_priv->ep;
+	return 0;
+
+errout_free_ctxt:
+	while (i) {
+		if (sep_priv->ctxts[i].ep)
+			psmx2_ep_close_internal(sep_priv->ctxts[i].ep);
+
+		if (sep_priv->ctxts[i].trx_ctxt)
+			psmx2_trx_ctxt_free(sep_priv->ctxts[i].trx_ctxt);
+
+		i--;
+	}
+
+	free(sep_priv);
+
+errout:
+	return err;
+}
diff --git a/prov/psm2/src/psmx2_fabric.c b/prov/psm2/src/psmx2_fabric.c
index 8754acd..96779c9 100644
--- a/prov/psm2/src/psmx2_fabric.c
+++ b/prov/psm2/src/psmx2_fabric.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -37,38 +37,21 @@ struct psmx2_fid_fabric *psmx2_active_fabric = NULL;
 static int psmx2_fabric_close(fid_t fid)
 {
 	struct psmx2_fid_fabric *fabric;
-	void *exit_code;
-	int ret;
 
 	fabric = container_of(fid, struct psmx2_fid_fabric,
 			      util_fabric.fabric_fid.fid);
 
 	FI_INFO(&psmx2_prov, FI_LOG_CORE, "refcnt=%d\n",
-		atomic_get(&fabric->util_fabric.ref));
+		ofi_atomic_get32(&fabric->util_fabric.ref));
+
+	if (psmx2_env.name_server)
+		ofi_ns_stop_server(&fabric->name_server);
 
 	psmx2_fabric_release(fabric);
 
 	if (ofi_fabric_close(&fabric->util_fabric))
 		return 0;
 
-	if (psmx2_env.name_server &&
-	    !pthread_equal(fabric->name_server_thread, pthread_self())) {
-		ret = pthread_cancel(fabric->name_server_thread);
-		if (ret) {
-			FI_INFO(&psmx2_prov, FI_LOG_CORE,
-				"pthread_cancel returns %d\n", ret);
-		}
-		ret = pthread_join(fabric->name_server_thread, &exit_code);
-		if (ret) {
-			FI_INFO(&psmx2_prov, FI_LOG_CORE,
-				"pthread_join returns %d\n", ret);
-		} else {
-			FI_INFO(&psmx2_prov, FI_LOG_CORE,
-				"name server thread exited with code %ld (%s)\n",
-				(uintptr_t)exit_code,
-				(exit_code == PTHREAD_CANCELED) ? "PTHREAD_CANCELED" : "?");
-		}
-	}
 	if (fabric->active_domain) {
 		FI_WARN(&psmx2_prov, FI_LOG_CORE, "forced closing of active_domain\n");
 		fi_close(&fabric->active_domain->util_domain.domain_fid.fid);
@@ -120,11 +103,33 @@ int psmx2_fabric(struct fi_fabric_attr *attr,
 	if (!fabric_priv)
 		return -FI_ENOMEM;
 
+	psmx2_get_uuid(fabric_priv->uuid);
+	if (psmx2_env.name_server) {
+		struct util_ns_attr ns_attr = {
+			.ns_port = psmx2_uuid_to_port(fabric_priv->uuid),
+			.name_len = sizeof(struct psmx2_ep_name),
+			.service_len = sizeof(int),
+			.service_cmp = psmx2_ns_service_cmp,
+			.is_service_wildcard = psmx2_ns_is_service_wildcard,
+		};
+		ret = ofi_ns_init(&ns_attr,
+				  &fabric_priv->name_server);
+		if (ret) {
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+			        "ofi_ns_init returns %d\n", ret);
+			free(fabric_priv);
+			return ret;
+		}
+
+		ofi_ns_start_server(&fabric_priv->name_server);
+	}
+
 	ret = ofi_fabric_init(&psmx2_prov, &psmx2_fabric_attr, attr,
-			     &fabric_priv->util_fabric, context,
-			     FI_MATCH_EXACT);
+			     &fabric_priv->util_fabric, context);
 	if (ret) {
 		FI_INFO(&psmx2_prov, FI_LOG_CORE, "ofi_fabric_init returns %d\n", ret);
+		if (psmx2_env.name_server)
+			ofi_ns_stop_server(&fabric_priv->name_server);
 		free(fabric_priv);
 		return ret;
 	}
@@ -133,18 +138,6 @@ int psmx2_fabric(struct fi_fabric_attr *attr,
 	fabric_priv->util_fabric.fabric_fid.fid.ops = &psmx2_fabric_fi_ops;
 	fabric_priv->util_fabric.fabric_fid.ops = &psmx2_fabric_ops;
 
-	psmx2_get_uuid(fabric_priv->uuid);
-
-	if (psmx2_env.name_server) {
-		ret = pthread_create(&fabric_priv->name_server_thread, NULL,
-				     psmx2_name_server, (void *)fabric_priv);
-		if (ret) {
-			FI_INFO(&psmx2_prov, FI_LOG_CORE, "pthread_create returns %d\n", ret);
-			/* use the main thread's ID as invalid value for the new thread */
-			fabric_priv->name_server_thread = pthread_self();
-		}
-	}
-
 	psmx2_query_mpi();
 
 	/* take the reference to count for multiple fabric open calls */
diff --git a/prov/psm2/src/psmx2_init.c b/prov/psm2/src/psmx2_init.c
index 636273d..76b3da1 100644
--- a/prov/psm2/src/psmx2_init.c
+++ b/prov/psm2/src/psmx2_init.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,8 +32,12 @@
 
 #include "psmx2.h"
 #include "prov.h"
+#include <glob.h>
+#include <dlfcn.h>
 
 static int psmx2_init_count = 0;
+static int psmx2_lib_initialized = 0;
+static pthread_mutex_t psmx2_lib_mutex;
 
 struct psmx2_env psmx2_env = {
 	.name_server	= 1,
@@ -43,6 +47,11 @@ struct psmx2_env psmx2_env = {
 	.timeout	= 5,
 	.prog_interval	= -1,
 	.prog_affinity	= NULL,
+	.sep		= 0,
+	.max_trx_ctxt	= 1,
+	.num_devunits	= 1,
+	.inject_size	= PSMX2_INJECT_SIZE,
+	.lock_level	= 2,
 };
 
 static void psmx2_init_env(void)
@@ -57,6 +66,104 @@ static void psmx2_init_env(void)
 	fi_param_get_int(&psmx2_prov, "timeout", &psmx2_env.timeout);
 	fi_param_get_int(&psmx2_prov, "prog_interval", &psmx2_env.prog_interval);
 	fi_param_get_str(&psmx2_prov, "prog_affinity", &psmx2_env.prog_affinity);
+	fi_param_get_int(&psmx2_prov, "inject_size", &psmx2_env.inject_size);
+	fi_param_get_bool(&psmx2_prov, "lock_level", &psmx2_env.lock_level);
+}
+
+static int psmx2_check_sep_cap(void)
+{
+	if (!psmx2_sep_ok())
+		return 0;
+
+	psmx2_env.sep = 1;
+	psmx2_env.max_trx_ctxt = PSMX2_MAX_TRX_CTXT;
+
+	return 1;
+}
+
+static int psmx2_init_lib(int default_multi_ep)
+{
+	int major, minor;
+	int ret = 0, err;
+
+	if (psmx2_lib_initialized)
+		return 0;
+
+	pthread_mutex_lock(&psmx2_lib_mutex);
+
+	if (psmx2_lib_initialized)
+		goto out;
+
+	if (default_multi_ep)
+		setenv("PSM2_MULTI_EP", "1", 0);
+
+	psm2_error_register_handler(NULL, PSM2_ERRHANDLER_NO_HANDLER);
+
+	major = PSM2_VERNO_MAJOR;
+	minor = PSM2_VERNO_MINOR;
+
+	err = psm2_init(&major, &minor);
+	if (err != PSM2_OK) {
+		FI_WARN(&psmx2_prov, FI_LOG_CORE,
+			"psm2_init failed: %s\n", psm2_error_get_string(err));
+		ret = err;
+		goto out;
+	}
+
+	FI_INFO(&psmx2_prov, FI_LOG_CORE,
+		"PSM header version = (%d, %d)\n", PSM2_VERNO_MAJOR, PSM2_VERNO_MINOR);
+	FI_INFO(&psmx2_prov, FI_LOG_CORE,
+		"PSM library version = (%d, %d)\n", major, minor);
+
+	if (psmx2_check_sep_cap())
+		FI_INFO(&psmx2_prov, FI_LOG_CORE, "Scalable EP enabled.\n");
+	else
+		FI_INFO(&psmx2_prov, FI_LOG_CORE, "Scalable EP disabled.\n");
+
+	psmx2_lib_initialized = 1;
+
+out:
+	pthread_mutex_unlock(&psmx2_lib_mutex);
+	return ret;
+}
+
+#define PSMX2_SYSFS_PATH "/sys/class/infiniband/hfi1"
+static int psmx2_read_sysfs_int(int unit, char *entry)
+{
+	char path[64];
+	char buffer[32];
+	int n, ret = 0;
+
+	sprintf(path, "%s_%d", PSMX2_SYSFS_PATH, unit);
+	n = fi_read_file(path, entry, buffer, 32);
+	if (n > 0) {
+		buffer[n] = 0;
+		ret = strtol(buffer, NULL, 10);
+		FI_INFO(&psmx2_prov, FI_LOG_CORE, "%s/%s: %d\n", path, entry, ret);
+	}
+
+	return ret;
+}
+
+static void psmx2_update_sep_cap(void)
+{
+	int i, n = 0;
+
+	for (i = 0; i < psmx2_env.num_devunits; i++)
+		n += psmx2_read_sysfs_int(i, "nfreectxts");
+
+	FI_INFO(&psmx2_prov, FI_LOG_CORE, "Total free hfi1 contexts: %d\n", n);
+
+	/* reserve one context for regular ep */
+	if (n > 0)
+		n--;
+
+	if (n > PSMX2_MAX_TRX_CTXT)
+		n = PSMX2_MAX_TRX_CTXT;
+
+	psmx2_env.max_trx_ctxt = n;
+	FI_INFO(&psmx2_prov, FI_LOG_CORE, "SEP: %d Tx/Rx contexts allowed.\n",
+		psmx2_env.max_trx_ctxt);
 }
 
 static int psmx2_getinfo(uint32_t version, const char *node,
@@ -66,7 +173,7 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 	struct fi_info *psmx2_info;
 	uint32_t cnt = 0;
 	struct psmx2_ep_name *dest_addr = NULL;
-	struct psmx2_src_name *src_addr;
+	struct psmx2_ep_name *src_addr = NULL;
 	int ep_type = FI_EP_RDM;
 	int av_type = FI_AV_UNSPEC;
 	uint64_t mode = FI_CONTEXT;
@@ -77,67 +184,154 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 	uint64_t caps = PSMX2_CAPS;
 	uint64_t max_tag_value = -1ULL;
 	int err = -FI_ENODATA;
-	struct stat st;
+	int svc0, svc = PSMX2_ANY_SERVICE;
+	glob_t glob_buf;
+	int tx_ctx_cnt, rx_ctx_cnt;
+	int default_multi_ep = 0;
+	int addr_format = FI_ADDR_PSMX2;
+	size_t len;
+	void *addr;
+	uint32_t fmt;
 
 	FI_INFO(&psmx2_prov, FI_LOG_CORE,"\n");
 
 	*info = NULL;
 
+	if (FI_VERSION_GE(version, FI_VERSION(1,5)))
+		mr_mode = 0;
+
+	/*
+	 * Try to turn on PSM2 multi-EP support if the application asks for
+	 * more than one tx context per endpoint. This only works for the
+	 * very first fi_getinfo() call.
+	 */
+	if (hints && hints->ep_attr && hints->ep_attr->tx_ctx_cnt > 1)
+		default_multi_ep = 1;
+
+	if (psmx2_init_lib(default_multi_ep))
+		return -FI_ENODATA;
+
 	/*
 	 * psm2_ep_num_devunits() may wait for 15 seconds before return
-	 * when /dev/hfi1_0 is not present. Check the existence of this
-	 * device first to avoid this delay.
+	 * when /dev/hfi1_0 is not present. Check the existence of any hfi1
+	 * device interface first to avoid this delay. Note that the devices
+	 * don't necessarily appear consecutively so we need to check all
+	 * possible device names before returning "no device found" error.
+	 * This also means if "/dev/hfi1_0" doesn't exist but other devices
+	 * exist, we are still going to see the delay; but that's a rare case.
 	 */
-	if (stat("/dev/hfi1_0", &st) || psm2_ep_num_devunits(&cnt) || !cnt) {
+	if ((glob("/dev/hfi1_[0-9]", 0, NULL, &glob_buf) != 0) &&
+	    (glob("/dev/hfi1_[0-9][0-9]", GLOB_APPEND, NULL, &glob_buf) != 0)) {
 		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"no PSM device is found.\n");
+			"no hfi1 device is found.\n");
 		return -FI_ENODATA;
 	}
+	globfree(&glob_buf);
 
-	psmx2_init_env();
-
-	src_addr = calloc(1, sizeof(*src_addr));
-	if (!src_addr) {
+	if (psm2_ep_num_devunits(&cnt) || !cnt) {
 		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"failed to allocate src addr.\n");
+			"no PSM2 device is found.\n");
 		return -FI_ENODATA;
 	}
-	src_addr->unit = PSMX2_DEFAULT_UNIT;
-	src_addr->port = PSMX2_DEFAULT_PORT;
-	src_addr->service = PSMX2_DEFAULT_SERVICE;
 
-	if (node) {
+	psmx2_env.num_devunits = cnt;
+	psmx2_init_env();
+
+	psmx2_update_sep_cap();
+	tx_ctx_cnt = psmx2_env.max_trx_ctxt;
+	rx_ctx_cnt = psmx2_env.max_trx_ctxt;
+
+	if (node &&
+	    !ofi_str_toaddr(node, &fmt, &addr, &len) &&
+	    fmt == FI_ADDR_PSMX2) {
+		if (flags & FI_SOURCE) {
+			src_addr = addr;
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+				"'%s' is taken as src_addr: <unit=%d, port=%d, service=%d>\n",
+				node, src_addr->unit, src_addr->port, src_addr->service);
+		} else {
+			dest_addr = addr;
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+				"'%s' is taken as dest_addr: <epid=0x%llx, vl=%d>\n",
+				node, dest_addr->epid, dest_addr->vlane);
+		}
+		node = NULL;
+	}
+
+	if (!src_addr) {
+		src_addr = calloc(1, sizeof(*src_addr));
+		if (!src_addr) {
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+				"failed to allocate src addr.\n");
+			return -FI_ENODATA;
+		}
+		src_addr->type = PSMX2_EP_SRC_ADDR;
+		src_addr->epid = PSMX2_RESERVED_EPID;
+		src_addr->unit = PSMX2_DEFAULT_UNIT;
+		src_addr->port = PSMX2_DEFAULT_PORT;
+		src_addr->service = PSMX2_ANY_SERVICE;
+
 		if (flags & FI_SOURCE) {
-			sscanf(node, "%*[^:]:%d:%d", &src_addr->unit, &src_addr->port);
+			if (node)
+				sscanf(node, "%*[^:]:%" SCNi8 ":%" SCNu8,
+				       &src_addr->unit, &src_addr->port);
 			if (service)
-				sscanf(service, "%d", &src_addr->service);
+				sscanf(service, "%" SCNu32, &src_addr->service);
 			FI_INFO(&psmx2_prov, FI_LOG_CORE,
 				"node '%s' service '%s' converted to <unit=%d, port=%d, service=%d>\n",
 				node, service, src_addr->unit, src_addr->port, src_addr->service);
+		}
+	}
+
+	if (!dest_addr && node && !(flags & FI_SOURCE)) {
+		struct util_ns ns = (const struct util_ns){ 0 };
+		struct util_ns_attr ns_attr = (const struct util_ns_attr){ 0 };
+		psm2_uuid_t uuid;
+
+		psmx2_get_uuid(uuid);
+		ns_attr.ns_port = psmx2_uuid_to_port(uuid);
+		ns_attr.name_len = sizeof(*dest_addr);
+		ns_attr.service_len = sizeof(svc);
+		ns_attr.service_cmp = psmx2_ns_service_cmp;
+		ns_attr.is_service_wildcard = psmx2_ns_is_service_wildcard;
+		err = ofi_ns_init(&ns_attr, &ns);
+		if (err) {
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+				"ofi_ns_init returns %d\n", err);
+			err = -FI_ENODATA;
+			goto err_out;
+		}
+
+		if (service)
+			svc = atoi(service);
+		svc0 = svc;
+		dest_addr = (struct psmx2_ep_name *)
+			ofi_ns_resolve_name(&ns, node, &svc);
+		if (dest_addr) {
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+				"'%s:%u' resolved to <epid=0x%llx, vl=%d>:%d\n",
+				node, svc0, dest_addr->epid,
+				dest_addr->vlane, svc);
 		} else {
-			dest_addr = psmx2_resolve_name(node, 0);
-			if (dest_addr) {
-				FI_INFO(&psmx2_prov, FI_LOG_CORE,
-					"node '%s' resolved to <epid=0x%llx, vl=%d>\n", node,
-					dest_addr->epid, dest_addr->vlane);
-			} else {
-				FI_INFO(&psmx2_prov, FI_LOG_CORE,
-					"failed to resolve node '%s'.\n", node);
-				err = -FI_ENODATA;
-				goto err_out;
-			}
+			FI_INFO(&psmx2_prov, FI_LOG_CORE,
+				"failed to resolve '%s:%u'.\n", node, svc);
+			err = -FI_ENODATA;
+			goto err_out;
 		}
 	}
 
 	if (hints) {
 		switch (hints->addr_format) {
 		case FI_FORMAT_UNSPEC:
-		case FI_ADDR_PSMX:
+		case FI_ADDR_PSMX2:
+			break;
+		case FI_ADDR_STR:
+			addr_format = FI_ADDR_STR;
 			break;
 		default:
 			FI_INFO(&psmx2_prov, FI_LOG_CORE,
-				"hints->addr_format=%d, supported=%d,%d.\n",
-				hints->addr_format, FI_FORMAT_UNSPEC, FI_ADDR_PSMX);
+				"hints->addr_format=%d, supported=%d,%d,%d.\n",
+				hints->addr_format, FI_FORMAT_UNSPEC, FI_ADDR_PSMX2, FI_ADDR_STR);
 			goto err_out;
 		}
 
@@ -157,29 +351,34 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 
 			switch (hints->ep_attr->protocol) {
 			case FI_PROTO_UNSPEC:
-			case FI_PROTO_PSMX:
+			case FI_PROTO_PSMX2:
 				break;
 			default:
 				FI_INFO(&psmx2_prov, FI_LOG_CORE,
 					"hints->protocol=%d, supported=%d %d\n",
 					hints->ep_attr->protocol,
-					FI_PROTO_UNSPEC, FI_PROTO_PSMX);
+					FI_PROTO_UNSPEC, FI_PROTO_PSMX2);
 				goto err_out;
 			}
 
-			if (hints->ep_attr->tx_ctx_cnt > 1) {
+			if (hints->ep_attr->tx_ctx_cnt > psmx2_env.max_trx_ctxt &&
+			    hints->ep_attr->tx_ctx_cnt != FI_SHARED_CONTEXT) {
 				FI_INFO(&psmx2_prov, FI_LOG_CORE,
-					"hints->ep_attr->tx_ctx_cnt=%d, supported=0,1\n",
-					hints->ep_attr->tx_ctx_cnt);
+					"hints->ep_attr->tx_ctx_cnt=%d, max=%d\n",
+					hints->ep_attr->tx_ctx_cnt,
+					psmx2_env.max_trx_ctxt);
 				goto err_out;
 			}
+			tx_ctx_cnt = hints->ep_attr->tx_ctx_cnt;
 
-			if (hints->ep_attr->rx_ctx_cnt > 1) {
+			if (hints->ep_attr->rx_ctx_cnt > psmx2_env.max_trx_ctxt) {
 				FI_INFO(&psmx2_prov, FI_LOG_CORE,
-					"hints->ep_attr->rx_ctx_cnt=%d, supported=0,1\n",
-					hints->ep_attr->rx_ctx_cnt);
+					"hints->ep_attr->rx_ctx_cnt=%d, max=%d\n",
+					hints->ep_attr->rx_ctx_cnt,
+					psmx2_env.max_trx_ctxt);
 				goto err_out;
 			}
+			rx_ctx_cnt = hints->ep_attr->rx_ctx_cnt;
 		}
 
 		if ((hints->caps & PSMX2_CAPS) != hints->caps) {
@@ -260,20 +459,8 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 				goto err_out;
 			}
 
-			switch (hints->domain_attr->mr_mode) {
-			case FI_MR_UNSPEC:
-				break;
-			case FI_MR_BASIC:
-			case FI_MR_SCALABLE:
-				mr_mode = hints->domain_attr->mr_mode;
-				break;
-			default:
-				FI_INFO(&psmx2_prov, FI_LOG_CORE,
-					"hints->domain_attr->mr_mode=%d, supported=%d %d %d\n",
-					hints->domain_attr->mr_mode, FI_MR_UNSPEC, FI_MR_BASIC,
-					FI_MR_SCALABLE);
-				goto err_out;
-			}
+			if (hints->domain_attr->mr_mode & FI_MR_BASIC)
+				mr_mode = FI_MR_BASIC;
 
 			switch (hints->domain_attr->threading) {
 			case FI_THREAD_UNSPEC:
@@ -322,6 +509,12 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 					FI_PROGRESS_MANUAL, FI_PROGRESS_AUTO);
 				goto err_out;
 			}
+
+			if (hints->domain_attr->caps & FI_SHARED_AV) {
+				FI_INFO(&psmx2_prov, FI_LOG_CORE,
+					"hints->domain_attr->caps=%lx, shared AV is unsupported\n",
+					hints->domain_attr->caps);
+			}
 		}
 
 		if (hints->ep_attr) {
@@ -421,12 +614,12 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 	}
 
 	psmx2_info->ep_attr->type = ep_type;
-	psmx2_info->ep_attr->protocol = FI_PROTO_PSMX;
+	psmx2_info->ep_attr->protocol = FI_PROTO_PSMX2;
 	psmx2_info->ep_attr->protocol_version = PSM2_VERNO;
 	psmx2_info->ep_attr->max_msg_size = PSMX2_MAX_MSG_SIZE;
 	psmx2_info->ep_attr->mem_tag_format = fi_tag_format(max_tag_value);
-	psmx2_info->ep_attr->tx_ctx_cnt = 1;
-	psmx2_info->ep_attr->rx_ctx_cnt = 1;
+	psmx2_info->ep_attr->tx_ctx_cnt = tx_ctx_cnt;
+	psmx2_info->ep_attr->rx_ctx_cnt = rx_ctx_cnt;
 
 	psmx2_info->domain_attr->threading = threading;
 	psmx2_info->domain_attr->control_progress = control_progress;
@@ -439,21 +632,35 @@ static int psmx2_getinfo(uint32_t version, const char *node,
 	psmx2_info->domain_attr->cq_data_size = 4;
 	psmx2_info->domain_attr->cq_cnt = 65535;
 	psmx2_info->domain_attr->ep_cnt = 65535;
-	psmx2_info->domain_attr->tx_ctx_cnt = 1;
-	psmx2_info->domain_attr->rx_ctx_cnt = 1;
-	psmx2_info->domain_attr->max_ep_tx_ctx = 1;
-	psmx2_info->domain_attr->max_ep_rx_ctx = 1;
+	psmx2_info->domain_attr->tx_ctx_cnt = psmx2_env.max_trx_ctxt;
+	psmx2_info->domain_attr->rx_ctx_cnt = psmx2_env.max_trx_ctxt;
+	psmx2_info->domain_attr->max_ep_tx_ctx = psmx2_env.max_trx_ctxt;
+	psmx2_info->domain_attr->max_ep_rx_ctx = psmx2_env.max_trx_ctxt;
 	psmx2_info->domain_attr->max_ep_stx_ctx = 65535;
 	psmx2_info->domain_attr->max_ep_srx_ctx = 0;
+	psmx2_info->domain_attr->cntr_cnt = 65535;
+	psmx2_info->domain_attr->mr_iov_limit = 65535;
+	psmx2_info->domain_attr->caps = PSMX2_DOM_CAPS;
+	psmx2_info->domain_attr->mode = 0;
+	psmx2_info->domain_attr->mr_cnt = 65535;
 
 	psmx2_info->next = NULL;
 	psmx2_info->caps = caps;
 	psmx2_info->mode = mode;
-	psmx2_info->addr_format = FI_ADDR_PSMX;
-	psmx2_info->src_addr = src_addr;
-	psmx2_info->src_addrlen = sizeof(*src_addr);
-	psmx2_info->dest_addr = dest_addr;
-	psmx2_info->dest_addrlen = sizeof(*dest_addr);
+	psmx2_info->addr_format = addr_format;
+	if (addr_format == FI_ADDR_STR) {
+		psmx2_info->src_addr = psmx2_ep_name_to_string(src_addr, &len);
+		psmx2_info->src_addrlen = len;
+		free(src_addr);
+		psmx2_info->dest_addr = psmx2_ep_name_to_string(dest_addr, &len);
+		psmx2_info->dest_addrlen = len;
+		free(dest_addr);
+	} else {
+		psmx2_info->src_addr = src_addr;
+		psmx2_info->src_addrlen = sizeof(*src_addr);
+		psmx2_info->dest_addr = dest_addr;
+		psmx2_info->dest_addrlen = sizeof(*dest_addr);
+	}
 	psmx2_info->fabric_attr->name = strdup(PSMX2_FABRIC_NAME);
 	psmx2_info->fabric_attr->prov_name = NULL;
 	psmx2_info->fabric_attr->prov_version = PSMX2_VERSION;
@@ -493,7 +700,7 @@ static void psmx2_fini(void)
 {
 	FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n");
 
-	if (! --psmx2_init_count) {
+	if (! --psmx2_init_count && psmx2_lib_initialized) {
 		/* This function is called from a library destructor, which is called
 		 * automatically when exit() is called. The call to psm2_finalize()
 		 * might cause deadlock if the applicaiton is terminated with Ctrl-C
@@ -501,18 +708,20 @@ static void psmx2_fini(void)
 		 * psm2_finalize() tries to acquire. This can be avoided by only
 		 * calling psm2_finalize() when PSM is guaranteed to be unused.
 		 */
-		if (psmx2_active_fabric)
+		if (psmx2_active_fabric) {
 			FI_INFO(&psmx2_prov, FI_LOG_CORE,
 				"psmx2_active_fabric != NULL, skip psm2_finalize\n");
-		else
+		} else {
 			psm2_finalize();
+			psmx2_lib_initialized = 0;
+		}
 	}
 }
 
 struct fi_provider psmx2_prov = {
 	.name = PSMX2_PROV_NAME,
-	.version = FI_VERSION(0, 9),
-	.fi_version = FI_VERSION(1, 3),
+	.version = PSMX2_VERSION,
+	.fi_version = PSMX2_VERSION,
 	.getinfo = psmx2_getinfo,
 	.fabric = psmx2_fabric,
 	.cleanup = psmx2_fini
@@ -520,9 +729,6 @@ struct fi_provider psmx2_prov = {
 
 PROVIDER_INI
 {
-	int major, minor;
-	int err;
-
 	FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n");
 
 	fi_param_define(&psmx2_prov, "name_server", FI_PARAM_BOOL,
@@ -555,23 +761,13 @@ PROVIDER_INI
 			"(when >=0) or core_id - num_cores (when <0). "
 			"(default: affinity not set)");
 
-        psm2_error_register_handler(NULL, PSM2_ERRHANDLER_NO_HANDLER);
-
-	major = PSM2_VERNO_MAJOR;
-	minor = PSM2_VERNO_MINOR;
+	fi_param_define(&psmx2_prov, "inject_size", FI_PARAM_INT,
+			"Maximum message size for fi_inject and fi_tinject (default: 64).");
 
-        err = psm2_init(&major, &minor);
-	if (err != PSM2_OK) {
-		FI_WARN(&psmx2_prov, FI_LOG_CORE,
-			"psm2_init failed: %s\n", psm2_error_get_string(err));
-		return NULL;
-	}
-
-	FI_INFO(&psmx2_prov, FI_LOG_CORE,
-		"PSM header version = (%d, %d)\n", PSM2_VERNO_MAJOR, PSM2_VERNO_MINOR);
-	FI_INFO(&psmx2_prov, FI_LOG_CORE,
-		"PSM library version = (%d, %d)\n", major, minor);
+	fi_param_define(&psmx2_prov, "lock_level", FI_PARAM_INT,
+			"How internal locking is used. 0 means no locking. (default: 2).");
 
+	pthread_mutex_init(&psmx2_lib_mutex, NULL);
 	psmx2_init_count++;
 	return (&psmx2_prov);
 }
diff --git a/prov/psm2/src/psmx2_mr.c b/prov/psm2/src/psmx2_mr.c
index 688b97c..a38cc97 100644
--- a/prov/psm2/src/psmx2_mr.c
+++ b/prov/psm2/src/psmx2_mr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -38,14 +38,14 @@ struct psmx2_fid_mr *psmx2_mr_get(struct psmx2_fid_domain *domain,
 	RbtIterator it;
 	struct psmx2_fid_mr *mr = NULL;
 
-	fastlock_acquire(&domain->mr_lock);
+	psmx2_lock(&domain->mr_lock, 1);
 	it = rbtFind(domain->mr_map, (void *)key);
 	if (!it)
 		goto exit;
 
 	rbtKeyValue(domain->mr_map, it, (void **)&key, (void **)&mr);
 exit:
-	fastlock_release(&domain->mr_lock);
+	psmx2_unlock(&domain->mr_lock, 1);
 	return mr;
 }
 
@@ -54,11 +54,11 @@ static inline void psmx2_mr_release_key(struct psmx2_fid_domain *domain,
 {
 	RbtIterator it;
 
-	fastlock_acquire(&domain->mr_lock);
+	psmx2_lock(&domain->mr_lock, 1);
 	it = rbtFind(domain->mr_map, (void *)key);
 	if (it)
 		rbtErase(domain->mr_map, it);
-	fastlock_release(&domain->mr_lock);
+	psmx2_unlock(&domain->mr_lock, 1);
 }
 
 static int psmx2_mr_reserve_key(struct psmx2_fid_domain *domain,
@@ -71,20 +71,20 @@ static int psmx2_mr_reserve_key(struct psmx2_fid_domain *domain,
 	int try_count;
 	int err = -FI_ENOKEY;
 
-	fastlock_acquire(&domain->mr_lock);
+	psmx2_lock(&domain->mr_lock, 1);
 
-	if (domain->mr_mode == FI_MR_SCALABLE) {
-		key = requested_key;
-		try_count = 1;
-	} else {
+	if (domain->mr_mode == FI_MR_BASIC) {
 		key = domain->mr_reserved_key;
 		try_count = 10000; /* large enough */
+	} else {
+		key = requested_key;
+		try_count = 1;
 	}
 
 	for (i=0; i<try_count; i++, key++) {
 		if (!rbtFind(domain->mr_map, (void *)key)) {
 			if (!rbtInsert(domain->mr_map, (void *)key, mr)) {
-				if (domain->mr_mode != FI_MR_SCALABLE)
+				if (domain->mr_mode == FI_MR_BASIC)
 					domain->mr_reserved_key = key + 1;
 				*assigned_key = key;
 				err = 0;
@@ -93,7 +93,7 @@ static int psmx2_mr_reserve_key(struct psmx2_fid_domain *domain,
 		}
 	}
 
-	fastlock_release(&domain->mr_lock);
+	psmx2_unlock(&domain->mr_lock, 1);
 
 	return err;
 }
@@ -156,6 +156,7 @@ static int psmx2_mr_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 		if (mr->domain != cntr->domain)
 			return -FI_EINVAL;
 		mr->cntr = cntr;
+		cntr->trx_ctxt = PSMX2_ALL_TRX_CTXT;
 		break;
 
 	default:
@@ -275,9 +276,8 @@ static int psmx2_mr_reg(struct fid *fid, const void *buf, size_t len,
 	mr_priv->iov_count = 1;
 	mr_priv->iov[0].iov_base = (void *)buf;
 	mr_priv->iov[0].iov_len = len;
-	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ?
-				((uint64_t)mr_priv->iov[0].iov_base - offset) :
-				0;
+	mr_priv->offset = (domain_priv->mr_mode == FI_MR_BASIC) ? 0 :
+				((uint64_t)mr_priv->iov[0].iov_base - offset);
 
 	*mr = &mr_priv->mr;
 	return 0;
@@ -331,9 +331,8 @@ static int psmx2_mr_regv(struct fid *fid,
 	for (i=0; i<count; i++)
 		mr_priv->iov[i] = iov[i];
 	psmx2_mr_normalize_iov(mr_priv->iov, &mr_priv->iov_count);
-	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ?
-				((uint64_t)mr_priv->iov[0].iov_base - offset) :
-				0;
+	mr_priv->offset = (domain_priv->mr_mode == FI_MR_BASIC) ? 0 :
+				((uint64_t)mr_priv->iov[0].iov_base - offset);
 
 	*mr = &mr_priv->mr;
 	return 0;
@@ -387,9 +386,8 @@ static int psmx2_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
 	for (i=0; i<attr->iov_count; i++)
 		mr_priv->iov[i] = attr->mr_iov[i];
 	psmx2_mr_normalize_iov(mr_priv->iov, &mr_priv->iov_count);
-	mr_priv->offset = (domain_priv->mr_mode == FI_MR_SCALABLE) ?
-				((uint64_t)mr_priv->iov[0].iov_base - attr->offset) :
-				0;
+	mr_priv->offset = (domain_priv->mr_mode == FI_MR_BASIC) ? 0 :
+				((uint64_t)mr_priv->iov[0].iov_base - attr->offset);
 
 	*mr = &mr_priv->mr;
 	return 0;
diff --git a/prov/psm2/src/psmx2_msg.c b/prov/psm2/src/psmx2_msg.c
index 6d5c130..f59609c 100644
--- a/prov/psm2/src/psmx2_msg.c
+++ b/prov/psm2/src/psmx2_msg.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -76,7 +76,10 @@ ssize_t psmx2_recv_generic(struct fid_ep *ep, void *buf, size_t len,
 
 	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
 		av = ep_priv->av;
-		if (av && av->type == FI_AV_TABLE) {
+		if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else if (av && av->type == FI_AV_TABLE) {
 			idx = (size_t)src_addr;
 			if (idx >= av->last)
 				return -FI_EINVAL;
@@ -88,11 +91,11 @@ ssize_t psmx2_recv_generic(struct fid_ep *ep, void *buf, size_t len,
 			vlane = PSMX2_ADDR_TO_VL(src_addr);
 		}
 		tag32 = PSMX2_TAG32(PSMX2_MSG_BIT, vlane, ep_priv->vlane);
-		tagsel32 = ~PSMX2_IOV_BIT;
+		tagsel32 = ~(PSMX2_IOV_BIT | PSMX2_IMM_BIT);
 	} else {
 		psm2_epaddr = 0;
 		tag32 = PSMX2_TAG32(PSMX2_MSG_BIT, 0, ep_priv->vlane);
-		tagsel32 = ~(PSMX2_IOV_BIT | PSMX2_SRC_BITS);
+		tagsel32 = ~(PSMX2_IOV_BIT | PSMX2_IMM_BIT | PSMX2_SRC_BITS);
 	}
 
 	PSMX2_SET_TAG(psm2_tag, 0ULL, tag32);
@@ -137,7 +140,7 @@ ssize_t psmx2_recv_generic(struct fid_ep *ep, void *buf, size_t len,
 		PSMX2_CTXT_SIZE(fi_context) = len;
 	}
 
-	err = psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     &psm2_tag, &psm2_tagsel, recv_flag, buf, len,
 			     (void *)fi_context, &psm2_req);
 	if (err != PSM2_OK)
@@ -254,7 +257,10 @@ ssize_t psmx2_send_generic(struct fid_ep *ep, const void *buf, size_t len,
 	}
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = (size_t)dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -267,6 +273,8 @@ ssize_t psmx2_send_generic(struct fid_ep *ep, const void *buf, size_t len,
 	}
 
 	tag32 = PSMX2_TAG32(PSMX2_MSG_BIT, ep_priv->vlane, vlane);
+	if (flags & FI_REMOTE_CQ_DATA)
+		tag32 |= PSMX2_IMM_BIT;
 	PSMX2_SET_TAG(psm2_tag, data, tag32);
 
 	if ((flags & PSMX2_NO_COMPLETION) ||
@@ -274,10 +282,10 @@ ssize_t psmx2_send_generic(struct fid_ep *ep, const void *buf, size_t len,
 		no_completion = 1;
 
 	if (flags & FI_INJECT) {
-		if (len > PSMX2_INJECT_SIZE)
+		if (len > psmx2_env.inject_size)
 			return -FI_EMSGSIZE;
 
-		err = psm2_mq_send2(ep_priv->domain->psm2_mq, psm2_epaddr,
+		err = psm2_mq_send2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 				    send_flag, &psm2_tag, buf, len);
 
 		if (err != PSM2_OK)
@@ -316,7 +324,7 @@ ssize_t psmx2_send_generic(struct fid_ep *ep, const void *buf, size_t len,
 		PSMX2_CTXT_EP(fi_context) = ep_priv;
 	}
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     send_flag, &psm2_tag, buf, len,
 			     (void *)fi_context, &psm2_req);
 
@@ -424,7 +432,10 @@ ssize_t psmx2_sendv_generic(struct fid_ep *ep, const struct iovec *iov,
 	}
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = (size_t)dest_addr;
 		if (idx >= av->last) {
 			free(req);
@@ -439,6 +450,8 @@ ssize_t psmx2_sendv_generic(struct fid_ep *ep, const struct iovec *iov,
 	}
 
 	tag32 = PSMX2_TAG32(tag32_base, ep_priv->vlane, vlane);
+	if (flags & FI_REMOTE_CQ_DATA)
+		tag32 |= PSMX2_IMM_BIT;
 	PSMX2_SET_TAG(psm2_tag, data, tag32);
 
 	if ((flags & PSMX2_NO_COMPLETION) ||
@@ -446,12 +459,12 @@ ssize_t psmx2_sendv_generic(struct fid_ep *ep, const struct iovec *iov,
 		no_completion = 1;
 
 	if (flags & FI_INJECT) {
-		if (len > PSMX2_INJECT_SIZE) {
+		if (len > psmx2_env.inject_size) {
 			free(req);
 			return -FI_EMSGSIZE;
 		}
 
-		err = psm2_mq_send2(ep_priv->domain->psm2_mq, psm2_epaddr,
+		err = psm2_mq_send2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 				    send_flag, &psm2_tag, req->buf, len);
 
 		free(req);
@@ -489,7 +502,7 @@ ssize_t psmx2_sendv_generic(struct fid_ep *ep, const struct iovec *iov,
 	PSMX2_CTXT_USER(fi_context) = req;
 	PSMX2_CTXT_EP(fi_context) = ep_priv;
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     send_flag, &psm2_tag, req->buf, len,
 			     (void *)fi_context, &psm2_req);
 
@@ -505,12 +518,12 @@ ssize_t psmx2_sendv_generic(struct fid_ep *ep, const struct iovec *iov,
 		PSMX2_CTXT_TYPE(fi_context) = PSMX2_IOV_SEND_CONTEXT;
 		PSMX2_CTXT_USER(fi_context) = req;
 		PSMX2_CTXT_EP(fi_context) = ep_priv;
-		tag32 = PSMX2_TAG32(PSMX2_MSG_BIT, ep_priv->vlane, vlane);
+		tag32 &= ~PSMX2_IOV_BIT;
 		PSMX2_TAG32_SET_SEQ(tag32, req->iov_info.seq_num);
 		PSMX2_SET_TAG(psm2_tag, data, tag32);
 		for (i=0; i<count; i++) {
 			if (iov[i].iov_len) {
-				err = psm2_mq_isend2(ep_priv->domain->psm2_mq,
+				err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq,
 						     psm2_epaddr, send_flag, &psm2_tag,
 						     iov[i].iov_base, iov[i].iov_len,
 						     (void *)fi_context, &psm2_req);
@@ -581,6 +594,8 @@ int psmx2_handle_sendv_req(struct psmx2_fid_ep *ep,
 	PSMX2_TAG32_SET_SEQ(psm2_tag.tag2, rep->iov_info.seq_num);
 
 	rep->comp_flag = (psm2_tag.tag2 & PSMX2_MSG_BIT) ? FI_MSG : FI_TAGGED;
+	if (psm2_tag.tag2 & PSMX2_IMM_BIT)
+		rep->comp_flag |= FI_REMOTE_CQ_DATA;
 
 	/* match every bit of the tag */
 	PSMX2_SET_TAG(psm2_tagsel, -1UL, -1);
@@ -588,7 +603,7 @@ int psmx2_handle_sendv_req(struct psmx2_fid_ep *ep,
 	for (i=0; i<rep->iov_info.count; i++) {
 		if (recv_len) {
 			len = MIN(recv_len, rep->iov_info.len[i]);
-			err = psm2_mq_irecv2(ep->domain->psm2_mq,
+			err = psm2_mq_irecv2(ep->trx_ctxt->psm2_mq,
 					     psm2_status->msg_peer,
 					     &psm2_tag, &psm2_tagsel,
 					     0/*flag*/, recv_buf, len,
@@ -601,7 +616,7 @@ int psmx2_handle_sendv_req(struct psmx2_fid_ep *ep,
 			recv_len -= len;
 		} else {
 			/* recv buffer full, pust empty recvs */
-			err = psm2_mq_irecv2(ep->domain->psm2_mq,
+			err = psm2_mq_irecv2(ep->trx_ctxt->psm2_mq,
 					     psm2_status->msg_peer,
 					     &psm2_tag, &psm2_tagsel,
 					     0/*flag*/, NULL, 0,
@@ -706,7 +721,7 @@ static ssize_t psmx2_senddata(struct fid_ep *ep, const void *buf, size_t len,
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
 	return psmx2_send_generic(ep, buf, len, desc, dest_addr, context,
-				  ep_priv->tx_flags, data);
+				  ep_priv->tx_flags | FI_REMOTE_CQ_DATA, data);
 }
 
 static ssize_t psmx2_injectdata(struct fid_ep *ep, const void *buf, size_t len,
@@ -717,7 +732,8 @@ static ssize_t psmx2_injectdata(struct fid_ep *ep, const void *buf, size_t len,
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
 	return psmx2_send_generic(ep, buf, len, NULL, dest_addr, NULL,
-				  ep_priv->tx_flags | FI_INJECT | PSMX2_NO_COMPLETION,
+				  ep_priv->tx_flags | FI_INJECT | PSMX2_NO_COMPLETION |
+					FI_REMOTE_CQ_DATA,
 				  data);
 }
 
diff --git a/prov/psm2/src/psmx2_rma.c b/prov/psm2/src/psmx2_rma.c
index 0b5305a..485c692 100644
--- a/prov/psm2/src/psmx2_rma.c
+++ b/prov/psm2/src/psmx2_rma.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,12 +32,12 @@
 
 #include "psmx2.h"
 
-static inline void psmx2_am_enqueue_rma(struct psmx2_fid_domain *domain,
+static inline void psmx2_am_enqueue_rma(struct psmx2_trx_ctxt *trx_ctxt,
 				        struct psmx2_am_request *req)
 {
-	fastlock_acquire(&domain->rma_queue.lock);
-	slist_insert_tail(&req->list_entry, &domain->rma_queue.list);
-	fastlock_release(&domain->rma_queue.lock);
+	psmx2_lock(&trx_ctxt->rma_queue.lock, 2);
+	slist_insert_tail(&req->list_entry, &trx_ctxt->rma_queue.list);
+	psmx2_unlock(&trx_ctxt->rma_queue.lock, 2);
 }
 
 static inline void psmx2_iov_copy(struct iovec *iov, size_t count,
@@ -98,8 +98,9 @@ static inline void psmx2_iov_copy(struct iovec *iov, size_t count,
  *	args[2].u64	offset
  */
 
-int psmx2_am_rma_handler(psm2_am_token_t token, psm2_amarg_t *args,
-			 int nargs, void *src, uint32_t len)
+int psmx2_am_rma_handler_ext(psm2_am_token_t token, psm2_amarg_t *args,
+			     int nargs, void *src, uint32_t len,
+			     struct psmx2_trx_ctxt *trx_ctxt)
 {
 	psm2_amarg_t rep_args[8];
 	uint8_t *rma_addr;
@@ -120,10 +121,15 @@ int psmx2_am_rma_handler(psm2_am_token_t token, psm2_amarg_t *args,
 	psm2_am_get_source(token, &epaddr);
 
 	cmd = PSMX2_AM_GET_OP(args[0].u32w0);
-	dst_vl = PSMX2_AM_GET_DST(args[0].u32w0);
-
 	domain = psmx2_active_fabric->active_domain;
-	ep = domain->eps[dst_vl];
+
+	if (trx_ctxt->ep) {
+		dst_vl = 0;
+		ep = trx_ctxt->ep;
+	} else {
+		dst_vl = PSMX2_AM_GET_DST(args[0].u32w0);
+		ep = domain->eps[dst_vl];
+	}
 
 	eom = args[0].u32w0 & PSMX2_AM_EOM;
 	has_data = args[0].u32w0 & PSMX2_AM_DATA;
@@ -216,7 +222,7 @@ int psmx2_am_rma_handler(psm2_am_token_t token, psm2_amarg_t *args,
 					(has_data ? FI_REMOTE_CQ_DATA : 0),
 			PSMX2_CTXT_TYPE(&req->fi_context) = PSMX2_REMOTE_WRITE_CONTEXT;
 			PSMX2_CTXT_USER(&req->fi_context) = mr;
-			psmx2_am_enqueue_rma(mr->domain, req);
+			psmx2_am_enqueue_rma(trx_ctxt, req);
 		}
 		break;
 
@@ -287,7 +293,7 @@ int psmx2_am_rma_handler(psm2_am_token_t token, psm2_amarg_t *args,
 			req->read.peer_vl = src_vl;
 			PSMX2_CTXT_TYPE(&req->fi_context) = PSMX2_REMOTE_READ_CONTEXT;
 			PSMX2_CTXT_USER(&req->fi_context) = mr;
-			psmx2_am_enqueue_rma(mr->domain, req);
+			psmx2_am_enqueue_rma(trx_ctxt, req);
 		}
 		break;
 
@@ -298,7 +304,7 @@ int psmx2_am_rma_handler(psm2_am_token_t token, psm2_amarg_t *args,
 		if (!req->error)
 			req->error = op_error;
 		if (eom) {
-			if (req->ep->send_cq && !req->no_event) {
+			if (req->ep->send_cq && (!req->no_event || req->error)) {
 				event = psmx2_cq_create_event(
 						req->ep->send_cq,
 						req->write.context,
@@ -341,7 +347,7 @@ int psmx2_am_rma_handler(psm2_am_token_t token, psm2_amarg_t *args,
 			if (!eom)
 				FI_INFO(&psmx2_prov, FI_LOG_EP_DATA,
 					"readv: short protocol finishes after long protocol.\n");
-			if (req->ep->send_cq && !req->no_event) {
+			if (req->ep->send_cq && (!req->no_event || req->error)) {
 				event = psmx2_cq_create_event(
 						req->ep->send_cq,
 						req->read.context,
@@ -415,6 +421,7 @@ static ssize_t psmx2_rma_self(int am_cmd,
 		len = 0;
 		for (i=0; i<iov_count; i++)
 			len += iov[i].iov_len;
+		break;
 	default:
 		return -FI_EINVAL;
 	}
@@ -492,7 +499,7 @@ static ssize_t psmx2_rma_self(int am_cmd,
 	no_event = (flags & PSMX2_NO_COMPLETION) ||
 		   (ep->send_selective_completion && !(flags & FI_COMPLETION));
 
-	if (ep->send_cq && !no_event) {
+	if (ep->send_cq && (!no_event || op_error)) {
 		event = psmx2_cq_create_event(
 				ep->send_cq,
 				context,
@@ -542,7 +549,7 @@ void psmx2_am_ack_rma(struct psmx2_am_request *req)
 			      PSM2_AM_FLAG_NOREPLY, NULL, NULL);
 }
 
-int psmx2_am_process_rma(struct psmx2_fid_domain *domain,
+int psmx2_am_process_rma(struct psmx2_trx_ctxt *trx_ctxt,
 			 struct psmx2_am_request *req)
 {
 	int err;
@@ -552,17 +559,19 @@ int psmx2_am_process_rma(struct psmx2_fid_domain *domain,
 
 	if ((req->op & PSMX2_AM_OP_MASK) == PSMX2_AM_REQ_WRITE_LONG) {
 		tag32 = PSMX2_TAG32(PSMX2_RMA_BIT, req->write.peer_vl, req->write.vl);
+		PSMX2_TAG32_LONG_WRITE(tag32);
 		PSMX2_SET_TAG(psm2_tag, (uint64_t)req->write.context, tag32);
 		PSMX2_SET_TAG(psm2_tagsel, -1ULL, -1);
-		err = psm2_mq_irecv2(domain->psm2_mq,
+		err = psm2_mq_irecv2(trx_ctxt->psm2_mq,
 				     (psm2_epaddr_t)req->write.peer_addr,
 				     &psm2_tag, &psm2_tagsel, 0,
 				     (void *)req->write.addr, req->write.len,
 				     (void *)&req->fi_context, &psm2_req);
 	} else {
 		tag32 = PSMX2_TAG32(PSMX2_RMA_BIT, req->read.vl, req->read.peer_vl);
+		PSMX2_TAG32_LONG_READ(tag32);
 		PSMX2_SET_TAG(psm2_tag, (uint64_t)req->read.context, tag32);
-		err = psm2_mq_isend2(domain->psm2_mq,
+		err = psm2_mq_isend2(trx_ctxt->psm2_mq,
 				     (psm2_epaddr_t)req->read.peer_addr,
 				     0, &psm2_tag,
 				     (void *)req->read.addr, req->read.len,
@@ -623,7 +632,10 @@ ssize_t psmx2_read_generic(struct fid_ep *ep, void *buf, size_t len,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = src_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -639,7 +651,7 @@ ssize_t psmx2_read_generic(struct fid_ep *ep, void *buf, size_t len,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_rma_self(PSMX2_AM_REQ_READ, ep_priv,
 				      ep_priv->domain->eps[vlane],
 				      buf, len, desc, addr, key,
@@ -666,7 +678,7 @@ ssize_t psmx2_read_generic(struct fid_ep *ep, void *buf, size_t len,
 		req->no_event = 1;
 	}
 
-	chunk_size = psmx2_am_param.max_reply_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_reply_short;
 
 	args[0].u32w0 = 0;
 	PSMX2_AM_SET_SRC(args[0].u32w0, ep_priv->vlane);
@@ -674,9 +686,10 @@ ssize_t psmx2_read_generic(struct fid_ep *ep, void *buf, size_t len,
 
 	if (psmx2_env.tagged_rma && len > chunk_size) {
 		tag32 = PSMX2_TAG32(PSMX2_RMA_BIT, vlane, ep_priv->vlane);
+		PSMX2_TAG32_LONG_READ(tag32);
 		PSMX2_SET_TAG(psm2_tag, (uint64_t)req, tag32);
 		PSMX2_SET_TAG(psm2_tagsel, -1ULL, -1);
-		psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+		psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			       &psm2_tag, &psm2_tagsel, 0, buf, len,
 			       (void *)&req->fi_context, &psm2_req);
 
@@ -766,7 +779,10 @@ ssize_t psmx2_readv_generic(struct fid_ep *ep, const struct iovec *iov,
 	}
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = src_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -782,7 +798,7 @@ ssize_t psmx2_readv_generic(struct fid_ep *ep, const struct iovec *iov,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_rma_self(PSMX2_AM_REQ_READV, ep_priv,
 				      ep_priv->domain->eps[vlane],
 				      (void *)iov, count, desc, addr,
@@ -815,7 +831,7 @@ ssize_t psmx2_readv_generic(struct fid_ep *ep, const struct iovec *iov,
 		req->no_event = 1;
 	}
 
-	chunk_size = psmx2_am_param.max_reply_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_reply_short;
 
 	long_len = 0;
 	if (psmx2_env.tagged_rma) {
@@ -861,9 +877,10 @@ ssize_t psmx2_readv_generic(struct fid_ep *ep, const struct iovec *iov,
 	/* Use the long protocol for the last segment */
 	if (long_len) {
 		tag32 = PSMX2_TAG32(PSMX2_RMA_BIT, vlane, ep_priv->vlane);
+		PSMX2_TAG32_LONG_READ(tag32);
 		PSMX2_SET_TAG(psm2_tag, (uint64_t)req, tag32);
 		PSMX2_SET_TAG(psm2_tagsel, -1ULL, -1);
-		psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+		psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			       &psm2_tag, &psm2_tagsel, 0,
 			       long_buf, long_len,
 			       (void *)&req->fi_context, &psm2_req);
@@ -991,7 +1008,10 @@ ssize_t psmx2_write_generic(struct fid_ep *ep, const void *buf, size_t len,
 		return -FI_EINVAL;
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1007,7 +1027,7 @@ ssize_t psmx2_write_generic(struct fid_ep *ep, const void *buf, size_t len,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_rma_self(PSMX2_AM_REQ_WRITE, ep_priv,
 				      ep_priv->domain->eps[vlane],
 				      (void *)buf, len, desc, addr,
@@ -1049,7 +1069,7 @@ ssize_t psmx2_write_generic(struct fid_ep *ep, const void *buf, size_t len,
 	PSMX2_CTXT_USER(&req->fi_context) = context;
 	PSMX2_CTXT_EP(&req->fi_context) = ep_priv;
 
-	chunk_size = psmx2_am_param.max_request_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
 
 	args[0].u32w0 = 0;
 	PSMX2_AM_SET_SRC(args[0].u32w0, ep_priv->vlane);
@@ -1057,6 +1077,7 @@ ssize_t psmx2_write_generic(struct fid_ep *ep, const void *buf, size_t len,
 
 	if (psmx2_env.tagged_rma && len > chunk_size) {
 		tag32 = PSMX2_TAG32(PSMX2_RMA_BIT, ep_priv->vlane, vlane);
+		PSMX2_TAG32_LONG_WRITE(tag32);
 		PSMX2_SET_TAG(psm2_tag, (uint64_t)req, tag32);
 		PSMX2_AM_SET_OP(args[0].u32w0, PSMX2_AM_REQ_WRITE_LONG);
 		args[0].u32w1 = len;
@@ -1080,7 +1101,7 @@ ssize_t psmx2_write_generic(struct fid_ep *ep, const void *buf, size_t len,
 		psm2_am_request_short(psm2_epaddr, PSMX2_AM_RMA_HANDLER, args,
 				      nargs, NULL, 0, am_flags, NULL, NULL);
 
-		psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+		psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			       &psm2_tag, buf, len, psm2_context, &psm2_req);
 
 		return 0;
@@ -1173,7 +1194,10 @@ ssize_t psmx2_writev_generic(struct fid_ep *ep, const struct iovec *iov,
 	}
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else if (av && av->type == FI_AV_TABLE) {
 		idx = dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -1189,7 +1213,7 @@ ssize_t psmx2_writev_generic(struct fid_ep *ep, const struct iovec *iov,
 	}
 
 	epaddr_context = psm2_epaddr_getctxt((void *)psm2_epaddr);
-	if (epaddr_context->epid == ep_priv->domain->psm2_epid)
+	if (epaddr_context->epid == ep_priv->trx_ctxt->psm2_epid)
 		return psmx2_rma_self(PSMX2_AM_REQ_WRITEV, ep_priv,
 				      ep_priv->domain->eps[vlane],
 				      (void *)iov, count, desc, addr,
@@ -1202,7 +1226,7 @@ ssize_t psmx2_writev_generic(struct fid_ep *ep, const struct iovec *iov,
 	for (i=0; i<count; i++)
 		total_len += iov[i].iov_len;
 
-	chunk_size = psmx2_am_param.max_request_short;
+	chunk_size = ep_priv->trx_ctxt->psm2_am_param.max_request_short;
 
 	/* Case 1: fit into a AM message, then pack and send */
 	if (total_len <= chunk_size) {
@@ -1292,6 +1316,7 @@ ssize_t psmx2_writev_generic(struct fid_ep *ep, const struct iovec *iov,
 		if (psmx2_env.tagged_rma && iov[i].iov_len > chunk_size &&
 		    len_sent + iov[i].iov_len == total_len) {
 			tag32 = PSMX2_TAG32(PSMX2_RMA_BIT, ep_priv->vlane, vlane);
+			PSMX2_TAG32_LONG_WRITE(tag32);
 			PSMX2_SET_TAG(psm2_tag, (uint64_t)req, tag32);
 			PSMX2_AM_SET_OP(args[0].u32w0, PSMX2_AM_REQ_WRITE_LONG);
 			args[0].u32w1 = iov[i].iov_len;
@@ -1315,7 +1340,7 @@ ssize_t psmx2_writev_generic(struct fid_ep *ep, const struct iovec *iov,
 			psm2_am_request_short(psm2_epaddr, PSMX2_AM_RMA_HANDLER, args,
 					      nargs, NULL, 0, am_flags, NULL, NULL);
 
-			psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+			psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 				       &psm2_tag, iov[i].iov_base, iov[i].iov_len,
 				       psm2_context, &psm2_req);
 
diff --git a/prov/psm2/src/psmx2_tagged.c b/prov/psm2/src/psmx2_tagged.c
index 785e054..d50ac7b 100644
--- a/prov/psm2/src/psmx2_tagged.c
+++ b/prov/psm2/src/psmx2_tagged.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -52,9 +52,12 @@ static ssize_t psmx2_tagged_peek_generic(struct fid_ep *ep,
 
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
-	if (src_addr != FI_ADDR_UNSPEC) {
+	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
 		av = ep_priv->av;
-		if (av && av->type == FI_AV_TABLE) {
+		if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else if (av && av->type == FI_AV_TABLE) {
 			idx = (size_t)src_addr;
 			if (idx >= av->last)
 				return -FI_EINVAL;
@@ -77,18 +80,24 @@ static ssize_t psmx2_tagged_peek_generic(struct fid_ep *ep,
 	PSMX2_SET_TAG(psm2_tagsel, ~ignore, tagsel32);
 
 	if (flags & (FI_CLAIM | FI_DISCARD))
-		err = psm2_mq_improbe2(ep_priv->domain->psm2_mq,
+		err = psm2_mq_improbe2(ep_priv->trx_ctxt->psm2_mq,
 				       psm2_epaddr, &psm2_tag,
 				       &psm2_tagsel, &req, &psm2_status);
 	else
-		err = psm2_mq_iprobe2(ep_priv->domain->psm2_mq,
+		err = psm2_mq_iprobe2(ep_priv->trx_ctxt->psm2_mq,
 				      psm2_epaddr, &psm2_tag, &psm2_tagsel,
 				      &psm2_status);
 	switch (err) {
 	case PSM2_OK:
 		if (ep_priv->recv_cq) {
-			if ((flags & FI_CLAIM) && context)
-				PSMX2_CTXT_REQ((struct fi_context *)context) = req;
+			if (flags & FI_CLAIM) {
+				if (context)
+					PSMX2_CTXT_REQ((struct fi_context *)context) = req;
+			} else if (flags & FI_DISCARD) {
+				if (!psm2_mq_imrecv(ep_priv->trx_ctxt->psm2_mq, 0,
+						    NULL, 0, req, &req))
+					psm2_mq_wait2(&req, NULL);
+			}
 
 			tag = PSMX2_GET_TAG64(psm2_status.msg_tag);
 			len = psm2_status.msg_length;
@@ -107,7 +116,9 @@ static ssize_t psmx2_tagged_peek_generic(struct fid_ep *ep,
 				return -FI_ENOMEM;
 
 			vlane = PSMX2_TAG32_GET_SRC(psm2_status.msg_tag.tag2);
+			event->source_is_valid = 1;
 			event->source = PSMX2_EP_TO_ADDR(psm2_status.msg_peer, vlane);
+			event->source_av = ep_priv->av;
 			psmx2_cq_enqueue_event(ep_priv->recv_cq, event);
 		}
 		return 0;
@@ -192,7 +203,48 @@ ssize_t psmx2_tagged_recv_generic(struct fid_ep *ep, void *buf,
 		if (!context)
 			return -FI_EINVAL;
 
-		/* TODO: handle FI_DISCARD */
+		if (flags & FI_DISCARD) {
+			psm2_mq_status2_t psm2_status;
+			struct psmx2_cq_event *event;
+
+			fi_context = context;
+			psm2_req = PSMX2_CTXT_REQ(fi_context);
+			err = psm2_mq_imrecv(ep_priv->trx_ctxt->psm2_mq, 0,
+					     NULL, 0, context, &psm2_req);
+			if (err != PSM2_OK)
+				return psmx2_errno(err);
+
+			psm2_mq_wait2(&psm2_req, &psm2_status);
+
+			if (ep_priv->recv_cq &&
+			    (!ep_priv->recv_selective_completion || (flags & FI_COMPLETION))) {
+				tag = PSMX2_GET_TAG64(psm2_status.msg_tag);
+				event = psmx2_cq_create_event(
+						ep_priv->recv_cq,
+						context,		/* op_context */
+						NULL,			/* buf */
+						flags|FI_RECV|FI_TAGGED,/* flags */
+						0,			/* len */
+						0,			/* data */
+						tag,			/* tag */
+						0,			/* olen */
+						0);			/* err */
+
+				if (!event)
+					return -FI_ENOMEM;
+
+				vlane = PSMX2_TAG32_GET_SRC(psm2_status.msg_tag.tag2);
+				event->source_is_valid = 1;
+				event->source = PSMX2_EP_TO_ADDR(psm2_status.msg_peer, vlane);
+				event->source_av = ep_priv->av;
+				psmx2_cq_enqueue_event(ep_priv->recv_cq, event);
+			}
+
+			if (ep_priv->recv_cntr)
+				psmx2_cntr_inc(ep_priv->recv_cntr);
+
+			return 0;
+		}
 
 		fi_context = context;
 		psm2_req = PSMX2_CTXT_REQ(fi_context);
@@ -200,7 +252,7 @@ ssize_t psmx2_tagged_recv_generic(struct fid_ep *ep, void *buf,
 		PSMX2_CTXT_USER(fi_context) = buf;
 		PSMX2_CTXT_EP(fi_context) = ep_priv;
 
-		err = psm2_mq_imrecv(ep_priv->domain->psm2_mq, 0,
+		err = psm2_mq_imrecv(ep_priv->trx_ctxt->psm2_mq, 0,
 				     buf, len, context, &psm2_req);
 		if (err != PSM2_OK)
 			return psmx2_errno(err);
@@ -228,7 +280,10 @@ ssize_t psmx2_tagged_recv_generic(struct fid_ep *ep, void *buf,
 
 	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
 		av = ep_priv->av;
-		if (av && av->type == FI_AV_TABLE) {
+		if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else if (av && av->type == FI_AV_TABLE) {
 			idx = (size_t)src_addr;
 			if (idx >= av->last)
 				return -FI_EINVAL;
@@ -250,7 +305,7 @@ ssize_t psmx2_tagged_recv_generic(struct fid_ep *ep, void *buf,
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 	PSMX2_SET_TAG(psm2_tagsel, ~ignore, tagsel32);
 
-	err = psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     &psm2_tag, &psm2_tagsel, 0, buf, len,
 			     (void *)fi_context, &psm2_req);
 
@@ -272,6 +327,7 @@ psmx2_tagged_recv_no_flag_av_map(struct fid_ep *ep, void *buf, size_t len,
 				 void *context)
 {
 	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_fid_av *av;
 	psm2_epaddr_t psm2_epaddr;
 	uint8_t vlane;
 	psm2_mq_req_t psm2_req;
@@ -289,8 +345,14 @@ psmx2_tagged_recv_no_flag_av_map(struct fid_ep *ep, void *buf, size_t len,
 	PSMX2_CTXT_SIZE(fi_context) = len;
 
 	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
-		psm2_epaddr = PSMX2_ADDR_TO_EP(src_addr);
-		vlane = PSMX2_ADDR_TO_VL(src_addr);
+		av = ep_priv->av;
+		if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else {
+			psm2_epaddr = PSMX2_ADDR_TO_EP(src_addr);
+			vlane = PSMX2_ADDR_TO_VL(src_addr);
+		}
 		tag32 = PSMX2_TAG32(0, vlane, ep_priv->vlane);
 		tagsel32 = ~PSMX2_IOV_BIT;
 	} else {
@@ -302,7 +364,7 @@ psmx2_tagged_recv_no_flag_av_map(struct fid_ep *ep, void *buf, size_t len,
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 	PSMX2_SET_TAG(psm2_tagsel, ~ignore, tagsel32);
 
-	err = psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     &psm2_tag, &psm2_tagsel, 0, buf, len,
 			     (void *)fi_context, &psm2_req);
 	if (err != PSM2_OK)
@@ -340,12 +402,18 @@ psmx2_tagged_recv_no_flag_av_table(struct fid_ep *ep, void *buf, size_t len,
 
 	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
 		av = ep_priv->av;
-		idx = (size_t)src_addr;
-		if (idx >= av->last)
-			return -FI_EINVAL;
+		assert(av != NULL);
+		if (PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else {
+			idx = (size_t)src_addr;
+			if (idx >= av->last)
+				return -FI_EINVAL;
 
-		psm2_epaddr = av->epaddrs[idx];
-		vlane = av->vlanes[idx];
+			psm2_epaddr = av->epaddrs[idx];
+			vlane = av->vlanes[idx];
+		}
 		tag32 = PSMX2_TAG32(0, vlane, ep_priv->vlane);
 		tagsel32 = ~PSMX2_IOV_BIT;
 	} else {
@@ -357,7 +425,7 @@ psmx2_tagged_recv_no_flag_av_table(struct fid_ep *ep, void *buf, size_t len,
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 	PSMX2_SET_TAG(psm2_tagsel, ~ignore, tagsel32);
 
-	err = psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     &psm2_tag, &psm2_tagsel, 0, buf, len,
 			     (void *)fi_context, &psm2_req);
 	if (err != PSM2_OK)
@@ -375,6 +443,7 @@ psmx2_tagged_recv_no_event_av_map(struct fid_ep *ep, void *buf, size_t len,
 				  void *context)
 {
 	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_fid_av *av;
 	psm2_epaddr_t psm2_epaddr;
 	uint8_t vlane;
 	psm2_mq_req_t psm2_req;
@@ -392,8 +461,14 @@ psmx2_tagged_recv_no_event_av_map(struct fid_ep *ep, void *buf, size_t len,
 	PSMX2_CTXT_SIZE(fi_context) = len;
 
 	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
-		psm2_epaddr = PSMX2_ADDR_TO_EP(src_addr);
-		vlane = PSMX2_ADDR_TO_VL(src_addr);
+		av = ep_priv->av;
+		if (av && PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else {
+			psm2_epaddr = PSMX2_ADDR_TO_EP(src_addr);
+			vlane = PSMX2_ADDR_TO_VL(src_addr);
+		}
 		tag32 = PSMX2_TAG32(0, vlane, ep_priv->vlane);
 		tagsel32 = ~PSMX2_IOV_BIT;
 	} else {
@@ -405,7 +480,7 @@ psmx2_tagged_recv_no_event_av_map(struct fid_ep *ep, void *buf, size_t len,
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 	PSMX2_SET_TAG(psm2_tagsel, ~ignore, tagsel32);
 
-	err = psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     &psm2_tag, &psm2_tagsel, 0, buf, len,
 			     (void *)fi_context, &psm2_req);
 
@@ -440,12 +515,18 @@ psmx2_tagged_recv_no_event_av_table(struct fid_ep *ep, void *buf, size_t len,
 
 	if ((ep_priv->caps & FI_DIRECTED_RECV) && src_addr != FI_ADDR_UNSPEC) {
 		av = ep_priv->av;
-		idx = (size_t)src_addr;
-		if (idx >= av->last)
-			return -FI_EINVAL;
+		assert(av != NULL);
+		if (PSMX2_SEP_ADDR_TEST(src_addr)) {
+			psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, src_addr);
+			vlane = 0;
+		} else {
+			idx = (size_t)src_addr;
+			if (idx >= av->last)
+				return -FI_EINVAL;
 
-		psm2_epaddr = av->epaddrs[idx];
-		vlane = av->vlanes[idx];
+			psm2_epaddr = av->epaddrs[idx];
+			vlane = av->vlanes[idx];
+		}
 		tag32 = PSMX2_TAG32(0, vlane, ep_priv->vlane);
 		tagsel32 = ~PSMX2_IOV_BIT;
 	} else {
@@ -457,7 +538,7 @@ psmx2_tagged_recv_no_event_av_table(struct fid_ep *ep, void *buf, size_t len,
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 	PSMX2_SET_TAG(psm2_tagsel, ~ignore, tagsel32);
 
-	err = psm2_mq_irecv2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_irecv2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     &psm2_tag, &psm2_tagsel, 0, buf, len,
 			     (void *)fi_context, &psm2_req);
 
@@ -583,7 +664,10 @@ ssize_t psmx2_tagged_send_generic(struct fid_ep *ep,
 	}
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else  if (av && av->type == FI_AV_TABLE) {
 		idx = (size_t)dest_addr;
 		if (idx >= av->last)
 			return -FI_EINVAL;
@@ -603,10 +687,10 @@ ssize_t psmx2_tagged_send_generic(struct fid_ep *ep,
 		no_completion = 1;
 
 	if (flags & FI_INJECT) {
-		if (len > PSMX2_INJECT_SIZE)
+		if (len > psmx2_env.inject_size)
 			return -FI_EMSGSIZE;
 
-		err = psm2_mq_send2(ep_priv->domain->psm2_mq, psm2_epaddr,
+		err = psm2_mq_send2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 				    0, &psm2_tag, buf, len);
 
 		if (err != PSM2_OK)
@@ -644,7 +728,7 @@ ssize_t psmx2_tagged_send_generic(struct fid_ep *ep,
 		PSMX2_CTXT_EP(fi_context) = ep_priv;
 	}
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			     &psm2_tag, buf, len, (void*)fi_context,
 			     &psm2_req);
 
@@ -665,6 +749,7 @@ psmx2_tagged_send_no_flag_av_map(struct fid_ep *ep, const void *buf,
 				 void *context)
 {
 	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_fid_av *av;
 	psm2_epaddr_t psm2_epaddr;
 	uint8_t vlane;
 	psm2_mq_req_t psm2_req;
@@ -675,8 +760,14 @@ psmx2_tagged_send_no_flag_av_map(struct fid_ep *ep, const void *buf,
 
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
-	psm2_epaddr = PSMX2_ADDR_TO_EP(dest_addr);
-	vlane = PSMX2_ADDR_TO_VL(dest_addr);
+	av = ep_priv->av;
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else {
+		psm2_epaddr = PSMX2_ADDR_TO_EP(dest_addr);
+		vlane = PSMX2_ADDR_TO_VL(dest_addr);
+	}
 	tag32 = PSMX2_TAG32(0, ep_priv->vlane, vlane);
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 
@@ -685,7 +776,7 @@ psmx2_tagged_send_no_flag_av_map(struct fid_ep *ep, const void *buf,
 	PSMX2_CTXT_USER(fi_context) = (void *)buf;
 	PSMX2_CTXT_EP(fi_context) = ep_priv;
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			     &psm2_tag, buf, len, (void*)fi_context,
 			     &psm2_req);
 
@@ -717,12 +808,18 @@ psmx2_tagged_send_no_flag_av_table(struct fid_ep *ep, const void *buf,
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
 	av = ep_priv->av;
-	idx = (size_t)dest_addr;
-	if (idx >= av->last)
-		return -FI_EINVAL;
+	assert(av != NULL);
+	if (PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else {
+		idx = (size_t)dest_addr;
+		if (idx >= av->last)
+			return -FI_EINVAL;
 
-	psm2_epaddr = av->epaddrs[idx];
-	vlane = av->vlanes[idx];
+		psm2_epaddr = av->epaddrs[idx];
+		vlane = av->vlanes[idx];
+	}
 	tag32 = PSMX2_TAG32(0, ep_priv->vlane, vlane);
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 
@@ -731,7 +828,7 @@ psmx2_tagged_send_no_flag_av_table(struct fid_ep *ep, const void *buf,
 	PSMX2_CTXT_USER(fi_context) = (void *)buf;
 	PSMX2_CTXT_EP(fi_context) = ep_priv;
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			     &psm2_tag, buf, len, (void*)fi_context,
 			     &psm2_req);
 
@@ -750,6 +847,7 @@ psmx2_tagged_send_no_event_av_map(struct fid_ep *ep, const void *buf,
 			          void *context)
 {
 	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_fid_av *av;
 	psm2_epaddr_t psm2_epaddr;
 	uint8_t vlane;
 	psm2_mq_req_t psm2_req;
@@ -760,14 +858,20 @@ psmx2_tagged_send_no_event_av_map(struct fid_ep *ep, const void *buf,
 
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
-	psm2_epaddr = PSMX2_ADDR_TO_EP(dest_addr);
-	vlane = PSMX2_ADDR_TO_VL(dest_addr);
+	av = ep_priv->av;
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else {
+		psm2_epaddr = PSMX2_ADDR_TO_EP(dest_addr);
+		vlane = PSMX2_ADDR_TO_VL(dest_addr);
+	}
 	tag32 = PSMX2_TAG32(0, ep_priv->vlane, vlane);
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 
 	fi_context = &ep_priv->nocomp_send_context;
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			     &psm2_tag, buf, len, (void*)fi_context,
 			     &psm2_req);
 
@@ -798,18 +902,24 @@ psmx2_tagged_send_no_event_av_table(struct fid_ep *ep, const void *buf,
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
 	av = ep_priv->av;
-	idx = (size_t)dest_addr;
-	if (idx >= av->last)
-		return -FI_EINVAL;
+	assert(av != NULL);
+	if (PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else {
+		idx = (size_t)dest_addr;
+		if (idx >= av->last)
+			return -FI_EINVAL;
 
-	psm2_epaddr = av->epaddrs[idx];
-	vlane = av->vlanes[idx];
+		psm2_epaddr = av->epaddrs[idx];
+		vlane = av->vlanes[idx];
+	}
 	tag32 = PSMX2_TAG32(0, ep_priv->vlane, vlane);
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 
 	fi_context = &ep_priv->nocomp_send_context;
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			     &psm2_tag, buf, len, (void*)fi_context,
 			     &psm2_req);
 
@@ -826,23 +936,30 @@ psmx2_tagged_inject_no_flag_av_map(struct fid_ep *ep, const void *buf,
 				   uint64_t tag)
 {
 	struct psmx2_fid_ep *ep_priv;
+	struct psmx2_fid_av *av;
 	psm2_epaddr_t psm2_epaddr;
 	uint8_t vlane;
 	psm2_mq_tag_t psm2_tag;
 	uint32_t tag32;
 	int err;
 
-	if (len > PSMX2_INJECT_SIZE)
+	if (len > psmx2_env.inject_size)
 		return -FI_EMSGSIZE;
 
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
-	psm2_epaddr = PSMX2_ADDR_TO_EP(dest_addr);
-	vlane = PSMX2_ADDR_TO_VL(dest_addr);
+	av = ep_priv->av;
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else {
+		psm2_epaddr = PSMX2_ADDR_TO_EP(dest_addr);
+		vlane = PSMX2_ADDR_TO_VL(dest_addr);
+	}
 	tag32 = PSMX2_TAG32(0, ep_priv->vlane, vlane);
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 
-	err = psm2_mq_send2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_send2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			    &psm2_tag, buf, len);
 
 	if (err != PSM2_OK)
@@ -869,22 +986,28 @@ psmx2_tagged_inject_no_flag_av_table(struct fid_ep *ep, const void *buf,
 	int err;
 	size_t idx;
 
-	if (len > PSMX2_INJECT_SIZE)
+	if (len > psmx2_env.inject_size)
 		return -FI_EMSGSIZE;
 
 	ep_priv = container_of(ep, struct psmx2_fid_ep, ep);
 
 	av = ep_priv->av;
-	idx = (size_t)dest_addr;
-	if (idx >= av->last)
-		return -FI_EINVAL;
+	assert(av != NULL);
+	if (PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else {
+		idx = (size_t)dest_addr;
+		if (idx >= av->last)
+			return -FI_EINVAL;
 
-	psm2_epaddr = av->epaddrs[idx];
-	vlane = av->vlanes[idx];
+		psm2_epaddr = av->epaddrs[idx];
+		vlane = av->vlanes[idx];
+	}
 	tag32 = PSMX2_TAG32(0, ep_priv->vlane, vlane);
 	PSMX2_SET_TAG(psm2_tag, tag, tag32);
 
-	err = psm2_mq_send2(ep_priv->domain->psm2_mq, psm2_epaddr, 0,
+	err = psm2_mq_send2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr, 0,
 			    &psm2_tag, buf, len);
 
 	if (err != PSM2_OK)
@@ -994,7 +1117,10 @@ ssize_t psmx2_tagged_sendv_generic(struct fid_ep *ep,
 	}
 
 	av = ep_priv->av;
-	if (av && av->type == FI_AV_TABLE) {
+	if (av && PSMX2_SEP_ADDR_TEST(dest_addr)) {
+		psm2_epaddr = psmx2_av_translate_sep(av, ep_priv->trx_ctxt, dest_addr);
+		vlane = 0;
+	} else  if (av && av->type == FI_AV_TABLE) {
 		idx = (size_t)dest_addr;
 		if (idx >= av->last) {
 			free(req);
@@ -1016,12 +1142,12 @@ ssize_t psmx2_tagged_sendv_generic(struct fid_ep *ep,
 		no_completion = 1;
 
 	if (flags & FI_INJECT) {
-		if (len > PSMX2_INJECT_SIZE) {
+		if (len > psmx2_env.inject_size) {
 			free(req);
 			return -FI_EMSGSIZE;
 		}
 
-		err = psm2_mq_send2(ep_priv->domain->psm2_mq, psm2_epaddr,
+		err = psm2_mq_send2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 				    send_flag, &psm2_tag, req->buf, len);
 
 		free(req);
@@ -1059,7 +1185,7 @@ ssize_t psmx2_tagged_sendv_generic(struct fid_ep *ep,
 	PSMX2_CTXT_USER(fi_context) = req;
 	PSMX2_CTXT_EP(fi_context) = ep_priv;
 
-	err = psm2_mq_isend2(ep_priv->domain->psm2_mq, psm2_epaddr,
+	err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq, psm2_epaddr,
 			     send_flag, &psm2_tag, req->buf, len,
 			     (void *)fi_context, &psm2_req);
 
@@ -1080,7 +1206,7 @@ ssize_t psmx2_tagged_sendv_generic(struct fid_ep *ep,
 		PSMX2_SET_TAG(psm2_tag, tag, tag32);
 		for (i=0; i<count; i++) {
 			if (iov[i].iov_len) {
-				err = psm2_mq_isend2(ep_priv->domain->psm2_mq,
+				err = psm2_mq_isend2(ep_priv->trx_ctxt->psm2_mq,
 						     psm2_epaddr, send_flag, &psm2_tag,
 						     iov[i].iov_base, iov[i].iov_len,
 						     (void *)fi_context, &psm2_req);
diff --git a/prov/psm2/src/psmx2_util.c b/prov/psm2/src/psmx2_util.c
index 558a1cc..3ece29b 100644
--- a/prov/psm2/src/psmx2_util.c
+++ b/prov/psm2/src/psmx2_util.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -90,164 +90,50 @@ char *psmx2_uuid_to_string(psm2_uuid_t uuid)
 	return s;
 }
 
-/*************************************************************
- * A simple name resolution mechanism for client-server style
- * applications. The server side has to run first. The client
- * side then passes the server name as the "node" parameter
- * of fi_getinfo call and the resulting provider info should
- * have the transport address of the server in the "dest_addr"
- * field. Both sides have to use the same UUID.
- *************************************************************/
-static void psmx2_name_server_cleanup(void *arg)
+void *psmx2_ep_name_to_string(const struct psmx2_ep_name *name, size_t *len)
 {
-	FI_INFO(&psmx2_prov, FI_LOG_CORE, "\n");
-	close((uintptr_t)arg);
-}
-
-void *psmx2_name_server(void *args)
-{
-	struct psmx2_fid_fabric *fabric;
-	struct addrinfo hints = {
-		.ai_flags = AI_PASSIVE,
-		.ai_family = AF_UNSPEC,
-		.ai_socktype = SOCK_STREAM
-	};
-	struct addrinfo *res, *p;
-	char *service;
-	int listenfd = -1, connfd;
-	int port;
-	int n;
-	int ret;
-
-	fabric = args;
-	port = psmx2_uuid_to_port(fabric->uuid);
-
-	FI_INFO(&psmx2_prov, FI_LOG_CORE, "port: %d\n", port);
+	char *s;
 
-	if (asprintf(&service, "%d", port) < 0)
+	if (!name)
 		return NULL;
 
-	n = getaddrinfo(NULL, service, &hints, &res);
-	if (n < 0) {
-		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"port %d: %s\n", port, gai_strerror(n));
-		free(service);
-		return NULL;
-	}
-
-	for (p=res; p; p=p->ai_next) {
-		listenfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
-		if (listenfd >= 0) {
-			n = 1;
-			if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(n)) == -1)
-				FI_WARN(&psmx2_prov, FI_LOG_CORE,
-					"setsockopt: %s\n", strerror(errno));
-			if (!bind(listenfd, p->ai_addr, p->ai_addrlen))
-				break;
-			close(listenfd);
-			listenfd = -1;
-		}
-	}
-
-	freeaddrinfo(res);
-	free(service);
+	*len = PSMX2_MAX_STRING_NAME_LEN;
 
-	if (listenfd < 0) {
-		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"couldn't listen to port %d. try set FI_PSM2_UUID to a different value?\n",
-			port);
+	s = calloc(*len, 1);
+	if (!s)
 		return NULL;
-	}
-
-	listen(listenfd, 256);
-
-	pthread_cleanup_push(psmx2_name_server_cleanup, (void *)(uintptr_t)listenfd);
-	FI_INFO(&psmx2_prov, FI_LOG_CORE, "Start working ...\n");
 
-	while (1) {
-		connfd = accept(listenfd, NULL, 0);
-		if (connfd >= 0) {
-			if (fabric->active_domain) {
-				ret = write(connfd, &fabric->active_domain->psm2_epid,
-					    sizeof(psm2_epid_t));
-				if (ret != sizeof(psm2_epid_t))
-					FI_WARN(&psmx2_prov, FI_LOG_CORE,
-						"error sending address info to the client\n");
-			}
-			close(connfd);
-		}
+	if (!ofi_straddr((void *)s, len, FI_ADDR_PSMX2, name)) {
+		free(s);
+		return NULL;
 	}
 
-	pthread_cleanup_pop(1);
-
-	return NULL;
+	return s;
 }
 
-void *psmx2_resolve_name(const char *servername, int port)
+struct psmx2_ep_name *psmx2_string_to_ep_name(const void *s)
 {
-	struct addrinfo hints = {
-		.ai_family   = AF_UNSPEC,
-		.ai_socktype = SOCK_STREAM
-	};
-	struct addrinfo *res, *p;
-	psm2_uuid_t uuid;
-	char *service;
-	struct psmx2_ep_name *dest_addr;
-	int sockfd = -1;
-	int n;
+	void *name;
+	size_t len;
+	uint32_t fmt;
 
-	if (!port) {
-		psmx2_get_uuid(uuid);
-		port = psmx2_uuid_to_port(uuid);
-	}
-
-	if (asprintf(&service, "%d", port) < 0)
+	if (!s)
 		return NULL;
 
-	n = getaddrinfo(servername, service, &hints, &res);
-	if (n < 0) {
+	if (ofi_str_toaddr(s, &fmt, &name, &len)) {
 		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"(%s:%d):%s\n", servername, port, gai_strerror(n));
-		free(service);
+			"invalid string address: %s.\n", s);
 		return NULL;
 	}
 
-	for (p = res; p; p = p->ai_next) {
-		sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
-		if (sockfd >= 0) {
-			if (!connect(sockfd, p->ai_addr, p->ai_addrlen))
-				break;
-			close(sockfd);
-			sockfd = -1;
-		}
-	}
-
-	freeaddrinfo(res);
-	free(service);
-
-	if (sockfd < 0) {
+	if (fmt != FI_ADDR_PSMX2) {
 		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"couldn't connect to %s:%d\n", servername, port);
+			"invalid string address format: %s.\n", s);
+		free(name);
 		return NULL;
 	}
 
-	dest_addr = calloc(1,sizeof(struct psmx2_ep_name));
-	if (!dest_addr) {
-		close(sockfd);
-		return NULL;
-	}
-
-	if (read(sockfd, &dest_addr->epid, sizeof(psm2_epid_t)) != sizeof(psm2_epid_t)) {
-		FI_INFO(&psmx2_prov, FI_LOG_CORE,
-			"error reading response from %s:%d\n", servername, port);
-		free(dest_addr);
-		close(sockfd);
-		return NULL;
-	}
-
-	close(sockfd);
-
-	return dest_addr;
+	return name;
 }
 
 static int psmx2_errno_table[PSM2_ERROR_LAST] = {
diff --git a/prov/psm2/src/psmx2_wait.c b/prov/psm2/src/psmx2_wait.c
index dcdae16..59c300d 100644
--- a/prov/psm2/src/psmx2_wait.c
+++ b/prov/psm2/src/psmx2_wait.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is waitailable to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -62,7 +62,7 @@ static void *psmx2_wait_progress(void *args)
 
 		psmx2_wait_thread_busy = 1;
 		while (psmx2_wait_thread_enabled)
-			psmx2_progress(domain);
+			psmx2_progress_all(domain);
 
 		psmx2_wait_thread_busy = 0;
 
diff --git a/prov/psm2/src/version.h b/prov/psm2/src/version.h
index 7524a7e..630d640 100644
--- a/prov/psm2/src/version.h
+++ b/prov/psm2/src/version.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2014 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
diff --git a/prov/rxd/Makefile.include b/prov/rxd/Makefile.include
index 5ca1acd..d89d6f0 100644
--- a/prov/rxd/Makefile.include
+++ b/prov/rxd/Makefile.include
@@ -6,6 +6,7 @@ _rxd_files = \
 	prov/rxd/src/rxd_domain.c	\
 	prov/rxd/src/rxd_av.c		\
 	prov/rxd/src/rxd_cq.c		\
+	prov/rxd/src/rxd_cntr.c		\
 	prov/rxd/src/rxd_ep.c		\
 	prov/rxd/src/rxd_rma.c		\
 	prov/rxd/src/rxd.h
diff --git a/prov/rxd/src/rxd.h b/prov/rxd/src/rxd.h
index 78a74c6..c437864 100644
--- a/prov/rxd/src/rxd.h
+++ b/prov/rxd/src/rxd.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2015-2017 Intel Corporation, Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -59,50 +59,36 @@
 #define RXD_MAJOR_VERSION 	(1)
 #define RXD_MINOR_VERSION 	(0)
 #define RXD_PROTOCOL_VERSION 	(1)
-#define RXD_FI_VERSION 		FI_VERSION(1,3)
+#define RXD_FI_VERSION 		FI_VERSION(1,5)
 
-#define RXD_IOV_LIMIT		(4)
-#define RXD_DEF_CQ_CNT		(8)
-#define RXD_DEF_EP_CNT 		(8)
-#define RXD_AV_DEF_COUNT	(128)
+#define RXD_IOV_LIMIT		4
+#define RXD_MAX_DGRAM_ADDR	128
 
-#define RXD_MAX_TX_BITS 	(10)
-#define RXD_MAX_RX_BITS 	(10)
+#define RXD_MAX_TX_BITS 	10
+#define RXD_MAX_RX_BITS 	10
 #define RXD_TX_ID(seq, id)	(((seq) << RXD_MAX_TX_BITS) | id)
 #define RXD_RX_ID(seq, id)	(((seq) << RXD_MAX_RX_BITS) | id)
 #define RXD_TX_IDX_BITS		((1ULL << RXD_MAX_TX_BITS) - 1)
 #define RXD_RX_IDX_BITS		((1ULL << RXD_MAX_RX_BITS) - 1)
 
-#define RXD_BUF_POOL_ALIGNMENT	(16)
-#define RXD_TX_POOL_CHUNK_CNT	(1024)
-#define RXD_RX_POOL_CHUNK_CNT	(1024)
+#define RXD_BUF_POOL_ALIGNMENT	16
+#define RXD_TX_POOL_CHUNK_CNT	1024
+#define RXD_RX_POOL_CHUNK_CNT	1024
 
-#define RXD_MAX_RX_WIN		(16)
-#define RXD_MAX_OUT_TX_MSG	(8)
-#define RXD_MAX_UNACKED		(128)
+#define RXD_MAX_RX_CREDITS	16
+#define RXD_MAX_PEER_TX		8
+#define RXD_MAX_UNACKED		128
 
-#define RXD_EP_MAX_UNEXP_PKT	(512)
-#define RXD_EP_MAX_UNEXP_MSG	(128)
+#define RXD_EP_MAX_UNEXP_PKT	512
+#define RXD_EP_MAX_UNEXP_MSG	128
 
 #define RXD_USE_OP_FLAGS	(1ULL << 61)
 #define RXD_NO_COMPLETION	(1ULL << 62)
-#define RXD_UNEXP_ENTRY		(1ULL << 63)
 
+#define RXD_MAX_PKT_RETRY	50
 
-#define RXD_RETRY_TIMEOUT	(900)
-#define RXD_WAIT_TIMEOUT	(2000)
-#define RXD_MAX_PKT_RETRY	(50)
-
-#define RXD_PKT_LOCAL_ACK	(1)
-#define RXD_PKT_REMOTE_ACK	(1 << 1)
-#define RXD_PKT_DONE (RXD_PKT_LOCAL_ACK | RXD_PKT_REMOTE_ACK)
-
-#define RXD_PKT_MARK_LOCAL_ACK(_pkt)	((_pkt)->ref |= RXD_PKT_LOCAL_ACK)
-#define RXD_PKT_MARK_REMOTE_ACK(_pkt)	((_pkt)->ref |= RXD_PKT_REMOTE_ACK)
-#define RXD_PKT_IS_COMPLETE(_pkt)	((_pkt)->ref == RXD_PKT_DONE)
-
-#define RXD_COPY_IOV_TO_BUF	(1)
-#define RXD_COPY_BUF_TO_IOV	(2)
+extern int rxd_progress_spin_count;
+extern int rxd_reposted_bufs;
 
 extern struct fi_provider rxd_prov;
 extern struct fi_info rxd_info;
@@ -111,12 +97,6 @@ extern struct util_prov rxd_util_prov;
 extern struct fi_ops_rma rxd_ops_rma;
 
 enum {
-	RXD_PKT_ORDR_OK = 0,
-	RXD_PKT_ORDR_UNEXP,
-	RXD_PKT_ORDR_DUP,
-};
-
-enum {
 	RXD_TX_CONN = 0,
 	RXD_TX_MSG,
 	RXD_TX_TAG,
@@ -125,12 +105,6 @@ enum {
 	RXD_TX_READ_RSP,
 };
 
-enum {
-	RXD_PKT_STRT = 0,
-	RXD_PKT_DATA,
-	RXD_PKT_LAST,
-};
-
 struct rxd_fabric {
 	struct util_fabric util_fabric;
 	struct fid_fabric *dg_fabric;
@@ -140,27 +114,17 @@ struct rxd_domain {
 	struct util_domain util_domain;
 	struct fid_domain *dg_domain;
 
-	size_t addrlen;
 	ssize_t max_mtu_sz;
-	uint64_t dg_mode;
-	int do_progress;
-	pthread_t progress_thread;
-	fastlock_t lock;
-
-	struct dlist_entry ep_list;
-	struct dlist_entry cq_list;
-	struct ofi_util_mr *mr_heap;
-	fastlock_t mr_lock;
+	int mr_mode;
+	struct ofi_mr_map mr_map;
 };
 
 struct rxd_av {
+	struct util_av util_av;
 	struct fid_av *dg_av;
-	fastlock_t lock;
 
-	struct util_av util_av;
 	int dg_av_used;
-	size_t addrlen;
-	size_t size;
+	size_t dg_addrlen;
 };
 
 struct rxd_cq;
@@ -168,53 +132,36 @@ typedef int (*rxd_cq_write_fn)(struct rxd_cq *cq,
 			       struct fi_cq_tagged_entry *cq_entry);
 struct rxd_cq {
 	struct util_cq util_cq;
-	struct fid_cq *dg_cq;
-	struct rxd_domain *domain;
 	rxd_cq_write_fn write_fn;
-	struct dlist_entry dom_entry;
-	struct util_buf_pool *unexp_pool;
-	struct dlist_entry unexp_list;
-	fastlock_t lock;
 };
 
 struct rxd_peer {
-	uint64_t nxt_msg_id;
-	uint64_t exp_msg_id;
-	uint64_t conn_data;
+	uint64_t		nxt_msg_id;
+	uint64_t		exp_msg_id;
+	uint64_t		conn_data;
+	fi_addr_t		fiaddr;
 
-	uint8_t addr_published;
-	uint8_t conn_initiated;
-	uint16_t num_msg_out;
-	uint8_t pad[4];
+	enum util_cmap_state	state;
+	uint16_t		active_tx_cnt;
 };
 
 struct rxd_ep {
-	struct fid_ep ep;
+	struct util_ep util_ep;
 	struct fid_ep *dg_ep;
-
-	struct rxd_domain *domain;
-	struct rxd_cq *rx_cq;
-	struct rxd_cq *tx_cq;
-	struct rxd_av *av;
+	struct fid_cq *dg_cq;
 
 	struct rxd_peer *peer_info;
 	size_t max_peers;
 
-	void *name;
-	size_t addrlen;
 	int conn_data_set;
 	uint64_t conn_data;
 
 	size_t rx_size;
 	size_t credits;
-	uint64_t num_out;
+//	uint64_t num_out;
 
 	int do_local_mr;
-	uint64_t caps;
-
-	struct dlist_entry dom_entry;
 	struct dlist_entry wait_rx_list;
-
 	struct dlist_entry unexp_tag_list;
 	struct dlist_entry unexp_msg_list;
 	uint16_t num_unexp_pkt;
@@ -238,10 +185,25 @@ struct rxd_ep {
 	fastlock_t lock;
 };
 
-struct rxd_unexp_cq_entry {
-	struct dlist_entry entry;
-	struct fi_cq_msg_entry cq_entry;
-};
+static inline struct rxd_domain *rxd_ep_domain(struct rxd_ep *ep)
+{
+	return container_of(ep->util_ep.domain, struct rxd_domain, util_domain);
+}
+
+static inline struct rxd_av *rxd_ep_av(struct rxd_ep *ep)
+{
+	return container_of(ep->util_ep.av, struct rxd_av, util_av);
+}
+
+static inline struct rxd_cq *rxd_ep_tx_cq(struct rxd_ep *ep)
+{
+	return container_of(ep->util_ep.tx_cq, struct rxd_cq, util_cq);
+}
+
+static inline struct rxd_cq *rxd_ep_rx_cq(struct rxd_ep *ep)
+{
+	return container_of(ep->util_ep.rx_cq, struct rxd_cq, util_cq);
+}
 
 struct rxd_rx_buf {
 	struct fi_context context;
@@ -258,7 +220,7 @@ struct rxd_rx_entry {
 	uint64_t key;
 	uint64_t done;
 	uint64_t peer;
-	uint16_t window;
+	uint16_t credits;
 	uint32_t last_win_seg;
 	fi_addr_t source;
 	struct rxd_peer *peer_info;
@@ -290,13 +252,12 @@ struct rxd_tx_entry {
 	fi_addr_t peer;
 	uint64_t msg_id;
 	uint64_t flags;
-	uint64_t done;
 	uint64_t rx_key;
-	uint32_t nxt_seg_no;
-	uint32_t win_sz;
-	int num_unacked;
-	int is_waiting;
-	uint64_t retry_stamp;
+	uint64_t bytes_sent;
+	uint32_t seg_no;
+	uint32_t window;
+	uint64_t retry_time;
+	uint8_t retry_cnt;
 
 	struct dlist_entry entry;
 	struct dlist_entry pkt_list;
@@ -360,15 +321,17 @@ struct rxd_pkt_data_start {
 	struct ofi_op_hdr op;
 	char data[];
 };
-#define RXD_START_DATA_PKT_SZ (sizeof(struct rxd_pkt_data_start))
-#define RXD_MAX_STRT_DATA_PKT_SZ(ep) (ep->domain->max_mtu_sz - RXD_START_DATA_PKT_SZ)
 
 struct rxd_pkt_data {
 	struct ofi_ctrl_hdr ctrl;
 	char data[];
 };
-#define RXD_DATA_PKT_SZ (sizeof(struct rxd_pkt_data))
-#define RXD_MAX_DATA_PKT_SZ(ep)	(ep->domain->max_mtu_sz - RXD_DATA_PKT_SZ)
+
+#define RXD_PKT_FIRST	(1 << 0)
+#define RXD_PKT_LAST	(1 << 1)
+#define RXD_LOCAL_COMP	(1 << 2)
+#define RXD_REMOTE_ACK	(1 << 3)
+#define RXD_NOT_ACKED	RXD_REMOTE_ACK
 
 struct rxd_pkt_meta {
 	struct fi_context context;
@@ -376,17 +339,16 @@ struct rxd_pkt_meta {
 	struct rxd_tx_entry *tx_entry;
 	struct rxd_ep *ep;
 	struct fid_mr *mr;
-	uint64_t us_stamp;
-	uint8_t ref;
-	uint8_t type;
-	uint8_t retries;
-	uint8_t pad[5];
+	int flags;
 
-	char pkt_data[]; /* rxd_pkt, followed by data */
+	/* TODO: use iov and remove data copies */
+	char pkt_data[]; /* rxd_pkt_data*, followed by data */
 };
 
-int rxd_alter_layer_info(struct fi_info *layer_info, struct fi_info *base_info);
-int rxd_alter_base_info(struct fi_info *base_info, struct fi_info *layer_info);
+int rxd_info_to_core(uint32_t version, struct fi_info *rxd_info,
+		     struct fi_info *core_info);
+int rxd_info_to_rxd(uint32_t version, struct fi_info *core_info,
+		    struct fi_info *info);
 
 int rxd_fabric(struct fi_fabric_attr *attr,
 	       struct fid_fabric **fabric, void *context);
@@ -398,33 +360,31 @@ int rxd_endpoint(struct fid_domain *domain, struct fi_info *info,
 		 struct fid_ep **ep, void *context);
 int rxd_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		struct fid_cq **cq_fid, void *context);
+int rxd_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
+		  struct fid_cntr **cntr_fid, void *context);
 
 
 /* AV sub-functions */
-fi_addr_t rxd_av_get_dg_addr(struct rxd_av *av, fi_addr_t fi_addr);
-int rxd_av_insert_dg_av(struct rxd_av *av, const void *addr);
-fi_addr_t rxd_av_get_fi_addr(struct rxd_av *av, fi_addr_t dg_addr);
+int rxd_av_insert_dg_addr(struct rxd_av *av, uint64_t hint_index,
+			  const void *addr, fi_addr_t *dg_fiaddr);
+fi_addr_t rxd_av_dg_addr(struct rxd_av *av, fi_addr_t fi_addr);
+fi_addr_t rxd_av_fi_addr(struct rxd_av *av, fi_addr_t dg_fiaddr);
 int rxd_av_dg_reverse_lookup(struct rxd_av *av, uint64_t start_idx,
-			     const void *addr, size_t addrlen, uint64_t *idx);
+			     const void *addr, fi_addr_t *dg_fiaddr);
 
 /* EP sub-functions */
-void rxd_ep_lock_if_required(struct rxd_ep *rxd_ep);
-void rxd_ep_unlock_if_required(struct rxd_ep *rxd_ep);
+void rxd_handle_send_comp(struct fi_cq_msg_entry *comp);
+void rxd_handle_recv_comp(struct rxd_ep *ep, struct fi_cq_msg_entry *comp);
 int rxd_ep_repost_buff(struct rxd_rx_buf *rx_buf);
-void rxd_ep_progress(struct rxd_ep *ep);
 int rxd_ep_reply_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
 		     uint8_t type, uint16_t seg_size, uint64_t rx_key,
 		     uint64_t source, fi_addr_t dest);
-int rxd_ep_reply_nack(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
-		      uint32_t seg_no, uint64_t rx_key,
-		      uint64_t source, fi_addr_t dest);
-int rxd_ep_reply_discard(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
-			 uint32_t seg_no, uint64_t rx_key,
-			 uint64_t source, fi_addr_t dest);
 struct rxd_peer *rxd_ep_getpeer_info(struct rxd_ep *rxd_ep, fi_addr_t addr);
 
-void rxd_ep_check_unexp_msg_list(struct rxd_ep *ep, struct rxd_recv_entry *recv_entry);
-void rxd_ep_check_unexp_tag_list(struct rxd_ep *ep, struct rxd_trecv_entry *trecv_entry);
+void rxd_ep_check_unexp_msg_list(struct rxd_ep *ep,
+				 struct rxd_recv_entry *recv_entry);
+void rxd_ep_check_unexp_tag_list(struct rxd_ep *ep,
+				 struct rxd_trecv_entry *trecv_entry);
 void rxd_ep_handle_data_msg(struct rxd_ep *ep, struct rxd_peer *peer,
 			    struct rxd_rx_entry *rx_entry,
 			    struct iovec *iov, size_t iov_count,
@@ -432,40 +392,31 @@ void rxd_ep_handle_data_msg(struct rxd_ep *ep, struct rxd_peer *peer,
 			    struct rxd_rx_buf *rx_buf);
 void rxd_ep_free_acked_pkts(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
 			    uint32_t seg_no);
-uint64_t rxd_ep_copy_iov_buf(const struct iovec *iov, size_t iov_count,
-			     void *buf, uint64_t data_sz, uint64_t skip, int dir);
-int rxd_ep_retry_pkt(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-		     struct rxd_pkt_meta *pkt);
-void rxd_ep_copy_msg_iov(const struct iovec *src_iov,
-			 struct iovec *dst_iov, size_t iov_count);
-void rxd_ep_copy_rma_iov(const struct fi_rma_iov *src_iov,
-			 struct fi_rma_iov *dst_iov, size_t iov_count);
-ssize_t rxd_ep_post_start_msg(struct rxd_ep *ep, struct rxd_peer *peer,
-			      uint8_t op, struct rxd_tx_entry *tx_entry);
-ssize_t rxd_ep_post_conn_msg(struct rxd_ep *ep, struct rxd_peer *peer,
-			     fi_addr_t addr);
+ssize_t rxd_ep_start_xfer(struct rxd_ep *ep, struct rxd_peer *peer,
+			  uint8_t op, struct rxd_tx_entry *tx_entry);
+ssize_t rxd_ep_connect(struct rxd_ep *ep, struct rxd_peer *peer, fi_addr_t addr);
 int rxd_mr_verify(struct rxd_domain *rxd_domain, ssize_t len,
 		  uintptr_t *io_addr, uint64_t key, uint64_t access);
 
 
 /* Tx/Rx entry sub-functions */
-struct rxd_tx_entry *rxd_tx_entry_acquire(struct rxd_ep *ep, struct rxd_peer *peer);
-struct rxd_tx_entry *rxd_tx_entry_acquire_fast(struct rxd_ep *ep, struct rxd_peer *peer);
-int rxd_tx_entry_progress(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-			  struct ofi_ctrl_hdr *ack);
+struct rxd_tx_entry *rxd_tx_entry_alloc(struct rxd_ep *ep,
+	struct rxd_peer *peer, fi_addr_t addr, uint64_t flags, uint8_t op);
+void rxd_tx_entry_progress(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry);
 void rxd_tx_entry_discard(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry);
-void rxd_tx_entry_release(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry);
+void rxd_tx_entry_free(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry);
 void rxd_tx_entry_done(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry);
+void rxd_set_timeout(struct rxd_tx_entry *tx_entry);
 
-struct rxd_pkt_meta *rxd_tx_pkt_acquire(struct rxd_ep *ep);
-void rxd_tx_pkt_release(struct rxd_pkt_meta *pkt_meta);
-void rxd_rx_entry_release(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry);
+void rxd_tx_pkt_free(struct rxd_pkt_meta *pkt_meta);
+void rxd_rx_entry_free(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry);
 
 
 /* CQ sub-functions */
-void rxd_cq_progress(struct util_cq *util_cq);
 void rxd_cq_report_error(struct rxd_cq *cq, struct fi_cq_err_entry *err_entry);
 void rxd_cq_report_tx_comp(struct rxd_cq *cq, struct rxd_tx_entry *tx_entry);
 void rxd_cq_report_rx_comp(struct rxd_cq *cq, struct rxd_rx_entry *rx_entry);
+void rxd_cntr_report_tx_comp(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry);
+void rxd_cntr_report_rx_comp(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry);
 
 #endif
diff --git a/prov/rxd/src/rxd_attr.c b/prov/rxd/src/rxd_attr.c
index fb56eb3..88e49fd 100644
--- a/prov/rxd/src/rxd_attr.c
+++ b/prov/rxd/src/rxd_attr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2015-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -32,10 +32,8 @@
 
 #include "rxd.h"
 
-#define RXD_EP_CAPS (FI_MSG | FI_RMA | FI_TAGGED | FI_DIRECTED_RECV |	\
-		     FI_READ | FI_WRITE | FI_RECV | FI_SEND |		\
-		     FI_REMOTE_READ | FI_REMOTE_WRITE | FI_SOURCE |	\
-		     FI_RMA_EVENT)
+#define RXD_EP_CAPS (FI_MSG | FI_TAGGED | FI_DIRECTED_RECV |	\
+		     FI_RECV | FI_SEND | FI_SOURCE)
 
 struct fi_tx_attr rxd_tx_attr = {
 	.caps = RXD_EP_CAPS,
@@ -43,6 +41,7 @@ struct fi_tx_attr rxd_tx_attr = {
 	.inject_size = 0,
 	.size = (1ULL << RXD_MAX_TX_BITS),
 	.iov_limit = RXD_IOV_LIMIT,
+	.rma_iov_limit = 0,
 };
 
 struct fi_rx_attr rxd_rx_attr = {
@@ -63,26 +62,23 @@ struct fi_ep_attr rxd_ep_attr = {
 };
 
 struct fi_domain_attr rxd_domain_attr = {
-	.name = "rxd",
 	.threading = FI_THREAD_SAFE,
-	.control_progress = FI_PROGRESS_AUTO,
-	.data_progress = FI_PROGRESS_AUTO,
+	.control_progress = FI_PROGRESS_MANUAL,
+	.data_progress = FI_PROGRESS_MANUAL,
 	.resource_mgmt = FI_RM_ENABLED,
 	.av_type = FI_AV_UNSPEC,
-	.mr_mode = FI_MR_SCALABLE,
 	.mr_key_size = sizeof(uint64_t),
-	.cq_cnt = RXD_DEF_CQ_CNT,
-	.ep_cnt = RXD_DEF_EP_CNT,
+	.cq_cnt = 128,
+	.ep_cnt = 128,
 	.tx_ctx_cnt = 1,
 	.rx_ctx_cnt = 1,
 	.max_ep_tx_ctx = 1,
-	.max_ep_rx_ctx = 1
+	.max_ep_rx_ctx = 1,
+	.mr_iov_limit = 1,
 };
 
 struct fi_fabric_attr rxd_fabric_attr = {
-	.name = "",
 	.prov_version = FI_VERSION(RXD_MAJOR_VERSION, RXD_MINOR_VERSION),
-	.prov_name = "rxd",
 };
 
 struct fi_info rxd_info = {
diff --git a/prov/rxd/src/rxd_av.c b/prov/rxd/src/rxd_av.c
index 4141044..cc1e755 100644
--- a/prov/rxd/src/rxd_av.c
+++ b/prov/rxd/src/rxd_av.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015-2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2015-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -31,161 +31,188 @@
  */
 
 #include "rxd.h"
+#include <inttypes.h>
 
-fi_addr_t rxd_av_get_dg_addr(struct rxd_av *av, fi_addr_t fi_addr)
+
+/*
+ * The RXD code is agnostic wrt the datagram address format, but we need
+ * to know the size of the address in order to iterate over them.  Because
+ * the datagram AV may be configured for asynchronous operation, open a
+ * temporary one to insert/lookup the address to get the size.  I agree it's
+ * goofy.
+ */
+static int rxd_av_set_addrlen(struct rxd_av *av, const void *addr)
 {
-	uint64_t *dg_idx;
-	dg_idx = ofi_av_get_addr(&av->util_av, (int) fi_addr);
-	return *dg_idx;
+	struct rxd_domain *domain;
+	struct fid_av *tmp_av;
+	struct fi_av_attr attr;
+	uint8_t tmp_addr[RXD_MAX_DGRAM_ADDR];
+	size_t len;
+	int ret;
+
+	FI_INFO(&rxd_prov, FI_LOG_AV, "determine dgram address len\n");
+	memset(&attr, 0, sizeof attr);
+	attr.type = FI_AV_TABLE;
+	attr.count = 1;
+
+	domain = container_of(av->util_av.domain, struct rxd_domain, util_domain);
+	ret = fi_av_open(domain->dg_domain, &attr, &tmp_av, NULL);
+	if (ret) {
+		FI_WARN(&rxd_prov, FI_LOG_AV, "failed to open av: %d (%s)\n",
+			-ret, fi_strerror(-ret));
+		return ret;
+	}
+
+	ret = fi_av_insert(tmp_av, addr, 1, NULL, 0, NULL);
+	if (ret != 1) {
+		FI_WARN(&rxd_prov, FI_LOG_AV, "addr insert failed: %d (%s)\n",
+			-ret, fi_strerror(-ret));
+		goto close;
+	}
+
+	len = sizeof tmp_addr;
+	ret = fi_av_lookup(tmp_av, 0, tmp_addr, &len);
+	if (ret) {
+		FI_WARN(&rxd_prov, FI_LOG_AV, "addr lookup failed: %d (%s)\n",
+			-ret, fi_strerror(-ret));
+		goto close;
+	}
+
+	FI_INFO(&rxd_prov, FI_LOG_AV, "set dgram address len: %d\n", len);
+	av->dg_addrlen = len;
+close:
+	fi_close(&tmp_av->fid);
+	return ret;
 }
 
-fi_addr_t rxd_av_get_fi_addr(struct rxd_av *av, fi_addr_t dg_addr)
+fi_addr_t rxd_av_dg_addr(struct rxd_av *av, fi_addr_t fi_addr)
 {
-	int ret = ofi_av_lookup_index(&av->util_av,
-				      &dg_addr, (int) dg_addr);
-	return (ret == -FI_ENODATA) ? FI_ADDR_UNSPEC : ret;
+	uint64_t *dg_idx;
+
+	dg_idx = ofi_av_get_addr(&av->util_av, (int) fi_addr);
+	return *dg_idx;
 }
 
-int rxd_av_insert_dg_av(struct rxd_av *av, const void *addr)
+fi_addr_t rxd_av_fi_addr(struct rxd_av *av, fi_addr_t dg_fiaddr)
 {
 	int ret;
-	fastlock_acquire(&av->lock);
-	ret = fi_av_insert(av->dg_av, addr, 1, NULL, 0, NULL);
-	if (ret != 1)
-		goto out;
-	av->dg_av_used++;
-out:
-	fastlock_release(&av->lock);
-	return ret;
+
+	ret = ofi_av_lookup_index(&av->util_av, &dg_fiaddr, (int) dg_fiaddr);
+	return (ret < 0) ? FI_ADDR_UNSPEC : ret;
 }
 
 int rxd_av_dg_reverse_lookup(struct rxd_av *av, uint64_t start_idx,
-			      const void *addr, size_t addrlen, uint64_t *idx)
+			      const void *addr, fi_addr_t *dg_fiaddr)
 {
-	int ret;
+	uint8_t curr_addr[RXD_MAX_DGRAM_ADDR];
 	size_t i, len;
-	void *curr_addr;
-
-	len = addrlen;
-	curr_addr = calloc(1, av->addrlen);
-	if (!curr_addr)
-		return -FI_ENOMEM;
+	int ret;
 
-	for (i = 0; i < av->dg_av_used; i++) {
+	for (i = 0; i < (size_t) av->dg_av_used; i++) {
+		len = sizeof curr_addr;
 		ret = fi_av_lookup(av->dg_av, (i + start_idx) % av->dg_av_used,
 				   curr_addr, &len);
-		if (ret)
-			continue;
-		if (len == addrlen && memcmp(curr_addr, addr, len) == 0) {
-			*idx = (i + start_idx) % av->dg_av_used;
-			goto out;
+		if (!ret) {
+			*dg_fiaddr = (i + start_idx) % av->dg_av_used;
+			FI_DBG(&rxd_prov, FI_LOG_AV, "found: %" PRIu64 "\n",
+				*dg_fiaddr);
+			return 0;
 		}
 	}
-	ret = -FI_ENODATA;
-out:
-	free(curr_addr);
-	return ret;
+	FI_DBG(&rxd_prov, FI_LOG_AV, "addr not found\n");
+	return -FI_ENODATA;
 }
 
-int rxd_av_insert_check(struct rxd_av *av, const void *addr, size_t count,
-			fi_addr_t *fi_addr, uint64_t flags, void *context)
+int rxd_av_insert_dg_addr(struct rxd_av *av, uint64_t hint_index,
+			  const void *addr, fi_addr_t *dg_fiaddr)
 {
-	int i, success_cnt = 0;
-	int ret, index;
-	void *curr_addr;
-	uint64_t dg_av_idx;
+	int ret;
 
-	for (i = 0; i < count; i++) {
-		curr_addr = (char *) addr + av->addrlen * i;
-		ret = rxd_av_dg_reverse_lookup(av, i, curr_addr, av->addrlen, &dg_av_idx);
-		if (ret == -FI_ENODATA) {
-			ret = fi_av_insert(av->dg_av, curr_addr, 1, &dg_av_idx,
-					   flags, context);
-			if (ret <= 0) {
-				if (av->util_av.eq)
-					ofi_av_write_event(&av->util_av, i,
-							   (ret == 0) ? FI_EINVAL : -ret,
-							   context);
-				if (fi_addr)
-					fi_addr[i] = FI_ADDR_NOTAVAIL;
-				continue;
-			}
-		}
+	fastlock_acquire(&av->util_av.lock);
+	if (!av->dg_addrlen) {
+		ret = rxd_av_set_addrlen(av, addr);
+		if (ret)
+			goto out;
+		ret = -FI_ENODATA;
+	} else {
+		ret = rxd_av_dg_reverse_lookup(av, hint_index, addr, dg_fiaddr);
+	}
 
-		ret = ofi_av_insert_addr(&av->util_av, &dg_av_idx, dg_av_idx, &index);
-		if (ret) {
-			if (av->util_av.eq)
-				ofi_av_write_event(&av->util_av, i, -ret, context);
-		} else {
-			success_cnt++;
+	if (ret == -FI_ENODATA) {
+		ret = fi_av_insert(av->dg_av, addr, 1, dg_fiaddr, 0, NULL);
+		if (ret == 1) {
+			av->dg_av_used++;
+			ret = 0;
 		}
-		
-		if (fi_addr)
-			fi_addr[i] = (ret == 0) ? index : FI_ADDR_NOTAVAIL;
-	}
-	av->dg_av_used += success_cnt;
-	if (av->util_av.eq) {
-		ofi_av_write_event(&av->util_av, success_cnt, 0, context);
-		ret = 0;
-	} else {
-		ret = success_cnt;
 	}
+out:
+	fastlock_release(&av->util_av.lock);
 	return ret;
 }
 
-int rxd_av_insert_fast(struct rxd_av *av, const void *addr, size_t count,
-		       fi_addr_t *fi_addr, uint64_t flags, void *context)
+static int rxd_av_insert(struct fid_av *av_fid, const void *addr, size_t count,
+			fi_addr_t *fi_addr, uint64_t flags, void *context)
 {
-	int i, num, ret, success_cnt = 0;
-	int index;
-	fi_addr_t *fi_addrs;
-
-	fi_addrs = calloc(count, sizeof(fi_addr_t));
-	if (!fi_addrs)
-		return -FI_ENOMEM;
+	struct rxd_av *av;
+	int i = 0, index, ret = 0, success_cnt = 0, lookup = 1;
+	uint64_t dg_fiaddr;
 
-	num = fi_av_insert(av->dg_av, addr, count, fi_addrs, flags, context);
-	if (num != count) {
-		free(fi_addrs);
-		return rxd_av_insert_check(av, addr, count, fi_addr,
-					    flags, context);
+	av = container_of(av_fid, struct rxd_av, util_av.av_fid);
+	fastlock_acquire(&av->util_av.lock);
+	if (!av->dg_addrlen) {
+		ret = rxd_av_set_addrlen(av, addr);
+		if (ret)
+			goto out;
+		/* Skip lookups if this is the first insertion call.  */
+		lookup = 0;
 	}
 
-	for (i = 0; i < num; i++) {
-		ret = ofi_av_insert_addr(&av->util_av, &fi_addrs[i],
-					 fi_addrs[i], &index);
+	for (; i < count; i++, addr = (uint8_t *) addr + av->dg_addrlen) {
+		ret = lookup ? rxd_av_dg_reverse_lookup(av, i, addr, &dg_fiaddr) :
+				-FI_ENODATA;
 		if (ret) {
-			if (av->util_av.eq)
-				ofi_av_write_event(&av->util_av, i, -ret, context);
-		} else {
-			success_cnt++;
+			ret = fi_av_insert(av->dg_av, addr, 1, &dg_fiaddr,
+					   flags, context);
+			if (ret != 1)
+				break;
 		}
 
+		ret = ofi_av_insert_addr(&av->util_av, &dg_fiaddr, dg_fiaddr, &index);
+		if (ret)
+			break;
+
+		success_cnt++;
 		if (fi_addr)
-			fi_addr[i] = (ret == 0) ? index : FI_ADDR_NOTAVAIL;
+			fi_addr[i] = index;
 	}
 
-	free(fi_addrs);
+	if (ret) {
+		FI_WARN(&rxd_prov, FI_LOG_AV,
+			"failed to insert address %d: %d (%s)\n",
+			i, -ret, fi_strerror(-ret));
+		if (av->util_av.eq)
+			ofi_av_write_event(&av->util_av, i, -ret, context);
+		if (fi_addr)
+			fi_addr[i] = FI_ADDR_NOTAVAIL;
+		i++;
+	}
+out:
 	av->dg_av_used += success_cnt;
+	fastlock_release(&av->util_av.lock);
+
+	for (; i < count; i++) {
+		if (av->util_av.eq)
+			ofi_av_write_event(&av->util_av, i, FI_ECANCELED, context);
+		if (fi_addr)
+			fi_addr[i] = FI_ADDR_NOTAVAIL;
+	}
 
 	if (av->util_av.eq) {
 		ofi_av_write_event(&av->util_av, success_cnt, 0, context);
-		ret = 0;
-	} else {
-		ret = success_cnt;
+		return 0;
 	}
 
-	return ret;
-}
-
-static int rxd_av_insert(struct fid_av *av_fid, const void *addr, size_t count,
-			fi_addr_t *fi_addr, uint64_t flags, void *context)
-{
-	struct rxd_av *av;
-	av = container_of(av_fid, struct rxd_av, util_av.av_fid);
-	return av->dg_av_used ?
-		rxd_av_insert_check(av, addr, count, fi_addr, flags, context) :
-		rxd_av_insert_fast(av, addr, count, fi_addr, flags, context);
+	return success_cnt;
 }
 
 static int rxd_av_insertsvc(struct fid_av *av, const char *node,
@@ -207,33 +234,38 @@ static int rxd_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr, size_t count
 {
 	int ret = 0;
 	size_t i;
-	fi_addr_t dg_idx;
+	fi_addr_t dg_fiaddr;
 	struct rxd_av *av;
 
 	av = container_of(av_fid, struct rxd_av, util_av.av_fid);
+	fastlock_acquire(&av->util_av.lock);
 	for (i = 0; i < count; i++) {
-		dg_idx = rxd_av_get_dg_addr(av, fi_addr[i]);
-		ret = fi_av_remove(av->dg_av, &dg_idx, 1, flags);
+		dg_fiaddr = rxd_av_dg_addr(av, fi_addr[i]);
+		ret = fi_av_remove(av->dg_av, &dg_fiaddr, 1, flags);
 		if (ret)
 			break;
 		av->dg_av_used--;
 	}
+	fastlock_release(&av->util_av.lock);
 	return ret;
 }
 
-static const char * rxd_av_straddr(struct fid_av *av, const void *addr, char *buf, size_t *len)
+static const char *rxd_av_straddr(struct fid_av *av, const void *addr,
+				  char *buf, size_t *len)
 {
 	struct rxd_av *rxd_av;
 	rxd_av = container_of(av, struct rxd_av, util_av.av_fid);
 	return rxd_av->dg_av->ops->straddr(rxd_av->dg_av, addr, buf, len);
 }
 
-int rxd_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr, size_t *addrlen)
+static int rxd_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr,
+			 size_t *addrlen)
 {
 	struct rxd_av *rxd_av;
 	fi_addr_t dg_addr;
+
 	rxd_av = container_of(av, struct rxd_av, util_av.av_fid);
-	dg_addr = rxd_av_get_dg_addr(rxd_av, fi_addr);
+	dg_addr = rxd_av_dg_addr(rxd_av, fi_addr);
 	return fi_av_lookup(rxd_av->dg_av, dg_addr, addr, addrlen);
 }
 
@@ -247,10 +279,11 @@ static struct fi_ops_av rxd_av_ops = {
 	.straddr = rxd_av_straddr,
 };
 
-int rxd_av_close(struct fid *fid)
+static int rxd_av_close(struct fid *fid)
 {
-	int ret;
 	struct rxd_av *av;
+	int ret;
+
 	av = container_of(fid, struct rxd_av, util_av.av_fid);
 	ret = fi_close(&av->dg_av->fid);
 	if (ret)
@@ -260,12 +293,11 @@ int rxd_av_close(struct fid *fid)
 	if (ret)
 		return ret;
 
-	fastlock_destroy(&av->lock);
 	free(av);
 	return 0;
 }
 
-int rxd_av_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
+static int rxd_av_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 {
 	return ofi_av_bind(fid, bfid, flags);
 }
@@ -301,7 +333,6 @@ int rxd_av_create(struct fid_domain *domain_fid, struct fi_av_attr *attr,
 	util_attr.addrlen = sizeof(fi_addr_t);
 	util_attr.overhead = attr->count;
 	util_attr.flags = FI_SOURCE;
-	av->size = attr->count ? attr->count : RXD_AV_DEF_COUNT;
 	if (attr->type == FI_AV_UNSPEC)
 		attr->type = FI_AV_TABLE;
 
@@ -310,7 +341,6 @@ int rxd_av_create(struct fid_domain *domain_fid, struct fi_av_attr *attr,
 	if (ret)
 		goto err1;
 
-	av->size = av->util_av.count;
 	av_attr = *attr;
 	av_attr.type = FI_AV_TABLE;
 	av_attr.count = 0;
@@ -319,13 +349,9 @@ int rxd_av_create(struct fid_domain *domain_fid, struct fi_av_attr *attr,
 	if (ret)
 		goto err2;
 
-	fastlock_init(&av->lock);
-	av->addrlen = domain->addrlen;
-
+	av->util_av.av_fid.fid.ops = &rxd_av_fi_ops;
+	av->util_av.av_fid.ops = &rxd_av_ops;
 	*av_fid = &av->util_av.av_fid;
-	(*av_fid)->fid.fclass = FI_CLASS_AV;
-	(*av_fid)->fid.ops = &rxd_av_fi_ops;
-	(*av_fid)->ops = &rxd_av_ops;
 	return 0;
 
 err2:
diff --git a/prov/rxd/src/rxd_cntr.c b/prov/rxd/src/rxd_cntr.c
new file mode 100644
index 0000000..3916b31
--- /dev/null
+++ b/prov/rxd/src/rxd_cntr.c
@@ -0,0 +1,128 @@
+/*
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "fi_util.h"
+#include "rxd.h"
+
+#define RXD_FLAG(flag, mask) (((flag) & (mask)) == (mask))
+
+int rxd_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
+		  struct fid_cntr **cntr_fid, void *context)
+{
+	int ret;
+	struct util_cntr *cntr;
+
+	cntr = calloc(1, sizeof(*cntr));
+	if (!cntr)
+		return -FI_ENOMEM;
+
+	ret = ofi_cntr_init(&rxd_prov, domain, attr, cntr,
+			    &ofi_cntr_progress, context);
+	if (ret)
+		goto free;
+
+	*cntr_fid = &cntr->cntr_fid;
+	return FI_SUCCESS;
+
+free:
+	free(cntr);
+	return ret;
+}
+
+void rxd_cntr_report_tx_comp(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
+{
+        struct util_cntr *cntr;
+
+	switch (tx_entry->op_type) {
+	case RXD_TX_MSG:
+	case RXD_TX_TAG:
+		cntr = ep->util_ep.tx_cntr;
+		break;
+	case RXD_TX_WRITE:
+		cntr = ep->util_ep.wr_cntr;
+		break;
+	case RXD_TX_READ_REQ:
+		cntr = ep->util_ep.rem_rd_cntr;
+		break;
+	case RXD_TX_READ_RSP:
+		return;
+	default:
+		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op type\n");
+		return;
+	}
+
+	if (cntr)
+		cntr->cntr_fid.ops->add(&cntr->cntr_fid, 1);
+}
+
+void rxd_cntr_report_rx_comp(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
+{
+	struct util_cntr *cntr;
+
+	switch (rx_entry->op_hdr.op) {
+	case ofi_op_msg:
+	case ofi_op_tagged:
+		cntr = ep->util_ep.rx_cntr;
+		break;
+	case ofi_op_atomic:
+	case ofi_op_write:
+		cntr = ep->util_ep.rem_wr_cntr;
+		break;
+	case ofi_op_read_rsp:
+		return;
+	default:
+		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op type: %d\n",
+			rx_entry->op_hdr.op);
+		return;
+	}
+
+	if (cntr)
+		cntr->cntr_fid.ops->add(&cntr->cntr_fid, 1);
+}
+
+void rxd_cntr_report_error(struct rxd_ep *ep, struct fi_cq_err_entry *err)
+{
+        struct util_cntr *cntr;
+
+	cntr = RXD_FLAG(err->flags, (FI_WRITE)) ? ep->util_ep.wr_cntr :
+	       RXD_FLAG(err->flags, (FI_ATOMIC)) ? ep->util_ep.wr_cntr :
+	       RXD_FLAG(err->flags, (FI_READ)) ? ep->util_ep.rd_cntr :
+	       RXD_FLAG(err->flags, (FI_SEND)) ? ep->util_ep.tx_cntr :
+	       RXD_FLAG(err->flags, (FI_RECV)) ? ep->util_ep.rx_cntr :
+	       NULL;
+
+	if (cntr)
+		cntr->cntr_fid.ops->adderr(&cntr->cntr_fid, 1);
+}
+
+
+
diff --git a/prov/rxd/src/rxd_cq.c b/prov/rxd/src/rxd_cq.c
index eaa6701..e36e5bb 100644
--- a/prov/rxd/src/rxd_cq.c
+++ b/prov/rxd/src/rxd_cq.c
@@ -34,18 +34,46 @@
 #include <stdlib.h>
 #include <string.h>
 #include <inttypes.h>
+#include <fi_iov.h>
 #include "rxd.h"
 
+/*
+ * All EPs use the same underlying datagram provider, so pick any and use its
+ * associated CQ.
+ */
+static const char *rxd_cq_strerror(struct fid_cq *cq_fid, int prov_errno,
+		const void *err_data, char *buf, size_t len)
+{
+	struct fid_list_entry *fid_entry;
+	struct util_ep *util_ep;
+	struct rxd_cq *cq;
+	struct rxd_ep *ep;
+	const char *str;
+
+	cq = container_of(cq_fid, struct rxd_cq, util_cq.cq_fid);
+
+	fastlock_acquire(&cq->util_cq.ep_list_lock);
+	assert(!dlist_empty(&cq->util_cq.ep_list));
+	fid_entry = container_of(cq->util_cq.ep_list.next,
+				struct fid_list_entry, entry);
+	util_ep = container_of(fid_entry->fid, struct util_ep, ep_fid.fid);
+	ep = container_of(util_ep, struct rxd_ep, util_ep);
+
+	str = fi_cq_strerror(ep->dg_cq, prov_errno, err_data, buf, len);
+	fastlock_release(&cq->util_cq.ep_list_lock);
+	return str;
+}
+
 static int rxd_cq_write_ctx(struct rxd_cq *cq,
 			     struct fi_cq_tagged_entry *cq_entry)
 {
 	struct fi_cq_tagged_entry *comp;
-	if (cirque_isfull(cq->util_cq.cirq))
+	if (ofi_cirque_isfull(cq->util_cq.cirq))
 		return -FI_ENOSPC;
 
-	comp = cirque_tail(cq->util_cq.cirq);
+	comp = ofi_cirque_tail(cq->util_cq.cirq);
 	comp->op_context = cq_entry->op_context;
-	cirque_commit(cq->util_cq.cirq);
+	ofi_cirque_commit(cq->util_cq.cirq);
 	return 0;
 }
 
@@ -61,14 +89,14 @@ static int rxd_cq_write_msg(struct rxd_cq *cq,
 			     struct fi_cq_tagged_entry *cq_entry)
 {
 	struct fi_cq_tagged_entry *comp;
-	if (cirque_isfull(cq->util_cq.cirq))
+	if (ofi_cirque_isfull(cq->util_cq.cirq))
 		return -FI_ENOSPC;
 
-	comp = cirque_tail(cq->util_cq.cirq);
+	comp = ofi_cirque_tail(cq->util_cq.cirq);
 	comp->op_context = cq_entry->op_context;
 	comp->flags = cq_entry->flags;
 	comp->len = cq_entry->len;
-	cirque_commit(cq->util_cq.cirq);
+	ofi_cirque_commit(cq->util_cq.cirq);
 	return 0;
 }
 
@@ -84,16 +112,16 @@ static int rxd_cq_write_data(struct rxd_cq *cq,
 			      struct fi_cq_tagged_entry *cq_entry)
 {
 	struct fi_cq_tagged_entry *comp;
-	if (cirque_isfull(cq->util_cq.cirq))
+	if (ofi_cirque_isfull(cq->util_cq.cirq))
 		return -FI_ENOSPC;
 
-	comp = cirque_tail(cq->util_cq.cirq);
+	comp = ofi_cirque_tail(cq->util_cq.cirq);
 	comp->op_context = cq_entry->op_context;
 	comp->flags = cq_entry->flags;
 	comp->len = cq_entry->len;
 	comp->buf = cq_entry->buf;
 	comp->data = cq_entry->data;
-	cirque_commit(cq->util_cq.cirq);
+	ofi_cirque_commit(cq->util_cq.cirq);
 	return 0;
 }
 
@@ -109,15 +137,15 @@ static int rxd_cq_write_tagged(struct rxd_cq *cq,
 				struct fi_cq_tagged_entry *cq_entry)
 {
 	struct fi_cq_tagged_entry *comp;
-	if (cirque_isfull(cq->util_cq.cirq))
+	if (ofi_cirque_isfull(cq->util_cq.cirq))
 		return -FI_ENOSPC;
 
 	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
 		"report completion: %p\n", cq_entry->tag);
 
-	comp = cirque_tail(cq->util_cq.cirq);
+	comp = ofi_cirque_tail(cq->util_cq.cirq);
 	*comp = *cq_entry;
-	cirque_commit(cq->util_cq.cirq);
+	ofi_cirque_commit(cq->util_cq.cirq);
 	return 0;
 }
 
@@ -134,11 +162,13 @@ static int rxd_check_start_pkt_order(struct rxd_ep *ep, struct rxd_peer *peer,
 				      struct fi_cq_msg_entry *comp)
 {
 	uint64_t msg_id;
+
 	msg_id = ctrl->msg_id >> RXD_MAX_TX_BITS;
 	if (peer->exp_msg_id == msg_id)
-		return RXD_PKT_ORDR_OK;
+		return 0;
 
-	return (peer->exp_msg_id > msg_id) ? RXD_PKT_ORDR_DUP : RXD_PKT_ORDR_UNEXP;
+	return (peer->exp_msg_id > msg_id) ?
+		-FI_EALREADY : -FI_EINVAL;
 }
 
 static int rxd_rx_entry_match(struct dlist_entry *item, const void *arg)
@@ -157,60 +187,67 @@ static void rxd_handle_dup_datastart(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctr
 	struct rxd_rx_entry *rx_entry;
 	struct rxd_peer *peer;
 
+	peer = rxd_ep_getpeer_info(ep, ctrl->conn_id);
 	item = dlist_find_first_match(&ep->rx_entry_list,
 				      rxd_rx_entry_match, ctrl);
-	if (!item)
-		return;
+	if (!item) {
+	      /* for small (1-packet) messages we may have situation
+	       * when receiver completed operation and destroyed
+	       * rx_entry, but ack is lost (not delivered to sender).
+	       * in this case just send ack with zero window to
+	       * allow sender complete operation on sender side */
+	      rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, 0, UINT64_MAX,
+			       peer->conn_data, ctrl->conn_id);
+	      return;
+	}
 
 	FI_INFO(&rxd_prov, FI_LOG_EP_CTRL,
 		"duplicate start-data: msg_id: %" PRIu64 ", seg_no: %d\n",
 		ctrl->msg_id, ctrl->seg_no);
 
 	rx_entry = container_of(item, struct rxd_rx_entry, entry);
-	peer = rxd_ep_getpeer_info(ep, ctrl->conn_id);
-	rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, rx_entry->window, rx_entry->key,
+	rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, rx_entry->credits, rx_entry->key,
 		       peer->conn_data, ctrl->conn_id);
 	return;
 }
 
-int rxd_handle_conn_req(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
-			 struct fi_cq_msg_entry *comp,
-			 struct rxd_rx_buf *rx_buf)
+static void rxd_handle_conn_req(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
+				struct fi_cq_msg_entry *comp,
+				struct rxd_rx_buf *rx_buf)
 {
-	int ret;
-	void *addr;
-	size_t addrlen;
-	uint64_t peer;
 	struct rxd_pkt_data *pkt_data;
 	struct rxd_peer *peer_info;
+	fi_addr_t dg_fiaddr;
+	void *addr;
+	int ret;
 
-	rxd_ep_lock_if_required(ep);
+	FI_INFO(&rxd_prov, FI_LOG_EP_DATA,
+	       "conn req - rx_key: %" PRIu64 "\n", ctrl->rx_key);
 
 	pkt_data = (struct rxd_pkt_data *) ctrl;
 	addr = pkt_data->data;
-	addrlen = ctrl->seg_size;
-
-	ret = rxd_av_dg_reverse_lookup(ep->av, ctrl->rx_key, addr, addrlen, &peer);
-	if (ret == -FI_ENODATA) {
-		ret = rxd_av_insert_dg_av(ep->av, addr);
-		assert(ret == 1);
+	if (ctrl->seg_size > RXD_MAX_DGRAM_ADDR) {
+		FI_WARN(&rxd_prov, FI_LOG_EP_DATA, "addr too large\n");
+		goto repost;
+	}
 
-		ret = rxd_av_dg_reverse_lookup(ep->av, ctrl->rx_key, addr, addrlen, &peer);
-		assert(ret == 0);
+	ret = rxd_av_insert_dg_addr(rxd_ep_av(ep), ctrl->rx_key, addr, &dg_fiaddr);
+	if (ret) {
+		FI_WARN(&rxd_prov, FI_LOG_EP_DATA, "failed to insert peer address\n");
+		goto repost;
 	}
 
-	peer_info = rxd_ep_getpeer_info(ep, peer);
-	if (!peer_info->addr_published) {
-		peer_info->addr_published = 1;
-		peer_info->conn_initiated = 1;
+	peer_info = rxd_ep_getpeer_info(ep, dg_fiaddr);
+	if (peer_info->state != CMAP_CONNECTED) {
+		peer_info->state = CMAP_CONNECTED;
 		peer_info->conn_data = ctrl->conn_id;
 		peer_info->exp_msg_id++;
 	}
 
-	rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_connresp, 0, ctrl->conn_id, peer, peer);
+	rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_connresp, 0, ctrl->conn_id,
+			 dg_fiaddr, dg_fiaddr);
+repost:
 	rxd_ep_repost_buff(rx_buf);
-	rxd_ep_unlock_if_required(ep);
-	return ret;
 }
 
 int rxd_tx_pkt_match(struct dlist_entry *item, const void *arg)
@@ -223,121 +260,91 @@ int rxd_tx_pkt_match(struct dlist_entry *item, const void *arg)
 	return (ack_ctrl->seg_no == pkt_ctrl->seg_no) ? 1 : 0;
 }
 
-int rxd_handle_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
-		    struct rxd_rx_buf *rx_buf)
+static void rxd_handle_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
+			   struct rxd_rx_buf *rx_buf)
 {
-	int ret = 0;
-	uint64_t idx;
 	struct rxd_tx_entry *tx_entry;
-	struct dlist_entry *item;
-	struct rxd_pkt_meta *pkt;
+	uint64_t idx;
 
-	rxd_ep_lock_if_required(ep);
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "got ack: msg: %p - %d\n",
-		ctrl->msg_id, ctrl->seg_no);
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+	       "ack- msg_id: %" PRIu64 ", segno: %d, segsz: %d, buf: %p\n",
+	       ctrl->msg_id, ctrl->seg_no, ctrl->seg_size, rx_buf);
 
 	idx = ctrl->msg_id & RXD_TX_IDX_BITS;
 	tx_entry = &ep->tx_entry_fs->buf[idx];
 	if (tx_entry->msg_id != ctrl->msg_id)
 		goto out;
 
-	item = dlist_find_first_match(&tx_entry->pkt_list, rxd_tx_pkt_match, ctrl);
-	if (!item)
-		goto out;
-
-	pkt = container_of(item, struct rxd_pkt_meta, entry);
-	switch (pkt->type) {
-
-	case RXD_PKT_STRT:
-	case RXD_PKT_DATA:
-		ret = rxd_tx_entry_progress(ep, tx_entry, ctrl);
-		break;
-
-	case RXD_PKT_LAST:
-		rxd_ep_free_acked_pkts(ep, tx_entry, ctrl->seg_no);
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "reporting TX completion : %p\n", tx_entry);
+	rxd_ep_free_acked_pkts(ep, tx_entry, ctrl->seg_no);
+	if ((tx_entry->bytes_sent == tx_entry->op_hdr.size) &&
+	    dlist_empty(&tx_entry->pkt_list)) {
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+			"reporting TX completion : %p\n", tx_entry);
 		if (tx_entry->op_type != RXD_TX_READ_REQ) {
-			rxd_cq_report_tx_comp(ep->tx_cq, tx_entry);
-			rxd_tx_entry_done(ep, tx_entry);
+			rxd_cq_report_tx_comp(rxd_ep_tx_cq(ep), tx_entry);
+			rxd_cntr_report_tx_comp(ep, tx_entry);
+			rxd_tx_entry_free(ep, tx_entry);
 		}
-		break;
-	default:
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid pkt type\n");
-		break;
+	} else {
+		tx_entry->rx_key = ctrl->rx_key;
+		/* do not allow reduce window size (on duplicate acks) */
+		tx_entry->window = MAX(tx_entry->window, ctrl->seg_no + ctrl->seg_size);
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+		       "ack- msg_id: %" PRIu64 ", window: %d\n",
+		       ctrl->msg_id, tx_entry->window);
 	}
 out:
 	rxd_ep_repost_buff(rx_buf);
-	rxd_ep_unlock_if_required(ep);
-	return ret;
 }
 
-int rxd_handle_nack(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
-		     struct rxd_rx_buf *rx_buf)
+/*
+ * Discarded transfers were discarded by the receiving side, so we abort
+ * transferring the rest of the data.  However, the completion is still
+ * reported to the sender as successful.  This ensures that short and long
+ * messages are treated the same, since short messages would be entirely
+ * buffered at the receiver, with no notification that the application later
+ * discarded the message.
+ */
+static void rxd_handle_discard(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
+			       struct rxd_rx_buf *rx_buf)
 {
-	int ret = 0;
-	uint64_t idx;
 	struct rxd_tx_entry *tx_entry;
-
-	rxd_ep_lock_if_required(ep);
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "got NACK: msg: %p - %d\n",
-		ctrl->msg_id, ctrl->seg_no);
-
-	idx = ctrl->msg_id & RXD_TX_IDX_BITS;
-	tx_entry = &ep->tx_entry_fs->buf[idx];
-	if (tx_entry->msg_id != ctrl->msg_id)
-		goto out;
-
-	ret = rxd_tx_entry_progress(ep, tx_entry, ctrl);
-out:
-	rxd_ep_repost_buff(rx_buf);
-	rxd_ep_unlock_if_required(ep);
-	return ret;
-}
-
-void rxd_handle_discard(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
-			struct rxd_rx_buf *rx_buf)
-{
 	uint64_t idx;
-	struct rxd_tx_entry *tx_entry;
 
-	rxd_ep_lock_if_required(ep);
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "got Reject: msg: %p - %d\n",
-		ctrl->msg_id, ctrl->seg_no);
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+	       "discard- msg_id: %" PRIu64 ", segno: %d\n",
+	       ctrl->msg_id, ctrl->seg_no);
 
 	idx = ctrl->msg_id & RXD_TX_IDX_BITS;
 	tx_entry = &ep->tx_entry_fs->buf[idx];
-	if (tx_entry->msg_id != ctrl->msg_id)
-		goto out;
+	if (tx_entry->msg_id == ctrl->msg_id) {
+		rxd_cq_report_tx_comp(rxd_ep_tx_cq(ep), tx_entry);
+		rxd_cntr_report_tx_comp(ep, tx_entry);
+		rxd_tx_entry_done(ep, tx_entry);
+	}
 
-	rxd_tx_entry_discard(ep, tx_entry);
-out:
 	rxd_ep_repost_buff(rx_buf);
-	rxd_ep_unlock_if_required(ep);
 }
 
-void rxd_tx_pkt_release(struct rxd_pkt_meta *pkt_meta)
+void rxd_tx_pkt_free(struct rxd_pkt_meta *pkt_meta)
 {
-	if (RXD_PKT_IS_COMPLETE(pkt_meta)) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "Releasing buf: %p, num_out: %d\n",
-		       pkt_meta, pkt_meta->ep->num_out);
-		pkt_meta->ep->num_out--;
-		util_buf_release(pkt_meta->ep->tx_pkt_pool, pkt_meta);
-	}
+	util_buf_release(pkt_meta->ep->tx_pkt_pool, pkt_meta);
 }
 
 void rxd_tx_entry_done(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
 {
 	struct rxd_pkt_meta *pkt_meta;
-	struct dlist_entry *item;
 
 	while (!dlist_empty(&tx_entry->pkt_list)) {
-		item = tx_entry->pkt_list.next;
-		pkt_meta = container_of(item, struct rxd_pkt_meta, entry);
+		pkt_meta = container_of(tx_entry->pkt_list.next,
+					struct rxd_pkt_meta, entry);
 		dlist_remove(&pkt_meta->entry);
-		RXD_PKT_MARK_REMOTE_ACK(pkt_meta);
-		rxd_tx_pkt_release(pkt_meta);
+		if (pkt_meta->flags & RXD_LOCAL_COMP)
+			rxd_tx_pkt_free(pkt_meta);
+		else
+			pkt_meta->flags |= RXD_REMOTE_ACK;
 	}
-	rxd_tx_entry_release(ep, tx_entry);
+	rxd_tx_entry_free(ep, tx_entry);
 }
 
 static int rxd_conn_msg_match(struct dlist_entry *item, const void *arg)
@@ -349,74 +356,80 @@ static int rxd_conn_msg_match(struct dlist_entry *item, const void *arg)
 		tx_entry->peer == ctrl->rx_key);
 }
 
-void rxd_handle_connect_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
-			     struct rxd_rx_buf *rx_buf)
+static void rxd_handle_connect_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
+				   struct rxd_rx_buf *rx_buf)
 {
 	struct rxd_peer *peer;
 	struct dlist_entry *match;
 	struct rxd_tx_entry *tx_entry;
 
-	rxd_ep_lock_if_required(ep);
-	match = dlist_find_first_match(&ep->tx_entry_list, rxd_conn_msg_match, ctrl);
-	if (!match)
+	FI_INFO(&rxd_prov, FI_LOG_EP_CTRL,
+		"connect ack- msg_id: %" PRIu64 ", segno: %d\n",
+		ctrl->msg_id, ctrl->seg_no);
+
+	match = dlist_find_first_match(&ep->tx_entry_list,
+					rxd_conn_msg_match, ctrl);
+	if (!match) {
+		FI_INFO(&rxd_prov, FI_LOG_EP_CTRL, "no matching connect\n");
 		goto out;
+	}
 
 	tx_entry = container_of(match, struct rxd_tx_entry, entry);
 	peer = rxd_ep_getpeer_info(ep, tx_entry->peer);
-	peer->addr_published = 1;
+	peer->state = CMAP_CONNECTED;
 	peer->conn_data = ctrl->conn_id;
 
 	dlist_remove(match);
 	rxd_tx_entry_done(ep, tx_entry);
 out:
 	rxd_ep_repost_buff(rx_buf);
-	rxd_ep_unlock_if_required(ep);
 }
 
-static inline uint16_t rxd_get_window_sz(struct rxd_ep *ep, uint64_t rem)
+static void rxd_set_rx_credits(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
 {
-	uint16_t num_pkts, avail;
+	size_t num_pkts, avail, size_left;
 
-	num_pkts = (rem +  RXD_MAX_DATA_PKT_SZ(ep) - 1) / RXD_MAX_DATA_PKT_SZ(ep);
+	size_left = rx_entry->op_hdr.size - rx_entry->done;
+	num_pkts = (size_left + rxd_ep_domain(ep)->max_mtu_sz - 1) /
+		    rxd_ep_domain(ep)->max_mtu_sz;
 	avail = MIN(ep->credits, num_pkts);
-	return MIN(avail, RXD_MAX_RX_WIN);
+	rx_entry->credits = MIN(avail, RXD_MAX_RX_CREDITS);
+	rx_entry->last_win_seg += rx_entry->credits;
+	ep->credits -= rx_entry->credits;
 }
 
-struct rxd_rx_entry *rxd_get_rx_entry(struct rxd_ep *ep)
+static struct rxd_rx_entry *rxd_rx_entry_alloc(struct rxd_ep *ep)
 {
 	struct rxd_rx_entry *rx_entry;
+
 	if (freestack_isempty(ep->rx_entry_fs))
 		return NULL;
 
 	rx_entry = freestack_pop(ep->rx_entry_fs);
 	rx_entry->key = rx_entry - &ep->rx_entry_fs->buf[0];
-	dlist_init(&rx_entry->entry);
-	dlist_init(&rx_entry->wait_entry);
 	dlist_insert_tail(&rx_entry->entry, &ep->rx_entry_list);
 	return rx_entry;
 }
 
-static void rxd_progress_wait_rx(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
+static void rxd_progress_wait_rx(struct rxd_ep *ep,
+				 struct rxd_rx_entry *rx_entry)
 {
 	struct ofi_ctrl_hdr ctrl;
 
-	rx_entry->window = rxd_get_window_sz(ep, rx_entry->op_hdr.size - rx_entry->done);
-
-	if (!rx_entry->window)
+	rxd_set_rx_credits(ep, rx_entry);
+	if (!rx_entry->credits)
 		return;
 
-	rx_entry->last_win_seg += rx_entry->window;
 	dlist_remove(&rx_entry->wait_entry);
 
-	ep->credits -= rx_entry->window;
-
 	ctrl.msg_id = rx_entry->msg_id;
 	ctrl.seg_no = rx_entry->exp_seg_no - 1;
 	ctrl.conn_id = rx_entry->peer;
 
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "rx-entry wait over [%p], window: %d\n",
-		rx_entry->msg_id, rx_entry->window);
-	rxd_ep_reply_ack(ep, &ctrl, ofi_ctrl_ack, rx_entry->window,
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+		"rx-entry wait over [%p], credits: %d\n",
+		rx_entry->msg_id, rx_entry->credits);
+	rxd_ep_reply_ack(ep, &ctrl, ofi_ctrl_ack, rx_entry->credits,
 		       rx_entry->key, rx_entry->peer_info->conn_data,
 		       ctrl.conn_id);
 }
@@ -436,7 +449,7 @@ static void rxd_check_waiting_rx(struct rxd_ep *ep)
 	}
 }
 
-void rxd_rx_entry_release(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
+void rxd_rx_entry_free(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
 {
 	rx_entry->key = -1;
 	dlist_remove(&rx_entry->entry);
@@ -448,15 +461,17 @@ void rxd_rx_entry_release(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
 
 static int rxd_match_recv_entry(struct dlist_entry *item, const void *arg)
 {
-	struct rxd_rx_entry *rx_entry = (struct rxd_rx_entry *) arg;
+	const struct rxd_rx_entry *rx_entry = arg;
 	struct rxd_recv_entry *recv_entry;
+
 	recv_entry = container_of(item, struct rxd_recv_entry, entry);
 	return (recv_entry->msg.addr == FI_ADDR_UNSPEC ||
 		rx_entry->source == FI_ADDR_UNSPEC ||
 		recv_entry->msg.addr == rx_entry->source);
 }
 
-struct rxd_recv_entry *rxd_get_recv_entry(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry)
+struct rxd_recv_entry *rxd_get_recv_entry(struct rxd_ep *ep,
+					  struct rxd_rx_entry *rx_entry)
 {
 	struct dlist_entry *match;
 	struct rxd_recv_entry *recv_entry;
@@ -464,7 +479,6 @@ struct rxd_recv_entry *rxd_get_recv_entry(struct rxd_ep *ep, struct rxd_rx_entry
 	match = dlist_find_first_match(&ep->recv_list, &rxd_match_recv_entry,
 				       (void *) rx_entry);
 	if (!match) {
-		/*todo: queue the pkt */
 		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "no matching recv entry\n");
 		return NULL;
 	}
@@ -476,7 +490,7 @@ struct rxd_recv_entry *rxd_get_recv_entry(struct rxd_ep *ep, struct rxd_rx_entry
 
 static int rxd_match_trecv_entry(struct dlist_entry *item, const void *arg)
 {
-	struct rxd_rx_entry *rx_entry = (struct rxd_rx_entry *) arg;
+	const struct rxd_rx_entry *rx_entry = arg;
 	struct rxd_trecv_entry *trecv_entry;
 
 	trecv_entry = container_of(item, struct rxd_trecv_entry, entry);
@@ -489,7 +503,7 @@ static int rxd_match_trecv_entry(struct dlist_entry *item, const void *arg)
 }
 
 struct rxd_trecv_entry *rxd_get_trecv_entry(struct rxd_ep *ep,
-					      struct rxd_rx_entry *rx_entry)
+					    struct rxd_rx_entry *rx_entry)
 {
 	struct dlist_entry *match;
 	struct rxd_trecv_entry *trecv_entry;
@@ -497,13 +511,14 @@ struct rxd_trecv_entry *rxd_get_trecv_entry(struct rxd_ep *ep,
 	match = dlist_find_first_match(&ep->trecv_list, &rxd_match_trecv_entry,
 				       (void *)rx_entry);
 	if (!match) {
-		/*todo: queue the pkt */
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "no matching trecv entry, tag: %p\n",
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+			"no matching trecv entry, tag: %p\n",
 			rx_entry->op_hdr.tag);
 		return NULL;
 	}
 
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "matched - tag: %p\n", rx_entry->op_hdr.tag);
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "matched - tag: %p\n",
+		rx_entry->op_hdr.tag);
 
 	dlist_remove(match);
 	trecv_entry = container_of(match, struct rxd_trecv_entry, entry);
@@ -511,7 +526,7 @@ struct rxd_trecv_entry *rxd_get_trecv_entry(struct rxd_ep *ep,
 	return trecv_entry;
 }
 
-void rxd_report_rx_comp(struct rxd_cq *cq, struct rxd_rx_entry *rx_entry)
+void rxd_cq_report_rx_comp(struct rxd_cq *cq, struct rxd_rx_entry *rx_entry)
 {
 	struct fi_cq_tagged_entry cq_entry = {0};
 
@@ -527,7 +542,6 @@ void rxd_report_rx_comp(struct rxd_cq *cq, struct rxd_rx_entry *rx_entry)
 		cq_entry.buf = rx_entry->recv->iov[0].iov_base;
 		cq_entry.data = rx_entry->op_hdr.data;
 		break;
-
 	case ofi_op_tagged:
 		cq_entry.flags |= (FI_RECV | FI_TAGGED);
 		cq_entry.op_context = rx_entry->trecv->msg.context;
@@ -536,11 +550,9 @@ void rxd_report_rx_comp(struct rxd_cq *cq, struct rxd_rx_entry *rx_entry)
 		cq_entry.data = rx_entry->op_hdr.data;
 		cq_entry.tag = rx_entry->trecv->msg.tag;
 		break;
-
 	case ofi_op_atomic:
 		cq_entry.flags |= FI_ATOMIC;
 		break;
-
 	case ofi_op_write:
 		if (!(rx_entry->op_hdr.flags & OFI_REMOTE_CQ_DATA))
 			return;
@@ -551,10 +563,8 @@ void rxd_report_rx_comp(struct rxd_cq *cq, struct rxd_rx_entry *rx_entry)
 		cq_entry.buf = rx_entry->write.iov[0].iov_base;
 		cq_entry.data = rx_entry->op_hdr.data;
 		break;
-
 	case ofi_op_read_rsp:
 		return;
-
 	default:
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op type: %d\n",
 			rx_entry->op_hdr.op);
@@ -593,7 +603,6 @@ void rxd_cq_report_tx_comp(struct rxd_cq *cq, struct rxd_tx_entry *tx_entry)
 		cq_entry.buf = tx_entry->msg.msg_iov[0].iov_base;
 		cq_entry.data = tx_entry->op_hdr.data;
 		break;
-
 	case RXD_TX_TAG:
 		cq_entry.flags = (FI_TRANSMIT | FI_TAGGED);
 		cq_entry.op_context = tx_entry->tmsg.tmsg.context;
@@ -602,7 +611,6 @@ void rxd_cq_report_tx_comp(struct rxd_cq *cq, struct rxd_tx_entry *tx_entry)
 		cq_entry.data = tx_entry->op_hdr.data;
 		cq_entry.tag = tx_entry->tmsg.tmsg.tag;
 		break;
-
 	case RXD_TX_WRITE:
 		cq_entry.flags = (FI_TRANSMIT | FI_RMA | FI_WRITE);
 		cq_entry.op_context = tx_entry->write.msg.context;
@@ -610,7 +618,6 @@ void rxd_cq_report_tx_comp(struct rxd_cq *cq, struct rxd_tx_entry *tx_entry)
 		cq_entry.buf = tx_entry->write.msg.msg_iov[0].iov_base;
 		cq_entry.data = tx_entry->op_hdr.data;
 		break;
-
 	case RXD_TX_READ_REQ:
 		cq_entry.flags = (FI_TRANSMIT | FI_RMA | FI_READ);
 		cq_entry.op_context = tx_entry->read_req.msg.context;
@@ -618,10 +625,8 @@ void rxd_cq_report_tx_comp(struct rxd_cq *cq, struct rxd_tx_entry *tx_entry)
 		cq_entry.buf = tx_entry->read_req.msg.msg_iov[0].iov_base;
 		cq_entry.data = tx_entry->op_hdr.data;
 		break;
-
 	case RXD_TX_READ_RSP:
 		return;
-
 	default:
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op type\n");
 		return;
@@ -636,14 +641,13 @@ void rxd_ep_handle_data_msg(struct rxd_ep *ep, struct rxd_peer *peer,
 			   struct ofi_ctrl_hdr *ctrl, void *data,
 			   struct rxd_rx_buf *rx_buf)
 {
-
 	uint64_t done;
 
 	ep->credits++;
-	done = rxd_ep_copy_iov_buf(iov, iov_count, data, ctrl->seg_size,
-				   rx_entry->done, RXD_COPY_BUF_TO_IOV);
+	done = ofi_copy_to_iov(iov, iov_count, rx_entry->done, data,
+				ctrl->seg_size);
 	rx_entry->done += done;
-	rx_entry->window--;
+	rx_entry->credits--;
 	rx_entry->exp_seg_no++;
 
 	if (done != ctrl->seg_size) {
@@ -652,20 +656,18 @@ void rxd_ep_handle_data_msg(struct rxd_ep *ep, struct rxd_peer *peer,
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "TODO: message truncated\n");
 	}
 
-	if (rx_entry->window == 0) {
-		rx_entry->window = rxd_get_window_sz(ep, rx_entry->op_hdr.size - rx_entry->done);
+	if (rx_entry->credits == 0) {
+		rxd_set_rx_credits(ep, rx_entry);
 
-		rx_entry->last_win_seg += rx_entry->window;
-		ep->credits -= rx_entry->window;
 		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "replying ack [%p] - %d\n",
 			ctrl->msg_id, ctrl->seg_no);
 
-		rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, rx_entry->window,
+		rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, rx_entry->credits,
 			       rx_entry->key, peer->conn_data, ctrl->conn_id);
 	}
 
 	if (rx_entry->op_hdr.size != rx_entry->done) {
-		if (rx_entry->window == 0) {
+		if (rx_entry->credits == 0) {
 			dlist_init(&rx_entry->wait_entry);
 			dlist_insert_tail(&rx_entry->wait_entry, &ep->wait_rx_list);
 			FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "rx-entry %p - %d enqueued\n",
@@ -679,26 +681,25 @@ void rxd_ep_handle_data_msg(struct rxd_ep *ep, struct rxd_peer *peer,
 	}
 
 	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "reporting RX completion event\n");
-	rxd_report_rx_comp(ep->rx_cq, rx_entry);
+	rxd_cq_report_rx_comp(rxd_ep_rx_cq(ep), rx_entry);
+	rxd_cntr_report_rx_comp(ep, rx_entry);
 
 	switch(rx_entry->op_hdr.op) {
 	case ofi_op_msg:
 		freestack_push(ep->recv_fs, rx_entry->recv);
 		break;
-
 	case ofi_op_tagged:
 		freestack_push(ep->trecv_fs, rx_entry->trecv);
 		break;
-
 	case ofi_op_read_rsp:
-		rxd_cq_report_tx_comp(ep->tx_cq, rx_entry->read_rsp.tx_entry);
+		rxd_cq_report_tx_comp(rxd_ep_tx_cq(ep), rx_entry->read_rsp.tx_entry);
+		rxd_cntr_report_tx_comp(ep, rx_entry->read_rsp.tx_entry);
 		rxd_tx_entry_done(ep, rx_entry->read_rsp.tx_entry);
 		break;
-
 	default:
 		break;
 	}
-	rxd_rx_entry_release(ep, rx_entry);
+	rxd_rx_entry_free(ep, rx_entry);
 }
 
 static int rxd_check_data_pkt_order(struct rxd_ep *ep,
@@ -706,47 +707,17 @@ static int rxd_check_data_pkt_order(struct rxd_ep *ep,
 				     struct ofi_ctrl_hdr *ctrl,
 				     struct rxd_rx_entry *rx_entry)
 {
-	if (rx_entry->msg_id != ctrl->msg_id)
-		return RXD_PKT_ORDR_DUP;
+	if ((rx_entry->msg_id == ctrl->msg_id) &&
+	    (rx_entry->exp_seg_no == ctrl->seg_no))
+		return 0;
 
-	if (rx_entry->exp_seg_no == ctrl->seg_no)
-		return RXD_PKT_ORDR_OK;
+	if ((rx_entry->msg_id != ctrl->msg_id) ||
+	    (rx_entry->exp_seg_no > ctrl->seg_no))
+		return -FI_EALREADY;
 
-	return (rx_entry->exp_seg_no > ctrl->seg_no) ?
-		RXD_PKT_ORDR_DUP : RXD_PKT_ORDR_UNEXP;
+	return -FI_EINVAL;
 }
 
-static inline void rxd_ep_enqueue_pkt(struct rxd_ep *ep, struct ofi_ctrl_hdr *ctrl,
-				       struct fi_cq_msg_entry *comp)
-{
-	struct rxd_unexp_cq_entry *unexp;
-	if (comp->flags & RXD_UNEXP_ENTRY ||
-	    ep->num_unexp_pkt > RXD_EP_MAX_UNEXP_PKT)
-		return;
-
-	unexp = util_buf_alloc(ep->rx_cq->unexp_pool);
-	assert(unexp);
-	unexp->cq_entry = *comp;
-	unexp->cq_entry.flags |= RXD_UNEXP_ENTRY;
-
-	dlist_init(&unexp->entry);
-	dlist_insert_tail(&ep->rx_cq->unexp_list, &unexp->entry);
-	FI_INFO(&rxd_prov, FI_LOG_EP_CTRL,
-		"enqueuing unordered pkt: %p, seg_no: %d\n",
-		ctrl->msg_id, ctrl->seg_no);
-	ep->num_unexp_pkt++;
-}
-
-static inline void rxd_release_unexp_entry(struct rxd_cq *cq,
-					    struct fi_cq_msg_entry *comp)
-{
-	struct rxd_unexp_cq_entry *unexp;
-	unexp = container_of(comp, struct rxd_unexp_cq_entry, cq_entry);
-	dlist_remove(&unexp->entry);
-	util_buf_release(cq->unexp_pool, unexp);
-}
-
-
 static int rxd_match_unexp_msg(struct dlist_entry *item, const void *arg)
 {
 	const struct rxd_recv_entry *recv_entry = arg;
@@ -824,50 +795,53 @@ void rxd_ep_check_unexp_tag_list(struct rxd_ep *ep, struct rxd_trecv_entry *trec
 	}
 }
 
-void rxd_handle_data(struct rxd_ep *ep, struct rxd_peer *peer,
-		      struct ofi_ctrl_hdr *ctrl, struct fi_cq_msg_entry *comp,
-		      struct rxd_rx_buf *rx_buf)
+static void rxd_handle_data(struct rxd_ep *ep, struct rxd_peer *peer,
+			    struct ofi_ctrl_hdr *ctrl, struct fi_cq_msg_entry *comp,
+			    struct rxd_rx_buf *rx_buf)
 {
-	int ret;
 	struct rxd_rx_entry *rx_entry;
 	struct rxd_tx_entry *tx_entry;
 	struct rxd_pkt_data *pkt_data = (struct rxd_pkt_data *) ctrl;
-	uint16_t win_sz;
-	uint64_t curr_stamp;
+	uint16_t credits;
+	int ret;
+
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+	       "data pkt- msg_id: %" PRIu64 ", segno: %d, buf: %p\n",
+	       ctrl->msg_id, ctrl->seg_no, rx_buf);
 
-	rxd_ep_lock_if_required(ep);
 	rx_entry = &ep->rx_entry_fs->buf[ctrl->rx_key];
 
 	ret = rxd_check_data_pkt_order(ep, peer, ctrl, rx_entry);
-	if (ret == RXD_PKT_ORDR_DUP) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
-			"duplicate pkt: %d expected:%d, rx-key:%d, ctrl_msg_id: %p\n",
-			ctrl->seg_no, rx_entry->exp_seg_no, ctrl->rx_key, ctrl->msg_id);
-
-		win_sz = (rx_entry->msg_id == ctrl->msg_id &&
-			  rx_entry->last_win_seg == ctrl->seg_no) ? rx_entry->window : 0;
-		rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, win_sz,
-			       ctrl->rx_key, peer->conn_data, ctrl->conn_id);
-
-		goto repost;
-	} else if (ret == RXD_PKT_ORDR_UNEXP) {
-		if (!(comp->flags & RXD_UNEXP_ENTRY)) {
-			curr_stamp = fi_gettime_us();
-			if (rx_entry->nack_stamp == 0 ||
-			    (curr_stamp > rx_entry->nack_stamp &&
-			     curr_stamp - rx_entry->nack_stamp > RXD_RETRY_TIMEOUT)) {
-
-				FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
-				       "unexpected pkt, sending NACK: %d\n", ctrl->seg_no);
-
-				rx_entry->nack_stamp = curr_stamp;
-				rxd_ep_reply_nack(ep, ctrl, rx_entry->exp_seg_no,
-						ctrl->rx_key, peer->conn_data,
-						ctrl->conn_id);
-			}
-			rxd_ep_enqueue_pkt(ep, ctrl, comp);
+	if (ret) {
+		if (ret == -FI_EALREADY) {
+			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "duplicate pkt: %d "
+				"expected:%d, rx-key:%d, ctrl_msg_id: %p\n",
+				ctrl->seg_no, rx_entry->exp_seg_no, ctrl->rx_key,
+				ctrl->msg_id);
+
+			credits = ((rx_entry->msg_id == ctrl->msg_id) &&
+				  (rx_entry->last_win_seg == ctrl->seg_no)) ?
+				  rx_entry->credits : 0;
+			rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, credits,
+				       ctrl->rx_key, peer->conn_data,
+				       ctrl->conn_id);
+			goto repost;
+		} else {
+			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "invalid pkt: segno: %d "
+			       "expected:%d, rx-key:%d, ctrl_msg_id: %ld, "
+			       "rx_entry_msg_id: %ld\n",
+			       ctrl->seg_no, rx_entry->exp_seg_no, ctrl->rx_key,
+			       ctrl->msg_id, rx_entry->msg_id);
+			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "invalid pkt: "
+			       "credits: %d, last win: %d\n",
+			       rx_entry->credits, rx_entry->last_win_seg);
+			credits = (rx_entry->msg_id == ctrl->msg_id) ?
+				  rx_entry->last_win_seg - rx_entry->exp_seg_no : 0;
+			rxd_ep_reply_ack(ep, ctrl, ofi_ctrl_ack, credits,
+				       ctrl->rx_key, peer->conn_data,
+				       ctrl->conn_id);
+			goto repost;
 		}
-		goto out;
 	}
 
 	rx_entry->nack_stamp = 0;
@@ -878,58 +852,29 @@ void rxd_handle_data(struct rxd_ep *ep, struct rxd_peer *peer,
 				     rx_entry->recv->msg.iov_count, ctrl,
 				     pkt_data->data, rx_buf);
 		break;
-
 	case ofi_op_tagged:
 		rxd_ep_handle_data_msg(ep, peer, rx_entry, rx_entry->trecv->iov,
 				     rx_entry->trecv->msg.iov_count, ctrl,
 				     pkt_data->data, rx_buf);
 		break;
-
 	case ofi_op_write:
 		rxd_ep_handle_data_msg(ep, peer, rx_entry, rx_entry->write.iov,
 				       rx_entry->op_hdr.iov_count, ctrl,
 				       pkt_data->data, rx_buf);
 		break;
-
 	case ofi_op_read_rsp:
 		tx_entry = rx_entry->read_rsp.tx_entry;
 		rxd_ep_handle_data_msg(ep, peer, rx_entry, tx_entry->read_req.dst_iov,
 				       tx_entry->read_req.msg.iov_count, ctrl,
 				       pkt_data->data, rx_buf);
 		break;
-
 	case ofi_op_atomic:
 	default:
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op type\n");
 	}
 
 repost:
-	if (comp->flags & RXD_UNEXP_ENTRY) {
-		rxd_release_unexp_entry(ep->rx_cq, comp);
-		ep->num_unexp_pkt--;
-	}
-
 	rxd_ep_repost_buff(rx_buf);
-out:
-	rxd_ep_unlock_if_required(ep);
-}
-
-void rxd_ep_handle_read_req(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-			    struct rxd_peer *peer)
-{
-	int ret;
-
-	dlist_init(&tx_entry->pkt_list);
-	tx_entry->op_type = RXD_TX_READ_RSP;
-	ret = rxd_ep_post_start_msg(ep, peer, ofi_op_read_rsp, tx_entry);
-	if (ret)
-		goto err;
-
-	dlist_insert_tail(&tx_entry->entry, &ep->tx_entry_list);
-	return;
-err:
-	rxd_tx_entry_release(ep, tx_entry);
-	return;
 }
 
 int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
@@ -963,7 +908,6 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 				     rx_entry->recv->msg.iov_count, ctrl,
 				     pkt_start->data, rx_buf);
 		break;
-
 	case ofi_op_tagged:
 		rx_entry->trecv = rxd_get_trecv_entry(ep, rx_entry);
 		if (!rx_entry->trecv) {
@@ -982,11 +926,10 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 				     rx_entry->trecv->msg.iov_count, ctrl,
 				     pkt_start->data, rx_buf);
 		break;
-
 	case ofi_op_write:
 		rma_iov = (struct ofi_rma_iov *) pkt_start->data;
 		for (i = 0; i < rx_entry->op_hdr.iov_count; i++) {
-			ret = rxd_mr_verify(ep->domain,
+			ret = rxd_mr_verify(rxd_ep_domain(ep),
 					    rma_iov[i].len,
 					    (uintptr_t *) &rma_iov[i].addr,
 					    rma_iov[i].key, FI_REMOTE_WRITE);
@@ -1006,10 +949,10 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 				       rx_entry->op_hdr.iov_count, ctrl,
 				       pkt_start->data + offset, rx_buf);
 		break;
-
 	case ofi_op_read_req:
 		rma_iov = (struct ofi_rma_iov *) pkt_start->data;
-		tx_entry = rxd_tx_entry_acquire_fast(ep, peer);
+		tx_entry = rxd_tx_entry_alloc(ep, peer, rx_entry->peer, 0,
+						RXD_TX_READ_RSP);
 		if (!tx_entry) {
 			FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "no free tx-entry\n");
 			return -FI_ENOMEM;
@@ -1018,7 +961,7 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 		tx_entry->peer = rx_entry->peer;
 		tx_entry->read_rsp.iov_count = rx_entry->op_hdr.iov_count;
 		for (i = 0; i < rx_entry->op_hdr.iov_count; i++) {
-			ret = rxd_mr_verify(ep->domain,
+			ret = rxd_mr_verify(rxd_ep_domain(ep),
 					    rma_iov[i].len,
 					    (uintptr_t *) &rma_iov[i].addr,
 					    rma_iov[i].key, FI_REMOTE_READ);
@@ -1028,14 +971,16 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 				return -FI_EACCES;
 			}
 
-			tx_entry->read_rsp.src_iov[i].iov_base = (void *) (uintptr_t) rma_iov[i].addr;
+			tx_entry->read_rsp.src_iov[i].iov_base = (void *) (uintptr_t)
+								rma_iov[i].addr;
 			tx_entry->read_rsp.src_iov[i].iov_len = rma_iov[i].len;
 		}
 		tx_entry->read_rsp.peer_msg_id = ctrl->msg_id;
-		rxd_ep_handle_read_req(ep, tx_entry, peer);
-		rxd_rx_entry_release(ep, rx_entry);
+		ret = rxd_ep_start_xfer(ep, peer, ofi_op_read_rsp, tx_entry);
+		if (ret)
+			rxd_tx_entry_free(ep, tx_entry);
+		rxd_rx_entry_free(ep, rx_entry);
 		break;
-
 	case ofi_op_read_rsp:
 		idx = rx_entry->op_hdr.remote_idx & RXD_TX_IDX_BITS;
 		tx_entry = &ep->tx_entry_fs->buf[idx];
@@ -1047,7 +992,6 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 				       tx_entry->read_req.msg.iov_count, ctrl,
 				       pkt_start->data, rx_buf);
 		break;
-
 	case ofi_op_atomic:
 	default:
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op type\n");
@@ -1056,34 +1000,40 @@ int rxd_process_start_data(struct rxd_ep *ep, struct rxd_rx_entry *rx_entry,
 	return 0;
 }
 
-void rxd_handle_start_data(struct rxd_ep *ep, struct rxd_peer *peer,
-			   struct ofi_ctrl_hdr *ctrl,
-			   struct fi_cq_msg_entry *comp,
-			   struct rxd_rx_buf *rx_buf)
+static void rxd_handle_start_data(struct rxd_ep *ep, struct rxd_peer *peer,
+				  struct ofi_ctrl_hdr *ctrl,
+				  struct fi_cq_msg_entry *comp,
+				  struct rxd_rx_buf *rx_buf)
 {
-	int ret;
 	struct rxd_rx_entry *rx_entry;
 	struct rxd_pkt_data_start *pkt_start;
-	pkt_start = (struct rxd_pkt_data_start *) ctrl;
+	int ret;
+
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
+	       "start data- msg_id: %" PRIu64 ", segno: %d, buf: %p\n",
+	       ctrl->msg_id, ctrl->seg_no, rx_buf);
 
-	rxd_ep_lock_if_required(ep);
+	pkt_start = (struct rxd_pkt_data_start *) ctrl;
 	if (pkt_start->op.version != OFI_OP_VERSION) {
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "op version mismatch\n");
 		goto repost;
 	}
 
 	ret = rxd_check_start_pkt_order(ep, peer, ctrl, comp);
-	if (ret == RXD_PKT_ORDR_DUP) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "duplicate pkt: %d\n", ctrl->seg_no);
-		rxd_handle_dup_datastart(ep, ctrl, rx_buf);
-		goto repost;
-	} else if (ret == RXD_PKT_ORDR_UNEXP) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "unexpected pkt: %d\n", ctrl->seg_no);
-		rxd_ep_enqueue_pkt(ep, ctrl, comp);
-		goto out;
+	if (ret) {
+		if (ret == -FI_EALREADY) {
+			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "duplicate pkt: %d\n",
+				ctrl->seg_no);
+			rxd_handle_dup_datastart(ep, ctrl, rx_buf);
+			goto repost;
+		} else {
+			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "unexpected pkt: %d\n",
+				ctrl->seg_no);
+			goto repost;
+		}
 	}
 
-	rx_entry = rxd_get_rx_entry(ep);
+	rx_entry = rxd_rx_entry_alloc(ep);
 	if (!rx_entry)
 		goto repost;
 
@@ -1093,9 +1043,9 @@ void rxd_handle_start_data(struct rxd_ep *ep, struct rxd_peer *peer,
 	rx_entry->msg_id = ctrl->msg_id;
 	rx_entry->done = 0;
 	rx_entry->peer = ctrl->conn_id;
-	rx_entry->source = (ep->caps & FI_DIRECTED_RECV) ?
-		rxd_av_get_fi_addr(ep->av, ctrl->conn_id) : FI_ADDR_UNSPEC;
-	rx_entry->window = 1;
+	rx_entry->source = (ep->util_ep.caps & FI_DIRECTED_RECV) ?
+		rxd_av_fi_addr(rxd_ep_av(ep), ctrl->conn_id) : FI_ADDR_UNSPEC;
+	rx_entry->credits = 1;
 	rx_entry->last_win_seg = 1;
 
 	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "Assign rx_entry :%d for  %p\n",
@@ -1104,11 +1054,11 @@ void rxd_handle_start_data(struct rxd_ep *ep, struct rxd_peer *peer,
 	ep->credits--;
 	ret = rxd_process_start_data(ep, rx_entry, peer, ctrl, comp, rx_buf);
 	if (ret == -FI_ENOMEM)
-		rxd_rx_entry_release(ep, rx_entry);
+		rxd_rx_entry_free(ep, rx_entry);
 	else if (ret == -FI_ENOENT) {
 		peer->exp_msg_id++;
 
-		/* reply ack, with win_sz = 0 */
+		/* reply ack, with no window = 0 */
 		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "Sending wait-ACK [%p] - %d\n",
 			ctrl->msg_id, ctrl->seg_no);
 		goto out;
@@ -1117,133 +1067,69 @@ void rxd_handle_start_data(struct rxd_ep *ep, struct rxd_peer *peer,
 	}
 
 repost:
-	if (comp->flags & RXD_UNEXP_ENTRY) {
-		rxd_release_unexp_entry(ep->rx_cq, comp);
-		ep->num_unexp_pkt--;
-	}
 	rxd_ep_repost_buff(rx_buf);
 out:
-	rxd_ep_unlock_if_required(ep);
+	assert(rxd_reposted_bufs);
 	return;
 }
 
-void rxd_handle_recv_comp(struct rxd_cq *cq, struct fi_cq_msg_entry *comp,
-			   int is_unexpected)
+void rxd_handle_recv_comp(struct rxd_ep *ep, struct fi_cq_msg_entry *comp)
 {
-	struct rxd_ep *ep;
 	struct ofi_ctrl_hdr *ctrl;
 	struct rxd_rx_buf *rx_buf;
 	struct rxd_peer *peer;
 
 	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "got recv completion\n");
 
+	assert(rxd_reposted_bufs);
+	rxd_reposted_bufs--;
+
 	rx_buf = container_of(comp->op_context, struct rxd_rx_buf, context);
 	ctrl = (struct ofi_ctrl_hdr *) rx_buf->buf;
-	ep = rx_buf->ep;
 	peer = rxd_ep_getpeer_info(ep, ctrl->conn_id);
 
-	if (ctrl->type != ofi_ctrl_ack && ctrl->type != ofi_ctrl_nack) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
-		       "got data pkt - msg_id:[%p - %d], type: %d on buf %p [unexp: %d]\n",
-		       ctrl->msg_id, ctrl->seg_no, ctrl->type, rx_buf, is_unexpected);
-	} else {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
-		       "got ack pkt - msg_id:[%p - %d], type: %d on buf %p  [unexp: %d]\n",
-		       ctrl->msg_id, ctrl->seg_no, ctrl->type, rx_buf, is_unexpected);
-	}
 	if (ctrl->version != OFI_CTRL_VERSION) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "ctrl version mismatch\n");
+		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "ctrl version mismatch\n");
 		return;
 	}
 
-	switch(ctrl->type) {
+	switch (ctrl->type) {
 	case ofi_ctrl_connreq:
 		rxd_handle_conn_req(ep, ctrl, comp, rx_buf);
 		break;
-
 	case ofi_ctrl_ack:
 		rxd_handle_ack(ep, ctrl, rx_buf);
 		break;
-
-	case ofi_ctrl_nack:
-		rxd_handle_nack(ep, ctrl, rx_buf);
-		break;
-
 	case ofi_ctrl_discard:
 		rxd_handle_discard(ep, ctrl, rx_buf);
 		break;
-
 	case ofi_ctrl_connresp:
 		rxd_handle_connect_ack(ep, ctrl, rx_buf);
 		break;
-
 	case ofi_ctrl_start_data:
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
-		       "start data msg for tx: %p\n", ctrl->msg_id);
 		rxd_handle_start_data(ep, peer, ctrl, comp, rx_buf);
 		break;
-
 	case ofi_ctrl_data:
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL,
-			"data msg for tx: %p, %d \n", ctrl->msg_id, ctrl->seg_no);
 		rxd_handle_data(ep, peer, ctrl, comp, rx_buf);
 		break;
-
 	default:
+		rxd_ep_repost_buff(rx_buf);
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL,
 			"invalid ctrl type \n", ctrl->type);
 	}
 
-	rxd_ep_lock_if_required(ep);
 	rxd_check_waiting_rx(ep);
-	rxd_ep_unlock_if_required(ep);
-	return;
 }
 
-static inline void rxd_handle_send_comp(struct fi_cq_msg_entry *comp)
+void rxd_handle_send_comp(struct fi_cq_msg_entry *comp)
 {
 	struct rxd_pkt_meta *pkt_meta;
-	pkt_meta = container_of(comp->op_context, struct rxd_pkt_meta, context);
-
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "Send completion for: %p\n", pkt_meta);
-	rxd_ep_lock_if_required(pkt_meta->ep);
-	RXD_PKT_MARK_LOCAL_ACK(pkt_meta);
-	rxd_tx_pkt_release(pkt_meta);
-	rxd_ep_unlock_if_required(pkt_meta->ep);
-}
-
-void rxd_cq_progress(struct util_cq *util_cq)
-{
-	ssize_t ret = 0;
-	struct rxd_cq *cq;
-	struct fi_cq_msg_entry cq_entry;
-	struct dlist_entry *item, *next;
-	struct rxd_unexp_cq_entry *unexp;
-
-	cq = container_of(util_cq, struct rxd_cq, util_cq);
-	fastlock_acquire(&cq->lock);
-
-	do {
-		ret = fi_cq_read(cq->dg_cq, &cq_entry, 1);
-		if (ret == -FI_EAGAIN)
-			break;
-
-		if (cq_entry.flags & FI_SEND) {
-			rxd_handle_send_comp(&cq_entry);
-		} else if (cq_entry.flags & FI_RECV) {
-			rxd_handle_recv_comp(cq, &cq_entry, 0);
-		} else
-			assert (0);
-	} while (ret > 0);
-
-	for (item = cq->unexp_list.next; item != &cq->unexp_list;) {
-		unexp = container_of(item, struct rxd_unexp_cq_entry, entry);
-		next = item->next;
-		rxd_handle_recv_comp(cq, &unexp->cq_entry, 1);
-		item = next;
-	}
 
-	fastlock_release(&cq->lock);
+	pkt_meta = container_of(comp->op_context, struct rxd_pkt_meta, context);
+	if (pkt_meta->flags & (RXD_REMOTE_ACK | RXD_NOT_ACKED))
+		rxd_tx_pkt_free(pkt_meta);
+	else
+		pkt_meta->flags |= RXD_LOCAL_COMP;
 }
 
 static int rxd_cq_close(struct fid *fid)
@@ -1252,20 +1138,9 @@ static int rxd_cq_close(struct fid *fid)
 	struct rxd_cq *cq;
 
 	cq = container_of(fid, struct rxd_cq, util_cq.cq_fid.fid);
-
-	fastlock_acquire(&cq->domain->lock);
-	dlist_remove(&cq->dom_entry);
-	fastlock_release(&cq->domain->lock);
-	fastlock_destroy(&cq->lock);
-
-	ret = fi_close(&cq->dg_cq->fid);
-	if (ret)
-		return ret;
-
 	ret = ofi_cq_cleanup(&cq->util_cq);
 	if (ret)
 		return ret;
-	util_buf_pool_destroy(cq->unexp_pool);
 	free(cq);
 	return 0;
 }
@@ -1278,21 +1153,31 @@ static struct fi_ops rxd_cq_fi_ops = {
 	.ops_open = fi_no_ops_open,
 };
 
+static struct fi_ops_cq rxd_cq_ops = {
+	.size = sizeof(struct fi_ops_cq),
+	.read = ofi_cq_read,
+	.readfrom = ofi_cq_readfrom,
+	.readerr = ofi_cq_readerr,
+	.sread = ofi_cq_sread,
+	.sreadfrom = ofi_cq_sreadfrom,
+	.signal = ofi_cq_signal,
+	.strerror = rxd_cq_strerror,
+};
+
 int rxd_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		 struct fid_cq **cq_fid, void *context)
 {
 	int ret;
 	struct rxd_cq *cq;
-	struct rxd_domain *rxd_domain;
 
 	cq = calloc(1, sizeof(*cq));
 	if (!cq)
 		return -FI_ENOMEM;
 
 	ret = ofi_cq_init(&rxd_prov, domain, attr, &cq->util_cq,
-			  &rxd_cq_progress, context);
+			  &ofi_cq_progress, context);
 	if (ret)
-		goto err1;
+		goto free;
 
 	switch (attr->format) {
 	case FI_CQ_FORMAT_UNSPEC:
@@ -1314,42 +1199,17 @@ int rxd_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		break;
 	default:
 		ret = -FI_EINVAL;
-		goto err2;
+		goto cleanup;
 	}
 
-	rxd_domain = container_of(domain, struct rxd_domain, util_domain.domain_fid);
-	attr->format = FI_CQ_FORMAT_MSG;
-	ret = fi_cq_open(rxd_domain->dg_domain, attr, &cq->dg_cq, context);
-	if (ret)
-		goto err2;
-
-	cq->unexp_pool = util_buf_pool_create(
-		RXD_EP_MAX_UNEXP_PKT * sizeof (struct rxd_unexp_cq_entry),
-		RXD_BUF_POOL_ALIGNMENT, 0, RXD_EP_MAX_UNEXP_PKT);
-	if (!cq->unexp_pool) {
-		ret = -FI_ENOMEM;
-		goto err3;
-	}
-
-	dlist_init(&cq->dom_entry);
-	dlist_init(&cq->unexp_list);
-	fastlock_init(&cq->lock);
-
-	fastlock_acquire(&rxd_domain->lock);
-	dlist_insert_tail(&cq->dom_entry, &rxd_domain->cq_list);
-	fastlock_release(&rxd_domain->lock);
-
 	*cq_fid = &cq->util_cq.cq_fid;
 	(*cq_fid)->fid.ops = &rxd_cq_fi_ops;
-	*cq_fid = &cq->util_cq.cq_fid;
-	cq->domain = rxd_domain;
+	(*cq_fid)->ops = &rxd_cq_ops;
 	return 0;
 
-err3:
+cleanup:
 	ofi_cq_cleanup(&cq->util_cq);
-err2:
-	fi_close(&cq->dg_cq->fid);
-err1:
+free:
 	free(cq);
 	return ret;
 }
diff --git a/prov/rxd/src/rxd_domain.c b/prov/rxd/src/rxd_domain.c
index 312df84..a6f0a18 100644
--- a/prov/rxd/src/rxd_domain.c
+++ b/prov/rxd/src/rxd_domain.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2016-2017 Intel Corporation, Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -43,7 +43,7 @@ static struct fi_ops_domain rxd_domain_ops = {
 	.cq_open = rxd_cq_open,
 	.endpoint = rxd_endpoint,
 	.scalable_ep = fi_no_scalable_ep,
-	.cntr_open = fi_no_cntr_open,
+	.cntr_open = rxd_cntr_open,
 	.poll_open = fi_poll_create,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_no_srx_context,
@@ -64,11 +64,7 @@ static int rxd_domain_close(fid_t fid)
 	if (ret)
 		return ret;
 
-	ofi_mr_close(rxd_domain->mr_heap);
-	rxd_domain->do_progress = 0;
-	pthread_join(rxd_domain->progress_thread, NULL);
-	fastlock_destroy(&rxd_domain->lock);
-	fastlock_destroy(&rxd_domain->mr_lock);
+	ofi_mr_map_close(&rxd_domain->mr_map);
 	free(rxd_domain);
 	return 0;
 }
@@ -81,28 +77,6 @@ static struct fi_ops rxd_domain_fi_ops = {
 	.ops_open = fi_no_ops_open,
 };
 
-void *rxd_progress(void *arg)
-{
-	struct rxd_cq *cq;
-	struct rxd_ep *ep;
-	struct dlist_entry *item;
-	struct rxd_domain *domain = arg;
-
-	while(domain->do_progress) {
-		fastlock_acquire(&domain->lock);
-		dlist_foreach(&domain->cq_list, item) {
-			cq = container_of(item, struct rxd_cq, dom_entry);
-			rxd_cq_progress(&cq->util_cq);
-		}
-
-		dlist_foreach(&domain->ep_list, item) {
-			ep = container_of(item, struct rxd_ep, dom_entry);
-			rxd_ep_progress(ep);
-		}
-		fastlock_release(&domain->lock);
-	}
-	return NULL;
-}
 struct rxd_mr_entry {
 	struct fid_mr mr_fid;
 	struct rxd_domain *domain;
@@ -114,20 +88,18 @@ static int rxd_mr_close(struct fid *fid)
 {
 	struct rxd_domain *dom;
 	struct rxd_mr_entry *mr;
-	uint64_t mr_key;
 	int err = 0;
 
 	mr = container_of(fid, struct rxd_mr_entry, mr_fid.fid);
 	dom = mr->domain;
-	mr_key = mr->key;
 
-	fastlock_acquire(&dom->lock);
-	err = ofi_mr_erase(dom->mr_heap, mr_key);
+	fastlock_acquire(&dom->util_domain.lock);
+	err = ofi_mr_remove(&dom->mr_map, mr->key);
+	fastlock_release(&dom->util_domain.lock);
 	if (err)
 		return err;
 
-	fastlock_release(&dom->lock);
-	atomic_dec(&dom->util_domain.ref);
+	ofi_atomic_dec32(&dom->util_domain.ref);
 	free(mr);
 	return 0;
 }
@@ -157,7 +129,7 @@ static int rxd_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
 	if (!_mr)
 		return -FI_ENOMEM;
 
-	fastlock_acquire(&dom->mr_lock);
+	fastlock_acquire(&dom->util_domain.lock);
 
 	_mr->mr_fid.fid.fclass = FI_CLASS_MR;
 	_mr->mr_fid.fid.context = attr->context;
@@ -166,21 +138,21 @@ static int rxd_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
 	_mr->domain = dom;
 	_mr->flags = flags;
 
-	ret = ofi_mr_insert(dom->mr_heap, attr, &key, _mr);
+	ret = ofi_mr_insert(&dom->mr_map, attr, &key, _mr);
 	if (ret != 0) {
 		goto err;
 	}
 
 	_mr->mr_fid.key = _mr->key = key;
 	_mr->mr_fid.mem_desc = (void *) (uintptr_t) key;
-	fastlock_release(&dom->mr_lock);
+	fastlock_release(&dom->util_domain.lock);
 
 	*mr = &_mr->mr_fid;
-	atomic_inc(&dom->util_domain.ref);
+	ofi_atomic_inc32(&dom->util_domain.ref);
 
 	return 0;
 err:
-	fastlock_release(&dom->mr_lock);
+	fastlock_release(&dom->util_domain.lock);
 	free(_mr);
 	return ret;
 }
@@ -224,10 +196,11 @@ int rxd_mr_verify(struct rxd_domain *rxd_domain, ssize_t len,
 		  uintptr_t *io_addr, uint64_t key, uint64_t access)
 {
 	int ret;
-	fastlock_acquire(&rxd_domain->mr_lock);
-	ret = ofi_mr_retrieve_and_verify(rxd_domain->mr_heap, len,
-					 io_addr, key, access, NULL);
-	fastlock_release(&rxd_domain->mr_lock);
+
+	fastlock_acquire(&rxd_domain->util_domain.lock);
+	ret = ofi_mr_verify(&rxd_domain->mr_map, io_addr, len,
+		    key, access, NULL);
+	fastlock_release(&rxd_domain->util_domain.lock);
 	return ret;
 }
 
@@ -239,7 +212,9 @@ int rxd_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	struct rxd_domain *rxd_domain;
 	struct rxd_fabric *rxd_fabric;
 
-	ret = fi_check_info(&rxd_util_prov, info, FI_MATCH_PREFIX);
+	rxd_fabric = container_of(fabric, struct rxd_fabric,
+				  util_fabric.fabric_fid);
+	ret = ofi_prov_check_info(&rxd_util_prov, fabric->api_version, info);
 	if (ret)
 		return ret;
 
@@ -247,50 +222,37 @@ int rxd_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	if (!rxd_domain)
 		return -FI_ENOMEM;
 
-	ret = ofix_getinfo(rxd_prov.version, NULL, NULL, 0, &rxd_util_prov,
-			info, rxd_alter_layer_info,
-			rxd_alter_base_info, 1, &dg_info);
+	ret = ofi_get_core_info(fabric->api_version, NULL, NULL,
+				0, &rxd_util_prov, info,
+				rxd_info_to_core, &dg_info);
 	if (ret)
 		goto err1;
 
 
-	rxd_fabric = container_of(fabric, struct rxd_fabric, util_fabric.fabric_fid);
-	ret = fi_domain(rxd_fabric->dg_fabric, dg_info, &rxd_domain->dg_domain, context);
+	ret = fi_domain(rxd_fabric->dg_fabric, dg_info,
+			&rxd_domain->dg_domain, context);
 	if (ret)
 		goto err2;
 
 	rxd_domain->max_mtu_sz = dg_info->ep_attr->max_msg_size;
-	rxd_domain->dg_mode = dg_info->mode;
-	rxd_domain->addrlen = (info->src_addr) ? info->src_addrlen : info->dest_addrlen;
+	rxd_domain->mr_mode = dg_info->domain_attr->mr_mode;
 
 	ret = ofi_domain_init(fabric, info, &rxd_domain->util_domain, context);
 	if (ret) {
 		goto err3;
 	}
 
-	dlist_init(&rxd_domain->ep_list);
-	dlist_init(&rxd_domain->cq_list);
-	fastlock_init(&rxd_domain->lock);
-	fastlock_init(&rxd_domain->mr_lock);
-
-	ret = ofi_mr_init(&rxd_prov, info->domain_attr->mr_mode, &rxd_domain->mr_heap);
+	ret = ofi_mr_map_init(&rxd_prov, info->domain_attr->mr_mode,
+			      &rxd_domain->mr_map);
 	if (ret)
 		goto err4;
 
-	rxd_domain->do_progress = 1;
-	if (pthread_create(&rxd_domain->progress_thread, NULL,
-			   rxd_progress, rxd_domain)) {
-		goto err5;
-	}
-
 	*domain = &rxd_domain->util_domain.domain_fid;
 	(*domain)->fid.ops = &rxd_domain_fi_ops;
 	(*domain)->ops = &rxd_domain_ops;
 	(*domain)->mr = &rxd_mr_ops;
 	fi_freeinfo(dg_info);
 	return 0;
-err5:
-	ofi_mr_close(rxd_domain->mr_heap);
 err4:
 	ofi_domain_close(&rxd_domain->util_domain);
 err3:
diff --git a/prov/rxd/src/rxd_ep.c b/prov/rxd/src/rxd_ep.c
index afc8c78..06c96f2 100644
--- a/prov/rxd/src/rxd_ep.c
+++ b/prov/rxd/src/rxd_ep.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -33,9 +33,13 @@
 #include <stdlib.h>
 #include <string.h>
 #include <fi_mem.h>
+#include <fi_iov.h>
 #include "rxd.h"
 
-static ssize_t	rxd_ep_cancel(fid_t fid, void *context)
+int rxd_progress_spin_count = 1000;
+int rxd_reposted_bufs = 0;
+
+static ssize_t rxd_ep_cancel(fid_t fid, void *context)
 {
 	struct rxd_ep *ep;
 	struct dlist_entry *entry, *next;
@@ -43,8 +47,8 @@ static ssize_t	rxd_ep_cancel(fid_t fid, void *context)
 	struct rxd_trecv_entry *trecv_entry;
 	struct fi_cq_err_entry err_entry = {0};
 
-	ep = container_of(fid, struct rxd_ep, ep.fid);
-	rxd_ep_lock_if_required(ep);
+	ep = container_of(fid, struct rxd_ep, util_ep.ep_fid.fid);
+	fastlock_acquire(&ep->lock);
 	for (entry = ep->recv_list.next; entry != &ep->recv_list; entry = next) {
 		next = entry->next;
 		recv_entry = container_of(entry, struct rxd_recv_entry, entry);
@@ -56,7 +60,7 @@ static ssize_t	rxd_ep_cancel(fid_t fid, void *context)
 		err_entry.flags = (FI_MSG | FI_RECV);
 		err_entry.err = FI_ECANCELED;
 		err_entry.prov_errno = -FI_ECANCELED;
-		rxd_cq_report_error(ep->rx_cq, &err_entry);
+		rxd_cq_report_error(rxd_ep_rx_cq(ep), &err_entry);
 		goto out;
 	}
 
@@ -72,12 +76,12 @@ static ssize_t	rxd_ep_cancel(fid_t fid, void *context)
 		err_entry.tag = trecv_entry->msg.tag;
 		err_entry.err = FI_ECANCELED;
 		err_entry.prov_errno = -FI_ECANCELED;
-		rxd_cq_report_error(ep->rx_cq, &err_entry);
+		rxd_cq_report_error(rxd_ep_rx_cq(ep), &err_entry);
 		goto out;
 	}
 
 out:
-	rxd_ep_unlock_if_required(ep);
+	fastlock_release(&ep->lock);
 	return 0;
 }
 
@@ -107,13 +111,14 @@ struct fi_ops_ep rxd_ops_ep = {
 static ssize_t rxd_ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 			       uint64_t flags)
 {
-	ssize_t ret = 0, i;
+	ssize_t ret = 0;
+	size_t i;
 	struct rxd_ep *rxd_ep;
 	struct rxd_recv_entry *recv_entry;
 
-	rxd_ep = container_of(ep, struct rxd_ep, ep);
+	rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid.fid);
 
-	rxd_ep_lock_if_required(rxd_ep);
+	fastlock_acquire(&rxd_ep->lock);
 	if (freestack_isempty(rxd_ep->recv_fs)) {
 		ret = -FI_EAGAIN;
 		goto out;
@@ -122,7 +127,7 @@ static ssize_t rxd_ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 	recv_entry = freestack_pop(rxd_ep->recv_fs);
 	recv_entry->msg = *msg;
 	recv_entry->flags = flags;
-	recv_entry->msg.addr = (rxd_ep->caps & FI_DIRECTED_RECV) ?
+	recv_entry->msg.addr = (rxd_ep->util_ep.caps & FI_DIRECTED_RECV) ?
 		recv_entry->msg.addr : FI_ADDR_UNSPEC;
 	for (i = 0; i < msg->iov_count; i++) {
 		recv_entry->iov[i].iov_base = msg->msg_iov[i].iov_base;
@@ -138,7 +143,7 @@ static ssize_t rxd_ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		rxd_ep_check_unexp_msg_list(rxd_ep, recv_entry);
 	}
 out:
-	rxd_ep_unlock_if_required(rxd_ep);
+	fastlock_release(&rxd_ep->lock);
 	return ret;
 }
 
@@ -182,35 +187,44 @@ static inline void *rxd_mr_desc(struct fid_mr *mr, struct rxd_ep *ep)
 int rxd_ep_repost_buff(struct rxd_rx_buf *buf)
 {
 	int ret;
-	ret = fi_recv(buf->ep->dg_ep, buf->buf, buf->ep->domain->max_mtu_sz,
+	ret = fi_recv(buf->ep->dg_ep, buf->buf, rxd_ep_domain(buf->ep)->max_mtu_sz,
 		      rxd_mr_desc(buf->mr, buf->ep),
 		      FI_ADDR_UNSPEC, &buf->context);
 	if (ret)
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "failed to repost\n");
+	else
+		rxd_reposted_bufs++;
 	return ret;
 }
 
-static int rxd_ep_set_conn_id(struct rxd_ep *ep)
+/*
+ * See fi_proto.h for how conn_data is being used.
+ */
+static uint64_t rxd_ep_conn_data(struct rxd_ep *ep)
 {
+	char name[RXD_MAX_DGRAM_ADDR];
+	size_t addrlen;
 	int ret;
-	ep->name = calloc(1, ep->addrlen);
-	if (!ep->name)
-		return -FI_ENOMEM;
 
-	ret = fi_getname(&ep->dg_ep->fid, ep->name, &ep->addrlen);
+	if (ep->conn_data_set)
+		return ep->conn_data;
+
+	addrlen = sizeof name;
+	ret = fi_getname(&ep->dg_ep->fid, name, &addrlen);
 	if (ret)
-		return -FI_EINVAL;
+		return 0;
 
-	ret = rxd_av_dg_reverse_lookup(ep->av, 0, ep->name, ep->addrlen,
-					&ep->conn_data);
+	ret = rxd_av_dg_reverse_lookup(rxd_ep_av(ep), 0, name, &ep->conn_data);
 	if (!ret)
 		ep->conn_data_set = 1;
-	return 0;
+
+	return ep->conn_data;
 }
 
-int rxd_ep_enable(struct rxd_ep *ep)
+static int rxd_ep_enable(struct rxd_ep *ep)
 {
-	ssize_t i, ret;
+	size_t i;
+	ssize_t ret;
 	void *mr = NULL;
 	struct rxd_rx_buf *rx_buf;
 
@@ -218,11 +232,7 @@ int rxd_ep_enable(struct rxd_ep *ep)
 	if (ret)
 		return ret;
 
-	rxd_ep_lock_if_required(ep);
-	ret = rxd_ep_set_conn_id(ep);
-	if (ret)
-		goto out;
-
+	fastlock_acquire(&ep->lock);
 	ep->credits = ep->rx_size;
 	for (i = 0; i < ep->rx_size; i++) {
 		rx_buf = ep->do_local_mr ?
@@ -242,12 +252,7 @@ int rxd_ep_enable(struct rxd_ep *ep)
 		slist_insert_tail(&rx_buf->entry, &ep->rx_pkt_list);
 	}
 out:
-	rxd_ep_unlock_if_required(ep);
-	if (ret == 0) {
-		fastlock_acquire(&ep->domain->lock);
-		dlist_insert_tail(&ep->dom_entry, &ep->domain->ep_list);
-		fastlock_release(&ep->domain->lock);
-	}
+	fastlock_release(&ep->lock);
 	return ret;
 }
 
@@ -256,24 +261,13 @@ struct rxd_peer *rxd_ep_getpeer_info(struct rxd_ep *ep, fi_addr_t addr)
 	return &ep->peer_info[addr];
 }
 
-void rxd_ep_lock_if_required(struct rxd_ep *ep)
-{
-	/* todo: do locking based on threading model */
-	fastlock_acquire(&ep->lock);
-}
-
-void rxd_ep_unlock_if_required(struct rxd_ep *ep)
-{
-	/* todo: do unlocking based on threading model */
-	fastlock_release(&ep->lock);
-}
-
-size_t rxd_get_msg_len(const struct iovec *iov, size_t iov_count)
+/*
+ * Exponential back-off starting at 1ms, max 4s.
+ */
+void rxd_set_timeout(struct rxd_tx_entry *tx_entry)
 {
-	size_t i, ret = 0;
-	for (i = 0; i < iov_count; i++)
-		ret += iov[i].iov_len;
-	return ret;
+	tx_entry->retry_time = fi_gettime_ms() +
+				MIN(1 << tx_entry->retry_cnt, 4000);
 }
 
 static void rxd_init_ctrl_hdr(struct ofi_ctrl_hdr *ctrl,
@@ -304,48 +298,20 @@ static void rxd_init_op_hdr(struct ofi_op_hdr *op, uint64_t data,
 	op->tag = tag;
 }
 
-static uint32_t rxd_prepare_tx_flags(uint64_t flags)
-{
-	uint32_t tx_flags = 0;
-	if (flags & FI_REMOTE_CQ_DATA)
-		tx_flags = OFI_REMOTE_CQ_DATA;
-	if (flags & FI_TRANSMIT_COMPLETE)
-		tx_flags |= OFI_TRANSMIT_COMPLETE;
-	if (flags & FI_DELIVERY_COMPLETE)
-		tx_flags |= OFI_DELIVERY_COMPLETE;
-	return tx_flags;
-}
-
-uint64_t rxd_ep_copy_iov_buf(const struct iovec *iov, size_t iov_count,
-			     void *buf, uint64_t data_sz, uint64_t skip, int dir)
+static uint32_t rxd_map_fi_flags(uint64_t fi_flags)
 {
-	int i;
-	uint64_t rem, offset, len, iov_offset;
-	offset = 0, rem = data_sz, iov_offset = 0;
-
-	for (i = 0; i < iov_count; i++) {
-		len = iov[i].iov_len;
-		iov_offset = 0;
-
-		if (skip) {
-			iov_offset = MIN(skip, len);
-			skip -= iov_offset;
-			len -= iov_offset;
-		}
+	uint32_t flags = 0;
 
-		len = MIN(rem, len);
-		if (dir == RXD_COPY_BUF_TO_IOV)
-			memcpy((char *) iov[i].iov_base + iov_offset,
-			       (char *) buf + offset, len);
-		else if (dir == RXD_COPY_IOV_TO_BUF)
-			memcpy((char *) buf + offset,
-			       (char *) iov[i].iov_base + iov_offset, len);
-		rem -= len, offset += len;
-	}
-	return offset;
+	if (fi_flags & FI_REMOTE_CQ_DATA)
+		flags = OFI_REMOTE_CQ_DATA;
+	if (fi_flags & FI_TRANSMIT_COMPLETE)
+		flags |= OFI_TRANSMIT_COMPLETE;
+	if (fi_flags & FI_DELIVERY_COMPLETE)
+		flags |= OFI_DELIVERY_COMPLETE;
+	return flags;
 }
 
-struct rxd_pkt_meta *rxd_tx_pkt_acquire(struct rxd_ep *ep)
+static struct rxd_pkt_meta *rxd_tx_pkt_alloc(struct rxd_ep *ep)
 {
 	struct rxd_pkt_meta *pkt_meta;
 	void *mr = NULL;
@@ -361,243 +327,241 @@ struct rxd_pkt_meta *rxd_tx_pkt_acquire(struct rxd_ep *ep)
 
 	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "Acquired tx pkt: %p\n", pkt_meta);
 	pkt_meta->ep = ep;
-	pkt_meta->retries = 0;
 	pkt_meta->mr = (struct fid_mr *) mr;
-	pkt_meta->ref = 0;
+	pkt_meta->flags = 0;
 	return pkt_meta;
 }
 
+static uint64_t rxd_ep_start_seg_size(struct rxd_ep *ep, uint64_t msg_size)
+{
+	return MIN(rxd_ep_domain(ep)->max_mtu_sz -
+		   sizeof(struct rxd_pkt_data_start), msg_size);
+}
+
+struct rxd_tx_entry *rxd_tx_entry_alloc(struct rxd_ep *ep,
+	struct rxd_peer *peer, fi_addr_t addr, uint64_t flags, uint8_t op)
+{
+	struct rxd_tx_entry *tx_entry;
+
+	if (freestack_isempty(ep->tx_entry_fs)) {
+		FI_INFO(&rxd_prov, FI_LOG_EP_CTRL, "no-more tx entries\n");
+		return NULL;
+	}
+
+	if (peer->active_tx_cnt == RXD_MAX_PEER_TX)
+		return NULL;
+
+	peer->active_tx_cnt++;
+
+	tx_entry = freestack_pop(ep->tx_entry_fs);
+	tx_entry->peer = addr;
+	tx_entry->flags = flags;
+	tx_entry->bytes_sent = 0;
+	tx_entry->seg_no = 0;
+	tx_entry->window = 1;
+	tx_entry->retry_cnt = 0;
+	tx_entry->op_type = op;
+	dlist_init(&tx_entry->pkt_list);
+	return tx_entry;
+}
+
+void rxd_tx_entry_free(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
+{
+	struct rxd_peer *peer;
+
+	peer = rxd_ep_getpeer_info(ep, tx_entry->peer);
+	peer->active_tx_cnt--;
+	/* reset ID to invalid state to avoid ID collision */
+	tx_entry->msg_id = UINT64_MAX;
+	dlist_remove(&tx_entry->entry);
+	freestack_push(ep->tx_entry_fs, tx_entry);
+}
+
+static size_t rxd_copy_rma_iov(struct ofi_rma_iov *dst,
+				const struct fi_rma_iov *src, size_t count)
+{
+	int i;
+
+	for (i = 0; i < count; i++) {
+		dst->addr = src->addr;
+		dst->len = src->len;
+		dst->key = src->key;
+	}
+	return sizeof(*dst) * count;
+}
+
 static uint64_t rxd_ep_copy_data(struct rxd_tx_entry *tx_entry,
-				 struct rxd_pkt_data *pkt, uint64_t data_sz)
+				 char *buf, uint64_t size)
 {
-	uint64_t done;
+	const struct iovec *iov;
+	size_t iov_count;
+
 	switch(tx_entry->op_hdr.op) {
 	case ofi_op_msg:
-		done = rxd_ep_copy_iov_buf(tx_entry->msg.msg_iov,
-					   tx_entry->msg.msg.iov_count,
-					   pkt->data, data_sz, tx_entry->done,
-					   RXD_COPY_IOV_TO_BUF);
+		iov = tx_entry->msg.msg_iov;
+		iov_count = tx_entry->msg.msg.iov_count;
 		break;
-
 	case ofi_op_tagged:
-		done = rxd_ep_copy_iov_buf(tx_entry->tmsg.msg_iov,
-					   tx_entry->tmsg.tmsg.iov_count,
-					   pkt->data, data_sz, tx_entry->done,
-					   RXD_COPY_IOV_TO_BUF);
+		iov = tx_entry->tmsg.msg_iov;
+		iov_count = tx_entry->tmsg.tmsg.iov_count;
 		break;
-
 	case ofi_op_write:
-		done = rxd_ep_copy_iov_buf(tx_entry->write.src_iov,
-					   tx_entry->write.msg.iov_count,
-					   pkt->data, data_sz, tx_entry->done,
-					   RXD_COPY_IOV_TO_BUF);
+		iov = tx_entry->write.src_iov;
+		iov_count = tx_entry->write.msg.iov_count;
 		break;
-
 	case ofi_op_read_rsp:
-		done = rxd_ep_copy_iov_buf(tx_entry->read_rsp.src_iov,
-					   tx_entry->read_rsp.iov_count,
-					   pkt->data, data_sz, tx_entry->done,
-					   RXD_COPY_IOV_TO_BUF);
+		iov = tx_entry->read_rsp.src_iov;
+		iov_count = tx_entry->read_rsp.iov_count;
 		break;
-
 	default:
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op-type\n",
-			tx_entry->op_hdr.op);
-		done = 0;
+		return 0;
 	}
-	return done;
+
+	return ofi_copy_from_iov(buf, size, iov, iov_count, tx_entry->bytes_sent);
 }
 
-ssize_t rxd_ep_post_data_msg(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
+static void rxd_ep_init_data_pkt(struct rxd_ep *ep, struct rxd_peer *peer,
+				 struct rxd_tx_entry *tx_entry,
+				 struct rxd_pkt_data *pkt)
+{
+	uint16_t seg_size;
+
+	seg_size = rxd_ep_domain(ep)->max_mtu_sz - sizeof(struct rxd_pkt_data);
+	seg_size = MIN(seg_size, tx_entry->op_hdr.size - tx_entry->bytes_sent);
+
+	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_data, seg_size, tx_entry->seg_no,
+			   tx_entry->msg_id, tx_entry->rx_key, peer->conn_data);
+	tx_entry->bytes_sent += rxd_ep_copy_data(tx_entry, pkt->data, seg_size);
+	tx_entry->seg_no++;
+}
+
+static ssize_t rxd_ep_post_data_msg(struct rxd_ep *ep,
+				    struct rxd_tx_entry *tx_entry)
 {
-	int ret;
-	uint64_t data_sz, done;
 	struct rxd_pkt_meta *pkt_meta;
 	struct rxd_pkt_data *pkt;
 	struct rxd_peer *peer;
+	int ret;
 
 	peer = rxd_ep_getpeer_info(ep, tx_entry->peer);
-	pkt_meta = rxd_tx_pkt_acquire(ep);
+
+	pkt_meta = rxd_tx_pkt_alloc(ep);
 	if (!pkt_meta)
 		return -FI_ENOMEM;
 
-	pkt = (struct rxd_pkt_data *)pkt_meta->pkt_data;
-	data_sz = MIN(RXD_MAX_DATA_PKT_SZ(ep), tx_entry->op_hdr.size - tx_entry->done);
-
-	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_data, data_sz, tx_entry->nxt_seg_no,
-			   tx_entry->msg_id, tx_entry->rx_key, peer->conn_data);
-	done = rxd_ep_copy_data(tx_entry, pkt, data_sz);
-
 	pkt_meta->tx_entry = tx_entry;
-	pkt_meta->type = (tx_entry->op_hdr.size == tx_entry->done + done) ?
-		RXD_PKT_LAST : RXD_PKT_DATA;
-	pkt_meta->us_stamp = fi_gettime_us();
+	pkt = (struct rxd_pkt_data *) pkt_meta->pkt_data;
+	rxd_ep_init_data_pkt(ep, peer, tx_entry, pkt);
+
+	if (tx_entry->op_hdr.size == pkt->ctrl.seg_size)
+		pkt_meta->flags |= RXD_PKT_LAST;
 
-	ret = fi_send(ep->dg_ep, pkt, data_sz + RXD_DATA_PKT_SZ,
-		      rxd_mr_desc(pkt_meta->mr, ep), tx_entry->peer, &pkt_meta->context);
+	ret = fi_send(ep->dg_ep, pkt, sizeof(*pkt) + pkt->ctrl.seg_size,
+		      rxd_mr_desc(pkt_meta->mr, ep), tx_entry->peer,
+		      &pkt_meta->context);
 	if (ret) {
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "send %d failed\n", pkt->ctrl.seg_no);
-		util_buf_release(ep->tx_pkt_pool, pkt_meta);
-		return ret;
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "send %d failed\n",
+		       pkt->ctrl.seg_no);
 	}
 
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "sent data %p, %d [on buf: %p]\n",
-		pkt->ctrl.msg_id, pkt->ctrl.seg_no, pkt_meta);
-	tx_entry->done += done;
-	tx_entry->win_sz--;
-	tx_entry->nxt_seg_no++;
-	tx_entry->num_unacked++;
-
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "msg data %p, seg %d\n",
+		pkt->ctrl.msg_id, pkt->ctrl.seg_no);
 	dlist_insert_tail(&pkt_meta->entry, &tx_entry->pkt_list);
-	ep->num_out++;
-	return 0;
+
+	return ret;
 }
 
 void rxd_ep_free_acked_pkts(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-			  uint32_t seg_no)
+			    uint32_t last_acked)
 {
-	struct dlist_entry *next, *curr;
 	struct rxd_pkt_meta *pkt;
 	struct ofi_ctrl_hdr *ctrl;
 
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "freeing all [%p] pkts <= %d\n",
-		tx_entry->msg_id, seg_no);
-	for (curr = tx_entry->pkt_list.next; curr != &tx_entry->pkt_list;) {
-		next = curr->next;
-		pkt = container_of(curr, struct rxd_pkt_meta, entry);
-		ctrl = (struct ofi_ctrl_hdr *) pkt->pkt_data;
-		if (ctrl->seg_no <= seg_no) {
-			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "freeing [%p] pkt:%d\n",
-				tx_entry->msg_id, ctrl->seg_no);
-			dlist_remove(curr);
-			RXD_PKT_MARK_REMOTE_ACK(pkt);
-			rxd_tx_pkt_release(pkt);
-			tx_entry->num_unacked--;
-		} else {
-			break;
-		}
-		curr = next;
-	}
-}
-
-void rxd_tx_entry_update_ts(struct rxd_tx_entry *tx_entry, uint32_t seg_no)
-{
-	struct dlist_entry *curr;
-	struct rxd_pkt_meta *pkt;
-	struct ofi_ctrl_hdr *ctrl;
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "freeing all [%p] pkts < %d\n",
+		tx_entry->msg_id, last_acked);
+	while (!dlist_empty(&tx_entry->pkt_list)) {
 
-	for (curr = tx_entry->pkt_list.next; curr != &tx_entry->pkt_list;
-	     curr = curr->next) {
-		pkt = container_of(curr, struct rxd_pkt_meta, entry);
+		pkt = container_of(tx_entry->pkt_list.next,
+				   struct rxd_pkt_meta, entry);
 		ctrl = (struct ofi_ctrl_hdr *) pkt->pkt_data;
-		if (ctrl->seg_no == seg_no) {
-			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "updating TS of [%p] pkt:%d\n",
-				tx_entry->msg_id, seg_no);
-			pkt->us_stamp += RXD_WAIT_TIMEOUT;
+		if (ctrl->seg_no >= last_acked)
 			break;
-		}
-	}
-}
-
-int rxd_progress_tx(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
-{
-	int ret = 0;
-
-	switch (tx_entry->op_hdr.op) {
-	case ofi_op_msg:
-	case ofi_op_tagged:
-	case ofi_op_write:
-	case ofi_op_read_rsp:
-		ret = rxd_ep_post_data_msg(ep, tx_entry);
-		break;
 
-	default:
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid pkt type\n");
-		break;
-	}
-	return ret;
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "freeing [%p] pkt:%d\n",
+			tx_entry->msg_id, ctrl->seg_no);
+		dlist_remove(&pkt->entry);
+		if (pkt->flags & RXD_LOCAL_COMP)
+			rxd_tx_pkt_free(pkt);
+		else
+			pkt->flags |= RXD_REMOTE_ACK;
+	};
 }
 
-void rxd_tx_entry_discard(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
+static int rxd_ep_retry_pkt(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
+			    struct rxd_pkt_meta *pkt)
 {
-	rxd_cq_report_tx_comp(ep->tx_cq, tx_entry);
-	rxd_tx_entry_done(ep, tx_entry);
-}
-
-void rxd_resend_pkt(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-		     uint32_t seg_no)
-{
-	struct dlist_entry *pkt_item;
-	struct rxd_pkt_meta *pkt;
+	int ret;
 	struct ofi_ctrl_hdr *ctrl;
-	uint64_t curr_stamp = fi_gettime_us();
-
-	dlist_foreach(&tx_entry->pkt_list, pkt_item) {
-		pkt = container_of(pkt_item, struct rxd_pkt_meta, entry);
-		ctrl = (struct ofi_ctrl_hdr *)pkt->pkt_data;
-
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "check pkt %d, %p\n",
-			ctrl->seg_no, ctrl->msg_id);
-
-		if (ctrl->seg_no == seg_no) {
 
-			if (curr_stamp < pkt->us_stamp ||
-			    (curr_stamp - pkt->us_stamp) <
-			    (((uint64_t) 1) << ((uint64_t) pkt->retries + 1)) *
-			     RXD_RETRY_TIMEOUT) {
-				break;
-			}
+	ctrl = (struct ofi_ctrl_hdr *)pkt->pkt_data;
+//	if (pkt->retries > RXD_MAX_PKT_RETRY) {
+//		/* todo: report error */
+//		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "Pkt delivery failed\n", ctrl->seg_no);
+//		return -FI_EIO;
+//	}
+//
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "retry packet : %2d, size: %d, tx_id :%p\n",
+		ctrl->seg_no, ctrl->type == ofi_ctrl_start_data ?
+		ctrl->seg_size + sizeof(struct rxd_pkt_data_start) :
+		ctrl->seg_size + sizeof(struct rxd_pkt_data),
+		ctrl->msg_id);
 
-			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "resending pkt %d, %p\n",
-				ctrl->seg_no, ctrl->msg_id);
+	ret = fi_send(ep->dg_ep, ctrl,
+		      ctrl->type == ofi_ctrl_start_data ?
+		      ctrl->seg_size + sizeof(struct rxd_pkt_data_start) :
+		      ctrl->seg_size + sizeof(struct rxd_pkt_data),
+		      rxd_mr_desc(pkt->mr, ep),
+		      tx_entry->peer, &pkt->context);
 
-			pkt->us_stamp = fi_gettime_us();
-			rxd_ep_retry_pkt(ep, tx_entry, pkt);
-			break;
-		}
-	}
-}
+//	if (ret != -FI_EAGAIN)
+//		pkt->retries++;
 
-int rxd_tx_entry_progress(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-			   struct ofi_ctrl_hdr *ack)
-{
-	if (ack) {
-		tx_entry->rx_key = ack->rx_key;
-		tx_entry->win_sz += ack->seg_size;
-
-		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "tx: %p [%p] - avail_win: %d\n",
-			tx_entry, ack->msg_id, ack->seg_size);
-
-		if (ack->type == ofi_ctrl_nack) {
-			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "got NACK for %d, %p\n",
-				ack->seg_no, ack->msg_id);
-			if (ack->seg_no > 0)
-				rxd_ep_free_acked_pkts(ep, tx_entry, ack->seg_no - 1);
-			rxd_resend_pkt(ep, tx_entry, ack->seg_no);
-		} else {
-			FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "got ACK for %d, %p\n",
-			       ack->seg_no, ack->msg_id);
-
-			rxd_ep_free_acked_pkts(ep, tx_entry, ack->seg_no);
-			if (ack->seg_size == 0 &&
-			    tx_entry->done != tx_entry->op_hdr.size) {
-				tx_entry->is_waiting = 1;
-				tx_entry->retry_stamp = fi_gettime_us();
-				FI_WARN(&rxd_prov, FI_LOG_EP_CTRL,
-					"Marking [%p] as waiting\n", tx_entry->msg_id);
-			}
-		}
+	if (ret && ret != -FI_EAGAIN) {
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "Pkt sent failed seg: %d, ret: %d\n",
+			ctrl->seg_no, ret);
 	}
 
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "tx: %p [%p] - num_unacked: %d\n",
-		tx_entry, tx_entry->msg_id, tx_entry->num_unacked);
+	return ret;
+}
 
-	while (tx_entry->win_sz && tx_entry->num_unacked < RXD_MAX_UNACKED &&
-	       tx_entry->done != tx_entry->op_hdr.size) {
-		if (rxd_progress_tx(ep, tx_entry))
+//void rxd_resend_pkt(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry )
+//{
+//	struct dlist_entry *pkt_item;
+//	struct rxd_pkt_meta *pkt;
+//	struct ofi_ctrl_hdr *ctrl;
+//
+//	dlist_foreach(&tx_entry->pkt_list, pkt_item) {
+//		pkt = container_of(pkt_item, struct rxd_pkt_meta, entry);
+//		ctrl = (struct ofi_ctrl_hdr *) pkt->pkt_data;
+//
+//		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "resending pkt %d, %p\n",
+//			ctrl->seg_no, ctrl->msg_id);
+//
+//		rxd_ep_retry_pkt(ep, tx_entry, pkt);
+//	}
+//}
+
+void rxd_tx_entry_progress(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
+{
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "tx: %p [%p]\n",
+		tx_entry, tx_entry->msg_id);
+
+	while ((tx_entry->seg_no < tx_entry->window) &&
+	       (tx_entry->bytes_sent != tx_entry->op_hdr.size)) {
+		if (rxd_ep_post_data_msg(ep, tx_entry))
 			break;
 	}
-	return 0;
+	rxd_set_timeout(tx_entry);
 }
 
 int rxd_ep_reply_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
@@ -607,453 +571,266 @@ int rxd_ep_reply_ack(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
 	ssize_t ret;
 	struct rxd_pkt_meta *pkt_meta;
 	struct rxd_pkt_data *pkt;
+	struct rxd_rx_entry *rx_entry;
 
-	pkt_meta = rxd_tx_pkt_acquire(ep);
+	pkt_meta = rxd_tx_pkt_alloc(ep);
 	if (!pkt_meta)
 		return -FI_ENOMEM;
 
-	pkt = (struct rxd_pkt_data *)pkt_meta->pkt_data;
-	rxd_init_ctrl_hdr(&pkt->ctrl, type, seg_size, in_ctrl->seg_no,
-			   in_ctrl->msg_id, rx_key, source);
-
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "sending ack [%p] - %d, %d\n",
-		in_ctrl->msg_id, in_ctrl->seg_no, seg_size);
-
-	RXD_PKT_MARK_REMOTE_ACK(pkt_meta);
-	pkt_meta->us_stamp = fi_gettime_us();
-	ret = fi_send(ep->dg_ep, pkt, RXD_DATA_PKT_SZ,
-		      rxd_mr_desc(pkt_meta->mr, ep),
-		      dest, &pkt_meta->context);
-	if (ret)
-		goto err;
-	ep->num_out++;
-	return 0;
-err:
-	util_buf_release(ep->tx_pkt_pool, pkt_meta);
-	return ret;
-}
-
-int rxd_ep_reply_nack(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
-		    uint32_t seg_no, uint64_t rx_key,
-		    uint64_t source, fi_addr_t dest)
-{
-	ssize_t ret;
-	struct rxd_pkt_meta *pkt_meta;
-	struct rxd_pkt_data *pkt;
-
-	pkt_meta = rxd_tx_pkt_acquire(ep);
-	if (!pkt_meta)
-		return -FI_ENOMEM;
+	rx_entry = (rx_key != UINT64_MAX) ? &ep->rx_entry_fs->buf[rx_key] : NULL;
 
 	pkt = (struct rxd_pkt_data *)pkt_meta->pkt_data;
-	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_nack, 0, seg_no,
-			   in_ctrl->msg_id, rx_key, source);
+	rxd_init_ctrl_hdr(&pkt->ctrl, type, seg_size,
+			  rx_entry ? rx_entry->exp_seg_no : 0,
+			  in_ctrl->msg_id, rx_key, source);
 
-	RXD_PKT_MARK_REMOTE_ACK(pkt_meta);
-	pkt_meta->us_stamp = fi_gettime_us();
-	ret = fi_send(ep->dg_ep, pkt, RXD_DATA_PKT_SZ,
-		      rxd_mr_desc(pkt_meta->mr, ep),
-		      dest, &pkt_meta->context);
-	if (ret)
-		goto err;
-	ep->num_out++;
-	return 0;
-err:
-	util_buf_release(ep->tx_pkt_pool, pkt_meta);
-	return ret;
-}
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "sending ack [%p] - segno: %d, window: %d\n",
+		pkt->ctrl.msg_id, pkt->ctrl.seg_no, pkt->ctrl.seg_size);
 
-int rxd_ep_reply_discard(struct rxd_ep *ep, struct ofi_ctrl_hdr *in_ctrl,
-		       uint32_t seg_no, uint64_t rx_key,
-		       uint64_t source, fi_addr_t dest)
-{
-	ssize_t ret;
-	struct rxd_pkt_meta *pkt_meta;
-	struct rxd_pkt_data *pkt;
-
-	pkt_meta = rxd_tx_pkt_acquire(ep);
-	if (!pkt_meta)
-		return -FI_ENOMEM;
-
-	pkt = (struct rxd_pkt_data *)pkt_meta->pkt_data;
-	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_discard, 0, seg_no,
-			   in_ctrl->msg_id, rx_key, source);
-
-	RXD_PKT_MARK_REMOTE_ACK(pkt_meta);
-	pkt_meta->us_stamp = fi_gettime_us();
-	ret = fi_send(ep->dg_ep, pkt, RXD_DATA_PKT_SZ,
+	pkt_meta->flags = RXD_NOT_ACKED;
+	ret = fi_send(ep->dg_ep, pkt, sizeof(struct rxd_pkt_data),
 		      rxd_mr_desc(pkt_meta->mr, ep),
 		      dest, &pkt_meta->context);
 	if (ret)
-		goto err;
-	ep->num_out++;
-	return 0;
-err:
-	util_buf_release(ep->tx_pkt_pool, pkt_meta);
+		util_buf_release(ep->tx_pkt_pool, pkt_meta);
+
 	return ret;
 }
 
 #define RXD_TX_ENTRY_ID(ep, tx_entry) (tx_entry - &ep->tx_entry_fs->buf[0])
 
-void rxd_ep_init_start_hdr(struct rxd_ep *ep, struct rxd_peer *peer,
-			   uint8_t op, struct rxd_tx_entry *tx_entry,
-			   struct rxd_pkt_data_start *pkt, uint32_t flags,
-			   uint64_t *msg_sz, uint64_t *data_sz)
+static void rxd_ep_init_start_pkt(struct rxd_ep *ep, struct rxd_peer *peer,
+				  uint8_t op, struct rxd_tx_entry *tx_entry,
+				  struct rxd_pkt_data_start *pkt, uint32_t flags)
 {
-	size_t curr_offset, i, iov_sz;
-	struct ofi_rma_iov rma_iov;
+	uint64_t msg_size, iov_size;
+	uint16_t seg_size;
 
-	switch(op) {
+	switch (op) {
 	case ofi_op_msg:
-		*msg_sz = rxd_get_msg_len(tx_entry->msg.msg_iov, tx_entry->msg.msg.iov_count);
-		*data_sz = MIN(RXD_MAX_STRT_DATA_PKT_SZ(ep), *msg_sz);
-		rxd_init_op_hdr(&pkt->op, tx_entry->msg.msg.data, *msg_sz, 0, op, 0, flags);
-		tx_entry->done = rxd_ep_copy_iov_buf(tx_entry->msg.msg_iov,
-						     tx_entry->msg.msg.iov_count,
-						     pkt->data, *data_sz, 0, RXD_COPY_IOV_TO_BUF);
+		msg_size = ofi_total_iov_len(tx_entry->msg.msg_iov,
+					     tx_entry->msg.msg.iov_count);
+		seg_size = rxd_ep_start_seg_size(ep, msg_size);
+		rxd_init_op_hdr(&pkt->op, tx_entry->msg.msg.data, msg_size, 0,
+				op, 0, flags);
 		break;
-
 	case ofi_op_tagged:
-		*msg_sz = rxd_get_msg_len(tx_entry->tmsg.msg_iov, tx_entry->tmsg.tmsg.iov_count);
-		*data_sz = MIN(RXD_MAX_STRT_DATA_PKT_SZ(ep), *msg_sz);
-		rxd_init_op_hdr(&pkt->op, tx_entry->tmsg.tmsg.data, *msg_sz, 0, op,
-				 tx_entry->tmsg.tmsg.tag, flags);
-		tx_entry->done = rxd_ep_copy_iov_buf(tx_entry->tmsg.msg_iov,
-						     tx_entry->tmsg.tmsg.iov_count,
-						     pkt->data, *data_sz, 0, RXD_COPY_IOV_TO_BUF);
+		msg_size = ofi_total_iov_len(tx_entry->tmsg.msg_iov,
+					     tx_entry->tmsg.tmsg.iov_count);
+		seg_size = rxd_ep_start_seg_size(ep, msg_size);
+		rxd_init_op_hdr(&pkt->op, tx_entry->tmsg.tmsg.data, msg_size, 0,
+				op, tx_entry->tmsg.tmsg.tag, flags);
 		break;
-
 	case ofi_op_write:
-		*msg_sz = rxd_get_msg_len(tx_entry->write.msg.msg_iov, tx_entry->write.msg.iov_count);
-		iov_sz = sizeof(struct ofi_rma_iov) * tx_entry->write.msg.rma_iov_count;
-		*data_sz = MIN(RXD_MAX_STRT_DATA_PKT_SZ(ep), *msg_sz);
-		*data_sz -= iov_sz;
-
-		rxd_init_op_hdr(&pkt->op, tx_entry->write.msg.data, *msg_sz, 0, op, 0, flags);
+		msg_size = ofi_total_iov_len(tx_entry->write.msg.msg_iov,
+					     tx_entry->write.msg.iov_count);
+		iov_size = rxd_copy_rma_iov((struct ofi_rma_iov *) pkt->data,
+					    tx_entry->write.dst_iov,
+					    tx_entry->write.msg.rma_iov_count);
+		seg_size = MIN(rxd_ep_domain(ep)->max_mtu_sz -
+			       sizeof(struct rxd_pkt_data_start) - iov_size, msg_size);
+		rxd_init_op_hdr(&pkt->op, tx_entry->write.msg.data, msg_size, 0,
+				op, 0, flags);
 		pkt->op.iov_count = tx_entry->write.msg.rma_iov_count;
-
-		curr_offset = 0;
-		for (i = 0; i < pkt->op.iov_count; i++) {
-			rma_iov.addr = tx_entry->write.dst_iov[i].addr;
-			rma_iov.len = tx_entry->write.dst_iov[i].len;
-			rma_iov.key = tx_entry->write.dst_iov[i].key;
-			memcpy(pkt->data + curr_offset, &rma_iov, sizeof(struct ofi_rma_iov));
-			curr_offset += sizeof(struct ofi_rma_iov);
-		}
-		tx_entry->done = rxd_ep_copy_iov_buf(tx_entry->write.msg.msg_iov,
-						     tx_entry->write.msg.iov_count,
-						     pkt->data + curr_offset, *data_sz, 0,
-						     RXD_COPY_IOV_TO_BUF);
-		*data_sz = tx_entry->done + iov_sz;
 		break;
-
 	case ofi_op_read_req:
-		*msg_sz = rxd_get_msg_len(tx_entry->read_req.msg.msg_iov,
-					  tx_entry->read_req.msg.iov_count);
-
-		rxd_init_op_hdr(&pkt->op, tx_entry->read_req.msg.data, *msg_sz,
+		msg_size = ofi_total_iov_len(tx_entry->read_req.msg.msg_iov,
+					     tx_entry->read_req.msg.iov_count);
+		iov_size = rxd_copy_rma_iov((struct ofi_rma_iov *) pkt->data,
+					    tx_entry->read_req.src_iov,
+					    tx_entry->read_req.msg.rma_iov_count);
+		seg_size = 0;
+		rxd_init_op_hdr(&pkt->op, tx_entry->read_req.msg.data, msg_size,
 				0, op, 0, flags);
 		pkt->op.iov_count = tx_entry->read_req.msg.rma_iov_count;
-
-		tx_entry->done = 0;
-		curr_offset = 0;
-		*data_sz = 0;
-		for (i = 0; i < pkt->op.iov_count; i++) {
-			rma_iov.addr = tx_entry->read_req.src_iov[i].addr;
-			rma_iov.len = tx_entry->read_req.src_iov[i].len;
-			rma_iov.key = tx_entry->read_req.src_iov[i].key;
-			memcpy(pkt->data + curr_offset, &rma_iov, sizeof(struct ofi_rma_iov));
-			curr_offset += sizeof(struct ofi_rma_iov);
-		}
-		*data_sz += curr_offset;
-		assert(*data_sz <= RXD_MAX_STRT_DATA_PKT_SZ(ep));
 		break;
-
 	case ofi_op_read_rsp:
-		*msg_sz = rxd_get_msg_len(tx_entry->read_rsp.src_iov,
-					  tx_entry->read_rsp.iov_count);
-		*data_sz = MIN(RXD_MAX_STRT_DATA_PKT_SZ(ep), *msg_sz);
-
-		rxd_init_op_hdr(&pkt->op, 0, *msg_sz, 0, op, 0, flags);
+		msg_size = ofi_total_iov_len(tx_entry->read_rsp.src_iov,
+					     tx_entry->read_rsp.iov_count);
+		seg_size = rxd_ep_start_seg_size(ep, msg_size);
+		rxd_init_op_hdr(&pkt->op, 0, msg_size, 0, op, 0, flags);
 		pkt->op.remote_idx = tx_entry->read_rsp.peer_msg_id;
-
-		tx_entry->done = rxd_ep_copy_iov_buf(tx_entry->read_rsp.src_iov,
-						     tx_entry->read_rsp.iov_count,
-						     pkt->data, *data_sz, 0,
-						     RXD_COPY_IOV_TO_BUF);
 		break;
-
 	default:
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "invalid op-type\n", op);
+		seg_size = 0;
+		assert(0);
 	}
+
+	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_start_data, seg_size, 0,
+			   tx_entry->msg_id, peer->conn_data,
+			   peer->conn_data);
+	/* copy op header here because it is used in ep_copy_data call */
+	tx_entry->op_hdr = pkt->op;
+	tx_entry->bytes_sent = rxd_ep_copy_data(tx_entry, pkt->data,
+						seg_size);
+	tx_entry->seg_no++;
+	assert(tx_entry->bytes_sent == seg_size);
 }
 
-ssize_t rxd_ep_post_start_msg(struct rxd_ep *ep, struct rxd_peer *peer,
-			      uint8_t op, struct rxd_tx_entry *tx_entry)
+ssize_t rxd_ep_start_xfer(struct rxd_ep *ep, struct rxd_peer *peer,
+			  uint8_t op, struct rxd_tx_entry *tx_entry)
 {
-	ssize_t ret;
-	uint32_t flags;
-	uint64_t msg_sz;
-	uint64_t data_sz;
 	struct rxd_pkt_meta *pkt_meta;
 	struct rxd_pkt_data_start *pkt;
+	uint32_t flags;
+	ssize_t ret;
 
-	pkt_meta = rxd_tx_pkt_acquire(ep);
+	pkt_meta = rxd_tx_pkt_alloc(ep);
 	if (!pkt_meta)
 		return -FI_ENOMEM;
 
-	pkt = (struct rxd_pkt_data_start *)pkt_meta->pkt_data;
-	flags = rxd_prepare_tx_flags(tx_entry->flags);
-	tx_entry->msg_id = RXD_TX_ID(peer->nxt_msg_id, RXD_TX_ENTRY_ID(ep, tx_entry));
+	pkt_meta->tx_entry = tx_entry;
+	pkt = (struct rxd_pkt_data_start *) pkt_meta->pkt_data;
+	flags = rxd_map_fi_flags(tx_entry->flags);
+	tx_entry->msg_id = RXD_TX_ID(peer->nxt_msg_id,
+				     RXD_TX_ENTRY_ID(ep, tx_entry));
 
-	rxd_ep_init_start_hdr(ep, peer, op, tx_entry, pkt, flags, &msg_sz, &data_sz);
-	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_start_data, data_sz, 0,
-			   tx_entry->msg_id, peer->conn_data, peer->conn_data);
-	tx_entry->nxt_seg_no = 1;
-	tx_entry->op_hdr = pkt->op;
-	tx_entry->win_sz = 0;
+	rxd_ep_init_start_pkt(ep, peer, op, tx_entry, pkt, flags);
 
-	pkt_meta->tx_entry = tx_entry;
-	pkt_meta->type = (tx_entry->op_hdr.size == tx_entry->done) ?
-		RXD_PKT_LAST : RXD_PKT_DATA;
+	if (tx_entry->op_hdr.size == pkt->ctrl.seg_size)
+		pkt_meta->flags |= RXD_PKT_LAST;
 
-	pkt_meta->us_stamp = fi_gettime_us();
-	ret = fi_send(ep->dg_ep, pkt, data_sz + RXD_START_DATA_PKT_SZ,
+	ret = fi_send(ep->dg_ep, pkt, sizeof(*pkt) + pkt->ctrl.seg_size,
 		      rxd_mr_desc(pkt_meta->mr, ep),
 		      tx_entry->peer, &pkt_meta->context);
-	if (ret)
-		goto err;
+	if (ret) {
+		FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "send %d failed\n",
+		       pkt->ctrl.seg_no);
+	}
 
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "sent start %p, %d\n",
-		pkt->ctrl.msg_id, pkt->ctrl.seg_no);
+	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "start msg %p, size: %ld\n",
+	       pkt->ctrl.msg_id, tx_entry->op_hdr.size);
+	rxd_set_timeout(tx_entry);
 	dlist_insert_tail(&pkt_meta->entry, &tx_entry->pkt_list);
+	dlist_insert_tail(&tx_entry->entry, &ep->tx_entry_list);
 	peer->nxt_msg_id++;
-	ep->num_out++;
-	tx_entry->num_unacked++;
-	return 0;
-err:
-	util_buf_release(ep->tx_pkt_pool, pkt_meta);
-	return ret;
-}
-
-uint64_t rxd_find_av_index(struct rxd_av *av, uint64_t start_idx,
-			    const void *addr, size_t addrlen, int *p_found)
-{
-	void *tmp_addr;
-	uint64_t idx = 0, count;
-	size_t tmp_addrlen;
 
-	if (p_found)
-		*p_found = 0;
-
-	tmp_addr = calloc(1, addrlen);
-	if (!tmp_addr)
-		return 0;
-
-	for (idx = start_idx, count = 0; count < av->dg_av_used;
-	     count++, idx = (idx+1) % av->dg_av_used) {
-		tmp_addrlen = addrlen;
-		if (fi_av_lookup(av->dg_av, idx, tmp_addr, &tmp_addrlen)) {
-			idx = 0;
-			goto out;
-		}
-
-		if (addrlen == tmp_addrlen &&
-		    memcmp(tmp_addr, addr, addrlen) == 0) {
-			if (p_found)
-				*p_found = 1;
-			goto out;
-		}
-	}
-out:
-	free(tmp_addr);
-	return idx;
+	return 0;
 }
 
-ssize_t rxd_ep_post_conn_msg(struct rxd_ep *ep, struct rxd_peer *peer,
-			     fi_addr_t addr)
+ssize_t rxd_ep_connect(struct rxd_ep *ep, struct rxd_peer *peer, fi_addr_t addr)
 {
-	ssize_t ret;
-	size_t addrlen;
-	uint16_t data_sz;
 	struct rxd_pkt_data *pkt;
 	struct rxd_pkt_meta *pkt_meta;
 	struct rxd_tx_entry *tx_entry;
+	size_t addrlen;
+	ssize_t ret;
 
-	if (peer->conn_initiated)
-		return 0;
+	if (peer->state != CMAP_IDLE)
+		return -FI_EALREADY;
 
-	tx_entry = rxd_tx_entry_acquire(ep, peer);
+	tx_entry = rxd_tx_entry_alloc(ep, peer, addr, 0, RXD_TX_CONN);
 	if (!tx_entry)
 		return -FI_EAGAIN;
 
-	dlist_init(&tx_entry->pkt_list);
-	tx_entry->op_type = RXD_TX_CONN;
-	tx_entry->peer = addr;
-	tx_entry->win_sz = 0;
-
-	pkt_meta = rxd_tx_pkt_acquire(ep);
+	pkt_meta = rxd_tx_pkt_alloc(ep);
 	if (!pkt_meta) {
-		rxd_tx_entry_release(ep, tx_entry);
+		rxd_tx_entry_free(ep, tx_entry);
 		return -FI_ENOMEM;
 	}
 
-	pkt = (struct rxd_pkt_data *)pkt_meta->pkt_data;
-	addrlen = RXD_MAX_DATA_PKT_SZ(ep);
+	pkt = (struct rxd_pkt_data *) pkt_meta->pkt_data;
+	addrlen = RXD_MAX_DGRAM_ADDR;
 	ret = fi_getname(&ep->dg_ep->fid, pkt->data, &addrlen);
-	assert(ret == 0);
-	data_sz = (uint16_t) addrlen;
-	tx_entry->msg_id = RXD_TX_ID(peer->nxt_msg_id, RXD_TX_ENTRY_ID(ep, tx_entry));
+	if (ret)
+		goto err;
 
-	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_connreq, data_sz, 0,
-			   tx_entry->msg_id, ep->conn_data, addr);
+	tx_entry->msg_id = RXD_TX_ID(peer->nxt_msg_id,
+				     RXD_TX_ENTRY_ID(ep, tx_entry));
+	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_connreq, (uint16_t) addrlen, 0,
+			   tx_entry->msg_id, rxd_ep_conn_data(ep), addr);
 
-	pkt_meta->us_stamp = fi_gettime_us();
-	ret = fi_send(ep->dg_ep, pkt, data_sz + RXD_DATA_PKT_SZ,
+	ret = fi_send(ep->dg_ep, pkt, addrlen + sizeof(struct rxd_pkt_data),
 		      rxd_mr_desc(pkt_meta->mr, ep),
 		      addr, &pkt_meta->context);
 	if (ret)
 		goto err;
 
 	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "sent conn %p\n", pkt->ctrl.msg_id);
+	rxd_set_timeout(tx_entry);
 	dlist_insert_tail(&pkt_meta->entry, &tx_entry->pkt_list);
 	dlist_insert_tail(&tx_entry->entry, &ep->tx_entry_list);
 	peer->nxt_msg_id++;
-	ep->num_out++;
-	peer->conn_initiated = 1;
+	peer->state = CMAP_CONNREQ_SENT;
 	return 0;
 err:
-	rxd_tx_entry_release(ep, tx_entry);
+	rxd_tx_entry_free(ep, tx_entry);
 	util_buf_release(ep->tx_pkt_pool, pkt_meta);
 	return ret;
 }
 
-struct rxd_tx_entry *rxd_tx_entry_acquire_fast(struct rxd_ep *ep, struct rxd_peer *peer)
-{
-	struct rxd_tx_entry *tx_entry;
-	if (freestack_isempty(ep->tx_entry_fs)) {
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "no-more tx entries\n");
-		return NULL;
-	}
-
-	peer->num_msg_out++;
-	tx_entry = freestack_pop(ep->tx_entry_fs);
-	tx_entry->num_unacked = 0;
-	tx_entry->is_waiting = 0;
-	dlist_init(&tx_entry->entry);
-	return tx_entry;
-}
-
-struct rxd_tx_entry *rxd_tx_entry_acquire(struct rxd_ep *ep, struct rxd_peer *peer)
-{
-	return (peer->num_msg_out == RXD_MAX_OUT_TX_MSG) ? NULL :
-		rxd_tx_entry_acquire_fast(ep, peer);
-}
-
-void rxd_tx_entry_release(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry)
-{
-	struct rxd_peer *peer;
-
-	peer = rxd_ep_getpeer_info(ep, tx_entry->peer);
-	peer->num_msg_out--;
-	dlist_remove(&tx_entry->entry);
-	freestack_push(ep->tx_entry_fs, tx_entry);
-}
-
-void rxd_ep_copy_msg_iov(const struct iovec *src_iov,
-			 struct iovec *dst_iov, size_t iov_count)
-{
-	size_t i;
-	for (i = 0; i < iov_count; i++)
-		dst_iov[i] = src_iov[i];
-}
-
-void rxd_ep_copy_rma_iov(const struct fi_rma_iov *src_iov,
-			 struct fi_rma_iov *dst_iov, size_t iov_count)
-{
-	size_t i;
-	for (i = 0; i < iov_count; i++)
-		dst_iov[i] = src_iov[i];
-}
-
 static ssize_t rxd_ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 			       uint64_t flags)
 {
-	ssize_t ret;
-	uint64_t peer_addr;
 	struct rxd_ep *rxd_ep;
 	struct rxd_peer *peer;
 	struct rxd_tx_entry *tx_entry;
-	rxd_ep = container_of(ep, struct rxd_ep, ep);
+	fi_addr_t peer_addr;
+	ssize_t ret;
 
-	peer_addr = rxd_av_get_dg_addr(rxd_ep->av, msg->addr);
+	rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid.fid);
+
+	peer_addr = rxd_av_dg_addr(rxd_ep_av(rxd_ep), msg->addr);
 	peer = rxd_ep_getpeer_info(rxd_ep, peer_addr);
 
-	rxd_ep_lock_if_required(rxd_ep);
-	if (!peer->addr_published) {
-		ret = rxd_ep_post_conn_msg(rxd_ep, peer, peer_addr);
-		ret = (ret) ? ret : -FI_EAGAIN;
-		goto out;
+	fastlock_acquire(&rxd_ep->lock);
+	if (peer->state != CMAP_CONNECTED) {
+		ret = rxd_ep_connect(rxd_ep, peer, peer_addr);
+		fastlock_release(&rxd_ep->lock);
+		if (ret == -FI_EALREADY) {
+			rxd_ep->util_ep.progress(&rxd_ep->util_ep);
+			ret = -FI_EAGAIN;
+		}
+		return ret ? ret : -FI_EAGAIN;
 	}
 
-	tx_entry = rxd_tx_entry_acquire(rxd_ep, peer);
+	tx_entry = rxd_tx_entry_alloc(rxd_ep, peer, peer_addr, flags,
+				      RXD_TX_MSG);
 	if (!tx_entry) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	dlist_init(&tx_entry->pkt_list);
-	tx_entry->op_type = RXD_TX_MSG;
 	tx_entry->msg.msg = *msg;
-	tx_entry->flags = flags;
-	tx_entry->peer = peer_addr;
-	rxd_ep_copy_msg_iov(msg->msg_iov, &tx_entry->msg.msg_iov[0], msg->iov_count);
-
-	ret = rxd_ep_post_start_msg(rxd_ep, peer, ofi_op_msg, tx_entry);
+	memcpy(&tx_entry->msg.msg_iov[0], msg->msg_iov,
+	       sizeof(*msg->msg_iov) * msg->iov_count);
+	ret = rxd_ep_start_xfer(rxd_ep, peer, ofi_op_msg, tx_entry);
 	if (ret)
-		goto err;
+		rxd_tx_entry_free(rxd_ep, tx_entry);
 
-	dlist_insert_tail(&tx_entry->entry, &rxd_ep->tx_entry_list);
 out:
-	rxd_ep_unlock_if_required(rxd_ep);
+	fastlock_release(&rxd_ep->lock);
 	return ret;
-err:
-	rxd_tx_entry_release(rxd_ep, tx_entry);
-	goto out;
-}
-
-static ssize_t rxd_ep_send(struct fid_ep *ep, const void *buf, size_t len, void *desc,
-			    fi_addr_t dest_addr, void *context)
-{
-	struct fi_msg msg;
-	struct iovec msg_iov;
-	memset(&msg, 0, sizeof(msg));
-	msg_iov.iov_base = (void *) buf;
-	msg_iov.iov_len = len;
-	msg.msg_iov = &msg_iov;
-	msg.desc = &desc;
-	msg.iov_count = 1;
-	msg.addr = dest_addr;
-	msg.context = context;
-
-	return rxd_ep_sendmsg(ep, &msg, RXD_USE_OP_FLAGS);
 }
 
 static ssize_t rxd_ep_sendv(struct fid_ep *ep, const struct iovec *iov, void **desc,
-			     size_t count, fi_addr_t dest_addr, void *context)
+			    size_t count, fi_addr_t dest_addr, void *context)
 {
 	struct fi_msg msg;
+
 	memset(&msg, 0, sizeof(msg));
 	msg.msg_iov = iov;
 	msg.desc = desc;
 	msg.iov_count = count;
 	msg.addr = dest_addr;
 	msg.context = context;
+
 	return rxd_ep_sendmsg(ep, &msg, RXD_USE_OP_FLAGS);
 }
 
-static ssize_t	rxd_ep_inject(struct fid_ep *ep, const void *buf, size_t len,
-			       fi_addr_t dest_addr)
+static ssize_t rxd_ep_send(struct fid_ep *ep, const void *buf, size_t len, void *desc,
+			   fi_addr_t dest_addr, void *context)
+{
+	struct iovec iov;
+
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxd_ep_sendv(ep, &iov, desc, 1, dest_addr, context);
+}
+
+static ssize_t rxd_ep_inject(struct fid_ep *ep, const void *buf, size_t len,
+			     fi_addr_t dest_addr)
 {
 	struct fi_msg msg;
 	struct iovec msg_iov;
@@ -1088,8 +865,8 @@ static ssize_t rxd_ep_senddata(struct fid_ep *ep, const void *buf, size_t len, v
 	return rxd_ep_sendmsg(ep, &msg, FI_REMOTE_CQ_DATA | RXD_USE_OP_FLAGS);
 }
 
-static ssize_t	rxd_ep_injectdata(struct fid_ep *ep, const void *buf, size_t len,
-				   uint64_t data, fi_addr_t dest_addr)
+static ssize_t rxd_ep_injectdata(struct fid_ep *ep, const void *buf, size_t len,
+				 uint64_t data, fi_addr_t dest_addr)
 {
 	struct fi_msg msg;
 	struct iovec msg_iov;
@@ -1134,11 +911,14 @@ static int rxd_peek_trecv(struct dlist_entry *item, const void *arg)
 }
 
 static void rxd_trx_discard_recv(struct rxd_ep *ep,
-				  struct rxd_rx_entry *rx_entry)
+				 struct rxd_rx_entry *rx_entry)
 {
 	struct rxd_rx_buf *rx_buf;
 	struct ofi_ctrl_hdr *ctrl;
+	struct rxd_pkt_meta *pkt_meta;
+	struct rxd_pkt_data *pkt;
 	struct rxd_peer *peer;
+	ssize_t ret;
 
 	rx_buf = rx_entry->unexp_buf;
 	ctrl = (struct ofi_ctrl_hdr *) rx_buf->buf;
@@ -1147,8 +927,23 @@ static void rxd_trx_discard_recv(struct rxd_ep *ep,
 	dlist_remove(&rx_entry->unexp_entry);
 	ep->num_unexp_msg--;
 
-	rxd_ep_reply_discard(ep, ctrl, 0, ctrl->rx_key, peer->conn_data, ctrl->conn_id);
-	rxd_rx_entry_release(ep, rx_entry);
+	pkt_meta = rxd_tx_pkt_alloc(ep);
+	if (!pkt_meta)
+		goto out;
+
+	pkt = (struct rxd_pkt_data *) pkt_meta->pkt_data;
+	rxd_init_ctrl_hdr(&pkt->ctrl, ofi_ctrl_discard, 0, 0,
+			   ctrl->msg_id, ctrl->rx_key, peer->conn_data);
+
+	pkt_meta->flags = RXD_NOT_ACKED;
+	ret = fi_send(ep->dg_ep, pkt, sizeof(struct rxd_pkt_data),
+		      rxd_mr_desc(pkt_meta->mr, ep),
+		      peer->fiaddr, &pkt_meta->context);
+	if (ret)
+		util_buf_release(ep->tx_pkt_pool, pkt_meta);
+
+out:
+	rxd_rx_entry_free(ep, rx_entry);
 	rxd_ep_repost_buff(rx_buf);
 }
 
@@ -1169,7 +964,7 @@ static ssize_t rxd_trx_peek_recv(struct rxd_ep *ep,
 		err_entry.tag = msg->tag;
 		err_entry.err = FI_ENOMSG;
 		err_entry.prov_errno = -FI_ENOMSG;
-		rxd_cq_report_error(ep->rx_cq, &err_entry);
+		rxd_cq_report_error(rxd_ep_rx_cq(ep), &err_entry);
 		return 0;
 	}
 
@@ -1189,14 +984,14 @@ static ssize_t rxd_trx_peek_recv(struct rxd_ep *ep,
 		rxd_trx_discard_recv(ep, rx_entry);
 	}
 
-	ep->rx_cq->write_fn(ep->rx_cq, &cq_entry);
+	rxd_ep_rx_cq(ep)->write_fn(rxd_ep_rx_cq(ep), &cq_entry);
 	return 0;
 }
 
-ssize_t rxd_trx_claim_recv(struct rxd_ep *ep, const struct fi_msg_tagged *msg,
-			    uint64_t flags)
+static ssize_t rxd_trx_claim_recv(struct rxd_ep *ep,
+				  const struct fi_msg_tagged *msg, uint64_t flags)
 {
-	int ret = 0, i;
+	size_t i;
 	struct fi_context *context;
 	struct rxd_rx_entry *rx_entry;
 	struct rxd_trecv_entry *trecv_entry;
@@ -1205,15 +1000,12 @@ ssize_t rxd_trx_claim_recv(struct rxd_ep *ep, const struct fi_msg_tagged *msg,
 	struct ofi_ctrl_hdr *ctrl;
 	struct rxd_pkt_data_start *pkt_start;
 
-	rxd_ep_lock_if_required(ep);
-	if (freestack_isempty(ep->trecv_fs)) {
-		ret = -FI_EAGAIN;
-		goto out;
-	}
+	if (freestack_isempty(ep->trecv_fs))
+		return -FI_EAGAIN;
 
 	trecv_entry = freestack_pop(ep->trecv_fs);
 	trecv_entry->msg = *msg;
-	trecv_entry->msg.addr = (ep->caps & FI_DIRECTED_RECV) ?
+	trecv_entry->msg.addr = (ep->util_ep.caps & FI_DIRECTED_RECV) ?
 		msg->addr : FI_ADDR_UNSPEC;
 	trecv_entry->flags = flags;
 	for (i = 0; i < msg->iov_count; i++) {
@@ -1235,20 +1027,19 @@ ssize_t rxd_trx_claim_recv(struct rxd_ep *ep, const struct fi_msg_tagged *msg,
 	rxd_ep_handle_data_msg(ep, peer, rx_entry, rx_entry->trecv->iov,
 			     rx_entry->trecv->msg.iov_count, ctrl,
 			     pkt_start->data, rx_buf);
-out:
-	rxd_ep_unlock_if_required(ep);
-	return ret;
+	return 0;
 }
 
-ssize_t rxd_ep_trecvmsg(struct fid_ep *ep, const struct fi_msg_tagged *msg,
-			 uint64_t flags)
+static ssize_t rxd_ep_trecvmsg(struct fid_ep *ep, const struct fi_msg_tagged *msg,
+			       uint64_t flags)
 {
-	ssize_t ret = 0, i;
+	ssize_t ret = 0;
+	size_t i;
 	struct rxd_ep *rxd_ep;
 	struct rxd_trecv_entry *trecv_entry;
 
-	rxd_ep = container_of(ep, struct rxd_ep, ep);
-	rxd_ep_lock_if_required(rxd_ep);
+	rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid.fid);
+	fastlock_acquire(&rxd_ep->lock);
 
 	if (flags & FI_PEEK) {
 		ret = rxd_trx_peek_recv(rxd_ep, msg, flags);
@@ -1265,7 +1056,7 @@ ssize_t rxd_ep_trecvmsg(struct fid_ep *ep, const struct fi_msg_tagged *msg,
 
 	trecv_entry = freestack_pop(rxd_ep->trecv_fs);
 	trecv_entry->msg = *msg;
-	trecv_entry->msg.addr = (rxd_ep->caps & FI_DIRECTED_RECV) ?
+	trecv_entry->msg.addr = (rxd_ep->util_ep.caps & FI_DIRECTED_RECV) ?
 		msg->addr : FI_ADDR_UNSPEC;
 	trecv_entry->flags = flags;
 	for (i = 0; i < msg->iov_count; i++) {
@@ -1281,7 +1072,7 @@ ssize_t rxd_ep_trecvmsg(struct fid_ep *ep, const struct fi_msg_tagged *msg,
 		rxd_ep_check_unexp_tag_list(rxd_ep, trecv_entry);
 	}
 out:
-	rxd_ep_unlock_if_required(rxd_ep);
+	fastlock_release(&rxd_ep->lock);
 	return ret;
 }
 
@@ -1304,12 +1095,13 @@ static ssize_t rxd_ep_trecv(struct fid_ep *ep, void *buf, size_t len, void *desc
 	msg.tag = tag;
 	msg.ignore = ignore;
 	msg.data = 0;
+
 	return rxd_ep_trecvmsg(ep, &msg, RXD_USE_OP_FLAGS);
 }
 
-ssize_t rxd_ep_trecvv(struct fid_ep *ep, const struct iovec *iov, void **desc,
-		       size_t count, fi_addr_t src_addr,
-		       uint64_t tag, uint64_t ignore, void *context)
+static ssize_t rxd_ep_trecvv(struct fid_ep *ep, const struct iovec *iov,
+			     void **desc, size_t count, fi_addr_t src_addr,
+			     uint64_t tag, uint64_t ignore, void *context)
 {
 	struct fi_msg_tagged msg;
 
@@ -1322,57 +1114,57 @@ ssize_t rxd_ep_trecvv(struct fid_ep *ep, const struct iovec *iov, void **desc,
 	msg.tag = tag;
 	msg.ignore = ignore;
 	msg.data = 0;
+
 	return rxd_ep_trecvmsg(ep, &msg, RXD_USE_OP_FLAGS);
 }
 
-ssize_t rxd_ep_tsendmsg(struct fid_ep *ep, const struct fi_msg_tagged *msg,
-			 uint64_t flags)
+static ssize_t rxd_ep_tsendmsg(struct fid_ep *ep, const struct fi_msg_tagged *msg,
+			       uint64_t flags)
 {
-	ssize_t ret;
-	uint64_t peer_addr;
 	struct rxd_ep *rxd_ep;
 	struct rxd_peer *peer;
 	struct rxd_tx_entry *tx_entry;
-	rxd_ep = container_of(ep, struct rxd_ep, ep);
+	uint64_t peer_addr;
+	ssize_t ret;
 
-	peer_addr = rxd_av_get_dg_addr(rxd_ep->av, msg->addr);
+	rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid.fid);
+
+	peer_addr = rxd_av_dg_addr(rxd_ep_av(rxd_ep), msg->addr);
 	peer = rxd_ep_getpeer_info(rxd_ep, peer_addr);
 
-	rxd_ep_lock_if_required(rxd_ep);
-	if (!peer->addr_published) {
-		ret = rxd_ep_post_conn_msg(rxd_ep, peer, peer_addr);
-		ret = (ret) ? ret : -FI_EAGAIN;
-		goto out;
+	fastlock_acquire(&rxd_ep->lock);
+	if (peer->state != CMAP_CONNECTED) {
+		ret = rxd_ep_connect(rxd_ep, peer, peer_addr);
+		fastlock_release(&rxd_ep->lock);
+		if (ret == -FI_EALREADY) {
+			rxd_ep->util_ep.progress(&rxd_ep->util_ep);
+			ret = -FI_EAGAIN;
+		}
+		return ret ? ret : -FI_EAGAIN;
 	}
 
-	tx_entry = rxd_tx_entry_acquire(rxd_ep, peer);
+	tx_entry = rxd_tx_entry_alloc(rxd_ep, peer, peer_addr, flags,
+				      RXD_TX_TAG);
 	if (!tx_entry) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	dlist_init(&tx_entry->pkt_list);
-	tx_entry->op_type = RXD_TX_TAG;
 	tx_entry->tmsg.tmsg = *msg;
-	tx_entry->flags = flags;
-	tx_entry->peer = peer_addr;
-	rxd_ep_copy_msg_iov(msg->msg_iov, &tx_entry->tmsg.msg_iov[0], msg->iov_count);
-
-	ret = rxd_ep_post_start_msg(rxd_ep, peer, ofi_op_tagged, tx_entry);
+	memcpy(&tx_entry->tmsg.msg_iov[0], msg->msg_iov,
+	       sizeof(*msg->msg_iov) * msg->iov_count);
+	ret = rxd_ep_start_xfer(rxd_ep, peer, ofi_op_tagged, tx_entry);
 	if (ret)
-		goto err;
+		rxd_tx_entry_free(rxd_ep, tx_entry);
 
-	dlist_insert_tail(&tx_entry->entry, &rxd_ep->tx_entry_list);
 out:
-	rxd_ep_unlock_if_required(rxd_ep);
+	fastlock_release(&rxd_ep->lock);
 	return ret;
-err:
-	rxd_tx_entry_release(rxd_ep, tx_entry);
-	goto out;
 }
 
-ssize_t rxd_ep_tsend(struct fid_ep *ep, const void *buf, size_t len, void *desc,
-		      fi_addr_t dest_addr, uint64_t tag, void *context)
+static ssize_t rxd_ep_tsend(struct fid_ep *ep, const void *buf, size_t len,
+			    void *desc, fi_addr_t dest_addr, uint64_t tag,
+			    void *context)
 {
 	struct fi_msg_tagged msg;
 	struct iovec msg_iov;
@@ -1390,8 +1182,9 @@ ssize_t rxd_ep_tsend(struct fid_ep *ep, const void *buf, size_t len, void *desc,
 	return rxd_ep_tsendmsg(ep, &msg, RXD_USE_OP_FLAGS);
 }
 
-ssize_t rxd_ep_tsendv(struct fid_ep *ep, const struct iovec *iov, void **desc,
-		       size_t count, fi_addr_t dest_addr, uint64_t tag, void *context)
+static ssize_t rxd_ep_tsendv(struct fid_ep *ep, const struct iovec *iov,
+			     void **desc, size_t count, fi_addr_t dest_addr,
+			     uint64_t tag, void *context)
 {
 	struct fi_msg_tagged msg;
 
@@ -1402,6 +1195,7 @@ ssize_t rxd_ep_tsendv(struct fid_ep *ep, const struct iovec *iov, void **desc,
 	msg.addr = dest_addr;
 	msg.context = context;
 	msg.tag = tag;
+
 	return rxd_ep_tsendmsg(ep, &msg, RXD_USE_OP_FLAGS);
 }
 
@@ -1500,18 +1294,14 @@ static int rxd_ep_close(struct fid *fid)
 	struct slist_entry *entry;
 	struct rxd_rx_buf *buf;
 
-	ep = container_of(fid, struct rxd_ep, ep.fid);
-	while (ep->num_out) {
-		rxd_cq_progress(&ep->tx_cq->util_cq);
-	}
-
+	ep = container_of(fid, struct rxd_ep, util_ep.ep_fid.fid);
 	ret = fi_close(&ep->dg_ep->fid);
 	if (ret)
 		return ret;
 
-	fastlock_acquire(&ep->domain->lock);
-	dlist_remove(&ep->dom_entry);
-	fastlock_release(&ep->domain->lock);
+	ret = fi_close(&ep->dg_cq->fid);
+	if (ret)
+		return ret;
 
 	while(!slist_empty(&ep->rx_pkt_list)) {
 		entry = slist_remove_head(&ep->rx_pkt_list);
@@ -1519,17 +1309,26 @@ static int rxd_ep_close(struct fid *fid)
 		util_buf_release(ep->rx_pkt_pool, buf);
 	}
 
-	if (ep->tx_cq)
-		atomic_dec(&ep->tx_cq->util_cq.ref);
+	if (ep->util_ep.tx_cq) {
+		/* TODO: wait handling */
+		fid_list_remove(&ep->util_ep.tx_cq->ep_list,
+				&ep->util_ep.tx_cq->ep_list_lock,
+				&ep->util_ep.ep_fid.fid);
+	}
 
-	if (ep->rx_cq)
-		atomic_dec(&ep->rx_cq->util_cq.ref);
+	if (ep->util_ep.rx_cq) {
+		if (ep->util_ep.rx_cq != ep->util_ep.tx_cq) {
+			/* TODO: wait handling */
+			fid_list_remove(&ep->util_ep.rx_cq->ep_list,
+					&ep->util_ep.rx_cq->ep_list_lock,
+					&ep->util_ep.ep_fid.fid);
+		}
+	}
 
-	atomic_dec(&ep->domain->util_domain.ref);
 	fastlock_destroy(&ep->lock);
 	rxd_ep_free_buf_pools(ep);
 	free(ep->peer_info);
-	free(ep->name);
+	ofi_endpoint_close(&ep->util_ep);
 	free(ep);
 	return 0;
 }
@@ -1543,33 +1342,30 @@ static int rxd_ep_bind_cq(struct rxd_ep *ep, struct rxd_cq *cq, uint64_t flags)
 		return -FI_EBADFLAGS;
 	}
 
-	if (((flags & FI_TRANSMIT) && ep->tx_cq) ||
-	    ((flags & FI_RECV) && ep->rx_cq)) {
+	if (((flags & FI_TRANSMIT) && rxd_ep_tx_cq(ep)) ||
+	    ((flags & FI_RECV) && rxd_ep_rx_cq(ep))) {
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "duplicate CQ binding\n");
 		return -FI_EINVAL;
 	}
 
-	if (flags & FI_TRANSMIT) {
-		if (!ep->tx_cq && !ep->rx_cq) {
-			ret = fi_ep_bind(ep->dg_ep, &cq->dg_cq->fid, FI_TRANSMIT | FI_RECV);
-		if (ret)
-			return ret;
-		}
+	ret = fid_list_insert(&cq->util_cq.ep_list,
+			      &cq->util_cq.ep_list_lock,
+			      &ep->util_ep.ep_fid.fid);
+	if (ret)
+		return ret;
 
-		ep->tx_cq = cq;
-		atomic_inc(&cq->util_cq.ref);
+	if (flags & FI_TRANSMIT) {
+		ep->util_ep.tx_cq = &cq->util_cq;
+		ofi_atomic_inc32(&cq->util_cq.ref);
+		/* TODO: wait handling */
 	}
 
 	if (flags & FI_RECV) {
-		if (!ep->tx_cq && !ep->rx_cq) {
-			ret = fi_ep_bind(ep->dg_ep, &cq->dg_cq->fid, FI_TRANSMIT | FI_RECV);
-			if (ret)
-				return ret;
-		}
-
-		ep->rx_cq = cq;
-		atomic_inc(&cq->util_cq.ref);
+		ep->util_ep.rx_cq = &cq->util_cq;
+		ofi_atomic_inc32(&cq->util_cq.ref);
+		/* TODO: wait handling */
 	}
+
 	return 0;
 }
 
@@ -1579,27 +1375,22 @@ static int rxd_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
 	struct rxd_av *av;
 	int ret = 0;
 
-	ep = container_of(ep_fid, struct rxd_ep, ep.fid);
+	ep = container_of(ep_fid, struct rxd_ep, util_ep.ep_fid.fid);
 	switch (bfid->fclass) {
 	case FI_CLASS_AV:
-		if (ep->av) {
-			FI_WARN(&rxd_prov, FI_LOG_EP_CTRL,
-				"duplicate AV binding\n");
-			return -FI_EINVAL;
-		}
 		av = container_of(bfid, struct rxd_av, util_av.av_fid.fid);
+		ret = ofi_ep_bind_av(&ep->util_ep, &av->util_av);
+		if (ret)
+			return ret;
+
 		ret = fi_ep_bind(ep->dg_ep, &av->dg_av->fid, flags);
 		if (ret)
 			return ret;
 
-		/* todo: handle case where AV is updated after binding */
-		ep->peer_info = calloc(av->size, sizeof(struct rxd_peer));
-		ep->max_peers = av->size;
-		if (!ep->peer_info) {
+		ep->peer_info = calloc(av->util_av.count, sizeof(struct rxd_peer));
+		ep->max_peers = av->util_av.count;
+		if (!ep->peer_info)
 			return -FI_ENOMEM;
-		}
-
-		ep->av = av;
 		break;
 	case FI_CLASS_CQ:
 		ret = rxd_ep_bind_cq(ep, container_of(bfid, struct rxd_cq,
@@ -1607,6 +1398,8 @@ static int rxd_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
 		break;
 	case FI_CLASS_EQ:
 		break;
+	case FI_CLASS_CNTR:
+		return ofi_ep_bind(&ep->util_ep, bfid, flags);
 	default:
 		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL,
 			"invalid fid class\n");
@@ -1623,7 +1416,7 @@ static int rxd_ep_control(struct fid *fid, int command, void *arg)
 
 	switch (command) {
 	case FI_ENABLE:
-		ep = container_of(fid, struct rxd_ep, ep.fid);
+		ep = container_of(fid, struct rxd_ep, util_ep.ep_fid.fid);
 		ret = rxd_ep_enable(ep);
 		break;
 	default:
@@ -1644,14 +1437,16 @@ static struct fi_ops rxd_ep_fi_ops = {
 static int rxd_ep_cm_setname(fid_t fid, void *addr, size_t addrlen)
 {
 	struct rxd_ep *ep;
-	ep = container_of(fid, struct rxd_ep, ep.fid);
+
+	ep = container_of(fid, struct rxd_ep, util_ep.ep_fid.fid);
 	return fi_setname(&ep->dg_ep->fid, addr, addrlen);
 }
 
 static int rxd_ep_cm_getname(fid_t fid, void *addr, size_t *addrlen)
 {
 	struct rxd_ep *ep;
-	ep = container_of(fid, struct rxd_ep, ep.fid);
+
+	ep = container_of(fid, struct rxd_ep, util_ep.ep_fid.fid);
 	return fi_getname(&ep->dg_ep->fid, addr, addrlen);
 }
 
@@ -1665,14 +1460,79 @@ struct fi_ops_cm rxd_ep_cm = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
+
+static void rxd_ep_progress(struct util_ep *util_ep)
+{
+	struct dlist_entry *tx_item, *pkt_item;
+	struct rxd_tx_entry *tx_entry;
+	struct fi_cq_msg_entry cq_entry;
+	struct rxd_pkt_meta *pkt;
+	struct rxd_ep *ep;
+	uint64_t cur_time;
+	ssize_t ret;
+	int i;
+
+	ep = container_of(util_ep, struct rxd_ep, util_ep);
+
+	fastlock_acquire(&ep->lock);
+	for(ret = 1, i = 0;
+	    ret > 0 && (!rxd_progress_spin_count || i < rxd_progress_spin_count);
+	    i++) {
+		ret = fi_cq_read(ep->dg_cq, &cq_entry, 1);
+		if (ret == -FI_EAGAIN)
+			break;
+
+		if (cq_entry.flags & FI_SEND)
+			rxd_handle_send_comp(&cq_entry);
+		else if (cq_entry.flags & FI_RECV)
+			rxd_handle_recv_comp(ep, &cq_entry);
+		else
+			assert (0);
+	}
+
+	cur_time = fi_gettime_us();
+	dlist_foreach(&ep->tx_entry_list, tx_item) {
+		tx_entry = container_of(tx_item, struct rxd_tx_entry, entry);
+
+		if (tx_entry->seg_no < tx_entry->window) {
+			rxd_tx_entry_progress(ep, tx_entry);
+		} else if ((tx_entry->retry_time > cur_time) /* &&
+			 dlist_empty(&tx_entry->pkt_list)*/ ) {
+
+			FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "Progressing waiting entry [%p]\n",
+				tx_entry->msg_id);
+
+			rxd_tx_entry_progress(ep, tx_entry);
+//			rxd_set_timeout(tx_entry);
+		}
+
+		dlist_foreach(&tx_entry->pkt_list, pkt_item) {
+			pkt = container_of(pkt_item, struct rxd_pkt_meta, entry);
+//			/* TODO: This if check is repeated.  Create a function
+//			 * to perform this check, and figure out what the check
+//			 * is actually doing with the bit-shift, multiply operation.
+//			 */
+//			if (curr_stamp > pkt->us_stamp &&
+//			    curr_stamp - pkt->us_stamp >
+//			    (((uint64_t) 1) << ((uint64_t) pkt->retries + 1)) *
+//			     RXD_RETRY_TIMEOUT) {
+//				pkt->us_stamp = curr_stamp;
+				rxd_ep_retry_pkt(ep, tx_entry, pkt);
+//			}
+		}
+	}
+	fastlock_release(&ep->lock);
+}
+
 static int rxd_buf_region_alloc_hndlr(void *pool_ctx, void *addr, size_t len,
 				void **context)
 {
 	int ret;
 	struct fid_mr *mr;
-	struct rxd_domain *domain = (struct rxd_domain *)pool_ctx;
+	struct rxd_domain *domain = pool_ctx;
 
 	ret = fi_mr_reg(domain->dg_domain, addr, len,
 			FI_SEND | FI_RECV, 0, 0, 0, &mr, NULL);
@@ -1688,20 +1548,20 @@ static void rxd_buf_region_free_hndlr(void *pool_ctx, void *context)
 int rxd_ep_create_buf_pools(struct rxd_ep *ep, struct fi_info *fi_info)
 {
 	ep->tx_pkt_pool = util_buf_pool_create_ex(
-		ep->domain->max_mtu_sz + sizeof(struct rxd_pkt_meta),
+		rxd_ep_domain(ep)->max_mtu_sz + sizeof(struct rxd_pkt_meta),
 		RXD_BUF_POOL_ALIGNMENT, 0, RXD_TX_POOL_CHUNK_CNT,
 	        (fi_info->mode & FI_LOCAL_MR) ? rxd_buf_region_alloc_hndlr : NULL,
 		(fi_info->mode & FI_LOCAL_MR) ? rxd_buf_region_free_hndlr : NULL,
-		ep->domain);
+		rxd_ep_domain(ep));
 	if (!ep->tx_pkt_pool)
 		return -FI_ENOMEM;
 
 	ep->rx_pkt_pool = util_buf_pool_create_ex(
-		ep->domain->max_mtu_sz + sizeof (struct rxd_rx_buf),
+		rxd_ep_domain(ep)->max_mtu_sz + sizeof (struct rxd_rx_buf),
 		RXD_BUF_POOL_ALIGNMENT, 0, RXD_RX_POOL_CHUNK_CNT,
 	        (fi_info->mode & FI_LOCAL_MR) ? rxd_buf_region_alloc_hndlr : NULL,
 		(fi_info->mode & FI_LOCAL_MR) ? rxd_buf_region_free_hndlr : NULL,
-		ep->domain);
+		rxd_ep_domain(ep));
 	if (!ep->rx_pkt_pool)
 		goto err;
 
@@ -1713,14 +1573,14 @@ int rxd_ep_create_buf_pools(struct rxd_ep *ep, struct fi_info *fi_info)
 	if (!ep->rx_entry_fs)
 		goto err;
 
-	if (ep->caps & FI_MSG) {
+	if (ep->util_ep.caps & FI_MSG) {
 		ep->recv_fs = rxd_recv_fs_create(ep->rx_size);
 		dlist_init(&ep->recv_list);
 		if (!ep->recv_fs)
 			goto err;
 	}
 
-	if (ep->caps & FI_TAGGED) {
+	if (ep->util_ep.caps & FI_TAGGED) {
 		ep->trecv_fs = rxd_trecv_fs_create(ep->rx_size);
 		dlist_init(&ep->trecv_list);
 		if (!ep->trecv_fs)
@@ -1751,50 +1611,63 @@ err:
 }
 
 int rxd_endpoint(struct fid_domain *domain, struct fi_info *info,
-		  struct fid_ep **ep, void *context)
+		 struct fid_ep **ep, void *context)
 {
-	int ret;
 	struct fi_info *dg_info;
-	struct rxd_ep *rxd_ep;
 	struct rxd_domain *rxd_domain;
+	struct rxd_ep *rxd_ep;
+	struct fi_cq_attr cq_attr;
+	int ret;
 
-	ret = fi_check_info(&rxd_util_prov, info, FI_MATCH_PREFIX);
+	rxd_ep = calloc(1, sizeof(*rxd_ep));
+	if (!rxd_ep)
+		return -FI_ENOMEM;
+
+	rxd_domain = container_of(domain, struct rxd_domain,
+				  util_domain.domain_fid);
+	memset(&cq_attr, 0, sizeof cq_attr);
+	cq_attr.format = FI_CQ_FORMAT_MSG;
+	cq_attr.wait_obj = FI_WAIT_FD;
+
+	ret = ofi_endpoint_init(domain, &rxd_util_prov, info, &rxd_ep->util_ep,
+				context, rxd_ep_progress);
 	if (ret)
-		return ret;
+		goto err1;
 
-	ret = ofix_getinfo(rxd_prov.version, NULL, NULL, 0, &rxd_util_prov,
-			   info, rxd_alter_layer_info,
-			   rxd_alter_base_info, 1, &dg_info);
+	ret = ofi_get_core_info(rxd_domain->util_domain.fabric->fabric_fid.api_version,
+				NULL, NULL, 0, &rxd_util_prov, info,
+				rxd_info_to_core, &dg_info);
 	if (ret)
-		return ret;
+		goto err2;
 
-	rxd_domain = container_of(domain, struct rxd_domain, util_domain.domain_fid);
-	rxd_ep = calloc(1, sizeof(*rxd_ep));
-	if (!rxd_ep) {
-		ret = -FI_ENOMEM;
-		goto err1;
-	}
+	rxd_ep->do_local_mr = (rxd_domain->mr_mode & FI_MR_LOCAL) ? 1 : 0;
 
-	rxd_ep->addrlen = (info->src_addr) ? info->src_addrlen : info->dest_addrlen;
-	rxd_ep->do_local_mr = (rxd_domain->dg_mode & FI_LOCAL_MR) ? 1 : 0;
-	ret = fi_endpoint(rxd_domain->dg_domain, dg_info, ep, context);
+	ret = fi_endpoint(rxd_domain->dg_domain, dg_info, &rxd_ep->dg_ep, rxd_ep);
+	cq_attr.size = dg_info->tx_attr->size + dg_info->rx_attr->size;
+	fi_freeinfo(dg_info);
 	if (ret)
 		goto err2;
 
-	rxd_ep->caps = info->caps;
-	rxd_ep->domain = rxd_domain;
+	ret = fi_cq_open(rxd_domain->dg_domain, &cq_attr, &rxd_ep->dg_cq, rxd_ep);
+	if (ret)
+		goto err3;
+
+	ret = fi_ep_bind(rxd_ep->dg_ep, &rxd_ep->dg_cq->fid,
+			 FI_TRANSMIT | FI_RECV);
+	if (ret)
+		goto err4;
+
 	rxd_ep->rx_size = info->rx_attr->size;
 	ret = rxd_ep_create_buf_pools(rxd_ep, info);
 	if (ret)
-		goto err3;
+		goto err4;
 
-	rxd_ep->dg_ep = *ep;
-	rxd_ep->ep.fid.ops = &rxd_ep_fi_ops;
-	rxd_ep->ep.cm = &rxd_ep_cm;
-	rxd_ep->ep.ops = &rxd_ops_ep;
-	rxd_ep->ep.msg = &rxd_ops_msg;
-	rxd_ep->ep.tagged = &rxd_ops_tagged;
-	rxd_ep->ep.rma = &rxd_ops_rma;
+	rxd_ep->util_ep.ep_fid.fid.ops = &rxd_ep_fi_ops;
+	rxd_ep->util_ep.ep_fid.cm = &rxd_ep_cm;
+	rxd_ep->util_ep.ep_fid.ops = &rxd_ops_ep;
+	rxd_ep->util_ep.ep_fid.msg = &rxd_ops_msg;
+	rxd_ep->util_ep.ep_fid.tagged = &rxd_ops_tagged;
+	rxd_ep->util_ep.ep_fid.rma = &rxd_ops_rma;
 
 	dlist_init(&rxd_ep->tx_entry_list);
 	dlist_init(&rxd_ep->rx_entry_list);
@@ -1804,102 +1677,16 @@ int rxd_endpoint(struct fid_domain *domain, struct fi_info *info,
 	slist_init(&rxd_ep->rx_pkt_list);
 	fastlock_init(&rxd_ep->lock);
 
-	dlist_init(&rxd_ep->dom_entry);
-	atomic_inc(&rxd_ep->domain->util_domain.ref);
-
-	*ep = &rxd_ep->ep;
-	fi_freeinfo(dg_info);
+	*ep = &rxd_ep->util_ep.ep_fid;
 	return 0;
 
+err4:
+	fi_close(&rxd_ep->dg_cq->fid);
 err3:
-	fi_close(&(*ep)->fid);
+	fi_close(&rxd_ep->dg_ep->fid);
 err2:
-	free(rxd_ep);
+	ofi_endpoint_close(&rxd_ep->util_ep);
 err1:
-	fi_freeinfo(dg_info);
-	return ret;
-}
-
-int rxd_ep_retry_pkt(struct rxd_ep *ep, struct rxd_tx_entry *tx_entry,
-		   struct rxd_pkt_meta *pkt)
-{
-	int ret;
-	struct ofi_ctrl_hdr *ctrl;
-
-	ctrl = (struct ofi_ctrl_hdr *)pkt->pkt_data;
-	if (pkt->retries > RXD_MAX_PKT_RETRY) {
-		/* todo: report error */
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "Pkt delivery failed\n", ctrl->seg_no);
-		return -FI_EIO;
-	}
-
-	FI_DBG(&rxd_prov, FI_LOG_EP_CTRL, "retry packet : %2d, size: %d, tx_id :%p\n",
-		ctrl->seg_no, ctrl->type == ofi_ctrl_start_data ?
-		ctrl->seg_size + RXD_START_DATA_PKT_SZ :
-		ctrl->seg_size + RXD_DATA_PKT_SZ,
-		ctrl->msg_id);
-
-	ret = fi_send(ep->dg_ep, ctrl,
-		      ctrl->type == ofi_ctrl_start_data ?
-		      ctrl->seg_size + RXD_START_DATA_PKT_SZ :
-		      ctrl->seg_size + RXD_DATA_PKT_SZ,
-		      rxd_mr_desc(pkt->mr, ep),
-		      tx_entry->peer, &pkt->context);
-
-	if (ret != -FI_EAGAIN)
-		pkt->retries++;
-
-	if (ret && ret != -FI_EAGAIN) {
-		FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "Pkt sent failed seg: %d, ret: %d\n",
-			ctrl->seg_no, ret);
-	}
-
+	free(rxd_ep);
 	return ret;
 }
-
-void rxd_ep_progress(struct rxd_ep *ep)
-{
-	struct dlist_entry *tx_item, *pkt_item;
-	struct rxd_tx_entry *tx_entry;
-	struct rxd_pkt_meta *pkt;
-	uint64_t curr_stamp;
-
-	rxd_ep_lock_if_required(ep);
-	curr_stamp = fi_gettime_us();
-	dlist_foreach(&ep->tx_entry_list, tx_item) {
-
-		tx_entry = container_of(tx_item, struct rxd_tx_entry, entry);
-
-		if (tx_entry->win_sz)
-			rxd_tx_entry_progress(ep, tx_entry, NULL);
-
-		else if (tx_entry->is_waiting &&
-			 (curr_stamp - tx_entry->retry_stamp > RXD_WAIT_TIMEOUT) &&
-			 dlist_empty(&tx_entry->pkt_list)) {
-			tx_entry->win_sz = 1;
-			tx_entry->is_waiting = 0;
-
-			FI_WARN(&rxd_prov, FI_LOG_EP_CTRL, "Progressing waiting entry [%p]\n",
-				tx_entry->msg_id);
-
-			rxd_tx_entry_progress(ep, tx_entry, NULL);
-			tx_entry->retry_stamp = fi_gettime_us();
-		}
-
-		dlist_foreach(&tx_entry->pkt_list, pkt_item) {
-			pkt = container_of(pkt_item, struct rxd_pkt_meta, entry);
-			/* TODO: This if check is repeated.  Create a function
-			 * to perform this check, and figure out what the check
-			 * is actually doing with the bit-shift, multiply operation.
-			 */
-			if (curr_stamp > pkt->us_stamp &&
-			    curr_stamp - pkt->us_stamp >
-			    (((uint64_t) 1) << ((uint64_t) pkt->retries + 1)) *
-			     RXD_RETRY_TIMEOUT) {
-				pkt->us_stamp = curr_stamp;
-				rxd_ep_retry_pkt(ep, tx_entry, pkt);
-			}
-		}
-	}
-	rxd_ep_unlock_if_required(ep);
-}
diff --git a/prov/rxd/src/rxd_fabric.c b/prov/rxd/src/rxd_fabric.c
index 0393ca6..dce5a87 100644
--- a/prov/rxd/src/rxd_fabric.c
+++ b/prov/rxd/src/rxd_fabric.c
@@ -82,7 +82,7 @@ int rxd_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 		return -FI_ENOMEM;
 
 	ret = ofi_fabric_init(&rxd_prov, &rxd_fabric_attr, attr,
-			     &rxd_fabric->util_fabric, context, FI_MATCH_PREFIX);
+			      &rxd_fabric->util_fabric, context);
 	if (ret)
 		goto err1;
 
@@ -93,9 +93,8 @@ int rxd_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 	}
 	hints.fabric_attr->name = attr->name;
 
-	ret = ofix_getinfo(rxd_prov.version, NULL, NULL, 0, &rxd_util_prov,
-			&hints, rxd_alter_layer_info,
-			rxd_alter_base_info, 1, &dg_info);
+	ret = ofi_get_core_info(attr->api_version, NULL, NULL, 0, &rxd_util_prov,
+				&hints, rxd_info_to_core, &dg_info);
 	if (ret) {
 		ret = -FI_EINVAL;
 		goto err3;
@@ -112,6 +111,9 @@ int rxd_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 
 	free(hints.fabric_attr);
 	fi_freeinfo(dg_info);
+
+	fi_param_get_int(&rxd_prov, "spin_count", &rxd_progress_spin_count);
+
 	return 0;
 err4:
 	fi_freeinfo(dg_info);
diff --git a/prov/rxd/src/rxd_init.c b/prov/rxd/src/rxd_init.c
index 4526b8b..d8b79dd 100644
--- a/prov/rxd/src/rxd_init.c
+++ b/prov/rxd/src/rxd_init.c
@@ -35,23 +35,25 @@
 #include <prov.h>
 #include "rxd.h"
 
-int rxd_alter_layer_info(struct fi_info *layer_info, struct fi_info *base_info)
+int rxd_info_to_core(uint32_t version, struct fi_info *rxd_info,
+		     struct fi_info *core_info)
 {
-	base_info->caps = FI_MSG;
-	base_info->mode = FI_LOCAL_MR;
-	base_info->ep_attr->type = FI_EP_DGRAM;
+	core_info->caps = FI_MSG;
+	core_info->mode = FI_LOCAL_MR;
+	core_info->ep_attr->type = FI_EP_DGRAM;
 	return 0;
 }
 
-int rxd_alter_base_info(struct fi_info *base_info, struct fi_info *layer_info)
+int rxd_info_to_rxd(uint32_t version, struct fi_info *core_info,
+		    struct fi_info *info)
 {
-	layer_info->caps = rxd_info.caps;
-	layer_info->mode = rxd_info.mode;
+	info->caps = rxd_info.caps;
+	info->mode = rxd_info.mode;
 
-	*layer_info->tx_attr = *rxd_info.tx_attr;
-	*layer_info->rx_attr = *rxd_info.rx_attr;
-	*layer_info->ep_attr = *rxd_info.ep_attr;
-	*layer_info->domain_attr = *rxd_info.domain_attr;
+	*info->tx_attr = *rxd_info.tx_attr;
+	*info->rx_attr = *rxd_info.rx_attr;
+	*info->ep_attr = *rxd_info.ep_attr;
+	*info->domain_attr = *rxd_info.domain_attr;
 	return 0;
 }
 
@@ -59,7 +61,7 @@ static int rxd_getinfo(uint32_t version, const char *node, const char *service,
 			uint64_t flags, struct fi_info *hints, struct fi_info **info)
 {
 	return ofix_getinfo(version, node, service, flags, &rxd_util_prov,
-			    hints, rxd_alter_layer_info, rxd_alter_base_info, 0, info);
+			    hints, rxd_info_to_core, rxd_info_to_rxd, info);
 }
 
 static void rxd_fini(void)
@@ -68,7 +70,7 @@ static void rxd_fini(void)
 }
 
 struct fi_provider rxd_prov = {
-	.name = "rxd",
+	.name = OFI_UTIL_PREFIX "rxd",
 	.version = FI_VERSION(RXD_MAJOR_VERSION, RXD_MINOR_VERSION),
 	.fi_version = RXD_FI_VERSION,
 	.getinfo = rxd_getinfo,
@@ -78,5 +80,8 @@ struct fi_provider rxd_prov = {
 
 RXD_INI
 {
+	fi_param_define(&rxd_prov, "spin_count", FI_PARAM_INT,
+			"Number of iterations to receive packets (0 - infinite)");
+
 	return &rxd_prov;
 }
diff --git a/prov/rxd/src/rxd_rma.c b/prov/rxd/src/rxd_rma.c
index 6e1421e..cdd03b2 100644
--- a/prov/rxd/src/rxd_rma.c
+++ b/prov/rxd/src/rxd_rma.c
@@ -38,55 +38,47 @@
 ssize_t	rxd_ep_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 		       uint64_t flags)
 {
-	ssize_t ret;
-	uint64_t peer_addr;
 	struct rxd_ep *rxd_ep;
 	struct rxd_peer *peer;
 	struct rxd_tx_entry *tx_entry;
-	rxd_ep = container_of(ep, struct rxd_ep, ep);
+	uint64_t peer_addr;
+	ssize_t ret;
 
-	peer_addr = rxd_av_get_dg_addr(rxd_ep->av, msg->addr);
-	peer = rxd_ep_getpeer_info(rxd_ep, peer_addr);
+	rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid);
 
-#if ENABLE_DEBUG
-	if (msg->iov_count > RXD_IOV_LIMIT ||
-	    msg->rma_iov_count > RXD_IOV_LIMIT)
-		return -FI_EINVAL;
-#endif
+	peer_addr = rxd_av_dg_addr(rxd_ep_av(rxd_ep), msg->addr);
+	peer = rxd_ep_getpeer_info(rxd_ep, peer_addr);
 
-	rxd_ep_lock_if_required(rxd_ep);
-	if (!peer->addr_published) {
-		ret = rxd_ep_post_conn_msg(rxd_ep, peer, peer_addr);
-		ret = (ret) ? ret : -FI_EAGAIN;
-		goto out;
+	fastlock_acquire(&rxd_ep->lock);
+	if (peer->state != CMAP_CONNECTED) {
+		ret = rxd_ep_connect(rxd_ep, peer, peer_addr);
+		fastlock_release(&rxd_ep->lock);
+		if (ret == -FI_EALREADY) {
+			rxd_ep->util_ep.progress(&rxd_ep->util_ep);
+			ret = -FI_EAGAIN;
+		}
+		return ret ? ret : -FI_EAGAIN;
 	}
 
-	tx_entry = rxd_tx_entry_acquire(rxd_ep, peer);
+	tx_entry = rxd_tx_entry_alloc(rxd_ep, peer, peer_addr, flags,
+				      RXD_TX_READ_REQ);
 	if (!tx_entry) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	dlist_init(&tx_entry->pkt_list);
-	tx_entry->op_type = RXD_TX_READ_REQ;
 	tx_entry->read_req.msg = *msg;
-	tx_entry->flags = flags;
-	tx_entry->peer = peer_addr;
-	rxd_ep_copy_msg_iov(msg->msg_iov,
-			    &tx_entry->read_req.dst_iov[0], msg->iov_count);
-	rxd_ep_copy_rma_iov(msg->rma_iov,
-			    &tx_entry->read_req.src_iov[0], msg->rma_iov_count);
-	ret = rxd_ep_post_start_msg(rxd_ep, peer, ofi_op_read_req, tx_entry);
+	memcpy(&tx_entry->read_req.dst_iov[0], msg->msg_iov,
+	       sizeof(*msg->msg_iov)* msg->iov_count);
+	memcpy(&tx_entry->read_req.src_iov[0], msg->rma_iov,
+	       sizeof(*msg->rma_iov) * msg->rma_iov_count);
+	ret = rxd_ep_start_xfer(rxd_ep, peer, ofi_op_read_req, tx_entry);
 	if (ret)
-		goto err;
+		rxd_tx_entry_free(rxd_ep, tx_entry);
 
-	dlist_insert_tail(&tx_entry->entry, &rxd_ep->tx_entry_list);
 out:
-	rxd_ep_unlock_if_required(rxd_ep);
+	fastlock_release(&rxd_ep->lock);
 	return ret;
-err:
-	rxd_tx_entry_release(rxd_ep, tx_entry);
-	goto out;
 }
 
 static ssize_t rxd_ep_read(struct fid_ep *ep, void *buf, size_t len,
@@ -125,6 +117,7 @@ static ssize_t rxd_ep_readv(struct fid_ep *ep, const struct iovec *iov,
 	struct fi_msg_rma msg;
 	struct fi_rma_iov rma_iov;
 
+	assert(count <= RXD_IOV_LIMIT);
 	memset(&msg, 0, sizeof(msg));
 	msg.msg_iov = iov;
 	msg.desc = desc;
@@ -134,11 +127,6 @@ static ssize_t rxd_ep_readv(struct fid_ep *ep, const struct iovec *iov,
 	rma_iov.addr = addr;
 	rma_iov.key = key;
 
-#if ENABLE_DEBUG
-	if (count > RXD_IOV_LIMIT)
-		return -FI_EINVAL;
-#endif
-
 	for (i = 0, len = 0; i < count; i++)
 		len += iov[i].iov_len;
 	rma_iov.len = len;
@@ -153,54 +141,46 @@ static ssize_t rxd_ep_readv(struct fid_ep *ep, const struct iovec *iov,
 ssize_t	rxd_ep_writemsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 			uint64_t flags)
 {
-	ssize_t ret;
-	uint64_t peer_addr;
 	struct rxd_ep *rxd_ep;
 	struct rxd_peer *peer;
 	struct rxd_tx_entry *tx_entry;
-	rxd_ep = container_of(ep, struct rxd_ep, ep);
+	uint64_t peer_addr;
+	ssize_t ret;
 
-	peer_addr = rxd_av_get_dg_addr(rxd_ep->av, msg->addr);
+	rxd_ep = container_of(ep, struct rxd_ep, util_ep.ep_fid);
+	peer_addr = rxd_av_dg_addr(rxd_ep_av(rxd_ep), msg->addr);
 	peer = rxd_ep_getpeer_info(rxd_ep, peer_addr);
 
-#if ENABLE_DEBUG
-	if (msg->iov_count > RXD_IOV_LIMIT ||
-	    msg->rma_iov_count > RXD_IOV_LIMIT)
-		return -FI_EINVAL;
-#endif
-
-	rxd_ep_lock_if_required(rxd_ep);
-	if (!peer->addr_published) {
-		ret = rxd_ep_post_conn_msg(rxd_ep, peer, peer_addr);
-		ret = (ret) ? ret : -FI_EAGAIN;
-		goto out;
+	fastlock_acquire(&rxd_ep->lock);
+	if (peer->state != CMAP_CONNECTED) {
+		ret = rxd_ep_connect(rxd_ep, peer, peer_addr);
+		fastlock_release(&rxd_ep->lock);
+		if (ret == -FI_EALREADY) {
+			rxd_ep->util_ep.progress(&rxd_ep->util_ep);
+			ret = -FI_EAGAIN;
+		}
+		return ret ? ret : -FI_EAGAIN;
 	}
 
-	tx_entry = rxd_tx_entry_acquire(rxd_ep, peer);
+	tx_entry = rxd_tx_entry_alloc(rxd_ep, peer, peer_addr, flags,
+				      RXD_TX_WRITE);
 	if (!tx_entry) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	dlist_init(&tx_entry->pkt_list);
-	tx_entry->op_type = RXD_TX_WRITE;
 	tx_entry->write.msg = *msg;
-	tx_entry->flags = flags;
-	tx_entry->peer = peer_addr;
-	rxd_ep_copy_msg_iov(msg->msg_iov, &tx_entry->write.src_iov[0], msg->iov_count);
-	rxd_ep_copy_rma_iov(msg->rma_iov, &tx_entry->write.dst_iov[0], msg->rma_iov_count);
-
-	ret = rxd_ep_post_start_msg(rxd_ep, peer, ofi_op_write, tx_entry);
+	memcpy(&tx_entry->write.src_iov[0], msg->msg_iov,
+	       sizeof(*msg->msg_iov) * msg->iov_count);
+	memcpy(&tx_entry->write.dst_iov[0], msg->rma_iov,
+	       sizeof(*msg->rma_iov) * msg->rma_iov_count);
+	ret = rxd_ep_start_xfer(rxd_ep, peer, ofi_op_write, tx_entry);
 	if (ret)
-		goto err;
+		rxd_tx_entry_free(rxd_ep, tx_entry);
 
-	dlist_insert_tail(&tx_entry->entry, &rxd_ep->tx_entry_list);
 out:
-	rxd_ep_unlock_if_required(rxd_ep);
+	fastlock_release(&rxd_ep->lock);
 	return ret;
-err:
-	rxd_tx_entry_release(rxd_ep, tx_entry);
-	goto out;
 }
 
 static ssize_t rxd_ep_write(struct fid_ep *ep, const void *buf,
@@ -236,22 +216,18 @@ static ssize_t rxd_ep_writev(struct fid_ep *ep, const struct iovec *iov,
 			     void **desc, size_t count, fi_addr_t dest_addr,
 			     uint64_t addr, uint64_t key, void *context)
 {
-	int i;
+	size_t i;
 	size_t len;
 	struct fi_msg_rma msg;
 	struct fi_rma_iov rma_iov;
 
+	assert(count <= RXD_IOV_LIMIT);
 	memset(&msg, 0, sizeof(msg));
 	msg.msg_iov = iov;
 	msg.desc = desc;
 	msg.iov_count = count;
 	msg.rma_iov_count = 1;
 
-#if ENABLE_DEBUG
-	if (count > RXD_IOV_LIMIT)
-		return -FI_EINVAL;
-#endif
-
 	for (i = 0, len = 0; i < count; i++)
 		len += iov[i].iov_len;
 
diff --git a/prov/rxm/Makefile.include b/prov/rxm/Makefile.include
index c829682..83729b7 100644
--- a/prov/rxm/Makefile.include
+++ b/prov/rxm/Makefile.include
@@ -7,6 +7,8 @@ _rxm_files = \
        prov/rxm/src/rxm_conn.c		\
        prov/rxm/src/rxm_ep.c		\
        prov/rxm/src/rxm_cq.c		\
+       prov/rxm/src/rxm_rma.c		\
+       prov/rxm/src/rxm.c		\
        prov/rxm/src/rxm.h
 
 if HAVE_RXM_DL
diff --git a/prov/util/src/util_fabric.c b/prov/rxm/src/rxm.c
similarity index 53%
copy from prov/util/src/util_fabric.c
copy to prov/rxm/src/rxm.c
index 6dfe3d4..8276759 100644
--- a/prov/util/src/util_fabric.c
+++ b/prov/rxm/src/rxm.c
@@ -30,50 +30,56 @@
  * SOFTWARE.
  */
 
-#include <stdlib.h>
-#include <string.h>
+#include "rxm.h"
 
-#include <fi_enosys.h>
-#include <fi_util.h>
+#define rxm_entry_pop(queue, entry)			\
+	do {						\
+		fastlock_acquire(&queue->lock);		\
+		entry = freestack_isempty(queue->fs) ?	\
+			NULL : freestack_pop(queue->fs);\
+		fastlock_release(&queue->lock);		\
+	} while (0)
 
-int ofi_fabric_close(struct util_fabric *fabric)
-{
-	if (atomic_get(&fabric->ref))
-		return -FI_EBUSY;
+#define rxm_entry_push(queue, entry)			\
+	do {						\
+		fastlock_acquire(&queue->lock);		\
+		freestack_push(queue->fs, entry);	\
+		fastlock_release(&queue->lock);		\
+	} while (0)
 
-	fi_fabric_remove(fabric);
-	fastlock_destroy(&fabric->lock);
-	return 0;
-}
+char *rxm_proto_state_str[] = {
+	RXM_PROTO_STATES(OFI_STR)
+};
 
-static void util_fabric_init(struct util_fabric *fabric, const char *name)
+struct rxm_tx_entry *rxm_tx_entry_get(struct rxm_send_queue *queue)
 {
-	atomic_initialize(&fabric->ref, 0);
-	dlist_init(&fabric->domain_list);
-	fastlock_init(&fabric->lock);
-	fabric->name = name;
+	struct rxm_tx_entry *entry;
+	rxm_entry_pop(queue, entry);
+	if (!entry) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Exhausted tx_entry freestack\n");
+		return NULL;
+	}
+	entry->state = RXM_NONE;
+	return entry;
 }
 
-int ofi_fabric_init(const struct fi_provider *prov,
-		   struct fi_fabric_attr *prov_attr,
-		   struct fi_fabric_attr *user_attr,
-		   struct util_fabric *fabric, void *context,
-		   enum fi_match_type type)
+void rxm_tx_entry_release(struct rxm_send_queue *queue, struct rxm_tx_entry *entry)
 {
-	int ret;
-
-	ret = fi_check_fabric_attr(prov, prov_attr, user_attr, type);
-	if (ret)
-		return ret;
+	rxm_entry_push(queue, entry);
+}
 
-	fabric->prov = prov;
-	util_fabric_init(fabric, prov_attr->name);
+struct rxm_recv_entry *rxm_recv_entry_get(struct rxm_recv_queue *queue)
+{
+	struct rxm_recv_entry *entry;
+	rxm_entry_pop(queue, entry);
+	if (!entry) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Exhausted recv_entry freestack\n");
+		return NULL;
+	}
+	return entry;
+}
 
-	fabric->fabric_fid.fid.fclass = FI_CLASS_FABRIC;
-	fabric->fabric_fid.fid.context = context;
-	/*
-	 * fabric ops set by provider
-	 */
-	fi_fabric_insert(fabric);
-	return 0;
+void rxm_recv_entry_release(struct rxm_recv_queue *queue, struct rxm_recv_entry *entry)
+{
+	rxm_entry_push(queue, entry);
 }
diff --git a/prov/rxm/src/rxm.h b/prov/rxm/src/rxm.h
index 86498e6..7cdc505 100644
--- a/prov/rxm/src/rxm.h
+++ b/prov/rxm/src/rxm.h
@@ -1,6 +1,5 @@
 /*
  * Copyright (c) 2016 Intel Corporation, Inc.  All rights reserved.
- * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -35,8 +34,9 @@
 #  include <config.h>
 #endif /* HAVE_CONFIG_H */
 
-#include <pthread.h>
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 
 #include <rdma/fabric.h>
 #include <rdma/fi_errno.h>
@@ -49,6 +49,7 @@
 #include <fi_enosys.h>
 #include <fi_util.h>
 #include <fi_list.h>
+#include <fi_proto.h>
 
 #ifndef _RXM_H_
 #define _RXM_H_
@@ -58,14 +59,39 @@
 #define RXM_MAJOR_VERSION 1
 #define RXM_MINOR_VERSION 0
 
+#define RXM_BUF_SIZE 16384
+#define RXM_IOV_LIMIT 4
+
+#define RXM_MR_LOCAL(info) \
+	((FI_VERSION_LT(info->fabric_attr->api_version, FI_VERSION(1, 5)) && \
+	  (info->mode & FI_LOCAL_MR)) || (info->domain_attr->mr_mode & FI_MR_LOCAL))
+
+#define RXM_MR_VIRT_ADDR(info) ((info->domain_attr->mr_mode == FI_MR_BASIC) ||\
+				info->domain_attr->mr_mode & FI_MR_VIRT_ADDR)
+
+#define RXM_MR_PROV_KEY(info) ((info->domain_attr->mr_mode == FI_MR_BASIC) ||\
+			       info->domain_attr->mr_mode & FI_MR_PROV_KEY)
+
+#define RXM_LOG_STATE(subsystem, pkt, prev_state, next_state) 			\
+	FI_DBG(&rxm_prov, subsystem, "[LMT] msg_id: 0x%" PRIx64 " %s -> %s\n",	\
+	       pkt.ctrl_hdr.msg_id, rxm_proto_state_str[prev_state],		\
+	       rxm_proto_state_str[next_state])
+
+#define RXM_LOG_STATE_TX(subsystem, tx_entry, next_state)		\
+	RXM_LOG_STATE(subsystem, tx_entry->tx_buf->pkt, tx_entry->state,\
+		      next_state)
+
+#define RXM_LOG_STATE_RX(subsystem, rx_buf, next_state)			\
+	RXM_LOG_STATE(subsystem, rx_buf->pkt, rx_buf->hdr.state,	\
+		      next_state)
+
 extern struct fi_provider rxm_prov;
 extern struct util_prov rxm_util_prov;
+extern struct fi_ops_rma rxm_ops_rma;
 
 struct rxm_fabric {
 	struct util_fabric util_fabric;
 	struct fid_fabric *msg_fabric;
-	struct fid_eq *msg_eq;
-	pthread_t msg_listener_thread;
 };
 
 struct rxm_conn {
@@ -76,6 +102,7 @@ struct rxm_conn {
 struct rxm_domain {
 	struct util_domain util_domain;
 	struct fid_domain *msg_domain;
+	uint8_t mr_local;
 };
 
 struct rxm_mr {
@@ -83,42 +110,264 @@ struct rxm_mr {
 	struct fid_mr *msg_mr;
 };
 
-struct rxm_cq {
-	struct util_cq util_cq;
-	struct fid_cq *msg_cq;
+struct rxm_cm_data {
+	struct sockaddr name;
+	uint64_t conn_id;
+};
+
+struct rxm_rma_iov {
+	uint8_t count;
+	struct ofi_rma_iov iov[];
+};
+
+/*
+ * Macros to generate enums and associated string values
+ * e.g.
+ * #define RXM_PROTO_STATES(FUNC)	\
+ * 	FUNC(STATE1),			\
+ * 	FUNC(STATE2),			\
+ * 	...				\
+ * 	FUNC(STATEn)
+ *
+ * enum rxm_state {
+ * 	RXM_PROTO_STATES(OFI_ENUM_VAL)
+ * };
+ *
+ * char *rxm_state_str[] = {
+ * 	RXM_PROTO_STATES(OFI_STR)
+ * };
+ */
+
+/* RXM protocol states / tx/rx context */
+#define RXM_PROTO_STATES(FUNC)	\
+	FUNC(RXM_NONE),		\
+	FUNC(RXM_TX_NOBUF),	\
+	FUNC(RXM_TX),		\
+	FUNC(RXM_RX),		\
+	FUNC(RXM_LMT_TX),	\
+	FUNC(RXM_LMT_ACK_WAIT),	\
+	FUNC(RXM_LMT_READ),	\
+	FUNC(RXM_LMT_ACK_SENT), \
+	FUNC(RXM_LMT_ACK_RECVD),\
+	FUNC(RXM_LMT_FINISH),
+
+enum rxm_proto_state {
+	RXM_PROTO_STATES(OFI_ENUM_VAL)
+};
+
+extern char *rxm_proto_state_str[];
+
+struct rxm_pkt {
+	struct ofi_ctrl_hdr ctrl_hdr;
+	struct ofi_op_hdr hdr;
+	char data[];
+};
+
+struct rxm_recv_match_attr {
+	fi_addr_t addr;
+	uint64_t tag;
+	uint64_t ignore;
+};
+
+struct rxm_unexp_msg {
+	struct dlist_entry entry;
+	fi_addr_t addr;
+	uint64_t tag;
+};
+
+struct rxm_iov {
+	struct iovec iov[RXM_IOV_LIMIT];
+	void *desc[RXM_IOV_LIMIT];
+	uint8_t count;
+};
+
+struct rxm_buf {
+	/* Must stay at top */
+	enum rxm_proto_state state;
+
+	struct dlist_entry entry;
+	void *desc;
+	/* MSG EP / shared context to which bufs would be posted to */
+	struct fid_ep *msg_ep;
+};
+
+struct rxm_rx_buf {
+	/* Must stay at top */
+	struct rxm_buf hdr;
+
+	struct rxm_ep *ep;
+	struct rxm_conn *conn;
+	struct rxm_recv_queue *recv_queue;
+	struct rxm_recv_entry *recv_entry;
+	struct rxm_unexp_msg unexp_msg;
+	uint64_t comp_flags;
+
+	/* Used for large messages */
+	struct rxm_iov match_iov[RXM_IOV_LIMIT];
+	struct rxm_rma_iov *rma_iov;
+	size_t index;
+	struct fid_mr *mr[RXM_IOV_LIMIT];
+
+	struct rxm_pkt pkt;
+};
+
+struct rxm_tx_buf {
+	/* Must stay at top */
+	struct rxm_buf hdr;
+
+	struct rxm_pkt pkt;
+};
+
+struct rxm_tx_entry {
+	/* Must stay at top */
+	enum rxm_proto_state state;
+
+	struct rxm_ep *ep;
+	uint8_t count;
+	void *context;
+	uint64_t flags;
+	uint64_t comp_flags;
+	struct rxm_tx_buf *tx_buf;
+
+	/* Used for large messages */
+	struct fid_mr *mr[RXM_IOV_LIMIT];
+	struct rxm_rx_buf *rx_buf;
+};
+DECLARE_FREESTACK(struct rxm_tx_entry, rxm_txe_fs);
+
+struct rxm_recv_entry {
+	struct dlist_entry entry;
+	struct iovec iov[RXM_IOV_LIMIT];
+	void *desc[RXM_IOV_LIMIT];
+	uint8_t count;
+	fi_addr_t addr;
+	void *context;
+	uint64_t flags;
+	uint64_t tag;
+	uint64_t ignore;
+};
+DECLARE_FREESTACK(struct rxm_recv_entry, rxm_recv_fs);
+
+struct rxm_send_queue {
+	struct rxm_txe_fs *fs;
+	struct ofi_key_idx tx_key_idx;
+	fastlock_t lock;
+};
+
+enum rxm_recv_queue_type {
+	RXM_RECV_QUEUE_MSG,
+	RXM_RECV_QUEUE_TAGGED,
+};
+
+struct rxm_recv_queue {
+	enum rxm_recv_queue_type type;
+	struct rxm_recv_fs *fs;
+	struct dlist_entry recv_list;
+	struct dlist_entry unexp_msg_list;
+	dlist_func_t *match_recv;
+	dlist_func_t *match_unexp;
+	fastlock_t lock;
+};
+
+struct rxm_buf_pool {
+	struct util_buf_pool *pool;
+	struct dlist_entry buf_list;
+	uint8_t local_mr;
+	fastlock_t lock;
 };
 
 struct rxm_ep {
 	struct util_ep util_ep;
+	struct fi_info *rxm_info;
 	struct fi_info *msg_info;
 	struct fid_pep *msg_pep;
-	struct rxm_cq *tx_cq;
-	struct rxm_cq *rx_cq;
+	struct fid_eq *msg_eq;
+	struct fid_cq *msg_cq;
 	struct fid_ep *srx_ctx;
-	struct util_cmap *cmap;
+	size_t comp_per_progress;
+
+	struct rxm_buf_pool tx_pool;
+	struct rxm_buf_pool rx_pool;
+
+	struct rxm_send_queue send_queue;
+	struct rxm_recv_queue recv_queue;
+	struct rxm_recv_queue trecv_queue;
 };
 
 extern struct fi_provider rxm_prov;
 extern struct fi_info rxm_info;
 extern struct fi_fabric_attr rxm_fabric_attr;
 extern struct fi_domain_attr rxm_domain_attr;
+extern struct fi_tx_attr rxm_tx_attr;
+extern struct fi_rx_attr rxm_rx_attr;
+
+// TODO move to common code?
+static inline int rxm_match_addr(fi_addr_t addr, fi_addr_t match_addr)
+{
+	return (addr == FI_ADDR_UNSPEC) || (match_addr == FI_ADDR_UNSPEC) ||
+		(addr == match_addr);
+}
+
+static inline int rxm_match_tag(uint64_t tag, uint64_t ignore, uint64_t match_tag)
+{
+	return ((tag | ignore) == (match_tag | ignore));
+}
+
+static inline uint64_t rxm_ep_tx_flags(struct fid_ep *ep_fid) {
+	struct util_ep *util_ep = container_of(ep_fid, struct util_ep,
+					       ep_fid);
+	return util_ep->tx_op_flags;
+}
+
+static inline uint64_t rxm_ep_rx_flags(struct fid_ep *ep_fid) {
+	struct util_ep *util_ep = container_of(ep_fid, struct util_ep,
+					       ep_fid);
+	return util_ep->rx_op_flags;
+}
 
 int rxm_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 			void *context);
-int rxm_alter_layer_info(struct fi_info *layer_info, struct fi_info *base_info);
-int rxm_alter_base_info(struct fi_info *base_info, struct fi_info *layer_info);
+int rxm_info_to_core(uint32_t version, struct fi_info *rxm_info,
+		     struct fi_info *core_info);
+int rxm_info_to_rxm(uint32_t version, struct fi_info *core_info,
+		    struct fi_info *info);
 int rxm_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 			     struct fid_domain **dom, void *context);
 int rxm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 			 struct fid_cq **cq_fid, void *context);
+void rxm_cq_progress(struct rxm_ep *rxm_ep);
+int rxm_cq_comp(struct util_cq *util_cq, void *context, uint64_t flags, size_t len,
+		void *buf, uint64_t data, uint64_t tag);
+int rxm_cq_handle_data(struct rxm_rx_buf *rx_buf);
+
 int rxm_endpoint(struct fid_domain *domain, struct fi_info *info,
 			  struct fid_ep **ep, void *context);
 
-void *rxm_msg_listener(void *arg);
-int rxm_msg_connect(struct rxm_ep *rxm_ep, fi_addr_t fi_addr,
-		struct fi_info *msg_info);
-int rxm_msg_process_connreq(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
-		void *data, ssize_t datalen);
-int rxm_get_msg_ep(struct rxm_ep *rxm_ep, fi_addr_t fi_addr,
-		struct fid_ep **msg_ep);
-void rxm_conn_close(void *arg);
+void *rxm_conn_event_handler(void *arg);
+int rxm_conn_connect(struct util_ep *util_ep, struct util_cmap_handle *handle,
+		    fi_addr_t fi_addr);
+int rxm_conn_process_connreq(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
+		void *data);
+struct util_cmap_handle *rxm_conn_alloc(void);
+void rxm_conn_close(struct util_cmap_handle *handle);
+void rxm_conn_free(struct util_cmap_handle *handle);
+int rxm_conn_signal(struct util_ep *util_ep, void *context,
+		    enum ofi_cmap_signal signal);
+
+int rxm_ep_repost_buf(struct rxm_rx_buf *buf);
+int rxm_ep_prepost_buf(struct rxm_ep *rxm_ep, struct fid_ep *msg_ep);
+
+int ofi_match_addr(fi_addr_t addr, fi_addr_t match_addr);
+int ofi_match_tag(uint64_t tag, uint64_t ignore, uint64_t match_tag);
+void rxm_pkt_init(struct rxm_pkt *pkt);
+int rxm_ep_msg_mr_regv(struct rxm_ep *rxm_ep, const struct iovec *iov,
+		       size_t count, uint64_t access, struct fid_mr **mr);
+void rxm_ep_msg_mr_closev(struct fid_mr **mr, size_t count);
+struct rxm_buf *rxm_buf_get(struct rxm_buf_pool *pool);
+void rxm_buf_release(struct rxm_buf_pool *pool, struct rxm_buf *buf);
+
+struct rxm_tx_entry *rxm_tx_entry_get(struct rxm_send_queue *queue);
+struct rxm_recv_entry *rxm_recv_entry_get(struct rxm_recv_queue *queue);
+
+void rxm_tx_entry_release(struct rxm_send_queue *queue, struct rxm_tx_entry *entry);
+void rxm_recv_entry_release(struct rxm_recv_queue *queue, struct rxm_recv_entry *entry);
diff --git a/prov/rxm/src/rxm_attr.c b/prov/rxm/src/rxm_attr.c
index 5f9ad7e..f9dfe14 100644
--- a/prov/rxm/src/rxm_attr.c
+++ b/prov/rxm/src/rxm_attr.c
@@ -32,17 +32,29 @@
 
 #include "rxm.h"
 
+#define RXM_EP_CAPS (FI_MSG | FI_RMA | FI_TAGGED | FI_DIRECTED_RECV |	\
+		     FI_READ | FI_WRITE | FI_RECV | FI_SEND |		\
+		     FI_REMOTE_READ | FI_REMOTE_WRITE | FI_SOURCE)
+
+/* Since we are a layering provider, the attributes for which we rely on the
+ * core provider are set to full capability. This ensures that ofix_getinfo
+ * check hints succeeds and the core provider can accept / reject any capability
+ * requested by the app. */
+
 struct fi_tx_attr rxm_tx_attr = {
-	.caps = FI_MSG | FI_SEND,
-	.comp_order = FI_ORDER_STRICT,
-	.inject_size = 0,
-	.size = 1024,
+	.caps = RXM_EP_CAPS,
+	.msg_order = ~0x0,
+	.comp_order = ~0x0,
+	.size = SIZE_MAX,
+	.iov_limit = RXM_IOV_LIMIT,
 };
 
 struct fi_rx_attr rxm_rx_attr = {
-	.caps = FI_MSG | FI_RECV,
-	.comp_order = FI_ORDER_STRICT,
+	.caps = RXM_EP_CAPS,
+	.msg_order = ~0x0,
+	.comp_order = FI_ORDER_STRICT | FI_ORDER_DATA,
 	.size = 1024,
+	.iov_limit= RXM_IOV_LIMIT,
 };
 
 struct fi_ep_attr rxm_ep_attr = {
@@ -55,30 +67,31 @@ struct fi_ep_attr rxm_ep_attr = {
 };
 
 struct fi_domain_attr rxm_domain_attr = {
-	.name = "rxm",
 	.threading = FI_THREAD_SAFE,
 	.control_progress = FI_PROGRESS_AUTO,
 	.data_progress = FI_PROGRESS_AUTO,
 	.resource_mgmt = FI_RM_ENABLED,
 	.av_type = FI_AV_UNSPEC,
+	/* Advertise support for FI_MR_BASIC so that ofi_check_info call
+	 * doesn't fail at RxM level. If an app requires FI_MR_BASIC, it
+	 * would be passed down to core provider. */
 	.mr_mode = FI_MR_BASIC,
+	.cq_data_size = sizeof_field(struct ofi_op_hdr, data),
 	.cq_cnt = (1 << 16),
 	.ep_cnt = (1 << 15),
 	.tx_ctx_cnt = 1,
 	.rx_ctx_cnt = 1,
 	.max_ep_tx_ctx = 1,
-	.max_ep_rx_ctx = 1
+	.max_ep_rx_ctx = 1,
+	.mr_iov_limit = 1,
 };
 
 struct fi_fabric_attr rxm_fabric_attr = {
-	.name = "",
 	.prov_version = FI_VERSION(RXM_MAJOR_VERSION, RXM_MINOR_VERSION),
-	.prov_name = "rxm",
 };
 
 struct fi_info rxm_info = {
-	.caps = FI_MSG | FI_SEND | FI_RECV | FI_SOURCE,
-	.mode = FI_LOCAL_MR,
+	.caps = RXM_EP_CAPS,
 	.addr_format = FI_SOCKADDR,
 	.tx_attr = &rxm_tx_attr,
 	.rx_attr = &rxm_rx_attr,
@@ -89,6 +102,5 @@ struct fi_info rxm_info = {
 
 struct util_prov rxm_util_prov = {
 	.prov = &rxm_prov,
-	.info = &rxm_info,
 	.flags = 0,
 };
diff --git a/prov/rxm/src/rxm_conn.c b/prov/rxm/src/rxm_conn.c
index a44a7fc..c9ade72 100644
--- a/prov/rxm/src/rxm_conn.c
+++ b/prov/rxm/src/rxm_conn.c
@@ -33,59 +33,46 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <fi.h>
 #include <fi_util.h>
 #include "rxm.h"
 
-int rxm_msg_ep_open(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
-		struct rxm_conn *rxm_conn)
+static int rxm_msg_ep_open(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
+			   struct rxm_conn *rxm_conn, void *context)
 {
 	struct rxm_domain *rxm_domain;
-	struct rxm_fabric *rxm_fabric;
-	struct rxm_cq *rxm_cq;
 	struct fid_ep *msg_ep;
 	int ret;
 
 	rxm_domain = container_of(rxm_ep->util_ep.domain, struct rxm_domain,
 			util_domain);
-	rxm_fabric = container_of(rxm_domain->util_domain.fabric, struct rxm_fabric,
-			util_fabric);
-	ret = fi_endpoint(rxm_domain->msg_domain, msg_info, &msg_ep, rxm_conn);
+	ret = fi_endpoint(rxm_domain->msg_domain, msg_info, &msg_ep, context);
 	if (ret) {
 		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to create msg_ep\n");
 		return ret;
 	}
 
-	ret = fi_ep_bind(msg_ep, &rxm_fabric->msg_eq->fid, 0);
+	ret = fi_ep_bind(msg_ep, &rxm_ep->msg_eq->fid, 0);
 	if (ret) {
 		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to bind msg EP to EQ\n");
 		goto err;
 	}
 
-	ret = fi_ep_bind(msg_ep, &rxm_ep->srx_ctx->fid, 0);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to bind msg EP to shared RX ctx\n");
-		goto err;
-	}
-
-	// TODO add other completion flags
-	if (rxm_ep->util_ep.tx_cq) {
-		rxm_cq = container_of(rxm_ep->util_ep.tx_cq, struct rxm_cq, util_cq);
-		ret = fi_ep_bind(msg_ep, &rxm_cq->msg_cq->fid, FI_TRANSMIT);
+	if (rxm_ep->srx_ctx) {
+		ret = fi_ep_bind(msg_ep, &rxm_ep->srx_ctx->fid, 0);
 		if (ret) {
-			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-					"Unable to bind msg_ep to tx_cq\n");
+			FI_WARN(&rxm_prov, FI_LOG_FABRIC,
+				"Unable to bind msg EP to shared RX ctx\n");
 			goto err;
 		}
 	}
 
-	if (rxm_ep->util_ep.rx_cq) {
-		rxm_cq = container_of(rxm_ep->util_ep.rx_cq, struct rxm_cq, util_cq);
-		ret = fi_ep_bind(msg_ep, &rxm_cq->msg_cq->fid, FI_RECV);
-		if (ret) {
-			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-					"Unable to bind msg_ep to rx_cq\n");
-			goto err;
-		}
+	// TODO add other completion flags
+	ret = fi_ep_bind(msg_ep, &rxm_ep->msg_cq->fid, FI_TRANSMIT | FI_RECV);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
+				"Unable to bind msg_ep to msg_cq\n");
+		goto err;
 	}
 
 	ret = fi_enable(msg_ep);
@@ -94,6 +81,12 @@ int rxm_msg_ep_open(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
 		goto err;
 	}
 
+	if (!rxm_ep->srx_ctx) {
+		ret = rxm_ep_prepost_buf(rxm_ep, msg_ep);
+		if (ret)
+			goto err;
+	}
+
 	rxm_conn->msg_ep = msg_ep;
 	return 0;
 err:
@@ -101,58 +94,57 @@ err:
 	return ret;
 }
 
-void rxm_conn_close(void *arg)
+void rxm_conn_close(struct util_cmap_handle *handle)
 {
-	struct util_cmap_handle *handle = (struct util_cmap_handle *)arg;
 	struct rxm_conn *rxm_conn = container_of(handle, struct rxm_conn, handle);
-	int ret;
+	if (!rxm_conn->msg_ep)
+		return;
+
+	/* Assuming fi_close also shuts down the connection gracefully if the
+	 * endpoint is in connected state */
+	if (fi_close(&rxm_conn->msg_ep->fid))
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to close msg_ep\n");
+	FI_DBG(&rxm_prov, FI_LOG_EP_CTRL, "Closed msg_ep\n");
+	rxm_conn->msg_ep = NULL;
+}
 
-	if ((rxm_conn->handle.state == CMAP_UNSPEC) || !rxm_conn->msg_ep)
-		goto out;
+void rxm_conn_free(struct util_cmap_handle *handle)
+{
+	rxm_conn_close(handle);
+	free(container_of(handle, struct rxm_conn, handle));
+}
 
-	if (rxm_conn->handle.state == CMAP_CONNECTED) {
-		ret = fi_shutdown(rxm_conn->msg_ep, 0);
-		if (ret)
-			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-					"Unable to close connection\n");
-	}
-	ret = fi_close(&rxm_conn->msg_ep->fid);
-	if (ret)
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-				"Unable to close msg_ep\n");
-out:
-	free(rxm_conn);
+struct util_cmap_handle *rxm_conn_alloc(void)
+{
+	struct rxm_conn *rxm_conn = calloc(1, sizeof(*rxm_conn));
+	return rxm_conn ? &rxm_conn->handle : NULL;
 }
 
 int rxm_msg_process_connreq(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
-		void *data, ssize_t datalen)
+			    void *data)
 {
 	struct rxm_conn *rxm_conn;
+	struct rxm_cm_data *remote_cm_data = data;
+	struct rxm_cm_data cm_data;
+	struct util_cmap_handle *handle;
 	int ret;
 
-	if (!datalen) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "No addr info received in cm_data\n");
-		ret = -FI_EINVAL;
+	ret = ofi_cmap_process_connreq(rxm_ep->util_ep.cmap,
+				       &remote_cm_data->name, &handle);
+	if (ret)
 		goto err1;
-	}
 
-	if  (!(rxm_conn = calloc(1, sizeof(*rxm_conn)))) {
-		ret = -FI_ENOMEM;
-		goto err1;
-	}
+	rxm_conn = container_of(handle, struct rxm_conn, handle);
 
-	ret = ofi_cmap_add_handle(rxm_ep->cmap, &rxm_conn->handle, CMAP_CONNECTING,
-			FI_ADDR_UNSPEC, data, datalen);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to add handle/peer\n");
-		goto err2;
-	}
+	rxm_conn->handle.remote_key = remote_cm_data->conn_id;
 
-	ret = rxm_msg_ep_open(rxm_ep, msg_info, rxm_conn);
+	ret = rxm_msg_ep_open(rxm_ep, msg_info, rxm_conn, handle);
 	if (ret)
 		goto err2;
 
-	ret = fi_accept(rxm_conn->msg_ep, NULL, 0);
+	cm_data.conn_id = rxm_conn->handle.key;
+
+	ret = fi_accept(rxm_conn->msg_ep, &cm_data, sizeof(cm_data));
 	if (ret) {
 		FI_WARN(&rxm_prov, FI_LOG_FABRIC,
 				"Unable to accept incoming connection\n");
@@ -162,33 +154,55 @@ int rxm_msg_process_connreq(struct rxm_ep *rxm_ep, struct fi_info *msg_info,
 err2:
 	ofi_cmap_del_handle(&rxm_conn->handle);
 err1:
+	FI_DBG(&rxm_prov, FI_LOG_EP_CTRL,
+		"Rejecting incoming connection request\n");
 	if (fi_reject(rxm_ep->msg_pep, msg_info->handle, NULL, 0))
 		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
 				"Unable to reject incoming connection\n");
 	return ret;
 }
 
-static void rxm_msg_process_connect_event(fid_t fid)
+static int rxm_conn_handle_notify(struct fi_eq_entry *eq_entry)
 {
-	struct rxm_conn *rxm_conn = (struct rxm_conn *)fid->context;
-	ofi_cmap_update_state(&rxm_conn->handle, CMAP_CONNECTED);
+	switch((enum ofi_cmap_signal)eq_entry->data) {
+	case OFI_CMAP_FREE:
+		FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Freeing handle\n");
+		rxm_conn_free((struct util_cmap_handle *)eq_entry->context);
+		return 0;
+	case OFI_CMAP_EXIT:
+		FI_TRACE(&rxm_prov, FI_LOG_FABRIC, "Closing event handler\n");
+		return 1;
+	default:
+		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unknown cmap signal\n");
+		return 1;
+	}
 }
-static void rxm_msg_process_shutdown_event(fid_t fid)
+
+static void rxm_conn_handle_eq_err(struct rxm_ep *rxm_ep, ssize_t rd)
 {
-	// TODO process shutdown - need to diff local and remote shutdown
-	return;
+	struct fi_eq_err_entry err_entry = {0};
+
+	if (rd != -FI_EAVAIL) {
+		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to fi_eq_sread\n");
+		return;
+	}
+	OFI_EQ_READERR(&rxm_prov, FI_LOG_FABRIC, rxm_ep->msg_eq, rd, err_entry);
+	if (err_entry.err == ECONNREFUSED) {
+		FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Connection refused\n");
+		ofi_cmap_process_reject(rxm_ep->util_ep.cmap,
+					err_entry.fid->context);
+	}
 }
 
-void *rxm_msg_listener(void *arg)
+void *rxm_conn_event_handler(void *arg)
 {
 	struct fi_eq_cm_entry *entry;
-	struct fi_eq_err_entry err_entry;
-	size_t datalen = sizeof(struct sockaddr);
+	size_t datalen = sizeof(struct rxm_cm_data);
 	size_t len = sizeof(*entry) + datalen;
-	struct rxm_fabric *rxm_fabric = (struct rxm_fabric *)arg;
+	struct rxm_ep *rxm_ep = container_of(arg, struct rxm_ep, util_ep);
+	struct rxm_cm_data *cm_data;
 	uint32_t event;
 	ssize_t rd;
-	int ret;
 
 	entry = calloc(1, len);
 	if (!entry) {
@@ -196,114 +210,124 @@ void *rxm_msg_listener(void *arg)
 		return NULL;
 	}
 
-	FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Starting MSG listener thread\n");
+	FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Starting conn event handler\n");
 	while (1) {
-		rd = fi_eq_sread(rxm_fabric->msg_eq, &event, entry, len, -1, 0);
+		rd = fi_eq_sread(rxm_ep->msg_eq, &event, entry, len, -1, 0);
 		/* We would receive more bytes than sizeof *entry during CONNREQ */
 		if (rd < 0) {
-			if (rd == -FI_EAVAIL)
-				OFI_EQ_READERR(&rxm_prov, FI_LOG_FABRIC,
-						rxm_fabric->msg_eq, rd, err_entry);
-			else
-				FI_WARN(&rxm_prov, FI_LOG_FABRIC,
-						"msg: unable to fi_eq_sread\n");
+			rxm_conn_handle_eq_err(rxm_ep, rd);
 			continue;
 		}
 
 		switch(event) {
 		case FI_NOTIFY:
-			FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Closing rxm msg listener\n");
-			return NULL;
+			if (rxm_conn_handle_notify((struct fi_eq_entry *)entry))
+				goto exit;
+			break;
 		case FI_CONNREQ:
-			if (rd != len)
-				goto err;
 			FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Got new connection\n");
-			ret = rxm_msg_process_connreq(entry->fid->context, entry->info,
-					entry->data, rd - sizeof(*entry));
-			if (ret)
+			if (rd != len) {
 				FI_WARN(&rxm_prov, FI_LOG_FABRIC,
-						"Unable to process connection request\n");
+					"Received size (%d) not matching "
+					"expected (%d)\n", rd, len);
+				goto exit;
+			}
+			cm_data = (void *)entry->data;
+			rxm_msg_process_connreq(rxm_ep, entry->info, entry->data);
 			break;
 		case FI_CONNECTED:
-			FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Connected\n");
-			rxm_msg_process_connect_event(entry->fid);
+			FI_DBG(&rxm_prov, FI_LOG_FABRIC,
+			       "Connection successful\n");
+			cm_data = (void *)entry->data;
+			ofi_cmap_process_connect(rxm_ep->util_ep.cmap,
+						 entry->fid->context,
+						 (rd - sizeof(*entry)) ?
+						 &cm_data->conn_id : NULL);
 			break;
 		case FI_SHUTDOWN:
-			FI_DBG(&rxm_prov, FI_LOG_FABRIC, "Received connection shutdown\n");
-			rxm_msg_process_shutdown_event(entry->fid);
+			FI_DBG(&rxm_prov, FI_LOG_FABRIC,
+			       "Received connection shutdown\n");
+			ofi_cmap_process_shutdown(rxm_ep->util_ep.cmap,
+						  entry->fid->context);
 			break;
 		default:
-			FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unknown event: %u\n", event);
+			FI_WARN(&rxm_prov, FI_LOG_FABRIC,
+				"Unknown event: %u\n", event);
+			goto exit;
 		}
-		continue;
-err:
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC,
-				"Received size (%d) not matching expected (%d)\n", rd, len);
 	}
+exit:
+	free(entry);
+	return NULL;
 }
 
-static int rxm_prepare_cm_data(struct fid_pep *pep, void *cm_data, size_t *cm_data_size)
+static int rxm_prepare_cm_data(struct fid_pep *pep, struct util_cmap_handle *handle,
+		struct rxm_cm_data *cm_data)
 {
-	size_t opt_size = sizeof(*cm_data_size);
+	size_t cm_data_size = 0;
+	size_t name_size = sizeof(cm_data->name);
+	size_t opt_size = sizeof(cm_data_size);
 	int ret;
 
 	ret = fi_getopt(&pep->fid, FI_OPT_ENDPOINT, FI_OPT_CM_DATA_SIZE,
-			cm_data_size, &opt_size);
+			&cm_data_size, &opt_size);
 	if (ret) {
 		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "fi_getopt failed\n");
 		return ret;
 	}
 
-	ret = fi_getname(&pep->fid, cm_data, cm_data_size);
+	if (cm_data_size < sizeof(*cm_data)) {
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "MSG EP CM data size too small\n");
+		return -FI_EOTHER;
+	}
+
+	ret = fi_getname(&pep->fid, &cm_data->name, &name_size);
 	if (ret) {
 		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to get msg pep name\n");
 		return ret;
 	}
 
+	cm_data->conn_id = handle->key;
 	return 0;
 }
 
-int rxm_msg_connect(struct rxm_ep *rxm_ep, fi_addr_t fi_addr,
-		struct fi_info *msg_hints)
+int rxm_conn_connect(struct util_ep *util_ep, struct util_cmap_handle *handle,
+		    fi_addr_t fi_addr)
 {
+	struct rxm_ep *rxm_ep;
 	struct rxm_conn *rxm_conn;
 	struct fi_info *msg_info;
-	struct sockaddr name;
-	size_t name_len = 0;
+	struct rxm_cm_data cm_data;
 	int ret;
 
-	assert(!msg_hints->dest_addr);
+	rxm_ep = container_of(util_ep, struct rxm_ep, util_ep);
 
-	msg_hints->dest_addrlen = rxm_ep->util_ep.av->addrlen;
-	msg_hints->dest_addr = mem_dup(ofi_av_get_addr(rxm_ep->util_ep.av,
-				fi_addr), msg_hints->dest_addrlen);
+	rxm_conn = container_of(handle, struct rxm_conn, handle);
 
-	ret = fi_getinfo(rxm_prov.version, NULL, NULL, 0, msg_hints, &msg_info);
-	if (ret)
-		return ret;
-
-	if  (!(rxm_conn = calloc(1, sizeof(*rxm_conn)))) {
-		ret = -FI_ENOMEM;
-		goto err1;
-	}
+	free(rxm_ep->msg_info->dest_addr);
+	rxm_ep->msg_info->dest_addrlen = rxm_ep->util_ep.av->addrlen;
+	rxm_ep->msg_info->dest_addr = mem_dup(ofi_av_get_addr(rxm_ep->util_ep.av,
+							      fi_addr),
+					      rxm_ep->util_ep.av->addrlen);
 
-	ret = ofi_cmap_add_handle(rxm_ep->cmap, &rxm_conn->handle,
-			CMAP_CONNECTING, fi_addr, NULL, 0);
+	ret = fi_getinfo(rxm_ep->util_ep.domain->fabric->fabric_fid.api_version,
+			 NULL, NULL, 0, rxm_ep->msg_info, &msg_info);
 	if (ret)
-		goto err2;
+		return ret;
 
-	ret = rxm_msg_ep_open(rxm_ep, msg_info, rxm_conn);
+	ret = rxm_msg_ep_open(rxm_ep, msg_info, rxm_conn,
+			      &rxm_conn->handle);
 	if (ret)
-		goto err2;
+		goto err1;
 
 	/* We have to send passive endpoint's address to the server since the
 	 * address from which connection request would be sent would have a
 	 * different port. */
-	ret = rxm_prepare_cm_data(rxm_ep->msg_pep, &name, &name_len);
+	ret = rxm_prepare_cm_data(rxm_ep->msg_pep, &rxm_conn->handle, &cm_data);
 	if (ret)
 		goto err2;
 
-	ret = fi_connect(rxm_conn->msg_ep, msg_info->dest_addr, &name, name_len);
+	ret = fi_connect(rxm_conn->msg_ep, msg_info->dest_addr, &cm_data, sizeof(cm_data));
 	if (ret) {
 		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to connect msg_ep\n");
 		goto err2;
@@ -311,45 +335,27 @@ int rxm_msg_connect(struct rxm_ep *rxm_ep, fi_addr_t fi_addr,
 	fi_freeinfo(msg_info);
 	return 0;
 err2:
-	ofi_cmap_del_handle(&rxm_conn->handle);
+	fi_close(&rxm_conn->msg_ep->fid);
+	rxm_conn->msg_ep = NULL;
 err1:
 	fi_freeinfo(msg_info);
 	return ret;
 }
 
-int rxm_get_msg_ep(struct rxm_ep *rxm_ep, fi_addr_t fi_addr,
-		struct fid_ep **msg_ep)
+int rxm_conn_signal(struct util_ep *util_ep, void *context,
+		    enum ofi_cmap_signal signal)
 {
-	struct util_cmap_handle *handle;
-	struct rxm_conn *rxm_conn;
-
-	if (fi_addr > rxm_ep->util_ep.av->count) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Invalid fi_addr\n");
-		return -FI_EINVAL;
-	}
+	struct rxm_ep *rxm_ep = container_of(util_ep, struct rxm_ep, util_ep);
+	struct fi_eq_entry entry = {0};
+	ssize_t rd;
 
-	handle = ofi_cmap_get_handle(rxm_ep->cmap, fi_addr);
-	if (!handle)
-		goto connect;
+	entry.context = context;
+	entry.data = (uint64_t)signal;
 
-	switch (handle->state) {
-	case CMAP_CONNECTING:
-		return -FI_EAGAIN;
-	case CMAP_CONNECTED:
-		rxm_conn = container_of(handle, struct rxm_conn, handle);
-		*msg_ep = rxm_conn->msg_ep;
-		return 0;
-	default:
-		/* We shouldn't be here */
-		assert(0);
+	rd = fi_eq_write(rxm_ep->msg_eq, FI_NOTIFY, &entry, sizeof(entry), 0);
+	if (rd != sizeof(entry)) {
+		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to signal\n");
+		return (int)rd;
 	}
-
-connect:
-	if (rxm_msg_connect(rxm_ep, fi_addr, rxm_ep->msg_info)) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_DATA, "Unable to connect\n");
-		return -FI_EOTHER;
-	}
-	return -FI_EAGAIN;
+	return 0;
 }
-
-
diff --git a/prov/rxm/src/rxm_cq.c b/prov/rxm/src/rxm_cq.c
index 8a77334..bb71e6b 100644
--- a/prov/rxm/src/rxm_cq.c
+++ b/prov/rxm/src/rxm_cq.c
@@ -32,75 +32,616 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <inttypes.h>
+
+#include "fi.h"
+#include <fi_iov.h>
 
 #include "rxm.h"
 
-static int rxm_msg_cq_read(struct util_cq *util_cq, struct fid_cq *cq,
-		struct fi_cq_tagged_entry *comp)
+static struct rxm_conn *rxm_key2conn(struct rxm_ep *rxm_ep, uint64_t key)
+{
+	struct util_cmap_handle *handle;
+	handle = ofi_cmap_key2handle(rxm_ep->util_ep.cmap, key);
+	if (!handle) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Can't find handle!\n");
+		return NULL;
+	}
+	if (handle->key != key) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ,
+				"handle->key not matching with given key!\n");
+		return NULL;
+	}
+
+	return container_of(handle, struct rxm_conn, handle);
+}
+
+static const char *rxm_cq_strerror(struct fid_cq *cq_fid, int prov_errno,
+		const void *err_data, char *buf, size_t len)
+{
+	struct util_cq *cq;
+	struct rxm_ep *rxm_ep;
+	struct fid_list_entry *fid_entry;
+
+	cq = container_of(cq_fid, struct util_cq, cq_fid);
+	fid_entry = container_of(cq->ep_list.next, struct fid_list_entry, entry);
+	rxm_ep = container_of(fid_entry->fid, struct rxm_ep, util_ep.ep_fid);
+
+	return fi_cq_strerror(rxm_ep->msg_cq, prov_errno, err_data, buf, len);
+}
+
+#if ENABLE_DEBUG
+static void rxm_cq_log_comp(uint64_t flags)
+{
+	flags &= (FI_SEND | FI_WRITE | FI_READ | FI_REMOTE_READ |
+		  FI_REMOTE_WRITE);
+
+	switch(flags) {
+	case FI_SEND:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Reporting send completion\n");
+		break;
+	case FI_WRITE:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Reporting write completion\n");
+		break;
+	case FI_READ:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Reporting read completion\n");
+		break;
+	case FI_REMOTE_READ:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Reporting remote read completion\n");
+		break;
+	case FI_REMOTE_WRITE:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Reporting remote write completion\n");
+		break;
+	default:
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Unknown completion\n");
+	}
+}
+#else
+static void rxm_cq_log_comp(uint64_t flags)
+{
+	// NOP
+}
+#endif
+
+int rxm_cq_comp(struct util_cq *util_cq, void *context, uint64_t flags, size_t len,
+		void *buf, uint64_t data, uint64_t tag)
+{
+	struct fi_cq_tagged_entry *comp;
+	int ret = 0;
+
+	fastlock_acquire(&util_cq->cq_lock);
+	if (ofi_cirque_isfull(util_cq->cirq)) {
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "util_cq cirq is full!\n");
+		ret = -FI_EAGAIN;
+		goto out;
+	}
+
+	comp = ofi_cirque_tail(util_cq->cirq);
+	comp->op_context = context;
+	comp->flags = flags;
+	comp->len = len;
+	comp->buf = buf;
+	comp->data = data;
+	comp->tag = tag;
+	ofi_cirque_commit(util_cq->cirq);
+out:
+	fastlock_release(&util_cq->cq_lock);
+	return ret;
+}
+
+int rxm_finish_recv(struct rxm_rx_buf *rx_buf)
 {
-	struct util_cq_err_entry *entry;
 	int ret;
 
-	ret = fi_cq_read(cq, comp, 1);
-	if (ret == -FI_EAVAIL) {
-		entry = calloc(1, sizeof(*entry));
-		if (!entry) {
+	if (rx_buf->recv_entry->flags & FI_COMPLETION) {
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "writing recv completion\n");
+		ret = rxm_cq_comp(rx_buf->ep->util_ep.rx_cq,
+				  rx_buf->recv_entry->context,
+				  rx_buf->comp_flags | FI_RECV,
+				  rx_buf->pkt.hdr.size, NULL,
+				  rx_buf->pkt.hdr.data, rx_buf->pkt.hdr.tag);
+		if (ret) {
+			FI_WARN(&rxm_prov, FI_LOG_CQ,
+					"Unable to write recv completion\n");
+			return ret;
+		}
+	}
+
+	rxm_recv_entry_release(rx_buf->recv_queue, rx_buf->recv_entry);
+	return rxm_ep_repost_buf(rx_buf);
+}
+
+static int rxm_finish_send_nobuf(struct rxm_tx_entry *tx_entry)
+{
+	int ret;
+
+	if (tx_entry->flags & FI_COMPLETION) {
+		ret = rxm_cq_comp(tx_entry->ep->util_ep.tx_cq, tx_entry->context,
+				tx_entry->comp_flags, 0, NULL, 0, 0);
+		if (ret) {
 			FI_WARN(&rxm_prov, FI_LOG_CQ,
-					"Unable to allocate util_cq_err_entry\n");
-			return -FI_ENOMEM;
+					"Unable to report completion\n");
+			return ret;
 		}
-		OFI_CQ_READERR(&rxm_prov, FI_LOG_CQ, cq, ret, entry->err_entry);
-		if (ret < 0) {
-			free(entry);
+		rxm_cq_log_comp(tx_entry->comp_flags);
+	}
+	rxm_tx_entry_release(&tx_entry->ep->send_queue, tx_entry);
+	return 0;
+}
+
+int rxm_finish_send(struct rxm_tx_entry *tx_entry)
+{
+	rxm_buf_release(&tx_entry->ep->tx_pool, (struct rxm_buf *)tx_entry->tx_buf);
+	return rxm_finish_send_nobuf(tx_entry);
+}
+
+/* Get a match_iov derived from iov whose size matches given length */
+static int rxm_match_iov(const struct iovec *iov, void **desc,
+			 uint8_t count, uint64_t offset, size_t match_len,
+			 struct rxm_iov *match_iov)
+{
+	int i;
+
+	assert(count <= RXM_IOV_LIMIT);
+
+	if (match_len > ofi_total_iov_len(iov, count)) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "match_len > iov size!\n");
+		return -FI_EINVAL;
+	}
+
+	for (i = 0; i < count; i++) {
+		assert(offset <= iov[i].iov_len);
+		match_iov->iov[i].iov_base = (char *)iov[i].iov_base + offset;
+		match_iov->iov[i].iov_len = MIN(iov[i].iov_len - offset, match_len);
+		if (desc)
+			match_iov->desc[i] = desc[i];
+
+		match_len -= match_iov->iov[i].iov_len;
+		if (!match_len)
+			break;
+		offset = 0;
+	}
+	assert(!match_len);
+	match_iov->count = i + 1;
+	return 0;
+}
+
+static int rxm_match_rma_iov(struct rxm_recv_entry *recv_entry,
+			     struct rxm_rma_iov *rma_iov,
+			     struct rxm_iov *match_iov)
+{
+	uint64_t offset = 0;
+	size_t i, j;
+	uint8_t count;
+	int ret;
+
+	assert(rma_iov->count <= RXM_IOV_LIMIT);
+
+	for (i = 0, j = 0; i < rma_iov->count; i++) {
+		ret = rxm_match_iov(&recv_entry->iov[j],
+			      &recv_entry->desc[j], recv_entry->count,
+			      offset, rma_iov->iov[i].len, &match_iov[i]);
+		if (ret)
 			return ret;
+		count = match_iov[i].count;
+		offset = match_iov[i].iov[match_iov[i].count].iov_len;
+
+		if (offset == recv_entry->iov[j + count - 1].iov_len) {
+			/* This iov has been completely used */
+			j += count;
+			offset = 0;
+		} else {
+			j += count - 1;
 		}
-		slist_insert_tail(&entry->list_entry, &util_cq->err_list);
-		comp->flags = UTIL_FLAG_ERROR;
 	}
+	return 0;
+}
+
+static int rxm_lmt_rma_read(struct rxm_rx_buf *rx_buf)
+{
+	struct rxm_iov *match_iov = &rx_buf->match_iov[rx_buf->index];
+	int ret;
+
+	ret = fi_readv(rx_buf->conn->msg_ep, match_iov->iov, match_iov->desc,
+		       match_iov->count, 0, rx_buf->rma_iov->iov[0].addr,
+		       rx_buf->rma_iov->iov[0].key, rx_buf);
+	if (ret)
+		return ret;
+	rx_buf->index++;
+	return 0;
+}
+
+static int rxm_lmt_tx_finish(struct rxm_tx_entry *tx_entry)
+{
+	int ret;
+
+	RXM_LOG_STATE_TX(FI_LOG_CQ, tx_entry, RXM_LMT_FINISH);
+	tx_entry->state = RXM_LMT_FINISH;
+
+	if (!RXM_MR_LOCAL(tx_entry->ep->rxm_info))
+		rxm_ep_msg_mr_closev(tx_entry->mr, tx_entry->count);
+
+	tx_entry->comp_flags |= FI_SEND;
+	ret = rxm_finish_send(tx_entry);
+	if (ret)
+		return ret;
+
+	return rxm_ep_repost_buf(tx_entry->rx_buf);
+}
+
+static int rxm_lmt_handle_ack(struct rxm_rx_buf *rx_buf)
+{
+	struct rxm_tx_entry *tx_entry;
+	int index;
+
+	FI_DBG(&rxm_prov, FI_LOG_CQ, "Got ACK for msg_id: 0x%" PRIx64 "\n",
+			rx_buf->pkt.ctrl_hdr.msg_id);
+
+	fastlock_acquire(&rx_buf->ep->send_queue.lock);
+	index = ofi_key2idx(&rx_buf->ep->send_queue.tx_key_idx,
+			    rx_buf->pkt.ctrl_hdr.msg_id);
+	tx_entry = &rx_buf->ep->send_queue.fs->buf[index];
+	fastlock_release(&rx_buf->ep->send_queue.lock);
+
+	assert(tx_entry->tx_buf->pkt.ctrl_hdr.msg_id == rx_buf->pkt.ctrl_hdr.msg_id);
+
+	tx_entry->rx_buf = rx_buf;
+
+	if (tx_entry->state == RXM_LMT_ACK_WAIT) {
+		return rxm_lmt_tx_finish(tx_entry);
+	} else {
+		assert(tx_entry->state == RXM_LMT_TX);
+		RXM_LOG_STATE_TX(FI_LOG_CQ, tx_entry, RXM_LMT_ACK_RECVD);
+		tx_entry->state = RXM_LMT_ACK_RECVD;
+		return 0;
+	}
+}
+
+int rxm_cq_handle_data(struct rxm_rx_buf *rx_buf)
+{
+	struct rxm_iov mr_match_iov;
+	size_t i, rma_total_len = 0;
+	int ret;
+
+	if (rx_buf->pkt.ctrl_hdr.type == ofi_ctrl_large_data) {
+		if (!rx_buf->conn) {
+			rx_buf->conn = rxm_key2conn(rx_buf->ep, rx_buf->pkt.ctrl_hdr.conn_id);
+			if (!rx_buf->conn)
+				return -FI_EOTHER;
+		}
 
+		FI_DBG(&rxm_prov, FI_LOG_CQ,
+		       "Got incoming recv with msg_id: 0x%" PRIx64 "\n",
+		       rx_buf->pkt.ctrl_hdr.msg_id);
+
+		rx_buf->rma_iov = (struct rxm_rma_iov *)rx_buf->pkt.data;
+		rx_buf->index = 0;
+
+		for (i = 0; i < rx_buf->rma_iov->count; i++)
+			rma_total_len += rx_buf->rma_iov->iov->len;
+
+		if (rma_total_len > ofi_total_iov_len(rx_buf->recv_entry->iov,
+				      rx_buf->recv_entry->count)) {
+			FI_WARN(&rxm_prov, FI_LOG_CQ,
+				"Posted receive buffer size is not enough!\n");
+			return -FI_ETRUNC; // TODO copy data and write to CQ error
+		}
+
+		if (!RXM_MR_LOCAL(rx_buf->ep->rxm_info)) {
+			ret = rxm_match_iov(rx_buf->recv_entry->iov,
+					    rx_buf->recv_entry->desc,
+					    rx_buf->recv_entry->count, 0,
+					    rma_total_len, &mr_match_iov);
+			if (ret)
+				return ret;
+
+			ret = rxm_ep_msg_mr_regv(rx_buf->ep, mr_match_iov.iov,
+						 mr_match_iov.count, FI_WRITE,
+						 rx_buf->mr);
+			if (ret)
+				return ret;
+
+			rx_buf->recv_entry->count = mr_match_iov.count;
+
+			for (i = 0; i < rx_buf->recv_entry->count; i++)
+				rx_buf->recv_entry->desc[i] = rx_buf->mr[i];
+		}
+
+		for (i = 0; i < rx_buf->recv_entry->count; i++)
+			rx_buf->recv_entry->desc[i] = fi_mr_desc(rx_buf->recv_entry->desc[i]);
+
+		ret = rxm_match_rma_iov(rx_buf->recv_entry, rx_buf->rma_iov,
+				    rx_buf->match_iov);
+		if (ret)
+			return ret;
+
+		RXM_LOG_STATE_RX(FI_LOG_CQ, rx_buf, RXM_LMT_READ);
+		rx_buf->hdr.state = RXM_LMT_READ;
+		return rxm_lmt_rma_read(rx_buf);
+	} else {
+		ofi_copy_to_iov(rx_buf->recv_entry->iov, rx_buf->recv_entry->count, 0,
+				rx_buf->pkt.data, rx_buf->pkt.hdr.size);
+		return rxm_finish_recv(rx_buf);
+	}
+}
+
+int rxm_handle_recv_comp(struct rxm_rx_buf *rx_buf)
+{
+	struct rxm_recv_match_attr match_attr = {0};
+	struct dlist_entry *entry;
+	struct rxm_recv_queue *recv_queue;
+	struct util_cq *util_cq;
+
+	util_cq = rx_buf->ep->util_ep.rx_cq;
+
+	if ((rx_buf->ep->rxm_info->caps & FI_SOURCE) ||
+			(rx_buf->ep->rxm_info->caps & FI_DIRECTED_RECV)) {
+		if (!rx_buf->conn) {
+			rx_buf->conn = rxm_key2conn(rx_buf->ep, rx_buf->pkt.ctrl_hdr.conn_id);
+			if (!rx_buf->conn)
+				return -FI_EOTHER;
+		}
+	}
+
+	if (rx_buf->ep->rxm_info->caps & FI_DIRECTED_RECV)
+		match_attr.addr = rx_buf->conn->handle.fi_addr;
+	else
+		match_attr.addr = FI_ADDR_UNSPEC;
+
+	if (rx_buf->ep->rxm_info->caps & FI_SOURCE)
+		util_cq->src[ofi_cirque_windex(util_cq->cirq)] = rx_buf->conn->handle.fi_addr;
+
+	switch(rx_buf->pkt.hdr.op) {
+	case ofi_op_msg:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Got MSG op\n");
+		recv_queue = &rx_buf->ep->recv_queue;
+		rx_buf->comp_flags = FI_MSG;
+		break;
+	case ofi_op_tagged:
+		FI_DBG(&rxm_prov, FI_LOG_CQ, "Got TAGGED op\n");
+		rx_buf->comp_flags = FI_TAGGED;
+		match_attr.tag = rx_buf->pkt.hdr.tag;
+		recv_queue = &rx_buf->ep->trecv_queue;
+		break;
+	default:
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Unknown op!\n");
+		assert(0);
+		return -FI_EINVAL;
+	}
+
+	rx_buf->recv_queue = recv_queue;
+
+	fastlock_acquire(&recv_queue->lock);
+	entry = dlist_remove_first_match(&recv_queue->recv_list,
+					 recv_queue->match_recv, &match_attr);
+	if (!entry) {
+		FI_DBG(&rxm_prov, FI_LOG_CQ,
+				"No matching recv found. Enqueueing msg to unexpected queue\n");
+		rx_buf->unexp_msg.addr = match_attr.addr;
+		rx_buf->unexp_msg.tag = match_attr.tag;
+		dlist_insert_tail(&rx_buf->unexp_msg.entry, &recv_queue->unexp_msg_list);
+		fastlock_release(&recv_queue->lock);
+		return 0;
+	}
+	fastlock_release(&recv_queue->lock);
+
+	rx_buf->recv_entry = container_of(entry, struct rxm_recv_entry, entry);
+	return rxm_cq_handle_data(rx_buf);
+}
+
+static int rxm_lmt_send_ack(struct rxm_rx_buf *rx_buf)
+{
+	struct rxm_tx_entry *tx_entry;
+	struct rxm_tx_buf *tx_buf;
+	int ret;
+
+	assert(rx_buf->conn);
+
+	tx_buf = (struct rxm_tx_buf *)rxm_buf_get(&rx_buf->ep->tx_pool);
+	if (!tx_buf) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "TX queue full!\n");
+		return -FI_EAGAIN;
+	}
+
+	if (!(tx_entry = rxm_tx_entry_get(&rx_buf->ep->send_queue))) {
+		ret = -FI_EAGAIN;
+		goto err1;
+	}
+
+	RXM_LOG_STATE(FI_LOG_CQ, rx_buf->pkt, RXM_LMT_READ, RXM_LMT_ACK_SENT);
+	rx_buf->hdr.state = RXM_LMT_ACK_SENT;
+
+	tx_entry->state 	= rx_buf->hdr.state;
+	tx_entry->ep 		= rx_buf->ep;
+	tx_entry->context 	= rx_buf;
+	tx_entry->tx_buf 	= tx_buf;
+
+	rxm_pkt_init(&tx_buf->pkt);
+	tx_buf->pkt.ctrl_hdr.type 	= ofi_ctrl_ack;
+	tx_buf->pkt.ctrl_hdr.conn_id 	= rx_buf->conn->handle.remote_key;
+	tx_buf->pkt.ctrl_hdr.msg_id 	= rx_buf->pkt.ctrl_hdr.msg_id;
+	tx_buf->pkt.hdr.op 		= rx_buf->pkt.hdr.op;
+
+	ret = fi_send(rx_buf->conn->msg_ep, &tx_buf->pkt, sizeof(tx_buf->pkt),
+		      tx_buf->hdr.desc, 0, tx_entry);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Unable to send ACK\n");
+		rx_buf->hdr.state = RXM_NONE;
+		goto err2;
+	}
+	return 0;
+err2:
+	rxm_tx_entry_release(&rx_buf->ep->send_queue, tx_entry);
+err1:
+	rxm_buf_release(&rx_buf->ep->tx_pool, (struct rxm_buf *)tx_buf);
 	return ret;
 }
 
-void rxm_cq_progress(struct util_cq *util_cq)
+static int rxm_handle_remote_write(struct rxm_ep *rxm_ep,
+				   struct fi_cq_tagged_entry *comp)
 {
-	ssize_t ret = 0;
-	struct rxm_cq *rxm_cq;
-	struct fi_cq_tagged_entry *comp;
+	int ret;
+
+	FI_DBG(&rxm_prov, FI_LOG_CQ, "writing remote write completion\n");
+	ret = rxm_cq_comp(rxm_ep->util_ep.rx_cq, NULL,
+			  comp->flags, 0, NULL, comp->data, 0);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ,
+				"Unable to write remote write completion\n");
+		return ret;
+	}
+	if (comp->op_context)
+		return rxm_ep_repost_buf((struct rxm_rx_buf *)comp->op_context);
+	return 0;
+}
 
-	rxm_cq = container_of(util_cq, struct rxm_cq, util_cq);
+static int rxm_cq_handle_comp(struct rxm_ep *rxm_ep,
+			      struct fi_cq_tagged_entry *comp)
+{
+	enum rxm_proto_state *state = comp->op_context;
+	struct rxm_rx_buf *rx_buf = comp->op_context;
+	struct rxm_tx_entry *tx_entry = comp->op_context;
+
+	/* Remote write events may not consume a posted recv so op context
+	 * and hence state would be NULL */
+	if (comp->flags & FI_REMOTE_WRITE)
+		return rxm_handle_remote_write(rxm_ep, comp);
+
+	switch (*state) {
+	case RXM_TX_NOBUF:
+		assert(comp->flags & (FI_SEND | FI_WRITE | FI_READ));
+		return rxm_finish_send_nobuf(tx_entry);
+	case RXM_TX:
+		assert(comp->flags & (FI_SEND | FI_WRITE));
+		return rxm_finish_send(tx_entry);
+	case RXM_RX:
+		assert(!(comp->flags & FI_REMOTE_READ));
+
+		if (rx_buf->pkt.ctrl_hdr.type == ofi_ctrl_ack)
+			return rxm_lmt_handle_ack(rx_buf);
+		else
+			return rxm_handle_recv_comp(comp->op_context);
+	case RXM_LMT_TX:
+		assert(comp->flags & FI_SEND);
+		RXM_LOG_STATE_TX(FI_LOG_CQ, tx_entry, RXM_LMT_ACK_WAIT);
+		*state = RXM_LMT_ACK_WAIT;
+		return 0;
+	case RXM_LMT_ACK_RECVD:
+		assert(comp->flags & FI_SEND);
+		return rxm_lmt_tx_finish(tx_entry);
+	case RXM_LMT_READ:
+		assert(comp->flags & FI_READ);
+		if (rx_buf->index < rx_buf->rma_iov->count)
+			return rxm_lmt_rma_read(rx_buf);
+		else
+			return rxm_lmt_send_ack(rx_buf);
+	case RXM_LMT_ACK_SENT:
+		assert(comp->flags & FI_SEND);
+		rx_buf = tx_entry->context;
+		rxm_tx_entry_release(&tx_entry->ep->send_queue, tx_entry);
+		rxm_buf_release(&rx_buf->ep->tx_pool, (struct rxm_buf *)tx_entry->tx_buf);
+
+		RXM_LOG_STATE_RX(FI_LOG_CQ, rx_buf, RXM_LMT_FINISH);
+		rx_buf->hdr.state = RXM_LMT_FINISH;
+		if (!RXM_MR_LOCAL(rx_buf->ep->rxm_info))
+			rxm_ep_msg_mr_closev(rx_buf->mr, RXM_IOV_LIMIT);
+		return rxm_finish_recv(rx_buf);
+	default:
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Invalid state!\n");
+		assert(0);
+		return -FI_EOPBADSTATE;
+	}
+}
+
+static ssize_t rxm_cq_read(struct fid_cq *msg_cq, struct fi_cq_tagged_entry *comp)
+{
+	struct rxm_tx_entry *tx_entry;
+	struct rxm_rx_buf *rx_buf;
+	struct fi_cq_err_entry err_entry;
+	struct util_cq *util_cq;
+	void *op_context;
+	ssize_t ret;
+
+	ret = fi_cq_read(msg_cq, comp, 1);
+	if (ret >= 0 || ret == -FI_EAGAIN)
+		return ret;
+
+	op_context = comp->op_context;
+	memset(&err_entry, 0, sizeof(err_entry));
+
+	if (ret == -FI_EAVAIL) {
+		OFI_CQ_READERR(&rxm_prov, FI_LOG_CQ, msg_cq,
+				ret, err_entry);
+		if (ret < 0)
+			FI_WARN(&rxm_prov, FI_LOG_CQ,
+					"Unable to fi_cq_readerr on msg cq\n");
+		else
+			op_context = err_entry.op_context;
+	}
+	switch (*(enum rxm_proto_state *)op_context) {
+	case RXM_TX:
+	case RXM_LMT_TX:
+		tx_entry = (struct rxm_tx_entry *)op_context;
+		util_cq = tx_entry->ep->util_ep.tx_cq;
+		break;
+	case RXM_LMT_ACK_SENT:
+		tx_entry = (struct rxm_tx_entry *)op_context;
+		util_cq = tx_entry->ep->util_ep.rx_cq;
+		break;
+	case RXM_RX:
+	case RXM_LMT_READ:
+		rx_buf = (struct rxm_rx_buf *)op_context;
+		util_cq = rx_buf->ep->util_ep.rx_cq;
+		break;
+	default:
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Invalid state!\n");
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "msg cq readerr: %s\n",
+				fi_cq_strerror(msg_cq, err_entry.prov_errno,
+					err_entry.err_data, NULL, 0));
+		assert(0);
+		return err_entry.err;
+	}
+	return ofi_cq_write_error(util_cq, &err_entry);
+}
+
+void rxm_cq_progress(struct rxm_ep *rxm_ep)
+{
+	struct fi_cq_tagged_entry comp;
+	ssize_t ret, comp_read = 0;
 
-	fastlock_acquire(&util_cq->cq_lock);
 	do {
-		if (cirque_isfull(util_cq->cirq))
-			goto out;
+		ret = rxm_cq_read(rxm_ep->msg_cq, &comp);
+		if (ret == -FI_EAGAIN)
+			break;
 
-		comp = cirque_tail(util_cq->cirq);
-		ret = rxm_msg_cq_read(util_cq, rxm_cq->msg_cq, comp);
 		if (ret < 0)
-			goto out;
-		cirque_commit(util_cq->cirq);
-	} while (ret > 0);
-out:
-	fastlock_release(&util_cq->cq_lock);
+			goto err;
+
+		if (ret) {
+			comp_read += ret;
+			ret = rxm_cq_handle_comp(rxm_ep, &comp);
+			if (ret)
+				goto err;
+		}
+	} while (comp_read < rxm_ep->comp_per_progress);
+	return;
+err:
+	// TODO report error on RXM EP/domain since EP/CQ is broken.
+	return;
 }
 
 static int rxm_cq_close(struct fid *fid)
 {
-	struct rxm_cq *rxm_cq;
+	struct util_cq *util_cq;
 	int ret, retv = 0;
 
-	rxm_cq = container_of(fid, struct rxm_cq, util_cq.cq_fid.fid);
+	util_cq = container_of(fid, struct util_cq, cq_fid.fid);
 
-	ret = ofi_cq_cleanup(&rxm_cq->util_cq);
+	ret = ofi_cq_cleanup(util_cq);
 	if (ret)
 		retv = ret;
 
-	ret = fi_close(&rxm_cq->msg_cq->fid);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_CQ, "Unable to close MSG CQ\n");
-		retv = ret;
-	}
-	free(rxm_cq);
+	free(util_cq);
 	return retv;
 }
 
@@ -112,37 +653,38 @@ static struct fi_ops rxm_cq_fi_ops = {
 	.ops_open = fi_no_ops_open,
 };
 
+static struct fi_ops_cq rxm_cq_ops = {
+	.size = sizeof(struct fi_ops_cq),
+	.read = ofi_cq_read,
+	.readfrom = ofi_cq_readfrom,
+	.readerr = ofi_cq_readerr,
+	.sread = fi_no_cq_sread,
+	.sreadfrom = fi_no_cq_sreadfrom,
+	.signal = fi_no_cq_signal,
+	.strerror = rxm_cq_strerror,
+};
+
 int rxm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		 struct fid_cq **cq_fid, void *context)
 {
-	struct rxm_domain *rxm_domain;
-	struct rxm_cq *rxm_cq;
+	struct util_cq *util_cq;
 	int ret;
 
-	rxm_cq = calloc(1, sizeof(*rxm_cq));
-	if (!rxm_cq)
+	util_cq = calloc(1, sizeof(*util_cq));
+	if (!util_cq)
 		return -FI_ENOMEM;
 
-	rxm_domain = container_of(domain, struct rxm_domain, util_domain.domain_fid);
-
-	ret = fi_cq_open(rxm_domain->msg_domain, attr, &rxm_cq->msg_cq, context);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_CQ, "Unable to open MSG CQ\n");
-		goto err1;
-	}
-
-	ret = ofi_cq_init(&rxm_prov, domain, attr, &rxm_cq->util_cq,
-			&rxm_cq_progress, context);
+	ret = ofi_cq_init(&rxm_prov, domain, attr, util_cq, &ofi_cq_progress,
+			context);
 	if (ret)
-		goto err2;
+		goto err1;
 
-	*cq_fid = &rxm_cq->util_cq.cq_fid;
+	*cq_fid = &util_cq->cq_fid;
 	/* Override util_cq_fi_ops */
 	(*cq_fid)->fid.ops = &rxm_cq_fi_ops;
+	(*cq_fid)->ops = &rxm_cq_ops;
 	return 0;
-err2:
-	fi_close(&rxm_cq->msg_cq->fid);
 err1:
-	free(rxm_cq);
+	free(util_cq);
 	return ret;
 }
diff --git a/prov/rxm/src/rxm_domain.c b/prov/rxm/src/rxm_domain.c
index eea6f32..e783da5 100644
--- a/prov/rxm/src/rxm_domain.c
+++ b/prov/rxm/src/rxm_domain.c
@@ -47,6 +47,7 @@ static struct fi_ops_domain rxm_domain_ops = {
 	.poll_open = fi_poll_create,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = fi_no_query_atomic,
 };
 
 static int rxm_domain_close(fid_t fid)
@@ -111,6 +112,12 @@ static int rxm_mr_reg(struct fid *domain_fid, const void *buf, size_t len,
 	if (!(rxm_mr = calloc(1, sizeof(*rxm_mr))))
 		return -FI_ENOMEM;
 
+	/* Additional flags to use RMA read for large message transfers */
+	access |= FI_READ | FI_REMOTE_READ;
+
+	if (rxm_domain->mr_local)
+		access |= FI_WRITE;
+
 	ret = fi_mr_reg(rxm_domain->msg_domain, buf, len, access, offset, requested_key,
 			flags, &rxm_mr->msg_mr, context);
 	if (ret) {
@@ -121,7 +128,10 @@ static int rxm_mr_reg(struct fid *domain_fid, const void *buf, size_t len,
 	rxm_mr->mr_fid.fid.fclass = FI_CLASS_MR;
 	rxm_mr->mr_fid.fid.context = context;
 	rxm_mr->mr_fid.fid.ops = &rxm_mr_ops;
-	rxm_mr->mr_fid.mem_desc = fi_mr_desc(rxm_mr->msg_mr);
+	/* Store msg_mr as rxm_mr descriptor so that we can get its key when
+	 * the app passes msg_mr as the descriptor in fi_send and friends.
+	 * The key would be used in large message transfer protocol. */
+	rxm_mr->mr_fid.mem_desc = rxm_mr->msg_mr;
 	rxm_mr->mr_fid.key = fi_mr_key(rxm_mr->msg_mr);
 	*mr = &rxm_mr->mr_fid;
 
@@ -152,12 +162,17 @@ int rxm_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 
 	rxm_fabric = container_of(fabric, struct rxm_fabric, util_fabric.fabric_fid);
 
-	ret = ofix_getinfo(rxm_prov.version, NULL, NULL, 0, &rxm_util_prov,
-			info, rxm_alter_layer_info, rxm_alter_base_info,
-			1, &msg_info);
+	ret = ofi_get_core_info(fabric->api_version, NULL, NULL, 0, &rxm_util_prov,
+				info, rxm_info_to_core, &msg_info);
 	if (ret)
 		goto err1;
 
+	/* Force core provider to supply MR key */
+	if (FI_VERSION_LT(fabric->api_version, FI_VERSION(1, 5)))
+		msg_info->domain_attr->mr_mode = FI_MR_BASIC;
+	else
+		msg_info->domain_attr->mr_mode |= FI_MR_PROV_KEY;
+
 	ret = fi_domain(rxm_fabric->msg_fabric, msg_info,
 			&rxm_domain->msg_domain, context);
 	if (ret)
@@ -174,6 +189,9 @@ int rxm_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	(*domain)->mr = &rxm_domain_mr_ops;
 	(*domain)->ops = &rxm_domain_ops;
 
+	rxm_domain->mr_local = RXM_MR_LOCAL(msg_info) && !RXM_MR_LOCAL(info);
+
+	fi_freeinfo(msg_info);
 	return 0;
 err3:
 	fi_close(&rxm_domain->msg_domain->fid);
diff --git a/prov/rxm/src/rxm_ep.c b/prov/rxm/src/rxm_ep.c
index bf96dcc..dcb4a08 100644
--- a/prov/rxm/src/rxm_ep.c
+++ b/prov/rxm/src/rxm_ep.c
@@ -30,11 +30,285 @@
  * SOFTWARE.
  */
 
-#include <stdlib.h>
-#include <string.h>
+#include <inttypes.h>
+
+#include "fi.h"
+#include <fi_iov.h>
+#include <fi_util.h>
 
 #include "rxm.h"
 
+static int rxm_match_recv_entry(struct dlist_entry *item, const void *arg)
+{
+	struct rxm_recv_match_attr *attr = (struct rxm_recv_match_attr *) arg;
+	struct rxm_recv_entry *recv_entry;
+
+	recv_entry = container_of(item, struct rxm_recv_entry, entry);
+	return rxm_match_addr(recv_entry->addr, attr->addr);
+}
+
+static int rxm_match_recv_entry_tagged(struct dlist_entry *item, const void *arg)
+{
+	struct rxm_recv_match_attr *attr = (struct rxm_recv_match_attr *)arg;
+	struct rxm_recv_entry *recv_entry;
+
+	recv_entry = container_of(item, struct rxm_recv_entry, entry);
+	return rxm_match_addr(recv_entry->addr, attr->addr) &&
+		rxm_match_tag(recv_entry->tag, recv_entry->ignore, attr->tag);
+}
+
+static int rxm_match_recv_entry_context(struct dlist_entry *item, const void *context)
+{
+	struct rxm_recv_entry *recv_entry;
+
+	recv_entry = container_of(item, struct rxm_recv_entry, entry);
+	return recv_entry->context == context;
+}
+
+static int rxm_match_unexp_msg(struct dlist_entry *item, const void *arg)
+{
+	struct rxm_recv_match_attr *attr = (struct rxm_recv_match_attr *)arg;
+	struct rxm_unexp_msg *unexp_msg;
+
+	unexp_msg = container_of(item, struct rxm_unexp_msg, entry);
+	return rxm_match_addr(unexp_msg->addr, attr->addr);
+}
+
+static int rxm_match_unexp_msg_tagged(struct dlist_entry *item, const void *arg)
+{
+	struct rxm_recv_match_attr *attr = (struct rxm_recv_match_attr *)arg;
+	struct rxm_unexp_msg *unexp_msg;
+
+	unexp_msg = container_of(item, struct rxm_unexp_msg, entry);
+	return rxm_match_addr(attr->tag, unexp_msg->addr) &&
+		rxm_match_tag(attr->tag, attr->ignore, unexp_msg->tag);
+}
+
+static void rxm_mr_buf_close(void *pool_ctx, void *context)
+{
+	/* We would get a (fid_mr *) in context but it is safe to cast it into (fid *) */
+	fi_close((struct fid *)context);
+}
+
+static int rxm_mr_buf_reg(void *pool_ctx, void *addr, size_t len, void **context)
+{
+	int ret;
+	struct fid_mr *mr;
+	struct fid_domain *msg_domain = (struct fid_domain *)pool_ctx;
+
+	ret = fi_mr_reg(msg_domain, addr, len, FI_SEND | FI_RECV | FI_READ |
+			FI_WRITE, 0, 0, 0, &mr, NULL);
+	*context = mr;
+	return ret;
+}
+
+void rxm_buf_release(struct rxm_buf_pool *pool, struct rxm_buf *buf)
+{
+	fastlock_acquire(&pool->lock);
+	dlist_remove(&buf->entry);
+	util_buf_release(pool->pool, buf);
+	fastlock_release(&pool->lock);
+}
+
+struct rxm_buf *rxm_buf_get(struct rxm_buf_pool *pool)
+{
+	struct rxm_buf *buf;
+	struct fid_mr *mr = NULL;
+
+	fastlock_acquire(&pool->lock);
+	if (pool->local_mr)
+		buf = util_buf_alloc_ex(pool->pool, (void **)&mr);
+	else
+		buf = util_buf_alloc(pool->pool);
+	if (!buf) {
+		fastlock_release(&pool->lock);
+		return NULL;
+	}
+	memset(buf, 0, sizeof(*buf));
+
+	dlist_insert_tail(&buf->entry, &pool->buf_list);
+	fastlock_release(&pool->lock);
+
+	if (pool->local_mr && mr)
+		buf->desc = fi_mr_desc(mr);
+	return buf;
+}
+
+static void rxm_buf_pool_destroy(struct rxm_buf_pool *pool)
+{
+	struct dlist_entry *entry;
+	struct rxm_buf *buf;
+
+	while(!dlist_empty(&pool->buf_list)) {
+		entry = pool->buf_list.next;
+		buf = container_of(entry, struct rxm_buf, entry);
+		rxm_buf_release(pool, buf);
+	}
+	fastlock_destroy(&pool->lock);
+	util_buf_pool_destroy(pool->pool);
+}
+
+static int rxm_buf_pool_create(int local_mr, size_t count, size_t size,
+		struct rxm_buf_pool *pool, void *pool_ctx)
+{
+	pool->pool = local_mr ? util_buf_pool_create_ex(RXM_BUF_SIZE + size, 16, 0, count,
+				rxm_mr_buf_reg, rxm_mr_buf_close, pool_ctx) :
+		util_buf_pool_create(RXM_BUF_SIZE, 16, 0, count);
+	if (!pool->pool) {
+		FI_WARN(&rxm_prov, FI_LOG_EP_DATA, "Unable to create buf pool\n");
+		return -FI_ENOMEM;
+	}
+	dlist_init(&pool->buf_list);
+	pool->local_mr = local_mr;
+	fastlock_init(&pool->lock);
+	return 0;
+}
+
+static int rxm_send_queue_init(struct rxm_send_queue *send_queue, size_t size)
+{
+	send_queue->fs = rxm_txe_fs_create(size);
+	if (!send_queue->fs)
+		return -FI_ENOMEM;
+
+	ofi_key_idx_init(&send_queue->tx_key_idx, fi_size_bits(size));
+	fastlock_init(&send_queue->lock);
+	return 0;
+}
+
+static int rxm_recv_queue_init(struct rxm_recv_queue *recv_queue, size_t size,
+			       enum rxm_recv_queue_type type)
+{
+	recv_queue->type = type;
+	recv_queue->fs = rxm_recv_fs_create(size);
+	if (!recv_queue->fs)
+		return -FI_ENOMEM;
+
+	dlist_init(&recv_queue->recv_list);
+	dlist_init(&recv_queue->unexp_msg_list);
+	if (type == RXM_RECV_QUEUE_MSG) {
+		recv_queue->match_recv = rxm_match_recv_entry;
+		recv_queue->match_unexp = rxm_match_unexp_msg;
+	} else {
+		recv_queue->match_recv = rxm_match_recv_entry_tagged;
+		recv_queue->match_unexp = rxm_match_unexp_msg_tagged;
+	}
+	fastlock_init(&recv_queue->lock);
+	return 0;
+}
+
+static void rxm_send_queue_close(struct rxm_send_queue *send_queue)
+{
+	if (send_queue->fs)
+		rxm_txe_fs_free(send_queue->fs);
+	fastlock_destroy(&send_queue->lock);
+}
+
+static void rxm_recv_queue_close(struct rxm_recv_queue *recv_queue)
+{
+	if (recv_queue->fs)
+		rxm_recv_fs_free(recv_queue->fs);
+	fastlock_destroy(&recv_queue->lock);
+	// TODO cleanup recv_list and unexp msg list
+}
+
+static int rxm_ep_txrx_res_open(struct rxm_ep *rxm_ep)
+{
+	struct rxm_domain *rxm_domain;
+	int ret;
+
+	rxm_domain = container_of(rxm_ep->util_ep.domain, struct rxm_domain, util_domain);
+
+	FI_DBG(&rxm_prov, FI_LOG_EP_CTRL, "MSG provider mr_mode & FI_MR_LOCAL: %d\n",
+			RXM_MR_LOCAL(rxm_ep->msg_info));
+
+	ret = rxm_buf_pool_create(RXM_MR_LOCAL(rxm_ep->msg_info),
+				  rxm_ep->msg_info->tx_attr->size,
+				  sizeof(struct rxm_tx_buf), &rxm_ep->tx_pool,
+				  rxm_domain->msg_domain);
+	if (ret)
+	        return ret;
+
+	ret = rxm_buf_pool_create(RXM_MR_LOCAL(rxm_ep->msg_info),
+				  rxm_ep->msg_info->rx_attr->size,
+				  sizeof(struct rxm_rx_buf), &rxm_ep->rx_pool,
+				  rxm_domain->msg_domain);
+	if (ret)
+		goto err1;
+
+	ret = rxm_send_queue_init(&rxm_ep->send_queue, rxm_ep->rxm_info->tx_attr->size);
+	if (ret)
+		goto err2;
+
+	ret = rxm_recv_queue_init(&rxm_ep->recv_queue, rxm_ep->rxm_info->rx_attr->size,
+				  RXM_RECV_QUEUE_MSG);
+	if (ret)
+		goto err3;
+
+	ret = rxm_recv_queue_init(&rxm_ep->trecv_queue, rxm_ep->rxm_info->rx_attr->size,
+				  RXM_RECV_QUEUE_TAGGED);
+	if (ret)
+		goto err4;
+
+	return 0;
+err4:
+	rxm_recv_queue_close(&rxm_ep->recv_queue);
+err3:
+	rxm_send_queue_close(&rxm_ep->send_queue);
+err2:
+	rxm_buf_pool_destroy(&rxm_ep->tx_pool);
+err1:
+	rxm_buf_pool_destroy(&rxm_ep->rx_pool);
+	return ret;
+}
+
+static void rxm_ep_txrx_res_close(struct rxm_ep *rxm_ep)
+{
+
+	rxm_recv_queue_close(&rxm_ep->trecv_queue);
+	rxm_recv_queue_close(&rxm_ep->recv_queue);
+	rxm_send_queue_close(&rxm_ep->send_queue);
+
+	rxm_buf_pool_destroy(&rxm_ep->rx_pool);
+	rxm_buf_pool_destroy(&rxm_ep->tx_pool);
+}
+
+int rxm_ep_repost_buf(struct rxm_rx_buf *rx_buf)
+{
+	struct rxm_buf hdr = rx_buf->hdr;
+	struct rxm_ep *rxm_ep = rx_buf->ep;
+	int ret;
+
+	memset(rx_buf, 0, sizeof(*rx_buf));
+	rx_buf->hdr = hdr;
+	rx_buf->hdr.state = RXM_RX;
+	rx_buf->ep = rxm_ep;
+
+	ret = fi_recv(rx_buf->hdr.msg_ep, &rx_buf->pkt, RXM_BUF_SIZE,
+		      rx_buf->hdr.desc, FI_ADDR_UNSPEC, rx_buf);
+	if (ret)
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to repost buf\n");
+	return ret;
+}
+
+int rxm_ep_prepost_buf(struct rxm_ep *rxm_ep, struct fid_ep *msg_ep)
+{
+	struct rxm_rx_buf *rx_buf;
+	int ret;
+	size_t i;
+
+	for (i = 0; i < rxm_ep->msg_info->rx_attr->size; i++) {
+		rx_buf = (struct rxm_rx_buf *)rxm_buf_get(&rxm_ep->rx_pool);
+		rx_buf->hdr.state = RXM_RX;
+		rx_buf->hdr.msg_ep = msg_ep;
+		rx_buf->ep = rxm_ep;
+		ret = rxm_ep_repost_buf(rx_buf);
+		if (ret) {
+			rxm_buf_release(&rxm_ep->rx_pool, (struct rxm_buf *)rx_buf);
+			return ret;
+		}
+	}
+	return 0;
+}
 
 int rxm_setname(fid_t fid, void *addr, size_t addrlen)
 {
@@ -52,7 +326,7 @@ int rxm_getname(fid_t fid, void *addr, size_t *addrlen)
 	return fi_getname(&rxm_ep->msg_pep->fid, addr, addrlen);
 }
 
-static struct fi_ops_cm rxm_cm_ops = {
+static struct fi_ops_cm rxm_ops_cm = {
 	.size = sizeof(struct fi_ops_cm),
 	.setname = rxm_setname,
 	.getname = rxm_getname,
@@ -62,6 +336,7 @@ static struct fi_ops_cm rxm_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
 int rxm_getopt(fid_t fid, int level, int optname,
@@ -76,9 +351,55 @@ int rxm_setopt(fid_t fid, int level, int optname,
 	return -FI_ENOPROTOOPT;
 }
 
-static struct fi_ops_ep rxm_ep_ops = {
+static int rxm_ep_cancel_recv(struct rxm_ep *rxm_ep,
+			      struct rxm_recv_queue *recv_queue, void *context)
+{
+	struct fi_cq_err_entry err_entry;
+	struct rxm_recv_entry *recv_entry;
+	struct dlist_entry *entry;
+
+	fastlock_acquire(&recv_queue->lock);
+	entry = dlist_remove_first_match(&recv_queue->recv_list,
+					 rxm_match_recv_entry_context,
+					 context);
+	fastlock_release(&recv_queue->lock);
+	if (entry) {
+		recv_entry = container_of(entry, struct rxm_recv_entry, entry);
+		memset(&err_entry, 0, sizeof(err_entry));
+		err_entry.op_context = recv_entry->context;
+		if (recv_queue->type == RXM_RECV_QUEUE_TAGGED) {
+			err_entry.flags |= FI_TAGGED | FI_RECV;
+			err_entry.tag = recv_entry->tag;
+		} else {
+			err_entry.flags = FI_MSG | FI_RECV;
+		}
+		err_entry.err = FI_ECANCELED;
+		err_entry.prov_errno = -FI_ECANCELED;
+		rxm_recv_entry_release(recv_queue, recv_entry);
+		return ofi_cq_write_error(rxm_ep->util_ep.rx_cq, &err_entry);
+	}
+	return 0;
+}
+
+static ssize_t rxm_ep_cancel(fid_t fid_ep, void *context)
+{
+	struct rxm_ep *rxm_ep = container_of(fid_ep, struct rxm_ep, util_ep.ep_fid);
+	int ret;
+
+	ret = rxm_ep_cancel_recv(rxm_ep, &rxm_ep->recv_queue, context);
+	if (ret)
+		return ret;
+
+	ret = rxm_ep_cancel_recv(rxm_ep, &rxm_ep->trecv_queue, context);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+static struct fi_ops_ep rxm_ops_ep = {
 	.size = sizeof(struct fi_ops_ep),
-	.cancel = fi_no_cancel,
+	.cancel = rxm_ep_cancel,
 	.getopt = rxm_getopt,
 	.setopt = rxm_setopt,
 	.tx_ctx = fi_no_tx_ctx,
@@ -87,226 +408,645 @@ static struct fi_ops_ep rxm_ep_ops = {
 	.tx_size_left = fi_no_tx_size_left,
 };
 
-ssize_t rxm_recvmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
-		uint64_t flags)
+/* Caller must hold recv_queue->lock */
+static int rxm_check_unexp_msg_list(struct rxm_ep *rxm_ep,
+				    struct rxm_recv_queue *recv_queue,
+				    struct rxm_recv_entry *recv_entry,
+				    struct rxm_rx_buf **rx_buf)
 {
-	struct rxm_ep *rxm_ep;
+	struct rxm_recv_match_attr match_attr;
+	struct dlist_entry *entry;
 
-	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	return fi_recvmsg(rxm_ep->srx_ctx, msg, flags);
+	if (dlist_empty(&recv_queue->unexp_msg_list))
+		return -FI_EAGAIN;
+
+	match_attr.addr = recv_entry->addr;
+	if (recv_queue->type == RXM_RECV_QUEUE_TAGGED)
+		match_attr.tag = recv_entry->tag;
+	match_attr.ignore = recv_entry->ignore;
+
+	entry = dlist_remove_first_match(&recv_queue->unexp_msg_list,
+					 recv_queue->match_unexp, &match_attr);
+	if (!entry)
+		return -FI_EAGAIN;
+
+	FI_DBG(&rxm_prov, FI_LOG_EP_DATA,
+	       "Match for posted recv found in unexp msg list\n");
+	*rx_buf = container_of(entry, struct rxm_rx_buf, unexp_msg.entry);
+	return 0;
+}
+
+static int rxm_ep_recv_common(struct rxm_ep *rxm_ep, const struct iovec *iov,
+			      void **desc, size_t count, fi_addr_t src_addr,
+			      uint64_t tag, uint64_t ignore, void *context,
+			      uint64_t flags, struct rxm_recv_queue *recv_queue)
+{
+	struct rxm_recv_entry *recv_entry;
+	struct rxm_rx_buf *rx_buf;
+	int ret;
+	size_t i;
+
+	if (!(recv_entry = rxm_recv_entry_get(recv_queue)))
+		return -FI_EAGAIN;
+
+	for (i = 0; i < count; i++) {
+		recv_entry->iov[i].iov_base = iov[i].iov_base;
+		recv_entry->iov[i].iov_len = iov[i].iov_len;
+		if (desc)
+			recv_entry->desc[i] = desc[i];
+	}
+	recv_entry->count 	= count;
+	recv_entry->addr 	= (rxm_ep->rxm_info->caps & FI_DIRECTED_RECV) ?
+				  src_addr : FI_ADDR_UNSPEC;
+	recv_entry->context 	= context;
+	recv_entry->flags 	= flags;
+	recv_entry->ignore 	= ignore;
+	if (recv_queue->type == RXM_RECV_QUEUE_TAGGED)
+		recv_entry->tag = tag;
+
+	fastlock_acquire(&recv_queue->lock);
+	ret = rxm_check_unexp_msg_list(rxm_ep, recv_queue, recv_entry, &rx_buf);
+	if (ret) {
+		if (ret == -FI_EAGAIN) {
+			dlist_insert_tail(&recv_entry->entry,
+					  &recv_queue->recv_list);
+			ret = 0;
+		} else {
+			FI_WARN(&rxm_prov, FI_LOG_EP_DATA,
+					"Unable to check unexp msg list\n");
+			freestack_push(recv_queue->fs, recv_entry);
+		}
+		fastlock_release(&recv_queue->lock);
+	} else {
+		fastlock_release(&recv_queue->lock);
+		rx_buf->recv_entry = recv_entry;
+		ret = rxm_cq_handle_data(rx_buf);
+	}
+	return ret;
 }
 
-ssize_t rxm_recvv(struct fid_ep *ep_fid, const struct iovec *iov, void **desc,
-		size_t count, fi_addr_t src_addr, void *context)
+static ssize_t rxm_ep_recvmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
+			       uint64_t flags)
+{
+	struct rxm_ep *rxm_ep = container_of(ep_fid, struct rxm_ep,
+					     util_ep.ep_fid.fid);
+
+	return rxm_ep_recv_common(rxm_ep, msg->msg_iov, msg->desc, msg->iov_count,
+				  msg->addr, 0, 0, msg->context,
+				  flags | (rxm_ep_rx_flags(ep_fid) & FI_COMPLETION),
+				  &rxm_ep->recv_queue);
+}
+
+static ssize_t rxm_ep_recv(struct fid_ep *ep_fid, void *buf, size_t len, void *desc,
+			    fi_addr_t src_addr, void *context)
 {
 	struct rxm_ep *rxm_ep;
+	struct iovec iov;
+	memset(&iov, 0, sizeof(iov));
+	iov.iov_base = buf;
+	iov.iov_len = len;
 
 	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	return fi_recvv(rxm_ep->srx_ctx, iov, desc, count, 0, context);
+
+	return rxm_ep_recv_common(rxm_ep, &iov, &desc, 1, src_addr, 0, 0,
+				  context, rxm_ep_rx_flags(ep_fid),
+				  &rxm_ep->recv_queue);
 }
 
-ssize_t rxm_recv(struct fid_ep *ep_fid, void *buf, size_t len, void *desc,
-		fi_addr_t src_addr, void *context)
+static ssize_t rxm_ep_recvv(struct fid_ep *ep_fid, const struct iovec *iov,
+		void **desc, size_t count, fi_addr_t src_addr, void *context)
 {
-	struct rxm_ep *rxm_ep;
+	struct rxm_ep *rxm_ep = container_of(ep_fid, struct rxm_ep,
+					     util_ep.ep_fid.fid);
+
+	return rxm_ep_recv_common(rxm_ep, iov, desc, count, src_addr, 0, 0,
+				  context, rxm_ep_rx_flags(ep_fid),
+				  &rxm_ep->recv_queue);
+}
 
-	/* TODO Handle recv from particular src */
-	if (src_addr) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_DATA,
-				"Unable to post recv for a particular source\n");
-		return -FI_EINVAL;
+static void rxm_op_hdr_process_flags(struct ofi_op_hdr *hdr, uint64_t flags,
+		uint64_t data)
+{
+	if (flags & FI_REMOTE_CQ_DATA) {
+		hdr->flags = OFI_REMOTE_CQ_DATA;
+		hdr->data = data;
 	}
+	if (flags & FI_TRANSMIT_COMPLETE)
+		hdr->flags |= OFI_TRANSMIT_COMPLETE;
+	if (flags & FI_DELIVERY_COMPLETE)
+		hdr->flags |= OFI_DELIVERY_COMPLETE;
+}
 
-	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	return fi_recv(rxm_ep->srx_ctx, buf, len, desc, 0, context);
+void rxm_pkt_init(struct rxm_pkt *pkt)
+{
+	memset(pkt, 0, sizeof(*pkt));
+	pkt->ctrl_hdr.version = OFI_CTRL_VERSION;
+	pkt->hdr.version = OFI_OP_VERSION;
 }
 
-ssize_t rxm_send(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc,
-		fi_addr_t dest_addr, void *context)
+void rxm_ep_msg_mr_closev(struct fid_mr **mr, size_t count)
 {
-	struct rxm_ep *rxm_ep;
-	struct fid_ep *msg_ep;
-	ssize_t ret;
+	int ret;
+	size_t i;
+
+	for (i = 0; i < count; i++) {
+		if (mr[i]) {
+			ret = fi_close(&mr[i]->fid);
+			if (ret)
+				FI_WARN(&rxm_prov, FI_LOG_EP_DATA,
+					"Unable to close msg mr: %d\n", i);
+		}
+	}
+}
 
-	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	fastlock_acquire(&rxm_ep->cmap->lock);
-	ret = rxm_get_msg_ep(rxm_ep, dest_addr, &msg_ep);
-	if (ret)
-		goto unlock;
+int rxm_ep_msg_mr_regv(struct rxm_ep *rxm_ep, const struct iovec *iov,
+		       size_t count, uint64_t access, struct fid_mr **mr)
+{
+	struct rxm_domain *rxm_domain;
+	int ret;
+	size_t i;
+
+	rxm_domain = container_of(rxm_ep->util_ep.domain, struct rxm_domain, util_domain);
 
-	// TODO handle the case when send fails due to connection shutdown
-	ret = fi_send(msg_ep, buf, len, desc, 0, context);
-unlock:
-	fastlock_release(&rxm_ep->cmap->lock);
+	// TODO do fi_mr_regv if provider supports it
+	for (i = 0; i < count; i++) {
+		ret = fi_mr_reg(rxm_domain->msg_domain, iov->iov_base,
+				iov->iov_len, access, 0, 0, 0, &mr[i], NULL);
+		if (ret)
+			goto err;
+	}
+	return 0;
+err:
+	rxm_ep_msg_mr_closev(mr, count);
 	return ret;
 }
 
-ssize_t rxm_sendmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
-		uint64_t flags)
+static ssize_t rxm_rma_iov_init(struct rxm_ep *rxm_ep, void *buf,
+				const struct iovec *iov, size_t count,
+				struct fid_mr **mr)
+{
+	struct rxm_rma_iov *rma_iov = (struct rxm_rma_iov *)buf;
+	size_t i;
+
+	for (i = 0; i < count; i++) {
+		rma_iov->iov[i].addr = RXM_MR_VIRT_ADDR(rxm_ep->msg_info) ?
+			(uintptr_t)iov->iov_base : 0;
+		rma_iov->iov[i].len = (uint64_t)iov->iov_len;
+		rma_iov->iov[i].key = fi_mr_key(mr[i]);
+	}
+	rma_iov->count = count;
+	return sizeof(*rma_iov) + sizeof(*rma_iov->iov) * count;
+}
+
+// TODO handle all flags
+static ssize_t rxm_ep_send_common(struct fid_ep *ep_fid, const struct iovec *iov,
+		void **desc, size_t count, fi_addr_t dest_addr, void *context,
+		uint64_t data, uint64_t tag, uint64_t flags, int op)
 {
+	struct util_cmap_handle *handle;
 	struct rxm_ep *rxm_ep;
-	struct fid_ep *msg_ep;
-	ssize_t ret;
+	struct rxm_conn *rxm_conn;
+	struct rxm_tx_entry *tx_entry;
+	struct rxm_tx_buf *tx_buf;
+	struct rxm_pkt *pkt;
+	struct fid_mr **mr_iov;
+	size_t pkt_size = 0;
+	ssize_t size;
+	uint8_t progress = 0;
+	int ret;
 
 	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	fastlock_acquire(&rxm_ep->cmap->lock);
-	ret = rxm_get_msg_ep(rxm_ep, msg->addr, &msg_ep);
+
+	ret = ofi_cmap_get_handle(rxm_ep->util_ep.cmap, dest_addr, &handle);
 	if (ret)
-		goto unlock;
+		return ret;
+	rxm_conn = container_of(handle, struct rxm_conn, handle);
+
+	tx_buf = (struct rxm_tx_buf *)rxm_buf_get(&rxm_ep->tx_pool);
+	if (!tx_buf) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "TX queue full!\n");
+		return -FI_EAGAIN;
+	}
+
+	if (!(tx_entry = rxm_tx_entry_get(&rxm_ep->send_queue)))
+		return -FI_EAGAIN;
+
+	tx_entry->ep = rxm_ep;
+	tx_entry->count = count;
+	tx_entry->context = context;
+	tx_entry->flags = flags;
+	tx_entry->tx_buf = tx_buf;
+
+	tx_buf->hdr.msg_ep = rxm_conn->msg_ep;
+
+	pkt = &tx_buf->pkt;
+
+	rxm_pkt_init(pkt);
+	pkt->ctrl_hdr.conn_id = rxm_conn->handle.remote_key;
+	pkt->hdr.op = op;
+	pkt->hdr.size = ofi_total_iov_len(iov, count);
+	rxm_op_hdr_process_flags(&pkt->hdr, flags, data);
+
+	if (op == ofi_op_tagged) {
+		pkt->hdr.tag = tag;
+		tx_entry->comp_flags = FI_TAGGED;
+	} else {
+		tx_entry->comp_flags = FI_MSG;
+	}
+	tx_entry->comp_flags |= FI_SEND;
+
+	if (pkt->hdr.size > rxm_ep->rxm_info->tx_attr->inject_size) {
+		if (flags & FI_INJECT) {
+			FI_WARN(&rxm_prov, FI_LOG_EP_DATA,
+					"inject size supported: %d, msg size: %d\n",
+					rxm_tx_attr.inject_size,
+					pkt->hdr.size);
+			ret = -FI_EMSGSIZE;
+			goto done;
+		}
+		fastlock_acquire(&rxm_ep->send_queue.lock);
+		pkt->ctrl_hdr.msg_id = ofi_idx2key(&rxm_ep->send_queue.tx_key_idx,
+						   rxm_txe_fs_index(rxm_ep->send_queue.fs,
+								    tx_entry));
+		fastlock_release(&rxm_ep->send_queue.lock);
+		pkt->ctrl_hdr.type = ofi_ctrl_large_data;
+
+		if (!RXM_MR_LOCAL(rxm_ep->rxm_info)) {
+			ret = rxm_ep_msg_mr_regv(rxm_ep, iov, tx_entry->count,
+						 FI_REMOTE_READ, tx_entry->mr);
+			if (ret)
+				goto done;
+			mr_iov = tx_entry->mr;
+		} else {
+			/* desc is msg fid_mr * array */
+			mr_iov = (struct fid_mr **)desc;
+		}
+		size = rxm_rma_iov_init(rxm_ep, &tx_entry->tx_buf->pkt.data, iov,
+					count, mr_iov);
+		if (size < 0) {
+			ret = size;
+			goto done;
+		}
+
+		pkt_size = sizeof(*pkt) + size;
+		RXM_LOG_STATE_TX(FI_LOG_CQ, tx_entry, RXM_LMT_TX);
+		tx_entry->state = RXM_LMT_TX;
+	} else {
+		pkt->ctrl_hdr.type = ofi_ctrl_data;
+		ofi_copy_from_iov(pkt->data, pkt->hdr.size, iov, count, 0);
+		pkt_size = sizeof(*pkt) + pkt->hdr.size;
+		tx_entry->state = RXM_TX;
+	}
 
-	ret = fi_sendmsg(msg_ep, msg, flags);
-unlock:
-	fastlock_release(&rxm_ep->cmap->lock);
+	if ((flags & FI_INJECT) && !(flags & FI_COMPLETION)) {
+		if (pkt_size <= rxm_ep->msg_info->tx_attr->inject_size) {
+			if (tx_entry->state == RXM_LMT_TX) {
+				RXM_LOG_STATE_TX(FI_LOG_CQ, tx_entry,
+						 RXM_LMT_TX);
+				tx_entry->state = RXM_LMT_ACK_WAIT;
+			}
+			ret = fi_inject(rxm_conn->msg_ep, pkt, pkt_size, 0);
+			if (ret)
+				FI_DBG(&rxm_prov, FI_LOG_EP_DATA,
+				       "fi_inject for MSG provider failed\n");
+			/* release allocated buffer for further reuse */
+			goto done;
+		} else {
+			progress = 1;
+			FI_DBG(&rxm_prov, FI_LOG_EP_DATA, "passed data (size = %d) is too "
+				"big for MSG provider (max inject size = %d) \n",
+				(int)pkt_size, rxm_ep->msg_info->tx_attr->inject_size);
+		}
+	}
+
+	ret = fi_send(rxm_conn->msg_ep, pkt, pkt_size, tx_buf->hdr.desc, 0, tx_entry);
+	if (ret) {
+		if ((ret == -FI_EAGAIN) && progress) {
+			progress = 0;
+			rxm_cq_progress(rxm_ep);
+		} else {
+			FI_WARN(&rxm_prov, FI_LOG_EP_DATA,
+				"fi_send for MSG provider failed\n");
+		}
+		goto done;
+	}
+	return 0;
+done:
+	rxm_buf_release(&rxm_ep->tx_pool, (struct rxm_buf *)tx_buf);
+	rxm_tx_entry_release(&rxm_ep->send_queue, tx_entry);
 	return ret;
 }
 
-ssize_t rxm_sendv(struct fid_ep *ep_fid, const struct iovec *iov, void **desc,
-		size_t count, fi_addr_t dest_addr, void *context)
+static ssize_t rxm_ep_sendmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
+			       uint64_t flags)
 {
-	struct rxm_ep *rxm_ep;
-	struct fid_ep *msg_ep;
-	ssize_t ret;
 
-	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	fastlock_acquire(&rxm_ep->cmap->lock);
-	ret = rxm_get_msg_ep(rxm_ep, dest_addr, &msg_ep);
-	if (ret)
-		goto unlock;
+	return rxm_ep_send_common(ep_fid, msg->msg_iov, msg->desc, msg->iov_count,
+			msg->addr, msg->context, msg->data, 0,
+			flags | (rxm_ep_tx_flags(ep_fid) & FI_COMPLETION), ofi_op_msg);
+}
 
-	ret = fi_sendv(msg_ep, iov, desc, count, 0, context);
-unlock:
-	fastlock_release(&rxm_ep->cmap->lock);
-	return ret;
+static ssize_t rxm_ep_send(struct fid_ep *ep_fid, const void *buf, size_t len,
+		void *desc, fi_addr_t dest_addr, void *context)
+{
+	struct iovec iov;
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxm_ep_send_common(ep_fid, &iov, &desc, 1, dest_addr, context, 0,
+			0, rxm_ep_tx_flags(ep_fid), ofi_op_msg);
 }
 
-ssize_t rxm_inject(struct fid_ep *ep_fid, const void *buf, size_t len,
-		fi_addr_t dest_addr)
+static ssize_t rxm_ep_sendv(struct fid_ep *ep_fid, const struct iovec *iov,
+		void **desc, size_t count, fi_addr_t dest_addr, void *context)
 {
-	struct rxm_ep *rxm_ep;
-	struct fid_ep *msg_ep;
-	ssize_t ret;
+	return rxm_ep_send_common(ep_fid, iov, desc, count, dest_addr, context,
+			0, 0, rxm_ep_tx_flags(ep_fid), ofi_op_msg);
+}
 
-	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
-	fastlock_acquire(&rxm_ep->cmap->lock);
-	ret = rxm_get_msg_ep(rxm_ep, dest_addr, &msg_ep);
-	if (ret)
-		goto unlock;
+static ssize_t	rxm_ep_inject(struct fid_ep *ep_fid, const void *buf, size_t len,
+			       fi_addr_t dest_addr)
+{
+	struct iovec iov;
 
-	ret = fi_inject(msg_ep, buf, len, 0);
-unlock:
-	fastlock_release(&rxm_ep->cmap->lock);
-	return ret;
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxm_ep_send_common(ep_fid, &iov, NULL, 1, dest_addr, NULL, 0, 0,
+			(rxm_ep_tx_flags(ep_fid) & ~FI_COMPLETION) | FI_INJECT,
+			ofi_op_msg);
 }
 
-static struct fi_ops_msg rxm_msg_ops = {
+static ssize_t rxm_ep_senddata(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc,
+				uint64_t data, fi_addr_t dest_addr, void *context)
+{
+	struct iovec iov;
+
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxm_ep_send_common(ep_fid, &iov, desc, 1, dest_addr, context, data,
+			0, rxm_ep_tx_flags(ep_fid), ofi_op_msg);
+}
+
+static ssize_t	rxm_ep_injectdata(struct fid_ep *ep_fid, const void *buf, size_t len,
+				   uint64_t data, fi_addr_t dest_addr)
+{
+	struct iovec iov;
+
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxm_ep_send_common(ep_fid, &iov, NULL, 1, dest_addr, NULL, data, 0,
+			(rxm_ep_tx_flags(ep_fid) & ~FI_COMPLETION) | FI_INJECT,
+			ofi_op_msg);
+}
+
+static struct fi_ops_msg rxm_ops_msg = {
 	.size = sizeof(struct fi_ops_msg),
-	.recv = rxm_recv,
-	.recvv = rxm_recvv,
-	.recvmsg = rxm_recvmsg,
-	.send = rxm_send,
-	.sendv = rxm_sendv,
-	.sendmsg = rxm_sendmsg,
-	.inject = rxm_inject,
-	.senddata = fi_no_msg_senddata,
-	.injectdata = fi_no_msg_injectdata,
+	.recv = rxm_ep_recv,
+	.recvv = rxm_ep_recvv,
+	.recvmsg = rxm_ep_recvmsg,
+	.send = rxm_ep_send,
+	.sendv = rxm_ep_sendv,
+	.sendmsg = rxm_ep_sendmsg,
+	.inject = rxm_ep_inject,
+	.senddata = rxm_ep_senddata,
+	.injectdata = rxm_ep_injectdata,
 };
 
-static int rxm_ep_close(struct fid *fid)
+ssize_t rxm_ep_trecvmsg(struct fid_ep *ep_fid, const struct fi_msg_tagged *msg,
+			 uint64_t flags)
 {
-	struct rxm_ep *rxm_ep;
-	int ret, retv = 0;
+	struct rxm_ep *rxm_ep = container_of(ep_fid, struct rxm_ep,
+					     util_ep.ep_fid.fid);
 
-	rxm_ep = container_of(fid, struct rxm_ep, util_ep.ep_fid.fid);
+	return rxm_ep_recv_common(rxm_ep, msg->msg_iov, msg->desc, msg->iov_count,
+				  msg->addr, msg->tag, msg->ignore, msg->context,
+				  flags | (rxm_ep_rx_flags(ep_fid) & FI_COMPLETION),
+				  &rxm_ep->trecv_queue);
+}
 
-	if (rxm_ep->util_ep.av) {
-		ofi_cmap_free(rxm_ep->cmap);
-		atomic_dec(&rxm_ep->util_ep.av->ref);
-	}
+static ssize_t rxm_ep_trecv(struct fid_ep *ep_fid, void *buf, size_t len, void *desc,
+		fi_addr_t src_addr, uint64_t tag, uint64_t ignore, void *context)
+{
+	struct iovec iov;
+	iov.iov_base = buf;
+	iov.iov_len = len;
 
-	ret = fi_close(&rxm_ep->srx_ctx->fid);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to close msg shared ctx\n");
-		retv = ret;
-	}
+	struct rxm_ep *rxm_ep = container_of(ep_fid, struct rxm_ep,
+					     util_ep.ep_fid.fid);
 
-	ret = fi_close(&rxm_ep->msg_pep->fid);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to close msg passive EP\n");
-		retv = ret;
-	}
+	return rxm_ep_recv_common(rxm_ep, &iov, &desc, 1, src_addr, tag, ignore,
+				  context, rxm_ep_rx_flags(ep_fid),
+				  &rxm_ep->trecv_queue);
+}
 
-	fi_freeinfo(rxm_ep->msg_info);
+ssize_t rxm_ep_trecvv(struct fid_ep *ep_fid, const struct iovec *iov, void **desc,
+		size_t count, fi_addr_t src_addr, uint64_t tag, uint64_t ignore,
+		void *context)
+{
+	struct rxm_ep *rxm_ep = container_of(ep_fid, struct rxm_ep,
+					     util_ep.ep_fid.fid);
+
+	return rxm_ep_recv_common(rxm_ep, iov, desc, count, src_addr, tag,
+				  ignore, context, rxm_ep_rx_flags(ep_fid),
+				  &rxm_ep->trecv_queue);
+}
 
-	if (rxm_ep->util_ep.rx_cq)
-		atomic_dec(&rxm_ep->util_ep.rx_cq->ref);
+ssize_t rxm_ep_tsendmsg(struct fid_ep *ep_fid, const struct fi_msg_tagged *msg,
+			 uint64_t flags)
+{
+	return rxm_ep_send_common(ep_fid, msg->msg_iov, msg->desc, msg->iov_count,
+			msg->addr, msg->context, msg->data, msg->tag,
+			flags | (rxm_ep_tx_flags(ep_fid) & FI_COMPLETION),
+			ofi_op_tagged);
+}
 
-	if (rxm_ep->util_ep.tx_cq)
-		atomic_dec(&rxm_ep->util_ep.tx_cq->ref);
+ssize_t rxm_ep_tsend(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc,
+		      fi_addr_t dest_addr, uint64_t tag, void *context)
+{
+	struct iovec iov;
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
 
-	atomic_dec(&rxm_ep->util_ep.domain->ref);
-	free(rxm_ep);
-	return retv;
+	return rxm_ep_send_common(ep_fid, &iov, &desc, 1, dest_addr, context, 0,
+			tag, rxm_ep_tx_flags(ep_fid), ofi_op_tagged);
 }
 
-static int rxm_ep_bind_cq(struct rxm_ep *rxm_ep, struct util_cq *util_cq, uint64_t flags)
+ssize_t rxm_ep_tsendv(struct fid_ep *ep_fid, const struct iovec *iov, void **desc,
+		       size_t count, fi_addr_t dest_addr, uint64_t tag, void *context)
 {
-	struct rxm_cq *rxm_cq;
+	return rxm_ep_send_common(ep_fid, iov, desc, count, dest_addr, context,
+			0, tag, rxm_ep_tx_flags(ep_fid), ofi_op_tagged);
+}
 
-	rxm_cq = container_of(util_cq, struct rxm_cq, util_cq);
+ssize_t	rxm_ep_tinject(struct fid_ep *ep_fid, const void *buf, size_t len,
+			fi_addr_t dest_addr, uint64_t tag)
+{
+	struct iovec iov;
 
-	if (flags & ~(FI_TRANSMIT | FI_RECV)) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "unsupported flags\n");
-		return -FI_EBADFLAGS;
-	}
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
 
-	if (((flags & FI_TRANSMIT) && rxm_ep->tx_cq) ||
-	    ((flags & FI_RECV) && rxm_ep->rx_cq)) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "duplicate CQ binding\n");
-		return -FI_EINVAL;
-	}
+	return rxm_ep_send_common(ep_fid, &iov, NULL, 1, dest_addr, NULL, 0, tag,
+			(rxm_ep_tx_flags(ep_fid) & ~FI_COMPLETION) | FI_INJECT,
+			ofi_op_tagged);
+}
+
+ssize_t rxm_ep_tsenddata(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc,
+			  uint64_t data, fi_addr_t dest_addr, uint64_t tag, void *context)
+{
+	struct iovec iov;
+
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxm_ep_send_common(ep_fid, &iov, desc, 1, dest_addr, context, data,
+			tag, rxm_ep_tx_flags(ep_fid), ofi_op_tagged);
+}
+
+ssize_t	rxm_ep_tinjectdata(struct fid_ep *ep_fid, const void *buf, size_t len,
+			    uint64_t data, fi_addr_t dest_addr, uint64_t tag)
+{
+	struct iovec iov;
+
+	iov.iov_base = (void *) buf;
+	iov.iov_len = len;
+
+	return rxm_ep_send_common(ep_fid, &iov, NULL, 1, dest_addr, NULL, data,
+			tag, (rxm_ep_tx_flags(ep_fid) & ~FI_COMPLETION) | FI_INJECT,
+			ofi_op_tagged);
+}
+
+struct fi_ops_tagged rxm_ops_tagged = {
+	.size = sizeof(struct fi_ops_tagged),
+	.recv = rxm_ep_trecv,
+	.recvv = rxm_ep_trecvv,
+	.recvmsg = rxm_ep_trecvmsg,
+	.send = rxm_ep_tsend,
+	.sendv = rxm_ep_tsendv,
+	.sendmsg = rxm_ep_tsendmsg,
+	.inject = rxm_ep_tinject,
+	.senddata = rxm_ep_tsenddata,
+	.injectdata = rxm_ep_tinjectdata,
+};
+
+static int rxm_ep_msg_res_close(struct rxm_ep *rxm_ep)
+{
+	int ret, retv = 0;
 
-	if (flags & FI_TRANSMIT) {
-		rxm_ep->util_ep.tx_cq = &rxm_cq->util_cq;
-		atomic_inc(&rxm_cq->util_cq.ref);
+	ret = fi_close(&rxm_ep->msg_cq->fid);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Unable to close msg CQ\n");
+		retv = ret;
 	}
 
-	if (flags & FI_RECV) {
-		rxm_ep->util_ep.rx_cq = &rxm_cq->util_cq;
-		atomic_inc(&rxm_cq->util_cq.ref);
+	if (rxm_ep->srx_ctx) {
+		ret = fi_close(&rxm_ep->srx_ctx->fid);
+		if (ret) {
+			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, \
+				"Unable to close msg shared ctx\n");
+			retv = ret;
+		}
 	}
-	return 0;
+
+	fi_freeinfo(rxm_ep->msg_info);
+	return retv;
 }
 
-int rxm_ep_bind_av(struct rxm_ep *rxm_ep, struct util_av *av)
+static int rxm_listener_close(struct rxm_ep *rxm_ep)
 {
-	if (rxm_ep->util_ep.av) {
-		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-			"duplicate AV binding\n");
-		return -FI_EINVAL;
+	int ret, retv = 0;
+
+	if (rxm_ep->msg_pep) {
+		ret = fi_close(&rxm_ep->msg_pep->fid);
+		if (ret) {
+			FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to close msg pep\n");
+			retv = ret;
+		}
 	}
-	rxm_ep->cmap = ofi_cmap_alloc(av, rxm_conn_close);
-	if (!rxm_ep->cmap)
-		return -FI_ENOMEM;
+	if (rxm_ep->msg_eq) {
+		ret = fi_close(&rxm_ep->msg_eq->fid);
+		if (ret) {
+			FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to close msg EQ\n");
+			retv = ret;
+		}
+	}
+	return retv;
+}
 
-	atomic_inc(&av->ref);
-	rxm_ep->util_ep.av = av;
-	return 0;
+static int rxm_ep_close(struct fid *fid)
+{
+	struct rxm_ep *rxm_ep;
+	int ret;
+
+	rxm_ep = container_of(fid, struct rxm_ep, util_ep.ep_fid.fid);
+
+	if (rxm_ep->util_ep.cmap)
+		ofi_cmap_free(rxm_ep->util_ep.cmap);
+
+	ret = rxm_listener_close(rxm_ep);
+	if (ret)
+		return ret;
+
+	rxm_ep_txrx_res_close(rxm_ep);
+	ret = rxm_ep_msg_res_close(rxm_ep);
+
+	ofi_endpoint_close(&rxm_ep->util_ep);
+	free(rxm_ep);
+	return ret;
 }
 
 static int rxm_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
 {
+	struct util_cmap_attr attr;
 	struct rxm_ep *rxm_ep;
+	struct util_av *util_av;
+	char buf[OFI_ADDRSTRLEN];
+	void *name;
+	size_t len;
 	int ret = 0;
 
 	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
 	switch (bfid->fclass) {
 	case FI_CLASS_AV:
-		ret = rxm_ep_bind_av(rxm_ep, container_of(bfid, struct util_av,
-					av_fid.fid));
+		util_av = container_of(bfid, struct util_av, av_fid.fid);
+		ret = ofi_ep_bind_av(&rxm_ep->util_ep, util_av);
+		if (ret)
+			return ret;
+		len = rxm_ep->msg_info->src_addrlen;
+		name = malloc(len);
+		/* Passive endpoint should already have fi_setname or fi_listen
+		 * called on it for this to work */
+		ret = fi_getname(&rxm_ep->msg_pep->fid, name, &len);
+		if (ret) {
+			free(name);
+			return ret;
+		}
+		len = sizeof(buf);
+		FI_DBG(&rxm_prov, FI_LOG_EP_CTRL, "local_name: %s\n",
+		       ofi_straddr(buf, &len,
+				   ofi_translate_addr_format(((struct sockaddr *)name)->sa_family),
+				   name));
+		attr.name		= name;
+		attr.alloc 		= rxm_conn_alloc;
+		attr.close 		= rxm_conn_close;
+		attr.free 		= rxm_conn_free;
+		attr.connect 		= rxm_conn_connect;
+		attr.event_handler	= rxm_conn_event_handler;
+		attr.signal		= rxm_conn_signal;
+
+		rxm_ep->util_ep.cmap = ofi_cmap_alloc(&rxm_ep->util_ep, &attr);
+		free(name);
+		if (!rxm_ep->util_ep.cmap)
+			return -FI_ENOMEM;
 		break;
 	case FI_CLASS_CQ:
-		ret = rxm_ep_bind_cq(rxm_ep, container_of(bfid, struct util_cq,
-					cq_fid.fid), flags);
+		ret = ofi_ep_bind_cq(&rxm_ep->util_ep,
+				     container_of(bfid, struct util_cq,
+						  cq_fid.fid),
+				     flags);
 		break;
 	case FI_CLASS_EQ:
 		break;
@@ -322,29 +1062,24 @@ static int rxm_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
 static int rxm_ep_ctrl(struct fid *fid, int command, void *arg)
 {
 	struct rxm_ep *rxm_ep;
-	struct rxm_fabric *rxm_fabric;
 	int ret;
 
 	rxm_ep = container_of(fid, struct rxm_ep, util_ep.ep_fid.fid);
-	rxm_fabric = container_of(rxm_ep->util_ep.domain->fabric,
-			struct rxm_fabric, util_fabric);
+
 	switch (command) {
 	case FI_ENABLE:
 		if (!rxm_ep->util_ep.rx_cq || !rxm_ep->util_ep.tx_cq)
 			return -FI_ENOCQ;
 		if (!rxm_ep->util_ep.av)
-			return -FI_EOPBADSTATE; /* TODO: Add FI_ENOAV */
-		ret = fi_pep_bind(rxm_ep->msg_pep, &rxm_fabric->msg_eq->fid, 0);
-		if (ret) {
-			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-					"Unable to bind msg PEP to msg EQ\n");
-			return ret;
-		}
-		ret = fi_listen(rxm_ep->msg_pep);
-		if (ret) {
-			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
-					"Unable to set msg PEP to listen state\n");
-			return ret;
+			return -FI_EOPBADSTATE;
+
+		if (rxm_ep->srx_ctx) {
+			ret = rxm_ep_prepost_buf(rxm_ep, rxm_ep->srx_ctx);
+			if (ret) {
+				FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
+					"Unable to prepost recv bufs\n");
+				return ret;
+			}
 		}
 		break;
 	default:
@@ -361,56 +1096,145 @@ static struct fi_ops rxm_ep_fi_ops = {
 	.ops_open = fi_no_ops_open,
 };
 
-static int rxm_ep_msg_res_open(struct fi_info *rxm_info,
-		struct util_domain *util_domain, struct rxm_ep *rxm_ep)
+static int rxm_listener_open(struct rxm_ep *rxm_ep)
 {
 	struct rxm_fabric *rxm_fabric;
+	struct fi_eq_attr eq_attr;
+	eq_attr.wait_obj = FI_WAIT_UNSPEC;
+	eq_attr.flags = FI_WRITE;
+	int ret;
+
+	rxm_fabric = container_of(rxm_ep->util_ep.domain->fabric,
+				  struct rxm_fabric, util_fabric);
+
+	ret = fi_eq_open(rxm_fabric->msg_fabric, &eq_attr, &rxm_ep->msg_eq, NULL);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open msg EQ\n");
+		return ret;
+	}
+
+	ret = fi_passive_ep(rxm_fabric->msg_fabric, rxm_ep->msg_info,
+			    &rxm_ep->msg_pep, rxm_ep);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open msg PEP\n");
+		goto err;
+	}
+
+	ret = fi_pep_bind(rxm_ep->msg_pep, &rxm_ep->msg_eq->fid, 0);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
+				"Unable to bind msg PEP to msg EQ\n");
+		goto err;
+	}
+
+	ret = fi_listen(rxm_ep->msg_pep);
+	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
+			"Unable to set msg PEP to listen state\n");
+		goto err;
+	}
+	return 0;
+err:
+	rxm_listener_close(rxm_ep);
+	return ret;
+}
+
+static int rxm_info_to_core_srx_ctx(uint32_t version, struct fi_info *rxm_hints,
+				struct fi_info *core_hints)
+{
+	int ret;
+
+	ret = rxm_info_to_core(version, rxm_hints, core_hints);
+	if (ret)
+		return ret;
+	core_hints->ep_attr->rx_ctx_cnt = FI_SHARED_CONTEXT;
+	return 0;
+}
+
+static int rxm_ep_get_core_info(uint32_t version, struct fi_info *hints,
+				struct fi_info **info)
+{
+	int ret;
+
+	ret = ofi_get_core_info(version, NULL, NULL, 0, &rxm_util_prov, hints,
+				rxm_info_to_core_srx_ctx, info);
+	if (!ret)
+		return 0;
+
+	FI_WARN(&rxm_prov, FI_LOG_EP_CTRL, "Shared receive context not "
+		"supported by MSG provider.\n");
+
+	return ofi_get_core_info(version, NULL, NULL, 0, &rxm_util_prov, hints,
+				 rxm_info_to_core, info);
+}
+
+static int rxm_ep_msg_res_open(struct fi_info *rxm_fi_info,
+		struct util_domain *util_domain, struct rxm_ep *rxm_ep)
+{
 	struct rxm_domain *rxm_domain;
+	struct fi_cq_attr cq_attr;
 	int ret;
 
-	ret = ofix_getinfo(rxm_prov.version, NULL, NULL, 0, &rxm_util_prov,
-			rxm_info, rxm_alter_layer_info, rxm_alter_base_info,
-			1, &rxm_ep->msg_info);
+	ret = rxm_ep_get_core_info(util_domain->fabric->fabric_fid.api_version,
+				   rxm_fi_info, &rxm_ep->msg_info);
 	if (ret)
 		return ret;
 
+	rxm_ep->comp_per_progress = MIN(rxm_ep->msg_info->tx_attr->size,
+					rxm_ep->msg_info->rx_attr->size) / 2;
+
 	rxm_domain = container_of(util_domain, struct rxm_domain, util_domain);
-	rxm_fabric = container_of(util_domain->fabric, struct rxm_fabric, util_fabric);
 
-	ret = fi_passive_ep(rxm_fabric->msg_fabric, rxm_ep->msg_info, &rxm_ep->msg_pep, rxm_ep);
+	memset(&cq_attr, 0, sizeof(cq_attr));
+	cq_attr.size = rxm_fi_info->tx_attr->size + rxm_fi_info->rx_attr->size;
+	cq_attr.format = FI_CQ_FORMAT_DATA;
+
+	ret = fi_cq_open(rxm_domain->msg_domain, &cq_attr, &rxm_ep->msg_cq, NULL);
 	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open msg PEP\n");
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "Unable to open MSG CQ\n");
 		goto err1;
 	}
 
-	ret = fi_srx_context(rxm_domain->msg_domain, rxm_ep->msg_info->rx_attr,
-			&rxm_ep->srx_ctx, NULL);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open shared receive context\n");
-		goto err2;
+	if (rxm_ep->msg_info->ep_attr->rx_ctx_cnt == FI_SHARED_CONTEXT) {
+		ret = fi_srx_context(rxm_domain->msg_domain, rxm_ep->msg_info->rx_attr,
+				     &rxm_ep->srx_ctx, NULL);
+		if (ret) {
+			FI_WARN(&rxm_prov, FI_LOG_EP_CTRL,
+				"Unable to open shared receive context\n");
+			goto err2;
+		}
 	}
 
-	/* We don't care what's in the dest_addr at this point. We go by AV. */
-	if (rxm_ep->msg_info->dest_addr) {
-		free(rxm_ep->msg_info->dest_addr);
-		rxm_ep->msg_info->dest_addr = NULL;
-		rxm_ep->msg_info->dest_addrlen = 0;
-	}
+	ret = rxm_listener_open(rxm_ep);
+	if (ret)
+		goto err3;
 
 	/* Zero out the port as we would be creating multiple MSG EPs for a single
 	 * RXM EP and we don't want address conflicts. */
-	// TODO handle other address types?
-	if (rxm_ep->msg_info->src_addr)
-		((struct sockaddr_in *)(rxm_ep->msg_info->src_addr))->sin_port = 0;
-
+	if (rxm_ep->msg_info->src_addr) {
+		if (((struct sockaddr *)rxm_ep->msg_info->src_addr)->sa_family == AF_INET)
+			((struct sockaddr_in *)(rxm_ep->msg_info->src_addr))->sin_port = 0;
+		else
+			((struct sockaddr_in6 *)(rxm_ep->msg_info->src_addr))->sin6_port = 0;
+	}
 	return 0;
+err3:
+	fi_close(&rxm_ep->srx_ctx->fid);
 err2:
-	fi_close(&rxm_ep->msg_pep->fid);
+	fi_close(&rxm_ep->msg_cq->fid);
 err1:
 	fi_freeinfo(rxm_ep->msg_info);
 	return ret;
 }
 
+void rxm_ep_progress(struct util_ep *util_ep)
+{
+	struct rxm_ep *rxm_ep;
+
+	rxm_ep = container_of(util_ep, struct rxm_ep, util_ep);
+	rxm_cq_progress(rxm_ep);
+}
+
 int rxm_endpoint(struct fid_domain *domain, struct fi_info *info,
 		  struct fid_ep **ep_fid, void *context)
 {
@@ -422,25 +1246,42 @@ int rxm_endpoint(struct fid_domain *domain, struct fi_info *info,
 	if (!rxm_ep)
 		return -FI_ENOMEM;
 
+	if (!(rxm_ep->rxm_info = fi_dupinfo(info))) {
+		ret = -FI_ENOMEM;
+		goto err1;
+	}
+
 	ret = ofi_endpoint_init(domain, &rxm_util_prov, info, &rxm_ep->util_ep,
-			context, FI_MATCH_PREFIX);
+				context, &rxm_ep_progress);
 	if (ret)
-		goto err;
+		goto err1;
 
 	util_domain = container_of(domain, struct util_domain, domain_fid);
 
 	ret = rxm_ep_msg_res_open(info, util_domain, rxm_ep);
 	if (ret)
-		goto err;
+		goto err2;
+
+	ret = rxm_ep_txrx_res_open(rxm_ep);
+	if (ret)
+		goto err3;
 
 	*ep_fid = &rxm_ep->util_ep.ep_fid;
 	(*ep_fid)->fid.ops = &rxm_ep_fi_ops;
-	(*ep_fid)->ops = &rxm_ep_ops;
-	(*ep_fid)->cm = &rxm_cm_ops;
-	(*ep_fid)->msg = &rxm_msg_ops;
+	(*ep_fid)->ops = &rxm_ops_ep;
+	(*ep_fid)->cm = &rxm_ops_cm;
+	(*ep_fid)->msg = &rxm_ops_msg;
+	(*ep_fid)->tagged = &rxm_ops_tagged;
+	(*ep_fid)->rma = &rxm_ops_rma;
 
 	return 0;
-err:
+err3:
+	rxm_ep_msg_res_close(rxm_ep);
+err2:
+	ofi_endpoint_close(&rxm_ep->util_ep);
+err1:
+	if (rxm_ep->rxm_info)
+		fi_freeinfo(rxm_ep->rxm_info);
 	free(rxm_ep);
 	return ret;
 }
diff --git a/prov/rxm/src/rxm_fabric.c b/prov/rxm/src/rxm_fabric.c
index f22c12f..9179b7d 100644
--- a/prov/rxm/src/rxm_fabric.c
+++ b/prov/rxm/src/rxm_fabric.c
@@ -49,24 +49,10 @@ static struct fi_ops_fabric rxm_fabric_ops = {
 static int rxm_fabric_close(fid_t fid)
 {
 	struct rxm_fabric *rxm_fabric;
-	struct fi_eq_entry entry = {0};
-	ssize_t rd;
 	int ret;
 
 	rxm_fabric = container_of(fid, struct rxm_fabric, util_fabric.fabric_fid.fid);
 
-	rd = fi_eq_write(rxm_fabric->msg_eq, FI_NOTIFY, &entry, sizeof(entry), 0);
-	if (rd != sizeof(entry)) {
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to notify listener thread\n");
-		return rd;
-	}
-
-	pthread_join(rxm_fabric->msg_listener_thread, NULL);
-
-	ret = fi_close(&rxm_fabric->msg_eq->fid);
-	if (ret)
-		return ret;
-
 	ret = fi_close(&rxm_fabric->msg_fabric->fid);
 	if (ret)
 		return ret;
@@ -88,11 +74,10 @@ static struct fi_ops rxm_fabric_fi_ops = {
 };
 
 int rxm_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
-		void *context)
+	       void *context)
 {
 	struct rxm_fabric *rxm_fabric;
-	struct fi_info hints, *msg_info;
-	struct fi_eq_attr eq_attr;
+	struct fi_info *msg_info;
 	int ret;
 
 	rxm_fabric = calloc(1, sizeof(*rxm_fabric));
@@ -100,62 +85,29 @@ int rxm_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 		return -FI_ENOMEM;
 
 	ret = ofi_fabric_init(&rxm_prov, &rxm_fabric_attr, attr,
-			     &rxm_fabric->util_fabric, context, FI_MATCH_PREFIX);
+			      &rxm_fabric->util_fabric, context);
 	if (ret)
 		goto err1;
 
-	memset(&hints, 0, sizeof hints);
-	if (!(hints.fabric_attr = calloc(1, sizeof(*hints.fabric_attr)))) {
-		ret = -FI_ENOMEM;
-		goto err2;
-	}
-	hints.fabric_attr->name = attr->name;
-	hints.mode = rxm_info.mode;
-
-	ret = ofix_getinfo(rxm_prov.version, NULL, NULL, 0, &rxm_util_prov,
-			&hints, rxm_alter_layer_info,
-			rxm_alter_base_info, 1, &msg_info);
+	ret = ofi_get_core_info_fabric(attr, &msg_info);
 	if (ret) {
+		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to get core info!\n");
 		ret = -FI_EINVAL;
-		goto err3;
+		goto err2;
 	}
 
 	ret = fi_fabric(msg_info->fabric_attr, &rxm_fabric->msg_fabric, context);
 	if (ret) {
-		goto err4;
-	}
-
-	eq_attr.wait_obj = FI_WAIT_UNSPEC;
-	eq_attr.flags = FI_WRITE;
-
-	ret = fi_eq_open(rxm_fabric->msg_fabric, &eq_attr, &rxm_fabric->msg_eq, NULL);
-	if (ret) {
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to open msg EQ\n");
-		goto err5;
-	}
-
-	if (pthread_create(&rxm_fabric->msg_listener_thread, 0,
-				rxm_msg_listener, rxm_fabric)) {
-		ret = -errno;
-		FI_WARN(&rxm_prov, FI_LOG_FABRIC, "Unable to create msg_cm_listener_thread\n");
-		goto err6;
+		goto err3;
 	}
-
 	*fabric = &rxm_fabric->util_fabric.fabric_fid;
 	(*fabric)->fid.ops = &rxm_fabric_fi_ops;
 	(*fabric)->ops = &rxm_fabric_ops;
 
-	free(hints.fabric_attr);
 	fi_freeinfo(msg_info);
 	return 0;
-err6:
-	fi_close(&rxm_fabric->msg_eq->fid);
-err5:
-	fi_close(&rxm_fabric->msg_fabric->fid);
-err4:
-	fi_freeinfo(msg_info);
 err3:
-	free(hints.fabric_attr);
+	fi_freeinfo(msg_info);
 err2:
 	ofi_fabric_close(&rxm_fabric->util_fabric);
 err1:
diff --git a/prov/rxm/src/rxm_init.c b/prov/rxm/src/rxm_init.c
index 91d6dcd..666390b 100644
--- a/prov/rxm/src/rxm_init.c
+++ b/prov/rxm/src/rxm_init.c
@@ -35,48 +35,165 @@
 #include <prov.h>
 #include "rxm.h"
 
-int rxm_alter_layer_info(struct fi_info *layer_info, struct fi_info *base_info)
+int rxm_info_to_core(uint32_t version, struct fi_info *hints,
+		     struct fi_info *core_info)
 {
-	/* TODO choose base_info attr based on layer_info attr */
-	base_info->caps = FI_MSG;
-	base_info->mode = FI_LOCAL_MR;
-	base_info->ep_attr->rx_ctx_cnt = FI_SHARED_CONTEXT;
-	base_info->ep_attr->type = FI_EP_MSG;
+	core_info->caps = FI_MSG;
+
+	/* Support modes that ofi_rxm could handle */
+	if (FI_VERSION_GE(version, FI_VERSION(1, 5)))
+		core_info->domain_attr->mr_mode |= FI_MR_LOCAL;
+	else
+		core_info->mode |= (FI_LOCAL_MR | FI_RX_CQ_DATA);
+
+	if (hints) {
+		/* No fi_info modes apart from FI_LOCAL_MR, FI_RX_CQ_DATA
+		 * can be passed along to the core provider */
+		// core_info->mode |= hints->mode;
+		if (hints->domain_attr) {
+			if (FI_VERSION_GE(version, FI_VERSION(1, 5))) {
+				/* Allow only those mr modes that can be
+				 * passed along to the core provider */
+				core_info->domain_attr->mr_mode |=
+					hints->domain_attr->mr_mode &
+					OFI_MR_BASIC_MAP;
+			} else {
+				core_info->domain_attr->mr_mode =
+					hints->domain_attr->mr_mode;
+			}
+			core_info->domain_attr->caps |= hints->domain_attr->caps;
+		}
+		if (hints->tx_attr) {
+			core_info->tx_attr->msg_order = hints->tx_attr->msg_order;
+			core_info->tx_attr->comp_order = hints->tx_attr->comp_order;
+		}
+	} else {
+		/* Since hints is NULL fake support for FI_MR_BASIC to allow
+		 * discovery of core providers like verbs which require it */
+		if (FI_VERSION_GE(version, FI_VERSION(1, 5)))
+			core_info->domain_attr->mr_mode |= OFI_MR_BASIC_MAP;
+		else
+			/* Specify FI_MR_UNSPEC so that providers that support
+			 * FI_MR_SCALABLE aren't dropped */
+			core_info->domain_attr->mr_mode = FI_MR_UNSPEC;
+	}
+
+	/* Remove caps that RxM can handle */
+	core_info->rx_attr->msg_order &= ~FI_ORDER_SAS;
+
+	core_info->ep_attr->type = FI_EP_MSG;
 
 	return 0;
 }
 
-int rxm_alter_base_info(struct fi_info *base_info, struct fi_info *layer_info)
+int rxm_info_to_rxm(uint32_t version, struct fi_info *core_info,
+		    struct fi_info *info)
 {
-	// TODO choose caps based on base_info caps
-	layer_info->caps = rxm_info.caps;
-	layer_info->mode = rxm_info.mode;
+	info->caps = rxm_info.caps;
+	info->mode = core_info->mode | rxm_info.mode;
+
+	*info->tx_attr = *rxm_info.tx_attr;
+
+	info->tx_attr->msg_order = core_info->tx_attr->msg_order;
+	info->tx_attr->comp_order = core_info->tx_attr->comp_order;
 
-	*layer_info->tx_attr = *rxm_info.tx_attr;
-	*layer_info->rx_attr = *rxm_info.rx_attr;
-	*layer_info->ep_attr = *rxm_info.ep_attr;
-	layer_info->ep_attr->max_msg_size = base_info->ep_attr->max_msg_size;
-	*layer_info->domain_attr = *rxm_info.domain_attr;
+	/* Export TX queue size same as that of MSG provider as we post TX
+	 * operations directly */
+	info->tx_attr->size = core_info->tx_attr->size;
+
+	info->tx_attr->iov_limit = MIN(MIN(info->tx_attr->iov_limit,
+			core_info->tx_attr->iov_limit),
+			core_info->tx_attr->rma_iov_limit);
+
+	*info->rx_attr = *rxm_info.rx_attr;
+	info->rx_attr->iov_limit = MIN(info->rx_attr->iov_limit,
+			core_info->rx_attr->iov_limit);
+	/* Only SAS recv ordering can be guaranteed as RMA ops are not handled
+	 * by RxM protocol */
+	info->rx_attr->msg_order |= FI_ORDER_SAS;
+
+	*info->ep_attr = *rxm_info.ep_attr;
+	info->ep_attr->max_msg_size = core_info->ep_attr->max_msg_size;
+
+	*info->domain_attr = *rxm_info.domain_attr;
+	info->domain_attr->mr_mode = core_info->domain_attr->mr_mode;
+	info->domain_attr->cq_data_size = MIN(core_info->domain_attr->cq_data_size,
+					      rxm_info.domain_attr->cq_data_size);
 
 	return 0;
 }
 
+static int rxm_init_info(void)
+{
+	int param;
+
+	if (!fi_param_get_int(&rxm_prov, "buffer_size", &param)) {
+		if (param > sizeof(struct rxm_pkt)) {
+			rxm_info.tx_attr->inject_size = param;
+		} else {
+			FI_WARN(&rxm_prov, FI_LOG_CORE,
+				"Requested buffer size too small\n");
+			return -FI_EINVAL;
+		}
+	} else {
+		rxm_info.tx_attr->inject_size = RXM_BUF_SIZE;
+	}
+	rxm_info.tx_attr->inject_size -= sizeof(struct rxm_pkt);
+	rxm_util_prov.info = &rxm_info;
+	return 0;
+}
+
 static int rxm_getinfo(uint32_t version, const char *node, const char *service,
 			uint64_t flags, struct fi_info *hints, struct fi_info **info)
 {
-	return ofix_getinfo(version, node, service, flags, &rxm_util_prov,
-			hints, rxm_alter_layer_info, rxm_alter_base_info, 0, info);
+	struct fi_info *cur, *dup;
+	int ret;
+
+	ret = ofix_getinfo(version, node, service, flags, &rxm_util_prov, hints,
+			   rxm_info_to_core, rxm_info_to_rxm, info);
+	if (ret)
+		return ret;
+
+	/* If app supports FI_MR_LOCAL, prioritize requiring it for
+	 * better performance. */
+	if (hints && hints->domain_attr &&
+	    (RXM_MR_LOCAL(hints))) {
+		for (cur = *info; cur; cur = cur->next) {
+			if (!RXM_MR_LOCAL(cur))
+				continue;
+			if (!(dup = fi_dupinfo(cur))) {
+				fi_freeinfo(*info);
+				return -FI_ENOMEM;
+			}
+			if (FI_VERSION_LT(version, FI_VERSION(1, 5)))
+				dup->mode &= ~FI_LOCAL_MR;
+			else
+				dup->domain_attr->mr_mode &= ~FI_MR_LOCAL;
+			dup->next = cur->next;
+			cur->next = dup;
+			cur = dup;
+		}
+	} else {
+		for (cur = *info; cur; cur = cur->next) {
+			if (FI_VERSION_LT(version, FI_VERSION(1, 5)))
+				cur->mode &= ~FI_LOCAL_MR;
+			else
+				cur->domain_attr->mr_mode &= ~FI_MR_LOCAL;
+		}
+	}
+	return 0;
 }
 
+
 static void rxm_fini(void)
 {
 	/* yawn */
 }
 
 struct fi_provider rxm_prov = {
-	.name = "rxm",
+	.name = OFI_UTIL_PREFIX "rxm",
 	.version = FI_VERSION(RXM_MAJOR_VERSION, RXM_MINOR_VERSION),
-	.fi_version = FI_VERSION(1, 3),
+	.fi_version = FI_VERSION(1, 5),
 	.getinfo = rxm_getinfo,
 	.fabric = rxm_fabric,
 	.cleanup = rxm_fini
@@ -84,5 +201,15 @@ struct fi_provider rxm_prov = {
 
 RXM_INI
 {
+	fi_param_define(&rxm_prov, "buffer_size", FI_PARAM_INT,
+			"Defines the transmit buffer size. Transmit data would "
+			"be copied upto this size (default: ~16k). This would "
+			"also affect the supported inject size");
+
+	if (rxm_init_info()) {
+		FI_WARN(&rxm_prov, FI_LOG_CORE, "Unable to initialize rxm_info\n");
+		return NULL;
+	}
+
 	return &rxm_prov;
 }
diff --git a/prov/rxm/src/rxm_rma.c b/prov/rxm/src/rxm_rma.c
new file mode 100644
index 0000000..7435d64
--- /dev/null
+++ b/prov/rxm/src/rxm_rma.c
@@ -0,0 +1,405 @@
+/*
+ * Copyright (c) 2017 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <fi_iov.h>
+#include "rxm.h"
+
+typedef ssize_t rxm_rma_msg_fn(struct fid_ep *ep_fid,
+			       const struct fi_msg_rma *msg, uint64_t flags);
+
+static int rxm_ep_rma_common(struct fid_ep *msg_ep, struct rxm_ep *rxm_ep,
+			     const struct fi_msg_rma *msg, uint64_t flags,
+			     rxm_rma_msg_fn rma_msg, uint64_t comp_flags)
+{
+	struct rxm_domain *rxm_domain;
+	struct rxm_tx_entry *tx_entry;
+	struct fi_msg_rma msg_rma;
+	size_t i;
+	int ret;
+
+	if (!(tx_entry = rxm_tx_entry_get(&rxm_ep->send_queue)))
+		return -FI_EAGAIN;
+
+	memset(tx_entry, 0, sizeof(*tx_entry));
+	tx_entry->state = RXM_TX_NOBUF;
+	tx_entry->ep = rxm_ep;
+	tx_entry->context = msg->context;
+	tx_entry->flags = flags;
+	tx_entry->comp_flags = FI_RMA | comp_flags;
+
+	msg_rma = *msg;
+	msg_rma.context = tx_entry;
+
+	rxm_domain = container_of(rxm_ep->util_ep.domain, struct rxm_domain,
+			  util_domain);
+	if (rxm_domain->mr_local) {
+		ret = rxm_ep_msg_mr_regv(rxm_ep, msg->msg_iov,
+					 msg->iov_count, FI_WRITE,
+					 tx_entry->mr);
+		if (ret)
+			goto err;
+		for (i = 0; i < msg_rma.iov_count; i++)
+			msg_rma.desc[i] = fi_mr_desc(tx_entry->mr[i]);
+	} else {
+		/* msg_rma.desc is msg fid_mr * array */
+		for (i = 0; i < msg_rma.iov_count; i++)
+			msg_rma.desc[i] = fi_mr_desc(msg_rma.desc[i]);
+	}
+	return rma_msg(msg_ep, &msg_rma, flags);
+err:
+	rxm_tx_entry_release(&rxm_ep->send_queue, tx_entry);
+	return ret;
+}
+
+ssize_t	rxm_ep_readmsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
+		       uint64_t flags)
+{
+	struct util_cmap_handle *handle;
+	struct rxm_conn *rxm_conn;
+	struct rxm_ep *rxm_ep;
+	int ret;
+
+	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
+
+	ret = ofi_cmap_get_handle(rxm_ep->util_ep.cmap, msg->addr, &handle);
+	if (ret)
+		return ret;
+	rxm_conn = container_of(handle, struct rxm_conn, handle);
+
+	return rxm_ep_rma_common(rxm_conn->msg_ep, rxm_ep, msg, flags,
+				 fi_readmsg, FI_READ);
+}
+
+static ssize_t rxm_ep_read(struct fid_ep *ep_fid, void *buf, size_t len,
+			   void *desc, fi_addr_t src_addr, uint64_t addr,
+			   uint64_t key, void *context)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+	struct iovec iov;
+
+	iov.iov_base = (void *)buf;
+	iov.iov_len = len;
+
+	rma_iov.addr = addr;
+	rma_iov.len = len;
+	rma_iov.key = key;
+
+	msg.msg_iov = &iov;
+	msg.desc = &desc;
+	msg.iov_count = 1;
+	msg.addr = src_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = context;
+	msg.data = 0;
+
+	return rxm_ep_readmsg(ep_fid, &msg, rxm_ep_tx_flags(ep_fid));
+}
+
+static ssize_t rxm_ep_readv(struct fid_ep *ep_fid, const struct iovec *iov,
+			    void **desc, size_t count, fi_addr_t src_addr,
+			    uint64_t addr, uint64_t key, void *context)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+
+	rma_iov.addr = addr;
+	rma_iov.len = ofi_total_iov_len(iov, count);
+	rma_iov.key = key;
+
+	msg.msg_iov = iov;
+	msg.desc = desc;
+	msg.iov_count = count;
+	msg.addr = src_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = context;
+	msg.data = 0;
+
+	return rxm_ep_readmsg(ep_fid, &msg, rxm_ep_tx_flags(ep_fid));
+}
+
+static int rxm_ep_rma_inject(struct fid_ep *msg_ep, struct rxm_ep *rxm_ep,
+			     const struct fi_msg_rma *msg, uint64_t flags)
+{
+	struct rxm_tx_entry *tx_entry;
+	struct rxm_tx_buf *tx_buf;
+	struct fi_msg_rma msg_rma;
+	struct iovec iov;
+	size_t size;
+	int ret;
+
+	size = ofi_total_iov_len(msg->msg_iov, msg->iov_count);
+
+	if (size > rxm_ep->rxm_info->tx_attr->inject_size)
+		return -FI_EMSGSIZE;
+
+	/* Use fi_inject_write instead of fi_writemsg since the latter generates
+	 * completion by default */
+	if (size <= rxm_ep->msg_info->tx_attr->inject_size &&
+	    !(flags & FI_COMPLETION)) {
+		if (flags & FI_REMOTE_CQ_DATA)
+			return fi_inject_writedata(msg_ep, msg->msg_iov->iov_base,
+					       msg->msg_iov->iov_len, msg->data,
+					       msg->addr, msg->rma_iov->addr,
+					       msg->rma_iov->key);
+		else
+			return fi_inject_write(msg_ep, msg->msg_iov->iov_base,
+					       msg->msg_iov->iov_len, msg->addr,
+					       msg->rma_iov->addr,
+					       msg->rma_iov->key);
+	}
+
+	tx_buf = (struct rxm_tx_buf *)rxm_buf_get(&rxm_ep->tx_pool);
+	if (!tx_buf) {
+		FI_WARN(&rxm_prov, FI_LOG_CQ, "TX queue full!\n");
+		rxm_cq_progress(rxm_ep);
+		return -FI_EAGAIN;
+	}
+
+	if (!(tx_entry = rxm_tx_entry_get(&rxm_ep->send_queue))) {
+		rxm_cq_progress(rxm_ep);
+		ret = -FI_EAGAIN;
+		goto err1;
+	}
+
+	memset(tx_entry, 0, sizeof(*tx_entry));
+	tx_entry->state = RXM_TX;
+	tx_entry->ep = rxm_ep;
+	tx_entry->flags = flags;
+	tx_entry->comp_flags = FI_RMA | FI_WRITE;
+	tx_entry->tx_buf = tx_buf;
+
+	tx_buf->hdr.msg_ep = msg_ep;
+	ofi_copy_from_iov(tx_buf->pkt.data, size, msg->msg_iov,
+			  msg->iov_count, 0);
+
+	iov.iov_base = &tx_buf->pkt.data;
+	iov.iov_len = size;
+
+	msg_rma.msg_iov = &iov;
+	msg_rma.desc = &tx_buf->hdr.desc;
+	msg_rma.iov_count = 1;
+	msg_rma.addr = msg->addr;
+	msg_rma.rma_iov = msg->rma_iov;
+	msg_rma.rma_iov_count = msg->rma_iov_count;
+	msg_rma.context = tx_entry;
+	msg_rma.data = msg->data;
+	flags = (flags & ~FI_INJECT) | FI_COMPLETION;
+
+	ret = fi_writemsg(msg_ep, &msg_rma, flags);
+	if (ret) {
+		if (ret == -FI_EAGAIN)
+			rxm_cq_progress(rxm_ep);
+		goto err2;
+	}
+	return 0;
+err2:
+	rxm_tx_entry_release(&rxm_ep->send_queue, tx_entry);
+err1:
+	rxm_buf_release(&rxm_ep->tx_pool, (struct rxm_buf *)tx_buf);
+	return ret;
+}
+
+ssize_t	rxm_ep_writemsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
+			uint64_t flags)
+{
+	struct util_cmap_handle *handle;
+	struct rxm_conn *rxm_conn;
+	struct rxm_ep *rxm_ep;
+	int ret;
+
+	rxm_ep = container_of(ep_fid, struct rxm_ep, util_ep.ep_fid.fid);
+
+	ret = ofi_cmap_get_handle(rxm_ep->util_ep.cmap, msg->addr, &handle);
+	if (ret)
+		return ret;
+	rxm_conn = container_of(handle, struct rxm_conn, handle);
+
+	if (flags & FI_INJECT)
+		return rxm_ep_rma_inject(rxm_conn->msg_ep, rxm_ep, msg, flags);
+	else
+		return rxm_ep_rma_common(rxm_conn->msg_ep, rxm_ep, msg, flags,
+					 fi_writemsg, FI_WRITE);
+}
+
+static ssize_t rxm_ep_write(struct fid_ep *ep_fid, const void *buf,
+			    size_t len, void *desc, fi_addr_t dest_addr,
+			    uint64_t addr, uint64_t key, void *context)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+	struct iovec iov;
+
+	iov.iov_base = (void *)buf;
+	iov.iov_len = len;
+
+	rma_iov.addr = addr;
+	rma_iov.len = len;
+	rma_iov.key = key;
+
+	msg.msg_iov = &iov;
+	msg.desc = &desc;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = context;
+	msg.data = 0;
+
+	return rxm_ep_writemsg(ep_fid, &msg, rxm_ep_tx_flags(ep_fid));
+}
+
+static ssize_t rxm_ep_writev(struct fid_ep *ep_fid, const struct iovec *iov,
+			     void **desc, size_t count, fi_addr_t dest_addr,
+			     uint64_t addr, uint64_t key, void *context)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+
+	rma_iov.addr = addr;
+	rma_iov.len = ofi_total_iov_len(iov, count);
+	rma_iov.key = key;
+
+	msg.msg_iov = iov;
+	msg.desc = desc;
+	msg.iov_count = count;
+	msg.addr = dest_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = context;
+	msg.data = 0;
+
+	return rxm_ep_writemsg(ep_fid, &msg, rxm_ep_tx_flags(ep_fid));
+}
+
+static ssize_t rxm_ep_writedata(struct fid_ep *ep_fid, const void *buf,
+				size_t len, void *desc, uint64_t data,
+				fi_addr_t dest_addr, uint64_t addr,
+				uint64_t key, void *context)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+	struct iovec iov;
+
+	iov.iov_base = (void *)buf;
+	iov.iov_len = len;
+
+	rma_iov.addr = addr;
+	rma_iov.len = len;
+	rma_iov.key = key;
+
+	msg.msg_iov = &iov;
+	msg.desc = &desc;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = context;
+	msg.data = data;
+
+	return rxm_ep_writemsg(ep_fid, &msg, rxm_ep_tx_flags(ep_fid) |
+			       FI_REMOTE_CQ_DATA);
+}
+
+static ssize_t rxm_ep_inject_write(struct fid_ep *ep_fid, const void *buf,
+			     size_t len, fi_addr_t dest_addr, uint64_t addr,
+			     uint64_t key)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+	struct iovec iov;
+
+	iov.iov_base = (void *)buf;
+	iov.iov_len = len;
+
+	rma_iov.addr = addr;
+	rma_iov.len = len;
+	rma_iov.key = key;
+
+	msg.msg_iov = &iov;
+	msg.desc = NULL;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = NULL;
+	msg.data = 0;
+
+	return rxm_ep_writemsg(ep_fid, &msg,
+			       (rxm_ep_tx_flags(ep_fid) & ~FI_COMPLETION) |
+			       FI_INJECT);
+}
+
+static ssize_t rxm_ep_inject_writedata(struct fid_ep *ep_fid, const void *buf,
+				 size_t len, uint64_t data,
+				 fi_addr_t dest_addr, uint64_t addr,
+					uint64_t key)
+{
+	struct fi_msg_rma msg;
+	struct fi_rma_iov rma_iov;
+	struct iovec iov;
+
+	iov.iov_base = (void *)buf;
+	iov.iov_len = len;
+
+	rma_iov.addr = addr;
+	rma_iov.len = len;
+	rma_iov.key = key;
+
+	msg.msg_iov = &iov;
+	msg.desc = NULL;
+	msg.iov_count = 1;
+	msg.addr = dest_addr;
+	msg.rma_iov = &rma_iov;
+	msg.rma_iov_count = 1;
+	msg.context = NULL;
+	msg.data = data;
+
+	return rxm_ep_writemsg(ep_fid, &msg,
+			       (rxm_ep_tx_flags(ep_fid) & ~FI_COMPLETION) |
+			       FI_INJECT | FI_REMOTE_CQ_DATA);
+}
+
+struct fi_ops_rma rxm_ops_rma = {
+	.size = sizeof (struct fi_ops_rma),
+	.read = rxm_ep_read,
+	.readv = rxm_ep_readv,
+	.readmsg = rxm_ep_readmsg,
+	.write = rxm_ep_write,
+	.writev = rxm_ep_writev,
+	.writemsg = rxm_ep_writemsg,
+	.inject = rxm_ep_inject_write,
+	.writedata = rxm_ep_writedata,
+	.injectdata = rxm_ep_inject_writedata,
+};
diff --git a/prov/sockets/include/sock.h b/prov/sockets/include/sock.h
index cda7794..c51f901 100644
--- a/prov/sockets/include/sock.h
+++ b/prov/sockets/include/sock.h
@@ -49,6 +49,7 @@
 #include <netinet/in.h>
 
 #include <fi.h>
+#include <ofi_atomic.h>
 #include <fi_enosys.h>
 #include <fi_indexer.h>
 #include <fi_rbuf.h>
@@ -69,6 +70,7 @@
 #define SOCK_EP_MEM_TAG_FMT FI_TAG_GENERIC
 #define SOCK_EP_MAX_EP_CNT (128)
 #define SOCK_EP_MAX_CQ_CNT (32)
+#define SOCK_EP_MAX_CNTR_CNT (128)
 #define SOCK_EP_MAX_TX_CNT (16)
 #define SOCK_EP_MAX_RX_CNT (16)
 #define SOCK_EP_MAX_IOV_LIMIT (8)
@@ -78,6 +80,7 @@
 #define SOCK_EP_MAX_ATOMIC_SZ (4096)
 #define SOCK_EP_MAX_CTX_BITS (16)
 #define SOCK_EP_MSG_PREFIX_SZ (0)
+#define SOCK_DOMAIN_MR_CNT (65535)
 
 #define SOCK_PE_POLL_TIMEOUT (100000)
 #define SOCK_PE_MAX_ENTRIES (128)
@@ -106,10 +109,8 @@
 			 FI_READ | FI_WRITE | FI_RECV | FI_SEND | \
 			 FI_REMOTE_READ | FI_REMOTE_WRITE)
 
-#define SOCK_EP_RDM_SEC_CAP (FI_MULTI_RECV | \
-			 FI_SOURCE | \
-			 FI_RMA_EVENT | \
-			 FI_FENCE | FI_TRIGGER)
+#define SOCK_EP_RDM_SEC_CAP (FI_MULTI_RECV | FI_SOURCE | FI_RMA_EVENT | \
+			 FI_SHARED_AV | FI_FENCE | FI_TRIGGER)
 
 #define SOCK_EP_RDM_CAP (SOCK_EP_RDM_PRI_CAP | SOCK_EP_RDM_SEC_CAP)
 
@@ -123,8 +124,7 @@
 			   FI_NAMED_RX_CTX | FI_DIRECTED_RECV | \
 			   FI_RECV | FI_SEND)
 
-#define SOCK_EP_DGRAM_SEC_CAP (FI_MULTI_RECV | \
-			   FI_SOURCE | \
+#define SOCK_EP_DGRAM_SEC_CAP (FI_MULTI_RECV | FI_SOURCE | FI_SHARED_AV | \
 			   FI_FENCE | FI_TRIGGER)
 
 #define SOCK_EP_DGRAM_CAP (SOCK_EP_DGRAM_PRI_CAP | SOCK_EP_DGRAM_SEC_CAP)
@@ -149,9 +149,14 @@
 #define SOCK_MODE (0)
 #define SOCK_NO_COMPLETION (1ULL << 60)
 #define SOCK_USE_OP_FLAGS (1ULL << 61)
+#define SOCK_TRIGGERED_OP (1ULL << 62)
 #define SOCK_PE_COMM_BUFF_SZ (1024)
 #define SOCK_PE_OVERFLOW_COMM_BUFF_SZ (128)
 
+/* it must be adjusted if error data size in CQ/EQ 
+ * will be larger than SOCK_EP_MAX_CM_DATA_SZ */
+#define SOCK_MAX_ERR_CQ_EQ_DATA_SZ SOCK_EP_MAX_CM_DATA_SZ
+
 enum {
 	SOCK_SIGNAL_RD_FD = 0,
 	SOCK_SIGNAL_WR_FD
@@ -184,7 +189,7 @@ struct sock_epoll_set {
 
 struct sock_fabric {
 	struct fid_fabric fab_fid;
-	atomic_t ref;
+	ofi_atomic32_t ref;
 #if ENABLE_DEBUG
 	uint64_t num_send_msg;
 #endif
@@ -194,48 +199,72 @@ struct sock_fabric {
 };
 
 struct sock_conn {
-        int sock_fd;
-        int connected;
+	int sock_fd;
+	int connected;
 	int address_published;
-        struct sockaddr_in addr;
-        struct sock_pe_entry *rx_pe_entry;
-        struct sock_pe_entry *tx_pe_entry;
+	struct sockaddr_in addr;
+	struct sock_pe_entry *rx_pe_entry;
+	struct sock_pe_entry *tx_pe_entry;
 	struct sock_ep_attr *ep_attr;
 	fi_addr_t av_index;
 	struct dlist_entry ep_entry;
 };
 
 struct sock_conn_map {
-        struct sock_conn *table;
+	struct sock_conn *table;
 	struct sock_epoll_set epoll_set;
-        int used;
-        int size;
+	int used;
+	int size;
 	fastlock_t lock;
 };
 
 struct sock_domain {
-	struct fi_info info;
-	struct fid_domain dom_fid;
-	struct sock_fabric *fab;
-	fastlock_t lock;
-	atomic_t ref;
+	struct fi_info		info;
+	struct fid_domain	dom_fid;
+	struct sock_fabric	*fab;
+	fastlock_t		lock;
+	ofi_atomic32_t		ref;
+
+	struct sock_eq		*eq;
+	struct sock_eq		*mr_eq;
+
+	enum fi_progress	progress_mode;
+	struct ofi_mr_map	mr_map;
+	struct sock_pe		*pe;
+	struct dlist_entry	dom_list_entry;
+	struct fi_domain_attr	attr;
+};
 
-	struct sock_eq *eq;
-	struct sock_eq *mr_eq;
+/* move to fi_trigger.h when removing experimental tag from work queues */
+enum {
+	SOCK_DEFERRED_WORK = FI_TRIGGER_THRESHOLD + 1
+};
+
+/* move to fi_trigger.h when removing experimental tag from work queues */
+/* Overlay with fi_trigger_threshold and within fi_trigger_context */
+struct sock_trigger_work {
+	struct fid_cntr		*triggering_cntr;
+	size_t			threshold;
+	struct fid_cntr		*completion_cntr;
+};
 
-	enum fi_progress progress_mode;
-	struct ofi_util_mr *mr_heap;
-	struct sock_pe *pe;
-	struct dlist_entry dom_list_entry;
-	struct fi_domain_attr attr;
+/* must overlay fi_triggered_context */
+struct sock_triggered_context {
+	int					event_type;
+	union {
+		struct fi_trigger_threshold	threshold;
+		struct sock_trigger_work	work;
+		void				*internal[3];
+	} trigger;
 };
 
 struct sock_trigger {
-	uint8_t op_type;
+	enum fi_op_type op_type;
 	size_t threshold;
 	struct dlist_entry entry;
 
-	struct fid_ep	*ep;
+	struct sock_triggered_context *context;
+	struct fid_ep *ep;
 	uint64_t flags;
 
 	union {
@@ -268,27 +297,27 @@ struct sock_trigger {
 };
 
 struct sock_cntr {
-	struct fid_cntr cntr_fid;
-	struct sock_domain *domain;
-	atomic_t value;
-	atomic_t ref;
-	atomic_t err_cnt;
-	atomic_t last_read_val;
-	pthread_cond_t 	cond;
-	pthread_mutex_t mut;
-	struct fi_cntr_attr attr;
-
-	struct dlist_entry rx_list;
-	struct dlist_entry tx_list;
-	fastlock_t list_lock;
-
-	fastlock_t trigger_lock;
-	struct dlist_entry trigger_list;
-
-	struct fid_wait *waitset;
-	int signal;
-	atomic_t num_waiting;
-	int err_flag;
+	struct fid_cntr		cntr_fid;
+	struct sock_domain	*domain;
+	ofi_atomic32_t		value;
+	ofi_atomic32_t		ref;
+	ofi_atomic32_t		err_cnt;
+	ofi_atomic32_t		last_read_val;
+	pthread_cond_t 		cond;
+	pthread_mutex_t		mut;
+	struct fi_cntr_attr	attr;
+
+	struct dlist_entry	rx_list;
+	struct dlist_entry	tx_list;
+	fastlock_t		list_lock;
+
+	fastlock_t		trigger_lock;
+	struct dlist_entry	trigger_list;
+
+	struct fid_wait		*waitset;
+	int			signal;
+	ofi_atomic32_t		num_waiting;
+	int			err_flag;
 };
 
 struct sock_mr {
@@ -314,7 +343,7 @@ struct sock_av_table_hdr {
 struct sock_av {
 	struct fid_av av_fid;
 	struct sock_domain *domain;
-	atomic_t ref;
+	ofi_atomic32_t ref;
 	struct fi_av_attr attr;
 	uint64_t mask;
 	int rx_ctx_bits;
@@ -503,7 +532,7 @@ struct sock_ep_attr {
 	size_t buffered_len;
 	size_t min_multi_recv;
 
-	atomic_t ref;
+	ofi_atomic32_t ref;
 	struct sock_eq *eq;
 	struct sock_av *av;
 	struct sock_domain *domain;
@@ -513,8 +542,8 @@ struct sock_ep_attr {
 
 	struct sock_rx_ctx **rx_array;
 	struct sock_tx_ctx **tx_array;
-	atomic_t num_rx_ctx;
-	atomic_t num_tx_ctx;
+	ofi_atomic32_t num_rx_ctx;
+	ofi_atomic32_t num_tx_ctx;
 
 	struct dlist_entry rx_ctx_entry;
 	struct dlist_entry tx_ctx_entry;
@@ -629,9 +658,8 @@ struct sock_tx_ctx {
 	} fid;
 	size_t fclass;
 
-	struct ringbuf rb;
-	fastlock_t wlock;
-	fastlock_t rlock;
+	struct ofi_ringbuf rb;
+	fastlock_t rb_lock;
 
 	uint16_t tx_id;
 	uint8_t enabled;
@@ -798,7 +826,7 @@ struct sock_pe_entry {
 
 	struct dlist_entry entry;
 	struct dlist_entry ctx_entry;
-	struct ringbuf comm_buf;
+	struct ofi_ringbuf comm_buf;
 	size_t cache_sz;
 };
 
@@ -842,12 +870,12 @@ struct sock_cq {
 	struct fid_cq cq_fid;
 	struct sock_domain *domain;
 	ssize_t cq_entry_size;
-	atomic_t ref;
+	ofi_atomic32_t ref;
 	struct fi_cq_attr attr;
 
-	struct ringbuf addr_rb;
-	struct ringbuffd cq_rbfd;
-	struct ringbuf cqerr_rb;
+	struct ofi_ringbuf addr_rb;
+	struct ofi_ringbuffd cq_rbfd;
+	struct ofi_ringbuf cqerr_rb;
 	struct dlist_entry overflow_list;
 	fastlock_t lock;
 	fastlock_t list_lock;
@@ -867,7 +895,7 @@ struct sock_conn_hdr {
 	uint8_t reserved[3];
 	uint16_t port;
 	uint16_t cm_data_sz;
-	char cm_data[0];
+	/* cm data follows cm_data_sz */
 };
 
 struct sock_conn_req {
@@ -940,9 +968,9 @@ union sock_tx_op {
 };
 #define SOCK_EP_TX_ENTRY_SZ (sizeof(union sock_tx_op))
 
-int sock_verify_info(struct fi_info *hints);
+int sock_verify_info(uint32_t version, struct fi_info *hints);
 int sock_verify_fabric_attr(struct fi_fabric_attr *attr);
-int sock_verify_domain_attr(struct fi_domain_attr *attr);
+int sock_verify_domain_attr(uint32_t version, struct fi_domain_attr *attr);
 
 size_t sock_get_tx_size(size_t size);
 int sock_rdm_verify_ep_attr(struct fi_ep_attr *ep_attr, struct fi_tx_attr *tx_attr,
@@ -955,14 +983,15 @@ int sock_get_src_addr(struct sockaddr_in *dest_addr,
 		      struct sockaddr_in *src_addr);
 int sock_get_src_addr_from_hostname(struct sockaddr_in *src_addr, const char *service);
 
-struct fi_info *sock_fi_info(enum fi_ep_type ep_type,
-			     struct fi_info *hints, void *src_addr, void *dest_addr);
-int sock_msg_fi_info(void *src_addr, void *dest_addr, struct fi_info *hints,
-		     struct fi_info **info);
-int sock_dgram_fi_info(void *src_addr, void *dest_addr, struct fi_info *hints,
-			struct fi_info **info);
-int sock_rdm_fi_info(void *src_addr, void *dest_addr, struct fi_info *hints,
-		     struct fi_info **info);
+struct fi_info *sock_fi_info(uint32_t version, enum fi_ep_type ep_type,
+			     struct fi_info *hints, void *src_addr,
+			     void *dest_addr);
+int sock_msg_fi_info(uint32_t version, void *src_addr, void *dest_addr,
+		     struct fi_info *hints, struct fi_info **info);
+int sock_dgram_fi_info(uint32_t version, void *src_addr, void *dest_addr,
+		       struct fi_info *hints, struct fi_info **info);
+int sock_rdm_fi_info(uint32_t version, void *src_addr, void *dest_addr,
+		     struct fi_info *hints, struct fi_info **info);
 void free_fi_info(struct fi_info *info);
 
 int sock_msg_getinfo(uint32_t version, const char *node, const char *service,
@@ -975,6 +1004,9 @@ int sock_dom_check_list(struct sock_domain *domain);
 void sock_dom_remove_from_list(struct sock_domain *domain);
 struct sock_domain *sock_dom_list_head(void);
 int sock_dom_check_manual_progress(struct sock_fabric *fabric);
+int sock_query_atomic(struct fid_domain *domain,
+		      enum fi_datatype datatype, enum fi_op op,
+		      struct fi_atomic_attr *attr, uint64_t flags);
 
 void sock_fab_add_to_list(struct sock_fabric *fabric);
 int sock_fab_check_list(struct sock_fabric *fabric);
@@ -1011,7 +1043,8 @@ int sock_srx_ctx(struct fid_domain *domain,
 int sock_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		 struct fid_cq **cq, void *context);
 int sock_cq_report_error(struct sock_cq *cq, struct sock_pe_entry *entry,
-			 size_t olen, int err, int prov_errno, void *err_data);
+			 size_t olen, int err, int prov_errno, void *err_data,
+			 size_t err_data_size);
 int sock_cq_progress(struct sock_cq *cq);
 void sock_cq_add_tx_ctx(struct sock_cq *cq, struct sock_tx_ctx *tx_ctx);
 void sock_cq_remove_tx_ctx(struct sock_cq *cq, struct sock_tx_ctx *tx_ctx);
@@ -1031,7 +1064,6 @@ int sock_eq_openwait(struct sock_eq *eq, const char *service);
 int sock_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 		   struct fid_cntr **cntr, void *context);
 void sock_cntr_inc(struct sock_cntr *cntr);
-void sock_cntr_err_inc(struct sock_cntr *cntr);
 int sock_cntr_progress(struct sock_cntr *cntr);
 void sock_cntr_add_tx_ctx(struct sock_cntr *cntr, struct sock_tx_ctx *tx_ctx);
 void sock_cntr_remove_tx_ctx(struct sock_cntr *cntr, struct sock_tx_ctx *tx_ctx);
@@ -1157,17 +1189,18 @@ ssize_t sock_ep_tx_atomic(struct fid_ep *ep,
 			  size_t compare_count, struct fi_ioc *resultv,
 			  void **result_desc, size_t result_count, uint64_t flags);
 
-
+int sock_queue_work(struct sock_domain *dom, struct fi_deferred_work *work);
 ssize_t sock_queue_rma_op(struct fid_ep *ep, const struct fi_msg_rma *msg,
-			  uint64_t flags, uint8_t op_type);
+			  uint64_t flags, enum fi_op_type op_type);
 ssize_t sock_queue_atomic_op(struct fid_ep *ep, const struct fi_msg_atomic *msg,
 			     const struct fi_ioc *comparev, size_t compare_count,
 			     struct fi_ioc *resultv, size_t result_count,
-			     uint64_t flags, uint8_t op_type);
+			     uint64_t flags, enum fi_op_type op_type);
 ssize_t sock_queue_tmsg_op(struct fid_ep *ep, const struct fi_msg_tagged *msg,
-			   uint64_t flags, uint8_t op_type);
+			   uint64_t flags, enum fi_op_type op_type);
 ssize_t sock_queue_msg_op(struct fid_ep *ep, const struct fi_msg *msg,
-			  uint64_t flags, uint8_t op_type);
+			  uint64_t flags, enum fi_op_type op_type);
+ssize_t sock_queue_cntr_op(struct fi_deferred_work *work, uint64_t flags);
 void sock_cntr_check_trigger_list(struct sock_cntr *cntr);
 
 int sock_epoll_create(struct sock_epoll_set *set, int size);
diff --git a/prov/sockets/libfabric-sockets.spec.in b/prov/sockets/libfabric-sockets.spec.in
new file mode 100644
index 0000000..256b6f5
--- /dev/null
+++ b/prov/sockets/libfabric-sockets.spec.in
@@ -0,0 +1,52 @@
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+%{!?provider: %define provider sockets}
+%{!?provider_formal: %define provider_formal sockets}
+
+Name: libfabric-%{provider}
+Version: @VERSION@
+Release: 1%{?dist}
+Summary: Dynamic %{provider_formal} provider for user-space Open Fabric Interfaces
+Group: System Environment/Libraries
+License: GPLv2 or BSD
+Url: http://www.github.com/ofiwg/libfabric
+Source: http://www.github.org/ofiwg/%{name}/releases/download/v{%version}/libfabric-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Requires: libfabric
+BuildRequires: libfabric
+
+%description
+libfabric provides a user-space API to access high-performance fabric
+services, such as RDMA.
+
+This RPM provides the %{provider_formal} provider as a "plugin" to an existing
+libfabric installation.  This plugin will override older %{provider_formal}
+provider functionality in the existing libfabric installation.
+
+%prep
+%setup -q -n libfabric-%{version}
+
+%build
+%configure %{configopts} --enable-%{provider}=dl
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall installdirs
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libfabric/*.so
+
+%exclude %{_libdir}/libfabric.*
+%exclude %{_libdir}/libfabric/*.la
+%exclude %{_libdir}/pkgconfig
+%exclude %{_bindir}
+%exclude %{_mandir}
+%exclude %{_includedir}
+
+%changelog
+* Wed May 24 2017 Open Fabrics Interfaces Working Group <ofiwg at lists.openfabrics.org>
+- First release of specfile for packaging a single dl provider.
diff --git a/prov/sockets/src/sock_atomic.c b/prov/sockets/src/sock_atomic.c
index b3b4140..4f70b2e 100644
--- a/prov/sockets/src/sock_atomic.c
+++ b/prov/sockets/src/sock_atomic.c
@@ -53,6 +53,7 @@
 
 #include "sock.h"
 #include "sock_util.h"
+#include <fi_iov.h>
 
 #define SOCK_LOG_DBG(...) _SOCK_LOG_DBG(FI_LOG_EP_DATA, __VA_ARGS__)
 #define SOCK_LOG_ERROR(...) _SOCK_LOG_ERROR(FI_LOG_EP_DATA, __VA_ARGS__)
@@ -63,7 +64,8 @@ ssize_t sock_ep_tx_atomic(struct fid_ep *ep,
 			  size_t compare_count, struct fi_ioc *resultv,
 			  void **result_desc, size_t result_count, uint64_t flags)
 {
-	int i, ret;
+	ssize_t ret;
+	size_t i;
 	size_t datatype_sz;
 	struct sock_op tx_op;
 	union sock_iov tx_iov;
@@ -112,14 +114,14 @@ ssize_t sock_ep_tx_atomic(struct fid_ep *ep,
 
 	if (flags & FI_TRIGGER) {
 		ret = sock_queue_atomic_op(ep, msg, comparev, compare_count,
-					resultv, result_count, flags,
-					SOCK_OP_ATOMIC);
+					   resultv, result_count, flags,
+					   FI_OP_ATOMIC);
 		if (ret != 1)
 			return ret;
 	}
 
 	src_len = cmp_len = 0;
-	datatype_sz = fi_datatype_size(msg->datatype);
+	datatype_sz = ofi_datatype_size(msg->datatype);
 	for (i = 0; i < compare_count; i++)
 		cmp_len += (comparev[i].count * datatype_sz);
 	if (flags & FI_INJECT) {
@@ -139,7 +141,7 @@ ssize_t sock_ep_tx_atomic(struct fid_ep *ep,
 		      (result_count * sizeof(union sock_iov)));
 
 	sock_tx_ctx_start(tx_ctx);
-	if (rbavail(&tx_ctx->rb) < total_len) {
+	if (ofi_rbavail(&tx_ctx->rb) < total_len) {
 		ret = -FI_EAGAIN;
 		goto err;
 	}
@@ -310,6 +312,7 @@ static ssize_t sock_ep_atomic_writev(struct fid_ep *ep,
 			uint64_t addr, uint64_t key,
 			enum fi_datatype datatype, enum fi_op op, void *context)
 {
+	size_t i;
 	struct fi_msg_atomic msg;
 	struct fi_rma_ioc rma_iov;
 
@@ -320,7 +323,10 @@ static ssize_t sock_ep_atomic_writev(struct fid_ep *ep,
 
 	rma_iov.addr = addr;
 	rma_iov.key = key;
-	rma_iov.count = count;
+
+	for (i = 0, rma_iov.count = 0; i < count; i++)
+		rma_iov.count += iov[i].count;
+
 	msg.rma_iov = &rma_iov;
 	msg.rma_iov_count = 1;
 
@@ -416,7 +422,7 @@ static ssize_t sock_ep_atomic_readwrite(struct fid_ep *ep,
 	msg.addr = dest_addr;
 
 	rma_iov.addr = addr;
-	rma_iov.count = 1;
+	rma_iov.count = count;
 	rma_iov.key = key;
 	msg.rma_iov = &rma_iov;
 	msg.rma_iov_count = 1;
@@ -425,7 +431,7 @@ static ssize_t sock_ep_atomic_readwrite(struct fid_ep *ep,
 	msg.context = context;
 
 	resultv.addr = result;
-	resultv.count = 1;
+	resultv.count = count;
 
 	return sock_ep_atomic_readwritemsg(ep, &msg, &resultv, &result_desc, 1,
 						SOCK_USE_OP_FLAGS);
@@ -447,7 +453,7 @@ static ssize_t sock_ep_atomic_readwritev(struct fid_ep *ep,
 	msg.addr = dest_addr;
 
 	rma_iov.addr = addr;
-	rma_iov.count = 1;
+	rma_iov.count = ofi_total_ioc_cnt(iov, count);
 	rma_iov.key = key;
 	msg.rma_iov = &rma_iov;
 	msg.rma_iov_count = 1;
@@ -507,7 +513,7 @@ static ssize_t sock_ep_atomic_compwrite(struct fid_ep *ep,
 	msg.addr = dest_addr;
 
 	rma_iov.addr = addr;
-	rma_iov.count = 1;
+	rma_iov.count = count;
 	rma_iov.key = key;
 	msg.rma_iov = &rma_iov;
 	msg.rma_iov_count = 1;
@@ -516,9 +522,9 @@ static ssize_t sock_ep_atomic_compwrite(struct fid_ep *ep,
 	msg.context = context;
 
 	resultv.addr = result;
-	resultv.count = 1;
+	resultv.count = count;
 	comparev.addr = (void *)compare;
-	comparev.count = 1;
+	comparev.count = count;
 
 	return sock_ep_atomic_compwritemsg(ep, &msg, &comparev, &compare_desc,
 			1, &resultv, &result_desc, 1, SOCK_USE_OP_FLAGS);
@@ -541,7 +547,7 @@ static ssize_t sock_ep_atomic_compwritev(struct fid_ep *ep,
 	msg.addr = dest_addr;
 
 	rma_iov.addr = addr;
-	rma_iov.count = 1;
+	rma_iov.count = ofi_total_ioc_cnt(iov, count);
 	rma_iov.key = key;
 	msg.rma_iov = &rma_iov;
 	msg.rma_iov_count = 1;
@@ -549,47 +555,68 @@ static ssize_t sock_ep_atomic_compwritev(struct fid_ep *ep,
 	msg.op = op;
 	msg.context = context;
 
-	return sock_ep_atomic_compwritemsg(ep, &msg, comparev, compare_desc, 1,
-					   resultv, result_desc, 1,
+	return sock_ep_atomic_compwritemsg(ep, &msg,
+					   comparev, compare_desc, compare_count,
+					   resultv, result_desc, result_count,
 					   SOCK_USE_OP_FLAGS);
 }
 
-static int sock_ep_atomic_valid(struct fid_ep *ep, enum fi_datatype datatype,
-			      enum fi_op op, size_t *count)
+/* Domain parameter is ignored, okay to pass in NULL */
+int sock_query_atomic(struct fid_domain *domain,
+		      enum fi_datatype datatype, enum fi_op op,
+		      struct fi_atomic_attr *attr, uint64_t flags)
 {
-	size_t datatype_sz;
+	int ret;
 
-	switch (datatype) {
-	case FI_FLOAT:
-	case FI_DOUBLE:
-	case FI_LONG_DOUBLE:
-		if (op == FI_BOR || op == FI_BAND ||
-		    op == FI_BXOR || op == FI_MSWAP)
-			return -FI_ENOENT;
-		break;
-
-	case FI_FLOAT_COMPLEX:
-	case FI_DOUBLE_COMPLEX:
-	case FI_LONG_DOUBLE_COMPLEX:
-		if (op == FI_BOR      || op == FI_BAND     ||
-		    op == FI_BXOR     || op == FI_MSWAP    ||
-		    op == FI_MIN      || op == FI_MAX      ||
-		    op == FI_CSWAP_LE || op == FI_CSWAP_LT ||
-		    op == FI_CSWAP_GE || op == FI_CSWAP_GT)
-			return -FI_ENOENT;
-	break;
-	default:
-		break;
-	}
+	ret = ofi_atomic_valid(&sock_prov, datatype, op, flags);
+	if (ret)
+		return ret;
 
-	datatype_sz = fi_datatype_size(datatype);
-	if (datatype_sz == 0)
-		return -FI_ENOENT;
+	attr->size = ofi_datatype_size(datatype);
+	if (attr->size == 0)
+		return -FI_EINVAL;
 
-	*count = (SOCK_EP_MAX_ATOMIC_SZ/datatype_sz);
+	attr->count = (SOCK_EP_MAX_ATOMIC_SZ / attr->size);
 	return 0;
 }
 
+static int sock_ep_atomic_valid(struct fid_ep *ep,
+		enum fi_datatype datatype, enum fi_op op, size_t *count)
+{
+	struct fi_atomic_attr attr;
+	int ret;
+
+	ret = sock_query_atomic(NULL, datatype, op, &attr, 0);
+	if (!ret)
+		*count = attr.count;
+	return ret;
+}
+
+static int sock_ep_atomic_fetch_valid(struct fid_ep *ep,
+		enum fi_datatype datatype, enum fi_op op, size_t *count)
+{
+	struct fi_atomic_attr attr;
+	int ret;
+
+	ret = sock_query_atomic(NULL, datatype, op, &attr, FI_FETCH_ATOMIC);
+	if (!ret)
+		*count = attr.count;
+	return ret;
+}
+
+static int sock_ep_atomic_cswap_valid(struct fid_ep *ep,
+		enum fi_datatype datatype, enum fi_op op, size_t *count)
+{
+	struct fi_atomic_attr attr;
+	int ret;
+
+	/* domain parameter is ignored - okay to pass in NULL */
+	ret = sock_query_atomic(NULL, datatype, op, &attr, FI_COMPARE_ATOMIC);
+	if (!ret)
+		*count = attr.count;
+	return ret;
+}
+
 struct fi_ops_atomic sock_ep_atomic = {
 	.size = sizeof(struct fi_ops_atomic),
 	.write = sock_ep_atomic_write,
@@ -603,6 +630,6 @@ struct fi_ops_atomic sock_ep_atomic = {
 	.compwritev = sock_ep_atomic_compwritev,
 	.compwritemsg = sock_ep_atomic_compwritemsg,
 	.writevalid = sock_ep_atomic_valid,
-	.readwritevalid = sock_ep_atomic_valid,
-	.compwritevalid = sock_ep_atomic_valid,
+	.readwritevalid = sock_ep_atomic_fetch_valid,
+	.compwritevalid = sock_ep_atomic_cswap_valid,
 };
diff --git a/prov/sockets/src/sock_av.c b/prov/sockets/src/sock_av.c
index 9fdbdf8..3d63974 100644
--- a/prov/sockets/src/sock_av.c
+++ b/prov/sockets/src/sock_av.c
@@ -66,7 +66,7 @@ int sock_av_get_addr_index(struct sock_av *av, struct sockaddr_in *addr)
 	int i;
 	struct sock_av_addr *av_addr;
 
-	for (i = 0; i < av->table_hdr->size; i++) {
+	for (i = 0; i < (int)av->table_hdr->size; i++) {
 		av_addr = &av->table[i];
 		if (!av_addr->valid)
 			continue;
@@ -87,8 +87,8 @@ int sock_av_compare_addr(struct sock_av *av,
 	index1 = ((uint64_t)addr1 & av->mask);
 	index2 = ((uint64_t)addr2 & av->mask);
 
-	if (index1 >= av->table_hdr->size || index1 < 0 ||
-	    index2 >= av->table_hdr->size || index2 < 0) {
+	if (index1 >= (int)av->table_hdr->size || index1 < 0 ||
+	    index2 >= (int)av->table_hdr->size || index2 < 0) {
 		SOCK_LOG_ERROR("requested rank is larger than av table\n");
 		return -1;
 	}
@@ -168,7 +168,7 @@ static int sock_resize_av_table(struct sock_av *av)
 
 static int sock_av_get_next_index(struct sock_av *av)
 {
-	int i;
+	uint64_t i;
 
 	for (i = 0; i < av->table_hdr->size; i++) {
 		if (!av->table[i].valid)
@@ -182,7 +182,8 @@ static int sock_check_table_in(struct sock_av *_av, struct sockaddr_in *addr,
 			       fi_addr_t *fi_addr, int count, uint64_t flags,
 			       void *context)
 {
-	int i, j, ret = 0;
+	int i, ret = 0;
+	uint64_t j;
 	char sa_ip[INET_ADDRSTRLEN];
 	struct sock_av_addr *av_addr;
 	int index;
@@ -239,7 +240,7 @@ static int sock_check_table_in(struct sock_av *_av, struct sockaddr_in *addr,
 		}
 
 		av_addr = &_av->table[index];
-		memcpy(sa_ip, inet_ntoa((&addr[i])->sin_addr), INET_ADDRSTRLEN);
+		inet_ntop(addr[i].sin_family, &addr[i].sin_addr, sa_ip, INET_ADDRSTRLEN);
 		SOCK_LOG_DBG("AV-INSERT: dst_addr family: %d, IP %s, port: %d\n",
 			      ((struct sockaddr_in *)&addr[i])->sin_family,
 				sa_ip, ntohs(((struct sockaddr_in *)&addr[i])->sin_port));
@@ -273,13 +274,13 @@ static int sock_av_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr,
 
 	_av = container_of(av, struct sock_av, av_fid);
 	index = ((uint64_t)fi_addr & _av->mask);
-	if (index >= _av->table_hdr->size || index < 0) {
+	if (index >= (int)_av->table_hdr->size || index < 0) {
 		SOCK_LOG_ERROR("requested address not inserted\n");
 		return -EINVAL;
 	}
 
 	av_addr = &_av->table[index];
-	memcpy(addr, &av_addr->addr, MIN(*addrlen, _av->addrlen));
+	memcpy(addr, &av_addr->addr, MIN(*addrlen, (size_t)_av->addrlen));
 	*addrlen = _av->addrlen;
 	return 0;
 }
@@ -334,7 +335,8 @@ static int sock_av_insertsym(struct fid_av *av, const char *node, size_t nodecnt
 	char base_host[FI_NAME_MAX] = {0};
 	char tmp_host[FI_NAME_MAX] = {0};
 	char tmp_port[FI_NAME_MAX] = {0};
-	int hostlen, offset = 0, fmt, i, j;
+	int hostlen, offset = 0, fmt;
+	size_t i, j;
 
 	if (!node || !service || node[0] == '\0') {
 		SOCK_LOG_ERROR("Node/service not provided\n");
@@ -358,9 +360,9 @@ static int sock_av_insertsym(struct fid_av *av, const char *node, size_t nodecnt
 	for (i = 0; i < nodecnt; i++) {
 		for (j = 0; j < svccnt; j++) {
 			len1 = snprintf(tmp_host, FI_NAME_MAX, "%s%0*d",
-					base_host, fmt, var_host + i);
+					base_host, fmt, var_host + (int)i);
 			len2 = snprintf(tmp_port, FI_NAME_MAX,  "%d",
-					var_port + j);
+					var_port + (int)j);
 			if (len1 > 0 && len1 < FI_NAME_MAX && len2 > 0 && len2 < FI_NAME_MAX) {
 				ret = _sock_av_insertsvc(av, tmp_host, tmp_port, fi_addr, flags, context);
 				if (ret == 1)
@@ -380,7 +382,7 @@ static int sock_av_insertsym(struct fid_av *av, const char *node, size_t nodecnt
 static int sock_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
 			  uint64_t flags)
 {
-	int i;
+	size_t i;
 	struct sock_av *_av;
 	struct sock_av_addr *av_addr;
 	struct dlist_entry *item;
@@ -397,10 +399,10 @@ static int sock_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
 		fastlock_acquire(&sock_ep->attr->cmap.lock);
 		for (i = 0; i < count; i++) {
         		idx = fi_addr[i] & sock_ep->attr->av->mask;
-			conn = idm_lookup(&sock_ep->attr->av_idm, idx);
+			conn = ofi_idm_lookup(&sock_ep->attr->av_idm, idx);
 			if (conn && conn->sock_fd != -1) {
 				sock_ep_remove_conn(sock_ep->attr, conn);
-				idm_clear(&sock_ep->attr->av_idm, idx);
+				ofi_idm_clear(&sock_ep->attr->av_idm, idx);
 			}
 		}
 		fastlock_release(&sock_ep->attr->cmap.lock);
@@ -416,15 +418,17 @@ static int sock_av_remove(struct fid_av *av, fi_addr_t *fi_addr, size_t count,
 }
 
 static const char *sock_av_straddr(struct fid_av *av, const void *addr,
-				    char *buf, size_t *len)
+				   char *buf, size_t *len)
 {
 	const struct sockaddr_in *sin;
 	char straddr[24];
+	char ipaddr[24];
 	int size;
 
 	sin = addr;
+	inet_ntop(sin->sin_family, (void*)&sin->sin_addr, ipaddr, sizeof(ipaddr));
 	size = snprintf(straddr, sizeof(straddr), "%s:%d",
-			inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
+			ipaddr, ntohs(sin->sin_port));
 	snprintf(buf, *len, "%s", straddr);
 	*len = size + 1;
 	return buf;
@@ -449,7 +453,7 @@ static int sock_av_close(struct fid *fid)
 	struct sock_av *av;
 	int ret = 0;
 	av = container_of(fid, struct sock_av, av_fid.fid);
-	if (atomic_get(&av->ref))
+	if (ofi_atomic_get32(&av->ref))
 		return -FI_EBUSY;
 
 	if (!av->shared)
@@ -460,7 +464,7 @@ static int sock_av_close(struct fid *fid)
 			SOCK_LOG_ERROR("unmap failed: %s\n", strerror(errno));
 	}
 
-	atomic_dec(&av->domain->ref);
+	ofi_atomic_dec32(&av->domain->ref);
 	fastlock_destroy(&av->list_lock);
 	free(av);
 	return 0;
@@ -593,8 +597,8 @@ int sock_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 		goto err2;
 	}
 
-	atomic_initialize(&_av->ref, 0);
-	atomic_inc(&dom->ref);
+	ofi_atomic_initialize32(&_av->ref, 0);
+	ofi_atomic_inc32(&dom->ref);
 	_av->domain = dom;
 	switch (dom->info.addr_format) {
 	case FI_SOCKADDR_IN:
diff --git a/prov/sockets/src/sock_cntr.c b/prov/sockets/src/sock_cntr.c
index 5a32c63..d6ce772 100644
--- a/prov/sockets/src/sock_cntr.c
+++ b/prov/sockets/src/sock_cntr.c
@@ -60,12 +60,15 @@ void sock_cntr_add_tx_ctx(struct sock_cntr *cntr, struct sock_tx_ctx *tx_ctx)
 	ret = fid_list_insert(&cntr->tx_list, &cntr->list_lock, fid);
 	if (ret)
 		SOCK_LOG_ERROR("Error in adding ctx to progress list\n");
+	else
+		ofi_atomic_inc32(&cntr->ref);
 }
 
 void sock_cntr_remove_tx_ctx(struct sock_cntr *cntr, struct sock_tx_ctx *tx_ctx)
 {
 	struct fid *fid = &tx_ctx->fid.ctx.fid;
 	fid_list_remove(&cntr->tx_list, &cntr->list_lock, fid);
+	ofi_atomic_dec32(&cntr->ref);
 }
 
 void sock_cntr_add_rx_ctx(struct sock_cntr *cntr, struct sock_rx_ctx *rx_ctx)
@@ -75,12 +78,15 @@ void sock_cntr_add_rx_ctx(struct sock_cntr *cntr, struct sock_rx_ctx *rx_ctx)
 	ret = fid_list_insert(&cntr->rx_list, &cntr->list_lock, fid);
 	if (ret)
 		SOCK_LOG_ERROR("Error in adding ctx to progress list\n");
+	else
+		ofi_atomic_inc32(&cntr->ref);
 }
 
 void sock_cntr_remove_rx_ctx(struct sock_cntr *cntr, struct sock_rx_ctx *rx_ctx)
 {
 	struct fid *fid = &rx_ctx->ctx.fid;
 	fid_list_remove(&cntr->rx_list, &cntr->list_lock, fid);
+	ofi_atomic_dec32(&cntr->ref);
 }
 
 int sock_cntr_progress(struct sock_cntr *cntr)
@@ -121,6 +127,7 @@ int sock_cntr_progress(struct sock_cntr *cntr)
 
 void sock_cntr_check_trigger_list(struct sock_cntr *cntr)
 {
+	struct fi_deferred_work *work;
 	struct sock_trigger *trigger;
 	struct dlist_entry *entry;
 	int ret = 0;
@@ -132,56 +139,61 @@ void sock_cntr_check_trigger_list(struct sock_cntr *cntr)
 		trigger = container_of(entry, struct sock_trigger, entry);
 		entry = entry->next;
 
-		if (atomic_get(&cntr->value) < trigger->threshold)
+		if (ofi_atomic_get32(&cntr->value) < (int) trigger->threshold)
 			continue;
 
 		switch (trigger->op_type) {
-		case SOCK_OP_SEND:
+		case FI_OP_SEND:
 			ret = sock_ep_sendmsg(trigger->ep, &trigger->op.msg.msg,
-					trigger->flags & ~FI_TRIGGER);
+					      trigger->flags & ~FI_TRIGGER);
 			break;
-
-		case SOCK_OP_RECV:
+		case FI_OP_RECV:
 			ret = sock_ep_recvmsg(trigger->ep, &trigger->op.msg.msg,
-					trigger->flags & ~FI_TRIGGER);
+					      trigger->flags & ~FI_TRIGGER);
 			break;
-
-		case SOCK_OP_TSEND:
-			ret = sock_ep_tsendmsg(trigger->ep,
-					&trigger->op.tmsg.msg,
-					trigger->flags & ~FI_TRIGGER);
+		case FI_OP_TSEND:
+			ret = sock_ep_tsendmsg(trigger->ep, &trigger->op.tmsg.msg,
+					       trigger->flags & ~FI_TRIGGER);
 			break;
-
-		case SOCK_OP_TRECV:
-			ret = sock_ep_trecvmsg(trigger->ep,
-					&trigger->op.tmsg.msg,
-					trigger->flags & ~FI_TRIGGER);
+		case FI_OP_TRECV:
+			ret = sock_ep_trecvmsg(trigger->ep, &trigger->op.tmsg.msg,
+					       trigger->flags & ~FI_TRIGGER);
 			break;
-
-		case SOCK_OP_WRITE:
+		case FI_OP_WRITE:
 			ret = sock_ep_rma_writemsg(trigger->ep,
-					&trigger->op.rma.msg,
-					trigger->flags & ~FI_TRIGGER);
+						   &trigger->op.rma.msg,
+						   trigger->flags & ~FI_TRIGGER);
 			break;
-
-		case SOCK_OP_READ:
+		case FI_OP_READ:
 			ret = sock_ep_rma_readmsg(trigger->ep,
-					&trigger->op.rma.msg,
-					trigger->flags & ~FI_TRIGGER);
+						  &trigger->op.rma.msg,
+						  trigger->flags & ~FI_TRIGGER);
 			break;
-
-		case SOCK_OP_ATOMIC:
+		case FI_OP_ATOMIC:
+		case FI_OP_FETCH_ATOMIC:
+		case FI_OP_COMPARE_ATOMIC:
 			ret = sock_ep_tx_atomic(trigger->ep,
-					&trigger->op.atomic.msg,
-					trigger->op.atomic.comparev,
-					NULL,
-					trigger->op.atomic.compare_count,
-					trigger->op.atomic.resultv,
-					NULL,
-					trigger->op.atomic.result_count,
-					trigger->flags & ~FI_TRIGGER);
+						&trigger->op.atomic.msg,
+						trigger->op.atomic.comparev,
+						NULL,
+						trigger->op.atomic.compare_count,
+						trigger->op.atomic.resultv,
+						NULL,
+						trigger->op.atomic.result_count,
+						trigger->flags & ~FI_TRIGGER);
+			break;
+		case FI_OP_CNTR_SET:
+			work = container_of(trigger->context,
+					    struct fi_deferred_work, context);
+			fi_cntr_set(work->op.cntr->cntr, work->op.cntr->value);
+			ret = 0;
+			break;
+		case FI_OP_CNTR_ADD:
+			work = container_of(trigger->context,
+					    struct fi_deferred_work, context);
+			fi_cntr_add(work->op.cntr->cntr, work->op.cntr->value);
+			ret = 0;
 			break;
-
 		default:
 			SOCK_LOG_ERROR("unsupported op\n");
 			ret = 0;
@@ -198,111 +210,141 @@ void sock_cntr_check_trigger_list(struct sock_cntr *cntr)
 	fastlock_release(&cntr->trigger_lock);
 }
 
-static uint64_t sock_cntr_read(struct fid_cntr *cntr)
+static uint64_t sock_cntr_read(struct fid_cntr *fid_cntr)
 {
-	struct sock_cntr *_cntr;
-	_cntr = container_of(cntr, struct sock_cntr, cntr_fid);
-	sock_cntr_progress(_cntr);
-	return atomic_get(&_cntr->value);
+	struct sock_cntr *cntr;
+	cntr = container_of(fid_cntr, struct sock_cntr, cntr_fid);
+	sock_cntr_progress(cntr);
+	return ofi_atomic_get32(&cntr->value);
 }
 
 void sock_cntr_inc(struct sock_cntr *cntr)
 {
 	pthread_mutex_lock(&cntr->mut);
-	atomic_inc(&cntr->value);
-	if(atomic_get(&cntr->num_waiting))
+	ofi_atomic_inc32(&cntr->value);
+	if (ofi_atomic_get32(&cntr->num_waiting))
 		pthread_cond_broadcast(&cntr->cond);
+	if (cntr->signal)
+		sock_wait_signal(cntr->waitset);
 	pthread_mutex_unlock(&cntr->mut);
+
 	sock_cntr_check_trigger_list(cntr);
 }
 
-void sock_cntr_err_inc(struct sock_cntr *cntr)
+static int sock_cntr_add(struct fid_cntr *fid_cntr, uint64_t value)
 {
+	uint64_t new_val;
+	struct sock_cntr *cntr;
+	cntr = container_of(fid_cntr, struct sock_cntr, cntr_fid);
+
 	pthread_mutex_lock(&cntr->mut);
-	atomic_inc(&cntr->err_cnt);
-	if (!cntr->err_flag)
-		cntr->err_flag = 1;
-	pthread_cond_signal(&cntr->cond);
+	new_val = ofi_atomic_add32(&cntr->value, value);
+	ofi_atomic_set32(&cntr->last_read_val, new_val);
+	if (ofi_atomic_get32(&cntr->num_waiting))
+		pthread_cond_broadcast(&cntr->cond);
+	if (cntr->signal)
+		sock_wait_signal(cntr->waitset);
 	pthread_mutex_unlock(&cntr->mut);
+
+	sock_cntr_check_trigger_list(cntr);
+	return 0;
 }
 
-static int sock_cntr_add(struct fid_cntr *cntr, uint64_t value)
+static int sock_cntr_set(struct fid_cntr *fid_cntr, uint64_t value)
 {
 	uint64_t new_val;
-	struct sock_cntr *_cntr;
+	struct sock_cntr *cntr;
+	cntr = container_of(fid_cntr, struct sock_cntr, cntr_fid);
 
-	_cntr = container_of(cntr, struct sock_cntr, cntr_fid);
-	pthread_mutex_lock(&_cntr->mut);
-	new_val = atomic_add(&_cntr->value, value);
-	atomic_set(&_cntr->last_read_val, new_val);
-	if(atomic_get(&_cntr->num_waiting))
-		pthread_cond_broadcast(&_cntr->cond);
-	pthread_mutex_unlock(&_cntr->mut);
-	sock_cntr_check_trigger_list(_cntr);
+	pthread_mutex_lock(&cntr->mut);
+	new_val = ofi_atomic_set32(&cntr->value, value);
+	ofi_atomic_set32(&cntr->last_read_val, new_val);
+	if (ofi_atomic_get32(&cntr->num_waiting))
+		pthread_cond_broadcast(&cntr->cond);
+	if (cntr->signal)
+		sock_wait_signal(cntr->waitset);
+	pthread_mutex_unlock(&cntr->mut);
+
+	sock_cntr_check_trigger_list(cntr);
 	return 0;
 }
 
-static int sock_cntr_set(struct fid_cntr *cntr, uint64_t value)
+static int sock_cntr_adderr(struct fid_cntr *fid_cntr, uint64_t value)
 {
-	uint64_t new_val;
-	struct sock_cntr *_cntr;
+	struct sock_cntr *cntr;
+	cntr = container_of(fid_cntr, struct sock_cntr, cntr_fid);
+
+	pthread_mutex_lock(&cntr->mut);
+	ofi_atomic_add32(&cntr->err_cnt, value);
+	if (!cntr->err_flag)
+		cntr->err_flag = 1;
+	pthread_cond_signal(&cntr->cond);
+	if (cntr->signal)
+		sock_wait_signal(cntr->waitset);
+	pthread_mutex_unlock(&cntr->mut);
+
+	return 0;
+}
+
+static int sock_cntr_seterr(struct fid_cntr *fid_cntr, uint64_t value)
+{
+	struct sock_cntr *cntr;
+
+	cntr = container_of(fid_cntr, struct sock_cntr, cntr_fid);
+	pthread_mutex_lock(&cntr->mut);
+	ofi_atomic_set32(&cntr->err_cnt, value);
+	if (!cntr->err_flag)
+		cntr->err_flag = 1;
+	pthread_cond_signal(&cntr->cond);
+	if (cntr->signal)
+		sock_wait_signal(cntr->waitset);
+	pthread_mutex_unlock(&cntr->mut);
 
-	_cntr = container_of(cntr, struct sock_cntr, cntr_fid);
-	pthread_mutex_lock(&_cntr->mut);
-	new_val = atomic_set(&_cntr->value, value);
-	atomic_set(&_cntr->last_read_val, new_val);
-	if(atomic_get(&_cntr->num_waiting))
-		pthread_cond_broadcast(&_cntr->cond);
-	pthread_mutex_unlock(&_cntr->mut);
-	sock_cntr_check_trigger_list(_cntr);
 	return 0;
+
 }
 
-static int sock_cntr_wait(struct fid_cntr *cntr, uint64_t threshold,
+static int sock_cntr_wait(struct fid_cntr *fid_cntr, uint64_t threshold,
 			  int timeout)
 {
 	int last_read, ret = 0;
 	uint64_t start_ms = 0, end_ms = 0, remaining_ms = 0;
-	struct sock_cntr *_cntr;
-
-	_cntr = container_of(cntr, struct sock_cntr, cntr_fid);
-	pthread_mutex_lock(&_cntr->mut);
+	struct sock_cntr *cntr;
+	cntr = container_of(fid_cntr, struct sock_cntr, cntr_fid);
 
-	if (_cntr->err_flag) {
+	pthread_mutex_lock(&cntr->mut);
+	if (cntr->err_flag) {
 		ret = -FI_EAVAIL;
 		goto out;
 	}
 
-	if (atomic_get(&_cntr->value) >= threshold) {
+	if (ofi_atomic_get32(&cntr->value) >= (int)threshold) {
 		ret = 0;
 		goto out;
 	}
 
-	atomic_inc(&_cntr->num_waiting);
+	ofi_atomic_inc32(&cntr->num_waiting);
 
 	if (timeout >= 0) {
 		start_ms = fi_gettime_ms();
 		end_ms = start_ms + timeout;
 	}
 
-        last_read = atomic_get(&_cntr->value);
+	last_read = ofi_atomic_get32(&cntr->value);
 	remaining_ms = timeout;
 
-	while (!ret && last_read < threshold) {
-		if(_cntr->domain->progress_mode == FI_PROGRESS_MANUAL) {
-			pthread_mutex_unlock(&_cntr->mut);
-
-			ret = sock_cntr_progress(_cntr);
-
-			pthread_mutex_lock(&_cntr->mut);
-
+	while (!ret && last_read < (int)threshold) {
+		if (cntr->domain->progress_mode == FI_PROGRESS_MANUAL) {
+			pthread_mutex_unlock(&cntr->mut);
+			ret = sock_cntr_progress(cntr);
+			pthread_mutex_lock(&cntr->mut);
 		} else {
-			ret = fi_wait_cond(&_cntr->cond, &_cntr->mut, remaining_ms);
+			ret = fi_wait_cond(&cntr->cond, &cntr->mut, remaining_ms);
 		}
 
 		uint64_t curr_ms = fi_gettime_ms();
-		if(timeout >= 0) {
-			if(curr_ms >= end_ms) {
+		if (timeout >= 0) {
+			if (curr_ms >= end_ms) {
 				ret = -FI_ETIMEDOUT;
 				break;
 			} else {
@@ -310,18 +352,18 @@ static int sock_cntr_wait(struct fid_cntr *cntr, uint64_t threshold,
 			}
 		}
 
-		last_read = atomic_get(&_cntr->value);
+		last_read = ofi_atomic_get32(&cntr->value);
 	}
 
-	atomic_set(&_cntr->last_read_val, last_read);
-	atomic_dec(&_cntr->num_waiting);
+	ofi_atomic_set32(&cntr->last_read_val, last_read);
+	ofi_atomic_dec32(&cntr->num_waiting);
+	pthread_mutex_unlock(&cntr->mut);
 
-	pthread_mutex_unlock(&_cntr->mut);
-	sock_cntr_check_trigger_list(_cntr);
-	return (_cntr->err_flag) ? -FI_EAVAIL : ret;
+	sock_cntr_check_trigger_list(cntr);
+	return (cntr->err_flag) ? -FI_EAVAIL : ret;
 
 out:
-	pthread_mutex_unlock(&_cntr->mut);
+	pthread_mutex_unlock(&cntr->mut);
 	return ret;
 }
 
@@ -377,7 +419,7 @@ static int sock_cntr_close(struct fid *fid)
 	struct sock_cntr *cntr;
 
 	cntr = container_of(fid, struct sock_cntr, cntr_fid.fid);
-	if (atomic_get(&cntr->ref))
+	if (ofi_atomic_get32(&cntr->ref))
 		return -FI_EBUSY;
 
 	if (cntr->signal && cntr->attr.wait_obj == FI_WAIT_FD)
@@ -388,7 +430,7 @@ static int sock_cntr_close(struct fid *fid)
 	fastlock_destroy(&cntr->trigger_lock);
 
 	pthread_cond_destroy(&cntr->cond);
-	atomic_dec(&cntr->domain->ref);
+	ofi_atomic_dec32(&cntr->domain->ref);
 	free(cntr);
 	return 0;
 }
@@ -401,7 +443,7 @@ static uint64_t sock_cntr_readerr(struct fid_cntr *cntr)
 		sock_cntr_progress(_cntr);
 	if (_cntr->err_flag)
 		_cntr->err_flag = 0;
-	return atomic_get(&_cntr->err_cnt);
+	return ofi_atomic_get32(&_cntr->err_cnt);
 }
 
 static struct fi_ops_cntr sock_cntr_ops = {
@@ -411,6 +453,8 @@ static struct fi_ops_cntr sock_cntr_ops = {
 	.add = sock_cntr_add,
 	.set = sock_cntr_set,
 	.wait = sock_cntr_wait,
+	.adderr = sock_cntr_adderr,
+	.seterr = sock_cntr_seterr,
 };
 
 static struct fi_ops sock_cntr_fi_ops = {
@@ -468,7 +512,7 @@ int sock_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 		goto err;
 
 	if (attr == NULL)
-		memcpy(&_cntr->attr, &sock_cntr_add, sizeof(sock_cntr_attr));
+		memcpy(&_cntr->attr, &sock_cntr_attr, sizeof(sock_cntr_attr));
 	else
 		memcpy(&_cntr->attr, attr, sizeof(sock_cntr_attr));
 
@@ -518,12 +562,12 @@ int sock_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 	pthread_mutex_init(&_cntr->mut, NULL);
 	fastlock_init(&_cntr->list_lock);
 
-	atomic_initialize(&_cntr->ref, 0);
-	atomic_initialize(&_cntr->err_cnt, 0);
+	ofi_atomic_initialize32(&_cntr->ref, 0);
+	ofi_atomic_initialize32(&_cntr->err_cnt, 0);
 
-	atomic_initialize(&_cntr->value, 0);
-	atomic_initialize(&_cntr->last_read_val, 0);
-	atomic_initialize(&_cntr->num_waiting, 0);
+	ofi_atomic_initialize32(&_cntr->value, 0);
+	ofi_atomic_initialize32(&_cntr->last_read_val, 0);
+	ofi_atomic_initialize32(&_cntr->num_waiting, 0);
 
 	dlist_init(&_cntr->tx_list);
 	dlist_init(&_cntr->rx_list);
@@ -536,7 +580,7 @@ int sock_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 	_cntr->cntr_fid.fid.ops = &sock_cntr_fi_ops;
 	_cntr->cntr_fid.ops = &sock_cntr_ops;
 
-	atomic_inc(&dom->ref);
+	ofi_atomic_inc32(&dom->ref);
 	_cntr->domain = dom;
 	*cntr = &_cntr->cntr_fid;
 	return 0;
diff --git a/prov/sockets/src/sock_comm.c b/prov/sockets/src/sock_comm.c
index b930e8e..f962984 100644
--- a/prov/sockets/src/sock_comm.c
+++ b/prov/sockets/src/sock_comm.c
@@ -49,11 +49,15 @@ static ssize_t sock_comm_send_socket(struct sock_conn *conn,
 {
 	ssize_t ret;
 
-	ret = ofi_write_socket(conn->sock_fd, buf, len);
+	ret = ofi_send_socket(conn->sock_fd, buf, len, MSG_NOSIGNAL);
 	if (ret < 0) {
 		if (errno == EAGAIN || errno == EWOULDBLOCK)
 			ret = 0;
-		else
+		else if (errno == EPIPE) {
+			conn->connected = 0;
+			SOCK_LOG_DBG("Disconnected: %s:%d\n", inet_ntoa(conn->addr.sin_addr),
+                               ntohs(conn->addr.sin_port));
+		} else
 			SOCK_LOG_DBG("write error: %s\n", strerror(errno));
 	}
 	if (ret > 0)
@@ -66,7 +70,7 @@ ssize_t sock_comm_flush(struct sock_pe_entry *pe_entry)
 	ssize_t ret1, ret2 = 0;
 	size_t endlen, len, xfer_len;
 
-	len = rbused(&pe_entry->comm_buf);
+	len = ofi_rbused(&pe_entry->comm_buf);
 	endlen = pe_entry->comm_buf.size -
 		(pe_entry->comm_buf.rcnt & pe_entry->comm_buf.size_mask);
 
@@ -96,7 +100,7 @@ ssize_t sock_comm_send(struct sock_pe_entry *pe_entry,
 	ssize_t ret, used;
 
 	if (len > pe_entry->cache_sz) {
-		used = rbused(&pe_entry->comm_buf);
+		used = ofi_rbused(&pe_entry->comm_buf);
 		if (used == sock_comm_flush(pe_entry)) {
 			return sock_comm_send_socket(pe_entry->conn, buf, len);
 		} else {
@@ -104,22 +108,22 @@ ssize_t sock_comm_send(struct sock_pe_entry *pe_entry,
 		}
 	}
 
-	if (rbavail(&pe_entry->comm_buf) < len) {
+	if (ofi_rbavail(&pe_entry->comm_buf) < len) {
 		ret = sock_comm_flush(pe_entry);
 		if (ret <= 0)
 			return 0;
 	}
 
-	ret = MIN(rbavail(&pe_entry->comm_buf), len);
-	rbwrite(&pe_entry->comm_buf, buf, ret);
-	rbcommit(&pe_entry->comm_buf);
+	ret = MIN(ofi_rbavail(&pe_entry->comm_buf), len);
+	ofi_rbwrite(&pe_entry->comm_buf, buf, ret);
+	ofi_rbcommit(&pe_entry->comm_buf);
 	SOCK_LOG_DBG("buffered %lu\n", ret);
 	return ret;
 }
 
 int sock_comm_tx_done(struct sock_pe_entry *pe_entry)
 {
-	return rbempty(&pe_entry->comm_buf);
+	return ofi_rbempty(&pe_entry->comm_buf);
 }
 
 static ssize_t sock_comm_recv_socket(struct sock_conn *conn,
@@ -149,10 +153,10 @@ static void sock_comm_recv_buffer(struct sock_pe_entry *pe_entry)
 	int ret;
 	size_t max_read, avail;
 
-	avail = rbavail(&pe_entry->comm_buf);
+	avail = ofi_rbavail(&pe_entry->comm_buf);
 	assert(avail == pe_entry->comm_buf.size);
-	pe_entry->comm_buf.rcnt = 
-		pe_entry->comm_buf.wcnt = 
+	pe_entry->comm_buf.rcnt =
+		pe_entry->comm_buf.wcnt =
 		pe_entry->comm_buf.wpos = 0;
 
 	max_read = pe_entry->rem ? pe_entry->rem :
@@ -160,13 +164,13 @@ static void sock_comm_recv_buffer(struct sock_pe_entry *pe_entry)
 	ret = sock_comm_recv_socket(pe_entry->conn, (char *) pe_entry->comm_buf.buf,
 				    MIN(max_read, avail));
 	pe_entry->comm_buf.wpos += ret;
-	rbcommit(&pe_entry->comm_buf);
+	ofi_rbcommit(&pe_entry->comm_buf);
 }
 
 ssize_t sock_comm_recv(struct sock_pe_entry *pe_entry, void *buf, size_t len)
 {
 	ssize_t read_len;
-	if (rbempty(&pe_entry->comm_buf)) {
+	if (ofi_rbempty(&pe_entry->comm_buf)) {
 		if (len <= pe_entry->cache_sz) {
 			sock_comm_recv_buffer(pe_entry);
 		} else {
@@ -174,8 +178,8 @@ ssize_t sock_comm_recv(struct sock_pe_entry *pe_entry, void *buf, size_t len)
 		}
 	}
 
-	read_len = MIN(len, rbused(&pe_entry->comm_buf));
-	rbread(&pe_entry->comm_buf, buf, read_len);
+	read_len = MIN(len, ofi_rbused(&pe_entry->comm_buf));
+	ofi_rbread(&pe_entry->comm_buf, buf, read_len);
 	SOCK_LOG_DBG("read from buffer: %lu\n", read_len);
 	return read_len;
 }
@@ -216,5 +220,10 @@ ssize_t sock_comm_discard(struct sock_pe_entry *pe_entry, size_t len)
 
 int sock_comm_is_disconnected(struct sock_pe_entry *pe_entry)
 {
-	return (rbempty(&pe_entry->comm_buf) && !pe_entry->conn->connected);
+	/* If the PE entry is TX, there is no need to check that the ring buffer is
+	 * empty */
+	if (pe_entry->type == SOCK_PE_TX)
+		return (!pe_entry->conn->connected);
+	else
+		return (ofi_rbempty(&pe_entry->comm_buf) && !pe_entry->conn->connected);
 }
diff --git a/prov/sockets/src/sock_conn.c b/prov/sockets/src/sock_conn.c
index 9ed67d2..079f36d 100644
--- a/prov/sockets/src/sock_conn.c
+++ b/prov/sockets/src/sock_conn.c
@@ -62,9 +62,8 @@ ssize_t sock_conn_send_src_addr(struct sock_ep_attr *ep_attr, struct sock_tx_ctx
 {
 	int ret;
 	uint64_t total_len;
-	struct sock_op tx_op;
+	struct sock_op tx_op = { 0 };
 
-	memset(&tx_op, 0, sizeof(struct sock_op));
 	tx_op.op = SOCK_OP_CONN_MSG;
 	SOCK_LOG_DBG("New conn msg on TX: %p using conn: %p\n", tx_ctx, conn);
 
@@ -73,7 +72,7 @@ ssize_t sock_conn_send_src_addr(struct sock_ep_attr *ep_attr, struct sock_tx_ctx
 	total_len = tx_op.src_iov_len + sizeof(struct sock_op_send);
 
 	sock_tx_ctx_start(tx_ctx);
-	if (rbavail(&tx_ctx->rb) < total_len) {
+	if (ofi_rbavail(&tx_ctx->rb) < total_len) {
 		ret = -FI_EAGAIN;
 		goto err;
 	}
@@ -182,6 +181,7 @@ static struct sock_conn *sock_conn_map_insert(struct sock_ep_attr *ep_attr,
 		map->used++;
 	}
 
+	map->table[index].av_index = FI_ADDR_NOTAVAIL;
 	map->table[index].connected = 1;
 	map->table[index].addr = *addr;
 	map->table[index].sock_fd = conn_fd;
@@ -189,8 +189,8 @@ static struct sock_conn *sock_conn_map_insert(struct sock_ep_attr *ep_attr,
 	sock_set_sockopts(conn_fd);
 
 
-	if (idm_set(&ep_attr->conn_idm, conn_fd, &map->table[index]) < 0)
-		SOCK_LOG_ERROR("idm_set failed\n");
+	if (ofi_idm_set(&ep_attr->conn_idm, conn_fd, &map->table[index]) < 0)
+		SOCK_LOG_ERROR("ofi_idm_set failed\n");
 
 	if (sock_epoll_add(&map->epoll_set, conn_fd))
 		SOCK_LOG_ERROR("failed to add to epoll set: %d\n", conn_fd);
@@ -299,15 +299,15 @@ err:
 int sock_conn_listen(struct sock_ep_attr *ep_attr)
 {
 	struct addrinfo *s_res = NULL, *p;
-	struct addrinfo hints;
+	struct addrinfo hints = { 0 };
 	int listen_fd = 0, ret;
 	socklen_t addr_size;
 	struct sockaddr_in addr;
 	struct sock_conn_listener *listener = &ep_attr->listener;
 	char service[NI_MAXSERV] = {0};
 	char *port;
+	char ipaddr[24];
 
-	memset(&hints, 0, sizeof(hints));
 	hints.ai_family = AF_INET;
 	hints.ai_socktype = SOCK_STREAM;
 	hints.ai_flags = AI_PASSIVE;
@@ -327,7 +327,8 @@ int sock_conn_listen(struct sock_ep_attr *ep_attr)
 	} else
 		port = listener->service;
 
-	ret = getaddrinfo(inet_ntoa(addr.sin_addr), port, &hints, &s_res);
+	inet_ntop(addr.sin_family, &addr.sin_addr, ipaddr, sizeof(ipaddr));
+	ret = getaddrinfo(ipaddr, port, &hints, &s_res);
 	if (ret) {
 		SOCK_LOG_ERROR("no available AF_INET address, service %s, %s\n",
 			       listener->service, gai_strerror(ret));
@@ -336,7 +337,7 @@ int sock_conn_listen(struct sock_ep_attr *ep_attr)
 
 	SOCK_LOG_DBG("Binding listener thread to port: %s\n", listener->service);
 	for (p = s_res; p; p = p->ai_next) {
-		listen_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol);
+		listen_fd = ofi_socket(p->ai_family, p->ai_socktype, p->ai_protocol);
 		if (listen_fd >= 0) {
 			sock_set_sockopts(listen_fd);
 
@@ -411,6 +412,9 @@ struct sock_conn *sock_ep_connect(struct sock_ep_attr *ep_attr, fi_addr_t index)
 	struct pollfd poll_fd;
 
 	if (ep_attr->ep_type == FI_EP_MSG) {
+		/* Need to check that destination address has been
+		   passed to endpoint */
+		assert(ep_attr->dest_addr);
 		addr = *ep_attr->dest_addr;
 		addr.sin_port = htons(ep_attr->msg_dest_port);
 	} else {
@@ -425,7 +429,7 @@ do_connect:
 	if (conn != SOCK_CM_CONN_IN_PROGRESS)
 		return conn;
 
-	conn_fd = socket(AF_INET, SOCK_STREAM, 0);
+	conn_fd = ofi_socket(AF_INET, SOCK_STREAM, 0);
 	if (conn_fd == -1) {
 		SOCK_LOG_ERROR("failed to create conn_fd, errno: %d\n", errno);
 		errno = FI_EOTHER;
@@ -437,7 +441,7 @@ do_connect:
 		SOCK_LOG_ERROR("failed to set conn_fd nonblocking, errno: %d\n", errno);
 		errno = FI_EOTHER;
 		ofi_close_socket(conn_fd);
-                return NULL;
+		return NULL;
 	}
 
 	SOCK_LOG_DBG("Connecting to: %s:%d\n", inet_ntoa(addr.sin_addr),
@@ -511,10 +515,10 @@ out:
 		goto err;
 	}
 	new_conn->av_index = (ep_attr->ep_type == FI_EP_MSG) ? FI_ADDR_NOTAVAIL : index;
-	conn = idm_lookup(&ep_attr->av_idm, index);
+	conn = ofi_idm_lookup(&ep_attr->av_idm, index);
 	if (conn == SOCK_CM_CONN_IN_PROGRESS) {
-		if (idm_set(&ep_attr->av_idm, index, new_conn) < 0)
-			SOCK_LOG_ERROR("idm_set failed\n");
+		if (ofi_idm_set(&ep_attr->av_idm, index, new_conn) < 0)
+			SOCK_LOG_ERROR("ofi_idm_set failed\n");
 		conn = new_conn;
 	}
 	fastlock_release(&ep_attr->cmap.lock);
diff --git a/prov/sockets/src/sock_cq.c b/prov/sockets/src/sock_cq.c
index 3c3f33c..209e1b2 100644
--- a/prov/sockets/src/sock_cq.c
+++ b/prov/sockets/src/sock_cq.c
@@ -62,15 +62,17 @@ void sock_cq_add_tx_ctx(struct sock_cq *cq, struct sock_tx_ctx *tx_ctx)
 			goto out;
 	}
 	dlist_insert_tail(&tx_ctx->cq_entry, &cq->tx_list);
+	ofi_atomic_inc32(&cq->ref);
 out:
 	fastlock_release(&cq->list_lock);
 }
 
 void sock_cq_remove_tx_ctx(struct sock_cq *cq, struct sock_tx_ctx *tx_ctx)
 {
-		fastlock_acquire(&cq->list_lock);
-		dlist_remove(&tx_ctx->cq_entry);
-		fastlock_release(&cq->list_lock);
+	fastlock_acquire(&cq->list_lock);
+	dlist_remove(&tx_ctx->cq_entry);
+	ofi_atomic_dec32(&cq->ref);
+	fastlock_release(&cq->list_lock);
 }
 
 void sock_cq_add_rx_ctx(struct sock_cq *cq, struct sock_rx_ctx *rx_ctx)
@@ -86,15 +88,17 @@ void sock_cq_add_rx_ctx(struct sock_cq *cq, struct sock_rx_ctx *rx_ctx)
 			goto out;
 	}
 	dlist_insert_tail(&rx_ctx->cq_entry, &cq->rx_list);
+	ofi_atomic_inc32(&cq->ref);
 out:
 	fastlock_release(&cq->list_lock);
 }
 
 void sock_cq_remove_rx_ctx(struct sock_cq *cq, struct sock_rx_ctx *rx_ctx)
 {
-		fastlock_acquire(&cq->list_lock);
-		dlist_remove(&rx_ctx->cq_entry);
-		fastlock_release(&cq->list_lock);
+	fastlock_acquire(&cq->list_lock);
+	dlist_remove(&rx_ctx->cq_entry);
+	ofi_atomic_dec32(&cq->ref);
+	fastlock_release(&cq->list_lock);
 }
 
 int sock_cq_progress(struct sock_cq *cq)
@@ -110,15 +114,21 @@ int sock_cq_progress(struct sock_cq *cq)
 	for (entry = cq->tx_list.next; entry != &cq->tx_list;
 	     entry = entry->next) {
 		tx_ctx = container_of(entry, struct sock_tx_ctx, cq_entry);
+		if (!tx_ctx->enabled)
+			continue;
+
 		if (tx_ctx->use_shared)
 			sock_pe_progress_tx_ctx(cq->domain->pe, tx_ctx->stx_ctx);
 		else
-			sock_pe_progress_tx_ctx(cq->domain->pe, tx_ctx);		      
+			sock_pe_progress_tx_ctx(cq->domain->pe, tx_ctx);
 	}
 
 	for (entry = cq->rx_list.next; entry != &cq->rx_list;
 	     entry = entry->next) {
 		rx_ctx = container_of(entry, struct sock_rx_ctx, cq_entry);
+		if (!rx_ctx->enabled)
+			continue;
+
 		if (rx_ctx->use_shared)
 			sock_pe_progress_rx_ctx(cq->domain->pe, rx_ctx->srx_ctx);
 		else
@@ -166,7 +176,7 @@ static ssize_t _sock_cq_write(struct sock_cq *cq, fi_addr_t addr,
 	struct sock_cq_overflow_entry_t *overflow_entry;
 
 	fastlock_acquire(&cq->lock);
-	if (rbfdavail(&cq->cq_rbfd) < len) {
+	if (ofi_rbfdavail(&cq->cq_rbfd) < len) {
 		SOCK_LOG_ERROR("Not enough space in CQ\n");
 		overflow_entry = calloc(1, sizeof(*overflow_entry) + len);
 		if (!overflow_entry) {
@@ -183,14 +193,14 @@ static ssize_t _sock_cq_write(struct sock_cq *cq, fi_addr_t addr,
 	}
 
 
-	rbwrite(&cq->addr_rb, &addr, sizeof(addr));
-	rbcommit(&cq->addr_rb);
+	ofi_rbwrite(&cq->addr_rb, &addr, sizeof(addr));
+	ofi_rbcommit(&cq->addr_rb);
 
-	rbfdwrite(&cq->cq_rbfd, buf, len);
+	ofi_rbfdwrite(&cq->cq_rbfd, buf, len);
 	if (cq->domain->progress_mode == FI_PROGRESS_MANUAL)
-		rbcommit(&cq->cq_rbfd.rb);
+		ofi_rbcommit(&cq->cq_rbfd.rb);
 	else
-		rbfdcommit(&cq->cq_rbfd);
+		ofi_rbfdcommit(&cq->cq_rbfd);
 
 	ret = len;
 
@@ -281,21 +291,21 @@ static void sock_cq_set_report_fn(struct sock_cq *sock_cq)
 
 static inline void sock_cq_copy_overflow_list(struct sock_cq *cq, size_t count)
 {
-	ssize_t i;
+	size_t i;
 	struct sock_cq_overflow_entry_t *overflow_entry;
 
 	for (i = 0; i < count && !dlist_empty(&cq->overflow_list); i++) {
 		overflow_entry = container_of(cq->overflow_list.next,
 					      struct sock_cq_overflow_entry_t,
 					      entry);
-		rbwrite(&cq->addr_rb, &overflow_entry->addr, sizeof(fi_addr_t));
-		rbcommit(&cq->addr_rb);
+		ofi_rbwrite(&cq->addr_rb, &overflow_entry->addr, sizeof(fi_addr_t));
+		ofi_rbcommit(&cq->addr_rb);
 
-		rbfdwrite(&cq->cq_rbfd, &overflow_entry->cq_entry[0], overflow_entry->len);
+		ofi_rbfdwrite(&cq->cq_rbfd, &overflow_entry->cq_entry[0], overflow_entry->len);
 		if (cq->domain->progress_mode == FI_PROGRESS_MANUAL)
-			rbcommit(&cq->cq_rbfd.rb);
+			ofi_rbcommit(&cq->cq_rbfd.rb);
 		else
-			rbfdcommit(&cq->cq_rbfd);
+			ofi_rbfdcommit(&cq->cq_rbfd);
 
 		dlist_remove(&overflow_entry->entry);
 		free(overflow_entry);
@@ -306,12 +316,12 @@ static inline ssize_t sock_cq_rbuf_read(struct sock_cq *cq, void *buf,
 					size_t count, fi_addr_t *src_addr,
 					size_t cq_entry_len)
 {
-	ssize_t i;
+	size_t i;
 	fi_addr_t addr;
 
-	rbfdread(&cq->cq_rbfd, buf, cq_entry_len * count);
+	ofi_rbfdread(&cq->cq_rbfd, buf, cq_entry_len * count);
 	for (i = 0; i < count; i++) {
-		rbread(&cq->addr_rb, &addr, sizeof(addr));
+		ofi_rbread(&cq->addr_rb, &addr, sizeof(addr));
 		if (src_addr)
 			src_addr[i] = addr;
 	}
@@ -329,7 +339,7 @@ static ssize_t sock_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 	ssize_t cq_entry_len, avail;
 
 	sock_cq = container_of(cq, struct sock_cq, cq_fid);
-	if (rbused(&sock_cq->cqerr_rb))
+	if (ofi_rbused(&sock_cq->cqerr_rb))
 		return -FI_EAVAIL;
 
 	cq_entry_len = sock_cq->cq_entry_size;
@@ -338,19 +348,19 @@ static ssize_t sock_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 	else
 		threshold = count;
 
-	if (sock_cq->domain->progress_mode == FI_PROGRESS_MANUAL) {
-		if (timeout >= 0) {
-			start_ms = fi_gettime_ms();
-			end_ms = start_ms + timeout;
-		}
+	if (timeout >= 0) {
+		start_ms = fi_gettime_ms();
+		end_ms = start_ms + timeout;
+	}
 
+	if (sock_cq->domain->progress_mode == FI_PROGRESS_MANUAL) {
 		do {
 			sock_cq_progress(sock_cq);
 			fastlock_acquire(&sock_cq->lock);
-			avail = rbfdused(&sock_cq->cq_rbfd);
+			avail = ofi_rbfdused(&sock_cq->cq_rbfd);
 			if (avail)
 				ret = sock_cq_rbuf_read(sock_cq, buf,
-					MIN(threshold, avail / cq_entry_len),
+					MIN(threshold, (size_t)(avail / cq_entry_len)),
 					src_addr, cq_entry_len);
 			fastlock_release(&sock_cq->lock);
 			if (ret == 0 && timeout >= 0) {
@@ -359,17 +369,28 @@ static ssize_t sock_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 			}
 		} while (ret == 0);
 	} else {
-		ret = rbfdwait(&sock_cq->cq_rbfd, timeout);
-		if (ret > 0) {
+		do {
+			ret = ofi_rbfdwait(&sock_cq->cq_rbfd, timeout);
+			if (ret <= 0)
+				break;
+
 			fastlock_acquire(&sock_cq->lock);
 			ret = 0;
-			avail = rbfdused(&sock_cq->cq_rbfd);
+			avail = ofi_rbfdused(&sock_cq->cq_rbfd);
 			if (avail)
 				ret = sock_cq_rbuf_read(sock_cq, buf,
-					MIN(threshold, avail / cq_entry_len),
+					MIN(threshold, (size_t)(avail / cq_entry_len)),
 					src_addr, cq_entry_len);
+			else /* No CQ entry available, read the fd */
+				ofi_rbfdreset(&sock_cq->cq_rbfd);
 			fastlock_release(&sock_cq->lock);
-		}
+
+			if ((ret == -FI_EAGAIN || ret == 0) && timeout >= 0) {
+				timeout = end_ms - fi_gettime_ms();
+				if (timeout <= 0)
+					break;
+			}
+		} while (ret == 0 || ret == -FI_EAGAIN);
 	}
 	return (ret == 0 || ret == -FI_ETIMEDOUT) ? -FI_EAGAIN : ret;
 }
@@ -396,14 +417,34 @@ static ssize_t sock_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf,
 {
 	struct sock_cq *sock_cq;
 	ssize_t ret;
+	struct fi_cq_err_entry entry;
+	uint32_t api_version;
+	size_t err_data_size = 0;
+	void *err_data = NULL;
 
 	sock_cq = container_of(cq, struct sock_cq, cq_fid);
 	if (sock_cq->domain->progress_mode == FI_PROGRESS_MANUAL)
 		sock_cq_progress(sock_cq);
 
 	fastlock_acquire(&sock_cq->lock);
-	if (rbused(&sock_cq->cqerr_rb) >= sizeof(struct fi_cq_err_entry)) {
-		rbread(&sock_cq->cqerr_rb, buf, sizeof(*buf));
+	if (ofi_rbused(&sock_cq->cqerr_rb) >= sizeof(struct fi_cq_err_entry)) {
+		api_version = sock_cq->domain->fab->fab_fid.api_version;
+		ofi_rbread(&sock_cq->cqerr_rb, &entry, sizeof(entry));
+
+		if ((FI_VERSION_GE(api_version, FI_VERSION(1, 5)))
+			&& buf->err_data && buf->err_data_size) {
+			err_data = buf->err_data;
+			err_data_size = buf->err_data_size;
+			*buf = entry;
+			buf->err_data = err_data;
+
+			/* Fill provided user's buffer */
+			buf->err_data_size = MIN(entry.err_data_size, err_data_size);
+			memcpy(buf->err_data, entry.err_data, buf->err_data_size);
+		} else {
+			memcpy(buf, &entry, sizeof(struct fi_cq_err_entry_1_0));
+		}
+
 		ret = 1;
 	} else {
 		ret = -FI_EAGAIN;
@@ -425,19 +466,19 @@ static int sock_cq_close(struct fid *fid)
 	struct sock_cq *cq;
 
 	cq = container_of(fid, struct sock_cq, cq_fid.fid);
-	if (atomic_get(&cq->ref))
+	if (ofi_atomic_get32(&cq->ref))
 		return -FI_EBUSY;
 
 	if (cq->signal && cq->attr.wait_obj == FI_WAIT_MUTEX_COND)
 		sock_wait_close(&cq->waitset->fid);
 
-	rbfree(&cq->addr_rb);
-	rbfree(&cq->cqerr_rb);
-	rbfdfree(&cq->cq_rbfd);
+	ofi_rbfree(&cq->addr_rb);
+	ofi_rbfree(&cq->cqerr_rb);
+	ofi_rbfdfree(&cq->cq_rbfd);
 
 	fastlock_destroy(&cq->lock);
 	fastlock_destroy(&cq->list_lock);
-	atomic_dec(&cq->domain->ref);
+	ofi_atomic_dec32(&cq->domain->ref);
 
 	free(cq);
 	return 0;
@@ -447,7 +488,10 @@ static int sock_cq_signal(struct fid_cq *cq)
 {
 	struct sock_cq *sock_cq;
 	sock_cq = container_of(cq, struct sock_cq, cq_fid);
-	rbfdsignal(&sock_cq->cq_rbfd);
+
+	fastlock_acquire(&sock_cq->lock);
+	ofi_rbfdsignal(&sock_cq->cq_rbfd);
+	fastlock_release(&sock_cq->lock);
 	return 0;
 }
 
@@ -477,7 +521,7 @@ static int sock_cq_control(struct fid *fid, int command, void *arg)
 		case FI_WAIT_NONE:
 		case FI_WAIT_FD:
 		case FI_WAIT_UNSPEC:
-			memcpy(arg, &cq->cq_rbfd.fd[RB_READ_FD], sizeof(int));
+			memcpy(arg, &cq->cq_rbfd.fd[OFI_RB_READ_FD], sizeof(int));
 			break;
 
 		case FI_WAIT_SET:
@@ -570,15 +614,15 @@ int sock_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	if (!sock_cq)
 		return -FI_ENOMEM;
 
-	atomic_initialize(&sock_cq->ref, 0);
+	ofi_atomic_initialize32(&sock_cq->ref, 0);
 	sock_cq->cq_fid.fid.fclass = FI_CLASS_CQ;
 	sock_cq->cq_fid.fid.context = context;
 	sock_cq->cq_fid.fid.ops = &sock_cq_fi_ops;
 	sock_cq->cq_fid.ops = &sock_cq_ops;
 
-	if (attr == NULL)
+	if (attr == NULL) {
 		sock_cq->attr = _sock_cq_def_attr;
-	else {
+	} else {
 		sock_cq->attr = *attr;
 		if (attr->size == 0)
 			sock_cq->attr.size = _sock_cq_def_attr.size;
@@ -593,17 +637,17 @@ int sock_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	dlist_init(&sock_cq->ep_list);
 	dlist_init(&sock_cq->overflow_list);
 
-	ret = rbfdinit(&sock_cq->cq_rbfd, sock_cq->attr.size *
+	ret = ofi_rbfdinit(&sock_cq->cq_rbfd, sock_cq->attr.size *
 			sock_cq->cq_entry_size);
 	if (ret)
 		goto err1;
 
-	ret = rbinit(&sock_cq->addr_rb,
+	ret = ofi_rbinit(&sock_cq->addr_rb,
 			sock_cq->attr.size * sizeof(fi_addr_t));
 	if (ret)
 		goto err2;
 
-	ret = rbinit(&sock_cq->cqerr_rb, sock_cq->attr.size *
+	ret = ofi_rbinit(&sock_cq->cqerr_rb, sock_cq->attr.size *
 			sizeof(struct fi_cq_err_entry));
 	if (ret)
 		goto err3;
@@ -652,30 +696,31 @@ int sock_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	}
 
 	*cq = &sock_cq->cq_fid;
-	atomic_inc(&sock_dom->ref);
+	ofi_atomic_inc32(&sock_dom->ref);
 	fastlock_init(&sock_cq->list_lock);
 
 	return 0;
 
 err4:
-	rbfree(&sock_cq->cqerr_rb);
+	ofi_rbfree(&sock_cq->cqerr_rb);
 err3:
-	rbfree(&sock_cq->addr_rb);
+	ofi_rbfree(&sock_cq->addr_rb);
 err2:
-	rbfdfree(&sock_cq->cq_rbfd);
+	ofi_rbfdfree(&sock_cq->cq_rbfd);
 err1:
 	free(sock_cq);
 	return ret;
 }
 
 int sock_cq_report_error(struct sock_cq *cq, struct sock_pe_entry *entry,
-			 size_t olen, int err, int prov_errno, void *err_data)
+			 size_t olen, int err, int prov_errno, void *err_data,
+			 size_t err_data_size)
 {
 	int ret;
 	struct fi_cq_err_entry err_entry;
 
 	fastlock_acquire(&cq->lock);
-	if (rbavail(&cq->cqerr_rb) < sizeof(err_entry)) {
+	if (ofi_rbavail(&cq->cqerr_rb) < sizeof(err_entry)) {
 		ret = -FI_ENOSPC;
 		goto out;
 	}
@@ -683,6 +728,7 @@ int sock_cq_report_error(struct sock_cq *cq, struct sock_pe_entry *entry,
 	err_entry.err = err;
 	err_entry.olen = olen;
 	err_entry.err_data = err_data;
+	err_entry.err_data_size = err_data_size;
 	err_entry.len = entry->data_len;
 	err_entry.prov_errno = prov_errno;
 	err_entry.flags = entry->flags;
@@ -695,10 +741,12 @@ int sock_cq_report_error(struct sock_cq *cq, struct sock_pe_entry *entry,
 	else
 		err_entry.buf = (void *) (uintptr_t) entry->pe.tx.tx_iov[0].src.iov.addr;
 
-	rbwrite(&cq->cqerr_rb, &err_entry, sizeof(err_entry));
-	rbcommit(&cq->cqerr_rb);
+	ofi_rbwrite(&cq->cqerr_rb, &err_entry, sizeof(err_entry));
+	ofi_rbcommit(&cq->cqerr_rb);
 	ret = 0;
 
+	ofi_rbfdsignal(&cq->cq_rbfd);
+
 out:
 	fastlock_release(&cq->lock);
 	return ret;
diff --git a/prov/sockets/src/sock_ctx.c b/prov/sockets/src/sock_ctx.c
index ebd7ca1..6d051bd 100644
--- a/prov/sockets/src/sock_ctx.c
+++ b/prov/sockets/src/sock_ctx.c
@@ -85,7 +85,7 @@ static struct sock_tx_ctx *sock_tx_context_alloc(const struct fi_tx_attr *attr,
 	if (!tx_ctx)
 		return NULL;
 
-	if (!use_shared && rbinit(&tx_ctx->rb,
+	if (!use_shared && ofi_rbinit(&tx_ctx->rb,
 				 (attr->size) ? attr->size * SOCK_EP_TX_ENTRY_SZ :
 				 SOCK_EP_TX_SZ * SOCK_EP_TX_ENTRY_SZ))
 		goto err;
@@ -96,8 +96,7 @@ static struct sock_tx_ctx *sock_tx_context_alloc(const struct fi_tx_attr *attr,
 	dlist_init(&tx_ctx->pe_entry_list);
 	dlist_init(&tx_ctx->ep_list);
 
-	fastlock_init(&tx_ctx->rlock);
-	fastlock_init(&tx_ctx->wlock);
+	fastlock_init(&tx_ctx->rb_lock);
 	fastlock_init(&tx_ctx->lock);
 
 	switch (fclass) {
@@ -146,12 +145,11 @@ struct sock_tx_ctx *sock_stx_ctx_alloc(const struct fi_tx_attr *attr,
 
 void sock_tx_ctx_free(struct sock_tx_ctx *tx_ctx)
 {
-	fastlock_destroy(&tx_ctx->rlock);
-	fastlock_destroy(&tx_ctx->wlock);
+	fastlock_destroy(&tx_ctx->rb_lock);
 	fastlock_destroy(&tx_ctx->lock);
 
 	if (!tx_ctx->use_shared) {
-		rbfree(&tx_ctx->rb);
+		ofi_rbfree(&tx_ctx->rb);
 		sock_rx_ctx_free(tx_ctx->rx_ctrl_ctx);
 	}
 	free(tx_ctx);
@@ -159,25 +157,25 @@ void sock_tx_ctx_free(struct sock_tx_ctx *tx_ctx)
 
 void sock_tx_ctx_start(struct sock_tx_ctx *tx_ctx)
 {
-	fastlock_acquire(&tx_ctx->wlock);
+	fastlock_acquire(&tx_ctx->rb_lock);
 }
 
 void sock_tx_ctx_write(struct sock_tx_ctx *tx_ctx, const void *buf, size_t len)
 {
-	rbwrite(&tx_ctx->rb, buf, len);
+	ofi_rbwrite(&tx_ctx->rb, buf, len);
 }
 
 void sock_tx_ctx_commit(struct sock_tx_ctx *tx_ctx)
 {
-	rbcommit(&tx_ctx->rb);
+	ofi_rbcommit(&tx_ctx->rb);
 	sock_pe_signal(tx_ctx->domain->pe);
-	fastlock_release(&tx_ctx->wlock);
+	fastlock_release(&tx_ctx->rb_lock);
 }
 
 void sock_tx_ctx_abort(struct sock_tx_ctx *tx_ctx)
 {
-	rbabort(&tx_ctx->rb);
-	fastlock_release(&tx_ctx->wlock);
+	ofi_rbabort(&tx_ctx->rb);
+	fastlock_release(&tx_ctx->rb_lock);
 }
 
 void sock_tx_ctx_write_op_send(struct sock_tx_ctx *tx_ctx,
@@ -209,11 +207,11 @@ void sock_tx_ctx_read_op_send(struct sock_tx_ctx *tx_ctx,
 		uint64_t *dest_addr, uint64_t *buf, struct sock_ep_attr **ep_attr,
 		struct sock_conn **conn)
 {
-	rbread(&tx_ctx->rb, op, sizeof(*op));
-	rbread(&tx_ctx->rb, flags, sizeof(*flags));
-	rbread(&tx_ctx->rb, context, sizeof(*context));
-	rbread(&tx_ctx->rb, dest_addr, sizeof(*dest_addr));
-	rbread(&tx_ctx->rb, buf, sizeof(*buf));
-	rbread(&tx_ctx->rb, ep_attr, sizeof(*ep_attr));
-	rbread(&tx_ctx->rb, conn, sizeof(*conn));
+	ofi_rbread(&tx_ctx->rb, op, sizeof(*op));
+	ofi_rbread(&tx_ctx->rb, flags, sizeof(*flags));
+	ofi_rbread(&tx_ctx->rb, context, sizeof(*context));
+	ofi_rbread(&tx_ctx->rb, dest_addr, sizeof(*dest_addr));
+	ofi_rbread(&tx_ctx->rb, buf, sizeof(*buf));
+	ofi_rbread(&tx_ctx->rb, ep_attr, sizeof(*ep_attr));
+	ofi_rbread(&tx_ctx->rb, conn, sizeof(*conn));
 }
diff --git a/prov/sockets/src/sock_dom.c b/prov/sockets/src/sock_dom.c
index adce1c4..93a2bd0 100644
--- a/prov/sockets/src/sock_dom.c
+++ b/prov/sockets/src/sock_dom.c
@@ -35,6 +35,8 @@
 #include <stdlib.h>
 #include <string.h>
 
+#include <fi_util.h>
+
 #include "sock.h"
 #include "sock_util.h"
 
@@ -47,7 +49,8 @@ const struct fi_domain_attr sock_domain_attr = {
 	.control_progress = FI_PROGRESS_AUTO,
 	.data_progress = FI_PROGRESS_AUTO,
 	.resource_mgmt = FI_RM_ENABLED,
-	.mr_mode = FI_MR_SCALABLE,
+	/* Provider supports basic memory registration mode */
+	.mr_mode = FI_MR_BASIC,
 	.mr_key_size = sizeof(uint64_t),
 	.cq_data_size = sizeof(uint64_t),
 	.cq_cnt = SOCK_EP_MAX_CQ_CNT,
@@ -58,9 +61,13 @@ const struct fi_domain_attr sock_domain_attr = {
 	.max_ep_rx_ctx = SOCK_EP_MAX_RX_CNT,
 	.max_ep_stx_ctx = SOCK_EP_MAX_EP_CNT,
 	.max_ep_srx_ctx = SOCK_EP_MAX_EP_CNT,
+	.cntr_cnt = SOCK_EP_MAX_CNTR_CNT,
+	.mr_iov_limit = SOCK_EP_MAX_IOV_LIMIT,
+	.max_err_data = SOCK_MAX_ERR_CQ_EQ_DATA_SZ,
+	.mr_cnt = SOCK_DOMAIN_MR_CNT,
 };
 
-int sock_verify_domain_attr(struct fi_domain_attr *attr)
+int sock_verify_domain_attr(uint32_t version, struct fi_domain_attr *attr)
 {
 	if (!attr)
 		return 0;
@@ -122,13 +129,10 @@ int sock_verify_domain_attr(struct fi_domain_attr *attr)
 		return -FI_ENODATA;
 	}
 
-	switch (attr->mr_mode) {
-	case FI_MR_UNSPEC:
-	case FI_MR_BASIC:
-	case FI_MR_SCALABLE:
-		break;
-	default:
-		SOCK_LOG_DBG("MR mode not supported\n");
+	if (ofi_check_mr_mode(version, sock_domain_attr.mr_mode,
+			      attr->mr_mode)) {
+		FI_INFO(&sock_prov, FI_LOG_CORE,
+			"Invalid memory registration mode\n");
 		return -FI_ENODATA;
 	}
 
@@ -150,6 +154,18 @@ int sock_verify_domain_attr(struct fi_domain_attr *attr)
 	if (attr->max_ep_rx_ctx > sock_domain_attr.max_ep_rx_ctx)
 		return -FI_ENODATA;
 
+	if (attr->cntr_cnt > sock_domain_attr.cntr_cnt)
+		return -FI_ENODATA;
+
+	if (attr->mr_iov_limit > sock_domain_attr.mr_iov_limit)
+		return -FI_ENODATA;
+
+	if (attr->max_err_data > sock_domain_attr.max_err_data)
+		return -FI_ENODATA;
+
+	if (attr->mr_cnt > sock_domain_attr.mr_cnt)
+		return -FI_ENODATA;
+
 	return 0;
 }
 
@@ -157,12 +173,12 @@ static int sock_dom_close(struct fid *fid)
 {
 	struct sock_domain *dom;
 	dom = container_of(fid, struct sock_domain, dom_fid.fid);
-	if (atomic_get(&dom->ref))
+	if (ofi_atomic_get32(&dom->ref))
 		return -FI_EBUSY;
 
 	sock_pe_finalize(dom->pe);
 	fastlock_destroy(&dom->lock);
-	ofi_mr_close(dom->mr_heap);
+	ofi_mr_map_close(&dom->mr_map);
 	sock_dom_remove_from_list(dom);
 	free(dom);
 	return 0;
@@ -172,20 +188,18 @@ static int sock_mr_close(struct fid *fid)
 {
 	struct sock_domain *dom;
 	struct sock_mr *mr;
-	uint64_t mr_key;
 	int err = 0;
 
 	mr = container_of(fid, struct sock_mr, mr_fid.fid);
 	dom = mr->domain;
-	mr_key = mr->key;
 
 	fastlock_acquire(&dom->lock);
-	err = ofi_mr_erase(dom->mr_heap, mr_key);
+	err = ofi_mr_remove(&dom->mr_map, mr->key);
 	if (err != 0)
 		SOCK_LOG_ERROR("MR Erase error %d \n", err);
 
 	fastlock_release(&dom->lock);
-	atomic_dec(&dom->ref);
+	ofi_atomic_dec32(&dom->ref);
 	free(mr);
 	return 0;
 }
@@ -238,9 +252,8 @@ struct sock_mr *sock_mr_verify_key(struct sock_domain *domain, uint64_t key,
 
 	fastlock_acquire(&domain->lock);
 
-	err = ofi_mr_retrieve_and_verify(domain->mr_heap, len, buf, key, access,
-                                        (void **)&mr);
-	if(err != 0) {
+	err = ofi_mr_verify(&domain->mr_map, buf, len, key, access, (void **) &mr);
+	if (err != 0) {
 		SOCK_LOG_ERROR("MR check failed\n");
 		mr = NULL;
 	}
@@ -286,17 +299,16 @@ static int sock_regattr(struct fid *fid, const struct fi_mr_attr *attr,
 	_mr->domain = dom;
 	_mr->flags = flags;
 
-	ret = ofi_mr_insert(dom->mr_heap, attr, &key, _mr);
+	ret = ofi_mr_insert(&dom->mr_map, attr, &key, _mr);
 	if (ret != 0)
 		goto err;
 
-
 	_mr->mr_fid.key = _mr->key = key;
 	_mr->mr_fid.mem_desc = (void *) (uintptr_t) key;
 	fastlock_release(&dom->lock);
 
 	*mr = &_mr->mr_fid;
-	atomic_inc(&dom->ref);
+	ofi_atomic_inc32(&dom->ref);
 
 	if (dom->mr_eq) {
 		eq_entry.fid = &domain->fid;
@@ -359,6 +371,19 @@ static int sock_dom_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 	return 0;
 }
 
+static int sock_dom_ctrl(struct fid *fid, int command, void *arg)
+{
+	struct sock_domain *dom;
+
+	dom = container_of(fid, struct sock_domain, dom_fid.fid);
+	switch (command) {
+	case FI_QUEUE_WORK:
+		return sock_queue_work(dom, arg);
+	default:
+		return -FI_ENOSYS;
+	}
+}
+
 static int sock_endpoint(struct fid_domain *domain, struct fi_info *info,
 			 struct fid_ep **ep, void *context)
 {
@@ -393,7 +418,7 @@ static struct fi_ops sock_dom_fi_ops = {
 	.size = sizeof(struct fi_ops),
 	.close = sock_dom_close,
 	.bind = sock_dom_bind,
-	.control = fi_no_control,
+	.control = sock_dom_ctrl,
 	.ops_open = fi_no_ops_open,
 };
 
@@ -407,6 +432,7 @@ static struct fi_ops_domain sock_dom_ops = {
 	.poll_open = sock_poll_open,
 	.stx_ctx = sock_stx_ctx,
 	.srx_ctx = sock_srx_ctx,
+	.query_atomic = sock_query_atomic,
 };
 
 static struct fi_ops_mr sock_dom_mr_ops = {
@@ -425,7 +451,7 @@ int sock_domain(struct fid_fabric *fabric, struct fi_info *info,
 
 	fab = container_of(fabric, struct sock_fabric, fab_fid);
 	if (info && info->domain_attr) {
-		ret = sock_verify_domain_attr(info->domain_attr);
+		ret = sock_verify_domain_attr(fabric->api_version, info->domain_attr);
 		if (ret)
 			return -FI_EINVAL;
 	}
@@ -435,13 +461,13 @@ int sock_domain(struct fid_fabric *fabric, struct fi_info *info,
 		return -FI_ENOMEM;
 
 	fastlock_init(&sock_domain->lock);
-	atomic_initialize(&sock_domain->ref, 0);
+	ofi_atomic_initialize32(&sock_domain->ref, 0);
 
 	if (info) {
 		sock_domain->info = *info;
 	} else {
 		SOCK_LOG_ERROR("invalid fi_info\n");
-		goto err;
+		goto err1;
 	}
 
 	sock_domain->dom_fid.fid.fclass = FI_CLASS_DOMAIN;
@@ -459,7 +485,7 @@ int sock_domain(struct fid_fabric *fabric, struct fi_info *info,
 	sock_domain->pe = sock_pe_init(sock_domain);
 	if (!sock_domain->pe) {
 		SOCK_LOG_ERROR("Failed to init PE\n");
-		goto err;
+		goto err1;
 	}
 
 	sock_domain->fab = fab;
@@ -470,15 +496,18 @@ int sock_domain(struct fid_fabric *fabric, struct fi_info *info,
 	else
 		sock_domain->attr = sock_domain_attr;
 
-	ret = ofi_mr_init(&sock_prov, sock_domain->attr.mr_mode, &sock_domain->mr_heap);
-	if (!ret) {
-		return ret;
-	}
+	ret = ofi_mr_map_init(&sock_prov, sock_domain->attr.mr_mode,
+			      &sock_domain->mr_map);
+	if (ret)
+		goto err2;
 
 	sock_dom_add_to_list(sock_domain);
 	return 0;
 
-err:
+err2:
+	sock_pe_finalize(sock_domain->pe);
+err1:
+	fastlock_destroy(&sock_domain->lock);
 	free(sock_domain);
 	return -FI_EINVAL;
 }
diff --git a/prov/sockets/src/sock_ep.c b/prov/sockets/src/sock_ep.c
index 6c4ab2e..57c0772 100644
--- a/prov/sockets/src/sock_ep.c
+++ b/prov/sockets/src/sock_ep.c
@@ -127,8 +127,8 @@ static int sock_ctx_close(struct fid *fid)
 	case FI_CLASS_TX_CTX:
 		tx_ctx = container_of(fid, struct sock_tx_ctx, fid.ctx.fid);
 		sock_pe_remove_tx_ctx(tx_ctx);
-		atomic_dec(&tx_ctx->ep_attr->num_tx_ctx);
-		atomic_dec(&tx_ctx->domain->ref);
+		ofi_atomic_dec32(&tx_ctx->ep_attr->num_tx_ctx);
+		ofi_atomic_dec32(&tx_ctx->domain->ref);
 		sock_tx_ctx_close(tx_ctx);
 		sock_tx_ctx_free(tx_ctx);
 		break;
@@ -136,22 +136,22 @@ static int sock_ctx_close(struct fid *fid)
 	case FI_CLASS_RX_CTX:
 		rx_ctx = container_of(fid, struct sock_rx_ctx, ctx.fid);
 		sock_pe_remove_rx_ctx(rx_ctx);
-		atomic_dec(&rx_ctx->ep_attr->num_rx_ctx);
-		atomic_dec(&rx_ctx->domain->ref);
+		ofi_atomic_dec32(&rx_ctx->ep_attr->num_rx_ctx);
+		ofi_atomic_dec32(&rx_ctx->domain->ref);
 		sock_rx_ctx_close(rx_ctx);
 		sock_rx_ctx_free(rx_ctx);
 		break;
 
 	case FI_CLASS_STX_CTX:
 		tx_ctx = container_of(fid, struct sock_tx_ctx, fid.stx.fid);
-		atomic_dec(&tx_ctx->domain->ref);
+		ofi_atomic_dec32(&tx_ctx->domain->ref);
 		sock_pe_remove_tx_ctx(tx_ctx);
 		sock_tx_ctx_free(tx_ctx);
 		break;
 
 	case FI_CLASS_SRX_CTX:
 		rx_ctx = container_of(fid, struct sock_rx_ctx, ctx.fid);
-		atomic_dec(&rx_ctx->domain->ref);
+		ofi_atomic_dec32(&rx_ctx->domain->ref);
 		sock_pe_remove_rx_ctx(rx_ctx);
 		sock_rx_ctx_free(rx_ctx);
 		break;
@@ -219,29 +219,38 @@ static int sock_ctx_bind_cntr(struct fid *fid, struct fid *bfid, uint64_t flags)
 	switch (fid->fclass) {
 	case FI_CLASS_TX_CTX:
 		tx_ctx = container_of(fid, struct sock_tx_ctx, fid.ctx.fid);
-		if (flags & FI_SEND)
+		if (flags & FI_SEND) {
 			tx_ctx->comp.send_cntr = cntr;
+			sock_cntr_add_tx_ctx(cntr, tx_ctx);
+		}
 
-		if (flags & FI_READ)
+		if (flags & FI_READ) {
 			tx_ctx->comp.read_cntr = cntr;
+			sock_cntr_add_tx_ctx(cntr, tx_ctx);
+		}
 
-		if (flags & FI_WRITE)
+		if (flags & FI_WRITE) {
 			tx_ctx->comp.write_cntr = cntr;
-
-		sock_cntr_add_tx_ctx(cntr, tx_ctx);
+			sock_cntr_add_tx_ctx(cntr, tx_ctx);
+		}
 		break;
 
 	case FI_CLASS_RX_CTX:
 		rx_ctx = container_of(fid, struct sock_rx_ctx, ctx.fid);
-		if (flags & FI_RECV)
+		if (flags & FI_RECV) {
 			rx_ctx->comp.recv_cntr = cntr;
+			sock_cntr_add_rx_ctx(cntr, rx_ctx);
+		}
 
-		if (flags & FI_REMOTE_READ)
+		if (flags & FI_REMOTE_READ) {
 			rx_ctx->comp.rem_read_cntr = cntr;
+			sock_cntr_add_rx_ctx(cntr, rx_ctx);
+		}
 
-		if (flags & FI_REMOTE_WRITE)
+		if (flags & FI_REMOTE_WRITE) {
 			rx_ctx->comp.rem_write_cntr = cntr;
-		sock_cntr_add_rx_ctx(cntr, rx_ctx);
+			sock_cntr_add_rx_ctx(cntr, rx_ctx);
+		}
 		break;
 
 	default:
@@ -278,24 +287,24 @@ static int sock_ctx_enable(struct fid_ep *ep)
 	switch (ep->fid.fclass) {
 	case FI_CLASS_RX_CTX:
 		rx_ctx = container_of(ep, struct sock_rx_ctx, ctx.fid);
-		rx_ctx->enabled = 1;
 		sock_pe_add_rx_ctx(rx_ctx->domain->pe, rx_ctx);
 
 		if (!rx_ctx->ep_attr->listener.listener_thread &&
 		    sock_conn_listen(rx_ctx->ep_attr)) {
 			SOCK_LOG_ERROR("failed to create listener\n");
 		}
+		rx_ctx->enabled = 1;
 		return 0;
 
 	case FI_CLASS_TX_CTX:
 		tx_ctx = container_of(ep, struct sock_tx_ctx, fid.ctx.fid);
-		tx_ctx->enabled = 1;
 		sock_pe_add_tx_ctx(tx_ctx->domain->pe, tx_ctx);
 
 		if (!tx_ctx->ep_attr->listener.listener_thread &&
 		    sock_conn_listen(tx_ctx->ep_attr)) {
 			SOCK_LOG_ERROR("failed to create listener\n");
 		}
+		tx_ctx->enabled = 1;
 		return 0;
 
 	default:
@@ -486,14 +495,14 @@ static ssize_t sock_rx_ctx_cancel(struct sock_rx_ctx *rx_ctx, void *context)
 					pe_entry.flags |= FI_TAGGED;
 
 				if (sock_cq_report_error(pe_entry.comp->recv_cq,
-							  &pe_entry, 0, FI_ECANCELED,
-							  -FI_ECANCELED, NULL)) {
+							 &pe_entry, 0, FI_ECANCELED,
+							 -FI_ECANCELED, NULL, 0)) {
 					SOCK_LOG_ERROR("failed to report error\n");
 				}
 			}
 
 			if (rx_ctx->comp.recv_cntr)
-				sock_cntr_err_inc(rx_ctx->comp.recv_cntr);
+				fi_cntr_adderr(&rx_ctx->comp.recv_cntr->cntr_fid, 1);
 
 			dlist_remove(&rx_entry->entry);
 			sock_rx_release_entry(rx_entry);
@@ -587,9 +596,9 @@ static ssize_t sock_tx_size_left(struct fid_ep *ep)
 	if (!tx_ctx->enabled)
 		return -FI_EOPBADSTATE;
 
-	fastlock_acquire(&tx_ctx->wlock);
-	num_left = rbavail(&tx_ctx->rb)/SOCK_EP_TX_ENTRY_SZ;
-	fastlock_release(&tx_ctx->wlock);
+	fastlock_acquire(&tx_ctx->rb_lock);
+	num_left = ofi_rbavail(&tx_ctx->rb)/SOCK_EP_TX_ENTRY_SZ;
+	fastlock_release(&tx_ctx->rb_lock);
 	return num_left;
 }
 
@@ -604,6 +613,34 @@ struct fi_ops_ep sock_ctx_ep_ops = {
 	.tx_size_left = sock_tx_size_left,
 };
 
+static int sock_eq_fid_match(struct dlist_entry *entry, const void *arg)
+{
+	struct sock_eq_entry *sock_eq_entry;
+	struct fi_eq_entry *eq_entry;
+	fid_t fid = (fid_t)arg;
+
+	sock_eq_entry = container_of(entry, struct sock_eq_entry, entry);
+	/* fi_eq_entry, fi_eq_cm_entry and fi_eq_err_entry all
+	 * have fid_t as first member */
+	eq_entry = (struct fi_eq_entry *)sock_eq_entry->event;
+	return (fid == eq_entry->fid);
+}
+
+static void sock_ep_clear_eq_list(struct dlistfd_head *list,
+				  struct fid_ep *ep_fid)
+{
+	struct dlist_entry *entry;
+
+	while (!dlistfd_empty(list)) {
+		entry = dlist_remove_first_match(&list->list, sock_eq_fid_match,
+						 ep_fid);
+		if (!entry)
+			break;
+		dlistfd_reset(list);
+		free(container_of(entry, struct sock_eq_entry, entry));
+	}
+}
+
 static int sock_ep_close(struct fid *fid)
 {
 	struct sock_ep *sock_ep;
@@ -623,11 +660,11 @@ static int sock_ep_close(struct fid *fid)
 	}
 
 	if (sock_ep->is_alias) {
-		atomic_dec(&sock_ep->attr->ref);
+		ofi_atomic_dec32(&sock_ep->attr->ref);
 		return 0;
 	}
-	if (atomic_get(&sock_ep->attr->ref) || atomic_get(&sock_ep->attr->num_rx_ctx) ||
-	    atomic_get(&sock_ep->attr->num_tx_ctx))
+	if (ofi_atomic_get32(&sock_ep->attr->ref) || ofi_atomic_get32(&sock_ep->attr->num_rx_ctx) ||
+	    ofi_atomic_get32(&sock_ep->attr->num_tx_ctx))
 		return -FI_EBUSY;
 
 	if (sock_ep->attr->ep_type == FI_EP_MSG) {
@@ -643,7 +680,7 @@ static int sock_ep_close(struct fid *fid)
 		ofi_close_socket(sock_ep->attr->cm.signal_fds[1]);
 	} else {
 		if (sock_ep->attr->av)
-			atomic_dec(&sock_ep->attr->av->ref);
+			ofi_atomic_dec32(&sock_ep->attr->av->ref);
 	}
 	if (sock_ep->attr->av) {
 		fastlock_acquire(&sock_ep->attr->av->list_lock);
@@ -681,6 +718,17 @@ static int sock_ep_close(struct fid *fid)
 
 	fastlock_destroy(&sock_ep->attr->cm.lock);
 
+	if (sock_ep->attr->eq) {
+		fastlock_acquire(&sock_ep->attr->eq->lock);
+		sock_ep_clear_eq_list(&sock_ep->attr->eq->list,
+				      &sock_ep->ep);
+		/* Any err_data if present would be freed by
+		 * sock_eq_clean_err_data_list when EQ is closed */
+		sock_ep_clear_eq_list(&sock_ep->attr->eq->err_list,
+				      &sock_ep->ep);
+		fastlock_release(&sock_ep->attr->eq->lock);
+	}
+
 	if (sock_ep->attr->fclass != FI_CLASS_SEP) {
 		if (!sock_ep->attr->tx_shared)
 			sock_pe_remove_tx_ctx(sock_ep->attr->tx_array[0]);
@@ -706,12 +754,12 @@ static int sock_ep_close(struct fid *fid)
 		free(sock_ep->attr->dest_addr);
 
 	fastlock_acquire(&sock_ep->attr->domain->pe->lock);
-	idm_reset(&sock_ep->attr->conn_idm);
-	idm_reset(&sock_ep->attr->av_idm);
+	ofi_idm_reset(&sock_ep->attr->conn_idm);
+	ofi_idm_reset(&sock_ep->attr->av_idm);
 	sock_conn_map_destroy(sock_ep->attr);
 	fastlock_release(&sock_ep->attr->domain->pe->lock);
 
-	atomic_dec(&sock_ep->attr->domain->ref);
+	ofi_atomic_dec32(&sock_ep->attr->domain->ref);
 	fastlock_destroy(&sock_ep->attr->lock);
 	free(sock_ep->attr);
 	free(sock_ep);
@@ -720,7 +768,8 @@ static int sock_ep_close(struct fid *fid)
 
 static int sock_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 {
-	int ret, i;
+	int ret;
+	size_t i;
 	struct sock_ep *ep;
 	struct sock_eq *eq;
 	struct sock_cq *cq;
@@ -826,7 +875,7 @@ static int sock_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 			return -FI_EINVAL;
 
 		ep->attr->av = av;
-		atomic_inc(&av->ref);
+		ofi_atomic_inc32(&av->ref);
 
 		if (ep->attr->tx_ctx &&
 		    ep->attr->tx_ctx->fid.ctx.fid.fclass == FI_CLASS_TX_CTX) {
@@ -922,7 +971,7 @@ static int sock_ep_control(struct fid *fid, int command, void *arg)
 		new_ep->is_alias = 1;
 		memcpy(&new_ep->ep, &sock_ep->ep, sizeof(struct fid_ep));
 		*alias->fid = &new_ep->ep.fid;
-		atomic_inc(&new_ep->attr->ref);
+		ofi_atomic_inc32(&new_ep->attr->ref);
 		break;
 	case FI_GETOPSFLAG:
 		ret = sock_getopflags(&sock_ep->tx_attr, &sock_ep->rx_attr, (uint64_t *) arg);
@@ -956,7 +1005,7 @@ struct fi_ops sock_ep_fi_ops = {
 
 int sock_ep_enable(struct fid_ep *ep)
 {
-	int i;
+	size_t i;
 	struct sock_ep *sock_ep;
 	struct sock_tx_ctx *tx_ctx;
 	struct sock_rx_ctx *rx_ctx;
@@ -1001,7 +1050,7 @@ int sock_ep_enable(struct fid_ep *ep)
 
 int sock_ep_disable(struct fid_ep *ep)
 {
-	int i;
+	size_t i;
 	struct sock_ep *sock_ep;
 
 	sock_ep = container_of(ep, struct sock_ep, ep);
@@ -1062,7 +1111,7 @@ static int sock_ep_getopt(fid_t fid, int level, int optname,
 static int sock_ep_setopt(fid_t fid, int level, int optname,
 		       const void *optval, size_t optlen)
 {
-	int i;
+	size_t i;
 	struct sock_ep *sock_ep;
 	sock_ep = container_of(fid, struct sock_ep, ep.fid);
 
@@ -1095,11 +1144,11 @@ static int sock_ep_tx_ctx(struct fid_ep *ep, int index, struct fi_tx_attr *attr,
 
 	sock_ep = container_of(ep, struct sock_ep, ep);
 	if (sock_ep->attr->fclass != FI_CLASS_SEP ||
-		index >= sock_ep->attr->ep_attr.tx_ctx_cnt)
+		index >= (int)sock_ep->attr->ep_attr.tx_ctx_cnt)
 		return -FI_EINVAL;
 
 	if (attr) {
-		if (fi_check_tx_attr(&sock_prov, &sock_ep->tx_attr, attr))
+		if (ofi_check_tx_attr(&sock_prov, &sock_ep->tx_attr, attr, 0))
 			return -FI_ENODATA;
 		tx_ctx = sock_tx_ctx_alloc(attr, context, 0);
 	} else {
@@ -1111,6 +1160,8 @@ static int sock_ep_tx_ctx(struct fid_ep *ep, int index, struct fi_tx_attr *attr,
 	tx_ctx->tx_id = index;
 	tx_ctx->ep_attr = sock_ep->attr;
 	tx_ctx->domain = sock_ep->attr->domain;
+	if (tx_ctx->rx_ctrl_ctx && tx_ctx->rx_ctrl_ctx->is_ctrl_ctx)
+		tx_ctx->rx_ctrl_ctx->domain = sock_ep->attr->domain;
 	tx_ctx->av = sock_ep->attr->av;
 	dlist_insert_tail(&sock_ep->attr->tx_ctx_entry, &tx_ctx->ep_list);
 
@@ -1123,8 +1174,8 @@ static int sock_ep_tx_ctx(struct fid_ep *ep, int index, struct fi_tx_attr *attr,
 
 	*tx_ep = &tx_ctx->fid.ctx;
 	sock_ep->attr->tx_array[index] = tx_ctx;
-	atomic_inc(&sock_ep->attr->num_tx_ctx);
-	atomic_inc(&sock_ep->attr->domain->ref);
+	ofi_atomic_inc32(&sock_ep->attr->num_tx_ctx);
+	ofi_atomic_inc32(&sock_ep->attr->domain->ref);
 	return 0;
 }
 
@@ -1136,11 +1187,11 @@ static int sock_ep_rx_ctx(struct fid_ep *ep, int index, struct fi_rx_attr *attr,
 
 	sock_ep = container_of(ep, struct sock_ep, ep);
 	if (sock_ep->attr->fclass != FI_CLASS_SEP ||
-		index >= sock_ep->attr->ep_attr.rx_ctx_cnt)
+		index >= (int)sock_ep->attr->ep_attr.rx_ctx_cnt)
 		return -FI_EINVAL;
 
 	if (attr) {
-		if (fi_check_rx_attr(&sock_prov, &sock_ep->rx_attr, attr))
+		if (ofi_check_rx_attr(&sock_prov, &sock_ep->rx_attr, attr, 0))
 			return -FI_ENODATA;
 		rx_ctx = sock_rx_ctx_alloc(attr, context, 0);
 	} else {
@@ -1163,8 +1214,8 @@ static int sock_ep_rx_ctx(struct fid_ep *ep, int index, struct fi_rx_attr *attr,
 	rx_ctx->min_multi_recv = sock_ep->attr->min_multi_recv;
 	*rx_ep = &rx_ctx->ctx;
 	sock_ep->attr->rx_array[index] = rx_ctx;
-	atomic_inc(&sock_ep->attr->num_rx_ctx);
-	atomic_inc(&sock_ep->attr->domain->ref);
+	ofi_atomic_inc32(&sock_ep->attr->num_rx_ctx);
+	ofi_atomic_inc32(&sock_ep->attr->domain->ref);
 	return 0;
 }
 
@@ -1215,9 +1266,12 @@ int sock_stx_ctx(struct fid_domain *domain,
 		return -FI_ENOMEM;
 
 	tx_ctx->domain = dom;
+	if (tx_ctx->rx_ctrl_ctx && tx_ctx->rx_ctrl_ctx->is_ctrl_ctx)
+		tx_ctx->rx_ctrl_ctx->domain = dom;
+
 	tx_ctx->fid.stx.fid.ops = &sock_ctx_ops;
 	tx_ctx->fid.stx.ops = &sock_ep_ops;
-	atomic_inc(&dom->ref);
+	ofi_atomic_inc32(&dom->ref);
 
 	*stx = &tx_ctx->fid.stx;
 	return 0;
@@ -1272,7 +1326,7 @@ int sock_srx_ctx(struct fid_domain *domain,
 	/* default config */
 	rx_ctx->min_multi_recv = SOCK_EP_MIN_MULTI_RECV;
 	*srx = &rx_ctx->ctx;
-	atomic_inc(&dom->ref);
+	ofi_atomic_inc32(&dom->ref);
 	return 0;
 }
 
@@ -1381,7 +1435,8 @@ static void sock_set_fabric_attr(void *src_addr, const struct fi_fabric_attr *hi
 	attr->prov_name = NULL;
 }
 
-static void sock_set_domain_attr(void *src_addr, const struct fi_domain_attr *hint_attr,
+static void sock_set_domain_attr(uint32_t api_version, void *src_addr,
+				 const struct fi_domain_attr *hint_attr,
 				 struct fi_domain_attr *attr)
 {
 	struct sock_domain *domain;
@@ -1390,6 +1445,9 @@ static void sock_set_domain_attr(void *src_addr, const struct fi_domain_attr *hi
 	attr->domain = domain ? &domain->dom_fid : NULL;
 	if (!hint_attr) {
 		*attr = sock_domain_attr;
+
+		if (FI_VERSION_LT(api_version, FI_VERSION(1, 5)))
+			attr->mr_mode = FI_MR_SCALABLE;
 		goto out;
 	}
 
@@ -1408,8 +1466,14 @@ static void sock_set_domain_attr(void *src_addr, const struct fi_domain_attr *hi
 		attr->control_progress = sock_domain_attr.control_progress;
 	if (attr->data_progress == FI_PROGRESS_UNSPEC)
 		attr->data_progress = sock_domain_attr.data_progress;
-	if (attr->mr_mode == FI_MR_UNSPEC)
-		attr->mr_mode = sock_domain_attr.mr_mode;
+	if (FI_VERSION_LT(api_version, FI_VERSION(1, 5))) {
+		if (attr->mr_mode == FI_MR_UNSPEC)
+			attr->mr_mode = FI_MR_SCALABLE;
+	} else {
+		if ((attr->mr_mode != FI_MR_BASIC) &&
+		    (attr->mr_mode != FI_MR_SCALABLE))
+			attr->mr_mode = 0;
+	}
 
 	if (attr->cq_cnt == 0)
 		attr->cq_cnt = sock_domain_attr.cq_cnt;
@@ -1423,6 +1487,10 @@ static void sock_set_domain_attr(void *src_addr, const struct fi_domain_attr *hi
 		attr->max_ep_tx_ctx = sock_domain_attr.max_ep_tx_ctx;
 	if (attr->max_ep_rx_ctx == 0)
 		attr->max_ep_rx_ctx = sock_domain_attr.max_ep_rx_ctx;
+	if (attr->cntr_cnt == 0)
+		attr->cntr_cnt = sock_domain_attr.cntr_cnt;
+	if (attr->mr_iov_limit == 0)
+		attr->mr_iov_limit = sock_domain_attr.mr_iov_limit;
 
 	attr->mr_key_size = sock_domain_attr.mr_key_size;
 	attr->cq_data_size = sock_domain_attr.cq_data_size;
@@ -1435,8 +1503,9 @@ out:
 }
 
 
-struct fi_info *sock_fi_info(enum fi_ep_type ep_type, struct fi_info *hints,
-			     void *src_addr, void *dest_addr)
+struct fi_info *sock_fi_info(uint32_t version, enum fi_ep_type ep_type,
+			     struct fi_info *hints, void *src_addr,
+			     void *dest_addr)
 {
 	struct fi_info *info;
 
@@ -1481,19 +1550,19 @@ struct fi_info *sock_fi_info(enum fi_ep_type ep_type, struct fi_info *hints,
 		if (hints->handle)
 			info->handle = hints->handle;
 
-		sock_set_domain_attr(info->src_addr, hints->domain_attr, info->domain_attr);
+		sock_set_domain_attr(version, info->src_addr, hints->domain_attr,
+				     info->domain_attr);
 		sock_set_fabric_attr(info->src_addr, hints->fabric_attr, info->fabric_attr);
 	} else {
-		sock_set_domain_attr(info->src_addr, NULL, info->domain_attr);
+		sock_set_domain_attr(version, info->src_addr, NULL,
+				     info->domain_attr);
 		sock_set_fabric_attr(info->src_addr, NULL, info->fabric_attr);
 	}
 
 	info->ep_attr->type = ep_type;
 	return info;
 err:
-	free(info->src_addr);
-	free(info->dest_addr);
-	free(info);
+	fi_freeinfo(info);
 	return NULL;
 }
 
@@ -1541,15 +1610,15 @@ int sock_alloc_endpoint(struct fid_domain *domain, struct fi_info *info,
 	struct sock_rx_ctx *rx_ctx;
 	struct sock_domain *sock_dom;
 
+	sock_dom = container_of(domain, struct sock_domain, dom_fid);
 	if (info) {
-		ret = sock_verify_info(info);
+		ret = sock_verify_info(sock_dom->fab->fab_fid.api_version, info);
 		if (ret) {
 			SOCK_LOG_DBG("Cannot support requested options!\n");
 			return -FI_EINVAL;
 		}
 	}
 
-	sock_dom = container_of(domain, struct sock_domain, dom_fid);
 	sock_ep = (struct sock_ep *) calloc(1, sizeof(*sock_ep));
 	if (!sock_ep)
 		return -FI_ENOMEM;
@@ -1640,9 +1709,9 @@ int sock_alloc_endpoint(struct fid_domain *domain, struct fi_info *info,
 		goto err2;
 	}
 
-	atomic_initialize(&sock_ep->attr->ref, 0);
-	atomic_initialize(&sock_ep->attr->num_tx_ctx, 0);
-	atomic_initialize(&sock_ep->attr->num_rx_ctx, 0);
+	ofi_atomic_initialize32(&sock_ep->attr->ref, 0);
+	ofi_atomic_initialize32(&sock_ep->attr->num_tx_ctx, 0);
+	ofi_atomic_initialize32(&sock_ep->attr->num_rx_ctx, 0);
 	fastlock_init(&sock_ep->attr->lock);
 
 	if (sock_ep->attr->ep_attr.tx_ctx_cnt == FI_SHARED_CONTEXT)
@@ -1679,6 +1748,8 @@ int sock_alloc_endpoint(struct fid_domain *domain, struct fi_info *info,
 		}
 		tx_ctx->ep_attr = sock_ep->attr;
 		tx_ctx->domain = sock_dom;
+		if (tx_ctx->rx_ctrl_ctx && tx_ctx->rx_ctrl_ctx->is_ctrl_ctx)
+			tx_ctx->rx_ctrl_ctx->domain = sock_dom;
 		tx_ctx->tx_id = 0;
 		dlist_insert_tail(&sock_ep->attr->tx_ctx_entry, &tx_ctx->ep_list);
 		sock_ep->attr->tx_array[0] = tx_ctx;
@@ -1725,7 +1796,7 @@ int sock_alloc_endpoint(struct fid_domain *domain, struct fi_info *info,
 		goto err2;
 	}
 
-	atomic_inc(&sock_dom->ref);
+	ofi_atomic_inc32(&sock_dom->ref);
 	return 0;
 
 err2:
@@ -1742,7 +1813,7 @@ err1:
 void sock_ep_remove_conn(struct sock_ep_attr *attr, struct sock_conn *conn)
 {
 	sock_pe_poll_del(attr->domain->pe, conn->sock_fd);
-	idm_clear(&attr->conn_idm, conn->sock_fd);
+	ofi_idm_clear(&attr->conn_idm, conn->sock_fd);
 	sock_conn_release_entry(&attr->cmap, conn);
 }
 
@@ -1755,7 +1826,7 @@ struct sock_conn *sock_ep_lookup_conn(struct sock_ep_attr *attr, fi_addr_t index
 
 	idx = (attr->ep_type == FI_EP_MSG) ? index : index & attr->av->mask;
 
-	conn = idm_lookup(&attr->av_idm, idx);
+	conn = ofi_idm_lookup(&attr->av_idm, idx);
 	if (conn && conn != SOCK_CM_CONN_IN_PROGRESS)
 		return conn;
 
@@ -1785,8 +1856,8 @@ int sock_ep_get_conn(struct sock_ep_attr *attr, struct sock_tx_ctx *tx_ctx,
 	conn = sock_ep_lookup_conn(attr, av_index, addr);
 	if (!conn) {
 		conn = SOCK_CM_CONN_IN_PROGRESS;
-		if (idm_set(&attr->av_idm, av_index, conn) < 0)
-			SOCK_LOG_ERROR("idm_set failed\n");
+		if (ofi_idm_set(&attr->av_idm, av_index, conn) < 0)
+			SOCK_LOG_ERROR("ofi_idm_set failed\n");
 	}
 	fastlock_release(&attr->cmap.lock);
 
diff --git a/prov/sockets/src/sock_ep_dgram.c b/prov/sockets/src/sock_ep_dgram.c
index 56d6ce2..ff67cfe 100644
--- a/prov/sockets/src/sock_ep_dgram.c
+++ b/prov/sockets/src/sock_ep_dgram.c
@@ -197,10 +197,10 @@ int sock_dgram_verify_ep_attr(struct fi_ep_attr *ep_attr,
 	return 0;
 }
 
-int sock_dgram_fi_info(void *src_addr, void *dest_addr, struct fi_info *hints,
-			struct fi_info **info)
+int sock_dgram_fi_info(uint32_t version, void *src_addr, void *dest_addr,
+		       struct fi_info *hints, struct fi_info **info)
 {
-	*info = sock_fi_info(FI_EP_DGRAM, hints, src_addr, dest_addr);
+	*info = sock_fi_info(version, FI_EP_DGRAM, hints, src_addr, dest_addr);
 	if (!*info)
 		return -FI_ENOMEM;
 
diff --git a/prov/sockets/src/sock_ep_msg.c b/prov/sockets/src/sock_ep_msg.c
index a6d8c65..d90cd8e 100644
--- a/prov/sockets/src/sock_ep_msg.c
+++ b/prov/sockets/src/sock_ep_msg.c
@@ -190,6 +190,10 @@ int sock_msg_verify_ep_attr(struct fi_ep_attr *ep_attr,
 		if ((ep_attr->rx_ctx_cnt > SOCK_EP_MAX_RX_CNT) &&
 		    ep_attr->rx_ctx_cnt != FI_SHARED_CONTEXT)
 			return -FI_ENODATA;
+
+		if (ep_attr->auth_key_size &&
+		    (ep_attr->auth_key_size != sock_msg_ep_attr.auth_key_size))
+			return -FI_ENODATA;
 	}
 
 	if (sock_msg_verify_tx_attr(tx_attr) || sock_msg_verify_rx_attr(rx_attr))
@@ -198,10 +202,10 @@ int sock_msg_verify_ep_attr(struct fi_ep_attr *ep_attr,
 	return 0;
 }
 
-int sock_msg_fi_info(void *src_addr, void *dest_addr, struct fi_info *hints,
-		     struct fi_info **info)
+int sock_msg_fi_info(uint32_t version, void *src_addr, void *dest_addr,
+		     struct fi_info *hints, struct fi_info **info)
 {
-	*info = sock_fi_info(FI_EP_MSG, hints, src_addr, dest_addr);
+	*info = sock_fi_info(version, FI_EP_MSG, hints, src_addr, dest_addr);
 	if (!*info)
 		return -FI_ENOMEM;
 
@@ -281,8 +285,8 @@ static int sock_pep_create_listener(struct sock_pep *pep)
 	struct sockaddr_in addr;
 	struct addrinfo *s_res = NULL, *p;
 	struct addrinfo hints;
-	char sa_ip[INET_ADDRSTRLEN] = {0};
-	char sa_port[NI_MAXSERV] = {0};
+	char sa_ip[INET_ADDRSTRLEN];
+	char sa_port[NI_MAXSERV];
 
 	pep->cm.do_listen = 1;
 	memset(&hints, 0, sizeof(hints));
@@ -292,6 +296,8 @@ static int sock_pep_create_listener(struct sock_pep *pep)
 
 	memcpy(sa_ip, inet_ntoa(pep->src_addr.sin_addr), INET_ADDRSTRLEN);
 	sprintf(sa_port, "%d", ntohs(pep->src_addr.sin_port));
+	sa_ip[INET_ADDRSTRLEN - 1] = '\0';
+	sa_port[NI_MAXSERV - 1] = '\0';
 
 	ret = getaddrinfo(sa_ip, sa_port, &hints, &s_res);
 	if (ret) {
@@ -302,7 +308,7 @@ static int sock_pep_create_listener(struct sock_pep *pep)
 
 	SOCK_LOG_DBG("binding pep listener to %s\n", sa_port);
 	for (p = s_res; p; p = p->ai_next) {
-		pep->cm.sock = socket(p->ai_family, p->ai_socktype,
+		pep->cm.sock = ofi_socket(p->ai_family, p->ai_socktype,
 				     p->ai_protocol);
 		if (pep->cm.sock >= 0) {
 			sock_set_sockopts(pep->cm.sock);
@@ -372,7 +378,6 @@ static int sock_ep_cm_setname(fid_t fid, void *addr, size_t addrlen)
 		SOCK_LOG_ERROR("Invalid argument\n");
 		return -FI_EINVAL;
 	}
-	return 0;
 }
 
 static int sock_ep_cm_getpeer(struct fid_ep *ep, void *addr, size_t *addrlen)
@@ -390,8 +395,9 @@ static int sock_ep_cm_getpeer(struct fid_ep *ep, void *addr, size_t *addrlen)
 static int sock_cm_send(int fd, const void *buf, int len)
 {
 	int ret, done = 0;
+
 	while (done != len) {
-		ret = ofi_write_socket(fd, (const char*) buf + done, len - done);
+		ret = ofi_send_socket(fd, (const char*) buf + done, len - done, MSG_NOSIGNAL);
 		if (ret < 0) {
 			if (errno == EAGAIN || errno == EWOULDBLOCK)
 				continue;
@@ -491,7 +497,7 @@ static void *sock_ep_cm_connect_handler(void *data)
 	struct fi_eq_cm_entry *cm_entry = NULL;
 	int cm_data_sz, response_port;
 
-	sock_fd = socket(AF_INET, SOCK_STREAM, 0);
+	sock_fd = ofi_socket(AF_INET, SOCK_STREAM, 0);
 	if (sock_fd < 0) {
 		SOCK_LOG_ERROR("no socket\n");
 		sock_ep_cm_report_connect_fail(handle->ep, NULL, 0);
@@ -741,6 +747,7 @@ struct fi_ops_cm sock_ep_cm_ops = {
 	.accept = sock_ep_cm_accept,
 	.reject = fi_no_reject,
 	.shutdown = sock_ep_cm_shutdown,
+	.join = fi_no_join,
 };
 
 static int sock_msg_endpoint(struct fid_domain *domain, struct fi_info *info,
@@ -873,8 +880,8 @@ static struct fi_info *sock_ep_msg_get_info(struct sock_pep *pep,
 
 	hints = pep->info;
 	hints.caps = req->caps;
-	return sock_fi_info(FI_EP_MSG, &hints,
-			    &pep->src_addr, &req->src_addr);
+	return sock_fi_info(pep->sock_fab->fab_fid.api_version, FI_EP_MSG,
+			    &hints, &pep->src_addr, &req->src_addr);
 }
 
 static void *sock_pep_req_handler(void *data)
@@ -1108,8 +1115,10 @@ static struct fi_ops_cm sock_pep_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = sock_pep_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
+
 int sock_pep_getopt(fid_t fid, int level, int optname,
 		      void *optval, size_t *optlen)
 {
@@ -1157,7 +1166,7 @@ int sock_msg_passive_ep(struct fid_fabric *fabric, struct fi_info *info,
 	struct addrinfo hints, *result;
 
 	if (info) {
-		ret = sock_verify_info(info);
+		ret = sock_verify_info(fabric->api_version, info);
 		if (ret) {
 			SOCK_LOG_DBG("Cannot support requested options!\n");
 			return ret;
diff --git a/prov/sockets/src/sock_ep_rdm.c b/prov/sockets/src/sock_ep_rdm.c
index 8f49d6e..d225c66 100644
--- a/prov/sockets/src/sock_ep_rdm.c
+++ b/prov/sockets/src/sock_ep_rdm.c
@@ -241,10 +241,10 @@ int sock_rdm_verify_ep_attr(struct fi_ep_attr *ep_attr,
 	return 0;
 }
 
-int sock_rdm_fi_info(void *src_addr, void *dest_addr, struct fi_info *hints,
-		     struct fi_info **info)
+int sock_rdm_fi_info(uint32_t version, void *src_addr, void *dest_addr,
+		     struct fi_info *hints, struct fi_info **info)
 {
-	*info = sock_fi_info(FI_EP_RDM, hints, src_addr, dest_addr);
+	*info = sock_fi_info(version, FI_EP_RDM, hints, src_addr, dest_addr);
 	if (!*info)
 		return -FI_ENOMEM;
 
diff --git a/prov/sockets/src/sock_eq.c b/prov/sockets/src/sock_eq.c
index 7eb86e6..e1406a1 100644
--- a/prov/sockets/src/sock_eq.c
+++ b/prov/sockets/src/sock_eq.c
@@ -131,6 +131,9 @@ static ssize_t sock_eq_readerr(struct fid_eq *eq, struct fi_eq_err_entry *buf,
 	struct sock_eq_entry *entry;
 	struct fi_eq_err_entry *err_entry;
 	struct sock_eq_err_data_entry *err_data_entry;
+	void *err_data = NULL;
+	size_t err_data_size = 0;
+	uint32_t api_version;
 
 	sock_eq = container_of(eq, struct sock_eq, eq);
 	fastlock_acquire(&sock_eq->lock);
@@ -139,14 +142,29 @@ static ssize_t sock_eq_readerr(struct fid_eq *eq, struct fi_eq_err_entry *buf,
 		goto out;
 	}
 
+	api_version = sock_eq->sock_fab->fab_fid.api_version;
+
 	list = sock_eq->err_list.list.next;
 	entry = container_of(list, struct sock_eq_entry, entry);
+	err_entry = (struct fi_eq_err_entry *) entry->event;
 
 	ret = entry->len;
-	memcpy(buf, entry->event, entry->len);
+
+	if ((FI_VERSION_GE(api_version, FI_VERSION(1, 5)))
+		&& buf->err_data && buf->err_data_size) {
+		err_data = buf->err_data;
+		err_data_size = buf->err_data_size;
+ 		*buf = *err_entry;
+		buf->err_data = err_data;
+
+		/* Fill provided user's buffer */
+ 		buf->err_data_size = MIN(err_entry->err_data_size, err_data_size);
+ 		memcpy(buf->err_data, err_entry->err_data, buf->err_data_size);
+	} else {
+	    	*buf = *err_entry;
+	}
 
 	if (!(flags & FI_PEEK)) {
-		err_entry = (struct fi_eq_err_entry *) entry->event;
 		if (err_entry->err_data) {
 			err_data_entry = container_of(
 				err_entry->err_data,
@@ -274,7 +292,7 @@ static int sock_eq_fi_close(struct fid *fid)
 	dlistfd_head_free(&sock_eq->list);
 	dlistfd_head_free(&sock_eq->err_list);
 	fastlock_destroy(&sock_eq->lock);
-	atomic_dec(&sock_eq->sock_fab->ref);
+	ofi_atomic_dec32(&sock_eq->sock_fab->ref);
 
 	if (sock_eq->signal && sock_eq->attr.wait_obj == FI_WAIT_MUTEX_COND)
 		sock_wait_close(&sock_eq->waitset->fid);
@@ -387,7 +405,7 @@ int sock_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 		goto err2;
 
 	fastlock_init(&sock_eq->lock);
-	atomic_inc(&sock_eq->sock_fab->ref);
+	ofi_atomic_inc32(&sock_eq->sock_fab->ref);
 
 	switch (sock_eq->attr.wait_obj) {
 	case FI_WAIT_NONE:
diff --git a/prov/sockets/src/sock_fabric.c b/prov/sockets/src/sock_fabric.c
index 81a665f..5765ded 100644
--- a/prov/sockets/src/sock_fabric.c
+++ b/prov/sockets/src/sock_fabric.c
@@ -47,6 +47,7 @@
 #endif
 
 #include "prov.h"
+#include "fi_osd.h"
 
 #include "sock.h"
 #include "sock_util.h"
@@ -215,7 +216,7 @@ int sock_verify_fabric_attr(struct fi_fabric_attr *attr)
 	return 0;
 }
 
-int sock_verify_info(struct fi_info *hints)
+int sock_verify_info(uint32_t version, struct fi_info *hints)
 {
 	uint64_t caps;
 	enum fi_ep_type ep_type;
@@ -264,6 +265,7 @@ int sock_verify_info(struct fi_info *hints)
 	case FI_SOCKADDR_IN:
 		break;
 	default:
+		SOCK_LOG_DBG("Unsupported address format\n");
 		return -FI_ENODATA;
 	}
 
@@ -275,7 +277,7 @@ int sock_verify_info(struct fi_info *hints)
 			return -FI_ENODATA;
 		}
 	}
-	ret = sock_verify_domain_attr(hints->domain_attr);
+	ret = sock_verify_domain_attr(version, hints->domain_attr);
 	if (ret)
 		return ret;
 
@@ -313,7 +315,7 @@ static int sock_fabric_close(fid_t fid)
 {
 	struct sock_fabric *fab;
 	fab = container_of(fid, struct sock_fabric, fab_fid);
-	if (atomic_get(&fab->ref))
+	if (ofi_atomic_get32(&fab->ref))
 		return -FI_EBUSY;
 
 	sock_fab_remove_from_list(fab);
@@ -367,7 +369,7 @@ static int sock_fabric(struct fi_fabric_attr *attr,
 	fab->fab_fid.fid.ops = &sock_fab_fi_ops;
 	fab->fab_fid.ops = &sock_fab_ops;
 	*fabric = &fab->fab_fid;
-	atomic_initialize(&fab->ref, 0);
+	ofi_atomic_initialize32(&fab->ref, 0);
 #if ENABLE_DEBUG
 	fab->num_send_msg = 0;
 #endif
@@ -381,7 +383,7 @@ int sock_get_src_addr(struct sockaddr_in *dest_addr,
 	int sock, ret;
 	socklen_t len;
 
-	sock = socket(AF_INET, SOCK_DGRAM, 0);
+	sock = ofi_socket(AF_INET, SOCK_DGRAM, 0);
 	if (sock < 0)
 		return -errno;
 
@@ -417,7 +419,8 @@ static int sock_fi_checkinfo(struct fi_info *info, struct fi_info *hints)
 	return 0;
 }
 
-static int sock_ep_getinfo(const char *node, const char *service, uint64_t flags,
+static int sock_ep_getinfo(uint32_t version, const char *node,
+			   const char *service, uint64_t flags,
 			   struct fi_info *hints, enum fi_ep_type ep_type,
 			   struct fi_info **info)
 {
@@ -450,7 +453,7 @@ static int sock_ep_getinfo(const char *node, const char *service, uint64_t flags
 				return -FI_ENODATA;
 			}
 			dest_addr = (struct sockaddr_in *) rai->ai_addr;
-		} else {
+		} else if (hints) {
 			dest_addr = hints->dest_addr;
 		}
 
@@ -471,13 +474,13 @@ static int sock_ep_getinfo(const char *node, const char *service, uint64_t flags
 
 	switch (ep_type) {
 	case FI_EP_MSG:
-		ret = sock_msg_fi_info(src_addr, dest_addr, hints, info);
+		ret = sock_msg_fi_info(version, src_addr, dest_addr, hints, info);
 		break;
 	case FI_EP_DGRAM:
-		ret = sock_dgram_fi_info(src_addr, dest_addr, hints, info);
+		ret = sock_dgram_fi_info(version, src_addr, dest_addr, hints, info);
 		break;
 	case FI_EP_RDM:
-		ret = sock_rdm_fi_info(src_addr, dest_addr, hints, info);
+		ret = sock_rdm_fi_info(version, src_addr, dest_addr, hints, info);
 		break;
 	default:
 		ret = -FI_ENODATA;
@@ -533,6 +536,12 @@ void sock_get_list_of_addr(struct slist *addr_list)
 	// Always add loopback address at the end
 	sock_insert_loopback_addr(addr_list);
 }
+#elif defined HAVE_MIB_IPADDRTABLE
+void sock_get_list_of_addr(struct slist *addr_list)
+{
+	sock_get_ip_addr_table(addr_list);
+	sock_insert_loopback_addr(addr_list);
+}
 #else
 void sock_get_list_of_addr(struct slist *addr_list)
 {
@@ -540,9 +549,9 @@ void sock_get_list_of_addr(struct slist *addr_list)
 }
 #endif
 
-int sock_node_getinfo(const char *node, const char *service, uint64_t flags,
-			struct fi_info *hints, struct fi_info **info,
-			struct fi_info **tail)
+int sock_node_getinfo(uint32_t version, const char *node, const char *service,
+		      uint64_t flags, struct fi_info *hints, struct fi_info **info,
+		      struct fi_info **tail)
 {
 	enum fi_ep_type ep_type;
 	struct fi_info *cur;
@@ -553,8 +562,8 @@ int sock_node_getinfo(const char *node, const char *service, uint64_t flags,
 		case FI_EP_RDM:
 		case FI_EP_DGRAM:
 		case FI_EP_MSG:
-			ret = sock_ep_getinfo(node, service, flags, hints,
-						hints->ep_attr->type, &cur);
+			ret = sock_ep_getinfo(version, node, service, flags,
+					      hints, hints->ep_attr->type, &cur);
 			if (ret) {
 				if (ret == -FI_ENODATA)
 					return ret;
@@ -573,8 +582,8 @@ int sock_node_getinfo(const char *node, const char *service, uint64_t flags,
 		}
 	}
 	for (ep_type = FI_EP_MSG; ep_type <= FI_EP_RDM; ep_type++) {
-		ret = sock_ep_getinfo(node, service, flags,
-					hints, ep_type, &cur);
+		ret = sock_ep_getinfo(version, node, service, flags, hints,
+				      ep_type, &cur);
 		if (ret) {
 			if (ret == -FI_ENODATA)
 				continue;
@@ -614,7 +623,7 @@ static int sock_addr_matches_interface(struct slist *addr_list, struct sockaddr_
 	struct slist_entry *entry;
 
 	/* Always match if it's localhost */
-	if (src_addr->sin_addr.s_addr == htonl(INADDR_LOOPBACK))
+	if (ofi_is_loopback_addr((struct sockaddr *)src_addr))
 		return 1;
 
 	entry = slist_find_first_match(addr_list, sock_match_src_addr,
@@ -676,7 +685,7 @@ static int sock_getinfo(uint32_t version, const char *node, const char *service,
 	    (hints->dest_addrlen != sizeof(struct sockaddr_in)))
 		return -FI_ENODATA;
 
-	ret = sock_verify_info(hints);
+	ret = sock_verify_info(version, hints);
 	if (ret)
 		return ret;
 
@@ -701,7 +710,7 @@ static int sock_getinfo(uint32_t version, const char *node, const char *service,
 	     (!(flags & FI_SOURCE) && hints && hints->src_addr) ||
 	     (!(flags & FI_SOURCE) && hints && hints->dest_addr)) {
 		sock_free_addr_list(&addr_list);
-		return sock_node_getinfo(node, service, flags, hints, info, &tail);
+		return sock_node_getinfo(version, node, service, flags, hints, info, &tail);
 	}
 
 	while (!slist_empty(&addr_list)) {
@@ -709,7 +718,7 @@ static int sock_getinfo(uint32_t version, const char *node, const char *service,
 		host_entry = container_of(entry, struct sock_host_list_entry, entry);
 		node = host_entry->hostname;
 		flags |= FI_SOURCE;
-		ret = sock_node_getinfo(node, service, flags, hints, info, &tail);
+		ret = sock_node_getinfo(version, node, service, flags, hints, info, &tail);
 		free(host_entry);
 		if (ret) {
 			if (ret == -FI_ENODATA)
@@ -730,7 +739,7 @@ static void fi_sockets_fini(void)
 struct fi_provider sock_prov = {
 	.name = sock_prov_name,
 	.version = FI_VERSION(SOCK_MAJOR_VERSION, SOCK_MINOR_VERSION),
-	.fi_version = FI_VERSION(1, 4),
+	.fi_version = FI_VERSION(1, 5),
 	.getinfo = sock_getinfo,
 	.fabric = sock_fabric,
 	.cleanup = fi_sockets_fini
diff --git a/prov/sockets/src/sock_msg.c b/prov/sockets/src/sock_msg.c
index ce4eb33..ceac845 100644
--- a/prov/sockets/src/sock_msg.c
+++ b/prov/sockets/src/sock_msg.c
@@ -60,7 +60,8 @@
 ssize_t sock_ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 			uint64_t flags)
 {
-	int i, ret;
+	int ret;
+	size_t i;
 	struct sock_rx_ctx *rx_ctx;
 	struct sock_rx_entry *rx_entry;
 	struct sock_ep *sock_ep;
@@ -94,7 +95,7 @@ ssize_t sock_ep_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		flags |= op_flags;
 
 	if (flags & FI_TRIGGER) {
-		ret = sock_queue_msg_op(ep, msg, flags, SOCK_OP_RECV);
+		ret = sock_queue_msg_op(ep, msg, flags, FI_OP_RECV);
 		if (ret != 1)
 			return ret;
 	}
@@ -174,7 +175,8 @@ static ssize_t sock_ep_recvv(struct fid_ep *ep, const struct iovec *iov,
 ssize_t sock_ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 			uint64_t flags)
 {
-	int ret, i;
+	int ret;
+	size_t i;
 	uint64_t total_len, op_flags;
 	struct sock_op tx_op;
 	union sock_iov tx_iov;
@@ -224,7 +226,7 @@ ssize_t sock_ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		flags |= op_flags;
 
 	if (flags & FI_TRIGGER) {
-		ret = sock_queue_msg_op(ep, msg, flags, SOCK_OP_SEND);
+		ret = sock_queue_msg_op(ep, msg, flags, FI_OP_SEND);
 		if (ret != 1)
 			return ret;
 	}
@@ -237,10 +239,9 @@ ssize_t sock_ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		for (i = 0; i < msg->iov_count; i++)
 			total_len += msg->msg_iov[i].iov_len;
 
-		if (total_len > SOCK_EP_MAX_INJECT_SZ) {
-			ret = -FI_EINVAL;
-			goto err;
-		}
+		if (total_len > SOCK_EP_MAX_INJECT_SZ)
+			return -FI_EINVAL;
+
 		tx_op.src_iov_len = total_len;
 	} else {
 		tx_op.src_iov_len = msg->iov_count;
@@ -253,7 +254,7 @@ ssize_t sock_ep_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		total_len += sizeof(uint64_t);
 
 	sock_tx_ctx_start(tx_ctx);
-	if (rbavail(&tx_ctx->rb) < total_len) {
+	if (ofi_rbavail(&tx_ctx->rb) < total_len) {
 		ret = -FI_EAGAIN;
 		goto err;
 	}
@@ -389,7 +390,8 @@ struct fi_ops_msg sock_ep_msg_ops = {
 ssize_t sock_ep_trecvmsg(struct fid_ep *ep,
 			 const struct fi_msg_tagged *msg, uint64_t flags)
 {
-	int i, ret;
+	int ret;
+	size_t i;
 	struct sock_rx_ctx *rx_ctx;
 	struct sock_rx_entry *rx_entry;
 	struct sock_ep *sock_ep;
@@ -424,7 +426,7 @@ ssize_t sock_ep_trecvmsg(struct fid_ep *ep,
 	flags &= ~FI_MULTI_RECV;
 
 	if (flags & FI_TRIGGER) {
-		ret = sock_queue_tmsg_op(ep, msg, flags, SOCK_OP_TRECV);
+		ret = sock_queue_tmsg_op(ep, msg, flags, FI_OP_TRECV);
 		if (ret != 1)
 			return ret;
 	}
@@ -513,7 +515,8 @@ static ssize_t sock_ep_trecvv(struct fid_ep *ep, const struct iovec *iov,
 ssize_t sock_ep_tsendmsg(struct fid_ep *ep,
 			 const struct fi_msg_tagged *msg, uint64_t flags)
 {
-	int ret, i;
+	int ret;
+	size_t i;
 	uint64_t total_len, op_flags;
 	struct sock_op tx_op;
 	union sock_iov tx_iov;
@@ -560,7 +563,7 @@ ssize_t sock_ep_tsendmsg(struct fid_ep *ep,
 		flags |= op_flags;
 
 	if (flags & FI_TRIGGER) {
-		ret = sock_queue_tmsg_op(ep, msg, flags, SOCK_OP_TSEND);
+		ret = sock_queue_tmsg_op(ep, msg, flags, FI_OP_TSEND);
 		if (ret != 1)
 			return ret;
 	}
@@ -574,10 +577,8 @@ ssize_t sock_ep_tsendmsg(struct fid_ep *ep,
 			total_len += msg->msg_iov[i].iov_len;
 
 		tx_op.src_iov_len = total_len;
-		if (total_len > SOCK_EP_MAX_INJECT_SZ) {
-			ret = -FI_EINVAL;
-			goto err;
-		}
+		if (total_len > SOCK_EP_MAX_INJECT_SZ)
+			return -FI_EINVAL;
 	} else {
 		total_len = msg->iov_count * sizeof(union sock_iov);
 		tx_op.src_iov_len = msg->iov_count;
@@ -588,7 +589,7 @@ ssize_t sock_ep_tsendmsg(struct fid_ep *ep,
 		total_len += sizeof(uint64_t);
 
 	sock_tx_ctx_start(tx_ctx);
-	if (rbavail(&tx_ctx->rb) < total_len) {
+	if (ofi_rbavail(&tx_ctx->rb) < total_len) {
 		ret = -FI_EAGAIN;
 		goto err;
 	}
diff --git a/prov/sockets/src/sock_poll.c b/prov/sockets/src/sock_poll.c
index 89b56b9..e856774 100644
--- a/prov/sockets/src/sock_poll.c
+++ b/prov/sockets/src/sock_poll.c
@@ -61,11 +61,11 @@ static int sock_poll_add(struct fid_poll *pollset, struct fid *event_fid,
 	switch (list_item->fid->fclass) {
 	case FI_CLASS_CQ:
 		cq = container_of(list_item->fid, struct sock_cq, cq_fid);
-		atomic_inc(&cq->ref);
+		ofi_atomic_inc32(&cq->ref);
 		break;
 	case FI_CLASS_CNTR:
 		cntr = container_of(list_item->fid, struct sock_cntr, cntr_fid);
-		atomic_inc(&cntr->ref);
+		ofi_atomic_inc32(&cntr->ref);
 		break;
 	default:
 		SOCK_LOG_ERROR("Invalid fid class\n");
@@ -92,11 +92,11 @@ static int sock_poll_del(struct fid_poll *pollset, struct fid *event_fid,
 			switch (list_item->fid->fclass) {
 			case FI_CLASS_CQ:
 				cq = container_of(list_item->fid, struct sock_cq, cq_fid);
-				atomic_dec(&cq->ref);
+				ofi_atomic_dec32(&cq->ref);
 				break;
 			case FI_CLASS_CNTR:
 				cntr = container_of(list_item->fid, struct sock_cntr, cntr_fid);
-				atomic_dec(&cntr->ref);
+				ofi_atomic_dec32(&cntr->ref);
 				break;
 			default:
 				SOCK_LOG_ERROR("Invalid fid class\n");
@@ -130,7 +130,7 @@ static int sock_poll_poll(struct fid_poll *pollset, void **context, int count)
 						cq_fid);
 			sock_cq_progress(cq);
 			fastlock_acquire(&cq->lock);
-			if (rbfdused(&cq->cq_rbfd) || rbused(&cq->cqerr_rb)) {
+			if (ofi_rbfdused(&cq->cq_rbfd) || ofi_rbused(&cq->cqerr_rb)) {
 				*context++ = cq->cq_fid.fid.context;
 				ret_count++;
 			}
@@ -142,10 +142,10 @@ static int sock_poll_poll(struct fid_poll *pollset, void **context, int count)
 						cntr_fid);
 			sock_cntr_progress(cntr);
 			pthread_mutex_lock(&cntr->mut);
-			if (atomic_get(&cntr->value) !=
-			    atomic_get(&cntr->last_read_val)) {
-				atomic_set(&cntr->last_read_val,
-					   atomic_get(&cntr->value));
+			if (ofi_atomic_get32(&cntr->value) !=
+			    ofi_atomic_get32(&cntr->last_read_val)) {
+				ofi_atomic_set32(&cntr->last_read_val,
+					   ofi_atomic_get32(&cntr->value));
 				*context++ = cntr->cntr_fid.fid.context;
 				ret_count++;
 			}
@@ -186,7 +186,7 @@ static int sock_poll_close(fid_t fid)
 		sock_poll_del(&poll->poll_fid, list_item->fid, 0);
 	}
 
-	atomic_dec(&poll->domain->ref);
+	ofi_atomic_dec32(&poll->domain->ref);
 	free(poll);
 	return 0;
 }
@@ -233,7 +233,7 @@ int sock_poll_open(struct fid_domain *domain, struct fi_poll_attr *attr,
 	poll->poll_fid.fid.ops = &sock_poll_fi_ops;
 	poll->poll_fid.ops = &sock_poll_ops;
 	poll->domain = dom;
-	atomic_inc(&dom->ref);
+	ofi_atomic_inc32(&dom->ref);
 
 	*pollset = &poll->poll_fid;
 	return 0;
diff --git a/prov/sockets/src/sock_progress.c b/prov/sockets/src/sock_progress.c
index 4683db2..2b6d3e7 100644
--- a/prov/sockets/src/sock_progress.c
+++ b/prov/sockets/src/sock_progress.c
@@ -67,6 +67,10 @@
 #define SOCK_GET_RX_ID(_addr, _bits) (((_bits) == 0) ? 0 : \
 		(((uint64_t)_addr) >> (64 - _bits)))
 
+
+static int sock_pe_progress_buffered_rx(struct sock_rx_ctx *rx_ctx);
+
+
 static inline int sock_pe_is_data_msg(int msg_id)
 {
 	switch (msg_id) {
@@ -146,6 +150,8 @@ static inline void sock_pe_discard_field(struct sock_pe_entry *pe_entry)
 static void sock_pe_release_entry(struct sock_pe *pe,
 				  struct sock_pe_entry *pe_entry)
 {
+	assert((pe_entry->type != SOCK_PE_RX) ||
+		ofi_rbempty(&pe_entry->comm_buf));
 	dlist_remove(&pe_entry->ctx_entry);
 
 	if (pe_entry->conn->tx_pe_entry == pe_entry)
@@ -159,12 +165,15 @@ static void sock_pe_release_entry(struct sock_pe *pe,
 	}
 
 	if (pe_entry->is_pool_entry) {
-		rbfree(&pe_entry->comm_buf);
+		ofi_rbfree(&pe_entry->comm_buf);
 		dlist_remove(&pe_entry->entry);
 		util_buf_release(pe->pe_rx_pool, pe_entry);
 		return;
 	}
 
+	if (pe_entry->type == SOCK_PE_TX)
+		ofi_rbreset(&pe_entry->comm_buf);
+
 	pe->num_free_entries++;
 	pe_entry->conn = NULL;
 
@@ -200,7 +209,7 @@ static struct sock_pe_entry *sock_pe_acquire_entry(struct sock_pe *pe)
 		if (pe_entry) {
 			memset(pe_entry, 0, sizeof(*pe_entry));
 			pe_entry->is_pool_entry = 1;
-			if (rbinit(&pe_entry->comm_buf, SOCK_PE_OVERFLOW_COMM_BUFF_SZ))
+			if (ofi_rbinit(&pe_entry->comm_buf, SOCK_PE_OVERFLOW_COMM_BUFF_SZ))
 				SOCK_LOG_ERROR("failed to init comm-cache\n");
 			pe_entry->cache_sz = SOCK_PE_OVERFLOW_COMM_BUFF_SZ;
 			dlist_insert_tail(&pe_entry->entry, &pe->pool_list);
@@ -209,6 +218,8 @@ static struct sock_pe_entry *sock_pe_acquire_entry(struct sock_pe *pe)
 		pe->num_free_entries--;
 		entry = pe->free_list.next;
 		pe_entry = container_of(entry, struct sock_pe_entry, entry);
+
+		assert(ofi_rbempty(&pe_entry->comm_buf));
 		dlist_remove(&pe_entry->entry);
 		dlist_insert_tail(&pe_entry->entry, &pe->busy_list);
 		SOCK_LOG_DBG("progress entry %p acquired : %lu\n", pe_entry,
@@ -243,9 +254,16 @@ static void sock_pe_report_send_cq_completion(struct sock_pe_entry *pe_entry)
 
 static void sock_pe_report_send_completion(struct sock_pe_entry *pe_entry)
 {
-	sock_pe_report_send_cq_completion(pe_entry);
-	if (pe_entry->comp->send_cntr)
-		sock_cntr_inc(pe_entry->comp->send_cntr);
+	struct sock_triggered_context *trigger_context;
+
+	if (!(pe_entry->flags & SOCK_TRIGGERED_OP)) {
+		sock_pe_report_send_cq_completion(pe_entry);
+		if (pe_entry->comp->send_cntr)
+			sock_cntr_inc(pe_entry->comp->send_cntr);
+	} else {
+		trigger_context = (void *) (uintptr_t) pe_entry->context;
+		fi_cntr_add(trigger_context->trigger.work.completion_cntr, 1);
+	}
 }
 
 static void sock_pe_report_recv_cq_completion(struct sock_pe_entry *pe_entry)
@@ -272,9 +290,16 @@ static void sock_pe_report_recv_cq_completion(struct sock_pe_entry *pe_entry)
 
 static void sock_pe_report_recv_completion(struct sock_pe_entry *pe_entry)
 {
-	sock_pe_report_recv_cq_completion(pe_entry);
-	if (pe_entry->comp->recv_cntr)
-		sock_cntr_inc(pe_entry->comp->recv_cntr);
+	struct sock_triggered_context *trigger_context;
+
+	if (!(pe_entry->flags & SOCK_TRIGGERED_OP)) {
+		sock_pe_report_recv_cq_completion(pe_entry);
+		if (pe_entry->comp->recv_cntr)
+			sock_cntr_inc(pe_entry->comp->recv_cntr);
+	} else {
+		trigger_context = (void *) (uintptr_t) pe_entry->context;
+		fi_cntr_add(trigger_context->trigger.work.completion_cntr, 1);
+	}
 }
 
 static void sock_pe_report_mr_completion(struct sock_domain *domain,
@@ -285,7 +310,7 @@ static void sock_pe_report_mr_completion(struct sock_domain *domain,
 
 	for (i = 0; i < pe_entry->msg_hdr.dest_iov_len; i++) {
 		fastlock_acquire(&domain->lock);
-		mr = ofi_mr_retrieve(domain->mr_heap, pe_entry->pe.rx.rx_iov[i].iov.key);
+		mr = ofi_mr_get(&domain->mr_map, pe_entry->pe.rx.rx_iov[i].iov.key);
 		fastlock_release(&domain->lock);
 		if (!mr || (!mr->cq && !mr->cntr))
 			continue;
@@ -318,11 +343,18 @@ static void sock_pe_report_remote_write(struct sock_rx_ctx *rx_ctx,
 
 static void sock_pe_report_write_completion(struct sock_pe_entry *pe_entry)
 {
+	struct sock_triggered_context *trigger_context;
+
 	if (!(pe_entry->flags & SOCK_NO_COMPLETION))
 		sock_pe_report_send_cq_completion(pe_entry);
 
-	if (pe_entry->comp->write_cntr)
-		sock_cntr_inc(pe_entry->comp->write_cntr);
+	if (!(pe_entry->flags & SOCK_TRIGGERED_OP)) {
+		if (pe_entry->comp->write_cntr)
+			sock_cntr_inc(pe_entry->comp->write_cntr);
+	} else {
+		trigger_context = (void *) (uintptr_t) pe_entry->context;
+		fi_cntr_add(trigger_context->trigger.work.completion_cntr, 1);
+	}
 }
 
 static void sock_pe_report_remote_read(struct sock_rx_ctx *rx_ctx,
@@ -341,40 +373,56 @@ static void sock_pe_report_remote_read(struct sock_rx_ctx *rx_ctx,
 
 static void sock_pe_report_read_completion(struct sock_pe_entry *pe_entry)
 {
+	struct sock_triggered_context *trigger_context;
+
 	if (!(pe_entry->flags & SOCK_NO_COMPLETION))
 		sock_pe_report_send_cq_completion(pe_entry);
 
-	if (pe_entry->comp->read_cntr)
-		sock_cntr_inc(pe_entry->comp->read_cntr);
+	if (!(pe_entry->flags & SOCK_TRIGGERED_OP)) {
+		if (pe_entry->comp->read_cntr)
+			sock_cntr_inc(pe_entry->comp->read_cntr);
+	} else {
+		trigger_context = (void *) (uintptr_t) pe_entry->context;
+		fi_cntr_add(trigger_context->trigger.work.completion_cntr, 1);
+	}
 }
 
 static void sock_pe_report_rx_error(struct sock_pe_entry *pe_entry, int rem, int err)
 {
 	if (pe_entry->comp->recv_cntr)
-		sock_cntr_err_inc(pe_entry->comp->recv_cntr);
+		fi_cntr_adderr(&pe_entry->comp->recv_cntr->cntr_fid, 1);
 	if (pe_entry->comp->recv_cq)
 		sock_cq_report_error(pe_entry->comp->recv_cq, pe_entry, rem,
-				     err, -err, NULL);
+				     err, -err, NULL, 0);
+}
+
+static void sock_pe_report_tx_error(struct sock_pe_entry *pe_entry, int rem, int err)
+{
+	if (pe_entry->comp->send_cntr)
+		fi_cntr_adderr(&pe_entry->comp->send_cntr->cntr_fid, 1);
+	if (pe_entry->comp->send_cq)
+		sock_cq_report_error(pe_entry->comp->send_cq, pe_entry, rem,
+				     err, -err, NULL, 0);
 }
 
 static void sock_pe_report_tx_rma_read_err(struct sock_pe_entry *pe_entry,
 						int err)
 {
 	if (pe_entry->comp->read_cntr)
-		sock_cntr_err_inc(pe_entry->comp->read_cntr);
+		fi_cntr_adderr(&pe_entry->comp->read_cntr->cntr_fid, 1);
 	if (pe_entry->comp->send_cq)
 		sock_cq_report_error(pe_entry->comp->send_cq, pe_entry, 0,
-				     err, -err, NULL);
+				     err, -err, NULL, 0);
 }
 
 static void sock_pe_report_tx_rma_write_err(struct sock_pe_entry *pe_entry,
 						int err)
 {
 	if (pe_entry->comp->write_cntr)
-		sock_cntr_err_inc(pe_entry->comp->write_cntr);
+		fi_cntr_adderr(&pe_entry->comp->write_cntr->cntr_fid, 1);
 	if (pe_entry->comp->send_cq)
 		sock_cq_report_error(pe_entry->comp->send_cq, pe_entry, 0,
-				     err, -err, NULL);
+			 	     err, -err, NULL, 0);
 }
 
 static void sock_pe_progress_pending_ack(struct sock_pe *pe,
@@ -620,7 +668,7 @@ static int sock_pe_handle_atomic_complete(struct sock_pe *pe,
 	assert(waiting_entry->type == SOCK_PE_TX);
 
 	len = sizeof(struct sock_msg_response);
-	datatype_sz = fi_datatype_size(waiting_entry->pe.tx.tx_op.atomic.datatype);
+	datatype_sz = ofi_datatype_size(waiting_entry->pe.tx.tx_op.atomic.datatype);
 	for (i = 0; i < waiting_entry->pe.tx.tx_op.atomic.res_iov_len; i++) {
 		if (sock_pe_recv_field(
 			    pe_entry,
@@ -760,399 +808,34 @@ out:
 	return ret;
 }
 
-#define SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp) do {		\
-	switch (op) {							\
-	case FI_MIN:							\
-		*_cmp = *_dst;						\
-		if (*_src < *_dst)					\
-			*_dst = *_src;					\
-		break;							\
-									\
-	case FI_MAX:							\
-		*_cmp = *_dst;						\
-		if (*_src > *_dst)					\
-			*_dst = *_src;					\
-		break;							\
-									\
-	case FI_SUM:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst + *_src;					\
-		break;							\
-									\
-	case FI_PROD:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst * *_src;					\
-		break;							\
-									\
-	case FI_LOR:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst || *_src;					\
-		break;							\
-									\
-	case FI_LAND:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst && *_src;					\
-		break;							\
-									\
-	case FI_BOR:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst | *_src;					\
-		break;							\
-									\
-	case FI_BAND:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst & *_src;					\
-		break;							\
-									\
-	case FI_LXOR:							\
-		*_cmp = *_dst;						\
-									\
-		*_dst = ((*_dst && !*_src) || (!*_dst && *_src));	\
-		break;							\
-									\
-	case FI_BXOR:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst ^ *_src;					\
-		break;							\
-									\
-	case FI_ATOMIC_READ:						\
-		*_cmp = *_dst;						\
-		break;							\
-									\
-	case FI_ATOMIC_WRITE:						\
-		*_cmp = *_dst;						\
-		*_dst = *_src;						\
-		break;							\
-									\
-	case FI_CSWAP:							\
-		if (*_cmp == *_dst)					\
-			*_dst = *_src;					\
-		else							\
-			*_cmp = *_dst;					\
-		break;							\
-									\
-	case FI_CSWAP_NE:						\
-		_tmp = *_dst;						\
-		if (*_cmp != *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_LE:						\
-		_tmp = *_dst;						\
-		if (*_cmp <= *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_LT:						\
-		_tmp = *_dst;						\
-		if (*_cmp < *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_GE:						\
-		_tmp = *_dst;						\
-		if (*_cmp >= *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_GT:						\
-		_tmp = *_dst;						\
-		if (*_cmp > *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_MSWAP:							\
-		_tmp = *_dst;						\
-		*_dst = (*_src & *_cmp) | (*_dst & ~(*_cmp));		\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	default:							\
-		SOCK_LOG_ERROR("Atomic operation type not supported\n"); \
-		break;							\
-	}								\
-} while (0)
-
-#define SOCK_ATOMIC_UPDATE_FLOAT(_cmp, _src, _dst) do {			\
-	switch (op) {							\
-	case FI_MIN:							\
-		*_cmp = *_dst;						\
-		if (*_src < *_dst)					\
-			*_dst = *_src;					\
-		break;							\
-									\
-	case FI_MAX:							\
-		*_cmp = *_dst;						\
-		if (*_src > *_dst)					\
-			*_dst = *_src;					\
-		break;							\
-									\
-	case FI_SUM:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst + *_src;					\
-		break;							\
-									\
-	case FI_PROD:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst * *_src;					\
-		break;							\
-									\
-	case FI_LOR:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst || *_src;					\
-		break;							\
-									\
-	case FI_LAND:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst && *_src;					\
-		break;							\
-									\
-	case FI_ATOMIC_READ:						\
-		*_cmp = *_dst;						\
-		break;							\
-									\
-	case FI_ATOMIC_WRITE:						\
-		*_cmp = *_dst;						\
-		*_dst = *_src;						\
-		break;							\
-									\
-	case FI_CSWAP:							\
-		if (*_cmp == *_dst)					\
-			*_dst = *_src;					\
-		else							\
-			*_cmp = *_dst;					\
-		break;							\
-									\
-	case FI_CSWAP_NE:						\
-		_tmp = *_dst;						\
-		if (*_cmp != *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_LE:						\
-		_tmp = *_dst;						\
-		if (*_cmp <= *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_LT:						\
-		_tmp = *_dst;						\
-		if (*_cmp < *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_GE:						\
-		_tmp = *_dst;						\
-		if (*_cmp >= *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	case FI_CSWAP_GT:						\
-		_tmp = *_dst;						\
-		if (*_cmp > *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	default:							\
-		SOCK_LOG_ERROR("Atomic operation type not supported\n"); \
-		break;							\
-	}								\
-} while (0)
-
-#define SOCK_ATOMIC_UPDATE_COMPLEX(_cmp, _src, _dst) do {		\
-	switch (op) {							\
-	case FI_SUM:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst + *_src;					\
-		break;							\
-									\
-	case FI_PROD:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst * *_src;					\
-		break;							\
-									\
-	case FI_LOR:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst || *_src;					\
-		break;							\
-									\
-	case FI_LAND:							\
-		*_cmp = *_dst;						\
-		*_dst = *_dst && *_src;					\
-		break;							\
-									\
-	case FI_ATOMIC_READ:						\
-		*_cmp = *_dst;						\
-		break;							\
-									\
-	case FI_ATOMIC_WRITE:						\
-		*_cmp = *_dst;						\
-		*_dst = *_src;						\
-		break;							\
-									\
-	case FI_CSWAP:							\
-		if (*_cmp == *_dst)					\
-			*_dst = *_src;					\
-		else							\
-			*_cmp = *_dst;					\
-		break;							\
-									\
-	case FI_CSWAP_NE:						\
-		_tmp = *_dst;						\
-		if (*_cmp != *_dst)					\
-			*_dst = *_src;					\
-		*_cmp = _tmp;						\
-		break;							\
-									\
-	default:							\
-		SOCK_LOG_ERROR("Atomic operation type not supported\n");\
-		break;							\
-	}								\
-} while (0)
-
-
-static int sock_pe_update_atomic(void *cmp, void *dst, void *src,
-				 enum fi_datatype datatype, enum fi_op op)
-{
-	switch (datatype) {
-	case FI_INT8:
-	{
-		int8_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_UINT8:
-	{
-		uint8_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_INT16:
-	{
-		int16_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_UINT16:
-	{
-		uint16_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_INT32:
-	{
-		int32_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_UINT32:
-	{
-		uint32_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_INT64:
-	{
-		int64_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_UINT64:
-	{
-		uint64_t *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_INT(_cmp, _src, _dst, _tmp);
-		break;
-	}
-
-	case FI_FLOAT:
-	{
-		float *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_FLOAT(_cmp, _src, _dst);
-		break;
-	}
-
-	case FI_DOUBLE:
-	{
-		double *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_FLOAT(_cmp, _src, _dst);
-		break;
-	}
-
-	case FI_LONG_DOUBLE:
-	{
-		long double *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_FLOAT(_cmp, _src, _dst);
-		break;
-	}
-
-	case FI_DOUBLE_COMPLEX:
-	{
-		double complex *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_COMPLEX(_cmp, _src, _dst);
-		break;
-	}
-
-	case FI_FLOAT_COMPLEX:
-	{
-		float complex *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_COMPLEX(_cmp, _src, _dst);
-		break;
-	}
-
-	case FI_LONG_DOUBLE_COMPLEX:
-	{
-		long double complex *_cmp, *_dst, *_src, _tmp;
-		_cmp = cmp, _src = src, _dst = dst;
-		SOCK_ATOMIC_UPDATE_COMPLEX(_cmp, _src, _dst);
-		break;
-	}
-
-	default:
-		SOCK_LOG_ERROR("Atomic datatype not supported\n");
-		break;
+/*
+ * Provider re-uses compare buffer to return result.  This can be optimized
+ * in the future to have a separate buffer.
+ */
+static void sock_pe_do_atomic(void *cmp, void *dst, void *src,
+			      enum fi_datatype datatype, enum fi_op op,
+			      size_t cnt, int fetch)
+{
+	char tmp_result[SOCK_EP_MAX_ATOMIC_SZ];
+
+	if (op >= OFI_SWAP_OP_START) {
+		ofi_atomic_swap_handlers[op - OFI_SWAP_OP_START][datatype](dst,
+			src, cmp, tmp_result, cnt);
+		memcpy(cmp, tmp_result, ofi_datatype_size(datatype) * cnt);
+	} else if (fetch) {
+		ofi_atomic_readwrite_handlers[op][datatype](dst, src,
+			cmp /*results*/, cnt);
+	} else {
+		ofi_atomic_write_handlers[op][datatype](dst, src, cnt);
 	}
-	return 0;
 }
 
-
-static int sock_pe_process_rx_atomic(struct sock_pe *pe,
-				struct sock_rx_ctx *rx_ctx,
-				struct sock_pe_entry *pe_entry)
+static int sock_pe_recv_atomic_hdrs(struct sock_pe *pe,
+				    struct sock_pe_entry *pe_entry,
+				    size_t *datatype_sz, uint64_t *entry_len)
 {
-	int i, j, ret = 0;
-	size_t datatype_sz;
-	struct sock_mr *mr;
-	uint64_t offset, len, entry_len;
+	uint64_t len;
+	int i;
 
 	if (!pe_entry->pe.rx.atomic_cmp) {
 		pe_entry->pe.rx.atomic_cmp = util_buf_alloc(pe->atomic_rx_pool);
@@ -1164,38 +847,63 @@ static int sock_pe_process_rx_atomic(struct sock_pe *pe,
 	len = sizeof(struct sock_msg_hdr);
 	if (sock_pe_recv_field(pe_entry, &pe_entry->pe.rx.rx_op,
 			       sizeof(struct sock_op), len))
-		return 0;
+		return -FI_EAGAIN;
 	len += sizeof(struct sock_op);
 
 	if (pe_entry->msg_hdr.flags & FI_REMOTE_CQ_DATA) {
 		if (sock_pe_recv_field(pe_entry, &pe_entry->data,
 				       SOCK_CQ_DATA_SIZE, len))
-			return 0;
+			return -FI_EAGAIN;
 		len += SOCK_CQ_DATA_SIZE;
 	}
 
 	/* dst iocs */
-	entry_len = sizeof(union sock_iov) * pe_entry->pe.rx.rx_op.dest_iov_len;
+	*entry_len = sizeof(union sock_iov) * pe_entry->pe.rx.rx_op.dest_iov_len;
 	if (sock_pe_recv_field(pe_entry, &pe_entry->pe.rx.rx_iov[0],
-			       entry_len, len))
-		return 0;
-	len += entry_len;
+			       *entry_len, len))
+		return -FI_EAGAIN;
+	len += *entry_len;
 
-	entry_len = 0;
-	datatype_sz = fi_datatype_size(pe_entry->pe.rx.rx_op.atomic.datatype);
+	*entry_len = 0;
+	*datatype_sz = ofi_datatype_size(pe_entry->pe.rx.rx_op.atomic.datatype);
 	for (i = 0; i < pe_entry->pe.rx.rx_op.dest_iov_len; i++) {
-		entry_len += pe_entry->pe.rx.rx_iov[i].ioc.count;
+		*entry_len += pe_entry->pe.rx.rx_iov[i].ioc.count;
 	}
-	entry_len *= datatype_sz;
+	*entry_len *= *datatype_sz;
 
 	/* cmp data */
 	if (pe_entry->pe.rx.rx_op.atomic.cmp_iov_len) {
 		if (sock_pe_recv_field(pe_entry, pe_entry->pe.rx.atomic_cmp,
-				       entry_len, len))
-			return 0;
-		len += entry_len;
+				       *entry_len, len))
+			return -FI_EAGAIN;
+		len += *entry_len;
 	}
 
+	/* src data */
+	if (pe_entry->pe.rx.rx_op.atomic.op != FI_ATOMIC_READ &&
+	    pe_entry->pe.rx.rx_op.src_iov_len) {
+		if (sock_pe_recv_field(pe_entry, pe_entry->pe.rx.atomic_src,
+				       *entry_len, len))
+			return -FI_EAGAIN;
+		len += *entry_len;
+	}
+
+	return 0;
+}
+
+static int sock_pe_process_rx_atomic(struct sock_pe *pe,
+				struct sock_rx_ctx *rx_ctx,
+				struct sock_pe_entry *pe_entry)
+{
+	int i, ret = 0;
+	size_t datatype_sz;
+	struct sock_mr *mr;
+	uint64_t offset, entry_len;
+
+	ret = sock_pe_recv_atomic_hdrs(pe, pe_entry, &datatype_sz, &entry_len);
+	if (ret)
+		return ret == -FI_EAGAIN ? 0 : ret;
+
 	for (i = 0; i < pe_entry->pe.rx.rx_op.dest_iov_len && !pe_entry->mr_checked; i++) {
 		mr = sock_mr_verify_key(rx_ctx->domain,
 					pe_entry->pe.rx.rx_iov[i].ioc.key,
@@ -1216,14 +924,6 @@ static int sock_pe_process_rx_atomic(struct sock_pe *pe,
 	}
 	pe_entry->mr_checked = 1;
 
-	/* src data */
-	if (pe_entry->pe.rx.rx_op.atomic.op != FI_ATOMIC_READ && pe_entry->pe.rx.rx_op.src_iov_len) {
-		if (sock_pe_recv_field(pe_entry, pe_entry->pe.rx.atomic_src,
-				       entry_len, len))
-			return 0;
-		len += entry_len;
-	}
-
 	if (pe->pe_atomic) {
 		if (pe->pe_atomic != pe_entry)
 			return 0;
@@ -1233,14 +933,14 @@ static int sock_pe_process_rx_atomic(struct sock_pe *pe,
 
 	offset = 0;
 	for (i = 0; i < pe_entry->pe.rx.rx_op.dest_iov_len; i++) {
-		for (j = 0; j < pe_entry->pe.rx.rx_iov[i].ioc.count; j++) {
-			sock_pe_update_atomic(pe_entry->pe.rx.atomic_cmp + offset,
-					      (char *) (uintptr_t) pe_entry->pe.rx.rx_iov[i].ioc.addr + j * datatype_sz,
-					      pe_entry->pe.rx.atomic_src + offset,
-					      pe_entry->pe.rx.rx_op.atomic.datatype,
-					      pe_entry->pe.rx.rx_op.atomic.op);
-			offset += datatype_sz;
-		}
+		sock_pe_do_atomic(pe_entry->pe.rx.atomic_cmp + offset,
+			(char *) (uintptr_t) pe_entry->pe.rx.rx_iov[i].ioc.addr,
+			pe_entry->pe.rx.atomic_src + offset,
+			pe_entry->pe.rx.rx_op.atomic.datatype,
+			pe_entry->pe.rx.rx_op.atomic.op,
+			pe_entry->pe.rx.rx_iov[i].ioc.count,
+			pe_entry->pe.rx.rx_op.atomic.res_iov_len);
+		offset += datatype_sz * pe_entry->pe.rx.rx_iov[i].ioc.count;
 	}
 
 	pe_entry->buf = pe_entry->pe.rx.rx_iov[0].iov.addr;
@@ -1259,6 +959,65 @@ static int sock_pe_process_rx_atomic(struct sock_pe *pe,
 	return ret;
 }
 
+/*
+ * For simplicity, we treat all tagged atomics as buffered.  This would need
+ * to change if we wanted to report back possible error data or handle
+ * atomic fetch operations.
+ */
+static int
+sock_pe_process_rx_tatomic(struct sock_pe *pe, struct sock_rx_ctx *rx_ctx,
+			   struct sock_pe_entry *pe_entry)
+{
+	int ret = 0;
+	size_t datatype_sz;
+	uint64_t entry_len;
+	struct sock_rx_entry *rx_entry;
+
+	ret = sock_pe_recv_atomic_hdrs(pe, pe_entry, &datatype_sz, &entry_len);
+	if (ret)
+		return ret == -FI_EAGAIN ? 0 : ret;
+
+	assert(pe_entry->pe.rx.rx_iov[0].ioc.addr == 0);
+	assert(pe_entry->pe.rx.rx_op.dest_iov_len == 1);
+	assert(pe_entry->pe.rx.rx_op.atomic.cmp_iov_len == 0);
+
+	pe_entry->tag = pe_entry->pe.rx.rx_iov[0].ioc.key;
+	pe_entry->data_len = entry_len;
+
+	fastlock_acquire(&rx_ctx->lock);
+	rx_entry = sock_rx_new_buffered_entry(rx_ctx, entry_len);
+	if (!rx_entry) {
+		fastlock_release(&rx_ctx->lock);
+		return -FI_ENOMEM;
+	}
+
+	rx_entry->rx_op = pe_entry->pe.rx.rx_op;
+	memcpy((void *) (uintptr_t) rx_entry->iov[0].ioc.addr,
+		pe_entry->pe.rx.atomic_src, entry_len);
+	rx_entry->addr = pe_entry->addr;
+	rx_entry->tag = pe_entry->tag;
+	rx_entry->data = pe_entry->data;
+	rx_entry->ignore = 0;
+	rx_entry->comp = pe_entry->comp;
+	rx_entry->is_complete = 1;
+
+	if (pe_entry->msg_hdr.flags & FI_REMOTE_CQ_DATA)
+		rx_entry->flags |= FI_REMOTE_CQ_DATA;
+	rx_entry->flags |= FI_TAGGED | FI_ATOMIC;
+	rx_entry->is_tagged = 1;
+
+	pe_entry->pe.rx.rx_entry = rx_entry;
+
+	sock_pe_progress_buffered_rx(rx_ctx);
+	fastlock_release(&rx_ctx->lock);
+
+	pe_entry->is_complete = 1;
+
+	sock_pe_send_response(pe, rx_ctx, pe_entry, 0,
+			      SOCK_OP_ATOMIC_COMPLETE, 0);
+	return ret;
+}
+
 ssize_t sock_rx_peek_recv(struct sock_rx_ctx *rx_ctx, fi_addr_t addr,
 			  uint64_t tag, uint64_t ignore, void *context,
 			  uint64_t flags, uint8_t is_tagged)
@@ -1294,7 +1053,7 @@ ssize_t sock_rx_peek_recv(struct sock_rx_ctx *rx_ctx, fi_addr_t addr,
 		sock_pe_report_recv_completion(&pe_entry);
 	} else {
 		sock_cq_report_error(rx_ctx->comp.recv_cq, &pe_entry, 0,
-				     FI_ENOMSG, -FI_ENOMSG, NULL);
+				     FI_ENOMSG, -FI_ENOMSG, NULL, 0);
 	}
 	fastlock_release(&rx_ctx->lock);
 	return 0;
@@ -1332,6 +1091,7 @@ ssize_t sock_rx_claim_recv(struct sock_rx_ctx *rx_ctx, void *context,
 		pe_entry.data = rx_buffered->data;
 		pe_entry.context = rx_buffered->context;
 		pe_entry.flags = (flags | FI_MSG | FI_RECV);
+		pe_entry.addr = rx_buffered->addr;
 		if (is_tagged)
 			pe_entry.flags |= FI_TAGGED;
 
@@ -1371,7 +1131,8 @@ static int sock_pe_progress_buffered_rx(struct sock_rx_ctx *rx_ctx)
 	struct dlist_entry *entry;
 	struct sock_pe_entry pe_entry;
 	struct sock_rx_entry *rx_buffered, *rx_posted;
-	size_t i, rem = 0, offset, len, used_len, dst_offset;
+	size_t i, rem = 0, offset, len, used_len, dst_offset, datatype_sz;
+	char *src, *dst;
 
 	if (dlist_empty(&rx_ctx->rx_entry_list) ||
 	    dlist_empty(&rx_ctx->rx_buffered_list))
@@ -1397,6 +1158,8 @@ static int sock_pe_progress_buffered_rx(struct sock_rx_ctx *rx_ctx)
 		SOCK_LOG_DBG("Consuming posted entry: %p, ctx: %p\n",
 			      rx_posted, rx_ctx);
 
+		datatype_sz = (rx_buffered->flags & FI_ATOMIC) ?
+			ofi_datatype_size(rx_buffered->rx_op.atomic.datatype) : 0;
 		offset = 0;
 		rem = rx_buffered->iov[0].iov.len;
 		rx_ctx->buffered_len -= rem;
@@ -1412,8 +1175,21 @@ static int sock_pe_progress_buffered_rx(struct sock_rx_ctx *rx_ctx)
 			dst_offset = used_len;
 			len = MIN(rx_posted->iov[i].iov.len, rem);
 			pe_entry.buf = rx_posted->iov[i].iov.addr + dst_offset;
-			memcpy((char *) (uintptr_t) rx_posted->iov[i].iov.addr + dst_offset,
-			       (char *) (uintptr_t) rx_buffered->iov[0].iov.addr + offset, len);
+
+			src = (char *) (uintptr_t)
+			      rx_buffered->iov[0].iov.addr + offset;
+			dst = (char *) (uintptr_t)
+			      rx_posted->iov[i].iov.addr + dst_offset;
+
+			if (datatype_sz) {
+				int cnt = len / datatype_sz;
+
+				sock_pe_do_atomic(NULL, dst, src,
+					rx_buffered->rx_op.atomic.datatype,
+					rx_buffered->rx_op.atomic.op, cnt, 0);
+			} else {
+				memcpy(dst, src, len);
+			}
 			offset += len;
 			rem -= len;
 			dst_offset = used_len = 0;
@@ -1650,8 +1426,8 @@ static int sock_pe_process_rx_conn_msg(struct sock_pe *pe,
 		fastlock_acquire(&map->lock);
 		conn = sock_ep_lookup_conn(ep_attr, index, addr);
 		if (conn == NULL || conn == SOCK_CM_CONN_IN_PROGRESS) {
-			if (idm_set(&ep_attr->av_idm, index, pe_entry->conn) < 0)
-				SOCK_LOG_ERROR("idm_set failed\n");
+			if (ofi_idm_set(&ep_attr->av_idm, index, pe_entry->conn) < 0)
+				SOCK_LOG_ERROR("ofi_idm_set failed\n");
 		}
 		fastlock_release(&map->lock);
 	}
@@ -1690,7 +1466,10 @@ static int sock_pe_process_recv(struct sock_pe *pe, struct sock_rx_ctx *rx_ctx,
 		ret = sock_pe_process_rx_read(pe, rx_ctx, pe_entry);
 		break;
 	case SOCK_OP_ATOMIC:
-		ret = sock_pe_process_rx_atomic(pe, rx_ctx, pe_entry);
+		if (msg_hdr->flags & FI_TAGGED)
+			ret = sock_pe_process_rx_tatomic(pe, rx_ctx, pe_entry);
+		else
+			ret = sock_pe_process_rx_atomic(pe, rx_ctx, pe_entry);
 		break;
 	case SOCK_OP_SEND_COMPLETE:
 		ret = sock_pe_handle_ack(pe, pe_entry);
@@ -1765,7 +1544,7 @@ static int sock_pe_read_hdr(struct sock_pe *pe, struct sock_rx_ctx *rx_ctx,
 
 	msg_hdr = &pe_entry->msg_hdr;
 	if (sock_pe_peek_hdr(pe, pe_entry))
-		return 0;
+		return -1;
 
 	if (rx_ctx->is_ctrl_ctx && sock_pe_is_data_msg(msg_hdr->op_type))
 		return -1;
@@ -1828,7 +1607,7 @@ static int sock_pe_progress_tx_atomic(struct sock_pe *pe,
 		return 0;
 	len += entry_len;
 
-	datatype_sz = fi_datatype_size(pe_entry->pe.tx.tx_op.atomic.datatype);
+	datatype_sz = ofi_datatype_size(pe_entry->pe.tx.tx_op.atomic.datatype);
 	if (pe_entry->flags & FI_INJECT) {
 		/* cmp data */
 		if (sock_pe_send_field(pe_entry,
@@ -2086,16 +1865,34 @@ static int sock_pe_progress_tx_entry(struct sock_pe *pe,
 				     struct sock_tx_ctx *tx_ctx,
 				     struct sock_pe_entry *pe_entry)
 {
-	int ret;
+	int ret = 0;
 	struct sock_conn *conn = pe_entry->conn;
 
+	if (pe_entry->is_complete)
+		goto out;
+
+	if (sock_comm_is_disconnected(pe_entry)) {
+		SOCK_LOG_DBG("conn disconnected: removing fd from pollset\n");
+		if (pe_entry->ep_attr->cmap.used > 0 &&
+		     pe_entry->conn->sock_fd != -1) {
+			fastlock_acquire(&pe_entry->ep_attr->cmap.lock);
+			sock_ep_remove_conn(pe_entry->ep_attr, pe_entry->conn);
+			fastlock_release(&pe_entry->ep_attr->cmap.lock);
+		}
+
+		sock_pe_report_tx_error(pe_entry, 0, FI_EIO);
+		pe_entry->is_complete = 1;
+
+		goto out;
+	}
+
 	if (!pe_entry->conn || pe_entry->pe.tx.send_done)
-		return 0;
+		goto out;
 
 	if (conn->tx_pe_entry != NULL && conn->tx_pe_entry != pe_entry) {
 		SOCK_LOG_DBG("Cannot progress %p as conn %p is being used by %p\n",
 			      pe_entry, conn, conn->tx_pe_entry);
-		return 0;
+		goto out;
 	}
 
 	if (conn->tx_pe_entry == NULL) {
@@ -2106,13 +1903,13 @@ static int sock_pe_progress_tx_entry(struct sock_pe *pe,
 	if ((pe_entry->flags & FI_FENCE) &&
 	    (tx_ctx->pe_entry_list.next != &pe_entry->ctx_entry)) {
 		SOCK_LOG_DBG("Waiting for FI_FENCE\n");
-		return 0;
+		goto out;
 	}
 
 	if (!pe_entry->pe.tx.header_sent) {
 		if (sock_pe_send_field(pe_entry, &pe_entry->msg_hdr,
 				       sizeof(struct sock_msg_hdr), 0))
-			return 0;
+			goto out;
 		pe_entry->pe.tx.header_sent = 1;
 	}
 
@@ -2139,6 +1936,11 @@ static int sock_pe_progress_tx_entry(struct sock_pe *pe,
 		break;
 	}
 
+out:
+	if (pe_entry->is_complete) {
+		sock_pe_release_entry(pe, pe_entry);
+		SOCK_LOG_DBG("[%p] TX done\n", pe_entry);
+	}
 	return ret;
 }
 
@@ -2150,7 +1952,8 @@ static int sock_pe_progress_rx_pe_entry(struct sock_pe *pe,
 
 	if (sock_comm_is_disconnected(pe_entry)) {
 		SOCK_LOG_DBG("conn disconnected: removing fd from pollset\n");
-		if (pe_entry->conn->sock_fd != -1) {
+		if (pe_entry->ep_attr->cmap.used > 0 &&
+		     pe_entry->conn->sock_fd != -1) {
 			fastlock_acquire(&pe_entry->ep_attr->cmap.lock);
 			sock_ep_remove_conn(pe_entry->ep_attr, pe_entry->conn);
 			fastlock_release(&pe_entry->ep_attr->cmap.lock);
@@ -2201,6 +2004,8 @@ static void sock_pe_new_rx_entry(struct sock_pe *pe, struct sock_rx_ctx *rx_ctx,
 	struct sock_pe_entry *pe_entry;
 
 	pe_entry = sock_pe_acquire_entry(pe);
+	if (!pe_entry)
+		return;
 	memset(&pe_entry->pe.rx, 0, sizeof(pe_entry->pe.rx));
 
 	pe_entry->conn = conn;
@@ -2261,7 +2066,7 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 			&pe_entry->buf, &ep_attr, &pe_entry->conn);
 
 	if (pe_entry->pe.tx.tx_op.op == SOCK_OP_TSEND) {
-		rbread(&tx_ctx->rb, &pe_entry->tag, sizeof(pe_entry->tag));
+		ofi_rbread(&tx_ctx->rb, &pe_entry->tag, sizeof(pe_entry->tag));
 		msg_hdr->msg_len += sizeof(pe_entry->tag);
 	}
 
@@ -2271,7 +2076,7 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 		pe_entry->comp = &tx_ctx->comp;
 
 	if (pe_entry->flags & FI_REMOTE_CQ_DATA) {
-		rbread(&tx_ctx->rb, &pe_entry->data, sizeof(pe_entry->data));
+		ofi_rbread(&tx_ctx->rb, &pe_entry->data, sizeof(pe_entry->data));
 		msg_hdr->msg_len += sizeof(pe_entry->data);
 	}
 
@@ -2280,12 +2085,12 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 	case SOCK_OP_SEND:
 	case SOCK_OP_TSEND:
 		if (pe_entry->flags & FI_INJECT) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
 				 pe_entry->pe.tx.tx_op.src_iov_len);
 			msg_hdr->msg_len += pe_entry->pe.tx.tx_op.src_iov_len;
 		} else {
 			for (i = 0; i < pe_entry->pe.tx.tx_op.src_iov_len; i++) {
-				rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
+				ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
 					 sizeof(pe_entry->pe.tx.tx_iov[i].src));
 				msg_hdr->msg_len += pe_entry->pe.tx.tx_iov[i].src.iov.len;
 			}
@@ -2296,19 +2101,19 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 		break;
 	case SOCK_OP_WRITE:
 		if (pe_entry->flags & FI_INJECT) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
 				 pe_entry->pe.tx.tx_op.src_iov_len);
 			msg_hdr->msg_len += pe_entry->pe.tx.tx_op.src_iov_len;
 		} else {
 			for (i = 0; i < pe_entry->pe.tx.tx_op.src_iov_len; i++) {
-				rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
+				ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
 					 sizeof(pe_entry->pe.tx.tx_iov[i].src));
 				msg_hdr->msg_len += pe_entry->pe.tx.tx_iov[i].src.iov.len;
 			}
 		}
 
 		for (i = 0; i < pe_entry->pe.tx.tx_op.dest_iov_len; i++) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].dst,
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].dst,
 				 sizeof(pe_entry->pe.tx.tx_iov[i].dst));
 		}
 		msg_hdr->msg_len += sizeof(union sock_iov) * i;
@@ -2316,31 +2121,31 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 		break;
 	case SOCK_OP_READ:
 		for (i = 0; i < pe_entry->pe.tx.tx_op.src_iov_len; i++) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
 				 sizeof(pe_entry->pe.tx.tx_iov[i].src));
 		}
 		msg_hdr->msg_len += sizeof(union sock_iov) * i;
 
 		for (i = 0;  i < pe_entry->pe.tx.tx_op.dest_iov_len; i++) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].dst,
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].dst,
 				 sizeof(pe_entry->pe.tx.tx_iov[i].dst));
 		}
 		msg_hdr->dest_iov_len = pe_entry->pe.tx.tx_op.src_iov_len;
 		break;
 	case SOCK_OP_ATOMIC:
 		msg_hdr->msg_len += sizeof(struct sock_op);
-		datatype_sz = fi_datatype_size(pe_entry->pe.tx.tx_op.atomic.datatype);
+		datatype_sz = ofi_datatype_size(pe_entry->pe.tx.tx_op.atomic.datatype);
 		if (pe_entry->flags & FI_INJECT) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
 				 pe_entry->pe.tx.tx_op.src_iov_len);
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0] +
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0] +
 				pe_entry->pe.tx.tx_op.src_iov_len,
 				pe_entry->pe.tx.tx_op.atomic.cmp_iov_len);
 			msg_hdr->msg_len += pe_entry->pe.tx.tx_op.src_iov_len +
 						pe_entry->pe.tx.tx_op.atomic.cmp_iov_len;
 		} else {
 			for (i = 0; i < pe_entry->pe.tx.tx_op.src_iov_len; i++) {
-				rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
+				ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].src,
 					 sizeof(pe_entry->pe.tx.tx_iov[i].src));
 
 				if (pe_entry->pe.tx.tx_op.atomic.op != FI_ATOMIC_READ)
@@ -2348,7 +2153,7 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 						pe_entry->pe.tx.tx_iov[i].src.ioc.count;
 			}
 			for (i = 0; i < pe_entry->pe.tx.tx_op.atomic.cmp_iov_len; i++) {
-				rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].cmp,
+				ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].cmp,
 				 	sizeof(pe_entry->pe.tx.tx_iov[i].cmp));
 				msg_hdr->msg_len += datatype_sz *
 					pe_entry->pe.tx.tx_iov[i].cmp.ioc.count;
@@ -2356,20 +2161,20 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 		}
 
 		for (i = 0; i < pe_entry->pe.tx.tx_op.dest_iov_len; i++) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].dst,
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].dst,
 				 sizeof(pe_entry->pe.tx.tx_iov[i].dst));
 		}
 		msg_hdr->msg_len += sizeof(union sock_iov) * i;
 
 		for (i = 0; i < pe_entry->pe.tx.tx_op.atomic.res_iov_len; i++) {
-			rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].res,
+			ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.tx_iov[i].res,
 				 sizeof(pe_entry->pe.tx.tx_iov[i].res));
 		}
 
 		msg_hdr->dest_iov_len = pe_entry->pe.tx.tx_op.dest_iov_len;
 		break;
 	case SOCK_OP_CONN_MSG:
-		rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
+		ofi_rbread(&tx_ctx->rb, &pe_entry->pe.tx.inject[0],
 			pe_entry->pe.tx.tx_op.src_iov_len);
 		msg_hdr->msg_len += pe_entry->pe.tx.tx_op.src_iov_len;
 		break;
@@ -2396,6 +2201,7 @@ static int sock_pe_new_tx_entry(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 	pe_entry->total_len = msg_hdr->msg_len;
 	msg_hdr->msg_len = htonll(msg_hdr->msg_len);
 	msg_hdr->pe_entry_id = htons(msg_hdr->pe_entry_id);
+
 	return sock_pe_progress_tx_entry(pe, tx_ctx, pe_entry);
 }
 
@@ -2508,9 +2314,9 @@ static int sock_pe_progress_rx_ep(struct sock_pe *pe, struct sock_ep_attr *ep_at
 		if (fd == -1) /* failed to lookup fd due to connection failures */
 			continue;
 
-		conn = idm_lookup(&ep_attr->conn_idm, fd);
+		conn = ofi_idm_lookup(&ep_attr->conn_idm, fd);
 		if (!conn)
-			SOCK_LOG_ERROR("idm_lookup failed\n");
+			SOCK_LOG_ERROR("ofi_idm_lookup failed\n");
 
 		if (!conn || conn->rx_pe_entry)
 			continue;
@@ -2612,18 +2418,13 @@ int sock_pe_progress_tx_ctx(struct sock_pe *pe, struct sock_tx_ctx *tx_ctx)
 			SOCK_LOG_ERROR("Error in progressing %p\n", pe_entry);
 			goto out;
 		}
-
-		if (pe_entry->is_complete) {
-			sock_pe_release_entry(pe, pe_entry);
-			SOCK_LOG_DBG("[%p] TX done\n", pe_entry);
-		}
 	}
 
-	fastlock_acquire(&tx_ctx->rlock);
-	if (!rbempty(&tx_ctx->rb) && !dlist_empty(&pe->free_list)) {
+	fastlock_acquire(&tx_ctx->rb_lock);
+	if (!ofi_rbempty(&tx_ctx->rb) && !dlist_empty(&pe->free_list)) {
 		ret = sock_pe_new_tx_entry(pe, tx_ctx);
 	}
-	fastlock_release(&tx_ctx->rlock);
+	fastlock_release(&tx_ctx->rb_lock);
 	if (ret < 0)
 		goto out;
 
@@ -2641,18 +2442,18 @@ static int sock_pe_wait_ok(struct sock_pe *pe)
 	struct sock_tx_ctx *tx_ctx;
 	struct sock_rx_ctx *rx_ctx;
 
-	if (pe->waittime && ((fi_gettime_ms() - pe->waittime) < sock_pe_waittime))
+	if (pe->waittime && ((fi_gettime_ms() - pe->waittime) < (uint64_t)sock_pe_waittime))
 		return 0;
 
 	if (dlist_empty(&pe->tx_list) && dlist_empty(&pe->rx_list))
-		return 0;
+		return 1;
 
 	if (!dlist_empty(&pe->tx_list)) {
 		for (entry = pe->tx_list.next;
 		     entry != &pe->tx_list; entry = entry->next) {
 			tx_ctx = container_of(entry, struct sock_tx_ctx,
 						pe_entry);
-			if (!rbempty(&tx_ctx->rb) ||
+			if (!ofi_rbempty(&tx_ctx->rb) ||
 			    !dlist_empty(&tx_ctx->pe_entry_list)) {
 				return 0;
 			}
@@ -2818,7 +2619,7 @@ static void sock_pe_init_table(struct sock_pe *pe)
 	for (i = 0; i < SOCK_PE_MAX_ENTRIES; i++) {
 		dlist_insert_head(&pe->pe_table[i].entry, &pe->free_list);
 		pe->pe_table[i].cache_sz = SOCK_PE_COMM_BUFF_SZ;
-		if (rbinit(&pe->pe_table[i].comm_buf, SOCK_PE_COMM_BUFF_SZ))
+		if (ofi_rbinit(&pe->pe_table[i].comm_buf, SOCK_PE_COMM_BUFF_SZ))
 			SOCK_LOG_ERROR("failed to init comm-cache\n");
 	}
 
@@ -2900,7 +2701,7 @@ static void sock_pe_free_util_pool(struct sock_pe *pe)
 	while (!dlist_empty(&pe->pool_list)) {
 		entry = pe->pool_list.next;
 		pe_entry = container_of(entry, struct sock_pe_entry, entry);
-		rbfree(&pe_entry->comm_buf);
+		ofi_rbfree(&pe_entry->comm_buf);
 		dlist_remove(&pe_entry->entry);
 		util_buf_release(pe->pe_rx_pool, pe_entry);
 	}
@@ -2921,7 +2722,7 @@ void sock_pe_finalize(struct sock_pe *pe)
 	}
 
 	for (i = 0; i < SOCK_PE_MAX_ENTRIES; i++) {
-		rbfree(&pe->pe_table[i].comm_buf);
+		ofi_rbfree(&pe->pe_table[i].comm_buf);
 	}
 
 	sock_pe_free_util_pool(pe);
@@ -2932,4 +2733,3 @@ void sock_pe_finalize(struct sock_pe *pe)
 	free(pe);
 	SOCK_LOG_DBG("Progress engine finalize: OK\n");
 }
-
diff --git a/prov/sockets/src/sock_rma.c b/prov/sockets/src/sock_rma.c
index 6234902..3dda35a 100644
--- a/prov/sockets/src/sock_rma.c
+++ b/prov/sockets/src/sock_rma.c
@@ -60,7 +60,8 @@
 ssize_t sock_ep_rma_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 			    uint64_t flags)
 {
-	int ret, i;
+	int ret;
+	size_t i;
 	struct sock_op tx_op;
 	union sock_iov tx_iov;
 	struct sock_conn *conn;
@@ -107,7 +108,7 @@ ssize_t sock_ep_rma_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 		flags |= op_flags;
 
 	if (flags & FI_TRIGGER) {
-		ret = sock_queue_rma_op(ep, msg, flags, SOCK_OP_READ);
+		ret = sock_queue_rma_op(ep, msg, flags, FI_OP_READ);
 		if (ret != 1)
 			return ret;
 	}
@@ -117,7 +118,7 @@ ssize_t sock_ep_rma_readmsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 		(msg->rma_iov_count * sizeof(union sock_iov));
 
 	sock_tx_ctx_start(tx_ctx);
-	if (rbavail(&tx_ctx->rb) < total_len) {
+	if (ofi_rbavail(&tx_ctx->rb) < total_len) {
 		ret = -FI_EAGAIN;
 		goto err;
 	}
@@ -224,7 +225,8 @@ static ssize_t sock_ep_rma_readv(struct fid_ep *ep, const struct iovec *iov,
 ssize_t sock_ep_rma_writemsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 			     uint64_t flags)
 {
-	int ret, i;
+	int ret;
+	size_t i;
 	struct sock_op tx_op;
 	union sock_iov tx_iov;
 	struct sock_conn *conn;
@@ -271,7 +273,7 @@ ssize_t sock_ep_rma_writemsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 		flags |= op_flags;
 
 	if (flags & FI_TRIGGER) {
-		ret = sock_queue_rma_op(ep, msg, flags, SOCK_OP_WRITE);
+		ret = sock_queue_rma_op(ep, msg, flags, FI_OP_WRITE);
 		if (ret != 1)
 			return ret;
 	}
@@ -298,7 +300,7 @@ ssize_t sock_ep_rma_writemsg(struct fid_ep *ep, const struct fi_msg_rma *msg,
 		      (msg->rma_iov_count * sizeof(union sock_iov)));
 
 	sock_tx_ctx_start(tx_ctx);
-	if (rbavail(&tx_ctx->rb) < total_len) {
+	if (ofi_rbavail(&tx_ctx->rb) < total_len) {
 		ret = -FI_EAGAIN;
 		goto err;
 	}
@@ -384,7 +386,7 @@ static ssize_t sock_ep_rma_writev(struct fid_ep *ep, const struct iovec *iov,
 				void **desc, size_t count, fi_addr_t dest_addr,
 				uint64_t addr, uint64_t key, void *context)
 {
-	int i;
+	size_t i;
 	size_t len;
 	struct fi_msg_rma msg;
 	struct fi_rma_iov rma_iov;
diff --git a/prov/sockets/src/sock_rx_entry.c b/prov/sockets/src/sock_rx_entry.c
index b8449ba..7ff4b55 100644
--- a/prov/sockets/src/sock_rx_entry.c
+++ b/prov/sockets/src/sock_rx_entry.c
@@ -51,7 +51,7 @@ struct sock_rx_entry *sock_rx_new_entry(struct sock_rx_ctx *rx_ctx)
 {
 	struct sock_rx_entry *rx_entry;
 	struct slist_entry *entry;
-	int i;
+	size_t i;
 
 	if (rx_ctx->rx_entry_pool == NULL) {
 		rx_ctx->rx_entry_pool = calloc(rx_ctx->attr.size,
@@ -72,7 +72,6 @@ struct sock_rx_entry *sock_rx_new_entry(struct sock_rx_ctx *rx_ctx)
 		entry = slist_remove_head(&rx_ctx->pool_list);
 		rx_entry = container_of(entry, struct sock_rx_entry, pool_entry);
 		rx_entry->rx_ctx = rx_ctx;
-		entry = slist_remove_head(&rx_ctx->pool_list);
 	} else {
 		rx_entry = calloc(1, sizeof(*rx_entry));
 		if (!rx_entry)
@@ -125,8 +124,6 @@ struct sock_rx_entry *sock_rx_new_buffered_entry(struct sock_rx_ctx *rx_ctx,
 
 	rx_ctx->buffered_len += len;
 	dlist_insert_tail(&rx_entry->entry, &rx_ctx->rx_buffered_list);
-	rx_entry->is_busy = 1;
-	rx_entry->is_tagged = 0;
 
 	return rx_entry;
 }
diff --git a/prov/sockets/src/sock_trigger.c b/prov/sockets/src/sock_trigger.c
index 3072425..94d3a76 100644
--- a/prov/sockets/src/sock_trigger.c
+++ b/prov/sockets/src/sock_trigger.c
@@ -44,28 +44,31 @@
 #define SOCK_LOG_ERROR(...) _SOCK_LOG_ERROR(FI_LOG_EP_DATA, __VA_ARGS__)
 
 ssize_t sock_queue_rma_op(struct fid_ep *ep, const struct fi_msg_rma *msg,
-			  uint64_t flags, uint8_t op_type)
+			  uint64_t flags, enum fi_op_type op_type)
 {
 	struct sock_cntr *cntr;
 	struct sock_trigger *trigger;
-	struct fi_triggered_context *trigger_context;
-	struct fi_trigger_threshold *threshold;
+	struct sock_triggered_context *trigger_context;
+	struct sock_trigger_work *work;
 
-	trigger_context = (struct fi_triggered_context *) msg->context;
+	trigger_context = (struct sock_triggered_context *) msg->context;
 	if ((flags & FI_INJECT) || !trigger_context ||
-	     (trigger_context->event_type != FI_TRIGGER_THRESHOLD))
+	    ((trigger_context->event_type != FI_TRIGGER_THRESHOLD) &&
+	     (trigger_context->event_type != SOCK_DEFERRED_WORK)))
 		return -FI_EINVAL;
 
-	threshold = &trigger_context->trigger.threshold;
-	cntr = container_of(threshold->cntr, struct sock_cntr, cntr_fid);
-	if (atomic_get(&cntr->value) >= threshold->threshold)
+	work = &trigger_context->trigger.work;
+	cntr = container_of(work->triggering_cntr, struct sock_cntr, cntr_fid);
+	if (ofi_atomic_get32(&cntr->value) >= (int) work->threshold)
 		return 1;
 
 	trigger = calloc(1, sizeof(*trigger));
 	if (!trigger)
 		return -FI_ENOMEM;
 
-	trigger->threshold = threshold->threshold;
+	trigger->context = trigger_context;
+	trigger->threshold = work->threshold;
+
 	memcpy(&trigger->op.rma.msg, msg, sizeof(*msg));
 	trigger->op.rma.msg.msg_iov = &trigger->op.rma.msg_iov[0];
 	trigger->op.rma.msg.rma_iov = &trigger->op.rma.rma_iov[0];
@@ -87,28 +90,30 @@ ssize_t sock_queue_rma_op(struct fid_ep *ep, const struct fi_msg_rma *msg,
 }
 
 ssize_t sock_queue_msg_op(struct fid_ep *ep, const struct fi_msg *msg,
-			  uint64_t flags, uint8_t op_type)
+			  uint64_t flags, enum fi_op_type op_type)
 {
 	struct sock_cntr *cntr;
 	struct sock_trigger *trigger;
-	struct fi_triggered_context *trigger_context;
-	struct fi_trigger_threshold *threshold;
+	struct sock_triggered_context *trigger_context;
+	struct sock_trigger_work *work;
 
-	trigger_context = (struct fi_triggered_context *) msg->context;
+	trigger_context = (struct sock_triggered_context *) msg->context;
 	if ((flags & FI_INJECT) || !trigger_context ||
-	     (trigger_context->event_type != FI_TRIGGER_THRESHOLD))
+	    ((trigger_context->event_type != FI_TRIGGER_THRESHOLD) &&
+	     (trigger_context->event_type != SOCK_DEFERRED_WORK)))
 		return -FI_EINVAL;
 
-	threshold = &trigger_context->trigger.threshold;
-	cntr = container_of(threshold->cntr, struct sock_cntr, cntr_fid);
-	if (atomic_get(&cntr->value) >= threshold->threshold)
+	work = &trigger_context->trigger.work;
+	cntr = container_of(work->triggering_cntr, struct sock_cntr, cntr_fid);
+	if (ofi_atomic_get32(&cntr->value) >= (int) work->threshold)
 		return 1;
 
 	trigger = calloc(1, sizeof(*trigger));
 	if (!trigger)
 		return -FI_ENOMEM;
 
-	trigger->threshold = threshold->threshold;
+	trigger->context = trigger_context;
+	trigger->threshold = work->threshold;
 
 	memcpy(&trigger->op.msg.msg, msg, sizeof(*msg));
 	trigger->op.msg.msg.msg_iov = &trigger->op.msg.msg_iov[0];
@@ -127,28 +132,30 @@ ssize_t sock_queue_msg_op(struct fid_ep *ep, const struct fi_msg *msg,
 }
 
 ssize_t sock_queue_tmsg_op(struct fid_ep *ep, const struct fi_msg_tagged *msg,
-			   uint64_t flags, uint8_t op_type)
+			   uint64_t flags, enum fi_op_type op_type)
 {
 	struct sock_cntr *cntr;
 	struct sock_trigger *trigger;
-	struct fi_triggered_context *trigger_context;
-	struct fi_trigger_threshold *threshold;
+	struct sock_triggered_context *trigger_context;
+	struct sock_trigger_work *work;
 
-	trigger_context = (struct fi_triggered_context *) msg->context;
+	trigger_context = (struct sock_triggered_context *) msg->context;
 	if ((flags & FI_INJECT) || !trigger_context ||
-	     (trigger_context->event_type != FI_TRIGGER_THRESHOLD))
+	    ((trigger_context->event_type != FI_TRIGGER_THRESHOLD) &&
+	     (trigger_context->event_type != SOCK_DEFERRED_WORK)))
 		return -FI_EINVAL;
 
-	threshold = &trigger_context->trigger.threshold;
-	cntr = container_of(threshold->cntr, struct sock_cntr, cntr_fid);
-	if (atomic_get(&cntr->value) >= threshold->threshold)
+	work = &trigger_context->trigger.work;
+	cntr = container_of(work->triggering_cntr, struct sock_cntr, cntr_fid);
+	if (ofi_atomic_get32(&cntr->value) >= (int) work->threshold)
 		return 1;
 
 	trigger = calloc(1, sizeof(*trigger));
 	if (!trigger)
 		return -FI_ENOMEM;
 
-	trigger->threshold = threshold->threshold;
+	trigger->context = trigger_context;
+	trigger->threshold = work->threshold;
 
 	memcpy(&trigger->op.tmsg.msg, msg, sizeof(*msg));
 	trigger->op.tmsg.msg.msg_iov = &trigger->op.tmsg.msg_iov[0];
@@ -169,28 +176,31 @@ ssize_t sock_queue_tmsg_op(struct fid_ep *ep, const struct fi_msg_tagged *msg,
 ssize_t sock_queue_atomic_op(struct fid_ep *ep, const struct fi_msg_atomic *msg,
 			     const struct fi_ioc *comparev, size_t compare_count,
 			     struct fi_ioc *resultv, size_t result_count,
-			     uint64_t flags, uint8_t op_type)
+			     uint64_t flags, enum fi_op_type op_type)
 {
 	struct sock_cntr *cntr;
 	struct sock_trigger *trigger;
-	struct fi_triggered_context *trigger_context;
-	struct fi_trigger_threshold *threshold;
+	struct sock_triggered_context *trigger_context;
+	struct sock_trigger_work *work;
 
-	trigger_context = (struct fi_triggered_context *) msg->context;
+	trigger_context = (struct sock_triggered_context *) msg->context;
 	if ((flags & FI_INJECT) || !trigger_context ||
-	     (trigger_context->event_type != FI_TRIGGER_THRESHOLD))
+	    ((trigger_context->event_type != FI_TRIGGER_THRESHOLD) &&
+	     (trigger_context->event_type != SOCK_DEFERRED_WORK)))
 		return -FI_EINVAL;
 
-	threshold = &trigger_context->trigger.threshold;
-	cntr = container_of(threshold->cntr, struct sock_cntr, cntr_fid);
-	if (atomic_get(&cntr->value) >= threshold->threshold)
+	work = &trigger_context->trigger.work;
+	cntr = container_of(work->triggering_cntr, struct sock_cntr, cntr_fid);
+	if (ofi_atomic_get32(&cntr->value) >= (int) work->threshold)
 		return 1;
 
 	trigger = calloc(1, sizeof(*trigger));
 	if (!trigger)
 		return -FI_ENOMEM;
 
-	trigger->threshold = threshold->threshold;
+	trigger->context = trigger_context;
+	trigger->threshold = work->threshold;
+
 	memcpy(&trigger->op.atomic.msg, msg, sizeof(*msg));
 	trigger->op.atomic.msg.msg_iov = &trigger->op.atomic.msg_iov[0];
 	trigger->op.atomic.msg.rma_iov = &trigger->op.atomic.rma_iov[0];
@@ -203,11 +213,13 @@ ssize_t sock_queue_atomic_op(struct fid_ep *ep, const struct fi_msg_atomic *msg,
 	if (comparev) {
 		memcpy(&trigger->op.atomic.comparev[0], &comparev[0],
 		       compare_count * sizeof(struct fi_ioc));
+		trigger->op.atomic.compare_count = compare_count;
 	}
 
 	if (resultv) {
 		memcpy(&trigger->op.atomic.resultv[0], &resultv[0],
 		       result_count * sizeof(struct fi_ioc));
+		trigger->op.atomic.result_count = result_count;
 	}
 
 	trigger->op_type = op_type;
@@ -220,3 +232,117 @@ ssize_t sock_queue_atomic_op(struct fid_ep *ep, const struct fi_msg_atomic *msg,
 	sock_cntr_check_trigger_list(cntr);
 	return 0;
 }
+
+ssize_t sock_queue_cntr_op(struct fi_deferred_work *work, uint64_t flags)
+{
+	struct sock_cntr *cntr;
+	struct sock_trigger *trigger;
+
+	cntr = container_of(work->triggering_cntr, struct sock_cntr, cntr_fid);
+	if (ofi_atomic_get32(&cntr->value) >= (int) work->threshold) {
+		if (work->op_type == FI_OP_CNTR_SET)
+			fi_cntr_set(work->op.cntr->cntr, work->op.cntr->value);
+		else
+			fi_cntr_add(work->op.cntr->cntr, work->op.cntr->value);
+		return 0;
+	}
+
+	trigger = calloc(1, sizeof(*trigger));
+	if (!trigger)
+		return -FI_ENOMEM;
+
+	trigger->context = (struct sock_triggered_context *) &work->context;
+	trigger->op_type = work->op_type;
+	trigger->threshold = work->threshold;
+	trigger->flags = flags;
+
+	fastlock_acquire(&cntr->trigger_lock);
+	dlist_insert_tail(&trigger->entry, &cntr->trigger_list);
+	fastlock_release(&cntr->trigger_lock);
+	sock_cntr_check_trigger_list(cntr);
+	return 0;
+}
+
+int sock_queue_work(struct sock_domain *dom, struct fi_deferred_work *work)
+{
+	struct sock_triggered_context *ctx;
+	uint64_t flags = SOCK_NO_COMPLETION | SOCK_TRIGGERED_OP | FI_TRIGGER;
+
+	/* We require the operation's context to point back to the fi_context
+	 * embedded within the deferred work item.  This is an implementation
+	 * limitation, which we may turn into a requirement.  The app must
+	 * keep the fi_deferred_work structure around for the duration of the
+	 * processing anyway.
+	 */
+	ctx = (struct sock_triggered_context *) &work->context;
+	ctx->event_type = SOCK_DEFERRED_WORK;
+	ctx->trigger.work.triggering_cntr = work->triggering_cntr;
+	ctx->trigger.work.threshold = work->threshold;
+	ctx->trigger.work.completion_cntr = work->completion_cntr;
+
+	switch (work->op_type) {
+	case FI_OP_RECV:
+		if (work->op.msg->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_recvmsg(work->op.msg->ep, &work->op.msg->msg,
+				       work->op.msg->flags | flags);
+	case FI_OP_SEND:
+		if (work->op.msg->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_sendmsg(work->op.msg->ep, &work->op.msg->msg,
+				       work->op.msg->flags | flags);
+	case FI_OP_TRECV:
+		if (work->op.tagged->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_trecvmsg(work->op.tagged->ep, &work->op.tagged->msg,
+					  work->op.tagged->flags | flags);
+	case FI_OP_TSEND:
+		if (work->op.tagged->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_tsendmsg(work->op.tagged->ep, &work->op.tagged->msg,
+					  work->op.tagged->flags | flags);
+	case FI_OP_READ:
+		if (work->op.rma->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_rma_readmsg(work->op.rma->ep, &work->op.rma->msg,
+					   work->op.rma->flags | flags);
+	case FI_OP_WRITE:
+		if (work->op.rma->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_rma_writemsg(work->op.rma->ep, &work->op.rma->msg,
+					    work->op.rma->flags | flags);
+	case FI_OP_ATOMIC:
+		if (work->op.atomic->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_tx_atomic(work->op.atomic->ep, &work->op.atomic->msg,
+					 NULL, NULL, 0, NULL, NULL, 0,
+					 work->op.atomic->flags | flags);
+	case FI_OP_FETCH_ATOMIC:
+		if (work->op.fetch_atomic->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_tx_atomic(work->op.fetch_atomic->ep,
+					 &work->op.fetch_atomic->msg,
+					 NULL, NULL, 0,
+					 work->op.fetch_atomic->fetch.msg_iov,
+					 work->op.fetch_atomic->fetch.desc,
+					 work->op.fetch_atomic->fetch.iov_count,
+					 work->op.fetch_atomic->flags | flags);
+	case FI_OP_COMPARE_ATOMIC:
+		if (work->op.compare_atomic->msg.context != &work->context)
+			return -FI_EINVAL;
+		return sock_ep_tx_atomic(work->op.compare_atomic->ep,
+					 &work->op.compare_atomic->msg,
+					 work->op.compare_atomic->compare.msg_iov,
+					 work->op.compare_atomic->compare.desc,
+					 work->op.compare_atomic->compare.iov_count,
+					 work->op.compare_atomic->fetch.msg_iov,
+					 work->op.compare_atomic->fetch.desc,
+					 work->op.compare_atomic->fetch.iov_count,
+					 work->op.compare_atomic->flags | flags);
+	case FI_OP_CNTR_SET:
+	case FI_OP_CNTR_ADD:
+		return sock_queue_cntr_op(work, 0);
+	default:
+		return -FI_ENOSYS;
+	}
+}
diff --git a/prov/sockets/src/sock_wait.c b/prov/sockets/src/sock_wait.c
index d340ced..32e70fc 100644
--- a/prov/sockets/src/sock_wait.c
+++ b/prov/sockets/src/sock_wait.c
@@ -137,7 +137,7 @@ static int sock_wait_wait(struct fid_wait *wait_fid, int timeout)
 			cq = container_of(list_item->fid,
 					  struct sock_cq, cq_fid);
 			sock_cq_progress(cq);
-			if (rbused(&cq->cqerr_rb))
+			if (ofi_rbused(&cq->cqerr_rb))
 				return 1;
 			break;
 
@@ -252,7 +252,7 @@ int sock_wait_close(fid_t fid)
 		ofi_close_socket(wait->wobj.fd[WAIT_WRITE_FD]);
 	}
 
-	atomic_dec(&wait->fab->ref);
+	ofi_atomic_dec32(&wait->fab->ref);
 	free(wait);
 	return 0;
 }
@@ -315,7 +315,7 @@ int sock_wait_open(struct fid_fabric *fabric, struct fi_wait_attr *attr,
 	wait->wait_fid.ops = &sock_wait_ops;
 	wait->fab = fab;
 	wait->type = wait_obj_type;
-	atomic_inc(&fab->ref);
+	ofi_atomic_inc32(&fab->ref);
 	dlist_init(&wait->fid_list);
 
 	*waitset = &wait->wait_fid;
diff --git a/prov/udp/libfabric-udp.spec.in b/prov/udp/libfabric-udp.spec.in
new file mode 100644
index 0000000..9e11096
--- /dev/null
+++ b/prov/udp/libfabric-udp.spec.in
@@ -0,0 +1,52 @@
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+%{!?provider: %define provider usnic}
+%{!?provider_formal: %define provider_formal usNIC}
+
+Name: libfabric-%{provider}
+Version: @VERSION@
+Release: 1%{?dist}
+Summary: Dynamic %{provider_formal} provider for user-space Open Fabric Interfaces
+Group: System Environment/Libraries
+License: GPLv2 or BSD
+Url: http://www.github.com/ofiwg/libfabric
+Source: http://www.github.org/ofiwg/%{name}/releases/download/v{%version}/libfabric-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Requires: libfabric
+BuildRequires: libfabric
+
+%description
+libfabric provides a user-space API to access high-performance fabric
+services, such as RDMA.
+
+This RPM provides the %{provider_formal} provider as a "plugin" to an existing
+libfabric installation.  This plugin will override older %{provider_formal}
+provider functionality in the existing libfabric installation.
+
+%prep
+%setup -q -n libfabric-%{version}
+
+%build
+%configure %{configopts} --enable-%{provider}=dl
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall installdirs
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libfabric/*.so
+
+%exclude %{_libdir}/libfabric.*
+%exclude %{_libdir}/libfabric/*.la
+%exclude %{_libdir}/pkgconfig
+%exclude %{_bindir}
+%exclude %{_mandir}
+%exclude %{_includedir}
+
+%changelog
+* Wed May 24 2017 Open Fabrics Interfaces Working Group <ofiwg at lists.openfabrics.org>
+- First release of specfile for packaging a single dl provider.
diff --git a/prov/udp/src/udpx.h b/prov/udp/src/udpx.h
index 968a931..7b5f334 100644
--- a/prov/udp/src/udpx.h
+++ b/prov/udp/src/udpx.h
@@ -40,6 +40,7 @@
 #include <pthread.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <netinet/ip.h>
 
 #include <rdma/fabric.h>
 #include <rdma/fi_atomic.h>
@@ -54,7 +55,6 @@
 
 #include <fi.h>
 #include <fi_enosys.h>
-#include <fi_indexer.h>
 #include <fi_rbuf.h>
 #include <fi_list.h>
 #include <fi_signal.h>
@@ -65,7 +65,7 @@
 
 
 #define UDPX_MAJOR_VERSION 1
-#define UDPX_MINOR_VERSION 0
+#define UDPX_MINOR_VERSION 1
 
 
 extern struct fi_provider udpx_prov;
@@ -73,7 +73,6 @@ extern struct util_prov udpx_util_prov;
 extern struct fi_info udpx_info;
 
 
-int udpx_check_info(struct fi_info *info);
 int udpx_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 		void *context);
 int udpx_domain_open(struct fid_fabric *fabric, struct fi_info *info,
@@ -93,7 +92,7 @@ struct udpx_ep_entry {
 	uint8_t			resv[sizeof(size_t) - 2];
 };
 
-DECLARE_CIRQUE(struct udpx_ep_entry, udpx_rx_cirq);
+OFI_DECLARE_CIRQUE(struct udpx_ep_entry, udpx_rx_cirq);
 
 struct udpx_ep;
 typedef void (*udpx_rx_comp_func)(struct udpx_ep *ep, void *context,
@@ -107,6 +106,7 @@ struct udpx_ep {
 	struct udpx_rx_cirq	*rxq;    /* protected by rx_cq lock */
 	int			sock;
 	int			is_bound;
+	ofi_atomic32_t		ref;
 };
 
 int udpx_endpoint(struct fid_domain *domain, struct fi_info *info,
@@ -117,4 +117,13 @@ int udpx_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		 struct fid_cq **cq, void *context);
 
 
+struct udpx_mc {
+	struct fid_mc		mc_fid;
+	union {
+		struct sockaddr_in	sin;
+	} addr;
+	struct udpx_ep		*ep;
+};
+
+
 #endif
diff --git a/prov/udp/src/udpx_attr.c b/prov/udp/src/udpx_attr.c
index 4927dfe..029085f 100644
--- a/prov/udp/src/udpx_attr.c
+++ b/prov/udp/src/udpx_attr.c
@@ -34,7 +34,7 @@
 
 
 struct fi_tx_attr udpx_tx_attr = {
-	.caps = FI_MSG | FI_SEND,
+	.caps = FI_MSG | FI_SEND | FI_MULTICAST,
 	.comp_order = FI_ORDER_STRICT,
 	.inject_size = 1472,
 	.size = 1024,
@@ -42,7 +42,7 @@ struct fi_tx_attr udpx_tx_attr = {
 };
 
 struct fi_rx_attr udpx_rx_attr = {
-	.caps = FI_MSG | FI_RECV | FI_SOURCE,
+	.caps = FI_MSG | FI_RECV | FI_SOURCE | FI_MULTICAST,
 	.comp_order = FI_ORDER_STRICT,
 	.total_buffered_recv = (1 << 16),
 	.size = 1024,
@@ -65,7 +65,7 @@ struct fi_domain_attr udpx_domain_attr = {
 	.data_progress = FI_PROGRESS_AUTO,
 	.resource_mgmt = FI_RM_ENABLED,
 	.av_type = FI_AV_UNSPEC,
-	.mr_mode = FI_MR_SCALABLE,
+	.mr_mode = 0,
 	.cq_cnt = 256,
 	.ep_cnt = 256,
 	.tx_ctx_cnt = 256,
@@ -80,8 +80,8 @@ struct fi_fabric_attr udpx_fabric_attr = {
 };
 
 struct fi_info udpx_info = {
-	.caps = FI_MSG | FI_SEND | FI_RECV | FI_SOURCE, /* | FI_MULTI_RECV, */
-	.addr_format = FI_SOCKADDR_IN,
+	.caps = FI_MSG | FI_SEND | FI_RECV | FI_SOURCE | FI_MULTICAST,
+	.addr_format = FI_SOCKADDR,
 	.tx_attr = &udpx_tx_attr,
 	.rx_attr = &udpx_rx_attr,
 	.ep_attr = &udpx_ep_attr,
diff --git a/prov/udp/src/udpx_domain.c b/prov/udp/src/udpx_domain.c
index 69f0cc8..2f51c79 100644
--- a/prov/udp/src/udpx_domain.c
+++ b/prov/udp/src/udpx_domain.c
@@ -46,6 +46,7 @@ static struct fi_ops_domain udpx_domain_ops = {
 	.poll_open = fi_poll_create,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = fi_no_query_atomic,
 };
 
 static int udpx_domain_close(fid_t fid)
@@ -71,10 +72,10 @@ static struct fi_ops udpx_domain_fi_ops = {
 int udpx_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 		struct fid_domain **domain, void *context)
 {
-	int ret;
 	struct util_domain *util_domain;
+	int ret;
 
-	ret = udpx_check_info(info);
+	ret = ofi_prov_check_info(&udpx_util_prov, fabric->api_version, info);
 	if (ret)
 		return ret;
 
diff --git a/prov/udp/src/udpx_ep.c b/prov/udp/src/udpx_ep.c
index 7bb9464..bc09816 100644
--- a/prov/udp/src/udpx_ep.c
+++ b/prov/udp/src/udpx_ep.c
@@ -42,9 +42,13 @@ int udpx_setname(fid_t fid, void *addr, size_t addrlen)
 	int ret;
 
 	ep = container_of(fid, struct udpx_ep, util_ep.ep_fid.fid);
+	FI_DBG(&udpx_prov, FI_LOG_EP_CTRL, "%s\n", ofi_hex_str(addr, addrlen));
 	ret = bind(ep->sock, addr, addrlen);
-	if (ret)
+	if (ret) {
+		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "bind %d (%s)\n",
+			errno, strerror(errno));
 		return -errno;
+	}
 	ep->is_bound = 1;
 	return 0;
 }
@@ -62,6 +66,118 @@ int udpx_getname(fid_t fid, void *addr, size_t *addrlen)
 	return ret ? -errno : 0;
 }
 
+static int udpx_mc_close(struct fid *fid)
+{
+	struct udpx_mc *mc;
+	struct ip_mreq mreq;
+	int ret;
+
+	mc = container_of(fid, struct udpx_mc, mc_fid.fid);
+	mreq.imr_multiaddr = mc->addr.sin.sin_addr;
+	mreq.imr_interface.s_addr = INADDR_ANY;
+	ret = setsockopt(mc->ep->sock, IPPROTO_IP, IP_DROP_MEMBERSHIP,
+			 &mreq, sizeof(mreq));
+	if (ret) {
+		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "leave failed %s\n",
+			strerror(errno));
+		return -errno;
+	}
+
+	ofi_atomic_dec32(&mc->ep->ref);
+	free(mc);
+	return 0;
+}
+
+static struct fi_ops udpx_mc_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = udpx_mc_close,
+	.bind = fi_no_bind,
+	.control = fi_no_control,
+	.ops_open = fi_no_ops_open,
+};
+
+static void udpx_mc_init(struct udpx_ep *ep, struct udpx_mc *mc,
+			 const void *addr, uint64_t flags, void *context)
+{
+	mc->mc_fid.fid.fclass = FI_CLASS_MC;
+	mc->mc_fid.fid.context = context;
+	mc->mc_fid.fid.ops = &udpx_mc_ops;
+	mc->mc_fid.fi_addr = (uintptr_t) &mc->addr;
+
+	memcpy(&mc->addr, addr, ofi_sizeofaddr(addr));
+	mc->ep = ep;
+	ofi_atomic_inc32(&ep->ref);
+}
+
+static int udpx_join_ip(struct udpx_mc *mc, const struct sockaddr_in *sin,
+			uint64_t flags)
+{
+	struct fi_eq_err_entry entry;
+	struct ip_mreq mreq;
+	char str[INET6_ADDRSTRLEN + 8];
+	ssize_t bytes;
+	int ret;
+
+	bytes = sizeof str;
+	FI_INFO(&udpx_prov, FI_LOG_EP_CTRL, "Joining %s\n",
+		ofi_straddr(str, (size_t *) &bytes, FI_SOCKADDR_IN, sin));
+
+	memset(&entry, 0, sizeof entry);
+	entry.fid = &mc->mc_fid.fid;
+	entry.context = mc->mc_fid.fid.context;
+	bytes = sizeof(struct fi_eq_entry);
+
+	if (ofi_recv_allowed(mc->ep->util_ep.caps)) {
+		mreq.imr_multiaddr = sin->sin_addr;
+		mreq.imr_interface.s_addr = INADDR_ANY;
+		ret = setsockopt(mc->ep->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
+				 &mreq, sizeof(mreq));
+		if (ret) {
+			FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "join failed %s\n",
+				strerror(errno));
+			entry.err = -errno;
+			bytes = sizeof(entry);
+		}
+	}
+
+	bytes = fi_eq_write(&mc->ep->util_ep.eq->eq_fid, FI_JOIN_COMPLETE,
+			    &entry, (size_t) bytes, 0);
+	return bytes < 0 ? (int) bytes : 0;
+}
+
+int udpx_join(struct fid_ep *ep, const void *addr, uint64_t flags,
+	      struct fid_mc **mc, void *context)
+{
+	struct udpx_ep *udp_ep;
+	struct udpx_mc *udp_mc;
+	int ret;
+
+	udp_ep = container_of(ep, struct udpx_ep, util_ep.ep_fid);
+	if (!udp_ep->util_ep.eq) {
+		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "no EQ bound to EP\n");
+		return -FI_ENOEQ;
+	}
+
+	if (!udp_ep->is_bound) {
+		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "EP not enabled\n");
+		return -FI_EOPBADSTATE;
+	}
+
+	if (((struct sockaddr *) addr)->sa_family != AF_INET) {
+		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "only ipv4 supported\n");
+		return -FI_ENOSYS;
+	}
+
+	udp_mc = calloc(1, sizeof(*udp_mc));
+	if (!udp_mc)
+		return -FI_ENOMEM;
+
+	udpx_mc_init(udp_ep, udp_mc, addr, flags, context);
+	*mc = &udp_mc->mc_fid;
+	ret = udpx_join_ip(udp_mc, addr, flags);
+	return ret;
+}
+
 static struct fi_ops_cm udpx_cm_ops = {
 	.size = sizeof(struct fi_ops_cm),
 	.setname = udpx_setname,
@@ -72,8 +188,10 @@ static struct fi_ops_cm udpx_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = udpx_join,
 };
 
+
 int udpx_getopt(fid_t fid, int level, int optname,
 		void *optval, size_t *optlen)
 {
@@ -97,17 +215,18 @@ static struct fi_ops_ep udpx_ep_ops = {
 	.tx_size_left = fi_no_tx_size_left,
 };
 
+
 static void udpx_tx_comp(struct udpx_ep *ep, void *context)
 {
 	struct fi_cq_tagged_entry *comp;
 
-	comp = cirque_tail(ep->util_ep.tx_cq->cirq);
+	comp = ofi_cirque_tail(ep->util_ep.tx_cq->cirq);
 	comp->op_context = context;
 	comp->flags = FI_SEND;
 	comp->len = 0;
 	comp->buf = NULL;
 	comp->data = 0;
-	cirque_commit(ep->util_ep.tx_cq->cirq);
+	ofi_cirque_commit(ep->util_ep.tx_cq->cirq);
 }
 
 static void udpx_tx_comp_signal(struct udpx_ep *ep, void *context)
@@ -121,19 +240,19 @@ static void udpx_rx_comp(struct udpx_ep *ep, void *context, uint64_t flags,
 {
 	struct fi_cq_tagged_entry *comp;
 
-	comp = cirque_tail(ep->util_ep.rx_cq->cirq);
+	comp = ofi_cirque_tail(ep->util_ep.rx_cq->cirq);
 	comp->op_context = context;
 	comp->flags = FI_RECV | flags;
 	comp->len = len;
 	comp->buf = buf;
 	comp->data = 0;
-	cirque_commit(ep->util_ep.rx_cq->cirq);
+	ofi_cirque_commit(ep->util_ep.rx_cq->cirq);
 }
 
 static void udpx_rx_src_comp(struct udpx_ep *ep, void *context, uint64_t flags,
 			     size_t len, void *buf, void *addr)
 {
-	ep->util_ep.rx_cq->src[cirque_windex(ep->util_ep.rx_cq->cirq)] =
+	ep->util_ep.rx_cq->src[ofi_cirque_windex(ep->util_ep.rx_cq->cirq)] =
 			ip_av_get_index(ep->util_ep.av, addr);
 	udpx_rx_comp(ep, context, flags, len, buf, addr);
 }
@@ -168,17 +287,17 @@ void udpx_ep_progress(struct util_ep *util_ep)
 	hdr.msg_flags = 0;
 
 	fastlock_acquire(&ep->util_ep.rx_cq->cq_lock);
-	if (cirque_isempty(ep->rxq))
+	if (ofi_cirque_isempty(ep->rxq))
 		goto out;
 
-	entry = cirque_head(ep->rxq);
+	entry = ofi_cirque_head(ep->rxq);
 	hdr.msg_iov = entry->iov;
 	hdr.msg_iovlen = entry->iov_count;
 
 	ret = recvmsg(ep->sock, &hdr, 0);
 	if (ret >= 0) {
 		ep->rx_comp(ep, entry->context, 0, ret, NULL, &addr);
-		cirque_discard(ep->rxq);
+		ofi_cirque_discard(ep->rxq);
 	}
 out:
 	fastlock_release(&ep->util_ep.rx_cq->cq_lock);
@@ -193,12 +312,12 @@ ssize_t udpx_recvmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
 
 	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
 	fastlock_acquire(&ep->util_ep.rx_cq->cq_lock);
-	if (cirque_isfull(ep->rxq)) {
+	if (ofi_cirque_isfull(ep->rxq)) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	entry = cirque_tail(ep->rxq);
+	entry = ofi_cirque_tail(ep->rxq);
 	entry->context = msg->context;
 	for (entry->iov_count = 0; entry->iov_count < msg->iov_count;
 	     entry->iov_count++) {
@@ -206,7 +325,7 @@ ssize_t udpx_recvmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
 	}
 	entry->flags = 0;
 
-	cirque_commit(ep->rxq);
+	ofi_cirque_commit(ep->rxq);
 	ret = 0;
 out:
 	fastlock_release(&ep->util_ep.rx_cq->cq_lock);
@@ -233,41 +352,52 @@ ssize_t udpx_recv(struct fid_ep *ep_fid, void *buf, size_t len, void *desc,
 
 	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
 	fastlock_acquire(&ep->util_ep.rx_cq->cq_lock);
-	if (cirque_isfull(ep->rxq)) {
+	if (ofi_cirque_isfull(ep->rxq)) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	entry = cirque_tail(ep->rxq);
+	entry = ofi_cirque_tail(ep->rxq);
 	entry->context = context;
 	entry->iov_count = 1;
 	entry->iov[0].iov_base = buf;
 	entry->iov[0].iov_len = len;
 	entry->flags = 0;
 
-	cirque_commit(ep->rxq);
+	ofi_cirque_commit(ep->rxq);
 	ret = 0;
 out:
 	fastlock_release(&ep->util_ep.rx_cq->cq_lock);
 	return ret;
 }
 
-ssize_t udpx_send(struct fid_ep *ep_fid, const void *buf, size_t len, void *desc,
-		fi_addr_t dest_addr, void *context)
+static const void *
+udpx_dest_addr(struct udpx_ep *ep, fi_addr_t addr, uint64_t flags)
+{
+	return (flags & FI_MULTICAST) ? (const void *) (uintptr_t) addr :
+					ip_av_get_addr(ep->util_ep.av, addr);
+}
+
+static size_t
+udpx_dest_addrlen(struct udpx_ep *ep, fi_addr_t addr, uint64_t flags)
+{
+	return (flags & FI_MULTICAST) ?
+		ofi_sizeofaddr((const void *) (uintptr_t) addr) :
+		ep->util_ep.av->addrlen;
+}
+
+static ssize_t udpx_sendto(struct udpx_ep *ep, const void *buf, size_t len,
+			   const void *addr, size_t addrlen, void *context)
 {
-	struct udpx_ep *ep;
 	ssize_t ret;
 
-	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
 	fastlock_acquire(&ep->util_ep.tx_cq->cq_lock);
-	if (cirque_isfull(ep->util_ep.tx_cq->cirq)) {
+	if (ofi_cirque_isfull(ep->util_ep.tx_cq->cirq)) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
 
-	ret = sendto(ep->sock, buf, len, 0,
-		     ip_av_get_addr(ep->util_ep.av, dest_addr),
-		     ep->util_ep.av->addrlen);
+	ret = sendto(ep->sock, buf, len, 0, addr, addrlen);
 	if (ret == len) {
 		ep->tx_comp(ep, context);
 		ret = 0;
@@ -279,16 +409,37 @@ out:
 	return ret;
 }
 
-ssize_t udpx_sendmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
-		uint64_t flags)
+static ssize_t udpx_send(struct fid_ep *ep_fid, const void *buf, size_t len,
+			 void *desc, fi_addr_t dest_addr, void *context)
+{
+	struct udpx_ep *ep;
+
+	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
+	return udpx_sendto(ep, buf, len, ip_av_get_addr(ep->util_ep.av, dest_addr),
+			   ep->util_ep.av->addrlen, context);
+}
+
+static ssize_t udpx_send_mc(struct fid_ep *ep_fid, const void *buf, size_t len,
+			    void *desc, fi_addr_t dest_addr, void *context)
+{
+	struct udpx_ep *ep;
+
+	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
+	return udpx_sendto(ep, buf, len, (const void *) (uintptr_t) dest_addr,
+			   ofi_sizeofaddr((const void *) (uintptr_t) dest_addr),
+			   context);
+}
+
+static ssize_t udpx_sendmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
+			    uint64_t flags)
 {
 	struct udpx_ep *ep;
 	struct msghdr hdr;
 	ssize_t ret;
 
 	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
-	hdr.msg_name = ip_av_get_addr(ep->util_ep.av, msg->addr);
-	hdr.msg_namelen = ep->util_ep.av->addrlen;
+	hdr.msg_name = (void *) udpx_dest_addr(ep, msg->addr, flags);
+	hdr.msg_namelen = udpx_dest_addrlen(ep, msg->addr, flags);
 	hdr.msg_iov = (struct iovec *) msg->msg_iov;
 	hdr.msg_iovlen = msg->iov_count;
 	hdr.msg_control = NULL;
@@ -296,7 +447,7 @@ ssize_t udpx_sendmsg(struct fid_ep *ep_fid, const struct fi_msg *msg,
 	hdr.msg_flags = 0;
 
 	fastlock_acquire(&ep->util_ep.tx_cq->cq_lock);
-	if (cirque_isfull(ep->util_ep.tx_cq->cirq)) {
+	if (ofi_cirque_isfull(ep->util_ep.tx_cq->cirq)) {
 		ret = -FI_EAGAIN;
 		goto out;
 	}
@@ -314,7 +465,7 @@ out:
 }
 
 ssize_t udpx_sendv(struct fid_ep *ep_fid, const struct iovec *iov, void **desc,
-		size_t count, fi_addr_t dest_addr, void *context)
+		   size_t count, fi_addr_t dest_addr, void *context)
 {
 	struct fi_msg msg;
 
@@ -326,8 +477,22 @@ ssize_t udpx_sendv(struct fid_ep *ep_fid, const struct iovec *iov, void **desc,
 	return udpx_sendmsg(ep_fid, &msg, 0);
 }
 
-ssize_t udpx_inject(struct fid_ep *ep_fid, const void *buf, size_t len,
-		fi_addr_t dest_addr)
+ssize_t udpx_sendv_mc(struct fid_ep *ep_fid, const struct iovec *iov,
+		      void **desc, size_t count, fi_addr_t dest_addr,
+		      void *context)
+{
+	struct fi_msg msg;
+
+	msg.msg_iov = iov;
+	msg.iov_count = count;
+	msg.addr = dest_addr;
+	msg.context = context;
+
+	return udpx_sendmsg(ep_fid, &msg, FI_MULTICAST);
+}
+
+static ssize_t udpx_inject(struct fid_ep *ep_fid, const void *buf, size_t len,
+			   fi_addr_t dest_addr)
 {
 	struct udpx_ep *ep;
 	ssize_t ret;
@@ -339,6 +504,18 @@ ssize_t udpx_inject(struct fid_ep *ep_fid, const void *buf, size_t len,
 	return ret == len ? 0 : -errno;
 }
 
+static ssize_t udpx_inject_mc(struct fid_ep *ep_fid, const void *buf,
+			      size_t len, fi_addr_t dest_addr)
+{
+	struct udpx_ep *ep;
+	ssize_t ret;
+
+	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
+	ret = sendto(ep->sock, buf, len, 0, (const void *) (uintptr_t) dest_addr,
+		     ofi_sizeofaddr((const void *) (uintptr_t) dest_addr));
+	return ret == len ? 0 : -errno;
+}
+
 static struct fi_ops_msg udpx_msg_ops = {
 	.size = sizeof(struct fi_ops_msg),
 	.recv = udpx_recv,
@@ -352,15 +529,29 @@ static struct fi_ops_msg udpx_msg_ops = {
 	.injectdata = fi_no_msg_injectdata,
 };
 
+static struct fi_ops_msg udpx_msg_mcast_ops = {
+	.size = sizeof(struct fi_ops_msg),
+	.recv = udpx_recv,
+	.recvv = udpx_recvv,
+	.recvmsg = udpx_recvmsg,
+	.send = udpx_send_mc,
+	.sendv = udpx_sendv_mc,
+	.sendmsg = udpx_sendmsg,
+	.inject = udpx_inject_mc,
+	.senddata = fi_no_msg_senddata,
+	.injectdata = fi_no_msg_injectdata,
+};
+
 static int udpx_ep_close(struct fid *fid)
 {
 	struct udpx_ep *ep;
 	struct util_wait_fd *wait;
 
 	ep = container_of(fid, struct udpx_ep, util_ep.ep_fid.fid);
-
-	if (ep->util_ep.av)
-		atomic_dec(&ep->util_ep.av->ref);
+	if (ofi_atomic_get32(&ep->ref)) {
+		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL, "EP busy\n");
+		return -FI_EBUSY;
+	}
 
 	if (ep->util_ep.rx_cq) {
 		if (ep->util_ep.rx_cq->wait) {
@@ -368,54 +559,44 @@ static int udpx_ep_close(struct fid *fid)
 					    struct util_wait_fd, util_wait);
 			fi_epoll_del(wait->epoll_fd, ep->sock);
 		}
-		fid_list_remove(&ep->util_ep.rx_cq->list,
-				&ep->util_ep.rx_cq->list_lock,
+		fid_list_remove(&ep->util_ep.rx_cq->ep_list,
+				&ep->util_ep.rx_cq->ep_list_lock,
 				&ep->util_ep.ep_fid.fid);
-		atomic_dec(&ep->util_ep.rx_cq->ref);
 	}
 
-	if (ep->util_ep.tx_cq)
-		atomic_dec(&ep->util_ep.tx_cq->ref);
-
 	udpx_rx_cirq_free(ep->rxq);
-	close(ep->sock);
-	atomic_dec(&ep->util_ep.domain->ref);
+	ofi_close_socket(ep->sock);
+	ofi_endpoint_close(&ep->util_ep);
 	free(ep);
 	return 0;
 }
 
-static int udpx_ep_bind_cq(struct udpx_ep *ep, struct util_cq *cq, uint64_t flags)
+static int udpx_ep_bind_cq(struct udpx_ep *ep, struct util_cq *cq,
+			   uint64_t flags)
 {
 	struct util_wait_fd *wait;
 	int ret;
 
-	if (flags & ~(FI_TRANSMIT | FI_RECV)) {
-		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL,
-			"unsupported flags\n");
-		return -FI_EBADFLAGS;
-	}
-
-	if (((flags & FI_TRANSMIT) && ep->util_ep.tx_cq) ||
-	    ((flags & FI_RECV) && ep->util_ep.rx_cq)) {
-		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL,
-			"duplicate CQ binding\n");
-		return -FI_EINVAL;
-	}
+	ret = ofi_check_bind_cq_flags(&ep->util_ep, cq, flags);
+	if (ret)
+		return ret;
 
 	if (flags & FI_TRANSMIT) {
 		ep->util_ep.tx_cq = cq;
-		atomic_inc(&cq->ref);
-		ep->tx_comp = cq->wait ? udpx_tx_comp_signal : udpx_tx_comp;
+		ofi_atomic_inc32(&cq->ref);
+		ep->tx_comp = cq->wait ? udpx_tx_comp_signal :
+					 udpx_tx_comp;
 	}
 
 	if (flags & FI_RECV) {
 		ep->util_ep.rx_cq = cq;
-		atomic_inc(&cq->ref);
+		ofi_atomic_inc32(&cq->ref);
 
 		if (cq->wait) {
-			ep->rx_comp = (cq->domain->caps & FI_SOURCE) ?
-				      udpx_rx_src_comp_signal :
-				      udpx_rx_comp_signal;
+			ep->rx_comp =
+				(cq->domain->info_domain_caps & FI_SOURCE) ?
+				udpx_rx_src_comp_signal :
+				udpx_rx_comp_signal;
 
 			wait = container_of(cq->wait,
 					    struct util_wait_fd, util_wait);
@@ -424,12 +605,13 @@ static int udpx_ep_bind_cq(struct udpx_ep *ep, struct util_cq *cq, uint64_t flag
 			if (ret)
 				return ret;
 		} else {
-			ep->rx_comp = (cq->domain->caps & FI_SOURCE) ?
-				      udpx_rx_src_comp : udpx_rx_comp;
+			ep->rx_comp =
+				(cq->domain->info_domain_caps & FI_SOURCE) ?
+				udpx_rx_src_comp : udpx_rx_comp;
 		}
 
-		ret = fid_list_insert(&cq->list,
-				      &cq->list_lock,
+		ret = fid_list_insert(&cq->ep_list,
+				      &cq->ep_list_lock,
 				      &ep->util_ep.ep_fid.fid);
 		if (ret)
 			return ret;
@@ -442,6 +624,7 @@ static int udpx_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
 {
 	struct udpx_ep *ep;
 	struct util_av *av;
+	struct util_eq *eq;
 	int ret;
 
 	ret = ofi_ep_bind_valid(&udpx_prov, bfid, flags);
@@ -451,20 +634,16 @@ static int udpx_ep_bind(struct fid *ep_fid, struct fid *bfid, uint64_t flags)
 	ep = container_of(ep_fid, struct udpx_ep, util_ep.ep_fid.fid);
 	switch (bfid->fclass) {
 	case FI_CLASS_AV:
-		if (ep->util_ep.av) {
-			FI_WARN(&udpx_prov, FI_LOG_EP_CTRL,
-				"duplicate AV binding\n");
-			return -FI_EINVAL;
-		}
 		av = container_of(bfid, struct util_av, av_fid.fid);
-		atomic_inc(&av->ref);
-		ep->util_ep.av = av;
+		ret = ofi_ep_bind_av(&ep->util_ep, av);
 		break;
 	case FI_CLASS_CQ:
 		ret = udpx_ep_bind_cq(ep, container_of(bfid, struct util_cq,
 							cq_fid.fid), flags);
 		break;
 	case FI_CLASS_EQ:
+		eq = container_of(bfid, struct util_eq, eq_fid.fid);
+		ret = ofi_ep_bind_eq(&ep->util_ep, eq);
 		break;
 	default:
 		FI_WARN(&udpx_prov, FI_LOG_EP_CTRL,
@@ -534,6 +713,7 @@ static int udpx_ep_init(struct udpx_ep *ep, struct fi_info *info)
 	int family;
 	int ret;
 
+	ofi_atomic_initialize32(&ep->ref, 0);
 	ep->rxq = udpx_rx_cirq_create(info->rx_attr->size);
 	if (!ep->rxq) {
 		ret = -FI_ENOMEM;
@@ -549,11 +729,10 @@ static int udpx_ep_init(struct udpx_ep *ep, struct fi_info *info)
 	}
 
 	if (info->src_addr) {
-		ret = bind(ep->sock, info->src_addr, info->src_addrlen);
-		if (ret) {
-			ret = -errno;
+		ret = udpx_setname(&ep->util_ep.ep_fid.fid, info->src_addr,
+				   info->src_addrlen);
+		if (ret)
 			goto err1;
-		}
 	}
 
 	ret = fi_fd_nonblock(ep->sock);
@@ -562,7 +741,7 @@ static int udpx_ep_init(struct udpx_ep *ep, struct fi_info *info)
 
 	return 0;
 err2:
-	close(ep->sock);
+	ofi_close_socket(ep->sock);
 err1:
 	udpx_rx_cirq_free(ep->rxq);
 	return ret;
@@ -574,34 +753,30 @@ int udpx_endpoint(struct fid_domain *domain, struct fi_info *info,
 	struct udpx_ep *ep;
 	int ret;
 
-	if (!info || !info->ep_attr || !info->rx_attr || !info->tx_attr)
-		return -FI_EINVAL;
-
-	ret = udpx_check_info(info);
-	if (ret)
-		return ret;
-
 	ep = calloc(1, sizeof(*ep));
 	if (!ep)
 		return -FI_ENOMEM;
 
+	ret = ofi_endpoint_init(domain, &udpx_util_prov, info, &ep->util_ep,
+				context, udpx_ep_progress);
+	if (ret)
+		goto err;
+
 	ret = udpx_ep_init(ep, info);
 	if (ret) {
 		free(ep);
 		return ret;
 	}
 
-	ep->util_ep.ep_fid.fid.fclass = FI_CLASS_EP;
-	ep->util_ep.ep_fid.fid.context = context;
-	ep->util_ep.ep_fid.fid.ops = &udpx_ep_fi_ops;
-	ep->util_ep.ep_fid.ops = &udpx_ep_ops;
-	ep->util_ep.ep_fid.cm = &udpx_cm_ops;
-	ep->util_ep.ep_fid.msg = &udpx_msg_ops;
-	ep->util_ep.progress = udpx_ep_progress;
-
-	ep->util_ep.domain = container_of(domain, struct util_domain, domain_fid);
-	atomic_inc(&ep->util_ep.domain->ref);
-
 	*ep_fid = &ep->util_ep.ep_fid;
+	(*ep_fid)->fid.ops = &udpx_ep_fi_ops;
+	(*ep_fid)->ops = &udpx_ep_ops;
+	(*ep_fid)->cm = &udpx_cm_ops;
+	(*ep_fid)->msg = (info->tx_attr->op_flags & FI_MULTICAST) ?
+			 &udpx_msg_mcast_ops : &udpx_msg_ops;
+
 	return 0;
+err:
+	free(ep);
+	return ret;
 }
diff --git a/prov/udp/src/udpx_fabric.c b/prov/udp/src/udpx_fabric.c
index 908510c..716a6c0 100644
--- a/prov/udp/src/udpx_fabric.c
+++ b/prov/udp/src/udpx_fabric.c
@@ -76,7 +76,7 @@ int udpx_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 		return -FI_ENOMEM;
 
 	ret = ofi_fabric_init(&udpx_prov, udpx_info.fabric_attr, attr,
-			     util_fabric, context, FI_MATCH_EXACT);
+			      util_fabric, context);
 	if (ret)
 		return ret;
 
diff --git a/prov/udp/src/udpx_init.c b/prov/udp/src/udpx_init.c
index 2c1b0b1..637d3a9 100644
--- a/prov/udp/src/udpx_init.c
+++ b/prov/udp/src/udpx_init.c
@@ -44,15 +44,16 @@
 static void udpx_getinfo_ifs(struct fi_info **info)
 {
 	struct ifaddrs *ifaddrs, *ifa;
-	struct fi_info *head, *tail, *cur;
+	struct fi_info *head, *tail, *cur, *loopback;
 	size_t addrlen;
+	uint32_t addr_format;
 	int ret;
 
 	ret = getifaddrs(&ifaddrs);
 	if (ret)
 		return;
 
-	head = tail = NULL;
+	head = tail = loopback = NULL;
 	for (ifa = ifaddrs; ifa != NULL; ifa = ifa->ifa_next) {
 		if (ifa->ifa_addr == NULL || !(ifa->ifa_flags & IFF_UP))
 			continue;
@@ -60,9 +61,11 @@ static void udpx_getinfo_ifs(struct fi_info **info)
 		switch (ifa->ifa_addr->sa_family) {
 		case AF_INET:
 			addrlen = sizeof(struct sockaddr_in);
+			addr_format = FI_SOCKADDR_IN;
 			break;
 		case AF_INET6:
 			addrlen = sizeof(struct sockaddr_in6);
+			addr_format = FI_SOCKADDR_IN6;
 			break;
 		default:
 			continue;
@@ -72,18 +75,34 @@ static void udpx_getinfo_ifs(struct fi_info **info)
 		if (!cur)
 			break;
 
-		if (!head)
-			head = cur;
-		else
-			tail->next = cur;
-		tail = cur;
+		if(!ofi_is_loopback_addr(ifa->ifa_addr)) {
+			if (!head)
+				head = cur;
+			else
+				tail->next = cur;
+			tail = cur;
+		} else {
+			cur->next = loopback;
+			loopback = cur;
+		}
 
-		if ((cur->src_addr = mem_dup(ifa->ifa_addr, addrlen)))
+		if ((cur->src_addr = mem_dup(ifa->ifa_addr, addrlen))) {
 			cur->src_addrlen = addrlen;
+			cur->addr_format = addr_format;
+		}
 	}
 	freeifaddrs(ifaddrs);
 
-	if (head) {
+	if (head || loopback) {
+		if(!head) { /* loopback interface only? */
+			head = loopback;
+		} else {
+			/* append loopback interfaces to tail */
+			assert(tail);
+			assert(!tail->next);
+			tail->next = loopback;
+		}
+
 		fi_freeinfo(*info);
 		*info = head;
 	}
@@ -92,11 +111,6 @@ static void udpx_getinfo_ifs(struct fi_info **info)
 #define udpx_getinfo_ifs(info) do{}while(0)
 #endif
 
-int udpx_check_info(struct fi_info *info)
-{
-	return fi_check_info(&udpx_util_prov, info, FI_MATCH_EXACT);
-}
-
 static int udpx_getinfo(uint32_t version, const char *node, const char *service,
 			uint64_t flags, struct fi_info *hints, struct fi_info **info)
 {
@@ -121,7 +135,7 @@ static void udpx_fini(void)
 struct fi_provider udpx_prov = {
 	.name = "UDP",
 	.version = FI_VERSION(UDPX_MAJOR_VERSION, UDPX_MINOR_VERSION),
-	.fi_version = FI_VERSION(1, 3),
+	.fi_version = FI_VERSION(1, 5),
 	.getinfo = udpx_getinfo,
 	.fabric = udpx_fabric,
 	.cleanup = udpx_fini
diff --git a/prov/usnic/Makefile.include b/prov/usnic/Makefile.include
index ab2c06f..eb49540 100644
--- a/prov/usnic/Makefile.include
+++ b/prov/usnic/Makefile.include
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+# Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
 #
 # This software is available to you under a choice of one of two
 # licenses.  You may choose to be licensed under the terms of the GNU
@@ -135,7 +135,7 @@ _usnic_files = \
 	prov/usnic/src/usdf_wait.h \
 	prov/usnic/src/usdf_wait.c
 
-if HAVE_VERBS
+if USNIC_BUILD_FAKE_VERBS_DRIVER
 _usnic_files += prov/usnic/src/usdf_fake_ibv.c
 endif
 
diff --git a/prov/usnic/configure.m4 b/prov/usnic/configure.m4
index 0542788..7b98e22 100644
--- a/prov/usnic/configure.m4
+++ b/prov/usnic/configure.m4
@@ -1,5 +1,5 @@
 dnl
-dnl Copyright (c) 2015-2016, Cisco Systems, Inc. All rights reserved.
+dnl Copyright (c) 2015-2017, Cisco Systems, Inc. All rights reserved.
 dnl
 dnl This software is available to you under a choice of one of two
 dnl licenses.  You may choose to be licensed under the terms of the GNU
@@ -101,11 +101,17 @@ dnl
 AC_DEFUN([FI_USNIC_CONFIGURE],[
     # Determine if we can support the usnic provider
     usnic_happy=0
+    usnic_build_fake_driver=0
     AS_IF([test "x$enable_usnic" != "xno"],
 	  [AC_CHECK_HEADER([infiniband/verbs.h], [usnic_happy=1])
 	   AS_IF([test $usnic_happy -eq 1],
-	       [USNIC_CHECK_LIBNL_SADNESS])
+	       [USNIC_CHECK_IF_NEED_FAKE_USNIC
+	        USNIC_CHECK_LIBNL_SADNESS])
 	  ])
+
+    # AM_CONDITIONALs must always be defined
+    AM_CONDITIONAL([USNIC_BUILD_FAKE_VERBS_DRIVER],
+	[test $usnic_build_fake_driver -eq 1])
 ])
 
 dnl
@@ -138,6 +144,39 @@ AC_DEFUN([USNIC_PARSE_WITH],[
 ])
 
 dnl
+dnl Check for ibv_register_driver
+dnl
+dnl If libibverbs is available and is old enough, we need to install a
+dnl "fake" usnic verbs driver to keep it from complaining to stderr
+dnl that there is no usnic verbs provider.  Newer versions of
+dnl libibverbs won't complain.  If we can detect a new-enough
+dnl libibverbs, don't bother to compile the fake usnic verbs driver.
+dnl
+dnl Per
+dnl https://github.com/ofiwg/libfabric/pull/2684#issuecomment-276462368,
+dnl the logic boils down to:
+dnl
+dnl Compile the fake usnic verbs provider if <infiniband/driver.h>
+dnl exists and do not contain a prototype for verbs_register_driver().
+dnl
+AC_DEFUN([USNIC_CHECK_IF_NEED_FAKE_USNIC],[
+	AC_CHECK_HEADER([infiniband/driver.h],
+		[AC_CHECK_DECL([verbs_register_driver],
+			[],
+			[usnic_build_fake_driver=1],
+			[#include <infiniband/driver.h>
+			])])
+
+	AC_MSG_CHECKING([if building usnic fake verbs driver])
+	AS_IF([test $usnic_build_fake_driver -eq 1],
+		[AC_MSG_RESULT([yes])],
+		[AC_MSG_RESULT([no])])
+	AC_DEFINE_UNQUOTED([USNIC_BUILD_FAKE_VERBS_DRIVER],
+		[$usnic_build_fake_driver],
+		[Whether to build the fake usNIC verbs provider or not])
+])
+
+dnl
 dnl Shared macro
 dnl
 AC_DEFUN([USNIC_CHECK_LIBNL_SADNESS],[
@@ -179,20 +218,13 @@ AC_DEFUN([USNIC_CHECK_LIBNL_SADNESS],[
 	usnic_LDFLAGS=$usnic_nl_LDFLAGS
 	usnic_LIBS=$usnic_nl_LIBS
 
-	# If the verbs or usnic providers are being built as a DL,
-	# then we need to add libibverbs to usnic_LIBS.  We can tell
-	# if verbs/usnic are being built as DL because fi_provider.m4
-	# will set $PROVIDER_dl to 1.  Also, per note in configure.ac,
-	# the verbs provider *must* be configured before the usnic
-	# provider explicitly for this case: so that $verbs_dl will be
-	# (potentially) set by the time we get here.
-
-	# NOTE: this decision whether to -libverbs or not used to be
-	# handled in Makefile.am via an AM_CONDITIONAL.  However, to
-	# properly support pkg-config, we have to make this decision
-	# here/now and AC SUBST the final result into usnic_LIBS.
-	AS_IF([test "$verbs_dl" = "1" || test "$usnic_dl" = "1"],
-	      [usnic_LIBS="$usnic_LIBS -libverbs"])
+	# If we're building the usNIC fake verbs provider, we need to
+	# -libverbs, so put it in usnic_LIBS (so that it will also get
+	# properly substituted into the pkg-config data files).
+	usnic_verbs_lib=
+	AS_IF([test $usnic_build_fake_driver -eq 1],
+	      [usnic_verbs_lib="-libverbs"])
+	usnic_LIBS="$usnic_LIBS $usnic_verbs_lib"
 
 	AC_SUBST([usnic_CPPFLAGS])
 	AC_SUBST([usnic_LDFLAGS])
diff --git a/prov/usnic/libfabric-usnic.spec.in b/prov/usnic/libfabric-usnic.spec.in
new file mode 100644
index 0000000..0deada8
--- /dev/null
+++ b/prov/usnic/libfabric-usnic.spec.in
@@ -0,0 +1,52 @@
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+%{!?provider: %define provider usnic}
+%{!?provider_formal: %define provider_formal usNIC}
+
+Name: libfabric-%{provider}
+Version: @VERSION@
+Release: 1%{?dist}
+Summary: Dynamic %{provider_formal} provider for user-space RDMA Fabric Interfaces
+Group: System Environment/Libraries
+License: GPLv2 or BSD
+Url: http://www.github.com/ofiwg/libfabric
+Source: http://www.github.org/ofiwg/%{name}/releases/download/v{%version}/libfabric-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Requires: libfabric
+BuildRequires: libfabric
+
+%description
+libfabric provides a user-space API to access high-performance fabric
+services, such as RDMA.
+
+This RPM provides the %{provider_formal} provider as a "plugin" to an existing
+Libfabric installation.  This plugin will override any existing %{provider_formal}
+provider functionality in the existing Libfabric installation.
+
+%prep
+%setup -q -n libfabric-%{version}
+
+%build
+%configure %{configopts} --enable-%{provider}=dl
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall installdirs
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libfabric/*.so
+
+%exclude %{_libdir}/libfabric.*
+%exclude %{_libdir}/libfabric/*.la
+%exclude %{_libdir}/pkgconfig
+%exclude %{_bindir}
+%exclude %{_mandir}
+%exclude %{_includedir}
+
+%changelog
+* Wed May 24 2017 Open Fabrics Interfaces Working Group <ofiwg at lists.openfabrics.org>
+- First release of specfile for packaging a single dl provider.
diff --git a/prov/usnic/src/usdf.h b/prov/usnic/src/usdf.h
index 374c1fa..6a3437d 100644
--- a/prov/usnic/src/usdf.h
+++ b/prov/usnic/src/usdf.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -76,6 +76,13 @@ extern struct fi_provider usdf_ops;
 #define USDF_EVENT_FLAG_ERROR (1ULL << 62)
 #define USDF_EVENT_FLAG_FREE_BUF (1ULL << 63)
 
+/* usdf domain capability: no loopback */
+#define USDF_DOM_CAPS (FI_REMOTE_COMM)
+
+#define USDF_MR_IOV_LIMIT 1
+#define USDF_MR_CNT (65535)
+#define USDF_ADDR_STR_LEN (INET6_ADDRSTRLEN+8)
+
 /*
  *  TAILQ stuff that should exist
  */
@@ -106,8 +113,8 @@ struct usdf_fabric {
 	struct fi_fabric_attr fab_attr;
 	struct usd_device_attrs *fab_dev_attrs;
 	int fab_arp_sockfd;
-	atomic_t fab_refcnt;
-	atomic_t num_blocked_waiting;
+	ofi_atomic32_t fab_refcnt;
+	ofi_atomic32_t num_blocked_waiting;
 	LIST_HEAD(,usdf_domain) fab_domain_list;
 
 	/* progression */
@@ -132,7 +139,7 @@ struct usdf_domain {
 	struct fid_domain   dom_fid;
 	struct usdf_fabric *dom_fabric;
 	struct fi_info *dom_info;
-	atomic_t dom_refcnt;
+	ofi_atomic32_t dom_refcnt;
 	struct usdf_eq *dom_eq;
 	struct usd_device   *dom_dev;
 
@@ -142,7 +149,7 @@ struct usdf_domain {
 
 	struct usdf_rdm_connection **dom_rdc_hashtab;
 	SLIST_HEAD(,usdf_rdm_connection) dom_rdc_free;
-	atomic_t dom_rdc_free_cnt;
+	ofi_atomic32_t dom_rdc_free_cnt;
 	size_t dom_rdc_total;
 
 	/* used only by connected endpoints */
@@ -167,11 +174,14 @@ enum usdf_pep_state {
 
 struct usdf_pep {
 	struct fid_pep pep_fid;
-	atomic_t pep_refcnt;
+	ofi_atomic32_t pep_refcnt;
 	struct usdf_fabric *pep_fabric;
 	struct usdf_eq *pep_eq;
 	int pep_sock;
-	struct sockaddr_in pep_src_addr;
+	union {
+		struct sockaddr_in sin;
+		char addr_str[USDF_ADDR_STR_LEN];
+	} pep_src_addr;
 	enum usdf_pep_state pep_state;
 	struct usdf_poll_item pep_pollitem;
 	struct fi_info *pep_info;
@@ -190,7 +200,7 @@ struct usdf_pep {
 
 struct usdf_tx {
 	struct fid_stx tx_fid;
-	atomic_t tx_refcnt;
+	ofi_atomic32_t tx_refcnt;
 	struct usdf_domain *tx_domain;
 	TAILQ_ENTRY(usdf_tx) tx_link;
 
@@ -212,7 +222,7 @@ struct usdf_tx {
 		struct {
 			struct usdf_cq_hard *tx_hcq;
 
-			atomic_t tx_next_msg_id;
+			ofi_atomic32_t tx_next_msg_id;
 			struct usdf_rdm_qe *tx_wqe_buf;
 			uint8_t *tx_inject_bufs;
 			TAILQ_HEAD(,usdf_rdm_qe) tx_free_wqe;
@@ -229,7 +239,7 @@ struct usdf_tx {
 
 struct usdf_rx {
 	struct fid_ep rx_fid;
-	atomic_t rx_refcnt;
+	ofi_atomic32_t rx_refcnt;
 	struct usdf_domain *rx_domain;
 
 	struct fi_rx_attr rx_attr;
@@ -270,7 +280,7 @@ enum {
 struct usdf_ep {
 	struct fid_ep ep_fid;
 	struct usdf_domain *ep_domain;
-	atomic_t ep_refcnt;
+	ofi_atomic32_t ep_refcnt;
 	uint64_t ep_caps;
 	uint64_t ep_mode;
 
@@ -359,7 +369,7 @@ struct usdf_mr {
 struct usdf_cq_hard {
 	struct usdf_cq *cqh_cq;
 	struct usd_cq *cqh_ucq;
-	atomic_t cqh_refcnt;
+	ofi_atomic32_t cqh_refcnt;
 	void (*cqh_progress)(struct usdf_cq_hard *hcq);
 	void (*cqh_post)(struct usdf_cq_hard *hcq, void *context, size_t len,
 			int prov_errno, uint64_t flags);
@@ -378,7 +388,7 @@ struct usdf_cq_soft_entry {
 
 struct usdf_cq {
 	struct fid_cq cq_fid;
-	atomic_t cq_refcnt;
+	ofi_atomic32_t cq_refcnt;
 	struct usdf_domain *cq_domain;
 	struct fi_cq_attr cq_attr;
 	uint8_t cq_is_soft;
@@ -432,7 +442,7 @@ struct usdf_event {
 struct usdf_eq {
 	struct fid_eq eq_fid;
 	struct usdf_fabric *eq_fabric;
-	atomic_t eq_refcnt;
+	ofi_atomic32_t eq_refcnt;
 
 	pthread_spinlock_t eq_lock;
 
@@ -442,7 +452,7 @@ struct usdf_eq {
 	struct usdf_event *eq_ev_tail;
 	struct usdf_event *eq_ev_end;
 	int eq_ev_ring_size;
-	atomic_t eq_num_events;
+	ofi_atomic32_t eq_num_events;
 
 	/* various ways to wait */
 	struct fi_eq_attr eq_attr;
@@ -479,6 +489,8 @@ int usdf_endpoint_open(struct fid_domain *domain, struct fi_info *info,
 		struct fid_ep **ep, void *context);
 int usdf_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 		 struct fid_av **av_o, void *context);
+int usdf_query_atomic(struct fid_domain *domain, enum fi_datatype datatype,
+		enum fi_op op, struct fi_atomic_attr *attr, uint64_t flags);
 
 /* Domain name functionality */
 int usdf_domain_getname(uint32_t version, struct usd_device_attrs *dap,
@@ -488,8 +500,14 @@ bool usdf_domain_checkname(uint32_t version, struct usd_device_attrs *dap,
 
 /* fi_ops_mr */
 int usdf_reg_mr(struct fid *fid, const void *buf, size_t len,
-	uint64_t access, uint64_t offset, uint64_t requested_key,
-	uint64_t flags, struct fid_mr **mr_o, void *context);
+		uint64_t access, uint64_t offset, uint64_t requested_key,
+		uint64_t flags, struct fid_mr **mr_o, void *context);
+int usdf_regv_mr(struct fid *fid, const struct iovec *iov,
+		 size_t count, uint64_t access,
+		 uint64_t offset, uint64_t requested_key,
+		 uint64_t flags, struct fid_mr **mr, void *context);
+int usdf_regattr(struct fid *fid, const struct fi_mr_attr *attr,
+		 uint64_t flags, struct fid_mr **mr);
 
 /* Fake IBV provider */
 void usdf_setup_fake_ibv_provider(void);
@@ -497,4 +515,15 @@ void usdf_setup_fake_ibv_provider(void);
 /* passive endpoint functions */
 int usdf_pep_steal_socket(struct usdf_pep *pep, int *is_bound, int *sock_o);
 
+/* Utility functions */
+int usdf_catch_dom_attr(uint32_t version, struct fi_info *hints,
+			struct fi_domain_attr *dom_attr);
+int usdf_catch_tx_attr(uint32_t version, struct fi_tx_attr *tx_attr);
+int usdf_catch_rx_attr(uint32_t version, struct fi_rx_attr *rx_attr);
+int usdf_check_mr_mode(uint32_t version, struct fi_info *hints,
+		       uint64_t prov_mode);
+struct sockaddr_in *usdf_format_to_sin(struct fi_info *info, const void *addr);
+void *usdf_sin_to_format(struct fi_info *info, void *addr, size_t *len);
+void usdf_free_sin_if_needed(struct fi_info *info, struct sockaddr_in *sin);
+
 #endif /* _USDF_H_ */
diff --git a/prov/usnic/src/usdf_av.c b/prov/usnic/src/usdf_av.c
index 0231e43..adf4eb6 100644
--- a/prov/usnic/src/usdf_av.c
+++ b/prov/usnic/src/usdf_av.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -63,6 +63,7 @@
 
 #include "usdf.h"
 #include "usdf_av.h"
+#include "usdf_cm.h"
 #include "usdf_timer.h"
 #include "usdf_rdm.h"
 
@@ -110,9 +111,9 @@ static int usdf_av_close_(struct usdf_av *av)
 	pthread_spin_lock(&av->av_lock);
 
 	if (av->av_eq)
-		atomic_dec(&av->av_eq->eq_refcnt);
+		ofi_atomic_dec32(&av->av_eq->eq_refcnt);
 
-	atomic_dec(&av->av_domain->dom_refcnt);
+	ofi_atomic_dec32(&av->av_domain->dom_refcnt);
 
 	while (!LIST_EMPTY(&av->av_addresses)) {
 		entry = LIST_FIRST(&av->av_addresses);
@@ -135,16 +136,16 @@ static int usdf_av_close(struct fid *fid)
 	USDF_TRACE_SYS(AV, "\n");
 
 	av = container_of(fid, struct usdf_av, av_fid.fid);
-	if (atomic_get(&av->av_refcnt) > 0)
+	if (ofi_atomic_get32(&av->av_refcnt) > 0)
 		return -FI_EBUSY;
 
-	pending = atomic_get(&av->av_active_inserts);
+	pending = ofi_atomic_get32(&av->av_active_inserts);
 	assert(pending >= 0);
 
 	if (pending) {
 		USDF_DBG_SYS(AV, "%d pending inserts, defer closing\n",
 			     pending);
-		atomic_set(&av->av_closing, 1);
+		ofi_atomic_set32(&av->av_closing, 1);
 	} else {
 		usdf_av_close_(av);
 	}
@@ -170,11 +171,11 @@ usdf_av_insert_async_complete(struct usdf_av_insert *insert)
 
 	usdf_timer_free(av->av_domain->dom_fabric, insert->avi_timer);
 
-	pending = atomic_dec(&av->av_active_inserts);
+	pending = ofi_atomic_dec32(&av->av_active_inserts);
 	USDF_DBG_SYS(AV, "new active insert value: %d\n", pending);
 	assert(pending >= 0);
 
-	closing = atomic_get(&av->av_closing);
+	closing = ofi_atomic_get32(&av->av_closing);
 
 	if (!pending && closing)
 		usdf_av_close_(av);
@@ -300,30 +301,36 @@ usdf_am_insert_async(struct fid_av *fav, const void *addr, size_t count,
 			  fi_addr_t *fi_addr, uint64_t flags, void *context)
 {
 	const struct sockaddr_in *sin;
+	const char **addr_str;
+	struct sockaddr_in *cur_sin;
 	struct usd_device_attrs *dap;
 	struct usdf_av_insert *insert;
 	struct usdf_av_req *req;
 	struct usdf_av *av;
 	struct usdf_fabric *fp;
 	struct usd_dest *u_dest;
+	struct fi_info *info;
 	int ret;
 	size_t i;
+	bool addr_format_str;
 
 	USDF_TRACE_SYS(AV, "\n");
 
-	if ((flags & ~FI_MORE) != 0) {
+	if ((flags & ~(FI_MORE)) != 0)
 		return -FI_EBADFLAGS;
-	}
 
 	av = av_ftou(fav);
 	fp = av->av_domain->dom_fabric;
 	dap = fp->fab_dev_attrs;
+	info = av->av_domain->dom_info;
+	addr_format_str = (info->addr_format == FI_ADDR_STR);
 
 	if (av->av_eq == NULL) {
 		return -FI_ENOEQ;
 	}
 
 	sin = addr;
+	addr_str = (const char **)addr;
 
 	/* allocate an insert record and N requests */
 	insert = calloc(1, sizeof(*insert) + count * sizeof(*req));
@@ -340,7 +347,7 @@ usdf_am_insert_async(struct fid_av *fav, const void *addr, size_t count,
 	TAILQ_INIT(&insert->avi_req_list);
 	insert->avi_arps_left = USDF_AV_MAX_ARPS;
 
-	ret = atomic_inc(&av->av_active_inserts);
+	ret = ofi_atomic_inc32(&av->av_active_inserts);
 	USDF_DBG_SYS(AV, "new active insert value: %d\n", ret);
 
 	/* If no addresses, complete now */
@@ -354,6 +361,11 @@ usdf_am_insert_async(struct fid_av *fav, const void *addr, size_t count,
 	for (i = 0; i < count; i++) {
 		req->avr_fi_addr = &fi_addr[i];
 
+		if (addr_format_str) {
+			usdf_str_toaddr(addr_str[i], &cur_sin);
+			sin = cur_sin;
+		}
+
 		/* find the address we actually need to look up */
 		ret = usnic_nl_rt_lookup(dap->uda_ipaddr_be,
 				sin->sin_addr.s_addr, dap->uda_ifindex,
@@ -385,7 +397,13 @@ usdf_am_insert_async(struct fid_av *fav, const void *addr, size_t count,
 			TAILQ_INSERT_TAIL(&insert->avi_req_list, req, avr_link);
 		}
 
-		++sin;
+		if (addr_format_str) {
+			free(cur_sin);
+			cur_sin = NULL;
+		} else {
+			++sin;
+		}
+
 		++req;
 	}
 
@@ -409,26 +427,51 @@ usdf_am_insert_sync(struct fid_av *fav, const void *addr, size_t count,
 			  fi_addr_t *fi_addr, uint64_t flags, void *context)
 {
 	const struct sockaddr_in *sin;
+	const char **addr_str;
+	struct sockaddr_in *cur_sin;
 	struct usdf_av *av;
 	struct usd_dest *u_dest;
 	struct usdf_dest *dest;
+	struct fi_info *info;
 	int ret_count;
 	int ret;
+	int *errors;
+	uint32_t api_version;
 	size_t i;
+	bool addr_format_str;
 
 	USDF_TRACE_SYS(AV, "\n");
 
-	if ((flags & ~FI_MORE) != 0) {
+	ret_count = 0;
+	av = av_ftou(fav);
+	api_version = av->av_domain->dom_fabric->fab_attr.fabric->api_version;
+	info = av->av_domain->dom_info;
+	addr_format_str = (info->addr_format == FI_ADDR_STR);
+	errors = context;
+
+	/* Screen out unsupported flags. */
+	if ((flags & ~(FI_MORE|FI_SYNC_ERR)) != 0)
 		return -FI_EBADFLAGS;
-	}
 
-	av = av_ftou(fav);
+	/* If user set FI_SYNC_ERR, we have to report back to user's buffer. */
+	if (flags & FI_SYNC_ERR) {
+		if (FI_VERSION_LT(api_version, FI_VERSION(1, 5)))
+			return -FI_EBADFLAGS;
+
+		memset(errors, 0, sizeof(int) * count);
+	}
 
-	ret_count = 0;
 	sin = addr;
+	addr_str = (const char **)addr;
 
 	/* XXX parallelize, this will also eliminate u_dest silliness */
 	for (i = 0; i < count; i++) {
+
+		if (addr_format_str) {
+			usdf_str_toaddr(addr_str[i], &cur_sin);
+			sin = cur_sin;
+		}
+
 		dest = NULL;
 		u_dest = NULL;
 		ret = usdf_av_alloc_dest(&dest);
@@ -448,11 +491,20 @@ usdf_am_insert_sync(struct fid_av *fav, const void *addr, size_t count,
 					 ds_addresses_entry);
 			++ret_count;
 		} else {
+			if (flags & FI_SYNC_ERR)
+				errors[i] = -ret;
+
 			fi_addr[i] = FI_ADDR_NOTAVAIL;
 			free(dest);
 		}
 		free(u_dest);
-		++sin;
+
+		if (addr_format_str) {
+			free(cur_sin);
+			cur_sin = NULL;
+		} else {
+			++sin;
+		}
 	}
 
 	return ret_count;
@@ -490,28 +542,36 @@ static int usdf_av_insertsvc(struct fid_av *fav, const char *node,
 		const char *service, fi_addr_t *fi_addr, uint64_t flags,
 		void *context)
 {
-	struct sockaddr_in *addr;
+	struct sockaddr_in addr;
+	struct usdf_av *av;
+	struct fi_info *info;
 	int ret;
+	bool addr_format_str;
 
 	USDF_TRACE_SYS(AV, "\n");
 
+	av = av_ftou(fav);
+	info = av->av_domain->dom_info;
+	addr_format_str = (info->addr_format == FI_ADDR_STR);
+
 	if (!fav)
 		return -FI_EINVAL;
 
-	addr = calloc(1, sizeof(*addr));
-	if (!addr) {
-		USDF_DBG("address allocation failed\n");
-		return -FI_ENOMEM;
-	}
+	if (addr_format_str) {
+		/* string format should not come with service param. */
+		if (service)
+			return -FI_EINVAL;
 
-	ret = usdf_resolve_addr(node, service, addr);
-	if (ret)
-		goto fail;
+		ret = fav->ops->insert(fav, &node, 1, fi_addr, flags, context);
+	} else {
+		ret = usdf_resolve_addr(node, service, &addr);
+		if (ret)
+			goto fail;
 
-	ret = fav->ops->insert(fav, addr, 1, fi_addr, flags, context);
+		ret = fav->ops->insert(fav, &addr, 1, fi_addr, flags, context);
+	}
 
 fail:
-	free(addr);
 	return ret;
 }
 
@@ -538,22 +598,28 @@ usdf_am_remove(struct fid_av *fav, fi_addr_t *fi_addr, size_t count,
 }
 
 static int
-usdf_am_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr,
+usdf_am_lookup(struct fid_av *fav, fi_addr_t fi_addr, void *addr,
 			  size_t *addrlen)
 {
 	struct usdf_dest *dest;
+	struct usdf_av *av;
+	struct fi_info *info;
 	struct sockaddr_in sin = { 0 };
 	size_t copylen;
+	bool addr_format_str;
 
 	USDF_TRACE_SYS(AV, "\n");
 
+	av = av_ftou(fav);
+	info = av->av_domain->dom_info;
+	addr_format_str = (info->addr_format == FI_ADDR_STR);
+
 	if (fi_addr == FI_ADDR_NOTAVAIL) {
 		USDF_WARN_SYS(AV, "invalid address, can't lookup\n");
 		return -FI_EINVAL;
 	}
 
 	dest = (struct usdf_dest *)(uintptr_t)fi_addr;
-
 	if (*addrlen < sizeof(sin)) {
 		copylen = *addrlen;
 	} else {
@@ -562,26 +628,30 @@ usdf_am_lookup(struct fid_av *av, fi_addr_t fi_addr, void *addr,
 
 	sin.sin_family = AF_INET;
 	usd_expand_dest(&dest->ds_dest, &sin.sin_addr.s_addr, &sin.sin_port);
-	memcpy(addr, &sin, copylen);
 
-	*addrlen = sizeof(sin);
+	if (addr_format_str)
+		usdf_addr_tostr(&sin, addr, addrlen);
+	else {
+		memcpy(addr, &sin, copylen);
+		*addrlen = sizeof(sin);
+	}
 	return 0;
 }
 
 static const char *
-usdf_av_straddr(struct fid_av *av, const void *addr,
+usdf_av_straddr(struct fid_av *fav, const void *addr,
 				    char *buf, size_t *len)
 {
-	const struct sockaddr_in *sin;
-	char straddr[24];
-	int size;
+	struct fi_info *info;
+	struct usdf_av *av;
 
-	sin = addr;
-	size = snprintf(straddr, sizeof straddr, "%s:%d",
-			inet_ntoa(sin->sin_addr), ntohs(sin->sin_port));
-	snprintf(buf, *len, "%s", straddr);
-	*len = size + 1;
-	return buf;
+	if (!len || !addr || !buf)
+		return NULL;
+
+	av = av_fidtou(fav);
+	info = av->av_domain->dom_info;
+
+	return ofi_straddr(buf, len, info->addr_format, addr);
 }
 
 static int
@@ -599,7 +669,7 @@ usdf_av_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 			return -FI_EINVAL;
 		}
 		av->av_eq = eq_fidtou(bfid);
-		atomic_inc(&av->av_eq->eq_refcnt);
+		ofi_atomic_inc32(&av->av_eq->eq_refcnt);
 		break;
 	default:
 		return -FI_EINVAL;
@@ -720,13 +790,103 @@ usdf_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
 	av->av_flags = attr->flags;
 
 	pthread_spin_init(&av->av_lock, PTHREAD_PROCESS_PRIVATE);
-	atomic_initialize(&av->av_active_inserts, 0);
-	atomic_initialize(&av->av_closing, 0);
+	ofi_atomic_initialize32(&av->av_active_inserts, 0);
+	ofi_atomic_initialize32(&av->av_closing, 0);
 
-	atomic_initialize(&av->av_refcnt, 0);
-	atomic_inc(&udp->dom_refcnt);
+	ofi_atomic_initialize32(&av->av_refcnt, 0);
+	ofi_atomic_inc32(&udp->dom_refcnt);
 	av->av_domain = udp;
 
 	*av_o = av_utof(av);
 	return 0;
 }
+
+/* Look up if the sin address has been already inserted.
+ * if match, return the address of the dest pointer. otherwise,
+ * returns FI_ADDR_NOTAVAIL.
+ */
+fi_addr_t usdf_av_lookup_addr(struct usdf_av *av,
+			      const struct sockaddr_in *sin)
+{
+	struct usdf_dest *cur;
+	struct usd_udp_hdr u_hdr;
+
+	for (cur = av->av_addresses.lh_first; cur;
+	     cur = cur->ds_addresses_entry.le_next) {
+		u_hdr = cur->ds_dest.ds_dest.ds_udp.u_hdr;
+		if (sin->sin_addr.s_addr == u_hdr.uh_ip.daddr &&
+		    sin->sin_port == u_hdr.uh_udp.dest)
+			return (fi_addr_t)(uintptr_t)cur;
+	}
+	return FI_ADDR_NOTAVAIL;
+}
+
+/* Return sockaddr_in pointer. Must be used with usdf_free_sin_if_needed()
+ * to cleanup properly.
+ */
+struct sockaddr_in *usdf_format_to_sin(struct fi_info *info, const void *addr)
+{
+	struct sockaddr_in *sin;
+
+	if (!info)
+		return (struct sockaddr_in *)addr;
+
+	switch (info->addr_format) {
+	case FI_FORMAT_UNSPEC:
+	case FI_SOCKADDR:
+	case FI_SOCKADDR_IN:
+		return (struct sockaddr_in *)addr;
+	case FI_ADDR_STR:
+		usdf_str_toaddr(addr, &sin);
+		return sin;
+	default:
+		return NULL;
+	}
+}
+
+/* Utility function to free the sockaddr_in allocated from usdf_format_to_sin()
+ */
+void usdf_free_sin_if_needed(struct fi_info *info, struct sockaddr_in *sin)
+{
+	if (info && info->addr_format == FI_ADDR_STR)
+		free(sin);
+}
+
+/* Convert sockaddr_in pointer to appropriate format.
+ * If conversion happens, destroy the origin. (to minimize cleaning up code)
+ */
+void *usdf_sin_to_format(struct fi_info *info, void *addr, size_t *len)
+{
+	size_t addr_strlen;
+	char *addrstr;
+
+	if (!info)
+		return addr;
+
+	switch (info->addr_format) {
+	case FI_FORMAT_UNSPEC:
+	case FI_SOCKADDR:
+	case FI_SOCKADDR_IN:
+		if (len)
+			*len = sizeof(struct sockaddr_in);
+		return addr;
+	case FI_ADDR_STR:
+		addrstr = calloc(1, USDF_ADDR_STR_LEN);
+		if (addrstr == NULL) {
+			USDF_DBG_SYS(AV, "memory allocation failed\n");
+			return NULL;
+		}
+
+		addr_strlen = USDF_ADDR_STR_LEN;
+		usdf_addr_tostr(addr, addrstr, &addr_strlen);
+
+		if (len)
+			*len = addr_strlen;
+
+		free(addr);
+		return addrstr;
+	default:
+		return NULL;
+	}
+
+}
diff --git a/prov/usnic/src/usdf_av.h b/prov/usnic/src/usdf_av.h
index 73c4adb..d14f6db 100644
--- a/prov/usnic/src/usdf_av.h
+++ b/prov/usnic/src/usdf_av.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -81,14 +81,18 @@ struct usdf_av {
 	struct usdf_domain *av_domain;
 	uint64_t av_flags;
 	struct usdf_eq *av_eq;
-	atomic_t av_refcnt;
-	atomic_t av_closing;
-	atomic_t av_active_inserts;
+	ofi_atomic32_t av_refcnt;
+	ofi_atomic32_t av_closing;
+	ofi_atomic32_t av_active_inserts;
 	pthread_spinlock_t av_lock;
 	LIST_HEAD(, usdf_dest) av_addresses;
 };
+
 #define av_ftou(FAV) container_of(FAV, struct usdf_av, av_fid)
 #define av_fidtou(FID) container_of(FID, struct usdf_av, av_fid.fid)
 #define av_utof(AV) (&(AV)->av_fid)
 
+fi_addr_t usdf_av_lookup_addr(struct usdf_av *av,
+			      const struct sockaddr_in *sin);
+
 #endif /* _USDF_AV_H_ */
diff --git a/prov/usnic/src/usdf_cm.c b/prov/usnic/src/usdf_cm.c
index d639811..b66581e 100644
--- a/prov/usnic/src/usdf_cm.c
+++ b/prov/usnic/src/usdf_cm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -454,6 +454,7 @@ usdf_cm_msg_connect(struct fid_ep *fep, const void *addr,
 	struct usdf_fabric *fp;
 	struct usdf_connreq_msg *reqp;
 	struct usd_qp_impl *qp;
+	struct fi_info *info;
 	size_t request_size;
 	int ret;
 
@@ -465,7 +466,9 @@ usdf_cm_msg_connect(struct fid_ep *fep, const void *addr,
 	ep = ep_ftou(fep);
 	udp = ep->ep_domain;
 	fp = udp->dom_fabric;
-	sin = addr;
+	info = ep->ep_domain->dom_info;
+
+	sin = usdf_format_to_sin(info, addr);
 
 	/* Although paramlen may be less than USDF_MAX_CONN_DATA, the same crp
 	 * struct is used for receiving the accept and reject payload. The
@@ -549,9 +552,13 @@ usdf_cm_msg_connect(struct fid_ep *fep, const void *addr,
 		goto fail;
 	}
 
+	usdf_free_sin_if_needed(info, (struct sockaddr_in *)sin);
+
 	return 0;
 
 fail:
+	usdf_free_sin_if_needed(info, (struct sockaddr_in *)sin);
+
 	if (crp != NULL) {
 		if (crp->cr_sockfd != -1) {
 			close(crp->cr_sockfd);
@@ -563,26 +570,107 @@ fail:
 	return ret;
 }
 
+/* A wrapper to core function to translate string address to
+ * sockaddr_in type. We are expecting a NULL sockaddr_in**.
+ * The core function will allocated it for us. The caller HAS TO FREE it.
+ */
+int usdf_str_toaddr(const char *str, struct sockaddr_in **outaddr)
+{
+	uint32_t type;
+	size_t size;
+	int ret;
+
+	type = FI_SOCKADDR_IN;
+
+	/* call the core function. The core always allocate the addr for us. */
+	ret = ofi_str_toaddr(str, &type, (void **)outaddr, &size);
+
+#if ENABLE_DEBUG
+	char outstr[USDF_ADDR_STR_LEN];
+	size_t out_size = USDF_ADDR_STR_LEN;
+
+	inet_ntop(AF_INET, &((*outaddr)->sin_addr), outstr, out_size);
+	USDF_DBG_SYS(EP_CTRL,
+		    "%s(string) converted to addr :%s:%u(inet)\n",
+		    str, outstr, ntohs((*outaddr)->sin_port));
+#endif
+
+	return ret;
+}
+
+/* A wrapper to core function to translate sockaddr_in address to
+ * string. This function is not allocating any memory. We are expected
+ * an allocated buffer.
+ */
+const char *usdf_addr_tostr(const struct sockaddr_in *sin,
+			    char *addr_str, size_t *size)
+{
+	const char *ret;
+
+	ret = ofi_straddr(addr_str, size, FI_SOCKADDR_IN, sin);
+
+#if ENABLE_DEBUG
+	char outstr[USDF_ADDR_STR_LEN];
+	size_t out_size = USDF_ADDR_STR_LEN;
+
+	inet_ntop(AF_INET, &sin->sin_addr, outstr, out_size);
+	USDF_DBG_SYS(EP_CTRL,
+		    "%s:%d(inet) converted to %s(string)\n",
+		    outstr, ntohs(sin->sin_port), addr_str);
+#endif
+
+	return ret;
+}
+
 /*
  * Return local address of an EP
  */
+static int usdf_cm_copy_name(struct fi_info *info, struct sockaddr_in *sin,
+		void *addr, size_t *addrlen)
+{
+	int ret;
+	char addr_str[USDF_ADDR_STR_LEN];
+	size_t len;
+
+	USDF_TRACE_SYS(EP_CTRL, "\n");
+
+	ret = FI_SUCCESS;
+	switch (info->addr_format) {
+	case FI_ADDR_STR:
+		len = USDF_ADDR_STR_LEN;
+		usdf_addr_tostr(sin, addr_str, &len);
+		snprintf(addr, MIN(len, *addrlen), "%s", addr_str);
+		break;
+	case FI_SOCKADDR:
+	case FI_SOCKADDR_IN:
+		len = sizeof(*sin);
+		memcpy(addr, sin, MIN(len, *addrlen));
+		break;
+	default:
+		return -FI_EINVAL;
+	}
+
+	/* If the buffer is too small, tell the user. */
+	if (*addrlen < len)
+		ret = -FI_ETOOSMALL;
+
+	/* Always return the actual size. */
+	*addrlen = len;
+	return ret;
+}
+
 int usdf_cm_rdm_getname(fid_t fid, void *addr, size_t *addrlen)
 {
 	struct usdf_ep *ep;
 	struct usdf_rx *rx;
 	struct sockaddr_in sin;
-	size_t copylen;
+	struct fi_info *info;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	ep = ep_fidtou(fid);
 	rx = ep->ep_rx;
-
-	copylen = sizeof(sin);
-	if (copylen > *addrlen) {
-		copylen = *addrlen;
-	}
-	*addrlen = sizeof(sin);
+	info = ep->ep_domain->dom_info;
 
 	memset(&sin, 0, sizeof(sin));
 	sin.sin_family = AF_INET;
@@ -593,13 +681,8 @@ int usdf_cm_rdm_getname(fid_t fid, void *addr, size_t *addrlen)
 	} else {
 		sin.sin_port = to_qpi(rx->rx_qp)->uq_attrs.uqa_local_addr.ul_addr.ul_udp.u_addr.sin_port;
 	}
-	memcpy(addr, &sin, copylen);
 
-	if (copylen < sizeof(sin)) {
-		return -FI_ETOOSMALL;
-	} else {
-		return 0;
-	}
+	return usdf_cm_copy_name(info, &sin, addr, addrlen);
 }
 
 int usdf_cm_dgram_getname(fid_t fid, void *addr, size_t *addrlen)
@@ -607,15 +690,13 @@ int usdf_cm_dgram_getname(fid_t fid, void *addr, size_t *addrlen)
 	int ret;
 	struct usdf_ep *ep;
 	struct sockaddr_in sin;
+	struct fi_info *info;
 	socklen_t slen;
-	size_t copylen;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	ep = ep_fidtou(fid);
-
-	copylen = MIN(sizeof(sin), *addrlen);
-	*addrlen = sizeof(sin);
+	info = ep->ep_domain->dom_info;
 
 	memset(&sin, 0, sizeof(sin));
 	if (ep->e.dg.ep_qp == NULL) {
@@ -634,31 +715,21 @@ int usdf_cm_dgram_getname(fid_t fid, void *addr, size_t *addrlen)
 		assert(sin.sin_addr.s_addr ==
 			ep->ep_domain->dom_fabric->fab_dev_attrs->uda_ipaddr_be);
 	}
-	memcpy(addr, &sin, copylen);
 
-	if (copylen < sizeof(sin))
-		return -FI_ETOOSMALL;
-	else
-		return 0;
+	return usdf_cm_copy_name(info, &sin, addr, addrlen);
 }
 
 int usdf_cm_msg_getname(fid_t fid, void *addr, size_t *addrlen)
 {
 	struct usdf_ep *ep;
-	size_t copylen;
+	struct fi_info *info;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	ep = ep_fidtou(fid);
+	info = ep->ep_domain->dom_info;
 
-	copylen = MIN(sizeof(ep->e.msg.ep_lcl_addr), *addrlen);
-	*addrlen = sizeof(ep->e.msg.ep_lcl_addr);
-	memcpy(addr, &ep->e.msg.ep_lcl_addr, copylen);
-
-	if (copylen < sizeof(ep->e.msg.ep_lcl_addr))
-		return -FI_ETOOSMALL;
-	else
-		return 0;
+	return usdf_cm_copy_name(info, &ep->e.msg.ep_lcl_addr, addr, addrlen);
 }
 
 /* Checks that the given address is actually a sockaddr_in of appropriate
diff --git a/prov/usnic/src/usdf_cm.h b/prov/usnic/src/usdf_cm.h
index 0359c6f..48b92e8 100644
--- a/prov/usnic/src/usdf_cm.h
+++ b/prov/usnic/src/usdf_cm.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -38,6 +38,9 @@
 
 #include <stdbool.h>
 #include <sys/queue.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
 
 #define USDF_MAX_CONN_DATA 256
 
@@ -75,6 +78,11 @@ int usdf_cm_rdm_getname(fid_t fid, void *addr, size_t *addrlen);
 int usdf_cm_dgram_getname(fid_t fid, void *addr, size_t *addrlen);
 int usdf_cm_msg_getname(fid_t fid, void *addr, size_t *addrlen);
 
-bool usdf_cm_addr_is_valid_sin(void *addr, size_t addrlen, uint32_t addr_format);
+bool usdf_cm_addr_is_valid_sin(void *addr, size_t addrlen,
+			       uint32_t addr_format);
+
+int usdf_str_toaddr(const char *str, struct sockaddr_in **outaddr);
+const char *usdf_addr_tostr(const struct sockaddr_in *sin,
+			    char *addr_str, size_t *size);
 
 #endif /* _USDF_CM_H_ */
diff --git a/prov/usnic/src/usdf_cq.c b/prov/usnic/src/usdf_cq.c
index 4823e3d..7909674 100644
--- a/prov/usnic/src/usdf_cq.c
+++ b/prov/usnic/src/usdf_cq.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -88,10 +88,12 @@ usdf_cq_readerr(struct fid_cq *fcq, struct fi_cq_err_entry *entry,
 	        uint64_t flags)
 {
 	struct usdf_cq *cq;
+	uint32_t api_version;
 
 	USDF_TRACE_SYS(CQ, "\n");
 
 	cq = container_of(fcq, struct usdf_cq, cq_fid);
+	api_version = cq->cq_domain->dom_fabric->fab_attr.fabric->api_version;
 
 	// The return values are analogous to sockets cq_readerr
 	if (cq->cq_comp.uc_status == 0) {
@@ -122,6 +124,10 @@ usdf_cq_readerr(struct fid_cq *fcq, struct fi_cq_err_entry *entry,
 
 	cq->cq_comp.uc_status = 0;
 
+	/* We don't have err_data to give back to the user. */
+	if (FI_VERSION_GE(api_version, FI_VERSION(1, 5)))
+		entry->err_data_size = 0;
+
 	return 1;
 }
 
@@ -294,7 +300,7 @@ usdf_cq_read_common(struct fid_cq *fcq, void *buf, size_t count,
 
 	if (cq->cq_waiting) {
 		cq->cq_waiting = false;
-		atomic_dec(&fab->num_blocked_waiting);
+		ofi_atomic_dec32(&fab->num_blocked_waiting);
 	}
 
 	return copied > 0 ? copied : -FI_EAGAIN;
@@ -366,11 +372,7 @@ usdf_cq_readfrom_context(struct fid_cq *fcq, void *buf, size_t count,
 			sin.sin_addr.s_addr = hdr->uh_ip.saddr;
 			sin.sin_port = hdr->uh_udp.source;
 
-			ret = fi_av_insert(av_utof(ep->e.dg.ep_av), &sin, 1,
-					src_addr, 0, NULL);
-			if (ret != 1) {
-				*src_addr = FI_ADDR_NOTAVAIL;
-			}
+			*src_addr = usdf_av_lookup_addr(ep->e.dg.ep_av, &sin);
 			++src_addr;
 		}
 
@@ -576,7 +578,7 @@ static ssize_t usdf_cq_sread_fd(struct fid_cq *fcq, void *buf, size_t count,
 
 	ret = usdf_cq_trywait(&fcq->fid);
 	if (ret == FI_SUCCESS) {
-		atomic_inc(&fabric->num_blocked_waiting);
+		ofi_atomic_inc32(&fabric->num_blocked_waiting);
 
 		ret = usdf_fabric_wake_thread(fabric);
 		if (ret) {
@@ -594,7 +596,7 @@ static ssize_t usdf_cq_sread_fd(struct fid_cq *fcq, void *buf, size_t count,
 			goto err;
 		}
 
-		atomic_dec(&fabric->num_blocked_waiting);
+		ofi_atomic_dec32(&fabric->num_blocked_waiting);
 	} else if ((ret < 0) && (ret != -FI_EAGAIN)) {
 		return ret;
 	}
@@ -602,7 +604,7 @@ static ssize_t usdf_cq_sread_fd(struct fid_cq *fcq, void *buf, size_t count,
 	return fi_cq_read(fcq, buf, count);
 
 err:
-	atomic_dec(&fabric->num_blocked_waiting);
+	ofi_atomic_dec32(&fabric->num_blocked_waiting);
 	return ret;
 }
 
@@ -752,7 +754,7 @@ static int usdf_cq_unbind_wait(struct usdf_cq *cq)
 
 	fid_list_remove(&wait_priv->list, &wait_priv->lock, &cq->cq_fid.fid);
 
-	atomic_dec(&wait_priv->wait_refcnt);
+	ofi_atomic_dec32(&wait_priv->wait_refcnt);
 
 	USDF_DBG_SYS(CQ,
 			"dissasociated CQ FD %d from epoll FD %d using FID: %p\n",
@@ -774,7 +776,7 @@ usdf_cq_close(fid_t fid)
 	cq = container_of(fid, struct usdf_cq, cq_fid.fid);
 	fab = cq->cq_domain->dom_fabric;
 
-	if (atomic_get(&cq->cq_refcnt) > 0) {
+	if (ofi_atomic_get32(&cq->cq_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
@@ -787,7 +789,7 @@ usdf_cq_close(fid_t fid)
 	if (cq->cq_is_soft) {
 		while (!TAILQ_EMPTY(&cq->c.soft.cq_list)) {
 			hcq = TAILQ_FIRST(&cq->c.soft.cq_list);
-			if (atomic_get(&hcq->cqh_refcnt) > 0) {
+			if (ofi_atomic_get32(&hcq->cqh_refcnt) > 0) {
 				return -FI_EBUSY;
 			}
 			TAILQ_REMOVE(&cq->c.soft.cq_list, hcq, cqh_link);
@@ -811,7 +813,7 @@ usdf_cq_close(fid_t fid)
 	}
 
 	if (cq->cq_waiting)
-		atomic_dec(&fab->num_blocked_waiting);
+		ofi_atomic_dec32(&fab->num_blocked_waiting);
 
 	free(cq);
 	return 0;
@@ -987,8 +989,8 @@ usdf_cq_make_soft(struct usdf_cq *cq)
 			hcq->cqh_ucq = ucq;
 			hcq->cqh_progress = usdf_progress_hard_cq;
 
-			atomic_initialize(&hcq->cqh_refcnt,
-					atomic_get(&cq->cq_refcnt));
+			ofi_atomic_initialize32(&hcq->cqh_refcnt,
+					ofi_atomic_get32(&cq->cq_refcnt));
 			TAILQ_INSERT_HEAD(&cq->c.soft.cq_list, hcq, cqh_link);
 		}
 
@@ -1139,11 +1141,11 @@ int usdf_cq_trywait(struct fid *fcq)
 	}
 
 	cq->cq_waiting = true;
-	atomic_inc(&fab->num_blocked_waiting);
+	ofi_atomic_inc32(&fab->num_blocked_waiting);
 	ret = usdf_fabric_wake_thread(fab);
 	if (ret) {
 		USDF_DBG_SYS(FABRIC, "error while waking progress thread\n");
-		atomic_dec(&fab->num_blocked_waiting);
+		ofi_atomic_dec32(&fab->num_blocked_waiting);
 	}
 
 	if (cq->cq_is_soft) {
@@ -1296,7 +1298,7 @@ usdf_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	 */
 	if (attr->wait_obj == FI_WAIT_SET) {
 		wait_priv = wait_ftou(attr->wait_set);
-		atomic_inc(&wait_priv->wait_refcnt);
+		ofi_atomic_inc32(&wait_priv->wait_refcnt);
 	}
 
 	cq->object.fd = -1;
@@ -1304,7 +1306,7 @@ usdf_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	cq->cq_fid.fid.fclass = FI_CLASS_CQ;
 	cq->cq_fid.fid.context = context;
 	cq->cq_fid.fid.ops = &usdf_cq_fi_ops;
-	atomic_initialize(&cq->cq_refcnt, 0);
+	ofi_atomic_initialize32(&cq->cq_refcnt, 0);
 
 	switch (attr->format) {
 	case FI_CQ_FORMAT_CONTEXT:
diff --git a/prov/usnic/src/usdf_dgram.h b/prov/usnic/src/usdf_dgram.h
index a82e2de..192cecc 100644
--- a/prov/usnic/src/usdf_dgram.h
+++ b/prov/usnic/src/usdf_dgram.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -40,8 +40,9 @@
 #define USDF_DGRAM_DFLT_SGE 4
 
 #define USDF_DGRAM_CAPS (FI_MSG | FI_SOURCE | FI_SEND | FI_RECV)
+
 #define USDF_DGRAM_SUPP_MODE (FI_LOCAL_MR | FI_MSG_PREFIX)
-#define USDF_DGRAM_REQ_MODE (FI_LOCAL_MR)
+
 #define USDF_DGRAM_MSG_ORDER (FI_ORDER_NONE)
 #define USDF_DGRAM_COMP_ORDER (FI_ORDER_NONE)
 #define USDF_DGRAM_INJECT_SIZE                                                 \
@@ -51,12 +52,15 @@
 #define USDF_DGRAM_SUPP_RECVMSG_FLAGS (FI_COMPLETION)
 #define USDF_DGRAM_IOV_LIMIT (USDF_DGRAM_DFLT_SGE)
 #define USDF_DGRAM_RMA_IOV_LIMIT 0
+#define USDF_DGRAM_CNTR_CNT 0
+#define USDF_DGRAM_MR_IOV_LIMIT (USDF_MR_IOV_LIMIT)
+#define USDF_DGRAM_MR_CNT (USDF_MR_CNT)
 
 
-int usdf_dgram_fill_rx_attr(struct fi_info *hints,
+int usdf_dgram_fill_rx_attr(uint32_t version, struct fi_info *hints,
+		struct fi_info *fi, struct usd_device_attrs *dap);
+int usdf_dgram_fill_tx_attr(uint32_t version, struct fi_info *hints,
 		struct fi_info *fi, struct usd_device_attrs *dap);
-int usdf_dgram_fill_tx_attr(struct fi_info *hints, struct fi_info *fi,
-		struct usd_device_attrs *dap);
 int usdf_dgram_fill_dom_attr(uint32_t version, struct fi_info *hints,
 			     struct fi_info *fi, struct usd_device_attrs *dap);
 int usdf_dgram_fill_ep_attr(uint32_t version, struct fi_info *hints,
diff --git a/prov/usnic/src/usdf_domain.c b/prov/usnic/src/usdf_domain.c
index 5f69d94..d4ff221 100644
--- a/prov/usnic/src/usdf_domain.c
+++ b/prov/usnic/src/usdf_domain.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -51,12 +51,14 @@
 #include <rdma/fi_errno.h>
 #include "fi.h"
 #include "fi_enosys.h"
+#include "fi_util.h"
 
 #include "usnic_direct.h"
 #include "usdf.h"
 #include "usdf_rdm.h"
 #include "usdf_timer.h"
 #include "usdf_poll.h"
+#include "usdf_cm.h"
 
 static int
 usdf_domain_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
@@ -79,7 +81,7 @@ usdf_domain_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
                         return -FI_EINVAL;
                 }
                 udp->dom_eq = eq_fidtou(bfid);
-                atomic_inc(&udp->dom_eq->eq_refcnt);
+                ofi_atomic_inc32(&udp->dom_eq->eq_refcnt);
                 break;
         default:
                 return -FI_EINVAL;
@@ -108,7 +110,7 @@ usdf_dom_rdc_free_data(struct usdf_domain *udp)
 		pthread_spin_unlock(&udp->dom_progress_lock);
 
 		/* XXX probably want a timeout here... */
-		while (atomic_get(&udp->dom_rdc_free_cnt) <
+		while (ofi_atomic_get32(&udp->dom_rdc_free_cnt) <
 		       (int)udp->dom_rdc_total) {
 			pthread_yield();
 		}
@@ -138,7 +140,7 @@ usdf_dom_rdc_alloc_data(struct usdf_domain *udp)
 		return -FI_ENOMEM;
 	}
 	SLIST_INIT(&udp->dom_rdc_free);
-	atomic_initialize(&udp->dom_rdc_free_cnt, 0);
+	ofi_atomic_initialize32(&udp->dom_rdc_free_cnt, 0);
 	for (i = 0; i < USDF_RDM_FREE_BLOCK; ++i) {
 		rdc = calloc(1, sizeof(*rdc));
 		if (rdc == NULL) {
@@ -157,7 +159,7 @@ usdf_dom_rdc_alloc_data(struct usdf_domain *udp)
 		TAILQ_INIT(&rdc->dc_wqe_posted);
 		TAILQ_INIT(&rdc->dc_wqe_sent);
 		SLIST_INSERT_HEAD(&udp->dom_rdc_free, rdc, dc_addr_link);
-		atomic_inc(&udp->dom_rdc_free_cnt);
+		ofi_atomic_inc32(&udp->dom_rdc_free_cnt);
 	}
 	udp->dom_rdc_total = USDF_RDM_FREE_BLOCK;
 	return 0;
@@ -172,7 +174,7 @@ usdf_domain_close(fid_t fid)
 	USDF_TRACE_SYS(DOMAIN, "\n");
 
 	udp = container_of(fid, struct usdf_domain, dom_fid.fid);
-	if (atomic_get(&udp->dom_refcnt) > 0) {
+	if (ofi_atomic_get32(&udp->dom_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
@@ -185,9 +187,9 @@ usdf_domain_close(fid_t fid)
 	usdf_dom_rdc_free_data(udp);
 
 	if (udp->dom_eq != NULL) {
-		atomic_dec(&udp->dom_eq->eq_refcnt);
+		ofi_atomic_dec32(&udp->dom_eq->eq_refcnt);
 	}
-	atomic_dec(&udp->dom_fabric->fab_refcnt);
+	ofi_atomic_dec32(&udp->dom_fabric->fab_refcnt);
 	LIST_REMOVE(udp, dom_link);
 	fi_freeinfo(udp->dom_info);
 	free(udp);
@@ -206,8 +208,8 @@ static struct fi_ops usdf_fid_ops = {
 static struct fi_ops_mr usdf_domain_mr_ops = {
 	.size = sizeof(struct fi_ops_mr),
 	.reg = usdf_reg_mr,
-	.regv = fi_no_mr_regv,
-	.regattr = fi_no_mr_regattr,
+	.regv = usdf_regv_mr,
+	.regattr = usdf_regattr,
 };
 
 static struct fi_ops_domain usdf_domain_ops = {
@@ -220,6 +222,7 @@ static struct fi_ops_domain usdf_domain_ops = {
 	.poll_open = usdf_poll_open,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = usdf_query_atomic,
 };
 
 int
@@ -236,6 +239,7 @@ usdf_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 #endif
 
 	USDF_TRACE_SYS(DOMAIN, "\n");
+	sin = NULL;
 
 	fp = fab_fidtou(fabric);
 
@@ -247,14 +251,12 @@ usdf_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 			return -FI_ENODATA;
 		}
 
-		switch (info->domain_attr->mr_mode) {
-		case FI_MR_UNSPEC:
-		case FI_MR_BASIC:
-			break;
-		default:
+		if (ofi_check_mr_mode(fabric->api_version,
+				      OFI_MR_BASIC_MAP | FI_MR_LOCAL,
+				      info->domain_attr->mr_mode)) {
 			/* the caller ignored our fi_getinfo results */
 			USDF_WARN_SYS(DOMAIN, "MR mode (%d) not supported\n",
-				info->domain_attr->mr_mode);
+				      info->domain_attr->mr_mode);
 			return -FI_ENODATA;
 		}
 	}
@@ -274,16 +276,27 @@ usdf_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 	switch (info->addr_format) {
 	case FI_SOCKADDR:
 		addrlen = sizeof(struct sockaddr);
+		sin = info->src_addr;
 		break;
 	case FI_SOCKADDR_IN:
 		addrlen = sizeof(struct sockaddr_in);
+		sin = info->src_addr;
 		break;
+	case FI_ADDR_STR:
+		sin = usdf_format_to_sin(info, info->src_addr);
+		goto skip_size_check;
 	default:
 		ret = -FI_EINVAL;
 		goto fail;
 	}
-	sin = info->src_addr;
-	if (info->src_addrlen != addrlen || sin->sin_family != AF_INET ||
+
+	if (info->src_addrlen != addrlen) {
+		ret =  -FI_EINVAL;
+		goto fail;
+	}
+
+skip_size_check:
+	if (sin->sin_family != AF_INET ||
 	    sin->sin_addr.s_addr != fp->fab_dev_attrs->uda_ipaddr_be) {
 		USDF_DBG_SYS(DOMAIN, "requested src_addr (%s) != fabric addr (%s)\n",
 			inet_ntop(AF_INET, &sin->sin_addr.s_addr,
@@ -292,8 +305,10 @@ usdf_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 				actual, sizeof(actual)));
 
 		ret = -FI_EINVAL;
+		usdf_free_sin_if_needed(info, sin);
 		goto fail;
 	}
+	usdf_free_sin_if_needed(info, sin);
 
 	ret = usd_open(fp->fab_dev_attrs->uda_devname, &udp->dom_dev);
 	if (ret != 0) {
@@ -332,8 +347,8 @@ usdf_domain_open(struct fid_fabric *fabric, struct fi_info *info,
 
 	udp->dom_fabric = fp;
 	LIST_INSERT_HEAD(&fp->fab_domain_list, udp, dom_link);
-	atomic_initialize(&udp->dom_refcnt, 0);
-	atomic_inc(&fp->fab_refcnt);
+	ofi_atomic_initialize32(&udp->dom_refcnt, 0);
+	ofi_atomic_inc32(&fp->fab_refcnt);
 
 	*domain = &udp->dom_fid;
 	return 0;
@@ -432,3 +447,95 @@ bool usdf_domain_checkname(uint32_t version, struct usd_device_attrs *dap,
 
 	return usdf_domain_checkname(FI_VERSION(1, 3), dap, hint);
 }
+
+/* Query domain's atomic capability.
+ * We dont support atomic operations, just return EOPNOTSUPP.
+ */
+int usdf_query_atomic(struct fid_domain *domain, enum fi_datatype datatype,
+		      enum fi_op op, struct fi_atomic_attr *attr, uint64_t flags)
+{
+	return -FI_EOPNOTSUPP;
+}
+
+/* Catch the version changes for domain_attr. */
+int usdf_catch_dom_attr(uint32_t version, struct fi_info *hints,
+			struct fi_domain_attr *dom_attr)
+{
+	/* version 1.5 introduced new bits. If the user asked for older
+	 * version, we can't return these new bits.
+	 */
+	if (FI_VERSION_LT(version, FI_VERSION(1, 5))) {
+		/* We checked mr_mode compatibility before calling
+		 * this function. This means it is safe to return
+		 * 1.4 default mr_mode.
+		 */
+		dom_attr->mr_mode = FI_MR_BASIC;
+
+		/* FI_REMOTE_COMM is introduced in 1.5. So don't return it. */
+		dom_attr->caps &= ~FI_REMOTE_COMM;
+
+		/* If FI_REMOTE_COMM is given for version < 1.5, fail. */
+		if (hints && hints->domain_attr) {
+			if (hints->domain_attr->caps == FI_REMOTE_COMM)
+				return -FI_EBADFLAGS;
+		}
+	}
+
+	return FI_SUCCESS;
+}
+
+/* Catch the version changes for tx_attr. */
+int usdf_catch_tx_attr(uint32_t version, struct fi_tx_attr *tx_attr)
+{
+	/* In version < 1.5, FI_LOCAL_MR is required. */
+	if (FI_VERSION_LT(version, FI_VERSION(1, 5))) {
+		if ((tx_attr->mode & FI_LOCAL_MR) == 0)
+			return -FI_ENODATA;
+	}
+
+	return FI_SUCCESS;
+}
+
+/* Catch the version changes for rx_attr. */
+int usdf_catch_rx_attr(uint32_t version, struct fi_rx_attr *rx_attr)
+{
+	/* In version < 1.5, FI_LOCAL_MR is required. */
+	if (FI_VERSION_LT(version, FI_VERSION(1, 5))) {
+		if ((rx_attr->mode & FI_LOCAL_MR) == 0)
+			return -FI_ENODATA;
+	}
+
+	return FI_SUCCESS;
+}
+
+/* A wrapper function to core utility function to check mr_mode bits.
+ * We need to check some more things for backward compatibility.
+ */
+int usdf_check_mr_mode(uint32_t version, struct fi_info *hints,
+		       uint64_t prov_mode)
+{
+	int ret;
+
+	ret = ofi_check_mr_mode(version, prov_mode,
+				hints->domain_attr->mr_mode);
+
+	/* If ofi_check_mr_mode fails. */
+	if (ret) {
+		/* Is it because the user give 0 as mr_mode? */
+		if (hints->domain_attr->mr_mode == 0) {
+			if (FI_VERSION_LT(version, FI_VERSION(1, 5))) {
+				/* If the version is < 1.5, it is ok.
+				 * We let this slide and catch it later on.
+				 */
+				return FI_SUCCESS;
+			} else if (hints->mode & FI_LOCAL_MR) {
+				/* If version is >= 1.5, we check fi_info mode
+				 * for FI_LOCAL_MR for backward compatibility.
+				 */
+				return FI_SUCCESS;
+			}
+		}
+	}
+
+	return ret;
+}
diff --git a/prov/usnic/src/usdf_ep_dgram.c b/prov/usnic/src/usdf_ep_dgram.c
index 325a950..0449b35 100644
--- a/prov/usnic/src/usdf_ep_dgram.c
+++ b/prov/usnic/src/usdf_ep_dgram.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -55,6 +55,7 @@
 #include <rdma/fi_errno.h>
 #include "fi.h"
 #include "fi_enosys.h"
+#include "fi_util.h"
 
 #include "usnic_direct.h"
 #include "usd.h"
@@ -156,13 +157,26 @@ fail:
 static int
 usdf_ep_dgram_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 {
+	int ret;
 	struct usdf_ep *ep;
 	struct usdf_cq *cq;
 	struct usdf_av *av;
-	int ret;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
+	/* Backward compatibility case for Open MPI. We haven't been validating the flags until now.
+	 * Older version of Open MPI gives FI_RECV as AV bind flag (bug). */
+	if (bfid->fclass == FI_CLASS_AV) {
+		av = av_fidtou(bfid);
+		if (av->av_domain->dom_info->fabric_attr->api_version <= FI_VERSION(1, 4) && (flags & FI_RECV))
+			flags = flags & ~FI_RECV;
+	}
+
+	/* Check if the binding flags are valid. */
+	ret = ofi_ep_bind_valid(&usdf_ops, bfid, flags);
+	if (ret)
+		return ret;
+
 	ep = ep_fidtou(fid);
 
 	switch (bfid->fclass) {
@@ -174,7 +188,7 @@ usdf_ep_dgram_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 
 		av = av_fidtou(bfid);
 		ep->e.dg.ep_av = av;
-		atomic_inc(&av->av_refcnt);
+		ofi_atomic_inc32(&av->av_refcnt);
 		break;
 
 	case FI_CLASS_CQ:
@@ -205,7 +219,7 @@ usdf_ep_dgram_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 					(ep->e.dg.tx_op_flags & FI_COMPLETION));
 
 			ep->e.dg.ep_wcq = cq;
-			atomic_inc(&cq->cq_refcnt);
+			ofi_atomic_inc32(&cq->cq_refcnt);
 		}
 
 		if (flags & FI_RECV) {
@@ -223,7 +237,7 @@ usdf_ep_dgram_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 					(ep->e.dg.rx_op_flags & FI_COMPLETION));
 
 			ep->e.dg.ep_rcq = cq;
-			atomic_inc(&cq->cq_refcnt);
+			ofi_atomic_inc32(&cq->cq_refcnt);
 		}
 		break;
 
@@ -232,7 +246,7 @@ usdf_ep_dgram_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 			return -FI_EINVAL;
 		}
 		ep->ep_eq = eq_fidtou(bfid);
-		atomic_inc(&ep->ep_eq->eq_refcnt);
+		ofi_atomic_inc32(&ep->ep_eq->eq_refcnt);
 		break;
 	default:
 		return -FI_EINVAL;
@@ -250,14 +264,14 @@ usdf_ep_dgram_deref_cq(struct usdf_cq *cq)
 	if (cq == NULL) {
 		return;
 	}
-	atomic_dec(&cq->cq_refcnt);
+	ofi_atomic_dec32(&cq->cq_refcnt);
 
 	rtn = usdf_progress_hard_cq;
 
 	if (cq->cq_is_soft) {
 		TAILQ_FOREACH(hcq, &cq->c.soft.cq_list, cqh_link) {
 			if (hcq->cqh_progress == rtn) {
-				atomic_dec(&hcq->cqh_refcnt);
+				ofi_atomic_dec32(&hcq->cqh_refcnt);
 				return;
 			}
 		}
@@ -273,7 +287,7 @@ usdf_ep_dgram_close(fid_t fid)
 
 	ep = ep_fidtou(fid);
 
-	if (atomic_get(&ep->ep_refcnt) > 0) {
+	if (ofi_atomic_get32(&ep->ep_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
@@ -282,13 +296,13 @@ usdf_ep_dgram_close(fid_t fid)
 	if (ep->e.dg.ep_qp != NULL) {
 		usd_destroy_qp(ep->e.dg.ep_qp);
 	}
-	atomic_dec(&ep->ep_domain->dom_refcnt);
+	ofi_atomic_dec32(&ep->ep_domain->dom_refcnt);
 	if (ep->ep_eq != NULL) {
-		atomic_dec(&ep->ep_eq->eq_refcnt);
+		ofi_atomic_dec32(&ep->ep_eq->eq_refcnt);
 	}
 
 	if (ep->e.dg.ep_av)
-		atomic_dec(&ep->e.dg.ep_av->av_refcnt);
+		ofi_atomic_dec32(&ep->e.dg.ep_av->av_refcnt);
 
 	usdf_ep_dgram_deref_cq(ep->e.dg.ep_wcq);
 	usdf_ep_dgram_deref_cq(ep->e.dg.ep_rcq);
@@ -359,6 +373,24 @@ static struct fi_ops_cm usdf_cm_dgram_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
+};
+
+static struct fi_ops_atomic usdf_dgram_atomic_ops = {
+	.size = sizeof(struct fi_ops_atomic),
+	.write = fi_no_atomic_write,
+	.writev = fi_no_atomic_writev,
+	.writemsg = fi_no_atomic_writemsg,
+	.inject = fi_no_atomic_inject,
+	.readwrite = fi_no_atomic_readwrite,
+	.readwritev = fi_no_atomic_readwritev,
+	.readwritemsg = fi_no_atomic_readwritemsg,
+	.compwrite = fi_no_atomic_compwrite,
+	.compwritev = fi_no_atomic_compwritev,
+	.compwritemsg = fi_no_atomic_compwritemsg,
+	.writevalid = fi_no_atomic_writevalid,
+	.readwritevalid = fi_no_atomic_readwritevalid,
+	.compwritevalid = fi_no_atomic_compwritevalid,
 };
 
 /*******************************************************************************
@@ -398,11 +430,15 @@ static const struct fi_ep_attr dgram_dflt_ep_attr = {
 };
 
 static const struct fi_domain_attr dgram_dflt_domain_attr = {
+	.caps = USDF_DOM_CAPS,
 	.threading = FI_THREAD_ENDPOINT,
 	.control_progress = FI_PROGRESS_AUTO,
 	.data_progress = FI_PROGRESS_MANUAL,
 	.resource_mgmt = FI_RM_DISABLED,
-	.mr_mode = FI_MR_BASIC
+	.mr_mode = OFI_MR_BASIC_MAP | FI_MR_LOCAL,
+	.cntr_cnt = USDF_DGRAM_CNTR_CNT,
+	.mr_iov_limit = USDF_DGRAM_MR_IOV_LIMIT,
+	.mr_cnt = USDF_DGRAM_MR_CNT,
 };
 
 /*******************************************************************************
@@ -476,7 +512,7 @@ int usdf_dgram_fill_dom_attr(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 
 	if (!hints || !hints->domain_attr)
-		goto out;
+		goto catch;
 
 	switch (hints->domain_attr->threading) {
 	case FI_THREAD_UNSPEC:
@@ -519,23 +555,44 @@ int usdf_dgram_fill_dom_attr(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 	}
 
-	switch (hints->domain_attr->mr_mode) {
-	case FI_MR_UNSPEC:
-	case FI_MR_BASIC:
+	switch (hints->domain_attr->caps) {
+	case 0:
+	case FI_REMOTE_COMM:
 		break;
 	default:
+		USDF_WARN_SYS(DOMAIN,
+			"invalid domain capabilities\n");
 		return -FI_ENODATA;
 	}
 
-out:
-	*fi->domain_attr = defaults;
+	if (usdf_check_mr_mode(version, hints, defaults.mr_mode))
+		return -FI_ENODATA;
+
+	if (hints->domain_attr->mr_cnt) {
+		if (hints->domain_attr->mr_cnt <= USDF_DGRAM_MR_CNT) {
+			defaults.mr_cnt = hints->domain_attr->mr_cnt;
+		} else {
+			USDF_DBG_SYS(DOMAIN,
+				     "mr_count exceeded provider limit\n");
+			return -FI_ENODATA;
+		}
+	}
 
+catch:
+	/* catch the version change here. */
+	ret = usdf_catch_dom_attr(version, hints, &defaults);
+	if (ret)
+		return ret;
+
+	*fi->domain_attr = defaults;
 	return FI_SUCCESS;
 }
 
-int usdf_dgram_fill_tx_attr(struct fi_info *hints, struct fi_info *fi,
-		struct usd_device_attrs *dap)
+int usdf_dgram_fill_tx_attr(uint32_t version, struct fi_info *hints,
+			    struct fi_info *fi,
+			    struct usd_device_attrs *dap)
 {
+	int ret;
 	struct fi_tx_attr defaults;
 	size_t entries;
 
@@ -551,11 +608,8 @@ int usdf_dgram_fill_tx_attr(struct fi_info *hints, struct fi_info *fi,
 		return -FI_ENODATA;
 
 	/* clear the mode bits the app doesn't support */
-	defaults.mode &= (hints->mode | hints->tx_attr->mode);
-
-	/* make sure the app supports our required mode bits */
-	if ((defaults.mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE)
-		return -FI_ENODATA;
+	if (hints->mode || hints->tx_attr->mode)
+		defaults.mode &= (hints->mode | hints->tx_attr->mode);
 
 	defaults.op_flags |= hints->tx_attr->op_flags;
 
@@ -603,14 +657,20 @@ out:
 	if (!hints || (hints && !(hints->mode & FI_MSG_PREFIX)))
 		defaults.iov_limit -= 1;
 
+	/* catch version changes here. */
+	ret = usdf_catch_tx_attr(version, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->tx_attr = defaults;
 
 	return FI_SUCCESS;
 }
 
-int usdf_dgram_fill_rx_attr(struct fi_info *hints, struct fi_info *fi,
-		struct usd_device_attrs *dap)
+int usdf_dgram_fill_rx_attr(uint32_t version, struct fi_info *hints,
+			    struct fi_info *fi, struct usd_device_attrs *dap)
 {
+	int ret;
 	struct fi_rx_attr defaults;
 	size_t entries;
 
@@ -626,11 +686,8 @@ int usdf_dgram_fill_rx_attr(struct fi_info *hints, struct fi_info *fi,
 		return -FI_ENODATA;
 
 	/* clear the mode bits the app doesn't support */
-	defaults.mode &= (hints->mode | hints->rx_attr->mode);
-
-	/* make sure the app supports our required mode bits */
-	if ((defaults.mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE)
-		return -FI_ENODATA;
+	if (hints->mode || hints->tx_attr->mode)
+		defaults.mode &= (hints->mode | hints->rx_attr->mode);
 
 	defaults.op_flags |= hints->rx_attr->op_flags;
 
@@ -676,6 +733,11 @@ out:
 	if (!hints || (hints && !(hints->mode & FI_MSG_PREFIX)))
 		defaults.iov_limit -= 1;
 
+	/* catch version changes here. */
+	ret = usdf_catch_rx_attr(version, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->rx_attr = defaults;
 
 	return FI_SUCCESS;
@@ -719,7 +781,7 @@ usdf_ep_dgram_open(struct fid_domain *domain, struct fi_info *info,
 	struct usdf_ep *ep;
 	int ret;
 	struct usdf_pep *parent_pep;
-	struct sockaddr *src_addr;
+	void *src_addr;
 	int is_bound;
 	size_t tx_size;
 	size_t rx_size;
@@ -764,14 +826,8 @@ usdf_ep_dgram_open(struct fid_domain *domain, struct fi_info *info,
 	}
 
 	if (!is_bound) {
-		if (info->src_addr != NULL) {
-			if (!usdf_cm_addr_is_valid_sin(info->src_addr,
-					info->src_addrlen, info->addr_format)) {
-				ret = -FI_EINVAL;
-				goto fail;
-			}
-			src_addr = info->src_addr;
-		}
+		if (info->src_addr != NULL)
+			src_addr = usdf_format_to_sin(info, info->src_addr);
 
 		if (src_addr != NULL) {
 			ret = bind(ep->e.dg.ep_sock, src_addr,
@@ -781,12 +837,15 @@ usdf_ep_dgram_open(struct fid_domain *domain, struct fi_info *info,
 				goto fail;
 			}
 		}
+
+		usdf_free_sin_if_needed(info, src_addr);
 	}
 
 	ep->ep_fid.fid.fclass = FI_CLASS_EP;
 	ep->ep_fid.fid.context = context;
 	ep->ep_fid.fid.ops = &usdf_ep_dgram_ops;
 	ep->ep_fid.cm = &usdf_cm_dgram_ops;
+	ep->ep_fid.atomic = &usdf_dgram_atomic_ops;
 	ep->ep_domain = udp;
 	ep->ep_caps = info->caps;
 	ep->ep_mode = info->mode;
@@ -856,8 +915,8 @@ usdf_ep_dgram_open(struct fid_domain *domain, struct fi_info *info,
 		ep->ep_fid.ops = &usdf_base_dgram_ops;
 		ep->ep_fid.msg = &usdf_dgram_ops;
 	}
-	atomic_initialize(&ep->ep_refcnt, 0);
-	atomic_inc(&udp->dom_refcnt);
+	ofi_atomic_initialize32(&ep->ep_refcnt, 0);
+	ofi_atomic_inc32(&udp->dom_refcnt);
 
 	*ep_o = ep_utof(ep);
 	return 0;
diff --git a/prov/usnic/src/usdf_ep_msg.c b/prov/usnic/src/usdf_ep_msg.c
index daf7af1..19238ae 100644
--- a/prov/usnic/src/usdf_ep_msg.c
+++ b/prov/usnic/src/usdf_ep_msg.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -55,6 +55,7 @@
 #include <rdma/fi_errno.h>
 #include "fi.h"
 #include "fi_enosys.h"
+#include "fi_util.h"
 
 #include "usnic_direct.h"
 #include "usd.h"
@@ -111,11 +112,32 @@ static const struct fi_ep_attr msg_dflt_ep_attr = {
 };
 
 static const struct fi_domain_attr msg_dflt_domain_attr = {
+	.caps = USDF_DOM_CAPS,
 	.threading = FI_THREAD_UNSPEC,
 	.control_progress = FI_PROGRESS_AUTO,
 	.data_progress = FI_PROGRESS_MANUAL,
 	.resource_mgmt = FI_RM_DISABLED,
-	.mr_mode = FI_MR_BASIC
+	.mr_mode = OFI_MR_BASIC_MAP | FI_MR_LOCAL,
+	.cntr_cnt = USDF_MSG_CNTR_CNT,
+	.mr_iov_limit = USDF_MSG_MR_IOV_LIMIT,
+	.mr_cnt = USDF_MSG_MR_CNT,
+};
+
+static struct fi_ops_atomic usdf_msg_atomic_ops = {
+	.size = sizeof(struct fi_ops_atomic),
+	.write = fi_no_atomic_write,
+	.writev = fi_no_atomic_writev,
+	.writemsg = fi_no_atomic_writemsg,
+	.inject = fi_no_atomic_inject,
+	.readwrite = fi_no_atomic_readwrite,
+	.readwritev = fi_no_atomic_readwritev,
+	.readwritemsg = fi_no_atomic_readwritemsg,
+	.compwrite = fi_no_atomic_compwrite,
+	.compwritev = fi_no_atomic_compwritev,
+	.compwritemsg = fi_no_atomic_compwritemsg,
+	.writevalid = fi_no_atomic_writevalid,
+	.readwritevalid = fi_no_atomic_readwritevalid,
+	.compwritevalid = fi_no_atomic_compwritevalid,
 };
 
 /*******************************************************************************
@@ -175,7 +197,7 @@ int usdf_msg_fill_dom_attr(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 
 	if (!hints || !hints->domain_attr)
-		goto out;
+		goto catch;
 
 	/* how to handle fi_thread_fid, fi_thread_completion, etc?
 	 */
@@ -213,39 +235,55 @@ int usdf_msg_fill_dom_attr(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 	}
 
-	switch (hints->domain_attr->mr_mode) {
-	case FI_MR_UNSPEC:
-	case FI_MR_BASIC:
+	switch (hints->domain_attr->caps) {
+	case 0:
+	case FI_REMOTE_COMM:
 		break;
 	default:
+		USDF_WARN_SYS(DOMAIN,
+			"invalid domain capabilities\n");
 		return -FI_ENODATA;
 	}
 
-out:
+	if (usdf_check_mr_mode(version, hints, defaults.mr_mode))
+		return -FI_ENODATA;
+
+	if (hints->domain_attr->mr_cnt <= USDF_MSG_MR_CNT) {
+		defaults.mr_cnt = hints->domain_attr->mr_cnt;
+	} else {
+		USDF_DBG_SYS(DOMAIN, "mr_count exceeded provider limit\n");
+		return -FI_ENODATA;
+	}
+
+catch:
+	/* catch the version changes here. */
+	ret = usdf_catch_dom_attr(version, hints, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->domain_attr = defaults;
 
 	return FI_SUCCESS;
 }
 
-int usdf_msg_fill_tx_attr(struct fi_info *hints, struct fi_info *fi)
+int usdf_msg_fill_tx_attr(uint32_t version, struct fi_info *hints,
+			  struct fi_info *fi)
 {
+	int ret;
 	struct fi_tx_attr defaults;
 
 	defaults = msg_dflt_tx_attr;
 
 	if (!hints || !hints->tx_attr)
-		goto out;
+		goto catch;
 
 	/* make sure we can support the caps that are requested*/
 	if (hints->tx_attr->caps & ~USDF_MSG_CAPS)
 		return -FI_ENODATA;
 
 	/* clear the mode bits the app doesn't support */
-	defaults.mode &= (hints->mode | hints->tx_attr->mode);
-
-	/* make sure the app supports our required mode bits */
-	if ((defaults.mode & USDF_MSG_REQ_MODE) != USDF_MSG_REQ_MODE)
-		return -FI_ENODATA;
+	if (hints->mode || hints->tx_attr->mode)
+		defaults.mode &= (hints->mode | hints->tx_attr->mode);
 
 	defaults.op_flags |= hints->tx_attr->op_flags;
 
@@ -269,31 +307,34 @@ int usdf_msg_fill_tx_attr(struct fi_info *hints, struct fi_info *fi)
 	if (hints->tx_attr->size > defaults.size)
 		return -FI_ENODATA;
 
-out:
+catch:
+	/* catch version changes here. */
+	ret = usdf_catch_tx_attr(version, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->tx_attr = defaults;
 
 	return FI_SUCCESS;
 }
 
-int usdf_msg_fill_rx_attr(struct fi_info *hints, struct fi_info *fi)
+int usdf_msg_fill_rx_attr(uint32_t version, struct fi_info *hints, struct fi_info *fi)
 {
+	int ret;
 	struct fi_rx_attr defaults;
 
 	defaults = msg_dflt_rx_attr;
 
 	if (!hints || !hints->rx_attr)
-		goto out;
+		goto catch;
 
 	/* make sure we can support the capabilities that are requested */
 	if (hints->rx_attr->caps & ~USDF_MSG_CAPS)
 		return -FI_ENODATA;
 
 	/* clear the mode bits the app doesn't support */
-	defaults.mode &= (hints->mode | hints->rx_attr->mode);
-
-	/* make sure the app supports our required mode bits */
-	if ((defaults.mode & USDF_MSG_REQ_MODE) != USDF_MSG_REQ_MODE)
-		return -FI_ENODATA;
+	if (hints->mode || hints->rx_attr->mode)
+		defaults.mode &= (hints->mode | hints->rx_attr->mode);
 
 	defaults.op_flags |= hints->rx_attr->op_flags;
 
@@ -314,7 +355,12 @@ int usdf_msg_fill_rx_attr(struct fi_info *hints, struct fi_info *fi)
 	if (hints->rx_attr->size > defaults.size)
 		return -FI_ENODATA;
 
-out:
+catch:
+	/* catch version changes here. */
+	ret = usdf_catch_rx_attr(version, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->rx_attr = defaults;
 
 	return FI_SUCCESS;
@@ -647,7 +693,7 @@ usdf_ep_msg_bind_cq(struct usdf_ep *ep, struct usdf_cq *cq, uint64_t flags)
 			goto fail;
 
 		hcq->cqh_cq = cq;
-		atomic_initialize(&hcq->cqh_refcnt, 0);
+		ofi_atomic_initialize32(&hcq->cqh_refcnt, 0);
 		hcq->cqh_progress = usdf_msg_hcq_progress;
 		hcq->cqh_post = usdf_cq_post_soft;
 		TAILQ_INSERT_TAIL(&cq->c.soft.cq_list, hcq, cqh_link);
@@ -656,8 +702,8 @@ usdf_ep_msg_bind_cq(struct usdf_ep *ep, struct usdf_cq *cq, uint64_t flags)
 		TAILQ_INSERT_TAIL(&ep->ep_domain->dom_hcq_list,
 				hcq, cqh_dom_link);
 	}
-	atomic_inc(&hcq->cqh_refcnt);
-	atomic_inc(&cq->cq_refcnt);
+	ofi_atomic_inc32(&hcq->cqh_refcnt);
+	ofi_atomic_inc32(&cq->cq_refcnt);
 	*hcqp = hcq;
 	return 0;
 
@@ -669,11 +715,17 @@ fail:
 static int
 usdf_ep_msg_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 {
+	int ret;
 	struct usdf_ep *ep;
 	struct usdf_cq *cq;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
+	/* Validate the flags. */
+	ret = ofi_ep_bind_valid(&usdf_ops, bfid, flags);
+	if (ret)
+		return ret;
+
 	ep = ep_fidtou(fid);
 
 	switch (bfid->fclass) {
@@ -703,7 +755,7 @@ usdf_ep_msg_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 			return -FI_EINVAL;
 		}
 		ep->ep_eq = eq_fidtou(bfid);
-		atomic_inc(&ep->ep_eq->eq_refcnt);
+		ofi_atomic_inc32(&ep->ep_eq->eq_refcnt);
 		break;
 	default:
 		return -FI_EINVAL;
@@ -720,14 +772,14 @@ usdf_msg_rx_ctx_close(fid_t fid)
 
 	rx = rx_fidtou(fid);
 
-	if (atomic_get(&rx->rx_refcnt) > 0) {
+	if (ofi_atomic_get32(&rx->rx_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
 	hcq = rx->r.msg.rx_hcq;
 	if (hcq != NULL) {
-		atomic_dec(&hcq->cqh_refcnt);
-		atomic_dec(&hcq->cqh_cq->cq_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_cq->cq_refcnt);
 	}
 
 	if (rx->rx_qp != NULL) {
@@ -735,7 +787,7 @@ usdf_msg_rx_ctx_close(fid_t fid)
 		free(rx->r.msg.rx_rqe_buf);
 		usd_destroy_qp(rx->rx_qp);
 	}
-	atomic_dec(&rx->rx_domain->dom_refcnt);
+	ofi_atomic_dec32(&rx->rx_domain->dom_refcnt);
 
 	free(rx);
 
@@ -750,14 +802,14 @@ usdf_msg_tx_ctx_close(fid_t fid)
 
 	tx = tx_fidtou(fid);
 
-	if (atomic_get(&tx->tx_refcnt) > 0) {
+	if (ofi_atomic_get32(&tx->tx_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
 	hcq = tx->t.msg.tx_hcq;
 	if (hcq != NULL) {
-		atomic_dec(&hcq->cqh_refcnt);
-		atomic_dec(&hcq->cqh_cq->cq_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_cq->cq_refcnt);
 	}
 
 	if (tx->tx_qp != NULL) {
@@ -765,7 +817,7 @@ usdf_msg_tx_ctx_close(fid_t fid)
 		free(tx->t.msg.tx_wqe_buf);
 		usd_destroy_qp(tx->tx_qp);
 	}
-	atomic_dec(&tx->tx_domain->dom_refcnt);
+	ofi_atomic_dec32(&tx->tx_domain->dom_refcnt);
 
 	free(tx);
 
@@ -781,27 +833,27 @@ usdf_ep_msg_close(fid_t fid)
 
 	ep = ep_fidtou(fid);
 
-	if (atomic_get(&ep->ep_refcnt) > 0) {
+	if (ofi_atomic_get32(&ep->ep_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
 	if (ep->ep_rx != NULL) {
-		atomic_dec(&ep->ep_rx->rx_refcnt);
+		ofi_atomic_dec32(&ep->ep_rx->rx_refcnt);
 		if (rx_utofid(ep->ep_rx)->fclass  == FI_CLASS_RX_CTX) {
 			(void) usdf_msg_rx_ctx_close(rx_utofid(ep->ep_rx));
 		}
 	}
 
 	if (ep->ep_tx != NULL) {
-		atomic_dec(&ep->ep_tx->tx_refcnt);
+		ofi_atomic_dec32(&ep->ep_tx->tx_refcnt);
 		if (tx_utofid(ep->ep_tx)->fclass  == FI_CLASS_TX_CTX) {
 			(void) usdf_msg_tx_ctx_close(tx_utofid(ep->ep_tx));
 		}
 	}
 
-	atomic_dec(&ep->ep_domain->dom_refcnt);
+	ofi_atomic_dec32(&ep->ep_domain->dom_refcnt);
 	if (ep->ep_eq != NULL) {
-		atomic_dec(&ep->ep_eq->eq_refcnt);
+		ofi_atomic_dec32(&ep->ep_eq->eq_refcnt);
 	}
 	usdf_timer_free(ep->ep_domain->dom_fabric, ep->e.msg.ep_ack_timer);
 
@@ -830,6 +882,7 @@ static struct fi_ops_cm usdf_cm_msg_ops = {
 	.accept = usdf_cm_msg_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
 static struct fi_ops_msg usdf_msg_ops = {
@@ -921,6 +974,7 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 	struct usdf_connreq *connreq;
 	struct usdf_pep *parent_pep;
 	int is_bound;
+	uint32_t api_version;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
@@ -951,6 +1005,7 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 
 	udp = dom_ftou(domain);
 	fp = udp->dom_fabric;
+	api_version = fp->fab_attr.fabric->api_version;
 
 	/* allocate peer table if not done */
 	if (udp->dom_peer_tab == NULL) {
@@ -973,6 +1028,7 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 	ep->ep_fid.ops = &usdf_base_msg_ops;
 	ep->ep_fid.cm = &usdf_cm_msg_ops;
 	ep->ep_fid.msg = &usdf_msg_ops;
+	ep->ep_fid.atomic = &usdf_msg_atomic_ops;
 	ep->ep_domain = udp;
 	ep->ep_caps = info->caps;
 	ep->ep_mode = info->mode;
@@ -1018,13 +1074,13 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 			goto fail;
 		}
 		tx->tx_fid.fid.fclass = FI_CLASS_TX_CTX;
-		atomic_initialize(&tx->tx_refcnt, 0);
+		ofi_atomic_initialize32(&tx->tx_refcnt, 0);
 		tx->tx_domain = udp;
 		tx->tx_progress = usdf_msg_tx_progress;
-		atomic_inc(&udp->dom_refcnt);
+		ofi_atomic_inc32(&udp->dom_refcnt);
 
 		/* use info as the hints structure, and the output structure */
-		ret = usdf_msg_fill_tx_attr(info, info);
+		ret = usdf_msg_fill_tx_attr(api_version, info, info);
 		if (ret != 0)
 			goto fail;
 		tx->tx_attr = *info->tx_attr;
@@ -1034,7 +1090,7 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 		TAILQ_INIT(&tx->t.msg.tx_ep_have_acks);
 
 		ep->ep_tx = tx;
-		atomic_inc(&tx->tx_refcnt);
+		ofi_atomic_inc32(&tx->tx_refcnt);
 	}
 	TAILQ_INIT(&ep->e.msg.ep_posted_wqe);
 
@@ -1047,12 +1103,12 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 			goto fail;
 		}
 		rx->rx_fid.fid.fclass = FI_CLASS_RX_CTX;
-		atomic_initialize(&rx->rx_refcnt, 0);
+		ofi_atomic_initialize32(&rx->rx_refcnt, 0);
 		rx->rx_domain = udp;
-		atomic_inc(&udp->dom_refcnt);
+		ofi_atomic_inc32(&udp->dom_refcnt);
 
 		/* info serves as both the hints and the output */
-		ret = usdf_msg_fill_rx_attr(info, info);
+		ret = usdf_msg_fill_rx_attr(api_version, info, info);
 		if (ret != 0)
 			goto fail;
 		rx->rx_attr = *info->rx_attr;
@@ -1061,22 +1117,22 @@ usdf_ep_msg_open(struct fid_domain *domain, struct fi_info *info,
 		TAILQ_INIT(&rx->r.msg.rx_posted_rqe);
 
 		ep->ep_rx = rx;
-		atomic_inc(&rx->rx_refcnt);
+		ofi_atomic_inc32(&rx->rx_refcnt);
 	}
 
-	atomic_initialize(&ep->ep_refcnt, 0);
-	atomic_inc(&udp->dom_refcnt);
+	ofi_atomic_initialize32(&ep->ep_refcnt, 0);
+	ofi_atomic_inc32(&udp->dom_refcnt);
 
 	*ep_o = ep_utof(ep);
 	return 0;
 fail:
 	if (rx != NULL) {
 		free(rx);
-		atomic_dec(&udp->dom_refcnt);
+		ofi_atomic_dec32(&udp->dom_refcnt);
 	}
 	if (tx != NULL) {
 		free(tx);
-		atomic_dec(&udp->dom_refcnt);
+		ofi_atomic_dec32(&udp->dom_refcnt);
 	}
 	if (ep != NULL) {
 		if (ep->e.msg.ep_ack_timer != NULL) {
diff --git a/prov/usnic/src/usdf_ep_rdm.c b/prov/usnic/src/usdf_ep_rdm.c
index 2f0db1e..f969705 100644
--- a/prov/usnic/src/usdf_ep_rdm.c
+++ b/prov/usnic/src/usdf_ep_rdm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -56,6 +56,7 @@
 #include <rdma/fi_errno.h>
 #include "fi.h"
 #include "fi_enosys.h"
+#include "fi_util.h"
 
 #include "usd.h"
 #include "usdf.h"
@@ -114,11 +115,32 @@ static const struct fi_ep_attr rdm_dflt_ep_attr = {
 };
 
 static const struct fi_domain_attr rdm_dflt_domain_attr = {
+	.caps = USDF_DOM_CAPS,
 	.threading = FI_THREAD_ENDPOINT,
 	.control_progress = FI_PROGRESS_AUTO,
 	.data_progress = FI_PROGRESS_MANUAL,
 	.resource_mgmt = FI_RM_DISABLED,
-	.mr_mode = FI_MR_BASIC
+	.mr_mode = OFI_MR_BASIC_MAP | FI_MR_LOCAL,
+	.cntr_cnt = USDF_RDM_CNTR_CNT,
+	.mr_iov_limit = USDF_RDM_MR_IOV_LIMIT,
+	.mr_cnt = USDF_RDM_MR_CNT,
+};
+
+static struct fi_ops_atomic usdf_rdm_atomic_ops = {
+	.size = sizeof(struct fi_ops_atomic),
+	.write = fi_no_atomic_write,
+	.writev = fi_no_atomic_writev,
+	.writemsg = fi_no_atomic_writemsg,
+	.inject = fi_no_atomic_inject,
+	.readwrite = fi_no_atomic_readwrite,
+	.readwritev = fi_no_atomic_readwritev,
+	.readwritemsg = fi_no_atomic_readwritemsg,
+	.compwrite = fi_no_atomic_compwrite,
+	.compwritev = fi_no_atomic_compwritev,
+	.compwritemsg = fi_no_atomic_compwritemsg,
+	.writevalid = fi_no_atomic_writevalid,
+	.readwritevalid = fi_no_atomic_readwritevalid,
+	.compwritevalid = fi_no_atomic_compwritevalid,
 };
 
 /*******************************************************************************
@@ -179,7 +201,7 @@ int usdf_rdm_fill_dom_attr(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 
 	if (!hints || !hints->domain_attr)
-		goto out;
+		goto catch;
 
 	/* how to handle fi_thread_fid, fi_thread_completion, etc?
 	 */
@@ -217,39 +239,55 @@ int usdf_rdm_fill_dom_attr(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 	}
 
-	switch (hints->domain_attr->mr_mode) {
-	case FI_MR_UNSPEC:
-	case FI_MR_BASIC:
+	switch (hints->domain_attr->caps) {
+	case 0:
+	case FI_REMOTE_COMM:
 		break;
 	default:
+		USDF_WARN_SYS(DOMAIN,
+			"invalid domain capabilities\n");
 		return -FI_ENODATA;
 	}
 
-out:
+	if (usdf_check_mr_mode(version, hints, defaults.mr_mode))
+		return -FI_ENODATA;
+
+	if (hints->domain_attr->mr_cnt <= USDF_RDM_MR_CNT) {
+		defaults.mr_cnt = hints->domain_attr->mr_cnt;
+	} else {
+		USDF_DBG_SYS(DOMAIN, "mr_count exceeded provider limit\n");
+		return -FI_ENODATA;
+	}
+
+catch:
+	/* catch the version changes here. */
+	ret = usdf_catch_dom_attr(version, hints, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->domain_attr = defaults;
 
 	return FI_SUCCESS;
 }
 
-int usdf_rdm_fill_tx_attr(struct fi_info *hints, struct fi_info *fi)
+int usdf_rdm_fill_tx_attr(uint32_t version, struct fi_info *hints,
+			  struct fi_info *fi)
 {
+	int ret;
 	struct fi_tx_attr defaults;
 
 	defaults = rdm_dflt_tx_attr;
 
 	if (!hints || !hints->tx_attr)
-		goto out;
+		goto catch;
 
 	/* make sure we can support the caps that are requested*/
 	if (hints->tx_attr->caps & ~USDF_RDM_CAPS)
 		return -FI_ENODATA;
 
 	/* clear the mode bits the app doesn't support */
-	defaults.mode &= (hints->mode | hints->tx_attr->mode);
-
-	/* make sure the app supports our required mode bits */
-	if ((defaults.mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE)
-		return -FI_ENODATA;
+	if (hints->mode || hints->tx_attr->mode)
+		defaults.mode &= (hints->mode | hints->tx_attr->mode);
 
 	defaults.op_flags |= hints->tx_attr->op_flags;
 
@@ -273,31 +311,35 @@ int usdf_rdm_fill_tx_attr(struct fi_info *hints, struct fi_info *fi)
 	if (hints->tx_attr->size > defaults.size)
 		return -FI_ENODATA;
 
-out:
+catch:
+	/* catch version changes here. */
+	ret = usdf_catch_tx_attr(version, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->tx_attr = defaults;
 
 	return FI_SUCCESS;
 }
 
-int usdf_rdm_fill_rx_attr(struct fi_info *hints, struct fi_info *fi)
+int usdf_rdm_fill_rx_attr(uint32_t version, struct fi_info *hints,
+			  struct fi_info *fi)
 {
+	int ret;
 	struct fi_rx_attr defaults;
 
 	defaults = rdm_dflt_rx_attr;
 
 	if (!hints || !hints->rx_attr)
-		goto out;
+		goto catch;
 
 	/* make sure we can support the capabilities that are requested */
 	if (hints->rx_attr->caps & ~USDF_RDM_CAPS)
 		return -FI_ENODATA;
 
 	/* clear the mode bits the app doesn't support */
-	defaults.mode &= (hints->mode | hints->rx_attr->mode);
-
-	/* make sure the app supports our required mode bits */
-	if ((defaults.mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE)
-		return -FI_ENODATA;
+	if (hints->mode || hints->rx_attr->mode)
+		defaults.mode &= (hints->mode | hints->rx_attr->mode);
 
 	defaults.op_flags |= hints->rx_attr->op_flags;
 
@@ -318,7 +360,12 @@ int usdf_rdm_fill_rx_attr(struct fi_info *hints, struct fi_info *fi)
 	if (hints->rx_attr->size > defaults.size)
 		return -FI_ENODATA;
 
-out:
+catch:
+	/* catch version changes here. */
+	ret = usdf_catch_rx_attr(version, &defaults);
+	if (ret)
+		return ret;
+
 	*fi->rx_attr = defaults;
 
 	return FI_SUCCESS;
@@ -639,7 +686,7 @@ usdf_ep_rdm_bind_cq(struct usdf_ep *ep, struct usdf_cq *cq, uint64_t flags)
 			goto fail;
 
 		hcq->cqh_cq = cq;
-		atomic_initialize(&hcq->cqh_refcnt, 0);
+		ofi_atomic_initialize32(&hcq->cqh_refcnt, 0);
 		hcq->cqh_progress = usdf_rdm_hcq_progress;
 		hcq->cqh_post = usdf_cq_post_soft;
 		TAILQ_INSERT_TAIL(&cq->c.soft.cq_list, hcq, cqh_link);
@@ -648,8 +695,8 @@ usdf_ep_rdm_bind_cq(struct usdf_ep *ep, struct usdf_cq *cq, uint64_t flags)
 		TAILQ_INSERT_TAIL(&ep->ep_domain->dom_hcq_list,
 				hcq, cqh_dom_link);
 	}
-	atomic_inc(&hcq->cqh_refcnt);
-	atomic_inc(&cq->cq_refcnt);
+	ofi_atomic_inc32(&hcq->cqh_refcnt);
+	ofi_atomic_inc32(&cq->cq_refcnt);
 	*hcqp = hcq;
 	return 0;
 
@@ -663,12 +710,18 @@ fail:
 static int
 usdf_ep_rdm_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 {
+	int ret;
 	struct usdf_ep *ep;
 	struct usdf_cq *cq;
 	struct usdf_av *av;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
+	/* Check if the binding flags are valid. */
+	ret = ofi_ep_bind_valid(&usdf_ops, bfid, flags);
+	if (ret)
+		return ret;
+
 	ep = ep_fidtou(fid);
 
 	switch (bfid->fclass) {
@@ -680,7 +733,7 @@ usdf_ep_rdm_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 
 		av = av_fidtou(bfid);
 		ep->e.rdm.ep_av = av;
-		atomic_inc(&av->av_refcnt);
+		ofi_atomic_inc32(&av->av_refcnt);
 		break;
 
 	case FI_CLASS_CQ:
@@ -708,7 +761,7 @@ usdf_ep_rdm_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 			return -FI_EINVAL;
 		}
 		ep->ep_eq = eq_fidtou(bfid);
-		atomic_inc(&ep->ep_eq->eq_refcnt);
+		ofi_atomic_inc32(&ep->ep_eq->eq_refcnt);
 		break;
 	default:
 		return -FI_EINVAL;
@@ -730,14 +783,14 @@ usdf_rdm_rx_ctx_close(fid_t fid)
 
 	rx = rx_fidtou(fid);
 
-	if (atomic_get(&rx->rx_refcnt) > 0) {
+	if (ofi_atomic_get32(&rx->rx_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
 	hcq = rx->r.rdm.rx_hcq;
 	if (hcq != NULL) {
-		atomic_dec(&hcq->cqh_refcnt);
-		atomic_dec(&hcq->cqh_cq->cq_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_cq->cq_refcnt);
 	}
 	if (rx->r.rdm.rx_sock != -1) {
 		close(rx->r.rdm.rx_sock);
@@ -748,7 +801,7 @@ usdf_rdm_rx_ctx_close(fid_t fid)
 		free(rx->r.rdm.rx_rqe_buf);
 		usd_destroy_qp(rx->rx_qp);
 	}
-	atomic_dec(&rx->rx_domain->dom_refcnt);
+	ofi_atomic_dec32(&rx->rx_domain->dom_refcnt);
 
 	free(rx);
 
@@ -768,14 +821,14 @@ usdf_rdm_tx_ctx_close(fid_t fid)
 
 	tx = tx_fidtou(fid);
 
-	if (atomic_get(&tx->tx_refcnt) > 0) {
+	if (ofi_atomic_get32(&tx->tx_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
 	hcq = tx->t.rdm.tx_hcq;
 	if (hcq != NULL) {
-		atomic_dec(&hcq->cqh_refcnt);
-		atomic_dec(&hcq->cqh_cq->cq_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_refcnt);
+		ofi_atomic_dec32(&hcq->cqh_cq->cq_refcnt);
 	}
 
 	if (tx->tx_qp != NULL) {
@@ -783,7 +836,7 @@ usdf_rdm_tx_ctx_close(fid_t fid)
 		free(tx->t.rdm.tx_wqe_buf);
 		usd_destroy_qp(tx->tx_qp);
 	}
-	atomic_dec(&tx->tx_domain->dom_refcnt);
+	ofi_atomic_dec32(&tx->tx_domain->dom_refcnt);
 
 	free(tx);
 
@@ -799,11 +852,15 @@ usdf_rx_rdm_port_bind(struct usdf_rx *rx, struct fi_info *info)
 	int ret;
 
 	if (info->src_addr != NULL) {
-		if (info->addr_format != FI_SOCKADDR &&
-		    info->addr_format != FI_SOCKADDR_IN) {
+		switch (info->addr_format) {
+		case FI_SOCKADDR:
+		case FI_SOCKADDR_IN:
+		case FI_ADDR_STR:
+			sin = usdf_format_to_sin(info, info->src_addr);
+			break;
+		default:
 			return -FI_EINVAL;
 		}
-		sin = (struct sockaddr_in *)info->src_addr;
 	} else {
 		memset(&src, 0, sizeof(src));
 		sin = &src;
@@ -827,6 +884,14 @@ usdf_rx_rdm_port_bind(struct usdf_rx *rx, struct fi_info *info)
 		 return -errno;
 	}
 
+	/* This has to be here because usdf_sin_to_format will allocate
+	 * new piece of memory if the string conversion happens.
+	 */
+	if (info->addr_format == FI_ADDR_STR)
+		free(info->src_addr);
+
+	info->src_addr = usdf_sin_to_format(info, sin, &info->src_addrlen);
+
 	return 0;
 }
 
@@ -839,31 +904,31 @@ usdf_ep_rdm_close(fid_t fid)
 
 	ep = ep_fidtou(fid);
 
-	if (atomic_get(&ep->ep_refcnt) > 0) {
+	if (ofi_atomic_get32(&ep->ep_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
 	if (ep->ep_rx != NULL) {
-		atomic_dec(&ep->ep_rx->rx_refcnt);
+		ofi_atomic_dec32(&ep->ep_rx->rx_refcnt);
 		if (rx_utofid(ep->ep_rx)->fclass  == FI_CLASS_RX_CTX) {
 			(void) usdf_rdm_rx_ctx_close(rx_utofid(ep->ep_rx));
 		}
 	}
 
 	if (ep->ep_tx != NULL) {
-		atomic_dec(&ep->ep_tx->tx_refcnt);
+		ofi_atomic_dec32(&ep->ep_tx->tx_refcnt);
 		if (tx_utofid(ep->ep_tx)->fclass  == FI_CLASS_TX_CTX) {
 			(void) usdf_rdm_tx_ctx_close(tx_utofid(ep->ep_tx));
 		}
 	}
 
-	atomic_dec(&ep->ep_domain->dom_refcnt);
+	ofi_atomic_dec32(&ep->ep_domain->dom_refcnt);
 	if (ep->ep_eq != NULL) {
-		atomic_dec(&ep->ep_eq->eq_refcnt);
+		ofi_atomic_dec32(&ep->ep_eq->eq_refcnt);
 	}
 
 	if (ep->e.rdm.ep_av)
-		atomic_dec(&ep->e.rdm.ep_av->av_refcnt);
+		ofi_atomic_dec32(&ep->e.rdm.ep_av->av_refcnt);
 
 	free(ep);
 	return 0;
@@ -890,6 +955,7 @@ static struct fi_ops_cm usdf_cm_rdm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
 static struct fi_ops_msg usdf_rdm_ops = {
@@ -944,6 +1010,7 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 	struct usdf_rx *rx;
 	struct usdf_ep *ep;
 	int ret;
+	uint32_t api_version;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
@@ -955,6 +1022,7 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 	}
 
 	udp = dom_ftou(domain);
+	api_version = udp->dom_fabric->fab_attr.fabric->api_version;
 
 	/* allocate peer table if not done */
 	if (udp->dom_peer_tab == NULL) {
@@ -977,6 +1045,7 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 	ep->ep_fid.ops = &usdf_base_rdm_ops;
 	ep->ep_fid.cm = &usdf_cm_rdm_ops;
 	ep->ep_fid.msg = &usdf_rdm_ops;
+	ep->ep_fid.atomic = &usdf_rdm_atomic_ops;
 	ep->ep_domain = udp;
 	ep->ep_caps = info->caps;
 	ep->ep_mode = info->mode;
@@ -992,14 +1061,14 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 			goto fail;
 		}
 		tx->tx_fid.fid.fclass = FI_CLASS_TX_CTX;
-		atomic_initialize(&tx->tx_refcnt, 0);
+		ofi_atomic_initialize32(&tx->tx_refcnt, 0);
 		tx->tx_domain = udp;
 		tx->tx_progress = usdf_rdm_tx_progress;
-		atomic_initialize(&tx->t.rdm.tx_next_msg_id, 1);
-		atomic_inc(&udp->dom_refcnt);
+		ofi_atomic_initialize32(&tx->t.rdm.tx_next_msg_id, 1);
+		ofi_atomic_inc32(&udp->dom_refcnt);
 
 		/* info is both hints and output */
-		ret = usdf_rdm_fill_tx_attr(info, info);
+		ret = usdf_rdm_fill_tx_attr(api_version, info, info);
 		if (ret)
 			goto fail;
 		tx->tx_attr = *info->tx_attr;
@@ -1009,7 +1078,7 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 		TAILQ_INIT(&tx->t.rdm.tx_rdc_have_acks);
 
 		ep->ep_tx = tx;
-		atomic_inc(&tx->tx_refcnt);
+		ofi_atomic_inc32(&tx->tx_refcnt);
 	}
 
 	/* implicitly create RX context if not to be shared */
@@ -1022,11 +1091,11 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 		}
 
 		rx->rx_fid.fid.fclass = FI_CLASS_RX_CTX;
-		atomic_initialize(&rx->rx_refcnt, 0);
+		ofi_atomic_initialize32(&rx->rx_refcnt, 0);
 		rx->rx_domain = udp;
 		rx->r.rdm.rx_tx = tx;
 		rx->r.rdm.rx_sock = -1;
-		atomic_inc(&udp->dom_refcnt);
+		ofi_atomic_inc32(&udp->dom_refcnt);
 
 		ret = usdf_rx_rdm_port_bind(rx, info);
 		if (ret) {
@@ -1034,7 +1103,7 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 		}
 
 		/* info is both hints and output */
-		ret = usdf_rdm_fill_rx_attr(info, info);
+		ret = usdf_rdm_fill_rx_attr(api_version, info, info);
 		if (ret) {
 			goto fail;
 		}
@@ -1044,11 +1113,11 @@ usdf_ep_rdm_open(struct fid_domain *domain, struct fi_info *info,
 		TAILQ_INIT(&rx->r.rdm.rx_posted_rqe);
 
 		ep->ep_rx = rx;
-		atomic_inc(&rx->rx_refcnt);
+		ofi_atomic_inc32(&rx->rx_refcnt);
 	}
 
-	atomic_initialize(&ep->ep_refcnt, 0);
-	atomic_inc(&udp->dom_refcnt);
+	ofi_atomic_initialize32(&ep->ep_refcnt, 0);
+	ofi_atomic_inc32(&udp->dom_refcnt);
 
 	*ep_o = ep_utof(ep);
 	return 0;
@@ -1058,11 +1127,11 @@ fail:
 			close(rx->r.rdm.rx_sock);
 		}
 		free(rx);
-		atomic_dec(&udp->dom_refcnt);
+		ofi_atomic_dec32(&udp->dom_refcnt);
 	}
 	if (tx != NULL) {
 		free(tx);
-		atomic_dec(&udp->dom_refcnt);
+		ofi_atomic_dec32(&udp->dom_refcnt);
 	}
 	if (ep != NULL) {
 		free(ep);
diff --git a/prov/usnic/src/usdf_eq.c b/prov/usnic/src/usdf_eq.c
index 48a330e..b4ae24d 100644
--- a/prov/usnic/src/usdf_eq.c
+++ b/prov/usnic/src/usdf_eq.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -67,7 +67,7 @@
 static inline int
 usdf_eq_empty(struct usdf_eq *eq)
 {
-	return (atomic_get(&eq->eq_num_events) == 0);
+	return (ofi_atomic_get32(&eq->eq_num_events) == 0);
 }
 
 static inline int
@@ -107,7 +107,7 @@ static inline ssize_t usdf_eq_read_event(struct usdf_eq *eq, uint32_t *event,
 
 	if (!(flags & FI_PEEK)) {
 		/* update count */
-		atomic_dec(&eq->eq_num_events);
+		ofi_atomic_dec32(&eq->eq_num_events);
 
 		/* Free the event buf if needed */
 		if (ev->ue_flags & USDF_EVENT_FLAG_FREE_BUF)
@@ -165,17 +165,41 @@ usdf_eq_write_event(struct usdf_eq *eq, uint32_t event,
 	}
 
 	/* increment queued event count */
-	atomic_inc(&eq->eq_num_events);
+	ofi_atomic_inc32(&eq->eq_num_events);
 
 	return len;
 }
 
+static void usdf_eq_clean_err(struct usdf_eq *eq, uint8_t destroy)
+{
+	struct usdf_err_data_entry *err_data_entry;
+	struct slist_entry *entry;
+
+	while (!slist_empty(&eq->eq_err_data)) {
+		entry = slist_remove_head(&eq->eq_err_data);
+		err_data_entry = container_of(entry, struct usdf_err_data_entry,
+				entry);
+		if (err_data_entry->seen || destroy) {
+			free(err_data_entry);
+		} else {
+			/* Oops, the rest hasn't been seen yet. Put this back
+			 * and exit.
+			 */
+			slist_insert_head(entry, &eq->eq_err_data);
+			break;
+		}
+	}
+}
+
 static ssize_t usdf_eq_readerr(struct fid_eq *feq,
-		struct fi_eq_err_entry *entry, uint64_t flags)
+		struct fi_eq_err_entry *given_buffer, uint64_t flags)
 {
 	struct usdf_err_data_entry *err_data_entry;
+	struct fi_eq_err_entry entry;
 	struct usdf_eq *eq;
-	ssize_t ret;
+	ssize_t ret, err_data_size;
+	uint32_t api_version;
+	void *err_data = NULL;
 
 	USDF_TRACE_SYS(EQ, "\n");
 
@@ -190,43 +214,51 @@ static ssize_t usdf_eq_readerr(struct fid_eq *feq,
 
 	/* make sure there is an error on top */
 	if (usdf_eq_empty(eq) || !usdf_eq_error(eq)) {
+		pthread_spin_unlock(&eq->eq_lock);
 		ret = -FI_EAGAIN;
 		goto done;
 	}
 
-	ret = usdf_eq_read_event(eq, NULL, entry, sizeof(*entry), flags);
+	ret = usdf_eq_read_event(eq, NULL, &entry, sizeof(entry), flags);
+
+	pthread_spin_unlock(&eq->eq_lock);
+
+	/* read the user's setting for err_data. */
+	err_data = given_buffer->err_data;
+	err_data_size = given_buffer->err_data_size;
+
+	/* Copy the entry. */
+	*given_buffer = entry;
 
 	/* Mark as seen so it can be cleaned on the next iteration of read. */
-	if (entry->err_data_size) {
-		err_data_entry = container_of(entry->err_data,
+	if (entry.err_data_size) {
+		err_data_entry = container_of(entry.err_data,
 				struct usdf_err_data_entry, err_data);
 		err_data_entry->seen = 1;
 	}
 
-done:
-	pthread_spin_unlock(&eq->eq_lock);
-	return ret;
-}
 
-static void usdf_eq_clean_err(struct usdf_eq *eq, uint8_t destroy)
-{
-	struct usdf_err_data_entry *err_data_entry;
-	struct slist_entry *entry;
-
-	while (!slist_empty(&eq->eq_err_data)) {
-		entry = slist_remove_head(&eq->eq_err_data);
-		err_data_entry = container_of(entry, struct usdf_err_data_entry,
-				entry);
-		if (err_data_entry->seen || destroy) {
-			free(err_data_entry);
-		} else {
-			/* Oops, the rest hasn't been seen yet. Put this back
-			 * and exit.
-			 */
-			slist_insert_head(entry, &eq->eq_err_data);
-			break;
+	/* For release > 1.5, we will copy the err_data directly
+	 * to the user's buffer.
+	 */
+	api_version = eq->eq_fabric->fab_attr.fabric->api_version;
+	if (FI_VERSION_GE(api_version, FI_VERSION(1, 5))) {
+		given_buffer->err_data = err_data;
+		given_buffer->err_data_size =
+			MIN(err_data_size, entry.err_data_size);
+		memcpy(given_buffer->err_data, entry.err_data,
+				given_buffer->err_data_size);
+
+		if (err_data_size < entry.err_data_size) {
+			USDF_DBG_SYS(EQ, "err_data truncated by %zd bytes.\n",
+				entry.err_data_size - err_data_size);
 		}
+
+		usdf_eq_clean_err(eq, 0);
 	}
+
+done:
+	return ret;
 }
 
 static ssize_t _usdf_eq_read(struct usdf_eq *eq, uint32_t *event, void *buf,
@@ -317,7 +349,7 @@ ssize_t usdf_eq_write_internal(struct usdf_eq *eq, uint32_t event,
 	/* Return -FI_EAGAIN if the EQ is full.
 	 * TODO: Disable the EQ.
 	 */
-	if (atomic_get(&eq->eq_num_events) == eq->eq_ev_ring_size) {
+	if (ofi_atomic_get32(&eq->eq_num_events) == eq->eq_ev_ring_size) {
 		ret = -FI_EAGAIN;
 		goto done;
 	}
@@ -462,7 +494,7 @@ static int usdf_eq_unbind_wait(struct usdf_eq *eq)
 
 	fid_list_remove(&wait_priv->list, &wait_priv->lock, &eq->eq_fid.fid);
 
-	atomic_dec(&wait_priv->wait_refcnt);
+	ofi_atomic_dec32(&wait_priv->wait_refcnt);
 
 	USDF_DBG_SYS(EQ,
 			"dissasociated EQ FD %d from epoll FD %d using FID: %p\n",
@@ -481,10 +513,10 @@ usdf_eq_close(fid_t fid)
 
 	eq = eq_fidtou(fid);
 
-	if (atomic_get(&eq->eq_refcnt) > 0) {
+	if (ofi_atomic_get32(&eq->eq_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
-	atomic_dec(&eq->eq_fabric->fab_refcnt);
+	ofi_atomic_dec32(&eq->eq_fabric->fab_refcnt);
 
 	/* release wait obj */
 	switch (eq->eq_attr.wait_obj) {
@@ -550,7 +582,7 @@ usdf_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 	eq->eq_fid.ops = &eq->eq_ops_data;
 
 	eq->eq_fabric = fab;
-	atomic_initialize(&eq->eq_refcnt, 0);
+	ofi_atomic_initialize32(&eq->eq_refcnt, 0);
 	ret = pthread_spin_init(&eq->eq_lock, PTHREAD_PROCESS_PRIVATE);
 	if (ret != 0) {
 		ret = -ret;
@@ -614,9 +646,9 @@ usdf_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 	eq->eq_ev_tail = eq->eq_ev_ring;
 	eq->eq_ev_ring_size = attr->size;
 	eq->eq_ev_end = eq->eq_ev_ring + eq->eq_ev_ring_size;
-	atomic_initialize(&eq->eq_num_events, 0);
+	ofi_atomic_initialize32(&eq->eq_num_events, 0);
 
-	atomic_inc(&eq->eq_fabric->fab_refcnt);
+	ofi_atomic_inc32(&eq->eq_fabric->fab_refcnt);
 
 	eq->eq_attr = *attr;
 	*feq = eq_utof(eq);
diff --git a/prov/usnic/src/usdf_fabric.c b/prov/usnic/src/usdf_fabric.c
index 65718b7..ff884c1 100644
--- a/prov/usnic/src/usdf_fabric.c
+++ b/prov/usnic/src/usdf_fabric.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -73,6 +73,7 @@
 #include "usdf_dgram.h"
 #include "usdf_msg.h"
 #include "usdf_rdm.h"
+#include "usdf_cm.h"
 
 struct usdf_usnic_info *__usdf_devinfo;
 
@@ -142,11 +143,9 @@ static bool usdf_fabric_checkname(uint32_t version,
 	return usdf_fabric_checkname(FI_VERSION(1, 3), dap, hint);
 }
 
-static int usdf_validate_hints(uint32_t version, struct fi_info *hints,
-			       struct usd_device_attrs *dap)
+static int usdf_validate_hints(uint32_t version, struct fi_info *hints)
 {
 	struct fi_fabric_attr *fattrp;
-	struct fi_domain_attr *dattrp;
 	size_t size;
 
 	switch (hints->addr_format) {
@@ -157,9 +156,20 @@ static int usdf_validate_hints(uint32_t version, struct fi_info *hints,
 	case FI_SOCKADDR:
 		size = sizeof(struct sockaddr);
 		break;
+	case FI_ADDR_STR:
+		if (hints->src_addr != NULL &&
+		    strlen((char *)hints->src_addr) > USDF_ADDR_STR_LEN)
+			return -FI_ENODATA;
+
+		if (hints->dest_addr != NULL &&
+		    strlen((char *)hints->dest_addr) > USDF_ADDR_STR_LEN)
+			return -FI_ENODATA;
+
+		goto skip_sockaddr_size_check;
 	default:
 		return -FI_ENODATA;
 	}
+
 	if (hints->src_addr != NULL && hints->src_addrlen < size) {
 		return -FI_ENODATA;
 	}
@@ -167,6 +177,7 @@ static int usdf_validate_hints(uint32_t version, struct fi_info *hints,
 		return -FI_ENODATA;
 	}
 
+skip_sockaddr_size_check:
 	if (hints->ep_attr != NULL) {
 		switch (hints->ep_attr->protocol) {
 		case FI_PROTO_UNSPEC:
@@ -176,6 +187,12 @@ static int usdf_validate_hints(uint32_t version, struct fi_info *hints,
 		default:
 			return -FI_ENODATA;
 		}
+
+		if (hints->ep_attr->auth_key || hints->ep_attr->auth_key_size) {
+			USDF_WARN_SYS(EP_CTRL,
+				"\"authorization key\" is not supported in this provider.\n");
+			return -FI_ENODATA;
+		}
 	}
 
 	fattrp = hints->fabric_attr;
@@ -184,32 +201,84 @@ static int usdf_validate_hints(uint32_t version, struct fi_info *hints,
 		    fattrp->prov_version != USDF_PROV_VERSION) {
 			return -FI_ENODATA;
 		}
+	}
+	return FI_SUCCESS;
+}
 
-		if (fattrp->name != NULL &&
-		    !usdf_fabric_checkname(version, dap, fattrp->name)) {
-			return -FI_ENODATA;
-		}
+static int
+usdf_fill_sockaddr_info(struct fi_info *fi,
+	struct sockaddr_in *src, struct sockaddr_in *dest,
+	struct usd_device_attrs *dap)
+{
+	int ret;
+	struct sockaddr_in *sin;
+
+	sin = calloc(1, sizeof(*sin));
+	fi->src_addr = sin;
+	if (sin == NULL) {
+		ret = -FI_ENOMEM;
+		return ret;
+	}
+	fi->src_addrlen = sizeof(struct sockaddr_in);
+	sin->sin_family = AF_INET;
+	sin->sin_addr.s_addr = dap->uda_ipaddr_be;
+	if (src != NULL)
+		sin->sin_port = src->sin_port;
+
+	/* copy in dest if specified */
+	if (dest != NULL) {
+		sin = calloc(1, sizeof(*sin));
+		*sin = *dest;
+		fi->dest_addr = sin;
+		fi->dest_addrlen = sizeof(*sin);
 	}
+	return FI_SUCCESS;
+}
 
-	dattrp = hints->domain_attr;
-	if (dattrp) {
-		if (!usdf_domain_checkname(version, dap, dattrp->name))
-			return -FI_ENODATA;
+static int
+usdf_fill_straddr_info(struct fi_info *fi,
+	char *src, char *dest, struct usd_device_attrs *dap)
+{
+	char *address_string;
+	struct sockaddr_in *sin;
+
+	/* If NULL, we have to create the sockaddr_in
+	 * and convert it to string format.
+	 */
+	if (src == NULL) {
+		sin = calloc(1, sizeof(*sin));
+		sin->sin_family = AF_INET;
+		sin->sin_addr.s_addr = dap->uda_ipaddr_be;
+
+		address_string = calloc(1, USDF_ADDR_STR_LEN);
+		fi->src_addr = address_string;
+		fi->src_addrlen = USDF_ADDR_STR_LEN;
+
+		usdf_addr_tostr(sin, fi->src_addr, &fi->src_addrlen);
+		free(sin);
+	} else {
+	/* Otherwise, it is already in string format.
+	 * Just copy it.
+	 */
+		address_string = strdup(src);
+		fi->src_addr = address_string;
+		fi->src_addrlen = strlen(address_string);
+	}
+
+	/* Same goes for dest. */
+	if (dest != NULL) {
+		address_string = strdup(dest);
+		fi->dest_addr = address_string;
+		fi->dest_addrlen = strlen(address_string);
 	}
 
 	return FI_SUCCESS;
 }
-
 static int
 usdf_fill_addr_info(struct fi_info *fi, uint32_t addr_format,
-		struct sockaddr_in *src, struct sockaddr_in *dest,
-		struct usd_device_attrs *dap)
+		void *src, void *dest, struct usd_device_attrs *dap)
 {
-	struct sockaddr_in *sin;
 	int ret;
-#if ENABLE_DEBUG
-	char requested[INET_ADDRSTRLEN], actual[INET_ADDRSTRLEN];
-#endif
 
 	if (addr_format != FI_FORMAT_UNSPEC) {
 		fi->addr_format = addr_format;
@@ -220,38 +289,14 @@ usdf_fill_addr_info(struct fi_info *fi, uint32_t addr_format,
 	switch (fi->addr_format) {
 	case FI_SOCKADDR:
 	case FI_SOCKADDR_IN:
-		if (src != NULL &&
-		    src->sin_addr.s_addr != INADDR_ANY &&
-		    src->sin_addr.s_addr != dap->uda_ipaddr_be) {
-			USDF_DBG("src addr (%s) does not match device addr (%s)\n",
-			inet_ntop(AF_INET, &src->sin_addr.s_addr,
-				requested, sizeof(requested)),
-			inet_ntop(AF_INET, &dap->uda_ipaddr_be,
-				actual, sizeof(actual)));
-
-			ret = -FI_ENODATA;
+		ret = usdf_fill_sockaddr_info(fi, src, dest, dap);
+		if (ret != FI_SUCCESS)
 			goto fail;
-		}
-		sin = calloc(1, sizeof(*sin));
-		fi->src_addr = sin;
-		if (sin == NULL) {
-			ret = -FI_ENOMEM;
+		break;
+	case FI_ADDR_STR:
+		ret = usdf_fill_straddr_info(fi, src, dest, dap);
+		if (ret != FI_SUCCESS)
 			goto fail;
-		}
-		fi->src_addrlen = sizeof(*sin);
-		sin->sin_family = AF_INET;
-		sin->sin_addr.s_addr = dap->uda_ipaddr_be;
-		if (src != NULL) {
-			sin->sin_port = src->sin_port;
-		}
-
-		/* copy in dest if specified */
-		if (dest != NULL) {
-			sin = calloc(1, sizeof(*sin));
-			*sin = *dest;
-			fi->dest_addr = sin;
-			fi->dest_addrlen = sizeof(*sin);
-		}
 		break;
 	default:
 		ret = -FI_ENODATA;
@@ -264,11 +309,35 @@ fail:
 	return ret;		// fi_freeinfo() in caller frees all
 }
 
+static int validate_modebits(uint32_t version, struct fi_info *hints,
+			       uint64_t supported, uint64_t *mode_out)
+{
+	uint64_t mode;
+
+	/* If there is no hints, return everything we supported. */
+	if (!hints) {
+		*mode_out = supported;
+		return FI_SUCCESS;
+	}
+
+	mode = hints->mode & supported;
+
+	/* Before version 1.5, FI_LOCAL_MR is a requirement. */
+	if (FI_VERSION_LT(version, FI_VERSION(1, 5))) {
+		if ((mode & FI_LOCAL_MR) == 0)
+			return -FI_ENODATA;
+	}
+
+	*mode_out = mode;
+
+	return FI_SUCCESS;
+}
+
 static int usdf_fill_info_dgram(
 	uint32_t version,
 	struct fi_info *hints,
-	struct sockaddr_in *src,
-	struct sockaddr_in *dest,
+	void *src,
+	void *dest,
 	struct usd_device_attrs *dap,
 	struct fi_info **fi_first,
 	struct fi_info **fi_last)
@@ -286,8 +355,12 @@ static int usdf_fill_info_dgram(
 
 	fi->caps = USDF_DGRAM_CAPS;
 
+	ret = validate_modebits(version, hints,
+				  USDF_DGRAM_SUPP_MODE, &fi->mode);
+	if (ret)
+		goto fail;
+
 	if (hints != NULL) {
-		fi->mode = hints->mode & USDF_DGRAM_SUPP_MODE;
 		addr_format = hints->addr_format;
 
 		/* check that we are capable of what's requested */
@@ -296,15 +369,8 @@ static int usdf_fill_info_dgram(
 			goto fail;
 		}
 
-		/* app must support these modes */
-		if ((hints->mode & USDF_DGRAM_REQ_MODE) != USDF_DGRAM_REQ_MODE) {
-			ret = -FI_ENODATA;
-			goto fail;
-		}
-
 		fi->handle = hints->handle;
 	} else {
-		fi->mode = USDF_DGRAM_SUPP_MODE;
 		addr_format = FI_FORMAT_UNSPEC;
 	}
 	fi->ep_attr->type = FI_EP_DGRAM;
@@ -337,11 +403,11 @@ static int usdf_fill_info_dgram(
 	if (ret)
 		goto fail;
 
-	ret = usdf_dgram_fill_tx_attr(hints, fi, dap);
+	ret = usdf_dgram_fill_tx_attr(version, hints, fi, dap);
 	if (ret)
 		goto fail;
 
-	ret = usdf_dgram_fill_rx_attr(hints, fi, dap);
+	ret = usdf_dgram_fill_rx_attr(version, hints, fi, dap);
 	if (ret)
 		goto fail;
 
@@ -365,8 +431,8 @@ fail:
 static int usdf_fill_info_msg(
 	uint32_t version,
 	struct fi_info *hints,
-	struct sockaddr_in *src,
-	struct sockaddr_in *dest,
+	void *src,
+	void *dest,
 	struct usd_device_attrs *dap,
 	struct fi_info **fi_first,
 	struct fi_info **fi_last)
@@ -384,8 +450,12 @@ static int usdf_fill_info_msg(
 
 	fi->caps = USDF_MSG_CAPS;
 
+	ret = validate_modebits(version, hints,
+				  USDF_MSG_SUPP_MODE, &fi->mode);
+	if (ret)
+		goto fail;
+
 	if (hints != NULL) {
-		fi->mode = hints->mode & USDF_MSG_SUPP_MODE;
 		addr_format = hints->addr_format;
 
 		/* check that we are capable of what's requested */
@@ -394,19 +464,12 @@ static int usdf_fill_info_msg(
 			goto fail;
 		}
 
-		/* app must support these modes */
-		if ((hints->mode & USDF_MSG_REQ_MODE) != USDF_MSG_REQ_MODE) {
-			ret = -FI_ENODATA;
-			goto fail;
-		}
-
 		fi->handle = hints->handle;
 	} else {
-		fi->mode = USDF_MSG_SUPP_MODE;
 		addr_format = FI_FORMAT_UNSPEC;
 	}
-	fi->ep_attr->type = FI_EP_MSG;
 
+	fi->ep_attr->type = FI_EP_MSG;
 
 	ret = usdf_fill_addr_info(fi, addr_format, src, dest, dap);
 	if (ret != 0) {
@@ -429,11 +492,11 @@ static int usdf_fill_info_msg(
 	if (ret)
 		goto fail;
 
-	ret = usdf_msg_fill_tx_attr(hints, fi);
+	ret = usdf_msg_fill_tx_attr(version, hints, fi);
 	if (ret)
 		goto fail;
 
-	ret = usdf_msg_fill_rx_attr(hints, fi);
+	ret = usdf_msg_fill_rx_attr(version, hints, fi);
 	if (ret)
 		goto fail;
 
@@ -457,8 +520,8 @@ fail:
 static int usdf_fill_info_rdm(
 	uint32_t version,
 	struct fi_info *hints,
-	struct sockaddr_in *src,
-	struct sockaddr_in *dest,
+	void *src,
+	void *dest,
 	struct usd_device_attrs *dap,
 	struct fi_info **fi_first,
 	struct fi_info **fi_last)
@@ -476,8 +539,12 @@ static int usdf_fill_info_rdm(
 
 	fi->caps = USDF_RDM_CAPS;
 
+	ret = validate_modebits(version, hints,
+				  USDF_RDM_SUPP_MODE, &fi->mode);
+	if (ret)
+		goto fail;
+
 	if (hints != NULL) {
-		fi->mode = hints->mode & USDF_RDM_SUPP_MODE;
 		addr_format = hints->addr_format;
 		/* check that we are capable of what's requested */
 		if ((hints->caps & ~USDF_RDM_CAPS) != 0) {
@@ -485,15 +552,8 @@ static int usdf_fill_info_rdm(
 			goto fail;
 		}
 
-		/* app must support these modes */
-		if ((hints->mode & USDF_RDM_REQ_MODE) != USDF_RDM_REQ_MODE) {
-			ret = -FI_ENODATA;
-			goto fail;
-		}
-
 		fi->handle = hints->handle;
 	} else {
-		fi->mode = USDF_RDM_SUPP_MODE;
 		addr_format = FI_FORMAT_UNSPEC;
 	}
 	fi->ep_attr->type = FI_EP_RDM;
@@ -519,11 +579,11 @@ static int usdf_fill_info_rdm(
 	if (ret)
 		goto fail;
 
-	ret = usdf_rdm_fill_tx_attr(hints, fi);
+	ret = usdf_rdm_fill_tx_attr(version, hints, fi);
 	if (ret)
 		goto fail;
 
-	ret = usdf_rdm_fill_rx_attr(hints, fi);
+	ret = usdf_rdm_fill_rx_attr(version, hints, fi);
 	if (ret)
 		goto fail;
 
@@ -623,6 +683,159 @@ usdf_get_distance(
     return ret;
 }
 
+/* Check all things related to a device. Make sure it's okay, the source address
+ * matches the requested address, the destination is reachable from the device,
+ * the device fabric name matches the requested fabric name, and the device
+ * domain name matches the requested domain name.
+ *
+ * @param version Libfabric API version used to verify the domain / fabric name.
+ * @param hints   Hints passed to fi_getinfo.
+ * @param src     Source address being requested.
+ * @param dest    Destination address to communicate with.
+ * @param dep     usNIC device entry being checked.
+ *
+ * @return true on success, false on failure. For debug logging can be enabled
+ *         to see why a device was disqualified.
+ */
+static bool usdf_check_device(uint32_t version, struct fi_info *hints,
+			      void *src, void *dest,
+			      struct usdf_dev_entry *dep)
+{
+	char dest_str[INET_ADDRSTRLEN];
+	char src_str[INET_ADDRSTRLEN];
+	char dev_str[INET_ADDRSTRLEN];
+	struct usd_device_attrs *dap;
+	struct sockaddr_in *sin;
+	int reachable;
+	int ret;
+
+	reachable = -1;
+	dap = &dep->ue_dattr;
+
+	/* Skip the device if it has problems. */
+	if (!dep->ue_dev_ok) {
+		USDF_WARN_SYS(FABRIC, "skipping %s/%s device not ok\n",
+			      dap->uda_devname, dap->uda_ifname);
+		return false;
+	}
+
+	/* If the given source address is not INADDR_ANY, compare against the
+	 * device.
+	 */
+	if (src) {
+		sin = usdf_format_to_sin(hints, src);
+		if (sin->sin_addr.s_addr != INADDR_ANY) {
+			if (sin->sin_addr.s_addr != dap->uda_ipaddr_be) {
+				inet_ntop(AF_INET, &sin->sin_addr.s_addr,
+					  src_str, sizeof(src_str));
+				inet_ntop(AF_INET, &dap->uda_ipaddr_be,
+					  dev_str, sizeof(dev_str));
+				USDF_WARN_SYS(FABRIC,
+					      "src addr<%s> != dev addr<%s>\n",
+					      src_str, dev_str);
+				goto fail;
+			}
+		}
+
+		usdf_free_sin_if_needed(hints, sin);
+	}
+
+	/* Check that the given destination address is reachable from the
+	 * interface.
+	 */
+	if (dest) {
+		sin = usdf_format_to_sin(hints, dest);
+		if (sin->sin_addr.s_addr != INADDR_ANY) {
+			ret = usdf_get_distance(dap, sin->sin_addr.s_addr,
+						&reachable);
+			if (ret) {
+				inet_ntop(AF_INET,
+					  &sin->sin_addr.s_addr, dest_str,
+					  sizeof(dest_str));
+				USDF_WARN_SYS(FABRIC,
+					      "get_distance failed @ %s\n",
+					      dest_str);
+				goto fail;
+			}
+		}
+
+		if (reachable == -1) {
+			inet_ntop(AF_INET, &sin->sin_addr.s_addr, dest_str,
+				  sizeof(dest_str));
+			USDF_WARN_SYS(FABRIC,
+				      "dest %s unreachable from %s/%s, skipping\n",
+				      dest_str, dap->uda_devname,
+				      dap->uda_ifname);
+			goto fail;
+		}
+
+		usdf_free_sin_if_needed(hints, sin);
+	}
+
+	/* Checks that the fabric name is correct for the given interface. The
+	 * fabric name contains the CIDR notation for the interface.
+	 */
+	if (hints && hints->fabric_attr && hints->fabric_attr->name) {
+		if (!usdf_fabric_checkname(version, dap,
+					  hints->fabric_attr->name))
+			return false;
+	}
+
+	/* Check that the domain name is correct for the given interface. The
+	 * domain name is the device name.
+	 */
+	if (hints && hints->domain_attr && hints->domain_attr->name) {
+		if (!usdf_domain_checkname(version, dap,
+					   hints->domain_attr->name))
+			return false;
+	}
+
+	return true;
+
+fail:
+	usdf_free_sin_if_needed(hints, sin);
+
+	return false;
+}
+
+static int
+usdf_handle_node_and_service(const char *node, const char *service,
+		uint64_t flags, void **src, void **dest, struct fi_info *hints,
+		struct addrinfo **ai)
+{
+	int ret;
+	struct sockaddr_in *sin;
+
+	if (node != NULL || service != NULL) {
+		if (hints && hints->addr_format == FI_ADDR_STR) {
+			/* FI_ADDR_STR can't have service param. */
+			if (service)
+				return -FI_EINVAL;
+
+			sin = usdf_format_to_sin(hints, node);
+
+			if (!sin)
+				/* This could be invalid or no memory. */
+				return -FI_EINVAL;
+		} else {
+			ret = getaddrinfo(node, service, NULL, ai);
+			if (ret != 0) {
+				USDF_DBG("getaddrinfo failed: %d: <%s>\n", ret,
+					 gai_strerror(ret));
+				return ret;
+			}
+			sin = (struct sockaddr_in *)(*ai)->ai_addr;
+		}
+
+		if (flags & FI_SOURCE)
+			*src = usdf_sin_to_format(hints, sin, NULL);
+		else
+			*dest = usdf_sin_to_format(hints, sin, NULL);
+	}
+
+	return FI_SUCCESS;
+}
+
 static int
 usdf_getinfo(uint32_t version, const char *node, const char *service,
 	       uint64_t flags, struct fi_info *hints, struct fi_info **info)
@@ -633,10 +846,9 @@ usdf_getinfo(uint32_t version, const char *node, const char *service,
 	struct fi_info *fi_first;
 	struct fi_info *fi_last;
 	struct addrinfo *ai;
-	struct sockaddr_in *src;
-	struct sockaddr_in *dest;
+	void *src;
+	void *dest;
 	enum fi_ep_type ep_type;
-	int metric;
 	int d;
 	int ret;
 
@@ -663,69 +875,44 @@ usdf_getinfo(uint32_t version, const char *node, const char *service,
 	}
 	dp = __usdf_devinfo;
 
-	if (node != NULL || service != NULL) {
-		ret = getaddrinfo(node, service, NULL, &ai);
-		if (ret != 0) {
-			USDF_DBG("getaddrinfo failed, likely bad node/service specified (%s:%s)\n",
-				node, service);
-			ret = -errno;
+	/* Check the hints up front and fail if they're invalid. */
+	if (hints) {
+		ret = usdf_validate_hints(version, hints);
+		if (ret) {
+			USDF_WARN_SYS(FABRIC, "hints failed to validate\n");
 			goto fail;
 		}
-		if (flags & FI_SOURCE) {
-			src = (struct sockaddr_in *)ai->ai_addr;
-		} else {
-			dest = (struct sockaddr_in *)ai->ai_addr;
-		}
 	}
+
+	/* Get the src and dest if user specified. */
+	ret = usdf_handle_node_and_service(node, service, flags,
+					   &src, &dest, hints, &ai);
+	if (ret) {
+		USDF_WARN_SYS(FABRIC, "failed to handle node and service.\n");
+		goto fail;
+	}
+
 	if (hints != NULL) {
-		if (dest == NULL && hints->dest_addr != NULL) {
+		if (dest == NULL && hints->dest_addr != NULL)
 			dest = hints->dest_addr;
-		}
-		if (src == NULL && hints->src_addr != NULL) {
+		if (src == NULL && hints->src_addr != NULL)
 			src = hints->src_addr;
-		}
 	}
 
 	for (d = 0; d < dp->uu_num_devs; ++d) {
 		dep = &dp->uu_info[d];
 		dap = &dep->ue_dattr;
 
-		/* skip this device if it has some problem */
-		if (!dep->ue_dev_ok) {
-			USDF_DBG("skipping %s/%s\n", dap->uda_devname,
-				dap->uda_ifname);
+		/* If the device has an issue or the hints don't match the
+		 * device information, then skip.
+		 */
+		if (!usdf_check_device(version, hints, src, dest, dep))
 			continue;
-		}
-
-		/* See if dest is reachable from this device */
-		if (dest != NULL && dest->sin_addr.s_addr != INADDR_ANY) {
-			ret = usdf_get_distance(dap,
-					dest->sin_addr.s_addr, &metric);
-			if (ret != 0) {
-				goto fail;
-			}
-			if (metric == -1) {
-				USDF_DBG("dest %s unreachable from %s/%s, skipping\n",
-					inet_ntoa(dest->sin_addr),
-					dap->uda_devname, dap->uda_ifname);
-				continue;
-			}
-		}
-
-		/* Does this device match requested attributes? */
-		if (hints != NULL) {
-			ret = usdf_validate_hints(version, hints, dap);
-			if (ret != 0) {
-				USDF_DBG("hints do not match for %s/%s, skipping\n",
-					dap->uda_devname, dap->uda_ifname);
-				continue;
-			}
 
-			ep_type = hints->ep_attr ? hints->ep_attr->type :
-				  FI_EP_UNSPEC;
-		} else {
+		if (hints && hints->ep_attr)
+			ep_type = hints->ep_attr->type;
+		else
 			ep_type = FI_EP_UNSPEC;
-		}
 
 		if (ep_type == FI_EP_DGRAM || ep_type == FI_EP_UNSPEC) {
 			ret = usdf_fill_info_dgram(version, hints, src, dest,
@@ -759,16 +946,16 @@ usdf_getinfo(uint32_t version, const char *node, const char *service,
 		ret = -FI_ENODATA;
 	}
 
+
 fail:
-	if (ret != 0) {
-		fi_freeinfo(fi_first);
-	}
-	if (ai != NULL) {
+	if (ai)
 		freeaddrinfo(ai);
-	}
+
 	if (ret != 0) {
+		fi_freeinfo(fi_first);
 		USDF_INFO("returning %d (%s)\n", ret, fi_strerror(-ret));
 	}
+
 	return ret;
 }
 
@@ -782,7 +969,7 @@ usdf_fabric_close(fid_t fid)
 	USDF_TRACE("\n");
 
 	fp = fab_fidtou(fid);
-	if (atomic_get(&fp->fab_refcnt) > 0) {
+	if (ofi_atomic_get32(&fp->fab_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 	/* Tell progression thread to exit */
@@ -932,8 +1119,8 @@ usdf_fabric_open(struct fi_fabric_attr *fattrp, struct fid_fabric **fabric,
 		goto fail;
 	}
 
-	atomic_initialize(&fp->fab_refcnt, 0);
-	atomic_initialize(&fp->num_blocked_waiting, 0);
+	ofi_atomic_initialize32(&fp->fab_refcnt, 0);
+	ofi_atomic_initialize32(&fp->num_blocked_waiting, 0);
 
 	ret = pthread_create(&fp->fab_thread, NULL,
 			usdf_fabric_progression_thread, fp);
@@ -967,7 +1154,7 @@ static void usdf_fini(void)
 struct fi_provider usdf_ops = {
 	.name = USDF_PROV_NAME,
 	.version = USDF_PROV_VERSION,
-	.fi_version = FI_VERSION(1, 4),
+	.fi_version = FI_VERSION(1, 5),
 	.getinfo = usdf_getinfo,
 	.fabric = usdf_fabric_open,
 	.cleanup =  usdf_fini
@@ -975,7 +1162,7 @@ struct fi_provider usdf_ops = {
 
 USNIC_INI
 {
-#if HAVE_VERBS
+#if USNIC_BUILD_FAKE_VERBS_DRIVER
 	usdf_setup_fake_ibv_provider();
 #endif
 	return (&usdf_ops);
diff --git a/prov/usnic/src/usdf_mem.c b/prov/usnic/src/usdf_mem.c
index f48fc4d..dc51139 100644
--- a/prov/usnic/src/usdf_mem.c
+++ b/prov/usnic/src/usdf_mem.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014,2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -123,3 +123,37 @@ fail:
 	free(mr);
 	return ret;
 }
+
+/* We dont have proper support for regv and regattr. This is just
+ * a simple mapping to usdf_reg_mr. We can do this because we forced
+ * mr_iov_limit = 1 (made this mapping possible) by default.
+ */
+int usdf_regv_mr(struct fid *fid, const struct iovec *iov,
+		 size_t count, uint64_t access,
+		 uint64_t offset, uint64_t requested_key,
+		 uint64_t flags, struct fid_mr **mr, void *context)
+{
+	if (count > USDF_MR_IOV_LIMIT) {
+		USDF_DBG_SYS(DOMAIN, "usnic provider only support 1 iov.\n");
+		return -FI_EINVAL;
+	}
+
+	return usdf_reg_mr(fid, iov[0].iov_base, iov[0].iov_len, access,
+			offset, requested_key, flags, mr, context);
+}
+
+int usdf_regattr(struct fid *fid, const struct fi_mr_attr *attr,
+		 uint64_t flags, struct fid_mr **mr)
+{
+	if (attr->iov_count > USDF_MR_IOV_LIMIT) {
+		USDF_DBG_SYS(DOMAIN, "usnic provider only support 1 iov.\n");
+		return -FI_EINVAL;
+	}
+
+	return usdf_reg_mr(fid, attr->mr_iov[0].iov_base,
+			attr->mr_iov[0].iov_len,
+			attr->access,
+			attr->offset,
+			attr->requested_key,
+			flags, mr, attr->context);
+}
diff --git a/prov/usnic/src/usdf_msg.h b/prov/usnic/src/usdf_msg.h
index 3e9fb1f..2b80a28 100644
--- a/prov/usnic/src/usdf_msg.h
+++ b/prov/usnic/src/usdf_msg.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -39,7 +39,6 @@
 #define USDF_MSG_CAPS (FI_MSG | FI_SOURCE | FI_SEND | FI_RECV)
 
 #define USDF_MSG_SUPP_MODE (FI_LOCAL_MR)
-#define USDF_MSG_REQ_MODE (FI_LOCAL_MR)
 
 #define USDF_MSG_SUPP_SENDMSG_FLAGS \
 	(FI_INJECT_COMPLETE | FI_TRANSMIT_COMPLETE | FI_INJECT | FI_COMPLETION)
@@ -55,6 +54,10 @@
 
 #define USDF_MSG_IOV_LIMIT (USDF_MSG_DFLT_SGE)
 #define USDF_MSG_RMA_IOV_LIMIT 0
+#define USDF_MSG_MR_IOV_LIMIT (USDF_MR_IOV_LIMIT)
+#define USDF_MSG_MR_CNT (USDF_MR_CNT)
+
+#define USDF_MSG_CNTR_CNT 0
 
 #define USDF_MSG_MAX_MSG UINT_MAX
 
@@ -89,8 +92,10 @@ struct usdf_msg_qe {
 
 int usdf_msg_post_recv(struct usdf_rx *rx, void *buf, size_t len);
 
-int usdf_msg_fill_tx_attr(struct fi_info *hints, struct fi_info *fi);
-int usdf_msg_fill_rx_attr(struct fi_info *hints, struct fi_info *fi);
+int usdf_msg_fill_tx_attr(uint32_t version, struct fi_info *hints,
+			  struct fi_info *fi);
+int usdf_msg_fill_rx_attr(uint32_t version, struct fi_info *hints,
+			  struct fi_info *fi);
 int usdf_msg_fill_ep_attr(struct fi_info *hints, struct fi_info *fi,
 		struct usd_device_attrs *dap);
 int usdf_msg_fill_dom_attr(uint32_t version, struct fi_info *hints,
diff --git a/prov/usnic/src/usdf_pep.c b/prov/usnic/src/usdf_pep.c
index 031e754..38d57d7 100644
--- a/prov/usnic/src/usdf_pep.c
+++ b/prov/usnic/src/usdf_pep.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -83,7 +83,7 @@ usdf_pep_bind(fid_t fid, fid_t bfid, uint64_t flags)
 			return -FI_EINVAL;
 		}
 		pep->pep_eq = eq_fidtou(bfid);
-		atomic_inc(&pep->pep_eq->eq_refcnt);
+		ofi_atomic_inc32(&pep->pep_eq->eq_refcnt);
 		break;
 
 	default:
@@ -120,7 +120,9 @@ usdf_pep_conn_info(struct usdf_connreq *crp)
 	sin->sin_addr.s_addr = reqp->creq_ipaddr;
 	sin->sin_port = reqp->creq_port;
 
-	ip->dest_addr = sin;
+	ip->dest_addr = usdf_sin_to_format(pep->pep_info, sin,
+					   &ip->dest_addrlen);
+
 	ip->handle = (fid_t) crp;
 	return ip;
 fail:
@@ -286,13 +288,17 @@ usdf_pep_listen(struct fid_pep *fpep)
 	struct usdf_pep *pep;
 	struct epoll_event ev;
 	struct usdf_fabric *fp;
+	struct sockaddr_in *sin;
 	socklen_t socklen;
 	int ret;
+	bool addr_format_str;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	pep = pep_ftou(fpep);
 	fp = pep->pep_fabric;
+	addr_format_str = (pep->pep_info->addr_format == FI_ADDR_STR);
+	sin = NULL;
 
 	switch (pep->pep_state) {
 	case USDF_PEP_UNBOUND:
@@ -306,7 +312,8 @@ usdf_pep_listen(struct fid_pep *fpep)
 			"PEP already consumed, you may only fi_close() now\n");
 		return -FI_EOPBADSTATE;
 	default:
-		USDF_WARN_SYS(EP_CTRL, "unhandled case!\n");
+		USDF_WARN_SYS(EP_CTRL, "unhandled case! (%d)\n",
+			      pep->pep_state);
 		abort();
 	}
 
@@ -314,26 +321,40 @@ usdf_pep_listen(struct fid_pep *fpep)
 	 * already did the bind in a previous call to usdf_pep_listen() and the
 	 * listen(2) call failed */
 	if (pep->pep_state == USDF_PEP_UNBOUND) {
-		ret = bind(pep->pep_sock, (struct sockaddr *)&pep->pep_src_addr,
-				sizeof(struct sockaddr_in));
+		sin = usdf_format_to_sin(pep->pep_info, &pep->pep_src_addr);
+		if (sin == NULL)
+			goto fail;
+
+		ret = bind(pep->pep_sock, sin, sizeof(struct sockaddr_in));
 		if (ret == -1) {
-			return -errno;
+			goto fail;
 		}
 
 		/* Get the actual port (since we may have requested
 		 * port 0)
 		 */
-		socklen = sizeof(pep->pep_src_addr);
-		ret = getsockname(pep->pep_sock, &pep->pep_src_addr,
+		socklen = sizeof(*sin);
+		ret = getsockname(pep->pep_sock, sin,
 				&socklen);
 		if (ret == -1)
-			return -errno;
+			goto fail;
+
+		/* If it's FI_ADDR_STR, we have to update the string
+		 * with this method. (FI_SOCKADDR_IN got taken care of, above)
+		*/
+		if (addr_format_str) {
+			pep->pep_info->src_addrlen = USDF_ADDR_STR_LEN;
+			usdf_addr_tostr(sin, pep->pep_src_addr.addr_str,
+					&pep->pep_info->src_addrlen);
+		}
+
+		/* Update the state to bound. */
 		pep->pep_state = USDF_PEP_BOUND;
 	}
 
 	ret = listen(pep->pep_sock, pep->pep_backlog);
 	if (ret != 0) {
-		return -errno;
+		goto fail;
 	}
 	pep->pep_state = USDF_PEP_LISTENING;
 
@@ -343,10 +364,15 @@ usdf_pep_listen(struct fid_pep *fpep)
 	ev.data.ptr = &pep->pep_pollitem;
 	ret = epoll_ctl(fp->fab_epollfd, EPOLL_CTL_ADD, pep->pep_sock, &ev);
 	if (ret == -1) {
-		return -errno;
+		goto fail;
 	}
 
 	return 0;
+
+fail:
+	usdf_free_sin_if_needed(pep->pep_info, sin);
+
+	return -errno;
 }
 
 /* Register as a callback triggered by the socket becoming writeable. Write as
@@ -490,7 +516,7 @@ usdf_pep_close(fid_t fid)
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	pep = pep_fidtou(fid);
-	if (atomic_get(&pep->pep_refcnt) > 0) {
+	if (ofi_atomic_get32(&pep->pep_refcnt) > 0) {
 		return -FI_EBUSY;
 	}
 
@@ -498,9 +524,10 @@ usdf_pep_close(fid_t fid)
 	close(pep->pep_sock);
 	pep->pep_sock = -1;
 	if (pep->pep_eq != NULL) {
-		atomic_dec(&pep->pep_eq->eq_refcnt);
+		ofi_atomic_dec32(&pep->pep_eq->eq_refcnt);
 	}
-	atomic_dec(&pep->pep_fabric->fab_refcnt);
+	ofi_atomic_dec32(&pep->pep_fabric->fab_refcnt);
+	fi_freeinfo(pep->pep_info);
 	free(pep);
 
 	return 0;
@@ -510,14 +537,16 @@ static int usdf_pep_getname(fid_t fid, void *addr, size_t *addrlen)
 {
 	int ret;
 	struct usdf_pep *pep;
+	struct fi_info *info;
 	size_t copylen;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	ret = FI_SUCCESS;
 	pep = pep_fidtou(fid);
+	info = pep->pep_info;
 
-	copylen = sizeof(pep->pep_src_addr);
+	copylen = info->src_addrlen;
 	memcpy(addr, &pep->pep_src_addr, MIN(copylen, *addrlen));
 
 	if (*addrlen < copylen) {
@@ -533,32 +562,50 @@ static int usdf_pep_setname(fid_t fid, void *addr, size_t addrlen)
 {
 	int ret;
 	struct usdf_pep *pep;
+	struct fi_info *info;
+	struct sockaddr_in *sin;
 	uint32_t req_addr_be;
 	socklen_t socklen;
 	char namebuf[INET_ADDRSTRLEN];
 	char servbuf[INET_ADDRSTRLEN];
+	bool addr_format_str;
 
 	USDF_TRACE_SYS(EP_CTRL, "\n");
 
 	pep = pep_fidtou(fid);
+	info = pep->pep_info;
+	addr_format_str = (info->addr_format == FI_ADDR_STR);
+	sin = NULL;
+
 	if (pep->pep_state != USDF_PEP_UNBOUND) {
 		USDF_WARN_SYS(EP_CTRL, "PEP cannot be bound\n");
 		return -FI_EOPBADSTATE;
 	}
-	if (((struct sockaddr *)addr)->sa_family != AF_INET) {
-		USDF_WARN_SYS(EP_CTRL, "non-AF_INET address given\n");
-		return -FI_EINVAL;
-	}
-	if (addrlen != sizeof(struct sockaddr_in)) {
-		USDF_WARN_SYS(EP_CTRL, "unexpected src_addrlen\n");
+
+	switch (info->addr_format) {
+	case FI_SOCKADDR:
+	case FI_SOCKADDR_IN:
+		/* It is possible for passive endpoint to not have src_addr. */
+		if (info->src_addr) {
+			ret = usdf_cm_addr_is_valid_sin(info->src_addr,
+							info->src_addrlen,
+							info->addr_format);
+			if (!ret)
+				return -FI_EINVAL;
+		}
+		break;
+	case FI_ADDR_STR:
+		break;
+	default:
 		return -FI_EINVAL;
 	}
 
-	req_addr_be = ((struct sockaddr_in *)addr)->sin_addr.s_addr;
+	sin = usdf_format_to_sin(info, addr);
+	req_addr_be = sin->sin_addr.s_addr;
 
 	namebuf[0] = '\0';
 	servbuf[0] = '\0';
-	ret = getnameinfo((struct sockaddr*)addr, addrlen,
+	ret = getnameinfo((struct sockaddr *)sin, sizeof(struct sockaddr_in),
 		namebuf, sizeof(namebuf),
 		servbuf, sizeof(servbuf),
 		NI_NUMERICHOST|NI_NUMERICSERV);
@@ -572,16 +619,15 @@ static int usdf_pep_setname(fid_t fid, void *addr, size_t addrlen)
 		return -FI_EADDRNOTAVAIL;
 	}
 
-	ret = bind(pep->pep_sock, (struct sockaddr *)addr,
-		sizeof(struct sockaddr_in));
+	ret = bind(pep->pep_sock, sin, sizeof(*sin));
 	if (ret == -1) {
 		return -errno;
 	}
 	pep->pep_state = USDF_PEP_BOUND;
 
 	/* store the resulting port so that can implement getname() properly */
-	socklen = sizeof(pep->pep_src_addr);
-	ret = getsockname(pep->pep_sock, &pep->pep_src_addr, &socklen);
+	socklen = sizeof(*sin);
+	ret = getsockname(pep->pep_sock, sin, &socklen);
 	if (ret == -1) {
 		ret = -errno;
 		USDF_WARN_SYS(EP_CTRL, "getsockname failed %d (%s), PEP may be in bad state\n",
@@ -589,6 +635,18 @@ static int usdf_pep_setname(fid_t fid, void *addr, size_t addrlen)
 		return ret;
 	}
 
+	if (addr_format_str) {
+		/* We have to reset src_addrlen here and
+		 * the conversion will update it to the correct len.
+		 */
+		info->src_addrlen = USDF_ADDR_STR_LEN;
+		usdf_addr_tostr(sin, pep->pep_src_addr.addr_str,
+				&info->src_addrlen);
+		free(sin);
+	} else {
+		memcpy(&pep->pep_src_addr, sin, sizeof(*sin));
+	}
+
 	return 0;
 }
 
@@ -621,6 +679,7 @@ static struct fi_ops_cm usdf_pep_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = usdf_pep_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
 int
@@ -650,24 +709,23 @@ usdf_pep_open(struct fid_fabric *fabric, struct fi_info *info,
 
 	switch (info->addr_format) {
 	case FI_SOCKADDR:
-		if (((struct sockaddr *)info->src_addr)->sa_family != AF_INET) {
-			USDF_WARN_SYS(EP_CTRL, "non-AF_INET src_addr specified\n");
-			return -FI_EINVAL;
+	case FI_SOCKADDR_IN:
+		/* It is possible for passive endpoint to not have src_addr. */
+		if (info->src_addr) {
+			ret = usdf_cm_addr_is_valid_sin(info->src_addr,
+							info->src_addrlen,
+							info->addr_format);
+			if (!ret)
+				return -FI_EINVAL;
 		}
 		break;
-	case FI_SOCKADDR_IN:
+	case FI_ADDR_STR:
 		break;
 	default:
 		USDF_WARN_SYS(EP_CTRL, "unknown/unsupported addr_format\n");
 		return -FI_EINVAL;
 	}
 
-	if (info->src_addrlen &&
-			info->src_addrlen != sizeof(struct sockaddr_in)) {
-		USDF_WARN_SYS(EP_CTRL, "unexpected src_addrlen\n");
-		return -FI_EINVAL;
-	}
-
 	fp = fab_ftou(fabric);
 
 	pep = calloc(1, sizeof(*pep));
@@ -724,11 +782,14 @@ usdf_pep_open(struct fid_fabric *fabric, struct fi_info *info,
 
 		sin->sin_family = AF_INET;
 		sin->sin_addr.s_addr = fp->fab_dev_attrs->uda_ipaddr_be;
-		pep->pep_info->src_addr = sin;
+
+		pep->pep_info->src_addr =
+			usdf_sin_to_format(pep->pep_info,
+					   sin, &pep->pep_info->src_addrlen);
 	}
 
 	memcpy(&pep->pep_src_addr, pep->pep_info->src_addr,
-			pep->pep_info->src_addrlen);
+	       pep->pep_info->src_addrlen);
 
 	/* initialize connreq freelist */
 	ret = pthread_spin_init(&pep->pep_cr_lock, PTHREAD_PROCESS_PRIVATE);
@@ -746,8 +807,8 @@ usdf_pep_open(struct fid_fabric *fabric, struct fi_info *info,
 		goto fail;
 	}
 
-	atomic_initialize(&pep->pep_refcnt, 0);
-	atomic_inc(&fp->fab_refcnt);
+	ofi_atomic_initialize32(&pep->pep_refcnt, 0);
+	ofi_atomic_inc32(&fp->fab_refcnt);
 
 	*pep_o = pep_utof(pep);
 	return 0;
diff --git a/prov/usnic/src/usdf_poll.c b/prov/usnic/src/usdf_poll.c
index 0b3b5e7..8dd0ef0 100644
--- a/prov/usnic/src/usdf_poll.c
+++ b/prov/usnic/src/usdf_poll.c
@@ -120,7 +120,7 @@ static int usdf_poll_add(struct fid_poll *fps, struct fid *event_fid,
 		return ret;
 
 	cq = cq_fidtou(event_fid);
-	ret = atomic_inc(&cq->cq_refcnt);
+	ret = ofi_atomic_inc32(&cq->cq_refcnt);
 	assert(ret > 0);
 	USDF_DBG_SYS(DOMAIN, "associated with CQ: [%p] with new refcnt: [%d]\n",
 			cq, ret);
@@ -155,7 +155,7 @@ static int usdf_poll_del(struct fid_poll *fps, struct fid *event_fid,
 	fid_list_remove(&ps->list, &ps->lock, event_fid);
 
 	cq = cq_fidtou(event_fid);
-	ret = atomic_dec(&cq->cq_refcnt);
+	ret = ofi_atomic_dec32(&cq->cq_refcnt);
 
 	USDF_DBG_SYS(DOMAIN,
 			"disassociating from CQ: [%p] with new refcnt: [%d]\n",
@@ -187,7 +187,7 @@ static int usdf_poll_close(struct fid *fps)
 
 	ps = poll_ftou(fps);
 
-	if (atomic_get(&ps->poll_refcnt) > 0) {
+	if (ofi_atomic_get32(&ps->poll_refcnt) > 0) {
 		USDF_WARN_SYS(DOMAIN,
 				"failed to close pollset with non-zero refcnt");
 		return -FI_EBUSY;
@@ -201,7 +201,7 @@ static int usdf_poll_close(struct fid *fps)
 		switch (entry->fid->fclass) {
 		case FI_CLASS_CQ:
 			cq = cq_fidtou(entry->fid);
-			val = atomic_dec(&cq->cq_refcnt);
+			val = ofi_atomic_dec32(&cq->cq_refcnt);
 
 			USDF_DBG_SYS(DOMAIN,
 					"disassociating from CQ: [%p] with new refcnt: [%d]\n",
@@ -219,7 +219,7 @@ static int usdf_poll_close(struct fid *fps)
 		free(entry);
 	}
 
-	atomic_dec(&ps->poll_domain->dom_refcnt);
+	ofi_atomic_dec32(&ps->poll_domain->dom_refcnt);
 	fastlock_destroy(&ps->lock);
 	free(ps);
 
@@ -266,7 +266,7 @@ int usdf_poll_open(struct fid_domain *fdom, struct fi_poll_attr *attr,
 	}
 
 	dlist_init(&ps->list);
-	atomic_initialize(&ps->poll_refcnt, 0);
+	ofi_atomic_initialize32(&ps->poll_refcnt, 0);
 	fastlock_init(&ps->lock);
 
 	ps->poll_fid.fid.ops = &usdf_poll_fi_ops;
@@ -277,7 +277,7 @@ int usdf_poll_open(struct fid_domain *fdom, struct fi_poll_attr *attr,
 
 	ps->poll_domain = dom;
 
-	ret = atomic_inc(&ps->poll_domain->dom_refcnt);
+	ret = ofi_atomic_inc32(&ps->poll_domain->dom_refcnt);
 
 	USDF_DBG_SYS(DOMAIN,
 			"created pollset from domain: [%p] with new refcnt: [%d]\n",
diff --git a/prov/usnic/src/usdf_poll.h b/prov/usnic/src/usdf_poll.h
index 6525cec..90818d1 100644
--- a/prov/usnic/src/usdf_poll.h
+++ b/prov/usnic/src/usdf_poll.h
@@ -43,7 +43,7 @@ struct usdf_poll {
 	struct fid_poll		poll_fid;
 	struct usdf_domain	*poll_domain;
 
-	atomic_t		poll_refcnt;
+	ofi_atomic32_t		poll_refcnt;
 	fastlock_t		lock;
 	struct dlist_entry	list;
 };
diff --git a/prov/usnic/src/usdf_progress.c b/prov/usnic/src/usdf_progress.c
index 5356f36..7319df2 100644
--- a/prov/usnic/src/usdf_progress.c
+++ b/prov/usnic/src/usdf_progress.c
@@ -101,7 +101,7 @@ usdf_fabric_progression_thread(void *v)
 	epfd = fp->fab_epollfd;
 
 	while (1) {
-		num_blocked_waiting = atomic_get(&fp->num_blocked_waiting);
+		num_blocked_waiting = ofi_atomic_get32(&fp->num_blocked_waiting);
 
 		/* sleep inifinitely if nothing to do */
 		if ((fp->fab_active_timer_count > 0) ||
diff --git a/prov/usnic/src/usdf_rdm.c b/prov/usnic/src/usdf_rdm.c
index 5c7f1ce..0909c76 100644
--- a/prov/usnic/src/usdf_rdm.c
+++ b/prov/usnic/src/usdf_rdm.c
@@ -260,7 +260,7 @@ usdf_rdc_alloc(struct usdf_domain *udp)
 	} else {
 		rdc = SLIST_FIRST(&udp->dom_rdc_free);
 		SLIST_REMOVE_HEAD(&udp->dom_rdc_free, dc_addr_link);
-		atomic_dec(&udp->dom_rdc_free_cnt);
+		ofi_atomic_dec32(&udp->dom_rdc_free_cnt);
 	}
 	return rdc;
 }
@@ -595,7 +595,7 @@ usdf_rdm_send(struct fid_ep *fep, const void *buf, size_t len, void *desc,
 
 	wqe->rd_context = context;
 
-	msg_id = atomic_inc(&tx->t.rdm.tx_next_msg_id);
+	msg_id = ofi_atomic_inc32(&tx->t.rdm.tx_next_msg_id);
 	wqe->rd_msg_id_be = htonl(msg_id);
 
 	wqe->rd_iov[0].iov_base = (void *)buf;
@@ -708,7 +708,7 @@ static inline ssize_t _usdf_rdm_send_vector(struct fid_ep *fep,
 		wqe->rd_last_iov = count - 1;
 	}
 
-	msg_id = atomic_inc(&tx->t.rdm.tx_next_msg_id);
+	msg_id = ofi_atomic_inc32(&tx->t.rdm.tx_next_msg_id);
 
 	wqe->rd_msg_id_be = htonl(msg_id);
 	wqe->rd_context = context;
@@ -786,7 +786,7 @@ usdf_rdm_inject(struct fid_ep *fep, const void *buf, size_t len,
 
 	wqe = usdf_rdm_get_tx_wqe(tx);
 	wqe->rd_context = NULL;
-	msg_id = atomic_inc(&tx->t.rdm.tx_next_msg_id);
+	msg_id = ofi_atomic_inc32(&tx->t.rdm.tx_next_msg_id);
 	wqe->rd_msg_id_be = htonl(msg_id);
 
 	memcpy(wqe->rd_inject_buf, buf, len);
@@ -1436,7 +1436,7 @@ usdf_rdm_rdc_timeout(void *vrdc)
 		usdf_rdm_rdc_remove(udp, rdc);
 
 		SLIST_INSERT_HEAD(&udp->dom_rdc_free, rdc, dc_addr_link);
-		atomic_inc(&udp->dom_rdc_free_cnt);
+		ofi_atomic_inc32(&udp->dom_rdc_free_cnt);
 
 	} else {
 		usdf_timer_set(udp->dom_fabric, rdc->dc_timer,
diff --git a/prov/usnic/src/usdf_rdm.h b/prov/usnic/src/usdf_rdm.h
index ab1dfd6..3cfd1d8 100644
--- a/prov/usnic/src/usdf_rdm.h
+++ b/prov/usnic/src/usdf_rdm.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2016, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -39,7 +39,6 @@
 #define USDF_RDM_CAPS (FI_MSG | FI_SOURCE | FI_SEND | FI_RECV)
 
 #define USDF_RDM_SUPP_MODE (FI_LOCAL_MR)
-#define USDF_RDM_REQ_MODE (FI_LOCAL_MR)
 
 #define USDF_RDM_SUPP_SENDMSG_FLAGS \
 	(FI_INJECT_COMPLETE | FI_TRANSMIT_COMPLETE | FI_INJECT | FI_COMPLETION)
@@ -55,6 +54,10 @@
 #define USDF_RDM_MAX_INJECT_SIZE 64
 #define USDF_RDM_IOV_LIMIT (USDF_RDM_DFLT_SGE)
 #define USDF_RDM_RMA_IOV_LIMIT 0
+#define USDF_RDM_MR_IOV_LIMIT (USDF_MR_IOV_LIMIT)
+#define USDF_RDM_MR_CNT (USDF_MR_CNT)
+
+#define USDF_RDM_CNTR_CNT 0
 
 #define USDF_RDM_MSG_ORDER (FI_ORDER_NONE)
 #define USDF_RDM_COMP_ORDER (FI_ORDER_NONE)
@@ -108,7 +111,7 @@ enum {
  * This connection struct is used to manage messages in flight.
  */
 struct usdf_rdm_connection {
-	atomic_t dc_refcnt;
+	ofi_atomic32_t dc_refcnt;
 
 	struct usdf_tx *dc_tx;
 	struct usd_udp_hdr dc_hdr;
@@ -142,8 +145,10 @@ int usdf_rdm_fill_ep_attr(struct fi_info *hints, struct fi_info *fi,
 		struct usd_device_attrs *dap);
 int usdf_rdm_fill_dom_attr(uint32_t version, struct fi_info *hints,
 			   struct fi_info *fi, struct usd_device_attrs *dap);
-int usdf_rdm_fill_tx_attr(struct fi_info *hints, struct fi_info *fi);
-int usdf_rdm_fill_rx_attr(struct fi_info *hints, struct fi_info *fi);
+int usdf_rdm_fill_tx_attr(uint32_t version, struct fi_info *hints,
+			   struct fi_info *fi);
+int usdf_rdm_fill_rx_attr(uint32_t version, struct fi_info *hints,
+			  struct fi_info *fi);
 
 int usdf_rdm_post_recv(struct usdf_rx *rx, void *buf, size_t len);
 int usdf_cq_rdm_poll(struct usd_cq *ucq, struct usd_completion *comp);
diff --git a/prov/usnic/src/usdf_wait.c b/prov/usnic/src/usdf_wait.c
index 37aa8ea..aa7dc40 100644
--- a/prov/usnic/src/usdf_wait.c
+++ b/prov/usnic/src/usdf_wait.c
@@ -217,11 +217,11 @@ int usdf_wait_open(struct fid_fabric *fabric, struct fi_wait_attr *attr,
 	wait_priv->wait_obj = attr->wait_obj;
 	wait_priv->object.epfd = epfd;
 
-	atomic_initialize(&wait_priv->wait_refcnt, 0);
+	ofi_atomic_initialize32(&wait_priv->wait_refcnt, 0);
 	fastlock_init(&wait_priv->lock);
 	dlist_init(&wait_priv->list);
 
-	atomic_inc(&wait_priv->wait_fabric->fab_refcnt);
+	ofi_atomic_inc32(&wait_priv->wait_fabric->fab_refcnt);
 
 	*waitset = &wait_priv->wait_fid;
 
@@ -249,7 +249,7 @@ static int usdf_wait_close(struct fid *waitset)
 
 	wait_priv = wait_ftou(waitset);
 
-	if (atomic_get(&wait_priv->wait_refcnt) > 0) {
+	if (ofi_atomic_get32(&wait_priv->wait_refcnt) > 0) {
 		USDF_DBG_SYS(FABRIC,
 				"failed to close waitset with non-zero refcnt");
 		return -FI_EBUSY;
@@ -266,7 +266,7 @@ static int usdf_wait_close(struct fid *waitset)
 		return -FI_EINVAL;
 	}
 
-	atomic_dec(&wait_priv->wait_fabric->fab_refcnt);
+	ofi_atomic_dec32(&wait_priv->wait_fabric->fab_refcnt);
 	free(wait_priv);
 
 	return FI_SUCCESS;
diff --git a/prov/usnic/src/usdf_wait.h b/prov/usnic/src/usdf_wait.h
index 4ec3d3e..8fd7ad7 100644
--- a/prov/usnic/src/usdf_wait.h
+++ b/prov/usnic/src/usdf_wait.h
@@ -49,7 +49,7 @@ struct usdf_wait {
 		struct fi_mutex_cond mutex_cond;
 	} object;
 
-	atomic_t		wait_refcnt;
+	ofi_atomic32_t		wait_refcnt;
 
 	fastlock_t		lock;
 	struct dlist_entry	list;
diff --git a/prov/usnic/src/usnic_direct/usd_device.c b/prov/usnic/src/usnic_direct/usd_device.c
index 2a7a1af..a0618df 100644
--- a/prov/usnic/src/usnic_direct/usd_device.c
+++ b/prov/usnic/src/usnic_direct/usd_device.c
@@ -51,8 +51,6 @@
 #include <sys/stat.h>
 #include <sys/mman.h>
 
-#include <infiniband/driver.h>
-
 #include "usnic_direct.h"
 #include "usd.h"
 #include "usd_ib_sysfs.h"
diff --git a/prov/usnic/src/usnic_direct/usd_event.c b/prov/usnic/src/usnic_direct/usd_event.c
index 1e4fe1e..9eb2432 100644
--- a/prov/usnic/src/usnic_direct/usd_event.c
+++ b/prov/usnic/src/usnic_direct/usd_event.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * LICENSE_BEGIN
  *
@@ -44,9 +44,10 @@
 #include <unistd.h>
 #include <errno.h>
 
-#include <infiniband/kern-abi.h>
 #include <infiniband/verbs.h>
 
+#include <rdma/ib_user_verbs.h>
+
 #include "usnic_direct.h"
 #include "usd.h"
 
@@ -57,7 +58,7 @@ int
 usd_get_device_event(struct usd_device *dev,
                      struct usd_device_event *devent)
 {
-    struct ibv_kern_async_event ib_event;
+    struct ib_uverbs_async_event_desc ib_event;
     int n;
 
     n = read(dev->ud_attrs.uda_event_fd, &ib_event, sizeof(ib_event));
diff --git a/prov/usnic/src/usnic_direct/usd_ib_cmd.c b/prov/usnic/src/usnic_direct/usd_ib_cmd.c
index 10ef7fc..7964292 100644
--- a/prov/usnic/src/usnic_direct/usd_ib_cmd.c
+++ b/prov/usnic/src/usnic_direct/usd_ib_cmd.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2014-2017, Cisco Systems, Inc. All rights reserved.
  *
  * LICENSE_BEGIN
  *
@@ -52,7 +52,7 @@
 #include <sys/mman.h>
 #include <sched.h>
 
-#include <infiniband/driver.h>
+#include <infiniband/verbs.h>
 
 #include "kcompat.h"
 #include "usnic_ib_abi.h"
@@ -66,8 +66,9 @@ usd_ib_cmd_get_context(struct usd_context *uctx)
 {
     struct usnic_get_context cmd;
     struct usnic_get_context_resp resp;
-    struct ibv_get_context *icp;
-    struct ibv_get_context_resp *irp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_get_context *icp;
+    struct ib_uverbs_get_context_resp *irp;
     struct usnic_ib_get_context_cmd *ucp;
     struct usnic_ib_get_context_resp *urp;
     int n;
@@ -77,10 +78,12 @@ usd_ib_cmd_get_context(struct usd_context *uctx)
     memset(&resp, 0, sizeof(resp));
 
     /* fill in the command struct */
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_GET_CONTEXT;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_GET_CONTEXT;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
     icp->response = (uintptr_t) & resp;
 
     ucp = &cmd.usnic_cmd;
@@ -150,7 +153,8 @@ usd_ib_cmd_devcmd(
 {
     struct usnic_get_context cmd;
     struct usnic_get_context_resp resp;
-    struct ibv_get_context *icp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_get_context *icp;
     struct usnic_ib_get_context_cmd *ucp;
     struct usnic_ib_get_context_resp *urp;
     struct usnic_udevcmd_cmd udevcmd;
@@ -167,10 +171,12 @@ usd_ib_cmd_devcmd(
     memset(&udevcmd_resp, 0, sizeof(udevcmd_resp));
 
     /* fill in the command struct */
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_GET_CONTEXT;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_GET_CONTEXT;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
     icp->response = (uintptr_t) & resp;
 
     /* fill in usnic devcmd struct */
@@ -229,16 +235,19 @@ _usd_ib_cmd_dealloc_pd(
     uint32_t pd_handle)
 {
     struct usnic_dealloc_pd cmd;
-    struct ibv_dealloc_pd *icp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_dealloc_pd *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_DEALLOC_PD;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = 0;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_DEALLOC_PD;
     icp->pd_handle = pd_handle;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = 0;
 
     n = write(dev->ud_ctx->ucx_ib_dev_fd, &cmd, sizeof(cmd));
     if (n != sizeof(cmd)) {
@@ -260,9 +269,10 @@ _usd_ib_cmd_alloc_pd(
 {
     struct usnic_alloc_pd cmd;
     struct usnic_alloc_pd_resp resp;
-    struct ibv_alloc_pd *icp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_alloc_pd *icp;
     struct usnic_ib_alloc_pd_cmd *ucp;
-    struct ibv_alloc_pd_resp *irp;
+    struct ib_uverbs_alloc_pd_resp *irp;
     struct usnic_ib_alloc_pd_resp *urp;
     int n;
 
@@ -270,10 +280,12 @@ _usd_ib_cmd_alloc_pd(
     memset(&resp, 0, sizeof(resp));
 
     /* fill in command */
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_ALLOC_PD;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_ALLOC_PD;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
     icp->response = (uintptr_t) & resp;
 
     /*
@@ -357,19 +369,21 @@ usd_ib_cmd_reg_mr(
 {
     struct usnic_reg_mr cmd;
     struct usnic_reg_mr_resp resp;
-    struct ibv_reg_mr *icp;
-    struct ibv_reg_mr_resp *irp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_reg_mr *icp;
+    struct ib_uverbs_reg_mr_resp *irp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
     memset(&resp, 0, sizeof(resp));
 
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_REG_MR;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_REG_MR;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
     icp->response = (uintptr_t) & resp;
-
     icp->start = (uintptr_t) vaddr;
     icp->length = length;
     icp->hca_va = (uintptr_t) vaddr;
@@ -396,17 +410,19 @@ usd_ib_cmd_dereg_mr(
     struct usd_device *dev,
     struct usd_mr *mr)
 {
-    struct ibv_dereg_mr cmd;
-    struct ibv_dereg_mr *icp;
+    struct usnic_dereg_mr cmd;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_dereg_mr *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_DEREG_MR;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = 0;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_DEREG_MR;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = 0;
 
+    icp = &cmd.ibv_cmd;
     icp->mr_handle = mr->umr_handle;
 
     /* Issue command to IB driver */
@@ -431,8 +447,9 @@ usd_ib_cmd_create_cq(
 {
     struct usnic_create_cq cmd;
     struct usnic_create_cq_resp resp;
-    struct ibv_create_cq *icp;
-    struct ibv_create_cq_resp *irp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_create_cq *icp;
+    struct ib_uverbs_create_cq_resp *irp;
     cpu_set_t *affinity_mask = NULL;
     int flags = 0;
     int n;
@@ -440,10 +457,12 @@ usd_ib_cmd_create_cq(
     memset(&cmd, 0, sizeof(cmd));
     memset(&resp, 0, sizeof(resp));
 
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_CREATE_CQ;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_CREATE_CQ;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
     icp->response = (uintptr_t) & resp;
 
     if (ibv_cq == NULL) {
@@ -510,17 +529,19 @@ usd_ib_cmd_destroy_cq(
     struct usd_device *dev,
     struct usd_cq_impl *cq)
 {
-    struct ibv_destroy_cq cmd;
-    struct ibv_destroy_cq *icp;
+    struct usnic_destroy_cq cmd;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_destroy_cq *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_DESTROY_CQ;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = 0;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_DESTROY_CQ;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = 0;
 
+    icp = &cmd.ibv_cmd;
     icp->cq_handle = cq->ucq_handle;
 
     /* Issue command to IB driver */
@@ -543,8 +564,9 @@ usd_ib_cmd_create_qp(
 {
     struct usnic_create_qp cmd;
     struct usnic_create_qp_resp *resp;
-    struct ibv_create_qp *icp;
-    struct ibv_create_qp_resp *irp = NULL;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_create_qp *icp;
+    struct ib_uverbs_create_qp_resp *irp = NULL;
     struct usnic_ib_create_qp_cmd *ucp;
     struct usnic_ib_create_qp_resp *urp;
     struct usd_qp_filter *qfilt;
@@ -564,12 +586,13 @@ usd_ib_cmd_create_qp(
         return -ENOMEM;
     }
 
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_CREATE_QP;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(*resp) / 4;
+
     icp = &cmd.ibv_cmd;
-    icp->command = IB_USER_VERBS_CMD_CREATE_QP;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(*resp) / 4;
     icp->response = (uintptr_t) resp;
-
     icp->user_handle = (uintptr_t) qp;
     icp->pd_handle = dev->ud_pd_handle;
     icp->send_cq_handle = qp->uq_wq.uwq_cq->ucq_handle;
@@ -725,17 +748,19 @@ usd_ib_cmd_modify_qp(
     struct usd_qp_impl *qp,
     int state)
 {
-    struct ibv_modify_qp cmd;
-    struct ibv_modify_qp *icp;
+    struct usnic_modify_qp cmd;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_modify_qp *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_MODIFY_QP;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = 0;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_MODIFY_QP;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = 0;
 
+    icp = &cmd.ibv_cmd;
     icp->qp_handle = qp->uq_qp_handle;
     icp->attr_mask = IBV_QP_STATE;
     icp->qp_state = state;
@@ -754,19 +779,21 @@ usd_ib_cmd_destroy_qp(
     struct usd_device *dev,
     struct usd_qp_impl *qp)
 {
-    struct ibv_destroy_qp cmd;
-    struct ibv_destroy_qp_resp resp;
-    struct ibv_destroy_qp *icp;
+    struct usnic_destroy_qp cmd;
+    struct ib_uverbs_destroy_qp_resp resp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_destroy_qp *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_DESTROY_QP;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
-    icp->response = (uintptr_t) & resp;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_DESTROY_QP;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
 
+    icp = &cmd.ibv_cmd;
+    icp->response = (uintptr_t) & resp;
     icp->qp_handle = qp->uq_qp_handle;
 
     /* Issue command to IB driver */
@@ -781,18 +808,21 @@ usd_ib_cmd_destroy_qp(
 static int
 usd_ib_cmd_query_device(
     struct usd_device *dev,
-    struct ibv_query_device_resp *irp)
+    struct ib_uverbs_query_device_resp *irp)
 {
-    struct ibv_query_device cmd;
-    struct ibv_query_device *icp;
+    struct usnic_query_device cmd;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_query_device *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_QUERY_DEVICE;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(*irp) / 4;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_QUERY_DEVICE;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(*irp) / 4;
+
+    icp = &cmd.ibv_cmd;
     icp->response = (uintptr_t) irp;
 
     /* keep Valgrind happy */
@@ -810,20 +840,22 @@ usd_ib_cmd_query_device(
 static int
 usd_ib_cmd_query_port(
     struct usd_device *dev,
-    struct ibv_query_port_resp *irp)
+    struct ib_uverbs_query_port_resp *irp)
 {
-    struct ibv_query_port cmd;
-    struct ibv_query_port *icp;
+    struct usnic_query_port cmd;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_query_port *icp;
     int n;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_QUERY_PORT;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(*irp) / 4;
-    icp->response = (uintptr_t) irp;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_QUERY_PORT;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(*irp) / 4;
 
+    icp = &cmd.ibv_cmd;
+    icp->response = (uintptr_t) irp;
     icp->port_num = 1;
 
     /* keep Valgrind happy */
@@ -845,8 +877,8 @@ int
 usd_ib_query_dev(
     struct usd_device *dev)
 {
-    struct ibv_query_device_resp dresp;
-    struct ibv_query_port_resp presp;
+    struct ib_uverbs_query_device_resp dresp;
+    struct ib_uverbs_query_port_resp presp;
     struct usd_device_attrs *dap;
     unsigned speed;
     int ret;
@@ -925,17 +957,20 @@ usd_ib_cmd_create_comp_channel(
     int *comp_fd_o)
 {
     int n;
-    struct ibv_create_comp_channel cmd;
-    struct ibv_create_comp_channel_resp resp;
-    struct ibv_create_comp_channel *icp;
-    struct ibv_create_comp_channel_resp *irp;
+    struct usnic_create_comp_channel cmd;
+    struct ib_uverbs_create_comp_channel_resp resp;
+    struct ib_uverbs_cmd_hdr *ich;
+    struct ib_uverbs_create_comp_channel *icp;
+    struct ib_uverbs_create_comp_channel_resp *irp;
 
     memset(&cmd, 0, sizeof(cmd));
 
-    icp = &cmd;
-    icp->command = IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL;
-    icp->in_words = sizeof(cmd) / 4;
-    icp->out_words = sizeof(resp) / 4;
+    ich = &cmd.ibv_cmd_hdr;
+    ich->command = IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL;
+    ich->in_words = sizeof(cmd) / 4;
+    ich->out_words = sizeof(resp) / 4;
+
+    icp = &cmd.ibv_cmd;
     icp->response = (uintptr_t) & resp;
 
     /* Issue command to IB driver */
diff --git a/prov/usnic/src/usnic_direct/usd_ib_sysfs.c b/prov/usnic/src/usnic_direct/usd_ib_sysfs.c
index 25a87fa..72d6958 100644
--- a/prov/usnic/src/usnic_direct/usd_ib_sysfs.c
+++ b/prov/usnic/src/usnic_direct/usd_ib_sysfs.c
@@ -50,8 +50,6 @@
 #include <errno.h>
 #include <sys/stat.h>
 
-#include <infiniband/driver.h>
-
 #include "usd.h"
 #include "usd_ib_sysfs.h"
 #include "usd_util.h"
diff --git a/prov/usnic/src/usnic_direct/usnic_ib_abi.h b/prov/usnic/src/usnic_direct/usnic_ib_abi.h
index a2467a8..dbf7cbc 100644
--- a/prov/usnic/src/usnic_direct/usnic_ib_abi.h
+++ b/prov/usnic/src/usnic_direct/usnic_ib_abi.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, Cisco Systems, Inc. All rights reserved.
+ * Copyright (c) 2013-2017, Cisco Systems, Inc. All rights reserved.
  *
  * LICENSE_BEGIN
  *
@@ -44,68 +44,110 @@
 #ifndef USNIC_IB_ABI_H
 #define USNIC_IB_ABI_H
 
-#include <infiniband/kern-abi.h>
+#include "kcompat.h"
+#include <rdma/ib_user_verbs.h>
 
 /*
  * Pick up common file with driver
  */
 #include "usnic_abi.h"
 
-struct usnic_create_qp_resp {
-	struct ibv_create_qp_resp   ibv_resp;
-	struct usnic_ib_create_qp_resp usnic_resp;
+struct usnic_query_device {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_query_device	ibv_cmd;
+};
+
+struct usnic_query_port {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_query_port	ibv_cmd;
 };
 
 struct usnic_get_context {
-	struct ibv_get_context		ibv_cmd;
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_get_context	ibv_cmd;
 	struct usnic_ib_get_context_cmd usnic_cmd;
 	__u64				reserved;
 };
 
 struct usnic_get_context_resp {
-	struct ibv_get_context_resp	ibv_resp;
+	struct ib_uverbs_get_context_resp ibv_resp;
 	struct usnic_ib_get_context_resp usnic_resp;
 	__u64				reserved;
 };
 
 struct usnic_alloc_pd {
-	struct ibv_alloc_pd		ibv_cmd;
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_alloc_pd	ibv_cmd;
 	struct usnic_ib_alloc_pd_cmd	usnic_cmd;
 };
 
 struct usnic_alloc_pd_resp {
-	struct ibv_alloc_pd_resp	ibv_resp;
+	struct ib_uverbs_alloc_pd_resp	ibv_resp;
 	struct usnic_ib_alloc_pd_resp	usnic_resp;
 };
 
 struct usnic_dealloc_pd {
-	struct ibv_dealloc_pd		ibv_cmd;
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_dealloc_pd	ibv_cmd;
+};
+
+struct usnic_create_comp_channel {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_create_comp_channel	ibv_cmd;
 };
 
 struct usnic_reg_mr {
-	struct ibv_reg_mr		ibv_cmd;
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_reg_mr		ibv_cmd;
 	__u64				reserved;
 };
 
 struct usnic_reg_mr_resp {
-	struct ibv_reg_mr_resp		ibv_resp;
+	struct ib_uverbs_reg_mr_resp	ibv_resp;
 	__u64				reserved;
 };
 
+struct usnic_dereg_mr {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_dereg_mr	ibv_cmd;
+};
+
+struct usnic_create_qp {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_create_qp	ibv_cmd;
+	struct usnic_ib_create_qp_cmd	usnic_cmd;
+	__u64				reserved[8];
+};
+
+struct usnic_create_qp_resp {
+	struct ib_uverbs_create_qp_resp	ibv_resp;
+	struct usnic_ib_create_qp_resp	usnic_resp;
+};
+
+struct usnic_modify_qp {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_modify_qp	ibv_cmd;
+};
+
+struct usnic_destroy_qp {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_destroy_qp	ibv_cmd;
+};
+
 struct usnic_create_cq {
-	struct ibv_create_cq		ibv_cmd;
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_create_cq	ibv_cmd;
 	struct usnic_ib_create_cq	usnic_cmd;
 };
 
 struct usnic_create_cq_resp {
-	struct ibv_create_cq_resp	ibv_resp;
+	struct ib_uverbs_create_cq_resp	ibv_resp;
 	struct usnic_ib_create_cq_resp	usnic_resp;
 };
 
-struct usnic_create_qp {
-	struct ibv_create_qp		ibv_cmd;
-	struct usnic_ib_create_qp_cmd	usnic_cmd;
-	__u64				reserved[8];
+struct usnic_destroy_cq {
+	struct ib_uverbs_cmd_hdr	ibv_cmd_hdr;
+	struct ib_uverbs_destroy_cq	ibv_cmd;
 };
 
 #endif /* USNIC_IB_ABI_H */
diff --git a/prov/util/src/util_atomic.c b/prov/util/src/util_atomic.c
new file mode 100644
index 0000000..87d4336
--- /dev/null
+++ b/prov/util/src/util_atomic.c
@@ -0,0 +1,449 @@
+/*
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "ofi_atomic.h"
+
+
+static const size_t ofi_datatype_size_table[] = {
+	[FI_INT8]   = sizeof(int8_t),
+	[FI_UINT8]  = sizeof(uint8_t),
+	[FI_INT16]  = sizeof(int16_t),
+	[FI_UINT16] = sizeof(uint16_t),
+	[FI_INT32]  = sizeof(int32_t),
+	[FI_UINT32] = sizeof(uint32_t),
+	[FI_INT64]  = sizeof(int64_t),
+	[FI_UINT64] = sizeof(uint64_t),
+	[FI_FLOAT]  = sizeof(float),
+	[FI_DOUBLE] = sizeof(double),
+	[FI_FLOAT_COMPLEX]  = sizeof(ofi_complex_float),
+	[FI_DOUBLE_COMPLEX] = sizeof(ofi_complex_double),
+	[FI_LONG_DOUBLE]    = sizeof(long double),
+	[FI_LONG_DOUBLE_COMPLEX] = sizeof(ofi_complex_long_double),
+};
+
+size_t ofi_datatype_size(enum fi_datatype datatype)
+{
+	if (datatype >= FI_DATATYPE_LAST) {
+		errno = FI_EINVAL;
+		return 0;
+	}
+	return ofi_datatype_size_table[datatype];
+}
+
+
+/*
+ * Basic atomic operations
+ */
+
+#define OFI_OP_MIN(type,dst,src)   if ((dst) > (src)) (dst) = (src)
+#define OFI_OP_MAX(type,dst,src)   if ((dst) < (src)) (dst) = (src)
+#define OFI_OP_SUM(type,dst,src)   (dst) += (src)
+#define OFI_OP_PROD(type,dst,src)  (dst) *= (src)
+#define OFI_OP_LOR(type,dst,src)   (dst) = (dst) || (src)
+#define OFI_OP_LAND(type,dst,src)  (dst) = (dst) && (src)
+#define OFI_OP_BOR(type,dst,src)   (dst) |= (src)
+#define OFI_OP_BAND(type,dst,src)  (dst) &= (src)
+#define OFI_OP_LXOR(type,dst,src)  (dst) = ((dst) && !(src)) || (!(dst) && (src))
+#define OFI_OP_BXOR(type,dst,src)  (dst) ^= (src)
+#define OFI_OP_READ(type,dst,src)  /* src unused, dst is written to result */
+#define OFI_OP_WRITE(type,dst,src) (dst) = (src)
+
+#define OFI_OP_CSWAP_EQ(type,dst,src,cmp) if ((dst) == (cmp)) (dst) = (src)
+#define OFI_OP_CSWAP_NE(type,dst,src,cmp) if ((dst) != (cmp)) (dst) = (src)
+#define OFI_OP_CSWAP_LE(type,dst,src,cmp) if ((dst) <= (cmp)) (dst) = (src)
+#define OFI_OP_CSWAP_LT(type,dst,src,cmp) if ((dst) <  (cmp)) (dst) = (src)
+#define OFI_OP_CSWAP_GE(type,dst,src,cmp) if ((dst) >= (cmp)) (dst) = (src)
+#define OFI_OP_CSWAP_GT(type,dst,src,cmp) if ((dst) >  (cmp)) (dst) = (src)
+#define OFI_OP_MSWAP(type,dst,src,cmp)    (dst) = (((src) & (cmp)) | \
+						   ((dst) & ~(cmp)))
+
+/* Need special handlers for complex datatypes for portability */
+#define OFI_OP_SUM_COMPLEX(type,dst,src)  (dst) = ofi_complex_sum_##type(dst,src)
+#define OFI_OP_PROD_COMPLEX(type,dst,src) (dst) = ofi_complex_prod_##type(dst,src)
+#define OFI_OP_LOR_COMPLEX(type,dst,src)  (dst) = ofi_complex_lor_##type(dst,src)
+#define OFI_OP_LAND_COMPLEX(type,dst,src) (dst) = ofi_complex_land_##type(dst,src)
+#define OFI_OP_LXOR_COMPLEX(type,dst,src) (dst) = ofi_complex_lxor_##type(dst,src)
+#define OFI_OP_READ_COMPLEX		  OFI_OP_READ
+#define OFI_OP_WRITE_COMPLEX		  OFI_OP_WRITE
+
+#define OFI_OP_CSWAP_EQ_COMPLEX(type,dst,src,cmp) \
+			if (ofi_complex_eq_##type(dst,cmp)) (dst) = (src)
+#define OFI_OP_CSWAP_NE_COMPLEX(type,dst,src,cmp) \
+			if (!ofi_complex_eq_##type(dst,cmp)) (dst) = (src)
+
+
+/********************************
+ * ATOMIC TYPE function templates
+ ********************************/
+
+#define OFI_DEF_NOOP_NAME NULL,
+#define OFI_DEF_NOOP_FUNC
+
+/*
+ * WRITE
+ */
+#define OFI_DEF_WRITE_NAME(op, type) ofi_write_## op ##_## type,
+#define OFI_DEF_WRITE_COMPLEX_NAME(op, type) ofi_write_## op ##_## type,
+
+#define OFI_DEF_WRITE_FUNC(op, type)					\
+	static void ofi_write_## op ##_## type				\
+		(void *dst, const void *src, size_t cnt)		\
+	{								\
+		size_t i;						\
+		type *d = (dst);					\
+		const type *s = (src);					\
+		for (i = 0; i < cnt; i++)				\
+			op(type, d[i], s[i]);				\
+	}
+
+#define OFI_DEF_WRITE_COMPLEX_FUNC(op, type)				\
+	static void ofi_write_## op ##_## type				\
+		(void *dst, const void *src, size_t cnt)		\
+	{								\
+		size_t i;						\
+		ofi_complex_##type *d = (dst);				\
+		const ofi_complex_##type *s = (src);			\
+		for (i = 0; i < cnt; i++)				\
+			op(type, d[i], s[i]);				\
+	}
+
+/*
+ * READ (fetch)
+ */
+#define OFI_DEF_READ_NAME(op, type) ofi_read_## op ##_## type,
+#define OFI_DEF_READ_COMPLEX_NAME(op, type) ofi_read_## op ##_## type,
+
+#define OFI_DEF_READ_FUNC(op, type)					\
+	static void ofi_read_## op ##_## type				\
+		(void *dst, const void *src, void *res, size_t cnt) 	\
+	{								\
+		size_t i;						\
+		type *d = (dst);					\
+		type *r = (res);					\
+		OFI_UNUSED(src);					\
+		for (i = 0; i < cnt; i++)				\
+			r[i] = d[i];					\
+	}
+
+#define OFI_DEF_READ_COMPLEX_FUNC(op, type)				\
+	static void ofi_read_## op ##_## type				\
+		(void *dst, const void *src, void *res, size_t cnt)	\
+	{								\
+		size_t i;						\
+		ofi_complex_##type *d = (dst);				\
+		ofi_complex_##type *r = (res);				\
+		OFI_UNUSED(src);					\
+		for (i = 0; i < cnt; i++)				\
+			r[i] = d[i];					\
+	}
+
+/*
+ * READWRITE (fetch-write)
+ */
+#define OFI_DEF_READWRITE_NAME(op, type) ofi_readwrite_## op ##_## type,
+#define OFI_DEF_READWRITE_COMPLEX_NAME(op, type) ofi_readwrite_## op ##_## type,
+
+#define OFI_DEF_READWRITE_FUNC(op, type)				\
+	static void ofi_readwrite_## op ##_## type			\
+		(void *dst, const void *src, void *res, size_t cnt)	\
+	{								\
+		size_t i;						\
+		type *d = (dst);					\
+		const type *s = (src);					\
+		type *r = (res);					\
+		for (i = 0; i < cnt; i++) {				\
+			r[i] = d[i];					\
+			op(type, d[i], s[i]);				\
+		}							\
+	}
+
+#define OFI_DEF_READWRITE_COMPLEX_FUNC(op, type)			\
+	static void ofi_readwrite_## op ##_## type			\
+		(void *dst, const void *src, void *res, size_t cnt)	\
+	{								\
+		size_t i;						\
+		ofi_complex_##type *d = (dst);				\
+		const ofi_complex_##type *s = (src);			\
+		ofi_complex_##type *r = (res);				\
+		for (i = 0; i < cnt; i++) {				\
+			r[i] = d[i];					\
+			op(type, d[i], s[i]);				\
+		}							\
+	}
+
+/*
+ * CSWAP
+ */
+#define OFI_DEF_CSWAP_NAME(op, type) ofi_cswap_## op ##_## type,
+#define OFI_DEF_CSWAP_COMPLEX_NAME(op, type) ofi_cswap_## op ##_## type,
+
+#define OFI_DEF_CSWAP_FUNC(op, type)					\
+	static void ofi_cswap_## op ##_## type				\
+		(void *dst, const void *src, const void *cmp,		\
+		 void *res, size_t cnt)					\
+	{								\
+		size_t i;						\
+		type *d = (dst);					\
+		const type *s = (src);					\
+		const type *c = (cmp);					\
+		type *r = (res);					\
+		for (i = 0; i < cnt; i++) {				\
+			r[i] = d[i];					\
+			op(type, d[i], s[i], c[i]);			\
+		}							\
+	}
+
+#define OFI_DEF_CSWAP_COMPLEX_FUNC(op, type)				\
+	static void ofi_cswap_## op ##_## type				\
+		(void *dst, const void *src, const void *cmp,		\
+		 void *res, size_t cnt)					\
+	{								\
+		size_t i;						\
+		ofi_complex_##type *d = (dst);				\
+		const ofi_complex_##type *s = (src);			\
+		const ofi_complex_##type *c = (cmp);			\
+		ofi_complex_##type *r = (res);				\
+		for (i = 0; i < cnt; i++) {				\
+			r[i] = d[i];					\
+			op(type, d[i], s[i], c[i]);			\
+		}							\
+	}
+
+
+/*********************************************************************
+ * Macros create atomic functions for each operation for each datatype
+ *********************************************************************/
+
+/*
+ * Define all handlers in order to populate the dispatch table correctly.
+ *
+ * ATOMICTYPE - WRITE, READ, READWRITE, CSWAP, MSWAP
+ * FUNCNAME - Define function or simply generate function name
+ *            The latter is needed to populate the dispatch table
+ * op - OFI_OP_XXX function should perform (e.g. OFI_OP_MIN)
+ */
+#define OFI_DEFINE_ALL_HANDLERS(ATOMICTYPE, FUNCNAME, op)		\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int8_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint8_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int16_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint16_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int32_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint32_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int64_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint64_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, float)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, double)			\
+	OFI_DEF_##ATOMICTYPE##_COMPLEX_##FUNCNAME(op ##_COMPLEX, float)	\
+	OFI_DEF_##ATOMICTYPE##_COMPLEX_##FUNCNAME(op ##_COMPLEX, double)\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, long_double)		\
+	OFI_DEF_##ATOMICTYPE##_COMPLEX_##FUNCNAME(op ##_COMPLEX, long_double)
+
+#define OFI_DEFINE_REALNO_HANDLERS(ATOMICTYPE, FUNCNAME, op)		\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int8_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint8_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int16_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint16_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int32_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint32_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int64_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint64_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, float)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, double)			\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, long_double)		\
+	OFI_DEF_NOOP_##FUNCNAME
+
+#define OFI_DEFINE_INT_HANDLERS(ATOMICTYPE, FUNCNAME, op)		\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int8_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint8_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int16_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint16_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int32_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint32_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, int64_t)			\
+	OFI_DEF_##ATOMICTYPE##_##FUNCNAME(op, uint64_t)			\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_NOOP_##FUNCNAME						\
+	OFI_DEF_NOOP_##FUNCNAME
+
+
+/**********************
+ * Write dispatch table
+ **********************/
+
+OFI_DEFINE_REALNO_HANDLERS(WRITE, FUNC, OFI_OP_MIN)
+OFI_DEFINE_REALNO_HANDLERS(WRITE, FUNC, OFI_OP_MAX)
+OFI_DEFINE_ALL_HANDLERS(WRITE, FUNC, OFI_OP_SUM)
+OFI_DEFINE_ALL_HANDLERS(WRITE, FUNC, OFI_OP_PROD)
+OFI_DEFINE_ALL_HANDLERS(WRITE, FUNC, OFI_OP_LOR)
+OFI_DEFINE_ALL_HANDLERS(WRITE, FUNC, OFI_OP_LAND)
+OFI_DEFINE_INT_HANDLERS(WRITE, FUNC, OFI_OP_BOR)
+OFI_DEFINE_INT_HANDLERS(WRITE, FUNC, OFI_OP_BAND)
+OFI_DEFINE_ALL_HANDLERS(WRITE, FUNC, OFI_OP_LXOR)
+OFI_DEFINE_INT_HANDLERS(WRITE, FUNC, OFI_OP_BXOR)
+OFI_DEFINE_ALL_HANDLERS(WRITE, FUNC, OFI_OP_WRITE)
+
+void (*ofi_atomic_write_handlers[OFI_WRITE_OP_LAST][FI_DATATYPE_LAST])
+	(void *dst, const void *src, size_t cnt) =
+{
+	{ OFI_DEFINE_REALNO_HANDLERS(WRITE, NAME, OFI_OP_MIN) },
+	{ OFI_DEFINE_REALNO_HANDLERS(WRITE, NAME, OFI_OP_MAX) },
+	{ OFI_DEFINE_ALL_HANDLERS(WRITE, NAME, OFI_OP_SUM) },
+	{ OFI_DEFINE_ALL_HANDLERS(WRITE, NAME, OFI_OP_PROD) },
+	{ OFI_DEFINE_ALL_HANDLERS(WRITE, NAME, OFI_OP_LOR) },
+	{ OFI_DEFINE_ALL_HANDLERS(WRITE, NAME, OFI_OP_LAND) },
+	{ OFI_DEFINE_INT_HANDLERS(WRITE, NAME, OFI_OP_BOR) },
+	{ OFI_DEFINE_INT_HANDLERS(WRITE, NAME, OFI_OP_BAND) },
+	{ OFI_DEFINE_ALL_HANDLERS(WRITE, NAME, OFI_OP_LXOR) },
+	{ OFI_DEFINE_INT_HANDLERS(WRITE, NAME, OFI_OP_BXOR) },
+	 /* no-op: FI_ATOMIC_READ */
+	{ NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL},
+	{ OFI_DEFINE_ALL_HANDLERS(WRITE, NAME, OFI_OP_WRITE) },
+};
+
+
+/***************************
+ * Read-write dispatch table
+ ***************************/
+
+OFI_DEFINE_REALNO_HANDLERS(READWRITE, FUNC, OFI_OP_MIN)
+OFI_DEFINE_REALNO_HANDLERS(READWRITE, FUNC, OFI_OP_MAX)
+OFI_DEFINE_ALL_HANDLERS(READWRITE, FUNC, OFI_OP_SUM)
+OFI_DEFINE_ALL_HANDLERS(READWRITE, FUNC, OFI_OP_PROD)
+OFI_DEFINE_ALL_HANDLERS(READWRITE, FUNC, OFI_OP_LOR)
+OFI_DEFINE_ALL_HANDLERS(READWRITE, FUNC, OFI_OP_LAND)
+OFI_DEFINE_INT_HANDLERS(READWRITE, FUNC, OFI_OP_BOR)
+OFI_DEFINE_INT_HANDLERS(READWRITE, FUNC, OFI_OP_BAND)
+OFI_DEFINE_ALL_HANDLERS(READWRITE, FUNC, OFI_OP_LXOR)
+OFI_DEFINE_INT_HANDLERS(READWRITE, FUNC, OFI_OP_BXOR)
+OFI_DEFINE_ALL_HANDLERS(READ, FUNC, OFI_OP_READ)
+OFI_DEFINE_ALL_HANDLERS(READWRITE, FUNC, OFI_OP_WRITE)
+
+void (*ofi_atomic_readwrite_handlers[OFI_READWRITE_OP_LAST][FI_DATATYPE_LAST])
+	(void *dst, const void *src, void *res, size_t cnt) =
+{
+	{ OFI_DEFINE_REALNO_HANDLERS(READWRITE, NAME, OFI_OP_MIN) },
+	{ OFI_DEFINE_REALNO_HANDLERS(READWRITE, NAME, OFI_OP_MAX) },
+	{ OFI_DEFINE_ALL_HANDLERS(READWRITE, NAME, OFI_OP_SUM) },
+	{ OFI_DEFINE_ALL_HANDLERS(READWRITE, NAME, OFI_OP_PROD) },
+	{ OFI_DEFINE_ALL_HANDLERS(READWRITE, NAME, OFI_OP_LOR) },
+	{ OFI_DEFINE_ALL_HANDLERS(READWRITE, NAME, OFI_OP_LAND) },
+	{ OFI_DEFINE_INT_HANDLERS(READWRITE, NAME, OFI_OP_BOR) },
+	{ OFI_DEFINE_INT_HANDLERS(READWRITE, NAME, OFI_OP_BAND) },
+	{ OFI_DEFINE_ALL_HANDLERS(READWRITE, NAME, OFI_OP_LXOR) },
+	{ OFI_DEFINE_INT_HANDLERS(READWRITE, NAME, OFI_OP_BXOR) },
+	{ OFI_DEFINE_ALL_HANDLERS(READ, NAME, OFI_OP_READ) },
+	{ OFI_DEFINE_ALL_HANDLERS(READWRITE, NAME, OFI_OP_WRITE) },
+};
+
+
+/*****************************
+ * Compare-swap dispatch table
+ *****************************/
+
+OFI_DEFINE_ALL_HANDLERS(CSWAP, FUNC, OFI_OP_CSWAP_EQ)
+OFI_DEFINE_ALL_HANDLERS(CSWAP, FUNC, OFI_OP_CSWAP_NE)
+OFI_DEFINE_REALNO_HANDLERS(CSWAP, FUNC, OFI_OP_CSWAP_LE)
+OFI_DEFINE_REALNO_HANDLERS(CSWAP, FUNC, OFI_OP_CSWAP_LT)
+OFI_DEFINE_REALNO_HANDLERS(CSWAP, FUNC, OFI_OP_CSWAP_GE)
+OFI_DEFINE_REALNO_HANDLERS(CSWAP, FUNC, OFI_OP_CSWAP_GT)
+OFI_DEFINE_INT_HANDLERS(CSWAP, FUNC, OFI_OP_MSWAP)
+
+void (*ofi_atomic_swap_handlers[OFI_SWAP_OP_LAST][FI_DATATYPE_LAST])
+	(void *dst, const void *src, const void *cmp, void *res, size_t cnt) =
+{
+	{ OFI_DEFINE_ALL_HANDLERS(CSWAP, NAME, OFI_OP_CSWAP_EQ) },
+	{ OFI_DEFINE_ALL_HANDLERS(CSWAP, NAME, OFI_OP_CSWAP_NE) },
+	{ OFI_DEFINE_REALNO_HANDLERS(CSWAP, NAME, OFI_OP_CSWAP_LE) },
+	{ OFI_DEFINE_REALNO_HANDLERS(CSWAP, NAME, OFI_OP_CSWAP_LT) },
+	{ OFI_DEFINE_REALNO_HANDLERS(CSWAP, NAME, OFI_OP_CSWAP_GE) },
+	{ OFI_DEFINE_REALNO_HANDLERS(CSWAP, NAME, OFI_OP_CSWAP_GT) },
+	{ OFI_DEFINE_INT_HANDLERS(CSWAP, NAME, OFI_OP_MSWAP) },
+};
+
+
+int ofi_atomic_valid(const struct fi_provider *prov,
+		     enum fi_datatype datatype, enum fi_op op, uint64_t flags)
+{
+	int have_func;
+
+	if (flags & FI_TAGGED) {
+		/* Only tagged atomic write operations currently supported */
+		if (flags & (FI_FETCH_ATOMIC | FI_COMPARE_ATOMIC)) {
+			FI_INFO(prov, FI_LOG_DOMAIN,
+				"Only tagged atomic writes supported\n");
+			return -FI_ENOSYS;
+		}
+	} else if (flags & ~(FI_FETCH_ATOMIC | FI_COMPARE_ATOMIC)) {
+		FI_INFO(prov, FI_LOG_DOMAIN, "Unknown flag specified\n");
+		 return -FI_EBADFLAGS;
+	} else if ((flags & FI_FETCH_ATOMIC) && (flags & FI_COMPARE_ATOMIC)) {
+		FI_INFO(prov, FI_LOG_DOMAIN, "Invalid flag combination\n");
+		return -FI_EBADFLAGS;
+	}
+
+	if (datatype >= FI_DATATYPE_LAST) {
+		FI_INFO(prov, FI_LOG_DOMAIN, "Invalid datatype\n");
+		return -FI_EOPNOTSUPP;
+	}
+
+	if (flags & FI_FETCH_ATOMIC) {
+		if (op >= OFI_READWRITE_OP_LAST) {
+			FI_INFO(prov, FI_LOG_DOMAIN, "Invalid fetch operation\n");
+			return -FI_EOPNOTSUPP;
+		}
+		have_func = ofi_atomic_readwrite_handlers[op][datatype] != NULL;
+	} else if (flags & FI_COMPARE_ATOMIC) {
+		if (op < FI_CSWAP || op > FI_MSWAP) {
+			FI_INFO(prov, FI_LOG_DOMAIN, "Invalid swap operation\n");
+			return -FI_EOPNOTSUPP;
+		}
+		have_func = ofi_atomic_swap_handlers[op - FI_CSWAP][datatype] != NULL;
+	} else {
+		if (op >= OFI_WRITE_OP_LAST) {
+			FI_INFO(prov, FI_LOG_DOMAIN, "Invalid write operation\n");
+			return -FI_EOPNOTSUPP;
+		}
+		have_func = ofi_atomic_write_handlers[op][datatype] != NULL;
+	}
+
+	if (!have_func) {
+		FI_INFO(prov, FI_LOG_DOMAIN, "Datatype/op combo not supported\n");
+		return -FI_EOPNOTSUPP;
+	}
+
+	return 0;
+}
diff --git a/prov/util/src/util_attr.c b/prov/util/src/util_attr.c
index 03a105a..82e76cb 100644
--- a/prov/util/src/util_attr.c
+++ b/prov/util/src/util_attr.c
@@ -34,20 +34,6 @@
 
 #include <fi_util.h>
 
-#define FI_INFO_FIELD(provider, prov, user, prov_str, user_str, field, type)	\
-	do {									\
-		FI_INFO(provider, FI_LOG_CORE, prov_str ": %s\n",		\
-				fi_tostr(&prov->field, type));			\
-		FI_INFO(provider, FI_LOG_CORE, user_str ": %s\n",		\
-				fi_tostr(&user->field, type));			\
-	} while (0)
-
-#define FI_INFO_CAPS(provider, prov, user, field, type) \
-	FI_INFO_FIELD(provider, prov, user, "Supported", "Requested", field, type)
-
-#define FI_INFO_MODE(provider, prov, user) \
-	FI_INFO_FIELD(provider, prov, user, "Expected", "Given", mode, FI_TYPE_MODE)
-
 static int fi_valid_addr_format(uint32_t prov_format, uint32_t user_format)
 {
 	if (user_format == FI_FORMAT_UNSPEC)
@@ -71,41 +57,83 @@ static int fi_valid_addr_format(uint32_t prov_format, uint32_t user_format)
 	}
 }
 
-char *ofi_strdup_less_prefix(char *name, char *prefix)
+/*
+char *ofi_strdup_head(const char *str)
 {
-	return strdup(name + strlen(prefix) + 1);
+	char *delim;
+	delim = strchr(str, OFI_NAME_DELIM);
+	return delim ? strndup(str, delim - str) : strdup(str);
 }
 
-char *ofi_strdup_add_prefix(char *name, char *prefix)
+char *ofi_strdup_tail(const char *str)
 {
-	char *prefix_name;
-	char *base = "";
-	ssize_t size;
-	int ret;
-
-	if (name)
-		base = name;
-
-	size = snprintf(NULL, 0, "%s_%s", prefix, base) + 1;
-	if (size < 0)
-		return NULL;
+	char *delim;
+	delim = strchr(str, OFI_NAME_DELIM);
+	return delim ? strup(delim + 1) : strdup(str);
+}
+*/
 
-	prefix_name = calloc(size, sizeof(*prefix_name));
-	if (!prefix_name)
-		return NULL;
+char *ofi_strdup_append(const char *head, const char *tail)
+{
+	char *str;
+	size_t len;
+
+	len = strlen(head) + strlen(tail) + 2;
+	str = malloc(len);
+	if (str)
+		sprintf(str, "%s%c%s", head, OFI_NAME_DELIM, tail);
+	return str;
+}
 
-	ret = snprintf(prefix_name, size, "%s_%s", prefix, base);
-	if (ret < 0 || ret > size)
-		goto err;
+static int ofi_has_util_prefix(const char *str)
+{
+	return !strncasecmp(str, OFI_UTIL_PREFIX, strlen(OFI_UTIL_PREFIX));
+}
 
-	return prefix_name;
+const char *ofi_util_name(const char *str, size_t *len)
+{
+	char *delim;
+
+	delim = strchr(str, OFI_NAME_DELIM);
+	if (delim) {
+		if (ofi_has_util_prefix(delim + 1)) {
+			*len = strlen(delim + 1);
+			return delim + 1;
+		} else if (ofi_has_util_prefix(str)) {
+			*len = delim - str;
+			return str;
+		}
+	} else if (ofi_has_util_prefix(str)) {
+		*len = strlen(str);
+		return str;
+	}
+	*len = 0;
+	return NULL;
+}
 
-err:
-	free(prefix_name);
+const char *ofi_core_name(const char *str, size_t *len)
+{
+	char *delim;
+
+	delim = strchr(str, OFI_NAME_DELIM);
+	if (delim) {
+		if (!ofi_has_util_prefix(delim + 1)) {
+			*len = strlen(delim + 1);
+			return delim + 1;
+		} else if (!ofi_has_util_prefix(str)) {
+			*len = delim - str;
+			return str;
+		}
+	} else if (!ofi_has_util_prefix(str)) {
+		*len = strlen(str);
+		return str;
+	}
+	*len = 0;
 	return NULL;
+
 }
 
-static int ofix_dup_addr(struct fi_info *info, struct fi_info *dup)
+static int ofi_dup_addr(struct fi_info *info, struct fi_info *dup)
 {
 	dup->addr_format = info->addr_format;
 	if (info->src_addr) {
@@ -126,141 +154,215 @@ static int ofix_dup_addr(struct fi_info *info, struct fi_info *dup)
 	return 0;
 }
 
-static int ofix_alter_layer_info(const struct fi_provider *prov,
-		const struct fi_info *prov_info,
-		struct fi_info *layer_info, ofi_alter_info_t alter_layer_info,
-		struct fi_info **base_info)
+static int ofi_info_to_core(uint32_t version, const struct fi_provider *prov,
+			    struct fi_info *util_info,
+			    ofi_alter_info_t info_to_core,
+			    struct fi_info **core_hints)
 {
-	if (!(*base_info = fi_allocinfo()))
+	const char *core_name;
+	size_t len;
+
+	if (!(*core_hints = fi_allocinfo()))
 		return -FI_ENOMEM;
 
-	if (alter_layer_info(layer_info, *base_info))
+	if (info_to_core(version, util_info, *core_hints))
 		goto err;
 
-	if (!layer_info)
+	if (!util_info)
 		return 0;
 
-	if (ofix_dup_addr(layer_info, *base_info))
+	if (ofi_dup_addr(util_info, *core_hints))
 		goto err;
 
-	if (layer_info->domain_attr && layer_info->domain_attr->name &&
-			!((*base_info)->domain_attr->name =
-			ofi_strdup_less_prefix(layer_info->domain_attr->name,
-			prov_info->domain_attr->name))) {
-		FI_WARN(prov, FI_LOG_FABRIC,
-				"Unable to alter layer_info domain name\n");
-		goto err;
+	if (util_info->fabric_attr) {
+		if (util_info->fabric_attr->name) {
+			(*core_hints)->fabric_attr->name =
+				strdup(util_info->fabric_attr->name);
+			if (!(*core_hints)->fabric_attr->name) {
+				FI_WARN(prov, FI_LOG_FABRIC,
+					"Unable to allocate fabric name\n");
+				goto err;
+			}
+		}
+
+		if (util_info->fabric_attr->prov_name) {
+			core_name = ofi_core_name(util_info->fabric_attr->
+						  prov_name, &len);
+			if (core_name) {
+				(*core_hints)->fabric_attr->prov_name =
+					strndup(core_name, len);
+				if (!(*core_hints)->fabric_attr->prov_name) {
+					FI_WARN(prov, FI_LOG_FABRIC,
+						"Unable to alloc prov name\n");
+					goto err;
+				}
+			}
+		}
+	}
+
+	if (util_info->domain_attr && util_info->domain_attr->name) {
+		(*core_hints)->domain_attr->name =
+			strdup(util_info->domain_attr->name);
+		if (!(*core_hints)->domain_attr->name) {
+			FI_WARN(prov, FI_LOG_FABRIC,
+				"Unable to allocate domain name\n");
+			goto err;
+		}
 	}
 	return 0;
+
 err:
-	fi_freeinfo(*base_info);
+	fi_freeinfo(*core_hints);
 	return -FI_ENOMEM;
 }
 
-static int ofix_alter_base_info(const struct fi_provider *prov,
-		const struct fi_info *prov_info,
-		struct fi_info *base_info, ofi_alter_info_t alter_base_info,
-		struct fi_info **layer_info)
+static int ofi_info_to_util(uint32_t version, const struct fi_provider *prov,
+			    struct fi_info *core_info,
+			    ofi_alter_info_t info_to_util,
+			    struct fi_info **util_info)
 {
-	if (!(*layer_info = fi_allocinfo()))
+	if (!(*util_info = fi_allocinfo()))
 		return -FI_ENOMEM;
 
-	if (alter_base_info(base_info, *layer_info))
+	if (info_to_util(version, core_info, *util_info))
 		goto err;
 
-	if (ofix_dup_addr(base_info, *layer_info))
+	if (ofi_dup_addr(core_info, *util_info))
 		goto err;
 
-	if (!((*layer_info)->domain_attr->name =
-				ofi_strdup_add_prefix(base_info->domain_attr->name,
-					prov_info->domain_attr->name))) {
+	(*util_info)->domain_attr->name = strdup(core_info->domain_attr->name);
+	if (!(*util_info)->domain_attr->name) {
+		FI_WARN(prov, FI_LOG_FABRIC,
+			"Unable to allocate domain name\n");
+		goto err;
+	}
+
+	(*util_info)->fabric_attr->name = strdup(core_info->fabric_attr->name);
+	if (!(*util_info)->fabric_attr->name) {
 		FI_WARN(prov, FI_LOG_FABRIC,
-				"Unable to alter base prov domain name\n");
+			"Unable to allocate fabric name\n");
 		goto err;
 	}
-	(*layer_info)->fabric_attr->prov_version = prov->version;
-	if (!((*layer_info)->fabric_attr->name = strdup(base_info->fabric_attr->name)))
+
+	(*util_info)->fabric_attr->prov_name = strdup(core_info->fabric_attr->
+						      prov_name);
+	if (!(*util_info)->fabric_attr->prov_name) {
+		FI_WARN(prov, FI_LOG_FABRIC,
+			"Unable to allocate fabric name\n");
 		goto err;
+	}
 
 	return 0;
 err:
-	fi_freeinfo(*layer_info);
+	fi_freeinfo(*util_info);
 	return -FI_ENOMEM;
 }
 
-int ofix_getinfo(uint32_t version, const char *node, const char *service,
-			uint64_t flags, const struct util_prov *util_prov,
-			struct fi_info *hints,
-			ofi_alter_info_t alter_layer_info,
-			ofi_alter_info_t alter_base_info,
-			int get_base_info, struct fi_info **info)
+int ofi_get_core_info(uint32_t version, const char *node, const char *service,
+		      uint64_t flags, const struct util_prov *util_prov,
+		      struct fi_info *util_hints, ofi_alter_info_t info_to_core,
+		      struct fi_info **core_info)
 {
-	struct fi_info *base_hints = NULL, *base_info;
-	struct fi_info *temp = NULL, *fi, *tail = NULL;
+	struct fi_info *core_hints = NULL;
 	int ret;
 
-	ret = fi_check_info(util_prov, hints, FI_MATCH_PREFIX);
+	ret = ofi_prov_check_info(util_prov, version, util_hints);
 	if (ret)
-		goto err1;
+		return ret;
 
-	ret = ofix_alter_layer_info(util_prov->prov, util_prov->info, hints,
-			alter_layer_info, &base_hints);
+	ret = ofi_info_to_core(version, util_prov->prov, util_hints, info_to_core,
+			       &core_hints);
 	if (ret)
-		goto err1;
+		return ret;
 
-	ret = fi_getinfo(version, node, service, flags, base_hints, &base_info);
-	if (ret)
-		goto err2;
+	ret = fi_getinfo(version, node, service, flags | OFI_CORE_PROV_ONLY,
+			 core_hints, core_info);
+	fi_freeinfo(core_hints);
+	return ret;
+}
 
-	if (get_base_info) {
-		*info = base_info;
-	} else {
-		for (fi = base_info; fi; fi = fi->next) {
-			ret = ofix_alter_base_info(util_prov->prov, util_prov->info,
-					fi, alter_base_info, &temp);
-			if (ret)
-				goto err3;
-			ofi_alter_info(temp, hints);
-			if (!tail)
-				*info = temp;
-			else
-				tail->next = temp;
-			tail = temp;
+int ofix_getinfo(uint32_t version, const char *node, const char *service,
+		 uint64_t flags, const struct util_prov *util_prov,
+		 struct fi_info *hints, ofi_alter_info_t info_to_core,
+		 ofi_alter_info_t info_to_util, struct fi_info **info)
+{
+	struct fi_info *core_info, *util_info, *cur, *tail;
+	int ret;
+
+	ret = ofi_get_core_info(version, node, service, flags, util_prov,
+				hints, info_to_core, &core_info);
+	if (ret)
+		return ret;
+
+	*info = tail = NULL;
+	for (cur = core_info; cur; cur = cur->next) {
+		ret = ofi_info_to_util(version, util_prov->prov, cur,
+				       info_to_util, &util_info);
+		if (ret) {
+			fi_freeinfo(*info);
+			break;
 		}
-		fi_freeinfo(base_info);
+
+		ofi_alter_info(util_info, hints, version);
+		if (!*info)
+			*info = util_info;
+		else
+			tail->next = util_info;
+		tail = util_info;
 	}
-	fi_freeinfo(base_hints);
-	return 0;
-err3:
-	fi_freeinfo(*info);
-err2:
-	fi_freeinfo(base_hints);
-err1:
-	return -FI_ENODATA;
+	fi_freeinfo(core_info);
+	return ret;
 }
 
-static int fi_check_name(char *user_name, char *prov_name, enum fi_match_type type)
+/* Caller should use only fabric_attr in returned core_info */
+int ofi_get_core_info_fabric(struct fi_fabric_attr *util_attr,
+			     struct fi_info **core_info)
 {
-	return (type == FI_MATCH_PREFIX) ?
-		strncasecmp(user_name, prov_name, strlen(prov_name)) :
-		strcasecmp(prov_name, user_name);
-}
+	struct fi_info hints;
+	const char *core_name;
+	size_t len;
+	int ret;
 
-int fi_check_fabric_attr(const struct fi_provider *prov,
-			 const struct fi_fabric_attr *prov_attr,
-			 const struct fi_fabric_attr *user_attr,
-			 enum fi_match_type type)
-{
-	if (user_attr->name && fi_check_name(user_attr->name, prov_attr->name, type)) {
-		FI_INFO(prov, FI_LOG_CORE, "Unknown fabric name\n");
+	core_name = ofi_core_name(util_attr->prov_name, &len);
+	if (!core_name)
 		return -FI_ENODATA;
+
+	memset(&hints, 0, sizeof hints);
+	if (!(hints.fabric_attr = calloc(1, sizeof(*hints.fabric_attr))))
+		return -FI_ENOMEM;
+
+	hints.fabric_attr->name = util_attr->name;
+	hints.fabric_attr->api_version = util_attr->api_version;
+	if (!(hints.fabric_attr->prov_name = strndup(core_name, len))) {
+		ret = -FI_ENOMEM;
+		goto out;
 	}
+	hints.mode = ~0;
+
+	ret = fi_getinfo(util_attr->api_version, NULL, NULL, 0, &hints, core_info);
+
+	free(hints.fabric_attr->prov_name);
+out:
+	free(hints.fabric_attr);
+	return ret;
+}
+
+int ofi_check_fabric_attr(const struct fi_provider *prov,
+			  const struct fi_fabric_attr *prov_attr,
+			  const struct fi_fabric_attr *user_attr)
+{
+	/* Provider names are checked by the framework */
 
 	if (user_attr->prov_version > prov_attr->prov_version) {
 		FI_INFO(prov, FI_LOG_CORE, "Unsupported provider version\n");
 		return -FI_ENODATA;
 	}
 
+	if (FI_VERSION_LT(user_attr->api_version, prov_attr->api_version)) {
+		FI_INFO(prov, FI_LOG_CORE, "Unsupported api version\n");
+		return -FI_ENODATA;
+	}
+
 	return 0;
 }
 
@@ -321,13 +423,50 @@ static int fi_resource_mgmt_level(enum fi_resource_mgmt rm_model)
 	}
 }
 
-int fi_check_domain_attr(const struct fi_provider *prov,
-			 const struct fi_domain_attr *prov_attr,
-			 const struct fi_domain_attr *user_attr,
-			 enum fi_match_type type)
+/* If a provider supports basic registration mode it should set the FI_MR_BASIC
+ * mode bit in prov_mode. Support for FI_MR_SCALABLE is indicated by not setting
+ * any of OFI_MR_BASIC_MAP bits. */
+int ofi_check_mr_mode(uint32_t api_version, uint32_t prov_mode,
+		      uint32_t user_mode)
 {
-	if (user_attr->name && fi_check_name(user_attr->name, prov_attr->name, type)) {
+	if (FI_VERSION_LT(api_version, FI_VERSION(1, 5))) {
+		prov_mode &= ~FI_MR_LOCAL; /* ignore local bit */
+
+		switch (user_mode) {
+		case FI_MR_UNSPEC:
+			return OFI_CHECK_MR_SCALABLE(prov_mode) ||
+				OFI_CHECK_MR_BASIC(prov_mode) ?
+				0 : -FI_ENODATA;
+		case FI_MR_BASIC:
+			return OFI_CHECK_MR_BASIC(prov_mode) ? 0 : -FI_ENODATA;
+		case FI_MR_SCALABLE:
+			return OFI_CHECK_MR_SCALABLE(prov_mode) ? 0 : -FI_ENODATA;
+		default:
+			return -FI_ENODATA;
+		}
+	} else {
+		if (user_mode & FI_MR_BASIC) {
+			if (!OFI_CHECK_MR_BASIC(prov_mode))
+				return -FI_ENODATA;
+			if ((user_mode & prov_mode & ~OFI_MR_BASIC_MAP) ==
+			    (prov_mode & ~OFI_MR_BASIC_MAP))
+				return 0;
+			return -FI_ENODATA;
+		} else {
+			return (((user_mode | FI_MR_BASIC) & prov_mode) == prov_mode) ?
+				0 : -FI_ENODATA;
+		}
+	}
+}
+
+int ofi_check_domain_attr(const struct fi_provider *prov, uint32_t api_version,
+			  const struct fi_domain_attr *prov_attr,
+			  const struct fi_domain_attr *user_attr)
+{
+	if (prov_attr->name && user_attr->name &&
+	    strcasecmp(user_attr->name, prov_attr->name)) {
 		FI_INFO(prov, FI_LOG_CORE, "Unknown domain name\n");
+		FI_INFO_NAME(prov, prov_attr, user_attr);
 		return -FI_ENODATA;
 	}
 
@@ -362,20 +501,62 @@ int fi_check_domain_attr(const struct fi_provider *prov,
 	   	return -FI_ENODATA;
 	}
 
-	if (user_attr->mr_mode && (user_attr->mr_mode != prov_attr->mr_mode)) {
+	if (user_attr->cq_data_size > prov_attr->cq_data_size) {
+		FI_INFO(prov, FI_LOG_CORE, "CQ data size too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, cq_data_size);
+		return -FI_ENODATA;
+	}
+
+	if (ofi_check_mr_mode(api_version, prov_attr->mr_mode,
+			       user_attr->mr_mode)) {
 		FI_INFO(prov, FI_LOG_CORE, "Invalid memory registration mode\n");
+		FI_INFO_MR_MODE(prov, prov_attr->mr_mode, user_attr->mr_mode);
 		return -FI_ENODATA;
 	}
 
-	if (user_attr->cq_data_size > prov_attr->cq_data_size) {
-		FI_INFO(prov, FI_LOG_CORE, "CQ data size too large\n");
+	/* following checks only apply to api 1.5 and beyond */
+	if (FI_VERSION_LT(api_version, FI_VERSION(1, 5)))
+		return 0;
+
+	if (user_attr->cntr_cnt > prov_attr->cntr_cnt) {
+		FI_INFO(prov, FI_LOG_CORE, "Cntr count too large\n");
+		return -FI_ENODATA;
+	}
+
+	if (user_attr->mr_iov_limit > prov_attr->mr_iov_limit) {
+		FI_INFO(prov, FI_LOG_CORE, "MR iov limit too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, mr_iov_limit);
+		return -FI_ENODATA;
+	}
+
+	if (user_attr->caps & ~(prov_attr->caps)) {
+		FI_INFO(prov, FI_LOG_CORE, "Requested domain caps not supported\n");
+		FI_INFO_CHECK(prov, prov_attr, user_attr, caps, FI_TYPE_CAPS);
+		return -FI_ENODATA;
+	}
+
+	if ((user_attr->mode & prov_attr->mode) != prov_attr->mode) {
+		FI_INFO(prov, FI_LOG_CORE, "Required domain mode missing\n");
+		FI_INFO_MODE(prov, prov_attr->mode, user_attr->mode);
+		return -FI_ENODATA;
+	}
+
+	if (user_attr->max_err_data > prov_attr->max_err_data) {
+		FI_INFO(prov, FI_LOG_CORE, "Max err data too large");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, max_err_data);
+		return -FI_ENODATA;
+	}
+
+	if (user_attr->mr_cnt > prov_attr->mr_cnt) {
+		FI_INFO(prov, FI_LOG_CORE, "MR count too large");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, mr_cnt);
 		return -FI_ENODATA;
 	}
 
 	return 0;
 }
 
-int fi_check_ep_attr(const struct util_prov *util_prov,
+int ofi_check_ep_attr(const struct util_prov *util_prov, uint32_t api_version,
 		     const struct fi_ep_attr *user_attr)
 {
 	const struct fi_provider *prov = util_prov->prov;
@@ -383,13 +564,13 @@ int fi_check_ep_attr(const struct util_prov *util_prov,
 
 	if (user_attr->type && (user_attr->type != prov_attr->type)) {
 		FI_INFO(prov, FI_LOG_CORE, "Unsupported endpoint type\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, type, FI_TYPE_EP_TYPE);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, type, FI_TYPE_EP_TYPE);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->protocol && (user_attr->protocol != prov_attr->protocol)) {
 		FI_INFO(prov, FI_LOG_CORE, "Unsupported protocol\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, protocol, FI_TYPE_PROTOCOL);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, protocol, FI_TYPE_PROTOCOL);
 		return -FI_ENODATA;
 	}
 
@@ -401,6 +582,7 @@ int fi_check_ep_attr(const struct util_prov *util_prov,
 
 	if (user_attr->max_msg_size > prov_attr->max_msg_size) {
 		FI_INFO(prov, FI_LOG_CORE, "Max message size too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, max_msg_size);
 		return -FI_ENODATA;
 	}
 
@@ -408,12 +590,15 @@ int fi_check_ep_attr(const struct util_prov *util_prov,
 		if (user_attr->tx_ctx_cnt == FI_SHARED_CONTEXT) {
 			if (!(util_prov->flags & UTIL_TX_SHARED_CTX)) {
 				FI_INFO(prov, FI_LOG_CORE,
-						"Shared tx context not supported\n");
+					"Shared tx context not supported\n");
 				return -FI_ENODATA;
 			}
 		} else {
 			FI_INFO(prov, FI_LOG_CORE,
-					"Requested tx_ctx_cnt exceeds supported\n");
+				"Requested tx_ctx_cnt exceeds supported."
+				" Expected:%zd, Requested%zd\n",
+				util_prov->info->domain_attr->max_ep_tx_ctx,
+				user_attr->tx_ctx_cnt);
 			return -FI_ENODATA;
 		}
 	}
@@ -422,134 +607,225 @@ int fi_check_ep_attr(const struct util_prov *util_prov,
 		if (user_attr->rx_ctx_cnt == FI_SHARED_CONTEXT) {
 			if (!(util_prov->flags & UTIL_RX_SHARED_CTX)) {
 				FI_INFO(prov, FI_LOG_CORE,
-						"Shared rx context not supported\n");
+					"Shared rx context not supported\n");
 				return -FI_ENODATA;
 			}
 		} else {
 			FI_INFO(prov, FI_LOG_CORE,
-					"Requested rx_ctx_cnt exceeds supported\n");
+				"Requested rx_ctx_cnt exceeds supported."
+				" Expected: %zd, Requested:%zd\n",
+				util_prov->info->domain_attr->max_ep_rx_ctx,
+				user_attr->rx_ctx_cnt);
 			return -FI_ENODATA;
 		}
 	}
 
+	if (user_attr->auth_key_size &&
+	    (user_attr->auth_key_size != prov_attr->auth_key_size)) {
+		FI_INFO(prov, FI_LOG_CORE, "Unsupported authentification size.");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, auth_key_size);
+		return -FI_ENODATA;
+	}
+
 	return 0;
 }
 
-int fi_check_rx_attr(const struct fi_provider *prov,
-		     const struct fi_rx_attr *prov_attr,
-		     const struct fi_rx_attr *user_attr)
+int ofi_check_rx_attr(const struct fi_provider *prov,
+		      const struct fi_rx_attr *prov_attr,
+		      const struct fi_rx_attr *user_attr, uint64_t info_mode)
 {
 	if (user_attr->caps & ~(prov_attr->caps)) {
 		FI_INFO(prov, FI_LOG_CORE, "caps not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, caps, FI_TYPE_CAPS);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, caps, FI_TYPE_CAPS);
 		return -FI_ENODATA;
 	}
 
-	if ((user_attr->mode & prov_attr->mode) != prov_attr->mode) {
+	info_mode = user_attr->mode ? user_attr->mode : info_mode;
+	if ((info_mode & prov_attr->mode) != prov_attr->mode) {
 		FI_INFO(prov, FI_LOG_CORE, "needed mode not set\n");
-		FI_INFO_MODE(prov, prov_attr, user_attr);
+		FI_INFO_MODE(prov, prov_attr->mode, user_attr->mode);
 		return -FI_ENODATA;
 	}
 
 	if (prov_attr->op_flags & ~(prov_attr->op_flags)) {
 		FI_INFO(prov, FI_LOG_CORE, "op_flags not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, op_flags, FI_TYPE_OP_FLAGS);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, op_flags,
+			     FI_TYPE_OP_FLAGS);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->msg_order & ~(prov_attr->msg_order)) {
 		FI_INFO(prov, FI_LOG_CORE, "msg_order not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, msg_order, FI_TYPE_MSG_ORDER);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, msg_order,
+			     FI_TYPE_MSG_ORDER);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->comp_order & ~(prov_attr->comp_order)) {
 		FI_INFO(prov, FI_LOG_CORE, "comp_order not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, comp_order, FI_TYPE_MSG_ORDER);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, comp_order,
+			     FI_TYPE_MSG_ORDER);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->total_buffered_recv > prov_attr->total_buffered_recv) {
 		FI_INFO(prov, FI_LOG_CORE, "total_buffered_recv too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr,
+				  total_buffered_recv);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->size > prov_attr->size) {
 		FI_INFO(prov, FI_LOG_CORE, "size is greater than supported\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, size);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->iov_limit > prov_attr->iov_limit) {
 		FI_INFO(prov, FI_LOG_CORE, "iov_limit too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, iov_limit);
 		return -FI_ENODATA;
 	}
 
 	return 0;
 }
 
-int fi_check_tx_attr(const struct fi_provider *prov,
-		     const struct fi_tx_attr *prov_attr,
-		     const struct fi_tx_attr *user_attr)
+int ofi_check_tx_attr(const struct fi_provider *prov,
+		      const struct fi_tx_attr *prov_attr,
+		      const struct fi_tx_attr *user_attr, uint64_t info_mode)
 {
 	if (user_attr->caps & ~(prov_attr->caps)) {
 		FI_INFO(prov, FI_LOG_CORE, "caps not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, caps, FI_TYPE_CAPS);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, caps, FI_TYPE_CAPS);
 		return -FI_ENODATA;
 	}
 
-	if ((user_attr->mode & prov_attr->mode) != prov_attr->mode) {
+	info_mode = user_attr->mode ? user_attr->mode : info_mode;
+	if ((info_mode & prov_attr->mode) != prov_attr->mode) {
 		FI_INFO(prov, FI_LOG_CORE, "needed mode not set\n");
-		FI_INFO_MODE(prov, prov_attr, user_attr);
+		FI_INFO_MODE(prov, prov_attr->mode, user_attr->mode);
 		return -FI_ENODATA;
 	}
 
 	if (prov_attr->op_flags & ~(prov_attr->op_flags)) {
 		FI_INFO(prov, FI_LOG_CORE, "op_flags not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, op_flags, FI_TYPE_OP_FLAGS);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, op_flags,
+			     FI_TYPE_OP_FLAGS);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->msg_order & ~(prov_attr->msg_order)) {
 		FI_INFO(prov, FI_LOG_CORE, "msg_order not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, msg_order, FI_TYPE_MSG_ORDER);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, msg_order,
+			     FI_TYPE_MSG_ORDER);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->comp_order & ~(prov_attr->comp_order)) {
 		FI_INFO(prov, FI_LOG_CORE, "comp_order not supported\n");
-		FI_INFO_CAPS(prov, prov_attr, user_attr, comp_order, FI_TYPE_MSG_ORDER);
+		FI_INFO_CHECK(prov, prov_attr, user_attr, comp_order,
+			     FI_TYPE_MSG_ORDER);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->inject_size > prov_attr->inject_size) {
 		FI_INFO(prov, FI_LOG_CORE, "inject_size too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, inject_size);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->size > prov_attr->size) {
 		FI_INFO(prov, FI_LOG_CORE, "size is greater than supported\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, size);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->iov_limit > prov_attr->iov_limit) {
 		FI_INFO(prov, FI_LOG_CORE, "iov_limit too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, iov_limit);
 		return -FI_ENODATA;
 	}
 
 	if (user_attr->rma_iov_limit > prov_attr->rma_iov_limit) {
 		FI_INFO(prov, FI_LOG_CORE, "rma_iov_limit too large\n");
+		FI_INFO_CHECK_VAL(prov, prov_attr, user_attr, rma_iov_limit);
 		return -FI_ENODATA;
 	}
 
 	return 0;
 }
 
-int fi_check_info(const struct util_prov *util_prov,
-		  const struct fi_info *user_info,
-		  enum fi_match_type type)
+/* if there are multiple fi_info in the provider:
+ * check provider's info */
+int ofi_prov_check_info(const struct util_prov *util_prov,
+			uint32_t api_version,
+			const struct fi_info *user_info)
+{
+	const struct fi_info *prov_info = util_prov->info;
+	size_t success_info = 0;
+	int ret;
+
+	if (!user_info)
+		return FI_SUCCESS;
+
+	for ( ; prov_info; prov_info = prov_info->next) {
+		ret = ofi_check_info(util_prov, prov_info,
+				     api_version, user_info);
+		if (!ret)
+			success_info++;
+	}
+
+	return (!success_info ? -FI_ENODATA : FI_SUCCESS);
+}
+
+/* if there are multiple fi_info in the provider:
+ * check and duplicate provider's info */
+int ofi_prov_check_dup_info(const struct util_prov *util_prov,
+			    uint32_t api_version,
+			    const struct fi_info *user_info,
+			    struct fi_info **info)
 {
 	const struct fi_info *prov_info = util_prov->info;
 	const struct fi_provider *prov = util_prov->prov;
+	struct fi_info *fi, *tail;
+	int ret;
+
+	if (!info)
+		return -FI_EINVAL;
+
+	*info = tail = NULL;
+
+	for ( ; prov_info; prov_info = prov_info->next) {
+		ret = ofi_check_info(util_prov, prov_info,
+				     api_version, user_info);
+	    	if (ret)
+			continue;
+		if (!(fi = fi_dupinfo(prov_info))) {
+			ret = -FI_ENOMEM;
+			goto err;
+		}
+		if (!*info)
+			*info = fi;
+		else
+			tail->next = fi;
+		tail = fi;
+	}
+
+	return (!*info ? -FI_ENODATA : FI_SUCCESS);
+err:
+	fi_freeinfo(*info);
+	FI_INFO(prov, FI_LOG_CORE,
+		"cannot copy info\n");
+	return ret;
+}
+
+/* if there is only single fi_info in the provider */
+int ofi_check_info(const struct util_prov *util_prov,
+		   const struct fi_info *prov_info, uint32_t api_version,
+		   const struct fi_info *user_info)
+{
+	const struct fi_provider *prov = util_prov->prov;
+	uint64_t prov_mode;
 	int ret;
 
 	if (!user_info)
@@ -557,13 +833,15 @@ int fi_check_info(const struct util_prov *util_prov,
 
 	if (user_info->caps & ~(prov_info->caps)) {
 		FI_INFO(prov, FI_LOG_CORE, "Unsupported capabilities\n");
-		FI_INFO_CAPS(prov, prov_info, user_info, caps, FI_TYPE_CAPS);
+		FI_INFO_CHECK(prov, prov_info, user_info, caps, FI_TYPE_CAPS);
 		return -FI_ENODATA;
 	}
 
-	if ((user_info->mode & prov_info->mode) != prov_info->mode) {
+	prov_mode = ofi_mr_get_prov_mode(api_version, user_info, prov_info);
+
+	if ((user_info->mode & prov_mode) != prov_mode) {
 		FI_INFO(prov, FI_LOG_CORE, "needed mode not set\n");
-		FI_INFO_MODE(prov, prov_info, user_info);
+		FI_INFO_MODE(prov, prov_mode, user_info->mode);
 		return -FI_ENODATA;
 	}
 
@@ -574,44 +852,79 @@ int fi_check_info(const struct util_prov *util_prov,
 	}
 
 	if (user_info->fabric_attr) {
-		ret = fi_check_fabric_attr(prov, prov_info->fabric_attr,
-					   user_info->fabric_attr,
-					   type);
+		ret = ofi_check_fabric_attr(prov, prov_info->fabric_attr,
+					    user_info->fabric_attr);
 		if (ret)
 			return ret;
 	}
 
 	if (user_info->domain_attr) {
-		ret = fi_check_domain_attr(prov, prov_info->domain_attr,
-				user_info->domain_attr,
-				type);
+		ret = ofi_check_domain_attr(prov, api_version,
+					    prov_info->domain_attr,
+					    user_info->domain_attr);
 		if (ret)
 			return ret;
 	}
 
 	if (user_info->ep_attr) {
-		ret = fi_check_ep_attr(util_prov, user_info->ep_attr);
+		ret = ofi_check_ep_attr(util_prov, api_version,
+					user_info->ep_attr);
 		if (ret)
 			return ret;
 	}
 
 	if (user_info->rx_attr) {
-		ret = fi_check_rx_attr(prov, prov_info->rx_attr,
-				user_info->rx_attr);
+		ret = ofi_check_rx_attr(prov, prov_info->rx_attr,
+					user_info->rx_attr, user_info->mode);
 		if (ret)
 			return ret;
 	}
 
 	if (user_info->tx_attr) {
-		ret = fi_check_tx_attr(prov, prov_info->tx_attr,
-				user_info->tx_attr);
+		ret = ofi_check_tx_attr(prov, prov_info->tx_attr,
+					user_info->tx_attr, user_info->mode);
 		if (ret)
 			return ret;
 	}
-
 	return 0;
 }
 
+static uint64_t ofi_get_caps(uint64_t info_caps, uint64_t hint_caps,
+			    uint64_t attr_caps)
+{
+	uint64_t caps;
+
+	if (!hint_caps) {
+		caps = (info_caps & attr_caps & FI_PRIMARY_CAPS) |
+		       (attr_caps & FI_SECONDARY_CAPS);
+	} else {
+		caps = (hint_caps & FI_PRIMARY_CAPS) |
+		       (attr_caps & FI_SECONDARY_CAPS);
+	}
+	return caps;
+}
+
+static void fi_alter_domain_attr(struct fi_domain_attr *attr,
+			     const struct fi_domain_attr *hints,
+			     uint64_t info_caps, uint32_t api_version)
+{
+	if (FI_VERSION_LT(api_version, FI_VERSION(1, 5)))
+		attr->mr_mode = attr->mr_mode ? FI_MR_BASIC : FI_MR_SCALABLE;
+
+	attr->caps = ofi_get_caps(info_caps, hints ? hints->caps : 0, attr->caps);
+	if (!hints)
+		return;
+
+	if (hints->threading)
+		attr->threading = hints->threading;
+	if (hints->control_progress)
+		attr->control_progress = hints->control_progress;
+	if (hints->data_progress)
+		attr->data_progress = hints->data_progress;
+	if (hints->av_type)
+		attr->av_type = hints->av_type;
+}
+
 static void fi_alter_ep_attr(struct fi_ep_attr *attr,
 			     const struct fi_ep_attr *hints)
 {
@@ -628,15 +941,11 @@ static void fi_alter_rx_attr(struct fi_rx_attr *attr,
 			     const struct fi_rx_attr *hints,
 			     uint64_t info_caps)
 {
-	if (!hints) {
-		attr->caps = (info_caps & attr->caps & FI_PRIMARY_CAPS) |
-			     (attr->caps & FI_SECONDARY_CAPS);
+	attr->caps = ofi_get_caps(info_caps, hints ? hints->caps : 0, attr->caps);
+	if (!hints)
 		return;
-	}
 
 	attr->op_flags = hints->op_flags;
-	attr->caps = (hints->caps & FI_PRIMARY_CAPS) |
-		     (attr->caps & FI_SECONDARY_CAPS);
 	attr->total_buffered_recv = hints->total_buffered_recv;
 	if (hints->size)
 		attr->size = hints->size;
@@ -648,15 +957,11 @@ static void fi_alter_tx_attr(struct fi_tx_attr *attr,
 			     const struct fi_tx_attr *hints,
 			     uint64_t info_caps)
 {
-	if (!hints) {
-		attr->caps = (info_caps & attr->caps & FI_PRIMARY_CAPS) |
-			     (attr->caps & FI_SECONDARY_CAPS);
+	attr->caps = ofi_get_caps(info_caps, hints ? hints->caps : 0, attr->caps);
+	if (!hints)
 		return;
-	}
 
 	attr->op_flags = hints->op_flags;
-	attr->caps = (hints->caps & FI_PRIMARY_CAPS) |
-		     (attr->caps & FI_SECONDARY_CAPS);
 	if (hints->inject_size)
 		attr->inject_size = hints->inject_size;
 	if (hints->size)
@@ -672,16 +977,24 @@ static void fi_alter_tx_attr(struct fi_tx_attr *attr,
  * the hints have been validated and the starting fi_info is properly
  * configured by the provider.
  */
-void ofi_alter_info(struct fi_info *info,
-		   const struct fi_info *hints)
+void ofi_alter_info(struct fi_info *info, const struct fi_info *hints,
+		    uint32_t api_version)
 {
 	if (!hints)
 		return;
 
 	for (; info; info = info->next) {
-		info->caps = (hints->caps & FI_PRIMARY_CAPS) |
-			     (info->caps & FI_SECONDARY_CAPS);
+		info->caps = ofi_get_caps(info->caps, hints->caps, info->caps);
+
+		if (FI_VERSION_LT(api_version, FI_VERSION(1, 5))) {
+			if (info->domain_attr->mr_mode & FI_MR_LOCAL)
+				info->mode |= FI_LOCAL_MR;
+		}
+
+		info->handle = hints->handle;
 
+		fi_alter_domain_attr(info->domain_attr, hints->domain_attr,
+				     info->caps, api_version);
 		fi_alter_ep_attr(info->ep_attr, hints->ep_attr);
 		fi_alter_rx_attr(info->rx_attr, hints->rx_attr, info->caps);
 		fi_alter_tx_attr(info->tx_attr, hints->tx_attr, info->caps);
diff --git a/prov/util/src/util_av.c b/prov/util/src/util_av.c
index 8972858..d14d833 100644
--- a/prov/util/src/util_av.c
+++ b/prov/util/src/util_av.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2015-2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2017, Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -40,6 +41,7 @@
 #include <sys/types.h>
 #include <netdb.h>
 #include <netinet/in.h>
+#include <inttypes.h>
 
 #if HAVE_GETIFADDRS
 #include <net/if.h>
@@ -96,7 +98,7 @@ static int fi_get_src_sockaddr(const struct sockaddr *dest_addr, size_t dest_add
 	}
 
 out:
-	close(sock);
+	ofi_close_socket(sock);
 	return ret;
 
 }
@@ -107,7 +109,9 @@ void ofi_getnodename(char *buf, int buflen)
 	struct addrinfo ai, *rai = NULL;
 	struct ifaddrs *ifaddrs, *ifa;
 
+	assert(buf && buflen > 0);
 	ret = gethostname(buf, buflen);
+	buf[buflen - 1] = '\0';
 	if (ret == 0) {
 		memset(&ai, 0, sizeof(ai));
 		ai.ai_family = AF_INET;
@@ -128,6 +132,7 @@ void ofi_getnodename(char *buf, int buflen)
 
 			ret = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in),
 				  	  buf, buflen, NULL, 0, NI_NUMERICHOST);
+			buf[buflen - 1] = '\0';
 			if (ret == 0) {
 				freeifaddrs(ifaddrs);
 				return;
@@ -138,6 +143,7 @@ void ofi_getnodename(char *buf, int buflen)
 #endif
 	/* no reasonable address found, try loopback */
 	strncpy(buf, "127.0.0.1", buflen);
+	buf[buflen - 1] = '\0';
 }
 
 int ofi_get_src_addr(uint32_t addr_format,
@@ -211,12 +217,16 @@ static void *util_av_get_data(struct util_av *av, int index)
 
 void *ofi_av_get_addr(struct util_av *av, int index)
 {
+	FI_DBG(av->prov, FI_LOG_AV, "get[%d]:%s\n", index,
+		ofi_hex_str(util_av_get_data(av, index), av->addrlen));
 	return util_av_get_data(av, index);
 }
 
 static void util_av_set_data(struct util_av *av, int index,
 			     const void *data, size_t len)
 {
+	FI_DBG(av->prov, FI_LOG_AV, "set[%d]:%s\n", index,
+		ofi_hex_str(data, len));
 	memcpy(util_av_get_data(av, index), data, len);
 }
 
@@ -265,15 +275,16 @@ static int util_av_hash_insert(struct util_av_hash *hash, int slot, int index)
 	return 0;
 }
 
+/*
+ * Must hold AV lock
+ */
 int ofi_av_insert_addr(struct util_av *av, const void *addr, int slot, int *index)
 {
-	int ret = 0;
+	int ret;
 
-	fastlock_acquire(&av->lock);
 	if (av->free_list == UTIL_NO_ENTRY) {
 		FI_WARN(av->prov, FI_LOG_AV, "AV is full\n");
-		ret = -FI_ENOSPC;
-		goto out;
+		return -FI_ENOSPC;
 	}
 
 	if (av->flags & FI_SOURCE) {
@@ -281,16 +292,14 @@ int ofi_av_insert_addr(struct util_av *av, const void *addr, int slot, int *inde
 		if (ret) {
 			FI_WARN(av->prov, FI_LOG_AV,
 				"failed to insert addr into hash table\n");
-			goto out;
+			return ret;
 		}
 	}
 
 	*index = av->free_list;
 	av->free_list = *(int *) util_av_get_data(av, av->free_list);
 	util_av_set_data(av, *index, addr, av->addrlen);
-out:
-	fastlock_release(&av->lock);
-	return ret;
+	return 0;
 }
 
 /*
@@ -298,34 +307,36 @@ out:
  */
 static void util_av_hash_remove(struct util_av_hash *hash, int slot, int index)
 {
-	int i;
+	int i, slot_next;
 
 	if (slot < 0 || slot >= hash->slots)
 		return;
 
-	if (slot == index) {
+	if (hash->table[slot].index == index) {
 		if (hash->table[slot].next == UTIL_NO_ENTRY) {
 			hash->table[slot].index = UTIL_NO_ENTRY;
 			return;
-		} else {
-			index = hash->table[slot].next;
-			hash->table[slot] = hash->table[index];
 		}
 	} else {
-		for (i = slot; hash->table[i].next != index; )
+		for (i = slot; hash->table[i].index != index; )
 			i = hash->table[i].next;
-
-		hash->table[i].next = hash->table[index].next;
+		slot = i;
 	}
-	hash->table[index].next = hash->free_list;
-	hash->free_list = index;
+
+	slot_next = hash->table[slot].next;
+	hash->table[slot] = hash->table[slot_next];
+
+	hash->table[slot_next].next = hash->free_list;
+	hash->free_list = slot_next;
 }
 
-static int fi_av_remove_addr(struct util_av *av, int slot, int index)
+int ofi_av_remove_addr(struct util_av *av, int slot, int index)
 {
+	struct util_ep *ep;
+	struct dlist_entry *av_entry;
 	int *entry, *next, i;
 
-	if (index < 0 || index > av->count) {
+	if (index < 0 || (size_t)index > av->count) {
 		FI_WARN(av->prov, FI_LOG_AV, "index out of range\n");
 		return -FI_EINVAL;
 	}
@@ -348,6 +359,12 @@ static int fi_av_remove_addr(struct util_av *av, int slot, int index)
 		*next = index;
 	}
 
+	dlist_foreach(&av->ep_list, av_entry) {
+		ep = container_of(av_entry, struct util_ep, av_entry);
+		if (ep->cmap && ep->cmap->handles_av[index])
+			ofi_cmap_del_handle(ep->cmap->handles_av[index]);
+	}
+
 	fastlock_release(&av->lock);
 	return 0;
 }
@@ -399,21 +416,21 @@ int ofi_av_bind(struct fid *av_fid, struct fid *eq_fid, uint64_t flags)
 
 	eq = container_of(eq_fid, struct util_eq, eq_fid.fid);
 	av->eq = eq;
-	atomic_inc(&eq->ref);
+	ofi_atomic_inc32(&eq->ref);
 	return 0;
 }
 
 int ofi_av_close(struct util_av *av)
 {
-	if (atomic_get(&av->ref)) {
+	if (ofi_atomic_get32(&av->ref)) {
 		FI_WARN(av->prov, FI_LOG_AV, "AV is busy\n");
 		return -FI_EBUSY;
 	}
 
 	if (av->eq)
-		atomic_dec(&av->eq->ref);
+		ofi_atomic_dec32(&av->eq->ref);
 
-	atomic_dec(&av->domain->ref);
+	ofi_atomic_dec32(&av->domain->ref);
 	fastlock_destroy(&av->lock);
 	/* TODO: unmap data? */
 	free(av->data);
@@ -442,7 +459,7 @@ static int util_av_init(struct util_av *av, const struct fi_av_attr *attr,
 {
 	int *entry, i, ret = 0;
 
-	atomic_initialize(&av->ref, 0);
+	ofi_atomic_initialize32(&av->ref, 0);
 	fastlock_init(&av->lock);
 	av->count = attr->count ? attr->count : UTIL_DEFAULT_AV_SIZE;
 	av->count = roundup_power_of_two(av->count);
@@ -456,7 +473,10 @@ static int util_av_init(struct util_av *av, const struct fi_av_attr *attr,
 
 	if (util_attr->flags & FI_SOURCE) {
 		av->hash.slots = av->count;
-		av->hash.total_count = av->count + util_attr->overhead;
+		if (util_attr->overhead)
+			av->hash.total_count = av->count + util_attr->overhead;
+		else
+			av->hash.total_count = av->count * 2;
 		FI_INFO(av->prov, FI_LOG_AV,
 		       "FI_SOURCE requested, hash size %zu\n", av->hash.total_count);
 	}
@@ -466,7 +486,7 @@ static int util_av_init(struct util_av *av, const struct fi_av_attr *attr,
 	if (!av->data)
 		return -FI_ENOMEM;
 
-	for (i = 0; i < av->count - 1; i++) {
+	for (i = 0; i < (int)av->count - 1; i++) {
 		entry = util_av_get_data(av, i);
 		*entry = i + 1;
 	}
@@ -540,7 +560,8 @@ int ofi_av_init(struct util_domain *domain, const struct fi_av_attr *attr,
 	 */
 	av->context = context;
 	av->domain = domain;
-	atomic_inc(&domain->ref);
+	dlist_init(&av->ep_list);
+	ofi_atomic_inc32(&domain->ref);
 	return 0;
 }
 
@@ -637,7 +658,9 @@ static int ip_av_insert_addr(struct util_av *av, const void *addr,
 	int ret, index = -1;
 
 	if (ip_av_valid_addr(av, addr)) {
+		fastlock_acquire(&av->lock);
 		ret = ofi_av_insert_addr(av, addr, ip_av_slot(av, addr), &index);
+		fastlock_release(&av->lock);
 	} else {
 		ret = -FI_EADDRNOTAVAIL;
 		FI_WARN(av->prov, FI_LOG_AV, "invalid address\n");
@@ -652,7 +675,8 @@ static int ip_av_insert(struct fid_av *av_fid, const void *addr, size_t count,
 			fi_addr_t *fi_addr, uint64_t flags, void *context)
 {
 	struct util_av *av;
-	int i, ret, success_cnt = 0;
+	int ret, success_cnt = 0;
+	size_t i;
 	size_t addrlen;
 
 	av = container_of(av_fid, struct util_av, av_fid);
@@ -726,7 +750,8 @@ static int ip_av_insert_ip4sym(struct util_av *av,
 			       fi_addr_t *fi_addr, void *context)
 {
 	struct sockaddr_in sin;
-	int i, p, fi, ret, success_cnt = 0;
+	int fi, ret, success_cnt = 0;
+	size_t i, p;
 
 	memset(&sin, 0, sizeof sin);
 	sin.sin_family = AF_INET;
@@ -755,7 +780,8 @@ static int ip_av_insert_ip6sym(struct util_av *av,
 			       fi_addr_t *fi_addr, void *context)
 {
 	struct sockaddr_in6 sin6;
-	int i, j, p, fi, ret, success_cnt = 0;
+	int j, fi, ret, success_cnt = 0;
+	size_t i, p;
 
 	memset(&sin6, 0, sizeof sin6);
 	sin6.sin6_family = AF_INET6;
@@ -789,8 +815,8 @@ static int ip_av_insert_nodesym(struct util_av *av,
 {
 	char name[FI_NAME_MAX];
 	char svc[FI_NAME_MAX];
-	size_t name_len;
-	int fi, n, s, ret, name_index, svc_index, success_cnt = 0;
+	size_t name_len, n, s;
+	int fi, ret, name_index, svc_index, success_cnt = 0;
 
 	for (name_len = strlen(node); isdigit(node[name_len - 1]); )
 		name_len--;
@@ -805,7 +831,7 @@ static int ip_av_insert_nodesym(struct util_av *av,
 			name[FI_NAME_MAX - 1] = '\0';
 		} else {
 			snprintf(name + name_len, sizeof(name) - name_len - 1,
-				 "%d", name_index + n);
+				 "%zu", name_index + n);
 		}
 
 		for (s = 0; s < svccnt; s++, fi++) {
@@ -814,7 +840,7 @@ static int ip_av_insert_nodesym(struct util_av *av,
 				svc[FI_NAME_MAX - 1] = '\0';
 			} else {
 				snprintf(svc, sizeof(svc) - 1,
-					 "%d", svc_index + s);
+					 "%zu", svc_index + s);
 			}
 
 			ret = ip_av_insert_svc(av, name, svc, fi_addr ?
@@ -900,7 +926,7 @@ static int ip_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr, size_t count,
 	for (i = count - 1; i >= 0; i--) {
 		index = (int) fi_addr[i];
 		slot = ip_av_slot(av, ip_av_get_addr(av, index));
-		ret = fi_av_remove_addr(av, slot, index);
+		ret = ofi_av_remove_addr(av, slot, index);
 		if (ret) {
 			FI_WARN(av->prov, FI_LOG_AV,
 				"removal of fi_addr %d failed\n", index);
@@ -917,7 +943,7 @@ static int ip_av_lookup(struct fid_av *av_fid, fi_addr_t fi_addr, void *addr,
 
 	av = container_of(av_fid, struct util_av, av_fid);
 	index = (int) fi_addr;
-	if (index < 0 || index > av->count) {
+	if (index < 0 || (size_t)index > av->count) {
 		FI_WARN(av->prov, FI_LOG_AV, "unknown address\n");
 		return -FI_EINVAL;
 	}
@@ -928,22 +954,10 @@ static int ip_av_lookup(struct fid_av *av_fid, fi_addr_t fi_addr, void *addr,
 	return 0;
 }
 
-static const char *ip_av_straddr(struct fid_av *av, const void *addr,
-				  char *buf, size_t *len)
+static const char *ip_av_straddr(struct fid_av *av, const void *addr, char *buf,
+				 size_t *len)
 {
-	char str[INET6_ADDRSTRLEN + 8];
-	size_t size;
-
-	if (!inet_ntop(((struct sockaddr *) addr)->sa_family, addr,
-			str, sizeof str))
-		return NULL;
-
-	size = strlen(str);
-	size += snprintf(&str[size], sizeof(str) - size, ":%d",
-			 ((struct sockaddr_in *) addr)->sin_port);
-	memcpy(buf, str, MIN(*len, size));
-	*len = size + 1;
-	return buf;
+	return ofi_straddr(buf, len, FI_SOCKADDR, addr);
 }
 
 static struct fi_ops_av ip_av_ops = {
@@ -958,8 +972,9 @@ static struct fi_ops_av ip_av_ops = {
 
 static int ip_av_close(struct fid *av_fid)
 {
-	int ret;
 	struct util_av *av;
+	int ret;
+
 	av = container_of(av_fid, struct util_av, av_fid.fid);
 	ret = ofi_av_close(av);
 	if (ret)
@@ -991,7 +1006,7 @@ int ip_av_create(struct fid_domain *domain_fid, struct fi_av_attr *attr,
 		util_attr.addrlen = sizeof(struct sockaddr_in6);
 
 	util_attr.overhead = attr->count >> 1;
-	util_attr.flags = domain->caps & FI_SOURCE ? FI_SOURCE : 0;
+	util_attr.flags = domain->info_domain_caps & FI_SOURCE ? FI_SOURCE : 0;
 
 	if (attr->type == FI_AV_UNSPEC)
 		attr->type = FI_AV_MAP;
@@ -1013,8 +1028,43 @@ int ip_av_create(struct fid_domain *domain_fid, struct fi_av_attr *attr,
 }
 
 /*
- * Connection Map
+ * Connection map
  */
+
+/* Note: Callers should serialize access */
+static void util_cmap_set_key(struct util_cmap_handle *handle)
+{
+	handle->key = ofi_idx2key(&handle->cmap->key_idx,
+		ofi_idx_insert(&handle->cmap->handles_idx, handle));
+}
+
+static void util_cmap_clear_key(struct util_cmap_handle *handle)
+{
+	int index = ofi_key2idx(&handle->cmap->key_idx, handle->key);
+
+	if (!ofi_idx_is_valid(&handle->cmap->handles_idx, index))
+		FI_WARN(handle->cmap->av->prov, FI_LOG_AV, "Invalid key!\n");
+	else
+		ofi_idx_remove(&handle->cmap->handles_idx, index);
+}
+
+struct util_cmap_handle *ofi_cmap_key2handle(struct util_cmap *cmap, uint64_t key)
+{
+	struct util_cmap_handle *handle;
+
+	if (!(handle = ofi_idx_lookup(&cmap->handles_idx,
+				      ofi_key2idx(&cmap->key_idx, key)))) {
+		FI_WARN(cmap->av->prov, FI_LOG_AV, "Invalid key!\n");
+	} else {
+		if (handle->key != key) {
+			FI_WARN(cmap->av->prov, FI_LOG_AV,
+				"handle->key not matching given key\n");
+			return NULL;
+		}
+	}
+	return handle;
+}
+
 static void ofi_cmap_init_handle(struct util_cmap_handle *handle,
 		struct util_cmap *cmap,
 		enum util_cmap_state state,
@@ -1023,155 +1073,372 @@ static void ofi_cmap_init_handle(struct util_cmap_handle *handle,
 {
 	handle->cmap = cmap;
 	handle->state = state;
-	handle->key = freestack_pop(cmap->keypool);
-	handle->key->handle = handle;
-	handle->key_index = util_cmap_keypool_index(cmap->keypool, handle->key);
+	util_cmap_set_key(handle);
 	handle->fi_addr = fi_addr;
 	handle->peer = peer;
 }
 
-void ofi_cmap_update_state(struct util_cmap_handle *handle,
-		enum util_cmap_state state)
-{
-	fastlock_acquire(&handle->cmap->lock);
-	handle->state = state;
-	fastlock_release(&handle->cmap->lock);
-}
-
 static int ofi_cmap_match_peer(struct dlist_entry *entry, const void *addr)
 {
 	struct util_cmap_peer *peer;
 
 	peer = container_of(entry, struct util_cmap_peer, entry);
-	return !memcmp(peer->addr, addr, peer->addrlen);
+	return !memcmp(peer->addr, addr, peer->handle->cmap->av->addrlen);
 }
 
-static int ofi_cmap_add_peer(struct util_cmap *cmap, struct util_cmap_handle *handle,
-		enum util_cmap_state state, void *addr, size_t addrlen)
+/* Caller must hold cmap->lock */
+static int util_cmap_del_handle(struct util_cmap_handle *handle)
 {
-	struct util_cmap_peer *peer;
-	int ret = 0;
+	struct util_cmap *cmap = handle->cmap;
+	int ret;
 
-	fastlock_acquire(&cmap->lock);
-	if (dlist_find_first_match(&cmap->peer_list, ofi_cmap_match_peer, addr)) {
-		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL,
-				"Peer already present\n");
-		goto out;
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL, "Deleting handle\n");
+	if (handle->peer) {
+		dlist_remove(&handle->peer->entry);
+		free(handle->peer);
+		handle->peer = NULL;
+	} else {
+		cmap->handles_av[handle->fi_addr] = 0;
 	}
-
-	// TODO Use util_buf_pool
-	peer = calloc(1, sizeof(*peer) + addrlen);
-	if (!peer) {
-		ret = -FI_ENOMEM;
-		goto out;
+	util_cmap_clear_key(handle);
+
+	handle->state = CMAP_SHUTDOWN;
+	handle->cmap->attr.close(handle);
+	/* Signal event handler thread to delete the handle. This is required
+	 * so that the event handler thread handles any pending events for this
+	 * ep correctly. Handle would be freed finally after processing the
+	 * events */
+	ret = cmap->attr.signal(cmap->ep, handle, OFI_CMAP_FREE);
+	if (ret) {
+		FI_WARN(cmap->av->prov, FI_LOG_FABRIC,
+			"Unable to signal event handler thread\n");
+		return ret;
 	}
+	return 0;
+}
 
-	ofi_cmap_init_handle(handle, cmap, state, FI_ADDR_UNSPEC, peer);
-	peer->handle = handle;
-	peer->addrlen = addrlen;
-	memcpy(peer->addr, addr, addrlen);
-	dlist_insert_tail(&peer->entry, &cmap->peer_list);
-out:
+void ofi_cmap_del_handle(struct util_cmap_handle *handle)
+{
+	struct util_cmap *cmap = handle->cmap;
+	fastlock_acquire(&cmap->lock);
+	util_cmap_del_handle(handle);
 	fastlock_release(&cmap->lock);
-	return ret;
 }
 
-/*
- * Caller must hold cmap->lock. Either fi_addr or
- * addr and addrlen args should be present.
- */
-int ofi_cmap_add_handle(struct util_cmap *cmap, struct util_cmap_handle *handle,
-		enum util_cmap_state state, fi_addr_t fi_addr, void *addr,
-		size_t addrlen)
+/* Caller must hold cmap->lock */
+static int util_cmap_alloc_handle(struct util_cmap *cmap, fi_addr_t fi_addr,
+				  enum util_cmap_state state,
+				  struct util_cmap_handle **handle)
 {
-	int index;
-	if (fi_addr == FI_ADDR_UNSPEC) {
-		index = ip_av_get_index(cmap->av, addr);
-		if (index < 0)
-			return ofi_cmap_add_peer(cmap, handle, state, addr, addrlen);
-		fi_addr = index;
-	}
+	*handle = cmap->attr.alloc();
+	if (!*handle)
+		return -FI_ENOMEM;
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL, "Allocated new handle: %p for "
+	       "fi_addr: %" PRIu64 "\n", *handle, fi_addr);
+	ofi_cmap_init_handle(*handle, cmap, state, fi_addr, NULL);
+	cmap->handles_av[fi_addr] = *handle;
+	return 0;
+}
 
-	if (cmap->handles[fi_addr]) {
-		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL,
-				"Handle already present\n");
-	} else {
-		ofi_cmap_init_handle(handle, cmap, state, fi_addr, NULL);
-		cmap->handles[fi_addr] = handle;
+/* Caller must hold cmap->lock */
+static int util_cmap_alloc_handle_peer(struct util_cmap *cmap, void *addr,
+				       enum util_cmap_state state,
+				       struct util_cmap_handle **handle)
+{
+	struct util_cmap_peer *peer;
+
+	peer = calloc(1, sizeof(*peer) + cmap->av->addrlen);
+	if (!peer)
+		return -FI_ENOMEM;
+	*handle = cmap->attr.alloc();
+	if (!*handle) {
+		free(peer);
+		return -FI_ENOMEM;
 	}
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+	       "Allocated new handle: %p for given addr\n", *handle);
+	ofi_cmap_init_handle(*handle, cmap, state, FI_ADDR_UNSPEC, peer);
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL, "Adding handle to peer list\n");
+	peer->handle = *handle;
+	memcpy(peer->addr, addr, cmap->av->addrlen);
+	dlist_insert_tail(&peer->entry, &cmap->peer_list);
 	return 0;
 }
 
 /* Caller must hold cmap->lock */
-struct util_cmap_handle *ofi_cmap_get_handle(struct util_cmap *cmap, fi_addr_t fi_addr)
+static struct util_cmap_handle *
+util_cmap_get_handle_peer(struct util_cmap *cmap, void *addr)
 {
 	struct util_cmap_peer *peer;
 	struct dlist_entry *entry;
 
-	if (cmap->handles[fi_addr])
-		return cmap->handles[fi_addr];
-
-	/* Search in peer list */
-	entry = dlist_remove_first_match(&cmap->peer_list, ofi_cmap_match_peer,
-			ip_av_get_addr(cmap->av, fi_addr));
+	entry = dlist_find_first_match(&cmap->peer_list, ofi_cmap_match_peer,
+				       addr);
 	if (!entry)
 		return NULL;
 	peer = container_of(entry, struct util_cmap_peer, entry);
-
-	/* Move handle to cmap */
-	peer->handle->peer = NULL;
-	peer->handle->fi_addr = fi_addr;
-
-	cmap->handles[fi_addr] = peer->handle;
-	free(peer);
-	return cmap->handles[fi_addr];
+	return peer->handle;
 }
 
-void ofi_cmap_del_handle(struct util_cmap_handle *handle)
+/* Caller must hold cmap->lock */
+static struct util_cmap_handle *
+util_cmap_get_handle(struct util_cmap *cmap, fi_addr_t fi_addr, void *addr)
 {
-	struct util_cmap *cmap = handle->cmap;
+	struct util_cmap_handle *handle;
 
-	fastlock_acquire(&cmap->lock);
-	if (handle->peer) {
+	if (fi_addr > cmap->av->count) {
+		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL, "Invalid fi_addr\n");
+		return NULL;
+	}
+	if (cmap->handles_av[fi_addr]) {
+		handle = cmap->handles_av[fi_addr];
+	} else {
+		handle = util_cmap_get_handle_peer(cmap, addr);
+		if (!handle)
+			return NULL;
 		dlist_remove(&handle->peer->entry);
 		free(handle->peer);
+		handle->peer = NULL;
+		handle->fi_addr = fi_addr;
+		cmap->handles_av[fi_addr] = handle;
+	}
+	return handle;
+}
+
+void ofi_cmap_process_shutdown(struct util_cmap *cmap,
+			       struct util_cmap_handle *handle)
+{
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		"Processing shutdown for handle: %p\n", handle);
+	fastlock_acquire(&cmap->lock);
+	if (handle->state > CMAP_SHUTDOWN) {
+		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL,
+			"Invalid handle on shutdown event\n");
+	} else if (handle->state != CMAP_SHUTDOWN) {
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL, "Got remote shutdown\n");
+		util_cmap_del_handle(handle);
 	} else {
-		cmap->handles[handle->fi_addr] = 0;
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL, "Got local shutdown\n");
 	}
-	handle->key->handle = NULL;
-	freestack_push(cmap->keypool, handle->key);
-	cmap->free_handle(handle);
 	fastlock_release(&cmap->lock);
 }
 
-void ofi_cmap_del_handles(struct util_cmap *cmap)
+void ofi_cmap_process_connect(struct util_cmap *cmap,
+			      struct util_cmap_handle *handle,
+			      uint64_t *remote_key)
 {
-	struct util_cmap_peer *peer;
-	struct dlist_entry *entry;
-	int i;
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		"Processing connect for handle: %p\n", handle);
+	fastlock_acquire(&cmap->lock);
+	handle->state = CMAP_CONNECTED;
+	if (remote_key)
+		handle->remote_key = *remote_key;
+	fastlock_release(&cmap->lock);
+}
 
-	for (i = 0; i < cmap->av->count; i++) {
-		if (cmap->handles[i])
-			ofi_cmap_del_handle(cmap->handles[i]);
+void ofi_cmap_process_reject(struct util_cmap *cmap,
+			     struct util_cmap_handle *handle)
+{
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		"Processing reject for handle: %p\n", handle);
+	fastlock_acquire(&cmap->lock);
+	switch (handle->state) {
+	case CMAP_CONNREQ_RECV:
+	case CMAP_CONNECTED:
+		/* Handle is being re-used for incoming connection request */
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+			"Received connection reject, but handle is being re-used\n");
+		break;
+	case CMAP_CONNREQ_SENT:
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+			"Received connection reject, deleting handle\n");
+		util_cmap_del_handle(handle);
+		break;
+	default:
+		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL, "Invalid cmap state: "
+			"%d when receiving connection reject\n", handle->state);
+		assert(0);
 	}
-	dlist_foreach(&cmap->peer_list, entry) {
-		peer = container_of(entry, struct util_cmap_peer, entry);
-		ofi_cmap_del_handle(peer->handle);
+	fastlock_release(&cmap->lock);
+}
+
+int ofi_cmap_process_connreq(struct util_cmap *cmap, void *addr,
+			     struct util_cmap_handle **handle_ret)
+{
+	struct util_cmap_handle *handle;
+#if ENABLE_DEBUG
+	char buf[OFI_ADDRSTRLEN];
+	uint32_t addr_format;
+	size_t len;
+#endif
+	int ret = 0, index;
+
+	index = ip_av_get_index(cmap->av, addr);
+	fastlock_acquire(&cmap->lock);
+	if (index < 0)
+		handle = util_cmap_get_handle_peer(cmap, addr);
+	else
+		handle = util_cmap_get_handle(cmap, (fi_addr_t)index, addr);
+
+	if (!handle) {
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		       "No handle found for given addr\n");
+		ret = util_cmap_alloc_handle_peer(cmap, addr, CMAP_CONNREQ_RECV, &handle);
+		if (ret)
+			goto unlock;
+	}
+
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		"Processing connreq for handle: %p\n", handle);
+
+	switch (handle->state) {
+	case CMAP_CONNECTED:
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+			"Connection already present.\n");
+		ret = -FI_EALREADY;
+		break;
+	case CMAP_CONNREQ_SENT:
+#if ENABLE_DEBUG
+		addr_format = ofi_translate_addr_format(((struct sockaddr *)addr)->sa_family);
+		len = sizeof(buf);
+		FI_DBG(cmap->av->prov, FI_LOG_FABRIC, "local_name: %s\n",
+		       ofi_straddr(buf, &len, addr_format, cmap->attr.name));
+		FI_DBG(cmap->av->prov, FI_LOG_FABRIC, "remote_name: %s\n",
+		       ofi_straddr(buf, &len, addr_format, addr));
+#endif
+		if (ofi_addr_cmp(cmap->av->prov, addr, cmap->attr.name) < 0) {
+			FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+				"Remote name lower than local name.\n");
+			ret = -FI_EALREADY;
+		} else {
+			FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+				"Re-using handle: %p to accept remote "
+				"connection\n", handle);
+			/* Re-use handle. If it receives FI_REJECT the handle
+			 * would not be deleted in this state */
+			handle->cmap->attr.close(handle);
+			handle->state = CMAP_CONNREQ_RECV;
+			*handle_ret = handle;
+		}
+		break;
+	case CMAP_CONNREQ_RECV:
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		       "Alloc'd new handle for incoming connection\n");
+		*handle_ret = handle;
+		break;
+	default:
+		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL,
+		       "Invalid cmap state\n");
+		assert(0);
+		ret = -FI_EOPBADSTATE;
 	}
+unlock:
+	fastlock_release(&cmap->lock);
+	return ret;
+}
+
+int ofi_cmap_get_handle(struct util_cmap *cmap, fi_addr_t fi_addr,
+			struct util_cmap_handle **handle_ret)
+{
+	struct util_cmap_handle *handle;
+	void *addr;
+	int ret = 0;
+
+	addr = ip_av_get_addr(cmap->av, fi_addr);
+	if (!addr) {
+		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL,
+		       "No valid addr for given fi_addr\n");
+		return -FI_EINVAL;
+	}
+	fastlock_acquire(&cmap->lock);
+	handle = util_cmap_get_handle(cmap, fi_addr, addr);
+	if (!handle) {
+		FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL,
+		       "No handle found for given fi_addr\n");
+		ret = util_cmap_alloc_handle(cmap, fi_addr, CMAP_IDLE, &handle);
+		if (ret)
+			goto unlock;
+	}
+	switch (handle->state) {
+	case CMAP_IDLE:
+		ret = cmap->attr.connect(cmap->ep, handle, fi_addr);
+		if (ret) {
+			util_cmap_del_handle(handle);
+			goto unlock;
+		}
+		handle->state = CMAP_CONNREQ_SENT;
+		ret = -FI_EAGAIN;
+		// TODO sleep on event fd instead of busy polling
+		break;
+	case CMAP_CONNREQ_SENT:
+	case CMAP_CONNREQ_RECV:
+	case CMAP_ACCEPT:
+	case CMAP_SHUTDOWN:
+		ret = -FI_EAGAIN;
+		break;
+	case CMAP_CONNECTED:
+		*handle_ret = handle;
+		break;
+	default:
+		FI_WARN(cmap->av->prov, FI_LOG_EP_CTRL,
+			"Invalid cmap handle state\n");
+		assert(0);
+		ret = -FI_EOPBADSTATE;
+	}
+unlock:
+	fastlock_release(&cmap->lock);
+	return ret;
+}
+
+static int util_cmap_event_handler_close(struct util_cmap *cmap)
+{
+	int ret;
+
+	ret = cmap->attr.signal(cmap->ep, NULL, OFI_CMAP_EXIT);
+	if (ret) {
+		FI_WARN(cmap->av->prov, FI_LOG_FABRIC,
+			"Unable to signal event handler thread\n");
+		return ret;
+	}
+	/* Release lock so that event handler thread could process shutdown events */
+	fastlock_release(&cmap->lock);
+	ret = pthread_join(cmap->event_handler_thread, NULL);
+	fastlock_acquire(&cmap->lock);
+	if (ret) {
+		FI_WARN(cmap->av->prov, FI_LOG_FABRIC,
+			"Unable to join event handler thread\n");
+		return ret;
+	}
+	return 0;
 }
 
 void ofi_cmap_free(struct util_cmap *cmap)
 {
-	ofi_cmap_del_handles(cmap);
+	struct util_cmap_peer *peer;
+	struct dlist_entry *entry;
+	size_t i;
+
 	fastlock_acquire(&cmap->lock);
-	util_cmap_keypool_free(cmap->keypool);
-	free(cmap->handles);
+	FI_DBG(cmap->av->prov, FI_LOG_EP_CTRL, "Closing cmap\n");
+	for (i = 0; i < cmap->av->count; i++) {
+		if (cmap->handles_av[i])
+			util_cmap_del_handle(cmap->handles_av[i]);
+	}
+	while(!dlist_empty(&cmap->peer_list)) {
+		entry = cmap->peer_list.next;
+		peer = container_of(entry, struct util_cmap_peer, entry);
+		util_cmap_del_handle(peer->handle);
+	}
+	util_cmap_event_handler_close(cmap);
+	free(cmap->handles_av);
+	free(cmap->attr.name);
 	fastlock_release(&cmap->lock);
+	fastlock_destroy(&cmap->lock);
 	free(cmap);
 }
 
-struct util_cmap *ofi_cmap_alloc(struct util_av *av,
-		ofi_cmap_free_handle_func free_handle)
+struct util_cmap *ofi_cmap_alloc(struct util_ep *ep,
+				 struct util_cmap_attr *attr)
 {
 	struct util_cmap *cmap;
 
@@ -1179,23 +1446,35 @@ struct util_cmap *ofi_cmap_alloc(struct util_av *av,
 	if (!cmap)
 		return NULL;
 
-	cmap->av = av;
+	cmap->ep = ep;
+	cmap->av = ep->av;
 
-	cmap->handles = calloc(cmap->av->count, sizeof(*cmap->handles));
-	if (!cmap->handles)
+	cmap->handles_av = calloc(cmap->av->count, sizeof(*cmap->handles_av));
+	if (!cmap->handles_av)
 		goto err1;
 
-	cmap->keypool = util_cmap_keypool_create(cmap->av->count);
-	if (!cmap->keypool)
+	cmap->attr = *attr;
+	cmap->attr.name = mem_dup(attr->name, ep->av->addrlen);
+	if (!cmap->attr.name)
 		goto err2;
 
+	memset(&cmap->handles_idx, 0, sizeof(cmap->handles_idx));
+	ofi_key_idx_init(&cmap->key_idx, UTIL_CMAP_IDX_BITS);
+
 	dlist_init(&cmap->peer_list);
-	cmap->free_handle = free_handle;
 	fastlock_init(&cmap->lock);
 
+	if (pthread_create(&cmap->event_handler_thread, 0,
+			   cmap->attr.event_handler, ep)) {
+		FI_WARN(ep->av->prov, FI_LOG_FABRIC,
+			"Unable to create msg_cm_listener_thread\n");
+		goto err3;
+	}
 	return cmap;
+err3:
+	fastlock_destroy(&cmap->lock);
 err2:
-	free(cmap->handles);
+	free(cmap->handles_av);
 err1:
 	free(cmap);
 	return NULL;
diff --git a/prov/util/src/util_buf.c b/prov/util/src/util_buf.c
index 204991b..2244d20 100644
--- a/prov/util/src/util_buf.c
+++ b/prov/util/src/util_buf.c
@@ -38,18 +38,6 @@
 #include <fi.h>
 #include <fi_osd.h>
 
-#if ENABLE_DEBUG
-static inline int util_buf_use_ftr(struct util_buf_pool *pool)
-{
-	return 1;
-}
-#else
-static inline int util_buf_use_ftr(struct util_buf_pool *pool)
-{
-	return (pool->alloc_hndlr || pool->free_hndlr) ? 1 : 0;
-}
-#endif
-
 static inline void util_buf_set_region(union util_buf *buf,
 				       struct util_buf_region *region,
 				       struct util_buf_pool *pool)
diff --git a/prov/util/src/util_cntr.c b/prov/util/src/util_cntr.c
new file mode 100644
index 0000000..74e6302
--- /dev/null
+++ b/prov/util/src/util_cntr.c
@@ -0,0 +1,335 @@
+/*
+ * Copyright (c) 2013-2017 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <fi_enosys.h>
+#include <fi_util.h>
+
+int ofi_check_cntr_attr(const struct fi_provider *prov,
+			const struct fi_cntr_attr *attr)
+{
+	if (!attr)
+		return FI_SUCCESS;
+
+        if (attr->flags) {
+		FI_WARN(prov, FI_LOG_CNTR, "unsupported flags\n");
+		return -FI_EINVAL;
+	}
+
+	switch (attr->wait_obj) {
+	case FI_WAIT_NONE:
+		break;
+	case FI_WAIT_SET:
+		if (!attr->wait_set) {
+			FI_WARN(prov, FI_LOG_CNTR, "invalid wait set\n");
+			return -FI_EINVAL;
+		}
+		/* fall through */
+	case FI_WAIT_UNSPEC:
+	case FI_WAIT_FD:
+		break;
+	default:
+		FI_WARN(prov, FI_LOG_CNTR, "unsupported wait object\n");
+		return -FI_EINVAL;
+	}
+
+	return 0;
+}
+
+static uint64_t ofi_cntr_read(struct fid_cntr *cntr_fid)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	cntr->progress(cntr);
+
+	return ofi_atomic_get64(&cntr->cnt);
+}
+
+static uint64_t ofi_cntr_readerr(struct fid_cntr *cntr_fid)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	cntr->progress(cntr);
+
+	return ofi_atomic_get64(&cntr->err);
+}
+
+static int ofi_cntr_add(struct fid_cntr *cntr_fid, uint64_t value)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	ofi_atomic_add64(&cntr->cnt, value);
+
+	if(cntr->wait)
+		cntr->wait->signal(cntr->wait);
+
+	return FI_SUCCESS;
+}
+
+static int ofi_cntr_adderr(struct fid_cntr *cntr_fid, uint64_t value)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	ofi_atomic_add64(&cntr->err, value);
+
+	if(cntr->wait)
+		cntr->wait->signal(cntr->wait);
+
+	return FI_SUCCESS;
+}
+
+static int ofi_cntr_set(struct fid_cntr *cntr_fid, uint64_t value)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	ofi_atomic_initialize64(&cntr->cnt, value);
+
+	if(cntr->wait)
+		cntr->wait->signal(cntr->wait);
+
+	return FI_SUCCESS;
+}
+
+static int ofi_cntr_seterr(struct fid_cntr *cntr_fid, uint64_t value)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	ofi_atomic_initialize64(&cntr->err, value);
+
+	if(cntr->wait)
+		cntr->wait->signal(cntr->wait);
+
+	return FI_SUCCESS;
+}
+
+static int ofi_cntr_wait(struct fid_cntr *cntr_fid, uint64_t threshold, int timeout)
+{
+	struct util_cntr *cntr = container_of(cntr_fid, struct util_cntr, cntr_fid);
+	uint64_t current_ms;
+	uint64_t finish_ms;
+	uint64_t err = ofi_cntr_readerr(cntr_fid);
+
+	assert(cntr->cntr_fid.fid.fclass == FI_CLASS_CNTR);
+
+	if (threshold <= ofi_cntr_read(cntr_fid))
+		return FI_SUCCESS;
+
+	assert(cntr->wait);
+
+	current_ms = fi_gettime_ms();
+	finish_ms = (timeout < 0) ? UINT64_MAX : current_ms + timeout;
+	for (; timeout < 0 || current_ms < finish_ms;
+	    current_ms = fi_gettime_ms()) {
+		timeout = timeout < 0 ? timeout : (int)(finish_ms - current_ms);
+		fi_wait(&cntr->wait->wait_fid, timeout);
+		cntr->progress(cntr);
+		if (threshold <= ofi_atomic_get64(&cntr->cnt))
+			return FI_SUCCESS;
+		else if (err != ofi_atomic_get64(&cntr->err))
+			return -FI_EAVAIL;
+	}
+
+	return -FI_ETIMEDOUT;
+}
+
+static struct fi_ops_cntr util_cntr_ops = {
+	.size = sizeof(struct fi_ops_cntr),
+	.read = ofi_cntr_read,
+	.readerr = ofi_cntr_readerr,
+	.add = ofi_cntr_add,
+	.adderr = ofi_cntr_adderr,
+	.set = ofi_cntr_set,
+	.seterr = ofi_cntr_seterr,
+	.wait = ofi_cntr_wait
+};
+
+int ofi_cntr_cleanup(struct util_cntr *cntr)
+{
+	if (ofi_atomic_get32(&cntr->ref))
+		return -FI_EBUSY;
+
+	fastlock_destroy(&cntr->ep_list_lock);
+
+	if (cntr->wait) {
+		fi_poll_del(&cntr->wait->pollset->poll_fid,
+			    &cntr->cntr_fid.fid, 0);
+	}
+
+	ofi_atomic_dec32(&cntr->domain->ref);
+	return 0;
+}
+
+static int util_cntr_close(struct fid *fid)
+{
+	struct util_cntr *cntr;
+	int ret;
+
+	cntr = container_of(fid, struct util_cntr, cntr_fid.fid);
+	ret = ofi_cntr_cleanup(cntr);
+	if (ret)
+		return ret;
+	return 0;
+}
+
+int ofi_check_bind_cntr_flags(struct util_ep *ep, struct util_cntr *cntr,
+			      uint64_t flags)
+{
+	const struct fi_provider *prov = ep->domain->fabric->prov;
+
+	if (flags & ~(FI_TRANSMIT | FI_RECV | FI_RECV  | FI_WRITE |
+		      FI_REMOTE_READ | FI_REMOTE_WRITE)) {
+		FI_WARN(prov, FI_LOG_EP_CTRL,
+			"Unsupported flags\n");
+		return -FI_EBADFLAGS;
+	}
+
+	if (((flags & FI_TRANSMIT) && ep->tx_cntr) ||
+	    ((flags & FI_RECV) && ep->rx_cntr) ||
+	    ((flags & FI_READ) && ep->rd_cntr) ||
+	    ((flags & FI_WRITE) && ep->wr_cntr) ||
+	    ((flags & FI_REMOTE_READ) && ep->rem_rd_cntr) ||
+	    ((flags & FI_REMOTE_WRITE) && ep->rem_wr_cntr)) {
+		FI_WARN(prov, FI_LOG_EP_CTRL,
+			"Duplicate CNTR binding\n");
+		return -FI_EINVAL;
+	}
+
+	return FI_SUCCESS;
+}
+
+static int fi_cntr_init(struct fid_domain *domain, struct fi_cntr_attr *attr,
+			struct util_cntr *cntr, void *context)
+{
+	struct fi_wait_attr wait_attr;
+	struct fid_wait *wait;
+	int ret;
+
+	cntr->domain = container_of(domain, struct util_domain, domain_fid);
+	ofi_atomic_initialize32(&cntr->ref, 0);
+	dlist_init(&cntr->ep_list);
+	fastlock_init(&cntr->ep_list_lock);
+
+	cntr->cntr_fid.fid.fclass = FI_CLASS_CNTR;
+	cntr->cntr_fid.fid.context = context;
+
+	switch (attr->wait_obj) {
+	case FI_WAIT_NONE:
+		wait = NULL;
+		break;
+	case FI_WAIT_UNSPEC:
+	case FI_WAIT_FD:
+	case FI_WAIT_MUTEX_COND:
+		memset(&wait_attr, 0, sizeof wait_attr);
+		wait_attr.wait_obj = attr->wait_obj;
+		ret = fi_wait_open(&cntr->domain->fabric->fabric_fid,
+				   &wait_attr, &wait);
+		if (ret)
+			return ret;
+		break;
+	case FI_WAIT_SET:
+		wait = attr->wait_set;
+		break;
+	default:
+		assert(0);
+		return -FI_EINVAL;
+	}
+
+	if (wait)
+		cntr->wait = container_of(wait, struct util_wait, wait_fid);
+
+	ofi_atomic_inc32(&cntr->domain->ref);
+	return 0;
+}
+
+void ofi_cntr_progress(struct util_cntr *cntr)
+{
+	struct util_ep *ep;
+	struct fid_list_entry *fid_entry;
+	struct dlist_entry *item;
+
+	fastlock_acquire(&cntr->ep_list_lock);
+	dlist_foreach(&cntr->ep_list, item) {
+		fid_entry = container_of(item, struct fid_list_entry, entry);
+		ep = container_of(fid_entry->fid, struct util_ep, ep_fid.fid);
+		ep->progress(ep);
+	}
+	fastlock_release(&cntr->ep_list_lock);
+}
+
+static struct fi_ops util_cntr_fi_ops = {
+	.size = sizeof(util_cntr_fi_ops),
+	.close = util_cntr_close,
+	.bind = fi_no_bind,
+	.control = fi_no_control,
+	.ops_open = fi_no_ops_open,
+};
+
+int ofi_cntr_init(const struct fi_provider *prov, struct fid_domain *domain,
+		  struct fi_cntr_attr *attr, struct util_cntr *cntr,
+		  ofi_cntr_progress_func progress, void *context)
+{
+	int ret;
+
+	assert(progress);
+	ret = ofi_check_cntr_attr(prov, attr);
+	if (ret)
+		return ret;
+
+	cntr->cntr_fid.fid.ops = &util_cntr_fi_ops;
+	cntr->cntr_fid.ops = &util_cntr_ops;
+	cntr->progress = progress;
+
+	ret = fi_cntr_init(domain, attr, cntr, context);
+	if (ret)
+		return ret;
+
+	/* CNTR must be fully operational before adding to wait set */
+	if (cntr->wait) {
+		ret = fi_poll_add(&cntr->wait->pollset->poll_fid,
+				  &cntr->cntr_fid.fid, 0);
+		if (ret) {
+			ofi_cntr_cleanup(cntr);
+			return ret;
+		}
+	}
+
+	return 0;
+}
+
diff --git a/prov/util/src/util_cq.c b/prov/util/src/util_cq.c
index 816fc41..d4c21eb 100644
--- a/prov/util/src/util_cq.c
+++ b/prov/util/src/util_cq.c
@@ -38,8 +38,29 @@
 
 #define UTIL_DEF_CQ_SIZE (1024)
 
-int fi_check_cq_attr(const struct fi_provider *prov,
-		     const struct fi_cq_attr *attr)
+int ofi_cq_write_error(struct util_cq *cq,
+		       const struct fi_cq_err_entry *err_entry)
+{
+	struct util_cq_err_entry *entry;
+	struct fi_cq_tagged_entry *comp;
+
+	if (!(entry = calloc(1, sizeof(*entry))))
+		return -FI_ENOMEM;
+
+	entry->err_entry = *err_entry;
+	fastlock_acquire(&cq->cq_lock);
+	slist_insert_tail(&entry->list_entry, &cq->err_list);
+	comp = ofi_cirque_tail(cq->cirq);
+	comp->flags = UTIL_FLAG_ERROR;
+	ofi_cirque_commit(cq->cirq);
+	fastlock_release(&cq->cq_lock);
+	if (cq->wait)
+		cq->wait->signal(cq->wait);
+	return 0;
+}
+
+int ofi_check_cq_attr(const struct fi_provider *prov,
+		      const struct fi_cq_attr *attr)
 {
 	switch (attr->format) {
 	case FI_CQ_FORMAT_UNSPEC:
@@ -114,44 +135,44 @@ static void util_cq_read_tagged(void **dst, void *src)
 	*(char **)dst += sizeof(struct fi_cq_tagged_entry);
 }
 
-static ssize_t util_cq_read(struct fid_cq *cq_fid, void *buf, size_t count)
+ssize_t ofi_cq_read(struct fid_cq *cq_fid, void *buf, size_t count)
 {
 	struct util_cq *cq;
 	struct fi_cq_tagged_entry *entry;
-	ssize_t i;
+	size_t i;
 
 	cq = container_of(cq_fid, struct util_cq, cq_fid);
 	fastlock_acquire(&cq->cq_lock);
-	if (cirque_isempty(cq->cirq)) {
+	if (ofi_cirque_isempty(cq->cirq)) {
 		fastlock_release(&cq->cq_lock);
 		cq->progress(cq);
 		fastlock_acquire(&cq->cq_lock);
-		if (cirque_isempty(cq->cirq)) {
+		if (ofi_cirque_isempty(cq->cirq)) {
 			i = -FI_EAGAIN;
 			goto out;
 		}
 	}
 
-	if (count > cirque_usedcnt(cq->cirq))
-		count = cirque_usedcnt(cq->cirq);
+	if (count > ofi_cirque_usedcnt(cq->cirq))
+		count = ofi_cirque_usedcnt(cq->cirq);
 
 	for (i = 0; i < count; i++) {
-		entry = cirque_head(cq->cirq);
+		entry = ofi_cirque_head(cq->cirq);
 		if (entry->flags & UTIL_FLAG_ERROR) {
 			if (!i)
 				i = -FI_EAVAIL;
 			break;
 		}
 		cq->read_entry(&buf, entry);
-		cirque_discard(cq->cirq);
+		ofi_cirque_discard(cq->cirq);
 	}
 out:
 	fastlock_release(&cq->cq_lock);
 	return i;
 }
 
-static ssize_t util_cq_readfrom(struct fid_cq *cq_fid, void *buf,
-				size_t count, fi_addr_t *src_addr)
+ssize_t ofi_cq_readfrom(struct fid_cq *cq_fid, void *buf, size_t count,
+		fi_addr_t *src_addr)
 {
 	struct util_cq *cq;
 	struct fi_cq_tagged_entry *entry;
@@ -159,93 +180,108 @@ static ssize_t util_cq_readfrom(struct fid_cq *cq_fid, void *buf,
 
 	cq = container_of(cq_fid, struct util_cq, cq_fid);
 	if (!cq->src) {
-		i = util_cq_read(cq_fid, buf, count);
+		i = ofi_cq_read(cq_fid, buf, count);
 		if (i > 0) {
-			for (count = 0; count < i; count++)
+			for (count = 0; count < (size_t)i; count++)
 				src_addr[i] = FI_ADDR_NOTAVAIL;
 		}
 		return i;
 	}
 
 	fastlock_acquire(&cq->cq_lock);
-	if (cirque_isempty(cq->cirq)) {
+	if (ofi_cirque_isempty(cq->cirq)) {
 		fastlock_release(&cq->cq_lock);
 		cq->progress(cq);
 		fastlock_acquire(&cq->cq_lock);
-		if (cirque_isempty(cq->cirq)) {
+		if (ofi_cirque_isempty(cq->cirq)) {
 			i = -FI_EAGAIN;
 			goto out;
 		}
 	}
 
-	if (count > cirque_usedcnt(cq->cirq))
-		count = cirque_usedcnt(cq->cirq);
+	if (count > ofi_cirque_usedcnt(cq->cirq))
+		count = ofi_cirque_usedcnt(cq->cirq);
 
-	for (i = 0; i < count; i++) {
-		entry = cirque_head(cq->cirq);
+	for (i = 0; i < (ssize_t)count; i++) {
+		entry = ofi_cirque_head(cq->cirq);
 		if (entry->flags & UTIL_FLAG_ERROR) {
 			if (!i)
 				i = -FI_EAVAIL;
 			break;
 		}
-		src_addr[i] = cq->src[cirque_rindex(cq->cirq)];
+		src_addr[i] = cq->src[ofi_cirque_rindex(cq->cirq)];
 		cq->read_entry(&buf, entry);
-		cirque_discard(cq->cirq);
+		ofi_cirque_discard(cq->cirq);
 	}
 out:
 	fastlock_release(&cq->cq_lock);
 	return i;
 }
 
-static ssize_t util_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *buf,
-			       uint64_t flags)
+ssize_t ofi_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *buf,
+		uint64_t flags)
 {
 	struct util_cq *cq;
 	struct util_cq_err_entry *err;
 	struct slist_entry *entry;
+	char *err_buf_save;
+	size_t err_data_size;
+	uint32_t api_version;
 	ssize_t ret;
 
 	cq = container_of(cq_fid, struct util_cq, cq_fid);
+	api_version = cq->domain->fabric->fabric_fid.api_version;
+
 	fastlock_acquire(&cq->cq_lock);
-	if (!cirque_isempty(cq->cirq) &&
-	    (cirque_head(cq->cirq)->flags & UTIL_FLAG_ERROR)) {
-		cirque_discard(cq->cirq);
-		entry = slist_remove_head(&cq->err_list);
-		err = container_of(entry, struct util_cq_err_entry, list_entry);
+	if (ofi_cirque_isempty(cq->cirq) ||
+	    !(ofi_cirque_head(cq->cirq)->flags & UTIL_FLAG_ERROR)) {
+		ret = -FI_EAGAIN;
+		goto unlock;
+	}
+
+	ofi_cirque_discard(cq->cirq);
+	entry = slist_remove_head(&cq->err_list);
+	err = container_of(entry, struct util_cq_err_entry, list_entry);
+	if ((FI_VERSION_GE(api_version, FI_VERSION(1, 5))) && buf->err_data_size) {
+		err_data_size = MIN(buf->err_data_size, err->err_entry.err_data_size);
+		memcpy(buf->err_data, err->err_entry.err_data, err_data_size);
+		err_buf_save = buf->err_data;
 		*buf = err->err_entry;
-		free(err);
-		ret = 0;
+		buf->err_data = err_buf_save;
+		buf->err_data_size = err_data_size;
 	} else {
-		ret = -FI_EAGAIN;
+		memcpy(buf, &err->err_entry, sizeof(struct fi_cq_err_entry_1_0));
 	}
+	ret = 1;
+	free(err);
+unlock:
 	fastlock_release(&cq->cq_lock);
 	return ret;
 }
 
-static ssize_t util_cq_sread(struct fid_cq *cq_fid, void *buf, size_t count,
-			     const void *cond, int timeout)
+ssize_t ofi_cq_sread(struct fid_cq *cq_fid, void *buf, size_t count,
+		const void *cond, int timeout)
 {
 	struct util_cq *cq;
 
 	cq = container_of(cq_fid, struct util_cq, cq_fid);
 	assert(cq->wait && cq->internal_wait);
 	fi_wait(&cq->wait->wait_fid, timeout);
-	return util_cq_read(cq_fid, buf, count);
+	return ofi_cq_read(cq_fid, buf, count);
 }
 
-static ssize_t util_cq_sreadfrom(struct fid_cq *cq_fid, void *buf, size_t count,
-				 fi_addr_t *src_addr, const void *cond,
-				 int timeout)
+ssize_t ofi_cq_sreadfrom(struct fid_cq *cq_fid, void *buf, size_t count,
+		fi_addr_t *src_addr, const void *cond, int timeout)
 {
 	struct util_cq *cq;
 
 	cq = container_of(cq_fid, struct util_cq, cq_fid);
 	assert(cq->wait && cq->internal_wait);
 	fi_wait(&cq->wait->wait_fid, timeout);
-	return util_cq_readfrom(cq_fid, buf, count, src_addr);
+	return ofi_cq_readfrom(cq_fid, buf, count, src_addr);
 }
 
-static int util_cq_signal(struct fid_cq *cq_fid)
+int ofi_cq_signal(struct fid_cq *cq_fid)
 {
 	struct util_cq *cq;
 
@@ -263,12 +299,12 @@ static const char *util_cq_strerror(struct fid_cq *cq, int prov_errno,
 
 static struct fi_ops_cq util_cq_ops = {
 	.size = sizeof(struct fi_ops_cq),
-	.read = util_cq_read,
-	.readfrom = util_cq_readfrom,
-	.readerr = util_cq_readerr,
-	.sread = util_cq_sread,
-	.sreadfrom = util_cq_sreadfrom,
-	.signal = util_cq_signal,
+	.read = ofi_cq_read,
+	.readfrom = ofi_cq_readfrom,
+	.readerr = ofi_cq_readerr,
+	.sread = ofi_cq_sread,
+	.sreadfrom = ofi_cq_sreadfrom,
+	.signal = ofi_cq_signal,
 	.strerror = util_cq_strerror,
 };
 
@@ -277,11 +313,11 @@ int ofi_cq_cleanup(struct util_cq *cq)
 	struct util_cq_err_entry *err;
 	struct slist_entry *entry;
 
-	if (atomic_get(&cq->ref))
+	if (ofi_atomic_get32(&cq->ref))
 		return -FI_EBUSY;
 
 	fastlock_destroy(&cq->cq_lock);
-	fastlock_destroy(&cq->list_lock);
+	fastlock_destroy(&cq->ep_list_lock);
 
 	while (!slist_empty(&cq->err_list)) {
 		entry = slist_remove_head(&cq->err_list);
@@ -296,7 +332,7 @@ int ofi_cq_cleanup(struct util_cq *cq)
 			fi_close(&cq->wait->wait_fid.fid);
 	}
 
-	atomic_dec(&cq->domain->ref);
+	ofi_atomic_dec32(&cq->domain->ref);
 	util_comp_cirq_free(cq->cirq);
 	free(cq->src);
 	return 0;
@@ -331,9 +367,9 @@ static int fi_cq_init(struct fid_domain *domain, struct fi_cq_attr *attr,
 	int ret;
 
 	cq->domain = container_of(domain, struct util_domain, domain_fid);
-	atomic_initialize(&cq->ref, 0);
-	dlist_init(&cq->list);
-	fastlock_init(&cq->list_lock);
+	ofi_atomic_initialize32(&cq->ref, 0);
+	dlist_init(&cq->ep_list);
+	fastlock_init(&cq->ep_list_lock);
 	fastlock_init(&cq->cq_lock);
 	slist_init(&cq->err_list);
 	cq->read_entry = read_entry;
@@ -367,35 +403,56 @@ static int fi_cq_init(struct fid_domain *domain, struct fi_cq_attr *attr,
 	if (wait)
 		cq->wait = container_of(wait, struct util_wait, wait_fid);
 
-	atomic_inc(&cq->domain->ref);
+	ofi_atomic_inc32(&cq->domain->ref);
 	return 0;
 }
 
+int ofi_check_bind_cq_flags(struct util_ep *ep, struct util_cq *cq,
+			    uint64_t flags)
+{
+	const struct fi_provider *prov = ep->domain->fabric->prov;
+
+	if (flags & ~(FI_TRANSMIT | FI_RECV | FI_SELECTIVE_COMPLETION)) {
+		FI_WARN(prov, FI_LOG_EP_CTRL,
+			"Unsupported flags\n");
+		return -FI_EBADFLAGS;
+	}
+
+	if (((flags & FI_TRANSMIT) && ep->tx_cq) ||
+	    ((flags & FI_RECV) && ep->rx_cq)) {
+		FI_WARN(prov, FI_LOG_EP_CTRL,
+			"Duplicate CQ binding\n");
+		return -FI_EINVAL;
+	}
+
+	return FI_SUCCESS;
+}
+
 void ofi_cq_progress(struct util_cq *cq)
 {
 	struct util_ep *ep;
 	struct fid_list_entry *fid_entry;
 	struct dlist_entry *item;
 
-	fastlock_acquire(&cq->list_lock);
-	dlist_foreach(&cq->list, item) {
+	fastlock_acquire(&cq->ep_list_lock);
+	dlist_foreach(&cq->ep_list, item) {
 		fid_entry = container_of(item, struct fid_list_entry, entry);
 		ep = container_of(fid_entry->fid, struct util_ep, ep_fid.fid);
 		ep->progress(ep);
 
 	}
-	fastlock_release(&cq->list_lock);
+	fastlock_release(&cq->ep_list_lock);
 }
 
 int ofi_cq_init(const struct fi_provider *prov, struct fid_domain *domain,
 		 struct fi_cq_attr *attr, struct util_cq *cq,
-		 fi_cq_progress_func progress, void *context)
+		 ofi_cq_progress_func progress, void *context)
 {
 	fi_cq_read_func read_func;
 	int ret;
 
 	assert(progress);
-	ret = fi_check_cq_attr(prov, attr);
+	ret = ofi_check_cq_attr(prov, attr);
 	if (ret)
 		return ret;
 
@@ -442,7 +499,7 @@ int ofi_cq_init(const struct fi_provider *prov, struct fid_domain *domain,
 		goto err1;
 	}
 
-	if (cq->domain->caps & FI_SOURCE) {
+	if (cq->domain->info_domain_caps & FI_SOURCE) {
 		cq->src = calloc(cq->cirq->size, sizeof *cq->src);
 		if (!cq->src) {
 			ret = -FI_ENOMEM;
diff --git a/prov/util/src/util_domain.c b/prov/util/src/util_domain.c
index 4c1f9d4..41c5bb3 100644
--- a/prov/util/src/util_domain.c
+++ b/prov/util/src/util_domain.c
@@ -37,9 +37,22 @@
 #include <fi_util.h>
 
 
+int ofi_domain_bind_eq(struct util_domain *domain, struct util_eq *eq)
+{
+	if (domain->eq) {
+		FI_WARN(domain->prov, FI_LOG_DOMAIN,
+			"duplicate EQ binding\n");
+		return -FI_EINVAL;
+	}
+
+	domain->eq = eq;
+	ofi_atomic_inc32(&eq->ref);
+	return 0;
+}
+
 int ofi_domain_close(struct util_domain *domain)
 {
-	if (atomic_get(&domain->ref))
+	if (ofi_atomic_get32(&domain->ref))
 		return -FI_EBUSY;
 
 	fastlock_acquire(&domain->fabric->lock);
@@ -48,7 +61,7 @@ int ofi_domain_close(struct util_domain *domain)
 
 	free(domain->name);
 	fastlock_destroy(&domain->lock);
-	atomic_dec(&domain->fabric->ref);
+	ofi_atomic_dec32(&domain->fabric->ref);
 	return 0;
 }
 
@@ -62,10 +75,11 @@ static struct fi_ops_mr util_domain_mr_ops = {
 static int util_domain_init(struct util_domain *domain,
 			    const struct fi_info *info)
 {
-	atomic_initialize(&domain->ref, 0);
+	ofi_atomic_initialize32(&domain->ref, 0);
 	fastlock_init(&domain->lock);
-	domain->caps = info->caps;
-	domain->mode = info->mode;
+	domain->info_domain_caps = info->caps | info->domain_attr->caps;
+	domain->info_domain_mode = info->mode | info->domain_attr->mode;
+	domain->mr_mode = info->domain_attr->mr_mode;
 	domain->addr_format = info->addr_format;
 	domain->av_type = info->domain_attr->av_type;
 	domain->name = strdup(info->domain_attr->name);
@@ -98,6 +112,6 @@ int ofi_domain_init(struct fid_fabric *fabric_fid, const struct fi_info *info,
 	dlist_insert_tail(&domain->list_entry, &fabric->domain_list);
 	fastlock_release(&fabric->lock);
 
-	atomic_inc(&fabric->ref);
+	ofi_atomic_inc32(&fabric->ref);
 	return 0;
 }
diff --git a/prov/util/src/util_ep.c b/prov/util/src/util_ep.c
index b6d0f2b..30d2e75 100644
--- a/prov/util/src/util_ep.c
+++ b/prov/util/src/util_ep.c
@@ -36,9 +36,140 @@
 #include <fi_enosys.h>
 #include <fi_util.h>
 
+int ofi_ep_bind_cq(struct util_ep *ep, struct util_cq *cq, uint64_t flags)
+{
+	int ret;
+
+	ret = ofi_check_bind_cq_flags(ep, cq, flags);
+	if (ret)
+		return ret;
+
+	if (flags & FI_TRANSMIT) {
+		ep->tx_cq = cq;
+		if (!(flags & FI_SELECTIVE_COMPLETION))
+			ep->tx_op_flags |= FI_COMPLETION;
+		ofi_atomic_inc32(&cq->ref);
+	}
+
+	if (flags & FI_RECV) {
+		ep->rx_cq = cq;
+		if (!(flags & FI_SELECTIVE_COMPLETION))
+			ep->rx_op_flags |= FI_COMPLETION;
+		ofi_atomic_inc32(&cq->ref);
+	}
+
+	if (flags & (FI_TRANSMIT | FI_RECV)) {
+		return fid_list_insert(&cq->ep_list,
+				       &cq->ep_list_lock,
+				       &ep->ep_fid.fid);
+	}
+
+	return FI_SUCCESS;
+}
+
+int ofi_ep_bind_eq(struct util_ep *ep, struct util_eq *eq)
+{
+	if (ep->eq)
+		ofi_atomic_dec32(&ep->eq->ref);
+
+	ep->eq = eq;
+	ofi_atomic_inc32(&eq->ref);
+	return 0;
+}
+
+int ofi_ep_bind_av(struct util_ep *util_ep, struct util_av *av)
+{
+	if (util_ep->av) {
+		FI_WARN(util_ep->av->prov, FI_LOG_EP_CTRL,
+				"duplicate AV binding\n");
+		return -FI_EINVAL;
+	}
+	util_ep->av = av;
+	ofi_atomic_inc32(&av->ref);
+
+	fastlock_acquire(&av->lock);
+	dlist_insert_tail(&util_ep->av_entry, &av->ep_list);
+	fastlock_release(&av->lock);
+
+	return 0;
+}
+
+int ofi_ep_bind_cntr(struct util_ep *ep, struct util_cntr *cntr, uint64_t flags)
+{
+	int ret;
+
+	ret = ofi_check_bind_cntr_flags(ep, cntr, flags);
+	if (ret)
+		return ret;
+
+	if (flags & FI_TRANSMIT) {
+		ep->tx_cntr = cntr;
+		ofi_atomic_inc32(&cntr->ref);
+	}
+
+	if (flags & FI_RECV) {
+		ep->rx_cntr = cntr;
+		ofi_atomic_inc32(&cntr->ref);
+	}
+
+	if (flags & FI_READ) {
+		ep->rd_cntr = cntr;
+		ofi_atomic_inc32(&cntr->ref);
+	}
+
+	if (flags & FI_WRITE) {
+		ep->wr_cntr = cntr;
+		ofi_atomic_inc32(&cntr->ref);
+	}
+
+	if (flags & FI_REMOTE_READ) {
+		ep->rem_rd_cntr = cntr;
+		ofi_atomic_inc32(&cntr->ref);
+	}
+
+	if (flags & FI_REMOTE_WRITE) {
+		ep->rem_wr_cntr = cntr;
+		ofi_atomic_inc32(&cntr->ref);
+	}
+
+	return fid_list_insert(&cntr->ep_list,
+			       &cntr->ep_list_lock,
+			       &ep->ep_fid.fid);
+}
+
+int ofi_ep_bind(struct util_ep *util_ep, struct fid *fid, uint64_t flags)
+{
+	int ret;
+	struct util_av   *av;
+	struct util_cq   *cq;
+	struct util_eq   *eq;
+	struct util_cntr *cntr;
+
+	ret = ofi_ep_bind_valid(util_ep->domain->prov, fid, flags);
+	if (ret)
+		return ret;
+
+	switch (fid->fclass) {
+		case FI_CLASS_CQ:
+			cq = container_of(fid, struct util_cq, cq_fid.fid);
+			return ofi_ep_bind_cq(util_ep, cq, flags);
+		case FI_CLASS_EQ:
+			eq = container_of(fid, struct util_eq, eq_fid.fid);
+			return ofi_ep_bind_eq(util_ep, eq);
+		case FI_CLASS_AV:
+			av = container_of(fid, struct util_av, av_fid.fid);
+			return ofi_ep_bind_av(util_ep, av);
+		case FI_CLASS_CNTR:
+			cntr = container_of(fid, struct util_cntr, cntr_fid.fid);
+			return ofi_ep_bind_cntr(util_ep, cntr, flags);
+	}
+
+	return -FI_EINVAL;
+}
+
 int ofi_endpoint_init(struct fid_domain *domain, const struct util_prov *util_prov,
-		struct fi_info *info, struct util_ep *ep, void *context,
-		enum fi_match_type type)
+		      struct fi_info *info, struct util_ep *ep, void *context,
+		      ofi_ep_progress_func progress)
 {
 	struct util_domain *util_domain;
 	int ret;
@@ -48,19 +179,96 @@ int ofi_endpoint_init(struct fid_domain *domain, const struct util_prov *util_pr
 	if (!info || !info->ep_attr || !info->rx_attr || !info->tx_attr)
 		return -FI_EINVAL;
 
-	ret = fi_check_info(util_prov, info, type);
+	ret = ofi_prov_check_info(util_prov,
+				  util_domain->fabric->fabric_fid.api_version,
+				  info);
 	if (ret)
 		return ret;
 
 	ep->ep_fid.fid.fclass = FI_CLASS_EP;
 	ep->ep_fid.fid.context = context;
 	ep->domain = util_domain;
-	atomic_inc(&util_domain->ref);
+	ep->caps = info->caps;
+	ep->progress = progress;
+	ep->tx_op_flags = info->tx_attr->op_flags;
+	ep->rx_op_flags = info->rx_attr->op_flags;
+	ofi_atomic_inc32(&util_domain->ref);
+	if (util_domain->eq)
+		ofi_ep_bind_eq(ep, util_domain->eq);
+	fastlock_init(&ep->lock);
 	return 0;
 }
 
 int ofi_endpoint_close(struct util_ep *util_ep)
 {
-	atomic_dec(&util_ep->domain->ref);
+	fastlock_destroy(&util_ep->lock);
+
+	if (util_ep->tx_cq) {
+		fid_list_remove(&util_ep->tx_cq->ep_list,
+				&util_ep->tx_cq->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->tx_cq->ref);
+	}
+
+	if (util_ep->rx_cq) {
+		fid_list_remove(&util_ep->rx_cq->ep_list,
+				&util_ep->rx_cq->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->rx_cq->ref);
+	}
+
+	if (util_ep->rx_cntr) {
+		fid_list_remove(&util_ep->rx_cntr->ep_list,
+				&util_ep->rx_cntr->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->rx_cntr->ref);
+	}
+
+	if (util_ep->tx_cntr) {
+		fid_list_remove(&util_ep->tx_cntr->ep_list,
+				&util_ep->tx_cntr->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->tx_cntr->ref);
+	}
+
+	if (util_ep->rd_cntr) {
+		fid_list_remove(&util_ep->rd_cntr->ep_list,
+				&util_ep->rd_cntr->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->rd_cntr->ref);
+	}
+
+	if (util_ep->wr_cntr) {
+		fid_list_remove(&util_ep->wr_cntr->ep_list,
+				&util_ep->wr_cntr->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->wr_cntr->ref);
+	}
+
+	if (util_ep->rem_rd_cntr) {
+		fid_list_remove(&util_ep->rem_rd_cntr->ep_list,
+				&util_ep->rem_rd_cntr->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->rem_rd_cntr->ref);
+	}
+
+	if (util_ep->rem_wr_cntr) {
+		fid_list_remove(&util_ep->rem_wr_cntr->ep_list,
+				&util_ep->rem_wr_cntr->ep_list_lock,
+				&util_ep->ep_fid.fid);
+		ofi_atomic_dec32(&util_ep->rem_wr_cntr->ref);
+	}
+
+	if (util_ep->av) {
+		fastlock_acquire(&util_ep->av->lock);
+		dlist_remove(&util_ep->av_entry);
+		fastlock_release(&util_ep->av->lock);
+
+		ofi_atomic_dec32(&util_ep->av->ref);
+	}
+
+	if (util_ep->eq)
+		ofi_atomic_dec32(&util_ep->eq->ref);
+	ofi_atomic_dec32(&util_ep->domain->ref);
 	return 0;
 }
diff --git a/prov/util/src/util_eq.c b/prov/util/src/util_eq.c
index 1cf2daf..fe19a15 100644
--- a/prov/util/src/util_eq.c
+++ b/prov/util/src/util_eq.c
@@ -64,7 +64,7 @@ static ssize_t util_eq_read(struct fid_eq *eq_fid, uint32_t *event,
 	if (event)
 		*event = entry->event;
 	if (buf) {
-		ret = MIN(len, entry->size);
+		ret = MIN(len, (size_t)entry->size);
 		memcpy(buf, entry->data, ret);
 	}  else {
 		ret = 0;
@@ -161,7 +161,7 @@ static int util_eq_close(struct fid *fid)
 	struct util_event *event;
 
 	eq = container_of(fid, struct util_eq, eq_fid.fid);
-	if (atomic_get(&eq->ref))
+	if (ofi_atomic_get32(&eq->ref))
 		return -FI_EBUSY;
 
 	while (!slist_empty(&eq->list)) {
@@ -178,7 +178,7 @@ static int util_eq_close(struct fid *fid)
 	}
 
 	fastlock_destroy(&eq->lock);
-	atomic_dec(&eq->fabric->ref);
+	ofi_atomic_dec32(&eq->fabric->ref);
 	free(eq);
 	return 0;
 }
@@ -207,7 +207,7 @@ static int util_eq_init(struct fid_fabric *fabric, struct util_eq *eq,
 	struct fid_wait *wait;
 	int ret;
 
-	atomic_initialize(&eq->ref, 0);
+	ofi_atomic_initialize32(&eq->ref, 0);
 	slist_init(&eq->list);
 	fastlock_init(&eq->lock);
 
@@ -303,7 +303,7 @@ int ofi_eq_create(struct fid_fabric *fabric_fid, struct fi_eq_attr *attr,
 	eq->eq_fid.fid.ops = &util_eq_fi_ops;
 	eq->eq_fid.ops = &util_eq_ops;
 
-	atomic_inc(&fabric->ref);
+	ofi_atomic_inc32(&fabric->ref);
 
 	/* EQ must be fully operational before adding to wait set */
 	if (eq->wait) {
diff --git a/prov/util/src/util_fabric.c b/prov/util/src/util_fabric.c
index 6dfe3d4..f33a1b6 100644
--- a/prov/util/src/util_fabric.c
+++ b/prov/util/src/util_fabric.c
@@ -38,42 +38,38 @@
 
 int ofi_fabric_close(struct util_fabric *fabric)
 {
-	if (atomic_get(&fabric->ref))
+	if (ofi_atomic_get32(&fabric->ref))
 		return -FI_EBUSY;
 
-	fi_fabric_remove(fabric);
+	ofi_fabric_remove(fabric);
+	free((char *)fabric->name);
 	fastlock_destroy(&fabric->lock);
 	return 0;
 }
 
-static void util_fabric_init(struct util_fabric *fabric, const char *name)
-{
-	atomic_initialize(&fabric->ref, 0);
-	dlist_init(&fabric->domain_list);
-	fastlock_init(&fabric->lock);
-	fabric->name = name;
-}
-
 int ofi_fabric_init(const struct fi_provider *prov,
-		   struct fi_fabric_attr *prov_attr,
-		   struct fi_fabric_attr *user_attr,
-		   struct util_fabric *fabric, void *context,
-		   enum fi_match_type type)
+		    const struct fi_fabric_attr *prov_attr,
+		    const struct fi_fabric_attr *user_attr,
+		    struct util_fabric *fabric, void *context)
 {
 	int ret;
 
-	ret = fi_check_fabric_attr(prov, prov_attr, user_attr, type);
+	ret = ofi_check_fabric_attr(prov, prov_attr, user_attr);
 	if (ret)
 		return ret;
 
 	fabric->prov = prov;
-	util_fabric_init(fabric, prov_attr->name);
+	ofi_atomic_initialize32(&fabric->ref, 0);
+	dlist_init(&fabric->domain_list);
+	fastlock_init(&fabric->lock);
+	if (!(fabric->name = strdup(user_attr->name)))
+	    return -FI_ENOMEM;
 
 	fabric->fabric_fid.fid.fclass = FI_CLASS_FABRIC;
 	fabric->fabric_fid.fid.context = context;
 	/*
 	 * fabric ops set by provider
 	 */
-	fi_fabric_insert(fabric);
+	ofi_fabric_insert(fabric);
 	return 0;
 }
diff --git a/prov/util/src/util_main.c b/prov/util/src/util_main.c
index b59a53d..3656ed5 100644
--- a/prov/util/src/util_main.c
+++ b/prov/util/src/util_main.c
@@ -39,55 +39,45 @@
 
 
 static DEFINE_LIST(fabric_list);
-static fastlock_t lock;
+static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
 
-
-void fi_util_init(void)
-{
-	fastlock_init(&lock);
-}
-
-void fi_util_fini(void)
+void ofi_fabric_insert(struct util_fabric *fabric)
 {
-	fastlock_destroy(&lock);
-}
-
-void fi_fabric_insert(struct util_fabric *fabric)
-{
-	fastlock_acquire(&lock);
+	pthread_mutex_lock(&lock);
 	dlist_insert_tail(&fabric->list_entry, &fabric_list);
-	fastlock_release(&lock);
+	pthread_mutex_unlock(&lock);
 }
 
-static int fabric_match_name(struct dlist_entry *item, const void *arg)
+static int util_match_fabric(struct dlist_entry *item, const void *arg)
 {
 	struct util_fabric *fabric;
+	struct util_fabric_info *fabric_info = (struct util_fabric_info *)arg;
 
 	fabric = container_of(item, struct util_fabric, list_entry);
-	return !strcmp(fabric->name, arg);
+	return (fabric_info->prov == fabric->prov) &&
+		!strcmp(fabric->name, fabric_info->name);
 }
 
-struct util_fabric *fi_fabric_find(const char *name)
+struct util_fabric *ofi_fabric_find(struct util_fabric_info *fabric_info)
 {
 	struct dlist_entry *item;
 
-	fastlock_acquire(&lock);
-	item = dlist_find_first_match(&fabric_list, fabric_match_name, name);
-	fastlock_release(&lock);
+	pthread_mutex_lock(&lock);
+	item = dlist_find_first_match(&fabric_list, util_match_fabric, fabric_info);
+	pthread_mutex_unlock(&lock);
 
 	return item ? container_of(item, struct util_fabric, list_entry) : NULL;
 }
 
-void fi_fabric_remove(struct util_fabric *fabric)
+void ofi_fabric_remove(struct util_fabric *fabric)
 {
-	assert(fi_fabric_find(fabric->name));
-	fastlock_acquire(&lock);
+	pthread_mutex_lock(&lock);
 	dlist_remove(&fabric->list_entry);
-	fastlock_release(&lock);
+	pthread_mutex_unlock(&lock);
 }
 
 
-static int fi_fid_match(struct dlist_entry *entry, const void *fid)
+static int ofi_fid_match(struct dlist_entry *entry, const void *fid)
 {
 	struct fid_list_entry *item;
 	item = container_of(entry, struct fid_list_entry, entry);
@@ -102,7 +92,7 @@ int fid_list_insert(struct dlist_entry *fid_list, fastlock_t *lock,
 	struct fid_list_entry *item;
 
 	fastlock_acquire(lock);
-	entry = dlist_find_first_match(fid_list, fi_fid_match, fid);
+	entry = dlist_find_first_match(fid_list, ofi_fid_match, fid);
 	if (entry)
 		goto out;
 
@@ -126,7 +116,7 @@ void fid_list_remove(struct dlist_entry *fid_list, fastlock_t *lock,
 	struct dlist_entry *entry;
 
 	fastlock_acquire(lock);
-	entry = dlist_remove_first_match(fid_list, fi_fid_match, fid);
+	entry = dlist_remove_first_match(fid_list, ofi_fid_match, fid);
 	fastlock_release(lock);
 
 	if (entry) {
@@ -143,8 +133,10 @@ int util_find_domain(struct dlist_entry *item, const void *arg)
 	domain = container_of(item, struct util_domain, list_entry);
 
 	return !strcmp(domain->name, info->domain_attr->name) &&
-		!(info->caps & ~domain->caps) &&
-		 ((info->mode & domain->mode) == domain->mode);
+		!((info->caps | info->domain_attr->caps) & ~domain->info_domain_caps) &&
+		 (((info->mode | info->domain_attr->mode) &
+		   domain->info_domain_mode) == domain->info_domain_mode) &&
+		 ((info->domain_attr->mr_mode & domain->mr_mode) == domain->mr_mode);
 }
 
 int util_getinfo(const struct util_prov *util_prov, uint32_t version,
@@ -155,6 +147,8 @@ int util_getinfo(const struct util_prov *util_prov, uint32_t version,
 	struct util_domain *domain;
 	struct dlist_entry *item;
 	const struct fi_provider *prov = util_prov->prov;
+	struct util_fabric_info fabric_info;
+	struct fi_info *saved_info;
 	int ret, copy_dest;
 
 	FI_DBG(prov, FI_LOG_CORE, "checking info\n");
@@ -165,91 +159,101 @@ int util_getinfo(const struct util_prov *util_prov, uint32_t version,
 		return -FI_EINVAL;
 	}
 
-	ret = fi_check_info(util_prov, hints, FI_MATCH_EXACT);
+	ret = ofi_prov_check_dup_info(util_prov, version, hints, info);
 	if (ret)
 		return ret;
 
-	*info = fi_dupinfo(util_prov->info);
-	if (!*info) {
-		FI_INFO(prov, FI_LOG_CORE, "cannot copy info\n");
-		return -FI_ENOMEM;
-	}
+	ofi_alter_info(*info, hints, version);
 
-	ofi_alter_info(*info, hints);
-
-	fabric = fi_fabric_find((*info)->fabric_attr->name);
-	if (fabric) {
-		FI_DBG(prov, FI_LOG_CORE, "Found opened fabric\n");
-		(*info)->fabric_attr->fabric = &fabric->fabric_fid;
-
-		fastlock_acquire(&fabric->lock);
-		item = dlist_find_first_match(&fabric->domain_list,
-					      util_find_domain, *info);
-		if (item) {
-			FI_DBG(prov, FI_LOG_CORE, "Found open domain\n");
-			domain = container_of(item, struct util_domain,
-					      list_entry);
-			(*info)->domain_attr->domain = &domain->domain_fid;
-		}
-		fastlock_release(&fabric->lock);
+	saved_info = *info;
 
-	}
+	for (; *info; *info = (*info)->next) {
+
+		fabric_info.name = (*info)->fabric_attr->name;
+		fabric_info.prov = util_prov->prov;
+
+		fabric = ofi_fabric_find(&fabric_info);
+		if (fabric) {
+			FI_DBG(prov, FI_LOG_CORE, "Found opened fabric\n");
+			(*info)->fabric_attr->fabric = &fabric->fabric_fid;
+
+			fastlock_acquire(&fabric->lock);
+			item = dlist_find_first_match(&fabric->domain_list,
+						      util_find_domain, *info);
+			if (item) {
+				FI_DBG(prov, FI_LOG_CORE,
+				       "Found open domain\n");
+				domain = container_of(item, struct util_domain,
+						      list_entry);
+				(*info)->domain_attr->domain =
+						&domain->domain_fid;
+			}
+			fastlock_release(&fabric->lock);
 
-	if (flags & FI_SOURCE) {
-		ret = ofi_get_addr((*info)->addr_format, flags,
-				  node, service, &(*info)->src_addr,
-				  &(*info)->src_addrlen);
-		if (ret) {
-			FI_INFO(prov, FI_LOG_CORE,
-				"source address not available\n");
-			goto err;
 		}
-		copy_dest = (hints && hints->dest_addr);
-	} else {
-		if (node || service) {
-			copy_dest = 0;
+
+		if (flags & FI_SOURCE) {
 			ret = ofi_get_addr((*info)->addr_format, flags,
-					  node, service, &(*info)->dest_addr,
-					  &(*info)->dest_addrlen);
+					  node, service, &(*info)->src_addr,
+					  &(*info)->src_addrlen);
 			if (ret) {
 				FI_INFO(prov, FI_LOG_CORE,
-					"cannot resolve dest address\n");
+					"source address not available\n");
 				goto err;
 			}
-		} else {
 			copy_dest = (hints && hints->dest_addr);
-		}
+		} else {
+			if (node || service) {
+				copy_dest = 0;
+				ret = ofi_get_addr((*info)->addr_format,
+						   flags, node, service,
+						   &(*info)->dest_addr,
+						   &(*info)->dest_addrlen);
+				if (ret) {
+					FI_INFO(prov, FI_LOG_CORE,
+						"cannot resolve dest address\n");
+					goto err;
+				}
+			} else {
+				copy_dest = (hints && hints->dest_addr);
+			}
 
-		if (hints && hints->src_addr) {
-			(*info)->src_addr = mem_dup(hints->src_addr,
+			if (hints && hints->src_addr) {
+				(*info)->src_addr = mem_dup(hints->src_addr,
 						    hints->src_addrlen);
-			if (!(*info)->src_addr) {
+				if (!(*info)->src_addr) {
+					ret = -FI_ENOMEM;
+					goto err;
+				}
+				(*info)->src_addrlen = hints->src_addrlen;
+			}
+		}
+
+		if (copy_dest) {
+			(*info)->dest_addr = mem_dup(hints->dest_addr,
+						     hints->dest_addrlen);
+			if (!(*info)->dest_addr) {
 				ret = -FI_ENOMEM;
 				goto err;
 			}
-			(*info)->src_addrlen = hints->src_addrlen;
+			(*info)->dest_addrlen = hints->dest_addrlen;
 		}
-	}
 
-	if (copy_dest) {
-		(*info)->dest_addr = mem_dup(hints->dest_addr,
-					     hints->dest_addrlen);
-		if (!(*info)->dest_addr) {
-			ret = -FI_ENOMEM;
-			goto err;
+		if ((*info)->dest_addr && !(*info)->src_addr) {
+			ret = ofi_get_src_addr((*info)->addr_format,
+					       (*info)->dest_addr,
+					       (*info)->dest_addrlen,
+					       &(*info)->src_addr,
+					       &(*info)->src_addrlen);
+			if (ret) {
+				FI_INFO(prov, FI_LOG_CORE,
+					"cannot resolve source address\n");
+			}
 		}
-		(*info)->dest_addrlen = hints->dest_addrlen;
 	}
 
-	if ((*info)->dest_addr && !(*info)->src_addr) {
-		ret = ofi_get_src_addr((*info)->addr_format, (*info)->dest_addr,
-				      (*info)->dest_addrlen, &(*info)->src_addr,
-				      &(*info)->src_addrlen);
-		if (ret) {
-			FI_INFO(prov, FI_LOG_CORE,
-				"cannot resolve source address\n");
-		}
-	}
+	*info = saved_info;
+
 	return 0;
 
 err:
diff --git a/prov/util/src/util_mr.c b/prov/util/src/util_mr.c
index 4116eda..c96d6b2 100644
--- a/prov/util/src/util_mr.c
+++ b/prov/util/src/util_mr.c
@@ -36,221 +36,152 @@
 #include <assert.h>
 #include <rbtree.h>
 
-/* deep copy: make seperate copy of mr_attr and use context for prov_mr */
-static struct fi_mr_attr * create_mr_attr_copy(
-                        const struct fi_mr_attr *in_attr, void * prov_mr)
-{
-    struct fi_mr_attr * item;
-    struct iovec *mr_iov;
-    int i = 0;
-
-    if (!prov_mr || !in_attr)
-        return NULL;
-
-    item = malloc(sizeof(struct fi_mr_attr));
-    if (!item)
-        return NULL;
-
-    *item = *in_attr;
-    item->context = prov_mr;
-    mr_iov = malloc(sizeof(struct iovec) * in_attr->iov_count);
-    if (!mr_iov) {
-        free(item);
-        return NULL;
-    }
-
-    for(i = 0; i < in_attr->iov_count; i++)
-        mr_iov[i] = in_attr->mr_iov[i];
-
-    item->mr_iov = mr_iov;
-
-    return item;
-}
 
-static uint64_t get_mr_key(struct ofi_util_mr *mr_h)
+static struct fi_mr_attr *
+dup_mr_attr(const struct fi_mr_attr *attr)
 {
-    assert(mr_h->b_key != UINT64_MAX);
-    return mr_h->b_key++;
-}
-
-static int verify_addr(struct ofi_util_mr * in_mr, struct fi_mr_attr * item, uint64_t in_access,
-                                 uint64_t in_addr, ssize_t in_len)
-{
-    int i = 0;
-    uint64_t start = (uintptr_t) item->mr_iov[i].iov_base;
-    uint64_t end = start + item->mr_iov[i].iov_len;
-
-    if (!in_addr) {
-        FI_DBG(in_mr->prov, FI_LOG_MR, "verify_addr: input address to is zero\n");
-        return -FI_EINVAL;
-    }
+	struct fi_mr_attr *dup_attr;
 
-    if ((in_access & item->access) != in_access) {
-        FI_DBG(in_mr->prov, FI_LOG_MR, "verify_addr: requested access is not valid\n");
-        return -FI_EACCES;
-    }
+	dup_attr = calloc(1, sizeof(*attr) +
+			     sizeof(*attr->mr_iov) * attr->iov_count);
+	if (!dup_attr)
+		return NULL;
 
-      for (i = 0; i < item->iov_count; i++) {
-        if (start <= in_addr && end >= (in_addr + in_len))
-            return 0;
-    }
+	*dup_attr = *attr;
+	dup_attr->mr_iov = (struct iovec *) (dup_attr + 1);
+	memcpy((void *) dup_attr->mr_iov, attr->mr_iov,
+		sizeof(*attr->mr_iov) * attr->iov_count);
 
-    return -FI_EACCES;
+	return dup_attr;
 }
 
-int ofi_mr_insert(struct ofi_util_mr * in_mr_h, const struct fi_mr_attr *in_attr,
-                                uint64_t * out_key, void * in_prov_mr)
+int ofi_mr_insert(struct ofi_mr_map *map, const struct fi_mr_attr *attr,
+		  uint64_t *key, void *context)
 {
-    struct fi_mr_attr * item;
+	struct fi_mr_attr *item;
 
-    if (!in_attr || in_attr->iov_count <= 0 || !in_prov_mr) {
-        return -FI_EINVAL;
-    }
+	item = dup_mr_attr(attr);
+	if (!item)
+		return -FI_ENOMEM;
 
-    item = create_mr_attr_copy(in_attr, in_prov_mr);
-    if (!item)
-        return -FI_ENOMEM;
+	if (!(map->mode & FI_MR_VIRT_ADDR))
+		item->offset = (uintptr_t) attr->mr_iov[0].iov_base;
 
-    /* Scalable MR handling: use requested key and offset */
-    if (in_mr_h->mr_type == FI_MR_SCALABLE) {
-        item->offset = (uintptr_t) in_attr->mr_iov[0].iov_base + in_attr->offset;
-        /* verify key doesn't already exist */
-        if (rbtFind(in_mr_h->map_handle, &item->requested_key)) {
-                free((void *)item->mr_iov);
-                free(item);
-                return -FI_EINVAL;
-        }
-    } else {
-        item->requested_key = get_mr_key(in_mr_h);
-        item->offset = (uintptr_t) in_attr->mr_iov[0].iov_base;
-    }
+	if (!(map->mode & FI_MR_PROV_KEY)) {
+		if (rbtFind(map->rbtree, &item->requested_key)) {
+			free(item);
+			return -FI_ENOKEY;
+		}
+	} else {
+		item->requested_key = map->key++;
+	}
 
-    rbtInsert(in_mr_h->map_handle, &item->requested_key, item);
-    *out_key = item->requested_key;
+	rbtInsert(map->rbtree, &item->requested_key, item);
+	*key = item->requested_key;
+	item->context = context;
 
-    return 0;
+	return 0;
 }
 
-void * ofi_mr_retrieve(struct ofi_util_mr * in_mr_h,  uint64_t in_key)
+void *ofi_mr_get(struct ofi_mr_map *map, uint64_t key)
 {
-    void * itr;
-    struct fi_mr_attr * item;
-    void * key = &in_key;
+	struct fi_mr_attr *attr;
+	void *itr, *key_ptr;
 
-    itr = rbtFind(in_mr_h->map_handle, key);
+	itr = rbtFind(map->rbtree, &key);
+	if (!itr)
+		return NULL;
 
-    if (!itr)
-        return NULL;
-
-    rbtKeyValue(in_mr_h->map_handle, itr, (void **)&key,
-                                (void **) &item);
-    return item->context;
+	rbtKeyValue(map->rbtree, itr, &key_ptr, (void **) &attr);
+	return attr->context;
 }
 
-
-/* io_addr is address of buff (&buf) */
-int ofi_mr_retrieve_and_verify(struct ofi_util_mr * in_mr_h, ssize_t in_len,
-                                uintptr_t *io_addr, uint64_t in_key,
-                                uint64_t in_access, void **out_prov_mr)
+int ofi_mr_verify(struct ofi_mr_map *map, uintptr_t *io_addr,
+		  size_t len, uint64_t key, uint64_t access,
+		  void **context)
 {
-    int ret = 0;
-    void * itr;
-    struct fi_mr_attr * item;
-    void * key = &in_key;
-
-    itr = rbtFind(in_mr_h->map_handle, key);
-
-    if (!itr)
-        return -FI_EINVAL;
+	struct fi_mr_attr *attr;
+	void *itr, *key_ptr, *addr;
 
-    rbtKeyValue(in_mr_h->map_handle, itr, &key, (void **) &item);
+	itr = rbtFind(map->rbtree, &key);
+	if (!itr)
+		return -FI_EINVAL;
 
-    /*return providers MR struct */
-    if (!item || !io_addr)
-        return -FI_EINVAL;
+	rbtKeyValue(map->rbtree, itr, &key_ptr, (void **) &attr);
+	assert(attr);
 
-    if (out_prov_mr)
-        (*out_prov_mr) = item->context;
+	if ((access & attr->access) != access) {
+		FI_DBG(map->prov, FI_LOG_MR, "verify_addr: invalid access\n");
+		return -FI_EACCES;
+	}
 
-    /*offset for scalable */
-    if (in_mr_h->mr_type == FI_MR_SCALABLE)
-        *io_addr = (*io_addr) + item->offset;
+	addr = (void *) (*io_addr + (uintptr_t) attr->offset);
 
-    ret = verify_addr(in_mr_h, item, in_access, *io_addr, in_len);
+	if ((addr < attr->mr_iov[0].iov_base) ||
+	    (((char *) addr + len) > ((char *) attr->mr_iov[0].iov_base +
+			    	      attr->mr_iov[0].iov_len))) {
+		return -FI_EACCES;
+	}
 
-    return ret;
+	if (context)
+		*context = attr->context;
+	*io_addr = (uintptr_t) addr;
+	return 0;
 }
 
-int ofi_mr_erase(struct ofi_util_mr * in_mr_h, uint64_t in_key)
+int ofi_mr_remove(struct ofi_mr_map *map, uint64_t key)
 {
-    void * itr;
-    struct fi_mr_attr * item;
+	struct fi_mr_attr *attr;
+	void *itr, *key_ptr;
 
-    if (!in_mr_h)
-        return -FI_EINVAL;
+	itr = rbtFind(map->rbtree, &key);
+	if (!itr)
+		return -FI_ENOKEY;
 
-    itr = rbtFind(in_mr_h->map_handle, &in_key);
+	rbtKeyValue(map->rbtree, itr, &key_ptr, (void **) &attr);
+	rbtErase(map->rbtree, itr);
+	free(attr);
 
-    if (!itr)
-        return -FI_ENOKEY;
-
-    /*release memory */
-    rbtKeyValue(in_mr_h->map_handle, itr, (void **)&in_key,
-                                (void **) &item);
-
-    assert(item);
-
-    free((void *)item->mr_iov);
-    free(item);
-
-    rbtErase(in_mr_h->map_handle, itr);
-
-    return 0;
+	return 0;
 }
 
-/*assumes uint64_t keys */
+/* assumes uint64_t keys */
 static int compare_mr_keys(void *key1, void *key2)
 {
-    uint64_t k1 = *((uint64_t *) key1);
-    uint64_t k2 = *((uint64_t *) key2);
-    return (k1 < k2) ?  -1 : (k1 > k2);
+	uint64_t k1 = *((uint64_t *) key1);
+	uint64_t k2 = *((uint64_t *) key2);
+	return (k1 < k2) ? -1 : (k1 > k2);
 }
 
 
-int ofi_mr_init(const struct fi_provider *in_prov, enum fi_mr_mode mode,
-                struct ofi_util_mr ** out_new_mr)
+/*
+ * If a provider or app whose version is < 1.5, calls this function and passes
+ * FI_MR_UNSPEC as mode, it would be treated as MR scalable.
+ */
+int ofi_mr_map_init(const struct fi_provider *prov, int mode,
+		    struct ofi_mr_map *map)
 {
-    struct ofi_util_mr * new_mr = malloc(sizeof(struct ofi_util_mr));
-    if (!new_mr)
-        return -FI_ENOMEM;
-
-    assert((mode == FI_MR_SCALABLE) || (mode == FI_MR_BASIC));
-
-    new_mr->mr_type = mode;
-
-    new_mr->map_handle = rbtNew(compare_mr_keys);
-    if (!new_mr->map_handle) {
-        free(new_mr);
-        return -FI_ENOMEM;
-    }
-
-    new_mr->b_key = 0;
-
-    new_mr->prov = in_prov;
-
-    (*out_new_mr) = new_mr;
-
-    return 0;
+	map->rbtree = rbtNew(compare_mr_keys);
+	if (!map->rbtree)
+		return -FI_ENOMEM;
+
+	switch (mode) {
+	case FI_MR_BASIC:
+		map->mode = OFI_MR_BASIC_MAP;
+		break;
+	case FI_MR_SCALABLE:
+		map->mode = 0;
+		break;
+	default:
+		map->mode = mode;
+	}
+	map->prov = prov;
+	map->key = 1;
+
+	return 0;
 }
 
-
-void ofi_mr_close(struct ofi_util_mr *in_mr_h)
+void ofi_mr_map_close(struct ofi_mr_map *map)
 {
-    if (!in_mr_h) {
-        FI_WARN(&core_prov, FI_LOG_MR, "util mr_close: received NULL input\n");
-        return;
-    }
-
-    rbtDelete(in_mr_h->map_handle);
-    free(in_mr_h);
+	rbtDelete(map->rbtree);
 }
diff --git a/prov/util/src/util_ns.c b/prov/util/src/util_ns.c
new file mode 100644
index 0000000..c373d36
--- /dev/null
+++ b/prov/util/src/util_ns.c
@@ -0,0 +1,596 @@
+/*
+ * Copyright (c) 2017 Intel Corporation. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/*
+ * A name server is started on each node as a thread within one of
+ * the processes on that node. It maintains a database that maps
+ * "services" to "endpoint names". Other processes on the same node
+ * talk to this name server to update mapping information.
+ *
+ * To resolve a "node:service" pair into an provider internal endpoint name
+ * that can be used as the input of fi_av_insert, a process needs to make
+ * a query to the name server residing on "node".
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+
+#include <fi_util.h>
+#include <rdma/providers/fi_log.h>
+#include <fi.h>
+
+#include "rbtree.h"
+
+#define OFI_NS_DEFAULT_HOSTNAME	"localhost"
+
+#define OFI_NS_SOCKET_OP(op)							\
+static inline									\
+ssize_t util_ns_##op##_socket_op(SOCKET sock, void *buf, size_t len)		\
+{										\
+	ssize_t ret = 0, bytes = 0;						\
+	while (bytes != (len) && ret >= 0) {					\
+		ret = ofi_##op##_socket((sock),					\
+					(void *)((char *) (buf) + bytes),	\
+					(len) - bytes);				\
+		bytes = ((ret < 0) ? -1 : bytes + ret);				\
+	}									\
+	return bytes;								\
+}
+
+OFI_NS_SOCKET_OP(write)
+OFI_NS_SOCKET_OP(read)
+
+enum {
+	OFI_UTIL_NS_ADD,
+	OFI_UTIL_NS_DEL,
+	OFI_UTIL_NS_QUERY,
+	OFI_UTIL_NS_ACK,
+};
+
+struct util_ns_cmd {
+	int	op;
+	int	status;
+};
+
+const size_t cmd_len = sizeof(struct util_ns_cmd);
+
+static int util_ns_map_init(struct util_ns *ns)
+{
+	ns->ns_map = rbtNew(ns->service_cmp);
+	return ns->ns_map ? 0 : -FI_ENOMEM;
+}
+
+static void util_ns_map_fini(struct util_ns *ns)
+{
+	rbtDelete(ns->ns_map);
+}
+
+static int util_ns_map_add(struct util_ns *ns, void *service_in,
+			   void *name_in)
+{
+	void *name, *service;
+	int ret;
+
+	service = calloc(ns->service_len, 1);
+	if (!service) {
+		ret = -FI_ENOMEM;
+		goto err1;
+	}
+	memcpy(service, service_in, ns->service_len);
+
+	name = calloc(ns->name_len, 1);
+	if (!name) {
+		ret = -FI_ENOMEM;
+		goto err2;
+	}
+	memcpy(name, name_in, ns->name_len);
+
+	if (rbtFind(ns->ns_map, service)) {
+		ret = -FI_EADDRINUSE;
+		goto err3;
+	}
+
+	if (rbtInsert(ns->ns_map, service, name)) {
+		ret = -FI_ENOMEM;
+		goto err3;
+	}
+	return FI_SUCCESS;
+
+err3:
+	free(name);
+err2:
+	free(service);
+err1:
+	return ret;
+}
+ 
+static int util_ns_map_del(struct util_ns *ns, void *service_in,
+			   void *name_in)
+{
+	RbtIterator it;
+	int ret = -FI_ENOENT;
+	void *service, *name;
+
+        it = rbtFind(ns->ns_map, service_in);
+        if (it) {
+		rbtKeyValue(ns->ns_map, it, &service, &name);
+		if (memcmp(name, name_in, ns->name_len))
+			return ret;
+		free(service);
+		free(name);
+		rbtErase(ns->ns_map, it);
+		ret = FI_SUCCESS;
+	}
+
+	return ret;
+}
+
+static int util_ns_map_lookup(struct util_ns *ns, void *service_in,
+			      void *name_out)
+{
+	RbtIterator it;
+	void *key, *name;
+
+        it = rbtFind(ns->ns_map, service_in);
+	if (!it)
+		return -FI_ENOENT;
+
+	rbtKeyValue(ns->ns_map, it, &key, (void **)&name);
+	memcpy(name_out, name, ns->name_len);
+
+	if (ns->is_service_wildcard && ns->is_service_wildcard(service_in))
+		memcpy(service_in, key, ns->service_len);
+
+	return FI_SUCCESS;
+}
+
+static void util_ns_name_server_cleanup(void *args)
+{
+	void **cleanup_args = (void **)args;
+	ofi_close_socket((uintptr_t)cleanup_args[0]);
+	util_ns_map_fini((struct util_ns *)cleanup_args[1]);
+}
+
+static int util_ns_op_dispatcher(struct util_ns *ns,
+				 struct util_ns_cmd *cmd,
+				 SOCKET sock)
+{
+	int ret = FI_SUCCESS;
+	size_t io_len = 0;
+	void *io_buf = NULL, *service, *name;
+
+	switch (cmd->op) {
+	case OFI_UTIL_NS_ADD:
+	case OFI_UTIL_NS_DEL:
+		io_len = ns->name_len + ns->service_len;
+		io_buf = calloc(io_len, 1);
+		if (!io_buf) {
+			ret = -FI_ENOMEM;
+			goto fn1;
+		}
+
+		ret = util_ns_read_socket_op(sock, io_buf, io_len);
+		if (ret == io_len) {
+			service = io_buf;
+			name = (void *)((char *)io_buf + ns->service_len);
+			ret = (cmd->op == OFI_UTIL_NS_ADD) ?
+			      util_ns_map_add(ns, service, name) :
+			      util_ns_map_del(ns, service, name);
+		} else {
+			ret = -FI_ENODATA;
+		}
+		goto fn2;
+
+	case OFI_UTIL_NS_QUERY:
+		io_len = ns->service_len;
+		/* allocate io_buf to be large enough */
+		io_buf = calloc(
+			cmd_len + ns->service_len + ns->name_len, 1
+		);
+		if (!io_buf) {
+			ret = -FI_ENOMEM;
+			goto fn1;
+		}
+
+		memcpy(io_buf, cmd, cmd_len);
+		cmd = io_buf;
+		service = (char *)io_buf + cmd_len;
+		name = (char *)service + ns->service_len;
+
+		ret = util_ns_read_socket_op(sock, service, io_len);
+		if (ret == io_len) {
+			cmd->op = OFI_UTIL_NS_ACK;
+			cmd->status = util_ns_map_lookup(
+				ns, service, name
+			);
+		} else {
+			ret = -FI_ENODATA;
+			goto fn2;
+		}
+
+		if (!cmd->status)
+			io_len = cmd_len + ns->service_len + ns->name_len;
+		else
+			io_len = cmd_len;
+		ret = util_ns_write_socket_op(sock, io_buf, io_len);
+		ret = ((ret == cmd_len) ? FI_SUCCESS : -FI_ENODATA);
+		goto fn2;
+
+	default:
+		ret = -FI_ENODATA;
+		assert(0);
+		goto fn1;
+	}
+
+fn2:
+	free(io_buf);
+fn1:
+	return ret;
+}
+
+static void *util_ns_name_server_func(void *args)
+{
+	struct util_ns *ns;
+	struct addrinfo hints = {
+		.ai_flags = AI_PASSIVE,
+		.ai_family = AF_UNSPEC,
+		.ai_socktype = SOCK_STREAM
+	};
+	struct addrinfo *res, *p;
+	void *cleanup_args[2];
+	char *service;
+	SOCKET listenfd = INVALID_SOCKET, connfd;
+	int n, ret;
+	struct util_ns_cmd cmd = (const struct util_ns_cmd){ 0 };
+
+	ns = (struct util_ns *)args;
+
+	if (asprintf(&service, "%d", ns->ns_port) < 0)
+		return NULL;
+
+	n = getaddrinfo(NULL, service, &hints, &res);
+	if (n < 0) {
+		free(service);
+		return NULL;
+	}
+
+	for (p = res; p; p = p->ai_next) {
+		listenfd = ofi_socket(p->ai_family, p->ai_socktype,
+				      p->ai_protocol);
+		if (listenfd != INVALID_SOCKET) {
+			n = 1;
+			(void) setsockopt(listenfd, SOL_SOCKET,
+					  SO_REUSEADDR, &n, sizeof(n));
+			if (!bind(listenfd, p->ai_addr, p->ai_addrlen))
+				break;
+			ofi_close_socket(listenfd);
+			listenfd = INVALID_SOCKET;
+		}
+	}
+
+	freeaddrinfo(res);
+	free(service);
+
+	if (listenfd == INVALID_SOCKET)
+		return NULL;
+
+	if (util_ns_map_init(ns))
+		goto done;
+
+	ret = listen(listenfd, 256);
+	if (ret)
+		goto done;
+
+	cleanup_args[0] = (void *)(uintptr_t)listenfd;
+	cleanup_args[1] = (void *)ns;
+	pthread_cleanup_push(util_ns_name_server_cleanup,
+			     (void *)cleanup_args);
+
+	while (1) {
+		connfd = accept(listenfd, NULL, 0);
+		if (connfd != INVALID_SOCKET) {
+			/* Read service data */
+			ret = ofi_read_socket(connfd, &cmd, cmd_len);
+			if (ret == cmd_len) {
+				(void) util_ns_op_dispatcher(ns, &cmd,
+							     connfd);
+			}
+			ofi_close_socket(connfd);
+		}
+	}
+
+	pthread_cleanup_pop(1);
+
+done:
+	ofi_close_socket(listenfd);
+	return NULL;
+}
+
+
+/*
+ * Name server API: client side
+ */
+
+static int util_ns_connect_server(struct util_ns *ns, const char *server)
+{
+	struct addrinfo hints = {
+		.ai_family   = AF_UNSPEC,
+		.ai_socktype = SOCK_STREAM
+	};
+	struct addrinfo *res, *p;
+	char *service;
+	SOCKET sockfd = INVALID_SOCKET;
+	int n;
+
+	if (asprintf(&service, "%d", ns->ns_port) < 0)
+		return -1;
+
+	n = getaddrinfo(server, service, &hints, &res);
+	if (n < 0) {
+		free(service);
+		return -1;
+	}
+
+	for (p = res; p; p = p->ai_next) {
+		sockfd = ofi_socket(p->ai_family, p->ai_socktype, p->ai_protocol);
+		if (sockfd != INVALID_SOCKET) {
+			if (!connect(sockfd, p->ai_addr, p->ai_addrlen))
+				break;
+			ofi_close_socket(sockfd);
+			sockfd = INVALID_SOCKET;
+		}
+	}
+
+	freeaddrinfo(res);
+	free(service);
+
+	return sockfd;
+}
+
+int ofi_ns_add_local_name(struct util_ns *ns, void *service, void *name)
+{
+	SOCKET sockfd;
+	int ret;
+	char *server = (ns->ns_hostname ?
+		ns->ns_hostname : OFI_NS_DEFAULT_HOSTNAME);
+	void *write_buf;
+	size_t write_len = 0;
+	struct util_ns_cmd cmd = {
+		.op = OFI_UTIL_NS_ADD,
+		.status = 0,
+	};
+
+	write_buf = calloc(cmd_len + ns->service_len + ns->name_len, 1);
+	if (!write_buf) {
+		ret = -FI_ENOMEM;
+		goto err1;
+	}
+
+	memcpy(write_buf, &cmd, cmd_len);
+	write_len += cmd_len;
+	memcpy((void *)((char *)write_buf + write_len), service,
+	       ns->service_len);
+	write_len += ns->service_len;
+	memcpy((void *)((char *)write_buf + write_len), name,
+	       ns->name_len);
+	write_len += ns->name_len;
+
+	sockfd = util_ns_connect_server(ns, server);
+	if (sockfd == INVALID_SOCKET) {
+		ret = -FI_ENODATA;
+		goto err2;
+	}
+
+	ret = util_ns_write_socket_op(sockfd, write_buf, write_len);
+	ret = ((ret == write_len) ? FI_SUCCESS : -FI_ENODATA);
+
+	ofi_close_socket(sockfd);
+err2:
+	free(write_buf);
+err1:
+	return ret;
+}
+
+int ofi_ns_del_local_name(struct util_ns *ns, void *service, void *name)
+{
+	SOCKET sockfd;
+	int ret;
+	const char *server_hostname = (ns->ns_hostname ?
+		ns->ns_hostname : OFI_NS_DEFAULT_HOSTNAME);
+	void *write_buf;
+	size_t write_len = 0;
+	struct util_ns_cmd cmd = {
+		.op = OFI_UTIL_NS_DEL,
+		.status = 0,
+	};
+
+	write_buf = calloc(cmd_len + ns->service_len + ns->name_len, 1);
+	if (!write_buf) {
+		ret = -FI_ENOMEM;
+		goto err1;
+	}
+
+	memcpy(write_buf, &cmd, cmd_len);
+	write_len += cmd_len;
+	memcpy((void *)((char *)write_buf + write_len), service,
+	       ns->service_len);
+	write_len += ns->service_len;
+	memcpy((void *)((char *)write_buf + write_len), name,
+	       ns->name_len);
+	write_len += ns->name_len;
+
+	sockfd = util_ns_connect_server(ns, server_hostname);
+	if (sockfd == INVALID_SOCKET) {
+		ret = -FI_ENODATA;
+		goto err2;
+	}
+
+	ret = util_ns_write_socket_op(sockfd, write_buf, write_len);
+	ret = ((ret == write_len) ? FI_SUCCESS : -FI_ENODATA);
+
+	ofi_close_socket(sockfd);
+err2:
+	free(write_buf);
+err1:
+	return ret;
+}
+
+void *ofi_ns_resolve_name(struct util_ns *ns, const char *server_hostname,
+			  void *service)
+{
+	void *dest_addr = NULL, *io_buf;
+	size_t io_len = 0;
+	SOCKET sockfd;
+	ssize_t ret = 0;
+	struct util_ns_cmd cmd = {
+		.op = OFI_UTIL_NS_QUERY,
+		.status = 0,
+	};
+
+	sockfd = util_ns_connect_server(ns, server_hostname);
+	if (sockfd == INVALID_SOCKET)
+		goto err1;
+
+	io_buf = calloc(cmd_len + ns->service_len, 1);
+	if (!io_buf)
+		goto err2;
+
+	memcpy(io_buf, &cmd, cmd_len);
+	io_len += cmd_len;
+	memcpy((void *)((char *)io_buf + io_len), service,
+	       ns->service_len);
+	io_len += ns->service_len;
+
+	ret = util_ns_write_socket_op(sockfd, io_buf, io_len);
+	if (ret < 0)
+		goto err3;
+
+	free(io_buf);
+
+	io_len = ns->service_len + ns->name_len;
+	io_buf = calloc(io_len, 1);
+	if (!io_buf)
+		goto err2;
+
+	ret = util_ns_read_socket_op(sockfd, &cmd, cmd_len);
+	if (ret < 0 || cmd.status)
+		goto err3;
+
+	ret = util_ns_read_socket_op(sockfd, io_buf, io_len);
+	if (ret == io_len) {
+		dest_addr = calloc(ns->name_len, 1);
+		if (!dest_addr)
+			goto err3;
+		io_len = 0;
+		memcpy(service, (void *)((char *)io_buf + io_len),
+		       ns->service_len);
+		io_len += ns->service_len;
+		memcpy(dest_addr, (void *)((char *)io_buf + io_len),
+		       ns->name_len);
+	}
+
+err3:
+	free(io_buf);
+err2:
+	ofi_close_socket(sockfd);
+err1:
+	return dest_addr;
+}
+
+/*
+ * Name server API: server side
+ */
+
+void ofi_ns_start_server(struct util_ns *ns)
+{
+	int ret;
+	SOCKET sockfd;
+	int sleep_usec = 1000;
+	char *server_hostname = (ns->ns_hostname ?
+		ns->ns_hostname : OFI_NS_DEFAULT_HOSTNAME);
+
+	ofi_osd_init();
+
+	ret = pthread_create(&ns->ns_thread, NULL,
+			     util_ns_name_server_func, (void *)ns);
+	if (ret) {
+		/*
+		 * use the main thread's ID as invalid
+		 * value for the new thread
+		 */
+		ns->ns_thread = pthread_self();
+	}
+
+	/*
+	 * Wait for the local name server to come up. It could be the thread
+	 * created above, or the thread created by another process on the same
+	 * node. The total wait time is about (1+2+4+...+8192)ms = 16 seconds.
+	 */
+	while (sleep_usec < 10000) {
+		sockfd = util_ns_connect_server(ns, server_hostname);
+		if (sockfd != INVALID_SOCKET) {
+			ofi_close_socket(sockfd);
+			return;
+		}
+		usleep(sleep_usec);
+		sleep_usec *= 2;
+	}
+}
+
+void ofi_ns_stop_server(struct util_ns *ns)
+{
+	ofi_osd_fini();
+
+	if (pthread_equal(ns->ns_thread, pthread_self()))
+		return;
+
+	(void) pthread_cancel(ns->ns_thread);
+	(void) pthread_join(ns->ns_thread, NULL);
+}
+
+int ofi_ns_init(struct util_ns_attr *attr, struct util_ns *ns)
+{
+	if (!ns || !attr || !attr->name_len ||
+	    !attr->service_len || !attr->service_cmp)
+		return -FI_EINVAL;
+
+	ns->name_len = attr->name_len;
+	ns->service_len = attr->service_len;
+	ns->service_cmp = attr->service_cmp;
+	ns->is_service_wildcard = attr->is_service_wildcard;
+	ns->ns_port = attr->ns_port;
+	if (attr->ns_hostname)
+		ns->ns_hostname = strdup(attr->ns_hostname);
+
+	return FI_SUCCESS;
+}
diff --git a/prov/util/src/util_poll.c b/prov/util/src/util_poll.c
index 2ec0ca3..ed4fd2b 100644
--- a/prov/util/src/util_poll.c
+++ b/prov/util/src/util_poll.c
@@ -133,11 +133,11 @@ static int util_poll_close(struct fid *fid)
 	struct util_poll *pollset;
 
 	pollset = container_of(fid, struct util_poll, poll_fid.fid);
-	if (atomic_get(&pollset->ref))
+	if (ofi_atomic_get32(&pollset->ref))
 		return -FI_EBUSY;
 
 	if (pollset->domain)
-		atomic_dec(&pollset->domain->ref);
+		ofi_atomic_dec32(&pollset->domain->ref);
 	free(pollset);
 	return 0;
 }
@@ -183,7 +183,7 @@ int fi_poll_create_(const struct fi_provider *prov, struct fid_domain *domain,
 		return -FI_ENOMEM;
 
 	pollset->prov = prov;
-	atomic_initialize(&pollset->ref, 0);
+	ofi_atomic_initialize32(&pollset->ref, 0);
 	dlist_init(&pollset->fid_list);
 	fastlock_init(&pollset->lock);
 
@@ -195,7 +195,7 @@ int fi_poll_create_(const struct fi_provider *prov, struct fid_domain *domain,
 	if (domain) {
 		pollset->domain = container_of(domain, struct util_domain,
 					       domain_fid);
-		atomic_inc(&pollset->domain->ref);
+		ofi_atomic_inc32(&pollset->domain->ref);
 	}
 
 	*poll_fid = &pollset->poll_fid;
diff --git a/prov/util/src/util_wait.c b/prov/util/src/util_wait.c
index 287768d..3fce4ad 100644
--- a/prov/util/src/util_wait.c
+++ b/prov/util/src/util_wait.c
@@ -71,8 +71,8 @@ int ofi_trywait(struct fid_fabric *fabric, struct fid **fids, int count)
 	return 0;
 }
 
-int fi_check_wait_attr(const struct fi_provider *prov,
-		       const struct fi_wait_attr *attr)
+int ofi_check_wait_attr(const struct fi_provider *prov,
+		        const struct fi_wait_attr *attr)
 {
 	switch (attr->wait_obj) {
 	case FI_WAIT_UNSPEC:
@@ -96,14 +96,14 @@ int fi_wait_cleanup(struct util_wait *wait)
 {
 	int ret;
 
-	if (atomic_get(&wait->ref))
+	if (ofi_atomic_get32(&wait->ref))
 		return -FI_EBUSY;
 
 	ret = fi_close(&wait->pollset->poll_fid.fid);
 	if (ret)
 		return ret;
 
-	atomic_dec(&wait->fabric->ref);
+	ofi_atomic_dec32(&wait->fabric->ref);
 	return 0;
 }
 
@@ -115,7 +115,7 @@ int fi_wait_init(struct util_fabric *fabric, struct fi_wait_attr *attr,
 	int ret;
 
 	wait->prov = fabric->prov;
-	atomic_initialize(&wait->ref, 0);
+	ofi_atomic_initialize32(&wait->ref, 0);
 	wait->wait_fid.fid.fclass = FI_CLASS_WAIT;
 
 	switch (attr->wait_obj) {
@@ -138,7 +138,7 @@ int fi_wait_init(struct util_fabric *fabric, struct fi_wait_attr *attr,
 
 	wait->pollset = container_of(poll_fid, struct util_poll, poll_fid);
 	wait->fabric = fabric;
-	atomic_inc(&fabric->ref);
+	ofi_atomic_inc32(&fabric->ref);
 	return 0;
 }
 
@@ -244,7 +244,7 @@ static int util_verify_wait_fd_attr(const struct fi_provider *prov,
 {
 	int ret;
 
-	ret = fi_check_wait_attr(prov, attr);
+	ret = ofi_check_wait_attr(prov, attr);
 	if (ret)
 		return ret;
 
diff --git a/prov/verbs/Makefile.include b/prov/verbs/Makefile.include
index 219f0e0..c21ccf6 100644
--- a/prov/verbs/Makefile.include
+++ b/prov/verbs/Makefile.include
@@ -4,7 +4,6 @@ _verbs_files = \
 	prov/verbs/src/fi_verbs.c \
 	prov/verbs/src/uthash.h \
 	prov/verbs/src/verbs_atomic.c \
-	prov/verbs/src/verbs_av.c \
 	prov/verbs/src/verbs_cm.c \
 	prov/verbs/src/verbs_cq.c \
 	prov/verbs/src/verbs_srq.c \
diff --git a/prov/verbs/configure.m4 b/prov/verbs/configure.m4
index 7b04c7d..4e47f38 100644
--- a/prov/verbs/configure.m4
+++ b/prov/verbs/configure.m4
@@ -11,6 +11,7 @@ AC_DEFUN([FI_VERBS_CONFIGURE],[
 	# Determine if we can support the verbs provider
 	verbs_ibverbs_happy=0
 	verbs_rdmacm_happy=0
+	verbs_ibverbs_exp_happy=0
 	AS_IF([test x"$enable_verbs" != x"no"],
 	      [FI_CHECK_PACKAGE([verbs_ibverbs],
 				[infiniband/verbs.h],
@@ -22,6 +23,16 @@ AC_DEFUN([FI_VERBS_CONFIGURE],[
 				[FI_VERBS_DOUBLE_CHECK_LIBIBVERBS],
 				[verbs_ibverbs_happy=0])
 
+	      FI_CHECK_PACKAGE([verbs_ibverbs],
+				[infiniband/verbs_exp.h],
+				[ibverbs],
+				[ibv_open_device],
+				[],
+				[$verbs_PREFIX],
+				[$verbs_LIBDIR],
+				[verbs_ibverbs_exp_happy=1],
+				[verbs_ibverbs_exp_happy=0])
+
 	       FI_CHECK_PACKAGE([verbs_rdmacm],
 				[rdma/rsocket.h],
 				[rdmacm],
@@ -33,9 +44,27 @@ AC_DEFUN([FI_VERBS_CONFIGURE],[
 				[verbs_rdmacm_happy=0])
 	      ])
 
+	AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
+			   [
+			    #include <infiniband/verbs_exp.h>
+			   ],
+			   [
+			    return (IBV_EXP_DEVICE_ATTR_ODP | IBV_EXP_DEVICE_ODP);
+			   ])
+			  ],
+			  [verbs_ibverbs_exp_happy=1],
+			  [verbs_ibverbs_exp_happy=0])
+
 	AS_IF([test $verbs_ibverbs_happy -eq 1 && \
 	       test $verbs_rdmacm_happy -eq 1], [$1], [$2])
 
+	AS_IF([test $verbs_ibverbs_happy -eq 1 && \
+	       test $verbs_rdmacm_happy -eq 1 && \
+	       test $verbs_ibverbs_exp_happy -eq 1],
+		[AC_DEFINE([HAVE_VERBS_EXP_H], [1],
+			   [Experimental verbs features support])],
+		[])
+
 	# Technically, verbs_ibverbs_CPPFLAGS and
 	# verbs_rdmacm_CPPFLAGS could be different, but it is highly
 	# unlikely that they ever will be.  So only list
diff --git a/prov/verbs/libfabric-verbs.spec.in b/prov/verbs/libfabric-verbs.spec.in
new file mode 100644
index 0000000..cd9357d
--- /dev/null
+++ b/prov/verbs/libfabric-verbs.spec.in
@@ -0,0 +1,52 @@
+%{!?configopts: %global configopts LDFLAGS=-Wl,--build-id}
+%{!?provider: %define provider verbs}
+%{!?provider_formal: %define provider_formal verbs}
+
+Name: libfabric-%{provider}
+Version: @VERSION@
+Release: 1%{?dist}
+Summary: Dynamic %{provider_formal} provider for user-space Open Fabric Interfaces
+Group: System Environment/Libraries
+License: GPLv2 or BSD
+Url: http://www.github.com/ofiwg/libfabric
+Source: http://www.github.org/ofiwg/%{name}/releases/download/v{%version}/libfabric-%{version}.tar.bz2
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+Requires: libfabric
+BuildRequires: libfabric
+
+%description
+libfabric provides a user-space API to access high-performance fabric
+services, such as RDMA.
+
+This RPM provides the %{provider_formal} provider as a "plugin" to an existing
+libfabric installation.  This plugin will override older %{provider_formal}
+provider functionality in the existing libfabric installation.
+
+%prep
+%setup -q -n libfabric-%{version}
+
+%build
+%configure %{configopts} --enable-%{provider}=dl
+make %{?_smp_mflags}
+
+%install
+rm -rf %{buildroot}
+%makeinstall installdirs
+
+%clean
+rm -rf %{buildroot}
+
+%files
+%defattr(-,root,root,-)
+%{_libdir}/libfabric/*.so
+
+%exclude %{_libdir}/libfabric.*
+%exclude %{_libdir}/libfabric/*.la
+%exclude %{_libdir}/pkgconfig
+%exclude %{_bindir}
+%exclude %{_mandir}
+%exclude %{_includedir}
+
+%changelog
+* Wed May 24 2017 Open Fabrics Interfaces Working Group <ofiwg at lists.openfabrics.org>
+- First release of specfile for packaging a single dl provider.
diff --git a/prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c b/prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c
index ae584c6..1f4299b 100644
--- a/prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c
+++ b/prov/verbs/src/ep_rdm/verbs_av_ep_rdm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2013-2016 Intel Corporation, Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -31,6 +31,12 @@
  */
 
 #include <arpa/inet.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <ctype.h>
+
+#include "fi.h"
 
 #include "verbs_rdm.h"
 
@@ -56,6 +62,7 @@ fi_ibv_rdm_start_connection(struct fi_ibv_rdm_ep *ep,
 	}
 
 	conn->state = FI_VERBS_CONN_STARTED;
+	fi_ibv_rdm_conn_init_cm_role(conn, ep);
 
 	if (rdma_create_id(ep->domain->rdm_cm->ec, &id, conn, RDMA_PS_TCP)) {
 		VERBS_INFO_ERRNO(FI_LOG_AV, "rdma_create_id\n", errno);
@@ -75,13 +82,33 @@ fi_ibv_rdm_start_connection(struct fi_ibv_rdm_ep *ep,
 	return FI_SUCCESS;
 }
 
+ssize_t
+fi_ibv_rdm_start_overall_disconnection(struct fi_ibv_rdm_av_entry *av_entry)
+{
+	struct fi_ibv_rdm_conn *conn = NULL, *tmp = NULL;
+	ssize_t ret = FI_SUCCESS;
+	ssize_t err = FI_SUCCESS;
+
+	HASH_ITER(hh, av_entry->conn_hash, conn, tmp) {
+		ret = fi_ibv_rdm_start_disconnection(conn);
+		if (ret) {
+			VERBS_INFO(FI_LOG_AV, "Disconnection failed "
+				   "(%d) for %p\n", ret, conn);
+			err = ret;
+		}
+		HASH_DEL(av_entry->conn_hash, conn);
+	}
+
+	return err;
+}
+
 ssize_t fi_ibv_rdm_start_disconnection(struct fi_ibv_rdm_conn *conn)
 {
 	ssize_t ret = FI_SUCCESS;
 	ssize_t err = FI_SUCCESS;
 
-	FI_INFO(&fi_ibv_prov, FI_LOG_AV,
-		"Closing connection %p, state %d\n", conn, conn->state);
+	VERBS_INFO(FI_LOG_AV, "Closing connection %p, state %d\n",
+		   conn, conn->state);
 
 	if (conn->id[0]) {
 		if (rdma_disconnect(conn->id[0])) {
@@ -93,7 +120,6 @@ ssize_t fi_ibv_rdm_start_disconnection(struct fi_ibv_rdm_conn *conn)
 	switch (conn->state) {
 	case FI_VERBS_CONN_ALLOCATED:
 	case FI_VERBS_CONN_REMOTE_DISCONNECT:
-		err = fi_ibv_rdm_conn_cleanup(conn);
 		ret = (ret == FI_SUCCESS) ? err : ret;
 		break;
 	case FI_VERBS_CONN_ESTABLISHED:
@@ -120,23 +146,31 @@ static int fi_ibv_rdm_av_insert(struct fid_av *av_fid, const void *addr,
                                 uint64_t flags, void *context)
 {
 	struct fi_ibv_av *av = container_of(av_fid, struct fi_ibv_av, av_fid);
-	struct fi_ibv_rdm_ep *ep = av->ep;
 	size_t i;
+	int failed = 0;
 	int ret = 0;
+	int *fi_errors = context;
 
-	if (ep) {
-		pthread_mutex_lock(&ep->cm_lock);
-	}
+	if((av->flags & FI_EVENT) && !av->eq)
+		return -FI_ENOEQ;
+
+	if ((flags & FI_SYNC_ERR) && ((!context) || (flags & FI_EVENT)))
+		return -FI_EINVAL;
+	else if (flags & FI_SYNC_ERR)
+		memset(context, 0, sizeof(int) * count);
+
+	pthread_mutex_lock(&av->domain->rdm_cm->cm_lock);
 
 	if (av->used + count > av->count) {
 		const size_t new_av_count = av->used + count;
 		if (av->type == FI_AV_TABLE) {
-			void *p = realloc(av->domain->rdm_cm->conn_table,
+			void *p = realloc(av->domain->rdm_cm->av_table,
 					  (new_av_count *
-					  sizeof(*av->domain->rdm_cm->conn_table)));
+					  sizeof(*av->domain->rdm_cm->av_table)));
 			if (p) {
-				av->domain->rdm_cm->conn_table = p;
-			} else {
+				av->domain->rdm_cm->av_table = p;
+			}
+			else {
 				ret = -FI_ENOMEM;
 				goto out;
 			}
@@ -145,130 +179,504 @@ static int fi_ibv_rdm_av_insert(struct fid_av *av_fid, const void *addr,
 	}
 
 	for (i = 0; i < count; i++) {
-		struct fi_ibv_rdm_conn *conn = NULL;
+		struct fi_ibv_rdm_av_entry *av_entry = NULL;
 		void *addr_i = (uint8_t *) addr +
-			i * (ep ? ep->addrlen : FI_IBV_RDM_DFLT_ADDRLEN);
+			i * FI_IBV_RDM_DFLT_ADDRLEN;
+
+		if (flags & FI_SYNC_ERR)
+			fi_errors[i] = FI_SUCCESS;
 
 		if (!fi_ibv_rdm_av_is_valid_address(addr_i)) {
-			if (fi_addr) {
+			if (fi_addr)
 				fi_addr[i] = FI_ADDR_NOTAVAIL;
-			}
 
-			FI_INFO(&fi_ibv_prov, FI_LOG_AV,
-				"fi_av_insert: bad addr #%i\n", i);
+			VERBS_INFO(FI_LOG_AV,
+				   "fi_av_insert: bad addr #%i\n", i);
+
+			if (av->flags & FI_EVENT) {
+				/* due to limited functionality of
+				 * verbs EQ notify last failed element
+				 * only. */
+				/* TODO: what about utils EQ? */
+				struct fi_eq_err_entry err = {
+					.fid = &av->av_fid.fid,
+					.context = context,
+					.data = i,
+					.err = FI_EINVAL,
+					.prov_errno = FI_EINVAL
+				};
+				av->eq->err = err;
+				failed++;
+			} else if (flags & FI_SYNC_ERR) {
+				fi_errors[i] = -FI_EADDRNOTAVAIL;
+			}
 
 			continue;
 		}
 
-		HASH_FIND(hh, av->domain->rdm_cm->conn_hash, addr_i,
-			  FI_IBV_RDM_DFLT_ADDRLEN, conn);
+		HASH_FIND(hh, av->domain->rdm_cm->av_hash, addr_i,
+			  FI_IBV_RDM_DFLT_ADDRLEN, av_entry);
 
-		if (!conn) {
+		if (!av_entry) {
 			/* If addr_i is not found in HASH then we malloc it.
-			 * It could be found if the connection was initiated by the remote
-			 * side.
+			 * It could be found if the connection was initiated
+			 * by the remote side.
 			 */
-			conn = memalign(FI_IBV_RDM_MEM_ALIGNMENT, sizeof *conn);
-			if (!conn) {
-				ret = -FI_ENOMEM;
+			ret = -ofi_memalign((void**)&av_entry,
+					    FI_IBV_RDM_MEM_ALIGNMENT,
+					    sizeof *av_entry);
+			if (ret)
 				goto out;
-			}
-
-			memset(conn, 0, sizeof *conn);
-			dlist_init(&conn->postponed_requests_head);
-			conn->state = FI_VERBS_CONN_ALLOCATED;
-			memcpy(&conn->addr, addr_i, FI_IBV_RDM_DFLT_ADDRLEN);
-			HASH_ADD(hh, av->domain->rdm_cm->conn_hash, addr,
-				 FI_IBV_RDM_DFLT_ADDRLEN, conn);
-		}
-
-		if (ep) {
-			fi_ibv_rdm_conn_init_cm_role(conn, ep);
+			memset(av_entry, 0, sizeof *av_entry);
+			memcpy(&av_entry->addr, addr_i, FI_IBV_RDM_DFLT_ADDRLEN);
+			HASH_ADD(hh, av->domain->rdm_cm->av_hash, addr,
+				 FI_IBV_RDM_DFLT_ADDRLEN, av_entry);
 		}
 
-
 		switch (av->type) {
 		case FI_AV_MAP:
-			if (fi_addr) {
-				fi_addr[i] = (uintptr_t) (void *) conn;
-			}
+			if (fi_addr)
+				fi_addr[i] = (uintptr_t) (void *) av_entry;
 			break;
 		case FI_AV_TABLE:
-			if (fi_addr) {
+			if (fi_addr)
 				fi_addr[i] = av->used;
-			}
-			av->domain->rdm_cm->conn_table[av->used] = conn;
+			av->domain->rdm_cm->av_table[av->used] = av_entry;
 			break;
 		default:
 			assert(0);
 			break;
 		}
 
-		FI_INFO(&fi_ibv_prov, FI_LOG_AV, "fi_av_insert: addr %s:%u conn %p %d\n",
-			inet_ntoa(conn->addr.sin_addr),
-			ntohs(conn->addr.sin_port), conn, conn->cm_role);
+		VERBS_INFO(FI_LOG_AV,
+			   "fi_av_insert: addr %s:%u; av_entry - %p\n",
+			   inet_ntoa(av_entry->addr.sin_addr),
+			   ntohs(av_entry->addr.sin_port), av_entry);
 
 		av->used++;
 		ret++;
 	}
 
+	if (av->flags & FI_EVENT) {
+		struct fi_eq_entry entry = {
+			.fid = &av->av_fid.fid,
+			.context = context,
+			.data = count - failed
+		};
+		fi_ibv_eq_write_event(
+			av->eq, FI_AV_COMPLETE, &entry, sizeof(entry));
+	}
+
 out:
-	if (ep) {
-		pthread_mutex_unlock(&ep->cm_lock);
+	pthread_mutex_unlock(&av->domain->rdm_cm->cm_lock);
+	return (av->flags & FI_EVENT) ? FI_SUCCESS : (ret - failed);
+}
+
+static int fi_ibv_rdm_av_insertsvc(struct fid_av *av_fid, const char *node,
+				   const char *service, fi_addr_t *fi_addr,
+				   uint64_t flags, void *context)
+{
+	struct addrinfo addrinfo_hints;
+	struct addrinfo *result = NULL;
+	int ret;
+
+	if (!node || !service) {
+		VERBS_WARN(FI_LOG_AV, "fi_av_insertsvc: %s provided\n",
+			   (!node ? (!service ? "node and service weren't" :
+						"node wasn't") :
+				    ("service wasn't")));
+		return -FI_EINVAL;
 	}
+
+	struct fi_ibv_av *av = container_of(av_fid, struct fi_ibv_av, av_fid);
+
+	memset(&addrinfo_hints, 0, sizeof(addrinfo_hints));
+	addrinfo_hints.ai_family = AF_INET;
+	ret = getaddrinfo(node, service, &addrinfo_hints, &result);
+	if (ret) {
+		if ((av->flags & FI_EVENT) && (av->eq)) {
+			struct fi_eq_entry entry = {
+				.fid = &av->av_fid.fid,
+				.context = context,
+				.data = 0
+			};
+			struct fi_eq_err_entry err = {
+				.fid = &av->av_fid.fid,
+				.context = context,
+				.data = 0,
+				.err = FI_EINVAL,
+				.prov_errno = FI_EINVAL
+			};
+			av->eq->err = err;
+
+			fi_ibv_eq_write_event(
+				av->eq, FI_AV_COMPLETE,
+				&entry, sizeof(entry));
+		}
+		return -ret;
+	}
+
+	ret = fi_ibv_rdm_av_insert(av_fid, (struct sockaddr_in *)result->ai_addr,
+				   1, fi_addr, flags, context);
+	freeaddrinfo(result);
 	return ret;
 }
 
-static int fi_ibv_rdm_av_remove(struct fid_av *av_fid, fi_addr_t * fi_addr,
+static int fi_ibv_rdm_av_insertsym(struct fid_av *av, const char *node,
+				   size_t nodecnt, const char *service,
+				   size_t svccnt, fi_addr_t *fi_addr,
+				   uint64_t flags, void *context)
+{
+	int ret = 0, success = 0, err_code = 0;
+	int var_port, var_host, len_port, len_host;
+	char base_host[FI_NAME_MAX] = {0};
+	char tmp_host[FI_NAME_MAX] = {0};
+	char tmp_port[FI_NAME_MAX] = {0};
+	int hostlen, offset = 0, fmt;
+	size_t i, j;
+
+	if (!node || !service || node[0] == '\0') {
+		VERBS_WARN(FI_LOG_AV, "fi_av_insertsym: %s provided\n",
+			   (!service ? (!node ? "node and service weren't" :
+						"service wasn't") :
+				    ("node wasn't")));
+		return -FI_EINVAL;
+	}
+
+	hostlen = strlen(node);
+	while (isdigit(*(node + hostlen - (offset + 1))))
+		offset++;
+
+	if (*(node + hostlen - offset) == '.')
+		fmt = 0;
+	else
+		fmt = offset;
+
+	assert((hostlen-offset) < FI_NAME_MAX);
+	strncpy(base_host, node, hostlen - (offset));
+	var_port = atoi(service);
+	var_host = atoi(node + hostlen - offset);
+
+	for (i = 0; i < nodecnt; i++) {
+		for (j = 0; j < svccnt; j++) {
+			int check_host = 0, check_port = 0;
+
+			len_host = snprintf(tmp_host, FI_NAME_MAX, "%s%0*d",
+					    base_host, fmt,
+					    var_host + (int)i);
+			len_port = snprintf(tmp_port, FI_NAME_MAX,  "%d",
+					    var_port + (int)j);
+
+			check_host = (len_host > 0 && len_host < FI_NAME_MAX);
+			check_port = (len_port > 0 && len_port < FI_NAME_MAX);
+
+			if (check_port && check_host) {
+				ret = fi_ibv_rdm_av_insertsvc(av, tmp_host,
+							      tmp_port, fi_addr,
+							      flags, context);
+				if (ret == 1)
+					success++;
+				else
+					err_code = ret;
+			} else {
+				VERBS_WARN(FI_LOG_AV,
+					   "fi_av_insertsym: %s is invalid\n",
+					   (!check_port ?
+					    (!check_host ?
+					     "node and service weren't" :
+					     "service wasn't") :
+					    ("node wasn't")));
+				err_code = FI_ETOOSMALL;
+			}
+		}
+	}
+	return ((success > 0) ? success : err_code);
+}
+
+static int fi_ibv_rdm_av_lookup(struct fid_av *av_fid, fi_addr_t fi_addr,
+				void *addr, size_t *addrlen)
+{
+	struct fi_ibv_av *av = container_of(av_fid, struct fi_ibv_av, av_fid);
+	struct fi_ibv_rdm_av_entry *av_entry = NULL;
+
+	if (fi_addr == FI_ADDR_NOTAVAIL)
+		return -FI_EINVAL;
+
+	if (av->type == FI_AV_MAP)
+		av_entry = (struct fi_ibv_rdm_av_entry *) fi_addr;
+	else /* (av->type == FI_AV_TABLE) */
+		av_entry = av->domain->rdm_cm->av_table[fi_addr];
+
+	memcpy(addr, &av_entry->addr, MIN(*addrlen, sizeof(av_entry->addr)));
+	*addrlen = sizeof(av_entry->addr);
+
+	return 0;
+}
+
+static int fi_ibv_rdm_av_remove(struct fid_av *av_fid, fi_addr_t *fi_addr,
                                 size_t count, uint64_t flags)
 {
 	struct fi_ibv_av *av = container_of(av_fid, struct fi_ibv_av, av_fid);
-	struct fi_ibv_rdm_conn *conn = NULL;
+	struct fi_ibv_rdm_av_entry *av_entry = NULL;
 	int ret = FI_SUCCESS;
 	int err = FI_SUCCESS;
-	int i;
+	size_t i;
+
+	if(av->flags & FI_EVENT && !av->eq)
+		return -FI_ENOEQ;
 
-	if (!fi_addr || (av->type != FI_AV_MAP && av->type != FI_AV_TABLE)) {
+	if (!fi_addr || (av->type != FI_AV_MAP && av->type != FI_AV_TABLE))
 		return -FI_EINVAL;
-	}
 
-	if (av->ep) {
-		pthread_mutex_lock(&av->ep->cm_lock);
-	}
+	pthread_mutex_lock(&av->domain->rdm_cm->cm_lock);
 
 	for (i = 0; i < count; i++) {
 
-		if (fi_addr[i] == FI_ADDR_NOTAVAIL) {
+		if (fi_addr[i] == FI_ADDR_NOTAVAIL)
 			continue;
-		}
 
-		if (av->type == FI_AV_MAP) {
-			conn = (struct fi_ibv_rdm_conn *) fi_addr[i];
-		} else { /* (av->type == FI_AV_TABLE) */
-			conn = av->domain->rdm_cm->conn_table[fi_addr[i]];
-		}
+		if (av->type == FI_AV_MAP)
+			av_entry = (struct fi_ibv_rdm_av_entry *)fi_addr[i];
+		else /* (av->type == FI_AV_TABLE) */
+			av_entry = av->domain->rdm_cm->av_table[fi_addr[i]];
 
-		FI_INFO(&fi_ibv_prov, FI_LOG_AV, "av_remove conn %p, addr %s:%u\n",
-			conn, inet_ntoa(conn->addr.sin_addr),
-			ntohs(conn->addr.sin_port));
-		HASH_DEL(av->domain->rdm_cm->conn_hash, conn);
-		err = fi_ibv_rdm_start_disconnection(conn);
+		VERBS_INFO(FI_LOG_AV, "av_remove conn - %p; addr %s:%u\n",
+			   av_entry, inet_ntoa(av_entry->addr.sin_addr),
+			   ntohs(av_entry->addr.sin_port));
+
+		err = fi_ibv_rdm_start_overall_disconnection(av_entry);
 		ret = (ret == FI_SUCCESS) ? err : ret;
+		/* do not destroy connection here because we may
+		 * get WC for this connection. just move connection
+		 * to list of av-removed objects to clean later */
+
+		/* TODO: add cleaning into av_insert */
+		HASH_DEL(av->domain->rdm_cm->av_hash, av_entry);
+		slist_insert_tail(&av_entry->removed_next,
+				  &av->domain->rdm_cm->av_removed_entry_head);
 	}
 
-	if (av->ep) {
-		pthread_mutex_unlock(&av->ep->cm_lock);
-	}
+	pthread_mutex_unlock(&av->domain->rdm_cm->cm_lock);
 	return ret;
 }
 
+static const char *fi_ibv_rdm_av_straddr(struct fid_av *av, const void *addr,
+					 char *buf, size_t *len)
+{
+	return ofi_straddr(buf, len, FI_SOCKADDR, addr);
+}
+
 static struct fi_ops_av fi_ibv_rdm_av_ops = {
 	.size = sizeof(struct fi_ops_av),
 	.insert = fi_ibv_rdm_av_insert,
+	.insertsvc = fi_ibv_rdm_av_insertsvc,
+	.insertsym = fi_ibv_rdm_av_insertsym,
 	.remove = fi_ibv_rdm_av_remove,
+	.lookup = fi_ibv_rdm_av_lookup,
+	.straddr = fi_ibv_rdm_av_straddr,
 };
 
 struct fi_ops_av *fi_ibv_rdm_set_av_ops(void)
 {
 	return &fi_ibv_rdm_av_ops;
 }
+
+static int fi_ibv_rdm_av_close(fid_t fid)
+{
+	struct fi_ibv_av *av = container_of(fid, struct fi_ibv_av, av_fid.fid);
+	free(av);
+	return 0;
+}
+
+static struct fi_ops fi_ibv_fi_ops = {
+	.size = sizeof(struct fi_ops),
+	.close = fi_ibv_rdm_av_close,
+	.bind = fi_no_bind,
+};
+
+static inline struct fi_ibv_rdm_av_entry *
+fi_ibv_rdm_av_tbl_idx_to_av_entry(struct fi_ibv_rdm_ep *ep, fi_addr_t addr)
+{
+	return (addr == FI_ADDR_UNSPEC) ? NULL :
+		ep->domain->rdm_cm->av_table[addr];
+}
+
+static inline struct fi_ibv_rdm_av_entry *
+fi_ibv_rdm_av_map_addr_to_av_entry(struct fi_ibv_rdm_ep *ep, fi_addr_t addr)
+{
+	return (struct fi_ibv_rdm_av_entry *)
+		(addr == FI_ADDR_UNSPEC ? NULL : (void *)(uintptr_t)addr);
+}
+
+static inline fi_addr_t
+fi_ibv_rdm_av_entry_to_av_tbl_idx(struct fi_ibv_rdm_ep *ep,
+				  struct fi_ibv_rdm_av_entry *av_entry)
+{
+	size_t i;
+
+	for (i = 0; i < ep->av->used; i++) {
+		if (ep->domain->rdm_cm->av_table[i] == av_entry) {
+			return i;
+		}
+	}
+
+	return FI_ADDR_UNSPEC;
+}
+
+static inline fi_addr_t
+fi_ibv_rdm_av_entry_to_av_map_addr(struct fi_ibv_rdm_ep *ep,
+				   struct fi_ibv_rdm_av_entry *av_entry)
+{
+	return (av_entry == NULL) ? FI_ADDR_UNSPEC :
+	       (fi_addr_t)(uintptr_t)av_entry;
+}
+
+static inline fi_addr_t
+fi_ibv_rdm_conn_to_av_tbl_idx(struct fi_ibv_rdm_ep *ep,
+			      struct fi_ibv_rdm_conn *conn)
+{
+	if (conn == NULL)
+		return FI_ADDR_UNSPEC;
+	return fi_ibv_rdm_av_entry_to_av_tbl_idx(ep, conn->av_entry);
+}
+
+static inline fi_addr_t
+fi_ibv_rdm_conn_to_av_map_addr(struct fi_ibv_rdm_ep *ep,
+			       struct fi_ibv_rdm_conn *conn)
+{
+    return fi_ibv_rdm_av_entry_to_av_map_addr(ep, conn->av_entry);
+}
+
+static inline struct fi_ibv_rdm_conn *
+fi_ibv_rdm_av_map_addr_to_conn_add_new_conn(struct fi_ibv_rdm_ep *ep,
+					    fi_addr_t addr)
+{
+	struct fi_ibv_rdm_conn *conn = NULL;
+	struct fi_ibv_rdm_av_entry *av_entry =
+		fi_ibv_rdm_av_map_addr_to_av_entry(ep, addr);
+	if (av_entry) {
+		HASH_FIND(hh, av_entry->conn_hash,
+			  &ep, sizeof(struct fi_ibv_rdm_ep *), conn);
+		if (!conn) {
+			if (ofi_memalign((void**)&conn,
+					 FI_IBV_RDM_MEM_ALIGNMENT,
+					 sizeof(*conn)))
+				return NULL;
+			memset(conn, 0, sizeof(*conn));
+		    	memcpy(&conn->addr, &av_entry->addr,
+			       FI_IBV_RDM_DFLT_ADDRLEN);
+			conn->ep = ep;
+			conn->av_entry = av_entry;
+			conn->state = FI_VERBS_CONN_ALLOCATED;
+			dlist_init(&conn->postponed_requests_head);
+			HASH_ADD(hh, av_entry->conn_hash, ep,
+				 sizeof(struct fi_ibv_rdm_ep *), conn);
+		}
+	}
+
+	return conn;
+}
+
+static inline struct fi_ibv_rdm_conn *
+fi_ibv_rdm_av_tbl_idx_to_conn_add_new_conn(struct fi_ibv_rdm_ep *ep,
+					   fi_addr_t addr)
+{
+	struct fi_ibv_rdm_conn *conn = NULL;
+	struct fi_ibv_rdm_av_entry *av_entry =
+		fi_ibv_rdm_av_tbl_idx_to_av_entry(ep, addr);
+	if (av_entry) {
+		HASH_FIND(hh, av_entry->conn_hash,
+			  &ep, sizeof(struct fi_ibv_rdm_ep *), conn);
+		if (!conn) {
+			if (ofi_memalign((void**)&conn,
+					 FI_IBV_RDM_MEM_ALIGNMENT,
+					 sizeof(*conn)))
+				return NULL;
+			memset(conn, 0, sizeof(*conn));
+		    	memcpy(&conn->addr, &av_entry->addr,
+			       FI_IBV_RDM_DFLT_ADDRLEN);
+			conn->ep = ep;
+			conn->av_entry = av_entry;
+			conn->state = FI_VERBS_CONN_ALLOCATED;
+			dlist_init(&conn->postponed_requests_head);
+			HASH_ADD(hh, av_entry->conn_hash, ep,
+				 sizeof(struct fi_ibv_rdm_ep *), conn);
+		}
+	}
+
+	return conn;
+}
+
+int fi_ibv_rdm_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
+			struct fid_av **av_fid, void *context)
+{
+	struct fi_ibv_domain *fid_domain;
+	struct fi_ibv_av *av;
+	size_t count = 64;
+
+	fid_domain = container_of(domain, struct fi_ibv_domain, domain_fid);
+
+	if (!attr)
+		return -FI_EINVAL;
+
+	if (attr->name) {
+		VERBS_WARN(FI_LOG_AV,
+			   "Shared AV is not implemented\n");
+		return -FI_ENOSYS;
+	}
+
+	switch (attr->type) {
+	case FI_AV_UNSPEC:
+		attr->type = FI_AV_MAP;
+	case FI_AV_MAP:
+	case FI_AV_TABLE:
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	if (attr->count)
+		count = attr->count;
+
+	av = calloc(1, sizeof *av);
+	if (!av)
+		return -ENOMEM;
+
+	assert(fid_domain->rdm);
+	av->domain = fid_domain;
+	av->type = attr->type;
+	av->count = count;
+	av->flags = attr->flags;
+	av->used = 0;
+
+	if (av->type == FI_AV_TABLE && av->count > 0) {
+		av->domain->rdm_cm->av_table =
+			calloc(av->count,
+			       sizeof(*av->domain->rdm_cm->av_table));
+		if (!av->domain->rdm_cm->av_table) {
+			free(av);
+			return -ENOMEM;
+		}
+	}
+
+	if (av->type == FI_AV_MAP) {
+		av->addr_to_av_entry = fi_ibv_rdm_av_map_addr_to_av_entry;
+		av->av_entry_to_addr = fi_ibv_rdm_av_entry_to_av_map_addr;
+		av->addr_to_conn = fi_ibv_rdm_av_map_addr_to_conn_add_new_conn;
+		av->conn_to_addr = fi_ibv_rdm_conn_to_av_map_addr;
+	} else /* if (av->type == FI_AV_TABLE) */ {
+		av->addr_to_av_entry = fi_ibv_rdm_av_tbl_idx_to_av_entry;
+		av->av_entry_to_addr = fi_ibv_rdm_av_entry_to_av_tbl_idx;
+		av->addr_to_conn = fi_ibv_rdm_av_tbl_idx_to_conn_add_new_conn;
+		av->conn_to_addr = fi_ibv_rdm_conn_to_av_tbl_idx;
+	}
+
+	av->av_fid.fid.fclass = FI_CLASS_AV;
+	av->av_fid.fid.context = context;
+	av->av_fid.fid.ops = &fi_ibv_fi_ops;
+
+	av->av_fid.ops = fi_ibv_rdm_set_av_ops();
+
+	*av_fid = &av->av_fid;
+	return 0;
+}
diff --git a/prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c b/prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c
index 455a478..5b4065f 100644
--- a/prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c
+++ b/prov/verbs/src/ep_rdm/verbs_cq_ep_rdm.c
@@ -37,7 +37,6 @@
 #include "../fi_verbs.h"
 #include "verbs_queuing.h"
 
-
 struct util_buf_pool *fi_ibv_rdm_request_pool;
 struct util_buf_pool *fi_ibv_rdm_postponed_pool;
 
@@ -60,16 +59,18 @@ static ssize_t fi_ibv_rdm_tagged_cq_readfrom(struct fid_cq *cq, void *buf,
 	     cq_entry;
 	     cq_entry = (ret < count) ? fi_ibv_rdm_take_first_from_cq(_cq) : NULL)
 	{
-		FI_DBG(&fi_ibv_prov, FI_LOG_CQ,
-			"\t\t-> found in ready: %p op_ctx %p, len %lu, tag 0x%llx\n",
-			cq_entry, cq_entry->context, cq_entry->len,
-			cq_entry->minfo.tag);
+		VERBS_DBG(FI_LOG_CQ,
+			  "\t\t-> found in ready: %p op_ctx %p, len %lu, tag 0x%llx\n",
+			  cq_entry, cq_entry->context, cq_entry->len,
+			  cq_entry->minfo.tag);
 
 		src_addr[ret] =
 			_cq->ep->av->conn_to_addr(_cq->ep, cq_entry->minfo.conn);
 		entry[ret].op_context = cq_entry->context;
 		entry[ret].flags = (cq_entry->comp_flags & ~FI_COMPLETION);
 		entry[ret].len = cq_entry->len;
+		entry[ret].buf = (cq_entry->comp_flags & FI_TRANSMIT) ?
+			cq_entry->src_addr : cq_entry->dest_buf;
 		entry[ret].data = cq_entry->imm;
 		entry[ret].tag = cq_entry->minfo.tag;
 
@@ -87,7 +88,6 @@ static ssize_t fi_ibv_rdm_tagged_cq_readfrom(struct fid_cq *cq, void *buf,
 		if (fi_ibv_rdm_tagged_poll(_cq->ep) < 0) {
 			VERBS_INFO(FI_LOG_CQ, "fi_ibv_rdm_tagged_poll failed\n");
 		}
-
 		if (!dlist_empty(&_cq->request_errcq)) {
 			ret = -FI_EAVAIL;
 		}
@@ -112,12 +112,13 @@ ssize_t fi_ibv_rdm_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 				int timeout)
 {
 	size_t threshold = count;
-	uint64_t time_limit = fi_gettime_ms() + timeout;
+	uint64_t time_limit =
+		((timeout < 0) ? SIZE_MAX : (fi_gettime_ms() + timeout));
 	size_t counter = 0;
 	ssize_t ret = 0;
 	struct fi_cq_tagged_entry *cqe_buf = buf;
-
-	struct fi_ibv_rdm_cq *_cq = container_of(cq, struct fi_ibv_rdm_cq, cq_fid);
+	struct fi_ibv_rdm_cq *_cq = container_of(cq, struct fi_ibv_rdm_cq,
+						 cq_fid);
 	switch (_cq->wait_cond) {
 	case FI_CQ_COND_THRESHOLD:
 		threshold = MIN((uintptr_t) cond, threshold);
@@ -133,8 +134,9 @@ ssize_t fi_ibv_rdm_cq_sreadfrom(struct fid_cq *cq, void *buf, size_t count,
 						    threshold - counter,
 						    src_addr);
 		counter += (ret > 0) ? ret : 0;
-	} while ((ret >= 0) && (counter < threshold ||
-		(timeout >= 0 && fi_gettime_ms() < time_limit)));
+	} while ((ret >= 0 || ret == -FI_EAGAIN) &&
+		 (counter < threshold) &&
+		 (fi_gettime_ms() < time_limit));
 
 	if (counter != 0 && ret >= 0) {
 		ret = counter;
@@ -184,6 +186,7 @@ fi_ibv_rdm_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *entry,
                              uint64_t flags)
 {
 	ssize_t ret = 0;
+	uint32_t api_version;
 	struct fi_ibv_rdm_cq *cq =
 		container_of(cq_fid, struct fi_ibv_rdm_cq, cq_fid.fid);
 
@@ -200,7 +203,13 @@ fi_ibv_rdm_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *entry,
 		entry->olen = -1; /* TODO: */
 		entry->err = err_request->state.err;
 		entry->prov_errno = -err_request->state.err;
-		entry->err_data = NULL;
+
+		api_version = cq->domain->fab->util_fabric.fabric_fid.api_version;
+
+		if (!entry->err_data_size)
+			entry->err_data = NULL;
+		else if (FI_VERSION_GE(api_version, FI_VERSION(1, 5)))
+			entry->err_data_size = 0;
 
 		if (err_request->state.eager == FI_IBV_STATE_EAGER_READY_TO_FREE) {
 			FI_IBV_RDM_DBG_REQUEST("to_pool: ", err_request,
@@ -307,8 +316,8 @@ int fi_ibv_rdm_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		if (param > 0) {
 			_cq->read_bunch_size = param;
 		} else {
-			FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-				"invalid value of rdm_cqread_bunch_size\n");
+			VERBS_INFO(FI_LOG_CORE,
+				   "invalid value of rdm_cqread_bunch_size\n");
 			ret = -FI_EINVAL;
 			goto err;
 		}
diff --git a/prov/verbs/src/ep_rdm/verbs_ep_rdm.c b/prov/verbs/src/ep_rdm/verbs_ep_rdm.c
index 8e31055..ad2cf49 100644
--- a/prov/verbs/src/ep_rdm/verbs_ep_rdm.c
+++ b/prov/verbs/src/ep_rdm/verbs_ep_rdm.c
@@ -169,9 +169,6 @@ static int fi_ibv_rdm_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 		}
 
 		ep->av = av;
-
-		/* TODO: this is wrong, AV to EP is 1:n */
-		ep->av->ep = ep;
 		break;
 	case FI_CLASS_CNTR:
 		cntr = container_of(bfid, struct fi_ibv_rdm_cntr, fid.fid);
@@ -185,19 +182,19 @@ static int fi_ibv_rdm_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 
 		if (flags & FI_SEND) {
 			ep->send_cntr = cntr;
-			atomic_inc(&ep->send_cntr->ep_ref);
+			ofi_atomic_inc32(&ep->send_cntr->ep_ref);
 		}
 		if (flags & FI_RECV) {
 			ep->recv_cntr = cntr;
-			atomic_inc(&ep->recv_cntr->ep_ref);
+			ofi_atomic_inc32(&ep->recv_cntr->ep_ref);
 		}
 		if (flags & FI_READ) {
 			ep->read_cntr = cntr;
-			atomic_inc(&ep->read_cntr->ep_ref);
+			ofi_atomic_inc32(&ep->read_cntr->ep_ref);
 		}
 		if (flags & FI_WRITE) {
 			ep->write_cntr = cntr;
-			atomic_inc(&ep->write_cntr->ep_ref);
+			ofi_atomic_inc32(&ep->write_cntr->ep_ref);
 		}
 
 		break;
@@ -208,12 +205,12 @@ static int fi_ibv_rdm_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 	return 0;
 }
 
-static ssize_t fi_ibv_rdm_tagged_ep_cancel(fid_t fid, void *ctx)
+static ssize_t fi_ibv_rdm_cancel(fid_t fid, void *ctx)
 {
 	struct fi_context *context = (struct fi_context *)ctx;
 	struct fi_ibv_rdm_ep *ep_rdm = 
 		container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
-	int err = 1;
+	int err = -FI_ENOENT;
 
 	if (!ep_rdm->domain)
 		return -EBADF;
@@ -261,41 +258,43 @@ static ssize_t fi_ibv_rdm_tagged_ep_cancel(fid_t fid, void *ctx)
 	return err;
 }
 
-static int fi_ibv_rdm_tagged_ep_getopt(fid_t fid, int level, int optname,
-				       void *optval, size_t * optlen)
+static int fi_ibv_rdm_getopt(fid_t fid, int level, int optname, void *optval,
+			     size_t * optlen)
 {
-	switch (level) {
-	case FI_OPT_ENDPOINT:
-		return -FI_ENOPROTOOPT;
-	default:
+	struct fi_ibv_rdm_ep *ep_rdm = 
+		container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
+
+	if (level != FI_OPT_ENDPOINT) {
 		return -FI_ENOPROTOOPT;
 	}
-	return 0;
-}
 
-static int fi_ibv_rdm_tagged_setopt(fid_t fid, int level, int optname,
-				    const void *optval, size_t optlen)
-{
-	switch (level) {
-	case FI_OPT_ENDPOINT:
-		return -FI_ENOPROTOOPT;
-	default:
+	if (optname != FI_OPT_MIN_MULTI_RECV) {
 		return -FI_ENOPROTOOPT;
 	}
+
+	*(size_t *)optval = ep_rdm->min_multi_recv_size;
+	*optlen = sizeof(size_t);
+
 	return 0;
 }
 
-#if 0
-static int fi_ibv_ep_enable(struct fid_ep *ep)
+static int fi_ibv_rdm_setopt(fid_t fid, int level, int optname,
+			     const void *optval, size_t optlen)
 {
-	struct fi_ibv_rdm_ep *_ep;
+	struct fi_ibv_rdm_ep *ep_rdm =
+		container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
 
-	_ep = container_of(ep, struct fi_ibv_rdm_ep, ep_fid);
+	if (level != FI_OPT_ENDPOINT) {
+		return -FI_ENOPROTOOPT;
+	}
 
-	assert(_ep->type == FI_EP_RDM);
+	if (optname != FI_OPT_MIN_MULTI_RECV) {
+		return -FI_ENOPROTOOPT;
+	}
+
+	ep_rdm->min_multi_recv_size = *(size_t *)optval;
 	return 0;
 }
-#endif /* 0 */
 
 static int fi_ibv_rdm_tagged_control(fid_t fid, int command, void *arg)
 {
@@ -309,127 +308,153 @@ static int fi_ibv_rdm_tagged_control(fid_t fid, int command, void *arg)
 	return 0;
 }
 
-struct fi_ops_ep fi_ibv_rdm_tagged_ep_base_ops = {
+struct fi_ops_ep fi_ibv_rdm_ep_base_ops = {
 	.size = sizeof(struct fi_ops_ep),
-	.cancel = fi_ibv_rdm_tagged_ep_cancel,
-	.getopt = fi_ibv_rdm_tagged_ep_getopt,
-	.setopt = fi_ibv_rdm_tagged_setopt,
+	.cancel = fi_ibv_rdm_cancel,
+	.getopt = fi_ibv_rdm_getopt,
+	.setopt = fi_ibv_rdm_setopt,
 	.tx_ctx = fi_no_tx_ctx,
 	.rx_ctx = fi_no_rx_ctx,
 	.rx_size_left = fi_no_rx_size_left,
 	.tx_size_left = fi_no_tx_size_left,
 };
 
-static int _fi_ibv_rdm_tagged_cm_progress_running = 1;
-
-static void *fi_ibv_rdm_tagged_cm_progress_thread(void *ctx)
+static int fi_ibv_rdm_ep_match(struct slist_entry *item,
+			       const void *ep)
 {
-	struct fi_ibv_rdm_ep *ep = (struct fi_ibv_rdm_ep *)ctx;
-	while (_fi_ibv_rdm_tagged_cm_progress_running) {
-		if (fi_ibv_rdm_cm_progress(ep)) {
-			VERBS_INFO (FI_LOG_EP_DATA,
-			"fi_ibv_rdm_cm_progress error\n");
-			abort();
-		}
-		usleep(ep->cm_progress_timeout);
-	}
-	return NULL;
+	const struct fi_ibv_rdm_ep *ep_obj = (struct fi_ibv_rdm_ep *)ep;
+	return (item == &ep_obj->list_entry);
 }
 
 static int fi_ibv_rdm_ep_close(fid_t fid)
 {
 	int ret = FI_SUCCESS;
 	int err = FI_SUCCESS;
-	void *status = NULL;
 	struct fi_ibv_rdm_ep *ep =
 		container_of(fid, struct fi_ibv_rdm_ep, ep_fid.fid);
 
-	if (ep->fi_scq) {
+	if (ep->fi_scq)
 		ep->fi_scq->ep = NULL;
-	}
-	if (ep->fi_rcq) {
+	if (ep->fi_rcq)
 		ep->fi_rcq->ep = NULL;
-	}
 
 	ep->is_closing = 1;
-	_fi_ibv_rdm_tagged_cm_progress_running = 0;
-	pthread_join(ep->cm_progress_thread, &status);
-	pthread_mutex_destroy(&ep->cm_lock);
 
 	/* All posted sends are waiting local completions */
-	while (ep->posted_sends > 0 && ep->num_active_conns > 0) {
+	while (ep->posted_sends > 0 && ep->num_active_conns > 0)
 		fi_ibv_rdm_tagged_poll(ep);
-	}
 
 	if (ep->send_cntr) {
-		atomic_dec(&ep->send_cntr->ep_ref);
+		ofi_atomic_dec32(&ep->send_cntr->ep_ref);
 		ep->send_cntr = 0;
 	}
 
 	if (ep->recv_cntr) {
-		atomic_dec(&ep->recv_cntr->ep_ref);
+		ofi_atomic_dec32(&ep->recv_cntr->ep_ref);
 		ep->recv_cntr = 0;
 	}
 
 	if (ep->read_cntr) {
-		atomic_dec(&ep->read_cntr->ep_ref);
+		ofi_atomic_dec32(&ep->read_cntr->ep_ref);
 		ep->read_cntr = 0;
 	}
 
 	if (ep->write_cntr) {
-		atomic_dec(&ep->write_cntr->ep_ref);
+		ofi_atomic_dec32(&ep->write_cntr->ep_ref);
 		ep->write_cntr = 0;
 	}
 
-	struct fi_ibv_rdm_conn *conn = NULL, *tmp = NULL;
-
-	HASH_ITER(hh, ep->domain->rdm_cm->conn_hash, conn, tmp) {
-		HASH_DEL(ep->domain->rdm_cm->conn_hash, conn);
-		switch (conn->state) {
-		case FI_VERBS_CONN_ALLOCATED:
-		case FI_VERBS_CONN_REMOTE_DISCONNECT:
-		case FI_VERBS_CONN_ESTABLISHED:
-			ret = fi_ibv_rdm_start_disconnection(conn);
-			break;
-		case FI_VERBS_CONN_STARTED:
-			while (conn->state != FI_VERBS_CONN_ESTABLISHED &&
-			       conn->state != FI_VERBS_CONN_REJECTED) {
-				ret = fi_ibv_rdm_cm_progress(ep);
-				if (ret) {
-					VERBS_INFO(FI_LOG_AV, 
-						   "cm progress failed\n");
-					break;
+	slist_remove_first_match(&ep->domain->ep_list,
+				 fi_ibv_rdm_ep_match, ep);
+
+	struct fi_ibv_rdm_av_entry *av_entry = NULL, *tmp = NULL;
+
+	HASH_ITER(hh, ep->domain->rdm_cm->av_hash, av_entry, tmp) {
+		struct fi_ibv_rdm_conn *conn = NULL;
+
+		HASH_FIND(hh, av_entry->conn_hash, &ep,
+			  sizeof(struct fi_ibv_rdm_ep *), conn);
+		if (conn) {
+			switch (conn->state) {
+			case FI_VERBS_CONN_ALLOCATED:
+			case FI_VERBS_CONN_REMOTE_DISCONNECT:
+			case FI_VERBS_CONN_ESTABLISHED:
+				ret = fi_ibv_rdm_start_disconnection(conn);
+				break;
+			case FI_VERBS_CONN_STARTED:
+				while (conn->state != FI_VERBS_CONN_ESTABLISHED &&
+				       conn->state != FI_VERBS_CONN_REJECTED) {
+					ret = fi_ibv_rdm_cm_progress(ep);
+					if (ret) {
+						VERBS_INFO(FI_LOG_AV, 
+							   "cm progress failed\n");
+						break;
+					}
+				}
+				break;
+			default:
+				break;
+		}
+		}
+	}
+
+        /* ok, all connections are initiated to disconnect. now wait
+	 * till all connections are switch to state 'closed' */
+	HASH_ITER(hh, ep->domain->rdm_cm->av_hash, av_entry, tmp) {
+		struct fi_ibv_rdm_conn *conn = NULL;
+
+		HASH_FIND(hh, av_entry->conn_hash, &ep,
+			  sizeof(struct fi_ibv_rdm_ep *), conn);
+		if (conn) {
+			while(conn->state != FI_VERBS_CONN_CLOSED &&
+			      conn->state != FI_VERBS_CONN_ALLOCATED) {
+				fi_ibv_rdm_tagged_poll_recv(ep);
+				err = fi_ibv_rdm_cm_progress(ep);
+				if (err) {
+					VERBS_INFO(FI_LOG_AV, "cm progress failed\n");
+					ret = (ret == FI_SUCCESS) ? err : ret;
 				}
 			}
-			break;
-		default:
-			break;
 		}
 	}
-	while (ep->num_active_conns) {
-		err = fi_ibv_rdm_cm_progress(ep);
-		if (err) {
-			VERBS_INFO(FI_LOG_AV, "cm progress failed\n");
-			ret = (ret == FI_SUCCESS) ? err : ret;
+
+        /* now destroy all connections */
+	HASH_ITER(hh, ep->domain->rdm_cm->av_hash, av_entry, tmp) {
+		struct fi_ibv_rdm_conn *conn = NULL;
+
+		HASH_FIND(hh, av_entry->conn_hash, &ep,
+			  sizeof(struct fi_ibv_rdm_ep *), conn);
+		if (conn) {
+			HASH_DEL(av_entry->conn_hash, conn);
+			fi_ibv_rdm_conn_cleanup(conn);
 		}
 	}
 
-	assert(HASH_COUNT(ep->domain->rdm_cm->conn_hash) == 0 &&
-	       ep->domain->rdm_cm->conn_hash == NULL);
-	free(ep->domain->rdm_cm->conn_table);
+	/* TODO: MUST be removed in DOMAIN_CLOSE */
+	/*assert(HASH_COUNT(av_entry->conn_hash) == 0 &&
+	       av_entry->conn_hash == NULL);*/
+	free(ep->domain->rdm_cm->av_table);
 
 	VERBS_INFO(FI_LOG_AV, "DISCONNECT complete\n");
 	assert(ep->scq && ep->rcq);
-	if (ibv_destroy_cq(ep->scq) || ibv_destroy_cq(ep->rcq)) {
-		VERBS_INFO_ERRNO(FI_LOG_AV, "ibv_destroy_cq failed\n", errno);
+	if (ibv_destroy_cq(ep->scq)) {
+		VERBS_INFO_ERRNO(FI_LOG_AV, "ep->scq: ibv_destroy_cq failed",
+				 errno);
+		ret = (ret == FI_SUCCESS) ? -errno : ret;
+	}
+
+	if (ibv_destroy_cq(ep->rcq)) {
+		VERBS_INFO_ERRNO(FI_LOG_AV, "ep->rcq: ibv_destroy_cq failed",
+				 errno);
 		ret = (ret == FI_SUCCESS) ? -errno : ret;
 	}
 
-	rdma_freeaddrinfo(ep->rai);
 	errno = 0;
+	rdma_freeaddrinfo(ep->rai);
 	if (errno) {
-		VERBS_INFO_ERRNO(FI_LOG_AV, "rdma_freeaddrinfo failed\n", errno);
-		ret = (ret == FI_SUCCESS) ? -ret : ret;
+		VERBS_INFO_ERRNO(FI_LOG_AV, "rdma_freeaddrinfo failed",
+				 errno);
+		ret = (ret == FI_SUCCESS) ? -errno : ret;
 	}
 
 	/* TODO: move queues & related pools cleanup to close CQ*/
@@ -439,43 +464,13 @@ static int fi_ibv_rdm_ep_close(fid_t fid)
 	util_buf_pool_destroy(fi_ibv_rdm_extra_buffers_pool);
 	util_buf_pool_destroy(fi_ibv_rdm_postponed_pool);
 
+	fi_freeinfo(ep->info);
+
 	free(ep);
 
 	return ret;
 }
 
-#if 0
-static int fi_ibv_ep_sync(fid_t fid, uint64_t flags, void *context)
-{
-	struct fi_ibv_rdm_ep *ep;
-
-	ep = container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
-
-	if (ep->type == FI_EP_MSG) {
-		return 0;
-	} else if (ep->type == FI_EP_RDM) {
-		if (!flags || (flags & FI_SEND)) {
-			while (ep->pend_send) {
-				fi_ibv_rdm_tagged_poll(ep);
-			}
-		}
-
-		if (!flags || (flags & FI_RECV)) {
-			while (ep->pend_recv) {
-				fi_ibv_rdm_tagged_poll(ep);
-			}
-		}
-
-		if (!flags || (flags & FI_READ)) {
-		}
-
-		if (!flags || (flags & FI_WRITE) || (flags & FI_WRITE)) {
-		}
-	}
-	return 0;
-}
-#endif /* 0 */
-
 struct fi_ops fi_ibv_rdm_ep_ops = {
 	.size = sizeof(struct fi_ops),
 	.close = fi_ibv_rdm_ep_close,
@@ -489,8 +484,7 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 {
 	struct fi_ibv_domain *_domain = 
 		container_of(domain, struct fi_ibv_domain, domain_fid);
-	int ret = 0;
-	int param = 0;
+	int ret = 0, param = 0;
 	char *str_param = NULL;
 
 	if (!info || !info->ep_attr || !info->domain_attr ||
@@ -502,15 +496,19 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 
 	struct fi_ibv_rdm_ep *_ep;
 	_ep = calloc(1, sizeof *_ep);
-	if (!_ep) {
+	if (!_ep)
 		return -FI_ENOMEM;
-	}
 
+	_ep->info = fi_dupinfo(info);
+	if (!_ep->info) {
+		ret = -FI_ENOMEM;
+		goto err1;
+	}
 	_ep->domain = _domain;
 	_ep->ep_fid.fid.fclass = FI_CLASS_EP;
 	_ep->ep_fid.fid.context = context;
 	_ep->ep_fid.fid.ops = &fi_ibv_rdm_ep_ops;
-	_ep->ep_fid.ops = &fi_ibv_rdm_tagged_ep_base_ops;
+	_ep->ep_fid.ops = &fi_ibv_rdm_ep_base_ops;
 	_ep->ep_fid.cm = &fi_ibv_rdm_tagged_ep_cm_ops;
 	_ep->ep_fid.msg = fi_ibv_rdm_ep_ops_msg();
 	_ep->ep_fid.rma = fi_ibv_rdm_ep_ops_rma();
@@ -522,44 +520,63 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 		FI_IBV_RDM_TAGGED_DFLT_BUFFER_NUM : param;
 
 	if (_ep->n_buffs & (_ep->n_buffs - 1)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"invalid value of rdm_buffer_num\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "invalid value of rdm_buffer_num\n");
 		ret = -FI_EINVAL;
-		goto err;
+		goto err2;
 	}
 
-	FI_INFO(&fi_ibv_prov, FI_LOG_EP_CTRL, "inject_size: %d\n",
-		info->tx_attr->inject_size);
+	VERBS_INFO(FI_LOG_EP_CTRL, "inject_size: %d\n",
+		   info->tx_attr->inject_size);
 
 	_ep->rndv_threshold = info->tx_attr->inject_size;
-	FI_INFO(&fi_ibv_prov, FI_LOG_EP_CTRL, "rndv_threshold: %d\n",
-		_ep->rndv_threshold);
+	VERBS_INFO(FI_LOG_EP_CTRL, "rndv_threshold: %d\n",
+		   _ep->rndv_threshold);
 
 	_ep->buff_len = rdm_buffer_size(info->tx_attr->inject_size);
-	FI_INFO(&fi_ibv_prov, FI_LOG_EP_CTRL, "buff_len: %d\n", _ep->buff_len);
+	VERBS_INFO(FI_LOG_EP_CTRL, "buff_len: %d\n", _ep->buff_len);
+
+	_ep->tx_op_flags = info->tx_attr->op_flags;
+	_ep->rx_op_flags = info->rx_attr->op_flags;
+	_ep->min_multi_recv_size = (_ep->rx_op_flags & FI_MULTI_RECV) ?
+				   info->tx_attr->inject_size : 0;
 
 	_ep->rndv_seg_size = FI_IBV_RDM_SEG_MAXSIZE;
 	if (!fi_param_get_int(&fi_ibv_prov, "rdm_rndv_seg_size", &param)) {
 		if (param > 0) {
 			_ep->rndv_seg_size = param;
 		} else {
-			FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-				"invalid value of rdm_rndv_seg_size\n");
+			VERBS_INFO(FI_LOG_CORE,
+				   "invalid value of rdm_rndv_seg_size\n");
 			ret = -FI_EINVAL;
-			goto err;
+			goto err2;
 		}
 	}
 
-	_ep->cm_progress_timeout = FI_IBV_RDM_CM_THREAD_TIMEOUT;
-	if (!fi_param_get_int(&fi_ibv_prov, "rdm_thread_timeout", &param)) {
-		if (param < 0) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-				"invalid value of rdm_thread_timeout\n");
-			ret = -FI_EINVAL;
-			goto err;
+#ifdef HAVE_VERBS_EXP_H
+	struct ibv_exp_device_attr exp_attr;
+	exp_attr.comp_mask = IBV_EXP_DEVICE_ATTR_ODP | IBV_EXP_DEVICE_ATTR_EXP_CAP_FLAGS;
+	ret = ibv_exp_query_device(_ep->domain->verbs, &exp_attr);
+	if (!ret && exp_attr.exp_device_cap_flags & IBV_EXP_DEVICE_ODP) {
+		_ep->use_odp = 1;
+	} else {
+		_ep->use_odp = 0;
+	}
+#else /* HAVE_VERBS_EXP_H */
+	_ep->use_odp = 0;
+#endif /* HAVE_VERBS_EXP_H */
+	if (!fi_param_get_bool(&fi_ibv_prov, "rdm_use_odp", &param)) {
+		if (!_ep->use_odp && param) {
+			VERBS_WARN(FI_LOG_CORE, "ODP is not supported on this "
+				   "configuration, ignore \n");
 		} else {
-			_ep->cm_progress_timeout = param;
+			_ep->use_odp = param;
 		}
+	} else {
+		/* Disable by default. Because this feature may corrupt
+		 * data due to IBV_EXP_ACCESS_RELAXED flag. But usage
+		 * this feature w/o this flag leads to poor bandwidth */
+		_ep->use_odp = 0;
 	}
 
 	_ep->rq_wr_depth = info->rx_attr->size;
@@ -573,10 +590,10 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 				    strlen("IBV_WR_SEND"))) {
 			_ep->eopcode = IBV_WR_SEND;
 		} else {
-			FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-				"invalid value of rdm_eager_send_opcode\n");
+			VERBS_INFO(FI_LOG_CORE,
+				   "invalid value of rdm_eager_send_opcode\n");
 			ret = -FI_EINVAL;
-			goto err;
+			goto err2;
 		}
 	} else {
 		_ep->eopcode = IBV_WR_SEND;
@@ -586,33 +603,33 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 	case FI_PROTO_IB_RDM:
 		if (_ep->eopcode != IBV_WR_RDMA_WRITE_WITH_IMM &&
 		    _ep->eopcode != IBV_WR_SEND) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported eager operation code\n");
+			VERBS_INFO(FI_LOG_CORE,
+				   "Unsupported eager operation code\n");
 			ret = -FI_ENODATA;
-			goto err;
+			goto err2;
 		}
 		break;
 	case FI_PROTO_IWARP_RDM:
 		if (_ep->eopcode != IBV_WR_SEND) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported eager operation code\n");
+			VERBS_INFO(FI_LOG_CORE,
+				   "Unsupported eager operation code\n");
 			ret = -FI_ENODATA;
-			goto err;
+			goto err1;
 		}
 		break;
 	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unsupported protocol\n");
+		VERBS_INFO(FI_LOG_CORE, "Unsupported protocol\n");
 		ret = -FI_ENODATA;
-		goto err;
+		goto err2;
 	}
 
 	ret = fi_ibv_get_rdma_rai(NULL, NULL, 0, info, &_ep->rai);
 	if (ret) {
-		goto err;
+		goto err2;
 	}
 	ret = fi_ibv_rdm_cm_bind_ep(_ep->domain->rdm_cm, _ep);
 	if (ret) {
-		goto err;
+		goto err2;
 	}
 
 	_ep->posted_sends = 0;
@@ -643,7 +660,7 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 	if (_ep->scq == NULL) {
 		VERBS_INFO_ERRNO(FI_LOG_EP_CTRL, "ibv_create_cq", errno);
 		ret = -FI_EOTHER;
-		goto err;
+		goto err2;
 	}
 
 	_ep->rcq =
@@ -651,7 +668,7 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 	if (_ep->rcq == NULL) {
 		VERBS_INFO_ERRNO(FI_LOG_EP_CTRL, "ibv_create_cq", errno);
 		ret = -FI_EOTHER;
-		goto err;
+		goto err2;
 	}
 
 	*ep = &_ep->ep_fid;
@@ -659,20 +676,12 @@ int fi_ibv_rdm_open_ep(struct fid_domain *domain, struct fi_info *info,
 	_ep->is_closing = 0;
 	fi_ibv_rdm_req_hndls_init();
 
-	pthread_mutex_init(&_ep->cm_lock, NULL);
-	_fi_ibv_rdm_tagged_cm_progress_running = 1;
-	ret = pthread_create(&_ep->cm_progress_thread, NULL,
-			     &fi_ibv_rdm_tagged_cm_progress_thread,
-			     (void *)_ep);
-	if (ret) {
-		VERBS_INFO(FI_LOG_EP_CTRL,
-			"Failed to launch CM progress thread, err :%d\n", ret);
-		ret = -FI_EOTHER;
-		goto err;
-	}
+	slist_insert_tail(&_ep->list_entry, &_domain->ep_list);
 
 	return ret;
-err:
+err2:
+	fi_freeinfo(_ep->info);
+err1:
 	free(_ep);
 	return ret;
 }
diff --git a/prov/verbs/src/ep_rdm/verbs_queuing.h b/prov/verbs/src/ep_rdm/verbs_queuing.h
index 4bf86ef..ce413f0 100644
--- a/prov/verbs/src/ep_rdm/verbs_queuing.h
+++ b/prov/verbs/src/ep_rdm/verbs_queuing.h
@@ -113,6 +113,9 @@ fi_ibv_rdm_move_to_unexpected_queue(struct fi_ibv_rdm_request *request)
 	FI_IBV_RDM_DBG_REQUEST("move_to_unexpected_queue: ", request,
 				FI_LOG_DEBUG);
 	dlist_insert_tail(&request->queue_entry, &fi_ibv_rdm_unexp_queue);
+#if ENABLE_DEBUG
+	request->minfo.conn->unexp_counter++;
+#endif // ENABLE_DEBUG
 }
 
 static inline void
@@ -143,6 +146,11 @@ fi_ibv_rdm_move_to_posted_queue(struct fi_ibv_rdm_request *request,
 	FI_IBV_RDM_DBG_REQUEST("move_to_posted_queue: ", request, FI_LOG_DEBUG);
 	dlist_insert_tail(&request->queue_entry, &fi_ibv_rdm_posted_queue);
 	ep->posted_recvs++;
+#if ENABLE_DEBUG
+	if (request->minfo.conn) {
+		request->minfo.conn->exp_counter++;
+	}
+#endif // ENABLE_DEBUG
 }
 
 static inline void
@@ -156,19 +164,19 @@ fi_ibv_rdm_remove_from_posted_queue(struct fi_ibv_rdm_request *request,
 }
 
 static inline struct fi_ibv_rdm_request *
-fi_ibv_rdm_take_first_from_posted_queue()
+fi_ibv_rdm_take_first_from_posted_queue(struct fi_ibv_rdm_ep* ep)
 {
 	if (!dlist_empty(&fi_ibv_rdm_posted_queue)) {
 		struct fi_ibv_rdm_request *entry =
 			container_of(fi_ibv_rdm_posted_queue.next,
 				     struct fi_ibv_rdm_request, queue_entry);
-		fi_ibv_rdm_remove_from_unexp_queue(entry);
+		fi_ibv_rdm_remove_from_posted_queue(entry, ep);
 		return entry;
 	}
 	return NULL;
 }
 
-static inline void
+static inline int
 fi_ibv_rdm_move_to_postponed_queue(struct fi_ibv_rdm_request *request)
 {
 	FI_IBV_RDM_DBG_REQUEST("move_to_postponed_queue: ", request, 
@@ -180,6 +188,10 @@ fi_ibv_rdm_move_to_postponed_queue(struct fi_ibv_rdm_request *request)
 	if (dlist_empty(&conn->postponed_requests_head)) {
 		struct fi_ibv_rdm_postponed_entry *entry =
 			util_buf_alloc(fi_ibv_rdm_postponed_pool);
+		if (OFI_UNLIKELY(!entry)) {
+			VERBS_WARN(FI_LOG_EP_DATA, "Unable to alloc buffer");
+			return -FI_ENOMEM;
+		}
 
 		entry->conn = conn;	
 		conn->postponed_entry = entry;
@@ -189,6 +201,8 @@ fi_ibv_rdm_move_to_postponed_queue(struct fi_ibv_rdm_request *request)
 	}
 	dlist_insert_tail(&request->queue_entry,
 			  &conn->postponed_requests_head);
+
+	return FI_SUCCESS;
 }
 
 static inline void
diff --git a/prov/verbs/src/ep_rdm/verbs_rdm.h b/prov/verbs/src/ep_rdm/verbs_rdm.h
index 52e9005..6230c97 100644
--- a/prov/verbs/src/ep_rdm/verbs_rdm.h
+++ b/prov/verbs/src/ep_rdm/verbs_rdm.h
@@ -108,6 +108,16 @@ do {									\
 #define RMA_RESOURCES_IS_BUSY(_connection, _ep)				\
 	(OUTGOING_POST_LIMIT(_connection, _ep) || PEND_POST_LIMIT(_ep))
 
+#define GET_TX_COMP(ep_rdm)						\
+	(!ep_rdm->rx_selective_completion ||		\
+	(ep_rdm->rx_op_flags & FI_COMPLETION) ?		\
+	FI_COMPLETION : 0ULL)
+
+#define GET_TX_COMP_FLAG(ep_rdm, flag)			\
+	(!ep_rdm->rx_selective_completion ||		\
+	(ep_rdm->rx_op_flags & FI_COMPLETION) ?		\
+	FI_COMPLETION : (flags & FI_COMPLETION))
+
 struct fi_ibv_rdm_header {
 /*	uint64_t imm_data; TODO: not implemented */
 	uint64_t tag;
@@ -124,13 +134,23 @@ struct fi_ibv_rdm_rndv_header {
 	uint32_t is_tagged;
 };
 
+struct fi_ibv_rdm_multi_request {
+	/* working request, will be renewed for every data arriving */
+	struct fi_ibv_rdm_request *prepost;
+	uint8_t *buf;
+	uint64_t len;
+	uint64_t offset;
+	uint64_t min_size;
+};
+
 struct fi_ibv_rdm_request {
 
 	/* Accessors and match info */
 
 	/* Request can be an element of only one queue at the moment */
 	struct dlist_entry queue_entry;
-
+	/* multi recv handling */
+	struct fi_ibv_rdm_multi_request *parent;
 	struct {
 		enum fi_ibv_rdm_request_eager_state eager;
 		enum fi_ibv_rdm_request_rndv_state rndv;
@@ -181,7 +201,7 @@ struct fi_ibv_rdm_request {
 		
 		/* RMA info */
 		struct {
-			/* registered buffer on sender side */
+			struct ibv_mr* mr;
 			uint64_t remote_addr;
 			uint32_t rkey;
 			uint32_t lkey;
@@ -200,7 +220,7 @@ void fi_ibv_rdm_print_request(char *buf, struct fi_ibv_rdm_request *request);
 
 #define BUF_STATUS_FREE 	((uint16_t) 0)
 #define BUF_STATUS_BUSY 	((uint16_t) 1)
-#define BUF_STATUS_RECVED 	((uint16_t) 2)
+#define BUF_STATUS_RECEIVED 	((uint16_t) 2)
 
 struct fi_ibv_rdm_buf_service_data {
 	volatile uint16_t status;
@@ -214,24 +234,30 @@ struct fi_ibv_rdm_buf_service_data {
 struct fi_ibv_rdm_buf {
 	struct fi_ibv_rdm_buf_service_data service_data;
 	struct fi_ibv_rdm_header header;
-	uint8_t payload;
+	uint64_t payload;
 };
 
 struct fi_ibv_rdm_cm {
-	struct rdma_event_channel *ec;
-	struct rdma_cm_id *listener;
-	int is_bound;
+	struct rdma_event_channel*	ec;
+	struct rdma_cm_id*		listener;
+	int				is_bound;
 
-	/* conn_hash has a sockaddr_in -> conn associative */
-	struct fi_ibv_rdm_conn *conn_hash;
+	/* av_hash has a sockaddr_in -> [ep - conn] associative */
+	struct fi_ibv_rdm_av_entry*	av_hash;
 	/* Used only for FI_AV_TABLE */
-	struct fi_ibv_rdm_conn **conn_table;
+	struct fi_ibv_rdm_av_entry**	av_table;
+
+	struct slist			av_removed_entry_head;
+	pthread_mutex_t			cm_lock;
+	pthread_t			cm_progress_thread;
+	int				cm_progress_timeout;
+	int				fi_ibv_rdm_tagged_cm_progress_running;
 };
 
 struct fi_ibv_rdm_cntr {
 	struct fid_cntr		fid;
 	struct fi_ibv_domain	*domain;
-	atomic_t		ep_ref;
+	ofi_atomic32_t		ep_ref;
 	uint64_t		value;
 	struct fi_cntr_attr	attr;
 	uint64_t		err_count;
@@ -239,53 +265,57 @@ struct fi_ibv_rdm_cntr {
 
 struct fi_ibv_rdm_ep {
 	struct fid_ep ep_fid;
-	struct fi_ibv_domain *domain;
-	struct fi_ibv_rdm_cq *fi_scq;
-	struct fi_ibv_rdm_cq *fi_rcq;
+	struct fi_ibv_domain*	domain;
+	struct slist_entry	list_entry;
+	struct fi_ibv_rdm_cq*	fi_scq;
+	struct fi_ibv_rdm_cq*	fi_rcq;
 
-	struct fi_ibv_rdm_cntr *send_cntr;
-	struct fi_ibv_rdm_cntr *recv_cntr;
-	struct fi_ibv_rdm_cntr *read_cntr;
-	struct fi_ibv_rdm_cntr *write_cntr;
+	struct fi_ibv_rdm_cntr*	send_cntr;
+	struct fi_ibv_rdm_cntr*	recv_cntr;
+	struct fi_ibv_rdm_cntr*	read_cntr;
+	struct fi_ibv_rdm_cntr*	write_cntr;
 
-	size_t addrlen;
-	struct rdma_addrinfo *rai;
-	struct sockaddr_in my_addr;
+	struct fi_info*	info;
 
-	struct fi_ibv_av *av;
-	int tx_selective_completion;
-	int rx_selective_completion;
+	size_t			addrlen;
+	struct rdma_addrinfo*	rai;
+	struct sockaddr_in	my_addr;
+
+	struct fi_ibv_av*	av;
+	int		tx_selective_completion;
+	int 		rx_selective_completion;
+	size_t 		min_multi_recv_size;
+	uint64_t 	tx_op_flags;
+	uint64_t 	rx_op_flags;
 
 	/*
 	 * ibv_post_send opcode for eager messaging.
 	 * It must generate work completion in receive CQ
 	 */
-	enum ibv_wr_opcode eopcode;
-	int buff_len;
-	int n_buffs;
-	int rq_wr_depth;    // RQ depth
-	int sq_wr_depth;    // SQ depth
-	int posted_sends;
-	int posted_recvs;
-	int num_active_conns;
-	int max_inline_rc;
-	int rndv_threshold;
-	int rndv_seg_size;
-	struct ibv_cq *scq;
-	struct ibv_cq *rcq;
-	int scq_depth;
-	int rcq_depth;
-	int cqread_bunch_size;
-
-	/* TODO: move all CM things to domain */
-	pthread_t cm_progress_thread;
-	pthread_mutex_t cm_lock;
-	int cm_progress_timeout;
-	int is_closing;
-	int recv_preposted_threshold;
+	enum ibv_wr_opcode	eopcode;
+	struct ibv_cq*		scq;
+	struct ibv_cq*		rcq;
+
+	int	buff_len;
+	int	n_buffs;
+	int	rq_wr_depth;    // RQ depth
+	int	sq_wr_depth;    // SQ depth
+	int	posted_sends;
+	int	posted_recvs;
+	int	num_active_conns;
+	int	max_inline_rc;
+	int	rndv_threshold;
+	int	rndv_seg_size;
+	int	use_odp;
+	int	scq_depth;
+	int	rcq_depth;
+	int	cqread_bunch_size;
+
+	int	is_closing;
+	int	recv_preposted_threshold;
 };
 
-enum {
+enum fi_rdm_cm_conn_state {
 	FI_VERBS_CONN_ALLOCATED,
 	FI_VERBS_CONN_STARTED,
 	FI_VERBS_CONN_REJECTED,
@@ -296,11 +326,20 @@ enum {
 };
 
 enum fi_rdm_cm_role {
+	FI_VERBS_CM_UNDEFINED,
 	FI_VERBS_CM_ACTIVE,
 	FI_VERBS_CM_PASSIVE,
 	FI_VERBS_CM_SELF,
 };
 
+struct fi_ibv_rdm_av_entry {
+	/* association of conn and EPs */
+	struct fi_ibv_rdm_conn		*conn_hash;
+	struct sockaddr_in		addr;
+	struct slist_entry		removed_next;
+	UT_hash_handle			hh;
+};
+
 struct fi_ibv_rdm_conn {
 
 	/* 
@@ -311,8 +350,9 @@ struct fi_ibv_rdm_conn {
 	struct ibv_qp *qp[2];
 	struct rdma_cm_id *id[2];
 	struct sockaddr_in addr;
+	struct fi_ibv_rdm_ep *ep;
 	enum fi_rdm_cm_role cm_role;
-	int state;
+	enum fi_rdm_cm_conn_state state;
 
 	char *sbuf_mem_reg;
 	struct fi_ibv_rdm_buf *sbuf_head;
@@ -345,6 +385,8 @@ struct fi_ibv_rdm_conn {
 	uint16_t recv_completions;
 	/* counter to control OOO behaviour, works in pair with recv_completions */
 	uint16_t recv_processed;
+
+	struct fi_ibv_rdm_av_entry *av_entry;
 	UT_hash_handle hh;
 #if ENABLE_DEBUG
 	size_t unexp_counter;
@@ -358,6 +400,8 @@ struct fi_ibv_rdm_postponed_entry {
 	struct fi_ibv_rdm_conn *conn;
 };
 
+extern struct util_buf_pool* fi_ibv_rdm_request_pool;
+
 static inline void
 fi_ibv_rdm_set_buffer_status(struct fi_ibv_rdm_buf *buff, uint16_t status)
 {
@@ -492,9 +536,13 @@ static inline void fi_ibv_rdm_cntr_inc_err(struct fi_ibv_rdm_cntr *cntr)
 }
 
 int fi_ibv_rdm_tagged_poll(struct fi_ibv_rdm_ep *ep);
+int fi_ibv_rdm_tagged_poll_recv(struct fi_ibv_rdm_ep *ep);
 ssize_t fi_ibv_rdm_cm_progress(struct fi_ibv_rdm_ep *ep);
+ssize_t
+fi_ibv_rdm_start_overall_disconnection(struct fi_ibv_rdm_av_entry *av_entry);
 ssize_t fi_ibv_rdm_start_disconnection(struct fi_ibv_rdm_conn *conn);
 ssize_t fi_ibv_rdm_conn_cleanup(struct fi_ibv_rdm_conn *conn);
+ssize_t fi_ibv_rdm_overall_conn_cleanup(struct fi_ibv_rdm_av_entry *av_entry);
 ssize_t fi_ibv_rdm_start_connection(struct fi_ibv_rdm_ep *ep,
                                 struct fi_ibv_rdm_conn *conn);
 ssize_t fi_ibv_rdm_repost_receives(struct fi_ibv_rdm_conn *conn,
@@ -546,13 +594,13 @@ fi_ibv_rdm_get_sbuf_head(struct fi_ibv_rdm_conn *conn, struct fi_ibv_rdm_ep *ep)
 		}
 
 		/* notification for receiver */
-		fi_ibv_rdm_set_buffer_status(conn->sbuf_head, BUF_STATUS_RECVED);
+		fi_ibv_rdm_set_buffer_status(conn->sbuf_head, BUF_STATUS_RECEIVED);
 
 		sbuf = conn->sbuf_head;
 		fi_ibv_rdm_push_sbuff_head(conn, ep);
 	}
 #if ENABLE_DEBUG
-	assert(sbuf ? (sbuf->service_data.status == BUF_STATUS_RECVED) : 1);
+	assert(sbuf ? (sbuf->service_data.status == BUF_STATUS_RECEIVED) : 1);
 	{
 		int i;
 		char s[1024];
@@ -603,11 +651,11 @@ fi_ibv_rdm_check_connection(struct fi_ibv_rdm_conn *conn,
 {
 	const int status = (conn->state == FI_VERBS_CONN_ESTABLISHED);
 	if (!status) {
-		pthread_mutex_lock(&ep->cm_lock);
+		pthread_mutex_lock(&ep->domain->rdm_cm->cm_lock);
 		if (conn->state == FI_VERBS_CONN_ALLOCATED) {
 			fi_ibv_rdm_start_connection(ep, conn);
 		}
-		pthread_mutex_unlock(&ep->cm_lock);
+		pthread_mutex_unlock(&ep->domain->rdm_cm->cm_lock);
 	}
 
 	return status;
@@ -635,4 +683,58 @@ fi_ibv_rdm_rma_prepare_resources(struct fi_ibv_rdm_conn *conn,
 	return NULL;
 }
 
+static inline int
+fi_ibv_rdm_process_send_wc(struct fi_ibv_rdm_ep *ep,
+			   struct ibv_wc *wc)
+{
+	if (wc->status != IBV_WC_SUCCESS) {
+		return 1;
+	}
+
+	if (FI_IBV_RDM_CHECK_SERVICE_WR_FLAG(wc->wr_id)) {
+		VERBS_DBG(FI_LOG_EP_DATA, "CQ COMPL: SEND -> 0x1\n");
+		struct fi_ibv_rdm_conn *conn =
+			(struct fi_ibv_rdm_conn *)
+			FI_IBV_RDM_UNPACK_SERVICE_WR(wc->wr_id);
+		FI_IBV_RDM_DEC_SIG_POST_COUNTERS(conn, ep);
+
+		return 0;
+	} else {
+		FI_IBV_DBG_OPCODE(wc->opcode, "SEND");
+		struct fi_ibv_rdm_request *request =
+			(void *)FI_IBV_RDM_UNPACK_WR(wc->wr_id);
+
+		struct fi_ibv_rdm_tagged_send_completed_data data =
+			{ .ep = ep };
+
+		return fi_ibv_rdm_req_hndl(request, FI_IBV_EVENT_POST_LC,
+					   &data);
+	}
+}
+
+static inline void
+fi_ibv_rdm_process_err_send_wc(struct fi_ibv_rdm_ep *ep,
+			       struct ibv_wc *wc)
+{
+	if (wc->status != IBV_WC_SUCCESS) {
+		struct fi_ibv_rdm_conn *conn;
+		if (FI_IBV_RDM_CHECK_SERVICE_WR_FLAG(wc->wr_id)) {
+			conn = FI_IBV_RDM_UNPACK_SERVICE_WR(
+					wc->wr_id);
+		} else {
+			struct fi_ibv_rdm_request *req =
+					(void *)wc->wr_id;
+			conn = req->minfo.conn;
+			FI_IBV_RDM_DBG_REQUEST("to_pool: ", req,
+					       FI_LOG_DEBUG);
+			util_buf_release(fi_ibv_rdm_request_pool, req);
+		}
+		VERBS_INFO(FI_LOG_EP_DATA, "got ibv_wc.status = %d:%s, "
+			   "pend_send: %d, connection: %p\n",
+			   wc->status,
+			   ibv_wc_status_str(wc->status),
+			   ep->posted_sends, conn);
+	}
+}
+
 #endif /* _VERBS_RDM_H */
diff --git a/prov/verbs/src/ep_rdm/verbs_rdm_cm.c b/prov/verbs/src/ep_rdm/verbs_rdm_cm.c
index 5213fbc..27f9ef3 100644
--- a/prov/verbs/src/ep_rdm/verbs_rdm_cm.c
+++ b/prov/verbs/src/ep_rdm/verbs_rdm_cm.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2015 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation, Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -37,15 +37,17 @@
 #include "../fi_verbs.h"
 #include "verbs_utils.h"
 #include "verbs_rdm.h"
-
+#include "verbs_queuing.h"
 
 extern struct fi_provider fi_ibv_prov;
+extern struct util_buf_pool* fi_ibv_rdm_request_pool;
 
 static struct ibv_mr *
-fi_ibv_rdm_alloc_and_reg(struct fi_ibv_rdm_ep *ep, void **buf, size_t size)
+fi_ibv_rdm_alloc_and_reg(struct fi_ibv_rdm_ep *ep,
+			 void **buf, size_t size)
 {
-	*buf = memalign(FI_IBV_RDM_BUF_ALIGNMENT, size);
-	if (*buf) {
+	if (!ofi_memalign((void**)buf,
+			  FI_IBV_RDM_BUF_ALIGNMENT, size)) {
 		memset(*buf, 0, size);
 		return ibv_reg_mr(ep->domain->pd, *buf, size,
 				  IBV_ACCESS_LOCAL_WRITE |
@@ -78,8 +80,7 @@ fi_ibv_rdm_batch_repost_receives(struct fi_ibv_rdm_conn *conn,
 	struct ibv_recv_wr *bad_wr = NULL;
 	struct ibv_recv_wr wr[num_to_post];
 	struct ibv_sge sge[num_to_post];
-	int last = num_to_post - 1;
-	int i;
+	int i, last = num_to_post - 1;
 
 	/* IBV_WR_SEND opcode specific */
 	assert((num_to_post % ep->n_buffs) == 0);
@@ -88,21 +89,44 @@ fi_ibv_rdm_batch_repost_receives(struct fi_ibv_rdm_conn *conn,
 	       ep->eopcode == IBV_WR_RDMA_WRITE_WITH_IMM);
 
 	if (ep->eopcode == IBV_WR_SEND) {
-		for (i = 0; i < num_to_post; i++) {
-			sge[i].addr = (uint64_t)(void *)
-			fi_ibv_rdm_get_rbuf(conn, ep, i % ep->n_buffs);
-			sge[i].length = FI_IBV_RDM_DFLT_BUFFER_SIZE;
+		if (last >= 0) {
+			sge[last].addr = (uint64_t)(uintptr_t)
+				fi_ibv_rdm_get_rbuf(conn, ep,
+						    last % ep->n_buffs);
+			sge[last].length = ep->buff_len;
+			sge[last].lkey = conn->r_mr->lkey;
+
+			wr[last].wr_id = (uintptr_t) conn;
+			wr[last].next = NULL;
+			wr[last].sg_list = &sge[last];
+			wr[last].num_sge = 1;
+		}
+		for (i = num_to_post - 2; i >= 0; i--) {
+			sge[i].addr = (uint64_t)(uintptr_t)
+				fi_ibv_rdm_get_rbuf(conn, ep,
+						    i % ep->n_buffs);
+			sge[i].length = ep->buff_len;
 			sge[i].lkey = conn->r_mr->lkey;
-		}
-	}
 
-	for (i = 0; i < num_to_post; i++) {
-		wr[i].wr_id = (uintptr_t) conn;
-		wr[i].next = &wr[i + 1];
-		wr[i].sg_list = &sge[i];
-		wr[i].num_sge = 1;
+			wr[i].wr_id = (uintptr_t)conn;
+			wr[i].next = &wr[i + 1];
+			wr[i].sg_list = &sge[i];
+			wr[i].num_sge = 1;
+		}
+	} else {
+		if (last >= 0) {
+			wr[last].wr_id = (uintptr_t) conn;
+			wr[last].next = NULL;
+			wr[last].sg_list = &sge[last];
+			wr[last].num_sge = 1;
+		}
+		for (i = num_to_post - 2; i >= 0; i--) {
+			wr[i].wr_id = (uintptr_t)conn;
+			wr[i].next = &wr[i + 1];
+			wr[i].sg_list = &sge[i];
+			wr[i].num_sge = 1;
+		}
 	}
-	wr[last].next = NULL;
 
 	if (ibv_post_recv(conn->qp[idx], wr, &bad_wr) == 0) {
 		conn->recv_preposted += num_to_post;
@@ -213,11 +237,13 @@ fi_ibv_rdm_tagged_init_qp_attributes(struct ibv_qp_init_attr *qp_attr,
 
 }
 
-static inline void
+static inline int
 fi_ibv_rdm_pack_cm_params(struct rdma_conn_param *cm_params,
 			  struct fi_ibv_rdm_conn *conn,
 			  struct fi_ibv_rdm_ep *ep)
 {
+	char *p;
+
 	memset(cm_params, 0, sizeof(struct rdma_conn_param));
 	cm_params->responder_resources = 2;
 	cm_params->initiator_depth = 2;
@@ -231,9 +257,11 @@ fi_ibv_rdm_pack_cm_params(struct rdma_conn_param *cm_params,
 		cm_params->private_data_len += sizeof(conn->remote_sbuf_mem_reg);
 	}
 
-	cm_params->private_data = malloc(cm_params->private_data_len);
+	cm_params->private_data = calloc(1, cm_params->private_data_len);
+	if (!cm_params->private_data)
+		return -FI_ENOMEM;
 
-	char *p = (char *) cm_params->private_data;
+	p = (char *) cm_params->private_data;
 	memcpy(p, &ep->my_addr, FI_IBV_RDM_DFLT_ADDRLEN);
 	p += FI_IBV_RDM_DFLT_ADDRLEN;
 
@@ -248,6 +276,8 @@ fi_ibv_rdm_pack_cm_params(struct rdma_conn_param *cm_params,
 		memcpy(p, &conn->sbuf_mem_reg, sizeof(conn->sbuf_mem_reg));
 		p += sizeof(conn->sbuf_mem_reg);
 	}
+
+	return FI_SUCCESS;
 }
 
 
@@ -306,38 +336,34 @@ fi_ibv_rdm_process_addr_resolved(struct rdma_cm_id *id,
 
 	assert(id->verbs == ep->domain->verbs);
 
-	do {
-		fi_ibv_rdm_tagged_init_qp_attributes(&qp_attr, ep);
-		if (rdma_create_qp(id, ep->domain->pd, &qp_attr)) {
-			VERBS_INFO_ERRNO(FI_LOG_AV,
-					 "rdma_create_qp failed\n", errno);
-			return -errno;
-		}
+	fi_ibv_rdm_tagged_init_qp_attributes(&qp_attr, ep);
+	if (rdma_create_qp(id, ep->domain->pd, &qp_attr)) {
+		VERBS_INFO_ERRNO(FI_LOG_AV,
+				 "rdma_create_qp failed\n", errno);
+		return -errno;
+	}
 
-		if (conn->cm_role == FI_VERBS_CM_PASSIVE) {
-			break;
-		}
+	if (conn->cm_role == FI_VERBS_CM_PASSIVE)
+		goto resolve_route;
 
-		conn->qp[0] = id->qp;
-		assert(conn->id[0] == id);
-		if (conn->cm_role == FI_VERBS_CM_SELF) {
-			break;
-		}
+	conn->qp[0] = id->qp;
+	assert(conn->id[0] == id);
+	if (conn->cm_role == FI_VERBS_CM_SELF)
+		goto resolve_route;
 
-		ret = fi_ibv_rdm_prepare_conn_memory(ep, conn);
-		if (ret != FI_SUCCESS) {
+	ret = fi_ibv_rdm_prepare_conn_memory(ep, conn);
+	if (ret != FI_SUCCESS)
 			goto err;
-		}
 
-		ret = fi_ibv_rdm_repost_receives(conn, ep, ep->rq_wr_depth);
-		if (ret < 0) {
-			VERBS_INFO(FI_LOG_AV, "repost receives failed\n");
-			goto err;
-		} else {
-			ret = FI_SUCCESS;
-		}
-	} while (0);
+	ret = fi_ibv_rdm_repost_receives(conn, ep, ep->rq_wr_depth);
+	if (ret < 0) {
+		VERBS_INFO(FI_LOG_AV, "repost receives failed\n");
+		goto err;
+	} else {
+		ret = FI_SUCCESS;
+	}
 
+resolve_route:
 	if (rdma_resolve_route(id, FI_IBV_RDM_CM_RESOLVEADDR_TIMEOUT)) {
 		VERBS_INFO(FI_LOG_AV, "rdma_resolve_route failed\n");
 		ret = -FI_EHOSTUNREACH;
@@ -356,8 +382,9 @@ fi_ibv_rdm_process_connect_request(struct rdma_cm_event *event,
 {
 	struct ibv_qp_init_attr qp_attr;
 	struct rdma_conn_param cm_params;
-	struct fi_ibv_rdm_conn *conn = NULL;
+	struct fi_ibv_rdm_av_entry *av_entry = NULL;
 	struct rdma_cm_id *id = event->id;
+	struct fi_ibv_rdm_conn *conn;
 	ssize_t ret = FI_SUCCESS;
 
 	char *p = (char *) event->param.conn.private_data;
@@ -377,29 +404,62 @@ fi_ibv_rdm_process_connect_request(struct rdma_cm_event *event,
 		return ret;
 	}
 
-	HASH_FIND(hh, ep->domain->rdm_cm->conn_hash, p, FI_IBV_RDM_DFLT_ADDRLEN,
-		  conn);
+	HASH_FIND(hh, ep->domain->rdm_cm->av_hash, p,
+		  FI_IBV_RDM_DFLT_ADDRLEN, av_entry);
 
-	if (!conn) {
-		conn = memalign(FI_IBV_RDM_MEM_ALIGNMENT, sizeof(*conn));
-		if (!conn)
-			return -FI_ENOMEM;
+	if (!av_entry) {
+		ret = ofi_memalign((void**)&av_entry,
+				   FI_IBV_RDM_MEM_ALIGNMENT,
+				   sizeof(*av_entry));
+		if (ret)
+			return -ret;
+		memset(av_entry, 0, sizeof(*av_entry));
+		memcpy(&av_entry->addr, p, FI_IBV_RDM_DFLT_ADDRLEN);
 
-		memset(conn, 0, sizeof(*conn));
+		ret = ofi_memalign((void**)&conn,
+				   FI_IBV_RDM_MEM_ALIGNMENT,
+				   sizeof(*conn));
+		if (ret) {
+			free(av_entry);
+			return -ret;
+		}
 
+		memset(conn, 0, sizeof(*conn));
+		conn->av_entry = av_entry;
+		conn->ep = ep;
 		conn->state = FI_VERBS_CONN_ALLOCATED;
 		dlist_init(&conn->postponed_requests_head);
 		fi_ibv_rdm_unpack_cm_params(&event->param.conn, conn, ep);
 		fi_ibv_rdm_conn_init_cm_role(conn, ep);
+		HASH_ADD(hh, av_entry->conn_hash, ep,
+			 sizeof(struct fi_ibv_rdm_ep *), conn);
 
-		FI_INFO(&fi_ibv_prov, FI_LOG_AV,
-			"CONN REQUEST, NOT found in hash, new conn %p %d, addr %s:%u, HASH ADD\n",
-			conn, conn->cm_role, inet_ntoa(conn->addr.sin_addr),
-			ntohs(conn->addr.sin_port));
+		VERBS_INFO(FI_LOG_AV, "CONN REQUEST, NOT found in hash, "
+			   "new conn %p %d, addr %s:%u, HASH ADD\n",
+			   conn, conn->cm_role, inet_ntoa(conn->addr.sin_addr),
+			   ntohs(conn->addr.sin_port));
 
-		HASH_ADD(hh, ep->domain->rdm_cm->conn_hash, addr,
-			 FI_IBV_RDM_DFLT_ADDRLEN, conn);
+		HASH_ADD(hh, ep->domain->rdm_cm->av_hash, addr,
+			 FI_IBV_RDM_DFLT_ADDRLEN, av_entry);
 	} else {
+		HASH_FIND(hh, av_entry->conn_hash, &ep,
+			  sizeof(struct fi_ibv_rdm_ep *), conn);
+		if (!conn) {
+			ret = ofi_memalign((void**)&conn,
+					   FI_IBV_RDM_MEM_ALIGNMENT,
+					   sizeof(*conn));
+			if (ret)
+				return -ret;
+			memset(conn, 0, sizeof(*conn));
+			conn->ep = ep;
+			conn->av_entry = av_entry;
+			dlist_init(&conn->postponed_requests_head);
+			conn->state = FI_VERBS_CONN_ALLOCATED;
+			memcpy(&conn->addr, &av_entry->addr, FI_IBV_RDM_DFLT_ADDRLEN);
+			HASH_ADD(hh, av_entry->conn_hash, ep,
+				 sizeof(struct fi_ibv_rdm_ep *), conn);
+		}
+		fi_ibv_rdm_conn_init_cm_role(conn, ep);
 		if (conn->cm_role != FI_VERBS_CM_ACTIVE) {
 			/*
 			 * Do it before rdma_create_qp since that call would
@@ -409,10 +469,10 @@ fi_ibv_rdm_process_connect_request(struct rdma_cm_event *event,
 						    ep);
 		}
 
-		FI_INFO(&fi_ibv_prov, FI_LOG_AV,
-			"CONN REQUEST,  FOUND in hash, conn %p %d, addr %s:%u\n",
-			conn, conn->cm_role, inet_ntoa(conn->addr.sin_addr),
-			ntohs(conn->addr.sin_port));
+		VERBS_INFO(FI_LOG_AV,
+			   "CONN REQUEST,  FOUND in hash, conn %p %d, addr %s:%u\n",
+			   conn, conn->cm_role, inet_ntoa(conn->addr.sin_addr),
+			   ntohs(conn->addr.sin_port));
 	}
 
 	if (conn->cm_role == FI_VERBS_CM_ACTIVE) {
@@ -464,7 +524,12 @@ fi_ibv_rdm_process_connect_request(struct rdma_cm_event *event,
 
 		id->context = conn;
 
-		fi_ibv_rdm_pack_cm_params(&cm_params, conn, ep);
+		ret = fi_ibv_rdm_pack_cm_params(&cm_params, conn, ep);
+		if (ret) {
+			VERBS_INFO(FI_LOG_AV, "Packing of CM parameters fails, "
+				   "ret = %d\n", ret);
+			goto err;
+		}
 
 		if (rdma_accept(id, &cm_params)) {
 			VERBS_INFO_ERRNO(FI_LOG_AV, "rdma_accept\n", errno);
@@ -491,7 +556,12 @@ fi_ibv_rdm_process_route_resolved(struct rdma_cm_event *event,
 	ssize_t ret = FI_SUCCESS;
 
 	struct rdma_conn_param cm_params;
-	fi_ibv_rdm_pack_cm_params(&cm_params, conn, ep);
+	ret = fi_ibv_rdm_pack_cm_params(&cm_params, conn, ep);
+	if (ret) {
+		VERBS_INFO(FI_LOG_AV, "Packing of CM parameters fails, "
+			   "ret = %d \n", ret);
+		return ret;
+	}
 
 	VERBS_INFO(FI_LOG_AV,
 		"ROUTE RESOLVED, conn %p, addr %s:%u\n", conn,
@@ -530,9 +600,9 @@ fi_ibv_rdm_process_event_established(struct rdma_cm_event *event,
 		fi_ibv_rdm_unpack_cm_params(&event->param.conn, conn, ep);
 	}
 
-	FI_INFO(&fi_ibv_prov, FI_LOG_AV, "CONN ESTABLISHED, conn %p, addr %s:%u\n",
-		conn, inet_ntoa(conn->addr.sin_addr),
-		ntohs(conn->addr.sin_port));
+	VERBS_INFO(FI_LOG_AV, "CONN ESTABLISHED, conn %p, addr %s:%u\n",
+		   conn, inet_ntoa(conn->addr.sin_addr),
+		   ntohs(conn->addr.sin_port));
 	
 	/* Do not count self twice */
 	if (conn->state != FI_VERBS_CONN_ESTABLISHED) {
@@ -542,6 +612,24 @@ fi_ibv_rdm_process_event_established(struct rdma_cm_event *event,
 	return FI_SUCCESS;
 }
 
+ssize_t fi_ibv_rdm_overall_conn_cleanup(struct fi_ibv_rdm_av_entry *av_entry)
+{
+	struct fi_ibv_rdm_conn *conn = NULL, *tmp = NULL;
+	ssize_t ret = FI_SUCCESS;
+	ssize_t err = FI_SUCCESS;
+
+	HASH_ITER(hh, av_entry->conn_hash, conn, tmp) {
+		ret = fi_ibv_rdm_conn_cleanup(conn);
+		if (ret) {
+			VERBS_INFO(FI_LOG_AV, "Conn cleanup failed (%d) "
+				   "for av_entry = %p", ret, av_entry);
+			err = ret;
+		}
+	}
+
+	return err;
+}
+
 ssize_t fi_ibv_rdm_conn_cleanup(struct fi_ibv_rdm_conn *conn)
 {
 	ssize_t ret = FI_SUCCESS;
@@ -563,6 +651,7 @@ ssize_t fi_ibv_rdm_conn_cleanup(struct fi_ibv_rdm_conn *conn)
 			if (ret == FI_SUCCESS)
 				ret = -errno;
 		}
+		conn->id[0] = NULL;
 	}
 
 	if (conn->id[1]) {
@@ -578,6 +667,7 @@ ssize_t fi_ibv_rdm_conn_cleanup(struct fi_ibv_rdm_conn *conn)
 			if (ret == FI_SUCCESS)
 				ret = -errno;
 		}
+		conn->id[1] = NULL;
 	}
 
 	if (conn->s_mr) {
@@ -599,6 +689,7 @@ ssize_t fi_ibv_rdm_conn_cleanup(struct fi_ibv_rdm_conn *conn)
 			if (ret == FI_SUCCESS)
 				ret = -errno;
 		}
+		conn->ack_mr = NULL;
 	}
 
 	if (conn->rma_mr) {
@@ -609,7 +700,21 @@ ssize_t fi_ibv_rdm_conn_cleanup(struct fi_ibv_rdm_conn *conn)
 		}
 	}
 
-	free(conn);
+	ofi_freealign(conn);
+	return ret;
+}
+
+static int fi_ibv_rdm_poll_cq(struct fi_ibv_rdm_ep *ep)
+{
+	int i, ret = 0;
+	const int wc_count = ep->fi_scq->read_bunch_size;
+	struct ibv_wc wc[wc_count];
+
+	ret = ibv_poll_cq(ep->scq, wc_count, wc);
+	for (i = 0; i < ret; ++i)
+		if (fi_ibv_rdm_process_send_wc(ep, &wc[i]))
+			fi_ibv_rdm_process_err_send_wc(ep, &wc[i]);
+
 	return ret;
 }
 
@@ -618,23 +723,29 @@ fi_ibv_rdm_process_event_disconnected(struct fi_ibv_rdm_ep *ep,
 				      struct rdma_cm_event *event)
 {
 	struct fi_ibv_rdm_conn *conn = event->id->context;
+	struct fi_ibv_rdm_request *request = NULL;
+	int ret = 0;
 
 	ep->num_active_conns--;
-	
-	if (conn->state == FI_VERBS_CONN_ESTABLISHED) {
-		conn->state = FI_VERBS_CONN_REMOTE_DISCONNECT;
-	} else {
-		assert(conn->state == FI_VERBS_CONN_LOCAL_DISCONNECT);
-		conn->state = FI_VERBS_CONN_CLOSED;
-	}
+	conn->state = FI_VERBS_CONN_CLOSED;
+
 	VERBS_INFO(FI_LOG_AV,
 		   "Disconnected from conn %p, addr %s:%u\n",
 		   conn, inet_ntoa(conn->addr.sin_addr),
 		   ntohs(conn->addr.sin_port));
-	if (conn->state == FI_VERBS_CONN_CLOSED) {
-		return fi_ibv_rdm_conn_cleanup(conn);
+
+	/* Cleanup posted queue */
+	while (NULL !=
+		(request = fi_ibv_rdm_take_first_from_posted_queue(ep))) {
+		FI_IBV_RDM_DBG_REQUEST("to_pool: ", request, FI_LOG_DEBUG);
+		util_buf_release(fi_ibv_rdm_request_pool, request);
 	}
 
+	/* Retrieve CQ entries from send Completion Queue if any  */
+	do {
+		ret = fi_ibv_rdm_poll_cq(ep);
+	} while (ret > 0);
+
 	return FI_SUCCESS;
 }
 
@@ -744,7 +855,7 @@ ssize_t fi_ibv_rdm_cm_progress(struct fi_ibv_rdm_ep *ep)
 	if (rdma_get_cm_event(ep->domain->rdm_cm->ec, &event)) {
 		if(errno == EAGAIN) {
 			errno = 0;
-			usleep(ep->cm_progress_timeout);
+			usleep(ep->domain->rdm_cm->cm_progress_timeout);
 			return FI_SUCCESS;
 		} else {
 			VERBS_INFO_ERRNO(FI_LOG_AV,
@@ -754,14 +865,14 @@ ssize_t fi_ibv_rdm_cm_progress(struct fi_ibv_rdm_ep *ep)
 	}
 
 	while (ret == FI_SUCCESS && event) {
-		pthread_mutex_lock(&ep->cm_lock);
+		pthread_mutex_lock(&ep->domain->rdm_cm->cm_lock);
 
 		struct rdma_cm_event event_copy;
 		memcpy(&event_copy, event, sizeof(*event));
 		if (event->param.conn.private_data_len) {
 			data = malloc(event->param.conn.private_data_len);
 			if (!data) {
-				pthread_mutex_unlock(&ep->cm_lock);
+				pthread_mutex_unlock(&ep->domain->rdm_cm->cm_lock);
 				ret = -FI_ENOMEM;
 				break;
 			}
@@ -786,7 +897,7 @@ ssize_t fi_ibv_rdm_cm_progress(struct fi_ibv_rdm_ep *ep)
 
 		event = NULL;
 
-		pthread_mutex_unlock(&ep->cm_lock);
+		pthread_mutex_unlock(&ep->domain->rdm_cm->cm_lock);
 
 		if (ret != FI_SUCCESS) {
 			break;
@@ -795,7 +906,7 @@ ssize_t fi_ibv_rdm_cm_progress(struct fi_ibv_rdm_ep *ep)
 		if(rdma_get_cm_event(ep->domain->rdm_cm->ec, &event)) {
 			if(errno == EAGAIN) {
 				errno = 0;
-				usleep(ep->cm_progress_timeout);
+				usleep(ep->domain->rdm_cm->cm_progress_timeout);
 				break;
 			} else {
 				VERBS_INFO_ERRNO(FI_LOG_AV,
diff --git a/prov/verbs/src/ep_rdm/verbs_rdm_cntr.c b/prov/verbs/src/ep_rdm/verbs_rdm_cntr.c
index 51d6220..1abf660 100644
--- a/prov/verbs/src/ep_rdm/verbs_rdm_cntr.c
+++ b/prov/verbs/src/ep_rdm/verbs_rdm_cntr.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013-2016 Intel Corporation, Inc.  All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corporation, Inc.  All rights reserved.
  * Copyright (c) 2016 Cisco Systems, Inc. All rights reserved.
  *
  * This software is available to you under a choice of one of two
@@ -35,6 +35,7 @@
 
 #include "verbs_rdm.h"
 
+
 static uint64_t fi_ibv_rdm_cntr_read(struct fid_cntr *cntr_fid)
 {
 	struct fi_ibv_rdm_cntr *cntr =
@@ -65,6 +66,22 @@ static int fi_ibv_rdm_cntr_set(struct fid_cntr *cntr_fid, uint64_t value)
 	return 0;
 }
 
+static int fi_ibv_rdm_cntr_adderr(struct fid_cntr *cntr_fid, uint64_t value)
+{
+	struct fi_ibv_rdm_cntr *cntr =
+		container_of(cntr_fid, struct fi_ibv_rdm_cntr, fid);
+	cntr->err_count += value;
+	return 0;
+}
+
+static int fi_ibv_rdm_cntr_seterr(struct fid_cntr *cntr_fid, uint64_t value)
+{
+	struct fi_ibv_rdm_cntr *cntr =
+		container_of(cntr_fid, struct fi_ibv_rdm_cntr, fid);
+	cntr->err_count = value;
+	return 0;
+}
+
 static struct fi_ops_cntr fi_ibv_rdm_cntr_ops = {
 	.size = sizeof(struct fi_ops_cntr),
 	.read = fi_ibv_rdm_cntr_read,
@@ -72,6 +89,8 @@ static struct fi_ops_cntr fi_ibv_rdm_cntr_ops = {
 	.add = fi_ibv_rdm_cntr_add,
 	.set = fi_ibv_rdm_cntr_set,
 	.wait = fi_no_cntr_wait,
+	.adderr = fi_ibv_rdm_cntr_adderr,
+	.seterr = fi_ibv_rdm_cntr_seterr,
 };
 
 static int fi_ibv_rdm_cntr_close(struct fid *fid)
@@ -79,7 +98,7 @@ static int fi_ibv_rdm_cntr_close(struct fid *fid)
 	struct fi_ibv_rdm_cntr *cntr =
 		container_of(fid, struct fi_ibv_rdm_cntr, fid);
 
-	if (atomic_get(&cntr->ep_ref) > 0) {
+	if (ofi_atomic_get32(&cntr->ep_ref) > 0) {
 		return -FI_EBUSY;
 	}
 
@@ -141,7 +160,7 @@ int fi_rbv_rdm_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 	cntr->fid.fid.ops = &fi_ibv_rdm_cntr_fi_ops;
 	cntr->fid.ops = &fi_ibv_rdm_cntr_ops;
 	cntr->domain = dom;
-	atomic_initialize(&cntr->ep_ref, 0);
+	ofi_atomic_initialize32(&cntr->ep_ref, 0);
 
 	*cntr_fid = &cntr->fid;
 
diff --git a/prov/verbs/src/ep_rdm/verbs_rdm_msg.c b/prov/verbs/src/ep_rdm/verbs_rdm_msg.c
index 5e75534..2cdba80 100644
--- a/prov/verbs/src/ep_rdm/verbs_rdm_msg.c
+++ b/prov/verbs/src/ep_rdm/verbs_rdm_msg.c
@@ -61,8 +61,9 @@ static ssize_t fi_ibv_rdm_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 				.is_tagged = 0
 			},
 			.context = msg->context,
-			.flags = (ep_rdm->rx_selective_completion ?
-				flags : (flags | FI_COMPLETION))
+			.flags = ep_rdm->rx_op_flags |
+				(ep_rdm->rx_selective_completion ? flags :
+				(flags | FI_COMPLETION))
 		},
 		.dest_addr =
 			(msg->iov_count) ? msg->msg_iov[0].iov_base : NULL,
@@ -71,7 +72,8 @@ static ssize_t fi_ibv_rdm_recvmsg(struct fid_ep *ep, const struct fi_msg *msg,
 	};
 	struct fi_ibv_rdm_request *request =
 		util_buf_alloc(fi_ibv_rdm_request_pool);
-
+	if (OFI_UNLIKELY(!request))
+		return -FI_EAGAIN;
 	fi_ibv_rdm_zero_request(request);
 	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
 
@@ -95,9 +97,6 @@ fi_ibv_rdm_recvv(struct fid_ep *ep, const struct iovec *iov,
 		 void **desc, size_t count, fi_addr_t src_addr,
 		 void *context)
 {
-	struct fi_ibv_rdm_ep *ep_rdm =
-		container_of(ep, struct fi_ibv_rdm_ep, ep_fid);
-
 	const struct fi_msg msg = {
 		.msg_iov = iov,
 		.desc = desc,
@@ -107,8 +106,7 @@ fi_ibv_rdm_recvv(struct fid_ep *ep, const struct iovec *iov,
 		.data = 0
 	};
 
-	return fi_ibv_rdm_recvmsg(ep, &msg,
-		(ep_rdm->rx_selective_completion ? 0ULL : FI_COMPLETION));
+	return fi_ibv_rdm_recvmsg(ep, &msg, 0ULL);
 }
 
 static ssize_t
@@ -133,8 +131,7 @@ static ssize_t fi_ibv_rdm_sendmsg(struct fid_ep *ep, const struct fi_msg *msg,
 		.conn = ep_rdm->av->addr_to_conn(ep_rdm, msg->addr),
 		.data_len = 0,
 		.context = msg->context,
-		.flags = FI_TAGGED | FI_SEND | (ep_rdm->tx_selective_completion ?
-			(flags & FI_COMPLETION) : FI_COMPLETION),
+		.flags = FI_MSG | FI_SEND | GET_TX_COMP_FLAG(ep_rdm, flags),
 		.tag = 0,
 		.is_tagged = 0,
 		.buf.src_addr = NULL,
@@ -196,8 +193,7 @@ static ssize_t fi_ibv_rdm_sendv(struct fid_ep *ep, const struct iovec *iov,
 		.data = 0
 	};
 
-	return fi_ibv_rdm_sendmsg(ep, &msg,
-		(ep_rdm->tx_selective_completion ? 0ULL : FI_COMPLETION));
+	return fi_ibv_rdm_sendmsg(ep, &msg, GET_TX_COMP(ep_rdm));
 }
 
 static ssize_t fi_ibv_rdm_send(struct fid_ep *ep, const void *buf, size_t len,
diff --git a/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm.c b/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm.c
index 263d540..728fb7b 100644
--- a/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm.c
+++ b/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm.c
@@ -51,11 +51,10 @@ DEFINE_LIST(fi_ibv_rdm_unexp_queue);
 DEFINE_LIST(fi_ibv_rdm_postponed_queue);
 
 static inline int fi_ibv_rdm_tagged_poll_send(struct fi_ibv_rdm_ep *ep);
-static inline int fi_ibv_rdm_tagged_poll_recv(struct fi_ibv_rdm_ep *ep);
 
 int
 fi_ibv_rdm_tagged_prepare_send_request(struct fi_ibv_rdm_request *request,
-					struct fi_ibv_rdm_ep *ep)
+				       struct fi_ibv_rdm_ep *ep)
 {
 #if ENABLE_DEBUG
 	int res = OUTGOING_POST_LIMIT(request->minfo.conn, ep);
@@ -88,16 +87,25 @@ fi_ibv_rdm_prepare_rma_request(struct fi_ibv_rdm_request *request,
 
 static int fi_ibv_rdm_tagged_getname(fid_t fid, void *addr, size_t * addrlen)
 {
-	struct fi_ibv_rdm_ep *ep =
-		container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
+	struct fi_ibv_rdm_ep *ep;
+
+	if (fid->fclass == FI_CLASS_EP) {
+ 		ep = container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
+	} else {
+		VERBS_INFO(FI_LOG_EP_CTRL, "Invalid fid class: %d\n",
+			  fid->fclass);
+		return -FI_EINVAL;
+	}
 
 	if (FI_IBV_RDM_DFLT_ADDRLEN > *addrlen) {
 		*addrlen = FI_IBV_RDM_DFLT_ADDRLEN;
 		return -FI_ETOOSMALL;
 	}
+
 	memset(addr, 0, *addrlen);
 	memcpy(addr, &ep->my_addr, FI_IBV_RDM_DFLT_ADDRLEN);
-	ep->addrlen = *addrlen;
+	*addrlen = FI_IBV_RDM_DFLT_ADDRLEN;
+	ep->addrlen = FI_IBV_RDM_DFLT_ADDRLEN;
 
 	return 0;
 }
@@ -126,8 +134,9 @@ fi_ibv_rdm_tagged_recvmsg(struct fid_ep *ep_fid, const struct fi_msg_tagged *msg
 				.is_tagged = 1
 			},
 			.context = msg->context,
-			.flags = (ep_rdm->rx_selective_completion ?
-				flags : (flags | FI_COMPLETION))
+			.flags = ep_rdm->rx_op_flags |
+				(ep_rdm->rx_selective_completion ? flags :
+				(flags | FI_COMPLETION))
 		},
 		.dest_addr =
 			(msg->iov_count) ? msg->msg_iov[0].iov_base : NULL,
@@ -137,7 +146,8 @@ fi_ibv_rdm_tagged_recvmsg(struct fid_ep *ep_fid, const struct fi_msg_tagged *msg
 
 	struct fi_ibv_rdm_request *request =
 		util_buf_alloc(fi_ibv_rdm_request_pool);
-
+	if (OFI_UNLIKELY(!request))
+		return -FI_EAGAIN;
 	fi_ibv_rdm_zero_request(request);
 	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
 
@@ -177,9 +187,6 @@ fi_ibv_rdm_tagged_recvv(struct fid_ep *ep_fid, const struct iovec *iov, void **d
 			size_t count, fi_addr_t src_addr, uint64_t tag,
 			uint64_t ignore, void *context)
 {
-	struct fi_ibv_rdm_ep *ep_rdm =
-		container_of(ep_fid, struct fi_ibv_rdm_ep, ep_fid);
-
 	const struct fi_msg_tagged msg = {
 		.msg_iov = iov,
 		.desc = desc,
@@ -191,9 +198,7 @@ fi_ibv_rdm_tagged_recvv(struct fid_ep *ep_fid, const struct iovec *iov, void **d
 		.data = 0
 	};
 
-	return fi_ibv_rdm_tagged_recvmsg(ep_fid, &msg,
-		(ep_rdm->rx_selective_completion ? 0ULL : FI_COMPLETION));
-
+	return fi_ibv_rdm_tagged_recvmsg(ep_fid, &msg, 0ULL);
 }
 
 static ssize_t fi_ibv_rdm_tagged_recvfrom(struct fid_ep *ep_fid, void *buf,
@@ -285,14 +290,12 @@ static ssize_t fi_ibv_rdm_tagged_senddatato(struct fid_ep *fid, const void *buf,
 {
 	struct fi_ibv_rdm_ep *ep_rdm = 
 		container_of(fid, struct fi_ibv_rdm_ep, ep_fid);
-
 	struct fi_ibv_rdm_send_start_data sdata = {
 		.ep_rdm = container_of(fid, struct fi_ibv_rdm_ep, ep_fid),
 		.conn = ep_rdm->av->addr_to_conn(ep_rdm, dest_addr),
 		.data_len = len,
 		.context = context,
-		.flags = FI_TAGGED | FI_SEND |
-			(ep_rdm->tx_selective_completion ? 0ULL : FI_COMPLETION),
+		.flags = FI_TAGGED | FI_SEND | GET_TX_COMP(ep_rdm),
 		.tag = tag,
 		.is_tagged = 1,
 		.buf.src_addr = (void*)buf,
@@ -324,8 +327,7 @@ static ssize_t fi_ibv_rdm_tagged_sendmsg(struct fid_ep *ep,
 		.conn = ep_rdm->av->addr_to_conn(ep_rdm, msg->addr),
 		.data_len = 0,
 		.context = msg->context,
-		.flags = FI_TAGGED | FI_SEND | (ep_rdm->tx_selective_completion ?
-			(flags & FI_COMPLETION) : FI_COMPLETION),
+		.flags = FI_TAGGED | FI_SEND | GET_TX_COMP_FLAG(ep_rdm, flags),
 		.tag = msg->tag,
 		.is_tagged = 1,
 		.buf.src_addr = NULL,
@@ -390,8 +392,7 @@ static ssize_t fi_ibv_rdm_tagged_sendv(struct fid_ep *ep,
 		.data = 0
 	};
 
-	return fi_ibv_rdm_tagged_sendmsg(ep, &msg,
-		(ep_rdm->tx_selective_completion ? 0ULL : FI_COMPLETION));
+	return fi_ibv_rdm_tagged_sendmsg(ep, &msg, GET_TX_COMP(ep_rdm));
 }
 
 struct fi_ops_tagged fi_ibv_rdm_tagged_ops = {
@@ -490,6 +491,8 @@ fi_ibv_rdm_process_recv(struct fi_ibv_rdm_ep *ep, struct fi_ibv_rdm_conn *conn,
 			request = found_request;
 		} else {
 			request = util_buf_alloc(fi_ibv_rdm_request_pool);
+			if (OFI_UNLIKELY(!request))
+				return;
 			fi_ibv_rdm_zero_request(request);
 
 			FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request,
@@ -550,6 +553,17 @@ fi_ibv_rdm_process_recv_wc(struct fi_ibv_rdm_ep *ep, struct ibv_wc *wc)
 
 		VERBS_INFO(FI_LOG_EP_DATA, "conn %p state %d, wc status %d\n",
 			conn, conn->state, wc->status);
+		/* on QP error initiate disconnection procedure:
+		 * flush as many as possible preposted (and failed)
+		 * entries and after this set connection to 'closed' state */
+		if (!conn->recv_preposted) {
+			VERBS_DBG(FI_LOG_EP_DATA, "no more preposted entries: "
+				"conn %p state %d\n",
+				conn, conn->state);
+			return 0;
+		}
+
+		conn->recv_preposted--;
 		if (wc->status == IBV_WC_WR_FLUSH_ERR &&
 		    conn->state == FI_VERBS_CONN_ESTABLISHED)
 		{
@@ -565,8 +579,10 @@ fi_ibv_rdm_process_recv_wc(struct fi_ibv_rdm_ep *ep, struct ibv_wc *wc)
 			       (!ep->is_closing ||
 				conn->state != FI_VERBS_CONN_ESTABLISHED));
 		}
-
-		return 1;
+		conn->state = FI_VERBS_CONN_CLOSED;
+	}
+	else {
+		check_and_repost_receives(ep, conn);
 	}
 
 	conn->recv_completions++;
@@ -577,17 +593,14 @@ fi_ibv_rdm_process_recv_wc(struct fi_ibv_rdm_ep *ep, struct ibv_wc *wc)
 	VERBS_DBG(FI_LOG_EP_DATA, "conn %p recv_completions %d\n",
 		conn, conn->recv_completions);
 
-	check_and_repost_receives(ep, conn);
-
-	if ((rbuf->service_data.status == BUF_STATUS_RECVED) &&
-	    /* NOTE: the ibverbs bug?
-	     * In case of out of order arriving we may check seq_num only if
+	if ((rbuf->service_data.status == BUF_STATUS_RECEIVED) &&
+	    /* NOTE: Bi-direction RNDV messaging may cause "out-of-order"
+	     * consuming of pre-posts. These are RTS and ACK messages of
+	     * different requests. In this case we may check seq_num only if
 	     * send was posted with IBV_WR_RDMA_WRITE_WITH_IMM opcode because
-	     * the sender controls this.
-	     * Otherwise, the sender with IBV_WR_SEND opcode consumes pre-posted
-	     * buffers in the same order as they were pre-posted by recv.
-	     * So, we should handle it as is. Potentially, this way may cause
-	     * broken ordering of completions in fi_cq.
+	     * the sender controls this. Otherwise, the sender with IBV_WR_SEND
+	     * opcode consumes pre-posted buffers in the same order as they were
+	     * pre-posted by recv. So, we should handle it as is.
 	     */
 	    (wc->opcode == IBV_WC_RECV_RDMA_WITH_IMM ?
 	    fi_ibv_rdm_buffer_check_seq_num(rbuf, conn->recv_processed) : 1))
@@ -617,7 +630,7 @@ fi_ibv_rdm_process_recv_wc(struct fi_ibv_rdm_ep *ep, struct ibv_wc *wc)
 
 		/* Do not process w/o completion! */
 		} while (conn->recv_processed != conn->recv_completions &&
-			 rbuf->service_data.status == BUF_STATUS_RECVED);
+			 rbuf->service_data.status == BUF_STATUS_RECEIVED);
 	} else {
 		VERBS_DBG(FI_LOG_EP_DATA, "not processed: conn %p, status: %d\n",
 			conn, rbuf->service_data.status);
@@ -626,7 +639,7 @@ fi_ibv_rdm_process_recv_wc(struct fi_ibv_rdm_ep *ep, struct ibv_wc *wc)
 	return 0;
 }
 
-static inline int fi_ibv_rdm_tagged_poll_recv(struct fi_ibv_rdm_ep *ep)
+int fi_ibv_rdm_tagged_poll_recv(struct fi_ibv_rdm_ep *ep)
 {
 	const int wc_count = ep->fi_rcq->read_bunch_size;
 	struct ibv_wc wc[wc_count];
@@ -676,40 +689,11 @@ static inline int fi_ibv_rdm_tagged_poll_recv(struct fi_ibv_rdm_ep *ep)
 	return -FI_EOTHER;
 }
 
-static inline int
-fi_ibv_rdm_process_send_wc(struct fi_ibv_rdm_ep *ep, struct ibv_wc *wc)
-{
-	if (wc->status != IBV_WC_SUCCESS) {
-		return 1;
-	}
-
-	if (FI_IBV_RDM_CHECK_SERVICE_WR_FLAG(wc->wr_id)) {
-		VERBS_DBG(FI_LOG_EP_DATA, "CQ COMPL: SEND -> 0x1\n");
-		struct fi_ibv_rdm_conn *conn =
-			(struct fi_ibv_rdm_conn *)
-			FI_IBV_RDM_UNPACK_SERVICE_WR(wc->wr_id);
-		FI_IBV_RDM_DEC_SIG_POST_COUNTERS(conn, ep);
-
-		return 0;
-	} else {
-		FI_IBV_DBG_OPCODE(wc->opcode, "SEND");
-		struct fi_ibv_rdm_request *request =
-			(void *)FI_IBV_RDM_UNPACK_WR(wc->wr_id);
-
-		struct fi_ibv_rdm_tagged_send_completed_data data = 
-			{ .ep = ep };
-
-		return fi_ibv_rdm_req_hndl(request, FI_IBV_EVENT_POST_LC, &data);
-	}
-}
-
 static inline int fi_ibv_rdm_tagged_poll_send(struct fi_ibv_rdm_ep *ep)
 {
 	const int wc_count = ep->fi_scq->read_bunch_size;
 	struct ibv_wc wc[wc_count];
-	int ret = 0;
-	int err = 0;
-	int i = 0;
+	int ret = 0, err = 0, i;
 
 	if (ep->posted_sends > 0) {
 		do {
@@ -743,25 +727,8 @@ wc_error:
 		assert(0);
 	}
 
-	for (i = 0; i < wc_count; i++) {
-		if (wc[i].status != IBV_WC_SUCCESS) {
-			struct fi_ibv_rdm_conn *conn;
-			if (FI_IBV_RDM_CHECK_SERVICE_WR_FLAG(wc[i].wr_id)) {
-				conn = FI_IBV_RDM_UNPACK_SERVICE_WR(wc[i].wr_id);
-			} else {
-				struct fi_ibv_rdm_request *req =
-					(void *)wc[i].wr_id;
-				conn = req->minfo.conn;
-			}
-
-			VERBS_INFO(FI_LOG_EP_DATA,
-				"got ibv_wc.status = %d:%s, pend_send: %d, connection: %p\n",
-				wc[i].status,
-				ibv_wc_status_str(wc[i].status),
-				ep->posted_sends, conn);
-			assert(0);
-		}
-	}
+	for (i = 0; i < wc_count; i++)
+		fi_ibv_rdm_process_err_send_wc(ep, &wc[i]);
 
 	return -FI_EOTHER;
 }
diff --git a/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.c b/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.c
index 3223db9..a597f62 100644
--- a/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.c
+++ b/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.c
@@ -33,6 +33,10 @@
 #include <inttypes.h>
 #include <stdlib.h>
 
+#ifdef HAVE_VERBS_EXP_H
+#include <infiniband/verbs_exp.h>
+#endif /* HAVE_VERBS_EXP_H */
+
 #include <fi_list.h>
 #include "../fi_verbs.h"
 #include "verbs_rdm.h"
@@ -86,7 +90,7 @@ static ssize_t
 fi_ibv_rdm_init_send_request(struct fi_ibv_rdm_request *request, void *data)
 {
 	FI_IBV_RDM_HNDL_REQ_LOG_IN();
-
+	ssize_t ret;
 	struct fi_ibv_rdm_send_start_data *p = data;
 	request->minfo.conn = p->conn;
 	request->minfo.tag = p->tag;
@@ -113,7 +117,9 @@ fi_ibv_rdm_init_send_request(struct fi_ibv_rdm_request *request, void *data)
 
 	FI_IBV_RDM_HNDL_REQ_LOG();
 
-	fi_ibv_rdm_move_to_postponed_queue(request);
+	ret = fi_ibv_rdm_move_to_postponed_queue(request);
+	if (ret)
+		return ret;
 	request->state.eager = FI_IBV_STATE_EAGER_SEND_POSTPONED;
 	if (request->state.rndv == FI_IBV_STATE_RNDV_SEND_BEGIN) {
 		request->state.rndv = FI_IBV_STATE_RNDV_SEND_WAIT4SEND;
@@ -165,7 +171,7 @@ fi_ibv_rdm_eager_send_ready(struct fi_ibv_rdm_request *request, void *data)
 	wr.imm_data = 0;
 	wr.opcode = p->ep->eopcode;
 	struct fi_ibv_rdm_buf *sbuf = (struct fi_ibv_rdm_buf *)request->sbuf;
-	uint8_t *payload = &sbuf->payload;
+	uint64_t *payload = &sbuf->payload;
 
 	sbuf->header.service_tag = 0;
 	if (request->minfo.is_tagged) {
@@ -462,6 +468,127 @@ fi_ibv_rdm_copy_unexp_request(struct fi_ibv_rdm_request *request,
 	return ret;
 }
 
+/*
+ * FI_MULTI_RECV path is implemented through a parent multi_request.
+ * This is a kind of supervisor which keep another preposted request while multi
+ * recv buffer has enough space for incoming data. The last prepost releases
+ * the parent and sets FI_MULTI_RECV completion flag.
+ */
+static struct fi_ibv_rdm_request *
+fi_ibv_rdm_repost_multi_recv(struct fi_ibv_rdm_request *request,
+			     size_t offset, struct fi_ibv_rdm_ep *ep)
+{
+	struct fi_ibv_rdm_multi_request *parent;
+	struct fi_ibv_rdm_request *prepost;
+
+	if (!(prepost = util_buf_alloc(fi_ibv_rdm_request_pool))) {
+		VERBS_WARN(FI_LOG_EP_DATA, "Unable to allocate memory for "
+			   "multi recv prepost request\n");
+		return NULL;
+	}
+
+	fi_ibv_rdm_zero_request(prepost);
+	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", prepost, FI_LOG_DEBUG);
+	FI_IBV_RDM_DBG_REQUEST("repost from: ", request, FI_LOG_DEBUG);
+
+	parent = request->parent;
+	request->parent = NULL;
+	parent->prepost = prepost;
+	parent->offset += offset;
+
+	VERBS_DBG(FI_LOG_EP_DATA,
+		"multi_recv parent: prepost %p, buf %p, len %d, offset %d min_size %d\n",
+		parent->prepost, parent->buf, parent->len, parent->offset, parent->min_size);
+
+	prepost->parent = parent;
+	prepost->minfo = request->minfo;
+	prepost->dest_buf = parent->buf + parent->offset;
+
+	prepost->comp_flags = request->comp_flags;
+	prepost->len = parent->len - parent->offset;
+	if (prepost->len < parent->min_size) {
+		/* This is the last one, parent can be released */
+		prepost->comp_flags |= FI_MULTI_RECV;
+		free(prepost->parent);
+		prepost->parent = NULL;
+		FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", prepost, FI_LOG_DEBUG);
+	}
+	prepost->context = request->context;
+	prepost->context->internal[0] = (void *)prepost;
+
+	/* TODO: way for (RNDV) optimization is do registration only once */
+	//prepost->rndv = request->rndv;
+
+	prepost->state.eager = FI_IBV_STATE_EAGER_RECV_WAIT4PKT;
+	prepost->state.rndv = FI_IBV_STATE_RNDV_NOT_USED;
+	prepost->state.err = FI_SUCCESS;
+	fi_ibv_rdm_move_to_posted_queue(prepost, ep);
+	return prepost;
+}
+
+static inline ssize_t
+fi_ibv_rdm_try_unexp_recv(struct fi_ibv_rdm_request *request,
+			  struct fi_ibv_rdm_tagged_recv_start_data *rdata)
+{
+	struct dlist_entry *found_entry = NULL;
+	struct fi_ibv_rdm_request *found_request = NULL;
+	struct fi_ibv_rdm_request *repost = NULL;
+	ssize_t ret = FI_ENOMSG;
+
+	do {
+		found_entry =
+			dlist_find_first_match(&fi_ibv_rdm_unexp_queue,
+						fi_ibv_rdm_req_match_by_info3,
+						&rdata->peek_data);
+
+		if (found_entry) {
+			ret = FI_SUCCESS;
+			found_request =
+				container_of(found_entry,
+					     struct fi_ibv_rdm_request,
+					     queue_entry);
+
+			fi_ibv_rdm_remove_from_unexp_queue(found_request);
+
+			if (request->parent) {
+				repost = fi_ibv_rdm_repost_multi_recv(request,
+					 found_request->len, rdata->ep);
+				if (!repost) {
+					ret = -FI_ENOMEM;
+					break;
+				}
+			}
+
+			ret = fi_ibv_rdm_copy_unexp_request(request, found_request);
+
+			assert((ret != FI_SUCCESS) ||
+				((rdata->peek_data.flags & FI_CLAIM) &&
+					(request->state.eager == 
+						FI_IBV_STATE_EAGER_RECV_CLAIMED) &&
+					(request->context == found_request->context)) ||
+			       (!(rdata->peek_data.flags & FI_CLAIM) && 
+					(request->state.eager == 
+						FI_IBV_STATE_EAGER_RECV_WAIT4RECV)));
+
+			FI_IBV_RDM_DBG_REQUEST("to_pool: ", found_request, FI_LOG_DEBUG);
+			util_buf_release(fi_ibv_rdm_request_pool, found_request);
+
+			if (ret == FI_SUCCESS &&
+			    request->state.rndv == FI_IBV_STATE_RNDV_RECV_WAIT4RES) {
+				request->state.eager = FI_IBV_STATE_EAGER_RECV_END;
+				ret = fi_ibv_rdm_move_to_postponed_queue(request);
+				/* Will fail `while` check and return the result */
+			}
+		}
+	/* 
+	* Unexpected queue may contain several entries
+	* in case of multi recv, we need to handle them all
+	*/
+	} while (repost && repost->parent && found_entry && !ret);
+
+	return ret;
+}
+
 static ssize_t
 fi_ibv_rdm_init_recv_request(struct fi_ibv_rdm_request *request, void *data)
 {
@@ -470,6 +597,23 @@ fi_ibv_rdm_init_recv_request(struct fi_ibv_rdm_request *request, void *data)
 	ssize_t ret = FI_SUCCESS;
 	struct fi_ibv_rdm_tagged_recv_start_data *p = data;
 
+	if (p->peek_data.flags & FI_MULTI_RECV) {
+		/* TODO: optimization - replace allocation with a buffer pool */
+		request->parent = calloc(1, sizeof(*request->parent));
+		if (!request->parent) {
+			VERBS_WARN(FI_LOG_EP_DATA, "Unable to allocate memory "
+				   "for parent \n");
+			return -FI_ENOMEM;
+		}
+		request->parent->prepost = request;
+		request->parent->buf = p->dest_addr;
+		request->parent->len = p->data_len;
+		request->parent->offset = 0;
+		request->parent->min_size = p->ep->min_multi_recv_size;
+		VERBS_DBG(FI_LOG_EP_DATA, "conn %p, multi_recv %p, parent %p\n",
+			request->minfo.conn, request, request->parent);
+	}
+
 	request->minfo = p->peek_data.minfo;
 	request->context = p->peek_data.context;
 	request->context->internal[0] = (void *)request;
@@ -485,60 +629,11 @@ fi_ibv_rdm_init_recv_request(struct fi_ibv_rdm_request *request, void *data)
 	VERBS_DBG(FI_LOG_EP_DATA, "conn %p, tag 0x%llx, len %d\n",
 		request->minfo.conn, request->minfo.tag, request->len);
 
-	struct dlist_entry *found_entry =
-	    dlist_find_first_match(&fi_ibv_rdm_unexp_queue,
-				   fi_ibv_rdm_req_match_by_info3,
-				   &p->peek_data);
-
-	if (found_entry) {
-
-		struct fi_ibv_rdm_request *found_request =
-		    container_of(found_entry, struct fi_ibv_rdm_request,
-				 queue_entry);
-
-		fi_ibv_rdm_remove_from_unexp_queue(found_request);
-
-		ret = fi_ibv_rdm_copy_unexp_request(request, found_request);
-
-		assert((ret != FI_SUCCESS) ||
-			((p->peek_data.flags & FI_CLAIM) &&
-				(request->state.eager == 
-					FI_IBV_STATE_EAGER_RECV_CLAIMED) &&
-				(request->context == found_request->context)) ||
-		       (!(p->peek_data.flags & FI_CLAIM) && 
-				(request->state.eager == 
-					FI_IBV_STATE_EAGER_RECV_WAIT4RECV)));
-
-		FI_IBV_RDM_HNDL_REQ_LOG();
-
-		FI_IBV_RDM_DBG_REQUEST("to_pool: ", found_request, FI_LOG_DEBUG);
-		util_buf_release(fi_ibv_rdm_request_pool, found_request);
-
-		if (ret == FI_SUCCESS &&
-		    request->state.rndv == FI_IBV_STATE_RNDV_RECV_WAIT4RES)
-		{
-			request->state.eager = FI_IBV_STATE_EAGER_RECV_END;
-			FI_IBV_RDM_HNDL_REQ_LOG();
-			fi_ibv_rdm_move_to_postponed_queue(request);
-		}
-#if ENABLE_DEBUG
-		request->minfo.conn->unexp_counter++;
-#endif // ENABLE_DEBUG
-
-	} else {
-
-#if ENABLE_DEBUG
-		if (request->minfo.conn) {
-			request->minfo.conn->exp_counter++;
-		}
-#endif // ENABLE_DEBUG
-
-		if (ret == FI_SUCCESS) {
-			fi_ibv_rdm_move_to_posted_queue(request, p->ep);
-		}
-	}
-	
-	if (ret != FI_SUCCESS) {
+	ret = fi_ibv_rdm_try_unexp_recv(request, p);
+	if (ret == FI_ENOMSG) {
+		fi_ibv_rdm_move_to_posted_queue(request, p->ep);
+		ret = FI_SUCCESS;
+	} else if (ret != FI_SUCCESS) {
 		request->state.eager = FI_IBV_STATE_EAGER_READY_TO_FREE;
 
 		fi_ibv_rdm_cntr_inc_err(p->ep->recv_cntr);
@@ -569,6 +664,9 @@ fi_ibv_rdm_tagged_peek_request(struct fi_ibv_rdm_request *request, void *data)
 					fi_ibv_rdm_req_match_by_info2,
 					&peek_data->minfo);
 
+	/* TODO: to check behaviour for multi recv */
+	assert(!(peek_data->flags & FI_MULTI_RECV));
+
 	request->context = peek_data->context;
 	request->comp_flags = peek_data->flags;
 
@@ -716,6 +814,7 @@ fi_ibv_rdm_eager_recv_got_pkt(struct fi_ibv_rdm_request *request, void *data)
 	FI_IBV_RDM_HNDL_REQ_LOG_IN();
 	struct fi_ibv_recv_got_pkt_preprocess_data *p = data;
 	struct fi_ibv_rdm_buf *rbuf = p->rbuf;
+	ssize_t ret;
 	assert(request->state.eager == FI_IBV_STATE_EAGER_RECV_WAIT4PKT);
 	assert(request->state.rndv == FI_IBV_STATE_RNDV_NOT_USED);
 
@@ -726,22 +825,32 @@ fi_ibv_rdm_eager_recv_got_pkt(struct fi_ibv_rdm_request *request, void *data)
 		const size_t data_len = p->arrived_len - sizeof(rbuf->header);
 		assert(data_len <= p->ep->rndv_threshold);
 
+		if (request->parent) {
+			if (!fi_ibv_rdm_repost_multi_recv(request, data_len, p->ep))
+				return -FI_ENOMEM;
+		}
+
 		if (request->len >= data_len) {
 			request->minfo.conn = p->conn;
 			request->minfo.tag = rbuf->header.tag;
 			request->minfo.is_tagged = FI_IBV_RDM_EAGER_PKT ? 1 : 0;
 
-			request->len = p->arrived_len - sizeof(rbuf->header);
+			request->len = data_len;
 			request->exp_rbuf = &rbuf->payload;
 			request->imm = p->imm_data;
 
-
 			if (request->dest_buf) {
 				assert(request->exp_rbuf);
 				memcpy(request->dest_buf,
 					request->exp_rbuf, request->len);
 			}
 
+			if (request->parent) {
+				if (!fi_ibv_rdm_repost_multi_recv(request, data_len,
+							     p->ep))
+					return -FI_ENOMEM;
+			}
+
 			fi_ibv_rdm_cntr_inc(p->ep->recv_cntr);
 
 			if (request->comp_flags & FI_COMPLETION) {
@@ -764,6 +873,12 @@ fi_ibv_rdm_eager_recv_got_pkt(struct fi_ibv_rdm_request *request, void *data)
 				request->minfo.tag,
 				request->minfo.tagmask);
 
+			if (request->parent) {
+				if (!fi_ibv_rdm_repost_multi_recv(request, data_len,
+							     p->ep))
+					return -FI_ENOMEM;
+			}
+
 			request->state.eager =
 				FI_IBV_STATE_EAGER_READY_TO_FREE;
 
@@ -801,7 +916,16 @@ fi_ibv_rdm_eager_recv_got_pkt(struct fi_ibv_rdm_request *request, void *data)
 		request->imm = p->imm_data;
 		request->rndv.id = rndv_header->id;
 
-		fi_ibv_rdm_move_to_postponed_queue(request);
+		if (request->parent) {
+			if (!fi_ibv_rdm_repost_multi_recv(request,
+						     rndv_header->total_len,
+						     p->ep))
+				return -FI_ENOMEM;
+		}
+
+		ret = fi_ibv_rdm_move_to_postponed_queue(request);
+		if (ret)
+			return ret;
 
 		request->state.eager = FI_IBV_STATE_EAGER_RECV_END;
 		request->state.rndv = FI_IBV_STATE_RNDV_RECV_WAIT4RES;
@@ -899,6 +1023,38 @@ fi_ibv_rdm_eager_recv_discard(struct fi_ibv_rdm_request *request, void *data)
 	return FI_SUCCESS;
 }
 
+static inline ssize_t
+fi_ibv_rdm_rndv_read_reg_mr(struct fi_ibv_rdm_ep *ep,
+			    struct fi_ibv_rdm_request *request)
+{
+#if defined HAVE_VERBS_EXP_H
+	struct ibv_exp_reg_mr_in in;
+	in.pd = ep->domain->pd;
+	in.addr = request->dest_buf;
+	in.length = request->len;
+	in.exp_access = IBV_EXP_ACCESS_LOCAL_WRITE;
+	if (ep->use_odp) {
+		in.exp_access |= IBV_EXP_ACCESS_RELAXED |
+				 IBV_EXP_ACCESS_ON_DEMAND;
+	}
+	in.comp_mask = 0;
+	request->rndv.mr = ibv_exp_reg_mr(&in);
+#else /* HAVE_VERBS_EXP_H */
+	request->rndv.mr = ibv_reg_mr(ep->domain->pd, request->dest_buf,
+					request->len,
+					IBV_ACCESS_LOCAL_WRITE |
+					IBV_ACCESS_REMOTE_WRITE);
+#endif /* HAVE_VERBS_EXP_H */
+
+	if (!request->rndv.mr) {
+		VERBS_INFO_ERRNO(FI_LOG_EP_DATA, "failed ibv_reg_mr",
+				 errno);
+		assert(0);
+		return -FI_ENOMEM;
+	}
+	return FI_SUCCESS;
+}
+
 static ssize_t
 fi_ibv_rdm_rndv_recv_post_read(struct fi_ibv_rdm_request *request, void *data)
 {
@@ -914,6 +1070,7 @@ fi_ibv_rdm_rndv_recv_post_read(struct fi_ibv_rdm_request *request, void *data)
 	struct ibv_send_wr wr = { 0 };
 	struct ibv_send_wr *bad_wr = NULL;
 	struct ibv_sge sge;
+	ssize_t ret = FI_SUCCESS;
 
 	fi_ibv_rdm_remove_from_postponed_queue(request);
 	VERBS_DBG(FI_LOG_EP_DATA,
@@ -928,16 +1085,9 @@ fi_ibv_rdm_rndv_recv_post_read(struct fi_ibv_rdm_request *request, void *data)
 
 	/* First segment */
 	if (offset == 0) {
-		request->rndv.mr =
-			ibv_reg_mr(p->ep->domain->pd, request->dest_buf,
-				   request->len,
-				   IBV_ACCESS_LOCAL_WRITE |
-				   IBV_ACCESS_REMOTE_WRITE);
-		if (!request->rndv.mr) {
-			VERBS_INFO_ERRNO(FI_LOG_EP_DATA, "failed ibv_reg_mr",
-					 errno);
-			assert(0);
-			return -FI_ENOMEM;
+		ret = fi_ibv_rdm_rndv_read_reg_mr(p->ep, request);
+		if (ret) {
+			return ret;
 		}
 		request->post_counter = 0;
 	}
@@ -961,7 +1111,7 @@ fi_ibv_rdm_rndv_recv_post_read(struct fi_ibv_rdm_request *request, void *data)
 	FI_IBV_RDM_INC_SIG_POST_COUNTERS(request->minfo.conn, p->ep, wr.send_flags);
 	VERBS_DBG(FI_LOG_EP_DATA, "posted %d bytes, conn %p, tag 0x%llx\n",
 		  sge.length, request->minfo.conn, request->minfo.tag);
-	int ret = ibv_post_send(request->minfo.conn->qp[0], &wr, &bad_wr);
+	ret = ibv_post_send(request->minfo.conn->qp[0], &wr, &bad_wr);
 	if (ret) {
 		VERBS_INFO_ERRNO(FI_LOG_EP_DATA, "ibv_post_send", errno);
 		assert(0);
@@ -970,14 +1120,14 @@ fi_ibv_rdm_rndv_recv_post_read(struct fi_ibv_rdm_request *request, void *data)
 
 	if (request->rest_len && request->state.err == FI_SUCCESS) {
 		/* Move to postponed queue for the next iteration */
-		fi_ibv_rdm_move_to_postponed_queue(request);
+		ret = fi_ibv_rdm_move_to_postponed_queue(request);
 	} else {
 		request->state.eager = FI_IBV_STATE_EAGER_RECV_END;
 		request->state.rndv = FI_IBV_STATE_RNDV_RECV_WAIT4LC;
 	}
 
 	FI_IBV_RDM_HNDL_REQ_LOG_OUT();
-	return FI_SUCCESS;
+	return ret;
 }
 
 static ssize_t
@@ -1107,6 +1257,8 @@ fi_ibv_rdm_rma_init_request(struct fi_ibv_rdm_request *request, void *data)
 
 	struct fi_ibv_rdm_rma_start_data *p = 
 		(struct fi_ibv_rdm_rma_start_data *)data;
+	ssize_t ret = FI_SUCCESS;
+	int lmr_access = 0;
 
 	request->context = p->context;
 	request->minfo.conn = p->conn;
@@ -1118,10 +1270,12 @@ fi_ibv_rdm_rma_init_request(struct fi_ibv_rdm_request *request, void *data)
 	request->rma.rkey = p->rkey;
 	request->rma.lkey = p->lkey;
 	request->rma.opcode = p->op_code;
-	
+	request->rma.mr = NULL;
+
 	request->comp_flags = p->flags;
 	if (p->op_code == IBV_WR_RDMA_READ) {
 		request->dest_buf = (void*)p->lbuf;
+		lmr_access |= IBV_ACCESS_LOCAL_WRITE;
 	} else {
 		assert(p->op_code == IBV_WR_RDMA_WRITE);
 		request->src_addr = (void*)p->lbuf;
@@ -1130,13 +1284,22 @@ fi_ibv_rdm_rma_init_request(struct fi_ibv_rdm_request *request, void *data)
 	if (request->rmabuf && request->len >= p->ep_rdm->max_inline_rc) {
 		memcpy(&request->rmabuf->payload, request->src_addr,
 			request->len);
+	} else if (!request->rmabuf && !p->lkey) {
+		request->rma.mr = ibv_reg_mr(p->ep_rdm->domain->pd,
+					     (void *)p->lbuf, p->data_len,
+					     lmr_access);
+		if (request->rma.mr) {
+			request->rma.lkey = request->rma.mr->lkey;
+		} else {
+			ret = -FI_ENOMEM;
+		}
 	}
 
 	request->state.eager = FI_IBV_STATE_EAGER_RMA_INITIALIZED;
 
 	FI_IBV_RDM_HNDL_REQ_LOG_OUT();
 
-	return FI_SUCCESS;
+	return ret;
 }
 
 static ssize_t
@@ -1168,7 +1331,8 @@ fi_ibv_rdm_rma_inject_request(struct fi_ibv_rdm_request *request, void *data)
 	sge.addr = p->lbuf;
 
 	if ((request->len < p->ep_rdm->max_inline_rc) && 
-	    (!RMA_RESOURCES_IS_BUSY(request->minfo.conn, p->ep_rdm)))
+	    (!RMA_RESOURCES_IS_BUSY(request->minfo.conn, p->ep_rdm)) &&
+	    fi_ibv_rdm_check_connection(request->minfo.conn, p->ep_rdm))
 	{
 		wr.send_flags |= IBV_SEND_INLINE;
 	} else if (fi_ibv_rdm_prepare_rma_request(request, p->ep_rdm)) {
@@ -1208,6 +1372,7 @@ fi_ibv_rdm_rma_post_ready(struct fi_ibv_rdm_request *request, void *data)
 	struct ibv_sge sge = { 0 };
 	struct ibv_send_wr wr = { 0 };
 	struct ibv_send_wr *bad_wr = NULL;
+
 	wr.wr_id = FI_IBV_RDM_PACK_WR(request);
 	wr.sg_list = &sge;
 	wr.num_sge = 1;
@@ -1248,7 +1413,9 @@ fi_ibv_rdm_rma_post_ready(struct fi_ibv_rdm_request *request, void *data)
 	int ret = ibv_post_send(request->minfo.conn->qp[0], &wr, &bad_wr);
 
 	if (request->rest_len) {
-		fi_ibv_rdm_move_to_postponed_queue(request);
+		ret = fi_ibv_rdm_move_to_postponed_queue(request);
+		if (ret)
+			return ret;
 		request->state.eager = FI_IBV_STATE_EAGER_RMA_POSTPONED;
 	}
 
@@ -1292,28 +1459,23 @@ fi_ibv_rdm_rma_buffered_lc(struct fi_ibv_rdm_request *request, void *data)
 	struct fi_ibv_rdm_tagged_send_completed_data *p = data;
 	FI_IBV_RDM_DEC_SIG_POST_COUNTERS(request->minfo.conn, p->ep);
 
-	if (request->state.eager == FI_IBV_STATE_EAGER_RMA_WAIT4LC) {
-		if (request->rmabuf) {
-			if (request->rma.opcode == IBV_WR_RDMA_READ) {
-				memcpy(request->dest_buf,
-				       &request->rmabuf->payload, request->len);
-			}
-			fi_ibv_rdm_set_buffer_status(request->rmabuf,
-						     BUF_STATUS_FREE);
-		}
+	assert(request->rmabuf);
+	if (request->rma.opcode == IBV_WR_RDMA_READ) {
+		memcpy(request->dest_buf, &request->rmabuf->payload, request->len);
+	}
+	fi_ibv_rdm_set_buffer_status(request->rmabuf, BUF_STATUS_FREE);
 
-		if (request->rma.opcode == IBV_WR_RDMA_READ) {
-			fi_ibv_rdm_cntr_inc(p->ep->read_cntr);
-		} else if (request->rma.opcode == IBV_WR_RDMA_WRITE) {
-			fi_ibv_rdm_cntr_inc(p->ep->write_cntr);
-		}
+	if (request->rma.opcode == IBV_WR_RDMA_READ) {
+		fi_ibv_rdm_cntr_inc(p->ep->read_cntr);
+	} else if (request->rma.opcode == IBV_WR_RDMA_WRITE) {
+		fi_ibv_rdm_cntr_inc(p->ep->write_cntr);
+	}
 
-		if (request->comp_flags & FI_COMPLETION) {
-			fi_ibv_rdm_move_to_cq(p->ep->fi_scq, request);
-		} else {
-			request->state.eager = FI_IBV_STATE_EAGER_READY_TO_FREE;
-			FI_IBV_RDM_HNDL_REQ_LOG();
-		}
+	if (request->comp_flags & FI_COMPLETION) {
+		fi_ibv_rdm_move_to_cq(p->ep->fi_scq, request);
+	} else {
+		request->state.eager = FI_IBV_STATE_EAGER_READY_TO_FREE;
+		FI_IBV_RDM_HNDL_REQ_LOG();
 	}
 
 	if (request->state.eager == FI_IBV_STATE_EAGER_READY_TO_FREE) {
@@ -1331,11 +1493,13 @@ fi_ibv_rdm_rma_buffered_lc(struct fi_ibv_rdm_request *request, void *data)
 static ssize_t
 fi_ibv_rdm_rma_zerocopy_lc(struct fi_ibv_rdm_request *request, void *data)
 {
+	ssize_t ret = FI_SUCCESS;
 	FI_IBV_RDM_HNDL_REQ_LOG_IN();
 
 	assert(request->state.eager == FI_IBV_STATE_EAGER_RMA_INITIALIZED ||
 		(request->state.eager == FI_IBV_STATE_EAGER_RMA_POSTPONED));
 	assert(request->state.rndv == FI_IBV_STATE_ZEROCOPY_RMA_WAIT4LC);
+	assert(!request->rmabuf);
 
 	VERBS_DBG(FI_LOG_EP_DATA, "conn %p, tag 0x%llx, len %lu\n",
 		request->minfo.conn, request->minfo.tag, request->len);
@@ -1345,6 +1509,10 @@ fi_ibv_rdm_rma_zerocopy_lc(struct fi_ibv_rdm_request *request, void *data)
 	request->post_counter--;
 
 	if (request->rest_len == 0 && request->post_counter == 0) {
+		if (request->rma.mr) {
+			ret = - ibv_dereg_mr(request->rma.mr);
+		}
+
 		if (request->rma.opcode == IBV_WR_RDMA_READ) {
 			fi_ibv_rdm_cntr_inc(p->ep->read_cntr);
 		} else if (request->rma.opcode == IBV_WR_RDMA_WRITE) {
@@ -1352,7 +1520,11 @@ fi_ibv_rdm_rma_zerocopy_lc(struct fi_ibv_rdm_request *request, void *data)
 		}
 
 		if (request->comp_flags & FI_COMPLETION) {
-			fi_ibv_rdm_move_to_cq(p->ep->fi_scq, request);
+			if (ret) {
+				fi_ibv_rdm_move_to_errcq(p->ep->fi_scq, request, ret);
+			} else {
+				fi_ibv_rdm_move_to_cq(p->ep->fi_scq, request);
+			}
 			request->state.eager = FI_IBV_STATE_EAGER_READY_TO_FREE;
 			request->state.rndv = FI_IBV_STATE_ZEROCOPY_RMA_END;
 		} else {
@@ -1362,7 +1534,7 @@ fi_ibv_rdm_rma_zerocopy_lc(struct fi_ibv_rdm_request *request, void *data)
 	}
 
 	FI_IBV_RDM_HNDL_REQ_LOG_OUT();
-	return FI_SUCCESS;
+	return ret;
 }
 
 static ssize_t
diff --git a/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.h b/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.h
index ddaa682..3b290fc 100644
--- a/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.h
+++ b/prov/verbs/src/ep_rdm/verbs_tagged_ep_rdm_states.h
@@ -176,10 +176,10 @@ struct fi_ibv_rdm_rma_start_data {
 	void *context;
 	uint64_t flags;
 	uint64_t data_len;
-	uint64_t rbuf;
+	uintptr_t rbuf;
 	uintptr_t lbuf;
-	uint32_t rkey;
-	uint32_t lkey;
+	uint64_t rkey;
+	uint64_t lkey;
 	enum ibv_wr_opcode op_code;
 };
 
diff --git a/prov/verbs/src/ep_rdm/verbs_utils.c b/prov/verbs/src/ep_rdm/verbs_utils.c
index f06506d..c1e891d 100644
--- a/prov/verbs/src/ep_rdm/verbs_utils.c
+++ b/prov/verbs/src/ep_rdm/verbs_utils.c
@@ -71,7 +71,8 @@ int fi_ibv_rdm_req_match_by_info(struct dlist_entry *item, const void *info)
 			&&
 			(request->minfo.is_tagged ?
 			((request->minfo.tag & request->minfo.tagmask) ==
-			(minfo->tag          & request->minfo.tagmask)) : 1)
+			(minfo->tag          & request->minfo.tagmask)) :
+			(request->minfo.is_tagged == minfo->is_tagged))
 		);
 }
 
@@ -92,7 +93,8 @@ int fi_ibv_rdm_req_match_by_info2(struct dlist_entry *item, const void *info)
 			&&
 			(minfo->is_tagged ?
 			((request->minfo.tag & minfo->tagmask) ==
-			(minfo->tag          & minfo->tagmask)) : 1)
+			(minfo->tag          & minfo->tagmask)) :
+			(request->minfo.is_tagged == minfo->is_tagged))
 		);
 }
 
@@ -191,7 +193,7 @@ void fi_ibv_rdm_clean_queues(struct fi_ibv_rdm_ep* ep)
 		util_buf_release(fi_ibv_rdm_request_pool, request);
 	}
 
-	while ((request = fi_ibv_rdm_take_first_from_posted_queue())) {
+	while ((request = fi_ibv_rdm_take_first_from_posted_queue(ep))) {
 		if (request->iov_count > 0) {
 			util_buf_release(fi_ibv_rdm_extra_buffers_pool,
 					request->unexp_rbuf);
@@ -243,6 +245,8 @@ fi_ibv_rdm_send_common(struct fi_ibv_rdm_send_start_data* sdata)
 {
 	struct fi_ibv_rdm_request *request =
 		util_buf_alloc(fi_ibv_rdm_request_pool);
+	if (OFI_UNLIKELY(!request))
+		return -FI_EAGAIN;
 	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
 
 	/* Initial state */
@@ -250,12 +254,13 @@ fi_ibv_rdm_send_common(struct fi_ibv_rdm_send_start_data* sdata)
 	request->state.rndv  = FI_IBV_STATE_RNDV_NOT_USED;
 	request->state.err   = FI_SUCCESS;
 
+	/* postponed_entry means that there are elements postponed to
+	 * send & current request must be queued */
 	const int in_order = (sdata->conn->postponed_entry) ? 0 : 1;
 	int ret = fi_ibv_rdm_req_hndl(request, FI_IBV_EVENT_SEND_START, sdata);
 
 	if (!ret && in_order &&
-		fi_ibv_rdm_tagged_prepare_send_request(request, sdata->ep_rdm))
-	{
+	    fi_ibv_rdm_tagged_prepare_send_request(request, sdata->ep_rdm)) {
 		struct fi_ibv_rdm_tagged_send_ready_data req_data = 
 			{ .ep = sdata->ep_rdm };
 		ret = fi_ibv_rdm_req_hndl(request, FI_IBV_EVENT_POST_READY,
diff --git a/prov/verbs/src/ep_rdm/verbs_utils.h b/prov/verbs/src/ep_rdm/verbs_utils.h
index 9669f78..5164426 100644
--- a/prov/verbs/src/ep_rdm/verbs_utils.h
+++ b/prov/verbs/src/ep_rdm/verbs_utils.h
@@ -83,8 +83,13 @@ struct fi_ibv_msg_ep;
  */
 size_t rdm_buffer_size(size_t buf_send_size);
 
+#ifdef HAVE_VERBS_EXP_H
+/* 128MB is ODP MR limitation */
+#define FI_IBV_RDM_SEG_MAXSIZE (128*1024*1024)
+#else /* HAVE_VERBS_EXP_H */
 /* 1GB is RC_QP limitation */
 #define FI_IBV_RDM_SEG_MAXSIZE (1024*1024*1024)
+#endif /* HAVE_VERBS_EXP_H */
 
 /* TODO: CQs depths increased from 100 to 1000 to prevent
  *      "Work Request Flushed Error" in stress tests like alltoall.
@@ -170,7 +175,7 @@ struct fi_ibv_rdm_tagged_peek_data {
 };
 
 struct fi_ibv_rdm_cm;
-struct fi_ibv_rdm_request *request;
+struct fi_ibv_rdm_request;
 struct fi_ibv_rdm_send_start_data;
 
 int fi_ibv_rdm_req_match(struct dlist_entry *item, const void *other);
diff --git a/prov/verbs/src/fi_verbs.c b/prov/verbs/src/fi_verbs.c
index e8f6a57..660b6c5 100644
--- a/prov/verbs/src/fi_verbs.c
+++ b/prov/verbs/src/fi_verbs.c
@@ -41,10 +41,20 @@ static void fi_ibv_fini(void);
 
 static const char *local_node = "localhost";
 
+#define VERBS_DEFAULT_MIN_RNR_TIMER 12
+
+size_t verbs_default_tx_size 		= 384;
+size_t verbs_default_rx_size 		= 384;
+size_t verbs_default_tx_iov_limit 	= 4;
+size_t verbs_default_rx_iov_limit 	= 4;
+size_t verbs_default_inline_size 	= 64;
+
+size_t verbs_min_rnr_timer = VERBS_DEFAULT_MIN_RNR_TIMER;
+
 struct fi_provider fi_ibv_prov = {
 	.name = VERBS_PROV_NAME,
 	.version = VERBS_PROV_VERS,
-	.fi_version = FI_VERSION(1, 3),
+	.fi_version = FI_VERSION(1, 5),
 	.getinfo = fi_ibv_getinfo,
 	.fabric = fi_ibv_fabric,
 	.cleanup = fi_ibv_fini
@@ -73,11 +83,15 @@ int fi_ibv_rdm_cm_bind_ep(struct fi_ibv_rdm_cm *cm, struct fi_ibv_rdm_ep *ep)
 
 	assert(cm->ec && cm->listener);
 
-	memcpy(&ep->my_addr, ep->domain->info->src_addr, sizeof(ep->my_addr));
+	if (ep->info->src_addr) {
+		memcpy(&ep->my_addr, ep->info->src_addr, sizeof(ep->my_addr));
 
-	inet_ntop(ep->my_addr.sin_family,
-		  &ep->my_addr.sin_addr.s_addr,
-		  my_ipoib_addr_str, INET_ADDRSTRLEN);
+		inet_ntop(ep->my_addr.sin_family,
+			  &ep->my_addr.sin_addr.s_addr,
+			  my_ipoib_addr_str, INET_ADDRSTRLEN);
+	} else {
+		strcpy(my_ipoib_addr_str, "undefined");
+	}
 
 	VERBS_INFO(FI_LOG_EP_CTRL, "My IPoIB: %s\n", my_ipoib_addr_str);
 
@@ -170,8 +184,7 @@ int fi_ibv_create_ep(const char *node, const char *service,
 		     uint64_t flags, const struct fi_info *hints,
 		     struct rdma_addrinfo **rai, struct rdma_cm_id **id)
 {
-	struct rdma_addrinfo *_rai;
-	struct sockaddr *local_addr;
+	struct rdma_addrinfo *_rai = NULL;
 	int ret;
 
 	ret = fi_ibv_get_rdma_rai(node, service, flags, hints, &_rai);
@@ -185,15 +198,6 @@ int fi_ibv_create_ep(const char *node, const char *service,
 		ret = -errno;
 		goto err1;
 	}
-	if (rai && !_rai->ai_src_addr) {
-		local_addr = rdma_get_local_addr(*id);
-		_rai->ai_src_len = fi_ibv_sockaddr_len(local_addr);
-		if (!(_rai->ai_src_addr = malloc(_rai->ai_src_len))) {
-			ret = -FI_ENOMEM;
-			goto err2;
-		}
-		memcpy(_rai->ai_src_addr, local_addr, _rai->ai_src_len);
-	}
 
 	if (rai) {
 		*rai = _rai;
@@ -202,8 +206,6 @@ int fi_ibv_create_ep(const char *node, const char *service,
 	}
 
 	return ret;
-err2:
-	rdma_destroy_ep(*id);
 err1:
 	rdma_freeaddrinfo(_rai);
 
@@ -217,8 +219,8 @@ void fi_ibv_destroy_ep(struct rdma_addrinfo *rai, struct rdma_cm_id **id)
 }
 
 #define VERBS_SIGNAL_SEND(ep) \
-	(atomic_get(&ep->unsignaled_send_cnt) >= VERBS_SEND_SIGNAL_THRESH(ep) && \
-	 !atomic_get(&ep->comp_pending))
+	(ofi_atomic_get32(&ep->unsignaled_send_cnt) >= VERBS_SEND_SIGNAL_THRESH(ep) && \
+	 !ofi_atomic_get32(&ep->comp_pending))
 
 static int fi_ibv_signal_send(struct fi_ibv_msg_ep *ep, struct ibv_send_wr *wr)
 {
@@ -226,7 +228,7 @@ static int fi_ibv_signal_send(struct fi_ibv_msg_ep *ep, struct ibv_send_wr *wr)
 
 	fastlock_acquire(&ep->scq->lock);
 	if (VERBS_SIGNAL_SEND(ep)) {
-		epe = util_buf_alloc(ep->scq->domain->fab->epe_pool);
+		epe = util_buf_alloc(ep->scq->epe_pool);
 		if (!epe) {
 			fastlock_release(&ep->scq->lock);
 			return -FI_ENOMEM;
@@ -236,7 +238,7 @@ static int fi_ibv_signal_send(struct fi_ibv_msg_ep *ep, struct ibv_send_wr *wr)
 		wr->wr_id = ep->ep_id;
 		epe->ep = ep;
 		slist_insert_tail(&epe->entry, &ep->scq->ep_list);
-		atomic_inc(&ep->comp_pending);
+		ofi_atomic_inc32(&ep->comp_pending);
 	}
 	fastlock_release(&ep->scq->lock);
 	return 0;
@@ -249,9 +251,9 @@ static int fi_ibv_reap_comp(struct fi_ibv_msg_ep *ep)
 	int ret = 0;
 
 	fastlock_acquire(&ep->scq->lock);
-	while (atomic_get(&ep->comp_pending) > 0) {
+	while (ofi_atomic_get32(&ep->comp_pending) > 0) {
 		if (!wce) {
-			wce = util_buf_alloc(ep->scq->domain->fab->wce_pool);
+			wce = util_buf_alloc(ep->scq->wce_pool);
 			if (!wce) {
 				fastlock_release(&ep->scq->lock);
 				return -FI_ENOMEM;
@@ -260,9 +262,9 @@ static int fi_ibv_reap_comp(struct fi_ibv_msg_ep *ep)
 		}
 		ret = fi_ibv_poll_cq(ep->scq, &wce->wc);
 		if (ret < 0) {
-			FI_WARN(&fi_ibv_prov, FI_LOG_EP_DATA,
-				"Failed to read completion for signaled send\n");
-			util_buf_release(ep->scq->domain->fab->wce_pool, wce);
+			VERBS_WARN(FI_LOG_EP_DATA,
+				   "Failed to read completion for signaled send\n");
+			util_buf_release(ep->scq->wce_pool, wce);
 			fastlock_release(&ep->scq->lock);
 			return ret;
 		} else if (ret > 0) {
@@ -272,7 +274,7 @@ static int fi_ibv_reap_comp(struct fi_ibv_msg_ep *ep)
 		}
 	}
 	if (wce)
-		util_buf_release(ep->scq->domain->fab->wce_pool, wce);
+		util_buf_release(ep->scq->wce_pool, wce);
 
 	if (got_wc && ep->scq->channel)
 		ret = fi_ibv_cq_signal(&ep->scq->cq_fid);
@@ -293,16 +295,16 @@ ssize_t fi_ibv_send(struct fi_ibv_msg_ep *ep, struct ibv_send_wr *wr, size_t len
 
 	if (wr->send_flags & IBV_SEND_SIGNALED) {
 		assert((wr->wr_id & ep->scq->wr_id_mask) != ep->scq->send_signal_wr_id);
-		atomic_set(&ep->unsignaled_send_cnt, 0);
+		ofi_atomic_set32(&ep->unsignaled_send_cnt, 0);
 	} else {
 		if (VERBS_SIGNAL_SEND(ep)) {
 			ret = fi_ibv_signal_send(ep, wr);
 			if (ret)
 				return ret;
 		} else {
-			atomic_inc(&ep->unsignaled_send_cnt);
+			ofi_atomic_inc32(&ep->unsignaled_send_cnt);
 
-			if (atomic_get(&ep->unsignaled_send_cnt) >=
+			if (ofi_atomic_get32(&ep->unsignaled_send_cnt) >=
 					VERBS_SEND_COMP_THRESH(ep)) {
 				ret = fi_ibv_reap_comp(ep);
 				if (ret)
@@ -359,9 +361,98 @@ ssize_t fi_ibv_send_iov_flags(struct fi_ibv_msg_ep *ep, struct ibv_send_wr *wr,
 
 	wr->send_flags = VERBS_INJECT_FLAGS(ep, len, flags) | VERBS_COMP_FLAGS(ep, flags);
 
+	if (flags & FI_FENCE)
+		wr->send_flags = IBV_SEND_FENCE;
+
 	return fi_ibv_send(ep, wr, len, count, context);
 }
 
+static int fi_ibv_get_param_int(char *param_name, char *param_str,
+				size_t *param_default)
+{
+	char *param_help;
+	size_t len, ret_len;
+	int param, ret = FI_SUCCESS;
+
+	len = strlen(param_str) + 50;
+	param_help = calloc(1, len);
+	if (!param_help)
+		return -FI_ENOMEM;
+
+	ret_len = snprintf(param_help, len, "%s (default: %zu)", param_str,
+			   *param_default);
+	if (ret_len >= len) {
+		VERBS_WARN(FI_LOG_EP_DATA,
+			   "param_help string size insufficient!\n");
+		assert(0);
+		ret = -FI_ETOOSMALL;
+		goto out;
+	}
+
+	fi_param_define(&fi_ibv_prov, param_name, FI_PARAM_INT, param_help);
+
+	if (!fi_param_get_int(&fi_ibv_prov, param_name, &param))
+		*param_default = param;
+
+out:
+	free(param_help);
+	return ret;
+}
+
+#if ENABLE_DEBUG
+static int fi_ibv_dbg_query_qp_attr(struct ibv_qp *qp)
+{
+	struct ibv_qp_init_attr attr = { 0 };
+	struct ibv_qp_attr qp_attr = { 0 };
+	int ret;
+
+	ret = ibv_query_qp(qp, &qp_attr, IBV_QP_TIMEOUT | IBV_QP_RETRY_CNT |
+			   IBV_QP_RNR_RETRY | IBV_QP_MIN_RNR_TIMER, &attr);
+	if (ret) {
+		VERBS_WARN(FI_LOG_EP_CTRL, "Unable to query QP\n");
+		return ret;
+	}
+	FI_DBG_TRACE(&fi_ibv_prov, FI_LOG_EP_CTRL, "QP attributes: "
+		     "min_rnr_timer"	": %" PRIu8 ", "
+		     "timeout"		": %" PRIu8 ", "
+		     "retry_cnt"	": %" PRIu8 ", "
+		     "rnr_retry"	": %" PRIu8 "\n",
+		     qp_attr.min_rnr_timer, qp_attr.timeout, qp_attr.retry_cnt,
+		     qp_attr.rnr_retry);
+	return 0;
+}
+#else
+static int fi_ibv_dbg_query_qp_attr(struct ibv_qp *qp)
+{
+	return 0;
+}
+#endif
+
+int fi_ibv_set_rnr_timer(struct ibv_qp *qp)
+{
+	struct ibv_qp_attr attr = { 0 };
+	int ret;
+
+	if (verbs_min_rnr_timer > 31) {
+		VERBS_WARN(FI_LOG_EQ, "min_rnr_timer value out of valid range; "
+			   "using default value of %d\n",
+			   VERBS_DEFAULT_MIN_RNR_TIMER);
+		attr.min_rnr_timer = VERBS_DEFAULT_MIN_RNR_TIMER;
+	} else {
+		attr.min_rnr_timer = verbs_min_rnr_timer;
+	}
+
+	ret = ibv_modify_qp(qp, &attr, IBV_QP_MIN_RNR_TIMER);
+	if (ret) {
+		VERBS_WARN(FI_LOG_EQ, "Unable to modify QP attribute\n");
+		return ret;
+	}
+	ret = fi_ibv_dbg_query_qp_attr(qp);
+	if (ret)
+		return ret;
+	return 0;
+}
+
 static void fi_ibv_fini(void)
 {
 	fi_ibv_free_info();
@@ -379,9 +470,12 @@ VERBS_INI
 	fi_param_define(&fi_ibv_prov, "rdm_buffer_size", FI_PARAM_INT,
 			"the maximum size of a buffered operation (bytes) "
 			"(default: platform specific)");
+	fi_param_define(&fi_ibv_prov, "rdm_use_odp", FI_PARAM_BOOL,
+			"enable on-demand paging experimental feature"
+			"(default: platform specific)");
 	fi_param_define(&fi_ibv_prov, "rdm_rndv_seg_size", FI_PARAM_INT,
 			"the segment size for zero copy protocols (bytes)"
-			"(default: 1073741824)");
+			"(default: platform specific");
 	fi_param_define(&fi_ibv_prov, "rdm_cqread_bunch_size", FI_PARAM_INT,
 			"the number of entries to be read from the verbs "
 			"completion queue at a time (default: 8)");
@@ -394,5 +488,30 @@ VERBS_INI
 			"The last one is not applicable for iWarp. "
 			"(default: IBV_WR_SEND)");
 
+	if (fi_ibv_get_param_int("tx_size", "Default maximum tx context size",
+				 &verbs_default_tx_size))
+		return NULL;
+
+	if (fi_ibv_get_param_int("rx_size", "Default maximum rx context size",
+				 &verbs_default_rx_size))
+		return NULL;
+
+	if (fi_ibv_get_param_int("tx_iov_limit", "Default maximum tx iov_limit",
+				 &verbs_default_tx_iov_limit))
+		return NULL;
+
+	if (fi_ibv_get_param_int("rx_iov_limit", "Default maximum rx iov_limit",
+				 &verbs_default_rx_iov_limit))
+		return NULL;
+
+	if (fi_ibv_get_param_int("inline_size", "Default maximum inline size. "
+				 "Actual inject size returned in fi_info may be "
+				 "greater", &verbs_default_inline_size))
+		return NULL;
+
+	if (fi_ibv_get_param_int("min_rnr_timer", "Set min_rnr_timer QP "
+				 "attribute (0 - 31)", &verbs_min_rnr_timer))
+		return NULL;
+
 	return &fi_ibv_prov;
 }
diff --git a/prov/verbs/src/fi_verbs.h b/prov/verbs/src/fi_verbs.h
index f5721ce..43f1125 100644
--- a/prov/verbs/src/fi_verbs.h
+++ b/prov/verbs/src/fi_verbs.h
@@ -52,7 +52,6 @@
 
 #include <infiniband/ib.h>
 #include <infiniband/verbs.h>
-#include <infiniband/driver.h>
 #include <rdma/rdma_cma.h>
 
 #include <rdma/fabric.h>
@@ -63,10 +62,12 @@
 #include <rdma/fi_errno.h>
 
 #include "fi.h"
+#include "ofi_atomic.h"
 #include "fi_enosys.h"
 #include "prov.h"
 #include "fi_list.h"
 #include "fi_signal.h"
+#include "fi_util.h"
 
 #ifndef AF_IB
 #define AF_IB 27
@@ -83,6 +84,7 @@
 #define VERBS_INFO(subsys, ...) FI_INFO(&fi_ibv_prov, subsys, __VA_ARGS__)
 #define VERBS_INFO_ERRNO(subsys, fn, errno) VERBS_INFO(subsys, fn ": %s(%d)\n",	\
 		strerror(errno), errno)
+#define VERBS_WARN(subsys, ...) FI_WARN(&fi_ibv_prov, subsys, __VA_ARGS__)
 
 
 #define VERBS_INJECT_FLAGS(ep, len, flags) (((flags & FI_INJECT) || \
@@ -101,14 +103,32 @@
 #define VERBS_EPE_CNT 1024
 
 #define VERBS_DEF_CQ_SIZE 1024
+#define VERBS_MR_IOV_LIMIT 1
 
 extern struct fi_provider fi_ibv_prov;
+extern struct fi_info *verbs_info;
 
+extern size_t verbs_default_tx_size;
+extern size_t verbs_default_rx_size;
+extern size_t verbs_default_tx_iov_limit;
+extern size_t verbs_default_rx_iov_limit;
+extern size_t verbs_default_inline_size;
+
+extern size_t verbs_min_rnr_timer;
+
+struct verbs_addr {
+	struct dlist_entry entry;
+	struct rdma_addrinfo *rai;
+};
+
+struct verbs_dev_info {
+	struct dlist_entry entry;
+	char *name;
+	struct dlist_entry addrs;
+};
 
 struct fi_ibv_fabric {
-	struct fid_fabric	fabric_fid;
-	struct util_buf_pool	*wce_pool;
-	struct util_buf_pool	*epe_pool;
+	struct util_fabric	util_fabric;
 };
 
 int fi_ibv_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
@@ -148,15 +168,27 @@ typedef fi_addr_t
 	(*fi_ibv_rdm_conn_to_addr_func)
 	(struct fi_ibv_rdm_ep *ep, struct fi_ibv_rdm_conn *conn);
 
+typedef struct fi_ibv_rdm_av_entry *
+	(*fi_ibv_rdm_addr_to_av_entry_func)
+	(struct fi_ibv_rdm_ep *ep, fi_addr_t addr);
+
+typedef fi_addr_t
+	(*fi_ibv_rdm_av_entry_to_addr_func)
+	(struct fi_ibv_rdm_ep *ep, struct fi_ibv_rdm_av_entry *av_entry);
+
 struct fi_ibv_av {
 	struct fid_av		av_fid;
 	struct fi_ibv_domain	*domain;
 	struct fi_ibv_rdm_ep	*ep;
+	struct fi_ibv_eq	*eq;
 	size_t			count;
 	size_t			used;
+	uint64_t		flags;
 	enum fi_av_type		type;
 	fi_ibv_rdm_addr_to_conn_func addr_to_conn;
 	fi_ibv_rdm_conn_to_addr_func conn_to_addr;
+	fi_ibv_rdm_addr_to_av_entry_func addr_to_av_entry;
+	fi_ibv_rdm_av_entry_to_addr_func av_entry_to_addr;
 };
 
 int fi_ibv_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
@@ -170,6 +202,7 @@ struct fi_ibv_pep {
 	int			backlog;
 	int			bound;
 	size_t			src_addrlen;
+	struct fi_info		*info;
 };
 
 struct fi_ops_cm *fi_ibv_pep_ops_cm(struct fi_ibv_pep *pep);
@@ -186,8 +219,11 @@ struct fi_ibv_domain {
 	 */
 	int			rdm;
 	struct fi_ibv_rdm_cm	*rdm_cm;
+	struct slist		ep_list;
 	struct fi_info		*info;
 	struct fi_ibv_fabric	*fab;
+	struct fi_ibv_eq	*eq;
+	uint64_t		eq_flags;
 };
 
 struct fi_ibv_cq;
@@ -216,7 +252,9 @@ struct fi_ibv_cq {
 	uint64_t		send_signal_wr_id;
 	uint64_t		wr_id_mask;
 	fi_ibv_trywait_func	trywait;
-	atomic_t		nevents;
+	ofi_atomic32_t		nevents;
+	struct util_buf_pool	*epe_pool;
+	struct util_buf_pool	*wce_pool;
 };
 
 struct fi_ibv_rdm_cq {
@@ -257,9 +295,10 @@ struct fi_ibv_msg_ep {
 	struct fi_ibv_srq_ep	*srq_ep;
 	uint64_t		ep_flags;
 	struct fi_info		*info;
-	atomic_t		unsignaled_send_cnt;
-	atomic_t		comp_pending;
+	ofi_atomic32_t		unsignaled_send_cnt;
+	ofi_atomic32_t		comp_pending;
 	uint64_t		ep_id;
+	struct fi_ibv_domain	*domain;
 };
 
 struct fi_ibv_msg_epe {
@@ -279,6 +318,8 @@ int fi_ibv_create_ep(const char *node, const char *service,
 void fi_ibv_destroy_ep(struct rdma_addrinfo *rai, struct rdma_cm_id **id);
 int fi_rbv_rdm_cntr_open(struct fid_domain *domain, struct fi_cntr_attr *attr,
 			struct fid_cntr **cntr, void *context);
+int fi_ibv_rdm_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
+			struct fid_av **av_fid, void *context);
 struct fi_ops_atomic *fi_ibv_msg_ep_ops_atomic(struct fi_ibv_msg_ep *ep);
 struct fi_ops_cm *fi_ibv_msg_ep_ops_cm(struct fi_ibv_msg_ep *ep);
 struct fi_ops_msg *fi_ibv_msg_ep_ops_msg(struct fi_ibv_msg_ep *ep);
@@ -302,7 +343,6 @@ void fi_ibv_free_info();
 int fi_ibv_getinfo(uint32_t version, const char *node, const char *service,
 		   uint64_t flags, struct fi_info *hints, struct fi_info **info);
 struct fi_info *fi_ibv_get_verbs_info(const char *domain_name);
-void fi_ibv_update_info(const struct fi_info *hints, struct fi_info *info);
 int fi_ibv_fi_to_rai(const struct fi_info *fi, uint64_t flags,
 		     struct rdma_addrinfo *rai);
 int fi_ibv_get_rdma_rai(const char *node, const char *service, uint64_t flags,
@@ -317,10 +357,6 @@ struct verbs_ep_domain {
 
 extern const struct verbs_ep_domain verbs_rdm_domain;
 
-int fi_ibv_check_fabric_attr(const struct fi_fabric_attr *attr,
-			     const struct fi_info *info);
-int fi_ibv_check_domain_attr(const struct fi_domain_attr *attr,
-			     const struct fi_info *info);
 int fi_ibv_check_ep_attr(const struct fi_ep_attr *attr,
 			 const struct fi_info *info);
 int fi_ibv_check_rx_attr(const struct fi_rx_attr *attr,
@@ -341,6 +377,14 @@ ssize_t fi_ibv_send_iov_flags(struct fi_ibv_msg_ep *ep, struct ibv_send_wr *wr,
 ssize_t fi_ibv_poll_cq(struct fi_ibv_cq *cq, struct ibv_wc *wc);
 int fi_ibv_cq_signal(struct fid_cq *cq);
 
+ssize_t fi_ibv_eq_write_event(struct fi_ibv_eq *eq, uint32_t event,
+		const void *buf, size_t len);
+
+int fi_ibv_query_atomic(struct fid_domain *domain_fid, enum fi_datatype datatype,
+			enum fi_op op, struct fi_atomic_attr *attr,
+			uint64_t flags);
+int fi_ibv_set_rnr_timer(struct ibv_qp *qp);
+
 #define fi_ibv_set_sge(sge, buf, len, desc)				\
 	do {								\
 		sge.addr = (uintptr_t)buf;				\
diff --git a/prov/verbs/src/verbs_atomic.c b/prov/verbs/src/verbs_atomic.c
index 4c14d41..55a6f69 100644
--- a/prov/verbs/src/verbs_atomic.c
+++ b/prov/verbs/src/verbs_atomic.c
@@ -35,54 +35,77 @@
 #include "fi_verbs.h"
 
 
-static int
-fi_ibv_msg_ep_atomic_writevalid(struct fid_ep *ep, enum fi_datatype datatype,
-				enum fi_op op, size_t *count)
+#define fi_ibv_atomicvalid(name, flags)					\
+static int fi_ibv_msg_ep_atomic_ ## name(struct fid_ep *ep_fid,		\
+			      enum fi_datatype datatype,  		\
+			      enum fi_op op, size_t *count)             \
+{                                                                       \
+	struct fi_ibv_msg_ep *ep = container_of(ep_fid,			\
+						struct fi_ibv_msg_ep,   \
+						ep_fid);                \
+	struct fi_atomic_attr attr;                                     \
+	int ret;                                                        \
+                                                                        \
+	ret = fi_ibv_query_atomic(&ep->domain->domain_fid, datatype,	\
+				  op, &attr, flags);                    \
+	if (!ret)                                                       \
+		*count = attr.count;                                    \
+	return ret;                                                     \
+}                                                                       \
+
+fi_ibv_atomicvalid(writevalid, 0);
+fi_ibv_atomicvalid(readwritevalid, FI_FETCH_ATOMIC);
+fi_ibv_atomicvalid(compwritevalid, FI_COMPARE_ATOMIC);
+
+int fi_ibv_query_atomic(struct fid_domain *domain_fid, enum fi_datatype datatype,
+			enum fi_op op, struct fi_atomic_attr *attr,
+			uint64_t flags)
 {
-	switch (op) {
-	case FI_ATOMIC_WRITE:
-		break;
-	default:
+	struct fi_ibv_domain *domain = container_of(domain_fid,
+						    struct fi_ibv_domain,
+						    domain_fid);
+	char *log_str_fetch = "fi_fetch_atomic with FI_SUM op";
+	char *log_str_comp = "fi_compare_atomic";
+	char *log_str;
+
+	if (flags & FI_TAGGED)
 		return -FI_ENOSYS;
-	}
-
-	switch (datatype) {
-	case FI_INT64:
-	case FI_UINT64:
-#if __BITS_PER_LONG == 64
-	case FI_DOUBLE:
-	case FI_FLOAT:
-#endif
-		break;
-	default:
-		return -FI_EINVAL;
-	}
 
-	if (count)
-		*count = 1;
-	return 0;
-}
+	if ((flags & FI_FETCH_ATOMIC) && (flags & FI_COMPARE_ATOMIC))
+		return -FI_EBADFLAGS;
 
-static int
-fi_ibv_msg_ep_atomic_readwritevalid(struct fid_ep *ep, enum fi_datatype datatype,
-				enum fi_op op, size_t *count)
-{
-	struct fi_ibv_msg_ep *_ep = container_of(ep, struct fi_ibv_msg_ep, ep_fid);
-
-	switch (op) {
-	case FI_ATOMIC_READ:
-		break;
-	case FI_SUM:
-		if (_ep->info->tx_attr->op_flags & FI_INJECT) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_EP_DATA,"FI_INJECT not "
-				"supported for fi_fetch_atomic with FI_SUM op\n");
+	if (!flags) {
+		switch (op) {
+		case FI_ATOMIC_WRITE:
+			break;
+		default:
+			return -FI_ENOSYS;
+		}
+	} else {
+		if (flags & FI_FETCH_ATOMIC) {
+			switch (op) {
+			case FI_ATOMIC_READ:
+				goto check_datatype;
+			case FI_SUM:
+				log_str = log_str_fetch;
+				break;
+			default:
+				return -FI_ENOSYS;
+			}
+		} else if (flags & FI_COMPARE_ATOMIC) {
+			if (op != FI_CSWAP)
+				return -FI_ENOSYS;
+			log_str = log_str_comp;
+		} else {
+			return  -FI_EBADFLAGS;
+		}
+		if (domain->info->tx_attr->op_flags & FI_INJECT) {
+			VERBS_INFO(FI_LOG_EP_DATA,
+				   "FI_INJECT not supported for %s\n", log_str);
 			return -FI_EINVAL;
 		}
-		break;
-	default:
-		return -FI_ENOSYS;
 	}
-
+check_datatype:
 	switch (datatype) {
 	case FI_INT64:
 	case FI_UINT64:
@@ -95,40 +118,11 @@ fi_ibv_msg_ep_atomic_readwritevalid(struct fid_ep *ep, enum fi_datatype datatype
 		return -FI_EINVAL;
 	}
 
-	if (count)
-		*count = 1;
-	return 0;
-}
-
-static int
-fi_ibv_msg_ep_atomic_compwritevalid(struct fid_ep *ep, enum fi_datatype datatype,
-				enum fi_op op, size_t *count)
-{
-	struct fi_ibv_msg_ep *_ep = container_of(ep, struct fi_ibv_msg_ep, ep_fid);
-
-	if (op != FI_CSWAP)
-		return -FI_ENOSYS;
-
-	if (_ep->info->tx_attr->op_flags & FI_INJECT) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_EP_DATA, "FI_INJECT not supported "
-			"for fi_compare_atomic\n");
-		return -FI_EINVAL;
-	}
-
-	switch (datatype) {
-	case FI_INT64:
-	case FI_UINT64:
-#if __BITS_PER_LONG == 64
-	case FI_DOUBLE:
-	case FI_FLOAT:
-#endif
-		break;
-	default:
+	attr->size = ofi_datatype_size(datatype);
+	if (attr->size == 0)
 		return -FI_EINVAL;
-	}
 
-	if (count)
-		*count = 1;
+	attr->count = 1;
 	return 0;
 }
 
diff --git a/prov/verbs/src/verbs_av.c b/prov/verbs/src/verbs_av.c
deleted file mode 100644
index 3e70472..0000000
--- a/prov/verbs/src/verbs_av.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2016, Cisco Systems, Inc. All rights reserved.
- * Copyright (c) 2013-2015 Intel Corporation, Inc.  All rights reserved.
- *
- * This software is available to you under a choice of one of two
- * licenses.  You may choose to be licensed under the terms of the GNU
- * General Public License (GPL) Version 2, available from the file
- * COPYING in the main directory of this source tree, or the
- * BSD license below:
- *
- *     Redistribution and use in source and binary forms, with or
- *     without modification, are permitted provided that the following
- *     conditions are met:
- *
- *      - Redistributions of source code must retain the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer.
- *
- *      - Redistributions in binary form must reproduce the above
- *        copyright notice, this list of conditions and the following
- *        disclaimer in the documentation and/or other materials
- *        provided with the distribution.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include <pthread.h>
-#include <stdio.h>
-
-#include <fi_enosys.h>
-#include "fi_verbs.h"
-#include "ep_rdm/verbs_rdm.h"
-
-static int fi_ibv_av_close(fid_t fid)
-{
-	struct fi_ibv_av *av = container_of(fid, struct fi_ibv_av, av_fid.fid);
-	free(av);
-	return 0;
-}
-
-static struct fi_ops fi_ibv_fi_ops = {
-	.size = sizeof(struct fi_ops),
-	.close = fi_ibv_av_close,
-	.bind = fi_no_bind,
-};
-
-static inline struct fi_ibv_rdm_conn *
-fi_ibv_rdm_av_tbl_idx_to_conn(struct fi_ibv_rdm_ep *ep, fi_addr_t addr)
-{
-	return (addr == FI_ADDR_UNSPEC) ? NULL : ep->domain->rdm_cm->conn_table[addr];
-}
-
-static inline struct fi_ibv_rdm_conn *
-fi_ibv_rdm_av_map_addr_to_conn(struct fi_ibv_rdm_ep *ep, fi_addr_t addr)
-{
-	return (struct fi_ibv_rdm_conn *)
-		(addr == FI_ADDR_UNSPEC ? NULL : (void *)addr);
-}
-
-static inline fi_addr_t
-fi_ibv_rdm_to_conn_to_av_tbl_idx(struct fi_ibv_rdm_ep *ep, struct fi_ibv_rdm_conn *conn)
-{
-	size_t i;
-	if (conn == NULL)
-		return FI_ADDR_UNSPEC;
-
-	for (i = 0; i < ep->av->used; i++) {
-		if (ep->domain->rdm_cm->conn_table[i] == conn) {
-			return i;
-		}
-	}
-
-	return FI_ADDR_UNSPEC;
-}
-
-static inline fi_addr_t
-fi_ibv_rdm_conn_to_av_map_addr(struct fi_ibv_rdm_ep *ep, struct fi_ibv_rdm_conn *conn)
-{
-	return (conn == NULL) ? FI_ADDR_UNSPEC : (fi_addr_t)(uintptr_t)conn;
-}
-
-/* TODO: match rest of verbs code for variable naming */
-int fi_ibv_av_open(struct fid_domain *domain, struct fi_av_attr *attr,
-		   struct fid_av **av_fid, void *context)
-{
-	struct fi_ibv_domain *fid_domain;
-	struct fi_ibv_av *av;
-	size_t count = 64;
-
-	fid_domain = container_of(domain, struct fi_ibv_domain, domain_fid);
-
-	if (!attr)
-		return -FI_EINVAL;
-
-	switch (attr->type) {
-	case FI_AV_UNSPEC:
-		attr->type = FI_AV_MAP;
-	case FI_AV_MAP:
-	case FI_AV_TABLE:
-		break;
-	default:
-		return -EINVAL;
-	}
-
-	if (attr->count)
-		count = attr->count;
-
-	av = calloc(1, sizeof *av);
-	if (!av)
-		return -ENOMEM;
-
-	assert(fid_domain->rdm);
-	av->domain = fid_domain;
-	av->type = attr->type;
-	av->count = count;
-	av->used = 0;
-
-	if (av->type == FI_AV_TABLE && av->count > 0) {
-		av->domain->rdm_cm->conn_table =
-			calloc(av->count, sizeof(*av->domain->rdm_cm->conn_table));
-		if (!av->domain->rdm_cm->conn_table) {
-			free(av);
-			return -ENOMEM;
-		}
-	}
-
-	if (av->type == FI_AV_MAP) {
-		av->addr_to_conn = fi_ibv_rdm_av_map_addr_to_conn;
-		av->conn_to_addr = fi_ibv_rdm_conn_to_av_map_addr;
-	} else /* if (av->type == FI_AV_TABLE) */ {
-		av->addr_to_conn = fi_ibv_rdm_av_tbl_idx_to_conn;
-		av->conn_to_addr = fi_ibv_rdm_to_conn_to_av_tbl_idx;
-	}
-
-	av->av_fid.fid.fclass = FI_CLASS_AV;
-	av->av_fid.fid.context = context;
-	av->av_fid.fid.ops = &fi_ibv_fi_ops;
-
-	av->av_fid.ops = fi_ibv_rdm_set_av_ops();
-
-	*av_fid = &av->av_fid;
-	return 0;
-}
diff --git a/prov/verbs/src/verbs_cm.c b/prov/verbs/src/verbs_cm.c
index aa1c556..208987e 100644
--- a/prov/verbs/src/verbs_cm.c
+++ b/prov/verbs/src/verbs_cm.c
@@ -63,8 +63,8 @@ static int fi_ibv_msg_ep_setname(fid_t ep_fid, void *addr, size_t addrlen)
 	ep = container_of(ep_fid, struct fi_ibv_msg_ep, ep_fid);
 
 	if (addrlen != ep->info->src_addrlen) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_EP_CTRL,"addrlen expected: %d, got: %d.\n",
-				ep->info->src_addrlen, addrlen);
+		VERBS_INFO(FI_LOG_EP_CTRL,"addrlen expected: %d, got: %d.\n",
+			   ep->info->src_addrlen, addrlen);
 		return -FI_EINVAL;
 	}
 
@@ -146,16 +146,16 @@ fi_ibv_msg_ep_connect(struct fid_ep *ep, const void *addr,
 
 	src_addr = rdma_get_local_addr(_ep->id);
 	if (src_addr) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "src_addr: %s:%d\n",
-			inet_ntoa(((struct sockaddr_in *)src_addr)->sin_addr),
-			ntohs(((struct sockaddr_in *)src_addr)->sin_port));
+		VERBS_INFO(FI_LOG_CORE, "src_addr: %s:%d\n",
+			   inet_ntoa(((struct sockaddr_in *)src_addr)->sin_addr),
+			   ntohs(((struct sockaddr_in *)src_addr)->sin_port));
 	}
 
 	dst_addr = rdma_get_peer_addr(_ep->id);
 	if (dst_addr) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "dst_addr: %s:%d\n",
-			inet_ntoa(((struct sockaddr_in *)dst_addr)->sin_addr),
-			ntohs(((struct sockaddr_in *)dst_addr)->sin_port));
+		VERBS_INFO(FI_LOG_CORE, "dst_addr: %s:%d\n",
+			   inet_ntoa(((struct sockaddr_in *)dst_addr)->sin_addr),
+			   ntohs(((struct sockaddr_in *)dst_addr)->sin_port));
 	}
 
 	return rdma_connect(_ep->id, &conn_param) ? -errno : 0;
@@ -227,6 +227,7 @@ static struct fi_ops_cm fi_ibv_msg_ep_cm_ops = {
 	.accept = fi_ibv_msg_ep_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_ibv_msg_ep_shutdown,
+	.join = fi_no_join,
 };
 
 struct fi_ops_cm *fi_ibv_msg_ep_ops_cm(struct fi_ibv_msg_ep *ep)
@@ -243,8 +244,8 @@ static int fi_ibv_pep_setname(fid_t pep_fid, void *addr, size_t addrlen)
 	pep = container_of(pep_fid, struct fi_ibv_pep, pep_fid);
 
 	if (pep->src_addrlen && (addrlen != pep->src_addrlen)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC, "addrlen expected: %d, got: %d.\n",
-				pep->src_addrlen, addrlen);
+		VERBS_INFO(FI_LOG_FABRIC, "addrlen expected: %d, got: %d.\n",
+			   pep->src_addrlen, addrlen);
 		return -FI_EINVAL;
 	}
 
@@ -252,19 +253,22 @@ static int fi_ibv_pep_setname(fid_t pep_fid, void *addr, size_t addrlen)
 	if (pep->bound) {
 		ret = rdma_destroy_id(pep->id);
 		if (ret) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC, "Unable to destroy previous rdma_cm_id\n");
+			VERBS_INFO(FI_LOG_FABRIC,
+				   "Unable to destroy previous rdma_cm_id\n");
 			return -errno;
 		}
 		ret = rdma_create_id(NULL, &pep->id, &pep->pep_fid.fid, RDMA_PS_TCP);
 		if (ret) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC, "Unable to create rdma_cm_id\n");
+			VERBS_INFO(FI_LOG_FABRIC,
+				   "Unable to create rdma_cm_id\n");
 			return -errno;
 		}
 	}
 
 	ret = rdma_bind_addr(pep->id, (struct sockaddr *)addr);
 	if (ret) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC, "Unable to bind address to rdma_cm_id\n");
+		VERBS_INFO(FI_LOG_FABRIC,
+			   "Unable to bind address to rdma_cm_id\n");
 		return -errno;
 	}
 
@@ -290,9 +294,9 @@ static int fi_ibv_pep_listen(struct fid_pep *pep_fid)
 
 	addr = rdma_get_local_addr(pep->id);
 	if (addr) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Listening on %s:%d\n",
-			inet_ntoa(((struct sockaddr_in *)addr)->sin_addr),
-			ntohs(((struct sockaddr_in *)addr)->sin_port));
+		VERBS_INFO(FI_LOG_CORE, "Listening on %s:%d\n",
+			   inet_ntoa(((struct sockaddr_in *)addr)->sin_addr),
+			   ntohs(((struct sockaddr_in *)addr)->sin_port));
 	}
 
 	return rdma_listen(pep->id, pep->backlog) ? -errno : 0;
@@ -308,6 +312,7 @@ static struct fi_ops_cm fi_ibv_pep_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_ibv_msg_ep_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
 struct fi_ops_cm *fi_ibv_pep_ops_cm(struct fi_ibv_pep *pep)
diff --git a/prov/verbs/src/verbs_cq.c b/prov/verbs/src/verbs_cq.c
index 02f191c..e7ba117 100644
--- a/prov/verbs/src/verbs_cq.c
+++ b/prov/verbs/src/verbs_cq.c
@@ -78,6 +78,7 @@ fi_ibv_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *entry,
 	struct fi_ibv_cq *cq;
 	struct fi_ibv_wce *wce;
 	struct slist_entry *slist_entry;
+	uint32_t api_version;
 
 	cq = container_of(cq_fid, struct fi_ibv_cq, cq_fid);
 
@@ -89,6 +90,8 @@ fi_ibv_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *entry,
 	if (!wce->wc.status)
 		goto err;
 
+	api_version = cq->domain->fab->util_fabric.fabric_fid.api_version;
+
 	slist_entry = slist_remove_head(&cq->wcq);
 	fastlock_release(&cq->lock);
 
@@ -98,10 +101,18 @@ fi_ibv_cq_readerr(struct fid_cq *cq_fid, struct fi_cq_err_entry *entry,
 	entry->flags = fi_ibv_comp_flags(&wce->wc);
 	entry->err = EIO;
 	entry->prov_errno = wce->wc.status;
-	memcpy(&entry->err_data, &wce->wc.vendor_err,
-	       sizeof(wce->wc.vendor_err));
 
-	util_buf_release(cq->domain->fab->wce_pool, wce);
+	if ((FI_VERSION_GE(api_version, FI_VERSION(1, 5))) &&
+		entry->err_data && entry->err_data_size) {
+		entry->err_data_size = MIN(entry->err_data_size,
+			sizeof(wce->wc.vendor_err));
+		memcpy(entry->err_data, &wce->wc.vendor_err, entry->err_data_size);
+	} else {
+		memcpy(&entry->err_data, &wce->wc.vendor_err,
+			sizeof(wce->wc.vendor_err));
+	}
+
+	util_buf_release(cq->wce_pool, wce);
 	return sizeof(*entry);
 err:
 	fastlock_release(&cq->lock);
@@ -132,7 +143,7 @@ fi_ibv_poll_events(struct fi_ibv_cq *_cq, int timeout)
 		if (ret)
 			return ret;
 
-		atomic_inc(&_cq->nevents);
+		ofi_atomic_inc32(&_cq->nevents);
 		rc--;
 	}
 	if (fds[1].revents & POLLIN) {
@@ -143,7 +154,7 @@ fi_ibv_poll_events(struct fi_ibv_cq *_cq, int timeout)
 		rc--;
 	}
 	if (rc) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_CQ, "Unknown poll error: check revents\n");
+		VERBS_WARN(FI_LOG_CQ, "Unknown poll error: check revents\n");
 		return -FI_EOTHER;
 	}
 
@@ -249,15 +260,15 @@ ssize_t fi_ibv_poll_cq(struct fi_ibv_cq *cq, struct ibv_wc *wc)
 
 	entry = slist_remove_first_match(&cq->ep_list, fi_ibv_match_ep_id, (void *)wc->wr_id);
 	if (!entry) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_CQ, "No matching EP for :"
-				"given signaled send completion\n");
+		VERBS_WARN(FI_LOG_CQ, "No matching EP for :"
+			   "given signaled send completion\n");
 		return -FI_EOTHER;
 	}
 	epe = container_of(entry, struct fi_ibv_msg_epe, entry);
-	atomic_sub(&epe->ep->unsignaled_send_cnt,
+	ofi_atomic_sub32(&epe->ep->unsignaled_send_cnt,
 			VERBS_SEND_SIGNAL_THRESH(epe->ep));
-	atomic_dec(&epe->ep->comp_pending);
-	util_buf_release(cq->domain->fab->epe_pool, epe);
+	ofi_atomic_dec32(&epe->ep->comp_pending);
+	util_buf_release(cq->epe_pool, epe);
 
 	return 0;
 }
@@ -284,7 +295,7 @@ static ssize_t fi_ibv_cq_read(struct fid_cq *cq_fid, void *buf, size_t count)
 			entry = slist_remove_head(&cq->wcq);
 			wce = container_of(entry, struct fi_ibv_wce, entry);
 			cq->read_entry(&wce->wc, i, buf);
-			util_buf_release(cq->domain->fab->wce_pool, wce);
+			util_buf_release(cq->wce_pool, wce);
 			continue;
 		}
 
@@ -294,7 +305,7 @@ static ssize_t fi_ibv_cq_read(struct fid_cq *cq_fid, void *buf, size_t count)
 
 		/* Insert error entry into wcq */
 		if (wc.status) {
-			wce = util_buf_alloc(cq->domain->fab->wce_pool);
+			wce = util_buf_alloc(cq->wce_pool);
 			if (!wce) {
 				fastlock_release(&cq->lock);
 				return -FI_ENOMEM;
@@ -330,7 +341,7 @@ int fi_ibv_cq_signal(struct fid_cq *cq)
 	_cq = container_of(cq, struct fi_ibv_cq, cq_fid);
 
 	if (write(_cq->signal_fd[1], &data, 1) != 1) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_CQ, "Error signalling CQ\n");
+		VERBS_WARN(FI_LOG_CQ, "Error signalling CQ\n");
 		return -errno;
 	}
 
@@ -347,7 +358,7 @@ static int fi_ibv_cq_trywait(struct fid *fid)
 	cq = container_of(fid, struct fi_ibv_cq, cq_fid.fid);
 
 	if (!cq->channel) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_CQ, "No wait object object associated with CQ\n");
+		VERBS_WARN(FI_LOG_CQ, "No wait object object associated with CQ\n");
 		return -FI_EINVAL;
 	}
 
@@ -355,7 +366,7 @@ static int fi_ibv_cq_trywait(struct fid *fid)
 	if (!slist_empty(&cq->wcq))
 		goto out;
 
-	wce = util_buf_alloc(cq->domain->fab->wce_pool);
+	wce = util_buf_alloc(cq->wce_pool);
 	if (!wce) {
 		ret = -FI_ENOMEM;
 		goto out;
@@ -371,11 +382,11 @@ static int fi_ibv_cq_trywait(struct fid *fid)
 	}
 
 	while (!ibv_get_cq_event(cq->channel, &cq->cq, &context))
-		atomic_inc(&cq->nevents);
+		ofi_atomic_inc32(&cq->nevents);
 
 	rc = ibv_req_notify_cq(cq->cq, 0);
 	if (rc) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_CQ, "ibv_req_notify_cq error: %d\n", ret);
+		VERBS_WARN(FI_LOG_CQ, "ibv_req_notify_cq error: %d\n", ret);
 		ret = -errno;
 		goto err;
 	}
@@ -392,7 +403,7 @@ static int fi_ibv_cq_trywait(struct fid *fid)
 
 	ret = FI_SUCCESS;
 err:
-	util_buf_release(cq->domain->fab->wce_pool, wce);
+	util_buf_release(cq->wce_pool, wce);
 out:
 	fastlock_release(&cq->lock);
 	return ret;
@@ -441,23 +452,26 @@ static int fi_ibv_cq_close(fid_t fid)
 
 	cq = container_of(fid, struct fi_ibv_cq, cq_fid.fid);
 
-	if (atomic_get(&cq->nevents))
-		ibv_ack_cq_events(cq->cq, atomic_get(&cq->nevents));
+	if (ofi_atomic_get32(&cq->nevents))
+		ibv_ack_cq_events(cq->cq, ofi_atomic_get32(&cq->nevents));
 
 	fastlock_acquire(&cq->lock);
 	while (!slist_empty(&cq->wcq)) {
 		entry = slist_remove_head(&cq->wcq);
 		wce = container_of(entry, struct fi_ibv_wce, entry);
-		util_buf_release(cq->domain->fab->wce_pool, wce);
+		util_buf_release(cq->wce_pool, wce);
 	}
 
 	while (!slist_empty(&cq->ep_list)) {
 		entry = slist_remove_head(&cq->ep_list);
 		epe = container_of(entry, struct fi_ibv_msg_epe, entry);
-		util_buf_release(cq->domain->fab->epe_pool, epe);
+		util_buf_release(cq->epe_pool, epe);
 	}
 	fastlock_release(&cq->lock);
 
+	util_buf_pool_destroy(cq->epe_pool);
+	util_buf_pool_destroy(cq->wce_pool);
+
 	fastlock_destroy(&cq->lock);
 
 	if (cq->cq) {
@@ -512,8 +526,8 @@ int fi_ibv_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 		_cq->channel = ibv_create_comp_channel(_cq->domain->verbs);
 		if (!_cq->channel) {
 			ret = -errno;
-			FI_WARN(&fi_ibv_prov, FI_LOG_CQ,
-					"Unable to create completion channel\n");
+			VERBS_WARN(FI_LOG_CQ,
+				   "Unable to create completion channel\n");
 			goto err1;
 		}
 
@@ -545,19 +559,33 @@ int fi_ibv_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 
 	if (!_cq->cq) {
 		ret = -errno;
-		FI_WARN(&fi_ibv_prov, FI_LOG_CQ, "Unable to create verbs CQ\n");
+		VERBS_WARN(FI_LOG_CQ, "Unable to create verbs CQ\n");
 		goto err3;
 	}
 
 	if (_cq->channel) {
 		ret = ibv_req_notify_cq(_cq->cq, 0);
 		if (ret) {
-			FI_WARN(&fi_ibv_prov, FI_LOG_CQ,
-				"ibv_req_notify_cq failed\n");
+			VERBS_WARN(FI_LOG_CQ,
+				   "ibv_req_notify_cq failed\n");
 			goto err4;
 		}
 	}
 
+	_cq->wce_pool = util_buf_pool_create(sizeof(struct fi_ibv_wce), 16, 0, VERBS_WCE_CNT);
+	if (!_cq->wce_pool) {
+		VERBS_WARN(FI_LOG_CQ, "Failed to create wce_pool\n");
+		ret = -FI_ENOMEM;
+		goto err4;
+	}
+
+	_cq->epe_pool = util_buf_pool_create(sizeof(struct fi_ibv_msg_epe), 16, 0, VERBS_EPE_CNT);
+	if (!_cq->epe_pool) {
+		VERBS_WARN(FI_LOG_CQ, "Failed to create epe_pool\n");
+		ret = -FI_ENOMEM;
+		goto err5;
+	}
+
 	_cq->flags |= attr->flags;
 	_cq->wait_cond = attr->wait_cond;
 	_cq->cq_fid.fid.fclass = FI_CLASS_CQ;
@@ -582,7 +610,7 @@ int fi_ibv_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	case FI_CQ_FORMAT_TAGGED:
 	default:
 		ret = -FI_ENOSYS;
-		goto err4;
+		goto err6;
 	}
 
 	fastlock_init(&_cq->lock);
@@ -596,11 +624,15 @@ int fi_ibv_cq_open(struct fid_domain *domain, struct fi_cq_attr *attr,
 	_cq->wr_id_mask = (~_cq->wr_id_mask) << ep_cnt_bits;
 
 	_cq->trywait = fi_ibv_cq_trywait;
-	atomic_initialize(&_cq->nevents, 0);
+	ofi_atomic_initialize32(&_cq->nevents, 0);
 
 	*cq = &_cq->cq_fid;
 	return 0;
 
+err6:
+	util_buf_pool_destroy(_cq->epe_pool);
+err5:
+	util_buf_pool_destroy(_cq->wce_pool);
 err4:
 	ibv_destroy_cq(_cq->cq);
 err3:
diff --git a/prov/verbs/src/verbs_domain.c b/prov/verbs/src/verbs_domain.c
index 3cefe8b..ec7cb98 100644
--- a/prov/verbs/src/verbs_domain.c
+++ b/prov/verbs/src/verbs_domain.c
@@ -32,9 +32,12 @@
 
 #include "config.h"
 
+#include <fi_util.h>
 #include "fi_verbs.h"
 #include "ep_rdm/verbs_rdm.h"
 
+#include "fi_verbs.h"
+
 static int fi_ibv_mr_close(fid_t fid)
 {
 	struct fi_ibv_mem_desc *mr;
@@ -81,6 +84,13 @@ fi_ibv_mr_reg(struct fid *fid, const void *buf, size_t len,
 	md->mr_fid.fid.context = context;
 	md->mr_fid.fid.ops = &fi_ibv_mr_ops;
 
+	/* Enable local write access by default for FI_EP_RDM which hides local
+	 * registration requirements. This allows to avoid buffering or double
+	 * registration */
+	if (!(md->domain->info->caps & FI_LOCAL_MR) ||
+	    (md->domain->info->domain_attr->mr_mode & FI_MR_LOCAL))
+		fi_ibv_access |= IBV_ACCESS_LOCAL_WRITE;
+
 	/* Local read access to an MR is enabled by default in verbs */
 
 	if (access & FI_RECV)
@@ -112,6 +122,14 @@ fi_ibv_mr_reg(struct fid *fid, const void *buf, size_t len,
 	md->mr_fid.mem_desc = (void *) (uintptr_t) md->mr->lkey;
 	md->mr_fid.key = md->mr->rkey;
 	*mr = &md->mr_fid;
+	if(md->domain->eq && (md->domain->eq_flags & FI_REG_MR)) {
+		struct fi_eq_entry entry = {
+			.fid = &md->mr_fid.fid,
+			.context = context
+		};
+		fi_ibv_eq_write_event(md->domain->eq, FI_MR_COMPLETE,
+			 	      &entry, sizeof(entry));
+	}
 	return 0;
 
 err:
@@ -119,14 +137,95 @@ err:
 	return -errno;
 }
 
+static int fi_ibv_mr_regv(struct fid *fid, const struct iovec * iov,
+		size_t count, uint64_t access, uint64_t offset, uint64_t requested_key,
+		uint64_t flags, struct fid_mr **mr, void *context)
+{
+	if (count > VERBS_MR_IOV_LIMIT) {
+		VERBS_WARN(FI_LOG_FABRIC,
+			   "iov count > %d not supported\n",
+			   VERBS_MR_IOV_LIMIT);
+		return -FI_EINVAL;
+	}
+	return fi_ibv_mr_reg(fid, iov->iov_base, iov->iov_len, access, offset,
+			requested_key, flags, mr, context);
+}
+
+static int fi_ibv_mr_regattr(struct fid *fid, const struct fi_mr_attr *attr,
+		uint64_t flags, struct fid_mr **mr)
+{
+	return fi_ibv_mr_regv(fid, attr->mr_iov, attr->iov_count, attr->access,
+			0, attr->requested_key, flags, mr, attr->context);
+}
+
+static int fi_ibv_domain_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
+{
+	struct fi_ibv_domain *domain;
+	struct fi_ibv_eq *eq;
+
+	domain = container_of(fid, struct fi_ibv_domain, domain_fid.fid);
+
+	switch (bfid->fclass) {
+	case FI_CLASS_EQ:
+		eq = container_of(bfid, struct fi_ibv_eq, eq_fid);
+		domain->eq = eq;
+		domain->eq_flags = flags;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static void *fi_ibv_rdm_cm_progress_thread(void *dom)
+{
+	struct fi_ibv_domain *domain =
+		(struct fi_ibv_domain *)dom;
+	struct slist_entry *item, *prev;
+	while (domain->rdm_cm->fi_ibv_rdm_tagged_cm_progress_running) {
+		struct fi_ibv_rdm_ep *ep = NULL;
+		slist_foreach(&domain->ep_list, item, prev) {
+			(void) prev;
+			ep = container_of(item, struct fi_ibv_rdm_ep,
+					  list_entry);
+			if (fi_ibv_rdm_cm_progress(ep)) {
+				VERBS_INFO (FI_LOG_EP_DATA,
+				            "fi_ibv_rdm_cm_progress error\n");
+				abort();
+			}
+		}
+		usleep(domain->rdm_cm->cm_progress_timeout);
+	}
+	return NULL;
+}
+
 static int fi_ibv_domain_close(fid_t fid)
 {
 	struct fi_ibv_domain *domain;
+	struct fi_ibv_rdm_av_entry *av_entry = NULL;
+	struct slist_entry *item;
+	void *status = NULL;
 	int ret;
 
 	domain = container_of(fid, struct fi_ibv_domain, domain_fid.fid);
 
 	if (domain->rdm) {
+		domain->rdm_cm->fi_ibv_rdm_tagged_cm_progress_running = 0;
+		pthread_join(domain->rdm_cm->cm_progress_thread, &status);
+		pthread_mutex_destroy(&domain->rdm_cm->cm_lock);
+
+		for (item = slist_remove_head(
+				&domain->rdm_cm->av_removed_entry_head);
+	     	     item;
+	     	     item = slist_remove_head(
+				&domain->rdm_cm->av_removed_entry_head)) {
+			av_entry = container_of(item,
+						struct fi_ibv_rdm_av_entry,
+						removed_next);
+			fi_ibv_rdm_overall_conn_cleanup(av_entry);
+			ofi_freealign(av_entry);
+		}
 		rdma_destroy_ep(domain->rdm_cm->listener);
 		free(domain->rdm_cm);
 	}
@@ -174,7 +273,7 @@ static int fi_ibv_open_device_by_name(struct fi_ibv_domain *domain, const char *
 static struct fi_ops fi_ibv_fid_ops = {
 	.size = sizeof(struct fi_ops),
 	.close = fi_ibv_domain_close,
-	.bind = fi_no_bind,
+	.bind = fi_ibv_domain_bind,
 	.control = fi_no_control,
 	.ops_open = fi_no_ops_open,
 };
@@ -182,8 +281,8 @@ static struct fi_ops fi_ibv_fid_ops = {
 static struct fi_ops_mr fi_ibv_domain_mr_ops = {
 	.size = sizeof(struct fi_ops_mr),
 	.reg = fi_ibv_mr_reg,
-	.regv = fi_no_mr_regv,
-	.regattr = fi_no_mr_regattr,
+	.regv = fi_ibv_mr_regv,
+	.regattr = fi_ibv_mr_regattr,
 };
 
 static struct fi_ops_domain fi_ibv_domain_ops = {
@@ -196,11 +295,12 @@ static struct fi_ops_domain fi_ibv_domain_ops = {
 	.poll_open = fi_no_poll_open,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_ibv_srq_context,
+	.query_atomic = fi_ibv_query_atomic,
 };
 
 static struct fi_ops_domain fi_ibv_rdm_domain_ops = {
 	.size = sizeof(struct fi_ops_domain),
-	.av_open = fi_ibv_av_open,
+	.av_open = fi_ibv_rdm_av_open,
 	.cq_open = fi_ibv_rdm_cq_open,
 	.endpoint = fi_ibv_rdm_open_ep,
 	.scalable_ep = fi_no_scalable_ep,
@@ -208,6 +308,7 @@ static struct fi_ops_domain fi_ibv_rdm_domain_ops = {
 	.poll_open = fi_no_poll_open,
 	.stx_ctx = fi_no_stx_context,
 	.srx_ctx = fi_no_srx_context,
+	.query_atomic = fi_ibv_query_atomic,
 };
 
 static int
@@ -215,14 +316,18 @@ fi_ibv_domain(struct fid_fabric *fabric, struct fi_info *info,
 	   struct fid_domain **domain, void *context)
 {
 	struct fi_ibv_domain *_domain;
+	struct fi_ibv_fabric *fab;
 	struct fi_info *fi;
-	int ret;
+	int param = 0, ret;
 
 	fi = fi_ibv_get_verbs_info(info->domain_attr->name);
 	if (!fi)
 		return -FI_EINVAL;
 
-	ret = fi_ibv_check_domain_attr(info->domain_attr, fi);
+	fab = container_of(fabric, struct fi_ibv_fabric,
+			   util_fabric.fabric_fid);
+	ret = ofi_check_domain_attr(&fi_ibv_prov, fabric->api_version,
+				    fi->domain_attr, info->domain_attr);
 	if (ret)
 		return ret;
 
@@ -241,6 +346,35 @@ fi_ibv_domain(struct fid_fabric *fabric, struct fi_info *info,
 			ret = -FI_ENOMEM;
 			goto err2;
 		}
+		_domain->rdm_cm->cm_progress_timeout =
+			FI_IBV_RDM_CM_THREAD_TIMEOUT;
+		if (!fi_param_get_int(&fi_ibv_prov,
+				      "rdm_thread_timeout",
+				      &param)) {
+			if (param < 0) {
+				VERBS_INFO(FI_LOG_CORE,
+				   	   "invalid value of "
+					   "rdm_thread_timeout\n");
+				ret = -FI_EINVAL;
+				goto err2;
+			} else {
+				_domain->rdm_cm->cm_progress_timeout = param;
+			}
+		}
+		slist_init(&_domain->rdm_cm->av_removed_entry_head);
+
+		pthread_mutex_init(&_domain->rdm_cm->cm_lock, NULL);
+		_domain->rdm_cm->fi_ibv_rdm_tagged_cm_progress_running = 1;
+		ret = pthread_create(&_domain->rdm_cm->cm_progress_thread,
+				     NULL, &fi_ibv_rdm_cm_progress_thread,
+				     (void *)_domain);
+		if (ret) {
+			VERBS_INFO(FI_LOG_EP_CTRL,
+				   "Failed to launch CM progress thread, "
+				   "err :%d\n", ret);
+			ret = -FI_EOTHER;
+			goto err2;
+		}
 	}
 	ret = fi_ibv_open_device_by_name(_domain, info->domain_attr->name);
 	if (ret)
@@ -287,7 +421,7 @@ fi_ibv_domain(struct fid_fabric *fabric, struct fi_info *info,
 	} else {
 		_domain->domain_fid.ops = &fi_ibv_domain_ops;
 	}
-	_domain->fab = container_of(fabric, struct fi_ibv_fabric, fabric_fid);
+	_domain->fab = fab;
 
 	*domain = &_domain->domain_fid;
 	return 0;
@@ -334,11 +468,14 @@ static int fi_ibv_trywait(struct fid_fabric *fabric, struct fid **fids, int coun
 static int fi_ibv_fabric_close(fid_t fid)
 {
 	struct fi_ibv_fabric *fab;
+	int ret;
+
+	fab = container_of(fid, struct fi_ibv_fabric, util_fabric.fabric_fid.fid);
+	ret = ofi_fabric_close(&fab->util_fabric);
+	if (ret)
+		return ret;
+	free(fab);
 
-	fab = container_of(fid, struct fi_ibv_fabric, fabric_fid.fid);
-	util_buf_pool_destroy(fab->wce_pool);
-	util_buf_pool_destroy(fab->epe_pool);
-	free(fid);
 	return 0;
 }
 
@@ -363,44 +500,31 @@ int fi_ibv_fabric(struct fi_fabric_attr *attr, struct fid_fabric **fabric,
 		  void *context)
 {
 	struct fi_ibv_fabric *fab;
+	struct fi_info *info;
 	int ret;
 
 	ret = fi_ibv_init_info();
 	if (ret)
 		return ret;
 
-	ret = fi_ibv_find_fabric(attr);
-	if (ret)
-		return ret;
-
 	fab = calloc(1, sizeof(*fab));
 	if (!fab)
 		return -FI_ENOMEM;
 
-	fab->fabric_fid.fid.fclass = FI_CLASS_FABRIC;
-	fab->fabric_fid.fid.context = context;
-	fab->fabric_fid.fid.ops = &fi_ibv_fi_ops;
-	fab->fabric_fid.ops = &fi_ibv_ops_fabric;
-
-	fab->wce_pool = util_buf_pool_create(sizeof(struct fi_ibv_wce), 16, 0, VERBS_WCE_CNT);
-	if (!fab->wce_pool) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC, "Failed to create wce_pool\n");
-		ret = -FI_ENOMEM;
-		goto err1;
+	for (info = verbs_info; info; info = info->next) {
+		ret = ofi_fabric_init(&fi_ibv_prov, info->fabric_attr, attr,
+				      &fab->util_fabric, context);
+		if (ret != -FI_ENODATA)
+			break;
 	}
-
-	fab->epe_pool = util_buf_pool_create(sizeof(struct fi_ibv_msg_epe), 16, 0, VERBS_EPE_CNT);
-	if (!fab->epe_pool) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC, "Failed to create epe_pool\n");
-		ret = -FI_ENOMEM;
-		goto err2;
+	if (ret) {
+		free(fab);
+		return ret;
 	}
 
-	*fabric = &fab->fabric_fid;
+	*fabric = &fab->util_fabric.fabric_fid;
+	(*fabric)->fid.ops = &fi_ibv_fi_ops;
+	(*fabric)->ops = &fi_ibv_ops_fabric;
+
 	return 0;
-err2:
-	util_buf_pool_destroy(fab->wce_pool);
-err1:
-	free(fab);
-	return ret;
 }
diff --git a/prov/verbs/src/verbs_eq.c b/prov/verbs/src/verbs_eq.c
index 38468e7..8539800 100644
--- a/prov/verbs/src/verbs_eq.c
+++ b/prov/verbs/src/verbs_eq.c
@@ -32,6 +32,7 @@
 
 #include "config.h"
 
+#include <fi_util.h>
 #include "fi_verbs.h"
 
 
@@ -40,20 +41,37 @@ fi_ibv_eq_readerr(struct fid_eq *eq, struct fi_eq_err_entry *entry,
 		  uint64_t flags)
 {
 	struct fi_ibv_eq *_eq;
+	uint32_t api_version;
+	void *err_data = NULL;
+	size_t err_data_size = 0;
 
 	_eq = container_of(eq, struct fi_ibv_eq, eq_fid.fid);
 	if (!_eq->err.err)
 		return 0;
 
+	
+	api_version = _eq->fab->util_fabric.fabric_fid.api_version;
+
+	if ((FI_VERSION_GE(api_version, FI_VERSION(1, 5)))
+		&& entry->err_data && entry->err_data_size) {
+		err_data_size = MIN(entry->err_data_size, _eq->err.err_data_size);
+		err_data = _eq->err.err_data;
+	}
+
 	*entry = _eq->err;
+	if (err_data) {
+		memcpy(entry->err_data, err_data, err_data_size);
+		entry->err_data_size = err_data_size;
+	}
+
 	_eq->err.err = 0;
 	_eq->err.prov_errno = 0;
 	return sizeof(*entry);
 }
 
-/* TODO: This should copy the listening fi_info as the base */
 static struct fi_info *
-fi_ibv_eq_cm_getinfo(struct fi_ibv_fabric *fab, struct rdma_cm_event *event)
+fi_ibv_eq_cm_getinfo(struct fi_ibv_fabric *fab, struct rdma_cm_event *event,
+		struct fi_info *pep_info)
 {
 	struct fi_info *info, *fi;
 	struct fi_ibv_connreq *connreq;
@@ -66,11 +84,11 @@ fi_ibv_eq_cm_getinfo(struct fi_ibv_fabric *fab, struct rdma_cm_event *event)
 	if (!info)
 		return NULL;
 
-	info->fabric_attr->fabric = &fab->fabric_fid;
+	info->fabric_attr->fabric = &fab->util_fabric.fabric_fid;
 	if (!(info->fabric_attr->prov_name = strdup(VERBS_PROV_NAME)))
 		goto err;
 
-	fi_ibv_update_info(NULL, info);
+	ofi_alter_info(info, pep_info, fab->util_fabric.fabric_fid.api_version);
 
 	info->src_addrlen = fi_ibv_sockaddr_len(rdma_get_local_addr(event->id));
 	if (!(info->src_addr = malloc(info->src_addrlen)))
@@ -82,13 +100,13 @@ fi_ibv_eq_cm_getinfo(struct fi_ibv_fabric *fab, struct rdma_cm_event *event)
 		goto err;
 	memcpy(info->dest_addr, rdma_get_peer_addr(event->id), info->dest_addrlen);
 
-	FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "src_addr: %s:%d\n",
-		inet_ntoa(((struct sockaddr_in *)info->src_addr)->sin_addr),
-		ntohs(((struct sockaddr_in *)info->src_addr)->sin_port));
+	VERBS_INFO(FI_LOG_CORE, "src_addr: %s:%d\n",
+		   inet_ntoa(((struct sockaddr_in *)info->src_addr)->sin_addr),
+		   ntohs(((struct sockaddr_in *)info->src_addr)->sin_port));
 
-	FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "dst_addr: %s:%d\n",
-		inet_ntoa(((struct sockaddr_in *)info->dest_addr)->sin_addr),
-		ntohs(((struct sockaddr_in *)info->dest_addr)->sin_port));
+	VERBS_INFO(FI_LOG_CORE, "dst_addr: %s:%d\n",
+		   inet_ntoa(((struct sockaddr_in *)info->dest_addr)->sin_addr),
+		   ntohs(((struct sockaddr_in *)info->dest_addr)->sin_port));
 
 	connreq = calloc(1, sizeof *connreq);
 	if (!connreq)
@@ -107,10 +125,13 @@ static ssize_t
 fi_ibv_eq_cm_process_event(struct fi_ibv_eq *eq, struct rdma_cm_event *cma_event,
 	uint32_t *event, struct fi_eq_cm_entry *entry, size_t len)
 {
+	struct fi_ibv_pep *pep;
 	fid_t fid;
 	size_t datalen;
+	int ret;
 
 	fid = cma_event->id->context;
+	pep = container_of(fid, struct fi_ibv_pep, pep_fid);
 	switch (cma_event->event) {
 //	case RDMA_CM_EVENT_ADDR_RESOLVED:
 //		return 0;
@@ -118,7 +139,7 @@ fi_ibv_eq_cm_process_event(struct fi_ibv_eq *eq, struct rdma_cm_event *cma_event
 //		return 0;
 	case RDMA_CM_EVENT_CONNECT_REQUEST:
 		*event = FI_CONNREQ;
-		entry->info = fi_ibv_eq_cm_getinfo(eq->fab, cma_event);
+		entry->info = fi_ibv_eq_cm_getinfo(eq->fab, cma_event, pep->info);
 		if (!entry->info) {
 			rdma_destroy_id(cma_event->id);
 			return 0;
@@ -127,6 +148,12 @@ fi_ibv_eq_cm_process_event(struct fi_ibv_eq *eq, struct rdma_cm_event *cma_event
 	case RDMA_CM_EVENT_ESTABLISHED:
 		*event = FI_CONNECTED;
 		entry->info = NULL;
+		if (cma_event->id->qp->context->device->transport_type !=
+		    IBV_TRANSPORT_IWARP) {
+			ret = fi_ibv_set_rnr_timer(cma_event->id->qp);
+			if (ret)
+				return ret;
+		}
 		break;
 	case RDMA_CM_EVENT_DISCONNECTED:
 		*event = FI_SHUTDOWN;
@@ -163,7 +190,7 @@ fi_ibv_eq_cm_process_event(struct fi_ibv_eq *eq, struct rdma_cm_event *cma_event
 	return sizeof(*entry) + datalen;
 }
 
-static ssize_t fi_ibv_eq_write_event(struct fi_ibv_eq *eq, uint32_t event,
+ssize_t fi_ibv_eq_write_event(struct fi_ibv_eq *eq, uint32_t event,
 		const void *buf, size_t len)
 {
 	struct fi_ibv_eq_entry *entry;
@@ -332,15 +359,16 @@ static int fi_ibv_eq_close(fid_t fid)
 	struct fi_ibv_eq_entry *entry;
 
 	eq = container_of(fid, struct fi_ibv_eq, eq_fid.fid);
+	/* TODO: use util code, if possible, and add ref counting */
 
 	if (eq->channel)
 		rdma_destroy_event_channel(eq->channel);
 
 	close(eq->epfd);
 
-	fastlock_acquire(&eq->lock);
-	while(!dlistfd_empty(&eq->list_head)) {
-		entry = container_of(eq->list_head.list.next, struct fi_ibv_eq_entry, item);
+	while (!dlistfd_empty(&eq->list_head)) {
+		entry = container_of(eq->list_head.list.next,
+				     struct fi_ibv_eq_entry, item);
 		dlistfd_remove(eq->list_head.list.next, &eq->list_head);
 		free(entry);
 	}
@@ -371,12 +399,13 @@ int fi_ibv_eq_open(struct fid_fabric *fabric, struct fi_eq_attr *attr,
 	if (!_eq)
 		return -ENOMEM;
 
-	_eq->fab = container_of(fabric, struct fi_ibv_fabric, fabric_fid);
+	_eq->fab = container_of(fabric, struct fi_ibv_fabric,
+				util_fabric.fabric_fid);
 
 	fastlock_init(&_eq->lock);
 	ret = dlistfd_head_init(&_eq->list_head);
 	if (ret) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_EQ, "Unable to initialize dlistfd\n");
+		VERBS_INFO(FI_LOG_EQ, "Unable to initialize dlistfd\n");
 		goto err1;
 	}
 
diff --git a/prov/verbs/src/verbs_info.c b/prov/verbs/src/verbs_info.c
index 55cf81a..cc7445e 100644
--- a/prov/verbs/src/verbs_info.c
+++ b/prov/verbs/src/verbs_info.c
@@ -44,35 +44,28 @@
 #define VERBS_ANY_FABRIC "Any RDMA fabric"
 
 #define VERBS_MSG_CAPS (FI_MSG | FI_RMA | FI_ATOMICS | FI_READ | FI_WRITE | \
-			FI_SEND | FI_RECV | FI_REMOTE_READ | FI_REMOTE_WRITE)
+			FI_SEND | FI_RECV | FI_REMOTE_READ | FI_REMOTE_WRITE | \
+			FI_LOCAL_COMM | FI_REMOTE_COMM)
 
 #define VERBS_RDM_CAPS (FI_MSG | FI_RMA | FI_TAGGED | FI_READ | FI_WRITE |	\
-			FI_RECV | FI_SEND | FI_REMOTE_READ | FI_REMOTE_WRITE )
+			FI_RECV | FI_MULTI_RECV | FI_SEND | FI_REMOTE_READ |	\
+			FI_REMOTE_WRITE )
 
-#define VERBS_MODE (FI_LOCAL_MR)
 #define VERBS_RDM_MODE (FI_CONTEXT)
 
 #define VERBS_TX_OP_FLAGS (FI_INJECT | FI_COMPLETION | FI_TRANSMIT_COMPLETE)
 #define VERBS_TX_OP_FLAGS_IWARP (FI_INJECT | FI_COMPLETION)
 #define VERBS_TX_OP_FLAGS_IWARP_RDM (VERBS_TX_OP_FLAGS)
 
-#define VERBS_TX_MODE VERBS_MODE
 #define VERBS_TX_RDM_MODE VERBS_RDM_MODE
 
-#define VERBS_RX_MODE (FI_LOCAL_MR | FI_RX_CQ_DATA)
+#define VERBS_RX_MODE (FI_RX_CQ_DATA)
 
 #define VERBS_RX_RDM_OP_FLAGS (FI_COMPLETION)
 
 #define VERBS_MSG_ORDER (FI_ORDER_RAR | FI_ORDER_RAW | FI_ORDER_RAS | \
 		FI_ORDER_WAW | FI_ORDER_WAS | FI_ORDER_SAW | FI_ORDER_SAS )
 
-
-static char def_tx_ctx_size[16] = "384";
-static char def_rx_ctx_size[16] = "384";
-static char def_tx_iov_limit[16] = "4";
-static char def_rx_iov_limit[16] = "4";
-static char def_inject_size[16] = "64";
-
 const struct fi_fabric_attr verbs_fabric_attr = {
 	.prov_version		= VERBS_PROV_VERS,
 };
@@ -81,13 +74,17 @@ const struct fi_domain_attr verbs_domain_attr = {
 	.threading		= FI_THREAD_SAFE,
 	.control_progress	= FI_PROGRESS_AUTO,
 	.data_progress		= FI_PROGRESS_AUTO,
-	.mr_mode		= FI_MR_BASIC,
+	.resource_mgmt		= FI_RM_ENABLED,
+	.mr_mode		= OFI_MR_BASIC_MAP | FI_MR_LOCAL | FI_MR_BASIC,
 	.mr_key_size		= sizeof_field(struct ibv_sge, lkey),
 	.cq_data_size		= sizeof_field(struct ibv_send_wr, imm_data),
 	.tx_ctx_cnt		= 1024,
 	.rx_ctx_cnt		= 1024,
 	.max_ep_tx_ctx		= 1,
 	.max_ep_rx_ctx		= 1,
+	.mr_iov_limit		= 1,
+	/* max_err_data is size of ibv_wc::vendor_err for CQ, 0 - for EQ */
+	.max_err_data		= sizeof_field(struct ibv_wc, vendor_err),
 };
 
 const struct fi_ep_attr verbs_ep_attr = {
@@ -102,11 +99,12 @@ const struct fi_ep_attr verbs_ep_attr = {
 const struct fi_rx_attr verbs_rx_attr = {
 	.mode			= VERBS_RX_MODE,
 	.msg_order		= VERBS_MSG_ORDER,
+	.comp_order		= FI_ORDER_STRICT | FI_ORDER_DATA,
 	.total_buffered_recv	= 0,
 };
 
 const struct fi_rx_attr verbs_rdm_rx_attr = {
-	.mode			= VERBS_RX_MODE,
+	.mode			= VERBS_RDM_MODE | VERBS_RX_MODE,
 	.op_flags		= VERBS_RX_RDM_OP_FLAGS,
 	.msg_order		= VERBS_MSG_ORDER,
 	.total_buffered_recv	= 0,
@@ -114,11 +112,11 @@ const struct fi_rx_attr verbs_rdm_rx_attr = {
 };
 
 const struct fi_tx_attr verbs_tx_attr = {
-	.mode			= VERBS_TX_MODE,
+	.mode			= 0,
 	.op_flags		= VERBS_TX_OP_FLAGS,
 	.msg_order		= VERBS_MSG_ORDER,
+	.comp_order		= FI_ORDER_STRICT,
 	.inject_size		= 0,
-	.rma_iov_limit		= 1,
 };
 
 const struct fi_tx_attr verbs_rdm_tx_attr = {
@@ -147,126 +145,16 @@ struct fi_ibv_rdm_sysaddr
 	int is_found;
 };
 
-static struct fi_info *verbs_info = NULL;
+struct fi_info *verbs_info = NULL;
 static pthread_mutex_t verbs_info_lock = PTHREAD_MUTEX_INITIALIZER;
 
-int fi_ibv_check_fabric_attr(const struct fi_fabric_attr *attr,
-			     const struct fi_info *info)
-{
-	if (attr->name && strcmp(attr->name, info->fabric_attr->name)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unknown fabric name\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->prov_version > info->fabric_attr->prov_version) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported provider version\n");
-		return -FI_ENODATA;
-	}
-
-	return 0;
-}
-
-int fi_ibv_check_domain_attr(const struct fi_domain_attr *attr,
-			     const struct fi_info *info)
-{
-	if (attr->name && strcmp(attr->name, info->domain_attr->name)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unknown domain name\n");
-		return -FI_ENODATA;
-	}
-
-	switch (attr->threading) {
-	case FI_THREAD_UNSPEC:
-	case FI_THREAD_SAFE:
-	case FI_THREAD_FID:
-	case FI_THREAD_DOMAIN:
-	case FI_THREAD_COMPLETION:
-	case FI_THREAD_ENDPOINT:
-		break;
-	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Invalid threading model\n");
-		return -FI_ENODATA;
-	}
-
-	switch (attr->control_progress) {
-	case FI_PROGRESS_UNSPEC:
-	case FI_PROGRESS_AUTO:
-	case FI_PROGRESS_MANUAL:
-		break;
-	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given control progress mode not supported\n");
-		return -FI_ENODATA;
-	}
-
-	switch (attr->data_progress) {
-	case FI_PROGRESS_UNSPEC:
-	case FI_PROGRESS_AUTO:
-	case FI_PROGRESS_MANUAL:
-		break;
-	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given data progress mode not supported!\n");
-		return -FI_ENODATA;
-	}
-
-	switch (attr->mr_mode) {
-	case FI_MR_UNSPEC:
-	case FI_MR_BASIC:
-		break;
-	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"MR mode not supported\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->mr_key_size > info->domain_attr->mr_key_size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"MR key size too large\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->cq_data_size > info->domain_attr->cq_data_size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"CQ data size too large\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->cq_cnt > info->domain_attr->cq_cnt) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"cq_cnt exceeds supported size\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->ep_cnt > info->domain_attr->ep_cnt) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"ep_cnt exceeds supported size\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->max_ep_tx_ctx > info->domain_attr->max_ep_tx_ctx) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"domain_attr: max_ep_tx_ctx exceeds supported size\n");
-		return -FI_ENODATA;
-	}
-
-	if (attr->max_ep_rx_ctx > info->domain_attr->max_ep_rx_ctx) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"domain_attr: max_ep_rx_ctx exceeds supported size\n");
-		return -FI_ENODATA;
-	}
-
-	return 0;
-}
-
 int fi_ibv_check_ep_attr(const struct fi_ep_attr *attr,
 			 const struct fi_info *info)
 {
 	if ((attr->type != FI_EP_UNSPEC) &&
 	    (attr->type != info->ep_attr->type)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported endpoint type\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Unsupported endpoint type\n");
 		return -FI_ENODATA;
 	}
 
@@ -279,51 +167,83 @@ int fi_ibv_check_ep_attr(const struct fi_ep_attr *attr,
 	case FI_PROTO_IWARP_RDM:
 		break;
 	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported protocol\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Unsupported protocol\n");
 		return -FI_ENODATA;
 	}
 
 	if (attr->protocol_version > 1) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported protocol version\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Unsupported protocol version\n");
 		return -FI_ENODATA;
 	}
 
 	if (attr->max_msg_size > info->ep_attr->max_msg_size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Max message size too large\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Max message size too large\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->ep_attr, attr,
+				  max_msg_size);
 		return -FI_ENODATA;
 	}
 
 	if (attr->max_order_raw_size > info->ep_attr->max_order_raw_size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"max_order_raw_size exceeds supported size\n");
+		VERBS_INFO( FI_LOG_CORE,
+			   "max_order_raw_size exceeds supported size\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->ep_attr, attr,
+				  max_order_raw_size);
 		return -FI_ENODATA;
 	}
 
 	if (attr->max_order_war_size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"max_order_war_size exceeds supported size\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "max_order_war_size exceeds supported size\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->ep_attr, attr,
+				  max_order_war_size);
 		return -FI_ENODATA;
 	}
 
 	if (attr->max_order_waw_size > info->ep_attr->max_order_waw_size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"max_order_waw_size exceeds supported size\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "max_order_waw_size exceeds supported size\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->ep_attr, attr,
+				  max_order_waw_size);
 		return -FI_ENODATA;
 	}
 
 	if (attr->tx_ctx_cnt > info->domain_attr->max_ep_tx_ctx) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"tx_ctx_cnt exceeds supported size\n");
-		return -FI_ENODATA;
+		if (attr->tx_ctx_cnt != FI_SHARED_CONTEXT) {
+			VERBS_INFO(FI_LOG_CORE,
+				   "tx_ctx_cnt exceeds supported size\n");
+			VERBS_INFO(FI_LOG_CORE, "Supported: %zd\nRequested: %zd\n",
+				   info->domain_attr->max_ep_tx_ctx, attr->tx_ctx_cnt);
+			return -FI_ENODATA;
+		} else if (!info->domain_attr->max_ep_stx_ctx) {
+			VERBS_INFO(FI_LOG_CORE,
+				   "Shared tx context not supported\n");
+			return -FI_ENODATA;
+		}
 	}
 
-	if ((attr->rx_ctx_cnt > info->domain_attr->max_ep_rx_ctx) &&
-			(attr->rx_ctx_cnt != FI_SHARED_CONTEXT)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"rx_ctx_cnt exceeds supported size\n");
+	if ((attr->rx_ctx_cnt > info->domain_attr->max_ep_rx_ctx)) {
+		if (attr->rx_ctx_cnt != FI_SHARED_CONTEXT) {
+			VERBS_INFO(FI_LOG_CORE,
+				   "rx_ctx_cnt exceeds supported size\n");
+			VERBS_INFO(FI_LOG_CORE, "Supported: %zd\nRequested: %zd\n",
+				   info->domain_attr->max_ep_rx_ctx,
+				   attr->rx_ctx_cnt);
+			return -FI_ENODATA;
+		} else if (!info->domain_attr->max_ep_srx_ctx) {
+			VERBS_INFO(FI_LOG_CORE,
+				   "Shared rx context not supported\n");
+			return -FI_ENODATA;
+		}
+	}
+
+	if (attr->auth_key_size &&
+	    (attr->auth_key_size != info->ep_attr->auth_key_size)) {
+		VERBS_INFO(FI_LOG_CORE, "Unsupported authentification size.");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->ep_attr, attr,
+				  auth_key_size);
 		return -FI_ENODATA;
 	}
 
@@ -337,37 +257,39 @@ int fi_ibv_check_rx_attr(const struct fi_rx_attr *attr,
 	int rm_enabled;
 
 	if (attr->caps & ~(info->rx_attr->caps)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->caps not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->caps not supported\n");
 		return -FI_ENODATA;
 	}
 
 	compare_mode = attr->mode ? attr->mode : hints->mode;
-	
-	check_mode = FI_IBV_EP_TYPE_IS_RDM(info) ? VERBS_RDM_MODE :
-		(hints->caps & FI_RMA) ? info->rx_attr->mode : VERBS_MODE;
+
+	check_mode = (hints->domain_attr && hints->domain_attr->cq_data_size) ?
+		info->rx_attr->mode : (info->rx_attr->mode & ~FI_RX_CQ_DATA);
 
 	if ((compare_mode & check_mode) != check_mode) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->mode not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->mode not supported\n");
+		FI_INFO_MODE(&fi_ibv_prov, check_mode, compare_mode);
 		return -FI_ENODATA;
 	}
 
 	if (attr->op_flags & ~(info->rx_attr->op_flags)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->op_flags not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->op_flags not supported\n");
 		return -FI_ENODATA;
 	}
 
 	if (attr->msg_order & ~(info->rx_attr->msg_order)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->msg_order not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->msg_order not supported\n");
 		return -FI_ENODATA;
 	}
 
 	if (attr->size > info->rx_attr->size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->size is greater than supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->size is greater than supported\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->rx_attr, attr, size);
 		return -FI_ENODATA;
 	}
 
@@ -377,14 +299,19 @@ int fi_ibv_check_rx_attr(const struct fi_rx_attr *attr,
 	if (!rm_enabled &&
 	    (attr->total_buffered_recv > info->rx_attr->total_buffered_recv))
 	{
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->total_buffered_recv exceeds supported size\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->total_buffered_recv "
+			   "exceeds supported size\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->rx_attr, attr,
+				  total_buffered_recv);
 		return -FI_ENODATA;
 	}
 
 	if (attr->iov_limit > info->rx_attr->iov_limit) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given rx_attr->iov_limit greater than supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given rx_attr->iov_limit greater than supported\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, info->rx_attr, attr,
+				  iov_limit);
 		return -FI_ENODATA;
 	}
 
@@ -395,77 +322,89 @@ int fi_ibv_check_tx_attr(const struct fi_tx_attr *attr,
 			 const struct fi_info *hints, const struct fi_info *info)
 {
 	if (attr->caps & ~(info->tx_attr->caps)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->caps not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->caps not supported\n");
+		FI_INFO_CHECK(&fi_ibv_prov, (info->tx_attr), attr, caps, FI_TYPE_CAPS);
 		return -FI_ENODATA;
 	}
 
 	if (((attr->mode ? attr->mode : hints->mode) &
-				info->tx_attr->mode) != info->tx_attr->mode) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->mode not supported\n");
+	     info->tx_attr->mode) != info->tx_attr->mode) {
+		size_t user_mode = (attr->mode ? attr->mode : hints->mode);
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->mode not supported\n");
+		FI_INFO_MODE(&fi_ibv_prov, info->tx_attr->mode, user_mode);
 		return -FI_ENODATA;
 	}
 
 	if (attr->op_flags & ~(info->tx_attr->op_flags)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->op_flags not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->op_flags not supported\n");
 		return -FI_ENODATA;
 	}
 
 	if (attr->msg_order & ~(info->tx_attr->msg_order)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->msg_order not supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->msg_order not supported\n");
 		return -FI_ENODATA;
 	}
 
 	if (attr->size > info->tx_attr->size) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->size is greater than supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->size is greater than supported\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, (info->tx_attr), attr, size);
 		return -FI_ENODATA;
 	}
 
 	if (attr->iov_limit > info->tx_attr->iov_limit) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->iov_limit greater than supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->iov_limit greater than supported\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, (info->tx_attr), attr,
+				  iov_limit);
 		return -FI_ENODATA;
 	}
 
 	if (attr->rma_iov_limit > info->tx_attr->rma_iov_limit) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Given tx_attr->rma_iov_limit greater than supported\n");
+		VERBS_INFO(FI_LOG_CORE,
+			   "Given tx_attr->rma_iov_limit greater than supported\n");
+		FI_INFO_CHECK_VAL(&fi_ibv_prov, (info->tx_attr), attr,
+				  rma_iov_limit);
 		return -FI_ENODATA;
 	}
 
 	return 0;
 }
 
-static int fi_ibv_check_hints(const struct fi_info *hints,
+static int fi_ibv_check_hints(uint32_t version, const struct fi_info *hints,
 		const struct fi_info *info)
 {
 	int ret;
+	uint64_t prov_mode;
 
 	if (hints->caps & ~(info->caps)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Unsupported capabilities\n");
+		VERBS_INFO(FI_LOG_CORE, "Unsupported capabilities\n");
+		FI_INFO_CHECK(&fi_ibv_prov, info, hints, caps, FI_TYPE_CAPS);
 		return -FI_ENODATA;
 	}
 
-	if ((hints->mode & info->mode) != info->mode) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-			"Required hints mode bits not set. Expected:0x%llx"
-			" Given:0x%llx\n", info->mode, hints->mode);
+	prov_mode = ofi_mr_get_prov_mode(version, hints, info);
+
+	if ((hints->mode & prov_mode) != prov_mode) {
+		VERBS_INFO(FI_LOG_CORE, "needed mode not set\n");
+		FI_INFO_MODE(&fi_ibv_prov, prov_mode, hints->mode);
 		return -FI_ENODATA;
 	}
 
 	if (hints->fabric_attr) {
-		ret = fi_ibv_check_fabric_attr(hints->fabric_attr, info);
+		ret = ofi_check_fabric_attr(&fi_ibv_prov, info->fabric_attr,
+					    hints->fabric_attr);
 		if (ret)
 			return ret;
 	}
 
 	if (hints->domain_attr) {
-		ret = fi_ibv_check_domain_attr(hints->domain_attr, info);
+		ret = ofi_check_domain_attr(&fi_ibv_prov, version, info->domain_attr,
+					    hints->domain_attr);
 		if (ret)
 			return ret;
 	}
@@ -551,27 +490,21 @@ int fi_ibv_fi_to_rai(const struct fi_info *fi, uint64_t flags,
 
 static int fi_ibv_rai_to_fi(struct rdma_addrinfo *rai, struct fi_info *fi)
 {
-	switch(rai->ai_family) {
-	case AF_INET:
-		fi->addr_format = FI_SOCKADDR_IN;
-		break;
-	case AF_INET6:
-		fi->addr_format = FI_SOCKADDR_IN6;
-		break;
-	case AF_IB:
-		fi->addr_format = FI_SOCKADDR_IB;
-		break;
-	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unknown rai->ai_family\n");
+	fi->addr_format = ofi_translate_addr_format(rai->ai_family);
+	if (fi->addr_format == FI_FORMAT_UNSPEC) {
+		VERBS_WARN(FI_LOG_FABRIC, "Unknown address format\n");
+		return -FI_EINVAL;
 	}
 
 	if (rai->ai_src_len) {
+		free(fi->src_addr);
  		if (!(fi->src_addr = malloc(rai->ai_src_len)))
  			return -FI_ENOMEM;
  		memcpy(fi->src_addr, rai->ai_src_addr, rai->ai_src_len);
  		fi->src_addrlen = rai->ai_src_len;
  	}
  	if (rai->ai_dst_len) {
+		free(fi->dest_addr);
 		if (!(fi->dest_addr = malloc(rai->ai_dst_len)))
 			return -FI_ENOMEM;
  		memcpy(fi->dest_addr, rai->ai_dst_addr, rai->ai_dst_len);
@@ -582,7 +515,6 @@ static int fi_ibv_rai_to_fi(struct rdma_addrinfo *rai, struct fi_info *fi)
 }
 
 static inline int fi_ibv_get_qp_cap(struct ibv_context *ctx,
-				    struct ibv_device_attr *device_attr,
 				    struct fi_info *info)
 {
 	struct ibv_pd *pd;
@@ -604,26 +536,15 @@ static inline int fi_ibv_get_qp_cap(struct ibv_context *ctx,
 		goto err1;
 	}
 
-	/* TODO: serialize access to string buffers */
-	fi_read_file(FI_CONF_DIR, "def_tx_ctx_size",
-			def_tx_ctx_size, sizeof def_tx_ctx_size);
-	fi_read_file(FI_CONF_DIR, "def_rx_ctx_size",
-			def_rx_ctx_size, sizeof def_rx_ctx_size);
-	fi_read_file(FI_CONF_DIR, "def_tx_iov_limit",
-			def_tx_iov_limit, sizeof def_tx_iov_limit);
-	fi_read_file(FI_CONF_DIR, "def_rx_iov_limit",
-			def_rx_iov_limit, sizeof def_rx_iov_limit);
-	fi_read_file(FI_CONF_DIR, "def_inject_size",
-			def_inject_size, sizeof def_inject_size);
-
 	memset(&init_attr, 0, sizeof init_attr);
 	init_attr.send_cq = cq;
 	init_attr.recv_cq = cq;
-	init_attr.cap.max_send_wr = MIN(atoi(def_tx_ctx_size), device_attr->max_qp_wr);
-	init_attr.cap.max_recv_wr = MIN(atoi(def_rx_ctx_size), device_attr->max_qp_wr);
-	init_attr.cap.max_send_sge = MIN(atoi(def_tx_iov_limit), device_attr->max_sge);
-	init_attr.cap.max_recv_sge = MIN(atoi(def_rx_iov_limit), device_attr->max_sge);
-	init_attr.cap.max_inline_data = atoi(def_inject_size);
+	init_attr.cap.max_send_wr = verbs_default_tx_size;
+	init_attr.cap.max_recv_wr = verbs_default_rx_size;
+	init_attr.cap.max_send_sge = verbs_default_tx_iov_limit;
+	init_attr.cap.max_recv_sge = verbs_default_rx_iov_limit;
+	init_attr.cap.max_inline_data = verbs_default_inline_size;
+
 	init_attr.qp_type = IBV_QPT_RC;
 
 	qp = ibv_create_qp(pd, &init_attr);
@@ -633,17 +554,7 @@ static inline int fi_ibv_get_qp_cap(struct ibv_context *ctx,
 		goto err2;
 	}
 
-	info->tx_attr->inject_size	= init_attr.cap.max_inline_data;
-	info->tx_attr->iov_limit 	= init_attr.cap.max_send_sge;
-	info->tx_attr->size	 	= init_attr.cap.max_send_wr;
-
-	info->rx_attr->iov_limit 	= init_attr.cap.max_recv_sge;
-	/*
-	 * On some HW ibv_create_qp can increase max_recv_wr value more than
-	 * it really supports. So, alignment with device capability is needed.
-	 */
-	info->rx_attr->size	 	= MIN(init_attr.cap.max_recv_wr,
-						device_attr->max_qp_wr);
+	info->tx_attr->inject_size = init_attr.cap.max_inline_data;
 
 	ibv_destroy_qp(qp);
 err2:
@@ -670,10 +581,28 @@ static int fi_ibv_get_device_attrs(struct ibv_context *ctx, struct fi_info *info
 	info->domain_attr->ep_cnt 		= device_attr.max_qp;
 	info->domain_attr->tx_ctx_cnt 		= MIN(info->domain_attr->tx_ctx_cnt, device_attr.max_qp);
 	info->domain_attr->rx_ctx_cnt 		= MIN(info->domain_attr->rx_ctx_cnt, device_attr.max_qp);
-	info->domain_attr->max_ep_tx_ctx 	= device_attr.max_qp;
-	info->domain_attr->max_ep_rx_ctx 	= device_attr.max_qp;
-
-	ret = fi_ibv_get_qp_cap(ctx, &device_attr, info);
+	info->domain_attr->max_ep_tx_ctx 	= MIN(info->domain_attr->tx_ctx_cnt, device_attr.max_qp);
+	info->domain_attr->max_ep_rx_ctx 	= MIN(info->domain_attr->rx_ctx_cnt, device_attr.max_qp);
+	info->domain_attr->max_ep_srx_ctx	= device_attr.max_srq;
+	info->domain_attr->mr_cnt		= device_attr.max_mr;
+
+	if (info->ep_attr->type == FI_EP_RDM)
+		info->domain_attr->cntr_cnt	= device_attr.max_qp * 4;
+
+	info->tx_attr->size 			= device_attr.max_qp_wr;
+	info->tx_attr->iov_limit 		= device_attr.max_sge;
+	info->tx_attr->rma_iov_limit		= device_attr.max_sge;
+
+	info->rx_attr->size 			= device_attr.max_srq_wr ?
+						  MIN(device_attr.max_qp_wr,
+						      device_attr.max_srq_wr) :
+						      device_attr.max_qp_wr;
+	info->rx_attr->iov_limit 		= device_attr.max_srq_sge ?
+						  MIN(device_attr.max_sge,
+						      device_attr.max_srq_sge) :
+						  device_attr.max_sge;
+
+	ret = fi_ibv_get_qp_cap(ctx, info);
 	if (ret)
 		return ret;
 
@@ -737,7 +666,6 @@ static int fi_ibv_alloc_info(struct ibv_context *ctx, struct fi_info **info,
 		fi->mode	= VERBS_RDM_MODE;
 		*(fi->tx_attr)	= verbs_rdm_tx_attr;
 	} else {
-		fi->mode	= VERBS_MODE;
 		*(fi->tx_attr)	= verbs_tx_attr;
 	}
 
@@ -745,6 +673,10 @@ static int fi_ibv_alloc_info(struct ibv_context *ctx, struct fi_info **info,
 				? verbs_rdm_rx_attr : verbs_rx_attr;
 	*(fi->ep_attr)		= verbs_ep_attr;
 	*(fi->domain_attr)	= verbs_domain_attr;
+
+	if (ep_dom->type == FI_EP_RDM)
+		fi->domain_attr->mr_mode &= ~FI_MR_LOCAL;
+
 	*(fi->fabric_attr)	= verbs_fabric_attr;
 
 	fi->ep_attr->type	= ep_dom->type;
@@ -763,14 +695,14 @@ static int fi_ibv_alloc_info(struct ibv_context *ctx, struct fi_info **info,
 			if (param > sizeof (struct fi_ibv_rdm_rndv_header)) {
 				fi->tx_attr->inject_size = param;
 			} else {
-				FI_INFO(&fi_ibv_prov, FI_LOG_CORE,
-					"rdm_buffer_size too small, should be greater then %d\n",
-					sizeof (struct fi_ibv_rdm_rndv_header));
+				VERBS_INFO(FI_LOG_CORE,
+					   "rdm_buffer_size too small, "
+					   "should be greater then %d\n",
+					   sizeof (struct fi_ibv_rdm_rndv_header));
 				ret = -FI_EINVAL;
 				goto err;
 			}
 		}
-		fi->domain_attr->resource_mgmt = FI_RM_ENABLED;
 	}
 
 	switch (ctx->device->transport_type) {
@@ -808,9 +740,14 @@ static int fi_ibv_alloc_info(struct ibv_context *ctx, struct fi_info **info,
 			fi->ep_attr->protocol = FI_PROTO_IWARP_RDM;
 			fi->tx_attr->op_flags = VERBS_TX_OP_FLAGS_IWARP_RDM;
 		}
+
+		/* TODO Some iWarp HW may support immediate data as per RFC 7306
+		 * (RDMA Protocol Extensions). Update this to figure out if the
+		 * hw supports immediate data dynamically */
+		fi->domain_attr->cq_data_size = 0;
 		break;
 	default:
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Unknown transport type\n");
+		VERBS_INFO(FI_LOG_CORE, "Unknown transport type\n");
 		ret = -FI_ENODATA;
 		goto err;
 	}
@@ -833,64 +770,107 @@ err:
 	return ret;
 }
 
-static int fi_ibv_copy_ifaddr(const char *name, const char *service, uint64_t flags,
-		struct fi_info *info)
+static void fi_ibv_verbs_devs_free(struct dlist_entry *verbs_devs)
 {
-	struct rdma_addrinfo *rai;
-	struct fi_info *fi;
-	struct rdma_cm_id *id;
-	int ret;
-
-	ret = fi_ibv_get_rdma_rai(name, service, flags, NULL, &rai);
-	if (ret) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC,
-				"rdma_getaddrinfo failed for name:%s\n", name);
-		return ret;
-	}
-	ret = rdma_create_ep(&id, rai, NULL, NULL);
-	if (!ret) {
-		for (fi = info; fi; fi = fi->next)
-			if (!strncmp(id->verbs->device->name, fi->domain_attr->name,
-						strlen(id->verbs->device->name)))
-				break;
-		if (!fi) {
-			FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC,
-					"No matching fi_info for device: "
-					"%s with address: %s\n",
-					id->verbs->device->name, name);
-		} else {
-			if (fi->src_addr) {
-				free(fi->src_addr);
-				fi->src_addr = NULL;
-			}
-			fi_ibv_rai_to_fi(rai, fi);
+	struct verbs_dev_info *dev;
+	struct verbs_addr *addr;
+
+	while (!dlist_empty(verbs_devs)) {
+		dlist_pop_front(verbs_devs, struct verbs_dev_info, dev, entry);
+		while (!dlist_empty(&dev->addrs)) {
+			dlist_pop_front(&dev->addrs, struct verbs_addr, addr, entry);
+			rdma_freeaddrinfo(addr->rai);
+			free(addr);
 		}
-		rdma_destroy_ep(id);
+		free(dev->name);
+		free(dev);
 	}
-	rdma_freeaddrinfo(rai);
+}
+
+static int fi_ibv_add_rai(struct dlist_entry *verbs_devs, struct rdma_cm_id *id,
+		struct rdma_addrinfo *rai)
+{
+	struct verbs_dev_info *dev;
+	struct verbs_addr *addr;
+	const char *dev_name;
+
+	if (!(addr = malloc(sizeof(*addr))))
+		return -FI_ENOMEM;
+
+	addr->rai = rai;
+
+	dev_name = ibv_get_device_name(id->verbs->device);
+	dlist_foreach_container(verbs_devs, struct verbs_dev_info, dev, entry)
+		if (!strcmp(dev_name, dev->name))
+			goto add_rai;
+
+	if (!(dev = malloc(sizeof(*dev))))
+		goto err1;
+
+	if (!(dev->name = strdup(dev_name)))
+		goto err2;
+
+	dlist_init(&dev->addrs);
+	dlist_insert_tail(&dev->entry, verbs_devs);
+add_rai:
+	dlist_insert_tail(&addr->entry, &dev->addrs);
 	return 0;
+err2:
+	free(dev);
+err1:
+	free(addr);
+	return -FI_ENOMEM;
 }
 
-static int fi_ibv_getifaddrs(const char *service, uint64_t flags, struct fi_info *info)
+/* Builds a list of interfaces that correspond to active verbs devices */
+static int fi_ibv_getifaddrs(struct dlist_entry *verbs_devs)
 {
 	struct ifaddrs *ifaddr, *ifa;
 	char name[INET6_ADDRSTRLEN];
+	struct rdma_addrinfo *rai;
+	struct rdma_cm_id *id;
 	const char *ret_ptr;
 	int ret, num_verbs_ifs = 0;
 
-	flags |= FI_NUMERICHOST | FI_SOURCE;
+	char *iface = NULL;
+	size_t iface_len = 0;
+	int exact_match = 0;
 
 	ret = getifaddrs(&ifaddr);
 	if (ret) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC,
-				"Unable to get interface addresses\n");
+	       VERBS_WARN(FI_LOG_FABRIC,
+			  "Unable to get interface addresses\n");
 		return ret;
 	}
 
+	/* select best iface name based on user's input */
+	if (fi_param_get_str(&fi_ibv_prov, "iface", &iface) == FI_SUCCESS) {
+		iface_len = strlen(iface);
+		if (iface_len > IFNAMSIZ) {
+			VERBS_INFO(FI_LOG_EP_CTRL,
+				   "Too long iface name: %s, max: %d\n",
+				   iface, IFNAMSIZ);
+			return -FI_EINVAL;
+		}
+		for (ifa = ifaddr; ifa && !exact_match; ifa = ifa->ifa_next)
+			exact_match = !strcmp(ifa->ifa_name, iface);
+	}
+
 	for (ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
 		if (!ifa->ifa_addr || !(ifa->ifa_flags & IFF_UP) ||
 				!strcmp(ifa->ifa_name, "lo"))
 			continue;
+
+		if(iface) {
+			if(exact_match) {
+				if(strcmp(ifa->ifa_name, iface))
+					continue;
+			} else {
+				if(strncmp(ifa->ifa_name, iface, iface_len))
+					continue;
+			}
+		}
+
 		switch (ifa->ifa_addr->sa_family) {
 		case AF_INET:
 			ret_ptr = inet_ntop(AF_INET, &ofi_sin_addr(ifa->ifa_addr),
@@ -904,23 +884,183 @@ static int fi_ibv_getifaddrs(const char *service, uint64_t flags, struct fi_info
 			continue;
 		}
 		if (!ret_ptr) {
-			FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC,
-					"inet_ntop failed: %s(%d)\n",
-					strerror(errno), errno);
-			goto err;
+			VERBS_WARN(FI_LOG_FABRIC,
+				   "inet_ntop failed: %s(%d)\n",
+				   strerror(errno), errno);
+			goto err1;
 		}
-		ret = fi_ibv_copy_ifaddr(name, service, flags, info);
+
+		ret = fi_ibv_create_ep(name, NULL, FI_NUMERICHOST | FI_SOURCE,
+				NULL, &rai, &id);
 		if (ret)
-			goto err;
+			continue;
+
+		ret = fi_ibv_add_rai(verbs_devs, id, rai);
+		if (ret)
+			goto err2;
+
+		VERBS_DBG(FI_LOG_FABRIC, "Found active interface for verbs device: "
+			  "%s with address: %s\n",
+			  ibv_get_device_name(id->verbs->device), name);
+
+		rdma_destroy_ep(id);
+
 		num_verbs_ifs++;
 	}
 	freeifaddrs(ifaddr);
 	return num_verbs_ifs ? 0 : -FI_ENODATA;
-err:
+err2:
+	rdma_destroy_ep(id);
+err1:
+	fi_ibv_verbs_devs_free(verbs_devs);
 	freeifaddrs(ifaddr);
 	return ret;
 }
 
+static int fi_ibv_get_srcaddr_devs(struct fi_info **info)
+{
+	struct fi_info *fi, *add_info;
+	struct fi_info *fi_unconf = NULL, *fi_prev = NULL;
+	struct verbs_dev_info *dev;
+	struct verbs_addr *addr;
+	int ret = 0;
+
+	DEFINE_LIST(verbs_devs);
+
+	ret = fi_ibv_getifaddrs(&verbs_devs);
+	if (ret)
+		return ret;
+
+	if (dlist_empty(&verbs_devs)) {
+		VERBS_WARN(FI_LOG_CORE, "No interface address found\n");
+		return 0;
+	}
+
+	for (fi = *info; fi; fi = fi->next) {
+		dlist_foreach_container(&verbs_devs, struct verbs_dev_info, dev, entry)
+			if (!strncmp(fi->domain_attr->name, dev->name, strlen(dev->name))) {
+				dlist_foreach_container(&dev->addrs, struct verbs_addr, addr, entry) {
+					/* When a device has multiple interfaces/addresses configured
+					 * duplicate fi_info and add the address info. fi->src_addr
+					 * would have been set in the previous iteration */
+					if (fi->src_addr) {
+						if (!(add_info = fi_dupinfo(fi))) {
+							ret = -FI_ENOMEM;
+							goto out;
+						}
+
+						add_info->next = fi->next;
+						fi->next = add_info;
+						fi = add_info;
+					}
+
+					ret = fi_ibv_rai_to_fi(addr->rai, fi);
+					if (ret)
+						goto out;
+				}
+				break;
+			}
+	}
+
+        /* re-order info: move info without src_addr to tail */
+	for (fi = *info; fi;) {
+		if (!fi->src_addr) {
+			/* re-link list - exclude current element */
+			if (fi == *info) {
+				*info = fi->next;
+				fi->next = fi_unconf;
+				fi_unconf = fi;
+				fi = *info;
+			} else {
+				assert(fi_prev);
+				fi_prev->next = fi->next;
+				fi->next = fi_unconf;
+				fi_unconf = fi;
+				fi = fi_prev->next;
+			}
+		} else {
+			fi_prev = fi;
+			fi = fi->next;
+		}
+	}
+
+	/* append excluded elements to tail of list */
+	if (fi_unconf) {
+		if (fi_prev) {
+			assert(!fi_prev->next);
+			fi_prev->next = fi_unconf;
+		} else if (*info) {
+			assert(!(*info)->next);
+			(*info)->next = fi_unconf;
+		} else /* !(*info) */ {
+			(*info) = fi_unconf;
+		}
+	}
+
+out:
+	fi_ibv_verbs_devs_free(&verbs_devs);
+	return ret;
+}
+
+static void fi_ibv_sockaddr_set_port(struct sockaddr *sa, uint16_t port)
+{
+	switch(sa->sa_family) {
+	case AF_INET:
+		((struct sockaddr_in *)sa)->sin_port = port;
+		break;
+	case AF_INET6:
+		((struct sockaddr_in6 *)sa)->sin6_port = port;
+		break;
+	}
+}
+
+static int fi_ibv_fill_addr(struct rdma_addrinfo *rai, struct fi_info **info,
+		struct rdma_cm_id *id)
+{
+	struct fi_info *fi;
+	struct sockaddr *local_addr;
+	int ret;
+
+	/*
+	 * TODO MPICH CH3 doesn't work with verbs provider without skipping the
+	 * loopback address. An alternative approach if there is one is needed
+	 * to allow both.
+	 */
+	if (rai->ai_src_addr && !ofi_is_loopback_addr(rai->ai_src_addr))
+		goto rai_to_fi;
+
+	if (!id->verbs)
+		return fi_ibv_get_srcaddr_devs(info);
+
+	/* Handle the case when rdma_cm doesn't fill src address even
+	 * though it fills the destination address (presence of id->verbs
+	 * corresponds to a valid dest addr) */
+	local_addr = rdma_get_local_addr(id);
+	if (!local_addr) {
+		VERBS_WARN(FI_LOG_CORE,
+			   "Unable to get local address\n");
+		return -FI_ENODATA;
+	}
+
+	rai->ai_src_len = fi_ibv_sockaddr_len(local_addr);
+	if (!(rai->ai_src_addr = malloc(rai->ai_src_len)))
+		return -FI_ENOMEM;
+
+	memcpy(rai->ai_src_addr, local_addr, rai->ai_src_len);
+	/* User didn't specify a port. Zero out the random port
+	 * assigned by rdmamcm so that this rai/fi_info can be
+	 * used multiple times to create rdma endpoints.*/
+	fi_ibv_sockaddr_set_port(rai->ai_src_addr, 0);
+
+rai_to_fi:
+	for (fi = *info; fi; fi = fi->next) {
+		ret = fi_ibv_rai_to_fi(rai, fi);
+		if (ret)
+			return ret;
+	}
+	return 0;
+}
+
 int fi_ibv_init_info(void)
 {
 	struct ibv_context **ctx_list;
@@ -934,25 +1074,25 @@ int fi_ibv_init_info(void)
 	if (verbs_info)
 		goto unlock;
 
-	if (!fi_ibv_have_device()) {
-		VERBS_INFO(FI_LOG_FABRIC, "No RDMA devices found\n");
-		ret = -FI_ENODATA;
-		goto unlock;
-	}
-
 	fi_param_get_bool(NULL, "fork_unsafe", &fork_unsafe);
 
 	if (!fork_unsafe) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Enabling IB fork support\n");
+		VERBS_INFO(FI_LOG_CORE, "Enabling IB fork support\n");
 		ret = ibv_fork_init();
 		if (ret) {
-			FI_WARN(&fi_ibv_prov, FI_LOG_CORE,
-					"Enabling IB fork support failed: %s (%d)\n",
-					strerror(ret), ret);
+			VERBS_WARN(FI_LOG_CORE,
+				   "Enabling IB fork support failed: %s (%d)\n",
+				   strerror(ret), ret);
 			goto unlock;
 		}
 	} else {
-		FI_INFO(&fi_ibv_prov, FI_LOG_CORE, "Not enabling IB fork support\n");
+		VERBS_INFO(FI_LOG_CORE, "Not enabling IB fork support\n");
+	}
+
+	if (!fi_ibv_have_device()) {
+		VERBS_INFO(FI_LOG_FABRIC, "No RDMA devices found\n");
+		ret = -FI_ENODATA;
+		goto unlock;
 	}
 
 	ctx_list = rdma_get_devices(&num_devices);
@@ -988,57 +1128,73 @@ unlock:
 	return ret;
 }
 
-void fi_ibv_update_info(const struct fi_info *hints, struct fi_info *info)
+struct fi_info *fi_ibv_get_verbs_info(const char *domain_name)
 {
-	if (hints) {
-		if (hints->ep_attr) {
-			if (hints->ep_attr->tx_ctx_cnt)
-				info->ep_attr->tx_ctx_cnt = hints->ep_attr->tx_ctx_cnt;
-			if (hints->ep_attr->rx_ctx_cnt)
-				info->ep_attr->rx_ctx_cnt = hints->ep_attr->rx_ctx_cnt;
-		}
+	struct fi_info *fi;
 
-		if (hints->tx_attr)
-			info->tx_attr->op_flags = hints->tx_attr->op_flags;
+	for (fi = verbs_info; fi; fi = fi->next) {
+		if (!strcmp(fi->domain_attr->name, domain_name))
+			return fi;
+	}
 
-		if (hints->rx_attr)
-			info->rx_attr->op_flags = hints->rx_attr->op_flags;
+	return NULL;
+}
 
-		if (hints->handle)
-			info->handle = hints->handle;
+static int fi_ibv_set_default_attr(struct fi_info *info, size_t *attr,
+				   size_t default_attr, char *attr_str)
+{
+	if (default_attr > *attr) {
+		VERBS_WARN(FI_LOG_FABRIC, "Ignoring provider default value "
+			   "for %s as it is greater than the value supported "
+			   "by domain: %s\n", attr_str, info->domain_attr->name);
 	} else {
-		info->tx_attr->op_flags = 0;
-		info->rx_attr->op_flags = 0;
+		*attr = default_attr;
 	}
+	return 0;
 }
 
-int fi_ibv_find_fabric(const struct fi_fabric_attr *attr)
+/* Set default values for attributes. ofi_alter_info would change them if the
+ * user has asked for a different value in hints */
+static int fi_ibv_set_default_info(struct fi_info *info)
 {
-	struct fi_info *fi;
+	int ret;
 
-	for (fi = verbs_info; fi; fi = fi->next) {
-		if (!fi_ibv_check_fabric_attr(attr, fi))
-			return 0;
-	}
+	ret = fi_ibv_set_default_attr(info, &info->tx_attr->size,
+				      verbs_default_tx_size, "tx context size");
+	if (ret)
+		return ret;
 
-	return -FI_ENODATA;
-}
+	ret = fi_ibv_set_default_attr(info, &info->rx_attr->size,
+				    verbs_default_rx_size, "rx context size");
+	if (ret)
+		return ret;
 
-struct fi_info *fi_ibv_get_verbs_info(const char *domain_name)
-{
-	struct fi_info *fi;
+	/* Don't set defaults for verb/RDM as it supports an iov limit of just 1 */
+	if (info->ep_attr->type != FI_EP_RDM) {
+		ret = fi_ibv_set_default_attr(info, &info->tx_attr->iov_limit,
+					      verbs_default_tx_iov_limit,
+					      "tx iov_limit");
+		if (ret)
+			return ret;
 
-	for (fi = verbs_info; fi; fi = fi->next) {
-		if (!strcmp(fi->domain_attr->name, domain_name))
-			return fi;
-	}
+		/* For verbs iov limit is same for both regular messages and RMA */
+		ret = fi_ibv_set_default_attr(info, &info->tx_attr->rma_iov_limit,
+					      verbs_default_tx_iov_limit,
+					      "tx rma_iov_limit");
+		if (ret)
+			return ret;
 
-	return NULL;
+		ret = fi_ibv_set_default_attr(info, &info->rx_attr->iov_limit,
+					      verbs_default_rx_iov_limit,
+					      "rx iov_limit");
+		if (ret)
+			return ret;
+	}
+	return 0;
 }
 
-static int fi_ibv_get_matching_info(const char *domain_name,
-		struct fi_info *hints, struct rdma_addrinfo *rai,
-		struct fi_info **info)
+static int fi_ibv_get_matching_info(uint32_t version, const char *dev_name,
+		struct fi_info *hints, struct fi_info **info)
 {
 	struct fi_info *check_info;
 	struct fi_info *fi, *tail;
@@ -1047,12 +1203,13 @@ static int fi_ibv_get_matching_info(const char *domain_name,
 	*info = tail = NULL;
 
 	for (check_info = verbs_info; check_info; check_info = check_info->next) {
-		if (domain_name && strncmp(check_info->domain_attr->name,
-					   domain_name, strlen(domain_name)))
+		/* Use strncmp since verbs RDM domain name would have "-rdm" suffix */
+		if (dev_name && strncmp(dev_name, check_info->domain_attr->name,
+					strlen(dev_name)))
 			continue;
 
 		if (hints) {
-			ret = fi_ibv_check_hints(hints, check_info);
+			ret = fi_ibv_check_hints(version, hints, check_info);
 			if (ret)
 				continue;
 		}
@@ -1062,11 +1219,11 @@ static int fi_ibv_get_matching_info(const char *domain_name,
 			goto err1;
 		}
 
-		ret = fi_ibv_rai_to_fi(rai, fi);
-		if (ret)
-			goto err2;
-
-		fi_ibv_update_info(hints, fi);
+		ret = fi_ibv_set_default_info(fi);
+		if (ret) {
+			fi_freeinfo(fi);
+			continue;
+		}
 
 		if (!*info)
 			*info = fi;
@@ -1079,154 +1236,18 @@ static int fi_ibv_get_matching_info(const char *domain_name,
 		return -FI_ENODATA;
 
 	return 0;
-err2:
-	fi_freeinfo(fi);
 err1:
 	fi_freeinfo(*info);
 	return ret;
 }
 
-static int
-fi_ibv_rdm_find_sysaddrs(struct fi_ibv_rdm_sysaddr *iface_addr,
-			 struct fi_ibv_rdm_sysaddr *lo_addr)
-{
-	struct ifaddrs *ifaddr, *ifa;
-	char iface[IFNAMSIZ];
-	char *iface_tmp = "ib";
-	size_t iface_len = 2;
-	int ret;
-
-	if (!iface_addr || !lo_addr) {
-		return -FI_EINVAL;
-	}
-
-	iface_addr->is_found = 0;
-	lo_addr->is_found = 0;
-
-	if (fi_param_get_str(&fi_ibv_prov, "iface", &iface_tmp) == FI_SUCCESS) {
-		iface_len = strlen(iface_tmp);
-		if (iface_len > IFNAMSIZ) {
-			VERBS_INFO(FI_LOG_EP_CTRL,
-				   "Too long iface name: %s, max: %d\n",
-				   iface_tmp, IFNAMSIZ);
-			return -FI_EINVAL;
-		}
-	}
-	strncpy(iface, iface_tmp, iface_len);
-
-	ret = getifaddrs(&ifaddr);
-	if (ret) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_FABRIC,
-				"Unable to get interface addresses\n");
-		return ret;
-	}
-
-	for (ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
-		if (!iface_addr->is_found && (ifa->ifa_addr->sa_family == AF_INET) &&
-		    !strncmp(ifa->ifa_name, iface, iface_len)) {
-			memcpy(&iface_addr->addr, ifa->ifa_addr,
-				sizeof(iface_addr->addr));
-			iface_addr->is_found = 1;
-			FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC,
-				"iface addr %s:%u\n",
-				inet_ntoa(iface_addr->addr.sin_addr),
-				ntohs(iface_addr->addr.sin_port));
-		}
-		if (!lo_addr->is_found && (ifa->ifa_addr->sa_family == AF_INET) &&
-		    !strncmp(ifa->ifa_name, "lo", strlen(ifa->ifa_name))) {
-			memcpy(&lo_addr->addr, ifa->ifa_addr, sizeof(lo_addr->addr));
-			lo_addr->is_found = 1;
-			FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC, "lo addr %s:%u\n",
-				inet_ntoa(lo_addr->addr.sin_addr),
-				ntohs(lo_addr->addr.sin_port));
-		}
-		if (iface_addr->is_found && lo_addr->is_found) {
-			break;
-		}
-	}
-
-	freeifaddrs(ifaddr);
-
-	return 0;
-}
-
-static inline int fi_ibv_retain_info(struct fi_info *info,
-				     struct fi_ibv_rdm_sysaddr *iface_addr,
-				      struct fi_ibv_rdm_sysaddr *lo_addr)
-{
-	struct sockaddr_in *src_addr;
-	int retain = 1;
-
-	assert(info && iface_addr && lo_addr);
-	if (!info || !iface_addr || !lo_addr) {
-		return retain;
-	}
-
-	src_addr = info->src_addr;
-	if (FI_IBV_EP_TYPE_IS_RDM(info)) {
-		retain = 0;
-		if (iface_addr->is_found) {
-			retain = !memcmp(&iface_addr->addr.sin_addr,
-					 &src_addr->sin_addr,
-					 sizeof(src_addr->sin_addr));
-		}
-		if (!retain && lo_addr->is_found) {
-			retain = src_addr && src_addr->sin_port &&
-				!memcmp(&lo_addr->addr.sin_addr,
-					&src_addr->sin_addr,
-					sizeof(src_addr->sin_addr));
-		}
-	}
-
-	FI_INFO(&fi_ibv_prov, FI_LOG_FABRIC,
-		retain ? "retain %s:%u\n" : "remove %s:%u\n",
-		(src_addr ? inet_ntoa(src_addr->sin_addr) : "n/a"),
-		(src_addr ? ntohs(src_addr->sin_port) : 0));
-
-	return retain;
-}
-
-static int fi_ibv_rdm_remove_nonaddr_info(struct fi_info **info)
-{
-	struct fi_info *fi, *prev, *tmp;
-	struct fi_ibv_rdm_sysaddr iface_addr, lo_addr;
-	int ret;
-
-	ret = fi_ibv_rdm_find_sysaddrs(&iface_addr, &lo_addr);
-	if (ret || (!iface_addr.is_found && !lo_addr.is_found)) {
-		return ret;
-	}
-
-	prev = NULL;
-	fi = *info;
-	while (fi) {
-		if (fi_ibv_retain_info(fi, &iface_addr, &lo_addr)) {
-			prev = fi;
-			fi = fi->next;
-		} else {
-			if (fi == *info) {
-				*info = (*info)->next;
-			}
-
-			if (prev) {
-				prev->next = fi->next;
-			}
-
-			tmp = fi;
-			fi = fi->next;
-			tmp->next = NULL;
-			fi_freeinfo(tmp);
-		}
-	}
-
-	return *info ? 0 : -FI_ENODEV;
-}
-
 int fi_ibv_getinfo(uint32_t version, const char *node, const char *service,
 		   uint64_t flags, struct fi_info *hints, struct fi_info **info)
 {
 	struct rdma_cm_id *id = NULL;
 	struct rdma_addrinfo *rai;
+	const char *dev_name = NULL;
+	struct fi_info *cur;
 	int ret;
 
 	ret = fi_ibv_init_info();
@@ -1237,30 +1258,27 @@ int fi_ibv_getinfo(uint32_t version, const char *node, const char *service,
 	if (ret)
 		goto out;
 
-	if (id->verbs) {
-		ret = fi_ibv_get_matching_info(ibv_get_device_name(id->verbs->device),
-					       hints, rai, info);
-	} else {
-		ret = fi_ibv_get_matching_info(NULL, hints, rai, info);
-		if (!ret && !(flags & FI_SOURCE) && !node 
-		&& (!hints || (!hints->src_addr && !hints->dest_addr))) {
-			ret = fi_ibv_getifaddrs(service, flags, *info);
-			if (ret) {
-				fi_freeinfo(*info);
-				fi_ibv_destroy_ep(rai, &id);
-				goto out;
-			}
-		}
-	}
+	if (id->verbs)
+		dev_name = ibv_get_device_name(id->verbs->device);
+
+	ret = fi_ibv_get_matching_info(version, dev_name, hints, info);
+	if (ret)
+		goto err;
 
-	if (!ret) {
-		ret = fi_ibv_rdm_remove_nonaddr_info(info);
+	ret = fi_ibv_fill_addr(rai, info, id);
+	if (ret) {
+		fi_freeinfo(*info);
+		goto err;
 	}
 
-	ofi_alter_info(*info, hints);
+	ofi_alter_info(*info, hints, version);
 
+	if (!hints || !(hints->mode & FI_RX_CQ_DATA)) {
+		for (cur = *info; cur; cur = cur->next)
+			cur->domain_attr->cq_data_size = 0;
+	}
+err:
 	fi_ibv_destroy_ep(rai, &id);
-
 out:
 	if (!ret || ret == -FI_ENOMEM || ret == -FI_ENODEV)
 		return ret;
diff --git a/prov/verbs/src/verbs_msg_ep.c b/prov/verbs/src/verbs_msg_ep.c
index f8eb5c5..acf8683 100644
--- a/prov/verbs/src/verbs_msg_ep.c
+++ b/prov/verbs/src/verbs_msg_ep.c
@@ -176,36 +176,44 @@ static int fi_ibv_msg_ep_bind(struct fid *fid, struct fid *bfid, uint64_t flags)
 static int fi_ibv_msg_ep_enable(struct fid_ep *ep)
 {
 	struct ibv_qp_init_attr attr;
+	struct fi_info *verbs_info;
 	struct fi_ibv_msg_ep *_ep;
 	struct ibv_pd *pd;
 
 	_ep = container_of(ep, struct fi_ibv_msg_ep, ep_fid);
 	if (!_ep->eq) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_EP_CTRL, "Endpoint is not bound to an event queue\n");
+		VERBS_WARN(FI_LOG_EP_CTRL,
+			   "Endpoint is not bound to an event queue\n");
 		return -FI_ENOEQ;
 	}
 
 	if (!_ep->scq && !_ep->rcq) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_EP_CTRL, "Endpoint is not bound to "
-				"a send or receive completion queue\n");
+		VERBS_WARN(FI_LOG_EP_CTRL, "Endpoint is not bound to "
+			   "a send or receive completion queue\n");
 		return -FI_ENOCQ;
 	}
 
 	if (!_ep->scq && (ofi_send_allowed(_ep->info->caps) ||
 				ofi_rma_initiate_allowed(_ep->info->caps))) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_EP_CTRL, "Endpoint is not bound to "
-				"a send completion queue when it has transmit "
-				"capabilities enabled (FI_SEND | FI_RMA).\n");
+		VERBS_WARN(FI_LOG_EP_CTRL, "Endpoint is not bound to "
+			   "a send completion queue when it has transmit "
+			   "capabilities enabled (FI_SEND | FI_RMA).\n");
 		return -FI_ENOCQ;
 	}
 
 	if (!_ep->rcq && ofi_recv_allowed(_ep->info->caps)) {
-		FI_WARN(&fi_ibv_prov, FI_LOG_EP_CTRL, "Endpoint is not bound to "
-				"a receive completion queue when it has receive "
-				"capabilities enabled. (FI_RECV)\n");
+		VERBS_WARN(FI_LOG_EP_CTRL, "Endpoint is not bound to "
+			   "a receive completion queue when it has receive "
+			   "capabilities enabled. (FI_RECV)\n");
 		return -FI_ENOCQ;
 	}
 
+	verbs_info = fi_ibv_get_verbs_info(_ep->info->domain_attr->name);
+	if (!verbs_info) {
+		VERBS_INFO(FI_LOG_EP_CTRL, "Unable to find matching verbs_info\n");
+		return -FI_EINVAL;
+	}
+
 	memset(&attr, 0, sizeof attr);
 	if (_ep->scq) {
 		attr.cap.max_send_wr = _ep->info->tx_attr->size;
@@ -285,13 +293,13 @@ int fi_ibv_open_ep(struct fid_domain *domain, struct fi_info *info,
 
 	dom = container_of(domain, struct fi_ibv_domain, domain_fid);
 	if (strcmp(dom->verbs->device->name, info->domain_attr->name)) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_DOMAIN, "Invalid info->domain_attr->name\n");
+		VERBS_INFO(FI_LOG_DOMAIN, "Invalid info->domain_attr->name\n");
 		return -FI_EINVAL;
 	}
 
 	fi = fi_ibv_get_verbs_info(info->domain_attr->name);
 	if (!fi) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_DOMAIN, "Unable to find matching verbs_info\n");
+		VERBS_INFO(FI_LOG_DOMAIN, "Unable to find matching verbs_info\n");
 		return -FI_EINVAL;
 	}
 
@@ -332,13 +340,13 @@ int fi_ibv_open_ep(struct fid_domain *domain, struct fi_info *info,
 		if (rdma_resolve_addr(_ep->id, info->src_addr, info->dest_addr,
 				      VERBS_RESOLVE_TIMEOUT)) {
 			ret = -errno;
-			FI_INFO(&fi_ibv_prov, FI_LOG_DOMAIN, "Unable to rdma_resolve_addr\n");
+			VERBS_INFO(FI_LOG_DOMAIN, "Unable to rdma_resolve_addr\n");
 			goto err;
 		}
 
 		if (rdma_resolve_route(_ep->id, VERBS_RESOLVE_TIMEOUT)) {
 			ret = -errno;
-			FI_INFO(&fi_ibv_prov, FI_LOG_DOMAIN, "Unable to rdma_resolve_route\n");
+			VERBS_INFO(FI_LOG_DOMAIN, "Unable to rdma_resolve_route\n");
 			goto err;
 		}
 	} else {
@@ -357,9 +365,10 @@ int fi_ibv_open_ep(struct fid_domain *domain, struct fi_info *info,
 	_ep->ep_fid.rma = fi_ibv_msg_ep_ops_rma(_ep);
 	_ep->ep_fid.atomic = fi_ibv_msg_ep_ops_atomic(_ep);
 
-	atomic_initialize(&_ep->unsignaled_send_cnt, 0);
-	atomic_initialize(&_ep->comp_pending, 0);
+	ofi_atomic_initialize32(&_ep->unsignaled_send_cnt, 0);
+	ofi_atomic_initialize32(&_ep->comp_pending, 0);
 
+	_ep->domain = dom;
 	*ep = &_ep->ep_fid;
 
 	return 0;
@@ -420,6 +429,7 @@ static int fi_ibv_pep_close(fid_t fid)
 	if (pep->id)
 		rdma_destroy_ep(pep->id);
 
+	fi_freeinfo(pep->info);
 	free(pep);
 	return 0;
 }
@@ -452,17 +462,22 @@ int fi_ibv_passive_ep(struct fid_fabric *fabric, struct fi_info *info,
 	if (!_pep)
 		return -FI_ENOMEM;
 
+	if (!(_pep->info = fi_dupinfo(info))) {
+		ret = -FI_ENOMEM;
+		goto err1;
+	}
+
 	ret = rdma_create_id(NULL, &_pep->id, &_pep->pep_fid.fid, RDMA_PS_TCP);
 	if (ret) {
-		FI_INFO(&fi_ibv_prov, FI_LOG_DOMAIN, "Unable to create rdma_cm_id\n");
-		goto err1;
+		VERBS_INFO(FI_LOG_DOMAIN, "Unable to create rdma_cm_id\n");
+		goto err2;
 	}
 
 	if (info->src_addr) {
 		ret = rdma_bind_addr(_pep->id, (struct sockaddr *)info->src_addr);
 		if (ret) {
-			FI_INFO(&fi_ibv_prov, FI_LOG_DOMAIN, "Unable to bind address to rdma_cm_id\n");
-			goto err2;
+			VERBS_INFO(FI_LOG_DOMAIN, "Unable to bind address to rdma_cm_id\n");
+			goto err3;
 		}
 		_pep->bound = 1;
 	}
@@ -478,8 +493,10 @@ int fi_ibv_passive_ep(struct fid_fabric *fabric, struct fi_info *info,
 	*pep = &_pep->pep_fid;
 	return 0;
 
-err2:
+err3:
 	rdma_destroy_id(_pep->id);
+err2:
+	fi_freeinfo(_pep->info);
 err1:
 	free(_pep);
 	return ret;
diff --git a/prov/verbs/src/verbs_rma.c b/prov/verbs/src/verbs_rma.c
index e418ab0..cf778d3 100644
--- a/prov/verbs/src/verbs_rma.c
+++ b/prov/verbs/src/verbs_rma.c
@@ -244,35 +244,28 @@ struct fi_ops_rma *fi_ibv_msg_ep_ops_rma(struct fi_ibv_msg_ep *ep)
 }
 
 static inline ssize_t
-fi_ibv_rdm_ep_rma_preinit(void **desc, void **raw_buf, size_t len,
-			  struct fi_ibv_rdm_conn *conn,
+fi_ibv_rdm_ep_rma_preinit(void **desc, struct fi_ibv_rdm_buf **rdm_buf,
+			  size_t len, struct fi_ibv_rdm_conn *conn,
 			  struct fi_ibv_rdm_ep *ep)
 {
-	int again = 0;
+	assert(desc && rdm_buf);
 
-	if ((desc == NULL && len >= ep->rndv_threshold) ||
-	    (desc && *desc == NULL && len >= ep->rndv_threshold))
-	{
-		return -FI_EINVAL;
-	}
-
-	again = (!fi_ibv_rdm_check_connection(conn, ep) ||
-		RMA_RESOURCES_IS_BUSY(conn, ep) || conn->postponed_entry);
-
-	if ((!again) && raw_buf && desc && (*desc == NULL)) {
-		*raw_buf = fi_ibv_rdm_rma_prepare_resources(conn, ep);
-		if (*raw_buf) {
+	if (*desc == NULL && len < ep->rndv_threshold) {
+		*rdm_buf = fi_ibv_rdm_rma_prepare_resources(conn, ep);
+		if (*rdm_buf) {
 			*desc = (void*)(uintptr_t)conn->rma_mr->lkey;
+		} else {
+			goto again;
 		}
-		again = !(*raw_buf);
-	}
-
-	if (again) {
-		fi_ibv_rdm_tagged_poll(ep);
-		return -FI_EAGAIN;
+	} else if (!fi_ibv_rdm_check_connection(conn, ep) ||
+		RMA_RESOURCES_IS_BUSY(conn, ep) || conn->postponed_entry) {
+		goto again;
 	}
 
 	return FI_SUCCESS;
+again:
+	fi_ibv_rdm_tagged_poll(ep);
+	return -FI_EAGAIN;
 }
 
 static ssize_t
@@ -281,42 +274,41 @@ fi_ibv_rdm_ep_rma_readmsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
 {
 	struct fi_ibv_rdm_ep *ep =
 		container_of(ep_fid, struct fi_ibv_rdm_ep, ep_fid);
-
 	struct fi_ibv_rdm_conn *conn = ep->av->addr_to_conn(ep, msg->addr);
-
 	struct fi_ibv_rdm_rma_start_data start_data = {
 		.ep_rdm = ep,
 		.conn = conn,
 		.context = msg->context,
-		.flags = FI_RMA | FI_READ | (ep->tx_selective_completion ?
-			(flags & FI_COMPLETION) : FI_COMPLETION),
+		.flags = FI_RMA | FI_READ | GET_TX_COMP_FLAG(ep, flags),
 		.data_len = (uint64_t)msg->msg_iov[0].iov_len,
-		.rbuf = msg->rma_iov[0].addr,
+		.rbuf = (uintptr_t)msg->rma_iov[0].addr,
 		.lbuf = (uintptr_t)msg->msg_iov[0].iov_base,
-		.rkey = (uint32_t)msg->rma_iov[0].key,
-		.lkey = (uint32_t)(uintptr_t)msg->desc[0],
+		.rkey = (uint64_t)(uintptr_t)(msg->rma_iov[0].key),
+		.lkey = (uint64_t)(uintptr_t)(msg->desc ? msg->desc[0] : NULL),
 		.op_code = IBV_WR_RDMA_READ
 	};
-
 	struct fi_ibv_rma_post_ready_data post_ready_data = { .ep_rdm = ep };
 
-	void *raw_buf = NULL;
+	struct fi_ibv_rdm_buf *rdm_buf = NULL;
 	ssize_t ret = FI_SUCCESS;
+	struct fi_ibv_rdm_request *request;
 
 	if(msg->iov_count != 1 || msg->rma_iov_count != 1) {
 		assert(0);
 		return -FI_EMSGSIZE;
 	}
 
-	ret = fi_ibv_rdm_ep_rma_preinit(&msg->desc[0], &raw_buf,
+	ret = fi_ibv_rdm_ep_rma_preinit((void**)&start_data.lkey, &rdm_buf,
 					msg->msg_iov[0].iov_len,
 					conn, ep);
 	if (ret) {
 		return ret;
 	}
 
-	struct fi_ibv_rdm_request *request =
-		util_buf_alloc(fi_ibv_rdm_request_pool);
+	request = util_buf_alloc(fi_ibv_rdm_request_pool);
+	if (OFI_UNLIKELY(!request))
+		return -FI_EAGAIN;
+
 	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
 
 	/* Initial state */
@@ -325,7 +317,7 @@ fi_ibv_rdm_ep_rma_readmsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
 	request->state.err   = FI_SUCCESS;
 
 	request->minfo.is_tagged = 0;
-	request->rmabuf = raw_buf;
+	request->rmabuf = rdm_buf;
 
 	fi_ibv_rdm_req_hndl(request, FI_IBV_EVENT_RMA_START, &start_data);
 
@@ -363,8 +355,7 @@ fi_ibv_rdm_ep_rma_readv(struct fid_ep *ep, const struct iovec *iov, void **desc,
 		rma_iov.len += iov[i].iov_len;
 	}
 
-	return fi_ibv_rdm_ep_rma_readmsg(ep, &msg,
-		(ep_rdm->tx_selective_completion ? 0ULL : FI_COMPLETION));
+	return fi_ibv_rdm_ep_rma_readmsg(ep, &msg, GET_TX_COMP(ep_rdm));
 }
 
 static ssize_t
@@ -389,7 +380,7 @@ fi_ibv_rdm_ep_rma_writemsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
 						ep_fid);
 	struct fi_ibv_rdm_conn *conn = ep->av->addr_to_conn(ep, msg->addr);
 	struct fi_ibv_rdm_request *request = NULL;
-	void *raw_buf = NULL;
+	struct fi_ibv_rdm_buf *rdm_buf = NULL;
 	ssize_t ret = FI_SUCCESS;
 
 	struct fi_ibv_rdm_rma_start_data start_data = {
@@ -401,8 +392,8 @@ fi_ibv_rdm_ep_rma_writemsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
 		.data_len = (uint64_t)msg->msg_iov[0].iov_len,
 		.rbuf = msg->rma_iov[0].addr,
 		.lbuf = (uintptr_t)msg->msg_iov[0].iov_base,
-		.rkey = (uint32_t)msg->rma_iov[0].key,
-		.lkey = (uint32_t)(uintptr_t)msg->desc[0],
+		.rkey = msg->rma_iov[0].key,
+		.lkey = (uint64_t)(uintptr_t)(msg->desc ? msg->desc[0] : NULL),
 		.op_code = IBV_WR_RDMA_WRITE
 	};
 
@@ -411,7 +402,7 @@ fi_ibv_rdm_ep_rma_writemsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
 		return -FI_EMSGSIZE;
 	}
 
-	ret = fi_ibv_rdm_ep_rma_preinit(&msg->desc[0], &raw_buf,
+	ret = fi_ibv_rdm_ep_rma_preinit((void**)&start_data.lkey, &rdm_buf,
 					msg->msg_iov[0].iov_len,
 					conn, ep);
 	if (ret) {
@@ -419,15 +410,17 @@ fi_ibv_rdm_ep_rma_writemsg(struct fid_ep *ep_fid, const struct fi_msg_rma *msg,
 	}
 
 	request = util_buf_alloc(fi_ibv_rdm_request_pool);
-	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
+	if (OFI_UNLIKELY(!request))
+		return -FI_EAGAIN;
 
 	/* Initial state */
 	request->state.eager = FI_IBV_STATE_EAGER_BEGIN;
 	request->state.rndv  = FI_IBV_STATE_RNDV_NOT_USED;
 	request->state.err   = FI_SUCCESS;
-
 	request->minfo.is_tagged = 0;
-	request->rmabuf = raw_buf;
+	request->rmabuf = rdm_buf;
+
+	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
 
 	fi_ibv_rdm_req_hndl(request, FI_IBV_EVENT_RMA_START, &start_data);
 
@@ -467,8 +460,7 @@ fi_ibv_rdm_ep_rma_writev(struct fid_ep *ep_fid, const struct iovec *iov, void **
 	struct fi_ibv_rdm_ep *ep_rdm =
 		container_of(ep_fid, struct fi_ibv_rdm_ep, ep_fid);
 
-	return fi_ibv_rdm_ep_rma_writemsg(ep_fid, &msg,
-		(ep_rdm->tx_selective_completion ? 0ULL : FI_COMPLETION));
+	return fi_ibv_rdm_ep_rma_writemsg(ep_fid, &msg, GET_TX_COMP(ep_rdm));
 }
 
 static ssize_t
@@ -493,8 +485,6 @@ static ssize_t fi_ibv_rdm_ep_rma_inject_write(struct fid_ep *ep,
 	struct fi_ibv_rdm_ep *ep_rdm = container_of(ep, struct fi_ibv_rdm_ep,
 						    ep_fid);
 	struct fi_ibv_rdm_conn *conn = ep_rdm->av->addr_to_conn(ep_rdm, dest_addr);
-	struct fi_ibv_rdm_request *request = NULL;
-
 	struct fi_ibv_rdm_rma_start_data start_data = {
 		.conn = conn,
 		.ep_rdm = ep_rdm,
@@ -502,16 +492,15 @@ static ssize_t fi_ibv_rdm_ep_rma_inject_write(struct fid_ep *ep,
 		.data_len = (uint64_t)len,
 		.rbuf = addr,
 		.lbuf = (uintptr_t)buf,
-		.rkey = (uint32_t)key,
+		.rkey = (uint64_t)key,
 		.lkey = 0
 	};
+	ssize_t ret;
+	struct fi_ibv_rdm_request *request =
+		util_buf_alloc(fi_ibv_rdm_request_pool);
 
-	ssize_t ret = fi_ibv_rdm_ep_rma_preinit(NULL, NULL, len, conn, ep_rdm);
-	if (ret) {
-		return ret;
-	}
-
-	request = util_buf_alloc(fi_ibv_rdm_request_pool);
+	if (OFI_UNLIKELY(!request))
+		return -FI_EAGAIN;
 
 	FI_IBV_RDM_DBG_REQUEST("get_from_pool: ", request, FI_LOG_DEBUG);
 
diff --git a/prov/verbs/src/verbs_srq.c b/prov/verbs/src/verbs_srq.c
index 3c337d9..0be1d7c 100644
--- a/prov/verbs/src/verbs_srq.c
+++ b/prov/verbs/src/verbs_srq.c
@@ -55,6 +55,7 @@ static struct fi_ops_cm fi_ibv_srq_cm_ops = {
 	.accept = fi_no_accept,
 	.reject = fi_no_reject,
 	.shutdown = fi_no_shutdown,
+	.join = fi_no_join,
 };
 
 static struct fi_ops_rma fi_ibv_srq_rma_ops = {
@@ -183,7 +184,8 @@ int fi_ibv_srq_close(fid_t fid)
 
 	rc = ibv_destroy_srq(ep->srq);
 	if (rc)
-		FI_WARN(&fi_ibv_prov, FI_LOG_EP_CTRL, "Cannot destroy SRQ rc=%d\n", rc);
+		VERBS_WARN(FI_LOG_EP_CTRL,
+			   "Cannot destroy SRQ rc=%d\n", rc);
 
 	free(ep);
 
diff --git a/src/abi_1_0.c b/src/abi_1_0.c
new file mode 100644
index 0000000..1892606
--- /dev/null
+++ b/src/abi_1_0.c
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2017, Cisco Systems, Inc. All rights reserved.
+ *
+ * This software is available to you under a choice of one of two
+ * licenses.  You may choose to be licensed under the terms of the GNU
+ * General Public License (GPL) Version 2, available from the file
+ * COPYING in the main directory of this source tree, or the
+ * BSD license below:
+ *
+ *     Redistribution and use in source and binary forms, with or
+ *     without modification, are permitted provided that the following
+ *     conditions are met:
+ *
+ *      - Redistributions of source code must retain the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer.
+ *
+ *      - Redistributions in binary form must reproduce the above
+ *        copyright notice, this list of conditions and the following
+ *        disclaimer in the documentation and/or other materials
+ *        provided with the distribution.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "config.h"
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stddef.h>
+
+#include <rdma/fabric.h>
+#include <fi_abi.h>
+#include <fi_util.h>
+
+
+/*
+ * The conversion from abi 1.0 requires being able to cast from a newer
+ * structure back to the older version.
+ */
+struct fi_fabric_attr_1_0 {
+	struct fid_fabric		*fabric;
+	char				*name;
+	char				*prov_name;
+	uint32_t			prov_version;
+};
+
+struct fi_domain_attr_1_0 {
+	struct fid_domain		*domain;
+	char				*name;
+	enum fi_threading		threading;
+	enum fi_progress		control_progress;
+	enum fi_progress		data_progress;
+	enum fi_resource_mgmt		resource_mgmt;
+	enum fi_av_type			av_type;
+	enum fi_mr_mode			mr_mode;
+	size_t				mr_key_size;
+	size_t				cq_data_size;
+	size_t				cq_cnt;
+	size_t				ep_cnt;
+	size_t				tx_ctx_cnt;
+	size_t				rx_ctx_cnt;
+	size_t				max_ep_tx_ctx;
+	size_t				max_ep_rx_ctx;
+	size_t				max_ep_stx_ctx;
+	size_t				max_ep_srx_ctx;
+};
+
+struct fi_ep_attr_1_0 {
+	enum fi_ep_type		type;
+	uint32_t		protocol;
+	uint32_t		protocol_version;
+	size_t			max_msg_size;
+	size_t			msg_prefix_size;
+	size_t			max_order_raw_size;
+	size_t			max_order_war_size;
+	size_t			max_order_waw_size;
+	uint64_t		mem_tag_format;
+	size_t			tx_ctx_cnt;
+	size_t			rx_ctx_cnt;
+};
+
+struct fi_info_1_0 {
+	struct fi_info			*next;
+	uint64_t			caps;
+	uint64_t			mode;
+	uint32_t			addr_format;
+	size_t				src_addrlen;
+	size_t				dest_addrlen;
+	void				*src_addr;
+	void				*dest_addr;
+	fid_t				handle;
+	struct fi_tx_attr		*tx_attr;
+	struct fi_rx_attr		*rx_attr;
+	struct fi_ep_attr_1_0		*ep_attr;
+	struct fi_domain_attr_1_0	*domain_attr;
+	struct fi_fabric_attr_1_0	*fabric_attr;
+};
+
+#define ofi_dup_attr(dst, src)				\
+	do {						\
+		dst = calloc(1, sizeof(*dst));		\
+		if (dst)				\
+			memcpy(dst, src, sizeof(*src));	\
+	} while (0);
+
+
+__attribute__((visibility ("default")))
+void fi_freeinfo_1_0(struct fi_info_1_0 *info)
+{
+	fi_freeinfo((struct fi_info *) info);
+}
+COMPAT_SYMVER(fi_freeinfo_1_0, fi_freeinfo, FABRIC_1.0);
+
+
+__attribute__((visibility ("default")))
+struct fi_info_1_0 *fi_dupinfo_1_0(const struct fi_info_1_0 *info)
+{
+	struct fi_info *dup;
+
+	if (!info)
+		return (struct fi_info_1_0 *) ofi_allocinfo_internal();
+
+	ofi_dup_attr(dup, info);
+	if (dup == NULL) {
+		return NULL;
+	}
+	dup->src_addr = NULL;
+	dup->dest_addr = NULL;
+	dup->tx_attr = NULL;
+	dup->rx_attr = NULL;
+	dup->ep_attr = NULL;
+	dup->domain_attr = NULL;
+	dup->fabric_attr = NULL;
+	dup->next = NULL;
+
+	if (info->src_addr != NULL) {
+		dup->src_addr = mem_dup(info->src_addr, info->src_addrlen);
+		if (dup->src_addr == NULL)
+			goto fail;
+	}
+	if (info->dest_addr != NULL) {
+		dup->dest_addr = mem_dup(info->dest_addr, info->dest_addrlen);
+		if (dup->dest_addr == NULL)
+			goto fail;
+	}
+	if (info->tx_attr != NULL) {
+		ofi_dup_attr(dup->tx_attr, info->tx_attr);
+		if (dup->tx_attr == NULL)
+			goto fail;
+	}
+	if (info->rx_attr != NULL) {
+		ofi_dup_attr(dup->rx_attr, info->rx_attr);
+		if (dup->rx_attr == NULL)
+			goto fail;
+	}
+	if (info->ep_attr != NULL) {
+		ofi_dup_attr(dup->ep_attr, info->ep_attr);
+		if (dup->ep_attr == NULL)
+			goto fail;
+	}
+	if (info->domain_attr) {
+		ofi_dup_attr(dup->domain_attr, info->domain_attr);
+		if (dup->domain_attr == NULL)
+			goto fail;
+		if (info->domain_attr->name != NULL) {
+			dup->domain_attr->name = strdup(info->domain_attr->name);
+			if (dup->domain_attr->name == NULL)
+				goto fail;
+		}
+	}
+	if (info->fabric_attr) {
+		ofi_dup_attr(dup->fabric_attr, info->fabric_attr);
+		if (dup->fabric_attr == NULL)
+			goto fail;
+		dup->fabric_attr->name = NULL;
+		dup->fabric_attr->prov_name = NULL;
+		if (info->fabric_attr->name != NULL) {
+			dup->fabric_attr->name = strdup(info->fabric_attr->name);
+			if (dup->fabric_attr->name == NULL)
+				goto fail;
+		}
+		if (info->fabric_attr->prov_name != NULL) {
+			dup->fabric_attr->prov_name = strdup(info->fabric_attr->prov_name);
+			if (dup->fabric_attr->prov_name == NULL)
+				goto fail;
+		}
+	}
+	return (struct fi_info_1_0 *) dup;
+
+fail:
+	fi_freeinfo(dup);
+	return NULL;
+}
+COMPAT_SYMVER(fi_dupinfo_1_0, fi_dupinfo, FABRIC_1.0);
+
+__attribute__((visibility ("default")))
+int fi_getinfo_1_0(uint32_t version, const char *node, const char *service,
+		    uint64_t flags, struct fi_info_1_0 *hints_1_0,
+		    struct fi_info_1_0 **info)
+{
+	struct fi_info *hints;
+	int ret;
+
+	if (hints_1_0) {
+		hints = (struct fi_info *)fi_dupinfo_1_0(hints_1_0);
+		if (!hints)
+			return -FI_ENOMEM;
+	} else {
+		hints = NULL;
+	}
+	ret = fi_getinfo(version, node, service, flags, hints,
+			 (struct fi_info **)info);
+	fi_freeinfo(hints);
+
+	return ret;
+}
+COMPAT_SYMVER(fi_getinfo_1_0, fi_getinfo, FABRIC_1.0);
+
+__attribute__((visibility ("default")))
+int fi_fabric_1_0(struct fi_fabric_attr_1_0 *attr_1_0,
+		  struct fid_fabric **fabric, void *context)
+{
+	struct fi_fabric_attr attr;
+
+	if (!attr_1_0)
+		return -FI_EINVAL;
+
+	memcpy(&attr, attr_1_0, sizeof(*attr_1_0));
+
+	/* Since the API version is not available in ABI 1.0, set the field to
+	 * FI_VERSION(1, 0) for compatibility. The actual API version could be
+	 * anywhere from FI_VERSION(1, 0) to FI_VERSION(1, 4).
+	 */
+	attr.api_version = FI_VERSION(1, 0);
+	return fi_fabric(&attr, fabric, context);
+}
+COMPAT_SYMVER(fi_fabric_1_0, fi_fabric, FABRIC_1.0);
diff --git a/src/common.c b/src/common.c
index b3718af..3f568c3 100644
--- a/src/common.c
+++ b/src/common.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
- * Copyright (c) 2006 Cisco Systems, Inc.  All rights reserved.
+ * Copyright (c) 2006-2017 Cisco Systems, Inc.  All rights reserved.
  * Copyright (c) 2013 Intel Corp., Inc.  All rights reserved.
  * Copyright (c) 2015 Los Alamos Nat. Security, LLC. All rights reserved.
  *
@@ -46,6 +46,10 @@
 #include <pthread.h>
 #include <sys/time.h>
 
+#include <inttypes.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
 #include <fi_signal.h>
 #include <rdma/providers/fi_prov.h>
 #include <rdma/fi_errno.h>
@@ -78,30 +82,11 @@ uint64_t fi_tag_format(uint64_t tag_bits)
 	return FI_TAG_GENERIC >> (ffsll(htonll(tag_bits)) - 1);
 }
 
-static const size_t fi_datatype_size_table[] = {
-	[FI_INT8]   = sizeof(int8_t),
-	[FI_UINT8]  = sizeof(uint8_t),
-	[FI_INT16]  = sizeof(int16_t),
-	[FI_UINT16] = sizeof(uint16_t),
-	[FI_INT32]  = sizeof(int32_t),
-	[FI_UINT32] = sizeof(uint32_t),
-	[FI_INT64]  = sizeof(int64_t),
-	[FI_UINT64] = sizeof(uint64_t),
-	[FI_FLOAT]  = sizeof(float),
-	[FI_DOUBLE] = sizeof(double),
-	[FI_FLOAT_COMPLEX]  = sizeof(float complex),
-	[FI_DOUBLE_COMPLEX] = sizeof(double complex),
-	[FI_LONG_DOUBLE]    = sizeof(long double),
-	[FI_LONG_DOUBLE_COMPLEX] = sizeof(long double complex),
-};
-
-size_t fi_datatype_size(enum fi_datatype datatype)
+int fi_size_bits(uint64_t num)
 {
-	if (datatype >= FI_DATATYPE_LAST) {
-		errno = FI_EINVAL;
-		return 0;
-	}
-	return fi_datatype_size_table[datatype];
+	int size_bits = 0;
+	while (num >> ++size_bits);
+	return size_bits;
 }
 
 int ofi_send_allowed(uint64_t caps)
@@ -164,7 +149,7 @@ int ofi_rma_target_allowed(uint64_t caps)
 	return 0;
 }
 
-int ofi_ep_bind_valid(struct fi_provider *prov, struct fid *bfid, uint64_t flags)
+int ofi_ep_bind_valid(const struct fi_provider *prov, struct fid *bfid, uint64_t flags)
 {
 	if (!bfid) {
 		FI_WARN(prov, FI_LOG_EP_CTRL, "NULL bind fid\n");
@@ -211,6 +196,302 @@ uint64_t fi_gettime_us(void)
 	return now.tv_sec * 1000000 + now.tv_usec;
 }
 
+const char *ofi_straddr(char *buf, size_t *len,
+			uint32_t addr_format, const void *addr)
+{
+	const struct sockaddr *sock_addr;
+	const struct sockaddr_in6 *sin6;
+	const struct sockaddr_in *sin;
+	char str[INET6_ADDRSTRLEN + 8];
+	size_t size;
+
+	if (!addr || !len)
+		return NULL;
+
+	switch (addr_format) {
+	case FI_SOCKADDR:
+		sock_addr = addr;
+		switch (sock_addr->sa_family) {
+		case AF_INET:
+			goto sa_sin;
+		case AF_INET6:
+			goto sa_sin6;
+		default:
+			return NULL;
+		}
+		break;
+	case FI_SOCKADDR_IN:
+sa_sin:
+		sin = addr;
+		if (!inet_ntop(sin->sin_family, &sin->sin_addr, str,
+			       sizeof(str)))
+			return NULL;
+
+		size = snprintf(buf, MIN(*len, sizeof(str)),
+				"fi_sockaddr_in://%s:%" PRIu16, str,
+				ntohs(sin->sin_port));
+		break;
+	case FI_SOCKADDR_IN6:
+sa_sin6:
+		sin6 = addr;
+		if (!inet_ntop(sin6->sin6_family, &sin6->sin6_addr, str,
+			       sizeof(str)))
+			return NULL;
+
+		size = snprintf(buf, MIN(*len, sizeof(str)),
+				"fi_sockaddr_in6://[%s]:%" PRIu16, str,
+				ntohs(sin6->sin6_port));
+		break;
+	case FI_SOCKADDR_IB:
+		size = snprintf(buf, *len, "fi_sockaddr_ib://%p", addr);
+		break;
+	case FI_ADDR_PSMX:
+		size = snprintf(buf, *len, "fi_addr_psmx://%" PRIx64,
+				*(uint64_t *)addr);
+		break;
+	case FI_ADDR_PSMX2:
+		size =
+		    snprintf(buf, *len, "fi_addr_psmx2://%" PRIx64 ":%" PRIx64,
+			     *(uint64_t *)addr, *((uint64_t *)addr + 1));
+		break;
+	case FI_ADDR_GNI:
+		size = snprintf(buf, *len, "fi_addr_gni://%" PRIx64,
+				*(uint64_t *)addr);
+		break;
+	case FI_ADDR_BGQ:
+		size = snprintf(buf, *len, "fi_addr_bgq://%p", addr);
+		break;
+	case FI_ADDR_MLX:
+		size = snprintf(buf, *len, "fi_addr_mlx://%p", addr);
+		break;
+	case FI_ADDR_STR:
+		size = snprintf(buf, *len, "%s", (const char *) addr);
+		break;
+	default:
+		return NULL;
+	}
+
+	/* Make sure that possibly truncated messages have a null terminator. */
+	if (buf && *len)
+		buf[*len - 1] = '\0';
+	*len = size + 1;
+	return buf;
+}
+
+static uint32_t ofi_addr_format(const char *str)
+{
+	char fmt[16];
+	int ret;
+
+	ret = sscanf(str, "%16[^:]://", fmt);
+	if (ret != 1)
+		return FI_FORMAT_UNSPEC;
+
+	fmt[sizeof(fmt) - 1] = '\0';
+	if (!strcasecmp(fmt, "fi_sockaddr_in"))
+		return FI_SOCKADDR_IN;
+	else if (!strcasecmp(fmt, "fi_sockaddr_in6"))
+		return FI_SOCKADDR_IN6;
+	else if (!strcasecmp(fmt, "fi_sockaddr_ib"))
+		return FI_SOCKADDR_IB;
+	else if (!strcasecmp(fmt, "fi_addr_psmx"))
+		return FI_ADDR_PSMX;
+	else if (!strcasecmp(fmt, "fi_addr_psmx2"))
+		return FI_ADDR_PSMX2;
+	else if (!strcasecmp(fmt, "fi_addr_gni"))
+		return FI_ADDR_GNI;
+	else if (!strcasecmp(fmt, "fi_addr_bgq"))
+		return FI_ADDR_BGQ;
+	else if (!strcasecmp(fmt, "fi_addr_mlx"))
+		return FI_ADDR_MLX;
+
+	return FI_FORMAT_UNSPEC;
+}
+
+static int ofi_str_to_psmx(const char *str, void **addr, size_t *len)
+{
+	int ret;
+
+	*len = sizeof(uint64_t);
+	if (!(*addr = calloc(1, *len)))
+		return -FI_ENOMEM;
+
+	ret = sscanf(str, "%*[^:]://%" SCNx64, (uint64_t *) *addr);
+	if (ret == 1)
+		return 0;
+
+	free(*addr);
+	return -FI_EINVAL;
+}
+
+static int ofi_str_to_psmx2(const char *str, void **addr, size_t *len)
+{
+	int ret;
+
+	*len = 2 * sizeof(uint64_t);
+	if (!(*addr = calloc(1, *len)))
+		return -FI_ENOMEM;
+
+	ret = sscanf(str, "%*[^:]://%" SCNx64 ":%" SCNx64,
+		     (uint64_t *) *addr, (uint64_t *) *addr + 1);
+	if (ret == 2)
+		return 0;
+
+	free(*addr);
+	return -FI_EINVAL;
+}
+
+static int ofi_str_to_sin(const char *str, void **addr, size_t *len)
+{
+	struct sockaddr_in *sin;
+	char ip[64];
+	int ret;
+
+	*len = sizeof(*sin);
+	if (!(sin = calloc(1, *len)))
+		return -FI_ENOMEM;
+
+	sin->sin_family = AF_INET;
+	ret = sscanf(str, "%*[^:]://:%" SCNu16, &sin->sin_port);
+	if (ret == 1)
+		goto match_port;
+
+	ret = sscanf(str, "%*[^:]://%64[^:]:%" SCNu16, ip, &sin->sin_port);
+	if (ret == 2)
+		goto match_ip;
+
+	ret = sscanf(str, "%*[^:]://%64[^:/]", ip);
+	if (ret == 1)
+		goto match_ip;
+
+err:
+	free(sin);
+	return -FI_EINVAL;
+
+match_ip:
+	ip[sizeof(ip) - 1] = '\0';
+	ret = inet_pton(AF_INET, ip, &sin->sin_addr);
+	if (ret != 1)
+		goto err;
+
+match_port:
+	sin->sin_port = htons(sin->sin_port);
+	*addr = sin;
+	return 0;
+}
+
+static int ofi_str_to_sin6(const char *str, void **addr, size_t *len)
+{
+	struct sockaddr_in6 *sin6;
+	char ip[64];
+	int ret;
+
+	*len = sizeof(*sin6);
+	if (!(sin6 = calloc(1, *len)))
+		return -FI_ENOMEM;
+
+	sin6->sin6_family = AF_INET6;
+	ret = sscanf(str, "%*[^:]://:%" SCNu16, &sin6->sin6_port);
+	if (ret == 1)
+		goto match_port;
+
+	ret = sscanf(str, "%*[^:]://[%64[^]]]:%" SCNu16, ip, &sin6->sin6_port);
+	if (ret == 2)
+		goto match_ip;
+
+	ret = sscanf(str, "%*[^:]://[%64[^]]", ip);
+	if (ret == 1)
+		goto match_ip;
+
+err:
+	free(sin6);
+	return -FI_EINVAL;
+
+match_ip:
+	ip[sizeof(ip) - 1] = '\0';
+	ret = inet_pton(AF_INET6, ip, &sin6->sin6_addr);
+	if (ret != 1)
+		goto err;
+
+match_port:
+	sin6->sin6_port = htons(sin6->sin6_port);
+	*addr = sin6;
+	return 0;
+}
+
+int ofi_str_toaddr(const char *str, uint32_t *addr_format,
+		   void **addr, size_t *len)
+{
+	*addr_format = ofi_addr_format(str);
+	if (*addr_format == FI_FORMAT_UNSPEC)
+		return -FI_EINVAL;
+
+	switch (*addr_format) {
+	case FI_SOCKADDR_IN:
+		return ofi_str_to_sin(str, addr, len);
+	case FI_SOCKADDR_IN6:
+		return ofi_str_to_sin6(str, addr, len);
+	case FI_ADDR_PSMX:
+		return ofi_str_to_psmx(str, addr, len);
+	case FI_ADDR_PSMX2:
+		return ofi_str_to_psmx2(str, addr, len);
+	case FI_SOCKADDR_IB:
+	case FI_ADDR_GNI:
+	case FI_ADDR_BGQ:
+	case FI_ADDR_MLX:
+	default:
+		return -FI_ENOSYS;
+	}
+
+	return 0;
+}
+
+const char *ofi_hex_str(const uint8_t *data, size_t len)
+{
+	static char str[64];
+	const char hex[] = "0123456789abcdef";
+	size_t i, p;
+
+	if (len >= (sizeof(str) >> 1))
+		len = (sizeof(str) >> 1) - 1;
+
+	for (p = 0, i = 0; i < len; i++) {
+		str[p++] = hex[data[i] >> 4];
+		str[p++] = hex[data[i] & 0xF];
+	}
+
+	if (len == (sizeof(str) >> 1) - 1)
+		str[p++] = '~';
+
+	str[p] = '\0';
+	return str;
+}
+
+int ofi_addr_cmp(const struct fi_provider *prov, const struct sockaddr *sa1,
+		 const struct sockaddr *sa2)
+{
+	int cmp;
+
+	switch (sa1->sa_family) {
+	case AF_INET:
+		cmp = memcmp(&ofi_sin_addr(sa1), &ofi_sin_addr(sa2),
+			     sizeof(ofi_sin_addr(sa1)));
+		return cmp ? cmp : memcmp(&ofi_sin_port(sa1),
+					  &ofi_sin_port(sa2),
+					  sizeof(ofi_sin_port(sa1)));
+	case AF_INET6:
+		cmp = memcmp(&ofi_sin6_addr(sa1), &ofi_sin6_addr(sa2),
+			     sizeof(ofi_sin6_addr(sa1)));
+		return cmp ? cmp : memcmp(&ofi_sin6_port(sa1),
+					  &ofi_sin_port(sa2),
+					  sizeof(ofi_sin6_port(sa1)));
+	default:
+		FI_WARN(prov, FI_LOG_FABRIC, "Invalid address format!\n");
+		assert(0);
+		return 0;
+	}
+}
+
 #ifndef HAVE_EPOLL
 
 int fi_epoll_create(struct fi_epoll **ep)
diff --git a/src/enosys.c b/src/enosys.c
index 1265a7f..9931666 100644
--- a/src/enosys.c
+++ b/src/enosys.c
@@ -212,6 +212,11 @@ int fi_no_shutdown(struct fid_ep *ep, uint64_t flags)
 {
 	return -FI_ENOSYS;
 }
+int fi_no_join(struct fid_ep *ep, const void *addr, uint64_t flags,
+			  struct fid_mc **mc, void *context)
+{
+	return -FI_ENOSYS;
+}
 
 /*
  * struct fi_ops_av
@@ -260,6 +265,11 @@ int fi_no_srx_context(struct fid_domain *domain, struct fi_rx_attr *attr,
 {
 	return -FI_ENOSYS;
 }
+int fi_no_query_atomic(struct fid_domain *domain, enum fi_datatype datatype,
+		enum fi_op op, struct fi_atomic_attr *attr, uint64_t flags)
+{
+	return -FI_ENOSYS;
+}
 
 /*
  * struct fi_ops_mr
@@ -395,6 +405,15 @@ ssize_t fi_no_eq_sread(struct fid_eq *eq, uint32_t *event,
 /*
  * struct fi_ops_cq
  */
+ssize_t fi_no_cq_read(struct fid_cq *cq, void *buf, size_t count)
+{
+	return -FI_ENOSYS;
+}
+ssize_t fi_no_cq_readerr(struct fid_cq *cq, struct fi_cq_err_entry *buf,
+		                uint64_t flags)
+{
+	return -FI_ENOSYS;
+}
 ssize_t fi_no_cq_readfrom(struct fid_cq *cq, void *buf, size_t count,
 		fi_addr_t *src_addr)
 {
diff --git a/src/fabric.c b/src/fabric.c
index 95f874e..6502ca6 100644
--- a/src/fabric.c
+++ b/src/fabric.c
@@ -1,7 +1,7 @@
 /*
  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
  * Copyright (c) 2006-2016 Cisco Systems, Inc.  All rights reserved.
- * Copyright (c) 2013 Intel Corp., Inc.  All rights reserved.
+ * Copyright (c) 2013-2017 Intel Corp., Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -41,6 +41,7 @@
 #include <dirent.h>
 
 #include <rdma/fi_errno.h>
+#include "fi_util.h"
 #include "fi.h"
 #include "prov.h"
 
@@ -48,35 +49,42 @@
 #include <dlfcn.h>
 #endif
 
-struct fi_prov {
-	struct fi_prov		*next;
+struct ofi_prov {
+	struct ofi_prov		*next;
+	char			*prov_name;
 	struct fi_provider	*provider;
 	void			*dlhandle;
 };
 
-static struct fi_prov *fi_getprov(const char *prov_name);
-
-static struct fi_prov *prov_head, *prov_tail;
+static struct ofi_prov *prov_head, *prov_tail;
 int ofi_init = 0;
 pthread_mutex_t ofi_ini_lock = PTHREAD_MUTEX_INITIALIZER;
 
 static struct fi_filter prov_filter;
 
-static int fi_find_name(char **names, const char *name)
+
+static int ofi_find_name(char **names, const char *name)
 {
 	int i;
 
 	for (i = 0; names[i]; i++) {
-		if (!strcmp(name, names[i]))
+		if (!strcasecmp(name, names[i]))
 			return i;
 	}
 	return -1;
 }
 
-int fi_apply_filter(struct fi_filter *filter, const char *name)
+static int ofi_is_util_prov(const struct fi_provider *provider)
+{
+	const struct fi_prov_context *ctx;
+	ctx = (const struct fi_prov_context *) &provider->context;
+	return ctx->is_util_prov;
+}
+
+int ofi_apply_filter(struct fi_filter *filter, const char *name)
 {
 	if (filter->names) {
-		if (fi_find_name(filter->names, name) >= 0)
+		if (ofi_find_name(filter->names, name) >= 0)
 			return filter->negated ? 1 : 0;
 
 		return filter->negated ? 0 : 1;
@@ -84,8 +92,23 @@ int fi_apply_filter(struct fi_filter *filter, const char *name)
 	return 0;
 }
 
+static struct ofi_prov *ofi_getprov(const char *prov_name, size_t len)
+{
+	struct ofi_prov *prov;
+
+	for (prov = prov_head; prov; prov = prov->next) {
+		if ((strlen(prov->prov_name) == len) &&
+		    !strncmp(prov->prov_name, prov_name, len))
+			return prov;
+	}
+
+	return NULL;
+}
+
 static void cleanup_provider(struct fi_provider *provider, void *dlhandle)
 {
+	OFI_UNUSED(dlhandle);
+
 	if (provider) {
 		fi_param_undefine(provider);
 
@@ -99,13 +122,65 @@ static void cleanup_provider(struct fi_provider *provider, void *dlhandle)
 #endif
 }
 
-static int fi_register_provider(struct fi_provider *provider, void *dlhandle)
+static struct ofi_prov *ofi_create_prov_entry(const char *prov_name)
+{
+	struct ofi_prov *prov = NULL;
+	prov = calloc(sizeof *prov, 1);
+	if (!prov) {
+		FI_WARN(&core_prov, FI_LOG_CORE,
+			"Not enough memory to allocate provider registry\n");
+		return NULL;
+	}
+
+	prov->prov_name = strdup(prov_name);
+	if (!prov->prov_name) {
+		FI_WARN(&core_prov, FI_LOG_CORE,
+			"Failed to init pre-registered provider name\n");
+		free(prov);
+		return NULL;
+	}
+	if (prov_tail)
+		prov_tail->next = prov;
+	else
+		prov_head = prov;
+	prov_tail = prov;
+
+	return prov;
+}
+
+/* This is the default order that providers will be reported when a provider
+ * is availabe.  Initialize the socket(s) provider last.  This will result in
+ * it being the least preferred provider.
+ */
+static void ofi_ordered_provs_init()
+{
+	char *ordered_prov_names[] =
+			{"psm2", "psm", "usnic", "mlx", "verbs","gni",
+			 "bgq", "netdir", "ofi_rxm", "ofi_rxd",
+			/* Initialize the socket(s) provider last.  This will result in
+			 * it being the least preferred provider. */
+
+			/* Before you add ANYTHING here, read the comment above!!! */
+			"UDP", "sockets" /* NOTHING GOES HERE! */};
+			/* Seriously, read it! */
+	int num_provs = sizeof(ordered_prov_names)/sizeof(ordered_prov_names[0]), i;
+
+	for (i = 0; i < num_provs; i++) {
+		if (ofi_apply_filter(&prov_filter, ordered_prov_names[i]) == 0)
+			ofi_create_prov_entry(ordered_prov_names[i]);
+	}
+}
+
+static int ofi_register_provider(struct fi_provider *provider, void *dlhandle)
 {
 	struct fi_prov_context *ctx;
-	struct fi_prov *prov;
+	struct ofi_prov *prov = NULL;
+	size_t len;
 	int ret;
 
-	if (!provider) {
+	if (!provider || !provider->name) {
+		FI_WARN(&core_prov, FI_LOG_CORE,
+			"no provider structure or name\n");
 		ret = -FI_EINVAL;
 		goto cleanup;
 	}
@@ -114,43 +189,63 @@ static int fi_register_provider(struct fi_provider *provider, void *dlhandle)
 	       "registering provider: %s (%d.%d)\n", provider->name,
 	       FI_MAJOR(provider->version), FI_MINOR(provider->version));
 
+	if (!provider->getinfo || !provider->fabric) {
+		FI_WARN(&core_prov, FI_LOG_CORE,
+			"provider missing mandatory entry points\n");
+		ret = -FI_EINVAL;
+		goto cleanup;
+	}
+
 	/* The current core implementation is not backward compatible
 	 * with providers that support a release earlier than v1.3.
 	 * See commit 0f4b6651.
 	 */
 	if (provider->fi_version < FI_VERSION(1, 3)) {
 		FI_INFO(&core_prov, FI_LOG_CORE,
-		       "provider has unsupported FI version (provider %d.%d != libfabric %d.%d); ignoring\n",
-		       FI_MAJOR(provider->fi_version),
-		       FI_MINOR(provider->fi_version), FI_MAJOR_VERSION,
-		       FI_MINOR_VERSION);
+			"provider has unsupported FI version "
+			"(provider %d.%d != libfabric %d.%d); ignoring\n",
+			FI_MAJOR(provider->fi_version),
+			FI_MINOR(provider->fi_version), FI_MAJOR_VERSION,
+			FI_MINOR_VERSION);
 
 		ret = -FI_ENOSYS;
 		goto cleanup;
 	}
 
-	if (fi_apply_filter(&prov_filter, provider->name)) {
-		FI_INFO(&core_prov, FI_LOG_CORE,
-			"\"%s\" filtered by provider include/exclude list, skipping\n",
-			provider->name);
-		ret = -FI_ENODEV;
-		goto cleanup;
-	}
+	ctx = (struct fi_prov_context *) &provider->context;
+	ctx->is_util_prov = (ofi_util_name(provider->name, &len) != NULL);
 
-	if (fi_apply_filter(&prov_log_filter, provider->name)) {
-		ctx = (struct fi_prov_context *) &provider->context;
-		ctx->disable_logging = 1;
+	/* Util providers are never filtered, as they cannot be used
+	 * by themselves.
+	 */
+	if (!ctx->is_util_prov) {
+		if (ofi_apply_filter(&prov_filter, provider->name)) {
+			FI_INFO(&core_prov, FI_LOG_CORE,
+				"\"%s\" filtered by provider include/exclude "
+				"list, skipping\n", provider->name);
+			ret = -FI_ENODEV;
+			goto cleanup;
+		}
+
+		if (ofi_apply_filter(&prov_log_filter, provider->name))
+			ctx->disable_logging = 1;
 	}
 
-	prov = fi_getprov(provider->name);
+	prov = ofi_getprov(provider->name, strlen(provider->name));
 	if (prov) {
+		/* If this provider has not been init yet, then we add the
+		 * provider and dlhandle to the struct and exit.
+		 */
+		if (prov->provider == NULL)
+			goto update_prov_registry;
+
 		/* If this provider is older than an already-loaded
 		 * provider of the same name, then discard this one.
 		 */
 		if (FI_VERSION_GE(prov->provider->version, provider->version)) {
 			FI_INFO(&core_prov, FI_LOG_CORE,
-			       "a newer %s provider was already loaded; ignoring this one\n",
-			       provider->name);
+				"a newer %s provider was already loaded; "
+				"ignoring this one\n", provider->name);
 			ret = -FI_EALREADY;
 			goto cleanup;
 		}
@@ -160,28 +255,21 @@ static int fi_register_provider(struct fi_provider *provider, void *dlhandle)
 		 * already-loaded one.
 		 */
 		FI_INFO(&core_prov, FI_LOG_CORE,
-		       "an older %s provider was already loaded; keeping this one and ignoring the older one\n",
-		       provider->name);
+			"an older %s provider was already loaded; "
+			"keeping this one and ignoring the older one\n",
+			provider->name);
 		cleanup_provider(prov->provider, prov->dlhandle);
-
-		prov->dlhandle = dlhandle;
-		prov->provider = provider;
-		return 0;
-	}
-
-	prov = calloc(sizeof *prov, 1);
-	if (!prov) {
-		ret = -FI_ENOMEM;
-		goto cleanup;
+	} else {
+		prov = ofi_create_prov_entry(provider->name);
+		if (!prov) {
+			ret = -FI_EOTHER;
+			goto cleanup;
+		}
 	}
 
+update_prov_registry:
 	prov->dlhandle = dlhandle;
 	prov->provider = provider;
-	if (prov_tail)
-		prov_tail->next = prov;
-	else
-		prov_head = prov;
-	prov_tail = prov;
 	return 0;
 
 cleanup:
@@ -268,12 +356,12 @@ static void free_string_array(char **s)
 	free(s);
 }
 
-void fi_free_filter(struct fi_filter *filter)
+void ofi_free_filter(struct fi_filter *filter)
 {
 	free_string_array(filter->names);
 }
 
-void fi_create_filter(struct fi_filter *filter, const char *raw_filter)
+void ofi_create_filter(struct fi_filter *filter, const char *raw_filter)
 {
 	memset(filter, 0, sizeof *filter);
 	if (raw_filter == NULL)
@@ -291,7 +379,7 @@ void fi_create_filter(struct fi_filter *filter, const char *raw_filter)
 }
 
 #ifdef HAVE_LIBDL
-static void fi_ini_dir(const char *dir)
+static void ofi_ini_dir(const char *dir)
 {
 	int n = 0;
 	char *lib;
@@ -326,7 +414,7 @@ static void fi_ini_dir(const char *dir)
 			FI_WARN(&core_prov, FI_LOG_CORE, "dlsym: %s\n", dlerror());
 			dlclose(dlhandle);
 		} else
-			fi_register_provider((inif)(), dlhandle);
+			ofi_register_provider((inif)(), dlhandle);
 	}
 
 libdl_done:
@@ -345,9 +433,9 @@ void fi_ini(void)
 	if (ofi_init)
 		goto unlock;
 
+	ofi_ordered_provs_init();
 	fi_param_init();
 	fi_log_init();
-	fi_util_init();
 	ofi_osd_init();
 
 	fi_param_define(NULL, "provider", FI_PARAM_STRING,
@@ -358,7 +446,7 @@ void fi_ini(void)
 			" performance at the expense of making fork() potentially"
 			" unsafe");
 	fi_param_get_str(NULL, "provider", &param_val);
-	fi_create_filter(&prov_filter, param_val);
+	ofi_create_filter(&prov_filter, param_val);
 
 #ifdef HAVE_LIBDL
 	int n = 0;
@@ -375,7 +463,8 @@ void fi_ini(void)
 	dlclose(dlhandle);
 
 	fi_param_define(NULL, "provider_path", FI_PARAM_STRING,
-			"Search for providers in specific path (default: " PROVDLDIR ")");
+			"Search for providers in specific path (default: "
+			PROVDLDIR ")");
 	fi_param_get_str(NULL, "provider_path", &provdir);
 	if (!provdir)
 		provdir = PROVDLDIR;
@@ -383,29 +472,35 @@ void fi_ini(void)
 	dirs = split_and_alloc(provdir, ":");
 	if (dirs) {
 		for (n = 0; dirs[n]; ++n) {
-			fi_ini_dir(dirs[n]);
+			ofi_ini_dir(dirs[n]);
 		}
 		free_string_array(dirs);
 	}
 libdl_done:
 #endif
 
-	fi_register_provider(PSM2_INIT, NULL);
-	fi_register_provider(PSM_INIT, NULL);
-	fi_register_provider(USNIC_INIT, NULL);
-	fi_register_provider(VERBS_INIT, NULL);
-	fi_register_provider(MXM_INIT, NULL);
-	fi_register_provider(GNI_INIT, NULL);
-	/* fi_register_provider(RXM_INIT, NULL); */
-	/* fi_register_provider(RXD_INIT, NULL); */
-
-        /* Initialize the socket(s) provider last.  This will result in
-           it being the least preferred provider. */
-	fi_register_provider(UDP_INIT, NULL);
-	fi_register_provider(SOCKETS_INIT, NULL);
-	/* Before you add ANYTHING here, read the comment above!!! */
-
-	/* Seriously, read it! */
+	ofi_register_provider(PSM2_INIT, NULL);
+	ofi_register_provider(PSM_INIT, NULL);
+	ofi_register_provider(USNIC_INIT, NULL);
+	ofi_register_provider(MLX_INIT, NULL);
+	ofi_register_provider(VERBS_INIT, NULL);
+	ofi_register_provider(GNI_INIT, NULL);
+	ofi_register_provider(BGQ_INIT, NULL);
+	ofi_register_provider(NETDIR_INIT, NULL);
+	ofi_register_provider(RXM_INIT, NULL);
+
+	{
+		/* TODO: RXD is not stable for now. Disable it by default */
+		int enable_rxd = 0;
+		fi_param_define(NULL, "rxd_enable", FI_PARAM_BOOL,
+				"Enable RXD provider (default: no)");
+		fi_param_get_bool(NULL, "rxd_enable", &enable_rxd);
+		if (enable_rxd)
+			ofi_register_provider(RXD_INIT, NULL);
+	}
+
+	ofi_register_provider(UDP_INIT, NULL);
+	ofi_register_provider(SOCKETS_INIT, NULL);
 
 	ofi_init = 1;
 
@@ -415,7 +510,7 @@ unlock:
 
 FI_DESTRUCTOR(fi_fini(void))
 {
-	struct fi_prov *prov;
+	struct ofi_prov *prov;
 
 	if (!ofi_init)
 		return;
@@ -427,25 +522,12 @@ FI_DESTRUCTOR(fi_fini(void))
 		free(prov);
 	}
 
-	fi_free_filter(&prov_filter);
+	ofi_free_filter(&prov_filter);
 	fi_log_fini();
 	fi_param_fini();
-	fi_util_fini();
 	ofi_osd_fini();
 }
 
-static struct fi_prov *fi_getprov(const char *prov_name)
-{
-	struct fi_prov *prov;
-
-	for (prov = prov_head; prov; prov = prov->next) {
-		if (!strcmp(prov_name, prov->provider->name))
-			return prov;
-	}
-
-	return NULL;
-}
-
 __attribute__((visibility ("default")))
 void DEFAULT_SYMVER_PRE(fi_freeinfo)(struct fi_info *info)
 {
@@ -458,8 +540,12 @@ void DEFAULT_SYMVER_PRE(fi_freeinfo)(struct fi_info *info)
 		free(info->dest_addr);
 		free(info->tx_attr);
 		free(info->rx_attr);
-		free(info->ep_attr);
+		if (info->ep_attr) {
+			free(info->ep_attr->auth_key);
+			free(info->ep_attr);
+		}
 		if (info->domain_attr) {
+			free(info->domain_attr->auth_key);
 			free(info->domain_attr->name);
 			free(info->domain_attr);
 		}
@@ -471,28 +557,32 @@ void DEFAULT_SYMVER_PRE(fi_freeinfo)(struct fi_info *info)
 		free(info);
 	}
 }
-DEFAULT_SYMVER(fi_freeinfo_, fi_freeinfo);
+CURRENT_SYMVER(fi_freeinfo_, fi_freeinfo);
 
-/* Make a dummy info object for each provider, and copy in the
- * provider name and version */
-static int fi_getprovinfo(struct fi_info **info)
+/*
+ * Make a dummy info object for each provider, and copy in the
+ * provider name and version.  We report utility providers directly
+ * to export their version.
+ */
+static int ofi_getprovinfo(struct fi_info **info)
 {
-	struct fi_prov *prov;
+	struct ofi_prov *prov;
 	struct fi_info *tail, *cur;
 	int ret = -FI_ENODATA;
 
 	*info = tail = NULL;
 	for (prov = prov_head; prov; prov = prov->next) {
+		if (!prov->provider)
+			continue;
+
 		cur = fi_allocinfo();
 		if (!cur) {
 			ret = -FI_ENOMEM;
 			goto err;
 		}
 
-		cur->fabric_attr->prov_name =
-			strdup(prov->provider->name);
-		cur->fabric_attr->prov_version =
-			prov->provider->version;
+		cur->fabric_attr->prov_name = strdup(prov->provider->name);
+		cur->fabric_attr->prov_version = prov->provider->version;
 
 		if (!*info) {
 			*info = tail = cur;
@@ -515,12 +605,89 @@ err:
 	return ret;
 }
 
+static void ofi_set_prov_attr(struct fi_fabric_attr *attr,
+			      struct fi_provider *prov)
+{
+	char *core_name;
+
+	core_name = attr->prov_name;
+	if (core_name) {
+		assert(ofi_is_util_prov(prov));
+		attr->prov_name = ofi_strdup_append(core_name, prov->name);
+		free(core_name);
+	} else {
+		assert(!ofi_is_util_prov(prov));
+		attr->prov_name = strdup(prov->name);
+	}
+	attr->prov_version = prov->version;
+}
+
+/*
+ * The layering of utility providers over core providers follows these rules.
+ * 1. If both are specified, then only return that layering
+ * 2. If a utility provider is specified, return it over any* core provider.
+ * 3. If a core provider is specified, return any utility provider that can
+ *    layer over it, plus the core provider itself, if possible.
+ * 4* A utility provider will not layer over the sockets provider unless the
+ *    user explicitly requests that combination.
+ *
+ * Utility providers use an internal flag, OFI_CORE_PROV_ONLY, to indicate
+ * that only core providers should respond to an fi_getinfo query.  This
+ * prevents utility providers from layering over other utility providers.
+ */
+static int ofi_layering_ok(const struct fi_provider *provider,
+			   const char *util_name, size_t util_len,
+			   const char *core_name, size_t core_len,
+			   uint64_t flags)
+{
+	if (flags & OFI_CORE_PROV_ONLY) {
+		if (ofi_is_util_prov(provider)) {
+			FI_INFO(&core_prov, FI_LOG_CORE,
+				"Need core provider, skipping util %s\n",
+				provider->name);
+			return 0;
+		}
+
+		if ((!core_len || !core_name) &&
+		    !strcasecmp(provider->name, "sockets")) {
+			FI_INFO(&core_prov, FI_LOG_CORE,
+				"Skipping util;sockets layering\n");
+			return 0;
+		}
+	}
+
+	if (util_len && util_name) {
+		assert(!(flags & OFI_CORE_PROV_ONLY));
+		if ((strlen(provider->name) != util_len) ||
+		    strncasecmp(util_name, provider->name, util_len))
+			return 0;
+
+	} else if (core_len && core_name) {
+		if (!strncasecmp(core_name, "sockets", core_len) &&
+		    ofi_is_util_prov(provider)) {
+			FI_INFO(&core_prov, FI_LOG_CORE,
+				"Sockets requested, skipping util layering\n");
+			return 0;
+		}
+
+		if (!ofi_is_util_prov(provider) &&
+		    ((strlen(provider->name) != core_len) ||
+		     strncasecmp(core_name, provider->name, core_len)))
+			return 0;
+	}
+
+	return 1;
+}
+
 __attribute__((visibility ("default")))
-int DEFAULT_SYMVER_PRE(fi_getinfo)(uint32_t version, const char *node, const char *service,
-	       uint64_t flags, struct fi_info *hints, struct fi_info **info)
+int DEFAULT_SYMVER_PRE(fi_getinfo)(uint32_t version, const char *node,
+		const char *service, uint64_t flags,
+		struct fi_info *hints, struct fi_info **info)
 {
-	struct fi_prov *prov;
+	struct ofi_prov *prov;
 	struct fi_info *tail, *cur;
+	const char *util_name = NULL, *core_name = NULL;
+	size_t util_len = 0, core_len = 0;
 	int ret;
 
 	if (!ofi_init)
@@ -533,18 +700,35 @@ int DEFAULT_SYMVER_PRE(fi_getinfo)(uint32_t version, const char *node, const cha
 	}
 
 	if (flags == FI_PROV_ATTR_ONLY) {
-		return fi_getprovinfo(info);
+		return ofi_getprovinfo(info);
+	}
+
+	if (hints && hints->fabric_attr && hints->fabric_attr->prov_name) {
+		util_name = ofi_util_name(hints->fabric_attr->prov_name,
+					  &util_len);
+		core_name = ofi_core_name(hints->fabric_attr->prov_name,
+					  &core_len);
 	}
 
 	*info = tail = NULL;
 	for (prov = prov_head; prov; prov = prov->next) {
-		if (!prov->provider->getinfo)
+		if (!prov->provider)
 			continue;
 
-		if (hints && hints->fabric_attr && hints->fabric_attr->prov_name &&
-		    strcasecmp(prov->provider->name, hints->fabric_attr->prov_name))
+		if (!ofi_layering_ok(prov->provider, util_name, util_len,
+				     core_name, core_len, flags))
 			continue;
 
+		if (FI_VERSION_LT(prov->provider->fi_version, version)) {
+			FI_WARN(&core_prov, FI_LOG_CORE,
+				"Provider %s fi_version %d.%d < requested %d.%d\n",
+				prov->provider->name,
+				FI_MAJOR(prov->provider->fi_version),
+				FI_MINOR(prov->provider->fi_version),
+				FI_MAJOR(version), FI_MINOR(version));
+			continue;
+		}
+
 		ret = prov->provider->getinfo(version, node, service, flags,
 					      hints, &cur);
 		if (ret) {
@@ -554,31 +738,31 @@ int DEFAULT_SYMVER_PRE(fi_getinfo)(uint32_t version, const char *node, const cha
 			continue;
 		}
 
+		if (!cur) {
+			FI_WARN(&core_prov, FI_LOG_CORE,
+				"fi_getinfo: provider %s output empty list\n",
+				prov->provider->name);
+			continue;
+		}
+
 		if (!*info)
 			*info = cur;
 		else
 			tail->next = cur;
+
 		for (tail = cur; tail->next; tail = tail->next) {
-			if (tail->fabric_attr->prov_name != NULL)
-				FI_WARN(&core_prov, FI_LOG_CORE,
-					"prov_name field is not NULL (%s)\n",
-					tail->fabric_attr->prov_name);
-			tail->fabric_attr->prov_name = strdup(prov->provider->name);
-			tail->fabric_attr->prov_version = prov->provider->version;
+			ofi_set_prov_attr(tail->fabric_attr, prov->provider);
+			tail->fabric_attr->api_version = version;
 		}
-		if (tail->fabric_attr->prov_name != NULL)
-			FI_WARN(&core_prov, FI_LOG_CORE,
-				"prov_name field is not NULL (%s)\n",
-				tail->fabric_attr->prov_name);
-		tail->fabric_attr->prov_name = strdup(prov->provider->name);
-		tail->fabric_attr->prov_version = prov->provider->version;
+		ofi_set_prov_attr(tail->fabric_attr, prov->provider);
+		tail->fabric_attr->api_version = version;
 	}
 
 	return *info ? 0 : -FI_ENODATA;
 }
-DEFAULT_SYMVER(fi_getinfo_, fi_getinfo);
+CURRENT_SYMVER(fi_getinfo_, fi_getinfo);
 
-static struct fi_info *fi_allocinfo_internal(void)
+struct fi_info *ofi_allocinfo_internal(void)
 {
 	struct fi_info *info;
 
@@ -608,7 +792,7 @@ struct fi_info *DEFAULT_SYMVER_PRE(fi_dupinfo)(const struct fi_info *info)
 	struct fi_info *dup;
 
 	if (!info)
-		return fi_allocinfo_internal();
+		return ofi_allocinfo_internal();
 
 	dup = mem_dup(info, sizeof(*dup));
 	if (dup == NULL) {
@@ -647,19 +831,37 @@ struct fi_info *DEFAULT_SYMVER_PRE(fi_dupinfo)(const struct fi_info *info)
 		dup->ep_attr = mem_dup(info->ep_attr, sizeof(*info->ep_attr));
 		if (dup->ep_attr == NULL)
 			goto fail;
+		if (info->ep_attr->auth_key != NULL) {
+			dup->ep_attr->auth_key =
+				mem_dup(info->ep_attr->auth_key,
+					info->ep_attr->auth_key_size);
+			if (dup->ep_attr->auth_key == NULL)
+				goto fail;
+		}
 	}
 	if (info->domain_attr) {
-		dup->domain_attr = mem_dup(info->domain_attr, sizeof(*info->domain_attr));
+		dup->domain_attr = mem_dup(info->domain_attr,
+					   sizeof(*info->domain_attr));
 		if (dup->domain_attr == NULL)
 			goto fail;
+		dup->domain_attr->name = NULL;
+		dup->domain_attr->auth_key = NULL;
 		if (info->domain_attr->name != NULL) {
 			dup->domain_attr->name = strdup(info->domain_attr->name);
 			if (dup->domain_attr->name == NULL)
 				goto fail;
 		}
+		if (info->domain_attr->auth_key != NULL) {
+			dup->domain_attr->auth_key =
+				mem_dup(info->domain_attr->auth_key,
+					info->domain_attr->auth_key_size);
+			if (dup->domain_attr->auth_key == NULL)
+				goto fail;
+		}
 	}
 	if (info->fabric_attr) {
-		dup->fabric_attr = mem_dup(info->fabric_attr, sizeof(*info->fabric_attr));
+		dup->fabric_attr = mem_dup(info->fabric_attr,
+					   sizeof(*info->fabric_attr));
 		if (dup->fabric_attr == NULL)
 			goto fail;
 		dup->fabric_attr->name = NULL;
@@ -681,12 +883,16 @@ fail:
 	fi_freeinfo(dup);
 	return NULL;
 }
-DEFAULT_SYMVER(fi_dupinfo_, fi_dupinfo);
+CURRENT_SYMVER(fi_dupinfo_, fi_dupinfo);
 
 __attribute__((visibility ("default")))
-int DEFAULT_SYMVER_PRE(fi_fabric)(struct fi_fabric_attr *attr, struct fid_fabric **fabric, void *context)
+int DEFAULT_SYMVER_PRE(fi_fabric)(struct fi_fabric_attr *attr,
+		struct fid_fabric **fabric, void *context)
 {
-	struct fi_prov *prov;
+	struct ofi_prov *prov;
+	const char *top_name;
+	size_t len;
+	int ret;
 
 	if (!attr || !attr->prov_name || !attr->name)
 		return -FI_EINVAL;
@@ -694,20 +900,30 @@ int DEFAULT_SYMVER_PRE(fi_fabric)(struct fi_fabric_attr *attr, struct fid_fabric
 	if (!ofi_init)
 		fi_ini();
 
-	prov = fi_getprov(attr->prov_name);
-	if (!prov || !prov->provider->fabric)
+	top_name = ofi_util_name(attr->prov_name, &len);
+	if (!top_name)
+		top_name = ofi_core_name(attr->prov_name, &len);
+
+	if (!top_name)
+		return -FI_EINVAL;
+
+	prov = ofi_getprov(top_name, len);
+	if (!prov || !prov->provider || !prov->provider->fabric)
 		return -FI_ENODEV;
 
-	return prov->provider->fabric(attr, fabric, context);
+	ret = prov->provider->fabric(attr, fabric, context);
+	if (!ret && FI_VERSION_GE(prov->provider->fi_version, FI_VERSION(1, 5)))
+		(*fabric)->api_version = attr->api_version;
+	return ret;
 }
-DEFAULT_SYMVER(fi_fabric_, fi_fabric);
+CURRENT_SYMVER(fi_fabric_, fi_fabric);
 
 __attribute__((visibility ("default")))
 uint32_t DEFAULT_SYMVER_PRE(fi_version)(void)
 {
 	return FI_VERSION(FI_MAJOR_VERSION, FI_MINOR_VERSION);
 }
-DEFAULT_SYMVER(fi_version_, fi_version);
+DEFAULT_SYMVER(fi_version_, fi_version, FABRIC_1.0);
 
 static const char *const errstr[] = {
 	[FI_EOTHER - FI_ERRNO_OFFSET] = "Unspecified error",
@@ -722,6 +938,7 @@ static const char *const errstr[] = {
 	[FI_ETRUNC - FI_ERRNO_OFFSET] = "Truncation error",
 	[FI_ENOKEY - FI_ERRNO_OFFSET] = "Required key not available",
 	[FI_ENOAV - FI_ERRNO_OFFSET] = "Missing or unavailable address vector",
+	[FI_EOVERRUN - FI_ERRNO_OFFSET] = "Queue has been overrun",
 };
 
 __attribute__((visibility ("default")))
@@ -734,4 +951,4 @@ const char *DEFAULT_SYMVER_PRE(fi_strerror)(int errnum)
 	else
 		return errstr[FI_EOTHER - FI_ERRNO_OFFSET];
 }
-DEFAULT_SYMVER(fi_strerror_, fi_strerror);
+DEFAULT_SYMVER(fi_strerror_, fi_strerror, FABRIC_1.0);
diff --git a/src/fi_tostr.c b/src/fi_tostr.c
index 3d79fcf..d6768a5 100644
--- a/src/fi_tostr.c
+++ b/src/fi_tostr.c
@@ -46,6 +46,7 @@
 #include <rdma/fabric.h>
 #include <rdma/fi_domain.h>
 #include <rdma/fi_endpoint.h>
+#include <rdma/fi_trigger.h>
 
 /* Print fi_info and related structs, enums, OR_able flags, addresses.
  *
@@ -101,6 +102,7 @@ static void fi_tostr_flags(char *buf, uint64_t flags)
 	IFFLAGSTR(flags, FI_RMA);
 	IFFLAGSTR(flags, FI_TAGGED);
 	IFFLAGSTR(flags, FI_ATOMIC);
+	IFFLAGSTR(flags, FI_MULTICAST);
 
 	IFFLAGSTR(flags, FI_READ);
 	IFFLAGSTR(flags, FI_WRITE);
@@ -121,6 +123,7 @@ static void fi_tostr_flags(char *buf, uint64_t flags)
 	IFFLAGSTR(flags, FI_INJECT_COMPLETE);
 	IFFLAGSTR(flags, FI_TRANSMIT_COMPLETE);
 	IFFLAGSTR(flags, FI_DELIVERY_COMPLETE);
+	IFFLAGSTR(flags, FI_AFFINITY);
 
 	fi_remove_comma(buf);
 }
@@ -134,7 +137,11 @@ static void fi_tostr_addr_format(char *buf, uint32_t addr_format)
 	CASEENUMSTR(FI_SOCKADDR_IN6);
 	CASEENUMSTR(FI_SOCKADDR_IB);
 	CASEENUMSTR(FI_ADDR_PSMX);
+	CASEENUMSTR(FI_ADDR_PSMX2);
 	CASEENUMSTR(FI_ADDR_GNI);
+	CASEENUMSTR(FI_ADDR_BGQ);
+	CASEENUMSTR(FI_ADDR_MLX);
+	CASEENUMSTR(FI_ADDR_STR);
 	default:
 		if (addr_format & FI_PROV_SPECIFIC)
 			strcatf(buf, "Provider specific");
@@ -191,6 +198,10 @@ static void fi_tostr_order(char *buf, uint64_t flags)
 
 static void fi_tostr_caps(char *buf, uint64_t caps)
 {
+	IFFLAGSTR(caps, FI_SOURCE_ERR);
+	IFFLAGSTR(caps, FI_LOCAL_COMM);
+	IFFLAGSTR(caps, FI_REMOTE_COMM);
+	IFFLAGSTR(caps, FI_SHARED_AV);
 	IFFLAGSTR(caps, FI_NUMERICHOST);
 	IFFLAGSTR(caps, FI_RMA_EVENT);
 	IFFLAGSTR(caps, FI_SOURCE);
@@ -208,6 +219,8 @@ static void fi_tostr_ep_type(char *buf, enum fi_ep_type ep_type)
 	CASEENUMSTR(FI_EP_MSG);
 	CASEENUMSTR(FI_EP_DGRAM);
 	CASEENUMSTR(FI_EP_RDM);
+	CASEENUMSTR(FI_EP_SOCK_STREAM);
+	CASEENUMSTR(FI_EP_SOCK_DGRAM);
 	default:
 		strcatf(buf, "Unknown");
 		break;
@@ -222,14 +235,16 @@ static void fi_tostr_protocol(char *buf, uint32_t protocol)
 	CASEENUMSTR(FI_PROTO_IWARP);
 	CASEENUMSTR(FI_PROTO_IB_UD);
 	CASEENUMSTR(FI_PROTO_PSMX);
+	CASEENUMSTR(FI_PROTO_PSMX2);
 	CASEENUMSTR(FI_PROTO_UDP);
 	CASEENUMSTR(FI_PROTO_SOCK_TCP);
-	CASEENUMSTR(FI_PROTO_MXM);
 	CASEENUMSTR(FI_PROTO_IB_RDM);
 	CASEENUMSTR(FI_PROTO_IWARP_RDM);
 	CASEENUMSTR(FI_PROTO_GNI);
 	CASEENUMSTR(FI_PROTO_RXM);
 	CASEENUMSTR(FI_PROTO_RXD);
+	CASEENUMSTR(FI_PROTO_MLX);
+	CASEENUMSTR(FI_PROTO_NETWORKDIRECT);
 	default:
 		if (protocol & FI_PROV_SPECIFIC)
 			strcatf(buf, "Provider specific");
@@ -246,14 +261,18 @@ static void fi_tostr_mode(char *buf, uint64_t mode)
 	IFFLAGSTR(mode, FI_ASYNC_IOV);
 	IFFLAGSTR(mode, FI_RX_CQ_DATA);
 	IFFLAGSTR(mode, FI_LOCAL_MR);
+	IFFLAGSTR(mode, FI_NOTIFY_FLAGS_ONLY);
+	IFFLAGSTR(mode, FI_RESTRICTED_COMP);
+	IFFLAGSTR(mode, FI_CONTEXT2);
 
 	fi_remove_comma(buf);
 }
 
-static void fi_tostr_addr(char *buf, uint32_t addr_format,
-		void *addr)
+static void fi_tostr_addr(char *buf, uint32_t addr_format, void *addr)
 {
 	char *p;
+	size_t len;
+
 	p = buf + strlen(buf);
 
 	if (addr == NULL) {
@@ -261,36 +280,8 @@ static void fi_tostr_addr(char *buf, uint32_t addr_format,
 		return;
 	}
 
-	switch (addr_format) {
-	case FI_SOCKADDR:
-		/* translate and recurse... */
-		switch (((struct sockaddr *)addr)->sa_family) {
-		case AF_INET:
-			fi_tostr_addr(p, FI_SOCKADDR_IN, addr);
-			break;
-		case AF_INET6:
-			fi_tostr_addr(p, FI_SOCKADDR_IN6, addr);
-			break;
-		default:
-			fi_tostr_addr(p, FI_FORMAT_UNSPEC, addr);
-			break;
-		}
-		break;
-	case FI_SOCKADDR_IN:
-		inet_ntop(AF_INET, &((struct sockaddr_in *)addr)->sin_addr,
-			p, 64);
-		break;
-	case FI_SOCKADDR_IN6:
-		inet_ntop(AF_INET6, &((struct sockaddr_in6 *)addr)->sin6_addr,
-			p, 64);
-		break;
-	case FI_ADDR_GNI:  /*TODO: eventually something better */
-		sprintf(p, "0x%" PRIx64,*(uint64_t *)addr);
-		break;
-	default:
-		sprintf(p, "%p", addr);
-		break;
-	}
+	len = 64;
+	ofi_straddr(p, &len, addr_format, addr);
 }
 
 static void fi_tostr_tx_attr(char *buf, const struct fi_tx_attr *attr,
@@ -386,6 +377,8 @@ static void fi_tostr_ep_attr(char *buf, const struct fi_ep_attr *attr, const cha
 
 	strcatf(buf, "%s%stx_ctx_cnt: %zd\n", prefix, TAB, attr->tx_ctx_cnt);
 	strcatf(buf, "%s%srx_ctx_cnt: %zd\n", prefix, TAB, attr->rx_ctx_cnt);
+
+	strcatf(buf, "%s%sauth_key_size: %zd\n", prefix, TAB, attr->auth_key_size);
 }
 
 static void fi_tostr_resource_mgmt(char *buf, enum fi_resource_mgmt rm)
@@ -412,12 +405,35 @@ static void fi_tostr_av_type(char *buf, enum fi_av_type type)
 	}
 }
 
-static void fi_tostr_mr_mode(char *buf, enum fi_mr_mode type)
+static void fi_tostr_mr_mode(char *buf, int mr_mode)
 {
-	switch (type) {
-	CASEENUMSTR(FI_MR_UNSPEC);
-	CASEENUMSTR(FI_MR_BASIC);
-	CASEENUMSTR(FI_MR_SCALABLE);
+	IFFLAGSTR(mr_mode, FI_MR_BASIC);
+	IFFLAGSTR(mr_mode, FI_MR_SCALABLE);
+	IFFLAGSTR(mr_mode, FI_MR_LOCAL);
+	IFFLAGSTR(mr_mode, FI_MR_RAW);
+	IFFLAGSTR(mr_mode, FI_MR_VIRT_ADDR);
+	IFFLAGSTR(mr_mode, FI_MR_ALLOCATED);
+	IFFLAGSTR(mr_mode, FI_MR_PROV_KEY);
+	IFFLAGSTR(mr_mode, FI_MR_MMU_NOTIFY);
+	IFFLAGSTR(mr_mode, FI_MR_RMA_EVENT);
+
+	fi_remove_comma(buf);
+}
+
+static void fi_tostr_op_type(char *buf, int op_type)
+{
+	switch (op_type) {
+	CASEENUMSTR(FI_OP_RECV);
+	CASEENUMSTR(FI_OP_SEND);
+	CASEENUMSTR(FI_OP_TRECV);
+	CASEENUMSTR(FI_OP_TSEND);
+	CASEENUMSTR(FI_OP_READ);
+	CASEENUMSTR(FI_OP_WRITE);
+	CASEENUMSTR(FI_OP_ATOMIC);
+	CASEENUMSTR(FI_OP_FETCH_ATOMIC);
+	CASEENUMSTR(FI_OP_COMPARE_ATOMIC);
+	CASEENUMSTR(FI_OP_CNTR_SET);
+	CASEENUMSTR(FI_OP_CNTR_ADD);
 	default:
 		strcatf(buf, "Unknown");
 		break;
@@ -453,9 +469,9 @@ static void fi_tostr_domain_attr(char *buf, const struct fi_domain_attr *attr,
 	strcatf(buf, "%s%sav_type: ", prefix, TAB);
 	fi_tostr_av_type(buf, attr->av_type);
 	strcatf(buf, "\n");
-	strcatf(buf, "%s%smr_mode: ", prefix, TAB);
+	strcatf(buf, "%s%smr_mode: [ ", prefix, TAB);
 	fi_tostr_mr_mode(buf, attr->mr_mode);
-	strcatf(buf, "\n");
+	strcatf(buf, " ]\n");
 
 	strcatf(buf, "%s%smr_key_size: %zd\n", prefix, TAB, attr->mr_key_size);
 	strcatf(buf, "%s%scq_data_size: %zd\n", prefix, TAB, attr->cq_data_size);
@@ -467,6 +483,20 @@ static void fi_tostr_domain_attr(char *buf, const struct fi_domain_attr *attr,
 	strcatf(buf, "%s%smax_ep_rx_ctx: %zd\n", prefix, TAB, attr->max_ep_rx_ctx);
 	strcatf(buf, "%s%smax_ep_stx_ctx: %zd\n", prefix, TAB, attr->max_ep_stx_ctx);
 	strcatf(buf, "%s%smax_ep_srx_ctx: %zd\n", prefix, TAB, attr->max_ep_srx_ctx);
+	strcatf(buf, "%s%scntr_cnt: %zd\n", prefix, TAB, attr->cntr_cnt);
+	strcatf(buf, "%s%smr_iov_limit: %zd\n", prefix, TAB, attr->mr_iov_limit);
+
+	strcatf(buf, "%scaps: [ ", TAB);
+	fi_tostr_caps(buf, attr->caps);
+	strcatf(buf, " ]\n");
+
+	strcatf(buf, "%smode: [ ", TAB);
+	fi_tostr_mode(buf, attr->mode);
+	strcatf(buf, " ]\n");
+
+	strcatf(buf, "%s%sauth_key_size: %zd\n", prefix, TAB, attr->auth_key_size);
+	strcatf(buf, "%s%smax_err_data: %zd\n", prefix, TAB, attr->max_err_data);
+	strcatf(buf, "%s%smr_cnt: %zd\n", prefix, TAB, attr->mr_cnt);
 }
 
 static void fi_tostr_fabric_attr(char *buf, const struct fi_fabric_attr *attr,
@@ -482,6 +512,8 @@ static void fi_tostr_fabric_attr(char *buf, const struct fi_fabric_attr *attr,
 	strcatf(buf, "%s%sprov_name: %s\n", prefix, TAB, attr->prov_name);
 	strcatf(buf, "%s%sprov_version: %d.%d\n", prefix, TAB,
 		FI_MAJOR(attr->prov_version), FI_MINOR(attr->prov_version));
+	strcatf(buf, "%s%sapi_version: %d.%d\n", prefix, TAB,
+		FI_MAJOR(attr->api_version), FI_MINOR(attr->api_version));
 }
 
 static void fi_tostr_info(char *buf, const struct fi_info *info)
@@ -608,16 +640,16 @@ __attribute__((visibility ("default")))
 char *DEFAULT_SYMVER_PRE(fi_tostr)(const void *data, enum fi_type datatype)
 {
 	static char *buf = NULL;
-	uint64_t val64;
-	uint32_t val32;
-	int enumval;
+	const uint64_t *val64;
+	const uint32_t *val32;
+	const int *enumval;
 
 	if (!data)
 		return NULL;
 
-	val64 = *(const uint64_t *) data;
-	val32 = *(const uint32_t *) data;
-	enumval = *(const int *) data;
+	val64 = (const uint64_t *) data;
+	val32 = (const uint32_t *) data;
+	enumval = (const int *) data;
 
 	if (!buf) {
 		buf = calloc(FI_BUFSIZ, 1);
@@ -631,16 +663,16 @@ char *DEFAULT_SYMVER_PRE(fi_tostr)(const void *data, enum fi_type datatype)
 		fi_tostr_info(buf, data);
 		break;
 	case FI_TYPE_EP_TYPE:
-		fi_tostr_ep_type(buf, enumval);
+		fi_tostr_ep_type(buf, *enumval);
 		break;
 	case FI_TYPE_CAPS:
-		fi_tostr_caps(buf, val64);
+		fi_tostr_caps(buf, *val64);
 		break;
 	case FI_TYPE_OP_FLAGS:
-		fi_tostr_flags(buf, val64);
+		fi_tostr_flags(buf, *val64);
 		break;
 	case FI_TYPE_ADDR_FORMAT:
-		fi_tostr_addr_format(buf, val32);
+		fi_tostr_addr_format(buf, *val32);
 		break;
 	case FI_TYPE_TX_ATTR:
 		fi_tostr_tx_attr(buf, data, "");
@@ -658,37 +690,44 @@ char *DEFAULT_SYMVER_PRE(fi_tostr)(const void *data, enum fi_type datatype)
 		fi_tostr_fabric_attr(buf, data, "");
 		break;
 	case FI_TYPE_THREADING:
-		fi_tostr_threading(buf, enumval);
+		fi_tostr_threading(buf, *enumval);
 		break;
 	case FI_TYPE_PROGRESS:
-		fi_tostr_progress(buf, enumval);
+		fi_tostr_progress(buf, *enumval);
 		break;
 	case FI_TYPE_PROTOCOL:
-		fi_tostr_protocol(buf, val32);
+		fi_tostr_protocol(buf, *val32);
 		break;
 	case FI_TYPE_MSG_ORDER:
-		fi_tostr_order(buf, val64);
+		fi_tostr_order(buf, *val64);
 		break;
 	case FI_TYPE_MODE:
-		fi_tostr_mode(buf, val64);
+		fi_tostr_mode(buf, *val64);
 		break;
 	case FI_TYPE_AV_TYPE:
-		fi_tostr_av_type(buf, enumval);
+		fi_tostr_av_type(buf, *enumval);
 		break;
 	case FI_TYPE_ATOMIC_TYPE:
-		fi_tostr_atomic_type(buf, enumval);
+		fi_tostr_atomic_type(buf, *enumval);
 		break;
 	case FI_TYPE_ATOMIC_OP:
-		fi_tostr_atomic_op(buf, enumval);
+		fi_tostr_atomic_op(buf, *enumval);
 		break;
 	case FI_TYPE_VERSION:
 		fi_tostr_version(buf);
 		break;
 	case FI_TYPE_EQ_EVENT:
-		fi_tostr_eq_event(buf, enumval);
+		fi_tostr_eq_event(buf, *enumval);
 		break;
 	case FI_TYPE_CQ_EVENT_FLAGS:
-		fi_tostr_cq_event_flags(buf, val64);
+		fi_tostr_cq_event_flags(buf, *val64);
+		break;
+	case FI_TYPE_MR_MODE:
+		/* mr_mode was an enum converted to int flags */
+		fi_tostr_mr_mode(buf, *enumval);
+		break;
+	case FI_TYPE_OP_TYPE:
+		fi_tostr_op_type(buf, *enumval);
 		break;
 	default:
 		strcatf(buf, "Unknown type");
@@ -696,7 +735,7 @@ char *DEFAULT_SYMVER_PRE(fi_tostr)(const void *data, enum fi_type datatype)
 	}
 	return buf;
 }
-DEFAULT_SYMVER(fi_tostr_, fi_tostr);
+DEFAULT_SYMVER(fi_tostr_, fi_tostr, FABRIC_1.0);
 
 #undef CASEENUMSTR
 #undef IFFLAGSTR
diff --git a/src/indexer.c b/src/indexer.c
index 219bd34..479579d 100644
--- a/src/indexer.c
+++ b/src/indexer.c
@@ -52,23 +52,23 @@
  * list without taking a lock during data lookups.
  */
 
-static int idx_grow(struct indexer *idx)
+static int ofi_idx_grow(struct indexer *idx)
 {
-	union idx_entry *entry;
+	union ofi_idx_entry *entry;
 	int i, start_index;
 
-	if (idx->size >= IDX_ARRAY_SIZE)
+	if (idx->size >= OFI_IDX_ARRAY_SIZE)
 		goto nomem;
 
-	idx->array[idx->size] = calloc(IDX_ENTRY_SIZE, sizeof(union idx_entry));
+	idx->array[idx->size] = calloc(OFI_IDX_ENTRY_SIZE, sizeof(union ofi_idx_entry));
 	if (!idx->array[idx->size])
 		goto nomem;
 
 	entry = idx->array[idx->size];
-	start_index = idx->size << IDX_ENTRY_BITS;
-	entry[IDX_ENTRY_SIZE - 1].next = idx->free_list;
+	start_index = idx->size << OFI_IDX_ENTRY_BITS;
+	entry[OFI_IDX_ENTRY_SIZE - 1].next = idx->free_list;
 
-	for (i = IDX_ENTRY_SIZE - 2; i >= 0; i--)
+	for (i = OFI_IDX_ENTRY_SIZE - 2; i >= 0; i--)
 		entry[i].next = start_index + i + 1;
 
 	/* Index 0 is reserved */
@@ -83,43 +83,43 @@ nomem:
 	return -1;
 }
 
-int idx_insert(struct indexer *idx, void *item)
+int ofi_idx_insert(struct indexer *idx, void *item)
 {
-	union idx_entry *entry;
+	union ofi_idx_entry *entry;
 	int index;
 
 	if ((index = idx->free_list) == 0) {
-		if ((index = idx_grow(idx)) <= 0)
+		if ((index = ofi_idx_grow(idx)) <= 0)
 			return index;
 	}
 
-	entry = idx->array[idx_array_index(index)];
-	idx->free_list = entry[idx_entry_index(index)].next;
-	entry[idx_entry_index(index)].item = item;
+	entry = idx->array[ofi_idx_array_index(index)];
+	idx->free_list = entry[ofi_idx_entry_index(index)].next;
+	entry[ofi_idx_entry_index(index)].item = item;
 	return index;
 }
 
-void *idx_remove(struct indexer *idx, int index)
+void *ofi_idx_remove(struct indexer *idx, int index)
 {
-	union idx_entry *entry;
+	union ofi_idx_entry *entry;
 	void *item;
 
-	entry = idx->array[idx_array_index(index)];
-	item = entry[idx_entry_index(index)].item;
-	entry[idx_entry_index(index)].next = idx->free_list;
+	entry = idx->array[ofi_idx_array_index(index)];
+	item = entry[ofi_idx_entry_index(index)].item;
+	entry[ofi_idx_entry_index(index)].next = idx->free_list;
 	idx->free_list = index;
 	return item;
 }
 
-void idx_replace(struct indexer *idx, int index, void *item)
+void ofi_idx_replace(struct indexer *idx, int index, void *item)
 {
-	union idx_entry *entry;
+	union ofi_idx_entry *entry;
 
-	entry = idx->array[idx_array_index(index)];
-	entry[idx_entry_index(index)].item = item;
+	entry = idx->array[ofi_idx_array_index(index)];
+	entry[ofi_idx_entry_index(index)].item = item;
 }
 
-void idx_reset(struct indexer *idx)
+void ofi_idx_reset(struct indexer *idx)
 {
 	while (idx->size) {
 		free(idx->array[idx->size - 1]);
@@ -129,10 +129,10 @@ void idx_reset(struct indexer *idx)
 	idx->free_list = 0;
 }
 
-static int idm_grow(struct index_map *idm, int index)
+static int ofi_idm_grow(struct index_map *idm, int index)
 {
-	idm->array[idx_array_index(index)] = calloc(IDX_ENTRY_SIZE, sizeof(void *));
-	if (!idm->array[idx_array_index(index)])
+	idm->array[ofi_idx_array_index(index)] = calloc(OFI_IDX_ENTRY_SIZE, sizeof(void *));
+	if (!idm->array[ofi_idx_array_index(index)])
 		goto nomem;
 
 	return index;
@@ -142,46 +142,46 @@ nomem:
 	return -1;
 }
 
-int idm_set(struct index_map *idm, int index, void *item)
+int ofi_idm_set(struct index_map *idm, int index, void *item)
 {
 	void **entry;
 
-	if (index > IDX_MAX_INDEX) {
+	if (index > OFI_IDX_MAX_INDEX) {
 		errno = ENOMEM;
 		return -1;
 	}
 
-	if (!idm->array[idx_array_index(index)]) {
-		if (idm_grow(idm, index) < 0)
+	if (!idm->array[ofi_idx_array_index(index)]) {
+		if (ofi_idm_grow(idm, index) < 0)
 			return -1;
 	}
 
-	entry = idm->array[idx_array_index(index)];
-	entry[idx_entry_index(index)] = item;
-	idm->count[idx_array_index(index)]++;
+	entry = idm->array[ofi_idx_array_index(index)];
+	entry[ofi_idx_entry_index(index)] = item;
+	idm->count[ofi_idx_array_index(index)]++;
 	return index;
 }
 
-void *idm_clear(struct index_map *idm, int index)
+void *ofi_idm_clear(struct index_map *idm, int index)
 {
 	void **entry;
 	void *item;
 
-	entry = idm->array[idx_array_index(index)];
-	item = entry[idx_entry_index(index)];
-	entry[idx_entry_index(index)] = NULL;
-	if (--idm->count[idx_array_index(index)] == 0) {
-		free(idm->array[idx_array_index(index)]);
-		idm->array[idx_array_index(index)] = NULL;
+	entry = idm->array[ofi_idx_array_index(index)];
+	item = entry[ofi_idx_entry_index(index)];
+	entry[ofi_idx_entry_index(index)] = NULL;
+	if (--idm->count[ofi_idx_array_index(index)] == 0) {
+		free(idm->array[ofi_idx_array_index(index)]);
+		idm->array[ofi_idx_array_index(index)] = NULL;
 	}
 	return item;
 }
 
-void idm_reset(struct index_map *idm)
+void ofi_idm_reset(struct index_map *idm)
 {
 	int i;
 
-	for (i=0; i<IDX_ARRAY_SIZE; i++) {
+	for (i=0; i<OFI_IDX_ARRAY_SIZE; i++) {
 		if (idm->array[i]) {
 			free(idm->array[i]);
 			idm->array[i] = NULL;
diff --git a/src/osx/osd.c b/src/iov.c
similarity index 64%
rename from src/osx/osd.c
rename to src/iov.c
index ef3925b..fa433b8 100644
--- a/src/osx/osd.c
+++ b/src/iov.c
@@ -1,6 +1,5 @@
 /*
- * Copyright (c) 2016, Cisco Systems, Inc. All rights reserved.
- * Copyright (c) 2015 Los Alamos Nat. Security, LLC. All rights reserved.
+ * Copyright (c) 2016 Intel Corp., Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -31,26 +30,41 @@
  * SOFTWARE.
  */
 
-#include "osx/osd.h"
 #include "config.h"
 
-/* Define clock_gettime if it is not already defined. As of macOS Sierra, it is
- * available in libc.
- */
-#if !HAVE_CLOCK_GETTIME
-int clock_gettime(clockid_t clk_id, struct timespec *tp) {
-	int retval;
+#include <string.h>
+
+#include <fi.h>
+#include <fi_iov.h>
+
+uint64_t ofi_copy_iov_buf(const struct iovec *iov, size_t iov_count,
+			uint64_t iov_offset, void *buf, uint64_t bufsize,
+			int dir)
+{
+	uint64_t done = 0, len;
+	char *iov_buf;
+	size_t i;
+
+	for (i = 0; i < iov_count && bufsize; i++) {
+		len = iov[i].iov_len;
 
-	clock_serv_t cclock;
-	mach_timespec_t mts;
+		if (iov_offset > len) {
+			iov_offset -= len;
+			continue;
+		}
 
-	host_get_clock_service(mach_host_self(), clk_id, &cclock);
-	retval = clock_get_time(cclock, &mts);
-	mach_port_deallocate(mach_task_self(), cclock);
+		iov_buf = (char *)iov[i].iov_base + iov_offset;
+		len -= iov_offset;
 
-	tp->tv_sec = mts.tv_sec;
-	tp->tv_nsec = mts.tv_nsec;
+		len = MIN(len, bufsize);
+		if (dir == OFI_COPY_BUF_TO_IOV)
+			memcpy(iov_buf, (char *) buf + done, len);
+		else if (dir == OFI_COPY_IOV_TO_BUF)
+			memcpy((char *) buf + done, iov_buf, len);
 
-	return retval;
+		iov_offset = 0;
+		bufsize -= len;
+		done += len;
+	}
+	return done;
 }
-#endif
diff --git a/src/log.c b/src/log.c
index 20741e4..659bec2 100644
--- a/src/log.c
+++ b/src/log.c
@@ -40,6 +40,7 @@
 
 #include "fi.h"
 
+
 static const char * const log_subsys[] = {
 	[FI_LOG_CORE] = "core",
 	[FI_LOG_FABRIC] = "fabric",
@@ -50,6 +51,7 @@ static const char * const log_subsys[] = {
 	[FI_LOG_CQ] = "cq",
 	[FI_LOG_EQ] = "eq",
 	[FI_LOG_MR] = "mr",
+	[FI_LOG_CNTR] = "cntr",
 	[FI_LOG_SUBSYS_MAX] = NULL
 };
 
@@ -79,6 +81,7 @@ enum {
 uint64_t log_mask;
 struct fi_filter prov_log_filter;
 
+
 static int fi_convert_log_str(const char *value)
 {
 	int i;
@@ -109,27 +112,28 @@ void fi_log_init(void)
 	fi_param_define(NULL, "log_prov", FI_PARAM_STRING,
 			"Specify specific provider to log (default: all)");
 	fi_param_get_str(NULL, "log_prov", &provstr);
-	fi_create_filter(&prov_log_filter, provstr);
+	ofi_create_filter(&prov_log_filter, provstr);
 
 	fi_param_define(NULL, "log_subsys", FI_PARAM_STRING,
 			"Specify specific subsystem to log (default: all)");
 	fi_param_get_str(NULL, "log_subsys", &subsysstr);
-	fi_create_filter(&subsys_filter, subsysstr);
+	ofi_create_filter(&subsys_filter, subsysstr);
 	for (i = 0; i < FI_LOG_SUBSYS_MAX; i++) {
-		if (!fi_apply_filter(&subsys_filter, log_subsys[i]))
+		if (!ofi_apply_filter(&subsys_filter, log_subsys[i]))
 			log_mask |= (1 << (i + FI_LOG_SUBSYS_OFFSET));
 	}
-	fi_free_filter(&subsys_filter);
+	ofi_free_filter(&subsys_filter);
 }
 
 void fi_log_fini(void)
 {
-	fi_free_filter(&prov_log_filter);
+	ofi_free_filter(&prov_log_filter);
 }
 
 __attribute__((visibility ("default")))
-int DEFAULT_SYMVER_PRE(fi_log_enabled)(const struct fi_provider *prov, enum fi_log_level level,
-		   enum fi_log_subsys subsys)
+int DEFAULT_SYMVER_PRE(fi_log_enabled)(const struct fi_provider *prov,
+		enum fi_log_level level,
+		enum fi_log_subsys subsys)
 {
 	struct fi_prov_context *ctx;
 
@@ -137,12 +141,12 @@ int DEFAULT_SYMVER_PRE(fi_log_enabled)(const struct fi_provider *prov, enum fi_l
 	return ((FI_LOG_TAG(ctx->disable_logging, level, subsys) & log_mask) ==
 		FI_LOG_TAG(ctx->disable_logging, level, subsys));
 }
-DEFAULT_SYMVER(fi_log_enabled_, fi_log_enabled);
+DEFAULT_SYMVER(fi_log_enabled_, fi_log_enabled, FABRIC_1.0);
 
 __attribute__((visibility ("default")))
 void DEFAULT_SYMVER_PRE(fi_log)(const struct fi_provider *prov, enum fi_log_level level,
-	    enum fi_log_subsys subsys, const char *func, int line,
-	    const char *fmt, ...)
+		enum fi_log_subsys subsys, const char *func, int line,
+		const char *fmt, ...)
 {
 	char buf[1024];
 	int size;
@@ -159,4 +163,4 @@ void DEFAULT_SYMVER_PRE(fi_log)(const struct fi_provider *prov, enum fi_log_leve
 
 	fprintf(stderr, "%s", buf);
 }
-DEFAULT_SYMVER(fi_log_, fi_log);
+DEFAULT_SYMVER(fi_log_, fi_log, FABRIC_1.0);
diff --git a/src/unix/osd.c b/src/unix/osd.c
index 6a4971c..42684eb 100644
--- a/src/unix/osd.c
+++ b/src/unix/osd.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2013-2016 Intel Corporation. All rights reserved.
+ * Copyright (c) 2016 Cisco Systems, Inc.  All rights reserved.
  *
  * This software is available to you under a choice of one of two
  * licenses.  You may choose to be licensed under the terms of the GNU
@@ -42,6 +43,7 @@
 #include <string.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
+#include <sys/time.h>
 
 #include "fi.h"
 #include "fi_osd.h"
@@ -65,16 +67,17 @@ int fi_fd_nonblock(int fd)
 	return 0;
 }
 
-int fi_wait_cond(pthread_cond_t *cond, pthread_mutex_t *mut, int timeout)
+int fi_wait_cond(pthread_cond_t *cond, pthread_mutex_t *mut, int timeout_ms)
 {
+	uint64_t t;
 	struct timespec ts;
 
-	if (timeout < 0)
+	if (timeout_ms < 0)
 		return pthread_cond_wait(cond, mut);
 
-	clock_gettime(CLOCK_REALTIME, &ts);
-	ts.tv_sec += timeout / 1000;
-	ts.tv_nsec += (timeout % 1000) * 1000000;
+	t = fi_gettime_ms() + timeout_ms;
+	ts.tv_sec = t / 1000;
+	ts.tv_nsec = (t % 1000) * 1000000;
 	return pthread_cond_timedwait(cond, mut, &ts);
 }
 
diff --git a/src/var.c b/src/var.c
index 2b27f03..44e1337 100644
--- a/src/var.c
+++ b/src/var.c
@@ -123,19 +123,20 @@ out:
 	*params = vhead;
 	return FI_SUCCESS;
 }
-DEFAULT_SYMVER(fi_getparams_, fi_getparams);
+DEFAULT_SYMVER(fi_getparams_, fi_getparams, FABRIC_1.0);
 
 __attribute__((visibility ("default")))
 void DEFAULT_SYMVER_PRE(fi_freeparams)(struct fi_param *params)
 {
-	for (int i = 0; params[i].name; ++i) {
+	int i;
+	for (i = 0; params[i].name; ++i) {
 		free((void*) params[i].name);
 		free((void*) params[i].help_string);
 		free((void*) params[i].value);
 	}
 	free(params);
 }
-DEFAULT_SYMVER(fi_freeparams_, fi_freeparams);
+DEFAULT_SYMVER(fi_freeparams_, fi_freeparams, FABRIC_1.0);
 
 static void fi_free_param(struct fi_param_entry *param)
 {
@@ -221,7 +222,7 @@ int DEFAULT_SYMVER_PRE(fi_param_define)(const struct fi_provider *provider,
 	FI_INFO(provider, FI_LOG_CORE, "registered var %s\n", param_name);
 	return FI_SUCCESS;
 }
-DEFAULT_SYMVER(fi_param_define_, fi_param_define);
+DEFAULT_SYMVER(fi_param_define_, fi_param_define, FABRIC_1.0);
 
 static int fi_parse_bool(const char *str_value)
 {
@@ -296,7 +297,7 @@ int DEFAULT_SYMVER_PRE(fi_param_get)(struct fi_provider *provider,
 out:
 	return ret;
 }
-DEFAULT_SYMVER(fi_param_get_, fi_param_get);
+DEFAULT_SYMVER(fi_param_get_, fi_param_get, FABRIC_1.0);
 
 
 void fi_param_init(void)
diff --git a/util/info.c b/util/info.c
index 65846b0..4ea2876 100644
--- a/util/info.c
+++ b/util/info.c
@@ -34,6 +34,8 @@
 #include <string.h>
 #include <getopt.h>
 
+#include <fi_osd.h>
+
 #include <rdma/fabric.h>
 #include <rdma/fi_errno.h>
 
@@ -112,6 +114,7 @@ static int str2cap(char *inputstr, uint64_t *value)
 	ORCASE(FI_RMA);
 	ORCASE(FI_TAGGED);
 	ORCASE(FI_ATOMIC);
+	ORCASE(FI_MULTICAST);
 
 	ORCASE(FI_READ);
 	ORCASE(FI_WRITE);
@@ -127,15 +130,13 @@ static int str2cap(char *inputstr, uint64_t *value)
 	ORCASE(FI_TRIGGER);
 	ORCASE(FI_FENCE);
 
-	ORCASE(FI_EVENT);
-	ORCASE(FI_INJECT);
-	ORCASE(FI_INJECT_COMPLETE);
-	ORCASE(FI_TRANSMIT_COMPLETE);
-	ORCASE(FI_DELIVERY_COMPLETE);
-
+	ORCASE(FI_SOURCE_ERR);
+	ORCASE(FI_LOCAL_COMM);
+	ORCASE(FI_REMOTE_COMM);
+	ORCASE(FI_SHARED_AV);
 	ORCASE(FI_RMA_EVENT);
-	ORCASE(FI_NAMED_RX_CTX);
 	ORCASE(FI_SOURCE);
+	ORCASE(FI_NAMED_RX_CTX);
 	ORCASE(FI_DIRECTED_RECV);
 
 	fprintf(stderr, "error: Unrecognized capability: %s\n", inputstr);
@@ -146,10 +147,13 @@ static int str2cap(char *inputstr, uint64_t *value)
 static int str2mode(char *inputstr, uint64_t *value)
 {
 	ORCASE(FI_CONTEXT);
-	ORCASE(FI_LOCAL_MR);
 	ORCASE(FI_MSG_PREFIX);
 	ORCASE(FI_ASYNC_IOV);
 	ORCASE(FI_RX_CQ_DATA);
+	ORCASE(FI_LOCAL_MR);
+	ORCASE(FI_NOTIFY_FLAGS_ONLY);
+	ORCASE(FI_RESTRICTED_COMP);
+	ORCASE(FI_CONTEXT2);
 
 	fprintf(stderr, "error: Unrecognized mode: %s\n", inputstr);
 
@@ -162,6 +166,8 @@ static int str2ep_type(char *inputstr, enum fi_ep_type *value)
 	ORCASE(FI_EP_MSG);
 	ORCASE(FI_EP_DGRAM);
 	ORCASE(FI_EP_RDM);
+	ORCASE(FI_EP_SOCK_STREAM);
+	ORCASE(FI_EP_SOCK_DGRAM);
 
 	fprintf(stderr, "error: Unrecognized endpoint type: %s\n", inputstr);
 
@@ -176,6 +182,11 @@ static int str2addr_format(char *inputstr, uint32_t *value)
 	ORCASE(FI_SOCKADDR_IN6);
 	ORCASE(FI_SOCKADDR_IB);
 	ORCASE(FI_ADDR_PSMX);
+	ORCASE(FI_ADDR_GNI);
+	ORCASE(FI_ADDR_BGQ);
+	ORCASE(FI_ADDR_MLX);
+	ORCASE(FI_ADDR_STR);
+	ORCASE(FI_ADDR_PSMX2);
 
 	fprintf(stderr, "error: Unrecognized address format: %s\n", inputstr);
 
@@ -217,7 +228,7 @@ static const char *param_type(enum fi_param_type type)
 
 static int print_vars(void)
 {
-	int ret, count;
+	int ret, count, i;
 	struct fi_param *params;
 	char delim;
 
@@ -225,7 +236,7 @@ static int print_vars(void)
 	if (ret)
 		return ret;
 
-	for (int i = 0; i < count; ++i) {
+	for (i = 0; i < count; ++i) {
 		printf("# %s: %s\n", params[i].name, param_type(params[i].type));
 		printf("# %s\n", params[i].help_string);
 
@@ -244,7 +255,8 @@ static int print_vars(void)
 
 static int print_providers(struct fi_info *info)
 {
-	for (struct fi_info *cur = info; cur; cur = cur->next) {
+	struct fi_info *cur;
+	for (cur = info; cur; cur = cur->next) {
 		printf("%s:\n", cur->fabric_attr->prov_name);
 		printf("    version: %d.%d\n",
 			FI_MAJOR(cur->fabric_attr->prov_version),
@@ -255,7 +267,8 @@ static int print_providers(struct fi_info *info)
 
 static int print_short_info(struct fi_info *info)
 {
-	for (struct fi_info *cur = info; cur; cur = cur->next) {
+	struct fi_info *cur;
+	for (cur = info; cur; cur = cur->next) {
 		printf("provider: %s\n", cur->fabric_attr->prov_name);
 		printf("    fabric: %s\n", cur->fabric_attr->name),
 		printf("    domain: %s\n", cur->domain_attr->name),
@@ -271,7 +284,8 @@ static int print_short_info(struct fi_info *info)
 
 static int print_long_info(struct fi_info *info)
 {
-	for (struct fi_info *cur = info; cur; cur = cur->next) {
+	struct fi_info *cur;
+	for (cur = info; cur; cur = cur->next) {
 		printf("---\n");
 		printf("%s", fi_tostr(cur, FI_TYPE_INFO));
 	}
@@ -313,6 +327,8 @@ int main(int argc, char **argv)
 		return EXIT_FAILURE;
 
 	hints->mode = ~0;
+	hints->domain_attr->mode = ~0;
+	hints->domain_attr->mr_mode = ~(FI_MR_BASIC | FI_MR_SCALABLE);
 
 	while ((op = getopt_long(argc, argv, "n:P:c:m:t:a:p:d:f:elhv", longopts,
 				 &option_index)) != -1) {
diff --git a/util/pingpong.c b/util/pingpong.c
index 25bee15..e45df08 100644
--- a/util/pingpong.c
+++ b/util/pingpong.c
@@ -52,23 +52,25 @@
 #include <sys/wait.h>
 #include <sys/time.h>
 
+#include <fi_osd.h>
 #include <rdma/fabric.h>
 #include <rdma/fi_cm.h>
 #include <rdma/fi_domain.h>
 #include <rdma/fi_endpoint.h>
 #include <rdma/fi_eq.h>
 #include <rdma/fi_errno.h>
+#include <rdma/fi_tagged.h>
 
-#ifndef PP_FIVERSION
-#define PP_FIVERSION FI_VERSION(1, 4)
+#ifndef OFI_MR_BASIC_MAP
+#define OFI_MR_BASIC_MAP (FI_MR_ALLOCATED | FI_MR_PROV_KEY | FI_MR_VIRT_ADDR)
 #endif
 
-#ifdef __APPLE__
-#include "osx/osd.h"
-#elif defined __FreeBSD__
-#include "freebsd/osd.h"
+#ifndef PP_FIVERSION
+#define PP_FIVERSION FI_VERSION(1, 5)
 #endif
 
+static const uint64_t TAG = 1234;
+
 enum precision {
 	NANO = 1,
 	MICRO = 1000,
@@ -181,8 +183,8 @@ struct ct_pingpong {
 	void *buf, *tx_buf, *rx_buf;
 	size_t buf_size, tx_size, rx_size;
 
-	int timeout;
-	struct timespec start, end;
+	int timeout_sec;
+	uint64_t start, end;
 
 	struct fi_av_attr av_attr;
 	struct fi_eq_attr eq_attr;
@@ -191,7 +193,7 @@ struct ct_pingpong {
 
 	long cnt_ack_msg;
 
-	int ctrl_connfd;
+	SOCKET ctrl_connfd;
 	char ctrl_buf[PP_CTRL_BUF_LEN + 1];
 	char rem_name[PP_MAX_CTRL_MSG];
 };
@@ -203,26 +205,16 @@ static const int integ_alphabet_length =
 	(sizeof(integ_alphabet) / sizeof(*integ_alphabet)) - 1;
 
 /*******************************************************************************
- *                                  Compatibility methods
+ *                                         Utils
  ******************************************************************************/
-#if defined(__APPLE__) && !HAVE_CLOCK_GETTIME
-int clock_gettime(clockid_t clk_id, struct timespec *tp)
-{
-	int retval;
-	struct timeval tv;
 
-	retval = gettimeofday(&tv, NULL);
-
-	tp->tv_sec = tv.tv_sec;
-	tp->tv_nsec = tv.tv_usec * 1000;
+uint64_t pp_gettime_us(void)
+{
+	struct timeval now;
 
-	return retval;
+	gettimeofday(&now, NULL);
+	return now.tv_sec * 1000000 + now.tv_usec;
 }
-#endif
-
-/*******************************************************************************
- *                                         Utils
- ******************************************************************************/
 
 long parse_ulong(char *str, long max)
 {
@@ -305,6 +297,9 @@ void pp_banner_options(struct ct_pingpong *ct)
 	else if (opts.options & PP_OPT_SIZE)
 		snprintf(size_msg, 50, "selected size = %d",
 			 opts.transfer_size);
+	else
+		snprintf(size_msg, 50, "default size = %d",
+			 opts.transfer_size);
 
 	if (opts.options & PP_OPT_ITER)
 		snprintf(iter_msg, 50, "selected iterations: %d",
@@ -379,10 +374,10 @@ static int pp_ctrl_init_client(struct ct_pingpong *ct)
 	}
 
 	for (rp = results; rp; rp = rp->ai_next) {
-		ct->ctrl_connfd = socket(rp->ai_family, rp->ai_socktype,
-					 rp->ai_protocol);
-		if (ct->ctrl_connfd == -1) {
-			errno_save = errno;
+		ct->ctrl_connfd = ofi_socket(rp->ai_family, rp->ai_socktype,
+					     rp->ai_protocol);
+		if (ct->ctrl_connfd == INVALID_SOCKET) {
+			errno_save = ofi_sockerr();
 			continue;
 		}
 
@@ -395,8 +390,8 @@ static int pp_ctrl_init_client(struct ct_pingpong *ct)
 			    bind(ct->ctrl_connfd, (struct sockaddr *)&in_addr,
 				 sizeof(in_addr));
 			if (ret == -1) {
-				errno_save = errno;
-				close(ct->ctrl_connfd);
+				errno_save = ofi_sockerr();
+				ofi_close_socket(ct->ctrl_connfd);
 				continue;
 			}
 		}
@@ -405,8 +400,8 @@ static int pp_ctrl_init_client(struct ct_pingpong *ct)
 		if (ret != -1)
 			break;
 
-		errno_save = errno;
-		close(ct->ctrl_connfd);
+		errno_save = ofi_sockerr();
+		ofi_close_socket(ct->ctrl_connfd);
 	}
 
 	if (!rp || ret == -1) {
@@ -426,20 +421,20 @@ static int pp_ctrl_init_server(struct ct_pingpong *ct)
 {
 	struct sockaddr_in ctrl_addr = {0};
 	int optval = 1;
-	int listenfd;
+	SOCKET listenfd;
 	int ret;
 
-	listenfd = socket(AF_INET, SOCK_STREAM, 0);
-	if (listenfd == -1) {
-		ret = -errno;
+	listenfd = ofi_socket(AF_INET, SOCK_STREAM, 0);
+	if (listenfd == INVALID_SOCKET) {
+		ret = -ofi_sockerr();
 		PP_PRINTERR("socket", ret);
 		return ret;
 	}
 
 	ret = setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR,
-			&optval, sizeof(optval));
+			 (const char *)&optval, sizeof(optval));
 	if (ret == -1) {
-		ret = -errno;
+		ret = -ofi_sockerr();
 		PP_PRINTERR("setsockopt(SO_REUSEADDR)", ret);
 		goto fail_close_socket;
 	}
@@ -451,14 +446,14 @@ static int pp_ctrl_init_server(struct ct_pingpong *ct)
 	ret = bind(listenfd, (struct sockaddr *)&ctrl_addr,
 		   sizeof(ctrl_addr));
 	if (ret == -1) {
-		ret = -errno;
+		ret = -ofi_sockerr();
 		PP_PRINTERR("bind", ret);
 		goto fail_close_socket;
 	}
 
 	ret = listen(listenfd, 10);
 	if (ret == -1) {
-		ret = -errno;
+		ret = -ofi_sockerr();
 		PP_PRINTERR("listen", ret);
 		goto fail_close_socket;
 	}
@@ -467,12 +462,12 @@ static int pp_ctrl_init_server(struct ct_pingpong *ct)
 
 	ct->ctrl_connfd = accept(listenfd, NULL, NULL);
 	if (ct->ctrl_connfd == -1) {
-		ret = -errno;
+		ret = -ofi_sockerr();
 		PP_PRINTERR("accept", ret);
 		goto fail_close_socket;
 	}
 
-	close(listenfd);
+	ofi_close_socket(listenfd);
 
 	PP_DEBUG("SERVER: connected\n");
 
@@ -480,12 +475,12 @@ static int pp_ctrl_init_server(struct ct_pingpong *ct)
 
 fail_close_socket:
 	if (ct->ctrl_connfd != -1) {
-		close(ct->ctrl_connfd);
+		ofi_close_socket(ct->ctrl_connfd);
 		ct->ctrl_connfd = -1;
 	}
 
 	if (listenfd != -1)
-		close(listenfd);
+		ofi_close_socket(listenfd);
 
 	return ret;
 }
@@ -513,10 +508,10 @@ int pp_ctrl_init(struct ct_pingpong *ct)
 	if (ret)
 		return ret;
 
-	ret = setsockopt(ct->ctrl_connfd, SOL_SOCKET, SO_RCVTIMEO, &tv,
-			 sizeof(struct timeval));
+	ret = setsockopt(ct->ctrl_connfd, SOL_SOCKET, SO_RCVTIMEO,
+			 (const char *)&tv, sizeof(struct timeval));
 	if (ret == -1) {
-		ret = -errno;
+		ret = -ofi_sockerr();
 		PP_PRINTERR("setsockopt(SO_RCVTIMEO)", ret);
 		return ret;
 	}
@@ -530,9 +525,9 @@ int pp_ctrl_send(struct ct_pingpong *ct, char *buf, size_t size)
 {
 	int ret, err;
 
-	ret = send(ct->ctrl_connfd, buf, size, 0);
+	ret = ofi_send_socket(ct->ctrl_connfd, buf, size, 0);
 	if (ret < 0) {
-		err = -errno;
+		err = -ofi_sockerr();
 		PP_PRINTERR("ctrl/send", err);
 		return err;
 	}
@@ -551,10 +546,10 @@ int pp_ctrl_recv(struct ct_pingpong *ct, char *buf, size_t size)
 
 	do {
 		PP_DEBUG("receiving\n");
-		ret = recv(ct->ctrl_connfd, buf, size, 0);
-	} while (ret == -1 && errno == EAGAIN);
+		ret = ofi_read_socket(ct->ctrl_connfd, buf, size);
+	} while (ret == -1 && OFI_SOCK_TRY_RCV_AGAIN(ofi_sockerr()));
 	if (ret < 0) {
-		err = -errno;
+		err = -ofi_sockerr();
 		PP_PRINTERR("ctrl/read", err);
 		return err;
 	}
@@ -640,7 +635,7 @@ int pp_recv_name(struct ct_pingpong *ct)
 int pp_ctrl_finish(struct ct_pingpong *ct)
 {
 	if (ct->ctrl_connfd != -1) {
-		close(ct->ctrl_connfd);
+		ofi_close_socket(ct->ctrl_connfd);
 		ct->ctrl_connfd = -1;
 	}
 
@@ -804,12 +799,12 @@ static inline void pp_start(struct ct_pingpong *ct)
 {
 	PP_DEBUG("Starting test chrono\n");
 	ct->opts.options |= PP_OPT_ACTIVE;
-	clock_gettime(CLOCK_MONOTONIC, &(ct->start));
+	ct->start = pp_gettime_us();
 }
 
 static inline void pp_stop(struct ct_pingpong *ct)
 {
-	clock_gettime(CLOCK_MONOTONIC, &(ct->end));
+	ct->end = pp_gettime_us();
 	ct->opts.options &= ~PP_OPT_ACTIVE;
 	PP_DEBUG("Stopped test chrono\n");
 }
@@ -1015,22 +1010,12 @@ char *cnt_str(char *str, size_t size, uint64_t cnt)
 	return str;
 }
 
-int64_t get_elapsed(const struct timespec *b, const struct timespec *a,
-		    enum precision p)
-{
-	int64_t elapsed;
-
-	elapsed = difftime(a->tv_sec, b->tv_sec) * 1000 * 1000 * 1000;
-	elapsed += a->tv_nsec - b->tv_nsec;
-	return elapsed / p;
-}
-
 void show_perf(char *name, int tsize, int sent, int acked,
-	       struct timespec *start, struct timespec *end, int xfers_per_iter)
+	       uint64_t start, uint64_t end, int xfers_per_iter)
 {
 	static int header = 1;
 	char str[PP_STR_LEN];
-	int64_t elapsed = get_elapsed(start, end, MICRO);
+	int64_t elapsed = end - start;
 	uint64_t bytes = (uint64_t)sent * tsize * xfers_per_iter;
 	float usec_per_xfer;
 
@@ -1094,20 +1079,20 @@ int pp_cq_readerr(struct fid_cq *cq)
 }
 
 static int pp_get_cq_comp(struct fid_cq *cq, uint64_t *cur, uint64_t total,
-			  int timeout)
+			  int timeout_sec)
 {
 	struct fi_cq_err_entry comp;
-	struct timespec a = {0}, b = {0};
+	uint64_t a = 0, b = 0;
 	int ret = 0;
 
-	if (timeout >= 0)
-		clock_gettime(CLOCK_MONOTONIC, &a);
+	if (timeout_sec >= 0)
+		a = pp_gettime_us();
 
 	while (total - *cur > 0) {
 		ret = fi_cq_read(cq, &comp, 1);
 		if (ret > 0) {
-			if (timeout >= 0)
-				clock_gettime(CLOCK_MONOTONIC, &a);
+			if (timeout_sec >= 0)
+				a = pp_gettime_us();
 
 			(*cur)++;
 		} else if (ret < 0 && ret != -FI_EAGAIN) {
@@ -1119,11 +1104,11 @@ static int pp_get_cq_comp(struct fid_cq *cq, uint64_t *cur, uint64_t total,
 			}
 
 			return ret;
-		} else if (timeout >= 0) {
-			clock_gettime(CLOCK_MONOTONIC, &b);
-			if ((b.tv_sec - a.tv_sec) > timeout) {
+		} else if (timeout_sec >= 0) {
+			b = pp_gettime_us();
+			if ((b - a) / 1000000 > timeout_sec) {
 				fprintf(stderr, "%ds timeout expired\n",
-					timeout);
+					timeout_sec);
 				return -FI_ENODATA;
 			}
 		}
@@ -1138,7 +1123,7 @@ int pp_get_rx_comp(struct ct_pingpong *ct, uint64_t total)
 
 	if (ct->rxcq) {
 		ret = pp_get_cq_comp(ct->rxcq, &(ct->rx_cq_cntr), total,
-				     ct->timeout);
+				     ct->timeout_sec);
 	} else {
 		PP_ERR(
 		    "Trying to get a RX completion when no RX CQ was opened");
@@ -1163,7 +1148,7 @@ int pp_get_tx_comp(struct ct_pingpong *ct, uint64_t total)
 
 #define PP_POST(post_fn, comp_fn, seq, op_str, ...)                            \
 	do {                                                                   \
-		int timeout_save;                                              \
+		int timeout_sec_save;                                          \
 		int ret, rc;                                                   \
 									       \
 		while (1) {                                                    \
@@ -1176,10 +1161,10 @@ int pp_get_tx_comp(struct ct_pingpong *ct, uint64_t total)
 				return ret;                                    \
 			}                                                      \
 									       \
-			timeout_save = ct->timeout;                            \
-			ct->timeout = 0;                                       \
+			timeout_sec_save = ct->timeout_sec;                    \
+			ct->timeout_sec = 0;                                   \
 			rc = comp_fn(ct, seq);                                 \
-			ct->timeout = timeout_save;                            \
+			ct->timeout_sec = timeout_sec_save;                    \
 			if (rc && rc != -FI_EAGAIN) {                          \
 				PP_ERR("Failed to get " op_str " completion"); \
 				return rc;                                     \
@@ -1191,8 +1176,14 @@ int pp_get_tx_comp(struct ct_pingpong *ct, uint64_t total)
 ssize_t pp_post_tx(struct ct_pingpong *ct, struct fid_ep *ep, size_t size,
 		   struct fi_context *ctx)
 {
-	PP_POST(fi_send, pp_get_tx_comp, ct->tx_seq, "transmit", ep, ct->tx_buf,
-		size, fi_mr_desc(ct->mr), ct->remote_fi_addr, ctx);
+	if (!(ct->fi->caps & FI_TAGGED))
+		PP_POST(fi_send, pp_get_tx_comp, ct->tx_seq, "transmit", ep,
+			ct->tx_buf, size, fi_mr_desc(ct->mr),
+			ct->remote_fi_addr, ctx);
+	else
+		PP_POST(fi_tsend, pp_get_tx_comp, ct->tx_seq, "t-transmit", ep,
+			ct->tx_buf, size, fi_mr_desc(ct->mr),
+			ct->remote_fi_addr, TAG, ctx);
 	return 0;
 }
 
@@ -1214,8 +1205,12 @@ ssize_t pp_tx(struct ct_pingpong *ct, struct fid_ep *ep, size_t size)
 
 ssize_t pp_post_inject(struct ct_pingpong *ct, struct fid_ep *ep, size_t size)
 {
-	PP_POST(fi_inject, pp_get_tx_comp, ct->tx_seq, "inject", ep, ct->tx_buf,
-		size, ct->remote_fi_addr);
+	if (!(ct->fi->caps & FI_TAGGED))
+		PP_POST(fi_inject, pp_get_tx_comp, ct->tx_seq, "inject", ep,
+			ct->tx_buf, size, ct->remote_fi_addr);
+	else
+		PP_POST(fi_tinject, pp_get_tx_comp, ct->tx_seq, "tinject", ep,
+			ct->tx_buf, size, ct->remote_fi_addr, TAG);
 	ct->tx_cq_cntr++;
 	return 0;
 }
@@ -1237,8 +1232,14 @@ ssize_t pp_inject(struct ct_pingpong *ct, struct fid_ep *ep, size_t size)
 ssize_t pp_post_rx(struct ct_pingpong *ct, struct fid_ep *ep, size_t size,
 		   struct fi_context *ctx)
 {
-	PP_POST(fi_recv, pp_get_rx_comp, ct->rx_seq, "receive", ep, ct->rx_buf,
-		MAX(size, PP_MAX_CTRL_MSG), fi_mr_desc(ct->mr), 0, ctx);
+	if (!(ct->fi->caps & FI_TAGGED))
+		PP_POST(fi_recv, pp_get_rx_comp, ct->rx_seq, "receive", ep,
+			ct->rx_buf, MAX(size, PP_MAX_CTRL_MSG),
+			fi_mr_desc(ct->mr), 0, ctx);
+	else
+		PP_POST(fi_trecv, pp_get_rx_comp, ct->rx_seq, "t-receive", ep,
+			ct->rx_buf, MAX(size, PP_MAX_CTRL_MSG),
+			fi_mr_desc(ct->mr), 0, TAG, 0, ctx);
 	return 0;
 }
 
@@ -1307,18 +1308,18 @@ int pp_alloc_msgs(struct ct_pingpong *ct)
 	ct->buf_size = MAX(ct->tx_size, PP_MAX_CTRL_MSG) +
 		       MAX(ct->rx_size, PP_MAX_CTRL_MSG);
 
-	alignment = sysconf(_SC_PAGESIZE);
+	alignment = ofi_sysconf(_SC_PAGESIZE);
 	if (alignment < 0) {
-		ret = -errno;
-		PP_PRINTERR("sysconf", ret);
+		ret = -ofi_sockerr();
+		PP_PRINTERR("ofi_sysconf", ret);
 		return ret;
 	}
 	/* Extra alignment for the second part of the buffer */
 	ct->buf_size += alignment;
 
-	ret = posix_memalign(&(ct->buf), (size_t)alignment, ct->buf_size);
+	ret = ofi_memalign(&(ct->buf), (size_t)alignment, ct->buf_size);
 	if (ret) {
-		PP_PRINTERR("posix_memalign", ret);
+		PP_PRINTERR("ofi_memalign", ret);
 		return ret;
 	}
 	memset(ct->buf, 0, ct->buf_size);
@@ -1329,7 +1330,7 @@ int pp_alloc_msgs(struct ct_pingpong *ct)
 
 	ct->remote_cq_data = pp_init_cq_data(ct->fi);
 
-	if (ct->fi->mode & FI_LOCAL_MR) {
+	if (ct->fi->domain_attr->mr_mode & FI_MR_LOCAL) {
 		ret = fi_mr_reg(ct->domain, ct->buf, ct->buf_size,
 				FI_SEND | FI_RECV, 0, PP_MR_KEY, 0, &(ct->mr),
 				NULL);
@@ -1805,7 +1806,7 @@ void pp_free_res(struct ct_pingpong *ct)
 	PP_CLOSE_FID(ct->fabric);
 
 	if (ct->buf) {
-		free(ct->buf);
+		ofi_freealign(ct->buf);
 		ct->buf = ct->rx_buf = ct->tx_buf = NULL;
 		ct->buf_size = ct->rx_size = ct->tx_size = 0;
 	}
@@ -1831,6 +1832,7 @@ int pp_finalize(struct ct_pingpong *ct)
 	int ret;
 	struct fi_context ctx;
 	struct fi_msg msg;
+	struct fi_msg_tagged tmsg;
 
 	PP_DEBUG("Terminating test\n");
 
@@ -1838,16 +1840,31 @@ int pp_finalize(struct ct_pingpong *ct)
 	iov.iov_base = ct->tx_buf;
 	iov.iov_len = 4;
 
-	memset(&msg, 0, sizeof(msg));
-	msg.msg_iov = &iov;
-	msg.iov_count = 1;
-	msg.addr = ct->remote_fi_addr;
-	msg.context = &ctx;
+	if (!(ct->fi->caps & FI_TAGGED)) {
+		memset(&msg, 0, sizeof(msg));
+		msg.msg_iov = &iov;
+		msg.iov_count = 1;
+		msg.addr = ct->remote_fi_addr;
+		msg.context = &ctx;
 
-	ret = fi_sendmsg(ct->ep, &msg, FI_INJECT | FI_TRANSMIT_COMPLETE);
-	if (ret) {
-		PP_PRINTERR("transmit", ret);
-		return ret;
+		ret = fi_sendmsg(ct->ep, &msg, FI_INJECT | FI_TRANSMIT_COMPLETE);
+		if (ret) {
+			PP_PRINTERR("transmit", ret);
+			return ret;
+		}
+	} else {
+		memset(&tmsg, 0, sizeof(tmsg));
+		tmsg.msg_iov = &iov;
+		tmsg.iov_count = 1;
+		tmsg.addr = ct->remote_fi_addr;
+		tmsg.context = &ctx;
+		tmsg.tag = TAG;
+
+		ret = fi_tsendmsg(ct->ep, &tmsg, FI_INJECT | FI_TRANSMIT_COMPLETE);
+		if (ret) {
+			PP_PRINTERR("t-transmit", ret);
+			return ret;
+		}
 	}
 
 	ret = pp_get_tx_comp(ct, ++ct->tx_seq);
@@ -1900,6 +1917,9 @@ void pp_pingpong_usage(char *name, char *desc)
 
 	fprintf(stderr, " %-20s %s\n", "-c", "enables data_integrity checks");
 
+	fprintf(stderr, " %-20s %s\n", "-m <transmit mode>",
+		"transmit mode type: msg|tagged (msg)");
+
 	fprintf(stderr, " %-20s %s\n", "-h", "display this help output");
 	fprintf(stderr, " %-20s %s\n", "-v", "enable debugging output");
 }
@@ -1971,6 +1991,13 @@ void pp_parse_opts(struct ct_pingpong *ct, int op, char *optarg)
 		ct->opts.dst_port = parse_ulong(optarg, UINT16_MAX);
 		break;
 
+	case 'm':
+		if (strncasecmp("msg", optarg, 4)) {
+			ct->hints->caps &= ~FI_MSG;
+			ct->hints->caps |= FI_TAGGED;
+		}
+		break;
+
 	/* Debug */
 	case 'v':
 		pp_debug = 1;
@@ -2035,7 +2062,7 @@ int pingpong(struct ct_pingpong *ct)
 
 	PP_DEBUG("Results:\n");
 	show_perf(NULL, ct->opts.transfer_size, ct->opts.iterations,
-		  ct->cnt_ack_msg, &(ct->start), &(ct->end), 2);
+		  ct->cnt_ack_msg, ct->start, ct->end, 2);
 
 	return 0;
 }
@@ -2144,12 +2171,9 @@ out:
 
 int main(int argc, char **argv)
 {
-	int ret, op;
-
-	ret = EXIT_SUCCESS;
-
+	int op, ret = EXIT_SUCCESS;
 	struct ct_pingpong ct = {
-		.timeout = -1,
+		.timeout_sec = -1,
 		.ctrl_connfd = -1,
 		.opts = {
 			.iterations = 1000,
@@ -2164,9 +2188,12 @@ int main(int argc, char **argv)
 		return EXIT_FAILURE;
 	ct.hints->ep_attr->type = FI_EP_DGRAM;
 	ct.hints->caps = FI_MSG;
-	ct.hints->mode = FI_CONTEXT | FI_LOCAL_MR;
+	ct.hints->mode = FI_CONTEXT;
+	ct.hints->domain_attr->mr_mode = FI_MR_LOCAL | OFI_MR_BASIC_MAP;
+
+	ofi_osd_init();
 
-	while ((op = getopt(argc, argv, "hvd:p:e:I:S:B:P:c")) != -1) {
+	while ((op = getopt(argc, argv, "hvd:p:e:I:S:B:P:cm:")) != -1) {
 		switch (op) {
 		default:
 			pp_parse_opts(&ct, op, optarg);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ofed/libfabric.git



More information about the Pkg-ofed-commits mailing list