diff --git a/bcmkernel/scripts/bcm_git.sh b/bcmkernel/scripts/bcm_git.sh
index ee3da0b6c80d6f118393df34c2df12e2285b79f6..d764c72696269a938633bd46b168d3660c37e7d9 100755
--- a/bcmkernel/scripts/bcm_git.sh
+++ b/bcmkernel/scripts/bcm_git.sh
@@ -104,6 +104,165 @@ is_module_already_added_to_repo()
     esac
 }
 
+import_module()
+{
+    local repo="$1"
+    local module="$2"
+    local version="$3"
+    local tar_path="$4"
+
+    local tar="$(basename "$tar_path")"
+
+    if is_module_already_added_to_repo "$repo" "$module" "$version"
+    then
+        echo "Already added ${version} "$module" (corresponding branch/tag exists already). Skipping!"
+        return 0
+    fi
+    set -u
+
+    # Set up git branch
+    case ${module} in
+    "data_full_release")
+        # for each data_full_release we create a new commit on the broadcom branch
+        echo -e "\t${tar}  this is the base module"
+
+        # prep repo. clean out all old files
+        git -C ${repo} checkout broadcom
+        git -C ${repo} rm -rq .
+        ;;
+    *)
+        # for all addon-modules, branch off from data_full_release tag
+        # to apply addon in the next step
+        git_new_branch "$repo" "$version" "$module"
+    esac
+
+    # Unpack outer tarball to temporary directory inside repo
+    mkdir "${repo}/git_tmp"
+    echo "Unpacking outer tarball $tar"
+    pv ${tar_path}  | tar -xz -C ${repo}/git_tmp
+    local latest_file="$(get_latest_file_in_path "${repo}/git_tmp")"
+    local git_commit_date="$(get_file_modification_date_as_git_date "$latest_file")"
+
+    # XXX: These special cases can be generalized and the cd-ing can be avoided
+    # XXX: maybe check that README in outer tar matches what we expect, so we get notified
+    #      when the script needs updating for new instructions. Overkill or useful sanity check?
+    case ${module} in
+    "data_full_release")
+        tar_src=$( basename $tar | sed -e "s/${module}/data_src/")
+        echo "unpack $tar_src"
+        mkdir ${repo}/bcm963xx
+        # exclude any included git repo
+        pv ${repo}/git_tmp/${tar_src} | tar -xz --exclude=\.git -C ${repo}/bcm963xx
+        do_merge=1
+        ;;
+    "voice_addon"|"voice_eptapp_addon")
+        ( cd_repo $repo
+        cd git_tmp
+        # if you think that you can do "yes | ./bcmvoiceinstall ../" you are wrong. does not work.
+        echo "yy" | ./bcmvoiceinstall ../bcm963xx
+        )
+        ;;
+    "data_gfast_src")
+        ( cd_repo $repo
+        tar -xf git_tmp/*tar.gz -C bcm963xx
+        )
+        ;;
+    "xpon_src")
+        ( cd_repo $repo
+
+        rm -rf bcm963xx/userspace/private/apps/omcid/*
+        rm -rf bcm963xx/bcmdrivers/broadcom/char/gpon/*
+        rm -rf bcm963xx/userspace/private/libs/eponsdk
+
+        tar -xf git_tmp/*tar.gz -C bcm963xx
+        )
+        ;;
+    "bdkuserspace_src"|"openwrtsupport_src")
+        ( cd_repo $repo
+        for tar in git_tmp/*tar.gz
+        do
+            tar --overwrite -xf $tar -C bcm963xx
+        done
+        )
+        ;;
+
+    *)
+        echo -e "\t ${module} from ${tar} not supported"
+        return 1
+        ;;
+    esac
+
+    rm -rf ${repo}/git_tmp
+    # add files to git
+    echo "Now adding files to git. this takes some time"
+    git -C "$repo" add -A -f
+    local tar_md5="$(md5sum "${tar_path}" | cut -f1 -d ' ')"
+    local tar_sha256="$(sha256sum "${tar_path}" | cut -f1 -d ' ')"
+
+    case ${module} in
+    "data_full_release")
+        ( echo "Add Broadcom release $version"
+            echo
+            echo "Filename: ${tar}"
+            echo "SHA256:   ${tar_sha256}"
+            echo "MD5:      ${tar_md5}" ) | \
+            git -C "$repo" commit \
+                --author="broadcom release <broadcom_release@broadcom.com>" \
+                --date="$git_commit_date" \
+                -F - \
+                -q
+        git -C ${repo} tag bcm_${version}_t
+        ;;
+    *)
+        ( echo "Add ${module} to release ${version}"
+            echo
+            echo "Filename: ${tar}"
+            echo "SHA256:   ${tar_sha256}"
+            echo "MD5:      ${tar_md5}" ) | \
+            git -C "$repo" commit \
+                --author="broadcom release <broadcom_release@broadcom.com>" \
+                --date="$git_commit_date" \
+                -F - \
+                -q
+        ;;
+    esac
+}
+
+merge_module_into_bcm_branch()
+{
+    # requires to be on the right branch bcm_$version
+    local repo="$1"
+    local module="$2"
+    local version="$3"
+
+    case ${module} in
+    "data_full_release")
+        true
+        ;;
+    *)
+        echo "trying to merge ${module} from branch ${version}_${module}"
+        if git -C ${repo} branch | grep "bcm_${version}_${module}$"
+        then
+            if ! git -C ${repo} merge --no-commit --no-ff -Xtheirs bcm_${version}_${module}
+            then
+                # so this merge did not work. clean up and skip it.
+                git -C ${repo} merge --abort
+                git -C ${repo} reset --hard
+                git -C ${repo} clean -ffxd
+                return
+            fi
+            local status="$(git -C "$repo" status --porcelain)"
+            if [ -n "$status" ]; then
+                git -C ${repo} commit --author="broadcom release <broadcom_release@broadcom.com>" \
+                    -m "Merge in bcm_${version}_${module}"
+            else
+                echo "No changes => not committing anything. ${module} ${version} has probably already been merged"
+            fi
+        fi
+        ;;
+    esac
+}
+
 add_release ()
 {
     local version=$1
@@ -120,161 +279,31 @@ add_release ()
     for module in $bcm_modules
     do
         tar="bcm963xx_${version}_${module}.tar.gz"
-        if is_module_already_added_to_repo "$repo" "$module" "$version"
-        then
-            echo "Already added ${version} "$module" (corresponding branch/tag exists already). Skipping!"
-            continue
-        elif ! [ -f ${tar_dir}/${tar} ]
+        if ! [ -f ${tar_dir}/${tar} ]
         then
             echo -e "\ttar not found. skipping $tar"
             continue
         fi
-
-        # Set up git branch
-        case ${module} in
-        "data_full_release")
-            # for each data_full_release we create a new commit on the broadcom branch
-            echo -e "\t${tar}  this is the base module"
-
-            # prep repo. clean out all old files
-            git -C ${repo} checkout broadcom
-            git -C ${repo} rm -rq .
-            ;;
-        *)
-            # for all addon-modules, branch off from data_full_release tag
-            # to apply addon in the next step
-            git_new_branch "$repo" "$version" "$module"
-        esac
-
-        # Unpack outer tarball to temporary directory inside repo
-        mkdir "${repo}/git_tmp"
-        echo "Unpacking outer tarball $tar"
-        local tar_name="$(basename $tar)"
-        pv ${tar_dir}/${tar}  | tar -xz -C ${repo}/git_tmp
-        local latest_file="$(get_latest_file_in_path "${repo}/git_tmp")"
-        local git_commit_date="$(get_file_modification_date_as_git_date "$latest_file")"
-
-        case ${module} in
-        "data_full_release")
-            tar_src=$( basename $tar | sed -e "s/${module}/data_src/")
-            echo "unpack $tar_src"
-            mkdir ${repo}/bcm963xx
-            # exclude any included git repo
-            pv ${repo}/git_tmp/${tar_src} | tar -xz --exclude=\.git -C ${repo}/bcm963xx
-            do_merge=1
-            ;;
-        "voice_addon"|"voice_eptapp_addon")
-            ( cd_repo $repo
-            cd git_tmp
-            # if you think that you can do "yes | ./bcmvoiceinstall ../" you are wrong. does not work.
-            echo "yy" | ./bcmvoiceinstall ../bcm963xx
-            )
-            ;;
-        "data_gfast_src")
-            ( cd_repo $repo
-            tar -xf git_tmp/*tar.gz -C bcm963xx
-            )
-            ;;
-        "xpon_src")
-            ( cd_repo $repo
-
-            rm -rf bcm963xx/userspace/private/apps/omcid/*
-            rm -rf bcm963xx/bcmdrivers/broadcom/char/gpon/*
-            rm -rf bcm963xx/userspace/private/libs/eponsdk
-
-            tar -xf git_tmp/*tar.gz -C bcm963xx
-            )
-            ;;
-        "bdkuserspace_src"|"openwrtsupport_src")
-            ( cd_repo $repo
-            for tar in git_tmp/*tar.gz
-            do
-                tar --overwrite -xf $tar -C bcm963xx
-            done
-            )
-            ;;
-
-        *)
-            echo -e "\t${tar}"
-            ;;
-        esac
-
-        rm -rf ${repo}/git_tmp
-        # add files to git
-        echo "Now adding files to git. this takes some time"
-        git -C "$repo" add -A -f
-        local tar_md5="$(md5sum "${tar_dir}/${tar}" | cut -f1 -d ' ')"
-        local tar_sha256="$(sha256sum "${tar_dir}/${tar}" | cut -f1 -d ' ')"
-
-        case ${module} in
-        "data_full_release")
-            ( echo "Add Broadcom release $version"
-                echo
-                echo "Filename: ${tar_name}"
-                echo "SHA256:   ${tar_sha256}"
-                echo "MD5:      ${tar_md5}" ) | \
-                git -C "$repo" commit \
-                    --author="broadcom release <broadcom_release@broadcom.com>" \
-                    --date="$git_commit_date" \
-                    -F - \
-                    -q
-            git -C ${repo} tag bcm_${version}_t
-            ;;
-        *)
-            ( echo "Add ${module} to release ${version}"
-                echo
-                echo "Filename: ${tar_name}"
-                echo "SHA256:   ${tar_sha256}"
-                echo "MD5:      ${tar_md5}" ) | \
-                git -C "$repo" commit \
-                    --author="broadcom release <broadcom_release@broadcom.com>" \
-                    --date="$git_commit_date" \
-                    -F - \
-                    -q
-            ;;
-        esac
+        import_module "$repo" "$module" "$version" "${tar_dir}/${tar}"
     done
 
     # All modules have been added. Make the main branch and do the octopus merge.
     # but only if the tag exist.
     # BUG: so octopus do not work since broadcom adds the same binary file in mutiple addon modules. :(
-    if [ "$do_merge" == "1" ]
+    if git -C ${repo} tag  | grep "bcm_${version}_t$"
     then
-        if git -C ${repo} tag  | grep "bcm_${version}_t$"
-        then
-            git -C ${repo} reset --hard
-            git -C ${repo} clean -ffxd
-            git -C ${repo} checkout bcm_${version}_t
-            git -C ${repo} branch bcm_${version}
-            git -C ${repo} checkout bcm_${version}
-            git -C ${repo} reset --hard
-            git -C ${repo} clean -ffxd
-            branch_list=""
-            for module in $bcm_modules
-            do
-                case ${module} in
-                "data_full_release")
-                    true
-                    ;;
-                *)
-                    echo "trying to merge ${module} from branch ${version}_${module}"
-                    if git -C ${repo} branch | grep "bcm_${version}_${module}$"
-                    then
-                        if ! git -C ${repo} merge --no-commit --no-ff -Xtheirs bcm_${version}_${module}
-                        then
-                            # so this merge did not work. clean up and skip it.
-                            git -C ${repo} merge --abort
-                            git -C ${repo} reset --hard
-                            git -C ${repo} clean -ffxd
-                        return
-                        fi
-                        git -C ${repo} commit --author="broadcom release<broadcom_release@broadcom.com>" \
-                        -m "Merge in bcm_${version}_${module}"
-                    fi
-                    ;;
-                esac
-            done
-        fi
+        git -C ${repo} reset --hard
+        git -C ${repo} clean -ffxd
+        git -C ${repo} checkout bcm_${version}_t
+        git -C ${repo} branch bcm_${version} || true   # Ignore if branch exists already
+        git -C ${repo} checkout bcm_${version}
+        git -C ${repo} reset --hard
+        git -C ${repo} clean -ffxd
+        branch_list=""
+        for module in $bcm_modules
+        do
+            merge_module_into_bcm_branch "$repo" "$module" "$version"
+        done
     fi
 }