diff -uNr netmgmt-1.1.0/cli/netmgrcli.c netmgmt-1.1.0-2/cli/netmgrcli.c
--- netmgmt-1.1.0/cli/netmgrcli.c	2017-03-11 11:58:08.000000000 +0000
+++ netmgmt-1.1.0-2/cli/netmgrcli.c	2017-04-18 22:12:32.028012184 +0000
@@ -1116,89 +1116,6 @@
 }
 
 
-static struct option fwRuleOptions[] =
-{
-    {"add",          no_argument,          0,    'a'},
-    {"del",          no_argument,          0,    'd'},
-    {"get",          no_argument,          0,    'g'},
-    {"rule",         required_argument,    0,    'r'},
-    {0, 0, 0, 0}
-};
-
-static uint32_t
-cli_fw_rule(
-    int argc,
-    char **argv,
-    PNETMGR_CMD pCmd
-    )
-{
-    uint32_t err = 0, valid_rule = 0;
-    int nOptionIndex = 0, nOption = 0;
-    CMD_OP op = OP_INVALID;
-
-    opterr = 0;
-    optind = 1;
-    while (1)
-    {
-        nOption = getopt_long(argc,
-                              argv,
-                              "adgr:",
-                              fwRuleOptions,
-                              &nOptionIndex);
-        if (nOption == -1)
-            break;
-
-        switch(nOption)
-        {
-            case 'a':
-                op = OP_ADD;
-                break;
-            case 'd':
-                op = OP_DEL;
-                break;
-            case 'g':
-                op = OP_GET;
-                break;
-            case 'r':
-                if (strlen(optarg) > 0)
-                {
-                    err = netmgrcli_alloc_keyvalue("rule", optarg, pCmd);
-                    valid_rule = 1;
-                }
-                break;
-            case '?':
-                /* Option not handled here. Ignore. */
-                break;
-        }
-        bail_on_error(err);
-    }
-
-    if ((op == OP_INVALID) ||
-        (((op == OP_DEL) || (op == OP_ADD)) && (valid_rule == 0)))
-    {
-        err = EDOM;
-        bail_on_error(err);
-    }
-
-    pCmd->id = CMD_FW_RULE;
-    pCmd->op = op;
-
-cleanup:
-    return err;
-
-error:
-    pCmd->op = OP_INVALID;
-    if(err == EDOM)
-    {
-        fprintf(stderr,
-                "Usage:\nfw_rule --get\n"
-                 "fw_rule --add --rule <Firewall Rule>\n"
-                 "fw_rule --del --rule <Firewall Rule>\n");
-    }
-    goto cleanup;
-}
-
-
 static struct option hostnameOptions[] =
 {
     {"set",          no_argument,          0,    's'},
@@ -1646,35 +1563,35 @@
      cli_link_info,
      "--set --interface <interface name> --mode <manual|auto> --state <up|down> "
      "--macaddr <mac_address> --mtu <mtu>",
-     "get or set link mac addr, mtu, state, mode per interface"
+     "get or set interface mac address, mtu, link state, or link mode"
     },
     {"ip4_address",
      cli_ip4_address,
      "--set --interface <interface name> --mode <dhcp|static|none> "
      "--addr <IPv4Address/prefix> --gateway <default gateway>",
-     "get or set IPv4 address and default gateway for interface"
+     "get or set interface IPv4 address and optionally default gateway"
     },
     {"ip6_address",
      cli_ip6_address,
      "--add|--del|--set --interface <interface name> --dhcp <1|0> --autoconf <1|0> "
      "--addrlist <IPv6 Address/Prefix list> --gateway <Default IPv6 gateway>",
-     "add or delete IPv6 addresses and default gateway for interface"
+     "add or delete IPv6 address(es) and optionally default gateway for interface"
     },
     {"ip_route",
      cli_ip_route,
      "--add|--del --interface <interface name> --destination <Dest Network/Prefix> "
      "--gateway <Gateway IP Addr> -- metric <Route Metric> --scope <scope>",
-     "add or delete IP routes for the interface"
+     "add or delete static IP route for the interface"
     },
     {"dns_servers",
      cli_dns_servers,
      "--set --mode <dhcp|static> --servers <DNS servers list>",
-     "get or set DNS mode, DNS servers list"
+     "get or set DNS mode, list of DNS servers"
     },
     {"dns_domains",
      cli_dns_domains,
      "--set --del --add --domains <Domains list>",
-     "get or set DNS domains list"
+     "get or set list of DNS domains"
     },
     {"dhcp_duid",
      cli_dhcp_duid,
@@ -1691,26 +1608,21 @@
      "--set --del --add --servers <NTP servers list>",
      "get or set NTP servers list"
     },
-    {"fw_rule",
-     cli_fw_rule,
-     "--add --del --rule <Firewall Rule>",
-     "add or delete firewall rules"
-    },
     {"hostname",
      cli_hostname,
-     "--set --name <Hostname>",
-     "get or set hostname"
+     "--set --name <hostname>",
+     "get or set system hostname"
     },
     {"wait_for_link",
      cli_wait_for_link,
      "--interface <interface name> --timeout <timeout>",
-     "waits until timeout for the interface to up"
+     "wait for the interface to come up"
     },
     {"wait_for_ip",
      cli_wait_for_ip,
      "--interface <interface name> --timeout <timeout> --addrtype <ipv4,ipv6,"
      "static_ipv4,static_ipv6,dhcp_ipv4,dhcp_ipv6,auto_ipv6,link_local_ipv6>",
-     "waits until timeout for the interface to get a valid IP address"
+     "wait for the interface to acquire a valid IP address"
     },
     {"error_info",
      cli_err_info,
@@ -1721,7 +1633,7 @@
      cli_net_info,
      "--set --object <ifname or filename> --paramname <param name> "
      "--paramvalue <value>",
-     "get or set network parameters"
+     "get or set network configuration parameters"
     },
 };
 
@@ -1736,14 +1648,13 @@
     fprintf(stdout, "For version: netmgr -v or netmgr --version\n");
     fprintf(stdout, "\n");
 
-    fprintf(stdout, "List of commands\n");
+    fprintf(stdout, "List of commands:\n");
     fprintf(stdout, "\n");
 
     for(i = 0; i < nCmdCount; ++i)
     {
-        fprintf(stdout, "%s %s\t%s\n",
+        fprintf(stdout, "%s \t%s\n",
                 cmdMap[i].pszCmdName,
-                cmdMap[i].pszParams,
                 cmdMap[i].pszHelpMessage);
     }
     return 0;
diff -uNr netmgmt-1.1.0/include/public/netmgr.h netmgmt-1.1.0-2/include/public/netmgr.h
--- netmgmt-1.1.0/include/public/netmgr.h	2017-03-11 11:58:08.000000000 +0000
+++ netmgmt-1.1.0-2/include/public/netmgr.h	2017-04-18 22:12:32.028012184 +0000
@@ -15,6 +15,10 @@
 #ifndef __NETMGR_H__
 #define __NETMGR_H__
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #define SET_FLAG(v, f) (v) = ((v) | (f))
 #define CLEAR_FLAG(v, f) (v) = ((v) & ~(f))
 #define TEST_FLAG(v, f) (((v) & (f)) != 0)
@@ -198,6 +202,10 @@
     uint32_t nmErrCode
 );
 
+uint32_t
+nm_touch_network_conf_file(
+    const char *pszInterfaceName,
+    char **ppszFilename);
 
 /*
  * Interface configuration APIs
@@ -574,6 +582,9 @@
 uint32_t
 nm_reload_firewall_config();
 
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* __NETMGR_H__ */
 
diff -uNr netmgmt-1.1.0/src/netmgr.c netmgmt-1.1.0-2/src/netmgr.c
--- netmgmt-1.1.0/src/netmgr.c	2017-03-11 11:58:08.000000000 +0000
+++ netmgmt-1.1.0-2/src/netmgr.c	2017-04-18 22:12:32.036012184 +0000
@@ -608,6 +608,48 @@
     goto cleanup;
 }
 
+uint32_t
+nm_touch_network_conf_file(
+    const char *pszInterfaceName,
+    char **ppszFilename)
+{
+    uint32_t err = 0;
+    char *pszCfgFileName = NULL;
+    int lockId;
+
+    err = nm_acquire_write_lock(0, &lockId);
+    bail_on_error(err);
+
+    if (!IS_VALID_INTERFACE_NAME(pszInterfaceName))
+    {
+        err = NM_ERR_INVALID_INTERFACE;
+        bail_on_error(err);
+    }
+
+    err = nm_get_network_conf_filename_for_update(pszInterfaceName,
+                                                  &pszCfgFileName);
+    bail_on_error(err);
+
+    if (ppszFilename != NULL)
+    {
+        *ppszFilename = pszCfgFileName;
+    }
+    else
+    {
+        netmgr_free(pszCfgFileName);
+    }
+
+cleanup:
+    nm_release_write_lock(lockId);
+    return err;
+error:
+    if (ppszFilename != NULL)
+    {
+        *ppszFilename = NULL;
+    }
+    netmgr_free(pszCfgFileName);
+    goto cleanup;
+}
 
 /*
  * Interface configuration APIs
@@ -1311,9 +1353,12 @@
         bail_on_error(err);
     }
 
-    err = netmgr_alloc_string_printf(&pszArpingCmd, "%s %s -I %s %s",
-                                     ARPING_COMMAND, pszCommandOptions,
-                                     pszInterfaceName, pszDestIPv4Addr);
+    err = netmgr_alloc_string_printf(&pszArpingCmd,
+                                     "%s %s -I %s %s",
+                                     ARPING_COMMAND,
+                                     pszCommandOptions,
+                                     pszInterfaceName,
+                                     pszDestIPv4Addr);
     bail_on_error(err);
 
     err = nm_run_command(pszArpingCmd);
@@ -2912,8 +2957,8 @@
     char **ppszIpAddrList = NULL, **ppszGwAddrList = NULL;
     size_t ipCount, gwCount;
 
-    if (!IS_VALID_INTERFACE_NAME(pszInterfaceName) || !pMode ||
-        !ppszIPv4AddrPrefix || !ppszIPv4Gateway)
+    if (!IS_VALID_INTERFACE_NAME(pszInterfaceName) ||
+        !(pMode || ppszIPv4AddrPrefix || ppszIPv4Gateway))
     {
         err = NM_ERR_INVALID_PARAMETER;
         bail_on_error(err);
@@ -3001,9 +3046,18 @@
         bail_on_error(err);
     }
 
-    *pMode = ip4Mode;
-    *ppszIPv4AddrPrefix = pszIPv4AddrPrefix;
-    *ppszIPv4Gateway = pszIPv4Gateway;
+    if (pMode)
+    {
+        *pMode = ip4Mode;
+    }
+    if (ppszIPv4AddrPrefix)
+    {
+        *ppszIPv4AddrPrefix = pszIPv4AddrPrefix;
+    }
+    if (ppszIPv4Gateway)
+    {
+        *ppszIPv4Gateway = pszIPv4Gateway;
+    }
 
 cleanup:
     netmgr_list_free(ipCount, (void **)ppszIpAddrList);
diff -uNr netmgmt-1.1.0/tools/netmgr/main.c netmgmt-1.1.0-2/tools/netmgr/main.c
--- netmgmt-1.1.0/tools/netmgr/main.c	2017-03-11 11:58:08.000000000 +0000
+++ netmgmt-1.1.0-2/tools/netmgr/main.c	2017-04-18 22:12:32.048012185 +0000
@@ -1342,8 +1342,11 @@
     netmgrcli_free_cmd(pCmd);
     return get_cli_error_code(err);
 error:
-    pszErrMsg = nm_get_error_info(err);
-    fprintf(stderr, "Error: %s\n", pszErrMsg);
+    if (err != EDOM)
+    {
+        pszErrMsg = nm_get_error_info(err);
+        fprintf(stderr, "Error: %s\n", pszErrMsg);
+    }
     goto cleanup;
 }