diff --git a/core/modules/block/src/Plugin/migrate/process/d6/BlockVisibility.php b/core/modules/block/src/Plugin/migrate/process/d6/BlockVisibility.php
index 9afd180..6e8fa3a 100644
--- a/core/modules/block/src/Plugin/migrate/process/d6/BlockVisibility.php
+++ b/core/modules/block/src/Plugin/migrate/process/d6/BlockVisibility.php
@@ -7,8 +7,10 @@
 
 namespace Drupal\block\Plugin\migrate\process\d6;
 
+use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\migrate\MigrateExecutableInterface;
+use Drupal\migrate\MigrateSkipRowException;
 use Drupal\migrate\ProcessPluginBase;
 use Drupal\migrate\Row;
 use Drupal\migrate\Entity\MigrationInterface;
@@ -23,19 +25,34 @@
 class BlockVisibility extends ProcessPluginBase implements ContainerFactoryPluginInterface {
 
   /**
-   * The migration plugin.
+   * The migration.
+   *
+   * @var \Drupal\migrate\Entity\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * The d6 user role migration plugin.
    *
    * @var \Drupal\migrate\Plugin\MigrateProcessInterface
    */
   protected $migrationPlugin;
 
   /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
    * {@inheritdoc}
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrateProcessInterface $migration_plugin) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, MigrationInterface $migration, MigrateProcessInterface $migration_plugin, ModuleHandlerInterface $module_handler) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
     $this->migration = $migration;
     $this->migrationPlugin = $migration_plugin;
+    $this->moduleHandler = $module_handler;
   }
 
   /**
@@ -47,7 +64,8 @@ public static function create(ContainerInterface $container, array $configuratio
       $plugin_id,
       $plugin_definition,
       $migration,
-      $container->get('plugin.manager.migrate.process')->createInstance('migration', array('migration' => 'd6_user_role'), $migration)
+      $container->get('plugin.manager.migrate.process')->createInstance('migration', array('migration' => 'd6_user_role'), $migration),
+      $container->get('module_handler')
     );
   }
   /**
@@ -60,9 +78,27 @@ public function transform($value, MigrateExecutableInterface $migrate_executable
     $visibility = array();
 
     if (!empty($pages)) {
-      $visibility['request_path']['pages'] = $pages;
       $visibility['request_path']['id'] = 'request_path';
       $visibility['request_path']['negate'] = !$old_visibility;
+
+      // If the visibility was using PHP code, handle it separately.
+      if ($old_visibility == 2) {
+        // If the PHP module is installed, migrate the old data directly.
+        if ($this->moduleHandler->moduleExists('php')) {
+          $visibility['request_path']['pages'] = $pages;
+        }
+        else {
+          throw new MigrateSkipRowException();
+        }
+      }
+      // For non-PHP code, ensure paths have leading slashes.
+      else {
+        $paths = preg_split("(\r\n?|\n)", $pages);
+        foreach ($paths as $key => $path) {
+          $paths[$key] = $path === '<front>' ? $path : '/' . ltrim($path, '/');
+        }
+        $visibility['request_path']['pages'] = implode("\n", $paths);
+      }
     }
 
     if (!empty($roles)) {
diff --git a/core/modules/block/src/Tests/Migrate/d6/MigrateBlockTest.php b/core/modules/block/src/Tests/Migrate/d6/MigrateBlockTest.php
index 49d40d7..184d75d 100644
--- a/core/modules/block/src/Tests/Migrate/d6/MigrateBlockTest.php
+++ b/core/modules/block/src/Tests/Migrate/d6/MigrateBlockTest.php
@@ -49,7 +49,7 @@ protected function setUp() {
       $entity->save();
     }
     $this->prepareMigrations(array(
-      'd6_custom_block'  => array(
+      'd6_custom_block' => array(
         array(array(1), array(1)),
         array(array(2), array(2)),
       ),
@@ -75,6 +75,31 @@ protected function setUp() {
   }
 
   /**
+   * Asserts various aspects of a block.
+   *
+   * @param string $id
+   *   The block ID.
+   * @param string $module
+   *   The module.
+   * @param array $visibility
+   *   The block visibility settings.
+   * @param string $region
+   *   The display region.
+   * @param string $theme
+   *   The theme.
+   * @param string $weight
+   *   The block weight.
+   */
+  public function assertEntity($id, $visibility, $region, $theme, $weight) {
+    $block = block::load($id);
+    $this->assertTrue($block Instanceof Block);
+    $this->assertIdentical($visibility, $block->getVisibility());
+    $this->assertIdentical($region, $block->getRegion());
+    $this->assertIdentical($theme, $block->getTheme());
+    $this->assertIdentical($weight, $block->getWeight());
+  }
+
+  /**
    * Test the block settings migration.
    */
   public function testBlockMigration() {
@@ -82,101 +107,63 @@ public function testBlockMigration() {
     $this->assertIdentical(count($blocks), 10);
 
     // User blocks
-    $test_block_user = $blocks['user'];
-    $this->assertNotNull($test_block_user);
-    $this->assertIdentical('sidebar_first', $test_block_user->getRegion());
-    $this->assertIdentical('bartik', $test_block_user->getTheme());
-    $visibility = $test_block_user->getVisibility();
-    $this->assertTrue(empty($visibility));
-    $this->assertIdentical(0, $test_block_user->getWeight());
-
-    $test_block_user_1 = $blocks['user_1'];
-    $this->assertNotNull($test_block_user_1);
-    $this->assertIdentical('sidebar_first', $test_block_user_1->getRegion());
-    $this->assertIdentical('bartik', $test_block_user_1->getTheme());
-    $visibility = $test_block_user_1->getVisibility();
-    $this->assertTrue(empty($visibility));
-    $this->assertIdentical(0, $test_block_user_1->getWeight());
-
-    $test_block_user_2 = $blocks['user_2'];
-    $this->assertNotNull($test_block_user_2);
-    $this->assertIdentical('sidebar_second', $test_block_user_2->getRegion());
-    $this->assertIdentical('bartik', $test_block_user_2->getTheme());
-    $visibility = $test_block_user_2->getVisibility();
-    $this->assertIdentical($visibility['user_role']['id'], 'user_role');
-    $roles = array();
+    $visibility = [];
+    $visibility['request_path']['id'] = 'request_path';
+    $visibility['request_path']['negate'] = TRUE;
+    $visibility['request_path']['pages'] = "<front>\n/node/1\n/blog/*";
+    $this->assertEntity('user', $visibility, 'sidebar_first', 'bartik', 0);
+
+    $visibility = [];
+    $this->assertEntity('user_1', $visibility, 'sidebar_first', 'bartik', 0);
+
+    $visibility['user_role']['id'] = 'user_role';
     $roles['authenticated'] = 'authenticated';
-    $this->assertIdentical($visibility['user_role']['roles'], $roles);
-    $this->assertFalse($visibility['user_role']['negate']);
-    $this->assertIdentical(-9, $test_block_user_2->getWeight());
-
-    $test_block_user_3 = $blocks['user_3'];
-    $this->assertNotNull($test_block_user_3);
-    $this->assertIdentical('sidebar_second', $test_block_user_3->getRegion());
-    $this->assertIdentical('bartik', $test_block_user_3->getTheme());
-    $visibility = $test_block_user_3->getVisibility();
-    $this->assertIdentical($visibility['user_role']['id'], 'user_role');
-    $roles = array();
-    $roles['migrate_test_role_1'] = 'migrate_test_role_1';
-    $this->assertIdentical($visibility['user_role']['roles'], $roles);
-    $this->assertFalse($visibility['user_role']['negate']);
-    $this->assertIdentical(-6, $test_block_user_3->getWeight());
+    $visibility['user_role']['roles'] = $roles;
+    $context_mapping['user'] = 'user.current_user';
+    $visibility['user_role']['context_mapping'] = $context_mapping;
+    $visibility['user_role']['negate'] = FALSE;
+    $this->assertEntity('user_2', $visibility, 'sidebar_second', 'bartik', -9);
+
+    $visibility = [];
+    $visibility['user_role']['id'] = 'user_role';
+    $visibility['user_role']['roles'] = [
+      'migrate_test_role_1' => 'migrate_test_role_1'
+    ];
+    $context_mapping['user'] = 'user.current_user';
+    $visibility['user_role']['context_mapping'] = $context_mapping;
+    $visibility['user_role']['negate'] = FALSE;
+    $this->assertEntity('user_3', $visibility, 'sidebar_second', 'bartik', -6);
 
     // Check system block
-    $test_block_system = $blocks['system'];
-    $this->assertNotNull($test_block_system);
-    $this->assertIdentical('footer', $test_block_system->getRegion());
-    $this->assertIdentical('bartik', $test_block_system->getTheme());
-    $visibility = $test_block_system->getVisibility();
-    $this->assertIdentical('request_path', $visibility['request_path']['id']);
-    $this->assertIdentical('node/1', $visibility['request_path']['pages']);
-    $this->assertTrue($visibility['request_path']['negate']);
-    $this->assertIdentical(-5, $test_block_system->getWeight());
+    $visibility = [];
+    $visibility['request_path']['id'] = 'request_path';
+    $visibility['request_path']['negate'] = TRUE;
+    $visibility['request_path']['pages'] = '/node/1';
+
+    $this->assertEntity('system', $visibility, 'footer', 'bartik', -5);
 
     // Check menu blocks
-    $test_block_menu = $blocks['menu'];
-    $this->assertNotNull($test_block_menu);
-    $this->assertIdentical('header', $test_block_menu->getRegion());
-    $this->assertIdentical('bartik', $test_block_menu->getTheme());
-    $visibility = $test_block_menu->getVisibility();
-    $this->assertTrue(empty($visibility));
-    $this->assertIdentical(-5, $test_block_menu->getWeight());
+    $visibility = [];
+    $this->assertEntity('menu', $visibility, 'header', 'bartik', -5);
 
     // Check custom blocks
-    $test_block_block = $blocks['block'];
-    $this->assertNotNull($test_block_block);
-    $this->assertIdentical('content', $test_block_block->getRegion());
-    $this->assertIdentical('bartik', $test_block_block->getTheme());
-    $visibility = $test_block_block->getVisibility();
-    $this->assertIdentical('request_path', $visibility['request_path']['id']);
-    $this->assertIdentical('<front>', $visibility['request_path']['pages']);
-    $this->assertFalse($visibility['request_path']['negate']);
-    $this->assertIdentical(0, $test_block_block->getWeight());
-
-    $test_block_block_1 = $blocks['block_1'];
-    $this->assertNotNull($test_block_block_1);
-    $this->assertIdentical('right', $test_block_block_1->getRegion());
-    $this->assertIdentical('bluemarine', $test_block_block_1->getTheme());
-    $visibility = $test_block_block_1->getVisibility();
-    $this->assertIdentical('request_path', $visibility['request_path']['id']);
-    $this->assertIdentical('node', $visibility['request_path']['pages']);
-    $this->assertFalse($visibility['request_path']['negate']);
-    $this->assertIdentical(-4, $test_block_block_1->getWeight());
-
-    $test_block_block_2 = $blocks['block_2'];
-    $this->assertNotNull($test_block_block_2);
-    $this->assertIdentical('right', $test_block_block_2->getRegion());
-    $this->assertIdentical('test_theme', $test_block_block_2->getTheme());
-    $visibility = $test_block_block_2->getVisibility();
-    $this->assertTrue(empty($visibility));
-    $this->assertIdentical(-7, $test_block_block_2->getWeight());
-
-    $test_block_block_3 = $blocks['block_3'];
-    $this->assertNotNull($test_block_block_3);
-    $this->assertIdentical('left', $test_block_block_3->getRegion());
-    $this->assertIdentical('test_theme', $test_block_block_3->getTheme());
-    $visibility = $test_block_block_3->getVisibility();
-    $this->assertTrue(empty($visibility));
-    $this->assertIdentical(-2, $test_block_block_3->getWeight());
+    $visibility['request_path']['id'] = 'request_path';
+    $visibility['request_path']['negate'] = FALSE;
+    $visibility['request_path']['pages'] = '<front>';
+    $this->assertEntity('block', $visibility, 'content', 'bartik', 0);
+
+    $visibility['request_path']['id'] = 'request_path';
+    $visibility['request_path']['negate'] = FALSE;
+    $visibility['request_path']['pages'] = '/node';
+
+    $this->assertEntity('block_1', $visibility, 'right', 'bluemarine', -4);
+
+    $visibility = [];
+    $this->assertEntity('block_2', $visibility, 'right', 'test_theme', -7);
+
+    $visibility['request_path']['id'] = 'request_path';
+    $visibility['request_path']['negate'] = FALSE;
+    $visibility['request_path']['pages'] = "<?php\nreturn TRUE;";
+    $this->assertEntity('block_3', $visibility, 'left', 'test_theme', -2);
   }
 }
diff --git a/core/modules/block/tests/src/Unit/Plugin/migrate/process/d6/BlockVisibilityTest.php b/core/modules/block/tests/src/Unit/Plugin/migrate/process/d6/BlockVisibilityTest.php
new file mode 100644
index 0000000..deb5e94
--- /dev/null
+++ b/core/modules/block/tests/src/Unit/Plugin/migrate/process/d6/BlockVisibilityTest.php
@@ -0,0 +1,145 @@
+<?php
+
+/**
+ * @file
+ * Contains
+ *   \Drupal\Tests\block\Unit\Plugin\migrate\process\d6\BlockVisibilityTest.
+ */
+
+namespace Drupal\Tests\block\Unit\Plugin\migrate\process\d6;
+
+use Drupal\block\Plugin\migrate\process\d6\BlockVisibility;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\migrate\Entity\MigrationInterface;
+use Drupal\migrate\Plugin\MigrateProcessInterface;
+use Drupal\Tests\migrate\Unit\process\MigrateProcessTestCase;
+
+/**
+ * @coversDefaultClass \Drupal\block\Plugin\migrate\process\d6\BlockVisibility
+ * @group migrate
+ *
+ * @todo Extend this test to cover the $roles portion of the migration.
+ */
+class BlockVisibilityTest extends MigrateProcessTestCase {
+
+  /**
+   * The migration.
+   *
+   * @var \Drupal\migrate\Entity\MigrationInterface
+   */
+  protected $migration;
+
+  /**
+   * The d6 user role migration plugin.
+   *
+   * @var \Drupal\migrate\Plugin\MigrateProcessInterface
+   */
+  protected $migrationPlugin;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+    $this->migration = $this->prophesize(MigrationInterface::class);
+    $this->migrationPlugin = $this->prophesize(MigrateProcessInterface::class);
+    $this->moduleHandler = $this->prophesize(ModuleHandlerInterface::class);
+    $this->plugin = new BlockVisibility([], 'map', array(), $this->migration->reveal(), $this->migrationPlugin->reveal(), $this->moduleHandler->reveal());
+  }
+
+  /**
+   * @covers ::transform
+   *
+   * @dataProvider providerTestTransform
+   */
+  public function testTransform($pages, $roles, $visibility, $expected) {
+    $this->migrationPlugin->transform('2', $this->migrateExecutable, $this->row, 'destinationproperty')->willReturn('authenticated');
+    $value = [$pages, $roles, $visibility];
+    $transformed_value = $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destinationproperty');
+    $this->assertSame($expected, $transformed_value);
+  }
+
+  public function providerTestTransform() {
+    $data = [];
+    $data[] = [
+      '',
+      [],
+      0,
+      [],
+    ];
+    $data[] = [
+      '<front>',
+      [],
+      0,
+      ['request_path' => [
+        'id' => 'request_path',
+        'negate' => TRUE,
+        'pages' => '<front>',
+      ]],
+    ];
+    $data[] = [
+      "foo\n/bar\rbaz\r\n<front>",
+      [],
+      1,
+      ['request_path' => [
+        'id' => 'request_path',
+        'negate' => FALSE,
+        'pages' => "/foo\n/bar\n/baz\n<front>",
+      ]],
+    ];
+    $data[] = [
+      '',
+      ['2'],
+      1,
+      ['user_role' => [
+          'roles' => [
+            'authenticated' => 'authenticated',
+          ],
+          'id' => 'user_role',
+          'context_mapping' => [
+            'user' => 'user.current_user',
+          ],
+      ]],
+    ];
+    return $data;
+  }
+
+  /**
+   * @covers ::transform
+   */
+  public function testTransformPhpEnabled() {
+    $this->moduleHandler->moduleExists('php')->willReturn(TRUE);
+
+    $pages = '<?php';
+    $value = [$pages, [], 2];
+    $transformed_value = $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destinationproperty');
+
+    $expected = ['request_path' => [
+      'id' => 'request_path',
+      'negate' => FALSE,
+      'pages' => $pages,
+    ]];
+    $this->assertSame($expected, $transformed_value);
+  }
+
+  /**
+   * @covers ::transform
+   *
+   * @expectedException \Drupal\migrate\MigrateSkipRowException
+   */
+  public function testTransformPhpDisabled() {
+    $value = ['<?php', [], 2];
+    $transformed_value = $this->plugin->transform($value, $this->migrateExecutable, $this->row, 'destinationproperty');
+
+    $expected = [];
+    $this->assertSame($expected, $transformed_value);
+  }
+
+}
diff --git a/core/modules/migrate_drupal/src/Tests/Table/d6/Blocks.php b/core/modules/migrate_drupal/src/Tests/Table/d6/Blocks.php
index ca9d72c..16f8f2e 100644
--- a/core/modules/migrate_drupal/src/Tests/Table/d6/Blocks.php
+++ b/core/modules/migrate_drupal/src/Tests/Table/d6/Blocks.php
@@ -130,7 +130,7 @@ public function load() {
       'custom' => '0',
       'throttle' => '0',
       'visibility' => '0',
-      'pages' => '',
+      'pages' => "<front>\r\nnode/1\nblog/*",
       'title' => '',
       'cache' => '-1',
     ))->values(array(
@@ -297,8 +297,8 @@ public function load() {
       'region' => 'left',
       'custom' => '0',
       'throttle' => '0',
-      'visibility' => '0',
-      'pages' => '',
+      'visibility' => '2',
+      'pages' => "<?php\nreturn TRUE;",
       'title' => '',
       'cache' => '-1',
     ))->values(array(
@@ -403,4 +403,4 @@ public function load() {
   }
 
 }
-#aecc8e1067d73824c43bfaf26f9ebf8c
+#471b4ac718c0db89c0f48f4051b2583d
