Merge pull request #616 from ljharb/iojs

Add `io.js` support.

This branch adds support for https://github.com/iojs/io.js / https://iojs.org/

The following features should now work:
 - `nvm install iojs` will install the latest `io.js` version. `nvm ls iojs` and `nvm use iojs` will function as you'd expect.
 - `nvm install node` will install the latest stable `node` version. `nvm ls node` and `nvm use node` will function as you'd expect.
 - In general, a specific `io.js` version can be referenced with the "iojs-" prefix. If `node` were to ever release a `v1.0.0`, `v1.0.0` would refer to `node`, and `iojs-v1.0.0` would refer to `io.js`. In the near future, `node-v1.0.0` will also refer to `node` unambiguously. This applies to all `nvm` commands, including working with aliases and `.nvmrc` files.
 - `io.js`, unlike `node`, does not have a SunOS binary. Please open an issue on https://github.com/iojs/io.js if this is actually a problem for anyone, as currently it seems like this won't be for anybody.

**Note**: checksum support upon installation is currently disabled. Relates to https://github.com/iojs/io.js/issues/368.
**Note**: installation of `io.js` directly from source (via the `-s` option) is not yet enabled. This will be added soon.

Relates to https://github.com/iojs/io.js/issues/40 https://github.com/iojs/io.js/issues/420
Fixes #590
diff --git a/nvm.sh b/nvm.sh
index c26d229..1ac6635 100644
--- a/nvm.sh
+++ b/nvm.sh
@@ -49,6 +49,10 @@
   [ "$(nvm deactivate >/dev/null 2>&1 && command -v node)" != '' ]
 }
 
+nvm_has_system_iojs() {
+  [ "$(nvm deactivate >/dev/null 2>&1 && command -v iojs)" != '' ]
+}
+
 # Make zsh glob matching behave same as bash
 # This fixes the "zsh: no matches found" errors
 if nvm_has "unsetopt"; then
@@ -71,6 +75,13 @@
   export NVM_NODEJS_ORG_MIRROR="https://nodejs.org/dist"
 fi
 
+if [ -z "$NVM_IOJS_ORG_MIRROR" ]; then
+  export NVM_IOJS_ORG_MIRROR="https://iojs.org/dist"
+fi
+if [ -z "$NVM_IOJS_ORG_VERSION_LISTING" ]; then
+  export NVM_IOJS_ORG_VERSION_LISTING="$NVM_IOJS_ORG_MIRROR/index.tab"
+fi
+
 nvm_tree_contains_path() {
   local tree
   tree="$1"
@@ -144,6 +155,8 @@
   NVM_WHICH_DIR="$1"
   if [ -z "$NVM_WHICH_DIR" ] || [ "_$NVM_WHICH_DIR" = "_new" ]; then
     echo "$NVM_DIR/versions/node"
+  elif [ "_$NVM_WHICH_DIR" = "_iojs" ]; then
+    echo "$NVM_DIR/versions/io.js"
   elif [ "_$NVM_WHICH_DIR" = "_old" ]; then
     echo "$NVM_DIR"
   else
@@ -162,6 +175,8 @@
   if [ -z "$VERSION" ]; then
     echo "version is required" >&2
     return 3
+  elif nvm_is_iojs_version "$VERSION"; then
+    echo "$(nvm_version_dir iojs)/$(nvm_strip_iojs_prefix "$VERSION")"
   elif nvm_version_greater 0.12.0 "$VERSION"; then
     echo "$(nvm_version_dir old)/$VERSION"
   else
@@ -184,11 +199,17 @@
     return $?
   fi
 
+  case "_$PATTERN" in
+    "_$(nvm_node_prefix)" | "_$(nvm_node_prefix)-")
+      PATTERN="stable"
+    ;;
+  esac
   VERSION="$(nvm_ls "$PATTERN" | tail -n1)"
-  echo "$VERSION"
-
-  if [ "$VERSION" = 'N/A' ]; then
-    return 3
+  if [ -z "$VERSION" ] || [ "_$VERSION" = "_N/A" ]; then
+    echo "N/A"
+    return 3;
+  else
+    echo "$VERSION"
   fi
 }
 
@@ -196,8 +217,12 @@
   local PATTERN
   PATTERN="$1"
   local VERSION
-  VERSION="$(nvm_ls_remote "$PATTERN" | tail -n1)"
-  echo "$VERSION"
+  if nvm_is_iojs_version "$PATTERN"; then
+    VERSION="$(nvm_ls_remote_iojs "$PATTERN")"
+  else
+    VERSION="$(nvm_ls_remote "$PATTERN")"
+  fi
+  echo "$VERSION" | tail -n1
 
   if [ "_$VERSION" = '_N/A' ]; then
     return 3
@@ -209,7 +234,13 @@
 }
 
 nvm_ensure_version_prefix() {
-  echo "$1" | command sed -e 's/^\([0-9]\)/v\1/g'
+  local NVM_VERSION
+  NVM_VERSION="$(nvm_strip_iojs_prefix "$1" | command sed -e 's/^\([0-9]\)/v\1/g')"
+  if nvm_is_iojs_version "$1"; then
+    echo "$(nvm_add_iojs_prefix "$NVM_VERSION")"
+  else
+    echo "$NVM_VERSION"
+  fi
 }
 
 nvm_format_version() {
@@ -238,7 +269,13 @@
 }
 
 nvm_strip_path() {
-  echo "$1" | command sed -e "s#$NVM_DIR/[^/]*$2[^:]*:##g" -e "s#:$NVM_DIR/[^/]*$2[^:]*##g" -e "s#$NVM_DIR/[^/]*$2[^:]*##g"
+  echo "$1" | command sed \
+    -e "s#$NVM_DIR/[^/]*$2[^:]*:##g" \
+    -e "s#:$NVM_DIR/[^/]*$2[^:]*##g" \
+    -e "s#$NVM_DIR/[^/]*$2[^:]*##g" \
+    -e "s#$NVM_DIR/versions/[^/]*/[^/]*$2[^:]*:##g" \
+    -e "s#:$NVM_DIR/versions/[^/]*/[^/]*$2[^:]*##g" \
+    -e "s#$NVM_DIR/versions/[^/]*/[^/]*$2[^:]*##g"
 }
 
 nvm_prepend_path() {
@@ -253,7 +290,7 @@
   # binaries started with node 0.8.6
   local FIRST_VERSION_WITH_BINARY
   FIRST_VERSION_WITH_BINARY="0.8.6"
-  nvm_version_greater_than_or_equal_to "$1" "$FIRST_VERSION_WITH_BINARY"
+  nvm_version_greater_than_or_equal_to "$(nvm_strip_iojs_prefix $1)" "$FIRST_VERSION_WITH_BINARY"
 }
 
 nvm_alias() {
@@ -279,9 +316,11 @@
   NVM_LS_CURRENT_NODE_PATH="$(command which node 2> /dev/null)"
   if [ $? -ne 0 ]; then
     echo 'none'
+  elif nvm_tree_contains_path "$(nvm_version_dir iojs)" "$NVM_LS_CURRENT_NODE_PATH"; then
+    echo "$(nvm_add_iojs_prefix $(iojs --version 2>/dev/null))"
   elif nvm_tree_contains_path "$NVM_DIR" "$NVM_LS_CURRENT_NODE_PATH"; then
     local VERSION
-    VERSION="$(node -v 2>/dev/null)"
+    VERSION="$(node --version 2>/dev/null)"
     if [ "$VERSION" = "v0.6.21-pre" ]; then
       echo "v0.6.21"
     else
@@ -345,6 +384,31 @@
   return 2
 }
 
+nvm_iojs_prefix() {
+  echo "iojs"
+}
+nvm_node_prefix() {
+  echo "node"
+}
+
+nvm_is_iojs_version() {
+  [ "_$(echo "$1" | cut -c1-5)" = "_iojs-" ]
+}
+
+nvm_add_iojs_prefix() {
+  command echo "$(nvm_iojs_prefix)-$(nvm_ensure_version_prefix "$(nvm_strip_iojs_prefix "$1")")"
+}
+
+nvm_strip_iojs_prefix() {
+  local NVM_IOJS_PREFIX
+  NVM_IOJS_PREFIX="$(nvm_iojs_prefix)"
+  if [ "_$1" = "_$NVM_IOJS_PREFIX" ]; then
+    echo
+  else
+    echo "$1" | command sed "s/^$NVM_IOJS_PREFIX-//"
+  fi
+}
+
 nvm_ls() {
   local PATTERN
   PATTERN="$1"
@@ -359,20 +423,31 @@
     return
   fi
 
+  case "$PATTERN" in
+    "$(nvm_iojs_prefix)" | "$(nvm_node_prefix)")
+      PATTERN="$PATTERN-"
+    ;;
+    *)
+      PATTERN=$(nvm_ensure_version_prefix $PATTERN)
+    ;;
+  esac
   # If it looks like an explicit version, don't do anything funny
-  PATTERN=$(nvm_ensure_version_prefix $PATTERN)
   if [ "_$(echo "$PATTERN" | cut -c1-1)" = "_v" ] && [ "_$(nvm_num_version_groups "$PATTERN")" = "_3" ]; then
     if [ -d "$(nvm_version_path "$PATTERN")" ]; then
       VERSIONS="$PATTERN"
     fi
   else
-    if [ "_$PATTERN" != "_system" ]; then
-      local NUM_VERSION_GROUPS
-      NUM_VERSION_GROUPS="$(nvm_num_version_groups "$PATTERN")"
-      if [ "_$NUM_VERSION_GROUPS" = "_2" ] || [ "_$NUM_VERSION_GROUPS" = "_1" ]; then
-        PATTERN="$(echo "$PATTERN" | command sed -e 's/\.*$//g')."
-      fi
-    fi
+    case "$PATTERN" in
+      "$(nvm_iojs_prefix)-" | "$(nvm_node_prefix)-" | "system")
+      ;;
+      *)
+        local NUM_VERSION_GROUPS
+        NUM_VERSION_GROUPS="$(nvm_num_version_groups "$PATTERN")"
+        if [ "_$NUM_VERSION_GROUPS" = "_2" ] || [ "_$NUM_VERSION_GROUPS" = "_1" ]; then
+          PATTERN="$(echo "$PATTERN" | command sed -e 's/\.*$//g')."
+        fi
+      ;;
+    esac
 
     local ZHS_HAS_SHWORDSPLIT_UNSET
     ZHS_HAS_SHWORDSPLIT_UNSET=1
@@ -383,7 +458,26 @@
 
     local NVM_DIRS_TO_TEST_AND_SEARCH
     local NVM_DIRS_TO_SEARCH
-    NVM_DIRS_TO_TEST_AND_SEARCH="$(nvm_version_dir old) $(nvm_version_dir new)"
+    local NVM_ADD_SYSTEM
+    NVM_ADD_SYSTEM=false
+    if nvm_is_iojs_version "$PATTERN"; then
+      NVM_DIRS_TO_TEST_AND_SEARCH="$(nvm_version_dir iojs)"
+      PATTERN="$(nvm_strip_iojs_prefix "$PATTERN")"
+      if nvm_has_system_iojs; then
+        NVM_ADD_SYSTEM=true
+      fi
+    elif [ "_$PATTERN" = "_$(nvm_node_prefix)-" ]; then
+      NVM_DIRS_TO_TEST_AND_SEARCH="$(nvm_version_dir old) $(nvm_version_dir new)"
+      PATTERN=''
+      if nvm_has_system_node; then
+        NVM_ADD_SYSTEM=true
+      fi
+    else
+      NVM_DIRS_TO_TEST_AND_SEARCH="$(nvm_version_dir old) $(nvm_version_dir new) $(nvm_version_dir iojs)"
+      if nvm_has_system_iojs || nvm_has_system_node; then
+        NVM_ADD_SYSTEM=true
+      fi
+    fi
     for NVM_VERSION_DIR in $NVM_DIRS_TO_TEST_AND_SEARCH; do
       if [ -d "$NVM_VERSION_DIR" ]; then
         NVM_DIRS_TO_SEARCH="$NVM_VERSION_DIR $NVM_DIRS_TO_SEARCH"
@@ -394,19 +488,23 @@
       PATTERN='v'
     fi
     VERSIONS="$(command find $NVM_DIRS_TO_SEARCH -maxdepth 1 -type d -name "$PATTERN*" \
+      | command sed "s#$(nvm_version_dir iojs)/#"$(nvm_iojs_prefix)"-#" \
       | command sed "s#^$NVM_DIR/##" \
       | command grep -v -e '^versions$' \
+      | command sed 's#^versions/##' \
       | sed -e 's/^v/node-v/' \
-      | command sort -t. -u -k 1.2,1n -k 2,2n -k 3,3n \
+      | sed -e 's#^\(iojs\)[-/]v#\1.v#' | sed -e 's#^\(node\)[-/]v#\1.v#' \
+      | command sort -t. -u -k 2.2,2n -k 3,3n -k 4,4n \
       | command sort -s -t- -k1.1,1.1 \
-      | command sed 's/^node-//')"
+      | command sed 's/^\(iojs\)\./\1-/' \
+      | command sed 's/^node\.//')"
 
     if [ $ZHS_HAS_SHWORDSPLIT_UNSET -eq 1 ] && nvm_has "unsetopt"; then
       unsetopt shwordsplit
     fi
   fi
 
-  if nvm_has_system_node; then
+  if [ "$NVM_ADD_SYSTEM" = true ]; then
     if [ -z "$PATTERN" ] || [ "_$PATTERN" = "_v" ]; then
       VERSIONS="$VERSIONS$(command printf '\n%s' 'system')"
     elif [ "$PATTERN" = 'system' ]; then
@@ -444,7 +542,28 @@
     return 3
   fi
   echo "$VERSIONS"
-  return
+}
+
+nvm_ls_remote_iojs() {
+  local PATTERN
+  PATTERN="$1"
+  local VERSIONS
+  if [ -n "$PATTERN" ]; then
+    PATTERN="$(nvm_ensure_version_prefix $(nvm_strip_iojs_prefix "$PATTERN"))"
+  else
+    PATTERN=".*"
+  fi
+  VERSIONS="$(nvm_download -L -s $NVM_IOJS_ORG_VERSION_LISTING -o - \
+    | command sed 1d \
+    | command sed "s/^/$(nvm_iojs_prefix)-/" \
+    | command cut -f1 \
+    | command grep -w "$PATTERN" \
+    | command sort)"
+  if [ -z "$VERSIONS" ]; then
+    echo "N/A"
+    return 3
+  fi
+  echo "$VERSIONS"
 }
 
 nvm_checksum() {
@@ -473,14 +592,14 @@
   local NVM_CURRENT
   NVM_CURRENT=$(nvm_ls_current)
   echo "$1" | while read VERSION; do
-    if [ "$VERSION" = "$NVM_CURRENT" ]; then
-      FORMAT='\033[0;32m-> %9s\033[0m'
-    elif [ -d "$(nvm_version_path "$VERSION" 2> /dev/null)" ]; then
-      FORMAT='\033[0;34m%12s\033[0m'
+    if [ "_$VERSION" = "_$NVM_CURRENT" ]; then
+      FORMAT='\033[0;32m-> %12s\033[0m'
     elif [ "$VERSION" = "system" ]; then
-      FORMAT='\033[0;33m%12s\033[0m'
+      FORMAT='\033[0;33m%15s\033[0m'
+    elif [ -d "$(nvm_version_path "$VERSION" 2> /dev/null)" ]; then
+      FORMAT='\033[0;34m%15s\033[0m'
     else
-      FORMAT='%12s'
+      FORMAT='%15s'
     fi
     printf "$FORMAT\n" $VERSION
   done
@@ -565,12 +684,68 @@
   echo "$NVM_ARCH"
 }
 
+nvm_install_iojs_binary() {
+  local PREFIXED_VERSION
+  PREFIXED_VERSION="$1"
+  local REINSTALL_PACKAGES_FROM
+  REINSTALL_PACKAGES_FROM="$2"
+
+  if ! nvm_is_iojs_version "$PREFIXED_VERSION"; then
+    echo 'nvm_install_iojs_binary requires an iojs-prefixed version.' >&2
+    return 10
+  fi
+
+  local VERSION
+  VERSION="$(nvm_strip_iojs_prefix "$PREFIXED_VERSION")"
+  local VERSION_PATH
+  VERSION_PATH="$(nvm_version_path "$PREFIXED_VERSION")"
+  local NVM_OS
+  NVM_OS="$(nvm_get_os)"
+  local t
+  local url
+  local sum
+
+  if [ -n "$NVM_OS" ]; then
+    if nvm_binary_available "$VERSION"; then
+      t="$VERSION-$NVM_OS-$(nvm_get_arch)"
+      url="$NVM_IOJS_ORG_MIRROR/$VERSION/$(nvm_iojs_prefix)-${t}.tar.gz"
+      sum="$(nvm_download -L -s $NVM_IOJS_ORG_MIRROR/$VERSION/SHASUMS256.txt -o - | command grep $(nvm_iojs_prefix)-${t}.tar.gz | command awk '{print $1}')"
+      local tmpdir
+      tmpdir="$NVM_DIR/bin/iojs-${t}"
+      local tmptarball
+      tmptarball="$tmpdir/iojs-${t}.tar.gz"
+      if (
+        command mkdir -p "$tmpdir" && \
+        nvm_download -L -C - --progress-bar $url -o "$tmptarball" && \
+        echo "WARNING: checksums are currently disabled for io.js" >&2 && \
+        # nvm_checksum "$tmptarball" $sum && \
+        command tar -xzf "$tmptarball" -C "$tmpdir" --strip-components 1 && \
+        command rm -f "$tmptarball" && \
+        command mkdir -p "$VERSION_PATH" && \
+        command mv "$tmpdir"/* "$VERSION_PATH"
+      ); then
+        return 0
+      else
+        echo "Binary download failed, trying source." >&2
+        command rm -rf "$tmptarball" "$tmpdir"
+        return 1
+      fi
+    fi
+  fi
+  return 2
+}
+
 nvm_install_node_binary() {
   local VERSION
   VERSION="$1"
   local REINSTALL_PACKAGES_FROM
   REINSTALL_PACKAGES_FROM="$2"
 
+  if nvm_is_iojs_version "$PREFIXED_VERSION"; then
+    echo 'nvm_install_node_binary does not allow an iojs-prefixed version.' >&2
+    return 10
+  fi
+
   local VERSION_PATH
   VERSION_PATH="$(nvm_version_path "$VERSION")"
   local NVM_OS
@@ -594,9 +769,9 @@
         nvm_checksum "$tmptarball" $sum && \
         command tar -xzf "$tmptarball" -C "$tmpdir" --strip-components 1 && \
         command rm -f "$tmptarball" && \
-        command mv "$tmpdir" "$VERSION_PATH"
-        )
-      then
+        command mkdir -p "$VERSION_PATH" && \
+        command mv "$tmpdir"/* "$VERSION_PATH"
+      ); then
         return 0
       else
         echo "Binary download failed, trying source." >&2
@@ -768,10 +943,6 @@
         shift
       fi
 
-      if [ "_$NVM_OS" = "_freebsd" ]; then
-        nobinary=1
-      fi
-
       provided_version="$1"
 
       if [ -z "$provided_version" ]; then
@@ -783,7 +954,18 @@
         shift
       fi
 
-      VERSION="$(nvm_remote_version "$provided_version")"
+      case "_$provided_version" in
+        "_$(nvm_iojs_prefix)" | "_io.js")
+          VERSION="$(nvm_add_iojs_prefix $(nvm_ls_remote_iojs | tail -n1))"
+        ;;
+        "_$(nvm_node_prefix)")
+          VERSION="$(nvm_ls_remote stable)"
+        ;;
+        *)
+          VERSION="$(nvm_remote_version "$provided_version")"
+        ;;
+      esac
+
       ADDITIONAL_PARAMETERS=''
       local PROVIDED_REINSTALL_PACKAGES_FROM
       local REINSTALL_PACKAGES_FROM
@@ -810,6 +992,11 @@
         return 5
       fi
 
+      local NVM_IOJS
+      if nvm_is_iojs_version "$VERSION"; then
+        NVM_IOJS=true
+      fi
+
       local VERSION_PATH
       VERSION_PATH="$(nvm_version_path "$VERSION")"
       if [ -d "$VERSION_PATH" ]; then
@@ -825,9 +1012,24 @@
         return 3
       fi
 
+      if [ "_$NVM_OS" = "_freebsd" ]; then
+        # node.js and io.js do not have a FreeBSD binary
+        nobinary=1
+      elif [ "_$NVM_OS" = "_sunos" ] && [ "$NVM_IOJS" = true ]; then
+        # io.js does not have a SunOS binary
+        nobinary=1
+      fi
       # skip binary install if "nobinary" option specified.
-      if [ $nobinary -ne 1 ] && nvm_install_node_binary "$VERSION" "$REINSTALL_PACKAGES_FROM"; then
-        if nvm use "$VERSION" \
+      if [ $nobinary -ne 1 ] && nvm_binary_available "$VERSION"; then
+        local NVM_INSTALL_SUCCESS
+        if [ "$NVM_IOJS" = true ] && nvm_install_iojs_binary "$VERSION" "$REINSTALL_PACKAGES_FROM"; then
+          NVM_INSTALL_SUCCESS=true
+        elif [ "$NVM_IOJS" != true ] && nvm_install_node_binary "$VERSION" "$REINSTALL_PACKAGES_FROM"; then
+          NVM_INSTALL_SUCCESS=true
+        fi
+
+        if [ "$NVM_INSTALL_SUCCESS" = true ] \
+          && nvm use "$VERSION" \
           && [ ! -z "$REINSTALL_PACKAGES_FROM" ] \
           && [ "_$REINSTALL_PACKAGES_FROM" != "_N/A" ]; then
           nvm reinstall-packages "$REINSTALL_PACKAGES_FROM"
@@ -835,17 +1037,38 @@
         return $?
       fi
 
-      nvm_install_node_source "$VERSION" "$REINSTALL_PACKAGES_FROM" "$ADDITIONAL_PARAMETERS"
+      if [ "$NVM_IOJS" = true ]; then
+        # nvm_install_iojs_source "$VERSION" "$REINSTALL_PACKAGES_FROM" "$ADDITIONAL_PARAMETERS"
+        echo "Installing iojs from source is not currently supported" >&2
+        return 105
+      else
+        nvm_install_node_source "$VERSION" "$REINSTALL_PACKAGES_FROM" "$ADDITIONAL_PARAMETERS"
+      fi
     ;;
     "uninstall" )
       [ $# -ne 2 ] && nvm help && return
-      PATTERN="$(nvm_ensure_version_prefix "$2")"
-      if [ "_$PATTERN" = "_$(nvm_version)" ]; then
-        echo "nvm: Cannot uninstall currently-active node version, $PATTERN." >&2
+
+      local PATTERN
+      PATTERN="$2"
+      local VERSION
+      case "_$PATTERN" in
+        "_$(nvm_iojs_prefix)" | "_$(nvm_iojs_prefix)-" \
+        | "_$(nvm_node_prefix)" | "_$(nvm_node_prefix)-")
+          VERSION="$(nvm_version $PATTERN)"
+        ;;
+        *)
+          VERSION="$(nvm_version "$PATTERN")"
+        ;;
+      esac
+      if [ "_$PATTERN" = "_$(nvm_ls_current)" ]; then
+        if nvm_is_iojs_version "$PATTERN"; then
+          echo "nvm: Cannot uninstall currently-active io.js version, $VERSION (inferred from $PATTERN)." >&2
+        else
+          echo "nvm: Cannot uninstall currently-active node version, $VERSION (inferred from $PATTERN)." >&2
+        fi
         return 1
       fi
-      local VERSION
-      VERSION="$(nvm_version "$PATTERN")"
+
       local VERSION_PATH
       VERSION_PATH="$(nvm_version_path "$VERSION")"
       if [ ! -d "$VERSION_PATH" ]; then
@@ -855,20 +1078,28 @@
 
       t="$VERSION-$(nvm_get_os)-$(nvm_get_arch)"
 
+      local NVM_PREFIX
+      local NVM_SUCCESS_MSG
+      if nvm_is_iojs_version "$VERSION"; then
+        NVM_PREFIX="$(nvm_iojs_prefix)"
+        NVM_SUCCESS_MSG="Uninstalled io.js $(nvm_strip_iojs_prefix $VERSION)"
+      else
+        NVM_PREFIX="$(nvm_node_prefix)"
+        NVM_SUCCESS_MSG="Uninstalled node $VERSION"
+      fi
       # Delete all files related to target version.
-      command rm -rf "$NVM_DIR/src/node-$VERSION" \
-             "$NVM_DIR/src/node-$VERSION.tar.gz" \
-             "$NVM_DIR/bin/node-${t}" \
-             "$NVM_DIR/bin/node-${t}.tar.gz" \
+      command rm -rf "$NVM_DIR/src/$NVM_PREFIX-$VERSION" \
+             "$NVM_DIR/src/$NVM_PREFIX-$VERSION.tar.gz" \
+             "$NVM_DIR/bin/$NVM_PREFIX-${t}" \
+             "$NVM_DIR/bin/$NVM_PREFIX-${t}.tar.gz" \
              "$VERSION_PATH" 2>/dev/null
-      echo "Uninstalled node $VERSION"
+      echo "$NVM_SUCCESS_MSG"
 
-      # Rm any aliases that point to uninstalled version.
+      # rm any aliases that point to uninstalled version.
       for ALIAS in `command grep -l $VERSION "$(nvm_alias_path)/*" 2>/dev/null`
       do
         nvm unalias "$(command basename "$ALIAS")"
       done
-
     ;;
     "deactivate" )
       local NEWPATH
@@ -900,16 +1131,31 @@
         nvm help
         return 127
       fi
+
       if [ $# -eq 1 ]; then
         nvm_rc_version
         if [ -n "$NVM_RC_VERSION" ]; then
           VERSION="$(nvm_version "$NVM_RC_VERSION")"
         fi
-      elif [ "_$2" != '_system' ]; then
-        VERSION="$(nvm_version "$2")"
       else
-        VERSION="$2"
+        local NVM_IOJS_PREFIX
+        NVM_IOJS_PREFIX="$(nvm_iojs_prefix)"
+        case "_$2" in
+          "_$NVM_IOJS_PREFIX" | "_io.js")
+            VERSION="$(nvm_add_iojs_prefix $(nvm_ls | command grep "$NVM_IOJS_PREFIX" | tail -n1))"
+          ;;
+          "_$(nvm_node_prefix)")
+            VERSION="$(nvm_version stable)"
+          ;;
+          "_system")
+            VERSION="system"
+          ;;
+          *)
+            VERSION="$(nvm_version "$2")"
+          ;;
+        esac
       fi
+
       if [ -z "$VERSION" ]; then
         nvm help
         return 127
@@ -919,6 +1165,9 @@
         if nvm_has_system_node && nvm deactivate >/dev/null 2>&1; then
           echo "Now using system version of node: $(node -v 2>/dev/null)."
           return
+        elif nvm_has_system_iojs && nvm deactivate >/dev/null 2>&1; then
+          echo "Now using system version of io.js: $(iojs --version 2>/dev/null)."
+          return
         else
           echo "System version of node not found." >&2
           return 127
@@ -990,11 +1239,22 @@
         fi
       fi
 
-      echo "Running node $VERSION"
+      local NVM_IOJS
+      if nvm_is_iojs_version "$VERSION"; then
+        NVM_IOJS=true
+      fi
+
       local ARGS
       ARGS="$@"
       local OUTPUT
-      OUTPUT="$(nvm use "$VERSION" >/dev/null && node "$ARGS")"
+
+      if [ "$NVM_IOJS" = true ]; then
+        echo "Running io.js $(nvm_strip_iojs_prefix "$VERSION")"
+        OUTPUT="$(nvm use "$VERSION" >/dev/null && iojs "$ARGS")"
+      else
+        echo "Running node $VERSION"
+        OUTPUT="$(nvm use "$VERSION" >/dev/null && node "$ARGS")"
+      fi
       local EXIT_CODE
       EXIT_CODE="$?"
       echo "$OUTPUT"
@@ -1037,11 +1297,44 @@
       return $NVM_LS_EXIT_CODE
     ;;
     "ls-remote" | "list-remote" )
-      local NVM_LS_EXIT_CODE
-      NVM_LS_OUTPUT=$(nvm_ls_remote "$2")
-      NVM_LS_EXIT_CODE=$?
-      nvm_print_versions "$NVM_LS_OUTPUT"
-      return $NVM_LS_EXIT_CODE
+      local PATTERN
+      PATTERN="$2"
+      local NVM_FLAVOR
+      case "_$PATTERN" in
+        "_$(nvm_iojs_prefix)" | "_$(nvm_node_prefix)" )
+          NVM_FLAVOR="$PATTERN"
+          PATTERN="$3"
+        ;;
+      esac
+
+      local NVM_LS_REMOTE_EXIT_CODE
+      NVM_LS_REMOTE_EXIT_CODE=0
+      local NVM_LS_REMOTE_OUTPUT
+      NVM_LS_REMOTE_OUTPUT=''
+      if [ "_$NVM_FLAVOR" != "_$(nvm_iojs_prefix)" ]; then
+        NVM_LS_REMOTE_OUTPUT=$(nvm_ls_remote "$PATTERN")
+        NVM_LS_REMOTE_EXIT_CODE=$?
+      fi
+
+      local NVM_LS_REMOTE_IOJS_EXIT_CODE
+      NVM_LS_REMOTE_IOJS_EXIT_CODE=0
+      local NVM_LS_REMOTE_IOJS_OUTPUT
+      NVM_LS_REMOTE_IOJS_OUTPUT=''
+      if [ "_$NVM_FLAVOR" != "_$(nvm_node_prefix)" ]; then
+        NVM_LS_REMOTE_IOJS_OUTPUT=$(nvm_ls_remote_iojs "$PATTERN")
+        NVM_LS_REMOTE_IOJS_EXIT_CODE=$?
+      fi
+
+      local NVM_OUTPUT
+      NVM_OUTPUT="$(echo "$NVM_LS_REMOTE_OUTPUT
+$NVM_LS_REMOTE_IOJS_OUTPUT" | grep -v "N/A" | sed '/^$/d')"
+      if [ -n "$NVM_OUTPUT" ]; then
+        nvm_print_versions "$NVM_OUTPUT"
+        return $NVM_LS_REMOTE_EXIT_CODE || $NVM_LS_REMOTE_IOJS_EXIT_CODE
+      else
+        nvm_print_versions "N/A"
+        return 3
+      fi
     ;;
     "current" )
       nvm_version current
@@ -1063,7 +1356,7 @@
       fi
 
       if [ "_$VERSION" = '_system' ]; then
-        if nvm_has_system_node >/dev/null 2>&1; then
+        if nvm_has_system_iojs >/dev/null 2>&1 || nvm_has_system_node >/dev/null 2>&1; then
           local NVM_BIN
           NVM_BIN="$(nvm use system >/dev/null 2>&1 && command which node)"
           if [ -n "$NVM_BIN" ]; then
@@ -1162,8 +1455,8 @@
 
       local INSTALLS
       if [ "_$PROVIDED_VERSION" = "_system" ]; then
-        if ! nvm_has_system_node; then
-          echo 'No system version of node detected.' >&2
+        if ! nvm_has_system_node && ! nvm_has_system_iojs; then
+          echo 'No system version of node or io.js detected.' >&2
           return 3
         fi
         INSTALLS=$(nvm deactivate > /dev/null && npm list -g --depth=0 | command tail -n +2 | command grep -o -e ' [^@]*' | command cut -c 2- | command grep -v npm | command xargs)
@@ -1187,7 +1480,14 @@
       echo "0.22.2"
     ;;
     "unload" )
-      unset -f nvm nvm_print_versions nvm_checksum nvm_ls_remote nvm_ls nvm_remote_version nvm_version nvm_rc_version nvm_version_greater nvm_version_greater_than_or_equal_to nvm_supports_source_options > /dev/null 2>&1
+      unset -f nvm nvm_print_versions nvm_checksum \
+        nvm_iojs_prefix nvm_node_prefix \
+        nvm_add_iojs_prefix nvm_strip_iojs_prefix \
+        nvm_is_iojs_version \
+        nvm_ls_remote nvm_ls nvm_remote_version \
+        nvm_version nvm_rc_version \
+        nvm_version_greater nvm_version_greater_than_or_equal_to \
+        nvm_supports_source_options > /dev/null 2>&1
       unset RC_VERSION NVM_NODEJS_ORG_MIRROR NVM_DIR NVM_CD_FLAGS > /dev/null 2>&1
     ;;
     * )
diff --git "a/test/fast/Listing versions/Running \"nvm ls node\" should return a nonzero exit code when not found" "b/test/fast/Listing versions/Running \"nvm ls node_\" should return a nonzero exit code when not found"
similarity index 78%
rename from "test/fast/Listing versions/Running \"nvm ls node\" should return a nonzero exit code when not found"
rename to "test/fast/Listing versions/Running \"nvm ls node_\" should return a nonzero exit code when not found"
index f7d68f7..2d6b012 100755
--- "a/test/fast/Listing versions/Running \"nvm ls node\" should return a nonzero exit code when not found"
+++ "b/test/fast/Listing versions/Running \"nvm ls node_\" should return a nonzero exit code when not found"
@@ -2,6 +2,6 @@
 
 . ../../../nvm.sh
 
-nvm ls node
+nvm ls node_
 [ "$?" = "3" ]
 
diff --git "a/test/fast/Listing versions/Running \"nvm ls\" should display all installed versions." "b/test/fast/Listing versions/Running \"nvm ls\" should display all installed versions."
index be0dddb..e7cc3f7 100755
--- "a/test/fast/Listing versions/Running \"nvm ls\" should display all installed versions."
+++ "b/test/fast/Listing versions/Running \"nvm ls\" should display all installed versions."
@@ -8,11 +8,17 @@
 mkdir ../../../v0.3.1
 mkdir ../../../v0.3.3
 mkdir ../../../v0.3.9
+mkdir -p ../../../versions/node/v0.12.87
+mkdir -p ../../../versions/node/v0.12.9
+mkdir -p ../../../versions/io.js/v0.1.2
+mkdir -p ../../../versions/io.js/v0.10.2
 
 # The result should contain the version numbers.
-nvm ls | grep v0.0.1 &&
-nvm ls | grep v0.0.3 &&
-nvm ls | grep v0.0.9 &&
-nvm ls | grep v0.3.1 &&
-nvm ls | grep v0.3.3 &&
-nvm ls | grep v0.3.9
+nvm ls | grep v0.0.1 >/dev/null &&
+nvm ls | grep v0.0.3 >/dev/null &&
+nvm ls | grep v0.0.9 >/dev/null &&
+nvm ls | grep v0.3.1 >/dev/null &&
+nvm ls | grep v0.3.3 >/dev/null &&
+nvm ls | grep v0.3.9 >/dev/null &&
+nvm ls | grep v0.12.87 >/dev/null &&
+nvm ls | grep iojs-v0.1.2 >/dev/null
diff --git a/test/fast/Unit tests/nvm_add_iojs_prefix b/test/fast/Unit tests/nvm_add_iojs_prefix
new file mode 100755
index 0000000..4a8d1ee
--- /dev/null
+++ b/test/fast/Unit tests/nvm_add_iojs_prefix
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+[ "_$(nvm_add_iojs_prefix 1)" = "_iojs-v1" ] || die '"nvm_add_iojs_prefix 1" did not return "iojs-v1"'
+[ "_$(nvm_add_iojs_prefix iojs-1)" = "_iojs-v1" ] || die '"nvm_add_iojs_prefix iojs-1" did not return "iojs-v1"'
+[ "_$(nvm_add_iojs_prefix iojs-1.2.3)" = "_iojs-v1.2.3" ] || die '"nvm_add_iojs_prefix iojs-1.2.3" did not return "iojs-v1.2.3"'
diff --git a/test/fast/Unit tests/nvm_ensure_version_prefix b/test/fast/Unit tests/nvm_ensure_version_prefix
index 72b301c..184ddea 100755
--- a/test/fast/Unit tests/nvm_ensure_version_prefix
+++ b/test/fast/Unit tests/nvm_ensure_version_prefix
@@ -7,3 +7,6 @@
 [ "_$(nvm_ensure_version_prefix 1)" = "_v1" ] || die '"nvm_ensure_version_prefix 1" did not return "v1"'
 [ "_$(nvm_ensure_version_prefix v1)" = "_v1" ] || die '"nvm_ensure_version_prefix v1" did not return "v1"'
 [ "_$(nvm_ensure_version_prefix foo)" = "_foo" ] || die '"nvm_ensure_version_prefix foo" did not return "foo"'
+
+[ "_$(nvm_ensure_version_prefix iojs-1)" = "_iojs-v1" ] || die '"nvm_ensure_version_prefix iojs-1" did not return "iojs-v1"'
+[ "_$(nvm_ensure_version_prefix iojs-v1)" = "_iojs-v1" ] || die '"nvm_ensure_version_prefix iojs-v1" did not return "iojs-v1"'
diff --git a/test/fast/Unit tests/nvm_has_system_iojs b/test/fast/Unit tests/nvm_has_system_iojs
new file mode 100755
index 0000000..bb58da6
--- /dev/null
+++ b/test/fast/Unit tests/nvm_has_system_iojs
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+cleanup () {
+  rm ../../../versions/io.js/v0.1.2/node
+  rm ../../../versions/io.js/v0.1.2/iojs
+  rmdir ../../../versions/io.js/v0.1.2
+}
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+mkdir ../../../versions/io.js/v0.1.2
+touch ../../../versions/io.js/v0.1.2/node
+touch ../../../versions/io.js/v0.1.2/iojs
+
+nvm use iojs-v0.1.2
+
+if command -v iojs; then
+  nvm_has_system_iojs
+else
+  ! nvm_has_system_iojs
+fi
+
+nvm deactivate /dev/null 2>&1
+
+if command -v iojs; then
+  nvm_has_system_iojs
+else
+  ! nvm_has_system_iojs
+fi
+
diff --git a/test/fast/Unit tests/nvm_iojs_prefix b/test/fast/Unit tests/nvm_iojs_prefix
new file mode 100755
index 0000000..6666695
--- /dev/null
+++ b/test/fast/Unit tests/nvm_iojs_prefix
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+[ "$(nvm_iojs_prefix)" = "iojs" ] || die '"nvm_iojs_prefix" did not return the string "iojs". why did this fail?!'
diff --git a/test/fast/Unit tests/nvm_is_iojs_version b/test/fast/Unit tests/nvm_is_iojs_version
new file mode 100755
index 0000000..e2f5e3f
--- /dev/null
+++ b/test/fast/Unit tests/nvm_is_iojs_version
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+nvm_is_iojs_version 'iojs-' || die '"nvm_is_iojs_version iojs- was not true'
+nvm_is_iojs_version 'iojs-foo' || die '"nvm_is_iojs_version iojs- was not true'
+! nvm_is_iojs_version 'iojs' || die '"nvm_is_iojs_version iojs was not false'
+! nvm_is_iojs_version 'v1.0.0' || die '"nvm_is_iojs_version v1.0.0" was not false'
diff --git a/test/fast/Unit tests/nvm_ls_remote_iojs b/test/fast/Unit tests/nvm_ls_remote_iojs
new file mode 100755
index 0000000..bd104f1
--- /dev/null
+++ b/test/fast/Unit tests/nvm_ls_remote_iojs
@@ -0,0 +1,34 @@
+#!/bin/sh
+
+die () { echo $@ ; cleanup ; exit 1; }
+
+cleanup() {
+  unset -f nvm_download
+}
+
+. ../../../nvm.sh
+
+# sample output at the time the test was written
+nvm_download() {
+  echo 'version	date	files	npm	v8	uv	zlib	openssl	modules'
+  echo 'v1.0.1	2015-01-14	linux-armv7l,linux-x64,linux-x86,osx-x64-tar,win-x64-exe,win-x64-msi,win-x86-exe,win-x86-msi'
+  echo 'v1.0.0	2015-01-14	linux-armv7l,linux-x64,linux-x86,osx-x64-tar,win-x64-exe,win-x64-msi,win-x86-exe,win-x86-msi'
+}
+
+OUTPUT="$(nvm_ls_remote_iojs foo)"
+EXIT_CODE="$(nvm_ls_remote_iojs foo >/dev/null 2>&1 ; echo $?)"
+[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
+[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
+
+OUTPUT="$(nvm_ls_remote_iojs)"
+EXPECTED_OUTPUT="$(nvm_download | \egrep -o 'v[0-9]+\.[0-9]+\.[0-9]+' | sort -t. -u -k 1.2,1n -k 2,2n -k 3,3n | sed -e 's/^/iojs-/')"
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "bare nvm_ls_remote_iojs did not output expected sorted versions; got $(echo "$OUTPUT") expected $(echo "$EXPECTED_OUTPUT")"
+
+OUTPUT="$(nvm_ls_remote_iojs 1.0)"
+EXPECTED_OUTPUT="iojs-v1.0.0
+iojs-v1.0.1"
+
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die "nvm_ls_remote_iojs 1.0 did not output 1.0.x versions; got $OUTPUT"
+
+cleanup
+
diff --git a/test/fast/Unit tests/nvm_node_prefix b/test/fast/Unit tests/nvm_node_prefix
new file mode 100755
index 0000000..a0bc098
--- /dev/null
+++ b/test/fast/Unit tests/nvm_node_prefix
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+[ "$(nvm_node_prefix)" = "node" ] || die '"nvm_node_prefix" did not return the string "node". why did this fail?!'
diff --git a/test/fast/Unit tests/nvm_remote_version b/test/fast/Unit tests/nvm_remote_version
index f7fc377..16b6e3c 100755
--- a/test/fast/Unit tests/nvm_remote_version
+++ b/test/fast/Unit tests/nvm_remote_version
@@ -3,7 +3,7 @@
 die () { echo $@ ; cleanup ; exit 1; }
 
 cleanup() {
-  unset -f nvm_ls_remote
+  unset -f nvm_ls_remote nvm_ls_remote_iojs
 }
 
 . ../../../nvm.sh
@@ -11,25 +11,42 @@
 nvm_ls_remote() {
   echo "N/A"
 }
-
 OUTPUT="$(nvm_remote_version foo)"
 EXIT_CODE="$(nvm_remote_version foo >/dev/null 2>&1 ; echo $?)"
-
 [ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
 [ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
 
+nvm_ls_remote_iojs() {
+  echo "N/A"
+}
+OUTPUT="$(nvm_remote_version iojs-foo)"
+EXIT_CODE="$(nvm_remote_version iojs-foo >/dev/null 2>&1 ; echo $?)"
+[ "_$OUTPUT" = "_N/A" ] || die "nonexistent version did not report N/A"
+[ "_$EXIT_CODE" = "_3" ] || die "nonexistent version did not exit with code 3, got $EXIT_CODE"
+
+
 nvm_ls_remote() {
   echo "test output"
   echo "more test output"
   echo "pattern received: _$1_"
 }
-
 OUTPUT="$(nvm_remote_version foo)"
 EXIT_CODE="$(nvm_remote_version foo >/dev/null 2>&1 ; echo $?)"
-
 [ "_$OUTPUT" = "_pattern received: _foo_" ] \
   || die "nvm_remote_version foo did not return last line only of nvm_ls_remote foo; got $OUTPUT"
 [ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version foo did not exit with 0, got $EXIT_CODE"
 
+nvm_ls_remote_iojs() {
+  echo "test iojs output"
+  echo "more iojs test output"
+  echo "iojs pattern received: _$1_"
+
+}
+OUTPUT="$(nvm_remote_version iojs-foo)"
+EXIT_CODE="$(nvm_remote_version iojs-foo >/dev/null 2>&1 ; echo $?)"
+[ "_$OUTPUT" = "_iojs pattern received: _iojs-foo_" ] \
+  || die "nvm_remote_version iojs-foo did not return last line only of nvm_ls_remote_iojs foo; got $OUTPUT"
+[ "_$EXIT_CODE" = "_0" ] || die "nvm_remote_version iojs-foo did not exit with 0, got $EXIT_CODE"
+
 cleanup
 
diff --git a/test/fast/Unit tests/nvm_strip_iojs_prefix b/test/fast/Unit tests/nvm_strip_iojs_prefix
new file mode 100755
index 0000000..782fbc4
--- /dev/null
+++ b/test/fast/Unit tests/nvm_strip_iojs_prefix
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+[ "_$(nvm_strip_iojs_prefix iojs)" = "_" ] || die '"nvm_strip_iojs_prefix iojs" did not return an empty string'
+[ "_$(nvm_strip_iojs_prefix iojs-)" = "_" ] || die '"nvm_strip_iojs_prefix iojs-" did not return an empty string'
+[ "_$(nvm_strip_iojs_prefix iojs-foo)" = "_foo" ] || die '"nvm_strip_iojs_prefix iojs-foo" did not return "foo"'
+[ "_$(nvm_strip_iojs_prefix iojsfoo)" = "_iojsfoo" ] || die '"nvm_strip_iojs_prefix iojsfoo" did not return "iojsfoo"'
diff --git a/test/fast/Unit tests/nvm_strip_path b/test/fast/Unit tests/nvm_strip_path
index 0d119aa..b926cc4 100755
--- a/test/fast/Unit tests/nvm_strip_path
+++ b/test/fast/Unit tests/nvm_strip_path
@@ -4,7 +4,7 @@
 
 . ../../../nvm.sh
 
-TEST_PATH=$NVM_DIR/v0.10.5/bin:/usr/bin:$NVM_DIR/v0.11.5/bin:$NVM_DIR/v0.9.5/bin:/usr/local/bin:$NVM_DIR/v0.2.5/bin
+TEST_PATH=$NVM_DIR/v0.10.5/bin:/usr/bin:$NVM_DIR/v0.11.5/bin:$NVM_DIR/v0.9.5/bin:/usr/local/bin:$NVM_DIR/v0.2.5/bin:$NVM_DIR/versions/node/v0.12.0/bin:$NVM_DIR/versions/io.js/v1.0.0/bin
 
 STRIPPED_PATH=`nvm_strip_path "$TEST_PATH" "/bin"`
 
diff --git a/test/fast/Unit tests/nvm_version b/test/fast/Unit tests/nvm_version
new file mode 100755
index 0000000..4d5063b
--- /dev/null
+++ b/test/fast/Unit tests/nvm_version
@@ -0,0 +1,48 @@
+#!/bin/sh
+
+die () { echo $@ ; cleanup ; exit 1; }
+cleanup () {
+  unset -f nvm_ls_current nvm_ls
+}
+
+. ../../../nvm.sh
+
+nvm_ls_current() {
+  echo "CURRENT!"
+  return 7
+}
+
+OUTPUT="$(nvm_version current)"
+EXPECTED_OUTPUT="CURRENT!"
+EXIT_CODE="$(nvm_version current 2>&1 >/dev/null ; echo $?)"
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version current" did not return nvm_ls_current output'
+[ "_$EXIT_CODE" = "_7" ] || die '"nvm_version current" did not return nvm_ls_current exit code'
+
+OUTPUT="$(nvm_version)"
+EXPECTED_OUTPUT="CURRENT!"
+EXIT_CODE="$(nvm_version 2>&1 >/dev/null ; echo $?)"
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return nvm_ls_current output'
+[ "_$EXIT_CODE" = "_7" ] || die '"nvm_version" did not return nvm_ls_current exit code'
+
+nvm_ls() {
+  echo "line 1"
+  echo "line 2"
+  echo "pattern: $1"
+}
+[ "_$(nvm_version foo)" = "_pattern: foo" ] || die '"nvm_version foo" did not pass the pattern to "nvm_ls", or return the last line'
+[ "_$(nvm_version node)" = "_pattern: stable" ] || die '"nvm_version node" did not pass "stable" to "nvm_ls"'
+[ "_$(nvm_version node-)" = "_pattern: stable" ] || die '"nvm_version node-" did not pass "stable" to "nvm_ls"'
+
+nvm_ls() { echo "N/A"; }
+OUTPUT="$(nvm_version foo)"
+EXPECTED_OUTPUT="N/A"
+EXIT_CODE="$(nvm_version foo 2>&1 >/dev/null ; echo $?)"
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return N/A when nvm_ls returns N/A'
+[ "_$EXIT_CODE" = "_3" ] || die '"nvm_version" returning N/A did not exit code with code 3'
+
+nvm_ls() { echo; }
+OUTPUT="$(nvm_version foo)"
+EXPECTED_OUTPUT="N/A"
+EXIT_CODE="$(nvm_version foo 2>&1 >/dev/null ; echo $?)"
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] || die '"nvm_version" did not return N/A when nvm_ls returns nothing'
+[ "_$EXIT_CODE" = "_3" ] || die '"nvm_version" returning N/A did not exit code with code 3'
diff --git a/test/fast/Unit tests/nvm_version_dir b/test/fast/Unit tests/nvm_version_dir
index f6346fa..6fc880a 100755
--- a/test/fast/Unit tests/nvm_version_dir
+++ b/test/fast/Unit tests/nvm_version_dir
@@ -5,6 +5,7 @@
 . ../../../nvm.sh
 
 [ "$(nvm_version_dir)" = "$NVM_DIR/versions/node" ] || die '"nvm_version_dir" did not return new dir path'
+[ "$(nvm_version_dir iojs)" = "$NVM_DIR/versions/io.js" ] || die '"nvm_version_dir iojs" did not return iojs dir path'
 [ "$(nvm_version_dir new)" = "$(nvm_version_dir)" ] || die '"nvm_version_dir new" did not return new dir path'
 [ "$(nvm_version_dir old)" = "$NVM_DIR" ] || die '"nvm_version_dir old" did not return old dir path'
 [ "$(nvm_version_dir foo 2>&1)" = "unknown version dir" ] || die '"nvm_version_dir foo" did not error out'
diff --git a/test/fast/Unit tests/nvm_version_path b/test/fast/Unit tests/nvm_version_path
index f3ca584..547ceb8 100755
--- a/test/fast/Unit tests/nvm_version_path
+++ b/test/fast/Unit tests/nvm_version_path
@@ -8,4 +8,5 @@
 [ "$(nvm_version_path 2>&1)" = "version is required" ] || die '"nvm_version_path" did not error out'
 [ "$(nvm_version_path v0.11.0)" = "$NVM_DIR/v0.11.0" ] || die 'old version has the wrong path'
 [ "$(nvm_version_path v0.12.0)" = "$NVM_DIR/versions/node/v0.12.0" ] || die 'new version has the wrong path'
+[ "$(nvm_version_path iojs-v0.12.0)" = "$NVM_DIR/versions/io.js/v0.12.0" ] || die 'iojs version has the wrong path'
 
diff --git a/test/installation/io.js/install already installed uses it b/test/installation/io.js/install already installed uses it
new file mode 100755
index 0000000..07e5487
--- /dev/null
+++ b/test/installation/io.js/install already installed uses it
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+[ "$(nvm install invalid.invalid 2>&1)" = "Version 'invalid.invalid' not found - try \`nvm ls-remote\` to browse available versions." ] || die "nvm installing an invalid version did not print a nice error message"
+
+# Remove the stuff we're clobbering.
+[ -e ../../../versions/io.js/v1.0.0 ] && rm -R ../../../versions/io.js/v1.0.0
+[ -e ../../../versions/io.js/v1.0.1 ] && rm -R ../../../versions/io.js/v1.0.1
+
+# Install from binary
+nvm install iojs-v1.0.0
+nvm install iojs-v1.0.1
+
+nvm use iojs-v1.0.0
+
+node --version | grep v1.0.0 || die "precondition failed: iojs node doesn't start at v1.0.0"
+iojs --version | grep v1.0.0 || die "precondition failed: iojs binary doesn't start at v1.0.0"
+
+nvm install iojs-v1.0.1
+
+node --version | grep v1.0.1 || die "nvm install on already installed version doesn't use it (node binary)"
+iojs --version | grep v1.0.1 || die "nvm install on already installed version doesn't use it (iojs binary)"
+
diff --git a/test/installation/io.js/install from binary b/test/installation/io.js/install from binary
new file mode 100755
index 0000000..12cf963
--- /dev/null
+++ b/test/installation/io.js/install from binary
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+NVM_TEST_VERSION="v1.0.0"
+NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION"
+
+# Remove the stuff we're clobbering.
+[ -e ../../../$NVM_TEST_VERSION ] && rm -R ../../../$NVM_TEST_VERSION
+
+# Install from binary
+nvm install $NVM_PREFIXED_TEST_VERSION || die "install $NVM_PREFIXED_TEST_VERSION failed"
+
+# Check
+[ -d ../../../versions/io.js/$NVM_TEST_VERSION ]
+nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION || die "'nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed"
+
diff --git a/test/installation/io.js/install two versions and use the latest one b/test/installation/io.js/install two versions and use the latest one
new file mode 100755
index 0000000..7b60d74
--- /dev/null
+++ b/test/installation/io.js/install two versions and use the latest one
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+# Remove the stuff we're clobbering.
+[ -e ../../../versions/io.js/v1.0.0 ] && rm -R ../../../versions/io.js/v1.0.0
+[ -e ../../../versions/io.js/v1.0.1 ] && rm -R ../../../versions/io.js/v1.0.1
+
+# Install from binary
+nvm install iojs-v1.0.0 || die "'nvm install iojs-v1.0.0' failed"
+nvm i iojs-v1.0.1 || die "'nvm i iojs-v1.0.1' failed"
+
+# Check
+[ -d ../../../versions/io.js/v1.0.0 ] || die "iojs v1.0.0 didn't exist"
+[ -d ../../../versions/io.js/v1.0.1 ] || die "iojs v1.0.1 didn't exist"
+
+# Use the first one
+nvm use iojs-1.0.0 || die "'nvm use iojs-1.0.0' failed"
+
+# Use the latest one
+nvm use iojs-1 || die "'nvm use iojs-1' failed"
+[ "_$(node --version)" = "_v1.0.1" ] || die "'node --version' was not v1.0.1, got: $(node --version)"
+[ "_$(iojs --version)" = "_v1.0.1" ] || die "'iojs --version' was not v1.0.1, got: $(iojs --version)"
+
diff --git a/test/installation/io.js/install version specified in .nvmrc from binary b/test/installation/io.js/install version specified in .nvmrc from binary
new file mode 100755
index 0000000..dfab909
--- /dev/null
+++ b/test/installation/io.js/install version specified in .nvmrc from binary
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+NVM_TEST_VERSION=v1.0.0
+NVM_PREFIXED_TEST_VERSION="iojs-$NVM_TEST_VERSION"
+VERSION_PATH="../../../versions/io.js/$NVM_TEST_VERSION"
+
+# Remove the stuff we're clobbering.
+[ -e $VERSION_PATH ] && rm -R $VERSION_PATH
+
+# Install from binary
+echo "$NVM_PREFIXED_TEST_VERSION" > .nvmrc
+
+nvm install || die "'nvm install' failed"
+
+# Check
+[ -d $VERSION_PATH ] || die "./$VERSION_PATH did not exist"
+nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION \
+  || "'nvm run $NVM_PREFIXED_TEST_VERSION --version | grep $NVM_TEST_VERSION' failed"
+
+
diff --git a/test/installation/io.js/install while reinstalling packages b/test/installation/io.js/install while reinstalling packages
new file mode 100755
index 0000000..d7d4ee4
--- /dev/null
+++ b/test/installation/io.js/install while reinstalling packages
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+# Remove the stuff we're clobbering.
+[ -e ../../../versions/io.js/v1.0.0 ] && rm -R ../../../versions/io.js/v1.0.0
+[ -e ../../../versions/io.js/v1.0.1 ] && rm -R ../../../versions/io.js/v1.0.1
+
+# Install from binary
+nvm install iojs-v1.0.0
+
+# Check
+[ -d ../../../versions/io.js/v1.0.0 ] || die "nvm install iojs-v1.0.0 didn't install"
+
+node --version | grep v1.0.0 > /dev/null || die "nvm install didn't use iojs-v1.0.0"
+
+npm install -g is-nan@1.0.1 || die "npm install -g is-nan failed"
+npm list --global | grep is-nan > /dev/null || die "is-nan isn't installed"
+
+nvm ls iojs-1 | grep iojs-v1.0.0 > /dev/null || die "nvm ls iojs-1 didn't show iojs-v1.0.0"
+
+nvm install iojs-v1.0.1 --reinstall-packages-from=iojs-1.0.0 || die "nvm install iojs-v1.0.1 --reinstall-packages-from=iojs-1.0.0 failed"
+
+[ -d ../../../versions/io.js/v1.0.1 ] || die "nvm install iojs-v1.0.1 didn't install"
+
+nvm use iojs-1
+node --version | grep v1.0.1 > /dev/null || die "nvm use iojs-1 didn't use v1.0.1"
+
+npm list --global | grep is-nan > /dev/null || die "is-nan isn't installed"
+
diff --git a/test/installation/io.js/setup_dir b/test/installation/io.js/setup_dir
new file mode 100755
index 0000000..50dc4e4
--- /dev/null
+++ b/test/installation/io.js/setup_dir
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+if [ -f ".nvmrc" ]; then
+  mv .nvmrc .nvmrc.bak
+fi
+
diff --git a/test/installation/io.js/teardown_dir b/test/installation/io.js/teardown_dir
new file mode 100755
index 0000000..a7e6f3e
--- /dev/null
+++ b/test/installation/io.js/teardown_dir
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+. ../../../nvm.sh
+nvm deactivate
+nvm uninstall iojs-v1.0.0
+
+if [ -f ".nvmrc" ]; then
+  rm .nvmrc
+fi
+
+if [ -f ".nvmrc.bak" ]; then
+  mv .nvmrc.bak .nvmrc
+fi
+
diff --git a/test/slow/node 0.6.21 should install 0.6.21-pre b/test/slow/node 0.6.21 should install 0.6.21-pre
index c579e16..93afff7 100755
--- a/test/slow/node 0.6.21 should install 0.6.21-pre
+++ b/test/slow/node 0.6.21 should install 0.6.21-pre
@@ -5,6 +5,6 @@
 . ../../nvm.sh
 
 nvm install 0.6.21 || die 'v0.6.21 installation failed'
-[ "$(node -v)" = "v0.6.21-pre" ] || die "v0.6.21-pre not installed with v0.6.21, got $(node -v)"
-[ "$(nvm current)" = "v0.6.21" ] || die "v0.6.21-pre not reported as v0.6.21, got $(nvm current)"
+[ "_$(node -v)" = "_v0.6.21-pre" ] || die "v0.6.21-pre not installed with v0.6.21, got $(node -v)"
+[ "_$(nvm current)" = "_v0.6.21" ] || die "v0.6.21-pre not reported as v0.6.21, got $(nvm current)"
 
diff --git "a/test/slow/nvm use/Running \"nvm use iojs\" uses latest io.js version" "b/test/slow/nvm use/Running \"nvm use iojs\" uses latest io.js version"
new file mode 100755
index 0000000..5b867f3
--- /dev/null
+++ "b/test/slow/nvm use/Running \"nvm use iojs\" uses latest io.js version"
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+nvm deactivate 2>&1 >/dev/null || die 'deactivate failed'
+
+nvm use iojs || die 'nvm use iojs failed'
+OUTPUT="$(nvm current)"
+EXPECTED_OUTPUT="iojs-v1.0.1"
+
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \
+  || die "'nvm use iojs' + 'nvm current' did not output '$EXPECTED_OUTPUT'; got '$OUTPUT'"
diff --git "a/test/slow/nvm use/Running \"nvm use node\" uses latest stable node version" "b/test/slow/nvm use/Running \"nvm use node\" uses latest stable node version"
new file mode 100755
index 0000000..3514256
--- /dev/null
+++ "b/test/slow/nvm use/Running \"nvm use node\" uses latest stable node version"
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+die () { echo $@ ; exit 1; }
+
+. ../../../nvm.sh
+
+nvm deactivate 2>&1 >/dev/null || die 'deactivate failed'
+
+nvm use node || die 'nvm use node failed'
+OUTPUT="$(nvm current)"
+EXPECTED_OUTPUT="$(nvm_version stable)"
+
+[ "_$OUTPUT" = "_$EXPECTED_OUTPUT" ] \
+  || die "'nvm use node' + 'nvm current' did not output '$EXPECTED_OUTPUT'; got '$OUTPUT'"
diff --git a/test/slow/nvm use/setup_dir b/test/slow/nvm use/setup_dir
new file mode 100755
index 0000000..a3ab0f7
--- /dev/null
+++ b/test/slow/nvm use/setup_dir
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. ../../../nvm.sh
+
+mkdir -p ../../../.nvm_use_bak
+if [ -d "../../../v*" ]; then
+  mv "../../../v*" ../../../.nvm_use_bak/
+fi
+
+for VERSION in "0.8.7" "0.9.1" "0.10.1" "0.11.1"; do
+  nvm install "v$VERSION"
+done
+
+for VERSION in "1.0.0" "1.0.1"; do
+  nvm install "iojs-v$VERSION"
+done
diff --git a/test/slow/nvm use/teardown_dir b/test/slow/nvm use/teardown_dir
new file mode 100755
index 0000000..eeda337
--- /dev/null
+++ b/test/slow/nvm use/teardown_dir
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+. ../../../nvm.sh
+
+for VERSION in "0.8.7" "0.9.1" "0.10.1" "0.11.1"; do
+  nvm uninstall "$VERSION"
+done
+
+for VERSION in "1.0.0" "1.0.1"; do
+  nvm uninstall "iojs-v$VERSION"
+done
+
+if [ -d ../../../.nvm_use_bak/* ]; then
+  mv ../../../.nvm_use_bak/* ../../../
+fi
+rmdir ../../../.nvm_use_bak