Remove all dependencies on the newt repo

The imgmod tool was using the util package in the newt repo
(mynewt.apache.org/newt/util).  This commit removes this dependency.
diff --git a/cli/image_cmds.go b/cli/image_cmds.go
index 2b5852e..a010f1b 100644
--- a/cli/image_cmds.go
+++ b/cli/image_cmds.go
@@ -25,16 +25,17 @@
 	"io/ioutil"
 	"os"
 	"sort"
+	"strconv"
 
-	"github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 
+	"github.com/apache/mynewt-artifact/errors"
 	"github.com/apache/mynewt-artifact/image"
 	"github.com/apache/mynewt-artifact/manifest"
 	"github.com/apache/mynewt-artifact/sec"
 	"mynewt.apache.org/imgmod/iimg"
-	"mynewt.apache.org/newt/util"
+	"mynewt.apache.org/imgmod/iutil"
 )
 
 func tlvStr(tlv image.ImageTlv) string {
@@ -62,21 +63,21 @@
 		return err
 	}
 
-	util.StatusMessage(util.VERBOSITY_DEFAULT, "Wrote image %s\n", filename)
+	iutil.Printf("Wrote image %s\n", filename)
 	return nil
 }
 
 func parseTlvArgs(typeArg string, filenameArg string) (image.ImageTlv, error) {
-	tlvType, err := util.AtoiNoOct(typeArg)
+	tlvType, err := strconv.Atoi(typeArg)
 	if err != nil || tlvType < 0 {
-		return image.ImageTlv{}, util.FmtNewtError(
-			"Invalid TLV type integer: %s", typeArg)
+		return image.ImageTlv{}, errors.Errorf(
+			"invalid TLV type integer: %s", typeArg)
 	}
 
 	data, err := ioutil.ReadFile(filenameArg)
 	if err != nil {
-		return image.ImageTlv{}, util.FmtNewtError(
-			"Error reading TLV data file: %s", err.Error())
+		return image.ImageTlv{}, errors.Wrapf(err,
+			"error reading TLV data file")
 	}
 
 	return image.ImageTlv{
@@ -103,7 +104,7 @@
 	if err != nil {
 		ImgmodUsage(nil, err)
 	}
-	fmt.Printf("%s\n", s)
+	iutil.Printf("%s\n", s)
 }
 
 func runBriefCmd(cmd *cobra.Command, args []string) {
@@ -121,15 +122,15 @@
 		ImgmodUsage(nil, err)
 	}
 
-	fmt.Printf("%8d| Header\n", offsets.Header)
-	fmt.Printf("%8d| Body\n", offsets.Body)
-	fmt.Printf("%8d| Trailer\n", offsets.Trailer)
+	iutil.Printf("%8d| Header\n", offsets.Header)
+	iutil.Printf("%8d| Body\n", offsets.Body)
+	iutil.Printf("%8d| Trailer\n", offsets.Trailer)
 	for i, tlv := range img.Tlvs {
-		fmt.Printf("%8d| TLV%d: type=%s(%d)\n",
+		iutil.Printf("%8d| TLV%d: type=%s(%d)\n",
 			offsets.Tlvs[i], i, image.ImageTlvTypeName(tlv.Header.Type),
 			tlv.Header.Type)
 	}
-	fmt.Printf("Total=%d\n", offsets.TotalSize)
+	iutil.Printf("Total=%d\n", offsets.TotalSize)
 }
 
 func runSignCmd(cmd *cobra.Command, args []string) {
@@ -155,8 +156,8 @@
 
 	hash, err := img.Hash()
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Failed to read hash from specified image: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err,
+			"failed to read hash from specified image"))
 	}
 
 	tlvs, err := image.BuildSigTlvs(keys, hash)
@@ -189,8 +190,8 @@
 
 	tlvArgs := args[1:]
 	if len(tlvArgs)%2 != 0 {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Invalid argument count; each TLV requires two arguments"))
+		ImgmodUsage(cmd, errors.Errorf(
+			"invalid argument count; each TLV requires two arguments"))
 	}
 
 	tlvs := []image.ImageTlv{}
@@ -229,20 +230,20 @@
 	tlvIndices := []int{}
 	idxMap := map[int]struct{}{}
 	for _, arg := range args[1:] {
-		idx, err := util.AtoiNoOct(arg)
+		idx, err := strconv.Atoi(arg)
 		if err != nil {
-			ImgmodUsage(cmd, util.FmtNewtError("Invalid TLV index: %s", arg))
+			ImgmodUsage(cmd, errors.Errorf("invalid TLV index: %s", arg))
 		}
 
 		if idx < 0 || idx >= len(img.Tlvs) {
-			ImgmodUsage(nil, util.FmtNewtError(
+			ImgmodUsage(nil, errors.Errorf(
 				"TLV index %s out of range; "+
 					"must be in range [0, %d] for this image",
 				arg, len(img.Tlvs)-1))
 		}
 
 		if _, ok := idxMap[idx]; ok {
-			ImgmodUsage(nil, util.FmtNewtError(
+			ImgmodUsage(nil, errors.Errorf(
 				"TLV index %d specified more than once", idx))
 		}
 		idxMap[idx] = struct{}{}
@@ -254,8 +255,7 @@
 	sort.Sort(sort.Reverse(sort.IntSlice(tlvIndices)))
 	for _, idx := range tlvIndices {
 		tlv := img.Tlvs[idx]
-		util.StatusMessage(util.VERBOSITY_DEFAULT,
-			"Removing TLV%d: %s\n", idx, tlvStr(tlv))
+		iutil.Printf("Removing TLV%d: %s\n", idx, tlvStr(tlv))
 
 		img.Tlvs = append(img.Tlvs[0:idx], img.Tlvs[idx+1:]...)
 	}
@@ -301,7 +301,7 @@
 	}
 
 	if OptOutFilename == "" {
-		ImgmodUsage(cmd, util.FmtNewtError("--outfile (-o) option required"))
+		ImgmodUsage(cmd, errors.Errorf("--outfile (-o) option required"))
 	}
 
 	inFilename := args[0]
@@ -313,28 +313,25 @@
 	}
 
 	if (img.Header.Flags & image.IMAGE_F_ENCRYPTED) != 0 {
-		util.StatusMessage(util.VERBOSITY_QUIET,
+		fmt.Fprintf(os.Stderr,
 			"* Warning: extracting hashable content from an encrypted image\n")
 	}
 
 	f, err := os.Create(outFilename)
 	if err != nil {
-		ImgmodUsage(nil, util.ChildNewtError(err))
+		ImgmodUsage(nil, errors.Wrapf(err, "failed to create hashable output"))
 	}
 	defer f.Close()
 
 	if err := binary.Write(f, binary.LittleEndian, &img.Header); err != nil {
-		ImgmodUsage(nil, util.FmtNewtError(
-			"Error writing image header: %s", err.Error()))
+		ImgmodUsage(nil, errors.Wrapf(err, "error writing image header"))
 	}
 	_, err = f.Write(img.Body)
 	if err != nil {
-		ImgmodUsage(nil, util.FmtNewtError(
-			"Error writing image body: %s", err.Error()))
+		ImgmodUsage(nil, errors.Wrapf(err, "error writing image body"))
 	}
 
-	util.StatusMessage(util.VERBOSITY_DEFAULT,
-		"Wrote hashable content to %s\n", outFilename)
+	iutil.Printf("Wrote hashable content to %s\n", outFilename)
 }
 
 func runAddsigCmd(cmd *cobra.Command, args []string) {
@@ -346,12 +343,11 @@
 	keyFilename := args[1]
 	sigFilename := args[2]
 
-	sigType, err := util.AtoiNoOct(args[3])
+	sigType, err := strconv.Atoi(args[3])
 	if err != nil || sigType < 0 || sigType > 255 ||
 		!image.ImageTlvTypeIsSig(uint8(sigType)) {
 
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Invalid signature type: %s", args[3]))
+		ImgmodUsage(cmd, errors.Errorf("invalid signature type: %s", args[3]))
 	}
 
 	outFilename, err := CalcOutFilename(imgFilename)
@@ -366,14 +362,12 @@
 
 	keyData, err := ioutil.ReadFile(keyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading key file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
 	}
 
 	sigData, err := ioutil.ReadFile(sigFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading signature file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading signature file"))
 	}
 
 	// ECDSA256 signatures need to be padded out to >=72 bytes.
@@ -386,8 +380,7 @@
 
 	// Build and append key hash TLV.
 	keyHashTlv := image.BuildKeyHashTlv(keyData)
-	util.StatusMessage(util.VERBOSITY_DEFAULT, "Adding TLV%d (%s)\n",
-		len(img.Tlvs), tlvStr(keyHashTlv))
+	iutil.Printf("Adding TLV%d (%s)\n", len(img.Tlvs), tlvStr(keyHashTlv))
 	img.Tlvs = append(img.Tlvs, keyHashTlv)
 
 	// Build and append signature TLV.
@@ -398,8 +391,7 @@
 		},
 		Data: sigData,
 	}
-	util.StatusMessage(util.VERBOSITY_DEFAULT, "Adding TLV%d (%s)\n",
-		len(img.Tlvs), tlvStr(sigTlv))
+	iutil.Printf("Adding TLV%d (%s)\n", len(img.Tlvs), tlvStr(sigTlv))
 	img.Tlvs = append(img.Tlvs, sigTlv)
 
 	if err := writeImage(img, outFilename); err != nil {
@@ -427,8 +419,7 @@
 
 	keyBytes, err := ioutil.ReadFile(keyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading key file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
 	}
 
 	img, err = iimg.DecryptImage(img, keyBytes)
@@ -461,8 +452,7 @@
 
 	keyBytes, err := ioutil.ReadFile(keyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading key file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
 	}
 
 	img, err = iimg.DecryptImageFull(img, keyBytes)
@@ -494,8 +484,7 @@
 
 	keyBytes, err := ioutil.ReadFile(keyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading key file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
 	}
 
 	img, err = iimg.EncryptImage(img, keyBytes)
@@ -528,8 +517,7 @@
 
 	keyBytes, err := ioutil.ReadFile(keyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading key file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
 	}
 
 	img, err = iimg.EncryptImageFull(img, keyBytes)
@@ -588,8 +576,7 @@
 
 	iss, err := sec.ReadPubSignKeys(OptSignKeys)
 	if err != nil {
-		ImgmodUsage(nil, errors.Wrapf(err,
-			"error reading signing key file"))
+		ImgmodUsage(nil, errors.Wrapf(err, "error reading signing key file"))
 	}
 
 	sigs, err := img.CollectSigs()
@@ -627,10 +614,10 @@
 		}
 	}
 
-	fmt.Printf(" structure: %s\n", st)
-	fmt.Printf("      hash: %s\n", ha)
-	fmt.Printf("signatures: %s\n", si)
-	fmt.Printf("  manifest: %s\n", ma)
+	iutil.Printf(" structure: %s\n", st)
+	iutil.Printf("      hash: %s\n", ha)
+	iutil.Printf("signatures: %s\n", si)
+	iutil.Printf("  manifest: %s\n", ma)
 
 	if anyFails {
 		os.Exit(94) // EBADMSG
diff --git a/cli/mfg_cmds.go b/cli/mfg_cmds.go
index 9ce7108..1cd95fc 100644
--- a/cli/mfg_cmds.go
+++ b/cli/mfg_cmds.go
@@ -25,6 +25,7 @@
 	"io/ioutil"
 	"os"
 	"sort"
+	"strconv"
 
 	"github.com/pkg/errors"
 	log "github.com/sirupsen/logrus"
@@ -35,7 +36,7 @@
 	"github.com/apache/mynewt-artifact/mfg"
 	"github.com/apache/mynewt-artifact/sec"
 	"mynewt.apache.org/imgmod/imfg"
-	"mynewt.apache.org/newt/util"
+	"mynewt.apache.org/imgmod/iutil"
 )
 
 const MAX_SIG_LEN = 1024 // Bytes.
@@ -43,8 +44,7 @@
 func readMfgBin(filename string) ([]byte, error) {
 	bin, err := ioutil.ReadFile(filename)
 	if err != nil {
-		return nil, util.FmtChildNewtError(err,
-			"Failed to read manufacturing image: %s", err.Error())
+		return nil, errors.Wrapf(err, "failed to read manufacturing image")
 	}
 
 	return bin, nil
@@ -89,13 +89,13 @@
 	areas := flash.SortFlashAreasByDevOff(mman.FlashAreas)
 
 	if len(areas) == 0 {
-		ImgmodUsage(nil, util.FmtNewtError(
+		ImgmodUsage(nil, errors.Errorf(
 			"Boot loader manifest does not contain flash map"))
 	}
 
 	overlaps, conflicts := flash.DetectErrors(areas)
 	if len(overlaps) > 0 || len(conflicts) > 0 {
-		return nil, util.NewNewtError(flash.ErrorText(overlaps, conflicts))
+		return nil, errors.New(flash.ErrorText(overlaps, conflicts))
 	}
 
 	if err := imfg.VerifyAreas(areas); err != nil {
@@ -115,8 +115,8 @@
 		filename := fmt.Sprintf("%s/%s.bin", binDir, area.Name)
 		bin, err := readMfgBin(filename)
 		if err != nil {
-			if !util.IsNotExist(err) {
-				return nil, util.ChildNewtError(err)
+			if !os.IsNotExist(errors.Cause(err)) {
+				return nil, errors.Wrapf(err, "could not read mfgimage binary")
 			}
 		} else {
 			mm[area.Name] = bin
@@ -132,10 +132,9 @@
 	}
 	inFilename := args[0]
 
-	metaEndOff, err := util.AtoiNoOct(args[1])
+	metaEndOff, err := strconv.Atoi(args[1])
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"invalid meta offset \"%s\"", args[1]))
+		ImgmodUsage(cmd, errors.Errorf("invalid meta offset \"%s\"", args[1]))
 	}
 
 	bin, err := readMfgBin(inFilename)
@@ -149,16 +148,15 @@
 	}
 
 	if m.Meta == nil {
-		util.StatusMessage(util.VERBOSITY_DEFAULT,
-			"Manufacturing image %s does not contain an MMR\n", inFilename)
+		iutil.Printf("Manufacturing image %s does not contain an MMR\n",
+			inFilename)
 	} else {
 		s, err := m.Meta.Json(metaEndOff)
 		if err != nil {
 			ImgmodUsage(nil, err)
 		}
-		util.StatusMessage(util.VERBOSITY_DEFAULT,
-			"Manufacturing image %s contains an MMR with "+
-				"the following properties:\n%s\n", inFilename, s)
+		iutil.Printf("Manufacturing image %s contains an MMR with "+
+			"the following properties:\n%s\n", inFilename, s)
 	}
 }
 
@@ -191,7 +189,7 @@
 	}
 
 	if err := os.Mkdir(outDir, os.ModePerm); err != nil {
-		ImgmodUsage(nil, util.ChildNewtError(err))
+		ImgmodUsage(nil, errors.Wrapf(err, "failed to make output directory"))
 	}
 
 	for name, data := range nbmap {
@@ -215,11 +213,6 @@
 	splitDir := args[0]
 	outDir := args[1]
 
-	if util.NodeExist(outDir) {
-		ImgmodUsage(nil, util.FmtNewtError(
-			"Destination \"%s\" already exists", outDir))
-	}
-
 	mm, err := readManifest(splitDir + "/mfg")
 	if err != nil {
 		ImgmodUsage(cmd, err)
@@ -246,8 +239,8 @@
 
 	infos, err := ioutil.ReadDir(splitDir + "/mfg")
 	if err != nil {
-		ImgmodUsage(nil, util.FmtNewtError(
-			"Error reading source mfg directory: %s", err.Error()))
+		ImgmodUsage(nil, errors.Wrapf(err,
+			"Error reading source mfg directory: %s"))
 	}
 	for _, info := range infos {
 		if info.Name() != mfg.MFG_BIN_IMG_FILENAME {
@@ -291,20 +284,18 @@
 
 	bin, err := readMfgBin(mfgimgFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Failed to read mfgimg file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err,
+			"failed to read mfgimg file: %s"))
 	}
 
 	okey, err := ioutil.ReadFile(okeyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Failed to read old key der: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "failed to read old key der: %s"))
 	}
 
 	nkey, err := ioutil.ReadFile(nkeyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Failed to read new key der: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "failed to read new key der: %s"))
 	}
 
 	if isKek {
@@ -335,7 +326,7 @@
 	}
 
 	if OptOutFilename == "" {
-		ImgmodUsage(cmd, util.FmtNewtError("--outfile (-o) option required"))
+		ImgmodUsage(cmd, errors.Errorf("--outfile (-o) option required"))
 	}
 
 	mfgDir := args[0]
@@ -475,18 +466,16 @@
 	// Read public key.
 	keyBytes, err := ioutil.ReadFile(keyFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtNewtError(
-			"Error reading key file: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "error reading key file"))
 	}
 
 	// Read signature.
 	sig, err := ioutil.ReadFile(sigFilename)
 	if err != nil {
-		ImgmodUsage(cmd, util.FmtChildNewtError(err,
-			"Failed to read signature: %s", err.Error()))
+		ImgmodUsage(cmd, errors.Wrapf(err, "failed to read signature"))
 	}
 	if len(sig) > MAX_SIG_LEN {
-		ImgmodUsage(nil, util.FmtNewtError(
+		ImgmodUsage(nil, errors.Errorf(
 			"signature larger than arbitrary maximum length (%d > %d)",
 			len(sig), MAX_SIG_LEN))
 	}
@@ -539,20 +528,20 @@
 	tlvIndices := []int{}
 	idxMap := map[int]struct{}{}
 	for _, arg := range args[1:] {
-		idx, err := util.AtoiNoOct(arg)
+		idx, err := strconv.Atoi(arg)
 		if err != nil {
-			ImgmodUsage(cmd, util.FmtNewtError("Invalid TLV index: %s", arg))
+			ImgmodUsage(cmd, errors.Errorf("invalid TLV index: %s", arg))
 		}
 
 		if idx < 0 || idx >= numTlvs {
-			ImgmodUsage(nil, util.FmtNewtError(
+			ImgmodUsage(nil, errors.Errorf(
 				"TLV index %s out of range; "+
 					"must be in range [0, %d] for this mfgimage",
 				arg, numTlvs-1))
 		}
 
 		if _, ok := idxMap[idx]; ok {
-			ImgmodUsage(nil, util.FmtNewtError(
+			ImgmodUsage(nil, errors.Errorf(
 				"TLV index %d specified more than once", idx))
 		}
 		idxMap[idx] = struct{}{}
@@ -564,8 +553,7 @@
 	sort.Sort(sort.Reverse(sort.IntSlice(tlvIndices)))
 	for _, idx := range tlvIndices {
 		tlv := m.Meta.Tlvs[idx]
-		util.StatusMessage(util.VERBOSITY_DEFAULT,
-			"Removing TLV%d: %s\n", idx, mfgTlvStr(tlv))
+		iutil.Printf("Removing TLV%d: %s\n", idx, mfgTlvStr(tlv))
 
 		tlvSz := mfg.META_TLV_HEADER_SZ + len(tlv.Data)
 		m.MetaOff += tlvSz
@@ -622,8 +610,7 @@
 
 	iss, err := sec.ReadPubSignKeys(OptSignKeys)
 	if err != nil {
-		ImgmodUsage(nil, errors.Wrapf(err,
-			"error reading signing key file"))
+		ImgmodUsage(nil, errors.Wrapf(err, "error reading signing key file"))
 	}
 
 	si := ""
@@ -641,9 +628,9 @@
 		}
 	}
 
-	fmt.Printf(" structure: %s\n", st)
-	fmt.Printf("signatures: %s\n", si)
-	fmt.Printf("  manifest: %s\n", ma)
+	iutil.Printf(" structure: %s\n", st)
+	iutil.Printf("signatures: %s\n", si)
+	iutil.Printf("  manifest: %s\n", ma)
 
 	if anyFails {
 		os.Exit(94) // EBADMSG
diff --git a/cli/util.go b/cli/util.go
index 74d8ebf..ae934fd 100644
--- a/cli/util.go
+++ b/cli/util.go
@@ -24,10 +24,11 @@
 	"io/ioutil"
 	"os"
 
+	"github.com/apache/mynewt-artifact/errors"
+	"github.com/otiai10/copy"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
-
-	"mynewt.apache.org/newt/util"
+	"mynewt.apache.org/imgmod/iutil"
 )
 
 var OptOutFilename string
@@ -43,7 +44,7 @@
 	}
 
 	if cmd != nil {
-		fmt.Printf("%s - ", cmd.Name())
+		fmt.Fprintf(os.Stderr, "%s - ", cmd.Name())
 		cmd.Help()
 	}
 	os.Exit(1)
@@ -52,7 +53,7 @@
 func CalcOutFilename(inFilename string) (string, error) {
 	if OptOutFilename != "" {
 		if OptInPlace {
-			return "", util.FmtNewtError(
+			return "", errors.Errorf(
 				"Only one of --outfile (-o) or --inplace (-i) options allowed")
 		}
 
@@ -60,7 +61,7 @@
 	}
 
 	if !OptInPlace {
-		return "", util.FmtNewtError(
+		return "", errors.Errorf(
 			"--outfile (-o) or --inplace (-i) option required")
 	}
 
@@ -68,14 +69,12 @@
 }
 
 func CopyDir(src string, dst string) error {
-	if err := util.CopyDir(src, dst); err != nil {
-		return util.FmtNewtError(
-			"Failed to copy directory \"%s\" to \"%s\": %s",
-			src, dst, err.Error())
+	if err := copy.Copy(src, dst); err != nil {
+		return errors.Wrapf(err,
+			"failed to copy directory \"%s\" to \"%s\"", src, dst)
 	}
 
-	util.StatusMessage(util.VERBOSITY_DEFAULT,
-		"Copied directory \"%s\" to \"%s\"\n", src, dst)
+	iutil.Printf("Copied directory \"%s\" to \"%s\"\n", src, dst)
 	return nil
 }
 
@@ -91,23 +90,20 @@
 }
 
 func CopyFile(src string, dst string) error {
-	if err := util.CopyFile(src, dst); err != nil {
-		return util.FmtNewtError(
-			"Failed to copy file \"%s\" to \"%s\": %s",
-			src, dst, err.Error())
+	if err := copy.Copy(src, dst); err != nil {
+		return errors.Wrapf(err,
+			"failed to copy file \"%s\" to \"%s\"", src, dst)
 	}
 
-	util.StatusMessage(util.VERBOSITY_DEFAULT,
-		"Copied file \"%s\" to \"%s\"\n", src, dst)
+	iutil.Printf("Copied file \"%s\" to \"%s\"\n", src, dst)
 	return nil
 }
 
 func WriteFile(data []byte, filename string) error {
 	if err := ioutil.WriteFile(filename, data, os.ModePerm); err != nil {
-		return util.FmtNewtError(
-			"Failed to write file \"%s\": %s", filename, err.Error())
+		return errors.Wrapf(err, "failed to write file \"%s\"")
 	}
 
-	util.StatusMessage(util.VERBOSITY_DEFAULT, "Wrote file \"%s\"\n", filename)
+	iutil.Printf("Wrote file \"%s\"\n", filename)
 	return nil
 }
diff --git a/go.mod b/go.mod
index 795ba11..dd3a838 100644
--- a/go.mod
+++ b/go.mod
@@ -1,10 +1,9 @@
 module mynewt.apache.org/imgmod
 
 require (
-	github.com/apache/mynewt-artifact v0.0.2
+	github.com/apache/mynewt-artifact v0.0.3
+	github.com/otiai10/copy v1.0.1
 	github.com/pkg/errors v0.8.1
-	github.com/sirupsen/logrus v1.4.0
-	github.com/spf13/cobra v0.0.3
-	github.com/spf13/pflag v1.0.3 // indirect
-	mynewt.apache.org/newt v0.0.0-20190529170335-75b2c282a77d
+	github.com/sirupsen/logrus v1.4.2
+	github.com/spf13/cobra v0.0.5
 )
diff --git a/go.sum b/go.sum
index 6df6f34..fc13c8d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,37 +1,67 @@
+bou.ke/monkey v1.0.1/go.mod h1:FgHuK96Rv2Nlf+0u1OOVDpCMdsWyOFmeeketDHE7LIg=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/NickBall/go-aes-key-wrap v0.0.0-20170929221519-1c3aa3e4dfc5 h1:5BIUS5hwyLM298mOf8e8TEgD3cCYqc86uaJdQCYZo/o=
 github.com/NickBall/go-aes-key-wrap v0.0.0-20170929221519-1c3aa3e4dfc5/go.mod h1:w5D10RxC0NmPYxmQ438CC1S07zaC1zpvuNW7s5sUk2Q=
 github.com/apache/mynewt-artifact v0.0.2 h1:2tBlf84kyAifrEilcw1kQFQ8kpq4wBSudXpO8BEOXhw=
 github.com/apache/mynewt-artifact v0.0.2/go.mod h1:vFUd47t74KPQMzSBhQ2qp5Hc7D29OU/Tl3xHtFwN3k8=
+github.com/apache/mynewt-artifact v0.0.3 h1:760wpGruGSOPjslEo0fgs9PYJ58IAvyjuJqno1t4iOc=
+github.com/apache/mynewt-artifact v0.0.3/go.mod h1:vFUd47t74KPQMzSBhQ2qp5Hc7D29OU/Tl3xHtFwN3k8=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/otiai10/copy v1.0.1 h1:gtBjD8aq4nychvRZ2CyJvFWAw0aja+VHazDdruZKGZA=
+github.com/otiai10/copy v1.0.1/go.mod h1:8bMCJrAqOtN/d9oyh5HR7HhLQMvcGMpGdwRDYsfOCHc=
+github.com/otiai10/mint v1.2.3/go.mod h1:YnfyPNhBvnY8bW4SGQHCs/aAFhkgySlMZbrF5U0bOVw=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
 github.com/sirupsen/logrus v1.4.0 h1:yKenngtzGh+cUSSh6GWbxW2abRqhYUSR/t/6+2QqNvE=
 github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8=
 github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
+github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4=
 github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
 github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 golang.org/x/crypto v0.0.0-20180621125126-a49355c7e3f8/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793 h1:u+LnwYTOOW7Ukr/fppxEb1Nwz0AtPflrblfvUudpo+I=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8 h1:1wopBVtVdWnn03fZelqdXTqk7U7zPQCb+T4rbU9ZEoU=
 golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -41,9 +71,14 @@
 golang.org/x/sys v0.0.0-20180707002001-3c6ecd8f22c6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 h1:I6FyU15t786LL7oL/hn43zqTuEGr4PN7F4XJ1p4E3Y8=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 mynewt.apache.org/newt v0.0.0-20190529170335-75b2c282a77d h1:dnv0EBSSD88NahC0Pow+5DOH7gy4D5xj5n1iCIxA2NY=
 mynewt.apache.org/newt v0.0.0-20190529170335-75b2c282a77d/go.mod h1:lFsPYOHxMMWA11pydOeh0GVFiXtx0A9VnzOQ6SiRR88=
diff --git a/iimg/iimg.go b/iimg/iimg.go
index 29dd8a2..d4e7c9a 100644
--- a/iimg/iimg.go
+++ b/iimg/iimg.go
@@ -27,7 +27,6 @@
 	"github.com/apache/mynewt-artifact/errors"
 	"github.com/apache/mynewt-artifact/image"
 	"github.com/apache/mynewt-artifact/sec"
-	"mynewt.apache.org/newt/util"
 )
 
 func GetDupSigs(img image.Image) []string {
@@ -77,7 +76,7 @@
 	}
 
 	if len(errStrs) > 0 {
-		return util.FmtNewtError("%s", strings.Join(errStrs, "\n"))
+		return errors.New(strings.Join(errStrs, "\n"))
 	}
 
 	return nil
@@ -98,7 +97,7 @@
 			s += fmt.Sprintf("\n    %s", d)
 		}
 
-		return util.FmtNewtError("%s", s)
+		return errors.New(s)
 	}
 
 	return nil
@@ -106,7 +105,7 @@
 
 func PadEcdsa256Sig(sig []byte) ([]byte, error) {
 	if len(sig) < 70 {
-		return nil, util.FmtNewtError(
+		return nil, errors.Errorf(
 			"Invalid ECDSA256 signature; length (%d) less than 70", len(sig))
 	}
 
@@ -121,7 +120,7 @@
 func ExtractSecret(img *image.Image) ([]byte, error) {
 	tlvs := img.RemoveTlvsWithType(image.IMAGE_TLV_ENC_RSA)
 	if len(tlvs) != 1 {
-		return nil, util.FmtNewtError(
+		return nil, errors.Errorf(
 			"Image contains invalid count of ENC_RSA TLVs: %d; must contain 1",
 			len(tlvs))
 	}
diff --git a/imfg/imfg.go b/imfg/imfg.go
index 28dab7a..93a0187 100644
--- a/imfg/imfg.go
+++ b/imfg/imfg.go
@@ -26,9 +26,10 @@
 	"sort"
 	"strings"
 
+	"github.com/apache/mynewt-artifact/errors"
 	"github.com/apache/mynewt-artifact/flash"
 	"github.com/apache/mynewt-artifact/mfg"
-	"mynewt.apache.org/newt/util"
+	"mynewt.apache.org/imgmod/iutil"
 )
 
 type NameBlobMap map[string][]byte
@@ -43,7 +44,7 @@
 	args ...interface{}) error {
 
 	suffix := fmt.Sprintf(format, args...)
-	return util.FmtNewtError("Invalid flash area \"%s\": %s", areaName, suffix)
+	return errors.Errorf("invalid flash area \"%s\": %s", areaName, suffix)
 }
 
 func verifyArea(area flash.FlashArea, minOffset int) error {
@@ -84,7 +85,7 @@
 
 	for _, area := range areas {
 		if _, ok := mm[area.Name]; ok {
-			return nil, util.FmtNewtError(
+			return nil, errors.Errorf(
 				"two or more flash areas with same name: \"%s\"", area.Name)
 		}
 
@@ -136,8 +137,7 @@
 			if len(bin) >= 4 {
 				binstr = fmt.Sprintf("%x", bin[:4])
 			}
-			util.StatusMessage(util.VERBOSITY_DEFAULT,
-				"inserting %s (%s) at offset %d (0x%x)\n",
+			iutil.Printf("inserting %s (%s) at offset %d (0x%x)\n",
 				area.Name, binstr, len(joined), len(joined))
 			joined = append(joined, bin...)
 		}
@@ -151,7 +151,7 @@
 		}
 		sort.Strings(names)
 
-		return nil, util.FmtNewtError(
+		return nil, errors.Errorf(
 			"unprocessed flash areas: %s", strings.Join(names, ", "))
 	}
 
@@ -163,23 +163,22 @@
 
 func replaceKey(mfgBin []byte, okey []byte, nkey []byte) (int, error) {
 	if len(okey) > len(mfgBin) {
-		return 0, util.FmtNewtError(
+		return 0, errors.Errorf(
 			"key longer than flash section (%d > %d)", len(okey), len(mfgBin))
 	}
 
 	idx := bytes.Index(mfgBin, okey)
 	if idx == -1 {
-		return 0, util.FmtNewtError("old key not present in flash section")
+		return 0, errors.Errorf("old key not present in flash section")
 	}
 
 	lastIdx := bytes.LastIndex(mfgBin, okey)
 	if idx != lastIdx {
-		return 0, util.FmtNewtError(
+		return 0, errors.Errorf(
 			"multiple instances of old key in flash section")
 	}
 
-	util.StatusMessage(util.VERBOSITY_VERBOSE,
-		"Replacing key at offset %d\n", idx)
+	iutil.PrintfVerbose("Replacing key at offset %d\n", idx)
 
 	copy(mfgBin[idx:idx+len(okey)], nkey)
 
@@ -188,7 +187,7 @@
 
 func ReplaceIsk(mfgBin []byte, okey []byte, nkey []byte) error {
 	if len(nkey) != len(okey) {
-		return util.FmtNewtError(
+		return errors.Errorf(
 			"key lengths differ (%d != %d)", len(nkey), len(okey))
 	}
 
@@ -201,7 +200,7 @@
 
 func ReplaceKek(mfgBin []byte, okey []byte, nkey []byte) error {
 	if len(nkey) > len(okey) {
-		return util.FmtNewtError(
+		return errors.Errorf(
 			"new key longer than old key (%d > %d)", len(nkey), len(okey))
 	}
 
@@ -215,11 +214,11 @@
 	klIdx := keyIdx - 4
 	buf := bytes.NewBuffer(mfgBin[klIdx : klIdx+4])
 	if err := binary.Read(buf, binary.LittleEndian, &kl); err != nil {
-		return util.ChildNewtError(err)
+		return errors.Wrapf(err, "failed to read key length")
 	}
 
 	if int(kl) != len(okey) {
-		return util.FmtNewtError(
+		return errors.Errorf(
 			"embedded key length (off=%d) has unexpected value; "+
 				"want=%d have=%d",
 			klIdx, len(okey), kl)
@@ -228,7 +227,7 @@
 	buf = &bytes.Buffer{}
 	kl = uint32(len(nkey))
 	if err := binary.Write(buf, binary.LittleEndian, kl); err != nil {
-		return util.ChildNewtError(err)
+		return errors.Wrapf(err, "failed to write key length")
 	}
 
 	copy(mfgBin[klIdx:klIdx+4], buf.Bytes())
diff --git a/imgmod.go b/imgmod.go
index 1677525..14f3692 100644
--- a/imgmod.go
+++ b/imgmod.go
@@ -20,19 +20,14 @@
 package main
 
 import (
-	"fmt"
-
+	"github.com/apache/mynewt-artifact/errors"
 	log "github.com/sirupsen/logrus"
 	"github.com/spf13/cobra"
 
 	"mynewt.apache.org/imgmod/cli"
-	"mynewt.apache.org/newt/util"
+	"mynewt.apache.org/imgmod/iutil"
 )
 
-var ImgmodLogLevel log.Level
-var imgmodSilent bool
-var imgmodQuiet bool
-var imgmodVerbose bool
 var imgmodVersion = "0.0.2"
 
 func main() {
@@ -46,24 +41,11 @@
 		Long:    imgmodHelpText,
 		Example: imgmodHelpEx,
 		PersistentPreRun: func(cmd *cobra.Command, args []string) {
-			verbosity := util.VERBOSITY_DEFAULT
-			if imgmodSilent {
-				verbosity = util.VERBOSITY_SILENT
-			} else if imgmodQuiet {
-				verbosity = util.VERBOSITY_QUIET
-			} else if imgmodVerbose {
-				verbosity = util.VERBOSITY_VERBOSE
-			}
-
 			logLevel, err := log.ParseLevel(logLevelStr)
 			if err != nil {
-				cli.ImgmodUsage(nil, util.ChildNewtError(err))
+				cli.ImgmodUsage(nil, errors.Wrapf(err, "failed to parse log level"))
 			}
-			ImgmodLogLevel = logLevel
-
-			if err := util.Init(ImgmodLogLevel, "", verbosity); err != nil {
-				cli.ImgmodUsage(nil, err)
-			}
+			log.SetLevel(logLevel)
 		},
 
 		Run: func(cmd *cobra.Command, args []string) {
@@ -71,12 +53,10 @@
 		},
 	}
 
-	imgmodCmd.PersistentFlags().BoolVarP(&imgmodVerbose, "verbose", "v", false,
+	imgmodCmd.PersistentFlags().BoolVarP(&iutil.Verbose, "verbose", "v", false,
 		"Enable verbose output when executing commands")
-	imgmodCmd.PersistentFlags().BoolVarP(&imgmodQuiet, "quiet", "q", false,
+	imgmodCmd.PersistentFlags().BoolVarP(&iutil.Quiet, "quiet", "q", false,
 		"Be quiet; only display error output")
-	imgmodCmd.PersistentFlags().BoolVarP(&imgmodSilent, "silent", "s", false,
-		"Be silent; don't output anything")
 	imgmodCmd.PersistentFlags().StringVarP(&logLevelStr, "loglevel", "l",
 		"WARN", "Log level")
 
@@ -88,7 +68,7 @@
 		Long:    versHelpText,
 		Example: versHelpEx,
 		Run: func(cmd *cobra.Command, args []string) {
-			fmt.Printf("%s\n", imgmodVersion)
+			iutil.Printf("%s\n", imgmodVersion)
 		},
 	}
 	imgmodCmd.AddCommand(versCmd)
diff --git a/iutil/iutil.go b/iutil/iutil.go
new file mode 100644
index 0000000..4e07607
--- /dev/null
+++ b/iutil/iutil.go
@@ -0,0 +1,37 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package iutil
+
+import "fmt"
+
+var Quiet bool
+var Verbose bool
+
+func Printf(format string, args ...interface{}) {
+	if !Quiet {
+		fmt.Printf(format, args...)
+	}
+}
+
+func PrintfVerbose(format string, args ...interface{}) {
+	if Verbose {
+		fmt.Printf(format, args...)
+	}
+}