diff -r 43ace4bb005e -r 4d1c400c76a0 config/binutils/binutils.in
--- a/config/binutils/binutils.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/binutils/binutils.in	Thu Oct 04 13:26:14 2012 +1000
@@ -50,8 +50,26 @@
     prompt "2.16.1a (OBSOLETE)"
     depends on OBSOLETE
 
+config BINUTILS_CUSTOM
+    bool
+    prompt "Custom binutils"
+    depends on EXPERIMENTAL
+    select BINUTILS_2_22_or_later
+
 endchoice
 
+if BINUTILS_CUSTOM
+
+config BINUTILS_CUSTOM_LOCATION
+    string
+    prompt "full path to custom binutils source"
+    default ""
+    help
+      Enter the path to the directory (or tarball) of your source for binutils,
+      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/binutils
+
+endif # BINUTILS_CUSTOM
+
 config BINUTILS_VERSION
     string
 # Don't remove next line
@@ -64,6 +82,7 @@
     default "2.18a" if BINUTILS_V_2_18a
     default "2.17a" if BINUTILS_V_2_17a
     default "2.16.1a" if BINUTILS_V_2_16_1a
+    default "custom" if BINUTILS_CUSTOM
 
 config BINUTILS_2_22_or_later
     bool
diff -r 43ace4bb005e -r 4d1c400c76a0 config/cc/gcc.in
--- a/config/cc/gcc.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/cc/gcc.in	Thu Oct 04 13:26:14 2012 +1000
@@ -239,6 +239,12 @@
     prompt "3.4.6 (OBSOLETE)"
     depends on OBSOLETE
 
+config CC_CUSTOM
+    bool
+    prompt "Custom gcc"
+    depends on EXPERIMENTAL
+    select CC_GCC_latest
+
 endchoice
 
 if CC_V_SVN
@@ -297,6 +303,18 @@
 
 endif
 
+if CC_CUSTOM
+
+config CC_CUSTOM_LOCATION
+    string
+    prompt "full path to custom gcc source"
+    default ""
+    help
+      Enter the path to the directory (or tarball) of your source for gcc,
+      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/gcc
+
+endif #CC_CUSTOM
+
 config CC_GCC_4_2
     bool
     select CC_GCC_4_2_or_later
@@ -484,6 +502,7 @@
     default "4.1.2" if CC_V_4_1_2
     default "4.0.4" if CC_V_4_0_4
     default "3.4.6" if CC_V_3_4_6
+    default "custom" if CC_CUSTOM
 
 config CC_LANG_JAVA_USE_ECJ
     bool
diff -r 43ace4bb005e -r 4d1c400c76a0 config/debug/gdb.in
--- a/config/debug/gdb.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/debug/gdb.in	Thu Oct 04 13:26:14 2012 +1000
@@ -119,6 +119,13 @@
     bool
     prompt "6.8a"
 
+config GDB_CUSTOM
+    bool
+    prompt "Custom gdb"
+    depends on EXPERIMENTAL
+    select GDB_7_0_or_later
+    select GDB_7_2_or_later
+
 endchoice
 
 config GDB_7_2_or_later
@@ -152,5 +159,19 @@
     default "7.0.1a" if GDB_V_7_0_1a
     default "7.0a" if GDB_V_7_0a
     default "6.8a" if GDB_V_6_8a
+    default "custom" if GDB_CUSTOM
+
+if GDB_CUSTOM
+
+config GDB_CUSTOM_LOCATION
+    string
+    prompt "full path to custom gdb source"
+    default ""
+    help
+      Enter the path to the directory (or tarball) of your source for gdb,
+      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/gdb
+
+endif # GDB_CUSTOM
 
 endif
+
diff -r 43ace4bb005e -r 4d1c400c76a0 config/global/paths.in
--- a/config/global/paths.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/global/paths.in	Thu Oct 04 13:26:14 2012 +1000
@@ -60,6 +60,15 @@
 #      The reason you might also want to install elsewhere is if you are going
 #      to package your shinny new toolchain for distribution.
 
+
+config CUSTOM_LOCATION_ROOT_DIR
+    string
+    depends on EXPERIMENTAL
+    prompt "directory containing custom source components"
+    help
+      This is the path CT-NG will attempt to use as a root for locating
+      local copies of source components (CUSTOM_LOCATION_ROOT_DIR/component)
+
 config RM_RF_PREFIX_DIR
     bool
     prompt "|  Remove the prefix dir prior to building"
diff -r 43ace4bb005e -r 4d1c400c76a0 config/libc/eglibc.in
--- a/config/libc/eglibc.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/libc/eglibc.in	Thu Oct 04 13:26:14 2012 +1000
@@ -85,6 +85,13 @@
     help
       Selecting this will export the trunk of the eglibc subversion repository.
 
+config LIBC_EGLIBC_CUSTOM
+    bool
+    prompt "Custom eglibc"
+    depends on EXPERIMENTAL
+    select LIBC_EGLIBC_2_16_or_later
+    select LIBC_CUSTOM
+
 endchoice
 
 config LIBC_VERSION
@@ -104,6 +111,7 @@
     default "2_6" if LIBC_EGLIBC_V_2_6
     default "2_5" if LIBC_EGLIBC_V_2_5
     default "trunk" if LIBC_EGLIBC_V_TRUNK
+    default "custom" if LIBC_EGLIBC_CUSTOM
 
 config LIBC_EGLIBC_2_16_or_later
     bool
@@ -140,6 +148,22 @@
 config LIBC_EGLIBC_HAS_PKGVERSION_BUGURL
     bool
 
+config LIBC_CUSTOM
+    bool
+
+if LIBC_EGLIBC_CUSTOM
+
+config LIBC_EGLIBC_CUSTOM_LOCATION
+    string
+    prompt "full path to custom eglibc source"
+    default ""
+    help
+      Enter the path to the directory (or tarball) of your source for eglibc,
+      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/eglibc
+
+endif # LIBC_EGLIBC_CUSTOM
+if ! LIBC_EGLIBC_CUSTOM
+
 if CONFIGURE_has_svn
 
 config EGLIBC_REVISION
@@ -189,6 +213,7 @@
 comment "otherwise you won't be able to download eglibc"
 
 endif # ! CONFIGURE_has_svn
+endif # ! LIBC_EGLIBC_CUSTOM
 
 config EGLIBC_OPT_SIZE
     bool
diff -r 43ace4bb005e -r 4d1c400c76a0 config/libc/glibc.in
--- a/config/libc/glibc.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/libc/glibc.in	Thu Oct 04 13:26:14 2012 +1000
@@ -9,34 +9,6 @@
 
 choice
     bool
-    prompt "Retrieval method"
-    default LIBC_GLIBC_TARBALL
-
-config LIBC_GLIBC_TARBALL
-    bool
-    prompt "Released tarball"
-    help
-      Until end of Februrary 2009, there was no tarball for glibc releases
-      2.8 and later. This was intentional.
-      
-      Then, all of a sudden, tarballs for those releases have appeared at the
-      traditional download place (ftp.gnu.org).
-      
-      Some of the glibc people argue that fixes are committed to the maintenance
-      branch, and thus it is the best plac e to retrieve the glibc from.
-      On the other hand, it might be preferable to always generate a toolchain
-      using a known code-base, so the toolchain can be reproducible.
-      
-      For version prior to 2.8, tarballs were readily available.
-      
-      If you want your toolchain to really be reproducible, say 'Y' here.
-      If you can live with a moving code-base, look at the other choice
-      entries, below.
-
-endchoice
-
-choice
-    bool
     prompt "glibc version"
 # Don't remove next line
 # CT_INSERT_VERSION_BELOW
@@ -109,8 +81,60 @@
     depends on OBSOLETE
     select LIBC_SUPPORT_LINUXTHREADS
 
+config LIBC_GLIBC_CUSTOM
+    bool
+    prompt "Custom glibc"
+    depends on EXPERIMENTAL
+    select LIBC_CUSTOM
+
 endchoice
 
+config LIBC_CUSTOM
+    bool
+
+if LIBC_GLIBC_CUSTOM
+
+config LIBC_GLIBC_CUSTOM_LOCATION
+    string
+    prompt "full path to custom glibc source"
+    default ""
+    help
+      Enter the path to the directory (or tarball) of your source for glibc,
+      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/glibc
+
+endif # LIBC_GLIBC_CUSTOM
+if ! LIBC_GLIBC_CUSTOM
+
+choice
+    bool
+    prompt "Retrieval method"
+    default LIBC_GLIBC_TARBALL
+
+config LIBC_GLIBC_TARBALL
+    bool
+    prompt "Released tarball"
+    help
+      Until end of Februrary 2009, there was no tarball for glibc releases
+      2.8 and later. This was intentional.
+      
+      Then, all of a sudden, tarballs for those releases have appeared at the
+      traditional download place (ftp.gnu.org).
+      
+      Some of the glibc people argue that fixes are committed to the maintenance
+      branch, and thus it is the best plac e to retrieve the glibc from.
+      On the other hand, it might be preferable to always generate a toolchain
+      using a known code-base, so the toolchain can be reproducible.
+      
+      For version prior to 2.8, tarballs were readily available.
+      
+      If you want your toolchain to really be reproducible, say 'Y' here.
+      If you can live with a moving code-base, look at the other choice
+      entries, below.
+
+endchoice
+
+endif # ! LIBC_GLIBC_CUSTOM
+
 config LIBC_VERSION
     string
 # Don't remove next line
@@ -130,3 +154,4 @@
     default "2.6" if LIBC_GLIBC_V_2_6
     default "2.5.1" if LIBC_GLIBC_V_2_5_1
     default "2.5" if LIBC_GLIBC_V_2_5
+    default "custom" if LIBC_GLIBC_CUSTOM
diff -r 43ace4bb005e -r 4d1c400c76a0 config/libc/newlib.in
--- a/config/libc/newlib.in	Wed Sep 26 16:37:31 2012 +0200
+++ b/config/libc/newlib.in	Thu Oct 04 13:26:14 2012 +1000
@@ -52,8 +52,25 @@
       
       In a word: use the CVS snapshot at your own risk! 
 
+config LIBC_NEWLIB_CUSTOM
+    bool
+    prompt "Custom newlib"
+    depends on EXPERIMENTAL
+
 endchoice
 
+if LIBC_NEWLIB_CUSTOM
+
+config LIBC_NEWLIB_CUSTOM_LOCATION
+    string
+    prompt "full path to custom newlib source"
+    default ""
+    help
+      Enter the path to the directory (or tarball) of your source for newlib,
+      or leave blank to use default CT_CUSTOM_LOCATION_ROOT_DIR/newlib
+
+endif # LIBC_NEWLIB_CUSTOM
+
 config LIBC_VERSION
     string
     prompt "use CVS tag" if LIBC_NEWLIB_CVS
@@ -63,6 +80,7 @@
     default "1.19.0" if LIBC_NEWLIB_V_1_19_0
     default "1.18.0" if LIBC_NEWLIB_V_1_18_0
     default "1.17.0" if LIBC_NEWLIB_V_1_17_0
+    default "custom" if LIBC_NEWLIB_CUSTOM
     help
       Enter the tag you want to use.
       Leave empty to use the 'head' of the repository.
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/binutils/binutils.sh
--- a/scripts/build/binutils/binutils.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/binutils/binutils.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -4,14 +4,26 @@
 
 # Download binutils
 do_binutils_get() {
-    CT_GetFile "binutils-${CT_BINUTILS_VERSION}"                                        \
-               {ftp,http}://{ftp.gnu.org/gnu,ftp.kernel.org/pub/linux/devel}/binutils   \
-               ftp://gcc.gnu.org/pub/binutils/{releases,snapshots}
+    if [ "${CT_BINUTILS_CUSTOM}" = "y" ]; then
+        CT_TestAndAbort "Custom binutils: CT_CUSTOM_LOCATION_ROOT_DIR or CT_BINUTILS_CUSTOM_LOCATION must be set." \
+        -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_BINUTILS_CUSTOM_LOCATION}"
+        if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_BINUTILS_CUSTOM_LOCATION}" ]; then
+            CT_BINUTILS_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/binutils"
+        fi
+        CT_GetCustom "binutils-${CT_BINUTILS_VERSION}" "${CT_BINUTILS_CUSTOM_LOCATION}"
+    else
+        CT_GetFile "binutils-${CT_BINUTILS_VERSION}"                                        \
+                   {ftp,http}://{ftp.gnu.org/gnu,ftp.kernel.org/pub/linux/devel}/binutils   \
+                   ftp://gcc.gnu.org/pub/binutils/{releases,snapshots}
+    fi
 }
 
 # Extract binutils
 do_binutils_extract() {
-    CT_Extract "binutils-${CT_BINUTILS_VERSION}"
+    if [ "${CT_BINUTILS_CUSTOM}" != "y" \
+         -o ! -d "${CT_BINUTILS_CUSTOM_LOCATION}" ]; then
+        CT_Extract "binutils-${CT_BINUTILS_VERSION}"
+    fi
     CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
 }
 
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/cc/gcc.sh
--- a/scripts/build/cc/gcc.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/cc/gcc.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -4,7 +4,14 @@
 
 # Download gcc
 do_cc_get() {
-    if [ -n "${CT_CC_V_SVN}" ]; then
+    if [ "${CT_CC_CUSTOM}" = "y" ]; then
+        CT_TestAndAbort "Custom gcc: CT_CUSTOM_LOCATION_ROOT_DIR or CT_CC_CUSTOM_LOCATION must be set." \
+        -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_CC_CUSTOM_LOCATION}"
+        if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_CC_CUSTOM_LOCATION}" ]; then
+            CT_CC_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/gcc"
+        fi
+        CT_GetCustom "gcc-${CT_CC_VERSION}" "${CT_CC_CUSTOM_LOCATION}"
+    elif [ -n "${CT_CC_V_SVN}" ]; then
         # Get gcc from SVN!
         local svn_base
 
@@ -59,7 +66,10 @@
 
 # Extract gcc
 do_cc_extract() {
-    CT_Extract "gcc-${CT_CC_VERSION}"
+    if [ "${CT_CC_CUSTOM}" != "y" \
+         -o ! -d "${CT_CC_CUSTOM_LOCATION}" ]; then
+        CT_Extract "gcc-${CT_CC_VERSION}"
+    fi
     CT_Patch "gcc" "${CT_CC_VERSION}"
 
     # Copy ecj-latest.jar to ecj.jar at the top of the GCC source tree
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/debug/300-gdb.sh
--- a/scripts/build/debug/300-gdb.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/debug/300-gdb.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -48,10 +48,19 @@
     do_debug_gdb_parts
 
     if [ "${do_gdb}" = "y" ]; then
-        CT_GetFile "gdb-${CT_GDB_VERSION}"                          \
-                   {ftp,http}://ftp.gnu.org/pub/gnu/gdb             \
-                   ftp://sources.redhat.com/pub/gdb/{,old-}releases \
-                   "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
+        if [ "${CT_GDB_CUSTOM}" = "y" ]; then
+            CT_TestAndAbort "Custom gdb: CT_CUSTOM_LOCATION_ROOT_DIR or CT_GDB_CUSTOM_LOCATION must be set." \
+            -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_GDB_CUSTOM_LOCATION}"
+            if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_GDB_CUSTOM_LOCATION}" ]; then
+                CT_GDB_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/gdb"
+            fi
+            CT_GetCustom "gdb-${CT_GDB_VERSION}" "${CT_GDB_CUSTOM_LOCATION}"
+        else
+            CT_GetFile "gdb-${CT_GDB_VERSION}"                          \
+                       {ftp,http}://ftp.gnu.org/pub/gnu/gdb             \
+                       ftp://sources.redhat.com/pub/gdb/{,old-}releases \
+                       "${linaro_base_url}/${linaro_series}/${linaro_version}/+download"
+        fi
     fi
 
     if [ "${do_ncurses}" = "y" ]; then
@@ -70,7 +79,10 @@
     do_debug_gdb_parts
 
     if [ "${do_gdb}" = "y" ]; then
-        CT_Extract "gdb-${CT_GDB_VERSION}"
+        if [ "${CT_GDB_CUSTOM}" != "y" \
+             -o ! -d "${CT_GDB_CUSTOM_LOCATION}" ]; then
+            CT_Extract "gdb-${CT_GDB_VERSION}"
+        fi
         CT_Patch "gdb" "${CT_GDB_VERSION}"
     fi
 
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/kernel/linux.sh
--- a/scripts/build/kernel/linux.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/kernel/linux.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -29,23 +29,12 @@
     fi
 
     if [ "${CT_KERNEL_LINUX_CUSTOM}" = "y" ]; then
-        if [ ! -d "${CT_KERNEL_LINUX_CUSTOM_LOCATION}" ]; then
-            # Wee need to know the custom tarball extension,
-            # so we can create a properly-named symlink, which
-            # we use later on in 'extract'
-            case "${CT_KERNEL_LINUX_CUSTOM_LOCATION}" in
-                *.tar.bz2)      custom_name="linux-custom.tar.bz2";;
-                *.tar.gz|*.tgz) custom_name="linux-custom.tar.gz";;
-                *.tar)          custom_name="linux-custom.tar";;
-                *)  CT_Abort "Unknown extension for custom linux tarball '${CT_KERNEL_LINUX_CUSTOM_LOCATION}'";;
-            esac
-            CT_DoExecLog DEBUG ln -sf "${CT_KERNEL_LINUX_CUSTOM_LOCATION}"  \
-                                      "${CT_TARBALLS_DIR}/${custom_name}"
-        else
-            custom_name="linux-custom"
-            CT_DoExecLog DEBUG ln -sf "${CT_KERNEL_LINUX_CUSTOM_LOCATION}"  \
-                                      "${CT_SRC_DIR}/${custom_name}"
+        CT_TestAndAbort "Custom linux: CT_CUSTOM_LOCATION_ROOT_DIR or CT_KERNEL_LINUX_CUSTOM_LOCATION must be set." \
+        -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_KERNEL_LINUX_CUSTOM_LOCATION}"
+        if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_KERNEL_LINUX_CUSTOM_LOCATION}" ]; then
+            CT_KERNEL_LINUX_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/linux"
         fi
+        CT_GetCustom "linux-${CT_KERNEL_VERSION}" "${CT_KERNEL_LINUX_CUSTOM_LOCATION}"
     else # Not a custom tarball
         case "${CT_KERNEL_VERSION}" in
             2.6.*.*|3.*.*)
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/libc/eglibc.sh
--- a/scripts/build/libc/eglibc.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/libc/eglibc.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -28,9 +28,19 @@
         *)      svn_base+="/branches/eglibc-${CT_LIBC_VERSION}";;
     esac
 
-    CT_GetSVN "eglibc-${CT_LIBC_VERSION}"   \
-              "${svn_base}/libc"            \
-              "${CT_EGLIBC_REVISION:-HEAD}"
+    if [ "${CT_LIBC_CUSTOM}" = "y" ]; then
+        CT_TestAndAbort "Custom eglibc: CT_CUSTOM_LOCATION_ROOT_DIR or CT_LIBC_EGLIBC_CUSTOM_LOCATION must be set." \
+        -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_LIBC_EGLIBC_CUSTOM_LOCATION}"
+        CT_LIBC_CUSTOM_LOCATION="${CT_LIBC_EGLIBC_CUSTOM_LOCATION}"
+        if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_LIBC_EGLIBC_CUSTOM_LOCATION}" ]; then
+            CT_LIBC_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/eglibc"
+        fi
+        CT_GetCustom "eglibc-${CT_LIBC_VERSION}" "${CT_LIBC_CUSTOM_LOCATION}"
+    else
+        CT_GetSVN "eglibc-${CT_LIBC_VERSION}"   \
+                  "${svn_base}/libc"            \
+                  "${CT_EGLIBC_REVISION:-HEAD}"
+    fi
 
     if [ "${CT_LIBC_LOCALES}" = "y" ]; then
         extra_addons+=("localedef")
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/libc/glibc-eglibc.sh-common
--- a/scripts/build/libc/glibc-eglibc.sh-common	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/libc/glibc-eglibc.sh-common	Thu Oct 04 13:26:14 2012 +1000
@@ -5,7 +5,10 @@
     local addon
 
     # Extract the main tarball
-    CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
+    if [ "${CT_LIBC_CUSTOM}" != "y" \
+         -o ! -d "${CT_LIBC_CUSTOM_LOCATION}" ]; then
+        CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
+    fi
     CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
     CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}"
 
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/libc/glibc.sh
--- a/scripts/build/libc/glibc.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/libc/glibc.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -20,10 +20,20 @@
     addons_list=($(do_libc_add_ons_list " "))
 
     # Main source
-    CT_GetFile "glibc-${CT_LIBC_VERSION}"               \
-               {ftp,http}://ftp.gnu.org/gnu/glibc       \
-               ftp://gcc.gnu.org/pub/glibc/releases     \
-               ftp://gcc.gnu.org/pub/glibc/snapshots
+    if [ "${CT_LIBC_CUSTOM}" = "y" ]; then
+        CT_TestAndAbort "Custom glibc: CT_CUSTOM_LOCATION_ROOT_DIR or CT_LIBC_GLIBC_CUSTOM_LOCATION must be set." \
+        -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_LIBC_GLIBC_CUSTOM_LOCATION}"
+        CT_LIBC_CUSTOM_LOCATION="${CT_LIBC_GLIBC_CUSTOM_LOCATION}"
+        if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_LIBC_GLIBC_CUSTOM_LOCATION}" ]; then
+            CT_LIBC_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/glibc"
+        fi
+        CT_GetCustom "glibc-${CT_LIBC_VERSION}" "${CT_LIBC_CUSTOM_LOCATION}"
+    else
+        CT_GetFile "glibc-${CT_LIBC_VERSION}"               \
+                   {ftp,http}://ftp.gnu.org/gnu/glibc       \
+                   ftp://gcc.gnu.org/pub/glibc/releases     \
+                   ftp://gcc.gnu.org/pub/glibc/snapshots
+    fi
 
     # C library addons
     for addon in "${addons_list[@]}"; do
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/build/libc/newlib.sh
--- a/scripts/build/libc/newlib.sh	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/build/libc/newlib.sh	Thu Oct 04 13:26:14 2012 +1000
@@ -20,7 +20,14 @@
     libc_src="ftp://sources.redhat.com/pub/newlib"
     avr32headers_src="http://dev.doredevelopment.dk/avr32-toolchain/sources"
 
-    if [ -z "${CT_LIBC_NEWLIB_CVS}" ]; then
+    if [ "${CT_LIBC_NEWLIB_CUSTOM}" = "y" ]; then
+        CT_TestAndAbort "Custom newlib: CT_CUSTOM_LOCATION_ROOT_DIR or CT_LIBC_NEWLIB_CUSTOM_LOCATION must be set." \
+        -z "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_LIBC_NEWLIB_CUSTOM_LOCATION}"
+        if [ -n "${CT_CUSTOM_LOCATION_ROOT_DIR}" -a -z "${CT_LIBC_NEWLIB_CUSTOM_LOCATION}" ]; then
+            CT_LIBC_NEWLIB_CUSTOM_LOCATION="${CT_CUSTOM_LOCATION_ROOT_DIR}/newlib"
+        fi
+        CT_GetCustom "newlib-${CT_LIBC_VERSION}" "${CT_LIBC_NEWLIB_CUSTOM_LOCATION}"
+    elif [ -z "${CT_LIBC_NEWLIB_CVS}" ]; then
         CT_GetFile "newlib-${CT_LIBC_VERSION}" ${libc_src}
     else
         CT_GetCVS "newlib-$(libc_newlib_version)"                   \
@@ -36,7 +43,10 @@
 }
 
 do_libc_extract() {
-    CT_Extract "newlib-$(libc_newlib_version)"
+    if [ "${CT_LIBC_NEWLIB_CUSTOM}" != "y" \
+         -o ! -d "${CT_LIBC_NEWLIB_CUSTOM_LOCATION}" ]; then
+        CT_Extract "newlib-$(libc_newlib_version)"
+    fi
     CT_Patch "newlib" "$(libc_newlib_version)"
 
     if [ "${CT_ATMEL_AVR32_HEADERS}" = "y" ]; then
diff -r 43ace4bb005e -r 4d1c400c76a0 scripts/functions
--- a/scripts/functions	Wed Sep 26 16:37:31 2012 +0200
+++ b/scripts/functions	Thu Oct 04 13:26:14 2012 +1000
@@ -516,6 +516,32 @@
     return 1
 }
 
+# This function gets the custom source from either a tarball or directory
+# Usage: CT_GetCustom custom_name <custom_location>
+CT_GetCustom() {
+    local custom_name="$1"
+    local custom_location="$2"
+
+    if [ ! -d "${custom_location}" ]; then
+        # We need to know the custom tarball extension,
+        # so we can create a properly-named symlink, which
+        # we use later on in 'extract'
+        case "${custom_location}" in
+            *.tar.bz2)      custom_name="${custom_name}.tar.bz2";;
+            *.tar.gz|*.tgz) custom_name="${custom_name}.tar.gz";;
+            *.tar)          custom_name="${custom_name}.tar";;
+            *)  CT_Abort "Unknown extension for custom tarball '${custom_location}'";;
+        esac
+        CT_DoLog EXTRA "Using '${custom_name}' from local storage"
+        CT_DoExecLog DEBUG ln -sf "${custom_location}"  \
+                                  "${CT_TARBALLS_DIR}/${custom_name}"
+    else
+        CT_DoLog EXTRA "Using '${custom_name}' from local storage"
+        CT_DoExecLog DEBUG ln -snf "${custom_location}"  \
+                                  "${CT_SRC_DIR}/${custom_name}"
+    fi
+}
+
 # This function saves the specified to local storage if possible,
 # and if so, symlinks it for later usage
 # Usage: CT_SaveLocal </full/path/file.name>
