summary refs log tree commit diff
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/Makefile.in48
-rw-r--r--cli/src/Makefile.in50
-rw-r--r--cli/src/connections.c667
-rw-r--r--cli/src/devices.c506
-rw-r--r--cli/src/network-manager.c157
-rw-r--r--cli/src/nmcli.c15
-rw-r--r--cli/src/nmcli.h14
-rw-r--r--cli/src/settings.c55
-rw-r--r--cli/src/settings.h2
-rw-r--r--cli/src/utils.c49
-rw-r--r--cli/src/utils.h1
11 files changed, 1089 insertions, 475 deletions
diff --git a/cli/Makefile.in b/cli/Makefile.in
index 06dee842..a8d972d4 100644
--- a/cli/Makefile.in
+++ b/cli/Makefile.in
@@ -37,11 +37,16 @@ subdir = cli
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/intltool.m4 \
-	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -98,7 +103,6 @@ am__relativize = \
   done; \
   reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -107,8 +111,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -125,6 +127,7 @@ DHCLIENT_PATH = @DHCLIENT_PATH@
 DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
 DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -133,6 +136,7 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
@@ -141,8 +145,8 @@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
-GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
 GNUTLS_LIBS = @GNUTLS_LIBS@
 GREP = @GREP@
@@ -157,13 +161,23 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
+IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
+IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
@@ -171,6 +185,8 @@ LIBDL = @LIBDL@
 LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
 LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
 LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
 LIBM = @LIBM@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
 LIBNL_LIBS = @LIBNL_LIBS@
@@ -179,13 +195,15 @@ LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
-MKINSTALLDIRS = @MKINSTALLDIRS@
 MSGFMT = @MSGFMT@
-MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -211,12 +229,9 @@ PKGCONFIG_PATH = @PKGCONFIG_PATH@
 PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POFILES = @POFILES@
 POLKIT_CFLAGS = @POLKIT_CFLAGS@
 POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
-PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
-PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
 RANLIB = @RANLIB@
 RESOLVCONF_PATH = @RESOLVCONF_PATH@
@@ -231,10 +246,13 @@ UUID_CFLAGS = @UUID_CFLAGS@
 UUID_LIBS = @UUID_LIBS@
 VERSION = @VERSION@
 XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
diff --git a/cli/src/Makefile.in b/cli/src/Makefile.in
index 51ec648a..f5a9e00b 100644
--- a/cli/src/Makefile.in
+++ b/cli/src/Makefile.in
@@ -39,11 +39,16 @@ subdir = cli/src
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/intltool.m4 \
-	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -65,7 +70,7 @@ AM_V_lt = $(am__v_lt_$(V))
 am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY))
 am__v_lt_0 = --silent
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -96,7 +101,6 @@ ETAGS = etags
 CTAGS = ctags
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -105,8 +109,6 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
@@ -123,6 +125,7 @@ DHCLIENT_PATH = @DHCLIENT_PATH@
 DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
 DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -131,6 +134,7 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
@@ -139,8 +143,8 @@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
-GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
 GNUTLS_LIBS = @GNUTLS_LIBS@
 GREP = @GREP@
@@ -155,13 +159,23 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
+IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
+IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
@@ -169,6 +183,8 @@ LIBDL = @LIBDL@
 LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
 LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
 LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
 LIBM = @LIBM@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
 LIBNL_LIBS = @LIBNL_LIBS@
@@ -177,13 +193,15 @@ LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
-MKINSTALLDIRS = @MKINSTALLDIRS@
 MSGFMT = @MSGFMT@
-MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -209,12 +227,9 @@ PKGCONFIG_PATH = @PKGCONFIG_PATH@
 PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POFILES = @POFILES@
 POLKIT_CFLAGS = @POLKIT_CFLAGS@
 POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
-PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
-PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
 RANLIB = @RANLIB@
 RESOLVCONF_PATH = @RESOLVCONF_PATH@
@@ -229,10 +244,13 @@ UUID_CFLAGS = @UUID_CFLAGS@
 UUID_LIBS = @UUID_LIBS@
 VERSION = @VERSION@
 XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
diff --git a/cli/src/connections.c b/cli/src/connections.c
index 88a5df49..2646aa9e 100644
--- a/cli/src/connections.c
+++ b/cli/src/connections.c
@@ -17,6 +17,8 @@
  * (C) Copyright 2010 - 2011 Red Hat, Inc.
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <dbus/dbus.h>
@@ -38,16 +40,18 @@
 #include <nm-setting-cdma.h>
 #include <nm-setting-bluetooth.h>
 #include <nm-setting-olpc-mesh.h>
+#if WITH_WIMAX
+#include <nm-setting-wimax.h>
+#endif
 #include <nm-device-ethernet.h>
 #include <nm-device-wifi.h>
-#include <nm-gsm-device.h>
-#include <nm-cdma-device.h>
+#if WITH_WIMAX
+#include <nm-device-wimax.h>
+#endif
+#include <nm-device-modem.h>
 #include <nm-device-bt.h>
 //#include <nm-device-olpc-mesh.h>
 #include <nm-remote-settings.h>
-#include <nm-remote-settings-system.h>
-#include <nm-settings-interface.h>
-#include <nm-settings-connection-interface.h>
 #include <nm-vpn-connection.h>
 
 #include "utils.h"
@@ -60,32 +64,29 @@ static NmcOutputField nmc_fields_con_status[] = {
 	{"NAME",          N_("NAME"),         25, NULL, 0},  /* 0 */
 	{"UUID",          N_("UUID"),         38, NULL, 0},  /* 1 */
 	{"DEVICES",       N_("DEVICES"),      10, NULL, 0},  /* 2 */
-	{"SCOPE",         N_("SCOPE"),         8, NULL, 0},  /* 3 */
-	{"DEFAULT",       N_("DEFAULT"),       8, NULL, 0},  /* 4 */
-	{"DBUS-SERVICE",  N_("DBUS-SERVICE"), 45, NULL, 0},  /* 5 */
-	{"SPEC-OBJECT",   N_("SPEC-OBJECT"),  10, NULL, 0},  /* 6 */
-	{"VPN",           N_("VPN"),           5, NULL, 0},  /* 7 */
-	{"DBUS-PATH",     N_("DBUS-PATH"),    51, NULL, 0},  /* 8 */
+	{"DEFAULT",       N_("DEFAULT"),       8, NULL, 0},  /* 3 */
+	{"SPEC-OBJECT",   N_("SPEC-OBJECT"),  10, NULL, 0},  /* 4 */
+	{"VPN",           N_("VPN"),           5, NULL, 0},  /* 5 */
+	{"DBUS-PATH",     N_("DBUS-PATH"),    51, NULL, 0},  /* 6 */
 	{NULL,            NULL,                0, NULL, 0}
 };
-#define NMC_FIELDS_CON_STATUS_ALL     "NAME,UUID,DEVICES,SCOPE,DEFAULT,VPN,DBUS-SERVICE,DBUS-PATH,SPEC-OBJECT"
-#define NMC_FIELDS_CON_STATUS_COMMON  "NAME,UUID,DEVICES,SCOPE,DEFAULT,VPN"
+#define NMC_FIELDS_CON_STATUS_ALL     "NAME,UUID,DEVICES,DEFAULT,VPN,DBUS-PATH,SPEC-OBJECT"
+#define NMC_FIELDS_CON_STATUS_COMMON  "NAME,UUID,DEVICES,DEFAULT,VPN"
 
 /* Available fields for 'con list' */
 static NmcOutputField nmc_fields_con_list[] = {
 	{"NAME",            N_("NAME"),           25, NULL, 0},  /* 0 */
 	{"UUID",            N_("UUID"),           38, NULL, 0},  /* 1 */
 	{"TYPE",            N_("TYPE"),           17, NULL, 0},  /* 2 */
-	{"SCOPE",           N_("SCOPE"),           8, NULL, 0},  /* 3 */
-	{"TIMESTAMP",       N_("TIMESTAMP"),      12, NULL, 0},  /* 4 */
-	{"TIMESTAMP-REAL",  N_("TIMESTAMP-REAL"), 34, NULL, 0},  /* 5 */
-	{"AUTOCONNECT",     N_("AUTOCONNECT"),    13, NULL, 0},  /* 6 */
-	{"READONLY",        N_("READONLY"),       10, NULL, 0},  /* 7 */
-	{"DBUS-PATH",       N_("DBUS-PATH"),      42, NULL, 0},  /* 8 */
+	{"TIMESTAMP",       N_("TIMESTAMP"),      12, NULL, 0},  /* 3 */
+	{"TIMESTAMP-REAL",  N_("TIMESTAMP-REAL"), 34, NULL, 0},  /* 4 */
+	{"AUTOCONNECT",     N_("AUTOCONNECT"),    13, NULL, 0},  /* 5 */
+	{"READONLY",        N_("READONLY"),       10, NULL, 0},  /* 6 */
+	{"DBUS-PATH",       N_("DBUS-PATH"),      42, NULL, 0},  /* 7 */
 	{NULL,              NULL,                  0, NULL, 0}
 };
-#define NMC_FIELDS_CON_LIST_ALL     "NAME,UUID,TYPE,SCOPE,TIMESTAMP,TIMESTAMP-REAL,AUTOCONNECT,READONLY,DBUS-PATH"
-#define NMC_FIELDS_CON_LIST_COMMON  "NAME,UUID,TYPE,SCOPE,TIMESTAMP-REAL"
+#define NMC_FIELDS_CON_LIST_ALL     "NAME,UUID,TYPE,TIMESTAMP,TIMESTAMP-REAL,AUTOCONNECT,READONLY,DBUS-PATH"
+#define NMC_FIELDS_CON_LIST_COMMON  "NAME,UUID,TYPE,TIMESTAMP-REAL"
 
 
 /* Helper macro to define fields */
@@ -108,9 +109,10 @@ static NmcOutputField nmc_fields_settings_names[] = {
 	SETTING_FIELD (NM_SETTING_BLUETOOTH_SETTING_NAME, 0),             /* 12 */
 	SETTING_FIELD (NM_SETTING_OLPC_MESH_SETTING_NAME, 0),             /* 13 */
 	SETTING_FIELD (NM_SETTING_VPN_SETTING_NAME, 0),                   /* 14 */
+	SETTING_FIELD (NM_SETTING_WIMAX_SETTING_NAME, 0),                 /* 15 */
 	{NULL, NULL, 0, NULL, 0}
 };
-#define NMC_FIELDS_SETTINGS_NAMES_ALL    NM_SETTING_CONNECTION_SETTING_NAME","\
+#define NMC_FIELDS_SETTINGS_NAMES_ALL_X  NM_SETTING_CONNECTION_SETTING_NAME","\
                                          NM_SETTING_WIRED_SETTING_NAME","\
                                          NM_SETTING_802_1X_SETTING_NAME","\
                                          NM_SETTING_WIRELESS_SETTING_NAME","\
@@ -125,6 +127,12 @@ static NmcOutputField nmc_fields_settings_names[] = {
                                          NM_SETTING_BLUETOOTH_SETTING_NAME","\
                                          NM_SETTING_OLPC_MESH_SETTING_NAME","\
                                          NM_SETTING_VPN_SETTING_NAME
+#if WITH_WIMAX
+#define NMC_FIELDS_SETTINGS_NAMES_ALL    NMC_FIELDS_SETTINGS_NAMES_ALL_X","\
+                                         NM_SETTING_WIMAX_SETTING_NAME
+#else
+#define NMC_FIELDS_SETTINGS_NAMES_ALL    NMC_FIELDS_SETTINGS_NAMES_ALL_X
+#endif
 
 
 typedef struct {
@@ -143,11 +151,10 @@ static void quit (void);
 static void show_connection (NMConnection *data, gpointer user_data);
 static NMConnection *find_connection (GSList *list, const char *filter_type, const char *filter_val);
 static gboolean find_device_for_connection (NmCli *nmc, NMConnection *connection, const char *iface, const char *ap,
-                                            NMDevice **device, const char **spec_object, GError **error);
+                                            const char *nsp, NMDevice **device, const char **spec_object, GError **error);
 static const char *active_connection_state_to_string (NMActiveConnectionState state);
 static void active_connection_state_cb (NMActiveConnection *active, GParamSpec *pspec, gpointer user_data);
-static void activate_connection_cb (gpointer user_data, const char *path, GError *error);
-static void get_connections_cb (NMSettingsInterface *settings, gpointer user_data);
+static void get_connections_cb (NMRemoteSettings *settings, gpointer user_data);
 static NMCResultCode do_connections_list (NmCli *nmc, int argc, char **argv);
 static NMCResultCode do_connections_status (NmCli *nmc, int argc, char **argv);
 static NMCResultCode do_connection_up (NmCli *nmc, int argc, char **argv);
@@ -157,14 +164,27 @@ static void
 usage (void)
 {
 	fprintf (stderr,
-	 	 _("Usage: nmcli con { COMMAND | help }\n"
-		 "  COMMAND := { list | status | up | down }\n\n"
-		 "  list [id <id> | uuid <id> | system | user]\n"
-		 "  status\n"
-		 "  up id <id> | uuid <id> [iface <iface>] [ap <hwaddr>] [--nowait] [--timeout <timeout>]\n"
-		 "  down id <id> | uuid <id>\n"));
+	         _("Usage: nmcli con { COMMAND | help }\n"
+	         "  COMMAND := { list | status | up | down }\n\n"
+	         "  list [id <id> | uuid <id>]\n"
+	         "  status\n"
+#if WITH_WIMAX
+	         "  up id <id> | uuid <id> [iface <iface>] [ap <hwaddr>] [nsp <name>] [--nowait] [--timeout <timeout>]\n"
+#else
+	         "  up id <id> | uuid <id> [iface <iface>] [ap <hwaddr>] [--nowait] [--timeout <timeout>]\n"
+#endif
+	         "  down id <id> | uuid <id>\n"));
 }
 
+/* The real commands that do something - i.e. not 'help', etc. */
+static const char *real_con_commands[] = {
+	"list",
+	"status",
+	"up",
+	"down",
+	NULL
+};
+
 /* quit main loop */
 static void
 quit (void)
@@ -354,6 +374,17 @@ nmc_connection_detail (NMConnection *connection, NmCli *nmc)
 				continue;
 			}
 		}
+
+#if WITH_WIMAX
+		if (!strcasecmp (nmc_fields_settings_names[section_idx].name, nmc_fields_settings_names[15].name)) {
+			setting = nm_connection_get_setting (connection, NM_TYPE_SETTING_WIMAX);
+			if (setting) {
+				setting_wimax_details (setting, nmc);
+				was_output = TRUE;
+				continue;
+			}
+		}
+#endif
 	}
 
 	if (print_settings_array)
@@ -372,7 +403,7 @@ show_connection (NMConnection *data, gpointer user_data)
 	char *timestamp_str;
 	char timestamp_real_str[64];
 
-	s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+	s_con = nm_connection_get_setting_connection (connection);
 	if (s_con) {
 		/* Obtain field values */
 		timestamp = nm_setting_connection_get_timestamp (s_con);
@@ -382,12 +413,11 @@ show_connection (NMConnection *data, gpointer user_data)
 		nmc->allowed_fields[0].value = nm_setting_connection_get_id (s_con);
 		nmc->allowed_fields[1].value = nm_setting_connection_get_uuid (s_con);
 		nmc->allowed_fields[2].value = nm_setting_connection_get_connection_type (s_con);
-		nmc->allowed_fields[3].value = nm_connection_get_scope (connection) == NM_CONNECTION_SCOPE_SYSTEM ? _("system") : _("user");
-		nmc->allowed_fields[4].value = timestamp_str;
-		nmc->allowed_fields[5].value = timestamp ? timestamp_real_str : _("never");
-		nmc->allowed_fields[6].value = nm_setting_connection_get_autoconnect (s_con) ? _("yes") : _("no");
-		nmc->allowed_fields[7].value = nm_setting_connection_get_read_only (s_con) ? _("yes") : _("no");
-		nmc->allowed_fields[8].value = nm_connection_get_path (connection);
+		nmc->allowed_fields[3].value = timestamp_str;
+		nmc->allowed_fields[4].value = timestamp ? timestamp_real_str : _("never");
+		nmc->allowed_fields[5].value = nm_setting_connection_get_autoconnect (s_con) ? _("yes") : _("no");
+		nmc->allowed_fields[6].value = nm_setting_connection_get_read_only (s_con) ? _("yes") : _("no");
+		nmc->allowed_fields[7].value = nm_connection_get_path (connection);
 
 		nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER_ADD & ~NMC_PF_FLAG_MAIN_HEADER_ONLY & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
 		print_fields (nmc->print_fields, nmc->allowed_fields);
@@ -408,7 +438,7 @@ find_connection (GSList *list, const char *filter_type, const char *filter_val)
 	iterator = list;
 	while (iterator) {
 		connection = NM_CONNECTION (iterator->data);
-		s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+		s_con = nm_connection_get_setting_connection (connection);
 		if (s_con) {
 			id = nm_setting_connection_get_id (s_con);
 			uuid = nm_setting_connection_get_uuid (s_con);
@@ -458,22 +488,19 @@ do_connections_list (NmCli *nmc, int argc, char **argv)
 			goto error;
 		valid_param_specified = TRUE;
 
+		/* Print headers */
 		nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
-		nmc->print_fields.header_name = _("System connections");
+		nmc->print_fields.header_name = _("Connection list");
 		print_fields (nmc->print_fields, nmc->allowed_fields);
-		g_slist_foreach (nmc->system_connections, (GFunc) show_connection, nmc);
 
-		nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
-		nmc->print_fields.header_name = _("User connections");
-		print_fields (nmc->print_fields, nmc->allowed_fields);
-		g_slist_foreach (nmc->user_connections, (GFunc) show_connection, nmc);
+		/* Print values */
+		g_slist_foreach (nmc->system_connections, (GFunc) show_connection, nmc);
 	}
 	else {
 		while (argc > 0) {
 			if (strcmp (*argv, "id") == 0 || strcmp (*argv, "uuid") == 0) {
 				const char *selector = *argv;
-				NMConnection *con1;
-				NMConnection *con2;
+				NMConnection *con;
 
 				if (next_arg (&argc, &argv) != 0) {
 					g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *argv);
@@ -484,42 +511,16 @@ do_connections_list (NmCli *nmc, int argc, char **argv)
 				if (!nmc->mode_specified)
 					nmc->multiline_output = TRUE;  /* multiline mode is default for 'con list id|uuid' */
 
-				con1 = find_connection (nmc->system_connections, selector, *argv);
-				con2 = find_connection (nmc->user_connections, selector, *argv);
-				if (con1) nmc_connection_detail (con1, nmc);
-				if (con2) nmc_connection_detail (con2, nmc);
-				if (!con1 && !con2) {
+				con = find_connection (nmc->system_connections, selector, *argv);
+				if (con) {
+					nmc_connection_detail (con, nmc);
+				}
+				else {
 					g_string_printf (nmc->return_text, _("Error: %s - no such connection."), *argv);
 					nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
 				}
 				break;
 			}
-			else if (strcmp (*argv, "system") == 0) {
-				if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error2))
-					goto error;
-				if (error1)
-					goto error;
-				valid_param_specified = TRUE;
-
-				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
-				nmc->print_fields.header_name = _("System connections");
-				print_fields (nmc->print_fields, nmc->allowed_fields);
-				g_slist_foreach (nmc->system_connections, (GFunc) show_connection, nmc);
-				break;
-			}
-			else if (strcmp (*argv, "user") == 0) {
-				if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error2))
-					goto error;
-				if (error1)
-					goto error;
-				valid_param_specified = TRUE;
-
-				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
-				nmc->print_fields.header_name = _("User connections");
-				print_fields (nmc->print_fields, nmc->allowed_fields);
-				g_slist_foreach (nmc->user_connections, (GFunc) show_connection, nmc);
-				break;
-			}
 			else {
 				fprintf (stderr, _("Unknown parameter: %s\n"), *argv);
 			}
@@ -553,29 +554,19 @@ error:
 	return nmc->return_value;
 }
 
-typedef struct {
-	NmCli *nmc;
-	NMConnectionScope scope;
-} StatusInfo;
-
 static void
 show_active_connection (gpointer data, gpointer user_data)
 {
 	NMActiveConnection *active = NM_ACTIVE_CONNECTION (data);
-	StatusInfo *info = (StatusInfo *) user_data;
+	NmCli *nmc = (NmCli *) user_data;
 	GSList *con_list, *iter;
 	const char *active_path;
-	NMConnectionScope active_service_scope;
 	NMSettingConnection *s_con;
 	const GPtrArray *devices;
 	GString *dev_str;
 	int i;
 
 	active_path = nm_active_connection_get_connection (active);
-	active_service_scope = nm_active_connection_get_scope (active);
-
-	if (active_service_scope != info->scope)
-		return;
 
 	/* Get devices of the active connection */
 	dev_str = g_string_new (NULL);
@@ -589,29 +580,27 @@ show_active_connection (gpointer data, gpointer user_data)
 	if (dev_str->len > 0)
 		g_string_truncate (dev_str, dev_str->len - 1);  /* Cut off last ',' */
 
-	con_list = (info->scope == NM_CONNECTION_SCOPE_SYSTEM) ? info->nmc->system_connections : info->nmc->user_connections;
+	con_list = nmc->system_connections; 
 	for (iter = con_list; iter; iter = g_slist_next (iter)) {
 		NMConnection *connection = (NMConnection *) iter->data;
 		const char *con_path = nm_connection_get_path (connection);
 
 		if (!strcmp (active_path, con_path)) {
 			/* This connection is active */
-			s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+			s_con = nm_connection_get_setting_connection (connection);
 			g_assert (s_con != NULL);
 
 			/* Obtain field values */
-			info->nmc->allowed_fields[0].value = nm_setting_connection_get_id (s_con);
-			info->nmc->allowed_fields[1].value = nm_setting_connection_get_uuid (s_con);
-			info->nmc->allowed_fields[2].value = dev_str->str;
-			info->nmc->allowed_fields[3].value = active_service_scope == NM_CONNECTION_SCOPE_SYSTEM ? _("system") : _("user");
-			info->nmc->allowed_fields[4].value = nm_active_connection_get_default (active) ? _("yes") : _("no");
-			info->nmc->allowed_fields[5].value = nm_active_connection_get_service_name (active);
-			info->nmc->allowed_fields[6].value = nm_active_connection_get_specific_object (active);
-			info->nmc->allowed_fields[7].value = NM_IS_VPN_CONNECTION (active) ? _("yes") : _("no");
-			info->nmc->allowed_fields[8].value = nm_object_get_path (NM_OBJECT (active));
-
-			info->nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER_ADD & ~NMC_PF_FLAG_MAIN_HEADER_ONLY & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
-			print_fields (info->nmc->print_fields, info->nmc->allowed_fields);
+			nmc->allowed_fields[0].value = nm_setting_connection_get_id (s_con);
+			nmc->allowed_fields[1].value = nm_setting_connection_get_uuid (s_con);
+			nmc->allowed_fields[2].value = dev_str->str;
+			nmc->allowed_fields[3].value = nm_active_connection_get_default (active) ? _("yes") : _("no");
+			nmc->allowed_fields[4].value = nm_active_connection_get_specific_object (active);
+			nmc->allowed_fields[5].value = NM_IS_VPN_CONNECTION (active) ? _("yes") : _("no");
+			nmc->allowed_fields[6].value = nm_object_get_path (NM_OBJECT (active));
+
+			nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER_ADD & ~NMC_PF_FLAG_MAIN_HEADER_ONLY & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
+			print_fields (nmc->print_fields, nmc->allowed_fields);
 			break;
 		}
 	}
@@ -624,7 +613,6 @@ do_connections_status (NmCli *nmc, int argc, char **argv)
 {
 	const GPtrArray *active_cons;
 	GError *error = NULL;
-	StatusInfo *info;
 	char *fields_str;
 	char *fields_all =    NMC_FIELDS_CON_STATUS_ALL;
 	char *fields_common = NMC_FIELDS_CON_STATUS_COMMON;
@@ -673,15 +661,8 @@ do_connections_status (NmCli *nmc, int argc, char **argv)
 
 	nmc->get_client (nmc);
 	active_cons = nm_client_get_active_connections (nmc->client);
-	if (active_cons && active_cons->len) {
-		info = g_malloc0 (sizeof (StatusInfo));
-		info->nmc = nmc;
-		info->scope = NM_CONNECTION_SCOPE_SYSTEM;
-		g_ptr_array_foreach ((GPtrArray *) active_cons, show_active_connection, (gpointer) info);
-		info->scope = NM_CONNECTION_SCOPE_USER;
-		g_ptr_array_foreach ((GPtrArray *) active_cons, show_active_connection, (gpointer) info);
-		g_free (info);
-	}
+	if (active_cons && active_cons->len)
+		g_ptr_array_foreach ((GPtrArray *) active_cons, show_active_connection, (gpointer) nmc);
 
 error:
 	return nmc->return_value;
@@ -700,7 +681,7 @@ check_ethernet_compatible (NMDeviceEthernet *device, NMConnection *connection, G
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 
 	connection_type = nm_setting_connection_get_connection_type (s_con);
@@ -714,7 +695,7 @@ check_ethernet_compatible (NMDeviceEthernet *device, NMConnection *connection, G
 	if (!strcmp (connection_type, NM_SETTING_PPPOE_SETTING_NAME))
 		is_pppoe = TRUE;
 
-	s_wired = (NMSettingWired *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRED);
+	s_wired = nm_connection_get_setting_wired (connection);
 	/* Wired setting is optional for PPPoE */
 	if (!is_pppoe && !s_wired) {
 		g_set_error (error, 0, 0,
@@ -756,7 +737,7 @@ check_wifi_compatible (NMDeviceWifi *device, NMConnection *connection, GError **
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 
 	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_WIRELESS_SETTING_NAME)) {
@@ -765,7 +746,7 @@ check_wifi_compatible (NMDeviceWifi *device, NMConnection *connection, GError **
 		return FALSE;
 	}
 
-	s_wireless = NM_SETTING_WIRELESS (nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS));
+	s_wireless = nm_connection_get_setting_wireless (connection);
 	if (!s_wireless) {
 		g_set_error (error, 0, 0,
 		             "The connection was not a valid WiFi connection.");
@@ -814,7 +795,7 @@ check_bt_compatible (NMDeviceBt *device, NMConnection *connection, GError **erro
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 
 	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_BLUETOOTH_SETTING_NAME)) {
@@ -823,7 +804,7 @@ check_bt_compatible (NMDeviceBt *device, NMConnection *connection, GError **erro
 		return FALSE;
 	}
 
-	s_bt = NM_SETTING_BLUETOOTH (nm_connection_get_setting (connection, NM_TYPE_SETTING_BLUETOOTH));
+	s_bt = nm_connection_get_setting_bluetooth (connection);
 	if (!s_bt) {
 		g_set_error (error, 0, 0,
 		             "The connection was not a valid Bluetooth connection.");
@@ -873,7 +854,7 @@ check_olpc_mesh_compatible (NMDeviceOlpcMesh *device, NMConnection *connection,
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 
 	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_OLPC_MESH_SETTING_NAME)) {
@@ -882,7 +863,7 @@ check_olpc_mesh_compatible (NMDeviceOlpcMesh *device, NMConnection *connection,
 		return FALSE;
 	}
 
-	s_mesh = NM_SETTING_OLPC_MESH (nm_connection_get_setting (connection, NM_TYPE_SETTING_OLPC_MESH));
+	s_mesh = nm_connection_get_setting_olpc_mesh (connection);
 	if (!s_mesh) {
 		g_set_error (error, 0, 0,
 		             "The connection was not a valid Mesh connection.");
@@ -893,55 +874,94 @@ check_olpc_mesh_compatible (NMDeviceOlpcMesh *device, NMConnection *connection,
 }
 #endif
 
+#if WITH_WIMAX
 static gboolean
-check_gsm_compatible (NMGsmDevice *device, NMConnection *connection, GError **error)
+check_wimax_compatible (NMDeviceWimax *device, NMConnection *connection, GError **error)
 {
 	NMSettingConnection *s_con;
-	NMSettingGsm *s_gsm;
+	NMSettingWimax *s_wimax;
+	const GByteArray *mac;
+	const char *device_mac_str;
+	struct ether_addr *device_mac = NULL;
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 
-	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_GSM_SETTING_NAME)) {
+	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_WIMAX_SETTING_NAME)) {
+		g_set_error (error, 0, 0,
+		             "The connection was not a WiMAX connection.");
+		return FALSE;
+	}
+
+	s_wimax = nm_connection_get_setting_wimax (connection);
+	if (!s_wimax) {
 		g_set_error (error, 0, 0,
-		             "The connection was not a GSM connection.");
+		             "The connection was not a valid WiMAX connection.");
+		return FALSE;
+	}
+
+	device_mac_str = nm_device_wimax_get_hw_address (device);
+	if (device_mac_str)
+		device_mac = ether_aton (device_mac_str);
+	if (!device_mac) {
+		g_set_error (error, 0, 0, "Invalid device MAC address.");
 		return FALSE;
 	}
 
-	s_gsm = NM_SETTING_GSM (nm_connection_get_setting (connection, NM_TYPE_SETTING_GSM));
-	if (!s_gsm) {
+	mac = nm_setting_wimax_get_mac_address (s_wimax);
+	if (mac && memcmp (mac->data, device_mac->ether_addr_octet, ETH_ALEN)) {
 		g_set_error (error, 0, 0,
-		             "The connection was not a valid GSM connection.");
+	        	     "The connection's MAC address did not match this device.");
 		return FALSE;
 	}
 
 	return TRUE;
 }
+#endif
 
 static gboolean
-check_cdma_compatible (NMCdmaDevice *device, NMConnection *connection, GError **error)
+check_modem_compatible (NMDeviceModem *device, NMConnection *connection, GError **error)
 {
 	NMSettingConnection *s_con;
+	NMSettingGsm *s_gsm;
 	NMSettingCdma *s_cdma;
+	NMDeviceModemCapabilities caps = NM_DEVICE_MODEM_CAPABILITY_NONE;
 
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = NM_SETTING_CONNECTION (nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION));
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 
-	if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_CDMA_SETTING_NAME)) {
-		g_set_error (error, 0, 0,
-		             "The connection was not a CDMA connection.");
-		return FALSE;
-	}
+	/* Figure out what the modem supports */
+	caps = nm_device_modem_get_current_capabilities (device);
+	if (caps & NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS) {
+		if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_GSM_SETTING_NAME)) {
+			g_set_error (error, 0, 0,
+				     "The connection was not a GSM connection.");
+			return FALSE;
+		}
 
-	s_cdma = NM_SETTING_CDMA (nm_connection_get_setting (connection, NM_TYPE_SETTING_CDMA));
-	if (!s_cdma) {
-		g_set_error (error, 0, 0,
-		             "The connection was not a valid CDMA connection.");
-		return FALSE;
+		s_gsm = nm_connection_get_setting_gsm (connection);
+		if (!s_gsm) {
+			g_set_error (error, 0, 0,
+				     "The connection was not a valid GSM connection.");
+			return FALSE;
+		}
+	} else if (caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO) {
+		if (strcmp (nm_setting_connection_get_connection_type (s_con), NM_SETTING_CDMA_SETTING_NAME)) {
+			g_set_error (error, 0, 0,
+				     "The connection was not a CDMA connection.");
+			return FALSE;
+		}
+
+		s_cdma = nm_connection_get_setting_cdma (connection);
+		if (!s_cdma) {
+			g_set_error (error, 0, 0,
+				     "The connection was not a valid CDMA connection.");
+			return FALSE;
+		}
 	}
 
 	return TRUE;
@@ -961,49 +981,17 @@ nm_device_is_connection_compatible (NMDevice *device, NMConnection *connection,
 		return check_bt_compatible (NM_DEVICE_BT (device), connection, error);
 //	else if (NM_IS_DEVICE_OLPC_MESH (device))
 //		return check_olpc_mesh_compatible (NM_DEVICE_OLPC_MESH (device), connection, error);
-	else if (NM_IS_GSM_DEVICE (device))
-		return check_gsm_compatible (NM_GSM_DEVICE (device), connection, error);
-	else if (NM_IS_CDMA_DEVICE (device))
-		return check_cdma_compatible (NM_CDMA_DEVICE (device), connection, error);
+#if WITH_WIMAX
+	else if (NM_IS_DEVICE_WIMAX (device))
+		return check_wimax_compatible (NM_DEVICE_WIMAX (device), connection, error);
+#endif
+	else if (NM_IS_DEVICE_MODEM (device))
+		return check_modem_compatible (NM_DEVICE_MODEM (device), connection, error);
 
 	g_set_error (error, 0, 0, "unhandled device type '%s'", G_OBJECT_TYPE_NAME (device));
 	return FALSE;
 }
 
-
-/**
- * nm_client_get_active_connection_by_path:
- * @client: a #NMClient
- * @object_path: the object path to search for
- *
- * Gets a #NMActiveConnection from a #NMClient.
- *
- * Returns: the #NMActiveConnection for the given @object_path or %NULL if none is found.
- **/
-static NMActiveConnection *
-nm_client_get_active_connection_by_path (NMClient *client, const char *object_path)
-{
-	const GPtrArray *actives;
-	int i;
-	NMActiveConnection *active = NULL;
-
-	g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
-	g_return_val_if_fail (object_path, NULL);
-
-	actives = nm_client_get_active_connections (client);
-	if (!actives)
-		return NULL;
-
-	for (i = 0; i < actives->len; i++) {
-		NMActiveConnection *candidate = g_ptr_array_index (actives, i);
-		if (!strcmp (nm_object_get_path (NM_OBJECT (candidate)), object_path)) {
-			active = candidate;
-			break;
-		}
-	}
-
-	return active;
-}
 /* -------------------- */
 
 static NMActiveConnection *
@@ -1055,13 +1043,20 @@ get_default_active_connection (NmCli *nmc, NMDevice **device)
  * IN:  connection:  connection to activate
  *      iface:       device interface name to use (optional)
  *      ap:          access point to use (optional; valid just for 802-11-wireless)
+ *      nsp:         Network Service Provider to use (option; valid only for wimax)
  * OUT: device:      found device
  *      spec_object: specific_object path of NMAccessPoint
  * RETURNS: TRUE when a device is found, FALSE otherwise.
  */
 static gboolean
-find_device_for_connection (NmCli *nmc, NMConnection *connection, const char *iface, const char *ap,
-                            NMDevice **device, const char **spec_object, GError **error)
+find_device_for_connection (NmCli *nmc,
+                            NMConnection *connection,
+                            const char *iface,
+                            const char *ap,
+                            const char *nsp,
+                            NMDevice **device,
+                            const char **spec_object,
+                            GError **error)
 {
 	NMSettingConnection *s_con;
 	const char *con_type;
@@ -1072,7 +1067,7 @@ find_device_for_connection (NmCli *nmc, NMConnection *connection, const char *if
 	g_return_val_if_fail (spec_object != NULL && *spec_object == NULL, FALSE);
 	g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
-	s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 	con_type = nm_setting_connection_get_connection_type (s_con);
 
@@ -1148,6 +1143,27 @@ find_device_for_connection (NmCli *nmc, NMConnection *connection, const char *if
 				}
 				g_free (hwaddr_up);
 			}
+
+#if WITH_WIMAX
+			if (   found_device
+			    && nsp
+			    && !strcmp (con_type, NM_SETTING_WIMAX_SETTING_NAME)
+			    && NM_IS_DEVICE_WIMAX (dev)) {
+				const GPtrArray *nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (dev));
+				found_device = NULL;  /* Mark as not found; set to the device again later, only if NSP matches */
+
+				for (j = 0; nsps && (j < nsps->len); j++) {
+					NMWimaxNsp *candidate_nsp = g_ptr_array_index (nsps, j);
+					const char *candidate_name = nm_wimax_nsp_get_name (candidate_nsp);
+
+					if (!strcmp (nsp, candidate_name)) {
+						found_device = dev;
+						*spec_object = nm_object_get_path (NM_OBJECT (candidate_nsp));
+						break;
+					}
+				}
+			}
+#endif
 		}
 
 		if (found_device) {
@@ -1171,6 +1187,8 @@ active_connection_state_to_string (NMActiveConnectionState state)
 		return _("activating");
 	case NM_ACTIVE_CONNECTION_STATE_ACTIVATED:
 		return _("activated");
+	case NM_ACTIVE_CONNECTION_STATE_DEACTIVATING:
+		return _("deactivating");
 	case NM_ACTIVE_CONNECTION_STATE_UNKNOWN:
 	default:
 		return _("unknown");
@@ -1300,79 +1318,32 @@ timeout_cb (gpointer user_data)
 }
 
 static void
-foo_active_connections_changed_cb (NMClient *client,
-                                   GParamSpec *pspec,
-                                   gpointer user_data)
-{
-	/* Call again activate_connection_cb with dummy arguments;
-	 * the correct ones are taken from its first call.
-	 */
-	activate_connection_cb (NULL, NULL, NULL);
-}
-
-static void
-activate_connection_cb (gpointer user_data, const char *path, GError *error)
+activate_connection_cb (NMClient *client, NMActiveConnection *active, GError *error, gpointer user_data)
 {
 	NmCli *nmc = (NmCli *) user_data;
-	NMActiveConnection *active;
 	NMActiveConnectionState state;
-	static gulong handler_id = 0;
-	static NmCli *orig_nmc;
-	static const char *orig_path;
-	static GError *orig_error;
-
-	if (nmc)
-	{
-		/* Called first time; store actual arguments */
-		orig_nmc = nmc;
-		orig_path = path;
-		orig_error = error;
-	}
 
-	/* Disconnect the handler not to be run any more */
-	if (handler_id != 0) {
-		g_signal_handler_disconnect (orig_nmc->client, handler_id);
-		handler_id = 0;
-	}
-
-	if (orig_error) {
-		g_string_printf (orig_nmc->return_text, _("Error: Connection activation failed: %s"), orig_error->message);
-		orig_nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
+	if (error) {
+		g_string_printf (nmc->return_text, _("Error: Connection activation failed: %s"), error->message);
+		nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
 		quit ();
 	} else {
-		active = nm_client_get_active_connection_by_path (orig_nmc->client, orig_path);
-		if (!active) {
-			/* The active connection path is not in active connections list yet; wait for active-connections signal. */
-			/* This is basically the case for VPN connections. */
-			if (nmc) {
-				/* Called first time, i.e. by nm_client_activate_connection() */
-				handler_id = g_signal_connect (orig_nmc->client, "notify::active-connections",
-				                               G_CALLBACK (foo_active_connections_changed_cb), NULL);
-				return;
-			} else {
-				g_string_printf (orig_nmc->return_text, _("Error: Obtaining active connection for '%s' failed."), orig_path);
-				orig_nmc->return_value = NMC_RESULT_ERROR_CON_ACTIVATION;
-				quit ();
-				return;
-			}
-		}
-
 		state = nm_active_connection_get_state (active);
 
 		printf (_("Active connection state: %s\n"), active_connection_state_to_string (state));
-		printf (_("Active connection path: %s\n"), orig_path);
+		printf (_("Active connection path: %s\n"), nm_object_get_path (NM_OBJECT (active)));
 
-		if (orig_nmc->nowait_flag || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
+		if (nmc->nowait_flag || state == NM_ACTIVE_CONNECTION_STATE_ACTIVATED) {
 			/* don't want to wait or already activated */
 			quit ();
 		} else {
 			if (NM_IS_VPN_CONNECTION (active))
-				g_signal_connect (NM_VPN_CONNECTION (active), "vpn-state-changed", G_CALLBACK (vpn_connection_state_cb), orig_nmc);
+				g_signal_connect (NM_VPN_CONNECTION (active), "vpn-state-changed", G_CALLBACK (vpn_connection_state_cb), nmc);
 			else
-				g_signal_connect (active, "notify::state", G_CALLBACK (active_connection_state_cb), orig_nmc);
+				g_signal_connect (active, "notify::state", G_CALLBACK (active_connection_state_cb), nmc);
 
 			/* Start timer not to loop forever when signals are not emitted */
-			g_timeout_add_seconds (orig_nmc->timeout, timeout_cb, orig_nmc);
+			g_timeout_add_seconds (nmc->timeout, timeout_cb, nmc);
 		}
 	}
 }
@@ -1385,11 +1356,10 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 	gboolean device_found;
 	NMConnection *connection = NULL;
 	NMSettingConnection *s_con;
-	gboolean is_system;
-	const char *con_path;
 	const char *con_type;
 	const char *iface = NULL;
 	const char *ap = NULL;
+	const char *nsp = NULL;
 	gboolean id_specified = FALSE;
 	gboolean wait = TRUE;
 	GError *error = NULL;
@@ -1410,8 +1380,7 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 				goto error;
 			}
 
-			if ((connection = find_connection (nmc->system_connections, selector, *argv)) == NULL)
-				connection = find_connection (nmc->user_connections, selector, *argv);
+			connection = find_connection (nmc->system_connections, selector, *argv);
 
 			if (!connection) {
 				g_string_printf (nmc->return_text, _("Error: Unknown connection: %s."), *argv);
@@ -1437,6 +1406,17 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 
 			ap = *argv;
 		}
+#if WITH_WIMAX
+		else if (strcmp (*argv, "nsp") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *argv);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+
+			nsp = *argv;
+		}
+#endif
 		else if (strcmp (*argv, "--nowait") == 0) {
 			wait = FALSE;
 		} else if (strcmp (*argv, "--timeout") == 0) {
@@ -1482,14 +1462,11 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 	/* create NMClient */
 	nmc->get_client (nmc);
 
-	is_system = (nm_connection_get_scope (connection) == NM_CONNECTION_SCOPE_SYSTEM) ? TRUE : FALSE;
-	con_path = nm_connection_get_path (connection);
-
-	s_con = (NMSettingConnection *) nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION);
+	s_con = nm_connection_get_setting_connection (connection);
 	g_assert (s_con);
 	con_type = nm_setting_connection_get_connection_type (s_con);
 
-	device_found = find_device_for_connection (nmc, connection, iface, ap, &device, &spec_object, &error);
+	device_found = find_device_for_connection (nmc, connection, iface, ap, nsp, &device, &spec_object, &error);
 
 	if (!device_found) {
 		if (error)
@@ -1501,13 +1478,14 @@ do_connection_up (NmCli *nmc, int argc, char **argv)
 		goto error;
 	}
 
-	/* Use nowait_flag instead of should_wait because exitting has to be postponed till active_connection_state_cb()
-	 * is called, giving NM time to check our permissions */
+	/* Use nowait_flag instead of should_wait because exiting has to be postponed till
+	 * active_connection_state_cb() is called. That gives NM time to check our permissions
+	 * and we can follow activation progress.
+	 */
 	nmc->nowait_flag = !wait;
 	nmc->should_wait = TRUE;
 	nm_client_activate_connection (nmc->client,
-	                               is_system ? NM_DBUS_SERVICE_SYSTEM_SETTINGS : NM_DBUS_SERVICE_USER_SETTINGS,
-	                               con_path,
+	                               connection,
 	                               device,
 	                               spec_object,
 	                               activate_connection_cb,
@@ -1528,7 +1506,6 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 	const GPtrArray *active_cons;
 	const char *con_path;
 	const char *active_path;
-	NMConnectionScope active_service_scope, con_scope;
 	gboolean id_specified = FALSE;
 	gboolean wait = TRUE;
 	int i;
@@ -1544,8 +1521,7 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 				goto error;
 			}
 
-			if ((connection = find_connection (nmc->system_connections, selector, *argv)) == NULL)
-				connection = find_connection (nmc->user_connections, selector, *argv);
+			connection = find_connection (nmc->system_connections, selector, *argv);
 
 			if (!connection) {
 				g_string_printf (nmc->return_text, _("Error: Unknown connection: %s."), *argv);
@@ -1586,15 +1562,13 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 	nmc->get_client (nmc);
 
 	con_path = nm_connection_get_path (connection);
-	con_scope = nm_connection_get_scope (connection);
 
 	active_cons = nm_client_get_active_connections (nmc->client);
 	for (i = 0; active_cons && (i < active_cons->len); i++) {
 		NMActiveConnection *candidate = g_ptr_array_index (active_cons, i);
 
 		active_path = nm_active_connection_get_connection (candidate);
-		active_service_scope = nm_active_connection_get_scope (candidate);
-		if (!strcmp (active_path, con_path) && active_service_scope == con_scope) {
+		if (!strcmp (active_path, con_path)) {
 			active = candidate;
 			break;
 		}
@@ -1602,9 +1576,8 @@ do_connection_down (NmCli *nmc, int argc, char **argv)
 
 	if (active)
 		nm_client_deactivate_connection (nmc->client, active);
-	else {
+	else
 		fprintf (stderr, _("Warning: Connection not active\n"));
-	}
 	sleep (1);  /* Don't quit immediatelly and give NM time to check our permissions */
 
 error:
@@ -1612,73 +1585,66 @@ error:
 	return nmc->return_value;
 }
 
-/* callback called when connections are obtained from the settings service */
-static void
-get_connections_cb (NMSettingsInterface *settings, gpointer user_data)
+static NMCResultCode
+parse_cmd (NmCli *nmc, int argc, char **argv)
 {
-	ArgsInfo *args = (ArgsInfo *) user_data;
-	static gboolean system_cb_called = FALSE;
-	static gboolean user_cb_called = FALSE;
 	GError *error = NULL;
 
-	if (NM_IS_REMOTE_SETTINGS_SYSTEM (settings)) {
-		system_cb_called = TRUE;
-		args->nmc->system_connections = nm_settings_interface_list_connections (settings);
-	}
-	else {
-		user_cb_called = TRUE;
-		args->nmc->user_connections = nm_settings_interface_list_connections (settings);
-	}
-
-	/* return and wait for the callback of the second settings is called */
-	if (   (args->nmc->system_settings_running && !system_cb_called)
-	    || (args->nmc->user_settings_running && !user_cb_called))
-		return;
-
-	if (args->argc == 0) {
-		if (!nmc_terse_option_check (args->nmc->print_output, args->nmc->required_fields, &error))
+	if (argc == 0) {
+		if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
 			goto opt_error;
-		args->nmc->return_value = do_connections_list (args->nmc, args->argc, args->argv);
+		nmc->return_value = do_connections_list (nmc, argc, argv);
 	} else {
 
-	 	if (matches (*args->argv, "list") == 0) {
-			args->nmc->return_value = do_connections_list (args->nmc, args->argc-1, args->argv+1);
+	 	if (matches (*argv, "list") == 0) {
+			nmc->return_value = do_connections_list (nmc, argc-1, argv+1);
 		}
-		else if (matches(*args->argv, "status") == 0) {
-			if (!nmc_terse_option_check (args->nmc->print_output, args->nmc->required_fields, &error))
+		else if (matches(*argv, "status") == 0) {
+			if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
 				goto opt_error;
-			args->nmc->return_value = do_connections_status (args->nmc, args->argc-1, args->argv+1);
+			nmc->return_value = do_connections_status (nmc, argc-1, argv+1);
 		}
-		else if (matches(*args->argv, "up") == 0) {
-			args->nmc->return_value = do_connection_up (args->nmc, args->argc-1, args->argv+1);
+		else if (matches(*argv, "up") == 0) {
+			nmc->return_value = do_connection_up (nmc, argc-1, argv+1);
 		}
-		else if (matches(*args->argv, "down") == 0) {
-			args->nmc->return_value = do_connection_down (args->nmc, args->argc-1, args->argv+1);
+		else if (matches(*argv, "down") == 0) {
+			nmc->return_value = do_connection_down (nmc, argc-1, argv+1);
 		}
-		else if (matches (*args->argv, "help") == 0) {
+		else if (matches (*argv, "help") == 0) {
 			usage ();
-			args->nmc->should_wait = FALSE;
+			nmc->should_wait = FALSE;
 		} else {
 			usage ();
-			g_string_printf (args->nmc->return_text, _("Error: 'con' command '%s' is not valid."), *args->argv);
-			args->nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-			args->nmc->should_wait = FALSE;
+			g_string_printf (nmc->return_text, _("Error: 'con' command '%s' is not valid."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+			nmc->should_wait = FALSE;
 		}
 	}
 
-	if (!args->nmc->should_wait)
-		quit ();
-	return;
+	return nmc->return_value;
 
 opt_error:
-	g_string_printf (args->nmc->return_text, _("Error: %s."), error->message);
-	args->nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
-	args->nmc->should_wait = FALSE;
+	g_string_printf (nmc->return_text, _("Error: %s."), error->message);
+	nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+	nmc->should_wait = FALSE;
 	g_error_free (error);
-	quit ();
-	return;
+	return nmc->return_value;
 }
 
+/* callback called when connections are obtained from the settings service */
+static void
+get_connections_cb (NMRemoteSettings *settings, gpointer user_data)
+{
+	ArgsInfo *args = (ArgsInfo *) user_data;
+
+	/* Get the connection list */
+	args->nmc->system_connections = nm_remote_settings_list_connections (settings);
+
+	parse_cmd (args->nmc, args->argc, args->argv);
+
+	if (!args->nmc->should_wait)
+		quit ();
+}
 
 /* Entry point function for connections-related commands: 'nmcli con' */
 NMCResultCode
@@ -1686,59 +1652,66 @@ do_connections (NmCli *nmc, int argc, char **argv)
 {
 	DBusGConnection *bus;
 	GError *error = NULL;
+	int i = 0;
+	gboolean real_cmd = FALSE;
 
-	nmc->should_wait = TRUE;
+	if (argc == 0)
+		real_cmd = TRUE;
+	else {
+		while (real_con_commands[i] && matches (*argv, real_con_commands[i]) != 0)
+			i++;
+ 		if (real_con_commands[i] != NULL)
+			real_cmd = TRUE;
+	}
 
-	args_info.nmc = nmc;
-	args_info.argc = argc;
-	args_info.argv = argv;
+	if (!real_cmd) {
+		/* no real execution command - no need to get connections */
+		return parse_cmd (nmc, argc, argv);
+	} else {
+		if (!nmc_versions_match (nmc))
+			return nmc->return_value;
 
-	/* connect to DBus' system bus */
-	bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
-	if (error || !bus) {
-		g_string_printf (nmc->return_text, _("Error: could not connect to D-Bus."));
-		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
-		return nmc->return_value;
-	}
+		nmc->should_wait = TRUE;
 
-	/* get system settings */
-	if (!(nmc->system_settings = nm_remote_settings_system_new (bus))) {
-		g_string_printf (nmc->return_text, _("Error: Could not get system settings."));
-		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
-		return nmc->return_value;
+		args_info.nmc = nmc;
+		args_info.argc = argc;
+		args_info.argv = argv;
 
-	}
+		/* connect to DBus' system bus */
+		bus = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+		if (error || !bus) {
+			g_string_printf (nmc->return_text, _("Error: could not connect to D-Bus."));
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			return nmc->return_value;
+		}
 
-	/* get user settings */
-	if (!(nmc->user_settings = nm_remote_settings_new (bus, NM_CONNECTION_SCOPE_USER))) {
-		g_string_printf (nmc->return_text, _("Error: Could not get user settings."));
-		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
-		return nmc->return_value;
-	}
+		/* get system settings */
+		if (!(nmc->system_settings = nm_remote_settings_new (bus))) {
+			g_string_printf (nmc->return_text, _("Error: Could not get system settings."));
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			return nmc->return_value;
 
-	/* find out whether setting services are running */
-	g_object_get (nmc->system_settings, NM_REMOTE_SETTINGS_SERVICE_RUNNING, &nmc->system_settings_running, NULL);
-	g_object_get (nmc->user_settings, NM_REMOTE_SETTINGS_SERVICE_RUNNING, &nmc->user_settings_running, NULL);
+		}
 
-	if (!nmc->system_settings_running && !nmc->user_settings_running) {
-		g_string_printf (nmc->return_text, _("Error: Can't obtain connections: settings services are not running."));
-		nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
-		return nmc->return_value;
-	}
+		/* find out whether settings service is running */
+		g_object_get (nmc->system_settings, NM_REMOTE_SETTINGS_SERVICE_RUNNING, &nmc->system_settings_running, NULL);
+
+		if (!nmc->system_settings_running) {
+			g_string_printf (nmc->return_text, _("Error: Can't obtain connections: settings service is not running."));
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			return nmc->return_value;
+		}
 
-	/* connect to signal "connections-read" - emitted when connections are fetched and ready */
-	if (nmc->system_settings_running)
-		g_signal_connect (nmc->system_settings, NM_SETTINGS_INTERFACE_CONNECTIONS_READ,
-		                  G_CALLBACK (get_connections_cb), &args_info);
+		/* connect to signal "connections-read" - emitted when connections are fetched and ready */
+		g_signal_connect (nmc->system_settings, NM_REMOTE_SETTINGS_CONNECTIONS_READ,
+				  G_CALLBACK (get_connections_cb), &args_info);
 
-	if (nmc->user_settings_running)
-		g_signal_connect (nmc->user_settings, NM_SETTINGS_INTERFACE_CONNECTIONS_READ,
-		                  G_CALLBACK (get_connections_cb), &args_info);
 
-	dbus_g_connection_unref (bus);
+		dbus_g_connection_unref (bus);
 
-	/* The rest will be done in get_connection_cb() callback.
-	 * We need to wait for signals that connections are read.
-	 */
-	return NMC_RESULT_SUCCESS;
+		/* The rest will be done in get_connection_cb() callback.
+		 * We need to wait for signals that connections are read.
+		 */
+		return NMC_RESULT_SUCCESS;
+	}
 }
diff --git a/cli/src/devices.c b/cli/src/devices.c
index d314928a..c6228ba1 100644
--- a/cli/src/devices.c
+++ b/cli/src/devices.c
@@ -17,6 +17,8 @@
  * (C) Copyright 2010 - 2011 Red Hat, Inc.
  */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -33,10 +35,12 @@
 #include <nm-device.h>
 #include <nm-device-ethernet.h>
 #include <nm-device-wifi.h>
-#include <nm-gsm-device.h>
-#include <nm-cdma-device.h>
+#include <nm-device-modem.h>
 #include <nm-device-bt.h>
 //#include <nm-device-olpc-mesh.h>
+#if WITH_WIMAX
+#include <nm-device-wimax.h>
+#endif
 #include <nm-utils.h>
 #include <nm-setting-ip4-config.h>
 #include <nm-setting-ip6-config.h>
@@ -49,6 +53,9 @@
 #include <nm-setting-cdma.h>
 #include <nm-setting-bluetooth.h>
 #include <nm-setting-olpc-mesh.h>
+#if WITH_WIMAX
+#include <nm-setting-wimax.h>
+#endif
 
 #include "utils.h"
 #include "devices.h"
@@ -73,14 +80,21 @@ static NmcOutputField nmc_fields_dev_list_sections[] = {
 	{"WIFI-PROPERTIES",   N_("WIFI-PROPERTIES"),   0, NULL, 0},  /* 2 */
 	{"AP",                N_("AP"),                0, NULL, 0},  /* 3 */
 	{"WIRED-PROPERTIES",  N_("WIRED-PROPERTIES"),  0, NULL, 0},  /* 4 */
-	{"IP4-SETTINGS",      N_("IP4-SETTINGS"),      0, NULL, 0},  /* 5 */
-	{"IP4-DNS",           N_("IP4-DNS"),           0, NULL, 0},  /* 6 */
-	{"IP6-SETTINGS",      N_("IP6-SETTINGS"),      0, NULL, 0},  /* 7 */
-	{"IP6-DNS",           N_("IP6-DNS"),           0, NULL, 0},  /* 8 */
+	{"WIMAX-PROPERTIES",  N_("WIMAX-PROPERTIES"),  0, NULL, 0},  /* 5 */
+	{"NSP",               N_("NSP"),               0, NULL, 0},  /* 6 */
+	{"IP4-SETTINGS",      N_("IP4-SETTINGS"),      0, NULL, 0},  /* 7 */
+	{"IP4-DNS",           N_("IP4-DNS"),           0, NULL, 0},  /* 8 */
+	{"IP6-SETTINGS",      N_("IP6-SETTINGS"),      0, NULL, 0},  /* 9 */
+	{"IP6-DNS",           N_("IP6-DNS"),           0, NULL, 0},  /* 10 */
 	{NULL,                NULL,                    0, NULL, 0}
 };
+#if WITH_WIMAX
+#define NMC_FIELDS_DEV_LIST_SECTIONS_ALL     "GENERAL,CAPABILITIES,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4-SETTINGS,IP4-DNS,IP6-SETTINGS,IP6-DNS"
+#define NMC_FIELDS_DEV_LIST_SECTIONS_COMMON  "GENERAL,CAPABILITIES,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,WIMAX-PROPERTIES,NSP,IP4-SETTINGS,IP4-DNS,IP6-SETTINGS,IP6-DNS"
+#else
 #define NMC_FIELDS_DEV_LIST_SECTIONS_ALL     "GENERAL,CAPABILITIES,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4-SETTINGS,IP4-DNS,IP6-SETTINGS,IP6-DNS"
 #define NMC_FIELDS_DEV_LIST_SECTIONS_COMMON  "GENERAL,CAPABILITIES,WIFI-PROPERTIES,AP,WIRED-PROPERTIES,IP4-SETTINGS,IP4-DNS,IP6-SETTINGS,IP6-DNS"
+#endif
 
 /* Available fields for 'dev list' - GENERAL part */
 static NmcOutputField nmc_fields_dev_list_general[] = {
@@ -128,6 +142,21 @@ static NmcOutputField nmc_fields_dev_list_wifi_prop[] = {
 #define NMC_FIELDS_DEV_LIST_WIFI_PROP_ALL     "NAME,WEP,WPA,WPA2,TKIP,CCMP"
 #define NMC_FIELDS_DEV_LIST_WIFI_PROP_COMMON  "NAME,WEP,WPA,WPA2,TKIP,CCMP"
 
+#if WITH_WIMAX
+/* Available fields for 'dev list' - wimax properties part */
+static NmcOutputField nmc_fields_dev_list_wimax_prop[] = {
+	{"NAME",       N_("NAME"),        18, NULL, 0},  /* 0 */
+	{"CTR-FREQ",   N_("CTR-FREQ"),     7, NULL, 0},  /* 1 */
+	{"RSSI",       N_("RSSI"),         5, NULL, 0},  /* 2 */
+	{"CINR",       N_("CINR"),         5, NULL, 0},  /* 3 */
+	{"TX-POW",     N_("TX-POW"),       5, NULL, 0},  /* 4 */
+	{"BSID",       N_("BSID"),        18, NULL, 0},  /* 5 */
+	{NULL,         NULL,               0, NULL, 0}
+};
+#define NMC_FIELDS_DEV_LIST_WIMAX_PROP_ALL     "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID"
+#define NMC_FIELDS_DEV_LIST_WIMAX_PROP_COMMON  "NAME,CTR-FREQ,RSSI,CINR,TX-POW,BSID"
+#endif
+
 /* Available fields for 'dev list' - IPv4 settings part */
 static NmcOutputField nmc_fields_dev_list_ip4_settings[] = {
 	{"NAME",       N_("NAME"),        15, NULL, 0},  /* 0 */
@@ -189,6 +218,23 @@ static NmcOutputField nmc_fields_dev_wifi_list[] = {
 #define NMC_FIELDS_DEV_WIFI_LIST_COMMON        "SSID,BSSID,MODE,FREQ,RATE,SIGNAL,SECURITY,ACTIVE"
 #define NMC_FIELDS_DEV_WIFI_LIST_FOR_DEV_LIST  "NAME,"NMC_FIELDS_DEV_WIFI_LIST_COMMON
 
+#if WITH_WIMAX
+/* Available fields for 'dev wimax list' */
+static NmcOutputField nmc_fields_dev_wimax_list[] = {
+	{"NAME",       N_("NAME"),        15, NULL, 0},  /* 0 */
+	{"NSP",        N_("NSP"),         33, NULL, 0},  /* 1 */
+	{"SIGNAL",     N_("SIGNAL"),       8, NULL, 0},  /* 2 */
+	{"TYPE",       N_("TYPE"),        16, NULL, 0},  /* 3 */
+	{"DEVICE",     N_("DEVICE"),      10, NULL, 0},  /* 4 */
+	{"ACTIVE",     N_("ACTIVE"),       8, NULL, 0},  /* 5 */
+	{"DBUS-PATH",  N_("DBUS-PATH"),   46, NULL, 0},  /* 6 */
+	{NULL,         NULL,               0, NULL, 0}
+};
+#define NMC_FIELDS_DEV_WIMAX_LIST_ALL           "NSP,SIGNAL,TYPE,DEVICE,ACTIVE,DBUS-PATH"
+#define NMC_FIELDS_DEV_WIMAX_LIST_COMMON        "NSP,SIGNAL,TYPE,DEVICE,ACTIVE"
+#define NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST  "NAME,"NMC_FIELDS_DEV_WIMAX_LIST_COMMON
+#endif
+
 
 /* static function prototypes */
 static void usage (void);
@@ -197,7 +243,9 @@ static NMCResultCode do_devices_status (NmCli *nmc, int argc, char **argv);
 static NMCResultCode do_devices_list (NmCli *nmc, int argc, char **argv);
 static NMCResultCode do_device_disconnect (NmCli *nmc, int argc, char **argv);
 static NMCResultCode do_device_wifi (NmCli *nmc, int argc, char **argv);
-
+#if WITH_WIMAX
+static NMCResultCode do_device_wimax (NmCli *nmc, int argc, char **argv);
+#endif
 
 extern GMainLoop *loop;   /* glib main loop variable */
 
@@ -205,12 +253,20 @@ static void
 usage (void)
 {
 	fprintf (stderr,
-	 	 _("Usage: nmcli dev { COMMAND | help }\n\n"
-		 "  COMMAND := { status | list | disconnect | wifi }\n\n"
-		 "  status\n"
-		 "  list [iface <iface>]\n"
-		 "  disconnect iface <iface> [--nowait] [--timeout <timeout>]\n"
-		 "  wifi [list [iface <iface>] [hwaddr <hwaddr>]]\n\n"));
+	         _("Usage: nmcli dev { COMMAND | help }\n\n"
+#if WITH_WIMAX
+	         "  COMMAND := { status | list | disconnect | wifi | wimax }\n\n"
+#else
+	         "  COMMAND := { status | list | disconnect | wifi }\n\n"
+#endif
+	         "  status\n"
+	         "  list [iface <iface>]\n"
+	         "  disconnect iface <iface> [--nowait] [--timeout <timeout>]\n"
+	         "  wifi [list [iface <iface>] [hwaddr <hwaddr>]]\n"
+#if WITH_WIMAX
+	         "  wimax [list [iface <iface>] [nsp <name>]]\n\n"
+#endif
+	         ));
 }
 
 /* quit main loop */
@@ -238,8 +294,14 @@ device_state_to_string (NMDeviceState state)
 		return _("connecting (need authentication)");
 	case NM_DEVICE_STATE_IP_CONFIG:
 		return _("connecting (getting IP configuration)");
+	case NM_DEVICE_STATE_IP_CHECK:
+		return _("connecting (checking IP connectivity)");
+	case NM_DEVICE_STATE_SECONDARIES:
+		return _("connecting (starting secondary connections)");
 	case NM_DEVICE_STATE_ACTIVATED:
 		return _("connected");
+	case NM_DEVICE_STATE_DEACTIVATING:
+		return _("deactivating");
 	case NM_DEVICE_STATE_FAILED:
 		return _("connection failed");
 	default:
@@ -247,28 +309,41 @@ device_state_to_string (NMDeviceState state)
 	}
 }
 
-/* Return device type - use setting names to match with connection types */
+/* Convert device type to string. Use setting names strings to match with
+ * connection type names.
+ */
 static const char *
-get_device_type (NMDevice * device)
+device_type_to_string (NMDevice *device)
 {
-	if (NM_IS_DEVICE_ETHERNET (device))
+	NMDeviceModemCapabilities caps = NM_DEVICE_MODEM_CAPABILITY_NONE;
+
+	switch (nm_device_get_device_type (device)) {
+	case NM_DEVICE_TYPE_ETHERNET:
 		return NM_SETTING_WIRED_SETTING_NAME;
-	else if (NM_IS_DEVICE_WIFI (device))
+	case NM_DEVICE_TYPE_WIFI:
 		return NM_SETTING_WIRELESS_SETTING_NAME;
-	else if (NM_IS_GSM_DEVICE (device))
-		return NM_SETTING_GSM_SETTING_NAME;
-	else if (NM_IS_CDMA_DEVICE (device))
-		return NM_SETTING_CDMA_SETTING_NAME;
-	else if (NM_IS_DEVICE_BT (device))
+	case NM_DEVICE_TYPE_MODEM:
+		caps = nm_device_modem_get_current_capabilities (NM_DEVICE_MODEM (device));
+		if (caps & NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS)
+			return NM_SETTING_GSM_SETTING_NAME;
+		else if (caps & NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO)
+			return NM_SETTING_CDMA_SETTING_NAME;
+		return _("Unknown");
+	case NM_DEVICE_TYPE_BT:
 		return NM_SETTING_BLUETOOTH_SETTING_NAME;
-//	else if (NM_IS_DEVICE_OLPC_MESH (device))
+//	case NM_DEVICE_TYPE_OLPC_MESH:
 //		return NM_SETTING_OLPC_MESH_SETTING_NAME;
-	else
+#if WITH_WIMAX
+	case NM_DEVICE_TYPE_WIMAX:
+		return NM_SETTING_WIMAX_SETTING_NAME;
+#endif
+	default:
 		return _("Unknown");
+	}
 }
 
 static char *
-ap_wpa_rsn_flags_to_string (guint32 flags)
+ap_wpa_rsn_flags_to_string (NM80211ApSecurityFlags flags)
 {
 	char *flags_str[16]; /* Enough space for flags and terminating NULL */
 	char *ret_str;
@@ -342,8 +417,8 @@ ip6_address_as_string (const struct in6_addr *ip)
 		g_string_append_printf (ip6_str, "%02X", ip->s6_addr[0]);
 		for (j = 1; j < 16; j++)
 			g_string_append_printf (ip6_str, " %02X", ip->s6_addr[j]);
-		nm_warning ("%s: error converting IP6 address %s",
-		            __func__, ip6_str->str);
+		g_warning ("%s: error converting IP6 address %s",
+		           __func__, ip6_str->str);
 		g_string_free (ip6_str, TRUE);
 		return NULL;
 	}
@@ -362,7 +437,9 @@ detail_access_point (gpointer data, gpointer user_data)
 	NMAccessPoint *ap = NM_ACCESS_POINT (data);
 	APInfo *info = (APInfo *) user_data;
 	gboolean active = FALSE;
-	guint32 flags, wpa_flags, rsn_flags, freq, bitrate;
+	NM80211ApFlags flags;
+	NM80211ApSecurityFlags wpa_flags, rsn_flags;
+	guint32 freq, bitrate;
 	guint8 strength;
 	const GByteArray *ssid; 
 	const char *hwaddr;
@@ -445,6 +522,54 @@ detail_access_point (gpointer data, gpointer user_data)
 	g_string_free (security_str, TRUE);
 }
 
+#if WITH_WIMAX
+static void
+detail_wimax_nsp (NMWimaxNsp *nsp, NmCli *nmc, NMDevice *dev, int idx)
+{
+	NMDeviceWimax *wimax = NM_DEVICE_WIMAX (dev);
+	char *nsp_name, *quality_str;
+	const char *ntype;
+	gboolean active = FALSE;
+
+	switch (nm_wimax_nsp_get_network_type (nsp)) {
+	case NM_WIMAX_NSP_NETWORK_TYPE_HOME:
+		ntype = _("Home");
+		break;
+	case NM_WIMAX_NSP_NETWORK_TYPE_PARTNER:
+		ntype = _("Partner");
+		break;
+	case NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER:
+		ntype = _("Roaming");
+		break;
+	default:
+		ntype = _("Unknown");
+		break;
+	}
+
+	if (nm_device_get_state (dev) == NM_DEVICE_STATE_ACTIVATED) {
+		if (nsp == nm_device_wimax_get_active_nsp (wimax))
+			active = TRUE;
+	}
+
+	quality_str = g_strdup_printf ("%u", nm_wimax_nsp_get_signal_quality (nsp));
+	nsp_name = g_strdup_printf ("NSP%d", idx); /* NSP */
+
+	nmc->allowed_fields[0].value = nsp_name;
+	nmc->allowed_fields[1].value = nm_wimax_nsp_get_name (nsp);
+	nmc->allowed_fields[2].value = quality_str;
+	nmc->allowed_fields[3].value = ntype;
+	nmc->allowed_fields[4].value = nm_device_get_iface (dev);
+	nmc->allowed_fields[5].value = active ? _("yes") : _("no");
+	nmc->allowed_fields[6].value = nm_object_get_path (NM_OBJECT (nsp));
+
+	nmc->print_fields.flags &= ~NMC_PF_FLAG_MAIN_HEADER_ADD & ~NMC_PF_FLAG_MAIN_HEADER_ONLY & ~NMC_PF_FLAG_FIELD_NAMES; /* Clear header flags */
+	print_fields (nmc->print_fields, nmc->allowed_fields);
+
+	g_free (nsp_name);
+	g_free (quality_str);
+}
+#endif
+
 struct cb_info {
 	NMClient *client;
 	const GPtrArray *active;
@@ -460,7 +585,7 @@ show_device_info (gpointer data, gpointer user_data)
 	char *tmp;
 	const char *hwaddr = NULL;
 	NMDeviceState state = NM_DEVICE_STATE_UNKNOWN;
-	guint32 caps;
+	NMDeviceCapabilities caps;
 	guint32 speed;
 	char *speed_str = NULL;
 	const GArray *array;
@@ -521,10 +646,14 @@ show_device_info (gpointer data, gpointer user_data)
 				hwaddr = nm_device_ethernet_get_hw_address (NM_DEVICE_ETHERNET (device));
 			else if (NM_IS_DEVICE_WIFI (device))
 				hwaddr = nm_device_wifi_get_hw_address (NM_DEVICE_WIFI (device));
+#if WITH_WIMAX
+			else if (NM_IS_DEVICE_WIMAX (device))
+				hwaddr = nm_device_wimax_get_hw_address (NM_DEVICE_WIMAX (device));
+#endif
 
 			nmc->allowed_fields[0].value = nmc_fields_dev_list_sections[0].name;  /* "GENERAL"*/
 			nmc->allowed_fields[1].value = nm_device_get_iface (device);
-			nmc->allowed_fields[2].value = get_device_type (device);
+			nmc->allowed_fields[2].value = device_type_to_string (device);
 			nmc->allowed_fields[3].value = nm_device_get_driver (device) ? nm_device_get_driver (device) : _("(unknown)");
 			nmc->allowed_fields[4].value = hwaddr ? hwaddr : _("unknown)");
 			nmc->allowed_fields[5].value = device_state_to_string (state);
@@ -566,7 +695,7 @@ show_device_info (gpointer data, gpointer user_data)
 
 		/* Wireless specific information */
 		if ((NM_IS_DEVICE_WIFI (device))) {
-			guint32 wcaps;
+			NMDeviceWifiCapabilities wcaps;
 			NMAccessPoint *active_ap = NULL;
 			const char *active_bssid = NULL;
 			const GPtrArray *aps;
@@ -632,6 +761,77 @@ show_device_info (gpointer data, gpointer user_data)
 				was_output = TRUE;
 			}
 		}
+#if WITH_WIMAX
+		else if (NM_IS_DEVICE_WIMAX (device)) {
+			/* WIMAX-PROPERTIES */
+			if (!strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[5].name)) {
+				char *cfreq = NULL, *rssi = NULL, *cinr = NULL, *txpow = NULL;
+				guint tmp_uint;
+				gint tmp_int;
+				const char *bsid;
+
+				nmc->allowed_fields = nmc_fields_dev_list_wimax_prop;
+				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_WIMAX_PROP_ALL, nmc->allowed_fields, NULL);
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+				nmc->allowed_fields[0].value = nmc_fields_dev_list_sections[5].name;  /* "WIMAX-PROPERTIES" */
+
+				/* Center frequency */
+				tmp_uint = nm_device_wimax_get_center_frequency (NM_DEVICE_WIMAX (device));
+				if (tmp_uint)
+					cfreq = g_strdup_printf ("%'.1f MHz", (double) tmp_uint / 1000.0);
+				nmc->allowed_fields[1].value = cfreq ? cfreq : "";
+
+				/* RSSI */
+				tmp_int = nm_device_wimax_get_rssi (NM_DEVICE_WIMAX (device));
+				if (tmp_int)
+					rssi = g_strdup_printf ("%d dBm", tmp_int);
+				nmc->allowed_fields[2].value = rssi ? rssi : "";
+
+				/* CINR */
+				tmp_int = nm_device_wimax_get_cinr (NM_DEVICE_WIMAX (device));
+				if (tmp_int)
+					cinr = g_strdup_printf ("%d dB", tmp_int);
+				nmc->allowed_fields[3].value = cinr ? cinr : "";
+
+				/* TX Power */
+				tmp_int = nm_device_wimax_get_tx_power (NM_DEVICE_WIMAX (device));
+				if (tmp_int)
+					txpow = g_strdup_printf ("%'.2f dBm", (float) tmp_int / 2.0);
+				nmc->allowed_fields[4].value = txpow ? txpow : "";
+
+				/* BSID */
+				bsid = nm_device_wimax_get_bsid (NM_DEVICE_WIMAX (device));
+				nmc->allowed_fields[5].value = bsid ? bsid : "";
+
+				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+				was_output = TRUE;
+			}
+
+			/* section NSP */
+			if (!strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[6].name)) {
+				const GPtrArray *nsps;
+				int g, idx = 1;
+
+				nmc->allowed_fields = nmc_fields_dev_wimax_list;
+				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_WIMAX_LIST_FOR_DEV_LIST, nmc->allowed_fields, NULL);
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+
+				nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (device));
+				for (g = 0; nsps && g < nsps->len; g++) {
+					NMWimaxNsp *nsp = g_ptr_array_index (nsps, g);
+
+					detail_wimax_nsp (nsp, nmc, device, idx++);
+				}
+				was_output = TRUE;
+			}
+		}
+#endif
 
 		/* IP Setup info */
 		if (state == NM_DEVICE_STATE_ACTIVATED) {
@@ -640,7 +840,7 @@ show_device_info (gpointer data, gpointer user_data)
 			GSList *iter;
 
 			/* IP4-SETTINGS */
-			if (cfg4 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[5].name)) {
+			if (cfg4 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[7].name)) {
 				nmc->allowed_fields = nmc_fields_dev_list_ip4_settings;
 				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
 				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_IP4_SETTINGS_ALL, nmc->allowed_fields, NULL);
@@ -660,7 +860,7 @@ show_device_info (gpointer data, gpointer user_data)
 
 					gateway_str = ip4_address_as_string (nm_ip4_address_get_gateway (addr));
 
-					nmc->allowed_fields[0].value = nmc_fields_dev_list_sections[5].name;  /* "IP4-SETTINGS" */
+					nmc->allowed_fields[0].value = nmc_fields_dev_list_sections[7].name;  /* "IP4-SETTINGS" */
 					nmc->allowed_fields[1].value = addr_str;
 					nmc->allowed_fields[2].value = prefix_str;
 					nmc->allowed_fields[3].value = gateway_str;
@@ -674,7 +874,7 @@ show_device_info (gpointer data, gpointer user_data)
 				was_output = TRUE;
 			}
 			/* IP4-DNS */
-			if (cfg4 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[6].name)) {
+			if (cfg4 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[8].name)) {
 				array = nm_ip4_config_get_nameservers (cfg4);
 				if (array) {
 					int i;
@@ -685,7 +885,7 @@ show_device_info (gpointer data, gpointer user_data)
 					print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
 
 					for (i = 0; i < array->len; i++) {
-						char *dns_name = g_strdup_printf ("%s%d", nmc_fields_dev_list_sections[6].name, i+1);
+						char *dns_name = g_strdup_printf ("%s%d", nmc_fields_dev_list_sections[8].name, i+1);
 						tmp = ip4_address_as_string (g_array_index (array, guint32, i));
 						nmc->allowed_fields[0].value = dns_name;  /* "IP4-DNS<num>" */
 						nmc->allowed_fields[1].value = tmp;
@@ -700,7 +900,7 @@ show_device_info (gpointer data, gpointer user_data)
 			}
 
 			/* IP6-SETTINGS */
-			if (cfg6 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[7].name)) {
+			if (cfg6 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[9].name)) {
 				nmc->allowed_fields = nmc_fields_dev_list_ip6_settings;
 				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
 				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_DEV_LIST_IP6_SETTINGS_ALL, nmc->allowed_fields, NULL);
@@ -716,7 +916,7 @@ show_device_info (gpointer data, gpointer user_data)
 					prefix_str = g_strdup_printf ("%d", prefix);
 					gateway_str = ip6_address_as_string (nm_ip6_address_get_gateway (addr));
 
-					nmc->allowed_fields[0].value = nmc_fields_dev_list_sections[7].name;  /* "IP6-SETTINGS" */
+					nmc->allowed_fields[0].value = nmc_fields_dev_list_sections[9].name;  /* "IP6-SETTINGS" */
 					nmc->allowed_fields[1].value = addr_str;
 					nmc->allowed_fields[2].value = prefix_str;
 					nmc->allowed_fields[3].value = gateway_str;
@@ -730,7 +930,7 @@ show_device_info (gpointer data, gpointer user_data)
 				was_output = TRUE;
 			}
 			/* IP6-DNS */
-			if (cfg6 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[8].name)) {
+			if (cfg6 && !strcasecmp (nmc_fields_dev_list_sections[section_idx].name, nmc_fields_dev_list_sections[10].name)) {
 				int i = 1;
 				nmc->allowed_fields = nmc_fields_dev_list_ip6_dns;
 				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
@@ -738,7 +938,7 @@ show_device_info (gpointer data, gpointer user_data)
 				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
 
 				for (iter = (GSList *) nm_ip6_config_get_nameservers (cfg6); iter; iter = g_slist_next (iter)) {
-					char *dns_name = g_strdup_printf ("%s%d", nmc_fields_dev_list_sections[8].name, i++);
+					char *dns_name = g_strdup_printf ("%s%d", nmc_fields_dev_list_sections[10].name, i++);
 
 					tmp = ip6_address_as_string (iter->data);
 					nmc->allowed_fields[0].value = dns_name;  /* "IP6-DNS<num>" */
@@ -762,7 +962,7 @@ static void
 show_device_status (NMDevice *device, NmCli *nmc)
 {
 	nmc->allowed_fields[0].value = nm_device_get_iface (device);
-	nmc->allowed_fields[1].value = get_device_type (device);
+	nmc->allowed_fields[1].value = device_type_to_string (device);
 	nmc->allowed_fields[2].value = device_state_to_string (nm_device_get_state (device));
 	nmc->allowed_fields[3].value = nm_object_get_path (NM_OBJECT (device));
 
@@ -821,6 +1021,9 @@ do_devices_status (NmCli *nmc, int argc, char **argv)
 		goto error;
 	}
 
+	if (!nmc_versions_match (nmc))
+		goto error;
+
 	/* Print headers */
 	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
 	nmc->print_fields.header_name = _("Status of devices");
@@ -880,6 +1083,9 @@ do_devices_list (NmCli *nmc, int argc, char **argv)
 		goto error;
 	}
 
+	if (!nmc_versions_match (nmc))
+		goto error;
+
 	nmc->get_client (nmc);
 	devices = nm_client_get_devices (nmc->client);
 
@@ -1030,6 +1236,9 @@ do_device_disconnect (NmCli *nmc, int argc, char **argv)
 		goto error;
 	}
 
+	if (!nmc_versions_match (nmc))
+		goto error;
+
 	nmc->get_client (nmc);
 	devices = nm_client_get_devices (nmc->client);
 	for (i = 0; devices && (i < devices->len); i++) {
@@ -1155,6 +1364,9 @@ do_device_wifi_list (NmCli *nmc, int argc, char **argv)
 		goto error;
 	}
 
+	if (!nmc_versions_match (nmc))
+		goto error;
+
 	/* Print headers */
 	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
 	nmc->print_fields.header_name = _("WiFi scan list");
@@ -1283,6 +1495,213 @@ do_device_wifi (NmCli *nmc, int argc, char **argv)
 	return nmc->return_value;
 }
 
+#if WITH_WIMAX
+static void
+show_nsp_info (NMDevice *device, NmCli *nmc)
+{
+	const GPtrArray *nsps;
+	int i, idx = 1;
+
+	nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (device));
+	for (i = 0; nsps && i < nsps->len; i++) {
+		NMWimaxNsp *nsp = g_ptr_array_index (nsps, i);
+
+		detail_wimax_nsp (nsp, nmc, device, idx++);
+	}
+}
+
+static NMCResultCode
+do_device_wimax_list (NmCli *nmc, int argc, char **argv)
+{
+	GError *error = NULL;
+	NMDevice *device = NULL;
+	NMWimaxNsp *nsp = NULL;
+	const char *iface = NULL;
+	const char *nsp_user = NULL;
+	const GPtrArray *devices;
+	const GPtrArray *nsps;
+	int i, j;
+	char *fields_str;
+	char *fields_all =    NMC_FIELDS_DEV_WIMAX_LIST_ALL;
+	char *fields_common = NMC_FIELDS_DEV_WIMAX_LIST_COMMON;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	while (argc > 0) {
+		if (strcmp (*argv, "iface") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *argv);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			iface = *argv;
+		} else if (strcmp (*argv, "nsp") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				g_string_printf (nmc->return_text, _("Error: %s argument is missing."), *argv);
+				nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+				goto error;
+			}
+			nsp_user = *argv;
+		} else {
+			fprintf (stderr, _("Unknown parameter: %s\n"), *argv);
+		}
+
+		argc--;
+		argv++;
+	}
+
+	if (!nmc->required_fields || strcasecmp (nmc->required_fields, "common") == 0)
+		fields_str = fields_common;
+	else if (!nmc->required_fields || strcasecmp (nmc->required_fields, "all") == 0)
+		fields_str = fields_all;
+	else
+		fields_str = nmc->required_fields;
+
+	nmc->allowed_fields = nmc_fields_dev_wimax_list;
+	nmc->print_fields.indices = parse_output_fields (fields_str, nmc->allowed_fields, &error);
+
+	if (error) {
+		if (error->code == 0)
+			g_string_printf (nmc->return_text, _("Error: 'dev wimax': %s"), error->message);
+		else
+			g_string_printf (nmc->return_text, _("Error: 'dev wimax': %s; allowed fields: %s"), error->message, NMC_FIELDS_DEV_WIMAX_LIST_ALL);
+		g_error_free (error);
+		nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		goto error;
+	}
+
+	if (!nmc_is_nm_running (nmc, &error)) {
+		if (error) {
+			g_string_printf (nmc->return_text, _("Error: Can't find out if NetworkManager is running: %s."), error->message);
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			g_error_free (error);
+		} else {
+			g_string_printf (nmc->return_text, _("Error: NetworkManager is not running."));
+			nmc->return_value = NMC_RESULT_ERROR_NM_NOT_RUNNING;
+		}
+		goto error;
+	}
+
+	if (!nmc_versions_match (nmc))
+		goto error;
+
+	/* Print headers */
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
+	nmc->print_fields.header_name = _("WiMAX NSP list");
+
+	nmc->get_client (nmc);
+	devices = nm_client_get_devices (nmc->client);
+	if (iface) {
+		/* Device specified - list only NSPs of this interface */
+		for (i = 0; devices && (i < devices->len); i++) {
+			NMDevice *candidate = g_ptr_array_index (devices, i);
+			const char *dev_iface = nm_device_get_iface (candidate);
+
+			if (!strcmp (dev_iface, iface)) {
+				device = candidate;
+				break;
+			}
+		}
+
+		if (!device) {
+		 	g_string_printf (nmc->return_text, _("Error: Device '%s' not found."), iface);
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			goto error;
+		}
+
+		if (NM_IS_DEVICE_WIMAX (device)) {
+			if (nsp_user) {
+				/* Specific NSP requested - list only that */
+				nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (device));
+				for (j = 0, nsp = NULL; nsps && (j < nsps->len); j++) {
+					NMWimaxNsp *candidate_nsp = g_ptr_array_index (nsps, j);
+					const char *candidate_name = nm_wimax_nsp_get_name (candidate_nsp);
+					char *nsp_up;
+
+					nsp_up = g_ascii_strup (nsp_user, -1);
+					if (!strcmp (nsp_up, candidate_name))
+						nsp = candidate_nsp;
+					g_free (nsp_up);
+				}
+				if (!nsp) {
+				 	g_string_printf (nmc->return_text, _("Error: NSP with name '%s' not found."), nsp_user);
+					nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+					goto error;
+				}
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+				detail_wimax_nsp (nsp, nmc, device, 1);
+			} else {
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+				show_nsp_info (device, nmc);
+			}
+		} else {
+		 	g_string_printf (nmc->return_text, _("Error: Device '%s' is not a WiMAX device."), iface);
+			nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+			goto error;
+		}
+	} else {
+		/* List NSPs for all devices */
+		print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+		if (nsp_user) {
+			/* Specific NSP requested - list only that */
+			for (i = 0; devices && (i < devices->len); i++) {
+				NMDevice *dev = g_ptr_array_index (devices, i);
+				int idx = 1;
+
+				if (!NM_IS_DEVICE_WIMAX (dev))
+					continue;
+
+				nsps = nm_device_wimax_get_nsps (NM_DEVICE_WIMAX (dev));
+				for (j = 0, nsp = NULL; nsps && (j < nsps->len); j++) {
+					NMWimaxNsp *candidate_nsp = g_ptr_array_index (nsps, j);
+					const char *candidate_name = nm_wimax_nsp_get_name (candidate_nsp);
+					char *nsp_up;
+
+					nsp_up = g_ascii_strup (nsp_user, -1);
+					if (!strcmp (nsp_up, candidate_name)) {
+						nsp = candidate_nsp;
+						detail_wimax_nsp (nsp, nmc, dev, idx);
+					}
+					g_free (nsp_up);
+				}
+			}
+			if (!nsp) {
+			 	g_string_printf (nmc->return_text, _("Error: Access point with hwaddr '%s' not found."), nsp_user);
+				nmc->return_value = NMC_RESULT_ERROR_UNKNOWN;
+				goto error;
+			}
+		} else {
+			for (i = 0; devices && (i < devices->len); i++) {
+				NMDevice *dev = g_ptr_array_index (devices, i);
+				if (NM_IS_DEVICE_WIMAX (dev))
+					show_nsp_info (dev, nmc);
+			}
+		}
+	}
+
+error:
+	return nmc->return_value;
+}
+
+static NMCResultCode
+do_device_wimax (NmCli *nmc, int argc, char **argv)
+{
+	if (argc == 0)
+		nmc->return_value = do_device_wimax_list (nmc, argc-1, argv+1);
+	else if (argc > 0) {
+		if (matches (*argv, "list") == 0) {
+			nmc->return_value = do_device_wimax_list (nmc, argc-1, argv+1);
+		}
+		else {
+			g_string_printf (nmc->return_text, _("Error: 'dev wimax' command '%s' is not valid."), *argv);
+			nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+		}
+	}
+
+	return nmc->return_value;
+}
+#endif
 
 NMCResultCode
 do_devices (NmCli *nmc, int argc, char **argv)
@@ -1314,6 +1733,13 @@ do_devices (NmCli *nmc, int argc, char **argv)
 				goto opt_error;
 			nmc->return_value = do_device_wifi (nmc, argc-1, argv+1);
 		}
+#if WITH_WIMAX
+		else if (matches (*argv, "wimax") == 0) {
+			if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
+				goto opt_error;
+			nmc->return_value = do_device_wimax (nmc, argc-1, argv+1);
+		}
+#endif
 		else if (strcmp (*argv, "help") == 0) {
 			usage ();
 		}
diff --git a/cli/src/network-manager.c b/cli/src/network-manager.c
index e695c0e4..5ecfde3a 100644
--- a/cli/src/network-manager.c
+++ b/cli/src/network-manager.c
@@ -17,6 +17,8 @@
  * (C) Copyright 2010 - 2011 Red Hat, Inc.
  */
 
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -33,19 +35,27 @@
 /* Available fields for 'nm status' */
 static NmcOutputField nmc_fields_nm_status[] = {
 	{"RUNNING",        N_("RUNNING"),         15, NULL, 0},  /* 0 */
-	{"STATE",          N_("STATE"),           15, NULL, 0},  /* 1 */
-	{"NET-ENABLED",    N_("NET-ENABLED"),     13, NULL, 0},  /* 2 */
-	{"WIFI-HARDWARE",  N_("WIFI-HARDWARE"),   15, NULL, 0},  /* 3 */
-	{"WIFI",           N_("WIFI"),            10, NULL, 0},  /* 4 */
-	{"WWAN-HARDWARE",  N_("WWAN-HARDWARE"),   15, NULL, 0},  /* 5 */
-	{"WWAN",           N_("WWAN"),            10, NULL, 0},  /* 6 */
-	{NULL,             NULL,                   0, NULL, 0}
+	{"VERSION",        N_("VERSION"),         10, NULL, 0},  /* 1 */
+	{"STATE",          N_("STATE"),           15, NULL, 0},  /* 2 */
+	{"NET-ENABLED",    N_("NET-ENABLED"),     13, NULL, 0},  /* 3 */
+	{"WIFI-HARDWARE",  N_("WIFI-HARDWARE"),   15, NULL, 0},  /* 4 */
+	{"WIFI",           N_("WIFI"),            10, NULL, 0},  /* 5 */
+	{"WWAN-HARDWARE",  N_("WWAN-HARDWARE"),   15, NULL, 0},  /* 6 */
+	{"WWAN",           N_("WWAN"),            10, NULL, 0},  /* 7 */
+	{"WIMAX-HARDWARE", N_("WIMAX-HARDWARE"),  15, NULL, 0},  /* 8 */
+	{"WIMAX",          N_("WIMAX"),           10, NULL, 0},  /* 9 */
+	{NULL,             NULL,                  0, NULL, 0}
 };
-#define NMC_FIELDS_NM_STATUS_ALL     "RUNNING,STATE,NET-ENABLED,WIFI-HARDWARE,WIFI,WWAN-HARDWARE,WWAN"
+#if WITH_WIMAX
+#define NMC_FIELDS_NM_STATUS_ALL     "RUNNING,VERSION,STATE,NET-ENABLED,WIFI-HARDWARE,WIFI,WWAN-HARDWARE,WWAN,WIMAX-HARDWARE,WIMAX"
+#else
+#define NMC_FIELDS_NM_STATUS_ALL     "RUNNING,VERSION,STATE,NET-ENABLED,WIFI-HARDWARE,WIFI,WWAN-HARDWARE,WWAN"
+#endif
 #define NMC_FIELDS_NM_STATUS_COMMON  "RUNNING,STATE,WIFI-HARDWARE,WIFI,WWAN-HARDWARE,WWAN"
 #define NMC_FIELDS_NM_NET_ENABLED    "NET-ENABLED"
 #define NMC_FIELDS_NM_WIFI           "WIFI"
 #define NMC_FIELDS_NM_WWAN           "WWAN"
+#define NMC_FIELDS_NM_WIMAX          "WIMAX"
 
 
 extern GMainLoop *loop;
@@ -61,13 +71,21 @@ static void
 usage (void)
 {
 	fprintf (stderr,
-	 	 _("Usage: nmcli nm { COMMAND | help }\n\n"
-		 "  COMMAND := { status | enable | sleep | wifi | wwan }\n\n"
-		 "  status\n"
-		 "  enable [true|false]\n"
-		 "  sleep [true|false]\n"
-		 "  wifi [on|off]\n"
-		 "  wwan [on|off]\n\n"));
+	         _("Usage: nmcli nm { COMMAND | help }\n\n"
+#if WITH_WIMAX
+	         "  COMMAND := { status | enable | sleep | wifi | wwan | wimax }\n\n"
+#else
+	         "  COMMAND := { status | enable | sleep | wifi | wwan }\n\n"
+#endif
+	         "  status\n"
+	         "  enable [true|false]\n"
+	         "  sleep [true|false]\n"
+	         "  wifi [on|off]\n"
+	         "  wwan [on|off]\n"
+#if WITH_WIMAX
+	         "  wimax [on|off]\n\n"
+#endif
+	         ));
 }
 
 /* quit main loop */
@@ -85,8 +103,14 @@ nm_state_to_string (NMState state)
 		return _("asleep");
 	case NM_STATE_CONNECTING:
 		return _("connecting");
-	case NM_STATE_CONNECTED:
+	case NM_STATE_CONNECTED_LOCAL:
+		return _("connected (local only)");
+	case NM_STATE_CONNECTED_SITE:
+		return _("connected (site only)");
+	case NM_STATE_CONNECTED_GLOBAL:
 		return _("connected");
+	case NM_STATE_DISCONNECTING:
+		return _("disconnecting");
 	case NM_STATE_DISCONNECTED:
 		return _("disconnected");
 	case NM_STATE_UNKNOWN:
@@ -103,6 +127,9 @@ show_nm_status (NmCli *nmc)
 	const char *net_enabled_str;
 	const char *wireless_hw_enabled_str, *wireless_enabled_str;
 	const char *wwan_hw_enabled_str, *wwan_enabled_str;
+#if WITH_WIMAX
+	const char *wimax_hw_enabled_str, *wimax_enabled_str;
+#endif
 	GError *error = NULL;
 	const char *fields_str;
 	const char *fields_all =    NMC_FIELDS_NM_STATUS_ALL;
@@ -131,12 +158,11 @@ show_nm_status (NmCli *nmc)
 		return nmc->return_value;
 	}
 
-	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
-	nmc->print_fields.header_name = _("NetworkManager status");
-	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
-
 	nm_running = nmc_is_nm_running (nmc, NULL);
 	if (nm_running) {
+		if (!nmc_versions_match (nmc))
+			goto error;
+
 		nmc->get_client (nmc); /* create NMClient */
 		state = nm_client_get_state (nmc->client);
 		net_enabled_str = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled");
@@ -144,22 +170,44 @@ show_nm_status (NmCli *nmc)
 		wireless_enabled_str = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled");
 		wwan_hw_enabled_str = nm_client_wwan_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled");
 		wwan_enabled_str = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+#if WITH_WIMAX
+		wimax_hw_enabled_str = nm_client_wimax_hardware_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+		wimax_enabled_str = nm_client_wimax_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+#endif
 	} else {
-		net_enabled_str = wireless_hw_enabled_str = wireless_enabled_str = wwan_hw_enabled_str = wwan_enabled_str = _("unknown");
+#if WITH_WIMAX
+		net_enabled_str = wireless_hw_enabled_str = wireless_enabled_str =
+		wwan_hw_enabled_str = wwan_enabled_str = wimax_hw_enabled_str = wimax_enabled_str = _("unknown");
+#else
+		net_enabled_str = wireless_hw_enabled_str = wireless_enabled_str =
+		wwan_hw_enabled_str = wwan_enabled_str = _("unknown");
+#endif
 	}
 
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
+	nmc->print_fields.header_name = _("NetworkManager status");
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
 	nmc->allowed_fields[0].value = nm_running ? _("running") : _("not running");
-	nmc->allowed_fields[1].value = nm_state_to_string (state);
-	nmc->allowed_fields[2].value = net_enabled_str;
-	nmc->allowed_fields[3].value = wireless_hw_enabled_str;
-	nmc->allowed_fields[4].value = wireless_enabled_str;
-	nmc->allowed_fields[5].value = wwan_hw_enabled_str;
-	nmc->allowed_fields[6].value = wwan_enabled_str;
+	nmc->allowed_fields[1].value = nm_client_get_version (nmc->client);
+	nmc->allowed_fields[2].value = nm_state_to_string (state);
+	nmc->allowed_fields[3].value = net_enabled_str;
+	nmc->allowed_fields[4].value = wireless_hw_enabled_str;
+	nmc->allowed_fields[5].value = wireless_enabled_str;
+	nmc->allowed_fields[6].value = wwan_hw_enabled_str;
+	nmc->allowed_fields[7].value = wwan_enabled_str;
+#if WITH_WIMAX
+	nmc->allowed_fields[8].value = wimax_hw_enabled_str;
+	nmc->allowed_fields[9].value = wimax_enabled_str;
+#endif
 
 	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
 	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
 
 	return NMC_RESULT_SUCCESS;
+
+error:
+	return nmc->return_value;
 }
 
 /* libnm-glib doesn't provide API fro Sleep method - implement D-Bus call ourselves */
@@ -207,6 +255,9 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
 	gboolean enable_net;
 	gboolean enable_wifi;
 	gboolean enable_wwan;
+#if WITH_WIMAX
+	gboolean enable_wimax;
+#endif
 	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
 	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
 	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
@@ -242,9 +293,9 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
 
 				if (nmc_is_nm_running (nmc, NULL)) {
 					nmc->get_client (nmc); /* create NMClient */
-					nmc->allowed_fields[2].value = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+					nmc->allowed_fields[3].value = nm_client_networking_get_enabled (nmc->client) ? _("enabled") : _("disabled");
 				} else
-					nmc->allowed_fields[2].value = _("unknown");
+					nmc->allowed_fields[3].value = _("unknown");
 				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
 				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
 			} else {
@@ -297,9 +348,9 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
 
 				if (nmc_is_nm_running (nmc, NULL)) {
 					nmc->get_client (nmc); /* create NMClient */
-					nmc->allowed_fields[4].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+					nmc->allowed_fields[5].value = nm_client_wireless_get_enabled (nmc->client) ? _("enabled") : _("disabled");
 				} else
-					nmc->allowed_fields[4].value = _("unknown");
+					nmc->allowed_fields[5].value = _("unknown");
 				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
 				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
 			} else {
@@ -335,9 +386,9 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
 
 				if (nmc_is_nm_running (nmc, NULL)) {
 					nmc->get_client (nmc); /* create NMClient */
-					nmc->allowed_fields[6].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+					nmc->allowed_fields[7].value = nm_client_wwan_get_enabled (nmc->client) ? _("enabled") : _("disabled");
 				} else
-					nmc->allowed_fields[6].value = _("unknown");
+					nmc->allowed_fields[7].value = _("unknown");
 				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
 				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
 			} else {
@@ -354,6 +405,46 @@ do_network_manager (NmCli *nmc, int argc, char **argv)
 				nm_client_wwan_set_enabled (nmc->client, enable_wwan);
 			}
 		}
+#if WITH_WIMAX
+		else if (matches (*argv, "wimax") == 0) {
+			if (next_arg (&argc, &argv) != 0) {
+				if (!nmc_terse_option_check (nmc->print_output, nmc->required_fields, &error))
+					goto opt_error;
+				/* no argument, show current WiMAX state */
+				if (nmc->required_fields && strcasecmp (nmc->required_fields, "WIMAX")) {
+					g_string_printf (nmc->return_text, _("Error: '--fields' value '%s' is not valid here; allowed fields: %s"),
+					                 nmc->required_fields, NMC_FIELDS_NM_WIMAX);
+					nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+					goto end;
+				}
+				nmc->allowed_fields = nmc_fields_nm_status;
+				nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_NM_WIMAX, nmc->allowed_fields, NULL);
+				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_MAIN_HEADER_ADD | NMC_PF_FLAG_FIELD_NAMES;
+				nmc->print_fields.header_name = _("WiMAX enabled");
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print header */
+
+				if (nmc_is_nm_running (nmc, NULL)) {
+					nmc->get_client (nmc); /* create NMClient */
+					nmc->allowed_fields[9].value = nm_client_wimax_get_enabled (nmc->client) ? _("enabled") : _("disabled");
+				} else
+					nmc->allowed_fields[9].value = _("unknown");
+				nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag;
+				print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+			} else {
+				if (!strcmp (*argv, "on"))
+					enable_wimax = TRUE;
+				else if (!strcmp (*argv, "off"))
+					enable_wimax = FALSE;
+				else {
+					g_string_printf (nmc->return_text, _("Error: invalid 'wimax' parameter: '%s'."), *argv);
+					nmc->return_value = NMC_RESULT_ERROR_USER_INPUT;
+					goto end;
+				}
+				nmc->get_client (nmc); /* create NMClient */
+				nm_client_wimax_set_enabled (nmc->client, enable_wimax);
+			}
+		}
+#endif
 		else if (strcmp (*argv, "help") == 0) {
 			usage ();
 		}
diff --git a/cli/src/nmcli.c b/cli/src/nmcli.c
index 4a548024..f51779e6 100644
--- a/cli/src/nmcli.c
+++ b/cli/src/nmcli.c
@@ -33,9 +33,6 @@
 #include <nm-client.h>
 #include <nm-setting-connection.h>
 #include <nm-remote-settings.h>
-#include <nm-remote-settings-system.h>
-#include <nm-settings-interface.h>
-#include <nm-settings-connection-interface.h>
 
 #include "nmcli.h"
 #include "utils.h"
@@ -71,6 +68,7 @@ usage (const char *prog_name)
 	         "  -m[ode] tabular|multiline                  output mode\n"
 	         "  -f[ields] <field1,field2,...>|all|common   specify fields to output\n"
 	         "  -e[scape] yes|no                           escape columns separators in values\n"
+	         "  -n[ocheck]                                 don't check nmcli and NetworkManager versions\n"
 	         "  -v[ersion]                                 show program version\n"
 	         "  -h[elp]                                    print this help\n\n"
 	         "OBJECT\n"
@@ -203,6 +201,8 @@ parse_command_line (NmCli *nmc, int argc, char **argv)
 				return nmc->return_value;
 			}
 			nmc->required_fields = g_strdup (argv[1]);
+		} else if (matches (opt, "-nocheck") == 0) {
+			nmc->nocheck_ver = TRUE;
 		} else if (matches (opt, "-version") == 0) {
 			printf (_("nmcli tool, version %s\n"), NMCLI_VERSION);
 			return NMC_RESULT_SUCCESS;
@@ -275,13 +275,8 @@ nmc_init (NmCli *nmc)
 	nmc->timeout = 10;
 
 	nmc->system_settings = NULL;
-	nmc->user_settings = NULL;
-
 	nmc->system_settings_running = FALSE;
-	nmc->user_settings_running = FALSE;
-
 	nmc->system_connections = NULL;
-	nmc->user_connections = NULL;
 
 	nmc->should_wait = FALSE;
 	nmc->nowait_flag = TRUE;
@@ -292,6 +287,7 @@ nmc_init (NmCli *nmc)
 	nmc->required_fields = NULL;
 	nmc->allowed_fields = NULL;
 	memset (&nmc->print_fields, '\0', sizeof (NmcPrintFields));
+	nmc->nocheck_ver = FALSE;
 }
 
 static void
@@ -302,10 +298,7 @@ nmc_cleanup (NmCli *nmc)
 	g_string_free (nmc->return_text, TRUE);
 
 	if (nmc->system_settings) g_object_unref (nmc->system_settings);
-	if (nmc->user_settings) g_object_unref (nmc->user_settings);
-
 	g_slist_free (nmc->system_connections);
-	g_slist_free (nmc->user_connections);
 
 	g_free (nmc->required_fields);
 	if (nmc->print_fields.indices)
diff --git a/cli/src/nmcli.h b/cli/src/nmcli.h
index a208e79e..90091b36 100644
--- a/cli/src/nmcli.h
+++ b/cli/src/nmcli.h
@@ -24,7 +24,6 @@
 
 #include <nm-client.h>
 #include <nm-remote-settings.h>
-#include <nm-remote-settings-system.h>
 
 /* nmcli exit codes */
 typedef enum {
@@ -50,7 +49,10 @@ typedef enum {
 	NMC_RESULT_ERROR_DEV_DISCONNECT = 6,
 
 	/* NetworkManager is not running */
-	NMC_RESULT_ERROR_NM_NOT_RUNNING = 7
+	NMC_RESULT_ERROR_NM_NOT_RUNNING = 7,
+
+	/* nmcli and NetworkManager versions mismatch */
+	NMC_RESULT_ERROR_VERSIONS_MISMATCH = 8
 } NMCResultCode;
 
 typedef enum {
@@ -95,14 +97,9 @@ typedef struct _NmCli {
 
 	int timeout;                                      /* Operation timeout */
 
-	NMRemoteSettingsSystem *system_settings;          /* System settings */
-	NMRemoteSettings *user_settings;                  /* User settings */
-
+	NMRemoteSettings *system_settings;                /* System settings */
 	gboolean system_settings_running;                 /* Is system settings service running? */
-	gboolean user_settings_running;                   /* Is user settings service running? */
-
 	GSList *system_connections;                       /* List of system connections */
-	GSList *user_connections;                         /* List of user connections */
 
 	gboolean should_wait;                             /* Indication that nmcli should not end yet */
 	gboolean nowait_flag;                             /* '--nowait' option; used for passing to callbacks */
@@ -113,6 +110,7 @@ typedef struct _NmCli {
 	char *required_fields;                            /* Required fields in output: '--fields' option */
 	NmcOutputField *allowed_fields;                   /* Array of allowed fields for particular commands */
 	NmcPrintFields print_fields;                      /* Structure with field indices to print */
+	gboolean nocheck_ver;                             /* Don't check nmcli and NM versions: option '--nocheck' */
 } NmCli;
 
 #endif /* NMC_NMCLI_H */
diff --git a/cli/src/settings.c b/cli/src/settings.c
index 8b628764..c2385370 100644
--- a/cli/src/settings.c
+++ b/cli/src/settings.c
@@ -17,6 +17,8 @@
  * (C) Copyright 2010 Red Hat, Inc.
  */
 
+#include "config.h"
+
 #include <glib.h>
 #include <glib/gi18n.h>
 #include <libnm-util/nm-utils.h>
@@ -93,8 +95,7 @@ static NmcOutputField nmc_fields_setting_8021X[] = {
 	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, 20),           /* 18 */
 	SETTING_FIELD (NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, 20),  /* 19 */
 	SETTING_FIELD (NM_SETTING_802_1X_PIN, 8),                           /* 20 */
-	SETTING_FIELD (NM_SETTING_802_1X_PSK, 8),                           /* 21 */
-	SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS, 17),              /* 22 */
+	SETTING_FIELD (NM_SETTING_802_1X_SYSTEM_CA_CERTS, 17),              /* 21 */
 	{NULL, NULL, 0, NULL, 0}
 };
 #define NMC_FIELDS_SETTING_802_1X_ALL     "name"","\
@@ -118,7 +119,6 @@ static NmcOutputField nmc_fields_setting_8021X[] = {
                                           NM_SETTING_802_1X_PHASE2_PRIVATE_KEY","\
                                           NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD","\
                                           NM_SETTING_802_1X_PIN","\
-                                          NM_SETTING_802_1X_PSK","\
                                           NM_SETTING_802_1X_SYSTEM_CA_CERTS
 #define NMC_FIELDS_SETTING_802_1X_COMMON  NMC_FIELDS_SETTING_802_1X_ALL
 
@@ -402,6 +402,18 @@ static NmcOutputField nmc_fields_setting_vpn[] = {
                                        NM_SETTING_VPN_SECRETS
 #define NMC_FIELDS_SETTING_VPN_COMMON  NMC_FIELDS_SETTING_VPN_ALL
 
+/* Available fields for NM_SETTING_WIMAX_SETTING_NAME */
+static NmcOutputField nmc_fields_setting_wimax[] = {
+	SETTING_FIELD ("name", 6),                                         /* 0 */
+	SETTING_FIELD (NM_SETTING_WIMAX_MAC_ADDRESS, 19),                  /* 1 */
+	SETTING_FIELD (NM_SETTING_WIMAX_NETWORK_NAME, 40),                 /* 2 */
+	{NULL, NULL, 0, NULL, 0}
+};
+#define NMC_FIELDS_SETTING_WIMAX_ALL     "name"","\
+                                         NM_SETTING_WIMAX_MAC_ADDRESS","\
+                                         NM_SETTING_WIMAX_NETWORK_NAME
+#define NMC_FIELDS_SETTING_WIMAX_COMMON  NMC_FIELDS_SETTING_WIMAX_ALL
+
 
 static char *
 wep_key_type_to_string (NMWepKeyType type)
@@ -648,8 +660,7 @@ setting_802_1X_details (NMSetting *setting, NmCli *nmc)
 	nmc->allowed_fields[18].value = phase2_private_key_str;
 	nmc->allowed_fields[19].value = nm_setting_802_1x_get_phase2_private_key_password (s_8021X);
 	nmc->allowed_fields[20].value = nm_setting_802_1x_get_pin (s_8021X);
-	nmc->allowed_fields[21].value = nm_setting_802_1x_get_psk (s_8021X);
-	nmc->allowed_fields[22].value = nm_setting_802_1x_get_system_ca_certs (s_8021X) ? _("yes") : _("no");
+	nmc->allowed_fields[21].value = nm_setting_802_1x_get_system_ca_certs (s_8021X) ? _("yes") : _("no");
 
 	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
 	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
@@ -1381,3 +1392,37 @@ setting_vpn_details (NMSetting *setting, NmCli *nmc)
 	return TRUE;
 }
 
+gboolean
+setting_wimax_details (NMSetting *setting, NmCli *nmc)
+{
+	NMSettingWimax *s_wimax;
+	const GByteArray *mac;
+	char *device_mac_str = NULL;
+	guint32 mode_flag = (nmc->print_output == NMC_PRINT_PRETTY) ? NMC_PF_FLAG_PRETTY : (nmc->print_output == NMC_PRINT_TERSE) ? NMC_PF_FLAG_TERSE : 0;
+	guint32 multiline_flag = nmc->multiline_output ? NMC_PF_FLAG_MULTILINE : 0;
+	guint32 escape_flag = nmc->escape_values ? NMC_PF_FLAG_ESCAPE : 0;
+
+	g_return_val_if_fail (NM_IS_SETTING_WIMAX (setting), FALSE);
+	s_wimax = (NMSettingWimax *) setting;
+
+	nmc->allowed_fields = nmc_fields_setting_wimax;
+	nmc->print_fields.indices = parse_output_fields (NMC_FIELDS_SETTING_WIMAX_ALL, nmc->allowed_fields, NULL);
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_FIELD_NAMES;
+	print_fields (nmc->print_fields, nmc->allowed_fields);  /* Print field names */
+
+	mac = nm_setting_wimax_get_mac_address (s_wimax);
+	if (mac)
+		device_mac_str = g_strdup_printf ("%02X:%02X:%02X:%02X:%02X:%02X", mac->data[0], mac->data[1], mac->data[2], mac->data[3], mac->data[4], mac->data[5]);
+
+	nmc->allowed_fields[0].value = NM_SETTING_WIMAX_SETTING_NAME;
+	nmc->allowed_fields[1].value = device_mac_str;
+	nmc->allowed_fields[2].value = nm_setting_wimax_get_network_name (s_wimax);
+
+	nmc->print_fields.flags = multiline_flag | mode_flag | escape_flag | NMC_PF_FLAG_SECTION_PREFIX;
+	print_fields (nmc->print_fields, nmc->allowed_fields); /* Print values */
+
+	g_free (device_mac_str);
+
+	return TRUE;
+}
+
diff --git a/cli/src/settings.h b/cli/src/settings.h
index aec71551..4901bf27 100644
--- a/cli/src/settings.h
+++ b/cli/src/settings.h
@@ -35,6 +35,7 @@
 #include <nm-setting-bluetooth.h>
 #include <nm-setting-olpc-mesh.h>
 #include <nm-setting-vpn.h>
+#include <nm-setting-wimax.h>
 
 #include "nmcli.h"
 #include "utils.h"
@@ -55,5 +56,6 @@ gboolean setting_cdma_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_bluetooth_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_olpc_mesh_details (NMSetting *setting, NmCli *nmc);
 gboolean setting_vpn_details (NMSetting *setting, NmCli *nmc);
+gboolean setting_wimax_details (NMSetting *setting, NmCli *nmc);
 
 #endif /* NMC_SETTINGS_H */
diff --git a/cli/src/utils.c b/cli/src/utils.c
index bcc51bbd..3c4e4f36 100644
--- a/cli/src/utils.c
+++ b/cli/src/utils.c
@@ -17,6 +17,9 @@
  * (C) Copyright 2010 - 2011 Red Hat, Inc.
  */
 
+/* Generated configuration file */
+#include "config.h"
+
 #include <stdio.h>
 #include <string.h>
 
@@ -351,3 +354,49 @@ done:
 	return has_owner;
 }
 
+/*
+* Compare versions of nmcli and NM daemon.
+* Return: TRUE  - the versions match (when only major and minor match, print a warning)
+*         FALSE - versions mismatch
+*/
+gboolean
+nmc_versions_match (NmCli *nmc)
+{
+	const char *nm_ver = NULL;
+	const char *dot;
+	gboolean match = FALSE;
+
+	g_return_val_if_fail (nmc != NULL, FALSE);
+
+	/* --nocheck option - don't compare the versions */
+	if (nmc->nocheck_ver)
+		return TRUE;
+
+	nmc->get_client (nmc);
+	nm_ver = nm_client_get_version (nmc->client);
+	if (nm_ver) {
+		if (!strcmp (nm_ver, VERSION))
+			match = TRUE;
+		else {
+			dot = strchr (nm_ver, '.');
+			if (dot) {
+				dot = strchr (dot + 1, '.');
+				if (dot && !strncmp (nm_ver, VERSION, dot-nm_ver)) {
+					fprintf(stderr,
+					        _("Warning: nmcli (%s) and NetworkManager (%s) versions don't match. Use --nocheck to suppress the warning.\n"),
+					        VERSION, nm_ver);
+					match = TRUE;
+				}
+			}
+		}
+	}
+
+	if (!match) {
+		g_string_printf (nmc->return_text, _("Error: nmcli (%s) and NetworkManager (%s) versions don't match. Force execution using --nocheck, but the results are unpredictable."),
+		                 VERSION, nm_ver ? nm_ver : _("unknown"));
+		nmc->return_value = NMC_RESULT_ERROR_VERSIONS_MISMATCH;
+	}
+
+	return match;
+}
+
diff --git a/cli/src/utils.h b/cli/src/utils.h
index da058f27..467054a2 100644
--- a/cli/src/utils.h
+++ b/cli/src/utils.h
@@ -33,5 +33,6 @@ GArray *parse_output_fields (const char *fields_str, const NmcOutputField fields
 gboolean nmc_terse_option_check (NMCPrintOutput print_output, const char *fields, GError **error);
 void print_fields (const NmcPrintFields fields, const NmcOutputField field_values[]);
 gboolean nmc_is_nm_running (NmCli *nmc, GError **error);
+gboolean nmc_versions_match (NmCli *nmc);
 
 #endif /* NMC_UTILS_H */