diff --git a/packages/react-scripts/config/paths.js b/packages/react-scripts/config/paths.js
index 7d114080f7c7251b4d09457fd0026312e06d1783..7ad1fc95c89c116ae68db1f3e1175017a2c7c82f 100644
--- a/packages/react-scripts/config/paths.js
+++ b/packages/react-scripts/config/paths.js
@@ -91,11 +91,13 @@ module.exports = {
 
 // @remove-on-eject-begin
 function resolveOwn(relativePath) {
-  return path.resolve(__dirname, relativePath);
+  return path.resolve(__dirname, '..', relativePath);
 }
 
 // config before eject: we're in ./node_modules/react-scripts/config/
 module.exports = {
+  appPath: resolveApp('.'),
+  ownPath: resolveApp('node_modules/react-scripts'),
   appBuild: resolveApp('build'),
   appPublic: resolveApp('public'),
   appHtml: resolveApp('public/index.html'),
@@ -106,28 +108,33 @@ module.exports = {
   testsSetup: resolveApp('src/setupTests.js'),
   appNodeModules: resolveApp('node_modules'),
   // this is empty with npm3 but node resolution searches higher anyway:
-  ownNodeModules: resolveOwn('../node_modules'),
+  ownNodeModules: resolveOwn('node_modules'),
   nodePaths: nodePaths,
   publicUrl: getPublicUrl(resolveApp('package.json')),
   servedPath: getServedPath(resolveApp('package.json'))
 };
 
+var reactScriptsPath = path.resolve('node_modules/react-scripts');
+var reactScriptsLinked = fs.existsSync(reactScriptsPath) && fs.lstatSync(reactScriptsPath).isSymbolicLink();
+
 // config before publish: we're in ./packages/react-scripts/config/
-if (__dirname.indexOf(path.join('packages', 'react-scripts', 'config')) !== -1) {
+if (!reactScriptsLinked && __dirname.indexOf(path.join('packages', 'react-scripts', 'config')) !== -1) {
   module.exports = {
-    appBuild: resolveOwn('../../../build'),
-    appPublic: resolveOwn('../template/public'),
-    appHtml: resolveOwn('../template/public/index.html'),
-    appIndexJs: resolveOwn('../template/src/index.js'),
-    appPackageJson: resolveOwn('../package.json'),
-    appSrc: resolveOwn('../template/src'),
-    yarnLockFile: resolveOwn('../template/yarn.lock'),
-    testsSetup: resolveOwn('../template/src/setupTests.js'),
-    appNodeModules: resolveOwn('../node_modules'),
-    ownNodeModules: resolveOwn('../node_modules'),
+    appPath: resolveApp('.'),
+    ownPath: resolveOwn('.'),
+    appBuild: resolveOwn('../../build'),
+    appPublic: resolveOwn('template/public'),
+    appHtml: resolveOwn('template/public/index.html'),
+    appIndexJs: resolveOwn('template/src/index.js'),
+    appPackageJson: resolveOwn('package.json'),
+    appSrc: resolveOwn('template/src'),
+    yarnLockFile: resolveOwn('template/yarn.lock'),
+    testsSetup: resolveOwn('template/src/setupTests.js'),
+    appNodeModules: resolveOwn('node_modules'),
+    ownNodeModules: resolveOwn('node_modules'),
     nodePaths: nodePaths,
-    publicUrl: getPublicUrl(resolveOwn('../package.json')),
-    servedPath: getServedPath(resolveOwn('../package.json'))
+    publicUrl: getPublicUrl(resolveOwn('package.json')),
+    servedPath: getServedPath(resolveOwn('package.json'))
   };
 }
 // @remove-on-eject-end
diff --git a/packages/react-scripts/scripts/eject.js b/packages/react-scripts/scripts/eject.js
index a8ee0fc310205a5052bc75638a89d16959dbb0c0..473a40da4e18bab6f9105fe353178bb1302f7355 100644
--- a/packages/react-scripts/scripts/eject.js
+++ b/packages/react-scripts/scripts/eject.js
@@ -28,8 +28,8 @@ prompt(
 
   console.log('Ejecting...');
 
-  var ownPath = path.join(__dirname, '..');
-  var appPath = path.join(ownPath, '..', '..');
+  var ownPath = paths.ownPath;
+  var appPath = paths.appPath;
 
   function verifyAbsent(file) {
     if (fs.existsSync(path.join(appPath, file))) {
@@ -135,7 +135,6 @@ prompt(
   );
 
   // Add Babel config
-
   console.log('  Adding ' + cyan('Babel') + ' preset');
   appPackage.babel = babelConfig;