diff --git a/src/config.js b/src/config.js
index 47de6d88a264e080b587ea281cb6b48810c7b647..833f1525457a7c6d8f9719e5faf23f6f20b5dbf0 100644
--- a/src/config.js
+++ b/src/config.js
@@ -6,16 +6,19 @@ module.exports = {
       return `renovate/${params.depName}-${params.newVersionMajor}.x`;
     },
     commitMessage: (params) => {
-      return `Upgrade dependency ${params.depName} to version ${params.newVersion}`;
+      return `Update dependency ${params.depName} to version ${params.newVersion}`;
     },
     prBody: (params) => {
       return `This Pull Request updates dependency ${params.depName} from version ${params.currentVersion} to ${params.newVersion}.`;
     },
     prTitleMajor: (params) => {
-      return `Upgrade dependency ${params.depName} to version ${params.newVersionMajor}.x`;
+      return `Update dependency ${params.depName} to version ${params.newVersionMajor}.x`;
     },
     prTitleMinor: (params) => {
-      return `Upgrade dependency ${params.depName} to version ${params.newVersion}`;
+      return `Update dependency ${params.depName} to version ${params.newVersion}`;
+    },
+    prTitlePin: (params) => {
+      return `Pin dependency ${params.depName} to version ${params.newVersion}`;
     },
   }
 };
diff --git a/src/helpers/npm.js b/src/helpers/npm.js
index 1138fe30906e7d5be3073c12701ab95379bccdea..e1aff780a634c8e8ee241790ddd33ecdea4871c3 100644
--- a/src/helpers/npm.js
+++ b/src/helpers/npm.js
@@ -32,7 +32,7 @@ module.exports = {
       }
       Object.keys(packageContents[depType]).forEach(function(depName) {
         var currentVersion = packageContents[depType][depName];
-        if (!semver.valid(currentVersion)) {
+        if (!isValidVersion(currentVersion)) {
           if (config.verbose) {
             console.log(`${depName}: Skipping invalid version ${currentVersion}`);
           }
@@ -44,12 +44,13 @@ module.exports = {
             if (config.verbose) {
               console.log(`${depName}: Upgrades = ${JSON.stringify(res)}`);
             }
-            Object.keys(res).forEach(function(majorVersion) {
+            Object.keys(res).forEach(function(key) {
               allDependencyUpgrades.push({
+                upgradeType: (key === 'pin') ? 'pin' : 'upgrade',
                 depType: depType,
                 depName: depName,
                 currentVersion: currentVersion,
-                newVersion: res[majorVersion],
+                newVersion: res[key],
               });
             });
           } else {
@@ -74,10 +75,14 @@ function getDependency(depName) {
 function getDependencyUpgrades(depName, currentVersion) {
   return getDependency(depName)
   .then(res => {
-    let allUpgrades = {};
     if (!res.body['versions']) {
       console.log(depName + ' versions is null');
     }
+    if (isRange(currentVersion)) {
+      // Pin ranges to their maximum satisfying version
+      return { 'pin': semver.maxSatisfying(Object.keys(res.body.versions), currentVersion) };
+    }
+    const allUpgrades = {};
     Object.keys(res.body['versions']).forEach(function(version) {
       if (stable.is(currentVersion) && !stable.is(version)) {
         // Ignore unstable versions, unless the current version is unstable
@@ -94,3 +99,13 @@ function getDependencyUpgrades(depName, currentVersion) {
     return allUpgrades;
   });
 }
+
+function isRange(input) {
+  // Pinned versions also return true for semver.validRange
+  // We need to check first that they're not "valid" to get only ranges
+  return !semver.valid(input) && semver.validRange(input);
+}
+
+function isValidVersion(input) {
+  return semver.valid(input) || semver.validRange(input);
+}
diff --git a/src/index.js b/src/index.js
index 3c41a8c8a12228fa4d7f0c5858fb58547cdd7583..03eee1929eb792422cf3925f66140be33a034fe1 100644
--- a/src/index.js
+++ b/src/index.js
@@ -65,16 +65,18 @@ function processUpgradesSequentially(upgrades) {
   // 2. Edge case collision of branch name, e.g. dependency also listed as dev dependency
   return upgrades.reduce((promise, upgrade) => {
     return promise.then(() => {
-      return updateDependency(upgrade.depType, upgrade.depName, upgrade.currentVersion, upgrade.newVersion);
+      return updateDependency(upgrade.upgradeType, upgrade.depType, upgrade.depName, upgrade.currentVersion, upgrade.newVersion);
     });
   }, Promise.resolve());
 }
 
-function updateDependency(depType, depName, currentVersion, newVersion) {
+function updateDependency(upgradeType, depType, depName, currentVersion, newVersion) {
   const newVersionMajor = semver.major(newVersion);
   const branchName = config.templates.branchName({depType, depName, currentVersion, newVersion, newVersionMajor});
   let prTitle = '';
-  if (newVersionMajor > semver.major(currentVersion)) {
+  if (upgradeType === 'pin') {
+    prTitle = config.templates.prTitlePin({ depType, depName, currentVersion, newVersion, newVersionMajor });
+  } else if (newVersionMajor > semver.major(currentVersion)) {
     prTitle = config.templates.prTitleMajor({ depType, depName, currentVersion, newVersion, newVersionMajor });
   } else {
     prTitle = config.templates.prTitleMinor({ depType, depName, currentVersion, newVersion, newVersionMajor });