BAL and Maple Release 2.2

Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bal_release/mk/Makefile.config b/bal_release/mk/Makefile.config
new file mode 100644
index 0000000..169a649
--- /dev/null
+++ b/bal_release/mk/Makefile.config
@@ -0,0 +1,439 @@
+# Common Makefile configuration
+#
+
+# The following variables must be set
+# MOD_NAME - module name. Depending on MOD_TYPE can be encapsulated (e.g., MOD_NAME=os --> libos.a)
+# MOD_TYPE - module type. Supported types currently are "lib", "app", "linux_module", "linux_lib", "shared_lib"
+#			 Note: 
+#				For library module it is possible to specify "unitest" target in 
+#				mk/$(SUBSYSTEM)/modules.core / .apps
+#				In this case unitest.c is compiled and linked with its module library.
+#				However, MOD_TYPE remains a "lib".  
+#
+# The following variables are optional
+# srcs     - list of .c source files relative to SRC_DIR
+# as_srcs  - list of .s (lower case s)   source files relative to SRC_DIR
+# AS_srcs  - list of .S (upper case .S) source files relative to SRC_DIR 
+# gen_bal_srcs - list of .c that have to be generated as part of the build from bal.objset
+# gen_bal_hdrs - list of .h that have to be generated as part of the build from bal.objset
+# gen_omci_srcs - list of .c that have to be generated as part of the build from omci.objset
+# gen_omci_hdrs - list of .h that have to be generated as part of the build from omci.objset
+# gen_omci_stack_srcs - list of .c that have to be generated as part of the build from omci_me_datamodel.csv
+# gen_omci_stack_hdrs - list of .h that have to be generated as part of the build from omci_me_datamodel.csv
+# MOD_DEPS - list of modules the "current" module depends on. OS abstraction layer dependency
+#			 (module "os") is always present implicitly. For example, api_cli module's Makefile 
+#			 includes the following line:
+#			 MOD_DEPS = cli api utils model
+# MOD_DEPS_OPT - similar to MOD_DEPS, but dependencies are optional and might not be present in the source tree.
+# MOD_INC_DIRS - used when module exports includes in directory(s) other than the module directory 
+# MOD_DEFS - additional defines, including -D. the defines are added when compiling "this" module
+#			 and all modules depending on it
+# MOD_LIBS - additional libraries required by the module, including -l and -L
+# MOD_CUSTOM - if set "y", default rule for building the module is NOT provided.
+#			 In this case the rule for building $(MOD_TARGET) must be provided in module's Makefile
+# MOD_POST_BUILD - optional commands that should be executed after successful module build
+# 
+# The following variables are not required in most cases, but supported nonetheless
+# EXTRA_CFLAGS - extra CFLAGS the module requires for compilation
+# EXTRA_INCLUDES - extra include directories the module requires for compilation (with -I)
+# EXTRA_LIBS_PATH - additional library search paths
+# EXTRA_LIBS additional libraries to link with
+#
+# The following variables are pre-set and can be used in module-specific Makefile
+# TOP_DIR - fully qualified top directory
+# MOD_DIR - module directory relative to the top directory
+# OUT_DIR_BASE - output directory base
+# ALL_MODULES - list of all modules in the current subsystem (core/apps)
+# ALL_LIB_MODULES - list of all lib modules in the current subsystem (core/apps)
+# ALL_APP_MODULES - list of all app modules in the current subsystem (core/apps)
+# SIMULATION_BUILD - set "y" for simulation build (CROSS_COMPILE is empty) 
+# OS - OS
+# ENABLE_EPON - set "y" if EPON mode is included
+# ENABLE_GPON - set "y" if GPON mode is included
+# ENABLE_XGPON - set "y" if XGPON mode is included
+# ENABLE_GPON_OR_XGPON - set "y" if GPON or XGPON mode is included
+# ENABLE_CLI - set "n" if CLI support is not required
+# ENABLE_LOG - set "n" if logger support is not required
+#
+# USE_CLANG - set "y" to enable CLANG code pass for improved diagnostic
+#
+# The following variables are pre-set and can be used and/or overwritten in module-specific Makefile
+# SRC_DIR - fully-qualified source directory
+# OUT_DIR - module output directory
+# TARGET_LIB - library name for "lib" or "shared_lib" module. By default it is $(MOD_NAME)
+# TARGET_LIB_FNAME - module library file name including path. 
+#		By default it is $(OUT_DIR)/lib$(TARGET_LIB).a for "lib" module and 
+#		$(OUT_DIR)/lib$(TARGET_LIB).so for "shared_lib"
+# MOD_TARGET - module target name, including path. By default it is 
+#	$(OUT_DIR)/$(MOD_NAME) for "app" modules
+#	$(TARGET_LIB_FNAME) for "lib" and "shared_lib" modules
+# CODEGEN_OUTPUT_DIR - output directory containing generated files
+
+TOOLCHAIN    ?= gcc
+OS           ?= posix
+DEBUG        ?= y
+BLD_DEP      ?= gcc
+USE_CLANG 	 ?= n
+
+export SHELL := /bin/bash
+
+export BOARD
+export TOOLCHAIN
+export OS
+export DEBUG
+export BLD_DEP
+export OS_KERNEL
+
+V ?= 0
+ifeq (x"$(V)", x"0")
+    SILENT_BUILD = @
+endif
+
+SRC_DIR		     = $(TOP_DIR)/$(MOD_DIR)
+OUT_DIR_BASE 	?= $(TOP_DIR)/build/$(SUBSYSTEM)
+OUT_DIR      	:= $(OUT_DIR_BASE)/$(MOD_DIR)
+
+#
+# Compiler warning configuration
+# Some extra warnings are always enabled. Others must be opted in on the module level
+#
+ENABLE_EXTRA_WARNINGS ?= y
+export ENABLE_EXTRA_WARNINGS
+
+ifneq ("$(BUILD_NC_AGENT)", "y")
+    override NC_AGENT := none
+endif
+
+# Include optional subsystem-specific configuration
+-include mk/$(SUBSYSTEM)/Makefile.$(SUBSYSTEM).config
+
+ENABLE_EPON	 ?= y
+ENABLE_GPON	 ?= y
+ENABLE_XGPON ?= y
+
+ENABLE_GPON_OR_XGPON = n
+ifeq ("$(ENABLE_GPON)", "y")
+    ENABLE_GPON_OR_XGPON = y
+endif
+ifeq ("$(ENABLE_XGPON)", "y")
+    ENABLE_GPON_OR_XGPON = y
+endif
+export ENABLE_EPON
+export ENABLE_GPON
+export ENABLE_XGPON
+export ENABLE_GPON_OR_XGPON
+
+CONFIG_DIR      = src/common/config
+OS_PLATFORM_DIR = src/$(SUBSYSTEM)/platform
+
+# CLI and logger support
+ENABLE_CLI ?= y
+ENABLE_LOG ?= y
+BAL_MONOLITHIC ?= y
+
+export ENABLE_CLI
+export ENABLE_LOG
+export BAL_MONOLITHIC
+
+#
+### Include module Makefile
+# For MOD_CUSTOM only will be included in Makefile.rules second time for propagate custom rules 
+#
+include $(SRC_DIR)/Makefile
+
+# Code-generator - related parameters
+CODEGEN_INPUT_DIR	 = $(SRC_DIR)/codegen_templates
+CODEGEN_OUTPUT_DIR	 = $(OUT_DIR)
+CODEGEN_DIR			 = $(TOP_DIR)/src/datamodel/bin/codegen
+CODEGEN_EXE          = $(CODEGEN_DIR)/Teknovus.MetaStructure.CodeGenerator.exe
+
+OMCI_STACK_CODEGEN_INPUT_DIR = $(SRC_DIR)/me_codegen
+OMCI_STACK_CODEGEN_EXE = $(OUT_DIR)/omci_me_codegen
+
+BAL_MODEL_FILE		 = $(TOP_DIR)/src/datamodel/bal.objset
+OMCI_MODEL_FILE		 = $(TOP_DIR)/src/datamodel/omci.objset
+OMCI_STACK_MODEL_FILE = $(TOP_DIR)/src/datamodel/omci_me_datamodel.csv
+MONO_VER            ?= 4.3.2.467
+MONO_PATH           ?= /opt/mono-$(MONO_VER)/bin/mono
+
+export SRC_DIR
+export OUT_DIR_BASE
+export OUT_DIR
+export MODEL_OUT_DIR
+
+ifeq ("$(wildcard $(MONO_PATH))", "")
+    # If we can't find Mono installed in the correct path, default to the current PATH version.
+    # In the future, we should always use Mono from a common tools directory.
+    # TODO: change this once the compiler/toolchain paths are better defined.
+    MONO_PATH        = mono
+endif
+
+# Treat "yes" and "y" the same
+ifeq ("$(USE_CLANG)", "yes")
+    USE_CLANG := y
+endif
+ifeq ("$(USE_CLANG)", "y")
+    include $(MAKE_DIR)/clang.opts
+endif
+
+# Disable code generation in release build
+ifeq ("$(RELEASE_BUILD)", "y")
+    srcs := $(srcs) $(gen_bal_srcs) $(gen_omci_srcs)
+    gen_bal_hdrs := 
+    gen_bal_srcs := 
+    gen_omci_hdrs := 
+    gen_omci_srcs := 
+    # Disable LINT and CLANG
+    USE_LINT = n
+    USE_CLANG = n
+endif
+
+SRCS = $(strip $(srcs:%=$(SRC_DIR)/%))
+
+# In COMPILE_ALL_IN_ONE_GO mode all .c files of a module are compiled in 
+# a single invocation of BLD_CC compiler. In result, objects files are created
+# in OUT_DIR even if module's .c files are spread in sub-directories
+ifeq ("$(COMPILE_ALL_IN_ONE_GO)", "y")
+    srcs_no_dir = $(notdir $(srcs))  
+    _OBJS = $(srcs_no_dir:%.c=$(OUT_DIR)/%.o)
+else
+    _OBJS = $(srcs:%.c=$(OUT_DIR)/%.o)
+endif
+
+as_SRCS = $(strip $(as_srcs:%=$(SRC_DIR)/%))
+as_OBJS = $(as_srcs:%.s=$(OUT_DIR)/%.o)
+_OBJS  += $(as_OBJS)
+
+AS_SRCS = $(strip $(AS_srcs:%=$(SRC_DIR)/%))
+AS_OBJS = $(AS_srcs:%.S=$(OUT_DIR)/%.o)
+_OBJS  += $(AS_OBJS)
+
+ifneq ("$(gen_bal_srcs)", "")
+    GEN_BAL_SRCS = $(strip $(gen_bal_srcs:%=$(CODEGEN_OUTPUT_DIR)/%))
+    _OBJS += $(GEN_BAL_SRCS:%.c=%.o)
+endif
+ifneq ("$(gen_bal_hdrs)", "")
+    GEN_BAL_HDRS = $(strip $(gen_bal_hdrs:%=$(CODEGEN_OUTPUT_DIR)/%))
+endif
+
+ifneq ("$(gen_omci_srcs)", "")
+    GEN_OMCI_SRCS = $(strip $(gen_omci_srcs:%=$(CODEGEN_OUTPUT_DIR)/%))
+    _OBJS += $(GEN_OMCI_SRCS:%.c=%.o)
+endif
+ifneq ("$(gen_omci_hdrs)", "")
+    GEN_OMCI_HDRS = $(strip $(gen_omci_hdrs:%=$(CODEGEN_OUTPUT_DIR)/%))
+endif
+
+ifneq ("$(gen_omci_stack_srcs)", "")
+    GEN_OMCI_STACK_SRCS = $(strip $(gen_omci_stack_srcs:%=$(CODEGEN_OUTPUT_DIR)/%))
+    _OBJS += $(GEN_OMCI_STACK_SRCS:%.c=%.o)
+endif
+ifneq ("$(gen_omci_stack_hdrs)", "")
+    GEN_OMCI_STACK_HDRS = $(strip $(gen_omci_stack_hdrs:%=$(CODEGEN_OUTPUT_DIR)/%))
+endif
+
+OBJS = $(strip $(_OBJS))
+
+GEN_SRCS = $(GEN_BAL_SRCS) $(GEN_OMCI_SRCS) $(GEN_OMCI_STACK_SRCS)
+GEN_HDRS = $(GEN_BAL_HDRS) $(GEN_OMCI_HDRS) $(GEN_OMCI_STACK_HDRS)
+
+# Add default dependency on OS abstraction
+ifeq ("$(MOD_NAME)", "")
+    ifneq (x"$(V)", x"0")
+        $(info MOD_NAME is not set for $(SRC_DIR)/Makefile. Skipping..)
+    endif
+    MOD_TYPE = _skip_
+endif
+
+# Add default dependency on OS abstraction
+ifneq ("$(MOD_SUPPRESS_OS_DEP), "y)
+    ifeq ("$(MOD_TYPE)", "linux_module")
+        _kernel = y
+    endif
+    ifeq ("$(MOD_TYPE)", "linux_lib")
+        _kernel = y
+    endif
+    ifeq ("$(_kernel)", "y")
+         MOD_DEPS := os_linux $(MOD_DEPS)
+    else    
+         MOD_DEPS := os $(MOD_DEPS)
+    endif
+endif
+
+# Extra types filter
+ifneq ("$(EXTRA_TYPES)", "")
+    EXTRA_TYPES := $(shell echo -n $(EXTRA_TYPES) | sed -e 's/ /\\|/g')
+    GEN_EXTRA_TYPES := -typeNameFilter=\^\($(EXTRA_TYPES)\)\$$ 
+endif
+
+OS_KERNEL ?= $(OS)
+UC_PLATFORM = $(shell echo $(PLATFORM) | tr a-z A-Z)
+UC_SUBSYSTEM = $(shell echo $(SUBSYSTEM) | tr a-z A-Z)
+UC_OS = $(shell echo $(OS) | tr a-z A-Z)
+UC_OS_KERNEL = $(shell echo $(OS_KERNEL) | tr a-z A-Z)
+
+EXTRA_DEFINES   += -DBCM_SUBSYSTEM_$(UC_SUBSYSTEM) -DBCM_PLATFORM_$(UC_PLATFORM) -DBCM_OS_$(UC_OS)
+EXTRA_DEFINES   += -DBCM_SUBSYSTEM_HOST
+EXTRA_DEFINES   += -D$(UC_OS_KERNEL)_KERNEL_SPACE
+ifeq ("$(ENABLE_EPON)", "y")
+    EXTRA_DEFINES	+= -DBCM_EPON
+endif
+ifeq ("$(ENABLE_GPON)", "y")
+    EXTRA_DEFINES	+= -DBCM_GPON
+endif
+ifeq ("$(ENABLE_XGPON)", "y")
+    EXTRA_DEFINES	+= -DBCM_XGPON
+endif
+
+ifneq ("$(CONFIG_MAC_RPC)", "n")
+EXTRA_DEFINES += -DCONFIG_MAC_RPC
+endif
+
+ifneq ("$(CONFIG_SWITCH_RPC)", "n")
+EXTRA_DEFINES += -DCONFIG_SWITCH_RPC
+endif
+
+ifneq ("$(BOARD)", "")
+EXTRA_DEFINES	+= -DBOARD=$(BOARD)
+endif
+
+ifeq ("$(BOARD)", "wrx")
+EXTRA_DEFINES	+= -DWRX_BUILD
+endif
+
+ifeq ("$(BUILD_OF_AGENT)", "y")
+EXTRA_DEFINES   += -DBUILD_OF_AGENT
+endif
+
+ifeq ("$(FORCE_PKTIN_SND)", "y")
+EXTRA_DEFINES   += -DFORCE_PKTIN_SND
+endif
+
+# Build unitests for simulation and from Jenkins jobs
+UNITEST ?= n
+
+ifeq ("$(SIMULATION_BUILD)", "y")
+	EXTRA_DEFINES += -DSIMULATION_BUILD
+	UNITEST = y
+endif
+
+ifeq ("$(JENKINS_BUILD)", "y")
+	UNITEST = y
+endif
+
+ifeq ("$(BAL_MONOLITHIC)", "y")
+    EXTRA_DEFINES += -DBAL_MONOLITHIC
+endif
+
+EXTRA_INCLUDES  += -I$(SRC_DIR)
+EXTRA_INCLUDES  += -I$(TOP_SRC_DIR)/common/include -I$(OUT_DIR_BASE)/src/common/include
+
+OPT_DISABLE_$(UC_SUBSYSTEM) ?=n
+OPT_DISABLE := $(OPT_DISABLE_$(UC_SUBSYSTEM))
+
+ARCH_CFLAGS = $(ARCH_FLAGS)
+ifeq ("$(OPT_DISABLE)", "y")
+    ARCH_CFLAGS		+= $(DEBUG_O_CFLAGS)
+	EXTRA_LFLAGS	+= $(DEBUG_O_LFLAGS)
+    EXTRA_ASFLAGS   += $(DEBUG_O_ASFLAGS)
+    EXTRA_asFLAGS   += $(DEBUG_O_asLAGS)
+else
+    ARCH_CFLAGS     += $(RELEASE_O_CFLAGS)
+	EXTRA_LFLAGS	+= $(RELEASE_O_LFLAGS)
+    EXTRA_ASFLAGS   += $(RELEASE_O_ASFLAGS)
+    EXTRA_asFLAGS   += $(RELEASE_O_asFLAGS)
+endif
+
+# 3rd party packages install location
+INSTALL_DIR ?= $(OUT_DIR_BASE)
+export INSTALL_DIR
+EXTRA_INCLUDES += -I$(INSTALL_DIR)/include
+
+PATH := $(INSTALL_DIR)/bin:$(PATH)
+export PATH
+
+# Shared library location
+SHARED_LIB_DIR ?= $(INSTALL_DIR)/lib
+export SHARED_LIB_DIR
+
+# Treat lib as shared lib if BUILD_SHARED_LIBS is y
+ifeq  ("$(BUILD_SHARED_LIBS)", "y")
+   export BUILD_SHARED_LIBS
+   ifeq  ("$(MOD_TYPE)", "lib")
+      MOD_TYPE = shared_lib
+   endif
+   EXTRA_LIBS_PATH += -L$(TOP_DIR)/$(LOCAL_MAPLE_SDK_DIR)/build/shared_libs
+endif
+EXTRA_LIBS_PATH += -L$(SHARED_LIB_DIR)
+
+# Calculate MOD_TARGET based on MOD_TYPE
+ifeq  ("$(MOD_TYPE)", "lib")
+	ifneq ("$(OBJS)", "")
+		TARGET_LIB ?= $(MOD_NAME)
+		TARGET_LIB_FNAME ?= $(OUT_DIR)/lib$(TARGET_LIB).a
+	endif
+	MOD_TARGET ?= $(TARGET_LIB_FNAME)
+else ifeq  ("$(MOD_TYPE)", "shared_lib")
+	ifneq ("$(OBJS)", "")
+		TARGET_LIB ?= $(MOD_NAME)
+		TARGET_LIB_FNAME ?= $(OUT_DIR)/lib$(TARGET_LIB).so
+	endif
+	MOD_TARGET ?= $(TARGET_LIB_FNAME)
+else ifeq  ("$(MOD_TYPE)", "app")
+	MOD_TARGET ?= $(OUT_DIR)/$(MOD_NAME)
+else ifeq  ("$(MOD_TYPE)", "linux_module")
+    ifeq ("$(KERNELDIR)", "")
+        $(error KERNELDIR must be set in board profile)
+    endif
+    ifeq ("$(KERNEL_ARCH)", "")
+        $(error KERNEL_ARCH must be set in board profile)
+    endif
+    ifeq ("$(KERNEL_OUTDIR)", "")
+        KERNEL_OUTDIR := $(KERNELDIR)
+    endif
+	MOD_TARGET ?= $(SRC_DIR)/$(MOD_NAME).ko
+else ifeq ("$(MOD_TYPE)", "linux_lib") 
+    MOD_TARGET ?= $(OUT_DIR_BASE)/$(MOD_NAME).linuxlib
+else ifeq ("$(MOD_TYPE)", "_skip_")
+    MOD_TARGET = .dummy
+else        	
+    $(error MOD_TYPE $(MOD_TYPE) is incorrect for module $(MOD_NAME). Must be lib or app)
+endif
+
+ifeq ("$(MOD_TARGET)", "")
+   MOD_TARGET = $(MOD_NAME)
+endif
+
+ifeq ("$(OS)", "posix")
+	EXTRA_DEFINES += -D_XOPEN_SOURCE=600
+    LIBS   = -lrt -lpthread -lm
+endif
+
+# Make sure that paths in EXTRA_INCLUDES are absolute
+ifneq ("$(EXTRA_INCLUDES)", "")
+    # Make sure that each directory is an absolute path
+    EXTRA_INCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(EXTRA_INCLUDES)))))
+endif
+ifneq ("$(EXTRA_ASINCLUDES)", "")
+    # Make sure that each directory is an absolute path
+    EXTRA_ASINCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(EXTRA_ASINCLUDES)))))
+endif
+ifneq ("$(EXTRA_asINCLUDES)", "")
+    # Make sure that each directory is an absolute path
+    EXTRA_asINCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(EXTRA_asINCLUDES)))))
+endif
+ifeq ("$(USE_LINT)", "y")
+    USE_LINT := yes
+endif    
+ifeq ("$(USE_LINT)", "yes")
+    EXTRA_DEFINES += -DUSE_LINT
+endif
+
+EXTRA_DEFINES += $(USER_EXTRA_DEFINES) $(USER_EXTRA_$(UC_SUBSYSTEM)_DEFINES)
+EXTRA_CFLAGS += $(USER_EXTRA_CFLAGS) $(USER_EXTRA_$(UC_SUBSYSTEM)_CFLAGS)
+CFLAGS  += $(ARCH_CFLAGS) $(EXTRA_CFLAGS)  $(EXTRA_INCS) $(EXTRA_DEFINES)
+ASFLAGS += $(ARCH_FLAGS) $(EXTRA_ASFLAGS) $(EXTRA_ASINCS) $(EXTRA_ASDEFINES)
+asFLAGS += $(ARCH_FLAGS) $(EXTRA_asFLAGS) $(EXTRA_asINCS) $(EXTRA_asDEFINES)
+LFLAGS  += $(ARCH_FLAGS) $(EXTRA_LFLAGS)
+DEP_FLAGS += $(EXTRA_CFLAGS) $(EXTRA_INCS) $(EXTRA_DEFINES)
+CLANG_FLAGS += $(EXTRA_CFLAGS) $(EXTRA_INCS) $(EXTRA_DEFINES) $(CLANG_OPTS)
diff --git a/bal_release/mk/Makefile.initial_config b/bal_release/mk/Makefile.initial_config
new file mode 100644
index 0000000..541ec84
--- /dev/null
+++ b/bal_release/mk/Makefile.initial_config
@@ -0,0 +1,6 @@
+ifeq ("$(TERM)", "dumb")
+        BOLD_PRINT := printf "\n---- %s --------------------------------------------------\n"
+else
+        BOLD_PRINT?=printf "%s\n"
+endif
+export BOLD_PRINT
diff --git a/bal_release/mk/Makefile.main b/bal_release/mk/Makefile.main
new file mode 100644
index 0000000..3818766
--- /dev/null
+++ b/bal_release/mk/Makefile.main
@@ -0,0 +1,180 @@
+# It is included from the central Makefile once for each subsystem (e.g., "core" and "agent")
+# PARAMATER: SUBSYSTEM
+
+UC_SUBSYSTEM = $(shell echo $(SUBSYSTEM) | tr a-z A-Z)
+export BUILD_TARGET = $(SUBSYSTEM)
+export BIN_RELEASE_FILE_PREFIX ?= release.bin.$(SUBSYSTEM).$(BUILD_VERSION_PREFIX)
+export OUT_$(UC_SUBSYSTEM)_DIR 	 ?= $(OUT_DIR)/$(SUBSYSTEM)
+
+# Combine modules.$(SUBSYSTEM).bal, modules.$(SUBSYSTEM).sdn_pal and modules.$(SUBSYSTEM).omci into a single file in the subsystem directory
+define combine_modules
+	mkdir -p $(OUT_$(UC_SUBSYSTEM)_DIR); \
+	rm -rf $1; \
+    touch $1; \
+	for mod_file in $2; do cat $$mod_file >> $1; done;
+endef
+
+# Create $(SUBSYSTEM)/modules.$(SUBSYSTEM).omci and $(SUBSYSTEM)/modules.$(SUBSYSTEM).sdn_pal if they doesn't exist, as empty files.
+# This is relevant when compiling from source release package extraction.
+$(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).omci: | phonytarget
+	touch $@
+$(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).sdn_pal: | phonytarget
+	touch $@
+
+phonytarget:
+
+# ORDER IS IMPORTANT - OMCI should come before BAL
+$(OUT_$(UC_SUBSYSTEM)_DIR)/modules.core: $(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).omci $(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).bal
+	$(call combine_modules,$(OUT_$(UC_SUBSYSTEM)_DIR)/modules.core,$^)
+
+# ORDER IS IMPORTANT - SDN_PAL should come after BAL
+$(OUT_$(UC_SUBSYSTEM)_DIR)/modules.agent: $(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).bal $(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).omci $(MAKE_DIR)/$(SUBSYSTEM)/modules.$(SUBSYSTEM).sdn_pal
+	$(call combine_modules,$(OUT_$(UC_SUBSYSTEM)_DIR)/modules.agent,$^)
+
+$(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_$(BOARD): $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM) \
+        $(MAKE_DIR)/Makefile.config $(MAKE_DIR)/Makefile.rules $(MAKE_DIR)/Makefile.template $(MAKE_DIR)/Makefile.main
+	@if ! test -f $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_$(BOARD); then\
+	    if ls $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_* 2>/dev/null >/dev/null; then\
+	    	olddeps=`ls $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_*` ; \
+	    	old_board=`echo $$olddeps | sed 's@$(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_@@'` ; \
+			$(BOLD_PRINT) "Previous build was for different board $$old_board. cleaning up..";\
+			$(MAKE) -s BOARD=$$old_board V=0 clean_$(SUBSYSTEM); \
+			rm -fr $(OUT_$(UC_SUBSYSTEM)_DIR)/build/output/*; \
+		fi;\
+	fi
+	@$(BOLD_PRINT) "Generating list of $(SUBSYSTEM) modules for $(BUILD_TARGET)"
+	@rm -fr $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_*
+	@rm -fr $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM)
+	@rm -fr $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM)
+	@rm -fr $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM)
+	@mkdir -p $(OUT_$(UC_SUBSYSTEM)_DIR)
+	@touch $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM)
+	@touch $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM)
+	@touch $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM)
+	@for mod_dir in `awk '{print $$1}' $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM)`; do\
+		if test "$$mod_dir" = "" ; then continue; fi; \
+		mod_name=`$(MAKE) -s V=0 SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir SKIP_DEPS=yes -f $(MAKE_DIR)/Makefile.template module_name`;\
+		if test "$$mod_name" = "" ; then continue; fi; \
+		mod_name=$${mod_name}_$(SUBSYSTEM);\
+		mod_type=`grep -e '^[[:space:]]*MOD_TYPE[[:space:]]*=' $$mod_dir/Makefile | awk -F= '{sub(/\r/,""); print $$2}' | sed -e 's/^[ \t]*//'`; \
+		echo -n "$$mod_name " >> $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM); \
+		if test "`echo -n $$mod_type | sed -e 's/linux_lib lib/lib/' | sed -e 's/lib linux_lib/lib/'`" = "lib" ; then\
+			echo -n "$$mod_name " >> $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM); \
+		fi;\
+		if test "$$mod_type" = "app" ; then\
+			echo -n "$$mod_name " >> $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM); \
+		fi;\
+	done
+	@touch $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_$(BOARD)
+
+$(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_$(BOARD): $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_$(BOARD)
+	@$(BOLD_PRINT) "Building $(BOARD) board environment for $(BUILD_TARGET)"
+	$(MAKE) SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir OUT_DIR_BASE=$(OUT_$(UC_SUBSYSTEM)_DIR) SKIP_DEPS=yes \
+            ALL_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM)`" \
+            ALL_LIB_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM)`" \
+            ALL_APP_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM)`" \
+            -f $(MAKE_DIR)/Makefile.template board_env
+	@$(BOLD_PRINT) "Generating $(SUBSYSTEM) dependencies for $(BUILD_TARGET)"
+	@for mod_dir in `awk '{print $$1}' $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM)`; do\
+		if test "$$mod_dir" = "" ; then continue; fi; \
+		mod_name=`$(MAKE) -s V=0 SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir SKIP_DEPS=yes -f $(MAKE_DIR)/Makefile.template module_name`;\
+		if test "$$mod_name" = "" ; then continue; fi; \
+		if ! $(MAKE) $(SILENT) SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir OUT_DIR_BASE=$(OUT_$(UC_SUBSYSTEM)_DIR) SKIP_DEPS=yes \
+			ALL_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM)`" \
+			ALL_LIB_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM)`" \
+			ALL_APP_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM)`" \
+			-f $(MAKE_DIR)/Makefile.template moddep; then exit 1;\
+		fi;\
+	done
+	@touch $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_$(BOARD)
+	@echo "$(BOARD_DIR)" > $(OUT_$(UC_SUBSYSTEM)_DIR)/.board_dir
+
+.PHONY:
+
+# Make sure that none of module Makefiles changed.
+# If there is a change - we need to regenerate dependencies
+_deps_$(SUBSYSTEM)_: $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_$(BOARD) .PHONY
+	@cat $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM) | while read -r mod_dir_targ; do\
+			mod_dir=`echo $$mod_dir_targ | awk '{print $$1}'`;\
+			if test "$$mod_dir" = "" ; then continue; fi; \
+			if test $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_$(BOARD) -ot $$mod_dir/Makefile; then\
+				echo $$mod_dir/Makefile changed, must regenerate dependencies.;\
+				echo PLEASE RE-RUN make;\
+				rm -f $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_$(BOARD);\
+				exit -1;\
+			fi;\
+		done
+
+build_$(SUBSYSTEM): _deps_$(SUBSYSTEM)_
+	@$(BOLD_PRINT) "Building $(SUBSYSTEM) image for $(BUILD_TARGET)"
+	@cat $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM) | while read -r mod_dir_targ; do\
+		mod_dir=`echo $$mod_dir_targ | awk '{print $$1}'`;\
+		if test "$$mod_dir" = "" ; then continue; fi; \
+		mod_targets=`echo $$mod_dir_targ | awk '{print $$2 $$3 $$4 $$5}'`;\
+		if ! $(MAKE) $(SILENT) SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir OUT_DIR_BASE=$(OUT_$(UC_SUBSYSTEM)_DIR) \
+			ALL_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM)`" \
+			ALL_LIB_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM)`" \
+			ALL_APP_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM)`" \
+			-f $(MAKE_DIR)/Makefile.template $$mod_targets; then exit 1;\
+		fi;\
+	done
+	@$(BOLD_PRINT) "Finished building $(SUBSYSTEM) image for $(BUILD_TARGET)"
+
+clean_$(SUBSYSTEM): BOARD=$(shell ls $(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_* 2>/dev/null | sed 's@$(OUT_$(UC_SUBSYSTEM)_DIR)/.deps_$(SUBSYSTEM)_list_@@')
+
+clean_$(SUBSYSTEM): $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM)
+	@$(BOLD_PRINT) "Clean $(PLATFORM) $(SUBSYSTEM) BOARD=$(BOARD)"
+	@for mod_dir in `awk '{print $$1}' $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM)`; do\
+		if test "$$mod_dir" = "" ; then continue; fi; \
+		$(MAKE) $(SILENT) SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir OUT_DIR_BASE=$(OUT_$(UC_SUBSYSTEM)_DIR) SKIP_DEPS=yes \
+			-f $(MAKE_DIR)/Makefile.template clean_module;\
+	done
+	$(SILENT_BUILD)rm -fr $(OUT_$(UC_SUBSYSTEM)_DIR)
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name '*~' -print0 2>/dev/null | xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name '*.ko' -print0 2>/dev/null | xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name '.*.cmd' -print0 2>/dev/null | xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name '*.o' -print0 2>/dev/null | xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name '*.mod.c' -print0 2>/dev/null | xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name modules.order -print0 2>/dev/null | xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name Module.symvers -print0 2>/dev/null| xargs -0 rm -rf
+	$(SILENT_BUILD)find $(SUBSYSTEM) -name .tmp_versions -print0 2>/dev/null | xargs -0 rm -rf
+ 
+help_$(SUBSYSTEM):
+	@echo "$$PLATFORM $(SUBSYSTEM) modules:"
+	@cat $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM) | while read -r mod_dir_targ; do\
+		mod_dir=`echo $$mod_dir_targ | awk '{print $$1}'`;\
+		if test "$$mod_dir" = "" ; then continue; fi; \
+		mod_name=`$(MAKE) -s V=0 SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir SKIP_DEPS=yes -f $(MAKE_DIR)/Makefile.template module_name`;\
+		if test "$$mod_name" = "" ; then continue; fi; \
+		echo "  " $${mod_name}_$(SUBSYSTEM);\
+	done
+
+# Targets for building individual $(SUBSYSTEM) module
+%_$(SUBSYSTEM):: _deps_$(SUBSYSTEM)_
+	@while read -r mod_dir_targ; do\
+		mod_dir=`echo $$mod_dir_targ | awk '{print $$1}'`;\
+		if test "$$mod_dir" = "" ; then continue; fi; \
+		mod_name=`$(MAKE) -s V=0 SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir SKIP_DEPS=yes -f $(MAKE_DIR)/Makefile.template module_name`;\
+		if test "$$mod_name" = "" ; then continue; fi; \
+		mod_name=$${mod_name}_$(SUBSYSTEM);\
+		mod_targets=`echo $$mod_dir_targ | awk '{print $$2 $$3 $$4 $$5}'`;\
+		if test "$$mod_name" = "$@" ; then\
+			target_found=y;\
+			$(MAKE) $(SILENT) SUBSYSTEM=$(SUBSYSTEM) MOD_DIR=$$mod_dir OUT_DIR_BASE=$(OUT_$(UC_SUBSYSTEM)_DIR) \
+			ALL_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_modules.$(SUBSYSTEM)`" \
+			ALL_LIB_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_lib_modules.$(SUBSYSTEM)`" \
+			ALL_APP_MODULES="`cat $(OUT_$(UC_SUBSYSTEM)_DIR)/all_app_modules.$(SUBSYSTEM)`" \
+				-f $(MAKE_DIR)/Makefile.template $$mod_targets || exit 1;\
+		fi;\
+	done < $(OUT_$(UC_SUBSYSTEM)_DIR)/modules.$(SUBSYSTEM);\
+	if test "$$target_found" != "y" ; then\
+		echo No rule to make target $@;\
+		exit 1;\
+	fi
+
+docs_$(SUBSYSTEM): _deps_$(SUBSYSTEM)_
+	mkdir -p $(OUT_DOCS_DIR)
+	$(SILENT_BUILD)$(MAKE) -C doxygen OUT_DIR_BASE=$(OUT_$(UC_SUBSYSTEM)_DIR)
+
+bin_release_$(SUBSYSTEM): build_$(SUBSYSTEM)
+	$(SILENT_BUILD)$(MAKE_DIR)/bin_release.sh
diff --git a/bal_release/mk/Makefile.rules b/bal_release/mk/Makefile.rules
new file mode 100644
index 0000000..886b22f
--- /dev/null
+++ b/bal_release/mk/Makefile.rules
@@ -0,0 +1,494 @@
+# Common Makefile rules
+#
+
+# For linux_lib we don't build anything. Object files are just added
+# when compiling modules depending on the libs
+
+ifeq  ("$(MOD_TYPE)", "linux_lib")
+	# Skip libraries that might have crept in dependencies
+    SKIP_LIB_MODULES = y
+    export SKIP_LIB_MODULES
+endif    
+
+ifeq  ("$(MOD_TYPE)", "linux_module")
+	# Skip libraries that might have crept in dependencies
+    SKIP_LIB_MODULES = y
+    export SKIP_LIB_MODULES
+endif    
+
+ifeq ("$(MOD_TYPE)", "lib")
+    MODULE_IS_A_LIBRARY = y
+else ifeq ("$(MOD_TYPE)", "shared_lib")
+    MODULE_IS_A_LIBRARY = y
+else
+    MODULE_IS_A_LIBRARY = n
+endif
+
+# Include module's own auto-generated Makefile.config.$(MODULE) file if any
+# It in turn includes all dependencies
+ifeq (x"$(V)", x"2")
+    $(info !!!MOD_NAME=$(MOD_NAME) MOD_TYPE=$(MOD_TYPE) MOD_TARGET=$(MOD_TARGET))
+    $(info !!!Including own dependency file: $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME))
+endif
+-include $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"2")
+    $(info !!!After include of $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME))
+endif
+
+ifeq (x"$(V)", x"2")
+    $(info !!! Building $(MOD_TYPE) module $(MOD_NAME): depends on $(MOD_DEPS_FILES) SKIP_LIBS=$(SKIP_LIB_MODULES))
+endif
+
+# Skip default rules for custom module
+ifneq  ("$(MOD_CUSTOM)", "y")
+ 
+# Default lib rule
+ifeq  ("$(MOD_TYPE)", "lib")
+
+ifeq ("$(SKIP_LIB_MODULES)", "y")
+
+$(MOD_TARGET): 
+
+# of ifneq  ("$(SKIP_LIB_MODULES)", "y")
+else
+
+# Create library if there are any objects 
+$(MOD_TARGET): $(OBJS)
+ifneq ("$(OBJS)", "")
+	$(SILENT_BUILD)$(BLD_AR) $(ARFLAGS) $@ $(OBJS)
+ifeq ("$(MOD_POST_BUILD)", "")
+	@$(BOLD_PRINT) "done: $@"
+endif	
+endif
+ifneq ("$(MOD_POST_BUILD)", "")
+	$(SILENT_BUILD)$(MOD_POST_BUILD)
+	@$(BOLD_PRINT) "done: $@"
+endif	
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+
+# end of ifeq ("$(SKIP_LIB_MODULES)", "y")
+endif
+
+# end of ifeq  ("$(MOD_TYPE)", "lib")
+endif
+ 
+# Default shared_lib rule
+ifeq  ("$(MOD_TYPE)", "shared_lib")
+
+EXTRA_CFLAGS += -fPIC
+
+# Create library if there are any objects 
+$(MOD_TARGET): $(OBJS)
+ifneq ("$(OBJS)", "")
+	$(SILENT_BUILD)$(BLD_CC) -shared -o $@ $(OBJS) $(LFLAGS)
+	$(SILENT_BUILD)mkdir -p $(SHARED_LIB_DIR)
+	$(SILENT_BUILD)cp $@ $(SHARED_LIB_DIR)/
+ifeq ("$(MOD_POST_BUILD)", "")
+	@$(BOLD_PRINT) "done: $@"
+endif	
+endif
+ifneq ("$(MOD_POST_BUILD)", "")
+	$(SILENT_BUILD)$(MOD_POST_BUILD)
+	@$(BOLD_PRINT) "done: $@"
+endif	
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+
+# end of ifeq  ("$(MOD_TYPE)", "shared_lib")
+endif
+
+# Default app rule
+ifeq  ("$(MOD_TYPE)", "app")
+
+$(MOD_TARGET): $(OBJS) $(MOD_DEPS_FILES)
+	$(SILENT_BUILD)$(BLD_CC) -o $@ $(OBJS) $(LFLAGS) $(EXTRA_LIBS_PATH) $(EXTRA_LIBS_NOREC_BEFORE) $(LIBS_START_MARKER) $(EXTRA_LIBS) $(LIBS_END_MARKER) $(EXTRA_LIBS_NOREC_AFTER) $(LIBS)
+ifneq ("$(MOD_POST_BUILD)", "")
+	$(SILENT_BUILD)$(MOD_POST_BUILD)
+endif	
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+	@$(BOLD_PRINT) "done: $(OUT_DIR)/$(MOD_NAME)"
+
+# endif of ifeq  ("$(MOD_TYPE)", "app")
+endif
+
+# For linux_lib we don't build anything. Object files are just added
+# when compiling modules depending on the libs
+ifeq  ("$(MOD_TYPE)", "linux_lib")
+    LINUX_LIB_OBJECTS := $(srcs:%.c=$(SRC_DIR)/%.o)
+
+$(MOD_TARGET): $(SRCS) $(GEN_SRCS) $(MOD_DEPS_FILES)
+	$(SILENT_BUILD)touch $(MOD_TARGET)
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+
+endif
+
+# Default linux_module$(srcs:%=$(SRC_DIR)/%)
+ifeq  ("$(MOD_TYPE)", "linux_module")
+    obj-m    += $(MOD_NAME).o
+    $(MOD_NAME)-objs := $(srcs:%.c=%.o)
+    LIB_OBJS_REL_PATH = $(foreach oo,$(ALL_LIB_OBJS),$(shell python -c "import os.path; print os.path.relpath('$(oo)', '$(SRC_DIR)')"))
+
+    _KERNEL_MAKEPARMS = -C $(KERNELDIR) M=$(SRC_DIR) KBUILD_EXTRA_SYMBOLS="$(KBUILD_EXTRA_SYMBOLS)" \
+    	O=$(KERNEL_OUTDIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) V=$(V) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
+    	obj-m=$(obj-m) $(MOD_NAME)-objs="$($(MOD_NAME)-objs) $(LIB_OBJS_REL_PATH)"
+    KERNEL_MAKEPARMS = $(_KERNEL_MAKEPARMS:%os_abstraction/posix=%os_abstraction/linux)
+
+	# Prevent parallel build    
+.NOTPARALLEL:
+
+    # Only build linux module if not already being built by another make thread.
+    # Otherwise, linux build system get confused
+    # Also, remove -s flag using MAKEFLAGS. Otherwise, linux build system will not print names of the files
+    # being compiled
+$(MOD_TARGET): $(SRCS) $(MOD_DEPS_FILES)
+ifneq  ("$(SRC_DIR)", "$(TOP_DIR)/$(MOD_DIR)")
+	@cp -f $(TOP_DIR)/$(MOD_DIR)/Makefile $(SRC_DIR)
+endif
+	$(SILENT_BUILD)if [ ! -f $(SRC_DIR)/.$(MOD_NAME)_in_progress ]; then \
+		touch $(SRC_DIR)/.$(MOD_NAME)_in_progress; \
+		MAKEFLAGS= $(MAKE) $(KERNEL_MAKEPARMS) ;\
+		if [[ "$$?" != "0" ]]; then \
+			rm -f $(SRC_DIR)/.$(MOD_NAME)_in_progress;\
+			exit -2;\
+		fi; \
+		mkdir -p $(OUT_DIR_BASE)/linux_modules ;\
+		touch -c $(MOD_TARGET) ;\
+		cp $(SRC_DIR)/$(MOD_NAME).ko $(OUT_DIR_BASE)/linux_modules/ ;\
+		touch $(OUT_DIR_BASE)/.$(MOD_NAME) ;\
+		$(BOLD_PRINT) "done: $(MOD_TARGET)" ;\
+		rm -f $(SRC_DIR)/.$(MOD_NAME)_in_progress ;\
+	fi
+
+# Take care of compiling generated code for linux kernel
+ifneq  ("$(SRC_DIR)", "$(TOP_DIR)/$(MOD_DIR)")
+
+$(SRC_DIR)/%.c : $(CODEGEN_OUTPUT_DIR)/../%.c
+	$(SILENT_BUILD)cp -f $(CODEGEN_OUTPUT_DIR)/../*.[c,h] $(SRC_DIR)/
+
+$(SRC_DIR)/%.h : $(CODEGEN_OUTPUT_DIR)/../%.h
+	$(SILENT_BUILD)cp -f $(CODEGEN_OUTPUT_DIR)/../*.[c,h] $(SRC_DIR)/
+
+endif
+
+# End of MOD_TYPE==linux_module
+endif
+
+# else of ifneq  ("$(MOD_CUSTOM)", "y")
+else
+
+# only for MOD_CUSTOM include Module Makefile second time for propagate  
+# custom rules, first time included in Makefile.config for all modules 
+include $(SRC_DIR)/Makefile
+
+# End of ifneq ($(MOD_CUSTOM), y)
+endif
+
+$(OUT_DIR)/%.o: $(SRC_DIR)/%.c $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "CC $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_CC) $(CFLAGS) -D__BASENAME__=`basename $<` -c -o $@ $<
+ifeq (x"$(USE_LINT)", x"yes")
+ifeq (x"$(V)", x"0")
+	@echo "LINT $<"
+endif
+	$(SILENT_BUILD)FORCE_LINT=$(FORCE_LINT) $(MAKE_DEVICE_DIR)/lint.sh $(LINT_FLAGS) $(filter -I% -D%, $(CFLAGS)) $< || { rm $@; false; }
+endif
+ifeq (x"$(USE_CLANG)", x"y")
+ifeq (x"$(V)", x"0")
+	_fn=`basename "$<" .c` ;\
+	eval "_disable_fn_set=\$${DISABLE_CLANG_$$_fn}"; \
+	if test "$$_disable_fn_set" != "y" ; then echo "CLANG $<"; else echo "CLANG $< ... skipped"; fi
+endif
+	_fn=`basename "$<" .c` ;\
+	eval "_disable_fn_set=\$${DISABLE_CLANG_$$_fn}"; \
+	if test "$$_disable_fn_set" != "y" ; then  $(CLANG) $(CLANG_FLAGS) -c $< -o $@.clang && rm -f $@.clang; fi
+# end of ifeq (x"$(USE_CLANG)", x"y")	
+endif	
+
+$(OUT_DIR)/%.o: $(SRC_DIR)/%.s $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "AS $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_AS) $(asFLAGS) -o $@ $<
+
+$(OUT_DIR)/%.o: $(SRC_DIR)/%.S $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "AS $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_CC) $(ASFLAGS) -o $@ $<
+
+
+$(OUT_DIR)/%.d: $(SRC_DIR)/%.c $(SRC_DIR)/Makefile
+ifneq ("$(BUILD_DEPS_IN_CC)", "y")
+ifeq (x"$(V)", x"0")
+	@echo "DP $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_DEP) -MM -MT $(@:.d=.o) $(DEP_FLAGS) $<  > $@ && sed 's,\($*\.o\)[ :]*,\1 $@ : ,g' -i $@
+endif
+
+$(CODEGEN_OUTPUT_DIR)/%.o: $(CODEGEN_OUTPUT_DIR)/%.c $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "CC $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_CC) $(CFLAGS) -D__BASENAME__=`basename $<` -c -o $@ $<
+
+$(CODEGEN_OUTPUT_DIR)/%.d: $(CODEGEN_OUTPUT_DIR)/%.c $(SRC_DIR)/Makefile
+ifneq ("$(BUILD_DEPS_IN_CC)", "y")
+ifeq (x"$(V)", x"0")
+	@echo "DP $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_DEP) -MM -MT $(@:.d=.o) $(DEP_FLAGS) $<  > $@ && sed 's,\($*\.o\)[ :]*,\1 $@ : ,g' -i $@
+endif
+
+ifneq ("$(SKIP_DEPS)", "yes")
+ifneq  ("$(MOD_TYPE)", "linux_module")
+ifneq  ("$(MOD_TYPE)", "linux_lib")
+-include $(OBJS:.o=.d)
+endif
+endif
+endif
+
+BUILD_UNITEST = $(UNITEST)
+ifeq  ("$(OBJS)", "")
+    BUILD_UNITEST = n
+endif    
+
+# Only build unitest if library objects are included
+ifeq  ("$(BUILD_UNITEST)", "y")
+
+unitest: $(OUT_DIR)/unitest
+
+$(OUT_DIR)/unitest: $(OUT_DIR)/unitest.o $(TARGET_LIB_FNAME) $(MOD_DEPS_FILES)
+	$(SILENT_BUILD)$(BLD_CC) -o $@ $(OUT_DIR)/unitest.o $(LFLAGS) $(EXTRA_LIBS_PATH) $(LIBS_START_MARKER) $(EXTRA_LIBS) $(LIBS_END_MARKER) $(LIBS)
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+	@$(BOLD_PRINT) "done: $@"
+
+# else of ifneq  ("$(BUILD_UNITEST)", "y")
+else 
+
+unitest: $(TARGET_LIB_FNAME) $(MOD_DEPS_FILES)
+	
+# endif of ifneq  ("$(BUILD_UNITEST)", "y")
+endif
+
+# Generate sources if necessary
+ifneq  ("$(GEN_SRCS)$(GEN_HDRS)$(GEN_OMCI_SRCS)$(GEN_OMCI_HDRS)$(GEN_OMCI_STACK_SRCS)$(GEN_OMCI_STACK_HDRS)", "")
+
+$(GEN_BAL_SRCS) $(GEN_BAL_HDRS): $(OUT_DIR)/.$(MOD_NAME)_generated_bal
+$(GEN_OMCI_SRCS) $(GEN_OMCI_HDRS): $(OUT_DIR)/.$(MOD_NAME)_generated_omci
+$(GEN_OMCI_STACK_SRCS) $(GEN_OMCI_STACK_HDRS): $(OUT_DIR)/.$(MOD_NAME)_generated_omci_stack
+
+$(OUT_DIR)/.$(MOD_NAME)_generated_bal: $(BAL_MODEL_FILE) $(wildcard $(CODEGEN_DIR)/*) $(wildcard $(CODEGEN_INPUT_DIR)/*)
+	$(call gen_cmd,$(GEN_BAL_SRCS),$(GEN_BAL_HDRS),$(BAL_MODEL_FILE),"bcmbal")
+
+$(OUT_DIR)/.$(MOD_NAME)_generated_omci: $(OMCI_MODEL_FILE) $(wildcard $(CODEGEN_DIR)/*) $(wildcard $(CODEGEN_INPUT_DIR)/*)
+	$(call gen_cmd,$(GEN_OMCI_SRCS),$(GEN_OMCI_HDRS),$(OMCI_MODEL_FILE),"bcmomci")
+
+$(OMCI_STACK_CODEGEN_EXE): $(OMCI_STACK_CODEGEN_INPUT_DIR)/omci_me_codegen.c
+	mkdir -p $(OUT_DIR)
+	$(BLD_CC_HOST) $(EXTRA_CFLAGS) -gdwarf-3 -o $@ $< -I$(TOP_DIR)/src/common/os_abstraction -I$(TOP_DIR)/src/common/os_abstraction/posix -I$(TOP_DIR)/src/common/config -I$(TOP_DIR)/src/core/platform -I$(TOP_DIR)/src/common/include
+
+$(OUT_DIR)/.$(MOD_NAME)_generated_omci_stack: $(OMCI_STACK_MODEL_FILE) $(wildcard $(CODEGEN_DIR)/*) $(wildcard $(CODEGEN_INPUT_DIR)/*) $(OMCI_STACK_CODEGEN_EXE)
+	$(call gen_omci_stack_cmd,$(GEN_OMCI_STACK_SRCS),$(GEN_OMCI_STACK_HDRS),$(OMCI_STACK_MODEL_FILE),"bcm_omci")
+
+define gen_cmd
+	mkdir -p $(CODEGEN_OUTPUT_DIR)
+	echo "Generating code from model: $(notdir $1 $2)"
+	$(MONO_PATH) $(CODEGEN_EXE) --genobjmodel -objset="$3" -style=bal -prefix=$4 \
+   	-templatedir="$(CODEGEN_INPUT_DIR)" -outdir="$(CODEGEN_OUTPUT_DIR)"
+	touch $@ 
+	echo "Code generation complete!"
+endef
+
+define gen_omci_stack_cmd
+	echo "Generating code from model: $(notdir $1 $2)"
+    $(OMCI_STACK_CODEGEN_EXE) $4 $(OUT_DIR) $3 $(addprefix $(OMCI_STACK_CODEGEN_INPUT_DIR)/, $(addsuffix .tmpl, $(notdir $1 $2)))
+    for file in $(GEN_OMCI_STACK_HDRS) $(GEN_OMCI_STACK_SRCS); do \
+        $(TOP_DIR)/tools/copyright_tools/insert_copyright.pl -t c -l $(TOP_DIR)/COPYRIGHT $$file > $$file.tmp; \
+        mv $$file.tmp $$file; \
+    done
+	touch $@ 
+	echo "Code generation complete!"
+endef
+
+# end of ifneq  ("$(GEN_SRCS)$(GEN_HDRS)$(GEN_OMCI_SRCS)$(GEN_OMCI_HDRS)$(GEN_OMCI_STACK_SRCS)$(GEN_OMCI_STACK_HDRS)", "")
+endif
+
+#
+# Dependency rules generation: --> Makefile.config.$(MOD_NAME)
+# 
+
+MOD_CONFIG_FILE = $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+MOD_CONFIG_DEF  = $(MOD_NAME)_DEP_DEFINED
+ifneq ("$(MOD_INC_DIRS)", "")
+    # Make sure that each directory is an absolute path
+    MOD_INCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(MOD_INC_DIRS)))))
+else
+	MOD_INCS = -I$(SRC_DIR)
+    ifneq ("$(GEN_HDRS)", "")
+        MOD_INCS += -I$(CODEGEN_OUTPUT_DIR)
+	endif
+endif
+
+# 
+# Generate Makefile.config.$(MODULE) capable of re-creating the module
+#
+moddep: $(GEN_SRCS) $(GEN_HDRS)
+ifeq (x"$(V)", x"3")
+	@echo "!!!!!  moddep for  MOD_NAME=$(MOD_NAME) MOD_TYPE=$(MOD_TYPE) MOD_CUSTOM=$(MOD_CUSTOM)!!!"
+endif
+	$(SILENT_BUILD)mkdir -p $(OUT_DIR_BASE)
+	@rm -fr $(MOD_CONFIG_FILE)
+	@rm -fr $(OBJS:.o=.d)
+
+	@echo "ifeq (x\"$$""(V)\", x\"2\")"  >> $(MOD_CONFIG_FILE)
+	@echo "    $$""(info !!! MODULE=$$""(MOD_NAME) --> $(MOD_CONFIG_FILE): $(MOD_CONFIG_DEF)=$$""($(MOD_CONFIG_DEF)), DEPS=$(MOD_DEPS))" >> $(MOD_CONFIG_FILE)
+	@echo "endif"  >> $(MOD_CONFIG_FILE)
+
+    # Prevent double inclusion 
+	@echo "ifneq (\"$$""($(MOD_CONFIG_DEF))\", \"y\")" >> $(MOD_CONFIG_FILE)
+	@echo "" >> $(MOD_CONFIG_FILE)
+	@echo "$(MOD_CONFIG_DEF) := y" >> $(MOD_CONFIG_FILE)
+	@echo "export $(MOD_NAME)_DIR := $(SRC_DIR)" >> $(MOD_CONFIG_FILE)
+	@echo "export $(MOD_NAME)_OUT_DIR := $(OUT_DIR)" >> $(MOD_CONFIG_FILE)
+
+    ifeq  ("$(MODULE_IS_A_LIBRARY)", "y")
+		@echo "_skip_it := y" >> $(MOD_CONFIG_FILE)
+    else
+		@echo "_skip_it := n" >> $(MOD_CONFIG_FILE)
+    endif
+	@echo "ifneq (\"$$""(SKIP_LIB_MODULES)\", \"y\")" >> $(MOD_CONFIG_FILE)
+	@echo "    _skip_it := n" >> $(MOD_CONFIG_FILE)
+	@echo "endif" >> $(MOD_CONFIG_FILE)
+
+	@echo "ifneq (\"$$""(_skip_it)\", \"y\")"  >> $(MOD_CONFIG_FILE)
+
+    ifeq  ("$(MODULE_IS_A_LIBRARY)", "y")
+        ifneq ("$(OBJS)", "")
+			@echo "EXTRA_LIBS += $(LIBS_MARKER)$(TARGET_LIB)" >> $(MOD_CONFIG_FILE)
+			@echo "EXTRA_LIBS_PATH += $(LIBS_PATH_MARKER)$(OUT_DIR)" >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_LIBS)", "")
+			@echo "EXTRA_LIBS += $(MOD_LIBS)" >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_LIBS_NOREC_BEFORE)", "")
+			@echo "EXTRA_LIBS_NOREC_BEFORE += $(MOD_LIBS_NOREC_BEFORE)" >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_LIBS_NOREC_AFTER)", "")
+			@echo "EXTRA_LIBS_NOREC_AFTER += $(MOD_LIBS_NOREC_AFTER)" >> $(MOD_CONFIG_FILE)
+        endif
+		@echo "ifneq (x\"$$""(MOD_NAME)\", x\"$(MOD_NAME)\")"  >> $(MOD_CONFIG_FILE)
+		@echo "   MOD_DEPS_FILES += $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+    ifeq  ("$(MOD_TYPE)", "linux_lib")
+        ifneq ("$(OBJS)", "")
+			@echo "ALL_LIB_OBJS += $(LINUX_LIB_OBJECTS)"  >> $(MOD_CONFIG_FILE)
+        endif
+		@echo "ifneq (x\"$$""(MOD_NAME)\", x\"$(MOD_NAME)\")"  >> $(MOD_CONFIG_FILE)
+		@echo "   MOD_DEPS_FILES += $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+    ifeq  ("$(MOD_TYPE)", "linux_module")
+		@echo "ifneq (x\"$$""(MOD_NAME)\", x\"$(MOD_NAME)\")"  >> $(MOD_CONFIG_FILE)
+			@echo "   KBUILD_EXTRA_SYMBOLS += $(SRC_DIR)/Module.symvers" >> $(MOD_CONFIG_FILE)
+			@echo "   MOD_DEPS_FILES += $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+    # Module creation rules
+	@echo "$(MOD_NAME)_$(SUBSYSTEM): $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+	@echo ""  >> $(MOD_CONFIG_FILE)
+	@echo "$(OUT_DIR_BASE)/.$(MOD_NAME): .FORCE"   >> $(MOD_CONFIG_FILE)
+    ifeq  ("$(MOD_CUSTOM)", "y")
+		@echo "		$$""(MAKE) MOD_DIR=$(MOD_DIR) -f $(MAKE_DIR)/Makefile.template $(MOD_TARGET)" >> $(MOD_CONFIG_FILE)
+    else
+    ifneq  ("$(OBJS)", "")
+		@echo "		$$""(MAKE) MOD_DIR=$(MOD_DIR) -f $(MAKE_DIR)/Makefile.template $(MOD_TARGET)" >> $(MOD_CONFIG_FILE)
+    endif
+    ifeq  ("$(OBJS)", "")
+		@echo "		if [ ! -f $(OUT_DIR_BASE)/.$(MOD_NAME) ]; then touch $(OUT_DIR_BASE)/.$(MOD_NAME); fi" >> $(MOD_CONFIG_FILE)
+    endif
+    endif
+	@echo ""  >> $(MOD_CONFIG_FILE)
+	@echo ".FORCE:"   >> $(MOD_CONFIG_FILE)
+	@echo ""  >> $(MOD_CONFIG_FILE)
+
+    ifneq ("$(MOD_DEFS)", "")
+		@echo "EXTRA_CFLAGS += $(MOD_DEFS)" >> $(MOD_CONFIG_FILE)
+    endif
+	
+	@echo "endif"  >> $(MOD_CONFIG_FILE)
+
+    # If it is a library and this file is included as someone's dependency - extend MOD_DEP_FULL_NAMES
+    # and generate a rule to rebuilt the library
+    ifneq ("$(MOD_DEPS)$(MOD_DEPS_OPT)", "")
+		@echo "ifeq (x\"$$""(V)\", x\"2\")"  >> $(MOD_CONFIG_FILE)
+		@echo "   $$""(info !!! Now include dependencies $(MOD_DEPS) $(MOD_DEPS_OPT)" >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+        ifneq ("$(MOD_DEPS)", "")
+		@echo "$(MOD_NAME)_MOD_DEPS = $(MOD_DEPS)" >> $(MOD_CONFIG_FILE)
+		@echo "ifneq (x\"$$""(SKIP_DEPS)\", x\"yes\")"  >> $(MOD_CONFIG_FILE)
+		@echo "include $$""($(MOD_NAME)_MOD_DEPS:%=$(OUT_DIR_BASE)/Makefile.config.%)" >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_DEPS_OPT)", "")
+		@echo "$(MOD_NAME)_MOD_DEPS_OPT = $(MOD_DEPS_OPT)" >> $(MOD_CONFIG_FILE)
+		@echo "ifneq (x\"$$""(SKIP_DEPS)\", x\"yes\")"  >> $(MOD_CONFIG_FILE)
+		@echo "-include $$""($(MOD_NAME)_MOD_DEPS_OPT:%=$(OUT_DIR_BASE)/Makefile.config.%)" >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+        endif
+	@echo "ifeq (x\"$$""(V)\", x\"2\")"  >> $(MOD_CONFIG_FILE)
+	@echo "   $$""(info !!! $(MOD_NAME) finished including dependencies)" >> $(MOD_CONFIG_FILE)
+	@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+	@echo "EXTRA_CFLAGS += $(MOD_INCS)" >> $(MOD_CONFIG_FILE)
+	@echo "" >> $(MOD_CONFIG_FILE)
+	@echo "endif" >> $(MOD_CONFIG_FILE)
+# 
+# end of moddep: target
+#
+
+clean_module::
+ifeq  ("$(MOD_TYPE)", "linux_module")
+	$(SILENT_BUILD)-test -f $(SRC_DIR)/Makefile && $(MAKE) $(KERNEL_MAKEPARMS) clean
+	$(SILENT_BUILD)cd $(SRC_DIR) && rm -fr $($(MOD_NAME)-objs) $($(MOD_NAME)-objs:../%=../.%.cmd)
+	$(SILENT_BUILD)rm -fr $(OUT_DIR_BASE)/linux_modules/$(MOD_NAME).ko
+endif
+ifeq  ("$(MOD_TYPE)", "linux_lib")
+	$(SILENT_BUILD)rm -fr $(LINUX_LIB_OBJECTS)
+endif	
+	$(SILENT_BUILD)cd $(SRC_DIR) && rm -fr $(patsubst %.c,.%.o.cmd,$(srcs))
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '*.[o,d,a]' -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '*~'        -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '*.ko'      -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '.*.cmd'    -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)rm -fr $(SRC_DIR)/*.mod.c $(SRC_DIR)/modules.order $(SRC_DIR)/Module.symvers $(SRC_DIR)/.tmp_versions
+	$(SILENT_BUILD)rm -fr $(MOD_TARGET) $(OUT_DIR)/$(TARGET) $(OUT_DIR)/unitest $(TARGET_LIB_FNAME)
+	$(SILENT_BUILD)rm -fr $(ALL_LIB_OBJS)
+	$(SILENT_BUILD)rm -fr $(GEN_SRCS) $(GEN_HDRS) $(OUT_DIR)/.$(MOD_NAME)_generated_*
+ifneq ("$(MOD_NAME)", "")
+	$(SILENT_BUILD)rm -fr $(OUT_DIR_BASE)/.$(MOD_NAME)
+	$(SILENT_BUILD)rm -fr $(SRC_DIR)/.$(MOD_NAME)_in_progress
+endif	
+    
+clobber: clean_module
+	$(SILENT_BUILD)rm -fr $(OUT_DIR)
+
+# Optional subsystem-specific rules
+-include mk/$(SUBSYSTEM)/Makefile.$(SUBSYSTEM).rules
+
+# Generate board-specific environment if any
+board_env: $(BOARD_ENV_RULE)
+
+module_name:
+	$(info $(MOD_NAME))
diff --git a/bal_release/mk/Makefile.template b/bal_release/mk/Makefile.template
new file mode 100644
index 0000000..633e962
--- /dev/null
+++ b/bal_release/mk/Makefile.template
@@ -0,0 +1,12 @@
+# Central Makefile template
+# Builds specific module
+# Input parameters:
+# MOD_DIR
+# TOP_DIR
+
+ifeq (x"$(V)", x"1")
+    $(info Building module $(MOD_DIR))
+endif
+
+include $(MAKE_DIR)/Makefile.config
+include $(MAKE_DIR)/Makefile.rules
diff --git a/bal_release/mk/agent/modules.agent.bal b/bal_release/mk/agent/modules.agent.bal
new file mode 100644
index 0000000..5dca4f6
--- /dev/null
+++ b/bal_release/mk/agent/modules.agent.bal
@@ -0,0 +1,24 @@
+3rdparty/bcm-sdk
+3rdparty/linenoise
+src/common/bal_app_utils
+src/common/cli
+src/common/dev_log
+src/common/include
+3rdparty/maple
+src/common/os_abstraction
+src/common/os_abstraction/os_cli
+src/common/utils
+src/core/main
+src/core/util/mac
+src/core/util/switch
+src/core/util/switch/dpp
+src/core/util/switch/esw
+src/lib/libbalapi
+src/lib/libbalapicli
+src/lib/libobjmsg
+src/lib/libomcisvc
+src/lib/librscmgr
+src/lib/libtopology
+src/lib/libutils
+src/lib/libcmdline
+
diff --git a/bal_release/mk/bin_release.sh b/bal_release/mk/bin_release.sh
new file mode 100755
index 0000000..8bd0294
--- /dev/null
+++ b/bal_release/mk/bin_release.sh
@@ -0,0 +1,94 @@
+#!/bin/bash
+###############################################################################
+#
+#  <:copyright-BRCM:2016:proprietary:standard
+#   
+#     Broadcom Ltd. Proprietary and Confidential.(c) 2016 Broadcom Ltd.
+#     All Rights Reserved
+#   
+#  This program is the proprietary software of Broadcom Ltd. and/or its
+#  licensors, and may only be used, duplicated, modified or distributed pursuant
+#  to the terms and conditions of a separate, written license agreement executed
+#  between you and Broadcom Ltd. (an "Authorized License").  Except as set forth in
+#  an Authorized License, Broadcom Ltd. grants no license (express or implied), right
+#  to use, or waiver of any kind with respect to the Software, and Broadcom Ltd.
+#  expressly reserves all rights in and to the Software and all intellectual
+#  property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
+#  NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
+#  BROADCOM LTD AND DISCONTINUE ALL USE OF THE SOFTWARE.
+#   
+#  Except as expressly set forth in the Authorized License,
+#   
+#  1. This program, including its structure, sequence and organization,
+#      constitutes the valuable trade secrets of Broadcom Ltd., and you shall use
+#      all reasonable efforts to protect the confidentiality thereof, and to
+#      use this information only in connection with your use of Broadcom Ltd.
+#      integrated circuit products.
+#   
+#  2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
+#      AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
+#      WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
+#      RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND
+#      ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
+#      FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
+#      COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
+#      TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
+#      PERFORMANCE OF THE SOFTWARE.
+#   
+#  3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
+#      ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
+#      INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
+#      WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
+#      IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
+#      OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
+#      SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
+#      SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
+#      LIMITED REMEDY.
+#  :>
+#
+###############################################################################
+
+# This script is called from the main Makefile.
+# Prerequisites:
+# 1. BAL standalone or ofpal_of_agent binaries are built.
+# 2. Environment variables defined:
+#    - BUILD_TARGET : bal_of_agent / bal_core
+#    - BIN_RELEASE_FILE_PREFIX  : binary release file prefix
+
+if [[ "$BIN_RELEASE_FILE_PREFIX" == "" ]]; then
+   echo BIN_RELEASE_FILE_PREFIX variable must be set
+   exit -1
+fi
+
+TMP_DIR=/tmp/bal_bin_release/`date +%d_%m_%Y_%H_%M_%S`
+BIN_RELEASE_FILE=$BIN_RELEASE_FILE_PREFIX.tar.gz
+BIN_RELEASE_DIR=$TMP_DIR/$BIN_RELEASE_FILE_PREFIX
+
+mkdir -p $BIN_RELEASE_DIR
+
+if [[ "$BUILD_TARGET" == "core" ]]; then
+    echo Generating BAL Release Archive $BIN_RELEASE_FILE
+    cp build/core/src/core/main/bal_core $BIN_RELEASE_DIR/
+elif [[ "$BUILD_TARGET" == "agent" ]]; then
+    echo Generating OF Agent Release Archive $BIN_RELEASE_FILE
+    cp build/agent/3rdparty/indigo/ofpal_of_agent $BIN_RELEASE_DIR/bcm_sdn_agent
+# The following are relevant only when BUILD_NC_AGENT=y, so they might not exist
+    if test -e build/agent/start_sdn_agent.sh; then cp build/agent/start_sdn_agent.sh $BIN_RELEASE_DIR; fi
+    if test -e build/agent/lib; then cp -ar build/agent/lib $BIN_RELEASE_DIR; fi
+    if test -e build/agent/bin; then cp -ar build/agent/bin $BIN_RELEASE_DIR; fi
+    if test -e build/agent/modules; then cp -ar build/agent/modules $BIN_RELEASE_DIR; fi
+    if test -e /usr/lib/libssl.so.10; then cp -ar /usr/lib/libssl.so.10 $BIN_RELEASE_DIR; fi
+    if test -e /usr/lib/libcrypto.so.10; then cp -ar /usr/lib/libcrypto.so.10 $BIN_RELEASE_DIR; fi
+else
+    echo BUILD_TARGET has unexpected value \"$BUILD_TARGET\". Must be \"core\" or \"agent\"
+    exit -1
+fi
+
+cp scripts/bal_autostart.ini $BIN_RELEASE_DIR/
+cp scripts/bal_config.ini $BIN_RELEASE_DIR/
+cp 3rdparty/bcm-sdk/rc/bal/rpc.soc.template $BIN_RELEASE_DIR
+
+cd $TMP_DIR
+tar -czf $BIN_RELEASE_FILE $BIN_RELEASE_FILE_PREFIX
+echo ./$BIN_RELEASE_FILE created
+
diff --git a/bal_release/mk/boards/wrx/board.config b/bal_release/mk/boards/wrx/board.config
new file mode 100644
index 0000000..9ca4ae0
--- /dev/null
+++ b/bal_release/mk/boards/wrx/board.config
@@ -0,0 +1,49 @@
+# WRX board
+#
+
+export CONFIG_MAC_RPC ?= n
+export CONFIG_SWITCH_RPC ?= n
+
+# Kernel tree and toolchain
+BOARD_DIR       ?= $(TOP_DIR)/../boards/cur/$(BOARD)
+KERNEL_BRCM_VER = 3.0.2-m1.01
+TOOLCHAIN_PATH  ?= /opt/toolchains/maple/toolchains_bin/mipscross/linux/bin
+CROSS_COMPILE   = $(TOOLCHAIN_PATH)/mips64-nlm-linux-
+CROSS_LIB_PATH  = $(TOOLCHAIN_PATH)/../mips64-nlm-linux/lib64
+CONFIGURE_TARGET  = mips64-nlm-linux
+export TOOLCHAIN_PATH
+export CROSS_COMPILE
+export CONFIGURE_TARGET
+
+# In the moment we don't plan to build any kernel modules
+# if/when we do set OD_KERNEL=linux
+export OS_KERNEL= posix
+
+# OS for user space 
+OS              = posix
+
+# The following group is only needed if we decide that do need linux kernel modules
+# In this case OS_KERNEL above must be set =linux and a few additions are needed in the source tree   
+KERNELDIR       = $(BOARD_DIR)/linux/$(KERNEL_BRCM_VER)/linux
+KERNEL_OUTDIR  ?= $(KERNELDIR)
+export KERNELDIR
+export KERNEL_OUTDIR
+KERNEL_ARCH     = mips
+ARCH_FLAGS      += -EB -mabi=64
+LD_ARCH_FLAGS += -melf64btsmip
+HOST_BIG_ENDIAN ?= y
+
+export KERNEL_ARCH
+export ARCH_FLAGS
+
+export KERNEL_TAR_NAME  = wrx_linux-sdk.tar.bz2
+export LIBS_TAR_NAME    = libraries.tar.bz2
+
+
+ifeq ("$(SUBSYSTEM)", "core")
+	# Core-specific stuff
+endif	
+
+ifeq ("$(SUBSYSTEM)", "apps")
+    # Apps-specific stuff
+endif
diff --git a/bal_release/mk/clang.opts b/bal_release/mk/clang.opts
new file mode 100644
index 0000000..1b383ef
--- /dev/null
+++ b/bal_release/mk/clang.opts
@@ -0,0 +1,6 @@
+# CLANG options
+
+# CLANG tool
+export CLANG ?= clang
+export CLANG_OPTS = -Wno-unused-function
+export LLVMVER ?= 3.6
diff --git a/bal_release/mk/config.lnt b/bal_release/mk/config.lnt
new file mode 100644
index 0000000..1540792
--- /dev/null
+++ b/bal_release/mk/config.lnt
@@ -0,0 +1,104 @@
+-i/tools/arm/DS-5_5.18.0/Linux-64/include 
+-wlib(0) // no complaints for libs 
+-b 
+-u 
+-v 
+-A(C99)
+-cgnu
+-d__GNUC__
+-d__FUNCTION__="FUNC"
+-fhs
++dBCMOS_TRUE=((bcmos_bool)1)
++dBCMOS_FALSE=((bcmos_bool)0)
+-strong(AzcXJzc)
+-strong(AXJb,bcmos_bool)
+-strong(, uint64_t)
+-strong(, uint32_t)
+-strong(, uint16_t)
+-strong(, uint8_t)
+-strong(, int64_t)
+-strong(, int32_t)
+-strong(, int16_t)
+-strong(, int8_t)
+-strong(, ULONG)
+-strong(, size_t)
+-sem( bcmos_fastlock_lock, thread_lock )
+-sem( bcmos_fastlock_unlock, thread_unlock )
+-sem( bcmos_sem_wait, thread_lock )
+-sem( bcmos_sem_post, thread_unlock )
+-sem( bcmos_mutex_lock, thread_lock )
+-sem( bcmos_mutex_unlock, thread_unlock )
+-function( free, bcmos_blk_pool_free )
+-function( malloc(0), bcmos_blk_pool_alloc(0) )
+-function( calloc(0), bcmos_blk_pool_calloc(0) )
+-function( malloc(0), bcmos_byte_pool_alloc(0) )
+-function( malloc(1), bcmos_byte_pool_alloc(2) )
+-function( free, bcmos_byte_pool_free )
+-function( malloc(r), bcmos_blk_pool_alloc(r) )
+-function( calloc(r), bcmos_blk_pool_calloc(r) )
+-function( malloc(r), bcmos_byte_pool_alloc(r) )
+-function( malloc, bcmos_alloc )
+-function( calloc, bcmos_calloc )
+-function( free, bcmos_free )
+-function( malloc(0), bcmdb_set_lock_read(0) )
+-function( free(0), bcmdb_set_unlock_read(0) )
+-function( malloc(0), bcmdb_set_lock_modify(0) )
+-function( free(0), bcmdb_set_unlock_modify(0) )
+-function( malloc(0), bcmdb_record_getraw_read(0) )
+-function( free(0), bcmdb_record_unlock_read(0) )
+-function( malloc(0), bcmdb_record_getraw_write(0) )
+-function( free(0), bcmdb_record_unlock_write(0) )
+-e*
++e64
++e408 
++e413 
++e414 
++e415 
++e416 
++e419 
++e420 
++e423 
++e424 
++e428 
++e429 
++e433 
++e438 
++e449 
++e454 
++e455 
++e530 
++e547 
++e549 
++e587 
++e588 
++e589 
++e590 
++e603 
++e604 
++e632 
++e633 
++e634 
++e635 
++e636 
++e637 
++e638 
++e639 
++e640 
++e644 
++e652 
++e674 
++e684 
++e685 
++e727 
++e733 
++e789 
++e810 
++e957
+
++doffsetof(__typ,__id)=((size_t)&(((__typ*)0)->__id))
++d__attribute__(...)=
+
+// this is repeated because each invocation doubles the size of macro storage
++macros +macros +macros +macros
++macros +macros +macros +macros
+-passes(2)
diff --git a/bal_release/mk/core/Makefile.core.config b/bal_release/mk/core/Makefile.core.config
new file mode 100644
index 0000000..8ac4117
--- /dev/null
+++ b/bal_release/mk/core/Makefile.core.config
@@ -0,0 +1,19 @@
+# BAL core configuration
+#
+# Set environment, extra flags, etc.
+# In particular, set CROSS_COMPILE
+# For linux environment make sure to set also OS_KERNEL=linux, KERNELDIR, KERNEL_OUTDIR and KERNEL_ARCH
+ifneq ("$(BOARD)", "")
+    include mk/boards/$(BOARD)/board.config
+	-include mk/boards/$(BOARD)/$(TOOLCHAIN).opts
+endif
+
+include mk/$(TOOLCHAIN).opts
+
+export KERNELDIR
+export KERNEL_OUTDIR
+export KERNEL_ARCH
+export OS_KERNEL
+
+BUILD_OF_AGENT := n
+BUILD_NC_AGENT := n
diff --git a/bal_release/mk/core/Makefile.core.rules b/bal_release/mk/core/Makefile.core.rules
new file mode 100644
index 0000000..c00678b
--- /dev/null
+++ b/bal_release/mk/core/Makefile.core.rules
@@ -0,0 +1,7 @@
+# BAL core-specific rules
+#
+# Platform/board-specific rules
+# In particular, set BOARD_ENV_RULE if there is anything board-specific to be done
+ifneq ("$(BOARD)", "")
+    -include mk/boards/$(BOARD)/board.rules
+endif
diff --git a/bal_release/mk/core/modules.core.bal b/bal_release/mk/core/modules.core.bal
new file mode 100644
index 0000000..44b64c3
--- /dev/null
+++ b/bal_release/mk/core/modules.core.bal
@@ -0,0 +1,23 @@
+3rdparty/bcm-sdk
+3rdparty/linenoise
+src/common/bal_app_utils
+src/common/cli
+src/common/dev_log
+src/common/include
+3rdparty/maple
+src/common/os_abstraction
+src/common/os_abstraction/os_cli
+src/common/utils
+src/core/main
+src/core/util/mac
+src/core/util/switch
+src/core/util/switch/dpp
+src/core/util/switch/esw
+src/lib/libbalapi
+src/lib/libbalapicli
+src/lib/libobjmsg
+src/lib/librscmgr
+src/lib/libtopology
+src/lib/libutils
+src/lib/libcmdline
+src/apps/bal_cli
diff --git a/bal_release/mk/create_artifacts.sh b/bal_release/mk/create_artifacts.sh
new file mode 100755
index 0000000..193f1dc
--- /dev/null
+++ b/bal_release/mk/create_artifacts.sh
@@ -0,0 +1,100 @@
+#!/bin/bash
+#set -x
+
+# Copy config script. Look in the BAL directory first. If not found, take from the scripts
+function copy_config_script {
+	if test -n "$2"; then
+		template_dir=$2
+	else
+		template_dir=$bal_dir/scripts
+	fi
+	if [ -f $bal_dir/$1 ]; then
+	   cp -a $bal_dir/$1 $target_dir/
+	else
+	   cp -a $template_dir/$1 $target_dir/
+	fi
+}
+
+bal_dir=`pwd`
+
+# Copy and strip bcm_sdn_agent
+if [ "$BUILD_OF_AGENT" = "y" ]; then
+	target_dir=bcm_sdn_agent_artifacts
+	target_exec=bcm_sdn_agent
+	target_name=bcm_sdn_agent
+	build_dir=build/agent
+else
+	target_dir=bcm_bal_artifacts
+	target_name=bal_cli
+	target_exec=src/apps/bal_cli/bal_cli
+	build_dir=build/core
+fi
+
+cd $build_dir
+echo "Creating $target_name build artifacts in `pwd`/$target_dir"
+rm -fr $target_dir
+mkdir -p $target_dir
+
+echo "Stripping $target_name and extracting debug symbols"
+${CROSS_COMPILE}objcopy --strip-debug --strip-unneeded $target_exec $target_dir/$target_name
+${CROSS_COMPILE}objcopy --only-keep-debug $target_exec $target_name.debug
+${CROSS_COMPILE}objcopy --add-gnu-debuglink=$target_name.debug $target_dir/$target_name
+echo "Stripping complete"
+
+if [ "$JENKINS_BUILD" == "y" ]; then
+	cp $bal_dir/../../../build_info.log build_info.log
+	tar -czf $target_name.debug.tar.gz $target_name.debug build_info.log
+	rm build_info.log
+else
+	tar -czf $target_name.debug.tar.gz $target_name.debug
+fi
+
+# Copy init scripts. Look in the BAL directory first. If not found, take from the scripts
+copy_config_script bal_config.ini
+copy_config_script bal_autostart.ini
+copy_config_script bal_topology.ini
+# Rename the bal_topology.ini file to avoid bringup issues
+mv $target_dir/bal_topology.ini $target_dir/bal_topology.ini.sample
+copy_config_script rpc.soc.template $bal_dir/3rdparty/bcm-sdk/rc/bal
+cp -ar ../../3rdparty/bcm-sdk/rc $target_dir/switch_rc
+rm -fr $target_dir/switch_rc/arad $target_dir/switch_rc/kt2
+
+if [ "$BUILD_NC_AGENT" = "y" ]; then
+    cp -ar lib $target_dir/
+    # for SDN-PAL running on x86, copy the libssl and libcrypto
+    if [ "$BOARD" = "" ]; then
+        echo "Copying libcrypto and libssl for x86 target"
+        cp /usr/lib/libssl.so.10 /usr/lib/libcrypto.so.10 $target_dir/lib/
+    fi
+    cp -ar modules $target_dir/
+    cp -a start_sdn_agent.sh $target_dir/
+    cp -a start_netopeer_cli.sh $target_dir/
+    cp -a bin/netopeer-cli $target_dir/
+fi
+
+if [ "$BOARD" = "wrx" ]; then
+    echo "Copying SVK4 specific scripts and files"
+    copy_config_script bal_setup_svk4.sh
+    echo 'if [ "${PWD}" != "/broadcom" ]; then echo "ERROR: Your archive file must be expanded into /broadcom before running this script"; else if [ -d /etc/rcS.d ]; then echo "Installing bal startup script in /etc/rcS.d" && pushd /etc/rcS.d >/dev/null && rm -f S99balsetup && ln -s /broadcom/bal_setup_svk4.sh S99balsetup && popd >/dev/null && echo "Installing svk4 scripts" && cp -f switch_rc/svk4/* . && touch /etc/svk4 && cat bal_config.ini | sed s/"of_devs=1"/"of_devs=2"/g > bal_config.ini.svk4_devs && cat bal_config.ini.svk4_devs | sed s/"num_nni_ports=1"/"num_nni_ports=6"/g > bal_config.ini.svk4_devs_nni && cat bal_config.ini.svk4_devs_nni | sed s/"maptable=3"/"maptable=4"/g > bal_config.ini && rm -f bal_config.ini.svk4_devs && rm -f bal_config.ini.svk4_devs_nni; fi; fi' > svk4_install.sh
+    chmod 755 svk4_install.sh
+    cp svk4_install.sh $target_dir
+    echo "Please run svk4_install.sh (only on SVK4 hardware!)" > README.svk4
+    cp ../../3rdparty/maple/sdk/build/fs/svk_init_startup.sh $target_dir/
+    if [ "$JENKINS_BUILD" == "y" ]; then
+        cp ../../3rdparty/bcm-sdk/build-wrx/sdk-all-*/build/projects/xPON_OLT/jenkins/jobs/Bal.Synced.bcm-sdk-*.Wrx/workspace/bal/cur/3rdparty/bcm-sdk/linux-*-bde.ko $target_dir/
+    fi
+    cp README.svk4 $target_dir/ && rm README.svk4
+fi
+
+if [ "$JENKINS_BUILD" == "y" ]; then
+    echo "Including build_info.log in the archive"
+    cp $bal_dir/../../../build_info.log $target_dir/
+fi
+
+archive=$target_dir.tar.gz
+echo "Archiving artifacts in `pwd`/$archive"
+tar -czf $archive $target_dir
+echo "Archive contains:"
+tar tzvf $archive
+
+
diff --git a/bal_release/mk/gcc.opts b/bal_release/mk/gcc.opts
new file mode 100644
index 0000000..ccdcf32
--- /dev/null
+++ b/bal_release/mk/gcc.opts
@@ -0,0 +1,56 @@
+EXTRA_CFLAGS    += -Wall -Werror
+ARFLAGS = r
+
+BLD_CC_HOST = $(CCACHE) gcc
+BLD_CC = $(CCACHE) $(CROSS_COMPILE)gcc
+BLD_AS = $(CCACHE) $(CROSS_COMPILE)gcc
+BLD_AR = $(CROSS_COMPILE)ar
+BLD_DEP = $(BLD_CC)
+
+# Maple SDK requires C99
+CFLAGS    += -std=c99
+ifeq ("$(ENABLE_EXTRA_WARNINGS)", "y")
+    CFLAGS    += -Wextra -Wbad-function-cast -Wcast-align -Wcast-qual -Wchar-subscripts
+    CFLAGS    += -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wredundant-decls
+    CFLAGS    += -Wstrict-prototypes -Wparentheses -Wswitch -Wswitch-default -Wunused -Wuninitialized -Wunused-but-set-variable
+    CFLAGS    += -Wno-unused-parameter -Wno-missing-field-initializers -Wno-sign-compare
+    CFLAGS    += -Wshadow -Wno-inline
+endif
+
+BUILD_DEPS_IN_CC    ?= y
+export BUILD_DEPS_IN_CC
+
+ifeq ("$(BUILD_DEPS_IN_CC)", "y")
+    CFLAGS += -MMD -MP
+endif
+
+ifeq ("$(CROSS_COMPILE)", "")
+    ARCH_FLAGS += -m32 -march=i386
+    LD_ARCH_FLAGS += -m elf_i386 --oformat=elf32-i386
+    SIMULATION_BUILD ?= y
+    export SIMULATION_BUILD
+    GCCVER ?= 4.8.1
+    export GCCVER
+    # Temporary, until bad cast in bcm_dev_log_task.c is fixed (SWMAPLE-2123)
+    CFLAGS += -Wno-strict-aliasing
+    CONFIGURE_TARGET ?= i586-linux-gnu
+endif
+
+ifeq ("$(EXPORT_DYNAMIC_SYMBOLS)", "y")
+    ARCH_FLAGS += -Wl,-export-dynamic
+endif
+
+ifneq ("$(SIMULATION_BUILD)", "y")
+    EXTRA_CFLAGS    += -Wframe-larger-than=16384
+endif
+
+LIBS_MARKER =-l
+LIBS_PATH_MARKER =-L
+LIBS_START_MARKER = -Wl,--start-group
+LIBS_END_MARKER = -Wl,--end-group
+
+# Debug and release optimization options. Can be overwritten in Makefile.config.$(PLATFORM)
+DEBUG_O_CFLAGS      ?= -g -gdwarf-3 -O0
+DEBUG_O_LFLAGS      ?= -g
+RELEASE_O_CFLAGS    ?= -g -gdwarf-3 -O0
+RELEASE_O_LFLAGS    ?= -g
diff --git a/bal_release/mk/lint.sh b/bal_release/mk/lint.sh
new file mode 100755
index 0000000..9b89478
--- /dev/null
+++ b/bal_release/mk/lint.sh
@@ -0,0 +1,59 @@
+#!/bin/bash
+###############################################################################
+#
+#  <:copyright-BRCM:2016:proprietary:standard
+#   
+#     Broadcom Ltd. Proprietary and Confidential.(c) 2016 Broadcom Ltd.
+#     All Rights Reserved
+#   
+#  This program is the proprietary software of Broadcom Ltd. and/or its
+#  licensors, and may only be used, duplicated, modified or distributed pursuant
+#  to the terms and conditions of a separate, written license agreement executed
+#  between you and Broadcom Ltd. (an "Authorized License").  Except as set forth in
+#  an Authorized License, Broadcom Ltd. grants no license (express or implied), right
+#  to use, or waiver of any kind with respect to the Software, and Broadcom Ltd.
+#  expressly reserves all rights in and to the Software and all intellectual
+#  property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
+#  NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
+#  BROADCOM LTD AND DISCONTINUE ALL USE OF THE SOFTWARE.
+#   
+#  Except as expressly set forth in the Authorized License,
+#   
+#  1. This program, including its structure, sequence and organization,
+#      constitutes the valuable trade secrets of Broadcom Ltd., and you shall use
+#      all reasonable efforts to protect the confidentiality thereof, and to
+#      use this information only in connection with your use of Broadcom Ltd.
+#      integrated circuit products.
+#   
+#  2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
+#      AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
+#      WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
+#      RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND
+#      ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
+#      FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
+#      COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
+#      TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
+#      PERFORMANCE OF THE SOFTWARE.
+#   
+#  3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
+#      ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
+#      INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
+#      WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
+#      IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
+#      OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
+#      SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
+#      SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
+#      LIMITED REMEDY.
+#  :>
+#
+###############################################################################
+LINT=/projects/xpon_co_lint/bin/flint
+if [ -e $LINT ]; then 
+if [ -w "${@: -1}" ]; then 
+	$LINT $*
+else
+	echo "Skipping non-writable file ${@: -1}"
+fi
+else
+	echo "ERROR: lint executable $LINT doesn't exist"
+fi
diff --git a/bal_release/mk/src_release.sh b/bal_release/mk/src_release.sh
new file mode 100755
index 0000000..0db73d8
--- /dev/null
+++ b/bal_release/mk/src_release.sh
@@ -0,0 +1,296 @@
+#!/bin/bash
+###############################################################################
+#
+#  <:copyright-BRCM:2016:proprietary:standard
+#
+#     Broadcom Ltd. Proprietary and Confidential.(c) 2016 Broadcom Ltd.
+#     All Rights Reserved
+#
+#  This program is the proprietary software of Broadcom Ltd. and/or its
+#  licensors, and may only be used, duplicated, modified or distributed pursuant
+#  to the terms and conditions of a separate, written license agreement executed
+#  between you and Broadcom Ltd. (an "Authorized License").  Except as set forth in
+#  an Authorized License, Broadcom Ltd. grants no license (express or implied), right
+#  to use, or waiver of any kind with respect to the Software, and Broadcom Ltd.
+#  expressly reserves all rights in and to the Software and all intellectual
+#  property rights therein.  IF YOU HAVE NO AUTHORIZED LICENSE, THEN YOU HAVE
+#  NO RIGHT TO USE THIS SOFTWARE IN ANY WAY, AND SHOULD IMMEDIATELY NOTIFY
+#  BROADCOM LTD AND DISCONTINUE ALL USE OF THE SOFTWARE.
+#
+#  Except as expressly set forth in the Authorized License,
+#
+#  1. This program, including its structure, sequence and organization,
+#      constitutes the valuable trade secrets of Broadcom Ltd., and you shall use
+#      all reasonable efforts to protect the confidentiality thereof, and to
+#      use this information only in connection with your use of Broadcom Ltd.
+#      integrated circuit products.
+#
+#  2. TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
+#      AND WITH ALL FAULTS AND BROADCOM MAKES NO PROMISES, REPRESENTATIONS OR
+#      WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
+#      RESPECT TO THE SOFTWARE.  BROADCOM SPECIFICALLY DISCLAIMS ANY AND
+#      ALL IMPLIED WARRANTIES OF TITLE, MERCHANTABILITY, NONINFRINGEMENT,
+#      FITNESS FOR A PARTICULAR PURPOSE, LACK OF VIRUSES, ACCURACY OR
+#      COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR CORRESPONDENCE
+#      TO DESCRIPTION. YOU ASSUME THE ENTIRE RISK ARISING OUT OF USE OR
+#      PERFORMANCE OF THE SOFTWARE.
+#
+#  3. TO THE MAXIMUM EXTENT PERMITTED BY LAW, IN NO EVENT SHALL BROADCOM OR
+#      ITS LICENSORS BE LIABLE FOR (i) CONSEQUENTIAL, INCIDENTAL, SPECIAL,
+#      INDIRECT, OR EXEMPLARY DAMAGES WHATSOEVER ARISING OUT OF OR IN ANY
+#      WAY RELATING TO YOUR USE OF OR INABILITY TO USE THE SOFTWARE EVEN
+#      IF BROADCOM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES;
+#      OR (ii) ANY AMOUNT IN EXCESS OF THE AMOUNT ACTUALLY PAID FOR THE
+#      SOFTWARE ITSELF OR U.S. $1, WHICHEVER IS GREATER. THESE LIMITATIONS
+#      SHALL APPLY NOTWITHSTANDING ANY FAILURE OF ESSENTIAL PURPOSE OF ANY
+#      LIMITED REMEDY.
+#  :>
+#
+###############################################################################
+
+# This script is called from the main Makefile.
+# Prerequisites:
+# 1. BAL standalone or ofpal_of_agent binaries are built.
+# 2. Environment variables defined:
+#    - SRC_RELEASE_FILE_PREFIX : source release file prefix (string)
+#    - INCLUDE_MAPLE_SDK_RELEASE : include maple SDK release (if set, then Maple SDK release is included, and its zip actually contains BAL's code, without OMCI and SDN-PAL).
+
+if [[ "$SRC_RELEASE_FILE_PREFIX" == "" ]]; then
+   echo SRC_RELEASE_FILE_PREFIX variable must be set
+   exit -1
+fi
+
+TMP_DIR=/tmp/bal_src_release/`date +%d_%m_%Y_%H_%M_%S`
+
+BAL_RELEASE_PREFIX=bal.$SRC_RELEASE_FILE_PREFIX
+SDN_PAL_RELEASE_PREFIX=sdn_pal.$SRC_RELEASE_FILE_PREFIX
+OMCI_RELEASE_PREFIX=omci.$SRC_RELEASE_FILE_PREFIX
+
+BAL_RELEASE_DIR=$TMP_DIR/bal/$SRC_RELEASE_FILE_PREFIX
+SDN_PAL_RELEASE_DIR=$TMP_DIR/sdn_pal/$SRC_RELEASE_FILE_PREFIX
+OMCI_RELEASE_DIR=$TMP_DIR/omci/$SRC_RELEASE_FILE_PREFIX
+
+BAL_SRC_RELEASE_FILE=$BAL_RELEASE_PREFIX.tar.gz
+SDN_PAL_SRC_RELEASE_FILE=$SDN_PAL_RELEASE_PREFIX.tar.gz
+OMCI_SRC_RELEASE_FILE=$OMCI_RELEASE_PREFIX.tar.gz
+
+CP="cp -R --parents"
+
+if [ -d build/core ]; then
+    SUBSYSTEM=core
+elif [ -d build/agent ]; then
+    SUBSYSTEM=agent
+else
+   echo Neither build/core nor build/agent subdirectories exist
+   exit -1
+fi
+
+if [ ! -f build/$SUBSYSTEM/src/common/include/bal_model_ids.h ]; then
+    echo Generated BAL header files are missing. Build BAL first
+    exit -1
+fi
+
+if [ ! -f build/$SUBSYSTEM/src/lib/libomcisvc/omci_model_ids.h ]; then
+    echo Generated OMCI SVC header files are missing. Build OMCI SVC first
+    exit -1
+fi
+
+mkdir -p $BAL_RELEASE_DIR
+mkdir -p $SDN_PAL_RELEASE_DIR
+mkdir -p $OMCI_RELEASE_DIR
+
+# Copy auto-generated files first, as we will need to do "make clean" afterwards (because some 3rdparty libraries have binaries in the source directories and we need to clean those).
+# 1. BAL
+mkdir -p $BAL_RELEASE_DIR/src/common/include
+cp \
+    build/$SUBSYSTEM/src/common/include/bal_model_ids.h \
+    build/$SUBSYSTEM/src/common/include/bal_model_types.h \
+    $BAL_RELEASE_DIR/src/common/include
+
+mkdir -p $BAL_RELEASE_DIR/src/lib/libobjmsg
+cp  \
+    build/$SUBSYSTEM/src/lib/libobjmsg/bal_model_funcs.c \
+    build/$SUBSYSTEM/src/lib/libobjmsg/bal_obj_msg_pack_unpack.c \
+    build/$SUBSYSTEM/src/lib/libobjmsg/bal_model_funcs.h \
+    build/$SUBSYSTEM/src/lib/libobjmsg/bal_obj_msg_pack_unpack.h \
+    $BAL_RELEASE_DIR/src/lib/libobjmsg
+
+mkdir -p $BAL_RELEASE_DIR/src/lib/libbalapicli
+cp \
+    build/$SUBSYSTEM/src/lib/libbalapicli/bal_api_cli_helpers.h \
+    build/$SUBSYSTEM/src/lib/libbalapicli/bal_api_cli_helpers.c \
+    build/$SUBSYSTEM/src/lib/libbalapicli/bal_api_cli_handlers.c \
+    $BAL_RELEASE_DIR/src/lib/libbalapicli
+
+# 2. OMCI
+# Copy auto-generated files to the sources directory
+mkdir -p $OMCI_RELEASE_DIR/src/lib/libomcisvc
+cp \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_model_ids.h \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_model_types.h \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_model_funcs.h \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_model_funcs.c \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_cli_handlers.c \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_cli_helpers.h \
+    build/$SUBSYSTEM/src/lib/libomcisvc/omci_cli_helpers.c \
+    $OMCI_RELEASE_DIR/src/lib/libomcisvc
+
+# Clean
+make clean
+make clean BUILD_NC_AGENT=y
+
+# Now recreate the subsystem directory (wiped out by the make clean), because the archive artifacts from the build will go there
+mkdir -p build/$SUBSYSTEM
+
+# Now main copy
+
+# 1. BAL
+
+# Copy only relevant sources.
+for file in `find mk -maxdepth 1 -type f`; do cp -L --parents $file $BAL_RELEASE_DIR; done
+$CP 3rdparty/bcm-sdk/make $BAL_RELEASE_DIR/
+$CP 3rdparty/bcm-sdk/Makefile $BAL_RELEASE_DIR/
+$CP 3rdparty/bcm-sdk/Makefile.sdk $BAL_RELEASE_DIR/
+$CP 3rdparty/bcm-sdk/make_ing_dir.sh $BAL_RELEASE_DIR/
+$CP 3rdparty/bcm-sdk/rc $BAL_RELEASE_DIR/
+$CP 3rdparty/bcm-sdk/*.patch $BAL_RELEASE_DIR/
+$CP 3rdparty/bcm-sdk/sh $BAL_RELEASE_DIR/
+$CP 3rdparty/linenoise $BAL_RELEASE_DIR/
+$CP 3rdparty/maple/Makefile $BAL_RELEASE_DIR/
+$CP branch.info $BAL_RELEASE_DIR/
+chmod +w $BAL_RELEASE_DIR/branch.info
+echo PERFORCE_REVISION=$BUILD_PERFORCE_REVISION >> $BAL_RELEASE_DIR/branch.info
+$CP COPYRIGHT $BAL_RELEASE_DIR/
+$CP doxygen $BAL_RELEASE_DIR/
+$CP Makefile $BAL_RELEASE_DIR/
+$CP README* $BAL_RELEASE_DIR/
+$CP mk/boards $BAL_RELEASE_DIR/
+$CP mk/core/Makefile* $BAL_RELEASE_DIR/
+$CP mk/core/modules.core.bal $BAL_RELEASE_DIR/
+$CP mk/agent/modules.agent.bal $BAL_RELEASE_DIR/
+$CP scripts $BAL_RELEASE_DIR/
+$CP src/common $BAL_RELEASE_DIR/
+$CP src/core $BAL_RELEASE_DIR/
+$CP src/apps/bal_cli $BAL_RELEASE_DIR/
+$CP src/datamodel/bal.objset $BAL_RELEASE_DIR/
+$CP src/lib/common $BAL_RELEASE_DIR/
+$CP src/lib/libbalapi $BAL_RELEASE_DIR/
+$CP src/lib/libbalapicli $BAL_RELEASE_DIR/
+$CP src/lib/libobjmsg $BAL_RELEASE_DIR/
+$CP src/lib/librscmgr $BAL_RELEASE_DIR/
+$CP src/lib/libtopology $BAL_RELEASE_DIR/
+$CP src/lib/libutils $BAL_RELEASE_DIR/
+$CP src/lib/libcmdline $BAL_RELEASE_DIR/
+$CP tools $BAL_RELEASE_DIR/
+
+# The following file will indicate a release build
+touch $BAL_RELEASE_DIR/.release_build
+
+# Add write permission to all the copied files
+find $BAL_RELEASE_DIR -type f | xargs -d '\n' chmod +w
+
+# Remove codegen_templates and .ccache
+find $BAL_RELEASE_DIR -name codegen_templates | xargs rm -rf
+find $BAL_RELEASE_DIR -name .ccache | xargs rm -rf
+
+cd $BAL_RELEASE_DIR/..
+tar -czf $BAL_SRC_RELEASE_FILE $SRC_RELEASE_FILE_PREFIX
+cd - > /dev/null
+mv $TMP_DIR/bal/$BAL_SRC_RELEASE_FILE .
+echo ./$BAL_SRC_RELEASE_FILE created
+
+# 2. SDN-PAL
+
+# Copy only relevant sources.
+for file in `find mk -maxdepth 1 -type f`; do cp --parents $file $SDN_PAL_RELEASE_DIR; done
+$CP 3rdparty/loci $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libxml2 $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libxslt $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libgpg-error $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libgcrypt $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libssh $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libcurl $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/libnetconf $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/indigo $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/openyuma $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/yang/BBF $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/yang/IANA $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/yang/IETF $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/pyang $SDN_PAL_RELEASE_DIR/
+$CP 3rdparty/netopeer $SDN_PAL_RELEASE_DIR/
+$CP mk/agent/Makefile* $SDN_PAL_RELEASE_DIR/
+$CP mk/agent/modules.agent.sdn_pal $SDN_PAL_RELEASE_DIR/
+$CP src/agent $SDN_PAL_RELEASE_DIR/
+$CP src/netconf $SDN_PAL_RELEASE_DIR/
+$CP src/ofpal $SDN_PAL_RELEASE_DIR/
+
+# Add write permission to all the copied files
+find $SDN_PAL_RELEASE_DIR -type f | xargs -d '\n' chmod +w
+
+# Remove .ccache
+find $SDN_PAL_RELEASE_DIR -name .ccache | xargs rm -rf
+
+cd $SDN_PAL_RELEASE_DIR/..
+tar -czf $SDN_PAL_SRC_RELEASE_FILE $SRC_RELEASE_FILE_PREFIX
+cd - > /dev/null
+mv $TMP_DIR/sdn_pal/$SDN_PAL_SRC_RELEASE_FILE .
+echo ./$SDN_PAL_SRC_RELEASE_FILE created
+
+# 3. OMCI
+
+# Copy only relevant sources.
+$CP mk/core/modules.core.omci $OMCI_RELEASE_DIR/
+$CP mk/agent/modules.agent.omci $OMCI_RELEASE_DIR/
+$CP src/datamodel/omci* $OMCI_RELEASE_DIR/
+$CP src/lib/libomcistack $OMCI_RELEASE_DIR/
+$CP src/lib/libomcisvc $OMCI_RELEASE_DIR/
+
+# Remove OCS OMCI stack from modules.*.omci
+sed -i '/3rdparty\/ocs_omci/d' $OMCI_RELEASE_DIR/mk/core/modules.core.omci
+sed -i '/3rdparty\/ocs_omci/d' $OMCI_RELEASE_DIR/mk/agent/modules.agent.omci
+
+# Add write permission to all the copied files
+find $OMCI_RELEASE_DIR -type f | xargs -d '\n' chmod +w
+
+# Remove codegen_templates and .ccache
+find $OMCI_RELEASE_DIR -name codegen_templates | xargs rm -rf
+find $OMCI_RELEASE_DIR -name .ccache | xargs rm -rf
+
+# Add a flag to OMCI SVC's Makefile, so that when OMCI package is extracted, builds will include real OMCI SVC, not stubs.
+echo "USE_BCM_OMCI_SVC_IN_RELEASE=y" >> $OMCI_RELEASE_DIR/src/lib/libomcisvc/Makefile.config.omci
+
+cd $OMCI_RELEASE_DIR/..
+tar -czf $OMCI_SRC_RELEASE_FILE $SRC_RELEASE_FILE_PREFIX
+cd - > /dev/null
+mv $TMP_DIR/omci/$OMCI_SRC_RELEASE_FILE .
+echo ./$OMCI_SRC_RELEASE_FILE created
+
+# If INCLUDE_MAPLE_SDK_RELEASE is defined, then we create a maple release that will wrap the BAL release.
+if [[ "$INCLUDE_MAPLE_SDK_RELEASE" != "" ]]; then
+    OLD_DIR=`pwd`
+    BAL_MAPLE_RELEASE_DIR=$TMP_DIR/bal_maple_release
+    ./3rdparty/maple/cur/scripts/rel_delivery.sh $MAPLE_REL_DELIVERY_PREFIX
+    BCM68620_ZIP_FILE=`ls ./3rdparty/maple/cur/SW-BCM68620*.zip`
+    mkdir -p $BAL_MAPLE_RELEASE_DIR/bcm68620_release
+    unzip $BCM68620_ZIP_FILE -d $BAL_MAPLE_RELEASE_DIR/bcm68620_release
+    
+    cd $BAL_MAPLE_RELEASE_DIR
+    ln -s bcm68620_release/release/docs docs
+
+    mkdir -p bal_release
+    cd $BAL_RELEASE_DIR
+    $CP . $BAL_MAPLE_RELEASE_DIR/bal_release/
+    cd $BAL_MAPLE_RELEASE_DIR/bal_release/3rdparty/maple
+    ln -s ../../../bcm68620_release cur
+
+    cd $BAL_MAPLE_RELEASE_DIR
+    zip -y -r `basename $BCM68620_ZIP_FILE` ./*
+    cd $OLD_DIR
+    mv $BAL_MAPLE_RELEASE_DIR/`basename $BCM68620_ZIP_FILE` .
+    echo `basename ./$BCM68620_ZIP_FILE` created
+fi
+
+echo Instructions of how to extract and compile source release packages exist in `ls README*` files
+
+rm -rf $TMP_DIR
+