diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
index 29edc88476ce5bea7dc600340e61b31cd9e9a2f1..0545074b81b422b77f4bf4ddbe6d3020b9344ef3 100644
--- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
+++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd
@@ -30,7 +30,7 @@
 --
 -------------------------------------------------------------------------------
 
-library IEEE, common_lib, dp_lib, tr_10GbE_lib;
+library IEEE, common_lib, dp_lib, reorder_lib, tr_10GbE_lib;
 use IEEE.std_logic_1164.all;
 use IEEE.numeric_std.all;
 use common_lib.common_pkg.all;
@@ -38,11 +38,13 @@ use common_lib.common_field_pkg.all;
 use common_lib.common_mem_pkg.all;
 use common_lib.common_network_layers_pkg.all;
 use dp_lib.dp_stream_pkg.all;
+use reorder_lib.reorder_pkg.all;
 use work.sdp_pkg.all;
 
 entity sdp_beamformer_output is
   generic (
-    g_beamset_id : natural := 0
+    g_beamset_id    : natural := 0;
+    g_use_transpose : boolean := false
   );
   port (
     dp_clk   : in  std_logic;
@@ -88,9 +90,29 @@ architecture str of sdp_beamformer_output is
   constant c_fifo_fill      : natural := c_sdp_cep_payload_nof_longwords;  -- 976
   constant c_fifo_size      : natural := true_log_pow2(c_sdp_cep_payload_nof_longwords) * c_sdp_N_beamsets;  -- 2048
 
+  -- Reorder c_nof_ch = c_nof_ch_sel = c_nof_ch_in
+  constant c_nof_ch         : natural := c_sdp_S_sub_bf * c_sdp_cep_nof_blocks_per_packet;
+
+  -- Dynamic reorder block size control input
+  -- . The input packet has nof_ch = nof_data_per_block * nof_blocks_per_packet
+  --   of data per packet.
+  -- . The transposed output packet will have blocks with nof_blocks_per_packet
+  --   data per block and nof_data_per_block blocks per packet.
+  signal nof_ch                : natural := c_nof_ch;
+  signal nof_data_per_block    : natural := c_sdp_S_sub_bf;
+  signal nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet;
+  signal select_copi           : t_mem_copi := c_mem_copi_rst;
+  signal select_cipo           : t_mem_cipo := c_mem_cipo_rst;
+  signal r_identity            : t_reorder_identity;
+  signal d_identity            : t_reorder_identity;
+  signal r_transpose           : t_reorder_transpose;
+  signal d_transpose           : t_reorder_transpose;
+
   signal snk_in_concat              : t_dp_sosi;
   signal dp_repack_beamlet_src_out  : t_dp_sosi;
   signal dp_packet_merge_src_out    : t_dp_sosi;
+  signal dp_packet_reorder_src_out  : t_dp_sosi;
+  signal reorder_busy               : std_logic;
   signal dp_repack_longword_src_out : t_dp_sosi;
   signal dp_fifo_fill_eop_src_out   : t_dp_sosi;
   signal dp_fifo_fill_eop_src_in    : t_dp_siso;
@@ -197,6 +219,92 @@ begin
     src_out => dp_packet_merge_src_out
   );
 
+  -------------------------------------------------------------------------------
+  -- reorder_col_select
+  -- . Reorder beamlet data from:
+  --     int8[t] [N_blocks_per_packet][S_sub_bf] [N_pol_bf][N_complex]
+  --   to:
+  --     int8[t] [S_sub_bf][N_blocks_per_packet] [N_pol_bf][N_complex]
+  --
+  -- See tb_reorder_col_select_all.vhd for how to control col_select_copi/cipo.
+  -------------------------------------------------------------------------------
+  u_reorder_col_select : entity reorder_lib.reorder_col_select
+  generic map (
+    g_dsp_data_w  => c_sdp_W_dual_pol_beamlet,  -- = 32b
+    g_nof_ch_in   => c_nof_ch,
+    g_nof_ch_sel  => c_nof_ch,
+    g_use_complex => false
+  )
+  port map (
+    dp_rst          => dp_rst,
+    dp_clk          => dp_clk,
+
+    reorder_busy    => reorder_busy,
+
+    -- Dynamic reorder block size control input
+    nof_ch_in       => nof_ch,
+    nof_ch_sel      => nof_ch,
+
+    -- Captured reorder block size control used for output_sosi
+    output_nof_ch_in  => open,
+    output_nof_ch_sel => open,
+
+    -- Memory Mapped
+    col_select_mosi => select_copi,
+    col_select_miso => select_cipo,
+
+    -- Streaming
+    input_sosi      => dp_packet_merge_src_out,
+    output_sosi     => dp_packet_reorder_src_out
+  );
+
+  -- Use synchronous reset in d signals
+  p_dp_clk_synchronous : process(dp_clk)
+  begin
+    if rising_edge(dp_clk) then
+      r_identity  <= d_identity;
+      r_transpose <= d_transpose;
+    end if;
+  end process;
+
+  -- Pass on beamlet data in original order or in transposed order
+  select_copi <= r_transpose.select_copi when g_use_transpose else r_identity.select_copi;
+
+  p_reorder_identity : process(dp_rst, select_cipo, nof_ch, r_identity)
+    variable v : t_reorder_identity;
+  begin
+    if select_cipo.waitrequest = '0' then
+      -- Read from reorder_col_select page
+      v := func_reorder_identity(nof_ch, r_identity);
+    else
+      -- No read, new reorder_col_select page not available yet
+      v := c_reorder_identity_rst;
+    end if;
+    -- Synchronous reset
+    if dp_rst = '1' then
+      v := c_reorder_identity_rst;
+    end if;
+    d_identity <= v;
+  end process;
+
+  p_reorder_transpose : process(dp_rst, select_cipo,
+                                nof_data_per_block, nof_blocks_per_packet, r_transpose)
+    variable v : t_reorder_transpose;
+  begin
+    if select_cipo.waitrequest = '0' then
+      -- Read from reorder_col_select page
+      v := func_reorder_transpose(nof_data_per_block, nof_blocks_per_packet, r_transpose);
+    else
+      -- No read, new reorder_col_select page not available yet
+      v := c_reorder_transpose_rst;
+    end if;
+    -- Synchronous reset
+    if dp_rst = '1' then
+      v := c_reorder_transpose_rst;
+    end if;
+    d_transpose <= v;
+  end process;
+
   -------------------------------------------------------------------------------
   -- dp_repack_data
   -- . Repack 32b -> 64b, to get 64b longwords for network packet data
@@ -213,7 +321,7 @@ begin
     clk     => dp_clk,
     rst     => dp_rst,
 
-    snk_in  => dp_packet_merge_src_out,
+    snk_in  => dp_packet_reorder_src_out,
     snk_out => OPEN,
 
     src_out => dp_repack_longword_src_out,