diff --git a/flist/project/top_BEHAV.flist b/flist/project/top_BEHAV.flist
index 6e5bb4e167ba5e728bb04782bd4d19bf04edf055..307228751f0ca052b5171061b1c7581fc8673f38 100644
--- a/flist/project/top_BEHAV.flist
+++ b/flist/project/top_BEHAV.flist
@@ -32,6 +32,7 @@
 -f $(SOCLABS_MEGASOC_TECH_DIR)/flist/megasoc_tech_BEHAV.flist
 
 $(SOCLABS_PROJECT_DIR)/megasoc_chip/chip/logical/megasoc_chip.v
+$(SOCLABS_PROJECT_DIR)/megasoc_chip/chip/logical/megasoc_chip_pin_mux.v
 $(SOCLABS_PROJECT_DIR)/megasoc_chip/pads/glib/logical/megasoc_chip_pads.v
 
 $(SOCLABS_PROJECT_DIR)/megasoc_system/logical/megasoc_system.v
diff --git a/megasoc_chip/chip/logical/megasoc_chip.v b/megasoc_chip/chip/logical/megasoc_chip.v
index 575960ca8a3c991e2c6bfb3618ea403d5efd1e72..3df3d6a04ffb5563b476ab932fa0482a99a07262 100644
--- a/megasoc_chip/chip/logical/megasoc_chip.v
+++ b/megasoc_chip/chip/logical/megasoc_chip.v
@@ -46,10 +46,29 @@ module megasoc_chip(
     output wire         TDO,
     output wire         nTDOEN,
     output wire         SWDO,
-    output wire         SWDOEN
+    output wire         SWDOEN,
 
+    input  wire [15:0]      PAD_P0_IN,
+    output wire [15:0]      PAD_P0_OUT,
+    output wire [15:0]      PAD_P0_EN,
+    output wire [15:0]      PAD_P0_FUNC,
+
+    input  wire [15:0]      PAD_P1_IN,
+    output wire [15:0]      PAD_P1_OUT,
+    output wire [15:0]      PAD_P1_EN,
+    output wire [15:0]      PAD_P1_FUNC
 );
 
+wire [15:0]      SOC_P0_IN;
+wire [15:0]      SOC_P0_OUT;
+wire [15:0]      SOC_P0_EN;
+wire [15:0]      SOC_P0_FUNC;
+wire [15:0]      SOC_P1_IN;
+wire [15:0]      SOC_P1_OUT;
+wire [15:0]      SOC_P1_EN;
+wire [15:0]      SOC_P1_FUNC;
+
+
 megasoc_system u_megasoc_system(
     .CLK_IN(CLK_IN),
     .RT_CLK(RT_CLK),
@@ -80,7 +99,35 @@ megasoc_system u_megasoc_system(
     .TDO(TDO),
     .nTDOEN(nTDOEN),
     .SWDO(SWDO),
-    .SWDOEN(SWDOEN)
+    .SWDOEN(SWDOEN),
+
+    .P0_IN(SOC_P0_IN),
+    .P0_OUT(SOC_P0_OUT),
+    .P0_EN(SOC_P0_EN),
+    .P0_FUNC(SOC_P0_FUNC),
+    .P1_IN(SOC_P1_IN),
+    .P1_OUT(SOC_P1_OUT),
+    .P1_EN(SOC_P1_EN),
+    .P1_FUNC(SOC_P1_FUNC)
+);
+
+megasoc_chip_pin_mux u_pin_mux(
+    .SOC_P0_IN(),
+    .SOC_P0_OUT(),
+    .SOC_P0_EN(),
+    .SOC_P0_FUNC(),
+    .SOC_P1_IN(),
+    .SOC_P1_OUT(),
+    .SOC_P1_EN(),
+    .SOC_P1_FUNC(),
+    .PAD_P0_IN(PAD_P0_IN),
+    .PAD_P0_OUT(PAD_P0_OUT),
+    .PAD_P0_EN(PAD_P0_EN),
+    .PAD_P0_FUNC(PAD_P0_FUNC),
+    .PAD_P1_IN(PAD_P1_IN),
+    .PAD_P1_OUT(PAD_P1_OUT),
+    .PAD_P1_EN(PAD_P1_EN),
+    .PAD_P1_FUNC(PAD_P1_FUNC)
 );
 
 endmodule
\ No newline at end of file
diff --git a/megasoc_chip/chip/logical/megasoc_chip_pin_mux.v b/megasoc_chip/chip/logical/megasoc_chip_pin_mux.v
new file mode 100644
index 0000000000000000000000000000000000000000..ce7d83edfede584dce7fd63c31504ddc62d156ea
--- /dev/null
+++ b/megasoc_chip/chip/logical/megasoc_chip_pin_mux.v
@@ -0,0 +1,37 @@
+module megasoc_chip_pin_mux (
+    output wire [15:0]      SOC_P0_IN,
+    input  wire [15:0]      SOC_P0_OUT,
+    input  wire [15:0]      SOC_P0_EN,
+    input  wire [15:0]      SOC_P0_FUNC,
+    input  wire [15:0]      SOC_P0_ALT,
+
+    output wire [15:0]      SOC_P1_IN,
+    input  wire [15:0]      SOC_P1_OUT,
+    input  wire [15:0]      SOC_P1_EN,
+    input  wire [15:0]      SOC_P1_FUNC,
+    input  wire [15:0]      SOC_P1_ALT,
+
+
+    input  wire [15:0]      PAD_P0_IN,
+    output wire [15:0]      PAD_P0_OUT,
+    output wire [15:0]      PAD_P0_EN,
+    output wire [15:0]      PAD_P0_FUNC,
+
+    input  wire [15:0]      PAD_P1_IN,
+    output wire [15:0]      PAD_P1_OUT,
+    output wire [15:0]      PAD_P1_EN,
+    output wire [15:0]      PAD_P1_FUNC
+);
+
+
+genvar i;
+generate
+    for(i=0;i<16;i=i+1) begin
+        assign PAD_P0_OUT[i] = (PAD_P0_FUNC[i]==1'b1) ? SOC_P0_ALT[i] : SOC_P0_OUT[i];
+        assign PAD_P1_OUT[i] = (PAD_P1_FUNC[i]==1'b1) ? SOC_P1_ALT[i] : SOC_P1_OUT[i];
+    end
+endgenerate
+
+
+
+endmodule
\ No newline at end of file
diff --git a/megasoc_system/logical/megasoc_system.v b/megasoc_system/logical/megasoc_system.v
index 8e9b6f9c32f1e9184f2289a87540c588f13dd404..90c517e243dffcc394eaee0f6640e4e5b6c5366b 100644
--- a/megasoc_system/logical/megasoc_system.v
+++ b/megasoc_system/logical/megasoc_system.v
@@ -47,9 +47,17 @@ module megasoc_system(
     output wire         TDO,
     output wire         nTDOEN,
     output wire         SWDO,
-    output wire         SWDOEN
+    output wire         SWDOEN,
 
+    input  wire [15:0]  P0_IN,
+    output wire [15:0]  P0_OUT,
+    output wire [15:0]  P0_EN,
+    output wire [15:0]  P0_FUNC,
 
+    input  wire [15:0]  P1_IN,
+    output wire [15:0]  P1_OUT,
+    output wire [15:0]  P1_EN,
+    output wire [15:0]  P1_FUNC
 );
 
 
@@ -338,7 +346,16 @@ megasoc_tech_wrapper u_megasoc_tech_wrapper(
     .TDO(TDO),
     .nTDOEN(nTDOEN),
     .SWDO(SWDO),
-    .SWDOEN(SWDOEN)
+    .SWDOEN(SWDOEN),
+
+    .P0_IN(P0_IN),
+    .P0_OUT(P0_OUT),
+    .P0_EN(P0_EN),
+    .P0_FUNC(P0_FUNC),
+    .P1_IN(P1_IN),
+    .P1_OUT(P1_OUT),
+    .P1_EN(P1_EN),
+    .P1_FUNC(P1_FUNC)
 );
 
 
diff --git a/megasoc_tech b/megasoc_tech
index f5b712ffd8904d574843f35766af3627e8665049..5a1f4b462dd547ce59a1e2c396105b95a8410354 160000
--- a/megasoc_tech
+++ b/megasoc_tech
@@ -1 +1 @@
-Subproject commit f5b712ffd8904d574843f35766af3627e8665049
+Subproject commit 5a1f4b462dd547ce59a1e2c396105b95a8410354