diff --git a/com.oracle.truffle.r.native/builtinlibs/Makefile b/com.oracle.truffle.r.native/builtinlibs/Makefile
index f5b3a9f996158edd33a8606568e5f96688d69a60..f052790aaf0fa82891c25af4c8f3aea1bf358538 100644
--- a/com.oracle.truffle.r.native/builtinlibs/Makefile
+++ b/com.oracle.truffle.r.native/builtinlibs/Makefile
@@ -33,29 +33,27 @@ endif
 
 .PHONY: all clean cleanlib cleanobj force libr
 
-all: linked $(LIB_APPL) libr
+LIBDIR = $(abspath $(TOPDIR)/../lib)
+LIB_APPL := $(LIBDIR)/libappl$(DYLIB_EXT)
+
+all: $(LIB_APPL) libr
 
 SRC = src
 OBJ = lib
-LIBDIR = $(abspath $(TOPDIR)/../lib)
 
-LINKED_C_FILES = interv.c
-GNUR_LINKED_C_FILES = $(addprefix $(GNUR_HOME)/src/appl/, $(LINKED_C_FILES))
-NON_LOCAL_C_SOURCES = $(addprefix $(SRC)/, $(LINKED_C_FILES))
-C_LOCAL_SOURCES = $(filter-out  $(NON_LOCAL_C_SOURCES),$(wildcard $(SRC)/*.c))
-C_SOURCES := $(NON_LOCAL_C_SOURCES) $(C_LOCAL_SOURCES)
+GNUR_SRC = $(GNUR_HOME)/src/appl
+GNUR_C_FILES = interv.c
+GNUR_C_OBJECTS := $(addprefix $(OBJ)/, $(GNUR_C_FILES:.c=.o))
+
+C_SOURCES := $(wildcard $(SRC)/*.c)
 C_OBJECTS := $(subst $(SRC),$(OBJ),$(C_SOURCES:.c=.o))
-F_OBJECTS := $(wildcard $(GNUR_HOME)/src/appl/d*.o)
 
-LIB_APPL := $(LIBDIR)/libappl$(DYLIB_EXT)
+# the Fortran sources are not recompiled
+F_OBJECTS := $(wildcard $(GNUR_HOME)/src/appl/d*.o)
 
-$(LIB_APPL): $(C_OBJECTS) $(F_OBJECTS)
+$(LIB_APPL): $(C_OBJECTS) $(GNUR_C_OBJECTS) $(F_OBJECTS) Makefile
 	mkdir -p $(LIBDIR)
-	$(DYLIB_LD) $(DYLIB_LDFLAGS)  -o $(LIB_APPL) $(C_OBJECTS) $(F_OBJECTS) $(LIBS)
-
-linked: $(GNUR_LINKED_C_FILES)
-	$(foreach file,$(LINKED_C_FILES),ln -sf $(GNUR_HOME)/src/appl/$(file) $(SRC)/$(file);)
-	touch linked
+	$(DYLIB_LD) $(DYLIB_LDFLAGS)  -o $(LIB_APPL) $(C_OBJECTS) $(GNUR_C_OBJECTS) $(F_OBJECTS) $(LIBS)
 
 $(C_OBJECTS): | $(OBJ)
 
@@ -77,7 +75,7 @@ $(LIB_R): $(OBJ)/xerbla.o
 	$(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_R) -current_version $(R_VERSION) -compatibility_version $(R_VERSION) $(OBJ)/xerbla.o
 
 cleanlibr:
-	rm -f $(LIB_R)
+	rm -f $(LIBDIR)/libR.*
 
 else
 libr: 
@@ -91,12 +89,14 @@ FFI_INCLUDES = -I$(TOPDIR)/include -I$(TOPDIR)/include/R_ext
 $(OBJ)/%.o: $(SRC)/%.c
 	$(CC) $(CFLAGS) $(FFI_INCLUDES) -c $< -o $@
 
+$(OBJ)/%.o: $(GNUR_SRC)/%.c
+	$(CC) $(CFLAGS) $(FFI_INCLUDES) -c $< -o $@
+
 cleanlib:
 	rm -f $(LIBDIR)/libappl.*
 
-clean: cleanobj cleanlibr
+clean: cleanobj cleanlib cleanlibr
 
 cleanobj:
-	rm -f linked
 	rm -f $(OBJ)/*.o
-	rm -f $(SRC)/$(LINKED_C_FILES)
+
diff --git a/com.oracle.truffle.r.native/library/lib.mk b/com.oracle.truffle.r.native/library/lib.mk
index 6812f369bde1640fd37bfded38562670fe4825a4..085e5fa43163fc40ab8719348c9774235a3a1396 100644
--- a/com.oracle.truffle.r.native/library/lib.mk
+++ b/com.oracle.truffle.r.native/library/lib.mk
@@ -31,6 +31,10 @@
 # define LIB_PKG_PRE and for post processing define LIB_PKG_POST in its Makefile.
 # If a package-specfic clean is needed it should define CLEAN_PKG
 
+# A package may include C and Fortran code compiled directly from the GnuR code base,
+# but using FastR headers. This is handled by the package defining the variables 
+# GNUR_C_OBJECTS and GNUR_F_OBJECTS before including this file.
+
 ifneq ($(MAKECMDGOALS),clean)
 include $(TOPDIR)/platform.mk
 endif
@@ -45,6 +49,7 @@ endif
 
 SRC = src
 OBJ = lib
+GNUR_SRC = $(GNUR_HOME)/src/library/$(PKG)/src
 
 C_SOURCES := $(wildcard $(SRC)/*.c)
 
@@ -78,7 +83,7 @@ libcommon: $(PKGDIR)
 
 $(PKGDIR): $(GNUR_HOME)/library/$(PKG)
 	(cd $(GNUR_HOME)/library; tar cf - $(PKG)) | (cd $(FASTR_LIBRARY_DIR); tar xf -)
-	touch $(FASTR_LIBRARY_DIR)/$(PKG)
+	touch $(PKGDIR)
 
 $(C_OBJECTS): | $(OBJ)
 
@@ -87,19 +92,11 @@ $(F_OBJECTS): | $(OBJ)
 $(OBJ):
 	mkdir -p $(OBJ)
 
-$(LIB_PKG): $(C_OBJECTS) $(F_OBJECTS) $(PKGDIR)
+$(LIB_PKG): $(C_OBJECTS) $(F_OBJECTS) $(GNUR_C_OBJECTS) $(GNUR_F_OBJECTS) $(PKGDIR)
 	mkdir -p $(LIBDIR)
-	$(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_PKG) $(C_OBJECTS) $(F_OBJECTS) $(PKG_LIBS)
+	$(DYLIB_LD) $(DYLIB_LDFLAGS) -o $(LIB_PKG) $(C_OBJECTS) $(F_OBJECTS) $(GNUR_C_OBJECTS) $(GNUR_F_OBJECTS) $(PKG_LIBS)
 	mkdir -p $(FASTR_LIBRARY_DIR)/$(PKG)/libs
 	cp $(LIB_PKG) $(FASTR_LIBRARY_DIR)/$(PKG)/libs
-# find a way to move into stats makefile (using LIB_PKG_POST)
-ifeq ($(OS_NAME),Darwin)
-ifeq ($(PACKAGE),stats)
-	install_name_tool -change libRblas.dylib $(FASTR_R_HOME)/lib/libRblas.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
-	install_name_tool -change libRlapack.dylib $(FASTR_R_HOME)/lib/libRlapack.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
-	install_name_tool -change libappl.dylib $(FASTR_R_HOME)/lib/libappl.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
-endif
-endif
 
 $(OBJ)/%.o: $(SRC)/%.c $(H_SOURCES)
 	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
diff --git a/com.oracle.truffle.r.native/library/stats/Makefile b/com.oracle.truffle.r.native/library/stats/Makefile
index f9ff70fe64c5eb5b1e5962648e3809c73863e077..969795ea25f7586973830eb6859387d39bcdfbfc 100644
--- a/com.oracle.truffle.r.native/library/stats/Makefile
+++ b/com.oracle.truffle.r.native/library/stats/Makefile
@@ -24,14 +24,14 @@
 # Completeness of the stats package is a work in progress
 # Currently we compile a subset of the .c and .f files from the
 # GnuR stats library source - those that do not depend on GnuR internals (always true for .f)
-# A first step in the build is to make symbolic links to those files and also to
-# do some necessary modofications to a copy of fft.c.
+# Also do some necessary modifications to a copy of fft.c.
 
-.PHONY: cleanpkg
+.PHONY: cleanpkg nametool
 
 GNUR_FFT = $(addprefix $(GNUR_HOME)/src/library/stats/src/, fft.c)
-
-LIB_PKG_PRE = $(addprefix $(OBJ)/, fft.o) linked
+FFT_OBJECT = $(addprefix $(OBJ)/, fft.o)
+LIB_PKG_PRE = $(FFT_OBJECT)
+LIB_PKG_POST = nametool
 CLEAN_PKG := cleanpkg
 
 
@@ -42,37 +42,37 @@ endif
 
 PKG_LIBS := $(LAPACK_LIBS) $(BLAS_LIBS) -lappl -L$(FASTR_LIB_DIR) $(FLIBS)
 
-include ../lib.mk
+OBJ = lib
 
-LINKED_F_FILES = bsplvd.f bvalue.f bvalus.f eureka.f hclust.f kmns.f lminfl.f loessf.f ppr.f qsbart.f sgram.f \
+GNUR_F_FILES = bsplvd.f bvalue.f bvalus.f eureka.f hclust.f kmns.f lminfl.f loessf.f ppr.f qsbart.f sgram.f \
                sinerp.f sslvrg.f stl.f stxwx.f
-GNUR_LINKED_F_FILES = $(addprefix $(GNUR_HOME)/src/library/stats/src/, $(LINKED_F_FILES))
 
-LINKED_C_FILES = isoreg.c kmeans.c loessc.c monoSpl.c sbart.c
-GNUR_LINKED_C_FILES = $(addprefix $(GNUR_HOME)/src/library/stats/src/, $(LINKED_C_FILES))
+GNUR_F_OBJECTS = $(addprefix $(OBJ)/, $(GNUR_F_FILES:.f=.o))
 
-linked: $(GNUR_LINKED_F_FILES) $(GNUR_LINKED_C_FILES)
-	$(foreach file,$(LINKED_C_FILES),ln -sf $(GNUR_HOME)/src/library/stats/src/$(file) $(SRC)/$(file);)
-	$(foreach file,$(LINKED_F_FILES),ln -sf $(GNUR_HOME)/src/library/stats/src/$(file) $(SRC)/$(file) ;)
-	touch linked
+GNUR_C_FILES = isoreg.c kmeans.c loessc.c monoSpl.c sbart.c
 
-# this dance ensures that C_SOURCES is set correctly regardless of whether the linked/modified files 
-# have been created or not (C_SOURCES will have been set in ../lib.mk)
-NON_LOCAL_C_SOURCES = $(addprefix $(SRC)/, $(LINKED_C_FILES))
-C_LOCAL_SOURCES = $(filter-out  $(NON_LOCAL_C_SOURCES),$(wildcard $(SRC)/*.c))
-C_SOURCES := $(NON_LOCAL_C_SOURCES) $(C_LOCAL_SOURCES)
+GNUR_C_OBJECTS := $(addprefix $(OBJ)/, $(GNUR_C_FILES:.c=.o)) $(FFT_OBJECT)
 
-#$(info NON_LOCAL_C_SOURCES=$(NON_LOCAL_C_SOURCES))
-#$(info LOCAL_C_SOURCES=$(C_LOCAL_SOURCES))
-#$(info C_SOURCES=$(C_SOURCES))
+include ../lib.mk
 
 $(C_OBJECTS): | $(OBJ)
 
 $(SRC)/fft.c: $(GNUR_FFT) src/ed_fft
 	ed $(GNUR_FFT) < src/ed_fft
 
+$(OBJ)/%.o: $(GNUR_SRC)/%.c
+	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
+
+$(OBJ)/%.o: $(GNUR_SRC)/%.f
+	$(F77) $(FFLAGS) $(FPICFLAGS) -c $< -o $@
+
+# ensure that the references to Rblas, Rlapack and appl are absolute
+nametool:
+ifeq ($(OS_NAME),Darwin)
+	install_name_tool -change libRblas.dylib $(FASTR_R_HOME)/lib/libRblas.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
+	install_name_tool -change libRlapack.dylib $(FASTR_R_HOME)/lib/libRlapack.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
+	install_name_tool -change libappl.dylib $(FASTR_R_HOME)/lib/libappl.dylib $(FASTR_LIBRARY_DIR)/$(PKG)/libs/$(PKG).so
+endif
+
 cleanpkg:
-	rm -f linked
 	rm -f $(SRC)/fft.c
-	rm -f $(NON_LOCAL_C_SOURCES)
-	rm -f $(addprefix $(SRC)/, $(LINKED_F_FILES))