From 8b614bf8365a491299d4fdc33e4c45ab741ecfa0 Mon Sep 17 00:00:00 2001
From: cheapie <no-email-for-you@example.com>
Date: Sun, 10 Jan 2016 02:14:35 -0600
Subject: Add infrastructure as normal content It will be developed as part of
 this mod now.

---
 infrastructure/README                              |   14 +
 infrastructure/advanced_aircraft_warning_light.lua |  119 ++
 .../advanced_automatic_warning_device.lua          |  410 +++++
 infrastructure/advanced_boom_barrier.lua           |  470 ++++++
 infrastructure/advanced_crosswalk_lighting.lua     |   85 ++
 infrastructure/advanced_crosswalk_safety_sign.lua  |   85 ++
 .../advanced_crosswalk_warning_light.lua           |  193 +++
 infrastructure/advanced_curve_chevron.lua          |   85 ++
 infrastructure/advanced_emergency_phone.lua        |  107 ++
 infrastructure/advanced_lane_control_lights.lua    |   79 +
 infrastructure/advanced_road_signs.lua             |  237 +++
 .../advanced_traffic_lights_pedestrians.lua        |  252 ++++
 infrastructure/advanced_warning_light.lua          |   97 ++
 infrastructure/crafts.lua                          |  549 +++++++
 infrastructure/depends.txt                         |    8 +
 infrastructure/init.lua                            |   24 +
 infrastructure/nodes.lua                           | 1579 ++++++++++++++++++++
 infrastructure/nodes_extension.lua                 |  162 ++
 infrastructure/settings.lua                        |   49 +
 .../infrastructure_automatic_warning_device.ogg    |  Bin 0 -> 90708 bytes
 .../sounds/infrastructure_boom_barrier.ogg         |  Bin 0 -> 35717 bytes
 infrastructure/sounds/infrastructure_ebell.ogg     |  Bin 0 -> 26398 bytes
 .../sounds/infrastructure_emergency_phone.ogg      |  Bin 0 -> 18073 bytes
 .../sounds/infrastructure_traffic_lights_1.ogg     |  Bin 0 -> 13500 bytes
 .../sounds/infrastructure_traffic_lights_2.ogg     |  Bin 0 -> 15454 bytes
 ...tructure_aircraft_warning_light_side_bright.png |  Bin 0 -> 399 bytes
 ...astructure_aircraft_warning_light_side_dark.png |  Bin 0 -> 411 bytes
 ...structure_aircraft_warning_light_top_bright.png |  Bin 0 -> 597 bytes
 ...rastructure_aircraft_warning_light_top_dark.png |  Bin 0 -> 601 bytes
 .../infrastructure_anti_dazzling_panel_side.png    |  Bin 0 -> 960 bytes
 ...frastructure_anti_dazzling_panel_top_bottom.png |  Bin 0 -> 652 bytes
 infrastructure/textures/infrastructure_asphalt.png |  Bin 0 -> 731 bytes
 .../infrastructure_automatic_warning_device.png    |  Bin 0 -> 8347 bytes
 ...rastructure_automatic_warning_device_bottom.png |  Bin 0 -> 450 bytes
 ...rastructure_automatic_warning_device_middle.png |  Bin 0 -> 1268 bytes
 ...re_automatic_warning_device_middle_center_1.png |  Bin 0 -> 2259 bytes
 ...re_automatic_warning_device_middle_center_2.png |  Bin 0 -> 2670 bytes
 ...re_automatic_warning_device_middle_center_3.png |  Bin 0 -> 2635 bytes
 ...automatic_warning_device_middle_center_side.png |  Bin 0 -> 1048 bytes
 ...ture_automatic_warning_device_middle_left_1.png |  Bin 0 -> 373 bytes
 ...ture_automatic_warning_device_middle_left_2.png |  Bin 0 -> 501 bytes
 ...e_automatic_warning_device_middle_left_side.png |  Bin 0 -> 389 bytes
 ...ure_automatic_warning_device_middle_right_1.png |  Bin 0 -> 413 bytes
 ...ure_automatic_warning_device_middle_right_2.png |  Bin 0 -> 567 bytes
 ..._automatic_warning_device_middle_right_side.png |  Bin 0 -> 362 bytes
 ...ucture_automatic_warning_device_middle_side.png |  Bin 0 -> 603 bytes
 ...infrastructure_automatic_warning_device_top.png |  Bin 0 -> 2818 bytes
 ...structure_automatic_warning_device_top_side.png |  Bin 0 -> 878 bytes
 ...ucture_boom_barrier_arm_h_bottom_front_back.png |  Bin 0 -> 315 bytes
 ...ucture_boom_barrier_arm_h_left_right_bright.png |  Bin 0 -> 600 bytes
 ...tructure_boom_barrier_arm_h_left_right_dark.png |  Bin 0 -> 481 bytes
 .../infrastructure_boom_barrier_arm_h_top.png      |  Bin 0 -> 359 bytes
 .../infrastructure_boom_barrier_arm_v_left.png     |  Bin 0 -> 550 bytes
 .../infrastructure_boom_barrier_arm_v_right.png    |  Bin 0 -> 527 bytes
 .../infrastructure_boom_barrier_h_bottom.png       |  Bin 0 -> 558 bytes
 .../infrastructure_boom_barrier_h_front_back.png   |  Bin 0 -> 504 bytes
 .../infrastructure_boom_barrier_h_left.png         |  Bin 0 -> 566 bytes
 .../infrastructure_boom_barrier_h_right.png        |  Bin 0 -> 562 bytes
 .../textures/infrastructure_boom_barrier_h_top.png |  Bin 0 -> 549 bytes
 .../infrastructure_boom_barrier_v_bottom.png       |  Bin 0 -> 509 bytes
 .../infrastructure_boom_barrier_v_front_back.png   |  Bin 0 -> 573 bytes
 .../infrastructure_boom_barrier_v_left.png         |  Bin 0 -> 532 bytes
 .../infrastructure_boom_barrier_v_right.png        |  Bin 0 -> 540 bytes
 .../infrastructure_cable_barrier_terminal_back.png |  Bin 0 -> 1217 bytes
 ...infrastructure_cable_barrier_terminal_front.png |  Bin 0 -> 1224 bytes
 .../textures/infrastructure_concrete.png           |  Bin 0 -> 732 bytes
 .../infrastructure_corrugated_guide_rail_back.png  |  Bin 0 -> 1142 bytes
 .../infrastructure_corrugated_guide_rail_front.png |  Bin 0 -> 1135 bytes
 .../infrastructure_corrugated_guide_rail_side.png  |  Bin 0 -> 1108 bytes
 .../textures/infrastructure_corrugated_sheet.png   |  Bin 0 -> 1166 bytes
 .../infrastructure_crosswalk_lighting_back.png     |  Bin 0 -> 1019 bytes
 .../infrastructure_crosswalk_lighting_bottom.png   |  Bin 0 -> 749 bytes
 .../infrastructure_crosswalk_lighting_front.png    |  Bin 0 -> 1025 bytes
 .../infrastructure_crosswalk_safety_sign.png       |  Bin 0 -> 703 bytes
 ...ure_crosswalk_safety_sign_bottom_front_back.png |  Bin 0 -> 498 bytes
 ...structure_crosswalk_safety_sign_bottom_side.png |  Bin 0 -> 348 bytes
 .../infrastructure_crosswalk_safety_sign_top.png   |  Bin 0 -> 479 bytes
 ...ucture_crosswalk_safety_sign_top_front_back.png |  Bin 0 -> 343 bytes
 ...frastructure_crosswalk_safety_sign_top_side.png |  Bin 0 -> 199 bytes
 ...infrastructure_crosswalk_warning_light_back.png |  Bin 0 -> 460 bytes
 ...ucture_crosswalk_warning_light_front_bright.png |  Bin 0 -> 1021 bytes
 ...tructure_crosswalk_warning_light_front_dark.png |  Bin 0 -> 606 bytes
 ...infrastructure_crowd_control_barricade_back.png |  Bin 0 -> 1050 bytes
 ...nfrastructure_crowd_control_barricade_front.png |  Bin 0 -> 1078 bytes
 .../infrastructure_curve_chevron_left_bright.png   |  Bin 0 -> 960 bytes
 .../infrastructure_curve_chevron_left_dark.png     |  Bin 0 -> 382 bytes
 .../infrastructure_curve_chevron_right_bright.png  |  Bin 0 -> 988 bytes
 .../infrastructure_curve_chevron_right_dark.png    |  Bin 0 -> 387 bytes
 ...nfrastructure_delineator_retroreflector_red.png |  Bin 0 -> 736 bytes
 ...astructure_delineator_retroreflector_yellow.png |  Bin 0 -> 792 bytes
 .../infrastructure_delineator_wrapper_left.png     |  Bin 0 -> 707 bytes
 .../infrastructure_delineator_wrapper_right.png    |  Bin 0 -> 713 bytes
 .../textures/infrastructure_double_yellow_line.png |  Bin 0 -> 270 bytes
 .../infrastructure_drainage_channel_grating.png    |  Bin 0 -> 1628 bytes
 .../infrastructure_emergency_phone_bottom.png      |  Bin 0 -> 544 bytes
 .../infrastructure_emergency_phone_front.png       |  Bin 0 -> 802 bytes
 .../infrastructure_emergency_phone_side.png        |  Bin 0 -> 768 bytes
 .../infrastructure_emergency_phone_top.png         |  Bin 0 -> 689 bytes
 ...frastructure_energy_absorbing_terminal_back.png |  Bin 0 -> 1160 bytes
 ...rastructure_energy_absorbing_terminal_front.png |  Bin 0 -> 865 bytes
 .../infrastructure_fitch_barrel_bottom.png         |  Bin 0 -> 713 bytes
 .../textures/infrastructure_fitch_barrel_side.png  |  Bin 0 -> 979 bytes
 .../textures/infrastructure_fitch_barrel_top.png   |  Bin 0 -> 625 bytes
 .../textures/infrastructure_galvanized_steel.png   |  Bin 0 -> 1067 bytes
 .../textures/infrastructure_grid_paver_bottom.png  |  Bin 0 -> 1093 bytes
 .../textures/infrastructure_grid_paver_grass.png   |  Bin 0 -> 443 bytes
 .../textures/infrastructure_grid_paver_top.png     |  Bin 0 -> 1597 bytes
 .../infrastructure_lane_control_lights_1.png       |  Bin 0 -> 1905 bytes
 .../infrastructure_lane_control_lights_2.png       |  Bin 0 -> 4010 bytes
 .../infrastructure_lane_control_lights_3.png       |  Bin 0 -> 4148 bytes
 .../infrastructure_lane_control_lights_4.png       |  Bin 0 -> 4159 bytes
 .../infrastructure_lane_control_lights_5.png       |  Bin 0 -> 4119 bytes
 .../textures/infrastructure_manhole_cover_side.png |  Bin 0 -> 700 bytes
 .../infrastructure_manhole_cover_top_bottom.png    |  Bin 0 -> 670 bytes
 .../textures/infrastructure_marker_bottom_side.png |  Bin 0 -> 153 bytes
 .../textures/infrastructure_marker_side_red.png    |  Bin 0 -> 180 bytes
 .../textures/infrastructure_marker_side_yellow.png |  Bin 0 -> 183 bytes
 .../infrastructure_marker_top_red_yellow.png       |  Bin 0 -> 198 bytes
 .../infrastructure_marker_top_yellow_yellow.png    |  Bin 0 -> 182 bytes
 .../textures/infrastructure_noise_barrier.png      |  Bin 0 -> 1524 bytes
 .../textures/infrastructure_razor_wire.png         |  Bin 0 -> 926 bytes
 .../textures/infrastructure_riffled_sheet.png      |  Bin 0 -> 2145 bytes
 .../infrastructure_road_sign_crosswalk_back.png    |  Bin 0 -> 604 bytes
 .../infrastructure_road_sign_crosswalk_front.png   |  Bin 0 -> 1158 bytes
 ...structure_road_sign_retroreflective_surface.png |  Bin 0 -> 175 bytes
 .../infrastructure_road_sign_right_of_way_back.png |  Bin 0 -> 664 bytes
 ...infrastructure_road_sign_right_of_way_front.png |  Bin 0 -> 820 bytes
 .../infrastructure_road_sign_stop_back.png         |  Bin 0 -> 693 bytes
 .../infrastructure_road_sign_stop_front.png        |  Bin 0 -> 1208 bytes
 .../infrastructure_road_sign_yield_back.png        |  Bin 0 -> 575 bytes
 .../infrastructure_road_sign_yield_front.png       |  Bin 0 -> 742 bytes
 .../textures/infrastructure_single_yellow_line.png |  Bin 0 -> 231 bytes
 .../infrastructure_single_yellow_line_corner.png   |  Bin 0 -> 250 bytes
 ...rastructure_solid_double_yellow_line_corner.png |  Bin 0 -> 239 bytes
 .../infrastructure_solid_yellow_line_one_side.png  |  Bin 0 -> 272 bytes
 .../infrastructure_traffic_cone_bottom.png         |  Bin 0 -> 752 bytes
 .../textures/infrastructure_traffic_cone_side.png  |  Bin 0 -> 371 bytes
 .../textures/infrastructure_traffic_cone_top.png   |  Bin 0 -> 609 bytes
 .../infrastructure_traffic_lights_pedestrians.png  |  Bin 0 -> 1899 bytes
 ...ture_traffic_lights_pedestrians_bottom_back.png |  Bin 0 -> 495 bytes
 ...e_traffic_lights_pedestrians_bottom_front_1.png |  Bin 0 -> 798 bytes
 ...e_traffic_lights_pedestrians_bottom_front_2.png |  Bin 0 -> 798 bytes
 ...e_traffic_lights_pedestrians_bottom_front_3.png |  Bin 0 -> 999 bytes
 ...e_traffic_lights_pedestrians_bottom_front_4.png |  Bin 0 -> 999 bytes
 ...ructure_traffic_lights_pedestrians_top_back.png |  Bin 0 -> 459 bytes
 ...ture_traffic_lights_pedestrians_top_front_1.png |  Bin 0 -> 938 bytes
 ...ture_traffic_lights_pedestrians_top_front_2.png |  Bin 0 -> 938 bytes
 ...ture_traffic_lights_pedestrians_top_front_3.png |  Bin 0 -> 693 bytes
 ...ture_traffic_lights_pedestrians_top_front_4.png |  Bin 0 -> 693 bytes
 .../infrastructure_traffic_lights_side.png         |  Bin 0 -> 568 bytes
 .../infrastructure_traffic_lights_vehicles.png     |  Bin 0 -> 3062 bytes
 ...astructure_traffic_lights_vehicles_bottom_1.png |  Bin 0 -> 851 bytes
 ...astructure_traffic_lights_vehicles_bottom_2.png |  Bin 0 -> 1264 bytes
 ...astructure_traffic_lights_vehicles_bottom_3.png |  Bin 0 -> 1518 bytes
 ...astructure_traffic_lights_vehicles_bottom_4.png |  Bin 0 -> 1264 bytes
 ...nfrastructure_traffic_lights_vehicles_top_1.png |  Bin 0 -> 1382 bytes
 ...nfrastructure_traffic_lights_vehicles_top_2.png |  Bin 0 -> 1612 bytes
 ...nfrastructure_traffic_lights_vehicles_top_3.png |  Bin 0 -> 817 bytes
 ...nfrastructure_traffic_lights_vehicles_top_4.png |  Bin 0 -> 1159 bytes
 infrastructure/textures/infrastructure_truss.png   |  Bin 0 -> 1328 bytes
 .../textures/infrastructure_warning_light_back.png |  Bin 0 -> 481 bytes
 .../infrastructure_warning_light_bottom.png        |  Bin 0 -> 269 bytes
 .../infrastructure_warning_light_front_bright.png  |  Bin 0 -> 969 bytes
 .../infrastructure_warning_light_front_dark.png    |  Bin 0 -> 464 bytes
 .../textures/infrastructure_warning_light_left.png |  Bin 0 -> 247 bytes
 .../infrastructure_warning_light_right.png         |  Bin 0 -> 236 bytes
 .../textures/infrastructure_warning_light_top.png  |  Bin 0 -> 250 bytes
 .../textures/infrastructure_wire_netting.png       |  Bin 0 -> 1030 bytes
 ...nfrastructure_wire_rope_safety_barrier_back.png |  Bin 0 -> 1134 bytes
 ...frastructure_wire_rope_safety_barrier_front.png |  Bin 0 -> 1146 bytes
 170 files changed, 4604 insertions(+)
 create mode 100644 infrastructure/README
 create mode 100644 infrastructure/advanced_aircraft_warning_light.lua
 create mode 100644 infrastructure/advanced_automatic_warning_device.lua
 create mode 100644 infrastructure/advanced_boom_barrier.lua
 create mode 100644 infrastructure/advanced_crosswalk_lighting.lua
 create mode 100644 infrastructure/advanced_crosswalk_safety_sign.lua
 create mode 100644 infrastructure/advanced_crosswalk_warning_light.lua
 create mode 100644 infrastructure/advanced_curve_chevron.lua
 create mode 100644 infrastructure/advanced_emergency_phone.lua
 create mode 100644 infrastructure/advanced_lane_control_lights.lua
 create mode 100644 infrastructure/advanced_road_signs.lua
 create mode 100644 infrastructure/advanced_traffic_lights_pedestrians.lua
 create mode 100644 infrastructure/advanced_warning_light.lua
 create mode 100644 infrastructure/crafts.lua
 create mode 100644 infrastructure/depends.txt
 create mode 100644 infrastructure/init.lua
 create mode 100644 infrastructure/nodes.lua
 create mode 100644 infrastructure/nodes_extension.lua
 create mode 100644 infrastructure/settings.lua
 create mode 100644 infrastructure/sounds/infrastructure_automatic_warning_device.ogg
 create mode 100644 infrastructure/sounds/infrastructure_boom_barrier.ogg
 create mode 100644 infrastructure/sounds/infrastructure_ebell.ogg
 create mode 100644 infrastructure/sounds/infrastructure_emergency_phone.ogg
 create mode 100644 infrastructure/sounds/infrastructure_traffic_lights_1.ogg
 create mode 100644 infrastructure/sounds/infrastructure_traffic_lights_2.ogg
 create mode 100644 infrastructure/textures/infrastructure_aircraft_warning_light_side_bright.png
 create mode 100644 infrastructure/textures/infrastructure_aircraft_warning_light_side_dark.png
 create mode 100644 infrastructure/textures/infrastructure_aircraft_warning_light_top_bright.png
 create mode 100644 infrastructure/textures/infrastructure_aircraft_warning_light_top_dark.png
 create mode 100644 infrastructure/textures/infrastructure_anti_dazzling_panel_side.png
 create mode 100644 infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_asphalt.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_center_1.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_center_2.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_center_3.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_left_1.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_left_2.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_right_1.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_right_2.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_top.png
 create mode 100644 infrastructure/textures/infrastructure_automatic_warning_device_top_side.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_dark.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_h_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_h_front_back.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_h_left.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_h_right.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_h_top.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_v_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_v_front_back.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_v_left.png
 create mode 100644 infrastructure/textures/infrastructure_boom_barrier_v_right.png
 create mode 100644 infrastructure/textures/infrastructure_cable_barrier_terminal_back.png
 create mode 100644 infrastructure/textures/infrastructure_cable_barrier_terminal_front.png
 create mode 100644 infrastructure/textures/infrastructure_concrete.png
 create mode 100644 infrastructure/textures/infrastructure_corrugated_guide_rail_back.png
 create mode 100644 infrastructure/textures/infrastructure_corrugated_guide_rail_front.png
 create mode 100644 infrastructure/textures/infrastructure_corrugated_guide_rail_side.png
 create mode 100644 infrastructure/textures/infrastructure_corrugated_sheet.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_lighting_back.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_lighting_front.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_safety_sign.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_warning_light_back.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png
 create mode 100644 infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png
 create mode 100644 infrastructure/textures/infrastructure_crowd_control_barricade_back.png
 create mode 100644 infrastructure/textures/infrastructure_crowd_control_barricade_front.png
 create mode 100644 infrastructure/textures/infrastructure_curve_chevron_left_bright.png
 create mode 100644 infrastructure/textures/infrastructure_curve_chevron_left_dark.png
 create mode 100644 infrastructure/textures/infrastructure_curve_chevron_right_bright.png
 create mode 100644 infrastructure/textures/infrastructure_curve_chevron_right_dark.png
 create mode 100644 infrastructure/textures/infrastructure_delineator_retroreflector_red.png
 create mode 100644 infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png
 create mode 100644 infrastructure/textures/infrastructure_delineator_wrapper_left.png
 create mode 100644 infrastructure/textures/infrastructure_delineator_wrapper_right.png
 create mode 100644 infrastructure/textures/infrastructure_double_yellow_line.png
 create mode 100644 infrastructure/textures/infrastructure_drainage_channel_grating.png
 create mode 100644 infrastructure/textures/infrastructure_emergency_phone_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_emergency_phone_front.png
 create mode 100644 infrastructure/textures/infrastructure_emergency_phone_side.png
 create mode 100644 infrastructure/textures/infrastructure_emergency_phone_top.png
 create mode 100644 infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png
 create mode 100644 infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png
 create mode 100644 infrastructure/textures/infrastructure_fitch_barrel_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_fitch_barrel_side.png
 create mode 100644 infrastructure/textures/infrastructure_fitch_barrel_top.png
 create mode 100644 infrastructure/textures/infrastructure_galvanized_steel.png
 create mode 100644 infrastructure/textures/infrastructure_grid_paver_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_grid_paver_grass.png
 create mode 100644 infrastructure/textures/infrastructure_grid_paver_top.png
 create mode 100644 infrastructure/textures/infrastructure_lane_control_lights_1.png
 create mode 100644 infrastructure/textures/infrastructure_lane_control_lights_2.png
 create mode 100644 infrastructure/textures/infrastructure_lane_control_lights_3.png
 create mode 100644 infrastructure/textures/infrastructure_lane_control_lights_4.png
 create mode 100644 infrastructure/textures/infrastructure_lane_control_lights_5.png
 create mode 100644 infrastructure/textures/infrastructure_manhole_cover_side.png
 create mode 100644 infrastructure/textures/infrastructure_manhole_cover_top_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_marker_bottom_side.png
 create mode 100644 infrastructure/textures/infrastructure_marker_side_red.png
 create mode 100644 infrastructure/textures/infrastructure_marker_side_yellow.png
 create mode 100644 infrastructure/textures/infrastructure_marker_top_red_yellow.png
 create mode 100644 infrastructure/textures/infrastructure_marker_top_yellow_yellow.png
 create mode 100644 infrastructure/textures/infrastructure_noise_barrier.png
 create mode 100644 infrastructure/textures/infrastructure_razor_wire.png
 create mode 100644 infrastructure/textures/infrastructure_riffled_sheet.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_crosswalk_back.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_crosswalk_front.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_right_of_way_back.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_right_of_way_front.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_stop_back.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_stop_front.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_yield_back.png
 create mode 100644 infrastructure/textures/infrastructure_road_sign_yield_front.png
 create mode 100644 infrastructure/textures/infrastructure_single_yellow_line.png
 create mode 100644 infrastructure/textures/infrastructure_single_yellow_line_corner.png
 create mode 100644 infrastructure/textures/infrastructure_solid_double_yellow_line_corner.png
 create mode 100644 infrastructure/textures/infrastructure_solid_yellow_line_one_side.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_cone_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_cone_side.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_cone_top.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_side.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png
 create mode 100644 infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png
 create mode 100644 infrastructure/textures/infrastructure_truss.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_back.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_bottom.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_front_bright.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_front_dark.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_left.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_right.png
 create mode 100644 infrastructure/textures/infrastructure_warning_light_top.png
 create mode 100644 infrastructure/textures/infrastructure_wire_netting.png
 create mode 100644 infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png
 create mode 100644 infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png

diff --git a/infrastructure/README b/infrastructure/README
new file mode 100644
index 0000000..feb88a1
--- /dev/null
+++ b/infrastructure/README
@@ -0,0 +1,14 @@
+This is my fork of the infrastructure mod. It's essentially aimed at servers running webdesigner97's streetsmod that want stuff from infrastructure too (dreambuilder_game in particular), and is intended to add on to streetsmod instead of replacing it.
+
+Originally based on Streets by webdesigner97
+Modified by Ragnarok/Vibender
+Modified again by cheapie
+
+Depends: default, moreblocks, mesecons, technic, streetsmod
+
+Licenses:
+	Code: WTFPL
+	Line textures: WTFPL
+	Other Textures: CC BY-SA 3.0 Unported, http://creativecommons.org/licenses/by-sa/3.0/
+	Sounds: CC BY-SA 3.0 Unported, http://creativecommons.org/licenses/by-sa/3.0/
+
diff --git a/infrastructure/advanced_aircraft_warning_light.lua b/infrastructure/advanced_aircraft_warning_light.lua
new file mode 100644
index 0000000..c46edd4
--- /dev/null
+++ b/infrastructure/advanced_aircraft_warning_light.lua
@@ -0,0 +1,119 @@
+-- Aircraft warning light
+	minetest.register_abm( {
+		nodenames = {"infrastructure:aircraft_warning_light_bright", "infrastructure:aircraft_warning_light_dark"},
+		interval = 2,
+		chance = 1,
+		action = function(pos, node)
+			local node = minetest.env:get_node(pos)
+			if node.name == "infrastructure:aircraft_warning_light_bright" then
+				minetest.swap_node(pos, {name = "infrastructure:aircraft_warning_light_dark", param2 = node.param2})
+			elseif node.name == "infrastructure:aircraft_warning_light_dark" then
+				minetest.swap_node(pos, {name = "infrastructure:aircraft_warning_light_bright", param2 = node.param2})
+			end
+		end
+	})
+
+	minetest.register_node("infrastructure:aircraft_warning_light_bright", {
+		description = "Aircraft warning light",
+		tiles = {
+			"infrastructure_aircraft_warning_light_top_bright.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_aircraft_warning_light_side_bright.png",
+			"infrastructure_aircraft_warning_light_side_bright.png",
+			"infrastructure_aircraft_warning_light_side_bright.png",
+			"infrastructure_aircraft_warning_light_side_bright.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		groups = {cracky = 1},
+		light_source = AIRCRAFT_WARNING_LIGHT_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-1/128, 1/4, -1/128, 1/128, 3/8, 1/128},
+
+					{-1/4, -1/8, 0, 1/4, 1/4, 0},
+					{0, -1/8, -1/4, 0, 1/4, 1/4},
+
+					{-1/16, -1/8, -1/16, 1/16, 1/16, 1/16},
+
+					{-1/4, -1/4, -1/8, 1/4, -1/8, 1/8},
+					{-1/8, -1/4, -1/4, 1/8, -1/8, 1/4},
+
+					{-1/8, -3/8, -1/8, 1/8, -1/4, 1/8},
+
+					{-3/16, -1/2, -3/16, 3/16, -3/8, 3/16}
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {
+					{-1/128, 1/4, -1/128, 1/128, 3/8, 1/128},
+
+					{-1/4, -1/8, 0, 1/4, 1/4, 0},
+					{0, -1/8, -1/4, 0, 1/4, 1/4},
+
+					{-1/16, -1/8, -1/16, 1/16, 1/16, 1/16},
+
+					{-1/4, -1/4, -1/8, 1/4, -1/8, 1/8},
+					{-1/8, -1/4, -1/4, 1/8, -1/8, 1/4},
+
+					{-1/8, -3/8, -1/8, 1/8, -1/4, 1/8},
+
+					{-3/16, -1/2, -3/16, 3/16, -3/8, 3/16}
+				}
+		}
+	})
+
+	minetest.register_node("infrastructure:aircraft_warning_light_dark", {
+		tiles = {
+			"infrastructure_aircraft_warning_light_top_dark.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_aircraft_warning_light_side_dark.png",
+			"infrastructure_aircraft_warning_light_side_dark.png",
+			"infrastructure_aircraft_warning_light_side_dark.png",
+			"infrastructure_aircraft_warning_light_side_dark.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		groups = {cracky = 1, not_in_creative_inventory = 1},
+		drop = "infrastructure:aircraft_warning_light_bright",
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-1/128, 1/4, -1/128, 1/128, 3/8, 1/128},
+
+					{-1/4, -1/8, 0, 1/4, 1/4, 0},
+					{0, -1/8, -1/4, 0, 1/4, 1/4},
+
+					{-1/16, -1/8, -1/16, 1/16, 1/16, 1/16},
+
+					{-1/4, -1/4, -1/8, 1/4, -1/8, 1/8},
+					{-1/8, -1/4, -1/4, 1/8, -1/8, 1/4},
+
+					{-1/8, -3/8, -1/8, 1/8, -1/4, 1/8},
+
+					{-3/16, -1/2, -3/16, 3/16, -3/8, 3/16}
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {
+					{-1/128, 1/4, -1/128, 1/128, 3/8, 1/128},
+
+					{-1/4, -1/8, 0, 1/4, 1/4, 0},
+					{0, -1/8, -1/4, 0, 1/4, 1/4},
+
+					{-1/16, -1/8, -1/16, 1/16, 1/16, 1/16},
+
+					{-1/4, -1/4, -1/8, 1/4, -1/8, 1/8},
+					{-1/8, -1/4, -1/4, 1/8, -1/8, 1/4},
+
+					{-1/8, -3/8, -1/8, 1/8, -1/4, 1/8},
+
+					{-3/16, -1/2, -3/16, 3/16, -3/8, 3/16}
+				}
+		}
+	})
+
+	minetest.register_alias("infrastructure:aircraft_warning_light", "infrastructure:aircraft_warning_light_bright")
diff --git a/infrastructure/advanced_automatic_warning_device.lua b/infrastructure/advanced_automatic_warning_device.lua
new file mode 100644
index 0000000..3e2f7a2
--- /dev/null
+++ b/infrastructure/advanced_automatic_warning_device.lua
@@ -0,0 +1,410 @@
+-- Automatic warning device
+local sound_handles = {}
+local function play_bell(pos)
+	local pos_hash = minetest.hash_node_position(pos)
+	sound_handles[pos_hash] = minetest.sound_play("infrastructure_ebell",
+			{pos = pos, gain = AUTOMATIC_WARNING_DEVICE_VOLUME, loop = true, max_hear_distance = 30,})
+
+end
+
+local function stop_bell(pos, node)
+	local pos_hash = minetest.hash_node_position(pos)
+	local sound_handle = sound_handles[pos_hash]
+	if sound_handle then
+		minetest.sound_stop(sound_handle)
+		sound_handles[pos_hash] = nil
+	end
+end
+	function left_light_direction(pos, param2)
+		if param2 == 0 then
+			pos.x = pos.x - 1
+		elseif param2 == 1 then
+			pos.z = pos.z + 1
+		elseif param2 == 2 then
+			pos.x = pos.x + 1
+		elseif param2 == 3 then
+			pos.z = pos.z - 1
+		end
+	end
+
+	function right_light_direction(pos, param2)
+		if param2 == 0 then
+			pos.x = pos.x + 2
+		elseif param2 == 1 then
+			pos.z = pos.z - 2
+		elseif param2 == 2 then
+			pos.x = pos.x - 2
+		elseif param2 == 3 then
+			pos.z = pos.z + 2
+		end
+	end
+
+	function lights_enabled(pos, node)
+		local node = minetest.env:get_node(pos)
+		local param2 = node.param2
+		if (node.name == "infrastructure:automatic_warning_device_middle_center_3") then
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_2", param2 = node.param2})
+			left_light_direction(pos, param2)
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_left_2", param2 = node.param2})
+			right_light_direction(pos, param2)
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_right_1", param2 = node.param2})
+		elseif node.name == "infrastructure:automatic_warning_device_middle_center_2" then
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_3", param2 = node.param2})
+			left_light_direction(pos, param2)
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_left_1", param2 = node.param2})
+			right_light_direction(pos, param2)
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_right_2", param2 = node.param2})
+		end
+	end
+
+	function lights_disabled(pos, node)
+		local node = minetest.env:get_node(pos)
+		local param2 = node.param2
+		minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_1", param2 = node.param2})
+		left_light_direction(pos, param2)
+		minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_left_1", param2 = node.param2})
+		right_light_direction(pos, param2)
+		minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_right_1", param2 = node.param2})
+	end
+
+	function activate_lights(pos, node)
+		pos.y = pos.y + 2
+		local node = minetest.env:get_node(pos)
+		if node.name == "infrastructure:automatic_warning_device_middle_center_1" then
+			play_bell(pos)
+			minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_2", param2 = node.param2})
+		elseif (node.name == "infrastructure:automatic_warning_device_middle_center_2" or node.name == "infrastructure:automatic_warning_device_middle_center_3") then
+			stop_bell(pos,node)
+			lights_disabled(pos, node)
+		end
+	end
+
+	minetest.register_abm( {
+		nodenames = {"infrastructure:automatic_warning_device_middle_center_2", "infrastructure:automatic_warning_device_middle_center_3"},
+		interval = 1,
+		chance = 1,
+		action = function(pos, node)
+				lights_enabled(pos,node)
+			end
+	})
+
+		minetest.register_node("infrastructure:automatic_warning_device_top", {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_automatic_warning_device_top_side.png",
+				"infrastructure_automatic_warning_device_top_side.png",
+				"infrastructure_automatic_warning_device_top_side.png",
+				"infrastructure_automatic_warning_device_top.png"
+			},
+			on_destruct = stop_bell,
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/16, -1/2, -1/16, 1/16, 0, 1/16},
+					{-1/8, 0, -1/8, 1/8, 3/8, 1/8},
+					{-1/4, 1/8, -1/4, 1/4, 1/4, 1/4},
+					{-1/2, -1/2, -1/16, 1/2, 0, -1/16},
+					{-1/8, -1/2, -1/16, 1/8, -1/4, 1/8}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {0, 0, 0, 0, 0, 0}
+			}
+		})
+
+	for i = 1, 2 do
+		local groups = {}
+		groups = {cracky = 3, not_in_creative_inventory = 1}
+
+		if (i == 1) then
+			LIGHT_SOURCE = 0
+		else
+			LIGHT_SOURCE = AUTOMATIC_WARNING_DEVICE_LIGHT_RANGE
+		end
+
+		minetest.register_node("infrastructure:automatic_warning_device_middle_right_"..tostring(i), {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_automatic_warning_device_middle_right_side.png",
+				"infrastructure_automatic_warning_device_middle_right_"..tostring(i)..".png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			light_source = LIGHT_SOURCE,
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/2, -1/16, -1/4, 1/2, -1/16},
+					{-1/2, -5/16, -1/16, -7/16, 1/16, 3/16},
+					{-1/2, 1/32, -5/16, -15/32, 3/32, -1/16},
+					{-15/32, -1/8, -3/16, -13/32, 1/32, -1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {0, 0, 0, 0, 0, 0}
+			}
+		})
+
+		minetest.register_node("infrastructure:automatic_warning_device_middle_left_"..tostring(i), {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_automatic_warning_device_middle_left_side.png",
+				"infrastructure_automatic_warning_device_middle_left_"..tostring(i)..".png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			light_source = LIGHT_SOURCE,
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{1/4, -1/2, -1/16, 1/2, 1/2, -1/16},
+					{7/16, -5/16, -1/16, 1/2, 1/16, 3/16},
+					{15/32, 1/32, -5/16, 1/2, 3/32, -1/16},
+					{13/32, -1/8, -3/16, 15/32, 1/32, -1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {0, 0, 0, 0, 0, 0}
+			}
+		})
+	end
+
+	for i = 1, 3 do
+		local groups = {}
+		groups = {cracky = 3, not_in_creative_inventory = 1}
+
+		if (i == 1) then
+			LIGHT_SOURCE = 0
+		else
+			LIGHT_SOURCE = AUTOMATIC_WARNING_DEVICE_LIGHT_RANGE
+		end
+
+		minetest.register_node("infrastructure:automatic_warning_device_middle_center_"..tostring(i), {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_automatic_warning_device_middle_center_side.png",
+				"infrastructure_automatic_warning_device_middle_center_side.png",
+				"infrastructure_automatic_warning_device_middle_center_side.png",
+				"infrastructure_automatic_warning_device_middle_center_"..tostring(i)..".png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			light_source = LIGHT_SOURCE,
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+					{-1/2, -1/2, -1/16, 1/2, 1/2, -1/16},
+					{-1/2, -5/16, -1/16, -3/16, 1/16, 3/16},
+					{3/16, -5/16, -1/16, 1/2, 1/16, 3/16},
+					{-3/16, -3/16, -1/16, 3/16, -1/16, 1/8},
+					{-1/2, 1/32, -5/16, -7/32, 3/32, -1/16},
+					{-7/32, -1/8, -3/16, -5/32, 1/32, -1/16},
+					{7/32, 1/32, -5/16, 1/2, 3/32, -1/16},
+					{5/32, -1/8, -3/16, 7/32, 1/32, -1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {0, 0, 0, 0, 0, 0}
+			}
+		})
+	end
+
+		minetest.register_node("infrastructure:automatic_warning_device_middle", {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_automatic_warning_device_middle_side.png",
+				"infrastructure_automatic_warning_device_middle_side.png",
+				"infrastructure_automatic_warning_device_middle_side.png",
+				"infrastructure_automatic_warning_device_middle.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+					{-3/8, -3/8, -1/8, 3/8, 3/8, -1/16},
+					{-1/8, -1/8, -1/16, 1/8, 1/8, 1/8}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {0, 0, 0, 0, 0, 0}
+			}
+		})
+
+		minetest.register_node("infrastructure:automatic_warning_device_bottom", {
+			description = "Automatic warning device",
+			inventory_image = "infrastructure_automatic_warning_device.png",
+			wield_image = "infrastructure_automatic_warning_device.png",
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_automatic_warning_device_bottom.png",
+				"infrastructure_automatic_warning_device_bottom.png",
+				"infrastructure_automatic_warning_device_bottom.png",
+				"infrastructure_automatic_warning_device_bottom.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3},
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/16, 0, -1/16, 1/16, 1/2, 1/16},
+					{-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+					{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+					{-1/8, -3/8, -1/8, 1/8, 0, 1/8}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+				-- top
+					{-1/8, 0 + 3, -1/8, 1/8, 3/8 + 3, 1/8},
+					{-1/4, 1/8 + 3, -1/4, 1/4, 1/4 + 3, 1/4},
+					{-1/8, -1/2 + 3, -1/16 + 0.01, 1/8, -1/4 + 3, 1/8},
+				-- middle center, left and right
+					{-9/16, -5/16 + 2, -1/16, -3/16, 1/16 + 2, 3/16},
+					{3/16, -5/16 + 2, -1/16, 9/16, 1/16 + 2, 3/16},
+
+					{-3/16, -3/16 + 2, -1/16 + 0.01, 3/16, -1/16 + 2, 1/8},
+
+					{-1/2, 1/32 + 2, -5/16, -7/32, 3/32 + 2, -1/16 - 0.01},
+					{-7/32, -1/8 + 2, -3/16, -5/32, 1/32 + 2, -1/16 - 0.01},
+					{13/32 - 1, -1/8 + 2, -3/16, 15/32 - 1, 1/32 + 2, -1/16 - 0.01},
+
+					{7/32, 1/32 + 2, -5/16, 1/2, 3/32 + 2, -1/16 - 0.01},
+					{5/32, -1/8 + 2, -3/16, 7/32, 1/32 + 2, -1/16 - 0.01},
+					{-15/32 + 1, -1/8 + 2, -3/16, -13/32 + 1, 1/32 + 2, -1/16 - 0.01},
+				-- middle
+					{-3/8, -3/8 + 1, -1/8, 3/8, 3/8 + 1, -1/16},
+					{-1/8, -1/8 + 1, -1/16, 1/8, 1/8 + 1, 1/8},
+				-- bottom
+					{-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+					{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+					{-1/8, -3/8, -1/8, 1/8, 0, 1/8},
+				-- post
+					{-1/16, 0, -1/16, 1/16, 3, 1/16}
+				}
+			},
+
+			on_construct = function(pos)
+				local node = minetest.env:get_node(pos)
+				local param2 = node.param2
+
+				local meta = minetest.get_meta(pos)
+				meta:set_string("formspec", "field[channel;Channel;${channel}]")
+
+				pos.y = pos.y + 1
+				node.name = "infrastructure:automatic_warning_device_middle"
+				minetest.env:add_node(pos, node)
+
+				pos.y = pos.y + 2
+				node.name = "infrastructure:automatic_warning_device_top"
+				minetest.env:add_node(pos, node)
+
+				pos.y = pos.y - 1
+				node.name = "infrastructure:automatic_warning_device_middle_center_1"
+				minetest.env:add_node(pos, node)
+
+				left_light_direction(pos, param2)
+				node.name = "infrastructure:automatic_warning_device_middle_left_1"
+				minetest.env:add_node(pos, node)
+
+				right_light_direction(pos, param2)
+				node.name = "infrastructure:automatic_warning_device_middle_right_1"
+				minetest.env:add_node(pos, node)
+			end,
+
+			on_destruct = function(pos)
+				local node = minetest.env:get_node(pos)
+				local param2 = node.param2
+				pos.y=pos.y+2
+				stop_bell(pos, node)
+				pos.y=pos.y-2
+
+				for i = 1, 3 do
+					pos.y = pos.y + 1
+					minetest.env:remove_node(pos)
+				end
+
+				pos.y = pos.y - 1
+
+				left_light_direction(pos, param2)
+				minetest.env:remove_node(pos)
+
+				right_light_direction(pos, param2)
+				minetest.env:remove_node(pos)
+			end,
+
+			on_punch = function(pos, node)
+				activate_lights(pos, node)
+			end,
+
+			on_receive_fields = function(pos, formname, fields, sender)
+				if (fields.channel) then
+					minetest.get_meta(pos):set_string("channel", fields.channel)
+					minetest.get_meta(pos):set_string("state", "Off")
+				end
+			end,
+
+			digiline = {
+				receptor = {},
+				effector = {
+					action = function(pos, node, channel, msg)
+						local setchan = minetest.get_meta(pos):get_string("channel")
+						if setchan ~= channel then
+							return
+						end
+						if (msg=="bell_on") then
+							play_bell(pos)
+						elseif (msg=="bell_off") then
+							stop_bell(pos,node)
+						elseif (msg=="lights_on") then
+							pos.y = pos.y + 2
+							local node = minetest.env:get_node(pos)
+							if node.name == "infrastructure:automatic_warning_device_middle_center_1" then
+								minetest.swap_node(pos, {name = "infrastructure:automatic_warning_device_middle_center_2", param2 = node.param2})
+							end
+						elseif (msg=="lights_off") then	
+							pos.y = pos.y + 2
+							local node = minetest.env:get_node(pos)
+							if (node.name == "infrastructure:automatic_warning_device_middle_center_2" or node.name == "infrastructure:automatic_warning_device_middle_center_3") then
+								lights_disabled(pos, node)
+							end
+						end
+					end
+				}
+			}
+		})
+
+
+
+
+	minetest.register_alias("infrastructure:automatic_warning_device", "infrastructure:automatic_warning_device_bottom")
+	minetest.register_alias("awd", "infrastructure:automatic_warning_device_bottom")
diff --git a/infrastructure/advanced_boom_barrier.lua b/infrastructure/advanced_boom_barrier.lua
new file mode 100644
index 0000000..7a1d685
--- /dev/null
+++ b/infrastructure/advanced_boom_barrier.lua
@@ -0,0 +1,470 @@
+-- Boom barrier
+	function move_arm(pos, node)
+		local node = minetest.env:get_node(pos)
+		local param2 = node.param2
+
+		if param2 == 0 then
+			dir = "z-"
+		elseif param2 == 1 then
+			dir = "x-"
+		elseif param2 == 2 then
+			dir = "z+"
+		elseif param2 == 3 then
+			dir = "x+"
+		end
+
+		minetest.sound_play("infrastructure_boom_barrier", {
+			pos = pos,
+			gain = BOOM_BARRIER_VOLUME,
+			max_hear_distance = 50
+		})
+
+		if node.name == "infrastructure:boom_barrier_top_h" then
+			minetest.swap_node(pos, {name = "infrastructure:boom_barrier_top_v", param2 = node.param2})
+
+			if dir == "x+" then
+				for i = 1, 10 do
+					pos.x = pos.x + 1
+					if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_bright")
+					or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_dark")) == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					node.name = "infrastructure:boom_barrier_arm_v"
+					minetest.env:add_node({x=pos.x-i, y=pos.y+i, z=pos.z}, node)
+				end
+			elseif dir == "x-" then
+				for i = 1, 10 do
+					pos.x = pos.x - 1
+					if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_bright")
+					or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_dark")) == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					node.name = "infrastructure:boom_barrier_arm_v"
+					minetest.env:add_node({x=pos.x+i, y=pos.y+i, z=pos.z}, node)
+				end
+			elseif dir == "z+" then
+				for i = 1, 10 do
+					pos.z = pos.z + 1
+					if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_bright")
+					or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_dark")) == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					node.name = "infrastructure:boom_barrier_arm_v"
+					minetest.env:add_node({x=pos.x, y=pos.y+i, z=pos.z-i}, node)
+				end
+			elseif dir == "z-" then
+				for i = 1, 10 do
+					pos.z = pos.z - 1
+					if (string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_bright")
+					or string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_h_dark")) == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					node.name = "infrastructure:boom_barrier_arm_v"
+					minetest.env:add_node({x=pos.x, y=pos.y+i, z=pos.z+i}, node)
+				end
+			end
+
+		elseif node.name == "infrastructure:boom_barrier_top_v" then
+			minetest.swap_node(pos, {name = "infrastructure:boom_barrier_top_h", param2 = node.param2})
+				if dir == "x+" then
+				for i = 1, 10 do
+					pos.y = pos.y + 1
+					if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					if i % 2 == 1 then
+						node.name = "infrastructure:boom_barrier_arm_h_bright"
+					else
+						node.name = "infrastructure:boom_barrier_arm_h_dark"
+					end
+					minetest.env:add_node({x=pos.x+i, y=pos.y-i, z=pos.z}, node)
+				end
+			elseif dir == "x-" then
+				for i = 1, 10 do
+					pos.y = pos.y + 1
+					if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					if i % 2 == 1 then
+						node.name = "infrastructure:boom_barrier_arm_h_bright"
+					else
+						node.name = "infrastructure:boom_barrier_arm_h_dark"
+					end
+					minetest.env:add_node({x=pos.x-i, y=pos.y-i, z=pos.z}, node)
+				end
+			elseif dir == "z+" then
+				for i = 1, 10 do
+					pos.y = pos.y + 1
+					if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					if i % 2 == 1 then
+						node.name = "infrastructure:boom_barrier_arm_h_bright"
+					else
+						node.name = "infrastructure:boom_barrier_arm_h_dark"
+					end
+					minetest.env:add_node({x=pos.x, y=pos.y-i, z=pos.z+i}, node)
+				end
+			elseif dir == "z-" then
+				for i = 1, 10 do
+					pos.y = pos.y + 1
+					if string.match(minetest.env:get_node(pos).name, "infrastructure:boom_barrier_arm_v") == nil then
+						break
+					end
+					minetest.env:remove_node(pos)
+					if i % 2 == 1 then
+						node.name = "infrastructure:boom_barrier_arm_h_bright"
+					else
+						node.name = "infrastructure:boom_barrier_arm_h_dark"
+					end
+					minetest.env:add_node({x=pos.x, y=pos.y-i, z=pos.z-i}, node)
+				end
+			end
+		end
+	end
+
+	minetest.register_abm( {
+		nodenames = {"infrastructure:boom_barrier_arm_h_bright", "infrastructure:boom_barrier_arm_h_dark"},
+		interval = 1,
+		chance = 1,
+		action = function(pos, node)
+			local node = minetest.env:get_node(pos)
+			if node.name == "infrastructure:boom_barrier_arm_h_bright" then
+				minetest.swap_node(pos, {name = "infrastructure:boom_barrier_arm_h_dark", param2 = node.param2})
+			elseif node.name == "infrastructure:boom_barrier_arm_h_dark" then
+				minetest.swap_node(pos, {name = "infrastructure:boom_barrier_arm_h_bright", param2 = node.param2})
+			end
+		end
+	})
+
+	minetest.register_node("infrastructure:boom_barrier_top_h", {
+		description = "Boom barrier mechanism",
+		tiles = {
+			"infrastructure_boom_barrier_h_top.png",
+			"infrastructure_boom_barrier_h_bottom.png",
+			"infrastructure_boom_barrier_h_right.png",
+			"infrastructure_boom_barrier_h_left.png",
+			"infrastructure_boom_barrier_h_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+				{-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+				{-3/8, -1/2, -1/2, -1/4, -1/4, 1/8},
+				{-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+				{-3/8, -1/8, -1/8, -1/4, 1/8, 1/2},
+				{-1/2, -3/16, 1/4, -3/8, 3/16, 1/2},
+				{-1/2, -1/8, 3/16, -3/8, 1/8, 1/2},
+				{-1/2, -1/16, 1/8, -3/8, 1/16, 1/2},	
+
+				{1/4, -1/2, -1/2, 3/8, -1/4, 1/8},
+				{1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+				{1/4, -1/8, -1/8, 3/8, 1/8, 1/2},
+				{3/8, -3/16, 1/4, 1/2, 3/16, 1/2},
+				{3/8, -1/8, 3/16, 1/2, 1/8, 1/2},
+				{3/8, -1/16, 1/8, 1/2, 1/16, 1/2},
+
+				{-3/8, -1/2, -1/2, 3/8, -1/4, -3/8},
+
+				{-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+				{-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+				{-3/8, -1/2, -1/2, -1/4, -1/4, 1/8},
+				{-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+				{-3/8, -1/8, -1/8, -1/4, 1/8, 1/2},
+				{-1/2, -3/16, 1/4, -3/8, 3/16, 1/2},
+				{-1/2, -1/8, 3/16, -3/8, 1/8, 1/2},
+				{-1/2, -1/16, 1/8, -3/8, 1/16, 1/2},	
+
+				{1/4, -1/2, -1/2, 3/8, -1/4, 1/8},
+				{1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+				{1/4, -1/8, -1/8, 3/8, 1/8, 1/2},
+				{3/8, -3/16, 1/4, 1/2, 3/16, 1/2},
+				{3/8, -1/8, 3/16, 1/2, 1/8, 1/2},
+				{3/8, -1/16, 1/8, 1/2, 1/16, 1/2},
+
+				{-3/8, -1/2, -1/2, 3/8, -1/4, -3/8},
+
+				{-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+			}
+		},
+
+		after_place_node = function(pos)
+			local node = minetest.env:get_node(pos)
+			node.name = "infrastructure:boom_barrier_bottom"
+			minetest.env:add_node(pos, node)
+			pos.y = pos.y + 1
+			node.name = "infrastructure:boom_barrier_top_h"
+			minetest.env:add_node(pos, node)
+		end,
+
+		after_dig_node = function(pos)
+			pos.y = pos.y - 1
+			minetest.env:remove_node(pos)
+		end,
+
+		on_punch = function(pos, node)
+			move_arm(pos, node)
+		end
+	})
+
+	minetest.register_node("infrastructure:boom_barrier_top_v", {
+		tiles = {
+			"infrastructure_boom_barrier_h_front_back.png",
+			"infrastructure_boom_barrier_v_bottom.png",
+			"infrastructure_boom_barrier_v_right.png",
+			"infrastructure_boom_barrier_v_left.png",
+			"infrastructure_boom_barrier_v_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		drop = "infrastructure:boom_barrier_top_h",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+				{-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+				{-3/8, -1/8, -1/2, -1/4, 1/2, -1/4},
+				{-3/8, -1/8, -1/2, -1/4, 1/8, 1/8},
+				{-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+				{-1/2, -1/2, -3/16, -3/8, -1/4, 3/16},
+				{-1/2, -1/2, -1/8, -3/8, -3/16, 1/8},
+				{-1/2, -1/2, -1/16, -3/8, -1/8, 1/16},	
+
+				{1/4, -1/8, -1/2, 3/8, 1/2, -1/4},
+				{1/4, -1/8, -1/2, 3/8, 1/8, 1/8},
+				{1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+				{3/8, -1/2, -3/16, 1/2, -1/4, 3/16},
+				{3/8, -1/2, -1/8, 1/2, -3/16, 1/8},
+				{3/8, -1/2, -1/16, 1/2, -1/8, 1/16},
+
+				{-3/8, 3/8, -1/2, 3/8, 1/2, -1/4},
+
+				{-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/4, -1/4, 1/4, 1/4, 1/4},
+				{-1/8, -1/2, -1/8, 1/8, -1/4, 1/8},
+
+				{-3/8, -1/8, -1/2, -1/4, 1/2, -1/4},
+				{-3/8, -1/8, -1/2, -1/4, 1/8, 1/8},
+				{-3/8, -1/2, -1/8, -1/4, 1/8, 1/8},
+				{-1/2, -1/2, -3/16, -3/8, -1/4, 3/16},
+				{-1/2, -1/2, -1/8, -3/8, -3/16, 1/8},
+				{-1/2, -1/2, -1/16, -3/8, -1/8, 1/16},	
+
+				{1/4, -1/8, -1/2, 3/8, 1/2, -1/4},
+				{1/4, -1/8, -1/2, 3/8, 1/8, 1/8},
+				{1/4, -1/2, -1/8, 3/8, 1/8, 1/8},
+				{3/8, -1/2, -3/16, 1/2, -1/4, 3/16},
+				{3/8, -1/2, -1/8, 1/2, -3/16, 1/8},
+				{3/8, -1/2, -1/16, 1/2, -1/8, 1/16},
+
+				{-3/8, 3/8, -1/2, 3/8, 1/2, -1/4},
+
+				{-7/16, -1/16, -1/16, 7/16, 1/16, 1/16}
+			}
+		},
+
+		after_dig_node = function(pos)
+			pos.y = pos.y - 1
+			minetest.env:remove_node(pos)
+		end,
+
+		on_punch = function(pos, node)
+			move_arm(pos, node)
+		end
+	})
+
+	minetest.register_node("infrastructure:boom_barrier_bottom", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_automatic_warning_device_bottom.png",
+			"infrastructure_automatic_warning_device_bottom.png",
+			"infrastructure_automatic_warning_device_bottom.png",
+			"infrastructure_automatic_warning_device_bottom.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		drop = "infrastructure:boom_barrier_top_h",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+				{-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+				{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+				{-1/8, -1/2, -1/8, 1/8, 0, 1/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+				{-1/2, -1/2, -1/4, 1/2, -3/8, 1/4},
+				{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+				{-1/8, -1/2, -1/8, 1/8, 0, 1/8}
+			}
+		},
+
+		after_dig_node = function(pos)
+			pos.y = pos.y + 1
+			minetest.env:remove_node(pos)
+		end,
+
+		on_construct = function(pos)
+			local meta = minetest.get_meta(pos)
+			meta:set_string("formspec", "field[channel;Channel;${channel}]")
+		end,
+
+		on_receive_fields = function(pos, formname, fields, sender)
+			if (fields.channel) then
+				minetest.get_meta(pos):set_string("channel", fields.channel)
+				minetest.get_meta(pos):set_string("state", "Off")
+			end
+		end,
+
+		digiline = {
+			receptor = {},
+			effector = {
+				action = function(pos, node, channel, msg)
+					local setchan = minetest.get_meta(pos):get_string("channel")
+					if setchan ~= channel then
+						return
+					end
+					pos.y = pos.y + 1
+					local mechnode = minetest.env:get_node(pos)
+					if ((msg == "up" and mechnode.name=="infrastructure:boom_barrier_top_h") or (msg == "down" and mechnode.name=="infrastructure:boom_barrier_top_v")) then
+						move_arm(pos, mechnode)
+					end
+				end
+			}
+		},
+	})
+
+	minetest.register_node("infrastructure:boom_barrier_arm_h_bright", {
+		description = "Boom barrier arm",
+		tiles = {
+			"infrastructure_boom_barrier_arm_h_top.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+			"infrastructure_boom_barrier_arm_h_left_right_bright.png",
+			"infrastructure_boom_barrier_arm_h_left_right_bright.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		light_source = BOOM_BARRIER_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/2, 1/8, -7/16, 1/2},
+				{-1/8, -5/16, -1/2, 1/8, -1/4, 1/2},
+				{-1/8, -1/2, -1/2, -1/16, -1/4, 1/2},
+				{1/16, -1/2, -1/2, 1/8, -1/4, 1/2},
+				{0, -1/4, -1/8, 0, 0, 1/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/2, 1/8, -1/4, 1/2}
+			}
+		}
+	})
+
+	minetest.register_node("infrastructure:boom_barrier_arm_h_dark", {
+		tiles = {
+			"infrastructure_boom_barrier_arm_h_top.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+			"infrastructure_boom_barrier_arm_h_left_right_dark.png",
+			"infrastructure_boom_barrier_arm_h_left_right_dark.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		drop = "infrastructure:boom_barrier_arm_h_bright",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/2, 1/8, -7/16, 1/2},
+				{-1/8, -5/16, -1/2, 1/8, -1/4, 1/2},
+				{-1/8, -1/2, -1/2, -1/16, -1/4, 1/2},
+				{1/16, -1/2, -1/2, 1/8, -1/4, 1/2},
+				{0, -1/4, -1/8, 0, 0, 1/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/2, 1/8, -1/4, 1/2}
+			}
+		}
+	})
+
+	minetest.register_node("infrastructure:boom_barrier_arm_v", {
+		tiles = {
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png",
+			"infrastructure_boom_barrier_arm_v_left.png",
+			"infrastructure_boom_barrier_arm_v_right.png",
+			"infrastructure_boom_barrier_arm_h_top.png",
+			"infrastructure_boom_barrier_arm_h_bottom_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		drop = "infrastructure:boom_barrier_arm_h_bright",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/2, 1/8, 1/2, -7/16},
+				{-1/8, -1/2, -5/16, 1/8, 1/2, -1/4},
+				{-1/8, -1/2, -1/2, -1/16, 1/2, -1/4},
+				{1/16, -1/2, -1/2, 1/8, 1/2, -1/4},
+				{0, -1/8, -1/4, 0, 1/8, 0}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/2, 1/8, 1/2, -1/4}
+			}
+		}
+	})
+
+	minetest.register_alias("infrastructure:boom_barrier_mechanism", "infrastructure:boom_barrier_top_h")
+	minetest.register_alias("infrastructure:boom_barrier_arm", "infrastructure:boom_barrier_arm_h_bright")
diff --git a/infrastructure/advanced_crosswalk_lighting.lua b/infrastructure/advanced_crosswalk_lighting.lua
new file mode 100644
index 0000000..4e669c1
--- /dev/null
+++ b/infrastructure/advanced_crosswalk_lighting.lua
@@ -0,0 +1,85 @@
+-- Crosswalk lighting
+	minetest.register_node("infrastructure:crosswalk_lighting_dark", {
+		description = "Crosswalk lighting",
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_lighting_bottom.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_lighting_back.png",
+			"infrastructure_crosswalk_lighting_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3},
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-3/8, -1/2, -1/4, 3/8, 1/2, -3/16},
+					{-3/8, -1/2, 3/16, 3/8, 1/2, 1/4},
+					{-1/4, 1/4, -3/16, -1/8, 3/8, 3/16},
+					{1/8, 1/4, -3/16, 1/4, 3/8, 3/16},
+					{-1/8, -1/2, -3/16, 1/8, -1/4, 3/16},
+					{-1/2, -1/2, -1/8, 1/2, -3/8, 1/8},
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {-3/8, -1/2, -1/4, 3/8, 1/2, 1/4}
+		},
+
+		on_punch = function(pos, node)
+			minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_bright", param2 = node.param2})
+		end,
+
+		mesecons = {effector = {
+			action_on = function (pos, node)
+				minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_bright", param2 = node.param2})
+			end,
+		}}
+	})
+
+	minetest.register_node("infrastructure:crosswalk_lighting_bright", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_lighting_bottom.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_lighting_back.png",
+			"infrastructure_crosswalk_lighting_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3, not_in_creative_inventory = 1},
+		light_source = CROSSWALK_LIGHTING_LIGHT_RANGE,
+		drop = "infrastructure:crosswalk_lighting_dark",
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-3/8, -1/2, -1/4, 3/8, 1/2, -3/16},
+					{-3/8, -1/2, 3/16, 3/8, 1/2, 1/4},
+					{-1/4, 1/4, -3/16, -1/8, 3/8, 3/16},
+					{1/8, 1/4, -3/16, 1/4, 3/8, 3/16},
+					{-1/8, -1/2, -3/16, 1/8, -1/4, 3/16},
+					{-1/2, -1/2, -1/8, 1/2, -3/8, 1/8},
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {-3/8, -1/2, -1/4, 3/8, 1/2, 1/4}
+		},
+
+		on_punch = function(pos, node)
+			minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_dark", param2 = node.param2})
+		end,
+
+		mesecons = {effector = {
+			action_off = function (pos, node)
+				minetest.swap_node(pos, {name = "infrastructure:crosswalk_lighting_dark", param2 = node.param2})
+			end,
+		}}
+	})
+
+	minetest.register_alias("infrastructure:crosswalk_lighting", "infrastructure:crosswalk_lighting_dark")
diff --git a/infrastructure/advanced_crosswalk_safety_sign.lua b/infrastructure/advanced_crosswalk_safety_sign.lua
new file mode 100644
index 0000000..6183322
--- /dev/null
+++ b/infrastructure/advanced_crosswalk_safety_sign.lua
@@ -0,0 +1,85 @@
+-- Crosswalk safety sign
+	minetest.register_node("infrastructure:crosswalk_safety_sign_top", {
+		tiles = {
+			"infrastructure_crosswalk_safety_sign_top.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_safety_sign_top_side.png",
+			"infrastructure_crosswalk_safety_sign_top_side.png",
+			"infrastructure_crosswalk_safety_sign_top_front_back.png",
+			"infrastructure_crosswalk_safety_sign_top_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1, not_in_creative_inventory = 1},
+		light_source = CROSSWALK_SAFETY_SIGN_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, -1/16, 1/4, 0, -1/16},
+				{-1/4, -1/2, 1/16, 1/4, 0, 1/16},
+				{-1/16, -1/2, -1/16, 1/16, -1/4, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {0, 0, 0, 0, 0, 0}
+		}
+	})
+
+	minetest.register_node("infrastructure:crosswalk_safety_sign_bottom", {
+		description = "Crosswalk safety sign",
+		inventory_image = "infrastructure_crosswalk_safety_sign.png",
+		wield_image = "infrastructure_crosswalk_safety_sign.png",
+		tiles = {
+			"infrastructure_crosswalk_safety_sign_top.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_safety_sign_bottom_side.png",
+			"infrastructure_crosswalk_safety_sign_bottom_side.png",
+			"infrastructure_crosswalk_safety_sign_bottom_front_back.png",
+			"infrastructure_crosswalk_safety_sign_bottom_front_back.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		light_source = CROSSWALK_SAFETY_SIGN_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -7/32, -1/16, 1/4, 1/2, -1/16},
+				{-1/4, -7/32, 1/16, 1/4, 1/2, 1/16},
+				{-1/16, -5/16, -1/16, 1/16, 1/2, 1/16},
+				{-1/8, -3/8, -1/8, 1/8, -5/16, 1/8},
+				{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -7/32, -1/16, 1/4, 1, -1/16},
+				{-1/4, -7/32, 1/16, 1/4, 1, 1/16},
+
+				{-1/16, -5/16, -1/16 + 0.01, 1/16, 3/4, 1/16 - 0.01},
+
+				{-1/8, -3/8, -1/8, 1/8, -5/16, 1/8},
+				{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2}
+			}
+		},
+
+		after_place_node = function(pos)
+			local node = minetest.env:get_node(pos)
+			node.name = "infrastructure:crosswalk_safety_sign_bottom"
+			minetest.env:add_node(pos, node)
+			pos.y = pos.y + 1
+			node.name = "infrastructure:crosswalk_safety_sign_top"
+			minetest.env:add_node(pos, node)
+		end,
+
+		after_dig_node = function(pos)
+			pos.y = pos.y + 1
+			minetest.env:remove_node(pos)
+		end,
+	})
+
+	minetest.register_alias("infrastructure:crosswalk_safety_sign", "infrastructure:crosswalk_safety_sign_bottom")
diff --git a/infrastructure/advanced_crosswalk_warning_light.lua b/infrastructure/advanced_crosswalk_warning_light.lua
new file mode 100644
index 0000000..d8497e1
--- /dev/null
+++ b/infrastructure/advanced_crosswalk_warning_light.lua
@@ -0,0 +1,193 @@
+-- Crosswalk warning light
+	minetest.register_abm( {
+		nodenames = {"infrastructure:crosswalk_warning_light_bright", "infrastructure:crosswalk_warning_light_dark"},
+		interval = 1,
+		chance = 1,
+		action = function(pos, node)
+			local node = minetest.env:get_node(pos)
+			if node.name == "infrastructure:crosswalk_warning_light_bright" then
+				minetest.swap_node(pos, {name = "infrastructure:crosswalk_warning_light_dark", param2 = node.param2})
+			elseif node.name == "infrastructure:crosswalk_warning_light_dark" then
+				minetest.swap_node(pos, {name = "infrastructure:crosswalk_warning_light_bright", param2 = node.param2})
+			end
+		end
+	})
+
+	function on_off_light(pos, node)
+		local node = minetest.env:get_node(pos)
+		if node.name == "infrastructure:crosswalk_warning_light_off" then
+			minetest.swap_node(pos, {name = "infrastructure:crosswalk_warning_light_bright", param2 = node.param2})
+		elseif (node.name == "infrastructure:crosswalk_warning_light_dark" or node.name == "infrastructure:crosswalk_warning_light_bright") then
+			minetest.swap_node(pos, {name = "infrastructure:crosswalk_warning_light_off", param2 = node.param2})
+		end
+	end
+
+	minetest.register_node("infrastructure:crosswalk_warning_light_off", {
+		description = "Crosswalk warning light",
+		inventory_image = "infrastructure_crosswalk_warning_light_front_bright.png",
+		wield_image = "infrastructure_crosswalk_warning_light_front_bright.png",
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_warning_light_back.png",
+			"infrastructure_crosswalk_warning_light_front_dark.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3, not_in_creative_inventory = 0},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+				{-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+			}
+		},
+
+		on_punch = function(pos, node)
+			on_off_light(pos, node)
+		end,
+
+		mesecons = {effector = {
+			action_on = function(pos, node)
+				on_off_light(pos, node)
+			end,
+		}}
+	})
+
+	minetest.register_node("infrastructure:crosswalk_warning_light_dark", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_warning_light_back.png",
+			"infrastructure_crosswalk_warning_light_front_dark.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3, not_in_creative_inventory = 1},
+		drop = "infrastructure:crosswalk_warning_light_off",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+				{-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+			}
+		},
+
+		on_punch = function(pos, node)
+			on_off_light(pos, node)
+		end,
+
+		mesecons = {effector = {
+			action_on = function(pos, node)
+				on_off_light(pos, node)
+			end,
+		}}
+	})
+
+	minetest.register_node("infrastructure:crosswalk_warning_light_bright", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_crosswalk_warning_light_back.png",
+			"infrastructure_crosswalk_warning_light_front_bright.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3, not_in_creative_inventory = 1},
+		light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+		drop = "infrastructure:crosswalk_warning_light_off",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+				{-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 3/8, 1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+			}
+		},
+
+		on_punch = function(pos, node)
+			on_off_light(pos, node)
+		end,
+
+		mesecons = {effector = {
+			action_on = function(pos, node)
+				on_off_light(pos, node)
+			end,
+		}}
+	})
+
+	minetest.register_alias("infrastructure:crosswalk_warning_light", "infrastructure:crosswalk_warning_light_off")
diff --git a/infrastructure/advanced_curve_chevron.lua b/infrastructure/advanced_curve_chevron.lua
new file mode 100644
index 0000000..7d3b65d
--- /dev/null
+++ b/infrastructure/advanced_curve_chevron.lua
@@ -0,0 +1,85 @@
+-- Curve chevron
+	minetest.register_node("infrastructure:curve_chevron_dark", {
+		description = "Flashing curve chevron",
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_curve_chevron_left_dark.png",
+			"infrastructure_curve_chevron_right_dark.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3},
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-1/2, -1/2, -1/8, 1/2, 1/2, -1/16},
+					{-1/2, -1/2, 1/16, 1/2, 1/2, 1/8},
+					{-3/8, 1/4, -1/16, -1/4, 3/8, 1/16},
+					{1/4, 1/4, -1/16, 3/8, 3/8, 1/16},
+					{-3/8, -3/8, -1/16, -1/4, -1/4, 1/16},
+					{1/4, -3/8, -1/16, 3/8, -1/4, 1/16}
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {-1/2, -1/2, -1/8, 1/2, 1/2, 1/8}
+		},
+
+		on_punch = function(pos, node)
+			minetest.swap_node(pos, {name = "infrastructure:curve_chevron_bright", param2 = node.param2})
+		end,
+
+		mesecons = {effector = {
+			action_on = function (pos, node)
+				minetest.swap_node(pos, {name = "infrastructure:curve_chevron_bright", param2 = node.param2})
+			end,
+		}}
+	})
+
+	minetest.register_node("infrastructure:curve_chevron_bright", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_curve_chevron_left_bright.png",
+			"infrastructure_curve_chevron_right_bright.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3, not_in_creative_inventory = 1},
+		light_source = CURVE_CHEVRON_LIGHT_RANGE,
+		drop = "infrastructure:curve_chevron_dark",
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-1/2, -1/2, -1/8, 1/2, 1/2, -1/16},
+					{-1/2, -1/2, 1/16, 1/2, 1/2, 1/8},
+					{-3/8, 1/4, -1/16, -1/4, 3/8, 1/16},
+					{1/4, 1/4, -1/16, 3/8, 3/8, 1/16},
+					{-3/8, -3/8, -1/16, -1/4, -1/4, 1/16},
+					{1/4, -3/8, -1/16, 3/8, -1/4, 1/16}
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {-1/2, -1/2, -1/8, 1/2, 1/2, 1/8}
+		},
+
+		on_punch = function(pos, node)
+			minetest.swap_node(pos, {name = "infrastructure:curve_chevron_dark", param2 = node.param2})
+		end,
+
+		mesecons = {effector = {
+			action_off = function (pos, node)
+				minetest.swap_node(pos, {name = "infrastructure:curve_chevron_dark", param2 = node.param2})
+			end
+		}}
+	})
+
+	minetest.register_alias("infrastructure:curve_chevron", "infrastructure:curve_chevron_dark")
diff --git a/infrastructure/advanced_emergency_phone.lua b/infrastructure/advanced_emergency_phone.lua
new file mode 100644
index 0000000..c511db1
--- /dev/null
+++ b/infrastructure/advanced_emergency_phone.lua
@@ -0,0 +1,107 @@
+-- Emergency phone (only if enabled)
+	if ENABLE_EMERGENCY_PHONE then
+		minetest.register_node("infrastructure:emergency_phone_top", {
+			description = "Emergency phone",
+			tiles = {
+				"infrastructure_emergency_phone_top.png",
+				"infrastructure_emergency_phone_bottom.png",
+				"infrastructure_emergency_phone_side.png",
+				"infrastructure_emergency_phone_side.png",
+				"infrastructure_emergency_phone_side.png",
+				"infrastructure_emergency_phone_front.png"
+			},
+			drawtype = "nodebox",
+			drop = "streets:emergencyphone",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky=1,not_in_creative_inventory=1},
+			light_source = EMERGENCY_PHONE_LIGHT_RANGE,
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
+					{-0.25, -0.5, -0.3125, -0.1875, 0.5, -0.25},
+					{0.1875, -0.5, -0.3125, 0.25, 0.5, -0.25},
+					{-0.1875, 0.4375, -0.3125, 0.1875, 0.5, -0.25}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-0.25, -0.5, -0.25, 0.25, 0.5, 0.25},
+					{-0.25, -0.5, -0.3125, -0.1875, 0.5, -0.25},
+					{0.1875, -0.5, -0.3125, 0.25, 0.5, -0.25},
+					{-0.1875, 0.4375, -0.3125, 0.1875, 0.5, -0.25},
+				}
+			},
+
+			after_dig_node = function(pos)
+				pos.y = pos.y - 1
+				if minetest.get_node(pos).name == "infrastructure:emergency_phone_bottom" then
+					minetest.remove_node(pos)
+				end
+			end,
+
+			on_punch = function(pos, node, puncher)
+				if dial_handler ~= nil then
+					minetest.sound_stop(dial_handler)
+					dial_handler = nil
+				end
+				dial_handler = minetest.sound_play("infrastructure_emergency_phone", {
+					pos = pos,
+					gain = EMERGENCY_PHONE_VOLUME,
+					max_hear_distance = 50
+				})
+				if (puncher:is_player() and puncher:get_hp() < HEALTH_TO_RESTORING and puncher:get_hp() <= HEALTH_TO_TRIGGER) then
+					puncher:set_hp(HEALTH_TO_RESTORING)
+					minetest.chat_send_player(puncher:get_player_name(), "You got healed!")
+					minetest.chat_send_all("Server: -!- "..puncher:get_player_name().." used an emergency phone at "..pos.x..","..pos.y..","..pos.z);
+				end
+			end
+		})
+
+		minetest.register_node("infrastructure:emergency_phone_bottom", {
+			tiles = {"infrastructure_emergency_phone_bottom.png"},
+			drawtype = "nodebox",
+			drop = "streets:emergencyphone",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky=1,not_in_creative_inventory=1},
+			node_box = {
+				type = "fixed",
+				fixed = {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {-0.25, -0.5, -0.25, 0.25, 0.5, 0.25}
+			},
+
+			after_dig_node = function(pos)
+				pos.y = pos.y+1
+				if minetest.get_node(pos).name == "infrastructure:emergency_phone_top" then
+					minetest.remove_node(pos)
+				end
+			end,
+		})
+
+		minetest.register_alias("infrastructure:emergency_phone", "infrastructure:emergency_phone_top")
+
+		minetest.register_abm({
+			nodenames = {"streets:emergencyphone"},
+			interval = 1,
+			chance = 1,
+			action = function(pos, node)
+				local node = minetest.get_node(pos)
+				local node_above = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z})
+				if node_above.name == "air" then
+					node.name = "infrastructure:emergency_phone_bottom"
+					minetest.set_node(pos, node)
+					pos.y = pos.y+1
+				end
+				node.name = "infrastructure:emergency_phone_top"
+				minetest.set_node(pos, node)
+			end,
+		})
+	else
+		print("Infrastructure mod: -!- Emergency-Phone is disabled!")
+	end
diff --git a/infrastructure/advanced_lane_control_lights.lua b/infrastructure/advanced_lane_control_lights.lua
new file mode 100644
index 0000000..f8a2c9f
--- /dev/null
+++ b/infrastructure/advanced_lane_control_lights.lua
@@ -0,0 +1,79 @@
+-- Lane control lights
+	function lane_control_change(pos, node)
+		local node = minetest.env:get_node(pos)
+		if node.name == "infrastructure:lane_control_lights_1" then
+			minetest.swap_node(pos, {name = "infrastructure:lane_control_lights_2", param2 = node.param2})
+		elseif node.name == "infrastructure:lane_control_lights_2" then
+			minetest.swap_node(pos, {name = "infrastructure:lane_control_lights_3", param2 = node.param2})
+		elseif node.name == "infrastructure:lane_control_lights_3" then
+			minetest.swap_node(pos, {name = "infrastructure:lane_control_lights_4", param2 = node.param2})
+		elseif node.name == "infrastructure:lane_control_lights_4" then
+			minetest.swap_node(pos, {name = "infrastructure:lane_control_lights_5", param2 = node.param2})
+		elseif node.name == "infrastructure:lane_control_lights_5" then
+			minetest.swap_node(pos, {name = "infrastructure:lane_control_lights_1", param2 = node.param2})
+		end
+	end
+
+	for i = 1, 5 do
+		local groups = {}
+		if i == 1 then 
+			groups = {cracky = 3}
+		else
+			groups = {cracky = 3, not_in_creative_inventory = 1}
+		end
+
+		minetest.register_node("infrastructure:lane_control_lights_"..tostring(i), {
+			description = "Lane control lights",
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_lane_control_lights_"..tostring(i)..".png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+			drop = "infrastructure:lane_control_lights_1",
+			node_box = {
+				type = "fixed",
+					fixed = {
+						{-7/16, -7/16, -1/8, 7/16, 7/16, 1/8},
+						{-7/16, 0, -1/4, -3/8, 7/16, -1/8},
+						{3/8, 0, -1/4, 7/16, 7/16, -1/8},
+						{-7/16, 3/8, -5/16, 7/16, 7/16, -1/8},
+						{-1/16, -1/4, 0, 1/16, 1/4, 1/2 - 0.001},
+						{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001},
+						{-1/4, -1/16, 0, 1/4, 1/16, 1/2 - 0.001}
+					}
+			},
+			selection_box = {
+				type = "fixed",
+					fixed = {
+						{-7/16, -7/16, -1/8, 7/16, 7/16, 1/8},
+						{-7/16, 0, -1/4, -3/8, 7/16, -1/8},
+						{3/8, 0, -1/4, 7/16, 7/16, -1/8},
+						{-7/16, 3/8, -5/16, 7/16, 7/16, -1/8},
+						{-1/16, -1/4, 0, 1/16, 1/4, 1/2 - 0.001},
+						{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001},
+						{-1/4, -1/16, 0, 1/4, 1/16, 1/2 - 0.001}
+					}
+
+			},
+
+			on_punch = function(pos, node)
+				lane_control_change(pos, node)
+			end,
+
+			mesecons = {effector = {
+				action_on = function (pos, node)
+					lane_control_change(pos, node)
+				end,
+			}}
+		})
+	end
+
+	minetest.register_alias("infrastructure:lane_control_lights", "infrastructure:lane_control_lights_1")
diff --git a/infrastructure/advanced_road_signs.lua b/infrastructure/advanced_road_signs.lua
new file mode 100644
index 0000000..b732bfd
--- /dev/null
+++ b/infrastructure/advanced_road_signs.lua
@@ -0,0 +1,237 @@
+-- Road signs
+	local signs = {"stop", "yield", "right_of_way"}
+
+	for i, sign_name in ipairs(signs) do
+		minetest.register_node("infrastructure:road_sign_"..sign_name, {
+			description = "Road sign "..sign_name,
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_road_sign_"..sign_name.."_back.png",
+				"infrastructure_road_sign_"..sign_name.."_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2},
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+					{-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+					{-3/16, -1/8, 7/16 + 0.01, 3/16, 1/8, 1/2 - 0.01}
+				}
+			},
+
+			after_place_node = function(pos, node)
+				local node = minetest.env:get_node(pos)
+				local param2 = node.param2
+				local sign_pos = {x=pos.x, y=pos.y, z=pos.z}
+
+				if param2 == 0 then
+					pos.z = pos.z + 1
+				elseif param2 == 1 then
+					pos.x = pos.x + 1
+				elseif param2 == 2 then
+					pos.z = pos.z - 1
+				elseif param2 == 3 then
+					pos.x = pos.x - 1
+				end
+
+				local node = minetest.env:get_node(pos)
+
+				if minetest.registered_nodes[node.name].drawtype == "fencelike" then
+					minetest.set_node(sign_pos, {name="infrastructure:road_sign_"..sign_name.."_on_post", param2=param2})
+				end
+			end
+		})
+
+		minetest.register_node("infrastructure:road_sign_"..sign_name.."_on_post", {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_road_sign_"..sign_name.."_back.png",
+				"infrastructure_road_sign_"..sign_name.."_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			drop = "infrastructure:road_sign_"..sign_name,
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+					{-3/16, 1/16, 7/16 + 3/8, 3/16, 1/8, 13/16 + 3/8 - 0.001},
+					{-3/16, -1/8, 7/16 + 3/8, 3/16, -1/16, 13/16 + 3/8 - 0.001}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+					{-3/16, 1/16, 7/16 + 3/8 + 0.01, 3/16, 1/8, 13/16 + 3/8 - 0.01},
+					{-3/16, -1/8, 7/16 + 3/8 + 0.01, 3/16, -1/16, 13/16 + 3/8 - 0.01}
+				}
+			}
+		})
+	end
+
+-- Road sign crosswalk
+	minetest.register_node("infrastructure:road_sign_crosswalk", {
+		description = "Road sign crosswalk",
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_road_sign_crosswalk_back.png",
+			"infrastructure_road_sign_crosswalk_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+				{-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, 7/16, 1/2, 1/2, 7/16},
+				{-3/16, -1/8, 7/16, 3/16, 1/8, 1/2 - 0.001}
+			}
+		},
+
+		after_place_node = function(pos, node)
+			local node = minetest.env:get_node(pos)
+			local param2 = node.param2
+			local sign_pos = {x=pos.x, y=pos.y, z=pos.z}
+
+			if param2 == 0 then
+				pos.z = pos.z + 1
+			elseif param2 == 1 then
+				pos.x = pos.x + 1
+			elseif param2 == 2 then
+				pos.z = pos.z - 1
+			elseif param2 == 3 then
+				pos.x = pos.x - 1
+			end
+
+			local node = minetest.env:get_node(pos)
+
+			if param2 == 0 then
+				pos.z = pos.z - 2
+			elseif param2 == 1 then
+				pos.x = pos.x - 2
+			elseif param2 == 2 then
+				pos.z = pos.z + 2
+			elseif param2 == 3 then
+				pos.x = pos.x + 2
+			end
+
+			if minetest.registered_nodes[node.name].drawtype == "fencelike" then
+				minetest.set_node(sign_pos, {name="infrastructure:road_sign_crosswalk_on_post", param2=param2})
+				minetest.env:add_node(pos, {name="infrastructure:road_sign_retroreflective_surface_on_post", param2=param2})
+			else
+				minetest.env:add_node(pos, {name="infrastructure:road_sign_retroreflective_surface", param2=param2})
+			end
+		end
+	})
+
+	minetest.register_node("infrastructure:road_sign_crosswalk_on_post", {
+		description = "Road sign crosswalk",
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_road_sign_crosswalk_back.png",
+			"infrastructure_road_sign_crosswalk_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2, not_in_creative_inventory = 1},
+		drop = "infrastructure:road_sign_crosswalk",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+				{-3/16, 1/16, 7/16 + 3/8, 3/16, 1/8, 13/16 + 3/8 - 0.001},
+				{-3/16, -1/8, 7/16 + 3/8, 3/16, -1/16, 13/16 + 3/8 - 0.001}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, 7/16 + 3/8, 1/2, 1/2, 7/16 + 3/8},
+				{-3/16, 1/16, 7/16 + 3/8 + 0.01, 3/16, 1/8, 13/16 + 3/8 - 0.01},
+				{-3/16, -1/8, 7/16 + 3/8 + 0.01, 3/16, -1/16, 13/16 + 3/8 - 0.01}
+			}
+		}
+	})
+
+	minetest.register_node("infrastructure:road_sign_retroreflective_surface", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_road_sign_retroreflective_surface.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2, not_in_creative_inventory = 1},
+		light_source = RETROREFLECTIVE_SURFACE_LIGHT_RANGE,
+		drop = "",
+		node_box = {
+			type = "fixed",
+			fixed = {-3/4, -3/4, 7/16 + 1 + 0.01, 3/4, 3/4, 7/16 + 1 + 0.01}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-3/4, -3/4, 7/16 + 1 + 0.01, 3/4, 3/4, 7/16 + 1 + 0.01}
+		}
+	})
+
+	minetest.register_node("infrastructure:road_sign_retroreflective_surface_on_post", {
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_road_sign_retroreflective_surface.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2, not_in_creative_inventory = 1},
+		light_source = RETROREFLECTIVE_SURFACE_LIGHT_RANGE,
+		drop = "",
+		node_box = {
+			type = "fixed",
+			fixed = {-3/4, -3/4, 7/16 + 3/8 + 1 + 0.01, 3/4, 3/4, 7/16 + 3/8 + 1 + 0.01}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-3/4, -3/4, 7/16 + 3/8 + 1 + 0.01, 3/4, 3/4, 7/16 + 3/8 + 1 + 0.01}
+		}
+	})
diff --git a/infrastructure/advanced_traffic_lights_pedestrians.lua b/infrastructure/advanced_traffic_lights_pedestrians.lua
new file mode 100644
index 0000000..02da804
--- /dev/null
+++ b/infrastructure/advanced_traffic_lights_pedestrians.lua
@@ -0,0 +1,252 @@
+-- Traffic lights for pedestrians
+	beep_handler = {}
+
+	function semaphores_pedestrians(pos, node)
+		local p = minetest.hash_node_position(pos)
+		if node.name == "infrastructure:traffic_lights_pedestrians_bottom_1" then
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_2", param2 = node.param2})
+			pos.y = pos.y + 1
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_2", param2 = node.param2})
+		elseif node.name == "infrastructure:traffic_lights_pedestrians_bottom_2" then
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_3", param2 = node.param2})
+			pos.y = pos.y + 1
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_3", param2 = node.param2})
+			beep_handler[p] = minetest.sound_play("infrastructure_traffic_lights_1", {
+				loop = true,
+				pos = pos,
+				gain = TRAFFIC_LIGHTS_VOLUME,
+				max_hear_distance = 50
+			})
+		elseif node.name == "infrastructure:traffic_lights_pedestrians_bottom_3" then
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_4", param2 = node.param2})
+			if beep_handler[p] ~= nil then
+				minetest.sound_stop(beep_handler[p])
+				beep_handler[p] = nil
+			end
+			pos.y = pos.y + 1
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_4", param2 = node.param2})
+			beep_handler[p] = minetest.sound_play("infrastructure_traffic_lights_2", {
+				loop = true,
+				pos = pos,
+				gain = TRAFFIC_LIGHTS_VOLUME,
+				max_hear_distance = 50
+			})
+		elseif node.name == "infrastructure:traffic_lights_pedestrians_bottom_4" then
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_bottom_1", param2 = node.param2})
+			pos.y = pos.y + 1
+			minetest.swap_node(pos, {name = "infrastructure:traffic_lights_pedestrians_top_1", param2 = node.param2})
+			if beep_handler[p] ~= nil then
+				minetest.sound_stop(beep_handler[p])
+				beep_handler[p] = nil
+			end
+		end
+	end
+
+	function quiet(pos)
+		local p = minetest.hash_node_position(pos)
+		if beep_handler[p] ~= nil then
+			minetest.sound_stop(beep_handler[p])
+			beep_handler[p] = nil
+		end
+	end
+
+	for i = 1, 4 do
+		minetest.register_node("infrastructure:traffic_lights_pedestrians_top_"..tostring(i), {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_pedestrians_top_back.png",
+				"infrastructure_traffic_lights_pedestrians_top_front_"..tostring(i)..".png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky=3, not_in_creative_inventory = 1},
+			light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-5/16, -1/2, -1/8, 5/16, 0, 1/8},
+					{-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+					{-5/16, -1/8, -5/16, 5/16, -1/16, -1/8},
+					{-5/16, -3/8, -1/4, -1/4, -1/8, -1/8},
+					{1/4, -3/8, -1/4, 5/16, -1/8, -1/8},
+
+					{-1/8, 1/16, -1/8, 1/8, 5/16, 0},
+					{-1/16, 1/8, 0, 1/16, 1/4, 1/8},
+					{-1/16, 0, -1/16, 1/16, 1/8, 1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {0, 0, 0, 0, 0, 0}
+			}
+		})
+
+		minetest.register_node("infrastructure:traffic_lights_pedestrians_bottom_"..tostring(i), {
+			tiles = {
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_side.png",
+				"infrastructure_traffic_lights_pedestrians_bottom_back.png",
+				"infrastructure_traffic_lights_pedestrians_bottom_front_"..tostring(i)..".png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+			drop = "infrastructure:traffic_lights_pedestrians_bottom_1",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-5/16, -5/16, -1/8, 5/16, 1/2, 1/8},
+					{-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+					{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+					{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+					{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+					{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+					{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+					{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+				-- box
+					{-5/16, -5/16, -1/8, 5/16, 1, 1/8},
+				-- top
+					{-5/16, -1/8 + 1, -5/16, 5/16, -1/16 + 1, -1/8},
+					{-5/16, -3/8 + 1, -1/4, -1/4, -1/8 + 1, -1/8},
+					{1/4, -3/8 + 1, -1/4, 5/16, -1/8 + 1, -1/8},
+
+					{-1/8, 1/16 + 1, -1/8, 1/8, 5/16 + 1, 0},
+					{-1/16, 1/8 + 1, 0, 1/16, 1/4 + 1, 1/8},
+					{-1/16, 0 + 1, -1/16, 1/16, 1/4 + 1, 1/16},
+				-- bottom
+					{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+					{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+					{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+					{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+					{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+					{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+				}
+			},
+
+			after_place_node = function(pos)
+				local node = minetest.env:get_node(pos)
+				pos.y = pos.y + 1
+				node.name = "infrastructure:traffic_lights_pedestrians_top_"..tostring(i)
+				minetest.env:add_node(pos, node)
+			end,
+
+			after_dig_node = function(pos)
+				local node = minetest.env:get_node(pos)
+				quiet(pos)
+				pos.y = pos.y + 1
+				node.name = "infrastructure:traffic_lights_pedestrians_top_"..tostring(i)
+				minetest.env:remove_node(pos)
+			end,
+
+			on_punch = function(pos, node)
+				semaphores_pedestrians(pos, node)
+			end,
+
+			mesecons = {effector = {
+				action_on = function(pos, node)
+					semaphores_pedestrians(pos, node)
+				end
+			}}
+		})
+	end
+
+	minetest.register_node("infrastructure:traffic_lights_pedestrians_bottom_1", {
+		description = "Traffic lights for pedestrians",
+		inventory_image = "infrastructure_traffic_lights_pedestrians.png",
+		wield_image = "infrastructure_traffic_lights_pedestrians.png",
+		tiles = {
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_side.png",
+			"infrastructure_traffic_lights_pedestrians_bottom_back.png",
+			"infrastructure_traffic_lights_pedestrians_bottom_front_1.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3, not_in_creative_inventory = 0},
+		light_source = TRAFFIC_LIGHTS_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -5/16, -1/8, 5/16, 1/2, 1/8},
+				{-1/2, -1/2, -1/8, 1/2, 1/2, -1/8},
+
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.001}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+			-- box
+				{-5/16, -5/16, -1/8, 5/16, 1, 1/8},
+			-- top
+				{-5/16, -1/8 + 1, -5/16, 5/16, -1/16 + 1, -1/8},
+				{-5/16, -3/8 + 1, -1/4, -1/4, -1/8 + 1, -1/8},
+				{1/4, -3/8 + 1, -1/4, 5/16, -1/8 + 1, -1/8},
+
+				{-1/8, 1/16 + 1, -1/8, 1/8, 5/16 + 1, 0},
+				{-1/16, 1/8 + 1, 0, 1/16, 1/4 + 1, 1/8},
+				{-1/16, 0 + 1, -1/16, 1/16, 1/8 + 1, 1/16},
+			-- bottom
+				{-5/16, 1/4, -5/16, 5/16, 5/16, -1/8},
+				{-5/16, 0, -1/4, -1/4, 1/4, -1/8},
+				{1/4, 0, -1/4, 5/16, 1/4, -1/8},
+
+				{-1/16, -1/4, 1/8, 1/16, 1/4, 3/8},
+				{-1/4, -1/16, 1/8, 1/4, 1/16, 3/8},
+				{-1/4, -1/4, 3/8, 1/4, 1/4, 1/2 - 0.01}
+			}
+		},
+
+		after_place_node = function(pos)
+			local node = minetest.env:get_node(pos)
+			pos.y = pos.y + 1
+			node.name = "infrastructure:traffic_lights_pedestrians_top_1"
+			minetest.env:add_node(pos, node)
+		end,
+
+		after_dig_node = function(pos)
+			local node = minetest.env:get_node(pos)
+			quiet(pos)
+			pos.y = pos.y + 1
+			node.name = "infrastructure:traffic_lights_pedestrians_top_1"
+			minetest.env:remove_node(pos)
+		end,
+
+		on_punch = function(pos, node)
+			semaphores_pedestrians(pos, node)
+		end,
+
+		mesecons = {effector = {
+			action_on = function(pos, node)
+				semaphores_pedestrians(pos, node)
+			end
+		}}
+	})
+
+	minetest.register_alias("infrastructure:traffic_lights_pedestrians", "infrastructure:traffic_lights_pedestrians_bottom_1")
diff --git a/infrastructure/advanced_warning_light.lua b/infrastructure/advanced_warning_light.lua
new file mode 100644
index 0000000..67ced44
--- /dev/null
+++ b/infrastructure/advanced_warning_light.lua
@@ -0,0 +1,97 @@
+-- Warning light
+	minetest.register_abm( {
+		nodenames = {"infrastructure:warning_light_bright", "infrastructure:warning_light_dark"},
+		interval = 2,
+		chance = 1,
+		action = function(pos, node)
+			local node = minetest.env:get_node(pos)
+			if node.name == "infrastructure:warning_light_bright" then
+				minetest.swap_node(pos, {name = "infrastructure:warning_light_dark", param2 = node.param2})
+			elseif node.name == "infrastructure:warning_light_dark" then
+				minetest.swap_node(pos, {name = "infrastructure:warning_light_bright", param2 = node.param2})
+			end
+		end
+	})
+
+	minetest.register_node("infrastructure:warning_light_bright", {
+		description = "Warning light",
+		tiles = {
+			"infrastructure_warning_light_top.png",
+			"infrastructure_warning_light_bottom.png",
+			"infrastructure_warning_light_right.png",
+			"infrastructure_warning_light_left.png",
+			"infrastructure_warning_light_back.png",
+			"infrastructure_warning_light_front_bright.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1},
+		light_source = WARNING_LIGHT_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-5/16, -3/8, 0, 5/16, 0, 0},
+
+					{-1/4, -5/16, 0, 0, -1/16, 1/8},
+
+					{1/16, -1/2, -1/8, 5/16, -1/4, 1/8},
+
+					{-1/16, -1/2, -1/16, 1/16, -3/8, 1/16}
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {
+					{-5/16, -3/8, 0, 5/16, 0, 0},
+
+					{-1/4, -5/16, 0 + 0.01, 0, -1/16, 1/8},
+
+					{1/16, -1/2, -1/8, 5/16, -1/4, 1/8},
+
+					{-1/16, -1/2, -1/16, 1/16, -3/8, 1/16}
+				}
+		}
+	})
+
+	minetest.register_node("infrastructure:warning_light_dark", {
+		tiles = {
+			"infrastructure_warning_light_top.png",
+			"infrastructure_warning_light_bottom.png",
+			"infrastructure_warning_light_right.png",
+			"infrastructure_warning_light_left.png",
+			"infrastructure_warning_light_back.png",
+			"infrastructure_warning_light_front_dark.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 1, not_in_creative_inventory = 1},
+		drop = "infrastructure:warning_light_bright",
+		node_box = {
+			type = "fixed",
+				fixed = {
+					{-5/16, -3/8, 0, 5/16, 0, 0},
+
+					{-1/4, -5/16, 0, 0, -1/16, 1/8},
+
+					{1/16, -1/2, -1/8, 5/16, -1/4, 1/8},
+
+					{-1/16, -1/2, -1/16, 1/16, -3/8, 1/16}
+				}
+		},
+		selection_box = {
+			type = "fixed",
+				fixed = {
+					{-5/16, -3/8, 0, 5/16, 0, 0},
+
+					{-1/4, -5/16, 0 + 0.01, 0, -1/16, 1/8},
+
+					{1/16, -1/2, -1/8, 5/16, -1/4, 1/8},
+
+					{-1/16, -1/2, -1/16, 1/16, -3/8, 1/16}
+				}
+		}
+	})
+
+	minetest.register_alias("infrastructure:warning_light", "infrastructure:warning_light_bright")
diff --git a/infrastructure/crafts.lua b/infrastructure/crafts.lua
new file mode 100644
index 0000000..4a324fe
--- /dev/null
+++ b/infrastructure/crafts.lua
@@ -0,0 +1,549 @@
+-- **************************************************************************************************** MATERIALS
+
+-- Galvanized steel
+	if minetest.get_modpath("technic") then
+		technic.register_alloy_recipe({input = {"default:steel_ingot 6", "technic:zinc_ingot 1"}, output = "infrastructure:galvanized_steel 6", time = 4})
+	else
+		minetest.register_craft({
+			output = '"infrastructure:galvanized_steel" 6',
+			recipe = {
+				{'', 'default:copper_ingot', ''},
+				{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+				{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+			}
+		})
+	end
+
+-- Galvanized steel fence
+	minetest.register_craft({
+		output = '"infrastructure:fence_galvanized_steel" 6',
+		recipe = {
+			{'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel'},
+			{'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel', 'infrastructure:galvanized_steel'}
+		}
+	})
+
+-- **************************************************************************************************** CENTER LINES
+
+-- Asphalt block with center dashed line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_center_dashed" 9',
+		recipe = {
+			{'infrastructure:asphalt', 'wool:yellow', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'wool:yellow', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Asphalt block with center solid line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_center_solid_line" 9',
+		recipe = {
+			{'infrastructure:asphalt', 'wool:yellow', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'wool:yellow', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'wool:yellow', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Asphalt block with center solid line on one side
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_center_solid_one_side" 9',
+		recipe = {
+			{'wool:yellow', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:yellow', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:yellow', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+
+-- Asphalt block with center solid double line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_center_solid_double" 9',
+		recipe = {
+			{'wool:yellow', 'infrastructure:asphalt', 'wool:yellow'},
+			{'wool:yellow', 'infrastructure:asphalt', 'wool:yellow'},
+			{'wool:yellow', 'infrastructure:asphalt', 'wool:yellow'}
+		}
+	})
+
+-- Asphalt block with center corner single line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_center_corner_single" 9',
+		recipe = {
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'wool:yellow', 'wool:yellow'},
+			{'infrastructure:asphalt', 'wool:yellow', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Asphalt block with center corner double line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_center_corner_double" 9',
+		recipe = {
+			{'wool:yellow', 'wool:yellow', 'wool:yellow'},
+			{'wool:yellow', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:yellow', 'infrastructure:asphalt', 'wool:yellow'}
+		}
+	})
+
+-- **************************************************************************************************** BORDER LINES
+
+-- Asphalt block with side dashed line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_side_dashed" 9',
+		recipe = {
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Asphalt block with side solid line
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_side_solid" 9',
+		recipe = {
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Asphalt block with lines for inner edge
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_inner_edge" 9',
+		recipe = {
+			{'wool:white', 'wool:white', 'wool:white'},
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Asphalt block with lines for outer edge
+	minetest.register_craft({
+		output = '"infrastructure:asphalt_outer_edge" 9',
+		recipe = {
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'},
+			{'wool:white', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+
+-- **************************************************************************************************** PRECAST CONCRETE
+
+-- Concrete seperating wall
+	minetest.register_craft({
+		output = '"infrastructure:precast_concrete_seperating_wall" 5',
+		recipe = {
+			{'', 'infrastructure:concrete', ''},
+			{'', 'infrastructure:concrete', ''},
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+		}
+	})
+
+-- Concrete cylinder
+	minetest.register_craft({
+		output = '"infrastructure:precast_concrete_cylinder" 8',
+		recipe = {
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'},
+			{'infrastructure:concrete', '', 'infrastructure:concrete'},
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+		}
+	})
+
+-- Concrete grid paver
+	minetest.register_craft({
+		output = '"infrastructure:precast_concrete_grid_paver" 5',
+		recipe = {
+			{'infrastructure:concrete', '', 'infrastructure:concrete'},
+			{'', 'infrastructure:concrete', ''},
+			{'infrastructure:concrete', '', 'infrastructure:concrete'}
+		}
+	})
+
+-- **************************************************************************************************** STEEL STRUCTURES
+
+-- Truss
+	minetest.register_craft({
+		output = '"infrastructure:truss" 5',
+		recipe = {
+			{'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'},
+			{'', 'infrastructure:galvanized_steel', ''},
+			{'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'}
+		}
+	})
+
+-- Wire netting
+	minetest.register_craft({
+		output = '"infrastructure:wire_netting" 10',
+		recipe = {
+			{'', 'infrastructure:galvanized_steel', ''},
+			{'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'},
+			{'', 'infrastructure:galvanized_steel', ''}
+		}
+	})
+
+-- Razor wire
+	minetest.register_craft({
+		output = '"infrastructure:razor_wire" 5',
+		recipe = {
+			{'infrastructure:galvanized_steel'},
+			{'default:cactus'},
+			{'infrastructure:galvanized_steel'}
+		}
+	})
+
+-- Drainage channel grating
+	minetest.register_craft({
+		output = '"infrastructure:drainage_channel_grating" 2',
+		recipe = {
+			{'infrastructure:galvanized_steel', '', 'infrastructure:galvanized_steel'}
+		}
+	})
+
+-- Louver
+	minetest.register_craft({
+		output = '"infrastructure:drainage_channel_grating" 2',
+		recipe = {
+			{'infrastructure:galvanized_steel'},
+			{''},
+			{'infrastructure:galvanized_steel'}
+		}
+	})
+
+-- Riffled sheet
+	minetest.register_craft({
+		output = '"infrastructure:riffled_sheet" 4',
+		recipe = {
+			{'infrastructure:galvanized_steel', 'infrastructure:fence_galvanized_steel'},
+			{'infrastructure:fence_galvanized_steel', 'infrastructure:galvanized_steel'}
+		}
+	})
+
+-- Corrugated sheet
+	minetest.register_craft({
+		output = '"infrastructure:corrugated_sheet" 4',
+		recipe = {
+			{"","infrastructure:galvanized_steel",""},
+			{"infrastructure:galvanized_steel","","infrastructure:galvanized_steel"}
+		}
+	})
+
+-- Louvers
+	minetest.register_craft({
+		output = "infrastructure:louver_opened",
+		recipe = {
+			{"infrastructure:fence_galvanized_steel","infrastructure:galvanized_steel","infrastructure:fence_galvanized_steel"},
+			{"","",""},
+			{"infrastructure:fence_galvanized_steel","infrastructure:galvanized_steel","infrastructure:fence_galvanized_steel"}
+		}
+	})
+
+-- **************************************************************************************************** ADVANCED ITEMS
+
+-- Raised pavement marker yellow/yellow
+	minetest.register_craft({
+		output = '"infrastructure:marker_yellow_yellow" 1',
+		recipe = {
+			{'wool:yellow', 'infrastructure:asphalt', 'wool:yellow'},
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Raised pavement marker red/yellow
+	minetest.register_craft({
+		output = '"infrastructure:marker_red_yellow" 1',
+		recipe = {
+			{'wool:yellow', 'infrastructure:asphalt', 'wool:red'},
+			{'infrastructure:asphalt', 'infrastructure:asphalt', 'infrastructure:asphalt'}
+		}
+	})
+
+-- Retroreflective delineators
+	minetest.register_craft({
+		output = '"infrastructure:delineator" 1',
+		recipe = {
+			{'wool:yellow', 'infrastructure:concrete', 'wool:red'},
+			{'', 'infrastructure:concrete', ''},
+			{'', 'infrastructure:concrete', ''}
+		}
+	})
+
+	minetest.register_craft({
+		output = '"infrastructure:delineator_guardrail" 1',
+		recipe = {
+			{'wool:yellow', 'infrastructure:concrete', 'wool:red'},
+			{'', 'infrastructure:concrete', ''}
+		}
+	})
+
+-- Wire rope safety barrier
+	minetest.register_craft({
+		output = '"infrastructure:wire_rope_safety_barrier" 1',
+		recipe = {
+			{'default:steel_ingot', '', 'default:steel_ingot'},
+			{'', 'default:steel_ingot', ''},
+			{'', 'default:steel_ingot', ''}
+		}
+	})
+
+-- Cable barrier terminal
+	minetest.register_craft({
+		output = '"infrastructure:cable_barrier_terminal" 1',
+		recipe = {
+			{'default:steel_ingot', '', ''},
+			{'', 'default:steel_ingot', ''},
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+		}
+	})
+
+-- Corrugated guide rail
+	minetest.register_craft({
+		output = '"infrastructure:corrugated_guide_rail" 1',
+		recipe = {
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+			{'', 'default:steel_ingot', ''},
+			{'', 'default:steel_ingot', ''}
+		}
+	})
+
+-- Energy absorbing terminal
+	minetest.register_craft({
+		output = '"infrastructure:energy_absorbing_terminal" 1',
+		recipe = {
+			{'', 'default:steel_ingot', ''},
+			{'default:steel_ingot', 'default:steel_ingot', ''},
+			{'', 'default:steel_ingot', ''}
+		}
+	})
+
+	minetest.register_craft({
+		output = '"infrastructure:energy_absorbing_terminal" 1',
+		recipe = {
+			{'infrastructure:energy_absorbing_terminal_inversed'}
+		}
+	})
+
+	minetest.register_craft({
+		output = '"infrastructure:energy_absorbing_terminal_inversed" 1',
+		recipe = {
+			{'infrastructure:energy_absorbing_terminal'}
+		}
+	})
+
+-- Fitch barrel
+	minetest.register_craft({
+		output = '"infrastructure:fitch_barrel" 1',
+		recipe = {
+			{'wool:black', 'wool:black', 'wool:black'},
+			{'wool:yellow', 'default:sand', 'wool:yellow'},
+			{'wool:yellow', 'wool:yellow', 'wool:yellow'}
+		}
+	})
+
+-- Crowd control barricade
+	minetest.register_craft({
+		output = '"infrastructure:crowd_control_barricade" 1',
+		recipe = {
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+			{'default:steel_ingot', '', 'default:steel_ingot'}
+		}
+	})
+
+if ENABLE_EMERGENCY_PHONE then
+-- Emergency phone
+	minetest.register_craft({
+		output = '"infrastructure:emergency_phone" 1',
+		recipe = {
+			{'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'},
+			{'default:mese_crystal', 'default:apple', 'default:mese_crystal'},
+			{'default:mese_crystal', 'default:stick', 'default:mese_crystal'}
+		}
+	})
+	minetest.register_craft({
+		output = '"infrastructure:emergency_phone" 1',
+		recipe = {
+			{'default:mese', 'default:mese', 'default:mese'},
+			{'default:mese', 'default:apple', 'default:mese'},
+			{'default:mese', 'default:stick', 'default:mese'}
+		}
+	})
+end
+
+-- Manhole cover
+	minetest.register_craft({
+		output = '"infrastructure:manhole_cover_closed" 1',
+		recipe = {
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'},
+			{'infrastructure:concrete', 'default:steel_ingot', 'infrastructure:concrete'},
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+		}
+	})
+
+-- Traffic lights for pedestrians
+	minetest.register_craft({
+		output = '"infrastructure:traffic_lights_pedestrians" 1',
+		recipe = {
+			{'', 'default:steel_ingot', ''},
+			{'default:steel_ingot', 'wool:red', 'default:steel_ingot'},
+			{'default:steel_ingot', 'wool:green', 'default:steel_ingot'}
+		}
+	})
+
+-- Crosswalk warning light
+	minetest.register_craft({
+		output = '"infrastructure:crosswalk_warning_light" 1',
+		recipe = {
+			{'', 'default:steel_ingot', ''},
+			{'default:steel_ingot', 'wool:yellow', 'default:steel_ingot'},
+			{'', 'wool:green', ''}
+		}
+	})
+
+-- Curve chevron
+	minetest.register_craft({
+		output = '"infrastructure:curve_chevron" 1',
+		recipe = {
+			{'wool:yellow', 'wool:black', 'wool:yellow'},
+			{'wool:black', 'wool:yellow', 'wool:yellow'},
+			{'wool:yellow', 'wool:black', 'wool:yellow'}
+		}
+	})
+
+-- Crosswalk lighting
+	minetest.register_craft({
+		output = '"infrastructure:crosswalk_lighting" 1',
+		recipe = {
+			{'wool:white', 'wool:white', 'wool:white'},
+			{'', 'mesecons_torch:mesecon_torch_on', ''},
+			{'wool:white', 'wool:white', 'wool:white'}
+		}
+	})
+
+-- Crosswalk safety sign
+	minetest.register_craft({
+		output = '"infrastructure:crosswalk_safety_sign" 1',
+		recipe = {
+			{'', 'wool:green', ''},
+			{'', 'wool:green', ''},
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+		}
+	})
+
+-- Road sign crosswalk
+	minetest.register_craft({
+		output = '"infrastructure:road_sign_crosswalk" 1',
+		recipe = {
+			{'wool:green', 'wool:green', 'wool:green'},
+			{'wool:green', 'wool:blue', 'wool:green'},
+			{'wool:green', 'wool:green', 'wool:green'}
+		}
+	})
+
+-- Road sign right_of_way
+	minetest.register_craft({
+		output = '"infrastructure:road_sign_right_of_way" 1',
+		recipe = {
+			{"", 'wool:white', ""},
+			{'wool:white', 'wool:yellow', 'wool:white'},
+			{"", 'wool:white', ""}
+		}
+	})
+
+-- Road sign stop
+	minetest.register_craft({
+		output = '"infrastructure:road_sign_stop" 1',
+		recipe = {
+			{'wool:red', 'wool:red', 'wool:red'},
+			{'wool:red', 'wool:white', 'wool:red'},
+			{'wool:red', 'wool:red', 'wool:red'}
+		}
+	})
+
+-- Road sign yield
+	minetest.register_craft({
+		output = '"infrastructure:road_sign_yield" 1',
+		recipe = {
+			{'wool:orange', 'wool:orange', 'wool:orange'},
+			{'wool:red', 'wool:orange', 'wool:red'},
+			{'', 'wool:red', ''}
+		}
+	})
+
+-- Automatic warning device
+	minetest.register_craft({
+		output = '"infrastructure:automatic_warning_device" 1',
+		recipe = {
+			{'wool:red', 'default:steel_ingot', 'wool:red'},
+			{'', 'default:steel_ingot', ''},
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+		}
+	})
+
+-- Boom barrier
+	minetest.register_craft({
+		output = '"infrastructure:boom_barrier_mechanism" 1',
+		recipe = {
+			{'default:steel_ingot', 'default:steel_ingot', ''},
+			{'', 'default:steel_ingot', ''},
+			{'infrastructure:concrete', 'infrastructure:concrete', 'infrastructure:concrete'}
+		}
+	})
+
+	minetest.register_craft({
+		output = '"infrastructure:boom_barrier_arm" 1',
+		recipe = {
+			{'', 'wool:red', ''},
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+		}
+	})
+
+-- Aircraft warning light
+	minetest.register_craft({
+		output = '"infrastructure:aircraft_warning_light" 1',
+		recipe = {
+			{'', 'wool:red', ''},
+			{'wool:red', 'default:torch', 'wool:red'},
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+		}
+	})
+
+-- Warning light
+	minetest.register_craft({
+		output = '"infrastructure:warning_light" 1',
+		recipe = {
+			{'wool:yellow', 'wool:yellow', ''},
+			{'wool:yellow', 'default:torch', ''},
+			{'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}
+		}
+	})
+
+-- Anti-dazzling panel
+	minetest.register_craft({
+		output = '"infrastructure:anti_dazzling_panel" 1',
+		recipe = {
+			{'wool:grey', 'wool:grey'},
+			{'wool:grey', 'wool:yellow'},
+			{'wool:grey', 'wool:grey'}
+		}
+	})
+
+-- Traffic cone
+	minetest.register_craft({
+		output = '"infrastructure:traffic_cone" 1',
+		recipe = {
+			{'', 'wool:orange', ''},
+			{'wool:orange', '', 'wool:orange'},
+		}
+	})
+
+-- Noise barrier
+	minetest.register_craft({
+		output = '"infrastructure:noise_barrier" 1',
+		recipe = {
+			{'default:steel_ingot', 'wool:green', 'default:steel_ingot'},
+			{'wool:green', 'default:steel_ingot', 'wool:green'},
+			{'default:steel_ingot', 'wool:green', 'default:steel_ingot'}
+		}
+	})
diff --git a/infrastructure/depends.txt b/infrastructure/depends.txt
new file mode 100644
index 0000000..af1119b
--- /dev/null
+++ b/infrastructure/depends.txt
@@ -0,0 +1,8 @@
+default
+moreblocks
+mesecons
+wool
+streetsmod
+prefab
+digilines
+technic?
diff --git a/infrastructure/init.lua b/infrastructure/init.lua
new file mode 100644
index 0000000..8b79b00
--- /dev/null
+++ b/infrastructure/init.lua
@@ -0,0 +1,24 @@
+-- Load settings
+dofile(minetest.get_modpath("infrastructure").."/settings.lua")
+
+-- Register nodes
+dofile(minetest.get_modpath("infrastructure").."/nodes.lua")
+-- Register special nodes
+dofile(minetest.get_modpath("infrastructure").."/nodes_extension.lua")
+-- Register advanced devices
+dofile(minetest.get_modpath("infrastructure").."/advanced_road_signs.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_emergency_phone.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_traffic_lights_pedestrians.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_crosswalk_warning_light.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_lane_control_lights.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_curve_chevron.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_crosswalk_lighting.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_crosswalk_safety_sign.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_automatic_warning_device.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_boom_barrier.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_aircraft_warning_light.lua")
+dofile(minetest.get_modpath("infrastructure").."/advanced_warning_light.lua")
+-- Register crafting recipes
+dofile(minetest.get_modpath("infrastructure").."/crafts.lua")
+
+print("Infrastructure mod loaded succesfully!")
diff --git a/infrastructure/nodes.lua b/infrastructure/nodes.lua
new file mode 100644
index 0000000..33845c1
--- /dev/null
+++ b/infrastructure/nodes.lua
@@ -0,0 +1,1579 @@
+-- **************************************************************************************************** MATERIALS
+
+-- Asphalt block
+	minetest.register_alias("infrastructure:asphalt", "streets:asphalt")
+
+-- Concrete block
+	minetest.register_alias("infrastructure:concrete", "technic:concrete")
+
+-- Concrete fence
+	minetest.register_alias("infrastructure:fence_concrete", "prefab:concrete_fence")
+
+-- Galvanized steel block
+	minetest.register_node("infrastructure:galvanized_steel", {
+		description = "Galvanized steel",
+		tiles = {"infrastructure_galvanized_steel.png"},
+		drawtype = "normal",
+		paramtype = "light",
+		groups = {cracky = 2},
+	})
+	minetest.register_alias("galvanized_steel", "infrastructure:galvanized_steel")
+
+-- Galvanized steel fence
+	minetest.register_node("infrastructure:fence_galvanized_steel", {
+		description = "Galvanized steel fence",
+		drawtype = "fencelike",
+		tiles = {"infrastructure_galvanized_steel.png"},
+		paramtype = "light",
+		is_ground_content = true,
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
+		},
+		groups = {cracky = 2},
+	})
+
+-- **************************************************************************************************** CENTER LINES
+
+-- Asphalt block with center solid line
+	minetest.register_node("infrastructure:asphalt_center_solid_line", {
+	description = "Asphalt with center solid line",
+	tiles = {
+			"streets_asphalt.png^infrastructure_single_yellow_line.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+	},
+	drawtype = "normal",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	groups = {cracky = 1},
+	})
+
+-- Asphalt block with center solid line on one side (for making dashed lines)
+	minetest.register_node("infrastructure:asphalt_center_solid_one_side", {
+	description = "Asphalt with center solid line on one side",
+	tiles = {
+			"streets_asphalt.png^infrastructure_solid_yellow_line_one_side.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+	},
+	drawtype = "normal",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	groups = {cracky = 1},
+	})
+
+-- Asphalt block with center solid double line
+	minetest.register_node("infrastructure:asphalt_center_solid_double", {
+	description = "Asphalt with center solid double line",
+	tiles = {
+			"streets_asphalt.png^infrastructure_double_yellow_line.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+	},
+	drawtype = "normal",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	groups = {cracky = 1},
+	})
+
+-- Asphalt block with center corner single line
+	minetest.register_node("infrastructure:asphalt_center_corner_single", {
+	description = "Asphalt with center corner single line",
+	tiles = {
+			"streets_asphalt.png^infrastructure_single_yellow_line_corner.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+	},
+	drawtype = "normal",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	groups = {cracky = 1},
+	})
+
+-- Asphalt block with center corner double line
+	minetest.register_node("infrastructure:asphalt_center_corner_double", {
+	description = "Asphalt with center corner double line",
+	tiles = {
+			"streets_asphalt.png^infrastructure_solid_double_yellow_line_corner.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+			"streets_asphalt.png",
+	},
+	drawtype = "normal",
+	paramtype = "light",
+	paramtype2 = "facedir",
+	groups = {cracky = 1},
+	})
+
+-- **************************************************************************************************** TRAFFIC MARKS
+
+-- Asphalt block with arrow straight
+	minetest.register_alias("infrastructure:asphalt_arrow_straight", "streets:asphalt_arrow_straight")
+
+-- Asphalt block with arrow straight + left
+	minetest.register_alias("infrastructure:asphalt_arrow_straight_left", "streets:asphalt_arrow_straight_left")
+
+-- Asphalt block with arrow straight + right
+	minetest.register_alias("infrastructure:asphalt_arrow_straight_right", "streets:asphalt_arrow_straight_left")
+
+-- Asphalt block with arrow left
+	minetest.register_alias("infrastructure:asphalt_arrow_left", "streets:asphalt_arrow_left")
+
+-- Asphalt block with arrow right
+	minetest.register_alias("infrastructure:asphalt_arrow_right", "streets:asphalt_arrow_right")
+
+-- Asphalt block with "P"-sign
+	minetest.register_alias("infrastructure:asphalt_parking", "streets:asphalt_parking")
+
+-- **************************************************************************************************** PRECAST CONCRETE
+
+-- Concrete seperating wall
+	minetest.register_node("infrastructure:precast_concrete_seperating_wall", {
+		description = "Precast concrete seperating wall",
+		tiles = {"infrastructure_concrete.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -1/2, -7/16, 5/16, -1/4, 7/16},
+				{-1/16, -1/4, -7/16, 1/16, 1/2, 7/16},
+				{-3/16, -1/2, -5/16, 3/16, 0, -1/4},
+				{-3/16, -1/2, 1/4, 3/16, 0, 5/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-5/16, -1/2, -7/16, 5/16, -1/4, 7/16},
+				{-1/16, -1/4, -7/16, 1/16, 1/2, 7/16},
+				{-3/16, -1/2, -5/16, 3/16, 0, -1/4},
+				{-3/16, -1/2, 1/4, 3/16, 0, 5/16}
+			}
+		}
+	})
+
+-- Concrete cylinder
+	minetest.register_node("infrastructure:precast_concrete_cylinder", {
+		description = "Precast concrete cylinder",
+		tiles = {"infrastructure_concrete.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		walkable = false,
+		climbable = true,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
+				{-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, 1/2, 1/2, -3/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{3/8, -1/2, -1/2, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, -3/8, 1/2, 1/2},
+				{-1/2, -1/2, 3/8, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, 1/2, 1/2, -3/8}
+			}
+		}
+	})
+
+-- Concrete grid paver
+	minetest.register_node("infrastructure:precast_concrete_grid_paver", {
+		description = "Precast concrete grid paver",
+		tiles = {
+			"infrastructure_grid_paver_top.png",
+			"infrastructure_grid_paver_bottom.png",
+			"infrastructure_concrete.png",
+			"infrastructure_concrete.png",
+			"infrastructure_concrete.png",
+			"infrastructure_concrete.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+				{-1/2, -1/2 + 1/128, -1/2, 1/2, -1/2 + 1/128, 1/2},
+				{-1/2, -1/2 + 2/128, -1/2, 1/2, -1/2 + 2/128, 1/2},
+				{-1/2, -1/2 + 3/128, -1/2, 1/2, -1/2 + 3/128, 1/2},
+				{-1/2, -1/2 + 4/128, -1/2, 1/2, -1/2 + 4/128, 1/2},
+				{-1/2, -1/2 + 5/128, -1/2, 1/2, -1/2 + 5/128, 1/2},
+				{-1/2, -1/2 + 6/128, -1/2, 1/2, -1/2 + 6/128, 1/2},
+				{-1/2, -1/2 + 7/128, -1/2, 1/2, -1/2 + 7/128, 1/2},
+				{-1/2, -1/2 + 8/128, -1/2, 1/2, -1/2 + 8/128, 1/2},
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 1/2, -1/2 + 8/128, 1/2}
+		},
+
+		after_place_node = function(pos)
+			pos.y = pos.y - 1
+			local node = minetest.get_node(pos)
+			if (node.name == "default:dirt_with_grass") then
+				pos.y = pos.y + 1
+				local node = minetest.get_node(pos)
+				node.name = "infrastructure:precast_concrete_grid_paver_with_grass"
+				minetest.swap_node(pos, node)
+			end
+		end
+	})
+
+	minetest.register_node("infrastructure:precast_concrete_grid_paver_with_grass", {
+		description = "Precast concrete grid paver with grass",
+		tiles = {
+			"infrastructure_grid_paver_top.png",
+			"infrastructure_grid_paver_bottom.png",
+			"infrastructure_grid_paver_grass.png",
+			"infrastructure_grid_paver_grass.png",
+			"infrastructure_grid_paver_grass.png",
+			"infrastructure_grid_paver_grass.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2,not_in_creative_inventory = 1},
+		drop = "infrastructure:precast_concrete_grid_paver",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+				{-1/2, -1/2 + 1/128, -1/2, 1/2, -1/2 + 1/128, 1/2},
+				{-1/2, -1/2 + 2/128, -1/2, 1/2, -1/2 + 2/128, 1/2},
+				{-1/2, -1/2 + 3/128, -1/2, 1/2, -1/2 + 3/128, 1/2},
+				{-1/2, -1/2 + 4/128, -1/2, 1/2, -1/2 + 4/128, 1/2},
+				{-1/2, -1/2 + 5/128, -1/2, 1/2, -1/2 + 5/128, 1/2},
+				{-1/2, -1/2 + 6/128, -1/2, 1/2, -1/2 + 6/128, 1/2},
+				{-1/2, -1/2 + 7/128, -1/2, 1/2, -1/2 + 7/128, 1/2},
+				{-1/2, -1/2 + 8/128, -1/2, 1/2, -1/2 + 8/128, 1/2},
+
+				{-3/8, -1/2, 1/4, -1/8, 0, 1/4},
+				{1/8, -1/2, 1/4, 3/8, 0, 1/4},
+
+				{-1/8, -1/2, 0, 1/8, 0, 0},
+
+				{-3/8, -1/2, -1/4, -1/8, 0, -1/4},
+				{1/8, -1/2, -1/4, 3/8, 0, -1/4},
+
+				{1/4, -1/2, -3/8, 1/4, 0, -1/8},
+				{1/4, -1/2, 1/8, 1/4, 0, 3/8},
+
+				{0, -1/2, -1/8, 0, 0, 1/8},
+
+				{-1/4, -1/2, -3/8, -1/4, 0, -1/8},
+				{-1/4, -1/2, 1/8, -1/4, 0, 3/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 1/2, -1/2 + 8/128, 1/2}
+		},
+
+		on_punch = function(pos, node)
+			local node = minetest.get_node(pos)
+			node.name = "infrastructure:precast_concrete_grid_paver"
+			minetest.swap_node(pos, node)
+		end
+	})
+
+-- **************************************************************************************************** STEEL STRUCTURES
+
+-- Truss
+	minetest.register_node("infrastructure:truss", {
+		description = "Truss",
+		tiles = {"infrastructure_truss.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{1/2, -1/2, -1/2, 1/2, 1/2, 1/2},
+				{-1/2, 1/2, -1/2, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, 1/2, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, -1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+				{-1/2, -1/2, -1/2, 1/2, 1/2, -1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}
+		}
+	})
+
+-- Wire netting
+	minetest.register_node("infrastructure:wire_netting", {
+		description = "Wire netting",
+		tiles = {"infrastructure_wire_netting.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, 0, 1/2, 1/2, 0}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/8, 1/2, 1/2, 1/8}
+		}
+	})
+
+-- Razor wire
+	minetest.register_node("infrastructure:razor_wire", {
+		description = "Razor wire",
+		tiles = {"infrastructure_razor_wire.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, 1/2, -1/2, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, 1/2, -1/2, 1/2},
+				{-1/2, -1/2, 1/2, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, -1/2, 1/2, 1/2, -1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 1/2, 1/2, 1/2}
+		},
+
+		walkable = false,
+		damage_per_second = 8
+	})
+
+-- Drainage channel grating
+	minetest.register_node("infrastructure:drainage_channel_grating", {
+		description = "Truss",
+		tiles = {
+			"infrastructure_drainage_channel_grating.png",
+			"infrastructure_drainage_channel_grating.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 0, -3/8, 1/2}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 0, -3/8, 1/2}
+		}
+	})
+
+-- Louver
+	minetest.register_node("infrastructure:louver_opened", {
+		description = "Louver",
+		tiles = {"infrastructure_galvanized_steel.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, 7/16, 0, 1/2, 1/2, 1/2},
+				{-1/2, -1/16, 0, 1/2, 0, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, 7/16, 0, 1/2, 1/2, 1/2},
+				{-1/2, -1/16, 0, 1/2, 0, 1/2}
+			}
+		},
+
+		on_punch = function(pos, node)
+			minetest.swap_node(pos, {name = "infrastructure:louver_closed", param2 = node.param2})
+		end
+	})
+
+	minetest.register_node("infrastructure:louver_closed", {
+		tiles = {"infrastructure_galvanized_steel.png"},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		drop = "infrastructure:louver_opened",
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, 1/16, 7/16, 1/2, 1/2, 1/2},
+				{-1/2, -7/16, 7/16, 1/2, 0, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, 1/16, 7/16, 1/2, 1/2, 1/2},
+				{-1/2, -7/16, 7/16, 1/2, 0, 1/2}
+			}
+		},
+
+		on_punch = function(pos, node)
+			minetest.swap_node(pos, {name = "infrastructure:louver_opened", param2 = node.param2})
+		end
+	})
+
+	minetest.register_alias("infrastructure:louver", "infrastructure:louver_opened")
+
+-- Riffled sheet
+	minetest.register_node("infrastructure:riffled_sheet", {
+		description = "Riffled sheet",
+		tiles = {"infrastructure_riffled_sheet.png"},
+		inventory_image = "infrastructure_riffled_sheet.png",
+		wield_image = "infrastructure_riffled_sheet.png",
+		drawtype = "nodebox",
+		paramtype = "light",
+		groups = {cracky = 2, oddly_breakable_by_hand = 1},
+		node_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/2, -1/2, 1/2, -1/2 + 0.001, 1/2}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-1/2, -1/4, -1/2, 1/2, -1/2 + 0.01, 1/2}
+		}
+	})
+
+-- Corrugated sheet
+	minetest.register_node("infrastructure:corrugated_sheet", {
+		description = "corrugated sheet",
+		tiles = {"infrastructure_corrugated_sheet.png"},
+		inventory_image = "infrastructure_corrugated_sheet.png",
+		wield_image = "infrastructure_corrugated_sheet.png",
+		drawtype = "raillike",
+		paramtype = "light",
+		groups = {cracky = 2, oddly_breakable_by_hand = 1},
+	})
+
+-- **************************************************************************************************** ADVANCED ITEMS
+
+-- Displacement
+	function displacement(pos, placer)
+		local displaced_node = minetest.get_node(pos)
+		local fdir = minetest.dir_to_facedir(placer:get_look_dir())
+		pos.y = pos.y - 1
+		local node = minetest.get_node(pos)
+
+		if ((string.find(node.name, "_three_quarter") ~= nil) or (string.find(node.name, "_displacement_1") ~= nil)) then
+			pos.y = pos.y + 1
+			minetest.set_node(pos, {name = displaced_node.name.."_displacement_1", param2 = fdir})
+		elseif (((string.find(node.name, "slab_") ~= nil) and (string.find(node.name, "_quarter") == nil)) or (string.find(node.name, "_displacement_2") ~= nil)) then
+			pos.y = pos.y + 1
+			minetest.set_node(pos, {name = displaced_node.name.."_displacement_2", param2 = fdir})
+		elseif (((string.find(node.name, "_quarter") ~= nil) and (string.find(node.name, "_three_quarter") == nil)) or (string.find(node.name, "_displacement_3") ~= nil)) then
+			pos.y = pos.y + 1
+			minetest.set_node(pos, {name = displaced_node.name.."_displacement_3", param2 = fdir})
+		end
+	end
+
+-- Raised pavement marker yellow/yellow
+	minetest.register_node("infrastructure:marker_yellow_yellow", {
+		description = "Raised pavement marker with yellow & yellow retroreflectors",
+		tiles = {
+			"infrastructure_marker_top_yellow_yellow.png",
+			"infrastructure_marker_bottom_side.png",
+			"infrastructure_marker_bottom_side.png",
+			"infrastructure_marker_bottom_side.png",
+			"infrastructure_marker_side_yellow.png",
+			"infrastructure_marker_side_yellow.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3},
+		walkable = false,
+		light_source = MARKER_LIGHT_RANGE,
+		sunlight_propagates = true,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+				{-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+				{1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+				{-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+				{-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+				{1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+				{-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:marker_yellow_yellow_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_marker_top_yellow_yellow.png",
+				"infrastructure_marker_bottom_side.png",
+				"infrastructure_marker_bottom_side.png",
+				"infrastructure_marker_bottom_side.png",
+				"infrastructure_marker_side_yellow.png",
+				"infrastructure_marker_side_yellow.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			walkable = false,
+			light_source = MARKER_LIGHT_RANGE,
+			sunlight_propagates = true,
+			drop = "infrastructure:marker_yellow_yellow",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+					{-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+					{1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+					{-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+					{-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+					{1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+					{-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+				}
+			}
+		})
+	end
+
+-- Raised pavement marker red/yellow
+	minetest.register_node("infrastructure:marker_red_yellow", {
+		description = "Raised pavement marker with red & yellow retroreflectors",
+		tiles = {
+			"infrastructure_marker_top_red_yellow.png",
+			"infrastructure_marker_bottom_side.png",
+			"infrastructure_marker_bottom_side.png",
+			"infrastructure_marker_bottom_side.png",
+			"infrastructure_marker_side_yellow.png",
+			"infrastructure_marker_side_red.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3},
+		walkable = false,
+		light_source = MARKER_LIGHT_RANGE,
+		sunlight_propagates = true,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+				{-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+				{1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+				{-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, -1/16, -3/8, 1/8},
+				{-1/16, -1/2, -1/8, 1/16, -7/16, 1/8},
+				{1/16, -1/2, -1/8, 1/8, -3/8, 1/8},
+				{-1/16, -7/16, -1/16, 1/16, -3/8, 1/16}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:marker_red_yellow_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_marker_top_red_yellow.png",
+				"infrastructure_marker_bottom_side.png",
+				"infrastructure_marker_bottom_side.png",
+				"infrastructure_marker_bottom_side.png",
+				"infrastructure_marker_side_yellow.png",
+				"infrastructure_marker_side_red.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			walkable = false,
+			light_source = MARKER_LIGHT_RANGE,
+			sunlight_propagates = true,
+			drop = "infrastructure:marker_red_yellow",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+					{-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+					{1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+					{-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, -1/16, -3/8 - i/4, 1/8},
+					{-1/16, -1/2 - i/4, -1/8, 1/16, -7/16 - i/4, 1/8},
+					{1/16, -1/2 - i/4, -1/8, 1/8, -3/8 - i/4, 1/8},
+					{-1/16, -7/16 - i/4, -1/16, 1/16, -3/8 - i/4, 1/16}
+				}
+			}
+		})
+	end
+
+-- Retroreflective delineators
+	minetest.register_node("infrastructure:delineator", {
+		description = "Retroreflective delineator",
+		tiles = {
+			"infrastructure_concrete.png",
+			"infrastructure_concrete.png",
+			"infrastructure_delineator_wrapper_right.png",
+			"infrastructure_delineator_wrapper_left.png",
+			"infrastructure_delineator_retroreflector_yellow.png",
+			"infrastructure_delineator_retroreflector_red.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3},
+		light_source = DELINEATOR_LIGHT_RANGE,
+		sunlight_propagates = true,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, 1/8, 1/2, -1/16},
+				{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+				{-1/8, -1/2, 1/16, 1/8, 1/2, 1/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, 1/8, 1/2, -1/16},
+				{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+				{-1/8, -1/2, 1/16, 1/8, 1/2, 1/8}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	minetest.register_node("infrastructure:delineator_guardrail", {
+		description = "Retroreflective delineator for guardrail",
+		tiles = {
+			"infrastructure_concrete.png",
+			"infrastructure_concrete.png",
+			"infrastructure_delineator_wrapper_right.png",
+			"infrastructure_delineator_wrapper_left.png",
+			"[combine:32x32:0,12=infrastructure_delineator_retroreflector_yellow.png:0,-20=infrastructure_delineator_retroreflector_yellow.png",
+			"[combine:32x32:0,12=infrastructure_delineator_retroreflector_red.png:0,-20=infrastructure_delineator_retroreflector_red.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 3},
+		light_source = DELINEATOR_LIGHT_RANGE,
+		sunlight_propagates = true,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -3/8, -1/32, 1/8, 1/8, 1/32},
+				{1/8, -5/8, -1/16, 3/16, -1/4, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -3/8, -1/32, 1/8, 1/8, 1/32},
+				{1/8, -5/8, -1/16, 3/16, -1/4, 1/16}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:delineator_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_concrete.png",
+				"infrastructure_concrete.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_wrapper_right.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_wrapper_right.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_wrapper_left.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_wrapper_left.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_retroreflector_yellow.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_retroreflector_yellow.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_delineator_retroreflector_red.png:0,"..tostring(i * 8 - 32).."=infrastructure_delineator_retroreflector_red.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			light_source = DELINEATOR_LIGHT_RANGE,
+			sunlight_propagates = true,
+			drop = "infrastructure:delineator",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, -1/16},
+					{-1/16, -1/2 - i/4, -1/16, 1/16, 1/2 - i/4, 1/16},
+					{-1/8, -1/2 - i/4, 1/16, 1/8, 1/2 - i/4, 1/8}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, -1/16},
+					{-1/16, -1/2 - i/4, -1/16, 1/16, 1/2 - i/4, 1/16},
+					{-1/8, -1/2 - i/4, 1/16, 1/8, 1/2 - i/4, 1/8}
+				}
+			}
+		})
+
+		minetest.register_node("infrastructure:delineator_guardrail_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_concrete.png",
+				"infrastructure_concrete.png",
+				"[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_wrapper_right.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_wrapper_right.png",
+				"[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_wrapper_left.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_wrapper_left.png",
+				"[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_retroreflector_yellow.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_retroreflector_yellow.png",
+				"[combine:32x32:0,"..tostring(12 + i * 8).."=infrastructure_delineator_retroreflector_red.png:0,"..tostring(i * 8 - 20).."=infrastructure_delineator_retroreflector_red.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 3, not_in_creative_inventory = 1},
+			light_source = DELINEATOR_LIGHT_RANGE,
+			sunlight_propagates = true,
+			drop = "infrastructure:delineator_guardrail",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -3/8 - i/4, -1/32, 1/8, 1/8 - i/4, 1/32},
+					{1/8, -5/8 - i/4, -1/16, 3/16, -1/4 - i/4, 1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -3/8 - i/4, -1/32, 1/8, 1/8 - i/4, 1/32},
+					{1/8, -5/8 - i/4, -1/16, 3/16, -1/4 - i/4, 1/16}
+				}
+			}
+		})
+	end
+
+-- Wire rope safety barrier
+	minetest.register_node("infrastructure:wire_rope_safety_barrier", {
+		description = "Wire rope safety barrier",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_wire_rope_safety_barrier_back.png",
+			"infrastructure_wire_rope_safety_barrier_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = 1,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/16, 1/8, -1/4, 1/16},
+				{-1/8, -1/2, -1/16, -1/16, -3/16, 1/16},
+				{1/16, -1/2, -1/16, 1/8, 1/16, 1/16},
+				{-1/8, -1/8, -1/16, 1/8, 0, 1/16},
+				{-1/8, -1/8, -1/16, -1/16, 1/2, 1/16},
+				{-1/8, 1/8, -1/16, 1/8, 1/4, 1/16},
+				{1/16, 1/8, -1/16, 1/8, 1/2, 1/16},
+
+				{-1/32, 1/4, -1/2, 1/32, 5/16, 1/2},
+				{-1/32, 0, -1/2, 1/32, 1/16, 1/2},
+				{-1/32, -1/4, -1/2, 1/32, -3/16, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/16, 1/8, 1/2, 1/16},
+
+				{-1/32, 1/4, -1/2, 1/32, 5/16, 1/2},
+				{-1/32, 0, -1/2, 1/32, 1/16, 1/2},
+				{-1/32, -1/4, -1/2, 1/32, -3/16, 1/2}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:wire_rope_safety_barrier_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_wire_rope_safety_barrier_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_wire_rope_safety_barrier_back.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_wire_rope_safety_barrier_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_wire_rope_safety_barrier_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = 1,
+			drop = "infrastructure:wire_rope_safety_barrier",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/16, 1/8, -1/4 - i/4, 1/16},
+					{-1/8, -1/2 - i/4, -1/16, -1/16, -3/16 - i/4, 1/16},
+					{1/16, -1/2 - i/4, -1/16, 1/8, 1/16 - i/4, 1/16},
+					{-1/8, -1/8 - i/4, -1/16, 1/8, 0 - i/4, 1/16},
+					{-1/8, -1/8 - i/4, -1/16, -1/16, 1/2 - i/4, 1/16},
+					{-1/8, 1/8 - i/4, -1/16, 1/8, 1/4 - i/4, 1/16},
+					{1/16, 1/8 - i/4, -1/16, 1/8, 1/2 - i/4, 1/16},
+
+					{-1/32, 1/4 - i/4, -1/2, 1/32, 5/16 - i/4, 1/2},
+					{-1/32, 0 - i/4, -1/2, 1/32, 1/16 - i/4, 1/2},
+					{-1/32, -1/4 - i/4, -1/2, 1/32, -3/16 - i/4, 1/2}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/16, 1/8, 1/2 - i/4, 1/16},
+
+					{-1/32, 1/4 - i/4, -1/2, 1/32, 5/16 - i/4, 1/2},
+					{-1/32, 0 - i/4, -1/2, 1/32, 1/16 - i/4, 1/2},
+					{-1/32, -1/4 - i/4, -1/2, 1/32, -3/16 - i/4, 1/2}
+				}
+			}
+		})
+	end
+
+-- Cable barrier terminal
+	minetest.register_node("infrastructure:cable_barrier_terminal", {
+		description = "Cable barrier terminal",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_cable_barrier_terminal_back.png",
+			"infrastructure_cable_barrier_terminal_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = 1,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+				{-1/4, -3/8, -1/4, 1/4, 1/2, -1/8},
+				{-1/4, -3/8, -1/8, -3/16, 0, 1/8},
+				{3/16, -3/8, -1/8, 1/4, 0, 1/8},
+
+				{-1/16, 7/32, -3/8, 1/16, 11/32, 1/4},
+				{-1/16, -1/32, -3/8, 1/16, 3/32, 1/4},
+				{-1/16, -9/32, -3/8, 1/16, -5/32, 1/4},
+
+				{-1/32, 1/4, 0, 1/32, 5/16, 1/2},
+				{-1/32, 0, 0, 1/32, 1/16, 1/2},
+				{-1/32, -1/4, 0, 1/32, -3/16, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, -1/2, 1/4, -3/8, 1/2},
+				{-1/4, -3/8, -1/4, 1/4, 1/2, -1/8},
+				{-1/4, -3/8, -1/8, -3/16, 0, 1/8},
+				{3/16, -3/8, -1/8, 1/4, 0, 1/8},
+
+				{-1/16, 7/32, -3/8, 1/16, 11/32, 1/4},
+				{-1/16, -1/32, -3/8, 1/16, 3/32, 1/4},
+				{-1/16, -9/32, -3/8, 1/16, -5/32, 1/4},
+
+				{-1/32, 1/4, 0, 1/32, 5/16, 1/2},
+				{-1/32, 0, 0, 1/32, 1/16, 1/2},
+				{-1/32, -1/4, 0, 1/32, -3/16, 1/2}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:cable_barrier_terminal_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_cable_barrier_terminal_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_cable_barrier_terminal_back.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_cable_barrier_terminal_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_cable_barrier_terminal_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = 1,
+			drop = "infrastructure:cable_barrier_terminal",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/4, -1/2 - i/4, -1/2, 1/4, -3/8 - i/4, 1/2},
+					{-1/4, -3/8 - i/4, -1/4, 1/4, 1/2 - i/4, -1/8},
+					{-1/4, -3/8 - i/4, -1/8, -3/16, 0 - i/4, 1/8},
+					{3/16, -3/8 - i/4, -1/8, 1/4, 0 - i/4, 1/8},
+
+					{-1/16, 7/32 - i/4, -3/8, 1/16, 11/32 - i/4, 1/4},
+					{-1/16, -1/32 - i/4, -3/8, 1/16, 3/32 - i/4, 1/4},
+					{-1/16, -9/32 - i/4, -3/8, 1/16, -5/32 - i/4, 1/4},
+
+					{-1/32, 1/4 - i/4, 0, 1/32, 5/16 - i/4, 1/2},
+					{-1/32, 0 - i/4, 0, 1/32, 1/16 - i/4, 1/2},
+					{-1/32, -1/4 - i/4, 0, 1/32, -3/16 - i/4, 1/2}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/4, -1/2 - i/4, -1/2, 1/4, -3/8 - i/4, 1/2},
+					{-1/4, -3/8 - i/4, -1/4, 1/4, 1/2 - i/4, -1/8},
+					{-1/4, -3/8 - i/4, -1/8, -3/16, 0 - i/4, 1/8},
+					{3/16, -3/8 - i/4, -1/8, 1/4, 0 - i/4, 1/8},
+
+					{-1/16, 7/32 - i/4, -3/8, 1/16, 11/32 - i/4, 1/4},
+					{-1/16, -1/32 - i/4, -3/8, 1/16, 3/32 - i/4, 1/4},
+					{-1/16, -9/32 - i/4, -3/8, 1/16, -5/32 - i/4, 1/4},
+
+					{-1/32, 1/4 - i/4, 0, 1/32, 5/16 - i/4, 1/2},
+					{-1/32, 0 - i/4, 0, 1/32, 1/16 - i/4, 1/2},
+					{-1/32, -1/4 - i/4, 0, 1/32, -3/16 - i/4, 1/2}
+				}
+			}
+		})
+	end
+
+-- Corrugated guide rail
+	minetest.register_node("infrastructure:corrugated_guide_rail", {
+		description = "Corrugated guide rail",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_corrugated_guide_rail_side.png",
+			"infrastructure_corrugated_guide_rail_side.png",
+			"infrastructure_corrugated_guide_rail_back.png",
+			"infrastructure_corrugated_guide_rail_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = 1,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, 1/8, 1/2, -1/16},
+				{-1/16, -1/2, -1/16, 1/16, 1/2, 1/16},
+				{-1/8, -1/2, 1/16, 1/8, 1/2, 1/8},
+
+				{-1/2, 1/4, -1/4, 1/2, 3/8, -1/8},
+				{-1/2, 1/8, -3/8, 1/2, 1/4, -1/4},
+				{-1/2, 0, -1/4, 1/2, 1/8, -1/8},
+				{-1/2, -1/8, -3/8, 1/2, 0, -1/4},
+				{-1/2, -1/4, -1/4, 1/2, -1/8, -1/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
+
+				{-1/2, 1/4, -1/4, 1/2, 3/8, -1/8},
+				{-1/2, 1/8, -3/8, 1/2, 1/4, -1/4},
+				{-1/2, 0, -1/4, 1/2, 1/8, -1/8},
+				{-1/2, -1/8, -3/8, 1/2, 0, -1/4},
+				{-1/2, -1/4, -1/4, 1/2, -1/8, -1/8}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:corrugated_guide_rail_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_back.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_corrugated_guide_rail_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_corrugated_guide_rail_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = 1,
+			drop = "infrastructure:corrugated_guide_rail",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, -1/16},
+					{-1/16, -1/2 - i/4, -1/16, 1/16, 1/2 - i/4, 1/16},
+					{-1/8, -1/2 - i/4, 1/16, 1/8, 1/2 - i/4, 1/8},
+
+					{-1/2, 1/4 - i/4, -1/4, 1/2, 3/8 - i/4, -1/8},
+					{-1/2, 1/8 - i/4, -3/8, 1/2, 1/4 - i/4, -1/4},
+					{-1/2, 0 - i/4, -1/4, 1/2, 1/8 - i/4, -1/8},
+					{-1/2, -1/8 - i/4, -3/8, 1/2, 0 - i/4, -1/4},
+					{-1/2, -1/4 - i/4, -1/4, 1/2, -1/8 - i/4, -1/8}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/8, -1/2 - i/4, -1/8, 1/8, 1/2 - i/4, 1/8},
+
+					{-1/2, 1/4 - i/4, -1/4, 1/2, 3/8 - i/4, -1/8},
+					{-1/2, 1/8 - i/4, -3/8, 1/2, 1/4 - i/4, -1/4},
+					{-1/2, 0 - i/4, -1/4, 1/2, 1/8 - i/4, -1/8},
+					{-1/2, -1/8 - i/4, -3/8, 1/2, 0 - i/4, -1/4},
+					{-1/2, -1/4 - i/4, -1/4, 1/2, -1/8 - i/4, -1/8}
+				}
+			}
+		})
+	end
+
+-- Energy absorbing terminal
+	minetest.register_node("infrastructure:energy_absorbing_terminal", {
+		description = "Energy absorbing terminal",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_energy_absorbing_terminal_back.png",
+			"infrastructure_energy_absorbing_terminal_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/4, 1/8, 0, 1/2, 1/4},
+				{-3/8, -1/4, 1/4, -1/8, 3/8, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/4, 1/8, 0, 1/2, 1/4},
+				{-3/8, -1/4, 1/4, -1/8, 3/8, 1/2}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	minetest.register_node("infrastructure:energy_absorbing_terminal_inversed", {
+		description = "Energy absorbing terminal inversed",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_energy_absorbing_terminal_back.png",
+			"infrastructure_energy_absorbing_terminal_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{0, -1/4, 1/8, 1/2, 1/2, 1/4},
+				{1/8, -1/4, 1/4, 3/8, 3/8, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{0, -1/4, 1/8, 1/2, 1/2, 1/4},
+				{1/8, -1/4, 1/4, 3/8, 3/8, 1/2}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:energy_absorbing_terminal_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_back.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+			drop = "infrastructure:energy_absorbing_terminal",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/4 - i/4, 1/8, 0, 1/2 - i/4, 1/4},
+					{-3/8, -1/4 - i/4, 1/4, -1/8, 3/8 - i/4, 1/2}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/4 - i/4, 1/8, 0, 1/2 - i/4, 1/4},
+					{-3/8, -1/4 - i/4, 1/4, -1/8, 3/8 - i/4, 1/2}
+				}
+			}
+		})
+
+		minetest.register_node("infrastructure:energy_absorbing_terminal_inversed_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_galvanized_steel.png:0,"..tostring(i * 8 - 32).."=infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_back.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_energy_absorbing_terminal_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_energy_absorbing_terminal_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+			drop = "infrastructure:energy_absorbing_terminal_inversed",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{0, -1/4 - i/4, 1/8, 1/2, 1/2 - i/4, 1/4},
+					{1/8, -1/4 - i/4, 1/4, 3/8, 3/8 - i/4, 1/2}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{0, -1/4 - i/4, 1/8, 1/2, 1/2 - i/4, 1/4},
+					{1/8, -1/4 - i/4, 1/4, 3/8, 3/8 - i/4, 1/2}
+				}
+			}
+		})
+	end
+
+-- Fitch barrel
+	minetest.register_node("infrastructure:fitch_barrel", {
+		description = "Fitch barrel",
+		tiles = {
+			"infrastructure_fitch_barrel_top.png",
+			"infrastructure_fitch_barrel_bottom.png",
+			"infrastructure_fitch_barrel_side.png",
+			"infrastructure_fitch_barrel_side.png",
+			"infrastructure_fitch_barrel_side.png",
+			"infrastructure_fitch_barrel_side.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		groups = {cracky = 2},
+		light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {-3/8, -1/2, -3/8, 3/8, 1/2, 3/8}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {-3/8, -1/2, -3/8, 3/8, 1/2, 3/8}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:fitch_barrel_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_fitch_barrel_top.png",
+				"infrastructure_fitch_barrel_bottom.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_fitch_barrel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_fitch_barrel_side.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+			drop = "infrastructure:fitch_barrel",
+			node_box = {
+				type = "fixed",
+				fixed = {-3/8, -1/2 - i/4, -3/8, 3/8, 1/2 - i/4, 3/8}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {-3/8, -1/2 - i/4, -3/8, 3/8, 1/2 - i/4, 3/8}
+			}
+		})
+	end
+
+-- Crowd control barricade
+	minetest.register_node("infrastructure:crowd_control_barricade", {
+		description = "Crowd control barricade",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_crowd_control_barricade_back.png",
+			"infrastructure_crowd_control_barricade_front.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = 1,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/4, 0, 1/2, 1/2, 0},
+
+				{-7/16, -1/2, -1/32, -3/8, 1/8, 1/32},
+				{3/8, -1/2, -1/32, 7/16, 1/8, 1/32},
+
+				{-7/16, -1/2, -1/4, -3/8, -7/16, 1/4},
+				{3/8, -1/2, -1/4, 7/16, -7/16, 1/4}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/4, 0, 1/2, 1/2, 0},
+
+				{-7/16, -1/2, -1/32, -3/8, 1/8, 1/32},
+				{3/8, -1/2, -1/32, 7/16, 1/8, 1/32},
+
+				{-7/16, -1/2, -1/4, -3/8, -7/16, 1/4},
+				{3/8, -1/2, -1/4, 7/16, -7/16, 1/4}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:crowd_control_barricade_"..tostring(i), {
+			tiles = {
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"infrastructure_galvanized_steel.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_crowd_control_barricade_back.png:0,"..tostring(i * 8 - 32).."=infrastructure_crowd_control_barricade_back.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_crowd_control_barricade_front.png:0,"..tostring(i * 8 - 32).."=infrastructure_crowd_control_barricade_front.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = 1,
+			drop = "infrastructure:crowd_control_barricade",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/4 - i/4, 0, 1/2, 1/2 - i/4, 0},
+
+					{-7/16, -1/2 - i/4, -1/32, -3/8, 1/8 - i/4, 1/32},
+					{3/8, -1/2 - i/4, -1/32, 7/16, 1/8 - i/4, 1/32},
+
+					{-7/16, -1/2 - i/4, -1/4, -3/8, -7/16 - i/4, 1/4},
+					{3/8, -1/2 - i/4, -1/4, 7/16, -7/16 - i/4, 1/4}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/2, -1/4 - i/4, 0, 1/2, 1/2 - i/4, 0},
+
+					{-7/16, -1/2 - i/4, -1/32, -3/8, 1/8 - i/4, 1/32},
+					{3/8, -1/2 - i/4, -1/32, 7/16, 1/8 - i/4, 1/32},
+
+					{-7/16, -1/2 - i/4, -1/4, -3/8, -7/16 - i/4, 1/4},
+					{3/8, -1/2 - i/4, -1/4, 7/16, -7/16 - i/4, 1/4}
+				}
+			}
+		})
+	end
+
+-- Anti-dazzling panel
+	minetest.register_node("infrastructure:anti_dazzling_panel", {
+		description = "Anti-dazzling panel",
+		tiles = {
+			"infrastructure_anti_dazzling_panel_top_bottom.png",
+			"infrastructure_anti_dazzling_panel_top_bottom.png",
+			"infrastructure_anti_dazzling_panel_side.png",
+			"infrastructure_anti_dazzling_panel_side.png",
+			"infrastructure_anti_dazzling_panel_side.png",
+			"infrastructure_anti_dazzling_panel_side.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = 1,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, 0, 1/4, 1/2, 0},
+				{-1/8, -1/2, -1/16, 1/8, -3/8, 1/16}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, 0, 1/4, 1/2, 0},
+				{-1/8, -1/2, -1/16, 1/8, -3/8, 1/16}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:anti_dazzling_panel_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_anti_dazzling_panel_top_bottom.png",
+				"infrastructure_anti_dazzling_panel_top_bottom.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_anti_dazzling_panel_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_anti_dazzling_panel_side.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			paramtype2 = "facedir",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			light_source = 1,
+			drop = "infrastructure:anti_dazzling_panel",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/4, -1/2 - i/4, 0, 1/4, 1/2 - i/4, 0},
+					{-1/8, -1/2 - i/4, -1/16, 1/8, -3/8 - i/4, 1/16}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/4, -1/2 - i/4, 0, 1/4, 1/2 - i/4, 0},
+					{-1/8, -1/2 - i/4, -1/16, 1/8, -3/8 - i/4, 1/16}
+				}
+			}
+		})
+	end
+
+-- Traffic cone
+	minetest.register_node("infrastructure:traffic_cone", {
+		description = "Traffic cone",
+		tiles = {
+			"infrastructure_traffic_cone_top.png",
+			"infrastructure_traffic_cone_bottom.png",
+			"infrastructure_traffic_cone_side.png",
+			"infrastructure_traffic_cone_side.png",
+			"infrastructure_traffic_cone_side.png",
+			"infrastructure_traffic_cone_side.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		groups = {cracky = 2},
+		walkable = false,
+		light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, 0, 1/4, 1/4, 0},
+				{0, -1/2, -1/4, 0, 1/4, 1/4},
+
+				{-3/8, -1/2, -1/8, 3/8, -3/8, 1/8},
+				{-1/8, -1/2, -3/8, 1/8, -3/8, 3/8},
+
+				{-3/8, -1/2 + 0.001, -3/8, 3/8, -1/2 + 0.001, 3/8}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/4, -1/2, 0, 1/4, 1/4, 0},
+				{0, -1/2, -1/4, 0, 1/4, 1/4},
+
+				{-3/8, -1/2, -1/8, 3/8, -3/8, 1/8},
+				{-1/8, -1/2, -3/8, 1/8, -3/8, 3/8},
+
+				{-3/8, -1/2 + 0.001, -3/8, 3/8, -1/2 + 0.001, 3/8}
+			}
+		},
+
+		after_place_node = function(pos, placer)
+			displacement(pos, placer)
+		end
+	})
+
+	for i = 1, 3 do
+		minetest.register_node("infrastructure:traffic_cone_displacement_"..tostring(i), {
+			tiles = {
+				"infrastructure_traffic_cone_top.png",
+				"infrastructure_traffic_cone_bottom.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png",
+				"[combine:32x32:0,"..tostring(i * 8).."=infrastructure_traffic_cone_side.png:0,"..tostring(i * 8 - 32).."=infrastructure_traffic_cone_side.png"
+			},
+			drawtype = "nodebox",
+			paramtype = "light",
+			groups = {cracky = 2, not_in_creative_inventory = 1},
+			walkable = false,
+			light_source = ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE,
+			drop = "infrastructure:traffic_cone",
+			node_box = {
+				type = "fixed",
+				fixed = {
+					{-1/4, -1/2 - i/4, 0, 1/4, 1/4 - i/4, 0},
+					{0, -1/2 - i/4, -1/4, 0, 1/4 - i/4, 1/4},
+
+					{-3/8, -1/2 - i/4, -1/8, 3/8, -3/8 - i/4, 1/8},
+					{-1/8, -1/2 - i/4, -3/8, 1/8, -3/8 - i/4, 3/8},
+
+					{-3/8, -1/2 + 0.001 - i/4, -3/8, 3/8, -1/2 + 0.001 - i/4, 3/8}
+				}
+			},
+			selection_box = {
+				type = "fixed",
+				fixed = {
+					{-1/4, -1/2 - i/4, 0, 1/4, 1/4 - i/4, 0},
+					{0, -1/2 - i/4, -1/4, 0, 1/4 - i/4, 1/4},
+
+					{-3/8, -1/2 - i/4, -1/8, 3/8, -3/8 - i/4, 1/8},
+					{-1/8, -1/2 - i/4, -3/8, 1/8, -3/8 - i/4, 3/8},
+
+					{-3/8, -1/2 + 0.001 - i/4, -3/8, 3/8, -1/2 + 0.001 - i/4, 3/8}
+				}
+			}
+		})
+	end
+
+-- Noise barrier
+	minetest.register_node("infrastructure:noise_barrier", {
+		description = "Noise barrier",
+		tiles = {
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_galvanized_steel.png",
+			"infrastructure_noise_barrier.png",
+			"infrastructure_noise_barrier.png"
+		},
+		drawtype = "nodebox",
+		paramtype = "light",
+		paramtype2 = "facedir",
+		groups = {cracky = 2},
+		light_source = 1,
+		node_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, 5/16, 1/2, 1/2, 7/16},
+
+				{-1/2, -1/2, 1/4, 1/2, -7/16, 1/2},
+				{-1/2, 7/16, 1/4, 1/2, 1/2, 1/2},
+				{-1/2, -1/2, 1/4, -7/16, 1/2, 1/2},
+				{7/16, -1/2, 1/4, 1/2, 1/2, 1/2}
+			}
+		},
+		selection_box = {
+			type = "fixed",
+			fixed = {
+				{-1/2, -1/2, 1/4, 1/2, 1/2, 1/2},
+			}
+		}
+	})
diff --git a/infrastructure/nodes_extension.lua b/infrastructure/nodes_extension.lua
new file mode 100644
index 0000000..8eebdba
--- /dev/null
+++ b/infrastructure/nodes_extension.lua
@@ -0,0 +1,162 @@
+-- **************************************************************************************************** MATERIALS
+
+-- Galvanized steel stair, slab, panel and microblock
+	register_stair_slab_panel_micro("infrastructure", "galvanized_steel", "infrastructure:galvanized_steel",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=2},
+			{"infrastructure_galvanized_steel.png"},
+			"Galvanized steel",
+			"galvanized_steel",
+			0)
+
+-- **************************************************************************************************** CENTER LINES
+
+-- Asphalt stair, slab, panel and microblock with center solid line
+	register_stair_slab_panel_micro("infrastructure", "asphalt_center_solid_line", "infrastructure:asphalt_center_solid_line",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{
+				"streets_asphalt.png^infrastructure_single_yellow_line.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png"
+			},
+			"Asphalt with center solid line",
+			"asphalt_center_solid_line",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with center solid line on one side
+	register_stair_slab_panel_micro("infrastructure", "asphalt_center_solid_one_side", "infrastructure:asphalt_center_solid_one_side",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{
+				"streets_asphalt.png^infrastructure_solid_yellow_line_one_side.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png"
+			},
+			"Asphalt with center solid line on one side",
+			"asphalt_center_solid_one_side",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with center solid double line
+	register_stair_slab_panel_micro("infrastructure", "asphalt_center_solid_double", "infrastructure:asphalt_center_solid_double",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{
+				"streets_asphalt.png^infrastructure_double_yellow_line.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png"
+			},
+			"Asphalt with center solid double line",
+			"asphalt_center_solid_double",
+			0)
+
+-- Asphalt block with center corner single line
+	register_stair_slab_panel_micro("infrastructure", "asphalt_center_corner_single", "infrastructure:asphalt_center_corner_single",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{
+				"streets_asphalt.png^infrastructure_single_yellow_line_corner.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png"
+			},
+			"Asphalt with center corner single line",
+			"asphalt_center_corner_single",
+			0)
+
+-- Asphalt block with center corner double line
+	register_stair_slab_panel_micro("infrastructure", "asphalt_center_corner_double", "infrastructure:asphalt_center_corner_double",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{
+				"streets_asphalt.png^infrastructure_solid_double_yellow_line_corner.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png",
+				"streets_asphalt.png"
+			},
+			"Asphalt with center corner double line",
+			"asphalt_center_corner_double",
+			0)
+
+-- **************************************************************************************************** TRAFFIC MARKS
+
+-- Asphalt stair, slab, panel and microblock with arrow straight
+	register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_straight", "infrastructure:asphalt_arrow_straight",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{"streets_arrow_straight.png", "infrastructure_asphalt.png"},
+			"Asphalt with arrow straight",
+			"asphalt_arrow_straight",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with arrow straight + left
+	register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_straight_left", "infrastructure:asphalt_arrow_straight_left",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{"streets_asphalt.png^streets_arrow_straight_left.png", "infrastructure_asphalt.png"},
+			"Asphalt with arrow straight + left",
+			"asphalt_arrow_straight_left",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with arrow straight + right
+	register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_straight_right", "infrastructure:asphalt_arrow_straight_right",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{"streets_asphalt.png^streets_arrow_straight_right.png", "infrastructure_asphalt.png"},
+			"Asphalt with arrow straight + right",
+			"asphalt_arrow_straight_right",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with arrow left
+	register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_left", "infrastructure:asphalt_arrow_left",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{"streets_asphalt.png^streets_arrow_left.png", "infrastructure_asphalt.png"},
+			"Asphalt with arrow left",
+			"asphalt_arrow_left",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with arrow right
+	register_stair_slab_panel_micro("infrastructure", "asphalt_arrow_right", "infrastructure:asphalt_arrow_right",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{"streets_asphalt.png^streets_arrow_right.png", "infrastructure_asphalt.png"},
+			"Asphalt with arrow right",
+			"asphalt_arrow_right",
+			0)
+
+-- Asphalt stair, slab, panel and microblock with "P"-sign
+	register_stair_slab_panel_micro("infrastructure", "asphalt_parking", "infrastructure:asphalt_parking",
+			{not_in_creative_inventory=NOT_IN_CREATIVE_INVENTORY, cracky=1},
+			{"streets_asphalt.png^streets_parking.png", "infrastructure_asphalt.png"},
+			"Asphalt with a parking sign",
+			"asphalt_parking",
+			0)
+
+-- Register known infrastructure nodes in circular saw if avaiable
+	if circular_saw then
+		for i,v in ipairs({
+-- Materials
+			"asphalt",
+			"concrete",
+			"galvanized_steel",
+-- Center lines
+			"asphalt_center_dashed",
+			"asphalt_center_solid",
+			"asphalt_center_solid_one_side",
+			"asphalt_center_solid_double",
+			"asphalt_center_corner_single",
+			"asphalt_center_corner_double",
+-- Traffic marks
+			"asphalt_arrow_straight",
+			"asphalt_arrow_straight_left",
+			"asphalt_arrow_straight_right",
+			"asphalt_arrow_left",
+			"asphalt_arrow_right",
+			"asphalt_parking"
+		}) do
+			table.insert(circular_saw.known_stairs, "infrastructure:"..v);
+		end
+	end
diff --git a/infrastructure/settings.lua b/infrastructure/settings.lua
new file mode 100644
index 0000000..1433e22
--- /dev/null
+++ b/infrastructure/settings.lua
@@ -0,0 +1,49 @@
+-- This file stores all settings for the "Infrastructure mod"
+
+-- Stairs, slabs, panels and microblocks
+	NOT_IN_CREATIVE_INVENTORY = 1			-- an integer 0 or 1	-> default = 1		| Do you want it to be hide in your creative inventory?
+
+-- Raised pavement marker
+	MARKER_LIGHT_RANGE = 4				-- an integer		-> default = 4		| How much light do you want it to give?
+
+-- Retroreflective delineator
+	DELINEATOR_LIGHT_RANGE = 8			-- an integer		-> default = 8		| How much light do you want it to give?
+
+-- Energy absorbing terminal
+	ENERGY_ABSORBING_TERMINAL_LIGHT_RANGE = 8	-- an integer		-> default = 8		| How much light do you want it to give?
+
+-- Emergency phone
+	ENABLE_EMERGENCY_PHONE = true			-- true or false	-> default = true	| Do you want it to be enabled in your game?
+	HEALTH_TO_TRIGGER = 5				-- an integer		-> default = 5		| When will the player be healed? How low must his health be?
+	HEALTH_TO_RESTORING = 10			-- an integer		-> default = 10		| To what will the health be set?
+	EMERGENCY_PHONE_LIGHT_RANGE = 12		-- an integer		-> default = 12		| How much light do you want it to give?
+	EMERGENCY_PHONE_VOLUME = 0.1			-- a float		-> default = 0.1	| How noisy should be the dialing sound?
+
+-- Traffic lights
+	TRAFFIC_LIGHTS_LIGHT_RANGE = 12			-- an integer		-> default = 12		| How much light do you want it to give?
+	TRAFFIC_LIGHTS_VOLUME = 0			-- a float		-> default = 0.1	| How noisy should be the beep sound?
+
+-- Automatic warning device
+	AUTOMATIC_WARNING_DEVICE_LIGHT_RANGE = 12	-- an integer		-> default = 12		| How much light do you want it to give?
+	AUTOMATIC_WARNING_DEVICE_VOLUME = 0.5		-- a float		-> default = 0.5	| How noisy should be the bell sound?
+
+-- Boom barrier
+	BOOM_BARRIER_LIGHT_RANGE = 6			-- an integer		-> default = 6		| How much light do you want it to give?
+	BOOM_BARRIER_VOLUME = 0.4			-- a float		-> default = 0.1	| How noisy should be the mechanism sound?
+
+-- Curve chevron
+	CURVE_CHEVRON_LIGHT_RANGE = 12			-- an integer		-> default = 12		| How much light do you want it to give?
+
+-- Crosswalk lighting
+	CROSSWALK_LIGHTING_LIGHT_RANGE = 15		-- an integer		-> default = 15		| How much light do you want it to give?
+
+-- Crosswalk safety sign
+	CROSSWALK_SAFETY_SIGN_LIGHT_RANGE = 8		-- an integer		-> default = 8		| How much light do you want it to give?
+
+-- Crosswalk safety sign
+	RETROREFLECTIVE_SURFACE_LIGHT_RANGE = 8		-- an integer		-> default = 8		| How much light do you want it to give?
+
+-- Aircraft warning light
+	AIRCRAFT_WARNING_LIGHT_LIGHT_RANGE = 15		-- an integer		-> default = 15		| How much light do you want it to give?
+-- Warning light
+	WARNING_LIGHT_LIGHT_RANGE = 15			-- an integer		-> default = 15		| How much light do you want it to give?
diff --git a/infrastructure/sounds/infrastructure_automatic_warning_device.ogg b/infrastructure/sounds/infrastructure_automatic_warning_device.ogg
new file mode 100644
index 0000000..71d1679
Binary files /dev/null and b/infrastructure/sounds/infrastructure_automatic_warning_device.ogg differ
diff --git a/infrastructure/sounds/infrastructure_boom_barrier.ogg b/infrastructure/sounds/infrastructure_boom_barrier.ogg
new file mode 100644
index 0000000..4106df2
Binary files /dev/null and b/infrastructure/sounds/infrastructure_boom_barrier.ogg differ
diff --git a/infrastructure/sounds/infrastructure_ebell.ogg b/infrastructure/sounds/infrastructure_ebell.ogg
new file mode 100644
index 0000000..d59d1b9
Binary files /dev/null and b/infrastructure/sounds/infrastructure_ebell.ogg differ
diff --git a/infrastructure/sounds/infrastructure_emergency_phone.ogg b/infrastructure/sounds/infrastructure_emergency_phone.ogg
new file mode 100644
index 0000000..7e84eb2
Binary files /dev/null and b/infrastructure/sounds/infrastructure_emergency_phone.ogg differ
diff --git a/infrastructure/sounds/infrastructure_traffic_lights_1.ogg b/infrastructure/sounds/infrastructure_traffic_lights_1.ogg
new file mode 100644
index 0000000..d790e9a
Binary files /dev/null and b/infrastructure/sounds/infrastructure_traffic_lights_1.ogg differ
diff --git a/infrastructure/sounds/infrastructure_traffic_lights_2.ogg b/infrastructure/sounds/infrastructure_traffic_lights_2.ogg
new file mode 100644
index 0000000..8fa7753
Binary files /dev/null and b/infrastructure/sounds/infrastructure_traffic_lights_2.ogg differ
diff --git a/infrastructure/textures/infrastructure_aircraft_warning_light_side_bright.png b/infrastructure/textures/infrastructure_aircraft_warning_light_side_bright.png
new file mode 100644
index 0000000..3105665
Binary files /dev/null and b/infrastructure/textures/infrastructure_aircraft_warning_light_side_bright.png differ
diff --git a/infrastructure/textures/infrastructure_aircraft_warning_light_side_dark.png b/infrastructure/textures/infrastructure_aircraft_warning_light_side_dark.png
new file mode 100644
index 0000000..a696f31
Binary files /dev/null and b/infrastructure/textures/infrastructure_aircraft_warning_light_side_dark.png differ
diff --git a/infrastructure/textures/infrastructure_aircraft_warning_light_top_bright.png b/infrastructure/textures/infrastructure_aircraft_warning_light_top_bright.png
new file mode 100644
index 0000000..a71f59b
Binary files /dev/null and b/infrastructure/textures/infrastructure_aircraft_warning_light_top_bright.png differ
diff --git a/infrastructure/textures/infrastructure_aircraft_warning_light_top_dark.png b/infrastructure/textures/infrastructure_aircraft_warning_light_top_dark.png
new file mode 100644
index 0000000..b3d91a6
Binary files /dev/null and b/infrastructure/textures/infrastructure_aircraft_warning_light_top_dark.png differ
diff --git a/infrastructure/textures/infrastructure_anti_dazzling_panel_side.png b/infrastructure/textures/infrastructure_anti_dazzling_panel_side.png
new file mode 100644
index 0000000..5965006
Binary files /dev/null and b/infrastructure/textures/infrastructure_anti_dazzling_panel_side.png differ
diff --git a/infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png b/infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png
new file mode 100644
index 0000000..0f257bd
Binary files /dev/null and b/infrastructure/textures/infrastructure_anti_dazzling_panel_top_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_asphalt.png b/infrastructure/textures/infrastructure_asphalt.png
new file mode 100644
index 0000000..2906a0d
Binary files /dev/null and b/infrastructure/textures/infrastructure_asphalt.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device.png b/infrastructure/textures/infrastructure_automatic_warning_device.png
new file mode 100644
index 0000000..d5f6c62
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_bottom.png b/infrastructure/textures/infrastructure_automatic_warning_device_bottom.png
new file mode 100644
index 0000000..87ddf0c
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle.png
new file mode 100644
index 0000000..5185a29
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_1.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_1.png
new file mode 100644
index 0000000..ac85b26
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_1.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_2.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_2.png
new file mode 100644
index 0000000..9e38834
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_2.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_3.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_3.png
new file mode 100644
index 0000000..f741647
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_3.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png
new file mode 100644
index 0000000..7c50472
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_center_side.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_1.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_1.png
new file mode 100644
index 0000000..3acc761
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_1.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_2.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_2.png
new file mode 100644
index 0000000..dbb2428
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_2.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png
new file mode 100644
index 0000000..8d73676
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_left_side.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_1.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_1.png
new file mode 100644
index 0000000..d3e378a
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_1.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_2.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_2.png
new file mode 100644
index 0000000..d1b150e
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_2.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png
new file mode 100644
index 0000000..cb6a9bc
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_right_side.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png
new file mode 100644
index 0000000..469addf
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_middle_side.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_top.png b/infrastructure/textures/infrastructure_automatic_warning_device_top.png
new file mode 100644
index 0000000..a9fb96f
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_top.png differ
diff --git a/infrastructure/textures/infrastructure_automatic_warning_device_top_side.png b/infrastructure/textures/infrastructure_automatic_warning_device_top_side.png
new file mode 100644
index 0000000..49412ec
Binary files /dev/null and b/infrastructure/textures/infrastructure_automatic_warning_device_top_side.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png
new file mode 100644
index 0000000..e283612
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_arm_h_bottom_front_back.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png
new file mode 100644
index 0000000..0e6e50c
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_bright.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_dark.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_dark.png
new file mode 100644
index 0000000..e88de7d
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_arm_h_left_right_dark.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png b/infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png
new file mode 100644
index 0000000..5f997a4
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_arm_h_top.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png b/infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png
new file mode 100644
index 0000000..87b3bbb
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_arm_v_left.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png b/infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png
new file mode 100644
index 0000000..c777597
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_arm_v_right.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_bottom.png b/infrastructure/textures/infrastructure_boom_barrier_h_bottom.png
new file mode 100644
index 0000000..c7fbfea
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_h_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_front_back.png b/infrastructure/textures/infrastructure_boom_barrier_h_front_back.png
new file mode 100644
index 0000000..5d019fc
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_h_front_back.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_left.png b/infrastructure/textures/infrastructure_boom_barrier_h_left.png
new file mode 100644
index 0000000..08348fb
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_h_left.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_right.png b/infrastructure/textures/infrastructure_boom_barrier_h_right.png
new file mode 100644
index 0000000..5399be8
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_h_right.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_h_top.png b/infrastructure/textures/infrastructure_boom_barrier_h_top.png
new file mode 100644
index 0000000..7796232
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_h_top.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_bottom.png b/infrastructure/textures/infrastructure_boom_barrier_v_bottom.png
new file mode 100644
index 0000000..9ae9ed3
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_v_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_front_back.png b/infrastructure/textures/infrastructure_boom_barrier_v_front_back.png
new file mode 100644
index 0000000..d7b7a3b
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_v_front_back.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_left.png b/infrastructure/textures/infrastructure_boom_barrier_v_left.png
new file mode 100644
index 0000000..4ddd606
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_v_left.png differ
diff --git a/infrastructure/textures/infrastructure_boom_barrier_v_right.png b/infrastructure/textures/infrastructure_boom_barrier_v_right.png
new file mode 100644
index 0000000..91c5600
Binary files /dev/null and b/infrastructure/textures/infrastructure_boom_barrier_v_right.png differ
diff --git a/infrastructure/textures/infrastructure_cable_barrier_terminal_back.png b/infrastructure/textures/infrastructure_cable_barrier_terminal_back.png
new file mode 100644
index 0000000..5f90cf2
Binary files /dev/null and b/infrastructure/textures/infrastructure_cable_barrier_terminal_back.png differ
diff --git a/infrastructure/textures/infrastructure_cable_barrier_terminal_front.png b/infrastructure/textures/infrastructure_cable_barrier_terminal_front.png
new file mode 100644
index 0000000..607f6d9
Binary files /dev/null and b/infrastructure/textures/infrastructure_cable_barrier_terminal_front.png differ
diff --git a/infrastructure/textures/infrastructure_concrete.png b/infrastructure/textures/infrastructure_concrete.png
new file mode 100644
index 0000000..3be0c52
Binary files /dev/null and b/infrastructure/textures/infrastructure_concrete.png differ
diff --git a/infrastructure/textures/infrastructure_corrugated_guide_rail_back.png b/infrastructure/textures/infrastructure_corrugated_guide_rail_back.png
new file mode 100644
index 0000000..d7aaf99
Binary files /dev/null and b/infrastructure/textures/infrastructure_corrugated_guide_rail_back.png differ
diff --git a/infrastructure/textures/infrastructure_corrugated_guide_rail_front.png b/infrastructure/textures/infrastructure_corrugated_guide_rail_front.png
new file mode 100644
index 0000000..c3a7b37
Binary files /dev/null and b/infrastructure/textures/infrastructure_corrugated_guide_rail_front.png differ
diff --git a/infrastructure/textures/infrastructure_corrugated_guide_rail_side.png b/infrastructure/textures/infrastructure_corrugated_guide_rail_side.png
new file mode 100644
index 0000000..739e6de
Binary files /dev/null and b/infrastructure/textures/infrastructure_corrugated_guide_rail_side.png differ
diff --git a/infrastructure/textures/infrastructure_corrugated_sheet.png b/infrastructure/textures/infrastructure_corrugated_sheet.png
new file mode 100644
index 0000000..9b6bef4
Binary files /dev/null and b/infrastructure/textures/infrastructure_corrugated_sheet.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_lighting_back.png b/infrastructure/textures/infrastructure_crosswalk_lighting_back.png
new file mode 100644
index 0000000..fd73443
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_lighting_back.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png b/infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png
new file mode 100644
index 0000000..f6f5db9
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_lighting_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_lighting_front.png b/infrastructure/textures/infrastructure_crosswalk_lighting_front.png
new file mode 100644
index 0000000..bf6bf01
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_lighting_front.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign.png
new file mode 100644
index 0000000..b20ca91
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_safety_sign.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png
new file mode 100644
index 0000000..2ff6832
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_front_back.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png
new file mode 100644
index 0000000..9e7c58c
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_safety_sign_bottom_side.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png
new file mode 100644
index 0000000..6ba1c7b
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png
new file mode 100644
index 0000000..f115876
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_front_back.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png
new file mode 100644
index 0000000..9db3518
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_safety_sign_top_side.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_back.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_back.png
new file mode 100644
index 0000000..51d024b
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_warning_light_back.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png
new file mode 100644
index 0000000..3525a3c
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_bright.png differ
diff --git a/infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png
new file mode 100644
index 0000000..357bda3
Binary files /dev/null and b/infrastructure/textures/infrastructure_crosswalk_warning_light_front_dark.png differ
diff --git a/infrastructure/textures/infrastructure_crowd_control_barricade_back.png b/infrastructure/textures/infrastructure_crowd_control_barricade_back.png
new file mode 100644
index 0000000..0f5c6ea
Binary files /dev/null and b/infrastructure/textures/infrastructure_crowd_control_barricade_back.png differ
diff --git a/infrastructure/textures/infrastructure_crowd_control_barricade_front.png b/infrastructure/textures/infrastructure_crowd_control_barricade_front.png
new file mode 100644
index 0000000..a16c363
Binary files /dev/null and b/infrastructure/textures/infrastructure_crowd_control_barricade_front.png differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_left_bright.png b/infrastructure/textures/infrastructure_curve_chevron_left_bright.png
new file mode 100644
index 0000000..199751f
Binary files /dev/null and b/infrastructure/textures/infrastructure_curve_chevron_left_bright.png differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_left_dark.png b/infrastructure/textures/infrastructure_curve_chevron_left_dark.png
new file mode 100644
index 0000000..f7d68f5
Binary files /dev/null and b/infrastructure/textures/infrastructure_curve_chevron_left_dark.png differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_right_bright.png b/infrastructure/textures/infrastructure_curve_chevron_right_bright.png
new file mode 100644
index 0000000..d1bae78
Binary files /dev/null and b/infrastructure/textures/infrastructure_curve_chevron_right_bright.png differ
diff --git a/infrastructure/textures/infrastructure_curve_chevron_right_dark.png b/infrastructure/textures/infrastructure_curve_chevron_right_dark.png
new file mode 100644
index 0000000..b8f442f
Binary files /dev/null and b/infrastructure/textures/infrastructure_curve_chevron_right_dark.png differ
diff --git a/infrastructure/textures/infrastructure_delineator_retroreflector_red.png b/infrastructure/textures/infrastructure_delineator_retroreflector_red.png
new file mode 100644
index 0000000..b2d4336
Binary files /dev/null and b/infrastructure/textures/infrastructure_delineator_retroreflector_red.png differ
diff --git a/infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png b/infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png
new file mode 100644
index 0000000..b6fe651
Binary files /dev/null and b/infrastructure/textures/infrastructure_delineator_retroreflector_yellow.png differ
diff --git a/infrastructure/textures/infrastructure_delineator_wrapper_left.png b/infrastructure/textures/infrastructure_delineator_wrapper_left.png
new file mode 100644
index 0000000..a4d0edd
Binary files /dev/null and b/infrastructure/textures/infrastructure_delineator_wrapper_left.png differ
diff --git a/infrastructure/textures/infrastructure_delineator_wrapper_right.png b/infrastructure/textures/infrastructure_delineator_wrapper_right.png
new file mode 100644
index 0000000..2743183
Binary files /dev/null and b/infrastructure/textures/infrastructure_delineator_wrapper_right.png differ
diff --git a/infrastructure/textures/infrastructure_double_yellow_line.png b/infrastructure/textures/infrastructure_double_yellow_line.png
new file mode 100644
index 0000000..3f21c45
Binary files /dev/null and b/infrastructure/textures/infrastructure_double_yellow_line.png differ
diff --git a/infrastructure/textures/infrastructure_drainage_channel_grating.png b/infrastructure/textures/infrastructure_drainage_channel_grating.png
new file mode 100644
index 0000000..dc720cd
Binary files /dev/null and b/infrastructure/textures/infrastructure_drainage_channel_grating.png differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_bottom.png b/infrastructure/textures/infrastructure_emergency_phone_bottom.png
new file mode 100644
index 0000000..8106816
Binary files /dev/null and b/infrastructure/textures/infrastructure_emergency_phone_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_front.png b/infrastructure/textures/infrastructure_emergency_phone_front.png
new file mode 100644
index 0000000..1153717
Binary files /dev/null and b/infrastructure/textures/infrastructure_emergency_phone_front.png differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_side.png b/infrastructure/textures/infrastructure_emergency_phone_side.png
new file mode 100644
index 0000000..930437c
Binary files /dev/null and b/infrastructure/textures/infrastructure_emergency_phone_side.png differ
diff --git a/infrastructure/textures/infrastructure_emergency_phone_top.png b/infrastructure/textures/infrastructure_emergency_phone_top.png
new file mode 100644
index 0000000..2ff4038
Binary files /dev/null and b/infrastructure/textures/infrastructure_emergency_phone_top.png differ
diff --git a/infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png b/infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png
new file mode 100644
index 0000000..6264bd5
Binary files /dev/null and b/infrastructure/textures/infrastructure_energy_absorbing_terminal_back.png differ
diff --git a/infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png b/infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png
new file mode 100644
index 0000000..cd20a40
Binary files /dev/null and b/infrastructure/textures/infrastructure_energy_absorbing_terminal_front.png differ
diff --git a/infrastructure/textures/infrastructure_fitch_barrel_bottom.png b/infrastructure/textures/infrastructure_fitch_barrel_bottom.png
new file mode 100644
index 0000000..7664b97
Binary files /dev/null and b/infrastructure/textures/infrastructure_fitch_barrel_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_fitch_barrel_side.png b/infrastructure/textures/infrastructure_fitch_barrel_side.png
new file mode 100644
index 0000000..7471830
Binary files /dev/null and b/infrastructure/textures/infrastructure_fitch_barrel_side.png differ
diff --git a/infrastructure/textures/infrastructure_fitch_barrel_top.png b/infrastructure/textures/infrastructure_fitch_barrel_top.png
new file mode 100644
index 0000000..223e119
Binary files /dev/null and b/infrastructure/textures/infrastructure_fitch_barrel_top.png differ
diff --git a/infrastructure/textures/infrastructure_galvanized_steel.png b/infrastructure/textures/infrastructure_galvanized_steel.png
new file mode 100644
index 0000000..841e68b
Binary files /dev/null and b/infrastructure/textures/infrastructure_galvanized_steel.png differ
diff --git a/infrastructure/textures/infrastructure_grid_paver_bottom.png b/infrastructure/textures/infrastructure_grid_paver_bottom.png
new file mode 100644
index 0000000..de051cf
Binary files /dev/null and b/infrastructure/textures/infrastructure_grid_paver_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_grid_paver_grass.png b/infrastructure/textures/infrastructure_grid_paver_grass.png
new file mode 100644
index 0000000..87bae79
Binary files /dev/null and b/infrastructure/textures/infrastructure_grid_paver_grass.png differ
diff --git a/infrastructure/textures/infrastructure_grid_paver_top.png b/infrastructure/textures/infrastructure_grid_paver_top.png
new file mode 100644
index 0000000..ea079c3
Binary files /dev/null and b/infrastructure/textures/infrastructure_grid_paver_top.png differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_1.png b/infrastructure/textures/infrastructure_lane_control_lights_1.png
new file mode 100644
index 0000000..e2c5d16
Binary files /dev/null and b/infrastructure/textures/infrastructure_lane_control_lights_1.png differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_2.png b/infrastructure/textures/infrastructure_lane_control_lights_2.png
new file mode 100644
index 0000000..913572a
Binary files /dev/null and b/infrastructure/textures/infrastructure_lane_control_lights_2.png differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_3.png b/infrastructure/textures/infrastructure_lane_control_lights_3.png
new file mode 100644
index 0000000..ffe4e01
Binary files /dev/null and b/infrastructure/textures/infrastructure_lane_control_lights_3.png differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_4.png b/infrastructure/textures/infrastructure_lane_control_lights_4.png
new file mode 100644
index 0000000..6b24780
Binary files /dev/null and b/infrastructure/textures/infrastructure_lane_control_lights_4.png differ
diff --git a/infrastructure/textures/infrastructure_lane_control_lights_5.png b/infrastructure/textures/infrastructure_lane_control_lights_5.png
new file mode 100644
index 0000000..1a8afcb
Binary files /dev/null and b/infrastructure/textures/infrastructure_lane_control_lights_5.png differ
diff --git a/infrastructure/textures/infrastructure_manhole_cover_side.png b/infrastructure/textures/infrastructure_manhole_cover_side.png
new file mode 100644
index 0000000..11bf08e
Binary files /dev/null and b/infrastructure/textures/infrastructure_manhole_cover_side.png differ
diff --git a/infrastructure/textures/infrastructure_manhole_cover_top_bottom.png b/infrastructure/textures/infrastructure_manhole_cover_top_bottom.png
new file mode 100644
index 0000000..4338a82
Binary files /dev/null and b/infrastructure/textures/infrastructure_manhole_cover_top_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_marker_bottom_side.png b/infrastructure/textures/infrastructure_marker_bottom_side.png
new file mode 100644
index 0000000..6cf3e60
Binary files /dev/null and b/infrastructure/textures/infrastructure_marker_bottom_side.png differ
diff --git a/infrastructure/textures/infrastructure_marker_side_red.png b/infrastructure/textures/infrastructure_marker_side_red.png
new file mode 100644
index 0000000..5a5ae22
Binary files /dev/null and b/infrastructure/textures/infrastructure_marker_side_red.png differ
diff --git a/infrastructure/textures/infrastructure_marker_side_yellow.png b/infrastructure/textures/infrastructure_marker_side_yellow.png
new file mode 100644
index 0000000..a3a439d
Binary files /dev/null and b/infrastructure/textures/infrastructure_marker_side_yellow.png differ
diff --git a/infrastructure/textures/infrastructure_marker_top_red_yellow.png b/infrastructure/textures/infrastructure_marker_top_red_yellow.png
new file mode 100644
index 0000000..afebd88
Binary files /dev/null and b/infrastructure/textures/infrastructure_marker_top_red_yellow.png differ
diff --git a/infrastructure/textures/infrastructure_marker_top_yellow_yellow.png b/infrastructure/textures/infrastructure_marker_top_yellow_yellow.png
new file mode 100644
index 0000000..de9d4d6
Binary files /dev/null and b/infrastructure/textures/infrastructure_marker_top_yellow_yellow.png differ
diff --git a/infrastructure/textures/infrastructure_noise_barrier.png b/infrastructure/textures/infrastructure_noise_barrier.png
new file mode 100644
index 0000000..a52a243
Binary files /dev/null and b/infrastructure/textures/infrastructure_noise_barrier.png differ
diff --git a/infrastructure/textures/infrastructure_razor_wire.png b/infrastructure/textures/infrastructure_razor_wire.png
new file mode 100644
index 0000000..150a98f
Binary files /dev/null and b/infrastructure/textures/infrastructure_razor_wire.png differ
diff --git a/infrastructure/textures/infrastructure_riffled_sheet.png b/infrastructure/textures/infrastructure_riffled_sheet.png
new file mode 100644
index 0000000..0f83bce
Binary files /dev/null and b/infrastructure/textures/infrastructure_riffled_sheet.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_crosswalk_back.png b/infrastructure/textures/infrastructure_road_sign_crosswalk_back.png
new file mode 100644
index 0000000..590e65d
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_crosswalk_back.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_crosswalk_front.png b/infrastructure/textures/infrastructure_road_sign_crosswalk_front.png
new file mode 100644
index 0000000..78b5dce
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_crosswalk_front.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png b/infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png
new file mode 100644
index 0000000..f9c95c1
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_retroreflective_surface.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_right_of_way_back.png b/infrastructure/textures/infrastructure_road_sign_right_of_way_back.png
new file mode 100644
index 0000000..a98467f
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_right_of_way_back.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_right_of_way_front.png b/infrastructure/textures/infrastructure_road_sign_right_of_way_front.png
new file mode 100644
index 0000000..0f52f69
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_right_of_way_front.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_stop_back.png b/infrastructure/textures/infrastructure_road_sign_stop_back.png
new file mode 100644
index 0000000..d87b178
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_stop_back.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_stop_front.png b/infrastructure/textures/infrastructure_road_sign_stop_front.png
new file mode 100644
index 0000000..42a099f
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_stop_front.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_yield_back.png b/infrastructure/textures/infrastructure_road_sign_yield_back.png
new file mode 100644
index 0000000..d934905
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_yield_back.png differ
diff --git a/infrastructure/textures/infrastructure_road_sign_yield_front.png b/infrastructure/textures/infrastructure_road_sign_yield_front.png
new file mode 100644
index 0000000..caad0cc
Binary files /dev/null and b/infrastructure/textures/infrastructure_road_sign_yield_front.png differ
diff --git a/infrastructure/textures/infrastructure_single_yellow_line.png b/infrastructure/textures/infrastructure_single_yellow_line.png
new file mode 100644
index 0000000..a9ca74b
Binary files /dev/null and b/infrastructure/textures/infrastructure_single_yellow_line.png differ
diff --git a/infrastructure/textures/infrastructure_single_yellow_line_corner.png b/infrastructure/textures/infrastructure_single_yellow_line_corner.png
new file mode 100644
index 0000000..a41d06a
Binary files /dev/null and b/infrastructure/textures/infrastructure_single_yellow_line_corner.png differ
diff --git a/infrastructure/textures/infrastructure_solid_double_yellow_line_corner.png b/infrastructure/textures/infrastructure_solid_double_yellow_line_corner.png
new file mode 100644
index 0000000..09a3719
Binary files /dev/null and b/infrastructure/textures/infrastructure_solid_double_yellow_line_corner.png differ
diff --git a/infrastructure/textures/infrastructure_solid_yellow_line_one_side.png b/infrastructure/textures/infrastructure_solid_yellow_line_one_side.png
new file mode 100644
index 0000000..0cff2e9
Binary files /dev/null and b/infrastructure/textures/infrastructure_solid_yellow_line_one_side.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_cone_bottom.png b/infrastructure/textures/infrastructure_traffic_cone_bottom.png
new file mode 100644
index 0000000..c9a5137
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_cone_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_cone_side.png b/infrastructure/textures/infrastructure_traffic_cone_side.png
new file mode 100644
index 0000000..134837f
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_cone_side.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_cone_top.png b/infrastructure/textures/infrastructure_traffic_cone_top.png
new file mode 100644
index 0000000..2dca4ae
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_cone_top.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians.png
new file mode 100644
index 0000000..9cd1470
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png
new file mode 100644
index 0000000..357011d
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_back.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png
new file mode 100644
index 0000000..a689dc4
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_1.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png
new file mode 100644
index 0000000..a689dc4
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_2.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png
new file mode 100644
index 0000000..7729d96
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_3.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png
new file mode 100644
index 0000000..7729d96
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_bottom_front_4.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png
new file mode 100644
index 0000000..708d59b
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_back.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png
new file mode 100644
index 0000000..737c426
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_1.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png
new file mode 100644
index 0000000..737c426
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_2.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png
new file mode 100644
index 0000000..8d22856
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_3.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png
new file mode 100644
index 0000000..8d22856
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_pedestrians_top_front_4.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_side.png b/infrastructure/textures/infrastructure_traffic_lights_side.png
new file mode 100644
index 0000000..01076e3
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_side.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles.png
new file mode 100644
index 0000000..393422a
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png
new file mode 100644
index 0000000..4cbb75b
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_1.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png
new file mode 100644
index 0000000..c81f500
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_2.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png
new file mode 100644
index 0000000..f55108c
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_3.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png
new file mode 100644
index 0000000..c81f500
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_bottom_4.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png
new file mode 100644
index 0000000..116ae46
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_1.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png
new file mode 100644
index 0000000..4a57e89
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_2.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png
new file mode 100644
index 0000000..9dab2ea
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_3.png differ
diff --git a/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png
new file mode 100644
index 0000000..ddc2364
Binary files /dev/null and b/infrastructure/textures/infrastructure_traffic_lights_vehicles_top_4.png differ
diff --git a/infrastructure/textures/infrastructure_truss.png b/infrastructure/textures/infrastructure_truss.png
new file mode 100644
index 0000000..ba628f1
Binary files /dev/null and b/infrastructure/textures/infrastructure_truss.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_back.png b/infrastructure/textures/infrastructure_warning_light_back.png
new file mode 100644
index 0000000..0301aee
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_back.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_bottom.png b/infrastructure/textures/infrastructure_warning_light_bottom.png
new file mode 100644
index 0000000..e7090a0
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_bottom.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_front_bright.png b/infrastructure/textures/infrastructure_warning_light_front_bright.png
new file mode 100644
index 0000000..8d9c937
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_front_bright.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_front_dark.png b/infrastructure/textures/infrastructure_warning_light_front_dark.png
new file mode 100644
index 0000000..3496420
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_front_dark.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_left.png b/infrastructure/textures/infrastructure_warning_light_left.png
new file mode 100644
index 0000000..e519af4
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_left.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_right.png b/infrastructure/textures/infrastructure_warning_light_right.png
new file mode 100644
index 0000000..4bd42dc
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_right.png differ
diff --git a/infrastructure/textures/infrastructure_warning_light_top.png b/infrastructure/textures/infrastructure_warning_light_top.png
new file mode 100644
index 0000000..898ed0f
Binary files /dev/null and b/infrastructure/textures/infrastructure_warning_light_top.png differ
diff --git a/infrastructure/textures/infrastructure_wire_netting.png b/infrastructure/textures/infrastructure_wire_netting.png
new file mode 100644
index 0000000..a685e97
Binary files /dev/null and b/infrastructure/textures/infrastructure_wire_netting.png differ
diff --git a/infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png
new file mode 100644
index 0000000..31418f3
Binary files /dev/null and b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_back.png differ
diff --git a/infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png
new file mode 100644
index 0000000..3e46bd1
Binary files /dev/null and b/infrastructure/textures/infrastructure_wire_rope_safety_barrier_front.png differ
-- 
cgit v1.2.3