diff --git a/ChangeLog b/ChangeLog
index b00225a0c087516d2c00dbf33d132728c6dbc423..7cc6d3073a47d428ea0eb07521b640d6ae3e4057 100755
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,7 @@
 2005-11-07  Kevin P. Fleming  <kpfleming@digium.com>
 
+	* many files: more Cygwin compatibility, and proper getloadavg() prototype/macro (issue #5569)
+
 	* include/asterisk/lock.h (__ast_pthread_mutex_lock): correct build with DETECT_DEADLOCKS defined (issue #5570)
 
 2005-11-07  Russell Bryant  <russell@digium.com>
diff --git a/asterisk.c b/asterisk.c
index 04602d96439d42698fe88e8062a10e53d725f029..f2f7ace53927638622ba8d5a3114a5ffc3fd2a04 100755
--- a/asterisk.c
+++ b/asterisk.c
@@ -107,6 +107,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/version.h"
 #include "asterisk/linkedlists.h"
 #include "asterisk/devicestate.h"
+#include "asterisk/compat.h"
 
 #include "asterisk/doxyref.h"		/* Doxygen documentation */
 
diff --git a/codecs/Makefile b/codecs/Makefile
index edf0292198de367a5137ef1a482d75c4842a9758..d1feb8a54678d48612645e6792e96cb03f9633d3 100755
--- a/codecs/Makefile
+++ b/codecs/Makefile
@@ -14,6 +14,8 @@
 ifeq (${OSARCH},CYGWIN)
 CYGSOLINK=-Wl,--out-implib=lib$@.a -Wl,--export-all-symbols
 CYGSOLIB=-L.. -L. -lasterisk.dll
+else
+CFLAGS+=-fPIC
 endif
 
 ifneq ($(wildcard g723.1/coder.c),)
@@ -57,7 +59,6 @@ ifneq ($(wildcard ilbc/iLBC_decode.h),)
   LIBILBC=ilbc/libilbc.a
 endif
 
-CFLAGS+=-fPIC
 
 LIBGSM=gsm/lib/libgsm.a
 LIBGSMT=gsm/lib/libgsm.a
diff --git a/codecs/ilbc/Makefile b/codecs/ilbc/Makefile
index 8bccc4a9aecdc7527ed3c0990e6d3998e7bdc03f..1540c140fc2814606c8778850cde3e83e563c206 100755
--- a/codecs/ilbc/Makefile
+++ b/codecs/ilbc/Makefile
@@ -1,5 +1,8 @@
 ARCH=$(PROC)
-CFLAGS+=-Wall -fPIC -O3 -funroll-loops
+CFLAGS+=-Wall -O3 -funroll-loops
+ifneq (${OSARCH},CYGWIN)
+CFLAGS += -fPIC
+endif
 LIB=libilbc.a
 
 OBJS= anaFilter.o iCBSearch.o packing.o \
diff --git a/codecs/lpc10/Makefile b/codecs/lpc10/Makefile
index 01f7a7b8136c8d3c9155d281e4f7e3cfa3763c35..b56a59ba4e8612c0c7a9847a08d876dacad18138 100755
--- a/codecs/lpc10/Makefile
+++ b/codecs/lpc10/Makefile
@@ -22,7 +22,10 @@ LIB_TARGET_DIR = .
 # 
 
 WARNINGS = -Wall -Wno-comment -Wno-error
-CFLAGS += $(OPTIMIZE) -I$(LIB_TARGET_DIR) $(WARNINGS) -fPIC
+CFLAGS += $(OPTIMIZE) -I$(LIB_TARGET_DIR) $(WARNINGS)
+ifneq (${OSARCH},CYGWIN)
+CFLAGS += -fPIC
+endif
 #CFLAGS+= $(shell if uname -m | grep -q 86; then echo "-mpentium" ; fi)
 
 #fix for PPC processors and ALPHA, And UltraSparc too
diff --git a/include/asterisk/compat.h b/include/asterisk/compat.h
index fb6a5d59fa974821ebed713a227c9dbb853b691f..139f4f81b987e65fed3e3f527fee7bfa0749133e 100755
--- a/include/asterisk/compat.h
+++ b/include/asterisk/compat.h
@@ -74,6 +74,10 @@ int unsetenv(const char *name);
 #define HAVE_VASPRINTF
 #define HAVE_STRTOQ
 
+#ifdef _BSD_SOURCE
+#define HAVE_GETLOADAVG
+#endif
+
 #ifdef __linux__
 #define HAVE_STRCASESTR
 #define HAVE_STRNDUP
diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h
index 8eed095f0b4ae03f6ef33b74d094d6d6708b1683..b6b85df4e8cfae62ae88ce3eecc6beb4b6063713 100755
--- a/include/asterisk/utils.h
+++ b/include/asterisk/utils.h
@@ -231,4 +231,8 @@ int ast_pthread_create_stack(pthread_t *thread, pthread_attr_t *attr, void *(*st
 */
 char *ast_process_quotes_and_slashes(char *start, char find, char replace_with);
 
+#ifndef HAVE_GETLOADAVG
+int getloadavg(double *list, int nelem);
+#endif
+
 #endif /* _ASTERISK_UTILS_H */
diff --git a/pbx.c b/pbx.c
index 29a1d893a635702c48d9c365bf1ab132b3c0b4f7..40285bb31b740d02401bdc5a84336278ac12bff8 100755
--- a/pbx.c
+++ b/pbx.c
@@ -56,6 +56,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
 #include "asterisk/musiconhold.h"
 #include "asterisk/app.h"
 #include "asterisk/devicestate.h"
+#include "asterisk/compat.h"
 
 /*!
  * \note I M P O R T A N T :
diff --git a/stdtime/localtime.c b/stdtime/localtime.c
index 67dc71d2c6735f3d834cb3945f7734ad464bb6a3..db125d9e6991716cc5b986f5660c67364a35e88c 100755
--- a/stdtime/localtime.c
+++ b/stdtime/localtime.c
@@ -77,6 +77,12 @@ static const char elsieid[] = "@(#)localtime.c	7.57";
 #define OPEN_MODE	O_RDONLY
 #endif /* !defined O_BINARY */
 
+#ifdef SOLARIS
+#undef TM_ZONE
+#undef TM_GMTOFF 
+#endif
+
+#ifdef TM_ZONE
 #ifndef WILDABBR
 /*! \note
  * Someone might make incorrect use of a time zone abbreviation:
@@ -101,6 +107,7 @@ static const char elsieid[] = "@(#)localtime.c	7.57";
 #endif /* !defined WILDABBR */
 
 static char		wildabbr[] = "WILDABBR";
+#endif /* TM_ZONE */
 
 /*! \brief FreeBSD defines 'zone' in 'struct tm' as non-const, so don't declare this
    string as const. */
@@ -130,12 +137,6 @@ struct lsinfo {
 #define MY_TZNAME_MAX	255
 #endif /* !defined TZNAME_MAX */
 
-#ifdef SOLARIS
-#undef TM_ZONE
-#undef TM_GMTOFF 
-#endif
-
-
 struct state {
 	char	name[TZ_STRLEN_MAX + 1];
 	int		leapcnt;
diff --git a/utils.c b/utils.c
index 9dffe253a599930c6004e0ea759e42622fd77432..89fc262117d209f3687f6a815c92126ae0243b38 100755
--- a/utils.c
+++ b/utils.c
@@ -842,7 +842,7 @@ uint64_t strtoq(const char *nptr, char **endptr, int base)
 }
 #endif /* !HAVE_STRTOQ */
 
-#if (!defined(_BSD_SOURCE))
+#ifndef HAVE_GETLOADAVG
 #ifdef linux
 /* Alternative method of getting load avg on Linux only */
 int getloadavg(double *list, int nelem)