diff --git a/src/wp-admin/includes/class-wp-filesystem-base.php b/src/wp-admin/includes/class-wp-filesystem-base.php
index c518408..090edec 100644
--- a/src/wp-admin/includes/class-wp-filesystem-base.php
+++ b/src/wp-admin/includes/class-wp-filesystem-base.php
@@ -668,6 +668,16 @@ class WP_Filesystem_Base {
 		return false;
 	}
 
+		/**
+		* Is the path a symbolic link.
+		*
+		* @param string $path File path.
+		* @return bool Whether $path is a symbolic link.
+		*/
+		public function is_link( $path ) {
+			return false;
+		}
+
 	/**
 	 * Check if a file is readable.
 	 *
diff --git a/src/wp-admin/includes/class-wp-filesystem-direct.php b/src/wp-admin/includes/class-wp-filesystem-direct.php
index f7d6cb1..051bb2a 100644
--- a/src/wp-admin/includes/class-wp-filesystem-direct.php
+++ b/src/wp-admin/includes/class-wp-filesystem-direct.php
@@ -287,7 +287,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
 		}
 		$file = str_replace( '\\', '/', $file ); // for win32, occasional problems deleting files otherwise
 
-		if ( 'f' == $type || $this->is_file( $file ) ) {
+		if ( 'f' == $type || $this->is_file( $file ) || 'l' === $type || $this->is_link( $file ) ) {
 			return @unlink( $file );
 		}
 		if ( ! $recursive && $this->is_dir( $file ) ) {
@@ -313,6 +313,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
 
 		return $retval;
 	}
+
 	/**
 	 * @param string $file
 	 * @return bool
@@ -320,6 +321,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
 	public function exists( $file ) {
 		return @file_exists( $file );
 	}
+
 	/**
 	 * @param string $file
 	 * @return bool
@@ -327,6 +329,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
 	public function is_file( $file ) {
 		return @is_file( $file );
 	}
+
 	/**
 	 * @param string $path
 	 * @return bool
@@ -336,6 +339,17 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
 	}
 
 	/**
+	 * Is the path a symbolic link.
+	 *
+	 * @param string $path File path.
+	 * @return bool Whether $path is a symbolic link.
+	 */
+	public function is_link( $path ) {
+		return @is_link( $path );
+	}
+
+	
+	/**
 	 * @param string $file
 	 * @return bool
 	 */
diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpext.php b/src/wp-admin/includes/class-wp-filesystem-ftpext.php
index 36648e1..befd785 100644
--- a/src/wp-admin/includes/class-wp-filesystem-ftpext.php
+++ b/src/wp-admin/includes/class-wp-filesystem-ftpext.php
@@ -361,6 +361,16 @@ class WP_Filesystem_FTPext extends WP_Filesystem_Base {
 	}
 
 	/**
+	 * Is the path a symbolic link.
+	 *
+	 * @param string $path File path.
+	 * @return bool Whether $path is a symbolic link.
+	 */
+	public function is_link( $path ) {
+		return false;
+	}
+
+	/**
 	 * @param string $file
 	 * @return bool
 	 */
diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
index 45f1235..4cf9f1d 100644
--- a/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
+++ b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
@@ -372,6 +372,16 @@ class WP_Filesystem_ftpsockets extends WP_Filesystem_Base {
 	}
 
 	/**
+	 * Is the path a symbolic link.
+	 *
+	 * @param string $path File path.
+	 * @return bool Whether $path is a symbolic link.
+	 */
+	public function is_link( $path ) {
+		return false;
+	}
+
+	/**
 	 * @param string $file
 	 * @return bool
 	 */
diff --git a/src/wp-admin/includes/class-wp-filesystem-ssh2.php b/src/wp-admin/includes/class-wp-filesystem-ssh2.php
index 82101be..af9752e 100644
--- a/src/wp-admin/includes/class-wp-filesystem-ssh2.php
+++ b/src/wp-admin/includes/class-wp-filesystem-ssh2.php
@@ -417,7 +417,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
 	 * @return bool
 	 */
 	public function delete( $file, $recursive = false, $type = false ) {
-		if ( 'f' == $type || $this->is_file( $file ) ) {
+		if ( 'f' == $type || $this->is_file( $file ) || 'l' === $type || $this->is_link( $file ) ) {
 			return ssh2_sftp_unlink( $this->sftp_link, $file );
 		}
 		if ( ! $recursive ) {
@@ -457,6 +457,16 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
 	}
 
 	/**
+	 * Is the path a symbolic link.
+	 *
+	 * @param string $path File path.
+	 * @return bool Whether $path is a symbolic link.
+	 */
+	public function is_link( $path ) {
+		return is_link( $this->sftp_path( $path ) );
+	}
+
+	/**
 	 * @param string $file
 	 * @return bool
 	 */
diff --git a/src/wp-admin/includes/class-wp-upgrader.php b/src/wp-admin/includes/class-wp-upgrader.php
index d8433b4..4a4cc58 100644
--- a/src/wp-admin/includes/class-wp-upgrader.php
+++ b/src/wp-admin/includes/class-wp-upgrader.php
@@ -394,7 +394,7 @@ class WP_Upgrader {
 
 		// Check writability.
 		foreach ( $files as $filename => $file_details ) {
-			if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
+			if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) && ! $wp_filesystem->is_link( $remote_destination . $filename ) ) {
 				// Attempt to alter permissions to allow writes and try again.
 				$wp_filesystem->chmod( $remote_destination . $filename, ( 'd' == $file_details['type'] ? FS_CHMOD_DIR : FS_CHMOD_FILE ) );
 				if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
