diff --git a/lib/versioning/maven/index.js b/lib/versioning/maven/index.js
index f34f5fd2887de4b5a43d6b22df36b737ce4f16ab..1ef505e3557414dd3dac14300f51cf4773e0cfbe 100644
--- a/lib/versioning/maven/index.js
+++ b/lib/versioning/maven/index.js
@@ -102,13 +102,21 @@ const isStable = version => {
   return null;
 };
 
-const maxSatisfyingVersion = (versions, range) =>
-  versions.find(version => matches(version, range));
+const maxSatisfyingVersion = (versions, range) => {
+  return versions.reduce((result, version) => {
+    if (matches(version, range)) {
+      if (!result) return version;
+      if (isGreaterThan(version, result)) return version;
+    }
+    return result;
+  }, null);
+};
 
 function getNewValue(currentValue, rangeStrategy, fromVersion, toVersion) {
-  return isVersion(currentValue)
-    ? toVersion
-    : autoExtendMavenRange(currentValue, toVersion);
+  if (isVersion(currentValue) || rangeStrategy === 'pin') {
+    return toVersion;
+  }
+  return autoExtendMavenRange(currentValue, toVersion);
 }
 
 module.exports = {
diff --git a/test/versioning/maven.spec.js b/test/versioning/maven.spec.js
index 43e6caf11824eea4cde074195c61e81a5e28e69f..9537ea58039c35c1a083ffdfcfae6966da946bcf 100644
--- a/test/versioning/maven.spec.js
+++ b/test/versioning/maven.spec.js
@@ -12,6 +12,7 @@ const {
   getMinor,
   getPatch,
   matches,
+  getNewValue,
 } = require('../../lib/versioning/maven/index');
 
 describe('versioning/maven/compare', () => {
@@ -326,4 +327,24 @@ describe('versioning/maven/index', () => {
     expect(matches('1.0.0.RC9.2', '(,1.0.0.RC9.2),(1.0.0.RC9.2,)')).toBe(false);
     expect(matches('1.0.0-RC14', '(,1.0.0.RC9.2),(1.0.0.RC9.2,)')).toBe(true);
   });
+  it('pins maven ranges', () => {
+    const sample = [
+      ['[1.2.3]', '1.2.3', '1.2.4'],
+      ['[1.0.0,1.2.3]', '1.0.0', '1.2.4'],
+      ['[1.0.0,1.2.23]', '1.0.0', '1.2.23'],
+      ['(,1.0]', '0.0.1', '2.0'],
+      ['],1.0]', '0.0.1', '2.0'],
+      ['(,1.0)', '0.1', '2.0'],
+      ['],1.0[', '2.0', '],2.0['],
+      ['[1.0,1.2],[1.3,1.5)', '1.0', '1.2.4'],
+      ['[1.0,1.2],[1.3,1.5[', '1.0', '1.2.4'],
+      ['[1.2.3,)', '1.2.3', '1.2.4'],
+      ['[1.2.3,[', '1.2.3', '1.2.4'],
+    ];
+    sample.forEach(([currentValue, fromVersion, toVersion]) => {
+      expect(getNewValue(currentValue, 'pin', fromVersion, toVersion)).toEqual(
+        toVersion
+      );
+    });
+  });
 });