diff --git a/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php b/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php
index d05c7f1..7587f83 100644
--- a/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php
+++ b/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php
@@ -99,6 +99,13 @@ public function build() {
       if ($destination) {
         $query['destination'] = $destination;
       }
+      // If there are blocks in the region, we want a weight one less so the
+      // newly placed block is on top.
+      if (!empty($build[$region])) {
+        $first_block_render_array = reset($build[$region]);
+        $lowest_weight = isset($first_block_render_array['#weight']) ? $first_block_render_array['#weight'] : 0;
+        $query['weight'] = $lowest_weight - 1;
+      }
       $title = $this->t('<span class="visually-hidden">Place block in the %region region</span>', ['%region' => $region_name]);
       $operations['block_description'] = [
         '#type' => 'inline_template',
diff --git a/core/modules/block_place/tests/src/Functional/BlockPlaceTest.php b/core/modules/block_place/tests/src/Functional/BlockPlaceTest.php
index 8e89048..78ee6a7 100644
--- a/core/modules/block_place/tests/src/Functional/BlockPlaceTest.php
+++ b/core/modules/block_place/tests/src/Functional/BlockPlaceTest.php
@@ -2,7 +2,9 @@
 
 namespace Drupal\Tests\block_place\Functional;
 
+use Drupal\block\Entity\Block;
 use Drupal\Core\Url;
+use Drupal\simpletest\BlockCreationTrait;
 use Drupal\Tests\BrowserTestBase;
 
 /**
@@ -12,6 +14,8 @@
  */
 class BlockPlaceTest extends BrowserTestBase {
 
+  use BlockCreationTrait;
+
   /**
    * Modules to install.
    *
@@ -69,8 +73,81 @@ public function testPlacingBlocksUnprivileged() {
     $links = $this->xpath('//a[text()=:label]', [':label' => 'Place block']);
     $this->assertEmpty($links);
 
-    $this->drupalGet(Url::fromRoute('block.admin_library', ['theme' => 'classy']));
+    $default_theme = $this->config('system.theme')->get('default');
+    $this->drupalGet(Url::fromRoute('block.admin_library', ['theme' => $default_theme]));
     $this->assertSession()->statusCodeEquals(403);
   }
 
+  /**
+   * Data provider for ::testPlacedBlocksPosition().
+   *
+   * @return array
+   *   Array with region and weight for a block, expected weight of another
+   *   block added via Place Block UI (block should be on top), and whether to
+   *   also have a block at zero weight.
+   *
+   * @see \Drupal\block_place\Plugin\DisplayVariant\PlaceBlockPageVariant::build()
+   */
+  public function providerBlockPlaceData() {
+    return [
+      ['sidebar_first', -5, -6],
+      ['sidebar_second', 3, 2],
+      ['sidebar_second', 3, -1, TRUE],
+    ];
+  }
+
+  /**
+   * Tests placing blocks as an admin in a region with existing blocks.
+   *
+   * @dataProvider providerBlockPlaceData
+   */
+  public function testPlacedBlocksPosition($region, $weight, $expected_weight, $extra_block_at_zero = FALSE) {
+    // Create administrative user.
+    $this->drupalLogin($this->drupalCreateUser([
+      'access administration pages',
+      'access toolbar',
+      'administer blocks',
+      'view the administration theme',
+    ]));
+
+    // Enable a standard block with a set weight, so later we can check another
+    // placed block's position relative to this block's position.
+    $block_plugin_id = 'system_powered_by_block';
+    $this->placeBlock($block_plugin_id, ['region' => $region, 'weight' => $weight]);
+    if ($extra_block_at_zero) {
+      $this->placeBlock($block_plugin_id, ['region' => $region, 'weight' => 0]);
+    }
+
+    // Prepare the URLs to look for in the UI.
+    $default_theme = $this->config('system.theme')->get('default');
+    $block_library_url = Url::fromRoute('block.admin_library', ['theme' => $default_theme], ['query' => ['region' => $region]]);
+    $block_add_url = Url::fromRoute('block.admin_add', ['plugin_id' => $block_plugin_id, 'theme' => $default_theme]);
+
+    // Use the UI to place a block.
+    $this->drupalGet(Url::fromRoute('<front>'));
+    $this->clickLink('Place block');
+    // This match relies on the region being the first query parameter, while
+    // other query parameters like weight are present and used for drupalGet().
+    $links = $this->xpath('//a[contains(@href, :href)]', [':href' => $block_library_url->toString()]);
+    $this->assertEquals(1, count($links));
+    $this->drupalGet($this->getAbsoluteUrl($links[0]->getAttribute('href')));
+    $links = $this->xpath('//a[contains(@href, :href)]', [':href' => $block_add_url->toString()]);
+    $this->assertEquals(1, count($links));
+    $this->drupalGet($this->getAbsoluteUrl($links[0]->getAttribute('href')));
+    $title = $this->randomMachineName(8);
+    $block_id = strtolower($this->randomMachineName(8));
+    $edit = [
+      'id' => $block_id,
+      'settings[label]' => $title,
+    ];
+    $this->drupalPostForm(NULL, $edit, t('Save block'));
+
+    // Check the block was placed in the correct region with the expected
+    // weight.
+    /** @var \Drupal\block\BlockInterface $block */
+    $block = Block::load($edit['id']);
+    $this->assertEquals($region, $block->getRegion());
+    $this->assertEquals($expected_weight, $block->getWeight());
+  }
+
 }
